87 lines
11 KiB
JavaScript
87 lines
11 KiB
JavaScript
/* ngx-moment (c) 2015, 2016 Uri Shaked / MIT Licence */
|
|
import { Pipe, ChangeDetectorRef, EventEmitter, NgZone, } from '@angular/core';
|
|
import * as moment from 'moment';
|
|
const momentConstructor = moment;
|
|
export class CalendarPipe {
|
|
constructor(cdRef, ngZone) {
|
|
this.cdRef = cdRef;
|
|
this.ngZone = ngZone;
|
|
// using a single static timer for all instances of this pipe for performance reasons
|
|
CalendarPipe.initTimer(ngZone);
|
|
CalendarPipe.refs++;
|
|
// values such as Today will need to be replaced with Yesterday after midnight,
|
|
// so make sure we subscribe to an EventEmitter that we set up to emit at midnight
|
|
this.midnightSub = CalendarPipe.midnight.subscribe(() => {
|
|
this.ngZone.run(() => this.cdRef.markForCheck());
|
|
});
|
|
}
|
|
transform(value, ...args) {
|
|
let formats = null;
|
|
let referenceTime = 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() {
|
|
if (CalendarPipe.refs > 0) {
|
|
CalendarPipe.refs--;
|
|
}
|
|
if (CalendarPipe.refs === 0) {
|
|
CalendarPipe.removeTimer();
|
|
}
|
|
this.midnightSub.unsubscribe();
|
|
}
|
|
static initTimer(ngZone) {
|
|
// initialize the timer
|
|
if (!CalendarPipe.midnight) {
|
|
CalendarPipe.midnight = new EventEmitter();
|
|
if (typeof window !== 'undefined') {
|
|
const timeToUpdate = CalendarPipe._getMillisecondsUntilUpdate();
|
|
CalendarPipe.timer = ngZone.runOutsideAngular(() => {
|
|
return window.setTimeout(() => {
|
|
// emit the current date
|
|
CalendarPipe.midnight.emit(new Date());
|
|
// refresh the timer
|
|
CalendarPipe.removeTimer();
|
|
CalendarPipe.initTimer(ngZone);
|
|
}, timeToUpdate);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
static removeTimer() {
|
|
if (CalendarPipe.timer) {
|
|
window.clearTimeout(CalendarPipe.timer);
|
|
CalendarPipe.timer = null;
|
|
CalendarPipe.midnight = null;
|
|
}
|
|
}
|
|
static _getMillisecondsUntilUpdate() {
|
|
const now = momentConstructor();
|
|
const tomorrow = momentConstructor().startOf('day').add(1, 'days');
|
|
const timeToMidnight = tomorrow.valueOf() - now.valueOf();
|
|
return timeToMidnight + 1000; // 1 second after midnight
|
|
}
|
|
}
|
|
/**
|
|
* Internal reference counter, so we can clean up when no instances are in use
|
|
*/
|
|
CalendarPipe.refs = 0;
|
|
CalendarPipe.timer = null;
|
|
CalendarPipe.midnight = null;
|
|
CalendarPipe.decorators = [
|
|
{ type: Pipe, args: [{ name: 'amCalendar', pure: false },] }
|
|
];
|
|
CalendarPipe.ctorParameters = () => [
|
|
{ type: ChangeDetectorRef },
|
|
{ type: NgZone }
|
|
];
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYWxlbmRhci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdEQUF3RDtBQUV4RCxPQUFPLEVBQ0wsSUFBSSxFQUNKLGlCQUFpQixFQUVqQixZQUFZLEVBRVosTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBR2pDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBR2pDLE1BQU0sT0FBTyxZQUFZO0lBV3ZCLFlBQW9CLEtBQXdCLEVBQVUsTUFBYztRQUFoRCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDbEUscUZBQXFGO1FBQ3JGLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0IsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXBCLCtFQUErRTtRQUMvRSxrRkFBa0Y7UUFDbEYsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUF5QixFQUFFLEdBQUcsSUFBVztRQUNqRCxJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUM7UUFDeEIsSUFBSSxhQUFhLEdBQVEsSUFBSSxDQUFDO1FBRTlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNwQixJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzVELE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ25CO3FCQUFNO29CQUNMLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUM7YUFDRjtTQUNGO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUN6QixZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckI7UUFFRCxJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQzNCLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM1QjtRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBYztRQUNyQyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7WUFDMUIsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1lBQ2pELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO2dCQUNqQyxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztnQkFDaEUsWUFBWSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO29CQUNqRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUM1Qix3QkFBd0I7d0JBQ3hCLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFFdkMsb0JBQW9CO3dCQUNwQixZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQzNCLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLENBQUM7YUFDSjtTQUNGO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXO1FBQ3hCLElBQUksWUFBWSxDQUFDLEtBQUssRUFBRTtZQUN0QixNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUMxQixZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsMkJBQTJCO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixFQUFFLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFELE9BQU8sY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtJQUMxRCxDQUFDOztBQXJGRDs7R0FFRztBQUNZLGlCQUFJLEdBQUcsQ0FBQyxDQUFDO0FBRVQsa0JBQUssR0FBa0IsSUFBSSxDQUFDO0FBQzVCLHFCQUFRLEdBQThCLElBQUksQ0FBQzs7WUFSM0QsSUFBSSxTQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFOzs7WUFYdkMsaUJBQWlCO1lBSWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBuZ3gtbW9tZW50IChjKSAyMDE1LCAyMDE2IFVyaSBTaGFrZWQgLyBNSVQgTGljZW5jZSAqL1xuXG5pbXBvcnQge1xuICBQaXBlLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgUGlwZVRyYW5zZm9ybSxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG4gIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5jb25zdCBtb21lbnRDb25zdHJ1Y3RvciA9IG1vbWVudDtcblxuQFBpcGUoeyBuYW1lOiAnYW1DYWxlbmRhcicsIHB1cmU6IGZhbHNlIH0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIEludGVybmFsIHJlZmVyZW5jZSBjb3VudGVyLCBzbyB3ZSBjYW4gY2xlYW4gdXAgd2hlbiBubyBpbnN0YW5jZXMgYXJlIGluIHVzZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVmcyA9IDA7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBtaWRuaWdodDogRXZlbnRFbWl0dGVyPERhdGU+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBtaWRuaWdodFN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XG4gICAgLy8gdXNpbmcgYSBzaW5nbGUgc3RhdGljIHRpbWVyIGZvciBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgcGlwZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uc1xuICAgIENhbGVuZGFyUGlwZS5pbml0VGltZXIobmdab25lKTtcblxuICAgIENhbGVuZGFyUGlwZS5yZWZzKys7XG5cbiAgICAvLyB2YWx1ZXMgc3VjaCBhcyBUb2RheSB3aWxsIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBZZXN0ZXJkYXkgYWZ0ZXIgbWlkbmlnaHQsXG4gICAgLy8gc28gbWFrZSBzdXJlIHdlIHN1YnNjcmliZSB0byBhbiBFdmVudEVtaXR0ZXIgdGhhdCB3ZSBzZXQgdXAgdG8gZW1pdCBhdCBtaWRuaWdodFxuICAgIHRoaXMubWlkbmlnaHRTdWIgPSBDYWxlbmRhclBpcGUubWlkbmlnaHQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRyYW5zZm9ybSh2YWx1ZTogbW9tZW50Lk1vbWVudElucHV0LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgbGV0IGZvcm1hdHM6IGFueSA9IG51bGw7XG4gICAgbGV0IHJlZmVyZW5jZVRpbWU6IGFueSA9IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKGFyZ3NbaV0gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2ldID09PSAnb2JqZWN0JyAmJiAhbW9tZW50LmlzTW9tZW50KGFyZ3NbaV0pKSB7XG4gICAgICAgICAgZm9ybWF0cyA9IGFyZ3NbaV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmZXJlbmNlVGltZSA9IG1vbWVudENvbnN0cnVjdG9yKGFyZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudENvbnN0cnVjdG9yKHZhbHVlKS5jYWxlbmRhcihyZWZlcmVuY2VUaW1lLCBmb3JtYXRzKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmIChDYWxlbmRhclBpcGUucmVmcyA+IDApIHtcbiAgICAgIENhbGVuZGFyUGlwZS5yZWZzLS07XG4gICAgfVxuXG4gICAgaWYgKENhbGVuZGFyUGlwZS5yZWZzID09PSAwKSB7XG4gICAgICBDYWxlbmRhclBpcGUucmVtb3ZlVGltZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLm1pZG5pZ2h0U3ViLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpbml0VGltZXIobmdab25lOiBOZ1pvbmUpIHtcbiAgICAvLyBpbml0aWFsaXplIHRoZSB0aW1lclxuICAgIGlmICghQ2FsZW5kYXJQaXBlLm1pZG5pZ2h0KSB7XG4gICAgICBDYWxlbmRhclBpcGUubWlkbmlnaHQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgdGltZVRvVXBkYXRlID0gQ2FsZW5kYXJQaXBlLl9nZXRNaWxsaXNlY29uZHNVbnRpbFVwZGF0ZSgpO1xuICAgICAgICBDYWxlbmRhclBpcGUudGltZXIgPSBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBlbWl0IHRoZSBjdXJyZW50IGRhdGVcbiAgICAgICAgICAgIENhbGVuZGFyUGlwZS5taWRuaWdodC5lbWl0KG5ldyBEYXRlKCkpO1xuXG4gICAgICAgICAgICAvLyByZWZyZXNoIHRoZSB0aW1lclxuICAgICAgICAgICAgQ2FsZW5kYXJQaXBlLnJlbW92ZVRpbWVyKCk7XG4gICAgICAgICAgICBDYWxlbmRhclBpcGUuaW5pdFRpbWVyKG5nWm9uZSk7XG4gICAgICAgICAgfSwgdGltZVRvVXBkYXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVtb3ZlVGltZXIoKSB7XG4gICAgaWYgKENhbGVuZGFyUGlwZS50aW1lcikge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dChDYWxlbmRhclBpcGUudGltZXIpO1xuICAgICAgQ2FsZW5kYXJQaXBlLnRpbWVyID0gbnVsbDtcbiAgICAgIENhbGVuZGFyUGlwZS5taWRuaWdodCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2dldE1pbGxpc2Vjb25kc1VudGlsVXBkYXRlKCkge1xuICAgIGNvbnN0IG5vdyA9IG1vbWVudENvbnN0cnVjdG9yKCk7XG4gICAgY29uc3QgdG9tb3Jyb3cgPSBtb21lbnRDb25zdHJ1Y3RvcigpLnN0YXJ0T2YoJ2RheScpLmFkZCgxLCAnZGF5cycpO1xuICAgIGNvbnN0IHRpbWVUb01pZG5pZ2h0ID0gdG9tb3Jyb3cudmFsdWVPZigpIC0gbm93LnZhbHVlT2YoKTtcbiAgICByZXR1cm4gdGltZVRvTWlkbmlnaHQgKyAxMDAwOyAvLyAxIHNlY29uZCBhZnRlciBtaWRuaWdodFxuICB9XG59XG4iXX0=
|