UNPKG

@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

474 lines 71.5 kB
import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion'; import { DOWN_ARROW, UP_ARROW } from '@angular/cdk/keycodes'; import { ChangeDetectionStrategy, Component, Directive, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@asoftwareworld/form-builder-pro/common"; import * as i2 from "../datetimepicker-intl"; import * as i3 from "@angular/common"; import * as i4 from "@angular/material/button"; import * as i5 from "../clock/clock"; function pad(num, size) { num = String(num); while (num.length < size) num = '0' + num; return num; } export class AswTimeInput { element; cdr; set timeInterval(value) { this._interval = coerceNumberProperty(value); } _interval = 1; set timeMin(value) { this._min = coerceNumberProperty(value); } _min = 0; set timeMax(value) { this._max = coerceNumberProperty(value); } _max = Infinity; set timeValue(value) { this._value = coerceNumberProperty(value); if (!this.hasFocus) { this.writeValue(this._value); } this.writePlaceholder(this._value); } timeValueChanged = new EventEmitter(); _value; keyDownListener = this.keyDownHandler.bind(this); keyPressListener = this.keyPressHandler.bind(this); inputEventListener = this.inputChangedHandler.bind(this); constructor(element, cdr) { this.element = element; this.cdr = cdr; this.inputElement.addEventListener('keydown', this.keyDownListener, { passive: true }); // Do not passive since we want to be able to preventDefault() this.inputElement.addEventListener('keypress', this.keyPressListener); this.inputElement.addEventListener('input', this.inputEventListener, { passive: true }); } get hasFocus() { return this.element.nativeElement && this.element?.nativeElement === document?.activeElement; } get inputElement() { return this.element.nativeElement; } // We look here at the placeholder value, because we write '' into the value on focus // placeholder should always be up to date with "currentValue" get valid() { // At the start _value is undefined therefore this would result in not valid and // make a ugly warning border afterwards we can safely check if (this._value) { const currentValue = String(this.inputElement.value); // It can be that currentValue is empty due to we removing the value on focus, // if that is the case we should check previous value which should be in the placeholder if (currentValue.length) { return this._value == this.inputElement.value; } else { return this._value == this.inputElement.placeholder; } } return true; } get invalid() { return !this.valid; } blur() { this.writeValue(this._value); this.writePlaceholder(this._value); this.timeValueChanged.emit(this._value); } focus() { this.writeValue(''); } /** * Write value to inputElement * @param value NumberInput */ writeValue(value) { if (value !== '') { this.inputElement.value = pad(value, 2); } else { this.inputElement.value = ''; } this.cdr.markForCheck(); } /** * Writes value to placeholder * @param value NumberInput */ writePlaceholder(value) { this.inputElement.placeholder = pad(value, 2); this.cdr.markForCheck(); } keyDownHandler(event) { if (String(this.inputElement.value).length > 0) { let value = null; if (event.keyCode === UP_ARROW) { value = coerceNumberProperty(this._value); value += this._interval; event.stopPropagation(); } else if (event.keyCode === DOWN_ARROW) { value = coerceNumberProperty(this._value); value -= this._interval; event.stopPropagation(); } // if value has changed if (typeof value === 'number') { this.writeValue(value); this.writePlaceholder(value); this.clampInputValue(); this.timeValueChanged.emit(this._value); } } } /** * Prevent non number inputs in the inputElement with the exception of Enter/BackSpace * @param event KeyboardEvent */ keyPressHandler(event) { const key = event?.key ?? null; if (isNaN(Number(key)) && key !== 'Enter') { event.preventDefault(); } } inputChangedHandler() { this.clampInputValue(); this.timeValueChanged.emit(this._value); } clampInputValue() { if (this.inputElement?.value === '') { return; } const value = coerceNumberProperty(this.inputElement?.value ?? null); // if this._min === 0, we should allow 0 if (value || (this._min === 0 && value === 0)) { const clampedValue = Math.min(Math.max(value, this._min), this._max); if (clampedValue !== value) { this.writeValue(clampedValue); this.writePlaceholder(clampedValue); } this._value = clampedValue; } } /** * Remove event listeners on destruction */ ngOnDestroy() { this.inputElement.removeEventListener('keydown', this.keyDownListener); this.inputElement.removeEventListener('keypress', this.keyPressListener); this.inputElement.removeEventListener('input', this.inputEventListener); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswTimeInput, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.8", type: AswTimeInput, selector: "input.asw-time-input", inputs: { timeInterval: "timeInterval", timeMin: "timeMin", timeMax: "timeMax", timeValue: "timeValue" }, outputs: { timeValueChanged: "timeValueChanged" }, host: { listeners: { "blur": "blur($event)", "focus": "focus($event)" } }, exportAs: ["aswTimeInput"], ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswTimeInput, decorators: [{ type: Directive, args: [{ selector: 'input.asw-time-input', host: { '(blur)': 'blur($event)', '(focus)': 'focus($event)' }, exportAs: 'aswTimeInput' }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { timeInterval: [{ type: Input, args: ['timeInterval'] }], timeMin: [{ type: Input, args: ['timeMin'] }], timeMax: [{ type: Input, args: ['timeMax'] }], timeValue: [{ type: Input, args: ['timeValue'] }], timeValueChanged: [{ type: Output }] } }); export class AswTime { _adapter; _changeDetectorRef; _datetimepickerIntl; /** Emits when the currently selected date changes. */ selectedChange = new EventEmitter(); /** Emits when any date changes. */ activeDateChange = new EventEmitter(); /** Emits when any date is selected. */ _userSelection = new EventEmitter(); /** Emits when AM/PM button are clicked. */ ampmChange = new EventEmitter(); /** Emits when AM/PM button are clicked. */ clockViewChange = new EventEmitter(); /** A function used to filter which dates are selectable. */ dateFilter; /** Step over minutes. */ interval = 1; hourInputElement; hourInputDirective; minuteInputElement; minuteInputDirective; datetimepickerIntlChangesSubscription; /** Whether the clock uses 12 hour format. */ get twelvehour() { return this._twelvehour; } set twelvehour(value) { this._twelvehour = coerceBooleanProperty(value); } _twelvehour = false; /** Whether the time is now in AM or PM. */ AMPM = 'AM'; /** * The date to display in this clock view. */ get activeDate() { return this._activeDate; } set activeDate(value) { this._activeDate = this._adapter.clampDate(value, this.minDate, this.maxDate); } _activeDate; /** The currently selected date. */ get selected() { return this._selected; } set selected(value) { this._selected = this._adapter.getValidDateOrNull(this._adapter.deserialize(value)); if (this._selected) { this.activeDate = this._selected; } } _selected; /** The minimum selectable date. */ get minDate() { return this._minDate; } set minDate(value) { this._minDate = this._adapter.getValidDateOrNull(this._adapter.deserialize(value)); } _minDate; /** The maximum selectable date. */ get maxDate() { return this._maxDate; } set maxDate(value) { this._maxDate = this._adapter.getValidDateOrNull(this._adapter.deserialize(value)); } _maxDate; /** Whether the clock should be started in hour or minute view. */ get clockView() { return this._clockView; } set clockView(value) { this._clockView = value; } /** Whether the clock is in hour view. */ _clockView = 'hour'; get isHourView() { return this._clockView === 'hour'; } get isMinuteView() { return this._clockView === 'hour'; } get hour() { if (!this.activeDate) { if (this.twelvehour) { return '12'; } else { return '00'; } } const hour = Number(this._adapter.getHour(this.activeDate)); if (!this.twelvehour) { return this.prefixWithZero(hour); } if (hour === 0) { return '12'; } else { return this.prefixWithZero(hour > 12 ? hour - 12 : hour); } } get minute() { if (this.activeDate) { return this.prefixWithZero(this._adapter.getMinute(this.activeDate)); } return '00'; } prefixWithZero(value) { if (value < 10) { return '0' + String(value); } return String(value); } constructor(_adapter, _changeDetectorRef, _datetimepickerIntl) { this._adapter = _adapter; this._changeDetectorRef = _changeDetectorRef; this._datetimepickerIntl = _datetimepickerIntl; this.datetimepickerIntlChangesSubscription = this._datetimepickerIntl.changes.subscribe(() => { this._changeDetectorRef.detectChanges(); }); } ngOnChanges(changes) { // when clockView changes by input we should focus the correct input if (changes.clockView) { if (changes.clockView.currentValue !== changes.clockView.previousValue) { this.focusInputElement(); } } } ngAfterViewInit() { this.focusInputElement(); } focusInputElement() { if (this.clockView === 'hour') { if (this.hourInputElement) { this.hourInputElement.nativeElement.focus(); } } else { if (this.minuteInputElement) { this.minuteInputElement.nativeElement.focus(); } } } handleHourInputChange(value) { const hour = coerceNumberProperty(value); if (hour || hour === 0) { const newValue = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this.updateHourForAmPm(hour), this._adapter.getMinute(this.activeDate)); this._activeDate = this._adapter.clampDate(newValue, this.minDate, this.maxDate); this.activeDateChange.emit(this.activeDate); // If previously we did set [aswValue]="13" and the input changed to 6, and the clamping // will make it "13" again then the hourInputDirective will not have been updated // since "13" === "13" same reference so no change detected by directly setting it within // this handler, we handle this usecase if (this.hourInputDirective) { this.hourInputDirective.timeValue = this.hour; } } } updateHourForAmPm(value) { if (!this.twelvehour) { return value; } // value should be between 1-12 if (this.AMPM === 'AM') { if (value === 0 || value === 12) { return 0; } return value; } // PM else { if (value === 0 || value === 12) { return 12; } // other cases, we should add 12 to the value aka 3:00 PM = 3 + 12 = 15:00 return value + 12; } } handleMinuteInputChange(value) { const minute = coerceNumberProperty(value); if (minute || minute === 0) { const newValue = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this._activeDate), minute); this._activeDate = this._adapter.clampDate(newValue, this.minDate, this.maxDate); this.activeDateChange.emit(this.activeDate); // If previously we did set [aswValue]="40" and the input changed to 30, and the clamping // will make it "40" again then the minuteInputDirective will not have been updated // since "40" === "40" same reference so no change detected by directly setting it within // this handler, we handle this usecase if (this.minuteInputDirective) { this.minuteInputDirective.timeValue = this.minute; } } } handleFocus(clockView) { this.clockView = clockView; this.clockViewChange.emit(clockView); } _timeSelected(date) { if (this.clockView === 'hour') { this.clockView = 'minute'; } this._activeDate = this.selected = date; } _onActiveDateChange(date) { this._activeDate = date; this.activeDateChange.emit(date); } handleOk() { if (this._selected) { this.selectedChange.emit(this._selected); } this._userSelection.emit(); } handleCancel() { this._userSelection.emit(); } ngOnDestroy() { if (this.datetimepickerIntlChangesSubscription) { this.datetimepickerIntlChangesSubscription.unsubscribe(); } } static ngAcceptInputType_twelvehour; static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswTime, deps: [{ token: i1.DatetimeAdapter }, { token: i0.ChangeDetectorRef }, { token: i2.AswDatetimepickerIntl }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AswTime, selector: "asw-time", inputs: { dateFilter: "dateFilter", interval: "interval", twelvehour: "twelvehour", AMPM: "AMPM", activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", clockView: "clockView" }, outputs: { selectedChange: "selectedChange", activeDateChange: "activeDateChange", _userSelection: "_userSelection", ampmChange: "ampmChange", clockViewChange: "clockViewChange" }, host: { classAttribute: "asw-time" }, viewQueries: [{ propertyName: "hourInputElement", first: true, predicate: ["hourInput"], descendants: true, read: (ElementRef) }, { propertyName: "hourInputDirective", first: true, predicate: ["hourInput"], descendants: true, read: AswTimeInput }, { propertyName: "minuteInputElement", first: true, predicate: ["minuteInput"], descendants: true, read: (ElementRef) }, { propertyName: "minuteInputDirective", first: true, predicate: ["minuteInput"], descendants: true, read: AswTimeInput }], exportAs: ["aswTime"], usesOnChanges: true, ngImport: i0, template: "<div class=\"asw-time-input-wrapper\">\r\n <div class=\"asw-time-input-inner\">\r\n <input class=\"asw-time-input\"\r\n [class.asw-time-input-active]=\"clockView === 'hour'\"\r\n [class.asw-time-input-warning]=\"!hourInput.valid\"\r\n #hourInput=\"aswTimeInput\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n maxlength=\"2\"\r\n [timeMin]=\"twelvehour ? 1 : 0\"\r\n [timeMax]=\"twelvehour ? 12 : 23\"\r\n [timeValue]=\"hour\"\r\n (timeValueChanged)=\"handleHourInputChange($event)\"\r\n (focus)=\"handleFocus('hour')\" />\r\n\r\n <div class=\"asw-time-seperator\">:</div>\r\n\r\n <input class=\"asw-time-input\"\r\n [class.asw-time-input-active]=\"clockView === 'minute'\"\r\n [class.asw-time-input-warning]=\"!minuteInput.valid\"\r\n #minuteInput=\"aswTimeInput\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n maxlength=\"2\"\r\n [timeMin]=\"0\"\r\n [timeMax]=\"59\"\r\n [timeValue]=\"minute\"\r\n (timeValueChanged)=\"handleMinuteInputChange($event)\"\r\n [timeInterval]=\"interval\"\r\n (focus)=\"handleFocus('minute')\" />\r\n\r\n <div *ngIf=\"twelvehour\" class=\"asw-time-ampm\">\r\n <button mat-button type=\"button\" class=\"asw-time-am\"\r\n [class.asw-time-ampm-active]=\"AMPM === 'AM'\" aria-label=\"AM\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (click)=\"ampmChange.emit('AM')\">AM\r\n </button>\r\n <button mat-button type=\"button\" class=\"asw-time-pm\"\r\n [class.asw-time-ampm-active]=\"AMPM === 'PM'\" aria-label=\"PM\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (click)=\"ampmChange.emit('PM')\">PM\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<asw-clock (selectedChange)=\"_timeSelected($event)\"\r\n (activeDateChange)=\"_onActiveDateChange($event)\"\r\n [AMPM]=\"AMPM\"\r\n [dateFilter]=\"dateFilter\"\r\n [interval]=\"interval\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n [selected]=\"selected\"\r\n [startView]=\"clockView\"\r\n [twelvehour]=\"twelvehour\">\r\n</asw-clock>\r\n\r\n<div class=\"asw-time-button-wrapper\">\r\n <button class=\"asw-time-cancel-button\" mat-button type=\"button\" (click)=\"handleCancel()\">\r\n {{ _datetimepickerIntl.cancelLabel }}\r\n </button>\r\n <button class=\"asw-time-ok-button\" mat-button type=\"button\" (click)=\"handleOk()\"\r\n [disabled]=\"minuteInputDirective?.invalid || hourInputDirective?.invalid\">\r\n {{ _datetimepickerIntl.okLabel }}\r\n </button>\r\n</div>\r\n", styles: [".asw-time{display:block;outline:none;-webkit-user-select:none;user-select:none}.asw-time-input-wrapper{padding:8px 0;text-align:center}.asw-time-input-inner{display:inline-flex;height:56px}.asw-time-input{box-sizing:border-box;width:72px;height:100%;padding:0;font-size:36px;text-align:center;border-radius:8px;border:2px solid transparent;appearance:none;outline:none}.asw-time-seperator{display:inline-flex;justify-content:center;align-items:center;width:24px;font-size:36px}.asw-time-ampm{display:inline-flex;flex-direction:column;margin-left:12px}[dir=rtl] .asw-time-ampm{margin-left:auto;margin-right:12px}.asw-time-ampm .asw-time-am,.asw-time-ampm .asw-time-pm{--mdc-typography-button-font-weight: 400;flex:1;width:40px;min-width:auto;border-width:1px;border-style:solid}.asw-time-ampm .asw-time-am .mat-mdc-button-touch-target,.asw-time-ampm .asw-time-pm .mat-mdc-button-touch-target{height:100%}.asw-time-ampm .asw-time-am.asw-time-ampm-active,.asw-time-ampm .asw-time-pm.asw-time-ampm-active{--mdc-text-button-label-text-color: rgba(0, 0, 0, .87);--mdc-typography-button-font-weight: 500;color:#3f51b5;background-color:#3f51b533}.asw-time-ampm .asw-time-am{border-radius:8px 8px 0 0}.asw-time-ampm .asw-time-pm{border-radius:0 0 8px 8px;border-top:none}.asw-time-button-wrapper{display:flex;justify-content:flex-end;padding-top:8px}.asw-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .asw-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.AswClock, selector: "asw-clock", inputs: ["dateFilter", "interval", "twelvehour", "AMPM", "activeDate", "selected", "minDate", "maxDate", "startView"], outputs: ["selectedChange", "activeDateChange", "_userSelection"], exportAs: ["aswClock"] }, { kind: "directive", type: AswTimeInput, selector: "input.asw-time-input", inputs: ["timeInterval", "timeMin", "timeMax", "timeValue"], outputs: ["timeValueChanged"], exportAs: ["aswTimeInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswTime, decorators: [{ type: Component, args: [{ selector: 'asw-time', exportAs: 'aswTime', host: { class: 'asw-time' }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"asw-time-input-wrapper\">\r\n <div class=\"asw-time-input-inner\">\r\n <input class=\"asw-time-input\"\r\n [class.asw-time-input-active]=\"clockView === 'hour'\"\r\n [class.asw-time-input-warning]=\"!hourInput.valid\"\r\n #hourInput=\"aswTimeInput\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n maxlength=\"2\"\r\n [timeMin]=\"twelvehour ? 1 : 0\"\r\n [timeMax]=\"twelvehour ? 12 : 23\"\r\n [timeValue]=\"hour\"\r\n (timeValueChanged)=\"handleHourInputChange($event)\"\r\n (focus)=\"handleFocus('hour')\" />\r\n\r\n <div class=\"asw-time-seperator\">:</div>\r\n\r\n <input class=\"asw-time-input\"\r\n [class.asw-time-input-active]=\"clockView === 'minute'\"\r\n [class.asw-time-input-warning]=\"!minuteInput.valid\"\r\n #minuteInput=\"aswTimeInput\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n maxlength=\"2\"\r\n [timeMin]=\"0\"\r\n [timeMax]=\"59\"\r\n [timeValue]=\"minute\"\r\n (timeValueChanged)=\"handleMinuteInputChange($event)\"\r\n [timeInterval]=\"interval\"\r\n (focus)=\"handleFocus('minute')\" />\r\n\r\n <div *ngIf=\"twelvehour\" class=\"asw-time-ampm\">\r\n <button mat-button type=\"button\" class=\"asw-time-am\"\r\n [class.asw-time-ampm-active]=\"AMPM === 'AM'\" aria-label=\"AM\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (click)=\"ampmChange.emit('AM')\">AM\r\n </button>\r\n <button mat-button type=\"button\" class=\"asw-time-pm\"\r\n [class.asw-time-ampm-active]=\"AMPM === 'PM'\" aria-label=\"PM\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (click)=\"ampmChange.emit('PM')\">PM\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<asw-clock (selectedChange)=\"_timeSelected($event)\"\r\n (activeDateChange)=\"_onActiveDateChange($event)\"\r\n [AMPM]=\"AMPM\"\r\n [dateFilter]=\"dateFilter\"\r\n [interval]=\"interval\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n [selected]=\"selected\"\r\n [startView]=\"clockView\"\r\n [twelvehour]=\"twelvehour\">\r\n</asw-clock>\r\n\r\n<div class=\"asw-time-button-wrapper\">\r\n <button class=\"asw-time-cancel-button\" mat-button type=\"button\" (click)=\"handleCancel()\">\r\n {{ _datetimepickerIntl.cancelLabel }}\r\n </button>\r\n <button class=\"asw-time-ok-button\" mat-button type=\"button\" (click)=\"handleOk()\"\r\n [disabled]=\"minuteInputDirective?.invalid || hourInputDirective?.invalid\">\r\n {{ _datetimepickerIntl.okLabel }}\r\n </button>\r\n</div>\r\n", styles: [".asw-time{display:block;outline:none;-webkit-user-select:none;user-select:none}.asw-time-input-wrapper{padding:8px 0;text-align:center}.asw-time-input-inner{display:inline-flex;height:56px}.asw-time-input{box-sizing:border-box;width:72px;height:100%;padding:0;font-size:36px;text-align:center;border-radius:8px;border:2px solid transparent;appearance:none;outline:none}.asw-time-seperator{display:inline-flex;justify-content:center;align-items:center;width:24px;font-size:36px}.asw-time-ampm{display:inline-flex;flex-direction:column;margin-left:12px}[dir=rtl] .asw-time-ampm{margin-left:auto;margin-right:12px}.asw-time-ampm .asw-time-am,.asw-time-ampm .asw-time-pm{--mdc-typography-button-font-weight: 400;flex:1;width:40px;min-width:auto;border-width:1px;border-style:solid}.asw-time-ampm .asw-time-am .mat-mdc-button-touch-target,.asw-time-ampm .asw-time-pm .mat-mdc-button-touch-target{height:100%}.asw-time-ampm .asw-time-am.asw-time-ampm-active,.asw-time-ampm .asw-time-pm.asw-time-ampm-active{--mdc-text-button-label-text-color: rgba(0, 0, 0, .87);--mdc-typography-button-font-weight: 500;color:#3f51b5;background-color:#3f51b533}.asw-time-ampm .asw-time-am{border-radius:8px 8px 0 0}.asw-time-ampm .asw-time-pm{border-radius:0 0 8px 8px;border-top:none}.asw-time-button-wrapper{display:flex;justify-content:flex-end;padding-top:8px}.asw-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .asw-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"] }] }], ctorParameters: () => [{ type: i1.DatetimeAdapter }, { type: i0.ChangeDetectorRef }, { type: i2.AswDatetimepickerIntl }], propDecorators: { selectedChange: [{ type: Output }], activeDateChange: [{ type: Output }], _userSelection: [{ type: Output }], ampmChange: [{ type: Output }], clockViewChange: [{ type: Output }], dateFilter: [{ type: Input }], interval: [{ type: Input }], hourInputElement: [{ type: ViewChild, args: ['hourInput', { read: (ElementRef) }] }], hourInputDirective: [{ type: ViewChild, args: ['hourInput', { read: AswTimeInput }] }], minuteInputElement: [{ type: ViewChild, args: ['minuteInput', { read: (ElementRef) }] }], minuteInputDirective: [{ type: ViewChild, args: ['minuteInput', { read: AswTimeInput }] }], twelvehour: [{ type: Input }], AMPM: [{ type: Input }], activeDate: [{ type: Input }], selected: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], clockView: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RhdGV0aW1lcGlja2VyL3RpbWUvdGltZS50cyIsIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RhdGV0aW1lcGlja2VyL3RpbWUvdGltZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsb0JBQW9CLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBaUIsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXdCLE1BQU0sRUFBaUIsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBUTVOLFNBQVMsR0FBRyxDQUFDLEdBQWdCLEVBQUUsSUFBWTtJQUN2QyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJO1FBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDMUMsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBVUQsTUFBTSxPQUFPLFlBQVk7SUFxQ1Q7SUFDQTtJQXJDWixJQUNJLFlBQVksQ0FBQyxLQUFrQjtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDTyxTQUFTLEdBQVcsQ0FBQyxDQUFDO0lBRTlCLElBQ0ksT0FBTyxDQUFDLEtBQWtCO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNPLElBQUksR0FBRyxDQUFDLENBQUM7SUFFakIsSUFDSSxPQUFP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RSxFQUFFLElBQUksRUFBRSxDQUFBLFVBQTRCLENBQUEsRUFBRTtnQkFJdEQsb0JBQW9CO3NCQUQ3QixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUU7Z0JBTzVDLFVBQVU7c0JBRGIsS0FBSztnQkFVRyxJQUFJO3NCQUFaLEtBQUs7Z0JBTUYsVUFBVTtzQkFEYixLQUFLO2dCQVdGLFFBQVE7c0JBRFgsS0FBSztnQkFjRixPQUFPO3NCQURWLEtBQUs7Z0JBWUYsT0FBTztzQkFEVixLQUFLO2dCQVdGLFNBQVM7c0JBRFosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSwgTnVtYmVySW5wdXQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgRE9XTl9BUlJPVywgVVBfQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZXRpbWVBZGFwdGVyIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci1wcm8vY29tbW9uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbkxpa2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFzd0Nsb2NrVmlldyB9IGZyb20gJy4uL2Nsb2NrL2Nsb2NrJztcbmltcG9ydCB7IEFzd0RhdGV0aW1lcGlja2VyRmlsdGVyVHlwZSB9IGZyb20gJy4uL2RhdGV0aW1lcGlja2VyLWZpbHRlcnR5cGUnO1xuaW1wb3J0IHsgQXN3RGF0ZXRpbWVwaWNrZXJJbnRsIH0gZnJvbSAnLi4vZGF0ZXRpbWVwaWNrZXItaW50bCc7XG5pbXBvcnQgeyBBc3dBTVBNIH0gZnJvbSAnLi4vZGF0ZXRpbWVwaWNrZXItdHlwZXMnO1xuXG5mdW5jdGlvbiBwYWQobnVtOiBOdW1iZXJJbnB1dCwgc2l6ZTogbnVtYmVyKSB7XG4gICAgbnVtID0gU3RyaW5nKG51bSk7XG4gICAgd2hpbGUgKG51bS5sZW5ndGggPCBzaXplKSBudW0gPSAnMCcgKyBudW07XG4gICAgcmV0dXJuIG51bTtcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdpbnB1dC5hc3ctdGltZS1pbnB1dCcsXG4gICAgaG9zdDoge1xuICAgICAgICAnKGJsdXIpJzogJ2JsdXIoJGV2ZW50KScsXG4gICAgICAgICcoZm9jdXMpJzogJ2ZvY3VzKCRldmVudCknXG4gICAgfSxcbiAgICBleHBvcnRBczogJ2Fzd1RpbWVJbnB1dCdcbn0pXG5leHBvcnQgY2xhc3MgQXN3VGltZUlucHV0IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBASW5wdXQoJ3RpbWVJbnRlcnZhbCcpXG4gICAgc2V0IHRpbWVJbnRlcnZhbCh2YWx1ZTogTnVtYmVySW5wdXQpIHtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuICAgIHByaXZhdGUgX2ludGVydmFsOiBudW1iZXIgPSAxO1xuXG4gICAgQElucHV0KCd0aW1lTWluJylcbiAgICBzZXQgdGltZU1pbih2YWx1ZTogTnVtYmVySW5wdXQpIHtcbiAgICAgICAgdGhpcy5fbWluID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIF9taW4gPSAwO1xuXG4gICAgQElucHV0KCd0aW1lTWF4JylcbiAgICBzZXQgdGltZU1heCh2YWx1ZTogTnVtYmVySW5wdXQpIHtcbiAgICAgICAgdGhpcy5fbWF4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIF9tYXggPSBJbmZpbml0eTtcblxuICAgIEBJbnB1dCgndGltZVZhbHVlJylcbiAgICBzZXQgdGltZVZhbHVlKHZhbHVlOiBOdW1iZXJJbnB1dCkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc0ZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5fdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud3JpdGVQbGFjZWhvbGRlcih0aGlzLl92YWx1ZSk7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpIHRpbWVWYWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE51bWJlcklucHV0PigpO1xuXG4gICAgcHJpdmF0ZSBfdmFsdWU6IE51bWJlcklucHV0O1xuXG4gICAgcHJpdmF0ZSBrZXlEb3duTGlzdGVuZXIgPSB0aGlzLmtleURvd25IYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgcHJpdmF0ZSBrZXlQcmVzc0xpc3RlbmVyID0gdGhpcy5rZXlQcmVzc0hhbmRsZXIuYmluZCh0aGlzKTtcbiAgICBwcml2YXRlIGlucHV0RXZlbnRMaXN0ZW5lciA9IHRoaXMuaW5wdXRDaGFuZ2VkSGFuZGxlci5iaW5kKHRoaXMpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICAgKSB7XG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleURvd25MaXN0ZW5lciwge1xuICAgICAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEbyBub3QgcGFzc2l2ZSBzaW5jZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gcHJldmVudERlZmF1bHQoKVxuICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIHRoaXMua2V5UHJlc3NMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5pbnB1dEV2ZW50TGlzdGVuZXIsIHtcbiAgICAgICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc0ZvY3VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5lbGVtZW50Py5uYXRpdmVFbGVtZW50ID09PSBkb2N1bWVudD8uYWN0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgaW5wdXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBXZSBsb29rIGhlcmUgYXQgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLCBiZWNhdXNlIHdlIHdyaXRlICcnIGludG8gdGhlIHZhbHVlIG9uIGZvY3VzXG4gICAgLy8gcGxhY2Vob2xkZXIgc2hvdWxkIGFsd2F5cyBiZSB1cCB0byBkYXRlIHdpdGggXCJjdXJyZW50VmFsdWVcIlxuICAgIGdldCB2YWxpZCgpIHtcbiAgICAgICAgLy8gQXQgdGhlIHN0YXJ0IF92YWx1ZSBpcyB1bmRlZmluZWQgdGhlcmVmb3JlIHRoaXMgd291bGQgcmVzdWx0IGluIG5vdCB2YWxpZCBhbmRcbiAgICAgICAgLy8gbWFrZSBhIHVnbHkgd2FybmluZyBib3JkZXIgYWZ0ZXJ3YXJkcyB3ZSBjYW4gc2FmZWx5IGNoZWNrXG4gICAgICAgIGlmICh0aGlzLl92