@asoftwareworld/form-builder-pro
Version:
ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b
533 lines • 82.5 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, inject, Inject, InjectionToken, Input, Optional, Output, ViewChild, ViewEncapsulation } from '@angular/core';
import { coerceBooleanProperty, coerceStringArray } from '@angular/cdk/coercion';
import { ESCAPE, hasModifierKey, UP_ARROW } from '@angular/cdk/keycodes';
import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { _getFocusedElementPierceShadowDom } from '@angular/cdk/platform';
import { mixinColor } from '@angular/material/core';
import { merge, Subject, Subscription } from 'rxjs';
import { filter, take } from 'rxjs/operators';
import { AswCalendar } from './calendar/calendar';
import { createMissingDateImplError } from './datetimepicker-errors';
import { aswDatetimepickerAnimations } from './datetimepicker-animations';
import { DOCUMENT } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/cdk/a11y";
import * as i3 from "./calendar/calendar";
import * as i4 from "@angular/cdk/overlay";
import * as i5 from "@asoftwareworld/form-builder-pro/common";
import * as i6 from "@angular/cdk/bidi";
/** Used to generate a unique ID for each datetimepicker instance. */
let datetimepickerUid = 0;
/** Injection token that determines the scroll handling while the calendar is open. */
export const ASW_DATETIMEPICKER_SCROLL_STRATEGY = new InjectionToken('asw-datetimepicker-scroll-strategy');
export function ASW_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY(overlay) {
return () => overlay.scrollStrategies.reposition();
}
export const ASW_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {
provide: ASW_DATETIMEPICKER_SCROLL_STRATEGY,
deps: [Overlay],
useFactory: ASW_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY
};
// Boilerplate for applying mixins to AswDatetimepickerContent.
/** @docs-private */
const _AswDatetimepickerContentBase = mixinColor(class {
_elementRef;
constructor(_elementRef) {
this._elementRef = _elementRef;
}
});
/**
* Component used as the content for the datetimepicker dialog and popup. We use this instead of
* using AswCalendar 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
*/
export class AswDatetimepickerContent extends _AswDatetimepickerContentBase {
_changeDetectorRef;
_calendar;
datetimepicker;
/** Whether the datetimepicker is above or below the input. */
_isAbove;
/** Current state of the animation. */
_animationState;
/** Emits when an animation has finished. */
_animationDone = new Subject();
/** Id of the label for the `role="dialog"` element. */
_dialogLabelId = null;
constructor(elementRef, _changeDetectorRef) {
super(elementRef);
this._changeDetectorRef = _changeDetectorRef;
}
ngOnInit() {
this._animationState = this.datetimepicker.touchUi ? 'enter-dialog' : 'enter-dropdown';
}
ngAfterContentInit() {
this._calendar._focusActiveCell();
}
_startExitAnimation() {
this._animationState = 'void';
this._changeDetectorRef.markForCheck();
}
ngOnDestroy() {
this._animationDone.complete();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswDatetimepickerContent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AswDatetimepickerContent, selector: "asw-datetimepicker-content", inputs: { color: "color" }, host: { listeners: { "@transformPanel.done": "_animationDone.next()" }, properties: { "class.asw-datetimepicker-content-touch": "datetimepicker?.touchUi", "attr.mode": "datetimepicker.mode", "@transformPanel": "_animationState" }, classAttribute: "asw-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: AswCalendar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div cdkTrapFocus\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"true\"\r\n [attr.aria-labelledby]=\"_dialogLabelId ?? undefined\"\r\n [attr.mode]=\"datetimepicker.mode\"\r\n class=\"asw-datetimepicker-content-container\">\r\n <asw-calendar [id]=\"datetimepicker.id\"\r\n [ngClass]=\"datetimepicker.panelClass\"\r\n [attr.mode]=\"datetimepicker.mode\"\r\n [type]=\"datetimepicker.type\"\r\n [startAt]=\"datetimepicker.startAt\"\r\n [startView]=\"datetimepicker.startView\"\r\n [maxDate]=\"datetimepicker._maxDate\"\r\n [minDate]=\"datetimepicker._minDate\"\r\n [dateFilter]=\"datetimepicker._dateFilter\"\r\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\r\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\r\n [timeInterval]=\"datetimepicker.timeInterval\"\r\n [twelvehour]=\"datetimepicker.twelvehour\"\r\n [selected]=\"datetimepicker._selected\"\r\n [timeInput]=\"datetimepicker.timeInput\"\r\n (selectedChange)=\"datetimepicker._select($event)\"\r\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\r\n (_userSelection)=\"datetimepicker.close()\"\r\n [@fadeInCalendar]=\"'enter'\">\r\n </asw-calendar>\r\n</div>\r\n", styles: [".asw-datetimepicker-content{display:block;border-radius:4px}.asw-datetimepicker-content-container{display:flex;flex-direction:column;justify-content:space-between}.asw-datetimepicker-content .asw-calendar{width:296px;height:424px}.asw-datetimepicker-content .asw-calendar.asw-calendar-with-time-input{height:490px}.asw-datetimepicker-content[mode=landscape] .asw-calendar{width:432px;height:328px}.asw-datetimepicker-content[mode=landscape] .asw-calendar.asw-calendar-with-time-input{height:404px}@media all and (orientation: landscape){.asw-datetimepicker-content[mode=auto] .asw-calendar{width:432px;height:328px}.asw-datetimepicker-content[mode=auto] .asw-calendar.asw-calendar-with-time-input{height:404px}}.asw-datetimepicker-content-touch{display:block;max-height:80vh;position:relative;overflow:visible}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container{min-height:300px;max-height:850px;min-width:250px;max-width:750px}.asw-datetimepicker-content-touch .asw-calendar{width:100%;height:auto}@media all and (orientation: landscape){.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=auto],.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=landscape]{width:120vh;height:80vh}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=auto] .asw-calendar,.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=landscape] .asw-calendar{width:auto;height:100%}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=portrait]{width:64vh;height:90vh}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=portrait] .asw-calendar{width:100%;height:auto}}@media all and (orientation: portrait){.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=auto],.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=portrait]{width:80vw;height:120vw}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=auto] .asw-calendar,.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=portrait] .asw-calendar{width:100%;height:auto}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=landscape]{width:90vw;height:64vw}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=landscape] .asw-calendar{width:auto;height:100%}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container-with-actions{height:135vw}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i3.AswCalendar, selector: "asw-calendar", inputs: ["multiYearSelector", "twelvehour", "startView", "timeInterval", "dateFilter", "preventSameDateTimeSelection", "type", "startAt", "timeInput", "selected", "minDate", "maxDate"], outputs: ["selectedChange", "viewChanged", "_userSelection"], exportAs: ["aswCalendar"] }], animations: [aswDatetimepickerAnimations.transformPanel, aswDatetimepickerAnimations.fadeInCalendar], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswDatetimepickerContent, decorators: [{
type: Component,
args: [{ selector: 'asw-datetimepicker-content', host: {
class: 'asw-datetimepicker-content',
'[class.asw-datetimepicker-content-touch]': 'datetimepicker?.touchUi',
'[attr.mode]': 'datetimepicker.mode',
'[@transformPanel]': '_animationState',
'(@transformPanel.done)': '_animationDone.next()'
}, animations: [aswDatetimepickerAnimations.transformPanel, aswDatetimepickerAnimations.fadeInCalendar], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, inputs: ['color'], template: "<div cdkTrapFocus\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"true\"\r\n [attr.aria-labelledby]=\"_dialogLabelId ?? undefined\"\r\n [attr.mode]=\"datetimepicker.mode\"\r\n class=\"asw-datetimepicker-content-container\">\r\n <asw-calendar [id]=\"datetimepicker.id\"\r\n [ngClass]=\"datetimepicker.panelClass\"\r\n [attr.mode]=\"datetimepicker.mode\"\r\n [type]=\"datetimepicker.type\"\r\n [startAt]=\"datetimepicker.startAt\"\r\n [startView]=\"datetimepicker.startView\"\r\n [maxDate]=\"datetimepicker._maxDate\"\r\n [minDate]=\"datetimepicker._minDate\"\r\n [dateFilter]=\"datetimepicker._dateFilter\"\r\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\r\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\r\n [timeInterval]=\"datetimepicker.timeInterval\"\r\n [twelvehour]=\"datetimepicker.twelvehour\"\r\n [selected]=\"datetimepicker._selected\"\r\n [timeInput]=\"datetimepicker.timeInput\"\r\n (selectedChange)=\"datetimepicker._select($event)\"\r\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\r\n (_userSelection)=\"datetimepicker.close()\"\r\n [@fadeInCalendar]=\"'enter'\">\r\n </asw-calendar>\r\n</div>\r\n", styles: [".asw-datetimepicker-content{display:block;border-radius:4px}.asw-datetimepicker-content-container{display:flex;flex-direction:column;justify-content:space-between}.asw-datetimepicker-content .asw-calendar{width:296px;height:424px}.asw-datetimepicker-content .asw-calendar.asw-calendar-with-time-input{height:490px}.asw-datetimepicker-content[mode=landscape] .asw-calendar{width:432px;height:328px}.asw-datetimepicker-content[mode=landscape] .asw-calendar.asw-calendar-with-time-input{height:404px}@media all and (orientation: landscape){.asw-datetimepicker-content[mode=auto] .asw-calendar{width:432px;height:328px}.asw-datetimepicker-content[mode=auto] .asw-calendar.asw-calendar-with-time-input{height:404px}}.asw-datetimepicker-content-touch{display:block;max-height:80vh;position:relative;overflow:visible}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container{min-height:300px;max-height:850px;min-width:250px;max-width:750px}.asw-datetimepicker-content-touch .asw-calendar{width:100%;height:auto}@media all and (orientation: landscape){.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=auto],.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=landscape]{width:120vh;height:80vh}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=auto] .asw-calendar,.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=landscape] .asw-calendar{width:auto;height:100%}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=portrait]{width:64vh;height:90vh}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=portrait] .asw-calendar{width:100%;height:auto}}@media all and (orientation: portrait){.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=auto],.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=portrait]{width:80vw;height:120vw}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=auto] .asw-calendar,.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=portrait] .asw-calendar{width:100%;height:auto}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=landscape]{width:90vw;height:64vw}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container[mode=landscape] .asw-calendar{width:auto;height:100%}.asw-datetimepicker-content-touch .asw-datetimepicker-content-container-with-actions{height:135vw}}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { _calendar: [{
type: ViewChild,
args: [AswCalendar, { static: true }]
}] } });
export class AswDatetimepicker {
_overlay;
_ngZone;
_viewContainerRef;
_scrollStrategy;
_dateAdapter;
_dir;
_document = inject(DOCUMENT);
/** Whether to show multi-year view. */
get multiYearSelector() {
return this._multiYearSelector;
}
set multiYearSelector(value) {
this._multiYearSelector = coerceBooleanProperty(value);
}
_multiYearSelector = false;
/** Whether the clock uses 12 hour format. */
get twelvehour() {
return this._twelvehour;
}
set twelvehour(value) {
this._twelvehour = coerceBooleanProperty(value);
}
_twelvehour = false;
/** The view that the calendar should start in. */
startView = 'month';
/** The display mode of datetimepicker. */
mode = 'auto';
/** Step over minutes. */
timeInterval = 1;
/** Prevent user to select same date time */
preventSameDateTimeSelection = false;
/**
* Emits new selected date when selected date changes.
* @deprecated Switch to the `dateChange` and `dateInput` binding on the input element.
*/
selectedChanged = new EventEmitter();
/** Emits when the datetimepicker has been opened. */
openedStream = new EventEmitter();
/** Emits when the datetimepicker has been closed. */
closedStream = new EventEmitter();
/** Emits when the view has been changed. */
viewChanged = new EventEmitter();
/**
* Classes to be passed to the date picker panel.
* Supports string and string array values, similar to `ngClass`.
*/
get panelClass() {
return this._panelClass;
}
set panelClass(value) {
this._panelClass = coerceStringArray(value);
}
_panelClass;
/** Whether the calendar is open. */
get opened() {
return this._opened;
}
set opened(value) {
coerceBooleanProperty(value) ? this.open() : this.close();
}
_opened = false;
/** The id for the datetimepicker calendar. */
id = `asw-datetimepicker-${datetimepickerUid++}`;
/** Color palette to use on the datetimepicker's calendar. */
get color() {
return this._color || (this.datetimepickerInput ? this.datetimepickerInput.getThemePalette() : undefined);
}
set color(value) {
this._color = value;
}
_color;
/** The input element this datetimepicker is associated with. */
datetimepickerInput;
/** Emits when the datetimepicker is disabled. */
_disabledChange = new Subject();
_validSelected = null;
/** A reference to the overlay into which we've rendered the calendar. */
_overlayRef;
/** Reference to the component instance rendered in the overlay. */
_componentRef;
/** The element that was focused before the datetimepicker was opened. */
_focusedElementBeforeOpen = null;
/** Unique class that will be added to the backdrop so that the test harnesses can look it up. */
_backdropHarnessClass = `${this.id}-backdrop`;
_inputStateChanges = Subscription.EMPTY;
constructor(_overlay, _ngZone, _viewContainerRef, _scrollStrategy, _dateAdapter, _dir) {
this._overlay = _overlay;
this._ngZone = _ngZone;
this._viewContainerRef = _viewContainerRef;
this._scrollStrategy = _scrollStrategy;
this._dateAdapter = _dateAdapter;
this._dir = _dir;
if (!this._dateAdapter) {
throw createMissingDateImplError('DateAdapter');
}
}
/** The date to open the calendar to initially. */
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.datetimepickerInput ? this.datetimepickerInput.value : null);
}
set startAt(date) {
this._startAt = this._dateAdapter.getValidDateOrNull(date);
}
_startAt;
/** The display type of datetimepicker. */
get type() {
return this._type;
}
set type(value) {
this._type = value || 'datetime';
}
_type = 'datetime';
/**
* 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.
*/
get touchUi() {
return this._touchUi;
}
set touchUi(value) {
this._touchUi = coerceBooleanProperty(value);
}
_touchUi = false;
/**
* Whether the calendar is in time mode. In time mode the calendar clock gets time input
* elements rather then just clock. When `touchUi` is enabled this will be disabled.
*/
get timeInput() {
return this._timeInput && !this.touchUi;
}
set timeInput(value) {
this._timeInput = coerceBooleanProperty(value);
}
_timeInput = false;
/** Whether the datetimepicker pop-up should be disabled. */
get disabled() {
return this._disabled === undefined && this.datetimepickerInput ? this.datetimepickerInput.disabled : !!this._disabled;
}
set disabled(value) {
const newValue = coerceBooleanProperty(value);
if (newValue !== this._disabled) {
this._disabled = newValue;
this._disabledChange.next(newValue);
}
}
_disabled;
/** Preferred position of the datetimepicker in the X axis. */
xPosition = 'start';
/** Preferred position of the datetimepicker in the Y axis. */
yPosition = 'below';
/**
* Whether to restore focus to the previously-focused element when the panel is closed.
* Note that automatic focus restoration is an accessibility feature and it is recommended that
* you provide your own equivalent, if you decide to turn it off.
*/
get restoreFocus() {
return this._restoreFocus;
}
set restoreFocus(value) {
this._restoreFocus = coerceBooleanProperty(value);
}
_restoreFocus = true;
/** The currently selected date. */
get _selected() {
return this._validSelected;
}
set _selected(value) {
this._validSelected = value;
}
/** The minimum selectable date. */
get _minDate() {
return this.datetimepickerInput && this.datetimepickerInput.min;
}
/** The maximum selectable date. */
get _maxDate() {
return this.datetimepickerInput && this.datetimepickerInput.max;
}
get _dateFilter() {
return this.datetimepickerInput && this.datetimepickerInput._dateFilter;
}
_viewChanged(type) {
this.viewChanged.emit(type);
}
ngOnDestroy() {
this._destroyOverlay();
this.close();
this._inputStateChanges.unsubscribe();
this._disabledChange.complete();
}
/** Selects the given date */
_select(date) {
const oldValue = this._selected;
this._selected = date;
if (!this._dateAdapter.sameDatetime(oldValue, this._selected)) {
this.selectedChanged.emit(date);
}
}
/**
* Register an input with this datetimepicker.
* @param input The datetimepicker input to register with this datetimepicker.
*/
_registerInput(input) {
if (this.datetimepickerInput) {
throw Error('A AswDatetimepicker can only be associated with a single input.');
}
this.datetimepickerInput = input;
this._inputStateChanges = this.datetimepickerInput._valueChange.subscribe((value) => (this._selected = value));
}
/** Open the calendar. */
open() {
if (this._opened || this.disabled) {
return;
}
if (!this.datetimepickerInput) {
throw Error('Attempted to open an AswDatetimepicker with no associated input.');
}
this._focusedElementBeforeOpen = _getFocusedElementPierceShadowDom();
this._openOverlay();
this._opened = true;
this.openedStream.emit();
}
/** Close the calendar. */
close() {
if (!this._opened) {
return;
}
const canRestoreFocus = this._restoreFocus && this._focusedElementBeforeOpen && typeof this._focusedElementBeforeOpen.focus === 'function';
const completeClose = () => {
// The `_opened` could've been reset already if
// we got two events in quick succession.
if (this._opened) {
this._opened = false;
this.closedStream.emit();
}
};
if (this._componentRef) {
const { instance, location } = this._componentRef;
instance._startExitAnimation();
instance._animationDone.pipe(take(1)).subscribe(() => {
const activeElement = this._document.activeElement;
// Since we restore focus after the exit animation, we have to check that
// the user didn't move focus themselves inside the `close` handler.
if (canRestoreFocus && (!activeElement || activeElement === this._document.activeElement || location.nativeElement.contains(activeElement))) {
this._focusedElementBeforeOpen.focus();
}
this._focusedElementBeforeOpen = null;
this._destroyOverlay();
});
}
if (canRestoreFocus) {
// 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.
setTimeout(completeClose);
}
else {
completeClose();
}
}
/**
* Forwards relevant values from the datetimepicker to the
* datetimepicker content inside the overlay.
*/
_forwardContentValues(instance) {
instance.datetimepicker = this;
instance.color = this.color;
instance._dialogLabelId = this.datetimepickerInput.getOverlayLabelId();
}
/** Opens the overlay with the calendar. */
_openOverlay() {
this._destroyOverlay();
const isDialog = this.touchUi;
const labelId = this.datetimepickerInput.getOverlayLabelId();
const portal = new ComponentPortal(AswDatetimepickerContent, this._viewContainerRef);
const overlayRef = (this._overlayRef = this._overlay.create(new OverlayConfig({
positionStrategy: isDialog ? this._getDialogStrategy() : this._getDropdownStrategy(),
hasBackdrop: true,
backdropClass: [isDialog ? 'cdk-overlay-dark-backdrop' : 'mat-overlay-transparent-backdrop', this._backdropHarnessClass],
direction: this._dir,
scrollStrategy: isDialog ? this._overlay.scrollStrategies.block() : this._scrollStrategy(),
panelClass: `asw-datetimepicker-${isDialog ? 'dialog' : 'popup'}`
})));
const overlayElement = overlayRef.overlayElement;
overlayElement.setAttribute('role', 'dialog');
if (labelId) {
overlayElement.setAttribute('aria-labelledby', labelId);
}
if (isDialog) {
overlayElement.setAttribute('aria-modal', 'true');
}
this._getCloseStream(overlayRef).subscribe((event) => {
if (event) {
event.preventDefault();
}
this.close();
});
this._componentRef = overlayRef.attach(portal);
this._forwardContentValues(this._componentRef.instance);
// Update the position once the calendar has rendered. Only relevant in dropdown mode.
if (!isDialog) {
this._ngZone.onStable.pipe(take(1)).subscribe(() => overlayRef.updatePosition());
}
}
/** Destroys the current overlay. */
_destroyOverlay() {
if (this._overlayRef) {
this._overlayRef.dispose();
this._overlayRef = this._componentRef = null;
}
}
/** Gets a position strategy that will open the calendar as a dropdown. */
_getDialogStrategy() {
return this._overlay.position().global().centerHorizontally().centerVertically();
}
/** Gets a position strategy that will open the calendar as a dropdown. */
_getDropdownStrategy() {
const strategy = this._overlay.position().flexibleConnectedTo(this.datetimepickerInput.getConnectedOverlayOrigin()).withTransformOriginOn('.asw-datetimepicker-content').withFlexibleDimensions(false).withViewportMargin(8).withLockedPosition();
return this._setConnectedPositions(strategy);
}
/**
* Sets the positions of the datetimepicker in dropdown mode based on the current configuration.
*/
_setConnectedPositions(strategy) {
const primaryX = this.xPosition === 'end' ? 'end' : 'start';
const secondaryX = primaryX === 'start' ? 'end' : 'start';
const primaryY = this.yPosition === 'above' ? 'bottom' : 'top';
const secondaryY = primaryY === 'top' ? 'bottom' : 'top';
return strategy.withPositions([
{
originX: primaryX,
originY: secondaryY,
overlayX: primaryX,
overlayY: primaryY
},
{
originX: primaryX,
originY: primaryY,
overlayX: primaryX,
overlayY: secondaryY
},
{
originX: secondaryX,
originY: secondaryY,
overlayX: secondaryX,
overlayY: primaryY
},
{
originX: secondaryX,
originY: primaryY,
overlayX: secondaryX,
overlayY: secondaryY
}
]);
}
/** Gets an observable that will emit when the overlay is supposed to be closed. */
_getCloseStream(overlayRef) {
return merge(overlayRef.backdropClick(), overlayRef.detachments(), overlayRef.keydownEvents().pipe(filter((event) => {
// Closing on alt + up is only valid when there's an input associated with the
// datetimepicker.
return (event.keyCode === ESCAPE && !hasModifierKey(event)) || (this.datetimepickerInput && hasModifierKey(event, 'altKey') && event.keyCode === UP_ARROW);
})));
}
static ngAcceptInputType_multiYearSelector;
static ngAcceptInputType_twelvehour;
static ngAcceptInputType_preventSameDateTimeSelection;
static ngAcceptInputType_disabled;
static ngAcceptInputType_opened;
static ngAcceptInputType_touchUi;
static ngAcceptInputType_timeInput;
static ngAcceptInputType_restoreFocus;
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswDatetimepicker, deps: [{ token: i4.Overlay }, { token: i0.NgZone }, { token: i0.ViewContainerRef }, { token: ASW_DATETIMEPICKER_SCROLL_STRATEGY }, { token: i5.DatetimeAdapter, optional: true }, { token: i6.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AswDatetimepicker, selector: "asw-datetimepicker", inputs: { multiYearSelector: "multiYearSelector", twelvehour: "twelvehour", startView: "startView", mode: "mode", timeInterval: "timeInterval", preventSameDateTimeSelection: "preventSameDateTimeSelection", panelClass: "panelClass", opened: "opened", color: "color", startAt: "startAt", type: "type", touchUi: "touchUi", timeInput: "timeInput", disabled: "disabled", xPosition: "xPosition", yPosition: "yPosition", restoreFocus: "restoreFocus" }, outputs: { selectedChanged: "selectedChanged", openedStream: "opened", closedStream: "closed", viewChanged: "viewChanged" }, exportAs: ["aswDatetimepicker"], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswDatetimepicker, decorators: [{
type: Component,
args: [{
selector: 'asw-datetimepicker',
exportAs: 'aswDatetimepicker',
template: '',
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
preserveWhitespaces: false
}]
}], ctorParameters: () => [{ type: i4.Overlay }, { type: i0.NgZone }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{
type: Inject,
args: [ASW_DATETIMEPICKER_SCROLL_STRATEGY]
}] }, { type: i5.DatetimeAdapter, decorators: [{
type: Optional
}] }, { type: i6.Directionality, decorators: [{
type: Optional
}] }], propDecorators: { multiYearSelector: [{
type: Input
}], twelvehour: [{
type: Input
}], startView: [{
type: Input
}], mode: [{
type: Input
}], timeInterval: [{
type: Input
}], preventSameDateTimeSelection: [{
type: Input
}], selectedChanged: [{
type: Output
}], openedStream: [{
type: Output,
args: ['opened']
}], closedStream: [{
type: Output,
args: ['closed']
}], viewChanged: [{
type: Output
}], panelClass: [{
type: Input
}], opened: [{
type: Input
}], color: [{
type: Input
}], startAt: [{
type: Input
}], type: [{
type: Input
}], touchUi: [{
type: Input
}], timeInput: [{
type: Input
}], disabled: [{
type: Input
}], xPosition: [{
type: Input
}], yPosition: [{
type: Input
}], restoreFocus: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWVwaWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9kYXRldGltZXBpY2tlci9kYXRldGltZXBpY2tlci50cyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RhdGV0aW1lcGlja2VyL2RhdGV0aW1lcGlja2VyLWNvbnRlbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsdUJBQXVCLEVBRXZCLFNBQVMsRUFHVCxZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUVULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0YsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekUsT0FBTyxFQUFxQyxPQUFPLEVBQUUsYUFBYSxFQUE4QixNQUFNLHNCQUFzQixDQUFDO0FBQzdILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQVksVUFBVSxFQUFnQixNQUFNLHdCQUF3QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsMkJBQTJCLEVB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