UNPKG

@herculesproject/datetime-picker

Version:
1,038 lines 83.6 kB
/** * @fileoverview added by tsickle * Generated from: lib/datetime-picker.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { Directionality } from '@angular/cdk/bidi'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes'; import { Overlay, OverlayConfig } from '@angular/cdk/overlay'; import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal'; import { DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Inject, Input, NgZone, Optional, Output, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; import { mixinColor } from '@angular/material/core'; import { matDatepickerAnimations, MAT_DATEPICKER_SCROLL_STRATEGY } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; import { merge, Subject, Subscription } from 'rxjs'; import { filter, take } from 'rxjs/operators'; import { NgxMatCalendar } from './calendar'; import { NgxMatDateAdapter } from './core/date-adapter'; import { NgxMatTimepickerComponent } from './timepicker.component'; import { createMissingDateImplError, DEFAULT_STEP } from './utils/date-utils'; /** * Used to generate a unique ID for each datepicker instance. * @type {?} */ let datepickerUid = 0; // Boilerplate for applying mixins to MatDatepickerContent. /** * \@docs-private */ class MatDatepickerContentBase { /** * @param {?} _elementRef */ constructor(_elementRef) { this._elementRef = _elementRef; } } if (false) { /** @type {?} */ MatDatepickerContentBase.prototype._elementRef; } /** @type {?} */ const _MatDatepickerContentMixinBase = mixinColor(MatDatepickerContentBase); /** * Component used as the content for the datepicker dialog and popup. We use this instead of using * NgxMatCalendar directly as the content so we can control the initial focus. This also gives us a * place to put additional features of the popup that are not part of the calendar itself in the * future. (e.g. confirmation buttons). * \@docs-private * @template D */ export class NgxMatDatetimeContent extends _MatDatepickerContentMixinBase { /** * @param {?} elementRef * @param {?} cd * @param {?} _viewContainerRef */ constructor(elementRef, cd, _viewContainerRef) { super(elementRef); this.cd = cd; this._viewContainerRef = _viewContainerRef; } /** * Whether or not the selected date is valid (min,max...) * @return {?} */ get valid() { if (this.datepicker.hideTime) return this.datepicker.valid; return this._timePicker && this._timePicker.valid && this.datepicker.valid; } /** * @return {?} */ get isViewMonth() { if (!this._calendar || this._calendar.currentView == null) return true; return this._calendar.currentView == 'month'; } /** * @return {?} */ ngAfterViewInit() { this._calendar.focusActiveCell(); if (this.datepicker._customIcon) { this._templateCustomIconPortal = new TemplatePortal(this.datepicker._customIcon, this._viewContainerRef); this.cd.detectChanges(); } } } NgxMatDatetimeContent.decorators = [ { type: Component, args: [{ selector: 'ngx-mat-datetime-content', template: "<ngx-mat-calendar cdkTrapFocus [id]=\"datepicker.id\" [ngClass]=\"datepicker.panelClass\" [startAt]=\"datepicker.startAt\"\n [startView]=\"datepicker.startView\" [minDate]=\"datepicker._minDate\" [maxDate]=\"datepicker._maxDate\"\n [dateFilter]=\"datepicker._dateFilter\" [headerComponent]=\"datepicker.calendarHeaderComponent\"\n [selected]=\"datepicker._selected\" [dateClass]=\"datepicker.dateClass\" [@fadeInCalendar]=\"'enter'\"\n (selectedChange)=\"datepicker.select($event)\" (yearSelected)=\"datepicker._selectYear($event)\"\n (monthSelected)=\"datepicker._selectMonth($event)\">\n</ngx-mat-calendar>\n<ng-container *ngIf=\"isViewMonth\">\n <div *ngIf=\"!datepicker._hideTime\" class=\"time-container\" [class.disable-seconds]=\"!datepicker._showSeconds\">\n <ngx-mat-timepicker [showSpinners]=\"datepicker._showSpinners\" [showSeconds]=\"datepicker._showSeconds\"\n [disabled]=\"datepicker._disabled\" [stepHour]=\"datepicker._stepHour\" [stepMinute]=\"datepicker._stepMinute\"\n [stepSecond]=\"datepicker._stepSecond\" [(ngModel)]=\"datepicker._selected\" [color]=\"datepicker._color\"\n [enableMeridian]=\"datepicker._enableMeridian\" [disableMinute]=\"datepicker._disableMinute\">\n </ngx-mat-timepicker>\n </div>\n <div class=\"actions\">\n <button mat-button (click)=\"datepicker.ok()\" mat-stroked-button [color]=\"datepicker._color\" cdkFocusInitial\n [disabled]=\"!valid\">\n <mat-icon *ngIf=\"!datepicker._customIcon\">done</mat-icon>\n <ng-template [cdkPortalOutlet]=\"_templateCustomIconPortal\"></ng-template>\n </button>\n </div>\n</ng-container>", host: { 'class': 'mat-datepicker-content', '[@transformPanel]': '"enter"', '[class.mat-datepicker-content-touch]': 'datepicker.touchUi', }, animations: [ matDatepickerAnimations.transformPanel, matDatepickerAnimations.fadeInCalendar, ], exportAs: 'ngxMatDatetimeContent', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, inputs: ['color'], styles: [".mat-datepicker-content{border-radius:4px;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);display:block}.mat-datepicker-content .mat-calendar{width:296px}.mat-datepicker-content .time-container{display:flex;justify-content:center;padding-top:5px;position:relative}.mat-datepicker-content .time-container.disable-seconds .ngx-mat-timepicker .table{margin-left:9px}.mat-datepicker-content .time-container:before{background-color:rgba(0,0,0,.12);content:\"\";height:1px;left:0;position:absolute;right:0;top:0}.mat-datepicker-content .actions{display:flex;justify-content:flex-end;padding:5px 15px 10px}"] }] } ]; /** @nocollapse */ NgxMatDatetimeContent.ctorParameters = () => [ { type: ElementRef }, { type: ChangeDetectorRef }, { type: ViewContainerRef } ]; NgxMatDatetimeContent.propDecorators = { _calendar: [{ type: ViewChild, args: [NgxMatCalendar,] }], _timePicker: [{ type: ViewChild, args: [NgxMatTimepickerComponent,] }] }; if (false) { /** * Reference to the internal calendar component. * @type {?} */ NgxMatDatetimeContent.prototype._calendar; /** * Reference to the internal time picker component. * @type {?} */ NgxMatDatetimeContent.prototype._timePicker; /** * Reference to the datepicker that created the overlay. * @type {?} */ NgxMatDatetimeContent.prototype.datepicker; /** * Whether the datepicker is above or below the input. * @type {?} */ NgxMatDatetimeContent.prototype._isAbove; /** @type {?} */ NgxMatDatetimeContent.prototype._templateCustomIconPortal; /** * @type {?} * @private */ NgxMatDatetimeContent.prototype.cd; /** * @type {?} * @private */ NgxMatDatetimeContent.prototype._viewContainerRef; } // TODO(mmalerba): We use a component instead of a directive here so the user can use implicit // template reference variables (e.g. #d vs #d="matDatepicker"). We can change this to a directive // if angular adds support for `exportAs: '$implicit'` on directives. /** * Component responsible for managing the datepicker popup/dialog. * @template D */ export class NgxMatDatetimePicker { /** * @param {?} _dialog * @param {?} _overlay * @param {?} _ngZone * @param {?} _viewContainerRef * @param {?} scrollStrategy * @param {?} _dateAdapter * @param {?} _dir * @param {?} _document */ constructor(_dialog, _overlay, _ngZone, _viewContainerRef, scrollStrategy, _dateAdapter, _dir, _document) { this._dialog = _dialog; this._overlay = _overlay; this._ngZone = _ngZone; this._viewContainerRef = _viewContainerRef; this._dateAdapter = _dateAdapter; this._dir = _dir; this._document = _document; /** * The view that the calendar should start in. */ this.startView = 'month'; this._defaultColor = 'primary'; this._touchUi = false; this._hideTime = false; /** * Emits selected year in multiyear view. * This doesn't imply a change on the selected date. */ this.yearSelected = new EventEmitter(); /** * Emits selected month in year view. * This doesn't imply a change on the selected date. */ this.monthSelected = new EventEmitter(); /** * Emits when the datepicker has been opened. */ this.openedStream = new EventEmitter(); /** * Emits when the datepicker has been closed. */ this.closedStream = new EventEmitter(); this._opened = false; this._showSpinners = true; this._showSeconds = false; this._stepHour = DEFAULT_STEP; this._stepMinute = DEFAULT_STEP; this._stepSecond = DEFAULT_STEP; this._enableMeridian = false; this._hasBackdrop = true; /** * The id for the datepicker calendar. */ this.id = `mat-datepicker-${datepickerUid++}`; this._validSelected = null; /** * The element that was focused before the datepicker was opened. */ this._focusedElementBeforeOpen = null; /** * Subscription to value changes in the associated input element. */ this._inputSubscription = Subscription.EMPTY; /** * Emits when the datepicker is disabled. */ this.stateChanges = new Subject(); /** * Emits new selected date when selected date changes. */ this._selectedChanged = new Subject(); /** * The form control validator for the min date. */ this._minValidator = (/** * @return {?} */ () => { return (!this._minDate || !this._selected || this._dateAdapter.compareDateWithTime(this._minDate, this._selected, this.showSeconds) <= 0) ? null : { 'matDatetimePickerMin': { 'min': this._minDate, 'actual': this._selected } }; }); /** * The form control validator for the max date. */ this._maxValidator = (/** * @return {?} */ () => { return (!this._maxDate || !this._selected || this._dateAdapter.compareDateWithTime(this._maxDate, this._selected, this.showSeconds) >= 0) ? null : { 'matDatetimePickerMax': { 'max': this._maxDate, 'actual': this._selected } }; }); if (!this._dateAdapter) { throw createMissingDateImplError('NgxMatDateAdapter'); } this._scrollStrategy = scrollStrategy; } /** * The date to open the calendar to initially. * @return {?} */ get startAt() { // If an explicit startAt is set we start there, otherwise we start at whatever the currently // selected value is. return this._startAt || (this.datepickerInput ? this.datepickerInput.value : null); } /** * @param {?} value * @return {?} */ set startAt(value) { this._startAt = this._getValidDateOrNull(this._dateAdapter.deserialize(value)); } /** * Default Color palette to use on the datepicker's calendar. * @return {?} */ get defaultColor() { return this._defaultColor; } /** * @param {?} value * @return {?} */ set defaultColor(value) { this._defaultColor = value; } /** * Color palette to use on the datepicker's calendar. * @return {?} */ get color() { return this._color || (this.datepickerInput ? this.datepickerInput._getThemePalette() : 'primary'); } /** * @param {?} value * @return {?} */ set color(value) { this._color = value; } /** * Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather * than a popup and elements have more padding to allow for bigger touch targets. * @return {?} */ get touchUi() { return this._touchUi; } /** * @param {?} value * @return {?} */ set touchUi(value) { this._touchUi = coerceBooleanProperty(value); } /** * @return {?} */ get hideTime() { return this._hideTime; } /** * @param {?} value * @return {?} */ set hideTime(value) { this._hideTime = coerceBooleanProperty(value); } /** * Whether the datepicker pop-up should be disabled. * @return {?} */ get disabled() { return this._disabled === undefined && this.datepickerInput ? this.datepickerInput.disabled : !!this._disabled; } /** * @param {?} value * @return {?} */ set disabled(value) { /** @type {?} */ const newValue = coerceBooleanProperty(value); if (newValue !== this._disabled) { this._disabled = newValue; this.stateChanges.next(newValue); } } /** * Whether the calendar is open. * @return {?} */ get opened() { return this._opened; } /** * @param {?} value * @return {?} */ set opened(value) { value ? this.open() : this.close(); } /** * Whether the timepicker'spinners is shown. * @return {?} */ get showSpinners() { return this._showSpinners; } /** * @param {?} value * @return {?} */ set showSpinners(value) { this._showSpinners = value; } /** * Whether the second part is disabled. * @return {?} */ get showSeconds() { return this._showSeconds; } /** * @param {?} value * @return {?} */ set showSeconds(value) { this._showSeconds = value; } /** * Step hour * @return {?} */ get stepHour() { return this._stepHour; } /** * @param {?} value * @return {?} */ set stepHour(value) { this._stepHour = value; } /** * Step minute * @return {?} */ get stepMinute() { return this._stepMinute; } /** * @param {?} value * @return {?} */ set stepMinute(value) { this._stepMinute = value; } /** * Step second * @return {?} */ get stepSecond() { return this._stepSecond; } /** * @param {?} value * @return {?} */ set stepSecond(value) { this._stepSecond = value; } /** * Enable meridian * @return {?} */ get enableMeridian() { return this._enableMeridian; } /** * @param {?} value * @return {?} */ set enableMeridian(value) { this._enableMeridian = value; } /** * disable minute * @return {?} */ get disableMinute() { return this._disableMinute; } /** * @param {?} value * @return {?} */ set disableMinute(value) { this._disableMinute = value; } /** * Step second * @return {?} */ get defaultTime() { return this._defaultTime; } /** * @param {?} value * @return {?} */ set defaultTime(value) { this._defaultTime = value; } /** * The currently selected date. * @return {?} */ get _selected() { return this._validSelected; } /** * @param {?} value * @return {?} */ set _selected(value) { this._validSelected = value; } /** * The minimum selectable date. * @return {?} */ get _minDate() { return this.datepickerInput && this.datepickerInput.min; } /** * The maximum selectable date. * @return {?} */ get _maxDate() { return this.datepickerInput && this.datepickerInput.max; } /** * @return {?} */ get valid() { /** @type {?} */ const minValidators = this._minValidator(); /** @type {?} */ const maxValidators = this._maxValidator(); return minValidators == null && maxValidators == null; } /** * @return {?} */ get _dateFilter() { return this.datepickerInput && this.datepickerInput._dateFilter; } /** * @return {?} */ ngOnDestroy() { this.close(); if (this._popupRef) { this._popupRef.dispose(); this._popupComponentRef = null; } this._inputSubscription.unsubscribe(); this.stateChanges.complete(); } /** * Selects the given date * @param {?} date * @return {?} */ select(date) { this._selected = this._dateAdapter.copyTime(date, this._selected); } /** * Emits the selected year in multiyear view * @param {?} normalizedYear * @return {?} */ _selectYear(normalizedYear) { this.yearSelected.emit(normalizedYear); } /** * Emits selected month in year view * @param {?} normalizedMonth * @return {?} */ _selectMonth(normalizedMonth) { this.monthSelected.emit(normalizedMonth); } /** * OK button handler and close * @return {?} */ ok() { /** @type {?} */ const cloned = this._dateAdapter.clone(this._selected); this._selectedChanged.next(cloned); this.close(); } /** * Cancel and close * @return {?} */ cancel() { this._selected = this._rawValue; this.close(); } /** * Register an input with this datepicker. * @param {?} input The datepicker input to register with this datepicker. * @return {?} */ _registerInput(input) { if (this.datepickerInput) { throw Error('A NgxMatDatepicker can only be associated with a single input.'); } this.datepickerInput = input; this._inputSubscription = this.datepickerInput._valueChange.subscribe((/** * @param {?} value * @return {?} */ (value) => this._selected = value)); } /** * Open the calendar. * @return {?} */ open() { this._rawValue = this._selected != null ? this._dateAdapter.clone(this._selected) : null; if (this._selected == null) { this._selected = this._dateAdapter.today(); if (this.defaultTime != null) { this._selected = this._dateAdapter.setTimeByDefaultValues(this._selected, this.defaultTime); } } if (this._opened || this.disabled) { return; } if (!this.datepickerInput) { throw Error('Attempted to open an NgxMatDatepicker with no associated input.'); } if (this._document) { this._focusedElementBeforeOpen = this._document.activeElement; } this.touchUi ? this._openAsDialog() : this._openAsPopup(); this._opened = true; this.openedStream.emit(); } /** * Close the calendar. * @return {?} */ close() { if (!this._opened) { return; } if (this._popupRef && this._popupRef.hasAttached()) { this._popupRef.detach(); } if (this._dialogRef) { this._dialogRef.close(); this._dialogRef = null; } if (this._calendarPortal && this._calendarPortal.isAttached) { this._calendarPortal.detach(); } /** @type {?} */ const completeClose = (/** * @return {?} */ () => { // The `_opened` could've been reset already if // we got two events in quick succession. if (this._opened) { this._opened = false; this.closedStream.emit(); this._focusedElementBeforeOpen = null; } }); if (this._focusedElementBeforeOpen && typeof this._focusedElementBeforeOpen.focus === 'function') { // Because IE moves focus asynchronously, we can't count on it being restored before we've // marked the datepicker as closed. If the event fires out of sequence and the element that // we're refocusing opens the datepicker on focus, the user could be stuck with not being // able to close the calendar at all. We work around it by making the logic, that marks // the datepicker as closed, async as well. this._focusedElementBeforeOpen.focus(); setTimeout(completeClose); } else { completeClose(); } } /** * Open the calendar as a dialog. * @private * @return {?} */ _openAsDialog() { // Usually this would be handled by `open` which ensures that we can only have one overlay // open at a time, however since we reset the variables in async handlers some overlays // may slip through if the user opens and closes multiple times in quick succession (e.g. // by holding down the enter key). if (this._dialogRef) { this._dialogRef.close(); } this._dialogRef = this._dialog.open(NgxMatDatetimeContent, { direction: this._dir ? this._dir.value : 'ltr', viewContainerRef: this._viewContainerRef, panelClass: 'mat-datepicker-dialog', hasBackdrop: this._hasBackdrop }); this._dialogRef.afterClosed().subscribe((/** * @return {?} */ () => this.close())); this._dialogRef.componentInstance.datepicker = this; this._setColor(); } /** * Open the calendar as a popup. * @private * @return {?} */ _openAsPopup() { if (!this._calendarPortal) { this._calendarPortal = new ComponentPortal(NgxMatDatetimeContent, this._viewContainerRef); } if (!this._popupRef) { this._createPopup(); } if (!this._popupRef.hasAttached()) { this._popupComponentRef = this._popupRef.attach(this._calendarPortal); this._popupComponentRef.instance.datepicker = this; this._setColor(); // Update the position once the calendar has rendered. this._ngZone.onStable.asObservable().pipe(take(1)).subscribe((/** * @return {?} */ () => { this._popupRef.updatePosition(); })); } } /** * Create the popup. * @private * @return {?} */ _createPopup() { /** @type {?} */ const overlayConfig = new OverlayConfig({ positionStrategy: this._createPopupPositionStrategy(), hasBackdrop: this._hasBackdrop, backdropClass: 'mat-overlay-transparent-backdrop', direction: this._dir, scrollStrategy: this._scrollStrategy(), panelClass: 'mat-datepicker-popup', }); this._popupRef = this._overlay.create(overlayConfig); this._popupRef.overlayElement.setAttribute('role', 'dialog'); merge(this._popupRef.backdropClick(), this._popupRef.detachments(), this._popupRef.keydownEvents().pipe(filter((/** * @param {?} event * @return {?} */ event => { // Closing on alt + up is only valid when there's an input associated with the datepicker. return event.keyCode === ESCAPE || (this.datepickerInput && event.altKey && event.keyCode === UP_ARROW); })))).subscribe((/** * @param {?} event * @return {?} */ event => { if (event) { event.preventDefault(); } (this._hasBackdrop && event) ? this.cancel() : this.close(); })); } /** * Create the popup PositionStrategy. * @private * @return {?} */ _createPopupPositionStrategy() { return this._overlay.position() .flexibleConnectedTo(this.datepickerInput.getConnectedOverlayOrigin()) .withTransformOriginOn('.mat-datepicker-content') .withFlexibleDimensions(false) .withViewportMargin(8) .withLockedPosition() .withPositions([ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' }, { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }, { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top' }, { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom' } ]); } /** * @private * @param {?} obj The object to check. * @return {?} The given object if it is both a date instance and valid, otherwise null. */ _getValidDateOrNull(obj) { return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null; } /** * Passes the current theme color along to the calendar overlay. * @private * @return {?} */ _setColor() { /** @type {?} */ const color = this.color; if (this._popupComponentRef) { this._popupComponentRef.instance.color = color; } if (this._dialogRef) { this._dialogRef.componentInstance.color = color; } } } NgxMatDatetimePicker.decorators = [ { type: Component, args: [{ selector: 'ngx-mat-datetime-picker', template: '', exportAs: 'ngxMatDatetimePicker', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ NgxMatDatetimePicker.ctorParameters = () => [ { type: MatDialog }, { type: Overlay }, { type: NgZone }, { type: ViewContainerRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DATEPICKER_SCROLL_STRATEGY,] }] }, { type: NgxMatDateAdapter, decorators: [{ type: Optional }] }, { type: Directionality, decorators: [{ type: Optional }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] } ]; NgxMatDatetimePicker.propDecorators = { calendarHeaderComponent: [{ type: Input }], _customIcon: [{ type: ContentChild, args: [TemplateRef,] }], startAt: [{ type: Input }], startView: [{ type: Input }], defaultColor: [{ type: Input }], color: [{ type: Input }], touchUi: [{ type: Input }], hideTime: [{ type: Input }], disabled: [{ type: Input }], yearSelected: [{ type: Output }], monthSelected: [{ type: Output }], panelClass: [{ type: Input }], dateClass: [{ type: Input }], openedStream: [{ type: Output, args: ['opened',] }], closedStream: [{ type: Output, args: ['closed',] }], opened: [{ type: Input }], showSpinners: [{ type: Input }], showSeconds: [{ type: Input }], stepHour: [{ type: Input }], stepMinute: [{ type: Input }], stepSecond: [{ type: Input }], enableMeridian: [{ type: Input }], disableMinute: [{ type: Input }], defaultTime: [{ type: Input }] }; if (false) { /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._scrollStrategy; /** * An input indicating the type of the custom header component for the calendar, if set. * @type {?} */ NgxMatDatetimePicker.prototype.calendarHeaderComponent; /** * Custom icon set by the consumer. * @type {?} */ NgxMatDatetimePicker.prototype._customIcon; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._startAt; /** * The view that the calendar should start in. * @type {?} */ NgxMatDatetimePicker.prototype.startView; /** @type {?} */ NgxMatDatetimePicker.prototype._defaultColor; /** @type {?} */ NgxMatDatetimePicker.prototype._color; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._touchUi; /** @type {?} */ NgxMatDatetimePicker.prototype._hideTime; /** @type {?} */ NgxMatDatetimePicker.prototype._disabled; /** * Emits selected year in multiyear view. * This doesn't imply a change on the selected date. * @type {?} */ NgxMatDatetimePicker.prototype.yearSelected; /** * Emits selected month in year view. * This doesn't imply a change on the selected date. * @type {?} */ NgxMatDatetimePicker.prototype.monthSelected; /** * Classes to be passed to the date picker panel. Supports the same syntax as `ngClass`. * @type {?} */ NgxMatDatetimePicker.prototype.panelClass; /** * Function that can be used to add custom CSS classes to dates. * @type {?} */ NgxMatDatetimePicker.prototype.dateClass; /** * Emits when the datepicker has been opened. * @type {?} */ NgxMatDatetimePicker.prototype.openedStream; /** * Emits when the datepicker has been closed. * @type {?} */ NgxMatDatetimePicker.prototype.closedStream; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._opened; /** @type {?} */ NgxMatDatetimePicker.prototype._showSpinners; /** @type {?} */ NgxMatDatetimePicker.prototype._showSeconds; /** @type {?} */ NgxMatDatetimePicker.prototype._stepHour; /** @type {?} */ NgxMatDatetimePicker.prototype._stepMinute; /** @type {?} */ NgxMatDatetimePicker.prototype._stepSecond; /** @type {?} */ NgxMatDatetimePicker.prototype._enableMeridian; /** @type {?} */ NgxMatDatetimePicker.prototype._disableMinute; /** @type {?} */ NgxMatDatetimePicker.prototype._defaultTime; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._hasBackdrop; /** * The id for the datepicker calendar. * @type {?} */ NgxMatDatetimePicker.prototype.id; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._validSelected; /** * A reference to the overlay when the calendar is opened as a popup. * @type {?} */ NgxMatDatetimePicker.prototype._popupRef; /** * A reference to the dialog when the calendar is opened as a dialog. * @type {?} * @private */ NgxMatDatetimePicker.prototype._dialogRef; /** * A portal containing the calendar for this datepicker. * @type {?} * @private */ NgxMatDatetimePicker.prototype._calendarPortal; /** * Reference to the component instantiated in popup mode. * @type {?} * @private */ NgxMatDatetimePicker.prototype._popupComponentRef; /** * The element that was focused before the datepicker was opened. * @type {?} * @private */ NgxMatDatetimePicker.prototype._focusedElementBeforeOpen; /** * Subscription to value changes in the associated input element. * @type {?} * @private */ NgxMatDatetimePicker.prototype._inputSubscription; /** * The input element this datepicker is associated with. * @type {?} */ NgxMatDatetimePicker.prototype.datepickerInput; /** * Emits when the datepicker is disabled. * @type {?} */ NgxMatDatetimePicker.prototype.stateChanges; /** * Emits new selected date when selected date changes. * @type {?} */ NgxMatDatetimePicker.prototype._selectedChanged; /** * Raw value before * @type {?} * @private */ NgxMatDatetimePicker.prototype._rawValue; /** * The form control validator for the min date. * @type {?} * @private */ NgxMatDatetimePicker.prototype._minValidator; /** * The form control validator for the max date. * @type {?} * @private */ NgxMatDatetimePicker.prototype._maxValidator; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._dialog; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._overlay; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._ngZone; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._viewContainerRef; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._dateAdapter; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._dir; /** * @type {?} * @private */ NgxMatDatetimePicker.prototype._document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRldGltZS1waWNrZXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2RhdGV0aW1lLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWdELE1BQU0sc0JBQXNCLENBQUM7QUFDNUcsT0FBTyxFQUFFLGVBQWUsRUFBaUIsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFnQixZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBYSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNVEsT0FBTyxFQUEwQixVQUFVLEVBQWdCLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUE2Qix1QkFBdUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xJLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFN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