fundamental-ngx
Version:
SAP Fundamentals, implemented in Angular
849 lines • 59.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
import { TimeComponent } from '../time/time.component';
import { DateTimeFormatParser } from './format/datetime-parser';
import { CalendarComponent } from '../calendar/calendar.component';
import { FdDatetime } from './models/fd-datetime';
/**
* The datetime picker component is an opinionated composition of the fd-popover,
* fd-calendar and fd-time components to accomplish the UI pattern for picking a date and time.
*/
var DatetimePickerComponent = /** @class */ (function () {
/** @hidden */
function DatetimePickerComponent(elRef, changeDetRef, dateTimeAdapter) {
this.elRef = elRef;
this.changeDetRef = changeDetRef;
this.dateTimeAdapter = dateTimeAdapter;
/**
* @hidden Date of the input field. Internal use.
* For programmatic selection, use two-way binding on the date input.
*/
this.inputFieldDate = null;
/**
* @hidden The Time object which interacts with the inner Time component. Internal use.
*/
this.isInvalidDateInput = false;
/**
* @hidden The Time object which interacts with the inner Time component. Internal use.
*/
this.time = { hour: 0, minute: 0, second: 0 };
/**
* Placeholder for the inner input element.
*/
this.placeholder = 'mm/dd/yyyy, hh:mm:ss am';
/**
* Whether the component should be in compact mode.
*/
this.compact = false;
/**
* The placement of the popover. It can be one of: top, top-start, top-end, bottom,
* bottom-start, bottom-end, right, right-start, right-end, left, left-start, left-end.
*/
this.placement = 'bottom-start';
/**
* Whether the time component should be meridian (am/pm).
*/
this.meridian = true;
/**
* Whether the time component shows spinners for changing the time.
*/
this.spinners = true;
/**
* Whether the time component shows seconds.
*/
this.displaySeconds = true;
/**
* Whether the time component shows minutes.
*/
this.displayMinutes = true;
/**
* Whether the time component shows hours.
*/
this.displayHours = true;
/**
* Whether to perform visual validation on the picker input.
*/
this.useValidation = true;
/**
* Current selected date. Two-way binding is supported.
*/
this.date = FdDatetime.getToday();
/**
* Whether the popover is open. Two-way binding is supported.
*/
this.isOpen = false;
/**
* The disableFunction for the calendar.
*/
this.startingDayOfWeek = 1;
/**
* Actually shown active view one of 'day' | 'month' | 'year' in calendar component
*/
this.activeView = 'day';
/**
* Aria label for the datetime picker input.
*/
this.datetimeInputLabel = 'Datetime input';
/**
* Aria label for the button to show/hide the calendar.
*/
this.displayDatetimeToggleLabel = 'Display calendar toggle';
/**
* Whether a null input is considered valid.
*/
this.allowNull = true;
/**
* Event thrown every time calendar active view is changed
*/
this.activeViewChange = new EventEmitter();
/**
* Event emitted when the date changes. This can be a time or day change.
*/
this.dateChange = new EventEmitter();
/**
* Event emitted when the day changes from the calendar.
*/
this.calendarChange = new EventEmitter();
/**
* Event emitted when the time changes from the time component.
*/
this.timeChange = new EventEmitter();
/**
* Event emitted when popover closes.
*/
this.onClose = new EventEmitter();
/**
* @hidden
*/
this.onChange = (/**
* @param {?} selected
* @return {?}
*/
function (selected) {
});
/**
* @hidden
*/
this.onTouched = (/**
* @return {?}
*/
function () {
});
/**
* Function used to disable certain dates in the calendar.
* @param fdDate FdDate
*/
this.disableFunction = (/**
* @param {?} fdDate
* @return {?}
*/
function (fdDate) {
return false;
});
/**
* Function used to disable certain dates in the calendar for the range start selection.
* @param fdDate FdDate
*/
this.disableRangeStartFunction = (/**
* @param {?} fdDate
* @return {?}
*/
function (fdDate) {
return false;
});
/**
* Function used to disable certain dates in the calendar for the range end selection.
* @param fdDate FdDate
*/
this.disableRangeEndFunction = (/**
* @param {?} fdDate
* @return {?}
*/
function (fdDate) {
return false;
});
/**
* Function used to block certain dates in the calendar for the range start selection.
* @param fdDate FdDate
*/
this.blockRangeStartFunction = (/**
* @param {?} fdDate
* @return {?}
*/
function (fdDate) {
return false;
});
/**
* Function used to block certain dates in the calendar for the range end selection.
* @param fdDate FdDate
*/
this.blockRangeEndFunction = (/**
* @param {?} fdDate
* @return {?}
*/
function (fdDate) {
return false;
});
/**
* Function used to block certain dates in the calendar.
* @param fdDate FdDate
*/
this.blockFunction = (/**
* @param {?} fdDate
* @return {?}
*/
function (fdDate) {
return false;
});
}
/**
* @hidden
* Function that implements Validator Interface, adds validation support for forms
*/
/**
* @hidden
* Function that implements Validator Interface, adds validation support for forms
* @param {?} control
* @return {?}
*/
DatetimePickerComponent.prototype.validate = /**
* @hidden
* Function that implements Validator Interface, adds validation support for forms
* @param {?} control
* @return {?}
*/
function (control) {
return this.isModelValid() ? null : {
dateValidation: {
valid: false
}
};
};
/** Toggles the popover. */
/**
* Toggles the popover.
* @return {?}
*/
DatetimePickerComponent.prototype.togglePopover = /**
* Toggles the popover.
* @return {?}
*/
function () {
this.onTouched();
if (this.isOpen) {
this.closePopover();
}
else {
this.openPopover();
}
};
/**
* Method that handle calendar active view change and throws event.
*/
/**
* Method that handle calendar active view change and throws event.
* @param {?} activeView
* @return {?}
*/
DatetimePickerComponent.prototype.handleCalendarActiveViewChange = /**
* Method that handle calendar active view change and throws event.
* @param {?} activeView
* @return {?}
*/
function (activeView) {
this.activeViewChange.emit(activeView);
};
/** Opens the popover. */
/**
* Opens the popover.
* @return {?}
*/
DatetimePickerComponent.prototype.openPopover = /**
* Opens the popover.
* @return {?}
*/
function () {
if (!this.isOpen && !this.disabled) {
this.onTouched();
this.isOpen = true;
}
};
/** Closes the popover and refresh model */
/**
* Closes the popover and refresh model
* @return {?}
*/
DatetimePickerComponent.prototype.closePopover = /**
* Closes the popover and refresh model
* @return {?}
*/
function () {
if (this.isOpen) {
this.handleInputChange(this.inputFieldDate);
this.onClose.emit();
this.isOpen = false;
}
};
/** @hidden */
/**
* @hidden
* @param {?} e
* @return {?}
*/
DatetimePickerComponent.prototype.isInvalidDateInputHandler = /**
* @hidden
* @param {?} e
* @return {?}
*/
function (e) {
this.isInvalidDateInput = e;
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
DatetimePickerComponent.prototype.onEscapeKeydownHandler = /**
* @hidden
* @return {?}
*/
function () {
this.closePopover();
};
/** @hidden */
/**
* @hidden
* @param {?} event
* @return {?}
*/
DatetimePickerComponent.prototype.onGlobalClick = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.elRef.nativeElement.contains(event.target)) {
this.closePopover();
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
DatetimePickerComponent.prototype.ngOnInit = /**
* @hidden
* @return {?}
*/
function () {
if (this.date && this.inputFieldDate !== null) {
this.selectedDate = this.date.date;
this.time = this.date.time;
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
DatetimePickerComponent.prototype.ngOnDestroy = /**
* @hidden
* @return {?}
*/
function () {
if (this.dateFromInputSubscription) {
this.dateFromInputSubscription.unsubscribe();
}
};
/** @hidden */
/**
* @hidden
* @param {?} fn
* @return {?}
*/
DatetimePickerComponent.prototype.registerOnChange = /**
* @hidden
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/** @hidden */
/**
* @hidden
* @param {?} fn
* @return {?}
*/
DatetimePickerComponent.prototype.registerOnTouched = /**
* @hidden
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/** @hidden */
/**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
DatetimePickerComponent.prototype.setDisabledState = /**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
};
/**
* @hidden
* Function that provides support for ControlValueAccessor that allows to use [(ngModel)] or forms
*/
/**
* @hidden
* Function that provides support for ControlValueAccessor that allows to use [(ngModel)] or forms
* @param {?} selected
* @return {?}
*/
DatetimePickerComponent.prototype.writeValue = /**
* @hidden
* Function that provides support for ControlValueAccessor that allows to use [(ngModel)] or forms
* @param {?} selected
* @return {?}
*/
function (selected) {
if (!selected || !(selected instanceof FdDatetime)) {
return;
}
this.selectedDate = selected.date;
this.time = selected.time;
this.date = new FdDatetime(this.selectedDate, this.time);
if (this.isModelValid()) {
this.calendarComponent.setCurrentlyDisplayed(this.date.date);
this.setInput(this.date);
}
};
/**
* @hidden
* Method that is triggered by events from calendar component, when there is selected date changed.
* If invalid time model is detected, it takes time model data from TimeComponent.
*/
/**
* @hidden
* Method that is triggered by events from calendar component, when there is selected date changed.
* If invalid time model is detected, it takes time model data from TimeComponent.
* @param {?} date
* @return {?}
*/
DatetimePickerComponent.prototype.handleDateChange = /**
* @hidden
* Method that is triggered by events from calendar component, when there is selected date changed.
* If invalid time model is detected, it takes time model data from TimeComponent.
* @param {?} date
* @return {?}
*/
function (date) {
this.selectedDate = date;
if (!this.date.isTimeValid()) {
this.time = this.timeComponent.time;
}
this.date = new FdDatetime(this.selectedDate, this.time);
this.isInvalidDateInput = !this.isModelValid();
this.setInput(this.date);
this.onChange(this.date);
};
/**
* @hidden
* Method that is triggered by events from time component, when there is selected time changed
*/
/**
* @hidden
* Method that is triggered by events from time component, when there is selected time changed
* @param {?} time
* @return {?}
*/
DatetimePickerComponent.prototype.handleTimeChange = /**
* @hidden
* Method that is triggered by events from time component, when there is selected time changed
* @param {?} time
* @return {?}
*/
function (time) {
this.time = time;
this.date = new FdDatetime(this.selectedDate, this.time);
this.isInvalidDateInput = !this.isModelValid();
this.setInput(this.date);
this.onChange(this.date);
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
DatetimePickerComponent.prototype.focusArrowLeft = /**
* @hidden
* @return {?}
*/
function () {
if (this.elRef.nativeElement.querySelector('#' + this.calendarComponent.id + '-left-arrow')) {
this.elRef.nativeElement.querySelector('#' + this.calendarComponent.id + '-left-arrow').focus();
}
};
/**
* @hidden
* Method, which is responsible for transforming string to datetime, depending on type or
* validation the results are different. It also changes to state of isInvalidDateInput.
*/
/**
* @hidden
* Method, which is responsible for transforming string to datetime, depending on type or
* validation the results are different. It also changes to state of isInvalidDateInput.
* @param {?} date
* @return {?}
*/
DatetimePickerComponent.prototype.handleInputChange = /**
* @hidden
* Method, which is responsible for transforming string to datetime, depending on type or
* validation the results are different. It also changes to state of isInvalidDateInput.
* @param {?} date
* @return {?}
*/
function (date) {
/** @type {?} */
var fdTimeDate = this.dateTimeAdapter.parse(date);
this.selectedDate = fdTimeDate.date;
this.time = fdTimeDate.time;
this.date = new FdDatetime(this.selectedDate, this.time);
this.isInvalidDateInput = !this.isModelValid();
this.onChange(fdTimeDate);
if (!this.isInvalidDateInput) {
this.calendarComponent.setCurrentlyDisplayed(fdTimeDate.date);
}
if (!date && this.allowNull) {
this.isInvalidDateInput = false;
this.date = FdDatetime.getToday();
this.selectedDate = this.date.date;
this.time = this.date.time;
this.calendarComponent.setCurrentlyDisplayed(this.date.date);
this.onChange(null);
}
else if (!this.allowNull) {
this.isInvalidDateInput = true;
}
};
/** Method that provides information if model selected date/dates have properly types and are valid */
/**
* Method that provides information if model selected date/dates have properly types and are valid
* @return {?}
*/
DatetimePickerComponent.prototype.isModelValid = /**
* Method that provides information if model selected date/dates have properly types and are valid
* @return {?}
*/
function () {
return this.date &&
this.date instanceof FdDatetime &&
this.date.isDateValid() && this.date.isTimeValid();
};
/**
* @private
* @param {?} fdDateTime
* @return {?}
*/
DatetimePickerComponent.prototype.setInput = /**
* @private
* @param {?} fdDateTime
* @return {?}
*/
function (fdDateTime) {
this.inputFieldDate = this.dateTimeAdapter.format(fdDateTime);
this.changeDetRef.detectChanges();
};
DatetimePickerComponent.decorators = [
{ type: Component, args: [{
selector: 'fd-datetime-picker',
template: "<div class=\"fd-datetime\">\n <fd-popover [(isOpen)]=\"isOpen\"\n (isOpenChange)=\"handleInputChange(dateTimePicker.value)\"\n [closeOnOutsideClick]=\"false\"\n [closeOnEscapeKey]=\"false\"\n [triggers]=\"[]\"\n [disabled]=\"disabled\"\n [placement]=\"placement\">\n <fd-popover-control>\n <div class=\"fd-input-group fd-input-group--after\"\n [ngClass]=\"{'fd-input-group--compact' : compact}\">\n <input type=\"text\"\n #dateTimePicker\n [attr.aria-label]=\"datetimeInputLabel\"\n [(ngModel)]=\"inputFieldDate\"\n [placeholder]=\"placeholder\"\n (keyup.enter)=\"handleInputChange(dateTimePicker.value)\"\n (click)=\"openPopover()\"\n [ngClass]=\"{ 'fd-input--compact': compact, 'is-invalid': isInvalidDateInput && useValidation }\"\n [disabled]=\"disabled\">\n <span class=\"fd-input-group__addon fd-input-group__addon--after fd-input-group__addon--button\">\n <button class=\"fd-popover__control fd-button--icon fd-button--light sap-icon--date-time\"\n (click)=\"togglePopover()\" [attr.aria-label]=\"displayDatetimeToggleLabel\"\n [attr.aria-expanded]=\"isOpen\" type=\"button\" [disabled]=\"disabled\"></button>\n </span>\n </div>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-hidden]=\"!isOpen\"\n [style.display]=\"'block'\">\n <div class=\"fd-datetime__container\">\n <fd-calendar calType=\"single\"\n [activeView]=\"activeView\"\n (activeViewChange)=\"handleCalendarActiveViewChange($event)\"\n [disableFunction]=\"disableFunction ? disableFunction : null\"\n [blockFunction]=\"blockFunction ? blockFunction : null\"\n [disableRangeStartFunction]=\"disableRangeStartFunction ? disableRangeStartFunction : null\"\n [disableRangeEndFunction]=\"disableRangeEndFunction ? disableRangeEndFunction : null\"\n [blockRangeStartFunction]=\"blockRangeStartFunction ? blockRangeStartFunction : null\"\n [blockRangeEndFunction]=\"blockRangeEndFunction ? blockRangeEndFunction : null\"\n [selectedDate]=\"selectedDate\"\n (selectedDateChange)=\"handleDateChange($event)\"\n (isValidDateChange)=\"isInvalidDateInputHandler($event)\"\n [escapeFocusFunction]=\"null\"\n [startingDayOfWeek]=\"startingDayOfWeek\"></fd-calendar>\n <div class=\"fd-datetime__separator\"></div>\n <fd-time [disabled]=\"disabled\"\n [meridian]=\"meridian\"\n [ngModel]=\"time\"\n (ngModelChange)=\"handleTimeChange($event)\"\n [spinners]=\"spinners\"\n [displaySeconds]=\"displaySeconds\"\n [displayMinutes]=\"displayMinutes\"\n [displayHours]=\"displayHours\"\n (focusArrowLeft)=\"focusArrowLeft()\"></fd-time>\n </div>\n </fd-popover-body>\n </fd-popover>\n</div>\n",
host: {
'(blur)': 'onTouched()',
'[class.fd-datetime-host]': 'true'
},
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return DatetimePickerComponent; })),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return DatetimePickerComponent; })),
multi: true
}
],
encapsulation: ViewEncapsulation.None,
styles: [".fd-datetime-host{display:inline-block;width:230px}.fd-datetime-host .fd-datetime{display:block}.fd-datetime-host .fd-datetime__container{display:flex;align-items:center;margin:0 16px}.fd-datetime-host .fd-datetime__separator{background-color:#d3d3d3;width:1px;margin:42px 28px;-ms-grid-row-align:stretch;align-self:stretch}.fd-datetime-host .fd-datetime fd-popover{display:block}.fd-datetime-host .fd-datetime fd-time{width:auto}"]
}] }
];
/** @nocollapse */
DatetimePickerComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: DateTimeFormatParser }
]; };
DatetimePickerComponent.propDecorators = {
timeComponent: [{ type: ViewChild, args: [TimeComponent,] }],
calendarComponent: [{ type: ViewChild, args: [CalendarComponent,] }],
placeholder: [{ type: Input }],
compact: [{ type: Input }],
placement: [{ type: Input }],
meridian: [{ type: Input }],
disabled: [{ type: Input }],
spinners: [{ type: Input }],
displaySeconds: [{ type: Input }],
displayMinutes: [{ type: Input }],
displayHours: [{ type: Input }],
useValidation: [{ type: Input }],
date: [{ type: Input }],
isOpen: [{ type: Input }],
startingDayOfWeek: [{ type: Input }],
activeView: [{ type: Input }],
datetimeInputLabel: [{ type: Input }],
displayDatetimeToggleLabel: [{ type: Input }],
allowNull: [{ type: Input }],
activeViewChange: [{ type: Output }],
dateChange: [{ type: Output }],
calendarChange: [{ type: Output }],
timeChange: [{ type: Output }],
onClose: [{ type: Output }],
disableFunction: [{ type: Input }],
disableRangeStartFunction: [{ type: Input }],
disableRangeEndFunction: [{ type: Input }],
blockRangeStartFunction: [{ type: Input }],
blockRangeEndFunction: [{ type: Input }],
blockFunction: [{ type: Input }],
onEscapeKeydownHandler: [{ type: HostListener, args: ['document:keydown.escape', [],] }],
onGlobalClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
return DatetimePickerComponent;
}());
export { DatetimePickerComponent };
if (false) {
/**
* @hidden Reference to the inner time component.
* @type {?}
*/
DatetimePickerComponent.prototype.timeComponent;
/**
* @hidden Reference to the inner calendar component.
* @type {?}
*/
DatetimePickerComponent.prototype.calendarComponent;
/**
* @hidden Date of the input field. Internal use.
* For programmatic selection, use two-way binding on the date input.
* @type {?}
*/
DatetimePickerComponent.prototype.inputFieldDate;
/**
* @hidden The Time object which interacts with the inner Time component. Internal use.
* @type {?}
*/
DatetimePickerComponent.prototype.isInvalidDateInput;
/**
* @hidden The Time object which interacts with the inner Time component. Internal use.
* @type {?}
*/
DatetimePickerComponent.prototype.time;
/**
* @hidden The CalendarDay object which interacts with the inner Calendar component. Internal use.
* @type {?}
*/
DatetimePickerComponent.prototype.selectedDate;
/**
* Subscription of the dateFromInput.
* @type {?}
* @private
*/
DatetimePickerComponent.prototype.dateFromInputSubscription;
/**
* Placeholder for the inner input element.
* @type {?}
*/
DatetimePickerComponent.prototype.placeholder;
/**
* Whether the component should be in compact mode.
* @type {?}
*/
DatetimePickerComponent.prototype.compact;
/**
* The placement of the popover. It can be one of: top, top-start, top-end, bottom,
* bottom-start, bottom-end, right, right-start, right-end, left, left-start, left-end.
* @type {?}
*/
DatetimePickerComponent.prototype.placement;
/**
* Whether the time component should be meridian (am/pm).
* @type {?}
*/
DatetimePickerComponent.prototype.meridian;
/**
* Whether the component is disabled.
* @type {?}
*/
DatetimePickerComponent.prototype.disabled;
/**
* Whether the time component shows spinners for changing the time.
* @type {?}
*/
DatetimePickerComponent.prototype.spinners;
/**
* Whether the time component shows seconds.
* @type {?}
*/
DatetimePickerComponent.prototype.displaySeconds;
/**
* Whether the time component shows minutes.
* @type {?}
*/
DatetimePickerComponent.prototype.displayMinutes;
/**
* Whether the time component shows hours.
* @type {?}
*/
DatetimePickerComponent.prototype.displayHours;
/**
* Whether to perform visual validation on the picker input.
* @type {?}
*/
DatetimePickerComponent.prototype.useValidation;
/**
* Current selected date. Two-way binding is supported.
* @type {?}
*/
DatetimePickerComponent.prototype.date;
/**
* Whether the popover is open. Two-way binding is supported.
* @type {?}
*/
DatetimePickerComponent.prototype.isOpen;
/**
* The disableFunction for the calendar.
* @type {?}
*/
DatetimePickerComponent.prototype.startingDayOfWeek;
/**
* Actually shown active view one of 'day' | 'month' | 'year' in calendar component
* @type {?}
*/
DatetimePickerComponent.prototype.activeView;
/**
* Aria label for the datetime picker input.
* @type {?}
*/
DatetimePickerComponent.prototype.datetimeInputLabel;
/**
* Aria label for the button to show/hide the calendar.
* @type {?}
*/
DatetimePickerComponent.prototype.displayDatetimeToggleLabel;
/**
* Whether a null input is considered valid.
* @type {?}
*/
DatetimePickerComponent.prototype.allowNull;
/**
* Event thrown every time calendar active view is changed
* @type {?}
*/
DatetimePickerComponent.prototype.activeViewChange;
/**
* Event emitted when the date changes. This can be a time or day change.
* @type {?}
*/
DatetimePickerComponent.prototype.dateChange;
/**
* Event emitted when the day changes from the calendar.
* @type {?}
*/
DatetimePickerComponent.prototype.calendarChange;
/**
* Event emitted when the time changes from the time component.
* @type {?}
*/
DatetimePickerComponent.prototype.timeChange;
/**
* Event emitted when popover closes.
* @type {?}
*/
DatetimePickerComponent.prototype.onClose;
/**
* @hidden
* @type {?}
*/
DatetimePickerComponent.prototype.onChange;
/**
* @hidden
* @type {?}
*/
DatetimePickerComponent.prototype.onTouched;
/**
* Function used to disable certain dates in the calendar.
* \@param fdDate FdDate
* @type {?}
*/
DatetimePickerComponent.prototype.disableFunction;
/**
* Function used to disable certain dates in the calendar for the range start selection.
* \@param fdDate FdDate
* @type {?}
*/
DatetimePickerComponent.prototype.disableRangeStartFunction;
/**
* Function used to disable certain dates in the calendar for the range end selection.
* \@param fdDate FdDate
* @type {?}
*/
DatetimePickerComponent.prototype.disableRangeEndFunction;
/**
* Function used to block certain dates in the calendar for the range start selection.
* \@param fdDate FdDate
* @type {?}
*/
DatetimePickerComponent.prototype.blockRangeStartFunction;
/**
* Function used to block certain dates in the calendar for the range end selection.
* \@param fdDate FdDate
* @type {?}
*/
DatetimePickerComponent.prototype.blockRangeEndFunction;
/**
* Function used to block certain dates in the calendar.
* \@param fdDate FdDate
* @type {?}
*/
DatetimePickerComponent.prototype.blockFunction;
/**
* @type {?}
* @private
*/
DatetimePickerComponent.prototype.elRef;
/**
* @type {?}
* @private
*/
DatetimePickerComponent.prototype.changeDetRef;
/** @type {?} */
DatetimePickerComponent.prototype.dateTimeAdapter;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Z1bmRhbWVudGFsLW5neC8iLCJzb3VyY2VzIjpbImxpYi9kYXRldGltZS1waWNrZXIvZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXlDLGFBQWEsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBR3BILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQThCLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7OztBQU1sRDtJQTZSSSxjQUFjO0lBQ2QsaUNBQW9CLEtBQWlCLEVBQ2pCLFlBQStCLEVBQ2hDLGVBQXFDO1FBRnBDLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsaUJBQVksR0FBWixZQUFZLENBQW1CO1FBQ2hDLG9CQUFlLEdBQWYsZUFBZSxDQUFzQjs7Ozs7UUE1UHhELG1CQUFjLEdBQVcsSUFBSSxDQUFDOzs7O1FBRzlCLHVCQUFrQixHQUFZLEtBQUssQ0FBQzs7OztRQUdwQyxTQUFJLEdBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOzs7O1FBVXJELGdCQUFXLEdBQVcseUJBQXlCLENBQUM7Ozs7UUFJaEQsWUFBTyxHQUFZLEtBQUss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OztJQUc5Qyw2REFDK0Q7Ozs7O0lBRy9ELDRDQUMwQjs7Ozs7SUFHMUIsbURBQ29HOzs7OztJQUdwRyw2Q0FDK0U7Ozs7O0lBRy9FLGlEQUNtRjs7Ozs7SUFHbkYsNkNBQytFOzs7OztJQUcvRSwwQ0FDZ0U7Ozs7O0lBR2hFLDJDQUNFOzs7OztJQUdGLDRDQUNFOzs7Ozs7SUFNRixrREFHRTs7Ozs7O0lBTUYsNERBR0U7Ozs7OztJQU1GLDBEQUdFOzs7Ozs7SUFNRiwwREFHRTs7Ozs7O0lBTUYsd0RBR0U7Ozs7OztJQU1GLGdEQUdFOzs7OztJQXFGVSx3Q0FBeUI7Ozs7O0lBQ3pCLCtDQUF1Qzs7SUFDdkMsa0RBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGltZU9iamVjdCB9IGZyb20gJy4uL3RpbWUvdGltZS1vYmplY3QnO1xuaW1wb3J0IHsgVGltZUNvbXBvbmVudCB9IGZyb20gJy4uL3RpbWUvdGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSAncG9wcGVyLmpzJztcbmltcG9ydCB7IERhdGVUaW1lRm9ybWF0UGFyc2VyIH0gZnJvbSAnLi9mb3JtYXQvZGF0ZXRpbWUtcGFyc2VyJztcbmltcG9ydCB7IEZkRGF0ZSB9IGZyb20gJy4uL2NhbGVuZGFyL21vZGVscy9mZC1kYXRlJztcbmltcG9ydCB7IENhbGVuZGFyQ29tcG9uZW50LCBEYXlzT2ZXZWVrLCBGZENhbGVuZGFyVmlldyB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGZERhdGV0aW1lIH0gZnJvbSAnLi9tb2RlbHMvZmQtZGF0ZXRpbWUnO1xuXG4vKipcbiAqIFRoZSBkYXRldGltZSBwaWNrZXIgY29tcG9uZW50IGlzIGFuIG9waW5pb25hdGVkIGNvbXBvc2l0aW9uIG9mIHRoZSBmZC1wb3BvdmVyLFxuICogZmQtY2FsZW5kYXIgYW5kIGZkLXRpbWUgY29tcG9uZW50cyB0byBhY2NvbXBsaXNoIHRoZSBVSSBwYXR0ZXJuIGZvciBwaWNraW5nIGEgZGF0ZSBhbmQgdGltZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1kYXRldGltZS1waWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKScsXG4gICAgICAgICdbY2xhc3MuZmQtZGF0ZXRpbWUtaG9zdF0nOiAndHJ1ZSdcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGV0aW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRldGltZVBpY2tlckNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIERhdGV0aW1lUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuXG4gICAgLyoqIEBoaWRkZW4gUmVmZXJlbmNlIHRvIHRoZSBpbm5lciB0aW1lIGNvbXBvbmVudC4gKi9cbiAgICBAVmlld0NoaWxkKFRpbWVDb21wb25lbnQpXG4gICAgdGltZUNvbXBvbmVudDogVGltZUNvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuIFJlZmVyZW5jZSB0byB0aGUgaW5uZXIgY2FsZW5kYXIgY29tcG9uZW50LiAqL1xuICAgIEBWaWV3Q2hpbGQoQ2FsZW5kYXJDb21wb25lbnQpXG4gICAgY2FsZW5kYXJDb21wb25lbnQ6IENhbGVuZGFyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBEYXRlIG9mIHRoZSBpbnB1dCBmaWVsZC4gSW50ZXJuYWwgdXNlLlxuICAgICAqIEZvciBwcm9ncmFtbWF0aWMgc2VsZWN0aW9uLCB1c2UgdHdvLXdheSBiaW5kaW5nIG9uIHRoZSBkYXRlIGlucHV0LlxuICAgICAqL1xuICAgIGlucHV0RmllbGREYXRlOiBzdHJpbmcgPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gVGhlIFRpbWUgb2JqZWN0IHdoaWNoIGludGVyYWN0cyB3aXRoIHRoZSBpbm5lciBUaW1lIGNvbXBvbmVudC4gSW50ZXJuYWwgdXNlLiAqL1xuICAgIGlzSW52YWxpZERhdGVJbnB1dDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gVGhlIFRpbWUgb2JqZWN0IHdoaWNoIGludGVyYWN0cyB3aXRoIHRoZSBpbm5lciBUaW1lIGNvbXBvbmVudC4gSW50ZXJuYWwgdXNlLiAqL1xuICAgIHRpbWU6IFRpbWVPYmplY3QgPSB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwIH07XG5cbiAgICAvKiogQGhpZGRlbiBUaGUgQ2FsZW5kYXJEYXkgb2JqZWN0IHdoaWNoIGludGVyYWN0cyB3aXRoIHRoZSBpbm5lciBDYWxlbmRhciBjb21wb25lbnQuIEludGVybmFsIHVzZS4gKi9cbiAgICBzZWxlY3RlZERhdGU6IEZkRGF0ZTtcblxuICAgIC8qKiBTdWJzY3JpcHRpb24gb2YgdGhlIGRhdGVGcm9tSW5wdXQuICovXG4gICAgcHJpdmF0ZSBkYXRlRnJvbUlucHV0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogUGxhY2Vob2xkZXIgZm9yIHRoZSBpbm5lciBpbnB1dCBlbGVtZW50LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdtbS9kZC95eXl5LCBoaDptbTpzcyBhbSc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSBpbiBjb21wYWN0IG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBjb21wYWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wb3Zlci4gSXQgY2FuIGJlIG9uZSBvZjogdG9wLCB0b3Atc3RhcnQsIHRvcC1lbmQsIGJvdHRvbSxcbiAgICAgKiAgYm90dG9tLXN0YXJ0LCBib3R0b20tZW5kLCByaWdodCwgcmlnaHQtc3RhcnQsIHJpZ2h0LWVuZCwgbGVmdCwgbGVmdC1zdGFydCwgbGVmdC1lbmQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwbGFjZW1lbnQ6IFBsYWNlbWVudCA9ICdib3R0b20tc3RhcnQnO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHRpbWUgY29tcG9uZW50IHNob3VsZCBiZSBtZXJpZGlhbiAoYW0vcG0pLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWVyaWRpYW46IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkOiBib29sZWFuO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHRpbWUgY29tcG9uZW50IHNob3dzIHNwaW5uZXJzIGZvciBjaGFuZ2luZyB0aGUgdGltZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNwaW5uZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSB0aW1lIGNvbXBvbmVudCBzaG93cyBzZWNvbmRzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzcGxheVNlY29uZHM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHRpbWUgY29tcG9uZW50IHNob3dzIG1pbnV0ZXMuICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5TWludXRlczogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgdGltZSBjb21wb25lbnQgc2hvd3MgaG91cnMuICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5SG91cnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gcGVyZm9ybSB2aXN1YWwgdmFsaWRhdGlvbiBvbiB0aGUgcGlja2VyIGlucHV0LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdXNlVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogQ3VycmVudCBzZWxlY3RlZCBkYXRlLiBUd28td2F5IGJpbmRpbmcgaXMgc3VwcG9ydGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGF0ZTogRmREYXRldGltZSA9IEZkRGF0ZXRpbWUuZ2V0VG9kYXkoKTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIGlzIG9wZW4uIFR3by13YXkgYmluZGluZyBpcyBzdXBwb3J0ZWQuICovXG4gICAgQElucHV0KClcbiAgICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBUaGUgZGlzYWJsZUZ1bmN0aW9uIGZvciB0aGUgY2FsZW5kYXIuICovXG4gICAgQElucHV0KClcbiAgICBzdGFydGluZ0RheU9mV2VlazogRGF5c09mV2VlayA9IDE7XG5cbiAgICAvKiogQWN0dWFsbHkgc2hvd24gYWN0aXZlIHZpZXcgb25lIG9mICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyBpbiBjYWxlbmRhciBjb21wb25lbnQqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFjdGl2ZVZpZXc6IEZkQ2FsZW5kYXJWaWV3ID0gJ2RheSc7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlIGRhdGV0aW1lIHBpY2tlciBpbnB1dC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRhdGV0aW1lSW5wdXRMYWJlbDogc3RyaW5nID0gJ0RhdGV0aW1lIGlucHV0JztcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgYnV0dG9uIHRvIHNob3cvaGlkZSB0aGUgY2FsZW5kYXIuICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5RGF0ZXRpbWVUb2dnbGVMYWJlbDogc3RyaW5nID0gJ0Rpc3BsYXkgY2FsZW5kYXIgdG9nZ2xlJztcblxuICAgIC8qKiBXaGV0aGVyIGEgbnVsbCBpbnB1dCBpcyBjb25zaWRlcmVkIHZhbGlkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWxsb3dOdWxsOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBFdmVudCB0aHJvd24gZXZlcnkgdGltZSBjYWxlbmRhciBhY3RpdmUgdmlldyBpcyBjaGFuZ2VkICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IGFjdGl2ZVZpZXdDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGZENhbGVuZGFyVmlldz4gPSBuZXcgRXZlbnRFbWl0dGVyPEZkQ2FsZW5kYXJWaWV3PigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZGF0ZSBjaGFuZ2VzLiBUaGlzIGNhbiBiZSBhIHRpbWUgb3IgZGF5IGNoYW5nZS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBkYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RmREYXRldGltZT4gPSBuZXcgRXZlbnRFbWl0dGVyPEZkRGF0ZXRpbWU+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBkYXkgY2hhbmdlcyBmcm9tIHRoZSBjYWxlbmRhci4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBjYWxlbmRhckNoYW5nZTogRXZlbnRFbWl0dGVyPEZkRGF0ZXRpbWU+ID0gbmV3IEV2ZW50RW1pdHRlcjxGZERhdGV0aW1lPigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdGltZSBjaGFuZ2VzIGZyb20gdGhlIHRpbWUgY29tcG9uZW50LiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHRpbWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGZERhdGV0aW1lPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmREYXRldGltZT4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gcG9wb3ZlciBjbG9zZXMuICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgb25DbG9zZTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkNoYW5nZTogYW55ID0gKHNlbGVjdGVkOiBhbnkpID0+IHtcbiAgICB9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyLlxuICAgICAqIEBwYXJhbSBmZERhdGUgRmREYXRlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlRnVuY3Rpb24gPSBmdW5jdGlvbihmZERhdGU6IEZkRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZX