mat-daterangepicker
Version:
Angular material date picker extension to support range selection.
98 lines • 13.9 kB
JavaScript
/*
RANGE: Most of the code is redundant and hera as inheritance boilerplate.
The relevant code is marked with a comment.
*/
import { __decorate, __extends, __param } from "tslib";
import { Component, Input, Inject, Injector, ChangeDetectorRef, ChangeDetectionStrategy, EventEmitter, Output, Optional, ReflectiveInjector, ViewEncapsulation } from '@angular/core';
import { DateAdapter, MatDateFormats, MAT_DATE_FORMATS } from '@angular/material/core';
import { MatDatepickerIntl, MatCalendar } from '@angular/material/datepicker';
var MatDaterangeCalendar = /** @class */ (function (_super) {
__extends(MatDaterangeCalendar, _super);
// THIS SECTION IS JUST TO PROVIDE MatCalendar as SgCalendar to MatCalendarHeader
function MatDaterangeCalendar(_intl, _dateAdapter, _dateFormats, changeDetectorRef, drInjector) {
var _this = _super.call(this, _intl, _dateAdapter, _dateFormats, changeDetectorRef) || this;
_this.drInjector = drInjector;
_this.selectedRangeEndChange = new EventEmitter();
return _this;
}
MatDaterangeCalendar.prototype.ngAfterContentInit = function () {
_super.prototype.ngAfterContentInit.call(this);
var injector = ReflectiveInjector.resolveAndCreate([{ provide: MatCalendar, useValue: this }], this.drInjector);
this._calendarHeaderPortal.injector = injector;
var activeDate = this.startAt || this['_dateAdapter'].today();
this.activeDate = this.view === 0 ? activeDate : this.getSecondViewActiveDate(activeDate);
// Assign to the private property since we don't want to move focus on init.
// this._currentView = this.startView;
};
Object.defineProperty(MatDaterangeCalendar.prototype, "selectedRangeEnd", {
get: function () { return this._selectedRangeEnd; },
set: function (value) {
this._selectedRangeEnd = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
},
enumerable: true,
configurable: true
});
MatDaterangeCalendar.prototype._dateSelectedRangeEnd = function (date) {
if (!this._dateAdapter.sameDate(date, this.selectedRangeEnd)) {
this.selectedRangeEndChange.emit(date);
}
};
MatDaterangeCalendar.prototype.getSecondViewActiveDate = function (activeDate) {
var date = this['_dateAdapter'].getDate(activeDate);
var month = this['_dateAdapter'].getMonth(activeDate);
var year = this['_dateAdapter'].getYear(activeDate);
var y, m;
if (month === 11) {
m = 0;
y = year + 1;
}
else {
m = month + 1,
y = year;
}
var D = this['_dateAdapter'].createDate(y, m, date);
return D;
};
MatDaterangeCalendar.ctorParameters = function () { return [
{ type: MatDatepickerIntl },
{ type: DateAdapter, decorators: [{ type: Optional }] },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_DATE_FORMATS,] }] },
{ type: ChangeDetectorRef },
{ type: Injector }
]; };
__decorate([
Input()
], MatDaterangeCalendar.prototype, "view", void 0);
__decorate([
Input()
], MatDaterangeCalendar.prototype, "setHoverCells", void 0);
__decorate([
Input()
], MatDaterangeCalendar.prototype, "clearBody", void 0);
__decorate([
Input()
], MatDaterangeCalendar.prototype, "range", void 0);
__decorate([
Input()
], MatDaterangeCalendar.prototype, "selectedRangeEnd", null);
__decorate([
Output()
], MatDaterangeCalendar.prototype, "selectedRangeEndChange", void 0);
MatDaterangeCalendar = __decorate([
Component({
selector: 'mat-daterange-calendar',
template: "<!-- \n\tRANGE: Most of the code is redundant and hera as inheritance boilerplate.\n\tThe relevant code is marked with a comment.\n\tADDED LOC ~3\n-->\n<ng-template [cdkPortalOutlet]=\"_calendarHeaderPortal\"></ng-template>\n\n<div class=\"mat-calendar-content\" [ngSwitch]=\"currentView\" cdkMonitorSubtreeFocus tabindex=\"-1\">\n\n\t<mat-daterange-month-view\n\t\t*ngSwitchCase=\"'month'\"\n\t\t[view]=\"view\"\n\t\t[activeDate]=\"activeDate\"\n\t\t[selected]=\"selected\"\n\t\t[dateFilter]=\"dateFilter\"\n\t\t[maxDate]=\"maxDate\"\n\t\t[minDate]=\"minDate\"\n\t\t(selectedChange)=\"_dateSelected($event)\"\n\t\t(_userSelection)=\"_userSelected()\"\n\n\t\t[range]=\"range\"\n\t\t[setHoverCells]=\"setHoverCells\"\n\t\t[clearBody]=\"clearBody\"\n\t\t[selectedRangeEnd]=\"selectedRangeEnd\"\n\t\t(selectedRangeEndChange)=\"_dateSelectedRangeEnd($event)\">\n\t\t<!-- THE 3 LINES ABOVE ARE THE ONLY ADDITION -->\n\t</mat-daterange-month-view>\n\n\t<mat-year-view\n\t\t*ngSwitchCase=\"'year'\"\n\t\t[activeDate]=\"activeDate\"\n\t\t[selected]=\"selected\"\n\t\t[dateFilter]=\"dateFilter\"\n\t\t[maxDate]=\"maxDate\"\n\t\t[minDate]=\"minDate\"\n\t\t(monthSelected)=\"_monthSelectedInYearView($event)\"\n\t\t(selectedChange)=\"_goToDateInView($event, 'month')\">\n\t</mat-year-view>\n\n\t<mat-multi-year-view\n\t\t*ngSwitchCase=\"'multi-year'\"\n\t\t[activeDate]=\"activeDate\"\n\t\t[selected]=\"selected\"\n\t\t[dateFilter]=\"dateFilter\"\n\t\t[maxDate]=\"maxDate\"\n\t\t[minDate]=\"minDate\"\n\t\t(yearSelected)=\"_yearSelectedInMultiYearView($event)\"\n\t\t(selectedChange)=\"_goToDateInView($event, 'year')\">\n\t</mat-multi-year-view>\n</div>\n\n",
host: {
'class': 'mat-calendar',
},
exportAs: 'matDaterangeCalendar',
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush
}),
__param(1, Optional()),
__param(2, Optional()), __param(2, Inject(MAT_DATE_FORMATS))
], MatDaterangeCalendar);
return MatDaterangeCalendar;
}(MatCalendar));
export { MatDaterangeCalendar };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbWF0LWRhdGVyYW5nZXBpY2tlci8iLCJzb3VyY2VzIjpbImxpYi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztFQUdFOztBQUVGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEwsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUd2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFhOUU7SUFBNkMsd0NBQWM7SUFLMUQsaUZBQWlGO0lBQ2pGLDhCQUFZLEtBQXdCLEVBQ3JCLFlBQTRCLEVBQ0YsWUFBNEIsRUFDbEUsaUJBQW9DLEVBQzVCLFVBQW9CO1FBSi9CLFlBS0Msa0JBQU0sS0FBSyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLENBQUMsU0FDM0Q7UUFGVSxnQkFBVSxHQUFWLFVBQVUsQ0FBVTtRQTBCWiw0QkFBc0IsR0FBb0IsSUFBSSxZQUFZLEVBQUssQ0FBQzs7SUF4Qm5GLENBQUM7SUFDRCxpREFBa0IsR0FBbEI7UUFDQyxpQkFBTSxrQkFBa0IsV0FBRSxDQUFDO1FBQzNCLElBQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxRixJQUFJLENBQUMscUJBQXNCLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FB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R0E4RHZEO1NBOURZLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgUkFOR0U6IE1vc3Qgb2YgdGhlIGNvZGUgaXMgcmVkdW5kYW50IGFuZCBoZXJhIGFzIGluaGVyaXRhbmNlIGJvaWxlcnBsYXRlLlxuICAgIFRoZSByZWxldmFudCBjb2RlIGlzIG1hcmtlZCB3aXRoIGEgY29tbWVudC5cbiovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEluamVjdCwgSW5qZWN0b3IsIENoYW5nZURldGVjdG9yUmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIE9wdGlvbmFsLCBSZWZsZWN0aXZlSW5qZWN0b3IsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERhdGVBZGFwdGVyLCBNYXREYXRlRm9ybWF0cywgTUFUX0RBVEVfRk9STUFUUyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5cbmltcG9ydCB7IE1hdERhdGVwaWNrZXJJbnRsLCBNYXRDYWxlbmRhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1kYXRlcmFuZ2UtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ21hdC1jYWxlbmRhcicsXG4gIH0sXG4gIGV4cG9ydEFzOiAnbWF0RGF0ZXJhbmdlQ2FsZW5kYXInLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNYXREYXRlcmFuZ2VDYWxlbmRhcjxEPiBleHRlbmRzIE1hdENhbGVuZGFyPEQ+IHtcblx0QElucHV0KCkgdmlldzogbnVtYmVyXG5cdEBJbnB1dCgpIHNldEhvdmVyQ2VsbHM6IEJlaGF2aW9yU3ViamVjdDxhbnk+XG5cdEBJbnB1dCgpIGNsZWFyQm9keTogQmVoYXZpb3JTdWJqZWN0PGFueT5cblx0XG5cdC8vIFRISVMgU0VDVElPTiBJUyBKVVNUIFRPIFBST1ZJREUgTWF0Q2FsZW5kYXIgYXMgU2dDYWxlbmRhciB0byBNYXRDYWxlbmRhckhlYWRlclxuXHRjb25zdHJ1Y3RvcihfaW50bDogTWF0RGF0ZXBpY2tlckludGwsXG5cdFx0XHRcdEBPcHRpb25hbCgpIF9kYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RD4sXG5cdFx0XHRcdEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RBVEVfRk9STUFUUykgX2RhdGVGb3JtYXRzOiBNYXREYXRlRm9ybWF0cyxcblx0XHRcdFx0Y2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuXHRcdFx0XHRwcml2YXRlIGRySW5qZWN0b3I6IEluamVjdG9yKSB7XG5cdFx0c3VwZXIoX2ludGwsIF9kYXRlQWRhcHRlciwgX2RhdGVGb3JtYXRzLCBjaGFuZ2VEZXRlY3RvclJlZik7XG5cdH1cblx0bmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuXHRcdHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpOyAgICBcblx0XHRjb25zdCBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFt7IHByb3ZpZGU6IE1hdENhbGVuZGFyLCB1c2VWYWx1ZTogdGhpcyB9XSwgdGhpcy5kckluamVjdG9yKTtcblxuXHRcdCg8Q29tcG9uZW50UG9ydGFsPGFueT4+IHRoaXMuX2NhbGVuZGFySGVhZGVyUG9ydGFsKS5pbmplY3RvciA9IGluamVjdG9yO1xuXG5cdFx0Y29uc3QgYWN0aXZlRGF0ZSA9IHRoaXMuc3RhcnRBdCB8fCB0aGlzWydfZGF0ZUFkYXB0ZXInXS50b2RheSgpO1xuXG5cdFx0dGhpcy5hY3RpdmVEYXRlID0gdGhpcy52aWV3ID09PSAwID8gYWN0aXZlRGF0ZSA6IHRoaXMuZ2V0U2Vjb25kVmlld0FjdGl2ZURhdGUoYWN0aXZlRGF0ZSlcblx0XG5cdFx0Ly8gQXNzaWduIHRvIHRoZSBwcml2YXRlIHByb3BlcnR5IHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gbW92ZSBmb2N1cyBvbiBpbml0LlxuXHRcdC8vIHRoaXMuX2N1cnJlbnRWaWV3ID0gdGhpcy5zdGFydFZpZXc7XG5cdH1cblxuXHQvKiBSRUxFVkFOVCBDT0RFIEZPUiBOQVRJVkUgSU1QTEVNRU5UQVRJT04gLSB+IDEwIExPQyAqL1xuXG5cdEBJbnB1dCgpIHJhbmdlOiBib29sZWFuO1xuXG5cdEBJbnB1dCgpIGdldCBzZWxlY3RlZFJhbmdlRW5kKCk6IEQgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmQ7IH1cblx0c2V0IHNlbGVjdGVkUmFuZ2VFbmQodmFsdWU6IEQgfCBudWxsKSB7XG5cdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZUVuZCA9ICg8YW55PiB0aGlzKS5fZ2V0VmFsaWREYXRlT3JOdWxsKCAoIDxhbnk+IHRoaXMpLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuXHR9XG5cblx0QE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkUmFuZ2VFbmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEPiA9IG5ldyBFdmVudEVtaXR0ZXI8RD4oKTtcblxuXHRwcml2YXRlIF9zZWxlY3RlZFJhbmdlRW5kOiBEIHwgbnVsbDtcblxuXHRfZGF0ZVNlbGVjdGVkUmFuZ2VFbmQoZGF0ZTogRCk6IHZvaWQge1xuXHRcdGlmICghKDxhbnk+IHRoaXMpLl9kYXRlQWRhcHRlci5zYW1lRGF0ZShkYXRlLCB0aGlzLnNlbGVjdGVkUmFuZ2VFbmQpKSB7XG5cdFx0XHR0aGlzLnNlbGVjdGVkUmFuZ2VFbmRDaGFuZ2UuZW1pdChkYXRlKTtcblx0XHR9XG5cdH1cblxuXHRnZXRTZWNvbmRWaWV3QWN0aXZlRGF0ZShhY3RpdmVEYXRlKXtcblx0XHRjb25zdCBkYXRlID0gKDxEYXRlQWRhcHRlcjxEPj50aGlzWydfZGF0ZUFkYXB0ZXInXSkuZ2V0RGF0ZShhY3RpdmVEYXRlKVxuXHRcdGNvbnN0IG1vbnRoID0gKDxEYXRlQWRhcHRlcjxEPj50aGlzWydfZGF0ZUFkYXB0ZXInXSkuZ2V0TW9udGgoYWN0aXZlRGF0ZSlcblx0XHRjb25zdCB5ZWFyID0gKDxEYXRlQWRhcHRlcjxEPj50aGlzWydfZGF0ZUFkYXB0ZXInXSkuZ2V0WWVhcihhY3RpdmVEYXRlKVxuXHRcdGxldCB5LCBtXG5cdFx0aWYobW9udGggPT09IDExKXtcblx0XHRcdG0gPSAwXG5cdFx0XHR5ID0geWVhciArIDFcblx0XHR9ZWxzZXtcblx0XHRcdG0gPSBtb250aCArIDEsXG5cdFx0XHR5ID0geWVhclxuXHRcdH1cblx0XHRjb25zdCBEID0gKDxEYXRlQWRhcHRlcjxEPj50aGlzWydfZGF0ZUFkYXB0ZXInXSkuY3JlYXRlRGF0ZSh5LCBtLCBkYXRlKVxuXHRcdHJldHVybiBEXG5cdH1cbiAgXG59XG4iXX0=