UNPKG

@hxui/angular

Version:

An Angular library based on the [HXUI design system](https://hxui.io).

599 lines 85.7 kB
import { Overlay, } from '@angular/cdk/overlay'; import { TemplatePortal } from '@angular/cdk/portal'; import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, TemplateRef, ViewChild, ViewContainerRef, } from '@angular/core'; import { FormGroupDirective, NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms'; import moment from 'moment'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TextInputDirective } from '../text-input/text-input.directive'; import { DatepickerConfig } from './datepicker.config'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; import * as i2 from "./datepicker.config"; import * as i3 from "../tabs/tabset.component"; import * as i4 from "./datepicker-interval.component"; import * as i5 from "./datepicker.component"; import * as i6 from "@angular/common"; import * as i7 from "@angular/forms"; import * as i8 from "ngx-mask"; import * as i9 from "../text-input/text-input.directive"; import * as i10 from "@angular/cdk/a11y"; import * as i11 from "../tabs/tab.directive"; export class DatepickerFormComponent { constructor(_viewContainerRef, overlay, _config, _cd) { this._viewContainerRef = _viewContainerRef; this.overlay = overlay; this._config = _config; this._cd = _cd; this._destroyed = new Subject(); this.isOpen = false; this.isInputFocus = false; this.activeTabIndex = 0; this.date = null; this.dateValidators = new Array(); this.onChanged = new Array(); this.onTouched = new Array(); /** Adds the disabled html attribute to the components input element */ this.disabled = false; /** Adds the readonly html attribute to the components input element. */ this.readonly = false; /** * Adds the required html attribute to the components input element * and a required asterisk on the input label. */ this.required = false; /** Initializes the component with a value of the present date. */ this.defaultToPresentDate = true; /** * Setting to false will disallow the user from selecting dates * before the present date */ this.allowPreviousDates = true; /** * Setting to false will disallow the user from selecting dates * after the present date. */ this.allowFutureDates = true; /** * A JavaScript Date object formatting string, formats the display * of components current value. */ this.dateFormat = 'dd/MM/y'; /** * This attribute specifies the placeholder value of the components * input element. */ this.placeholder = 'Date'; /** This attribute specifies the text value of input helper. */ this.helpText = 'Please select a valid date'; /** Specifies visibility of input help text */ this.helpTextVisible = false; /** Warning state of input */ this.isWarning = false; /** Danger state of input */ this.isDanger = false; /** This attribute specifies the font icon name. */ this.icon = 'hx-icon icon-calendar-outline'; /** This attribute specifies the icon placement. */ this.iconPlacement = 'right'; /** Specifies the position the datepicker opens against the input element */ this.placement = this._config.placement; /** delay in ms before showing the calendar after show is called */ this.showDelay = this._config.showDelay; /** delay in ms before hiding the calendar after hide is called */ this.hideDelay = this._config.hideDelay; /** Specifies the inclusive beginning date for allowed date values */ this.from = ''; /** Specifies the inclusive end date for allowed date values */ this.to = ''; /** Enables interval selection */ this.interval = false; this.dueDateInterval = '0 day(s)'; /** Mask pattern for date picker text input */ this.maskPattern = '00/00/0000'; /** Emits a Date is selected from the Datepicker or a valid date string is entered into input field */ this.dateChange = new EventEmitter(); /** Emits a boolean if date picker input field is in focus */ this.inputFocus = new EventEmitter(); this.propogateChange = value => { this.onChanged.forEach(fn => fn(value)); }; } ngOnInit() { // if interval is not allowed, go to 'specific date' tab if (!this.interval) { this.activeTabIndex = 1; this.selectedInterval = { interval: this.dueDateInterval, isSelectedFromInterval: false, }; } else { this.selectedInterval = { interval: this.dueDateInterval, isSelectedFromInterval: true, }; } const date = new Date(); this.presentDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); if (this.defaultToPresentDate) { setTimeout(() => { this.setDate(this.presentDate); }); } // Close to the minimum and maxium possible dates, but still normalisable // http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.1 const from = this.parseDate(this.from) || new Date(-8630000000000000); const to = this.parseDate(this.to) || new Date(8630000000000000); if (!!this.from || !!this.to) { this.validateDateRange = this.createDateRangeValidator(from, to); this.dateValidators.push(this.validateDateRange.bind(this)); } if (!this.allowPreviousDates) { this.dateValidators.push(this.validateIsNotBeforeDate.bind(this)); } if (!this.allowFutureDates) { this.dateValidators.push(this.validateIsNotAfterDate.bind(this)); } } ngDoCheck() { const from = this.parseDate(this.from) || new Date(-8630000000000000); const to = this.parseDate(this.to) || new Date(8630000000000000); if (!!this.from || !!this.to) { this.validateDateRange = this.createDateRangeValidator(from, to); this.dateValidators = [this.validateDateRange.bind(this)]; } } ngOnDestroy() { // dispose the overlay ref and subscriptions if (this._overlayRef) { this._overlayRef.dispose(); this._overlayRef = null; } this._destroyed.next(true); this._destroyed.complete(); } /** Listen to keyboard events to trigger changes to overlay state */ onKeydown($event) { if ($event.key === 'Escape' && this.isOpen) { this._hide(); } } setDate(date) { this.date = date; this.propogateChange(date); this.dateChange.emit(date); this._updateLabelStyle(); } onDateSelection($event) { this._hide(); this.selectedInterval['isSelectedFromInterval'] = false; this.setDate($event); } onIntervalSelection($event) { this._hide(); const { date, ...rest } = $event; this.selectedInterval = rest; this.setDate(date); } onChange($event) { const inputDate = $event.target.value; const date = this.parseDate(inputDate); if (inputDate === '' || date === null) { this.setDate(null); } else if (date) { this.setDate(date); } else { this.propogateChange(inputDate); } } onFocused($event) { this.isInputFocus = true; this.propogateTouched(); this.inputFocus.emit(); } onBlur($event) { this.isInputFocus = false; } onButtonClick($event) { if (this.isOpen) { this._hide(); } else { this._show(); } } onIntervalCancel($event) { this._hide(); } onKeydownTab($event) { this.onChange($event); this._hide(); this.propogateTouched(); } onKeydownSpace($event) { this._show(); } onTabSelect(index) { if (!index) { return; } if (index === 0) { this.activeTabIndex = 0; } else { this.activeTabIndex = 1; } } parseDate(inputDate) { if (typeof inputDate === 'string') { // eslint-disable-next-line no-useless-escape const dateArray = inputDate.split(/[.,\/ -]/); if (dateArray.length === 3 && dateArray[2].length !== 0) { const allowedFormats = [ 'DD/MM/YYYY', 'D/M/YY', 'DD/MM/YY', 'DD-MM-YYYY', 'D-M-YY', 'DD-MM-YY', 'DD.MM.YYYY', 'D.M.YY', 'DD.MM.YY', ]; const momentDate = moment(inputDate, allowedFormats, true); if (momentDate.isValid()) { return momentDate.toDate(); } } return null; } else { return inputDate; } } validateIsNotBeforeDate(date) { const normalisedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); return normalisedDate.getTime() < this.presentDate.getTime(); } validateIsNotAfterDate(date) { const normalisedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); return normalisedDate.getTime() > this.presentDate.getTime(); } createDateRangeValidator(from, to) { const normalisedFromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate()); const normalisedToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate()); return (date) => { if (date instanceof Date) { const normalisedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); return !(normalisedFromDate.getTime() <= normalisedDate.getTime() && normalisedDate.getTime() <= normalisedToDate.getTime()); } else { return false; } }; } writeValue(value) { if (value !== this.date && value !== undefined) { if (value && this.date && value.valueOf() === this.date.valueOf()) { return; } this.setDate(value); } } registerOnChange(fn) { this.onChanged.push(fn); } registerOnTouched(fn) { this.onTouched.push(fn); } propogateTouched() { this.onTouched.forEach(fn => fn()); } validate(control) { const date = Date.parse(control.value); if (!this.required && (control.value === null || control.value === undefined)) { this.isValid = true; return null; } if (isNaN(date)) { this.isValid = false; return { dateParseError: { valid: false, }, }; } if (!this.allowPreviousDates && this.validateIsNotBeforeDate(this.date)) { this.isValid = false; return { previousDateError: { valid: false, }, }; } if (!this.allowFutureDates && this.validateIsNotAfterDate(this.date)) { this.isValid = false; return { futureDateError: { valid: false, }, }; } if (this.validateDateRange && this.validateDateRange(this.date)) { this.isValid = false; return { dateRangeError: { valid: false, }, }; } if (this.required && !this.date) { this.isValid = false; return { dateRequiredError: { valid: false, }, }; } this.isValid = true; return null; } /** open overlay */ _show(delay = this.showDelay) { if (this.disabled || this.isOpen) { return; } const overlayRef = this._createOverlay(); this._detach(); overlayRef.attach(this._portal); // Cancel the delayed hide if it is scheduled if (this._hideTimeoutId) { clearTimeout(this._hideTimeoutId); } this._showTimeoutId = window.setTimeout(() => { this.isOpen = true; // Schedule for change detection incase the tooltip is used within a // component with OnPush change detection this._cd.markForCheck(); }, delay); } /** close overlay */ _hide(delay = this.hideDelay) { this._detach(); // Cancel the delayed show if it is scheduled if (this._showTimeoutId) { clearTimeout(this._showTimeoutId); } this._hideTimeoutId = window.setTimeout(() => { this.isOpen = false; this._destroyed.next(true); }, delay); } _createOverlay() { if (this._overlayRef) { return this._overlayRef; } this._portal = new TemplatePortal(this._menuRef, this._viewContainerRef); const positionStrategy = this.overlay .position() .flexibleConnectedTo(this._originRef) .withTransformOriginOn('.hxa-datepicker__control') .withFlexibleDimensions(false); this._overlayRef = this.overlay.create({ positionStrategy: positionStrategy, panelClass: ['hxui-reset', 'hxa-datepicker__overlay'], hasBackdrop: true, backdropClass: 'cdk-overlay-transparent-backdrop', scrollStrategy: this.overlay.scrollStrategies.reposition(), }); this._updatePosition(); this._overlayRef .detachments() .pipe(takeUntil(this._destroyed)) .subscribe(() => this._detach()); this._overlayRef.backdropClick().subscribe(() => this._hide()); const position = this._overlayRef.getConfig() .positionStrategy; position.positionChanges.pipe(takeUntil(this._destroyed)).subscribe(pos => { if (pos.connectionPair.originX === 'start') { this.placement = 'left'; } else if (pos.connectionPair.originX === 'end') { this.placement = 'right'; } }); return this._overlayRef; } _updatePosition() { const position = this._overlayRef.getConfig() .positionStrategy; const origin = this._getOrigin(); const overlay = this._getOverlayPosition(); position.withPositions([ { ...origin.main, ...overlay.main }, { ...origin.fallback, ...overlay.fallback }, ]); } /** * Returns the origin position and a fallback position based on the user's position preference. * The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`). */ _getOrigin() { const placement = this.placement; let originPlacement; if (placement === 'top' || placement === 'bottom') { originPlacement = { originX: 'start', originY: placement === 'top' ? 'top' : 'bottom', }; } else if (placement === 'left') { originPlacement = { originX: 'start', originY: 'center' }; } else if (placement === 'right') { originPlacement = { originX: 'end', originY: 'center' }; } else { console.error('Position error', placement); } const { x, y } = this._invertPosition(originPlacement.originX, originPlacement.originY); return { main: originPlacement, fallback: { originX: x, originY: y }, }; } /** Returns the overlay position and a fallback position based on the user's preference */ _getOverlayPosition() { const placement = this.placement; let overlayPlacement; if (placement === 'top') { overlayPlacement = { overlayX: 'start', overlayY: 'bottom' }; } else if (placement === 'bottom') { overlayPlacement = { overlayX: 'start', overlayY: 'top' }; } else if (placement === 'left') { overlayPlacement = { overlayX: 'end', overlayY: 'center' }; } else if (placement === 'right') { overlayPlacement = { overlayX: 'start', overlayY: 'center' }; } else { console.error('Could not find a position', placement); } const { x, y } = this._invertPosition(overlayPlacement.overlayX, overlayPlacement.overlayY); return { main: overlayPlacement, fallback: { overlayX: x, overlayY: y }, }; } _invertPosition(x, y) { if (this.placement === 'top' || this.placement === 'bottom') { if (y === 'top') { y = 'bottom'; } else if (y === 'bottom') { y = 'top'; } } else { if (x === 'end') { x = 'start'; } else if (x === 'start') { x = 'end'; } } return { x, y }; } _detach() { if (this._overlayRef && this._overlayRef.hasAttached()) { this._overlayRef.detach(); } } // only applicable if hxaInputDirective is present _updateLabelStyle() { if (this.datePickerFormInput) { this.datePickerFormInput.styleLabel(true); } } } DatepickerFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DatepickerFormComponent, deps: [{ token: i0.ViewContainerRef }, { token: i1.Overlay }, { token: i2.DatepickerConfig }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); DatepickerFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: DatepickerFormComponent, selector: "hxa-datepicker-input", inputs: { disabled: "disabled", readonly: "readonly", required: "required", defaultToPresentDate: "defaultToPresentDate", allowPreviousDates: "allowPreviousDates", allowFutureDates: "allowFutureDates", dateFormat: "dateFormat", placeholder: "placeholder", helpText: "helpText", helpTextVisible: "helpTextVisible", isWarning: "isWarning", isDanger: "isDanger", icon: "icon", iconPlacement: "iconPlacement", placement: "placement", showDelay: "showDelay", hideDelay: "hideDelay", from: "from", to: "to", interval: "interval", dueDateInterval: "dueDateInterval", maskPattern: "maskPattern" }, outputs: { dateChange: "dateChange", inputFocus: "inputFocus" }, host: { listeners: { "document:keydown": "onKeydown($event)" }, classAttribute: "hx-input-group hxa-datepicker" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DatepickerFormComponent), multi: true, }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => DatepickerFormComponent), multi: true, }, ], viewQueries: [{ propertyName: "datePickerFormInput", first: true, predicate: TextInputDirective, descendants: true, static: true }, { propertyName: "datePickerForm", first: true, predicate: ["datePickerForm"], descendants: true, static: true }, { propertyName: "_menuRef", first: true, predicate: ["menuRef"], descendants: true, read: TemplateRef }, { propertyName: "_originRef", first: true, predicate: ["originRef"], descendants: true, read: ElementRef }], ngImport: i0, template: "<!-- INPUT -->\r\n<button\r\n class=\"hxa-datepicker__button left\"\r\n (click)=\"onButtonClick($event)\"\r\n *ngIf=\"iconPlacement === 'left'\"\r\n tabindex=\"-1\"\r\n>\r\n <i class=\"{{ icon }}\"></i>\r\n</button>\r\n<div\r\n class=\"hx-input-control hxa-datepicker__control\"\r\n [class.is-danger]=\"(!isValid && datePickerForm.touched) || isDanger\"\r\n [class.is-help-visible]=\"helpTextVisible\"\r\n [class.is-warning]=\"isWarning && isValid && datePickerForm.touched\"\r\n>\r\n <input\r\n class=\"hx-input\"\r\n type=\"text\"\r\n #originRef\r\n #datePickerForm=\"ngModel\"\r\n hxaTextInput\r\n [required]=\"required ? true : null\"\r\n [disabled]=\"disabled\"\r\n [readonly]=\"readonly ? true : null\"\r\n [ngModel]=\"date | date: dateFormat\"\r\n (change)=\"onChange($event)\"\r\n (focus)=\"onFocused($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (keydown.Tab)=\"onKeydownTab($event)\"\r\n (keydown.Space)=\"onKeydownSpace($event)\"\r\n [mask]=\"maskPattern\"\r\n [clearIfNotMatch]=\"false\"\r\n />\r\n <label class=\"hx-label\" *ngIf=\"placeholder\">\r\n {{ placeholder }} <ng-container *ngIf=\"required\">*</ng-container>\r\n </label>\r\n <div class=\"hx-help\">{{ helpText }}</div>\r\n</div>\r\n<button\r\n class=\"hxa-datepicker__button right\"\r\n (click)=\"onButtonClick($event)\"\r\n *ngIf=\"iconPlacement === 'right'\"\r\n tabindex=\"-1\"\r\n>\r\n <i class=\"{{ icon }}\"></i>\r\n</button>\r\n\r\n<!-- OVERLAY -->\r\n<ng-template #menuRef>\r\n <div role=\"dialog\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\r\n <hx-tabset\r\n class=\"hxa-tabset hx-bg-white\"\r\n [class.is-tablist-hidden]=\"!interval\"\r\n [justified]=\"true\"\r\n contentCustomClass=\"pa-0\"\r\n >\r\n <hx-tab\r\n heading=\"FROM TODAY\"\r\n (select)=\"onTabSelect(0)\"\r\n [active]=\"activeTabIndex === 0\"\r\n >\r\n <hxa-datepicker-interval\r\n [selectedDate]=\"date\"\r\n [selectedInterval]=\"selectedInterval\"\r\n (update)=\"onIntervalSelection($event)\"\r\n (cancel)=\"onIntervalCancel($event)\"\r\n ></hxa-datepicker-interval>\r\n </hx-tab>\r\n <hx-tab\r\n heading=\"SPECIFIC DATE\"\r\n (select)=\"onTabSelect(1)\"\r\n [active]=\"activeTabIndex === 1\"\r\n >\r\n <hxa-datepicker\r\n [selectedDate]=\"date\"\r\n [validators]=\"dateValidators\"\r\n (update)=\"onDateSelection($event)\"\r\n ></hxa-datepicker>\r\n </hx-tab>\r\n </hx-tabset>\r\n </div>\r\n</ng-template>\r\n", styles: [".hxa-datepicker:host{position:relative;display:block;max-width:19rem}.hxa-datepicker:host input[readonly]~.hx-label{top:-.5rem;font-size:.75rem;color:#41b987}.hxa-datepicker__control{margin:0}.hxa-datepicker__control:not(:last-child) .hx-input{padding-right:1.8rem}.hxa-datepicker__control:not(:last-child) .hx-label{margin-right:1.8rem}.hxa-datepicker__button{position:absolute;top:.5rem;padding:0;z-index:1;background-color:unset;border:none}.hxa-datepicker__button.left{left:0}.hxa-datepicker__button.right{right:0}.hxa-datepicker__button+.hx-input-control .hx-input{padding-left:1.8rem}.hxa-datepicker__button+.hx-input-control .hx-label{margin-left:1.8rem}::ng-deep .hxa-datepicker__overlay{box-shadow:0 2px 12px #0000000f;outline:1px solid rgba(0,0,0,.08);max-width:19rem}::ng-deep .hxa-datepicker__overlay .hxa-tabset.is-tablist-hidden ::ng-deep .hx-nav-tabs{display:none}::ng-deep .hxa-datepicker__overlay .hxa-tabset ::ng-deep .hx-nav-tabs{margin-bottom:0}::ng-deep .hxa-datepicker__overlay .hxa-tabset ::ng-deep .hx-nav-link{text-align:center}\n"], components: [{ type: i3.TabsetComponent, selector: "hx-tabset", inputs: ["vertical", "justified", "hasInfo", "type", "contentCustomClass", "stickyHeader", "stickyHeaderOffset", "tag", "changeFn"] }, { type: i4.DatepickerIntervalComponent, selector: "hxa-datepicker-interval", inputs: ["selectedDate", "selectedInterval"], outputs: ["update", "cancel"] }, { type: i5.DatepickerComponent, selector: "hxa-datepicker", inputs: ["selectedDate", "validators"], outputs: ["update"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i8.MaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "triggerOnMaskChange"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { type: i9.TextInputDirective, selector: "[hxaTextInput]" }, { type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i10.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { type: i11.TabDirective, selector: "hx-tab, [hx-tab]", inputs: ["heading", "id", "disabled", "removable", "customClass", "active"], outputs: ["select", "deselect", "removed"] }], pipes: { "date": i6.DatePipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DatepickerFormComponent, decorators: [{ type: Component, args: [{ selector: 'hxa-datepicker-input', host: { class: 'hx-input-group hxa-datepicker', }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DatepickerFormComponent), multi: true, }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => DatepickerFormComponent), multi: true, }, ], template: "<!-- INPUT -->\r\n<button\r\n class=\"hxa-datepicker__button left\"\r\n (click)=\"onButtonClick($event)\"\r\n *ngIf=\"iconPlacement === 'left'\"\r\n tabindex=\"-1\"\r\n>\r\n <i class=\"{{ icon }}\"></i>\r\n</button>\r\n<div\r\n class=\"hx-input-control hxa-datepicker__control\"\r\n [class.is-danger]=\"(!isValid && datePickerForm.touched) || isDanger\"\r\n [class.is-help-visible]=\"helpTextVisible\"\r\n [class.is-warning]=\"isWarning && isValid && datePickerForm.touched\"\r\n>\r\n <input\r\n class=\"hx-input\"\r\n type=\"text\"\r\n #originRef\r\n #datePickerForm=\"ngModel\"\r\n hxaTextInput\r\n [required]=\"required ? true : null\"\r\n [disabled]=\"disabled\"\r\n [readonly]=\"readonly ? true : null\"\r\n [ngModel]=\"date | date: dateFormat\"\r\n (change)=\"onChange($event)\"\r\n (focus)=\"onFocused($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (keydown.Tab)=\"onKeydownTab($event)\"\r\n (keydown.Space)=\"onKeydownSpace($event)\"\r\n [mask]=\"maskPattern\"\r\n [clearIfNotMatch]=\"false\"\r\n />\r\n <label class=\"hx-label\" *ngIf=\"placeholder\">\r\n {{ placeholder }} <ng-container *ngIf=\"required\">*</ng-container>\r\n </label>\r\n <div class=\"hx-help\">{{ helpText }}</div>\r\n</div>\r\n<button\r\n class=\"hxa-datepicker__button right\"\r\n (click)=\"onButtonClick($event)\"\r\n *ngIf=\"iconPlacement === 'right'\"\r\n tabindex=\"-1\"\r\n>\r\n <i class=\"{{ icon }}\"></i>\r\n</button>\r\n\r\n<!-- OVERLAY -->\r\n<ng-template #menuRef>\r\n <div role=\"dialog\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\r\n <hx-tabset\r\n class=\"hxa-tabset hx-bg-white\"\r\n [class.is-tablist-hidden]=\"!interval\"\r\n [justified]=\"true\"\r\n contentCustomClass=\"pa-0\"\r\n >\r\n <hx-tab\r\n heading=\"FROM TODAY\"\r\n (select)=\"onTabSelect(0)\"\r\n [active]=\"activeTabIndex === 0\"\r\n >\r\n <hxa-datepicker-interval\r\n [selectedDate]=\"date\"\r\n [selectedInterval]=\"selectedInterval\"\r\n (update)=\"onIntervalSelection($event)\"\r\n (cancel)=\"onIntervalCancel($event)\"\r\n ></hxa-datepicker-interval>\r\n </hx-tab>\r\n <hx-tab\r\n heading=\"SPECIFIC DATE\"\r\n (select)=\"onTabSelect(1)\"\r\n [active]=\"activeTabIndex === 1\"\r\n >\r\n <hxa-datepicker\r\n [selectedDate]=\"date\"\r\n [validators]=\"dateValidators\"\r\n (update)=\"onDateSelection($event)\"\r\n ></hxa-datepicker>\r\n </hx-tab>\r\n </hx-tabset>\r\n </div>\r\n</ng-template>\r\n", styles: [".hxa-datepicker:host{position:relative;display:block;max-width:19rem}.hxa-datepicker:host input[readonly]~.hx-label{top:-.5rem;font-size:.75rem;color:#41b987}.hxa-datepicker__control{margin:0}.hxa-datepicker__control:not(:last-child) .hx-input{padding-right:1.8rem}.hxa-datepicker__control:not(:last-child) .hx-label{margin-right:1.8rem}.hxa-datepicker__button{position:absolute;top:.5rem;padding:0;z-index:1;background-color:unset;border:none}.hxa-datepicker__button.left{left:0}.hxa-datepicker__button.right{right:0}.hxa-datepicker__button+.hx-input-control .hx-input{padding-left:1.8rem}.hxa-datepicker__button+.hx-input-control .hx-label{margin-left:1.8rem}::ng-deep .hxa-datepicker__overlay{box-shadow:0 2px 12px #0000000f;outline:1px solid rgba(0,0,0,.08);max-width:19rem}::ng-deep .hxa-datepicker__overlay .hxa-tabset.is-tablist-hidden ::ng-deep .hx-nav-tabs{display:none}::ng-deep .hxa-datepicker__overlay .hxa-tabset ::ng-deep .hx-nav-tabs{margin-bottom:0}::ng-deep .hxa-datepicker__overlay .hxa-tabset ::ng-deep .hx-nav-link{text-align:center}\n"] }] }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i1.Overlay }, { type: i2.DatepickerConfig }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { datePickerFormInput: [{ type: ViewChild, args: [TextInputDirective, { static: true }] }], datePickerForm: [{ type: ViewChild, args: ['datePickerForm', { static: true }] }], _menuRef: [{ type: ViewChild, args: ['menuRef', { read: TemplateRef }] }], _originRef: [{ type: ViewChild, args: ['originRef', { read: ElementRef }] }], disabled: [{ type: Input }], readonly: [{ type: Input }], required: [{ type: Input }], defaultToPresentDate: [{ type: Input }], allowPreviousDates: [{ type: Input }], allowFutureDates: [{ type: Input }], dateFormat: [{ type: Input }], placeholder: [{ type: Input }], helpText: [{ type: Input }], helpTextVisible: [{ type: Input }], isWarning: [{ type: Input }], isDanger: [{ type: Input }], icon: [{ type: Input }], iconPlacement: [{ type: Input }], placement: [{ type: Input }], showDelay: [{ type: Input }], hideDelay: [{ type: Input }], from: [{ type: Input }], to: [{ type: Input }], interval: [{ type: Input }], dueDateInterval: [{ type: Input }], maskPattern: [{ type: Input }], dateChange: [{ type: Output }], inputFocus: [{ type: Output }], onKeydown: [{ type: HostListener, args: ['document:keydown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h4LXVpL3NyYy9saWIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHgtdWkvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGVwaWNrZXItZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsT0FBTyxHQUlSLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUVULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGlCQUFpQixHQUVsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQXVCdkQsTUFBTSxPQUFPLHVCQUF1QjtJQXVKbEMsWUFDVSxpQkFBbUMsRUFDcEMsT0FBZ0IsRUFDZixPQUF5QixFQUN6QixHQUFzQjtRQUh0QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ3BDLFlB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