@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
JavaScript
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