@hxui/angular
Version:
An Angular library based on the [HXUI design system](https://hxui.io).
599 lines • 85.7 kB
JavaScript
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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