Skip to content

Commit cd40235

Browse files
author
Matt Lewis
committed
feat: introduce angular date formatter
Closes #376
1 parent 6fd9b56 commit cd40235

File tree

3 files changed

+165
-0
lines changed

3 files changed

+165
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import {
2+
CalendarDateFormatterInterface,
3+
DateFormatterParams
4+
} from './calendar-date-formatter.interface';
5+
import getISOWeek from 'date-fns/get_iso_week';
6+
import { DatePipe, VERSION } from '@angular/common';
7+
8+
/**
9+
* This will use <a href="https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Intl" target="_blank">Intl</a> API to do all date formatting. It is the default date formatter used by the calendar.
10+
*
11+
* You will need to include a <a href="https://github.com/andyearnshaw/Intl.js/">polyfill</a> for older browsers.
12+
*/
13+
export class CalendarAngularDateFormatter
14+
implements CalendarDateFormatterInterface {
15+
/**
16+
* The month view header week day labels
17+
*/
18+
public monthViewColumnHeader({ date, locale }: DateFormatterParams): string {
19+
return new DatePipe(locale).transform(date, 'EEEE', locale);
20+
}
21+
22+
/**
23+
* The month view cell day number
24+
*/
25+
public monthViewDayNumber({ date, locale }: DateFormatterParams): string {
26+
return new DatePipe(locale).transform(date, 'd', locale);
27+
}
28+
29+
/**
30+
* The month view title
31+
*/
32+
public monthViewTitle({ date, locale }: DateFormatterParams): string {
33+
return new DatePipe(locale).transform(date, 'MMMM y', locale);
34+
}
35+
36+
/**
37+
* The week view header week day labels
38+
*/
39+
public weekViewColumnHeader({ date, locale }: DateFormatterParams): string {
40+
return new DatePipe(locale).transform(date, 'EEEE', locale);
41+
}
42+
43+
/**
44+
* The week view sub header day and month labels
45+
*/
46+
public weekViewColumnSubHeader({
47+
date,
48+
locale
49+
}: DateFormatterParams): string {
50+
return new DatePipe(locale).transform(date, 'MMM d', locale);
51+
}
52+
53+
/**
54+
* The week view title
55+
*/
56+
public weekViewTitle({ date, locale }: DateFormatterParams): string {
57+
const year: string = new DatePipe(locale).transform(date, 'y', locale);
58+
const weekNumber: number = getISOWeek(date);
59+
return `Week ${weekNumber} of ${year}`;
60+
}
61+
62+
/**
63+
* The time formatting down the left hand side of the day view
64+
*/
65+
public dayViewHour({ date, locale }: DateFormatterParams): string {
66+
const format = +VERSION.major === 4 ? 'j' : 'h a';
67+
return new DatePipe(locale).transform(date, format, locale);
68+
}
69+
70+
/**
71+
* The day view title
72+
*/
73+
public dayViewTitle({ date, locale }: DateFormatterParams): string {
74+
return new DatePipe(locale).transform(date, 'EEEE, MMMM d, y', locale);
75+
}
76+
}

src/modules/common/calendar-common.module.ts

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export interface CalendarModuleConfig {
2626
export * from './calendar-event-title-formatter.provider';
2727
export * from './calendar-moment-date-formatter.provider';
2828
export * from './calendar-native-date-formatter.provider';
29+
export * from './calendar-angular-date-formatter.provider';
2930
export * from './calendar-date-formatter.provider';
3031
export * from './calendar-utils.provider';
3132
export * from './calendar-date-formatter.interface';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import { inject, TestBed } from '@angular/core/testing';
2+
import { expect } from 'chai';
3+
import startOfDay from 'date-fns/start_of_day';
4+
import { CalendarAngularDateFormatter } from './../src';
5+
6+
describe('CalendarAngularDateFormatter provider', () => {
7+
beforeEach(() => {
8+
TestBed.configureTestingModule({
9+
providers: [CalendarAngularDateFormatter]
10+
});
11+
});
12+
13+
let dateFormatter: CalendarAngularDateFormatter;
14+
beforeEach(
15+
inject([CalendarAngularDateFormatter], _dateFormatter_ => {
16+
dateFormatter = _dateFormatter_;
17+
})
18+
);
19+
20+
it('monthViewColumnHeader', () => {
21+
expect(
22+
dateFormatter.monthViewColumnHeader({
23+
date: new Date('2016-01-01'),
24+
locale: 'en'
25+
})
26+
).to.equal('Friday');
27+
});
28+
29+
it('monthViewDayNumber', () => {
30+
expect(
31+
dateFormatter.monthViewDayNumber({
32+
date: new Date('2016-01-01'),
33+
locale: 'en'
34+
})
35+
).to.equal('1');
36+
});
37+
38+
it('monthViewTitle', () => {
39+
expect(
40+
dateFormatter.monthViewTitle({
41+
date: new Date('2016-01-01'),
42+
locale: 'en'
43+
})
44+
).to.equal('January 2016');
45+
});
46+
47+
it('weekViewColumnHeader', () => {
48+
expect(
49+
dateFormatter.weekViewColumnHeader({
50+
date: new Date('2016-01-01'),
51+
locale: 'en'
52+
})
53+
).to.equal('Friday');
54+
});
55+
56+
it('weekViewColumnSubHeader', () => {
57+
expect(
58+
dateFormatter.weekViewColumnSubHeader({
59+
date: new Date('2016-01-01'),
60+
locale: 'en'
61+
})
62+
).to.equal('Jan 1');
63+
});
64+
65+
it('weekViewTitle', () => {
66+
expect(
67+
dateFormatter.weekViewTitle({
68+
date: new Date('2016-01-04'),
69+
locale: 'en'
70+
})
71+
).to.equal('Week 1 of 2016');
72+
});
73+
74+
it('dayViewHour', () => {
75+
expect(
76+
dateFormatter.dayViewHour({
77+
date: startOfDay(new Date('2016-01-01')),
78+
locale: 'en'
79+
})
80+
).to.equal('12 AM');
81+
});
82+
83+
it('dayViewTitle', () => {
84+
expect(
85+
dateFormatter.dayViewTitle({ date: new Date('2016-01-01'), locale: 'en' })
86+
).to.equal('Friday, January 1, 2016');
87+
});
88+
});

0 commit comments

Comments
 (0)