diff --git a/README.md b/README.md index f846d89..6f7b2e8 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,9 @@ Prints `Last updated: a few seconds ago` Prints `Last updated: a few seconds` ## amCalendar pipe +Takes optional `formats` argument (defaults to now) +and `referenceTime` argument that could be output formats object or callback function. +See [momentjs docs](http://momentjs.com/docs/#/displaying/calendar-time/) for details. ``` typescript @Component({ @@ -98,7 +101,37 @@ Prints `Last updated: a few seconds` }) ``` -Prints `Last updated: Today at 14:00` +Prints `Last updated: Today at 14:00` (default referenceTime is today by default) + +``` typescript +@Component({ + selector: 'app', + template: ` + Last updated: + ` +}) +export class AppComponent { + nextDay: Date; + + constructor() { + this.nextDay = new Date(); + nextDay.setDate(nextDay.getDate() + 1); + } +} +``` + +Prints `Last updated: Yesterday at 14:00` (referenceTime is tomorrow) + +``` typescript +@Component({ + selector: 'app', + template: ` + Last updated: + ` +}) +``` + +Prints `Last updated: Same Day at 2:00 PM` ## amDateFormat pipe diff --git a/src/calendar.pipe.spec.ts b/src/calendar.pipe.spec.ts index c437d90..396327b 100644 --- a/src/calendar.pipe.spec.ts +++ b/src/calendar.pipe.spec.ts @@ -19,5 +19,24 @@ describe('CalendarPipe', () => { it('should transform the start of the current day to "Today at 12:00 AM"', () => { expect(pipe.transform(moment().startOf('day'))).toBe('Today at 12:00 AM'); }); + + it('should transform the start of the current day to "Yesterday at 12:00 AM"', () => { + let testDate = moment().startOf('day'); + let referenceTime = moment().clone().add(1, 'day'); + expect(pipe.transform(testDate, referenceTime)).toBe('Yesterday at 12:00 AM'); + }); + + it('should transform date to "January 13th 2016, 1:23:45 AM"', () => { + let testDate = new Date(2016, 0, 13, 1, 23, 45); + let formats = { sameElse: 'MMMM Do YYYY, h:mm:ss A' }; + expect(pipe.transform(testDate, formats)).toBe('January 13th 2016, 1:23:45 AM'); + }); + + it('should support any order of arguments', () => { + let testDate = moment(); + let referenceTime = moment().clone().add(1, 'day'); + let formats = { lastDay: '[Last day at] h:mm A' }; + expect(pipe.transform(testDate, formats, referenceTime)).toBe(pipe.transform(testDate, referenceTime, formats)); + }); }); }); diff --git a/src/calendar.pipe.ts b/src/calendar.pipe.ts index 2f57312..4f71e3c 100644 --- a/src/calendar.pipe.ts +++ b/src/calendar.pipe.ts @@ -36,7 +36,20 @@ export class CalendarPipe implements PipeTransform, OnDestroy { } transform(value: Date | moment.Moment, ...args: any[]): any { - return momentConstructor(value).calendar(); + let formats: any = null; + let referenceTime: any = null; + + for (let i = 0, len = args.length; i < len; i++) { + if (args[i] !== null) { + if (typeof args[i] === 'object' && !moment.isMoment(args[i])) { + formats = args[i]; + } else { + referenceTime = momentConstructor(args[i]); + } + } + } + + return momentConstructor(value).calendar(referenceTime, formats); } ngOnDestroy(): void {