UNPKG

carbon-components-angular

Version:
753 lines (751 loc) 89.4 kB
import { Component, Input, Output, EventEmitter, ViewEncapsulation, HostListener, ViewChild } from "@angular/core"; import rangePlugin from "flatpickr/dist/plugins/rangePlugin"; import flatpickr from "flatpickr"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { carbonFlatpickrMonthSelectPlugin } from "./carbon-flatpickr-month-select"; import * as languages from "flatpickr/dist/l10n/index"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/i18n"; import * as i2 from "@angular/common"; import * as i3 from "carbon-components-angular/datepicker-input"; /** * Due to type error, we have to use square brackets property accessor * There is a webpack issue when attempting to access exported languages from flatpickr l10n Angular 14+ apps * languages.default[locale] fails in app consuming CCA library but passes in test * languages.default.default[locale] fails in test but works in app consuming CCA library. * * To please both scenarios, we are adding a condition to prevent tests from failing */ if (languages.default?.default["en"]?.weekdays) { languages.default.default["en"].weekdays.shorthand = languages.default.default["en"].weekdays.longhand.map(day => { if (day === "Thursday") { return "Th"; } return day.charAt(0); }); } /** * Get started with importing the module: * * ```typescript * import { DatePickerModule } from 'carbon-components-angular'; * ``` * * [See demo](../../?path=/story/components-date-picker--single) */ export class DatePicker { constructor(elementRef, i18n) { this.elementRef = elementRef; this.i18n = i18n; /** * Select calendar range mode */ this.range = false; /** * Format of date * * For reference: https://flatpickr.js.org/formatting/ */ this.dateFormat = "m/d/Y"; /** * Language of the flatpickr calendar. * * For reference of the possible locales: * https://github.com/flatpickr/flatpickr/blob/master/src/l10n/index.ts */ this.language = "en"; this.placeholder = "mm/dd/yyyy"; /** * Aria label added to datepicker's calendar container. */ this.ariaLabel = "calendar container"; /** * The pattern for the underlying input element */ this.inputPattern = "^\\d{1,2}/\\d{1,2}/\\d{4}$"; this.id = `datepicker-${DatePicker.datePickerCount++}`; /** * @deprecated since v5 - Use `cdsLayer` directive instead * Set to `"light"` to apply the light style */ this.theme = "dark"; this.disabled = false; this.readonly = false; /** * Set to `true` to display the invalid state. */ this.invalid = false; /** * Set to `true` to show a warning (contents set by warningText) */ this.warn = false; this.size = "md"; /** * Set to `true` to display the invalid state for the second datepicker input. */ this.rangeInvalid = false; /** * Set to `true` to show a warning in the second datepicker input (contents set by rangeWarningText) */ this.rangeWarn = false; this.skeleton = false; this.plugins = []; this.valueChange = new EventEmitter(); /** * We are overriding onClose event even if users pass it via flatpickr options * Emits an event when date picker closes */ this.onClose = new EventEmitter(); this._value = []; this._flatpickrOptions = { allowInput: true }; this.flatpickrBaseOptions = { mode: "single", dateFormat: "m/d/Y", plugins: this.plugins, onOpen: () => { this.updateClassNames(); this.updateAttributes(); this.updateCalendarListeners(); }, onClose: (date) => { // This makes sure that the `flatpickrInstance selectedDates` are in sync with the values of // the inputs when the calendar closes. if (this.range && this.flatpickrInstance) { const inputValue = this.input.input.nativeElement.value; const rangeInputValue = this.rangeInput.input.nativeElement.value; if (inputValue || rangeInputValue) { const parseDate = (date) => this.flatpickrInstance.parseDate(date, this.dateFormat); this.setDateValues([parseDate(inputValue), parseDate(rangeInputValue || inputValue)]); this.doSelect(this.flatpickrInstance.selectedDates); } } this.onClose.emit(date); }, onDayCreate: (_dObj, _dStr, _fp, dayElem) => { dayElem.classList.add("cds--date-picker__day"); }, nextArrow: this.rightArrowHTML(), prevArrow: this.leftArrowHTML(), value: this.value }; this.flatpickrInstance = null; this.onTouched = () => { }; this.propagateChange = (_) => { }; this.preventCalendarClose = event => event.stopPropagation(); } set value(v) { if (!v) { v = []; } this._value = v; } get value() { return this._value; } set flatpickrOptions(options) { this._flatpickrOptions = Object.assign({}, this._flatpickrOptions, options); } get flatpickrOptions() { const plugins = [...this.plugins, carbonFlatpickrMonthSelectPlugin]; if (this.range) { plugins.push(rangePlugin({ input: `#${this.id}-rangeInput`, position: "left" })); } return Object.assign({}, this._flatpickrOptions, this.flatpickrBaseOptions, { mode: this.range ? "range" : "single", plugins, dateFormat: this.dateFormat, locale: languages.default?.default[this.language] || languages.default[this.language], // Little trick force "readonly mode" on datepicker input. // Docs: Whether clicking on the input should open the picker. // You could disable this if you wish to open the calendar manually with.open(). clickOpens: !this.readonly }); } ngOnInit() { // if i18n is set to anything other than en we'll want to change the language // otherwise we'll just use the local setting if (this.i18n.getLocale() !== "en") { this.i18n.getLocaleObservable().subscribe(locale => { this.language = locale; this.resetFlatpickrInstance(); }); } } ngOnChanges(changes) { // Reset the flatpickr instance on input changes that affect flatpickr. const flatpickrChangeKeys = [ "range", "dateFormat", "language", "id", "value", "plugins", "flatpickrOptions", "readonly" ]; const changeKeys = Object.keys(changes); if (changeKeys.some(key => flatpickrChangeKeys.includes(key))) { this.resetFlatpickrInstance(changes.value); } } ngAfterViewInit() { if (!this.skeleton) { this.input.input.nativeElement.value = this._value[0] ?? ""; if (this.range) { this.rangeInput.input.nativeElement.value = this._value[1] ?? ""; } } setTimeout(() => { this.addInputListeners(); }, 0); } // because the actual view may be delayed in loading (think projection into a tab pane) // and because we rely on a library that operates outside the Angular view of the world // we need to keep trying to load the library, until the relevant DOM is actually live ngAfterViewChecked() { if (!this.isFlatpickrLoaded()) { // @ts-ignore ts is unhappy with the below call to `flatpickr` this.flatpickrInstance = flatpickr(`#${this.id}-input`, this.flatpickrOptions); // if (and only if) the initialization succeeded, we can set the date values if (this.isFlatpickrLoaded()) { if (this.value.length > 0) { this.setDateValues(this.value); } } } } onFocus() { // Updates the month manually when calendar mode is range because month // will not update properly without manually updating them on focus. if (this.range) { if (this.rangeInput.input.nativeElement === document.activeElement && this.flatpickrInstance.selectedDates[1]) { const currentMonth = this.flatpickrInstance.selectedDates[1].getMonth(); this.flatpickrInstance.changeMonth(currentMonth, false); } else if (this.input.input.nativeElement === document.activeElement && this.flatpickrInstance.selectedDates[0]) { const currentMonth = this.flatpickrInstance.selectedDates[0].getMonth(); this.flatpickrInstance.changeMonth(currentMonth, false); } } } onFocusOut() { this.onTouched(); } /** * Writes a value from the model to the component. Expects the value to be `null` or `(Date | string)[]` * @param value value received from the model */ writeValue(value) { this.value = value; setTimeout(() => { if (this.isFlatpickrLoaded() && this.flatpickrInstance.config) { this.setDateValues(this.value); } }); } /** * `ControlValueAccessor` method to programmatically disable the DatePicker. * * ex: `this.formGroup.get("myDatePicker").disable();` * * @param isDisabled `true` to disable the DatePicker */ setDisabledState(isDisabled) { this.disabled = isDisabled; } registerOnChange(fn) { this.propagateChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } /** * Cleans up our flatpickr instance */ ngOnDestroy() { if (!this.isFlatpickrLoaded()) { return; } this.flatpickrInstance.destroy(); } /** * Handles the `valueChange` event from the primary/single input */ onValueChange(event) { if (this.isFlatpickrLoaded()) { const date = this.flatpickrInstance.parseDate(event, this.dateFormat); if (this.range) { this.setDateValues([date, this.flatpickrInstance.selectedDates[1]]); } else { this.setDateValues([date]); } this.doSelect(this.flatpickrInstance.selectedDates); } } /** * Handles the `valueChange` event from the range input */ onRangeValueChange(event) { if (this.isFlatpickrLoaded() && this.flatpickrInstance.isOpen) { const date = this.flatpickrInstance.parseDate(event, this.dateFormat); this.setDateValues([this.flatpickrInstance.selectedDates[0], date]); this.doSelect(this.flatpickrInstance.selectedDates); } } /** * Handles opening the calendar "properly" when the calendar icon is clicked. */ openCalendar(datepickerInput) { if (this.readonly || this.skeleton) { return; } if (this.range) { datepickerInput.input.nativeElement.click(); // If the first input's calendar icon is clicked when calendar is in range mode, then // the month and year needs to be manually changed to the current selected month and // year otherwise the calendar view will not be updated upon opening. if (datepickerInput === this.input && this.flatpickrInstance.selectedDates[0]) { const currentMonth = this.flatpickrInstance.selectedDates[0].getMonth(); this.flatpickrInstance.currentYear = this.flatpickrInstance.selectedDates[0].getFullYear(); this.flatpickrInstance.changeMonth(currentMonth, false); } } else { // Single-mode flatpickr handles mousedown but not click, so nativeElement.click() won't // work when the calendar icon is clicked. In this case we simply use flatpickr.open(). this.flatpickrInstance.open(); } } updateCalendarListeners() { const calendarContainer = document.querySelectorAll(".flatpickr-calendar"); Array.from(calendarContainer).forEach(calendar => { calendar.removeEventListener("click", this.preventCalendarClose); calendar.addEventListener("click", this.preventCalendarClose); }); } /** * Handles the initialization of event listeners for the datepicker input and range input fields. */ addInputListeners() { if (!this.isFlatpickrLoaded()) { return; } // Allows focus transition from the datepicker input or range input field to // flatpickr calendar using a keyboard. const addFocusCalendarListener = (element) => { element.addEventListener("keydown", (event) => { // Listeners are added just once, so a check is needed here. if (this.readonly) { return; } if (event.key === "Escape") { this.flatpickrInstance.close(); } if (event.key === "ArrowDown") { if (!this.flatpickrInstance.isOpen) { this.flatpickrInstance.open(); } const calendarContainer = this.flatpickrInstance.calendarContainer; const dayElement = calendarContainer && calendarContainer.querySelector(".flatpickr-day[tabindex]"); const selectedDateElem = calendarContainer && calendarContainer.querySelector(".selected"); const todayDateElem = calendarContainer && calendarContainer.querySelector(".today"); if (dayElement) { (todayDateElem || selectedDateElem || dayElement).focus(); // If the user manually inputs a value into the date field and presses arrow down, // datepicker input onchange will be triggered when focus is removed from it and // `flatpickrInstance.setDate` and `flatpickrInstance.changeMonth` will be invoked // which will automatically change focus to the beginning of the document. if (document.activeElement !== dayElement && this.flatpickrInstance.selectedDateElem) { this.flatpickrInstance.selectedDateElem.focus(); } } } }); }; if (this.input && this.input.input) { addFocusCalendarListener(this.input.input.nativeElement); } if (this.rangeInput && this.rangeInput.input) { addFocusCalendarListener(this.rangeInput.input.nativeElement); } } /** * Resets the flatpickr instance while keeping the date values (or updating them if newDates is provided) * * Used to pick up input changes or locale changes. * * @param newDates An optional SimpleChange of date values */ resetFlatpickrInstance(newDates) { if (this.isFlatpickrLoaded()) { let dates = this.flatpickrInstance.selectedDates; if (newDates && this.didDateValueChange(newDates.currentValue, newDates.previousValue)) { dates = newDates.currentValue; } // only reset the flatpickr instance on Input changes // @ts-ignore ts is unhappy with the below call to `flatpickr` this.flatpickrInstance = flatpickr(`#${this.id}-input`, this.flatpickrOptions); this.setDateValues(dates); } } /** * Carbon uses a number of specific classnames for parts of the flatpickr - this idempotent method applies them if needed. */ updateClassNames() { if (!this.elementRef) { return; } // get all the possible flatpickrs in the document - we need to add classes to (potentially) all of them const calendarContainer = document.querySelectorAll(".flatpickr-calendar"); const monthContainer = document.querySelectorAll(".flatpickr-month"); const weekdaysContainer = document.querySelectorAll(".flatpickr-weekdays"); const weekdayContainer = document.querySelectorAll(".flatpickr-weekday"); const daysContainer = document.querySelectorAll(".flatpickr-days"); const dayContainer = document.querySelectorAll(".flatpickr-day"); // add classes to lists of elements const addClassIfNotExists = (classname, elementList) => { Array.from(elementList).forEach(element => { if (!element.classList.contains(classname)) { element.classList.add(classname); } }); }; // add classes (but only if they don't exist, small perf win) addClassIfNotExists("cds--date-picker__calendar", calendarContainer); addClassIfNotExists("cds--date-picker__month", monthContainer); addClassIfNotExists("cds--date-picker__weekdays", weekdaysContainer); addClassIfNotExists("cds--date-picker__days", daysContainer); // add weekday classes and format the text Array.from(weekdayContainer).forEach(element => { element.innerHTML = element.innerHTML.replace(/\s+/g, ""); element.classList.add("cds--date-picker__weekday"); }); // add day classes and special case the "today" element based on `this.value` Array.from(dayContainer).forEach(element => { element.setAttribute("role", "button"); element.classList.add("cds--date-picker__day"); if (!this.value) { return; } if (element.classList.contains("today") && this.value.length > 0) { element.classList.add("no-border"); } else if (element.classList.contains("today") && this.value.length === 0) { element.classList.remove("no-border"); } }); } updateAttributes() { const calendarContainer = document.querySelectorAll(".flatpickr-calendar"); Array.from(calendarContainer).forEach(calendar => { calendar.setAttribute("role", "application"); calendar.setAttribute("aria-label", this.ariaLabel); }); } /** * Applies the given date value array to both the flatpickr instance and the `input`(s) * @param dates the date values to apply */ setDateValues(dates) { if (this.isFlatpickrLoaded()) { const singleInput = this.elementRef.nativeElement.querySelector(`#${this.id}-input`); const rangeInput = this.elementRef.nativeElement.querySelector(`#${this.id}-rangeInput`); // `flatpickrInstance.setDate` removes the focus on the selected date element and will // automatically change focus to the beginning of the document. If a selected date is // focused before `flatpickrInstance.setDate` is invoked then it should remain focused. let shouldRefocusDateElement = this.flatpickrInstance.selectedDateElem === document.activeElement; // set the date on the instance this.flatpickrInstance.setDate(dates); if (shouldRefocusDateElement) { this.flatpickrInstance.selectedDateElem.focus(); } // we can either set a date value or an empty string, so we start with an empty string let singleDate = ""; // if date is a string, parse and format if (typeof this.flatpickrInstance.selectedDates[0] === "string") { singleDate = this.flatpickrInstance.parseDate(this.flatpickrInstance.selectedDates[0], this.dateFormat); singleDate = this.flatpickrInstance.formatDate(singleDate, this.dateFormat); // if date is not a string we can assume it's a Date and we should format } else if (!!this.flatpickrInstance.selectedDates[0]) { singleDate = this.flatpickrInstance.formatDate(this.flatpickrInstance.selectedDates[0], this.dateFormat); } if (rangeInput) { // we can either set a date value or an empty string, so we start with an empty string let rangeDate = ""; // if date is a string, parse and format if (typeof this.flatpickrInstance.selectedDates[1] === "string") { rangeDate = this.flatpickrInstance.parseDate(this.flatpickrInstance.selectedDates[1].toString(), this.dateFormat); rangeDate = this.flatpickrInstance.formatDate(rangeDate, this.dateFormat); // if date is not a string we can assume it's a Date and we should format } else if (!!this.flatpickrInstance.selectedDates[1]) { rangeDate = this.flatpickrInstance.formatDate(this.flatpickrInstance.selectedDates[1], this.dateFormat); } setTimeout(() => { // apply the values rangeInput.value = rangeDate; singleInput.value = singleDate; }); } } } doSelect(selectedValue) { // In range mode, if a date is selected from the first calendar that is from the previous month, // the month will not be updated on the calendar until the calendar is re-opened. // This will make sure the calendar is updated with the correct month. if (this.range && this.flatpickrInstance.selectedDates[0]) { const currentMonth = this.flatpickrInstance.selectedDates[0].getMonth(); // `flatpickrInstance.changeMonth` removes the focus on the selected date element and will // automatically change focus to the beginning of the document. If a selected date is // focused before `flatpickrInstance.changeMonth` is invoked then it should remain focused. let shouldRefocusDateElement = this.flatpickrInstance.selectedDateElem === document.activeElement; this.flatpickrInstance.changeMonth(currentMonth, false); if (shouldRefocusDateElement) { this.flatpickrInstance.selectedDateElem.focus(); } } this.valueChange.emit(selectedValue); this.propagateChange(selectedValue); } didDateValueChange(currentValue, previousValue) { return currentValue[0] !== previousValue[0] || currentValue[1] !== previousValue[1]; } /** * More advanced checking of the loaded state of flatpickr */ isFlatpickrLoaded() { // cast the instance to a boolean, and some method that has to exist for the library to be loaded in this case `setDate` return !!this.flatpickrInstance && !!this.flatpickrInstance.setDate; } /** * Right arrow HTML passed to flatpickr */ rightArrowHTML() { return ` <svg width="16px" height="16px" viewBox="0 0 16 16"> <polygon points="11,8 6,13 5.3,12.3 9.6,8 5.3,3.7 6,3 "/> <rect width="16" height="16" style="fill:none" /> </svg>`; } /** * Left arrow HTML passed to flatpickr */ leftArrowHTML() { return ` <svg width="16px" height="16px" viewBox="0 0 16 16"> <polygon points="5,8 10,3 10.7,3.7 6.4,8 10.7,12.3 10,13 "/> <rect width="16" height="16" style="fill:none" /> </svg>`; } } DatePicker.datePickerCount = 0; DatePicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DatePicker, deps: [{ token: i0.ElementRef }, { token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component }); DatePicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DatePicker, selector: "cds-date-picker, ibm-date-picker", inputs: { range: "range", dateFormat: "dateFormat", language: "language", label: "label", helperText: "helperText", rangeHelperText: "rangeHelperText", rangeLabel: "rangeLabel", placeholder: "placeholder", ariaLabel: "ariaLabel", inputPattern: "inputPattern", id: "id", value: "value", theme: "theme", disabled: "disabled", readonly: "readonly", invalid: "invalid", invalidText: "invalidText", warn: "warn", warnText: "warnText", size: "size", rangeInvalid: "rangeInvalid", rangeInvalidText: "rangeInvalidText", rangeWarn: "rangeWarn", rangeWarnText: "rangeWarnText", skeleton: "skeleton", plugins: "plugins", flatpickrOptions: "flatpickrOptions" }, outputs: { valueChange: "valueChange", onClose: "onClose" }, host: { listeners: { "focusin": "onFocus()", "focusout": "onFocusOut()" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: DatePicker, multi: true } ], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, static: true }, { propertyName: "rangeInput", first: true, predicate: ["rangeInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` <div class="cds--form-item"> <div class="cds--date-picker" [ngClass]="{ 'cds--date-picker--range' : range, 'cds--date-picker--single' : !range, 'cds--date-picker--light' : theme === 'light', 'cds--skeleton' : skeleton }"> <div class="cds--date-picker-container"> <cds-date-picker-input #input [label]="label" [placeholder]="placeholder" [pattern]="inputPattern" [id]="id + '-input'" [size]="size" [type]="(range ? 'range' : 'single')" [hasIcon]="(range ? false : true)" [disabled]="disabled" [readonly]="readonly" [invalid]="invalid" [invalidText]="invalidText" [warn]="warn" [warnText]="warnText" [skeleton]="skeleton" [helperText]="helperText" (valueChange)="onValueChange($event)" (click)="openCalendar(input)"> </cds-date-picker-input> </div> <div *ngIf="range" class="cds--date-picker-container"> <cds-date-picker-input #rangeInput [label]="rangeLabel" [placeholder]="placeholder" [pattern]="inputPattern" [id]="id + '-rangeInput'" [size]="size" [type]="(range ? 'range' : 'single')" [hasIcon]="(range ? true : null)" [disabled]="disabled" [readonly]="readonly" [invalid]="rangeInvalid" [invalidText]="rangeInvalidText" [warn]="rangeWarn" [warnText]="rangeWarnText" [skeleton]="skeleton" [helperText]="rangeHelperText" (valueChange)="onRangeValueChange($event)" (click)="openCalendar(rangeInput)"> </cds-date-picker-input> </div> </div> </div> `, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DatePickerInput, selector: "cds-date-picker-input, ibm-date-picker-input", inputs: ["type", "id", "hasIcon", "label", "placeholder", "pattern", "theme", "disabled", "readonly", "invalid", "invalidText", "warn", "warnText", "helperText", "skeleton", "value", "size"], outputs: ["valueChange"] }], encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DatePicker, decorators: [{ type: Component, args: [{ selector: "cds-date-picker, ibm-date-picker", template: ` <div class="cds--form-item"> <div class="cds--date-picker" [ngClass]="{ 'cds--date-picker--range' : range, 'cds--date-picker--single' : !range, 'cds--date-picker--light' : theme === 'light', 'cds--skeleton' : skeleton }"> <div class="cds--date-picker-container"> <cds-date-picker-input #input [label]="label" [placeholder]="placeholder" [pattern]="inputPattern" [id]="id + '-input'" [size]="size" [type]="(range ? 'range' : 'single')" [hasIcon]="(range ? false : true)" [disabled]="disabled" [readonly]="readonly" [invalid]="invalid" [invalidText]="invalidText" [warn]="warn" [warnText]="warnText" [skeleton]="skeleton" [helperText]="helperText" (valueChange)="onValueChange($event)" (click)="openCalendar(input)"> </cds-date-picker-input> </div> <div *ngIf="range" class="cds--date-picker-container"> <cds-date-picker-input #rangeInput [label]="rangeLabel" [placeholder]="placeholder" [pattern]="inputPattern" [id]="id + '-rangeInput'" [size]="size" [type]="(range ? 'range' : 'single')" [hasIcon]="(range ? true : null)" [disabled]="disabled" [readonly]="readonly" [invalid]="rangeInvalid" [invalidText]="rangeInvalidText" [warn]="rangeWarn" [warnText]="rangeWarnText" [skeleton]="skeleton" [helperText]="rangeHelperText" (valueChange)="onRangeValueChange($event)" (click)="openCalendar(rangeInput)"> </cds-date-picker-input> </div> </div> </div> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: DatePicker, multi: true } ], encapsulation: ViewEncapsulation.None }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.I18n }]; }, propDecorators: { range: [{ type: Input }], dateFormat: [{ type: Input }], language: [{ type: Input }], label: [{ type: Input }], helperText: [{ type: Input }], rangeHelperText: [{ type: Input }], rangeLabel: [{ type: Input }], placeholder: [{ type: Input }], ariaLabel: [{ type: Input }], inputPattern: [{ type: Input }], id: [{ type: Input }], value: [{ type: Input }], theme: [{ type: Input }], disabled: [{ type: Input }], readonly: [{ type: Input }], invalid: [{ type: Input }], invalidText: [{ type: Input }], warn: [{ type: Input }], warnText: [{ type: Input }], size: [{ type: Input }], rangeInvalid: [{ type: Input }], rangeInvalidText: [{ type: Input }], rangeWarn: [{ type: Input }], rangeWarnText: [{ type: Input }], skeleton: [{ type: Input }], plugins: [{ type: Input }], flatpickrOptions: [{ type: Input }], input: [{ type: ViewChild, args: ["input", { static: true }] }], rangeInput: [{ type: ViewChild, args: ["rangeInput"] }], valueChange: [{ type: Output }], onClose: [{ type: Output }], onFocus: [{ type: HostListener, args: ["focusin"] }], onFocusOut: [{ type: HostListener, args: ["focusout"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixFQUdqQixZQUFZLEVBTVosU0FBUyxFQUdULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sV0FBVyxNQUFNLG9DQUFvQyxDQUFDO0FBQzdELE9BQU8sU0FBUyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRixPQUFPLEtBQUssU0FBUyxNQUFNLDJCQUEyQixDQUFDOzs7OztBQUt2RDs7Ozs7OztHQU9HO0FBQ0gsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUU7SUFDOUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQXNCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDOUgsSUFBSSxHQUFHLEtBQUssVUFBVSxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFDRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7Q0FDSDtBQUVEOzs7Ozs7OztHQVFHO0FBc0VILE1BQU0sT0FBTyxVQUFVO0lBaUx0QixZQUNXLFVBQXNCLEVBQ3RCLElBQVU7UUFEVixlQUFVLEdBQVYs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