UNPKG

@ptsecurity/mosaic

Version:
884 lines 123 kB
// @ts-nocheck // tslint:disable:no-empty import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { Directive, ElementRef, EventEmitter, forwardRef, Inject, Input, Optional, Output, Renderer2 } from '@angular/core'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { DateAdapter, MC_DATE_FORMATS } from '@ptsecurity/cdk/datetime'; import { UP_ARROW, RIGHT_ARROW, DOWN_ARROW, LEFT_ARROW, END, PAGE_DOWN, HOME, PAGE_UP, SPACE, TAB, ESCAPE, hasModifierKey, isHorizontalMovement, isLetterKey, isVerticalMovement } from '@ptsecurity/cdk/keycodes'; import { validationTooltipHideDelay, validationTooltipShowDelay } from '@ptsecurity/mosaic/core'; import { McFormFieldControl } from '@ptsecurity/mosaic/form-field'; import { McWarningTooltipTrigger } from '@ptsecurity/mosaic/tooltip'; import { Subject, Subscription } from 'rxjs'; import { createMissingDateImplError } from './datepicker-errors'; import { McDatepicker } from './datepicker.component'; import * as i0 from "@angular/core"; import * as i1 from "@ptsecurity/cdk/datetime"; // tslint:disable:naming-convention var DateParts; (function (DateParts) { DateParts["year"] = "y"; DateParts["month"] = "m"; DateParts["day"] = "d"; })(DateParts || (DateParts = {})); export const MAX_YEAR = 9999; class DateDigit { constructor(value, start, length) { this.value = value; this.start = start; this.length = length; this.maxDays = 31; this.maxMonth = 12; if (value === DateParts.day) { this.parse = this.parseDay; } else if (value === DateParts.month) { this.parse = this.parseMonth; } else if (value === DateParts.year) { this.parse = this.parseYear; } } get end() { return this.start + this.length; } get isDay() { return this.value === DateParts.day; } get isMonth() { return this.value === DateParts.month; } get isYear() { return this.value === DateParts.year; } get fullName() { if (this.isDay) { return 'date'; } if (this.isMonth) { return 'month'; } if (this.isYear) { return 'year'; } } parseDay(value) { const parsedValue = parseInt(value); if (parsedValue === 0) { return 1; } if (parsedValue > this.maxDays) { return this.maxDays; } return parsedValue; } parseMonth(value) { const parsedValue = parseInt(value); if (parsedValue === 0) { return 1; } if (parsedValue > this.maxMonth) { return this.maxMonth; } return parsedValue; } parseYear(value) { const parsedValue = parseInt(value); if (parsedValue === 0) { return 1; } if (parsedValue > MAX_YEAR) { return MAX_YEAR; } return parsedValue; } } /** @docs-private */ export const MC_DATEPICKER_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => McDatepickerInput), multi: true }; /** @docs-private */ export const MC_DATEPICKER_VALIDATORS = { provide: NG_VALIDATORS, useExisting: forwardRef(() => McDatepickerInput), multi: true }; /** * An event used for datepicker input and change events. We don't always have access to a native * input or change event because the event may have been triggered by the user clicking on the * calendar popup. For consistency, we always use McDatepickerInputEvent instead. */ export class McDatepickerInputEvent { constructor( /** Reference to the datepicker input component that emitted the event. */ target, /** Reference to the native input element associated with the datepicker input. */ targetElement) { this.target = target; this.targetElement = targetElement; this.value = this.target.value; } } let uniqueComponentIdSuffix = 0; /** Directive used to connect an input to a McDatepicker. */ export class McDatepickerInput { constructor(elementRef, renderer, dateAdapter, dateFormats) { this.elementRef = elementRef; this.renderer = renderer; this.dateAdapter = dateAdapter; this.dateFormats = dateFormats; this.stateChanges = new Subject(); this.controlType = 'datepicker'; this.focused = false; /** Emits when the value changes (either due to user input or programmatic change). */ this.valueChange = new EventEmitter(); /** Emits when the disabled state has changed */ this.disabledChange = new EventEmitter(); this._disabled = false; this.incorrectInput = new EventEmitter(); /** Emits when a `change` event is fired on this `<input>`. */ this.dateChange = new EventEmitter(); /** Emits when an `input` event is fired on this `<input>`. */ this.dateInput = new EventEmitter(); this.uid = `mc-datepicker-${uniqueComponentIdSuffix++}`; this.datepickerSubscription = Subscription.EMPTY; this.localeSubscription = Subscription.EMPTY; /** Whether the last value set on the input was valid. */ this.lastValueValid = false; this.onTouched = () => { }; this.onInput = () => { this.correctCursorPosition(); const formattedValue = this.replaceSymbols(this.viewValue); const newTimeObj = this.getDateFromString(formattedValue); this.lastValueValid = !!newTimeObj; if (!newTimeObj) { if (!this.viewValue) { this._value = null; this.cvaOnChange(null); } this.control.updateValueAndValidity({ emitEvent: false }); return; } this.setViewValue(this.getTimeStringFromDate(newTimeObj, this.dateFormats.dateInput), true); this.selectNextDigitByCursor(this.selectionStart); this.updateValue(newTimeObj); }; this.parseOnBlur = () => { if (!this.viewValue) { return null; } const date = this.getDefaultValue(); const viewDigits = this.viewValue .split(this.separator) .map((value) => value) .filter((value) => value); const [firsViewDigit, secondViewDigit, thirdViewDigit] = viewDigits; // tslint:disable-next-line:no-magic-numbers if (viewDigits.length !== 3) { this.lastValueValid = false; this._value = null; return setTimeout(() => this.control.updateValueAndValidity()); } date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit); date[this.secondDigit.fullName] = this.secondDigit.parse(secondViewDigit); date[this.thirdDigit.fullName] = this.thirdDigit.parse(thirdViewDigit); const [digitWithYear, viewDigitWithYear] = [this.firstDigit, this.secondDigit, this.thirdDigit] .reduce((acc, digit, index) => digit.value === DateParts.year ? [digit, viewDigits[index]] : acc, []); // tslint:disable-next-line:no-magic-numbers if (viewDigitWithYear.length < 3) { // tslint:disable-next-line:no-magic-numbers date.year += date.year < 30 ? 2000 : 1900; } else if (viewDigitWithYear.length < digitWithYear.length) { this.lastValueValid = false; this._value = null; return setTimeout(() => this.control.updateValueAndValidity()); } const newTimeObj = this.getValidDateOrNull(this.dateAdapter.createDateTime(date.year, date.month - 1, date.date, date.hours, date.minutes, date.seconds, date.milliseconds)); this.lastValueValid = !!newTimeObj; this.setViewValue(this.getTimeStringFromDate(newTimeObj, this.dateFormats.dateInput), true); this.updateValue(newTimeObj); }; this.updateLocaleParams = () => { this.setFormat(this.dateFormats.dateInput); this.value = this.value; }; this.cvaOnChange = () => { }; this.validatorOnChange = () => { }; /** The form control validator for whether the input parses. */ this.parseValidator = () => { return this.focused || this.empty || this.lastValueValid ? null : { mcDatepickerParse: { text: this.elementRef.nativeElement.value } }; }; /** The form control validator for the min date. */ this.minValidator = (control) => { const controlValue = this.getValidDateOrNull(this.dateAdapter.deserialize(control.value)); return (!this.min || !controlValue || this.dateAdapter.compareDate(this.min, controlValue) <= 0) ? null : { mcDatepickerMin: { min: this.min, actual: controlValue } }; }; /** The form control validator for the max date. */ this.maxValidator = (control) => { const controlValue = this.getValidDateOrNull(this.dateAdapter.deserialize(control.value)); return (!this.max || !controlValue || this.dateAdapter.compareDate(this.max, controlValue) >= 0) ? null : { mcDatepickerMax: { max: this.max, actual: controlValue } }; }; /** The form control validator for the date filter. */ this.filterValidator = (control) => { const controlValue = this.getValidDateOrNull(this.dateAdapter.deserialize(control.value)); return !this.dateFilter || !controlValue || this.dateFilter(controlValue) ? null : { mcDatepickerFilter: true }; }; this.validator = Validators.compose([ this.parseValidator, this.minValidator, this.maxValidator, this.filterValidator ]); if (!this.dateAdapter) { throw createMissingDateImplError('DateAdapter'); } if (!this.dateFormats) { throw createMissingDateImplError('MC_DATE_FORMATS'); } this.setFormat(dateFormats.dateInput); this.localeSubscription = dateAdapter.localeChanges .subscribe(this.updateLocaleParams); } get required() { return this._required; } set required(value) { this._required = coerceBooleanProperty(value); } /** The datepicker that this input is associated with. */ set mcDatepicker(value) { if (!value) { return; } this.datepicker = value; this.datepicker.registerInput(this); this.datepickerSubscription.unsubscribe(); this.datepickerSubscription = this.datepicker.selectedChanged .subscribe((selected) => { this.value = selected; this.cvaOnChange(selected); this.onTouched(); this.dateChange.emit(new McDatepickerInputEvent(this, this.elementRef.nativeElement)); }); } /** Function that can be used to filter out dates within the datepicker. */ set mcDatepickerFilter(value) { this.dateFilter = value; this.validatorOnChange(); } /** The value of the input. */ get value() { return this._value; } set value(value) { let newValue = this.dateAdapter.deserialize(value); this.lastValueValid = !newValue || this.dateAdapter.isValid(newValue); newValue = this.getValidDateOrNull(newValue); const oldDate = this.value; this._value = newValue; this.formatValue(newValue); if (!this.dateAdapter.sameDate(oldDate, newValue)) { this.valueChange.emit(newValue); } } /** The minimum valid date. */ get min() { return this._min; } set min(value) { this._min = this.getValidDateOrNull(this.dateAdapter.deserialize(value)); this.validatorOnChange(); } /** The maximum valid date. */ get max() { return this._max; } set max(value) { this._max = this.getValidDateOrNull(this.dateAdapter.deserialize(value)); this.validatorOnChange(); } /** Whether the datepicker-input is disabled. */ get disabled() { return this._disabled; } set disabled(value) { const newValue = coerceBooleanProperty(value); const element = this.elementRef.nativeElement; if (this._disabled !== newValue) { this._disabled = newValue; this.disabledChange.emit(newValue); } // We need to null check the `blur` method, because it's undefined during SSR. if (newValue && element.blur) { // Normally, native input elements automatically blur if they turn disabled. This behavior // is problematic, because it would mean that it triggers another change detection cycle, // which then causes a changed after checked error if the input element was focused before. element.blur(); } } get id() { return this._id; } set id(value) { this._id = value || this.uid; } set mcValidationTooltip(tooltip) { if (!tooltip) { return; } tooltip.enterDelay = validationTooltipShowDelay; tooltip.trigger = 'manual'; tooltip.initListeners(); this.incorrectInput.subscribe(() => { if (tooltip.isOpen) { return; } tooltip.show(); setTimeout(() => tooltip.hide(), validationTooltipHideDelay); }); } get empty() { return !this.viewValue && !this.isBadInput(); } get viewValue() { return this.elementRef.nativeElement.value; } get ngControl() { return this.control; } get isReadOnly() { return this.elementRef.nativeElement.readOnly; } get selectionStart() { return this.elementRef.nativeElement.selectionStart; } set selectionStart(value) { this.elementRef.nativeElement.selectionStart = value; } get selectionEnd() { return this.elementRef.nativeElement.selectionEnd; } set selectionEnd(value) { this.elementRef.nativeElement.selectionEnd = value; } onContainerClick() { this.focus(); } focus() { this.elementRef.nativeElement.focus(); } focusChanged(isFocused) { if (isFocused !== this.focused) { this.focused = isFocused; this.onTouched(); this.stateChanges.next(); } } ngOnDestroy() { this.datepickerSubscription.unsubscribe(); this.localeSubscription.unsubscribe(); this.valueChange.complete(); this.disabledChange.complete(); } /** @docs-private */ registerOnValidatorChange(fn) { this.validatorOnChange = fn; } /** @docs-private */ validate(control) { this.setControl(control); return this.validator ? this.validator(control) : null; } // Implemented as part of ControlValueAccessor. writeValue(value) { this.value = value; } // Implemented as part of ControlValueAccessor. registerOnChange(fn) { this.cvaOnChange = fn; } // Implemented as part of ControlValueAccessor. registerOnTouched(fn) { this.onTouched = fn; } // Implemented as part of ControlValueAccessor. setDisabledState(isDisabled) { this.disabled = isDisabled; } onKeyDown(event) { if (this.isReadOnly) { return; } // tslint:disable-next-line: deprecation const keyCode = event.keyCode; if (this.isLetterKey(event)) { event.preventDefault(); this.incorrectInput.emit(); } else if (this.isKeyForOpen(event)) { event.preventDefault(); this.datepicker.open(); } else if (this.isKeyForClose(event)) { event.preventDefault(); this.datepicker.close(); } else if (keyCode === TAB) { this.datepicker.close(false); } else if (this.isKeyForByPass(event)) { return; } else if (keyCode === SPACE) { this.spaceKeyHandler(event); } else if ([UP_ARROW, DOWN_ARROW].includes(keyCode)) { event.preventDefault(); this.verticalArrowKeyHandler(keyCode); } else if ([LEFT_ARROW, RIGHT_ARROW, HOME, PAGE_UP, END, PAGE_DOWN].includes(keyCode)) { event.preventDefault(); this.changeCaretPosition(keyCode); } else if (/^\D$/.test(event.key)) { event.preventDefault(); const newValue = this.getNewValue(event.key, this.selectionStart); const formattedValue = this.replaceSymbols(newValue); if (newValue !== formattedValue) { this.setViewValue(formattedValue, true); setTimeout(this.onInput); } else { this.incorrectInput.emit(); } } else { setTimeout(this.onInput); } } onChange() { this.dateChange.emit(new McDatepickerInputEvent(this, this.elementRef.nativeElement)); } /** Handles blur events on the input. */ onBlur() { // Reformat the input only if we have a valid value. this.parseOnBlur(); this.focusChanged(false); } onPaste($event) { var _a, _b, _c; $event.preventDefault(); const rawValue = $event.clipboardData.getData('text'); const match = rawValue.match(/^(?<first>\d+)\W(?<second>\d+)\W(?<third>\d+)$/); if (!((_a = match === null || match === void 0 ? void 0 : match.groups) === null || _a === void 0 ? void 0 : _a.first) || !((_b = match === null || match === void 0 ? void 0 : match.groups) === null || _b === void 0 ? void 0 : _b.second) || !((_c = match === null || match === void 0 ? void 0 : match.groups) === null || _c === void 0 ? void 0 : _c.third)) { this.setViewValue(rawValue); return rawValue; } const value = [match.groups.first, match.groups.second, match.groups.third].join(this.separator); const newTimeObj = this.getDateFromString(value); if (!newTimeObj) { this.setViewValue(value); return value; } this.setViewValue(this.getTimeStringFromDate(newTimeObj, this.dateFormats.dateInput)); this.updateValue(newTimeObj); } toISO8601(value) { return this.dateAdapter.toIso8601(value); } setFormat(format) { this.separator = format.match(/[aA-zZ]+(?<separator>\W|\D)[aA-zZ]+/).groups.separator; this.separatorPositions = format .split('') .reduce((acc, item, index) => this.separator === item ? [...acc, index + 1] : acc, []); this.getDigitPositions(format); } updateValue(newValue) { if (!this.dateAdapter.sameDate(newValue, this.value)) { this._value = newValue; this.cvaOnChange(newValue); this.valueChange.emit(newValue); this.dateInput.emit(new McDatepickerInputEvent(this, this.elementRef.nativeElement)); } this.control.updateValueAndValidity({ emitEvent: false }); } isKeyForClose(event) { // tslint:disable-next-line: deprecation return (event.altKey && event.keyCode === UP_ARROW) || event.keyCode === ESCAPE; } isKeyForOpen(event) { // tslint:disable-next-line: deprecation return event.altKey && event.keyCode === DOWN_ARROW; } isLetterKey(event) { return isLetterKey(event) && !event.ctrlKey && !event.metaKey; } isKeyForByPass(event) { // tslint:disable-next-line: deprecation return (hasModifierKey(event) && (isVerticalMovement(event.keyCode) || isHorizontalMovement(event.keyCode))) || event.ctrlKey || event.metaKey; } spaceKeyHandler(event) { event.preventDefault(); if (this.selectionStart === this.selectionEnd) { const value = this.getNewValue(event.key, this.selectionStart); this.setViewValue(value); setTimeout(this.onInput); } else if (this.selectionStart !== this.selectionEnd) { this.selectNextDigit(this.selectionStart, true); } } getNewValue(key, position) { return [this.viewValue.slice(0, position), key, this.viewValue.slice(position)].join(''); } setViewValue(value, savePosition = false) { if (savePosition) { const selectionStart = this.selectionStart; const selectionEnd = this.selectionEnd; this.renderer.setProperty(this.elementRef.nativeElement, 'value', value); this.selectionStart = selectionStart; this.selectionEnd = selectionEnd; } else { this.renderer.setProperty(this.elementRef.nativeElement, 'value', value); } } replaceSymbols(value) { return value .split(this.separator) .map((part) => part.replace(/^([0-9]+)\W$/, '0$1')) .join(this.separator); } getDateFromString(timeString) { if (!timeString || timeString.length < this.firstDigit.length) { return null; } const date = this.getDefaultValue(); const viewDigits = timeString .split(this.separator) .map((value) => value); const [firsViewDigit, secondViewDigit, thirdViewDigit] = viewDigits; if (viewDigits.length === 1) { if (firsViewDigit.length < this.firstDigit.length) { return null; } date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit); date.month = 1; // tslint:disable-next-line:no-magic-numbers } else if (viewDigits.length === 2) { if (firsViewDigit.length < this.firstDigit.length || secondViewDigit.length < this.secondDigit.length) { return null; } date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit); date[this.secondDigit.fullName] = this.secondDigit.parse(secondViewDigit); // tslint:disable-next-line:no-magic-numbers } else if (viewDigits.length === 3) { if (firsViewDigit.length < this.firstDigit.length || secondViewDigit.length < this.secondDigit.length || thirdViewDigit.length < this.thirdDigit.length) { return null; } date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit); date[this.secondDigit.fullName] = this.secondDigit.parse(secondViewDigit); date[this.thirdDigit.fullName] = this.thirdDigit.parse(thirdViewDigit); } else { return null; } return this.getValidDateOrNull(this.dateAdapter.createDateTime(date.year, date.month - 1, date.date, date.hours, date.minutes, date.seconds, date.milliseconds)); } getDefaultValue() { const defaultValue = this.value || this.dateAdapter.today(); return { year: this.dateAdapter.getYear(defaultValue), month: this.dateAdapter.getMonth(defaultValue), date: this.dateAdapter.getDate(defaultValue), hours: this.dateAdapter.getHours(defaultValue), minutes: this.dateAdapter.getMinutes(defaultValue), seconds: this.dateAdapter.getSeconds(defaultValue), milliseconds: this.dateAdapter.getMilliseconds(defaultValue) }; } getTimeStringFromDate(value, timeFormat) { if (!value || !this.dateAdapter.isValid(value)) { return ''; } return this.dateAdapter.format(value, timeFormat); } getDateEditMetrics(cursorPosition) { for (const digit of [this.firstDigit, this.secondDigit, this.thirdDigit]) { if (cursorPosition >= digit.start && cursorPosition <= digit.end) { return [digit.value, digit.start, digit.end]; } } return [this.thirdDigit.value, this.thirdDigit.start, this.thirdDigit.end]; } incrementDate(dateVal, whatToIncrement) { let year = this.dateAdapter.getYear(dateVal); let month = this.dateAdapter.getMonth(dateVal); let day = this.dateAdapter.getDate(dateVal); switch (whatToIncrement) { case DateParts.day: day++; if (day > this.dateAdapter.getNumDaysInMonth(dateVal)) { day = 1; } break; case DateParts.month: month++; // tslint:disable-next-line:no-magic-numbers if (month > 11) { month = 0; } const lastDay = this.getLastDayFor(year, month); if (day > lastDay) { day = lastDay; } break; case DateParts.year: year++; if (year > MAX_YEAR) { year = 1; } break; default: } return this.createDate(year, month, day); } getLastDayFor(year, month) { return this.dateAdapter.getNumDaysInMonth(this.createDate(year, month, 1)); } decrementDate(dateVal, whatToDecrement) { let year = this.dateAdapter.getYear(dateVal); let month = this.dateAdapter.getMonth(dateVal); let day = this.dateAdapter.getDate(dateVal); switch (whatToDecrement) { case DateParts.day: day--; if (day < 1) { day = this.dateAdapter.getNumDaysInMonth(dateVal); } break; case DateParts.month: month--; if (month < 0) { // tslint:disable-next-line:no-magic-numbers month = 11; } const lastDay = this.getLastDayFor(year, month); if (day > lastDay) { day = lastDay; } break; case DateParts.year: year--; if (year < 1) { year = MAX_YEAR; } break; default: } return this.createDate(year, month, day); } verticalArrowKeyHandler(keyCode) { if (!this.value) { return; } let changedTime; const [modifiedTimePart, selectionStart, selectionEnd] = this.getDateEditMetrics(this.selectionStart); if (keyCode === UP_ARROW) { changedTime = this.incrementDate(this.value, modifiedTimePart); } if (keyCode === DOWN_ARROW) { changedTime = this.decrementDate(this.value, modifiedTimePart); } this.value = changedTime; this.selectionStart = selectionStart; this.selectionEnd = selectionEnd; this.cvaOnChange(changedTime); this.onChange(); this.stateChanges.next(); } changeCaretPosition(keyCode) { if (!this.value) { return; } let cursorPos = this.selectionStart; if ([HOME, PAGE_UP].includes(keyCode)) { cursorPos = 0; } else if ([END, PAGE_DOWN].includes(keyCode)) { cursorPos = this.viewValue.length; } else if (keyCode === LEFT_ARROW) { cursorPos = cursorPos === 0 ? this.viewValue.length : cursorPos - 1; } else if (keyCode === RIGHT_ARROW) { const nextSeparatorPos = this.viewValue.indexOf(this.separator, cursorPos); cursorPos = nextSeparatorPos ? nextSeparatorPos + 1 : 0; } this.selectDigitByCursor(cursorPos); } selectDigitByCursor(cursorPos) { setTimeout(() => { const [, selectionStart, selectionEnd] = this.getDateEditMetrics(cursorPos); this.selectionStart = selectionStart; this.selectionEnd = selectionEnd; }); } selectNextDigitByCursor(cursorPos) { setTimeout(() => { const [, , endPositionOfCurrentDigit] = this.getDateEditMetrics(cursorPos); const [, selectionStart, selectionEnd] = this.getDateEditMetrics(endPositionOfCurrentDigit + 1); this.selectionStart = selectionStart; this.selectionEnd = selectionEnd; }); } selectNextDigit(cursorPos, cycle = false) { setTimeout(() => { const lastValue = cycle ? 0 : cursorPos; const nextSeparatorPos = this.viewValue.indexOf(this.separator, cursorPos); const newCursorPos = nextSeparatorPos > 0 ? nextSeparatorPos + 1 : lastValue; const [, selectionStart, selectionEnd] = this.getDateEditMetrics(newCursorPos); this.selectionStart = selectionStart; this.selectionEnd = selectionEnd; }); } /** Checks whether the input is invalid based on the native validation. */ isBadInput() { const validity = this.elementRef.nativeElement.validity; return validity && validity.badInput; } /** Formats a value and sets it on the input element. */ formatValue(value) { const formattedValue = value ? this.dateAdapter.format(value, this.dateFormats.dateInput) : ''; this.setViewValue(formattedValue); } /** * @param obj The object to check. * @returns The given object if it is both a date instance and valid, otherwise null. */ getValidDateOrNull(obj) { return (this.dateAdapter.isDateInstance(obj) && this.dateAdapter.isValid(obj)) ? obj : null; } setControl(control) { if (!this.control) { this.control = control; } } getDigitPositions(format) { const formatInLowerCase = format.toLowerCase(); formatInLowerCase .split('') .reduce(({ prev, length, start }, value, index, arr) => { if (value === this.separator || (arr.length - 1) === index) { if (!this.firstDigit) { this.firstDigit = new DateDigit(prev, start, length); } else if (!this.secondDigit) { this.secondDigit = new DateDigit(prev, start, length); } else if (!this.thirdDigit) { this.thirdDigit = new DateDigit(prev, start, arr.length - start); } // tslint:disable:no-parameter-reassignment length = 0; start = index + 1; } else { length++; } return { prev: value, length, start }; }, { length: 0, start: 0 }); if (!this.firstDigit || !this.secondDigit || !this.thirdDigit) { Error(`Can' t use this format: ${format}`); } } createDate(year, month, day) { return this.dateAdapter.createDateTime(year, month, day, this.dateAdapter.getHours(this.value), this.dateAdapter.getMinutes(this.value), this.dateAdapter.getSeconds(this.value), this.dateAdapter.getMilliseconds(this.value)); } correctCursorPosition() { if (this.selectionStart && this.separatorPositions.includes(this.selectionStart)) { this.selectionStart = this.selectionStart - 1; } } } /** @nocollapse */ McDatepickerInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: McDatepickerInput, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DateAdapter, optional: true }, { token: MC_DATE_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); /** @nocollapse */ McDatepickerInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.5", type: McDatepickerInput, selector: "input[mcDatepicker]", inputs: { placeholder: "placeholder", required: "required", mcDatepicker: "mcDatepicker", mcDatepickerFilter: "mcDatepickerFilter", value: "value", min: "min", max: "max", disabled: "disabled", id: "id", mcValidationTooltip: "mcValidationTooltip" }, outputs: { incorrectInput: "incorrectInput", dateChange: "dateChange", dateInput: "dateInput" }, host: { listeners: { "paste": "onPaste($event)", "change": "onChange()", "focus": "focusChanged(true)", "blur": "onBlur()", "keydown": "onKeyDown($event)" }, properties: { "attr.placeholder": "placeholder", "attr.required": "required", "attr.disabled": "disabled || null", "attr.min": "min ? toISO8601(min) : null", "attr.max": "max ? toISO8601(max) : null", "attr.autocomplete": "\"off\"" }, classAttribute: "mc-input mc-datepicker" }, providers: [ MC_DATEPICKER_VALUE_ACCESSOR, MC_DATEPICKER_VALIDATORS, { provide: McFormFieldControl, useExisting: McDatepickerInput } ], exportAs: ["mcDatepickerInput"], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: McDatepickerInput, decorators: [{ type: Directive, args: [{ selector: 'input[mcDatepicker]', exportAs: 'mcDatepickerInput', providers: [ MC_DATEPICKER_VALUE_ACCESSOR, MC_DATEPICKER_VALIDATORS, { provide: McFormFieldControl, useExisting: McDatepickerInput } ], host: { class: 'mc-input mc-datepicker', '[attr.placeholder]': 'placeholder', '[attr.required]': 'required', '[attr.disabled]': 'disabled || null', '[attr.min]': 'min ? toISO8601(min) : null', '[attr.max]': 'max ? toISO8601(max) : null', '[attr.autocomplete]': '"off"', '(paste)': 'onPaste($event)', '(change)': 'onChange()', '(focus)': 'focusChanged(true)', '(blur)': 'onBlur()', '(keydown)': 'onKeyDown($event)' } }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DateAdapter, decorators: [{ type: Optional }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MC_DATE_FORMATS] }] }]; }, propDecorators: { placeholder: [{ type: Input }], required: [{ type: Input }], mcDatepicker: [{ type: Input }], mcDatepickerFilter: [{ type: Input }], value: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], disabled: [{ type: Input }], id: [{ type: Input }], mcValidationTooltip: [{ type: Input }], incorrectInput: [{ type: Output }], dateChange: [{ type: Output }], dateInput: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9tb3NhaWMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBRWQsMEJBQTBCO0FBQzFCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0gsYUFBYSxFQUNiLGlCQUFpQixFQUlqQixVQUFVLEVBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBaUIsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RixPQUFPLEVBR0gsUUFBUSxFQUNSLFdBQVcsRUFDWCxVQUFVLEVBQ1YsVUFBVSxFQUNWLEdBQUcsRUFDSCxTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sRUFDUCxLQUFLLEVBQ0wsR0FBRyxFQUNILE1BQU0sRUFDTixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLFdBQVcsRUFDWCxrQkFBa0IsRUFDckIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFB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