ngx-daterange
Version:
Date-Range Selector for Angular
348 lines • 60.4 kB
JavaScript
import { Component, Input, Output, EventEmitter, HostListener, ViewEncapsulation } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
import { defaultDateFormat, defaultDateRangePickerOptions } from '../../constants';
import * as momentNs from 'moment';
const moment = momentNs;
let instanceCount = 0;
export class DateRangePickerComponent {
constructor() {
this.options = defaultDateRangePickerOptions;
this.controlName = 'dateRange';
this.instanceId = null;
this.fromDate = null;
this.toDate = null;
this.datepickerReset = new EventEmitter();
this.rangeSelected = new EventEmitter();
this.isMobile = false;
this.range = '';
this.showCalendars = false;
this.displayStyle = false;
if (!this.instanceId) {
// assign auto-id
this.instanceId = `dateRangePicker-${instanceCount++}`;
}
}
get enableApplyButton() {
let enabled = !this.options.autoApply && this.fromDate !== null;
if (this.options.singleCalendar) {
return enabled;
}
return enabled && this.toDate !== null;
}
handleClick(event) {
var _a;
const target = event.target;
// close the DatePicker if clicking outside is not allowed
if (!this.options.clickOutsideAllowed) {
let targetPathClassNames = [];
try {
targetPathClassNames = event.composedPath().map((obj) => obj['className']) || [''];
}
catch (error) {
// IE / Edge
targetPathClassNames = (_a = event['path']) === null || _a === void 0 ? void 0 : _a.map(obj => obj.className);
}
let containerElementClassRoot = this.options.modal === true ? 'dateRangePickerModal' : 'dateRangePicker';
const targetExistsInPath = targetPathClassNames === null || targetPathClassNames === void 0 ? void 0 : targetPathClassNames.some(className => {
if (typeof className === 'string') {
return className && className.includes(containerElementClassRoot);
}
return false;
});
if (!targetExistsInPath) {
this.toggleCalendarVisibility(false);
}
}
// Close the DatePicker if the target input was clicked
if (target.id === this.instanceId) {
this.toggleCalendarVisibility(!this.showCalendars);
}
}
ngOnInit() {
if (navigator) {
if (navigator.userAgent.match(/Android/i)
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/iPhone/i)
|| navigator.userAgent.match(/iPod/i)
|| navigator.userAgent.match(/BlackBerry/i)
|| navigator.userAgent.match(/Windows Phone/i)) {
this.isMobile = true;
}
}
// ensure dates in options are valid
this.validateOptionDates();
// ensure input dates are within the min/max dates in options
this.validateInputDates();
if (this.options.preDefinedRanges && this.options.preDefinedRanges.length > 0) {
this.defaultRanges = this.validateAndAssignPredefinedRanges(this.options.preDefinedRanges);
}
// assign values not present in options with default values
const optionsKeys = Object.keys(this.options);
const defaultValuesKeys = Object.keys(defaultDateRangePickerOptions);
defaultValuesKeys.forEach((key) => {
if (!optionsKeys.includes(key)) {
this.options[key] = defaultDateRangePickerOptions[key];
}
});
// update calendar grid
this.updateCalendar();
// create parent form group if it doesn't exist
if (!this.parentFormGroup) {
this.parentFormGroup = new FormGroup({});
}
// add form control to parent form group
const value = this.formatRangeAsString();
const control = new FormControl({ value, disabled: this.options.disableInputDisplay }, this.options.validators);
if (this.options.disabled) {
control.disable();
}
this.parentFormGroup.addControl(this.controlName, control);
// set value of control
this.setRange();
}
validateInputDates() {
if (typeof this.fromDate === 'string') {
this.fromDate = moment(this.fromDate);
}
if (typeof this.toDate === 'string') {
this.toDate = moment(this.toDate);
}
if (this.fromDate && this.options.minDate && this.fromDate.isBefore(this.options.minDate, 'date')) {
throw new RangeError('@Input fromDate is before the specified minDate in options');
}
if (this.toDate && this.options.maxDate && this.toDate.isAfter(this.options.maxDate, 'date')) {
throw new RangeError('@Input toDate is after the specified maxDate in options');
}
}
validateOptionDates() {
// validate maxDate isn't before minDate or vice versa
if (this.options) {
if (this.options.minDate && this.options.maxDate) {
if (this.options.minDate.isAfter(this.options.maxDate, 'date')) {
throw new RangeError('minDate specified in options is after the maxDate');
}
else if (this.options.maxDate.isBefore(this.options.minDate, 'date')) {
throw new RangeError('maxDate specified in options is before the minDate');
}
}
}
}
// assists CSS to fix small positioning bug with From:/To: date text
checkChrome() {
return window['chrome'] ? 'is-chrome' : '';
}
toggleCalendarVisibility(value) {
if (this.options.modal === true) {
this.displayStyle = value !== null ? value === false ? false : true : this.showCalendars === false ? false : true;
}
else {
this.showCalendars = value !== null ? value : !this.showCalendars;
}
}
setFromToMonthYear(fromDate, toDate) {
let tempFromDate = fromDate || this.fromDate || moment();
let tempToDate = toDate || this.toDate || moment();
if (!(tempFromDate instanceof moment)) {
tempFromDate = moment(tempFromDate, defaultDateFormat);
}
if (!(tempToDate instanceof moment)) {
tempToDate = moment(tempToDate, defaultDateFormat);
}
this.fromMonth = tempFromDate.get('month');
this.fromYear = tempFromDate.get('year');
this.toMonth = tempToDate.get('month');
this.toYear = tempToDate.get('year');
}
updateCalendar() {
// get month and year to show calendar
this.setFromToMonthYear();
this.setRange();
}
// update from/to based on selection
dateChanged(changedData) {
const value = changedData.day;
const isLeft = changedData.isLeft;
if (isLeft) {
this.fromDate = value;
if (this.fromDate.isAfter(this.toDate, 'date')) {
this.toDate = this.fromDate.clone();
}
}
else {
this.toDate = value;
if (this.toDate.isBefore(this.fromDate, 'date')) {
this.fromDate = this.toDate.clone();
}
}
this.setFromToMonthYear(this.fromDate, this.toDate);
if (this.options.autoApply && (this.toDate || this.options.singleCalendar)) {
this.toggleCalendarVisibility(false);
this.setRange();
this.emitRangeSelected();
}
}
emitRangeSelected(data) {
if (!data) {
data = this.options.singleCalendar ? { start: this.fromDate } : { start: this.fromDate, end: this.toDate };
}
this.rangeSelected.emit(data);
}
getMoment(value) {
return moment(value, this.options.format);
}
formatRangeAsString() {
let range = '';
if (this.options.singleCalendar && this.fromDate) {
if (typeof this.fromDate === 'string') {
this.fromDate = moment(this.fromDate);
}
range = this.fromDate.format(this.options.format);
}
else if (!this.options.singleCalendar && this.fromDate && this.toDate) {
if (typeof this.fromDate === 'string') {
this.fromDate = moment(this.fromDate);
}
if (typeof this.toDate === 'string') {
this.toDate = moment(this.toDate);
}
range = `${this.fromDate.format(this.options.format)} - ${this.toDate.format(this.options.format)}`;
}
return range;
}
setRange() {
var _a;
this.range = this.formatRangeAsString();
if (this.parentFormGroup) {
const control = (_a = this.parentFormGroup) === null || _a === void 0 ? void 0 : _a.get(this.controlName);
if (control) {
control.setValue(this.range);
control.updateValueAndValidity();
}
}
}
setDateFromInput(event) {
const isLeft = event.isLeft;
const target = event.event.target;
try {
if (target.value) {
const day = this.getMoment(target.value);
if (!day.isBefore(this.options.minDate) && !day.isAfter(this.options.maxDate)) {
if (isLeft && !this.fromDate) {
this.fromDate = day;
}
if (!isLeft && !this.toDate) {
this.toDate = day;
}
this.dateChanged({
day,
isLeft,
});
if (this.fromDate && this.toDate) {
this.setFromToMonthYear(this.fromDate, this.toDate);
if (!this.options.autoApply) {
this.emitRangeSelected();
}
}
}
else {
// assume nothing - reset values
this.fromDate = null;
this.toDate = null;
target.value = '';
target.focus();
}
}
}
catch (e) {
console.error(e);
}
}
monthChanged(data) {
let temp;
if (data.isLeft) {
temp = moment([this.fromYear, this.fromMonth]).add(data.value, 'month');
this.fromMonth = temp === null || temp === void 0 ? void 0 : temp.get('month');
this.fromYear = temp === null || temp === void 0 ? void 0 : temp.get('year');
}
else {
temp = moment([this.toYear, this.toMonth]).add(data.value, 'month');
this.toMonth = temp === null || temp === void 0 ? void 0 : temp.get('month');
this.toYear = temp === null || temp === void 0 ? void 0 : temp.get('year');
}
}
yearChanged(data) {
let temp;
if (data.isLeft) {
temp = moment([this.fromYear, this.fromMonth]).add(data.value, 'year');
this.fromMonth = temp === null || temp === void 0 ? void 0 : temp.get('month');
this.fromYear = temp === null || temp === void 0 ? void 0 : temp.get('year');
}
else {
temp = moment([this.toYear, this.toMonth]).add(data.value, 'year');
this.toMonth = temp === null || temp === void 0 ? void 0 : temp.get('month');
this.toYear = temp === null || temp === void 0 ? void 0 : temp.get('year');
}
}
close(event) {
this.toggleCalendarVisibility(false);
event.stopPropagation();
}
reset(event) {
this.fromDate = null;
this.toDate = null;
this.setRange();
this.datepickerReset.emit();
event.stopPropagation();
}
apply(event) {
this.toggleCalendarVisibility(false);
this.setRange();
this.emitRangeSelected();
event.stopPropagation();
}
applyPredefinedRange(event) {
// adjust to/from month/year so calendar months and years match range
this.setFromToMonthYear(event.definedDateRange.value.start, event.definedDateRange.value.end);
this.fromDate = event.definedDateRange.value.start;
this.toDate = event.definedDateRange.value.end;
if (this.options.autoApply) {
this.apply(event.event);
}
}
validateAndAssignPredefinedRanges(ranges) {
return ranges.filter(range => {
if (range.value.start.isAfter(range.value.end, 'date')) {
throw new RangeError(`Pre-defined range "${range.name}" start date cannot be after the end date for the range.`);
}
if (this.options.minDate && range.value.start.isBefore(this.options.minDate)) {
throw new RangeError(`Pre-defined range "${range.name}" start date is before the specified minDate in your options.`);
}
if (this.options.maxDate && range.value.end.isAfter(this.options.maxDate)) {
throw new RangeError(`Pre-defined range "${range.name}" end date is after the specified maxDate in your options.`);
}
// add range to ranges
return true;
});
}
}
DateRangePickerComponent.decorators = [
{ type: Component, args: [{
encapsulation: ViewEncapsulation.Emulated,
selector: 'date-range-picker',
template: "<div class=\"dateRangePicker-wrapper\" *ngIf=\"parentFormGroup\">\n <div #content>\n <ng-content></ng-content>\n </div>\n <div class=\"form-group\" [formGroup]=\"parentFormGroup\">\n <ng-container *ngIf=\"content.childNodes.length === 0\">\n <label [attr.for]=\"instanceId\">{{ options.labelText }}</label>\n <input [attr.id]=\"instanceId\" class=\"form-control\" type=\"text\" [formControlName]=\"controlName\">\n </ng-container>\n\n <div class=\"modal\" tabindex=\"-1\" role=\"dialog\" [ngClass]=\"{ 'modal-display': displayStyle}\">\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-body\">\n <div [ngClass]=\"{'dateRangePickerModal': true, 'dateRangePicker-single': options.singleCalendar, 'is-chrome': checkChrome(), 'mobile': isMobile }\">\n <div class=\"container-fluid\">\n <div class=\"row\">\n <div class=\"col\">\n \n <!-- Manual Inputs -->\n <manual-inputs [options]=\"options\" [fromDate]=\"fromDate\" [toDate]=\"toDate\" [isMobile]=\"isMobile\" (dateFromInput)=\"setDateFromInput($event)\"></manual-inputs>\n \n <!-- Calendars -->\n <div class=\"row row-calendars\">\n <div [ngClass]=\"{ 'col-12': true, 'col-sm-6': !isMobile && !options.singleCalendar }\">\n <calendar [ngClass]=\"{ 'calendar': true, 'calendar-single': options.singleCalendar }\" [isLeft]=\"true\" [month]=\"fromMonth\" [year]=\"fromYear\" (monthChanged)=monthChanged($event) (yearChanged)=\"yearChanged($event)\" (dateChanged)=\"dateChanged($event)\" [format]=\"options.format\" [selectedFromDate]=\"fromDate\" [selectedToDate]=\"toDate\" [minDate]=\"options.minDate\" [maxDate]=\"options.maxDate\" [singleCalendar]=\"options.singleCalendar\" [icons]=\"options.icons\"></calendar>\n </div>\n \n <div [ngClass]=\"{ 'col-12': true, 'col-sm-6': !isMobile, 'col__mobile': isMobile }\" *ngIf=\"!options.singleCalendar\">\n <calendar class=\"calendar\" [month]=\"toMonth\" [year]=\"toYear\" [format]=\"options.format\" (dateChanged)=\"dateChanged($event)\" (monthChanged)=\"monthChanged($event)\" (yearChanged)=\"yearChanged($event)\" [selectedFromDate]=\"fromDate\" [selectedToDate]=\"toDate\" [minDate]=\"options.minDate\" [maxDate]=\"options.maxDate\" [icons]=\"options.icons\"></calendar>\n </div>\n </div>\n </div>\n </div>\n \n <!-- Pre-Defined Date Ranges -->\n <predefined-date-ranges [options]=\"options\" [range]=\"range\" [enableApplyButton]=\"enableApplyButton\" (closeEvent)=\"close($event)\" (resetEvent)=\"reset($event)\" (applyEvent)=\"apply($event)\" (predefinedRange)=\"applyPredefinedRange($event)\"></predefined-date-ranges>\n \n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm\" (click)=\"close($event)\">Close</button>\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm ml-3\" (click)=\"reset($event)\" *ngIf=\"range && options.showResetButton\">Reset</button>\n <button type=\"button\" class=\"btn btn-primary btn-sm ml-3\" [disabled]=\"!enableApplyButton\" (click)=\"apply($event)\" *ngIf=\"!options.autoApply\">Apply</button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Desktop Browsers -->\n <div [ngClass]=\"{'dateRangePicker': true, 'invisible': !showCalendars, 'dateRangePicker-single': options.singleCalendar, 'is-chrome': checkChrome(), 'open-left': options.position === 'left', 'open-right': options.position === 'right', 'mobile': isMobile }\">\n <div class=\"container-fluid\">\n <div class=\"row\">\n <div class=\"col\">\n\n <!-- Manual Inputs -->\n <manual-inputs [options]=\"options\" [fromDate]=\"fromDate\" [toDate]=\"toDate\" [isMobile]=\"isMobile\" (dateFromInput)=\"setDateFromInput($event)\"></manual-inputs>\n\n <!-- Calendars -->\n <div class=\"row row-calendars\">\n <div [ngClass]=\"{ 'col-12': true, 'col-sm-6': !isMobile && !options.singleCalendar }\">\n <calendar [ngClass]=\"{ 'calendar': true, 'calendar-single': options.singleCalendar }\" [isLeft]=\"true\" [month]=\"fromMonth\" [year]=\"fromYear\" (monthChanged)=monthChanged($event) (yearChanged)=\"yearChanged($event)\" (dateChanged)=\"dateChanged($event)\" [format]=\"options.format\" [selectedFromDate]=\"fromDate\" [selectedToDate]=\"toDate\" [minDate]=\"options.minDate\" [maxDate]=\"options.maxDate\" [singleCalendar]=\"options.singleCalendar\" [icons]=\"options.icons\"></calendar>\n </div>\n\n <div [ngClass]=\"{ 'col-12': true, 'col-sm-6': !isMobile, 'col__mobile': isMobile }\" *ngIf=\"!options.singleCalendar\">\n <calendar class=\"calendar\" [month]=\"toMonth\" [year]=\"toYear\" [format]=\"options.format\" (dateChanged)=\"dateChanged($event)\" (monthChanged)=\"monthChanged($event)\" (yearChanged)=\"yearChanged($event)\" [selectedFromDate]=\"fromDate\" [selectedToDate]=\"toDate\" [minDate]=\"options.minDate\" [maxDate]=\"options.maxDate\" [icons]=\"options.icons\"></calendar>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Pre-Defined Date Ranges -->\n <predefined-date-ranges [options]=\"options\" [range]=\"range\" [enableApplyButton]=\"enableApplyButton\" (closeEvent)=\"close($event)\" (resetEvent)=\"reset($event)\" (applyEvent)=\"apply($event)\"></predefined-date-ranges>\n\n </div>\n </div>\n\n </div>\n</div>\n",
styles: [".dateRangePicker-wrapper{border:none;position:relative}.dateRangePicker-wrapper input.form-control[disabled]{background-color:#fff}.dateRangePicker-wrapper .modal-body{padding:0!important}.dateRangePicker-wrapper .modal{-webkit-backdrop-filter:brightness(50%);backdrop-filter:brightness(50%)}.dateRangePicker-wrapper .modal-display{display:flex}.dateRangePicker-wrapper .modal-display .modal-dialog{box-shadow:none;display:flex}.dateRangePicker-wrapper .modal-content{border:0;border-radius:8px;box-shadow:0 0 10px 0 rgba(129,139,144,.5);display:flex;width:602px}.dateRangePicker-wrapper .modal-content .modal-footer .btn{width:auto}.dateRangePicker-wrapper .dateRangePickerModal{border-top-left-radius:5px;border-top-right-radius:5px;font-family:Roboto,Helvetica,Arial,sans-serif;overflow:visible;z-index:3000}@media screen and (min-width:576px){.dateRangePicker-wrapper .dateRangePickerModal{min-width:600px}}.dateRangePicker-wrapper .dateRangePickerModal.dateRangePicker-single,.dateRangePicker-wrapper .dateRangePickerModal.mobile{min-width:300px}.dateRangePicker-wrapper .dateRangePickerModal.dateRangePicker-single:after,.dateRangePicker-wrapper .dateRangePickerModal.dateRangePicker-single:before,.dateRangePicker-wrapper .dateRangePickerModal.mobile:after,.dateRangePicker-wrapper .dateRangePickerModal.mobile:before{border-bottom-color:#fff}.dateRangePicker-wrapper .dateRangePickerModal.is-chrome .form-inputs .input-with-icon span{position:relative;top:1px}.dateRangePicker-wrapper .dateRangePickerModal .btn,.dateRangePicker-wrapper .dateRangePickerModal .btn.btn-link{min-width:60px;width:60px}.dateRangePicker-wrapper .dateRangePickerModal .form-inputs{background-color:#6e777c;border-top-left-radius:5px;border-top-right-radius:5px;color:#fff;font-size:16px}.dateRangePicker-wrapper .dateRangePickerModal .form-inputs>.col{min-width:270px;padding:.5rem 15px}.dateRangePicker-wrapper .dateRangePickerModal .form-inputs .input-with-icon{align-content:flex-start;align-items:center!important;display:flex}.dateRangePicker-wrapper .dateRangePickerModal .form-inputs .input-with-icon i{color:#fff;margin-right:.5rem}.dateRangePicker-wrapper .dateRangePickerModal .form-inputs .input-with-icon i.material-icons{top:0}.dateRangePicker-wrapper .dateRangePickerModal .form-inputs .input-with-icon span{line-height:1}.dateRangePicker-wrapper .dateRangePickerModal .form-inputs .form-control{background:none;border:0;color:#fff;display:inline-block;padding:0;width:150px}.dateRangePicker-wrapper .dateRangePickerModal .form-inputs .form-control::-moz-placeholder{color:#fff}.dateRangePicker-wrapper .dateRangePickerModal .form-inputs .form-control::placeholder{color:#fff}.dateRangePicker-wrapper .dateRangePickerModal .row-1s .col__mobile{border-top:1px dotted #ccc;margin-top:1rem}.dateRangePicker-wrapper .dateRangePickerModal:not(.mobile) .form-inputs>div:nth-child(2),.dateRangePicker-wrapper .dateRangePickerModal:not(.mobile) .row-calendars>div:nth-child(2){border-left:2px solid #c6d1d6}.dateRangePicker-wrapper .dateRangePicker{background:#fff;border-radius:9px;box-shadow:0 0 10px 0 rgba(129,139,144,.5);font-family:Roboto,Helvetica,Arial,sans-serif;overflow:visible;position:absolute;top:88px;z-index:3000}@media screen and (min-width:576px){.dateRangePicker-wrapper .dateRangePicker{min-width:600px}}.dateRangePicker-wrapper .dateRangePicker.dateRangePicker-single,.dateRangePicker-wrapper .dateRangePicker.mobile{min-width:300px}.dateRangePicker-wrapper .dateRangePicker.dateRangePicker-single:after,.dateRangePicker-wrapper .dateRangePicker.dateRangePicker-single:before,.dateRangePicker-wrapper .dateRangePicker.mobile:after,.dateRangePicker-wrapper .dateRangePicker.mobile:before{border-bottom-color:#fff}.dateRangePicker-wrapper .dateRangePicker:after,.dateRangePicker-wrapper .dateRangePicker:before{border-bottom:10px solid #6e777c;border-left:10px solid transparent;border-right:10px solid transparent;content:\"\";height:0;position:absolute;top:-10px;width:0}.dateRangePicker-wrapper .dateRangePicker.open-left{left:0}.dateRangePicker-wrapper .dateRangePicker.open-left:before{left:10px}.dateRangePicker-wrapper .dateRangePicker.open-left:after{display:none}.dateRangePicker-wrapper .dateRangePicker.open-right{right:0}.dateRangePicker-wrapper .dateRangePicker.open-right:before{display:none}.dateRangePicker-wrapper .dateRangePicker.open-right:after{right:10px}.dateRangePicker-wrapper .dateRangePicker.is-chrome .form-inputs .input-with-icon span{position:relative;top:1px}.dateRangePicker-wrapper .dateRangePicker .btn,.dateRangePicker-wrapper .dateRangePicker .btn.btn-link{min-width:auto;width:auto}.dateRangePicker-wrapper .dateRangePicker .form-inputs{background-color:#6e777c;border-top-left-radius:5px;border-top-right-radius:5px;color:#fff;font-size:16px}.dateRangePicker-wrapper .dateRangePicker .form-inputs>.col{min-width:270px;padding:.5rem 15px}.dateRangePicker-wrapper .dateRangePicker .form-inputs .input-with-icon{align-content:flex-start;align-items:center!important;display:flex}.dateRangePicker-wrapper .dateRangePicker .form-inputs .input-with-icon i{color:#fff;margin-right:.5rem}.dateRangePicker-wrapper .dateRangePicker .form-inputs .input-with-icon i.material-icons{top:0}.dateRangePicker-wrapper .dateRangePicker .form-inputs .input-with-icon span{line-height:1}.dateRangePicker-wrapper .dateRangePicker .form-inputs .form-control{background:none;border:0;color:#fff;display:inline-block;padding:0;width:150px}.dateRangePicker-wrapper .dateRangePicker .form-inputs .form-control::-moz-placeholder{color:#fff}.dateRangePicker-wrapper .dateRangePicker .form-inputs .form-control::placeholder{color:#fff}.dateRangePicker-wrapper .dateRangePicker .row-calendars .col__mobile{border-top:1px dotted #ccc;margin-top:1rem}.dateRangePicker-wrapper .dateRangePicker:not(.mobile) .form-inputs>div:nth-child(2),.dateRangePicker-wrapper .dateRangePicker:not(.mobile) .row-calendars>div:nth-child(2){border-left:2px solid #c6d1d6}.dateRangePicker-wrapper i.material-icons{position:relative;top:2px}"]
},] }
];
DateRangePickerComponent.ctorParameters = () => [];
DateRangePickerComponent.propDecorators = {
options: [{ type: Input }],
controlName: [{ type: Input }],
instanceId: [{ type: Input }],
parentFormGroup: [{ type: Input }],
fromDate: [{ type: Input }],
toDate: [{ type: Input }],
datepickerReset: [{ type: Output }],
rangeSelected: [{ type: Output }],
handleClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uL3NyYy9tb2R1bGVzL25neC1kYXRlcmFuZ2Uvc3JjLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9kYXRlcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBVSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR25GLE9BQU8sS0FBSyxRQUFRLE1BQU0sUUFBUSxDQUFDO0FBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBRTVELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztBQVV0QixNQUFNLE9BQU8sd0JBQXdCO0lBbUZuQztRQWhGQSxZQUFPLEdBQTRCLDZCQUE2QixDQUFDO1FBR2pFLGdCQUFXLEdBQVcsV0FBVyxDQUFDO1FBR2xDLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFNMUIsYUFBUSxHQUFvQixJQUFJLENBQUM7UUFHakMsV0FBTSxHQUFvQixJQUFJLENBQUM7UUFHL0Isb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRzFDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUcvQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBS2pCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQWtENUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsaUJBQWlCO1lBQ2pCLElB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S0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUN0RCxNQUFNLElBQUksVUFBVSxDQUFDLHNCQUF1QixLQUFLLENBQUMsSUFBSywwREFBMEQsQ0FBQyxDQUFDO2FBQ3BIO1lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDNUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxzQkFBdUIsS0FBSyxDQUFDLElBQUssK0RBQStELENBQUMsQ0FBQzthQUN6SDtZQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3pFLE1BQU0sSUFBSSxVQUFVLENBQUMsc0JBQXVCLEtBQUssQ0FBQyxJQUFLLDREQUE0RCxDQUFDLENBQUM7YUFDdEg7WUFFRCxzQkFBc0I7WUFDdEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OztZQTVhRixTQUFTLFNBQUM7Z0JBQ1QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLFFBQVE7Z0JBQ3pDLFFBQVEsRUFBRSxtQkFBbUI7Z0JBSTdCLGl5TEFBaUQ7O2FBQ2xEOzs7O3NCQUdFLEtBQUs7MEJBR0wsS0FBSzt5QkFHTCxLQUFLOzhCQUdMLEtBQUs7dUJBR0wsS0FBSztxQkFHTCxLQUFLOzhCQUdMLE1BQU07NEJBR04sTUFBTTswQkF1Qk4sWUFBWSxTQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgZGVmYXVsdERhdGVGb3JtYXQsIGRlZmF1bHREYXRlUmFuZ2VQaWNrZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IElEYXRlUmFuZ2UsIElEYXRlUmFuZ2VQaWNrZXJPcHRpb25zLCBJRGVmaW5lZERhdGVSYW5nZSwgSUNoYW5nZWREYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbmltcG9ydCAqIGFzIG1vbWVudE5zIGZyb20gJ21vbWVudCc7IGNvbnN0IG1vbWVudCA9IG1vbWVudE5zO1xuXG5sZXQgaW5zdGFuY2VDb3VudCA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgc2VsZWN0b3I6ICdkYXRlLXJhbmdlLXBpY2tlcicsXG4gIHN0eWxlVXJsczogW1xuICAgICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5zY3NzJyxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKVxuICBvcHRpb25zOiBJRGF0ZVJhbmdlUGlja2VyT3B0aW9ucyA9IGRlZmF1bHREYXRlUmFuZ2VQaWNrZXJPcHRpb25zO1xuXG4gIEBJbnB1dCgpXG4gIGNvbnRyb2xOYW1lOiBzdHJpbmcgPSAnZGF0ZVJhbmdlJztcblxuICBASW5wdXQoKVxuICBpbnN0YW5jZUlkOiBzdHJpbmcgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwO1xuXG4gIEBJbnB1dCgpXG4gIGZyb21EYXRlOiBtb21lbnROcy5Nb21lbnQgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHRvRGF0ZTogbW9tZW50TnMuTW9tZW50ID0gbnVsbDtcblxuICBAT3V0cHV0KClcbiAgZGF0ZXBpY2tlclJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJhbmdlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElEYXRlUmFuZ2U+KCk7XG5cbiAgZGVmYXVsdFJhbmdlczogSURlZmluZWREYXRlUmFuZ2VbXTtcbiAgaXNNb2JpbGUgPSBmYWxzZTtcbiAgZnJvbU1vbnRoOiBudW1iZXI7XG4gIGZyb21ZZWFyOiBudW1iZXI7XG4gIHRvTW9udGg6IG51bWJlcjtcbiAgdG9ZZWFyOiBudW1iZXI7XG4gIHJhbmdlID0gJyc7XG4gIHNob3dDYWxlbmRhcnMgPSBmYWxzZTtcbiAgZGlzcGxheVN0eWxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGVuYWJsZUFwcGx5QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGxldCBlbmFibGVkID0gIXRoaXMub3B0aW9ucy5hdXRvQXBwbHkgJiYgdGhpcy5mcm9tRGF0ZSAhPT0gbnVsbDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2luZ2xlQ2FsZW5kYXIpIHtcbiAgICAgIHJldHVybiBlbmFibGVkO1xuICAgIH1cblxuICAgIHJldHVybiBlbmFibGVkICYmIHRoaXMudG9EYXRlICE9PSBudWxsO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBoYW5kbGVDbGljayhldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgIC8vIGNsb3NlIHRoZSBEYXRlUGlja2VyIGlmIGNsaWNraW5nIG91dHNpZGUgaXMgbm90IGFsbG93ZWRcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5jbGlja091dHNpZGVBbGxvd2VkKSB7XG4gICAgICBsZXQgdGFyZ2V0UGF0aENsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRhcmdldFBhdGhDbGFzc05hbWVzID0gZXZlbnQuY29tcG9zZWRQYXRoKCkubWFwKChvYmo6IEV2ZW50VGFyZ2V0KSA9PiBvYmpbJ2NsYXNzTmFtZSddKSB8fCBbJyddO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElFIC8gRWRnZVxuICAgICAgICB0YXJnZXRQYXRoQ2xhc3NOYW1lcyA9IGV2ZW50WydwYXRoJ10/Lm1hcChvYmogPT4gb2JqLmNsYXNzTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb250YWluZXJFbGVtZW50Q2xhc3NSb290ID0gdGhpcy5vcHRpb25zLm1vZGFsID09PSB0cnVlID8gJ2RhdGVSYW5nZVBpY2tlck1vZGFsJyA6ICdkYXRlUmFuZ2VQaWNrZXInO1xuXG4gICAgICBjb25zdCB0YXJnZXRFeGlzdHNJblBhdGggPSB0YXJnZXRQYXRoQ2xhc3NOYW1lcz8uc29tZShjbGFzc05hbWUgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lICYmIGNsYXNzTmFtZS5pbmNsdWRlcyhjb250YWluZXJFbGVtZW50Q2xhc3NSb290KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRhcmdldEV4aXN0c0luUGF0aCkge1xuICAgICAgICB0aGlzLnRvZ2dsZUNhbGVuZGFyVmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIERhdGVQaWNrZXIgaWYgdGhlIHRhcmdldCBpbnB1dCB3YXMgY2xpY2tlZFxuICAgIGlmICh0YXJnZXQuaWQgPT09IHRoaXMuaW5zdGFuY2VJZCkge1xuICAgICAgdGhpcy50b2dnbGVDYWxlbmRhclZpc2liaWxpdHkoIXRoaXMuc2hvd0NhbGVuZGFycyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlSWQpIHtcbiAgICAgIC8vIGFzc2lnbiBhdXRvLWlkXG4gICAgICB0aGlzLmluc3RhbmNlSWQgPSBgZGF0ZVJhbmdlUGlja2VyLSR7IGluc3RhbmNlQ291bnQrKyB9YDtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAobmF2aWdhdG9yKSB7XG4gICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKVxuICAgICAgICB8fCBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC93ZWJPUy9pKVxuICAgICAgICB8fCBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmUvaSlcbiAgICAgICAgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBvZC9pKVxuICAgICAgICB8fCBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpXG4gICAgICAgIHx8IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbmRvd3MgUGhvbmUvaSkpIHtcbiAgICAgICAgdGhpcy5pc01vYmlsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW5zdXJlIGRhdGVzIGluIG9wdGlvbnMgYXJlIHZhbGlkXG4gICAgdGhpcy52YWxpZGF0ZU9wdGlvbkRhdGVzKCk7XG5cbiAgICAvLyBlbnN1cmUgaW5wdXQgZGF0ZXMgYXJlIHdpdGhpbiB0aGUgbWluL21heCBkYXRlcyBpbiBvcHRpb25zXG4gICAgdGhpcy52YWxpZGF0ZUlucHV0RGF0ZXMoKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJlRGVmaW5lZFJhbmdlcyAmJiB0aGlzLm9wdGlvbnMucHJlRGVmaW5lZFJhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRlZmF1bHRSYW5nZXMgPSB0aGlzLnZhbGlkYXRlQW5kQXNzaWduUHJlZGVmaW5lZFJhbmdlcyh0aGlzLm9wdGlvbnMucHJlRGVmaW5lZFJhbmdlcyk7XG4gICAgfVxuXG4gICAgLy8gYXNzaWduIHZhbHVlcyBub3QgcHJlc2VudCBpbiBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICBjb25zdCBvcHRpb25zS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucyk7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlc0tleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0RGF0ZVJhbmdlUGlja2VyT3B0aW9ucyk7XG5cbiAgICBkZWZhdWx0VmFsdWVzS2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFvcHRpb25zS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRoaXMub3B0aW9uc1trZXldID0gZGVmYXVsdERhdGVSYW5nZVBpY2tlck9wdGlvbnNba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZSBjYWxlbmRhciBncmlkXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcigpO1xuXG4gICAgLy8gY3JlYXRlIHBhcmVudCBmb3JtIGdyb3VwIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICBpZiAoIXRoaXMucGFyZW50Rm9ybUdyb3VwKSB7XG4gICAgICB0aGlzLnBhcmVudEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgIH1cblxuICAgIC8vIGFkZCBmb3JtIGNvbnRyb2wgdG8gcGFyZW50IGZvcm0gZ3JvdXBcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybWF0UmFuZ2VBc1N0cmluZygpO1xuICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZSwgZGlzYWJsZWQ6IHRoaXMub3B0aW9ucy5kaXNhYmxlSW5wdXREaXNwbGF5IH0sIHRoaXMub3B0aW9ucy52YWxpZGF0b3JzKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIHRoaXMucGFyZW50Rm9ybUdyb3VwLmFkZENvbnRyb2wodGhpcy5jb250cm9sTmFtZSwgY29udHJvbCk7XG5cbiAgICAvLyBzZXQgdmFsdWUgb2YgY29udHJvbFxuICAgIHRoaXMuc2V0UmFuZ2UoKTtcbiAgfVxuXG4gIHZhbGlkYXRlSW5wdXREYXRlcygpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuZnJvbURhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmZyb21EYXRlID0gbW9tZW50KHRoaXMuZnJvbURhdGUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy50b0RhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnRvRGF0ZSA9IG1vbWVudCh0aGlzLnRvRGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZnJvbURhdGUgJiYgdGhpcy5vcHRpb25zLm1pbkRhdGUgJiYgdGhpcy5mcm9tRGF0ZS5pc0JlZm9yZSh0aGlzLm9wdGlvbnMubWluRGF0ZSwgJ2RhdGUnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0BJbnB1dCBmcm9tRGF0ZSBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBtaW5EYXRlIGluIG9wdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50b0RhdGUgJiYgdGhpcy5vcHRpb25zLm1heERhdGUgJiYgdGhpcy50b0RhdGUuaXNBZnRlcih0aGlzLm9wdGlvbnMubWF4RGF0ZSwgJ2RhdGUnKSkg