UNPKG

ontimize-web-ngx

Version:
375 lines 65.6 kB
import { __decorate, __metadata } from "tslib"; import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; import { Component, ElementRef, forwardRef, Inject, Injector, Optional, ViewChild } from '@angular/core'; import { MediaObserver } from '@angular/flex-layout'; import { FormGroup } from '@angular/forms'; import { DateAdapter, MAT_DATE_LOCALE } from '@angular/material/core'; import { MatDateRangeInput, MatDateRangePicker } from '@angular/material/datepicker'; import moment from 'moment'; import { BooleanInputConverter } from '../../../decorators/input-converter'; import { MomentService } from '../../../services/moment.service'; import { OntimizeMomentDateAdapter } from '../../../shared'; import { SQLTypes } from '../../../util/sqltypes'; import { Util } from '../../../util/util'; import { OFormValue } from '../../form/o-form-value'; import { OFormComponent } from '../../form/o-form.component'; import { DEFAULT_OUTPUTS_O_FORM_DATA_COMPONENT, OFormDataComponent } from '../../o-form-data-component.class'; import { OValueChangeEvent } from '../../o-value-change-event.class'; import { DEFAULT_INPUTS_O_DATE_INPUT } from '../date-input/o-date-input.component'; import { OFormControl } from '../o-form-control.class'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/core"; import * as i2 from "@angular/cdk/layout"; import * as i3 from "@angular/common"; import * as i4 from "@angular/flex-layout/flex"; import * as i5 from "@angular/forms"; import * as i6 from "../../../directives/o-mat-error.directive"; import * as i7 from "@angular/material/button"; import * as i8 from "@angular/material/datepicker"; import * as i9 from "@angular/material/icon"; import * as i10 from "@angular/material/form-field"; import * as i11 from "@angular/material/tooltip"; import * as i12 from "../../../pipes/o-translate.pipe"; import * as i13 from "../../form/o-form.component"; export const DEFAULT_OUTPUTS_O_DATERANGE_INPUT = [ ...DEFAULT_OUTPUTS_O_FORM_DATA_COMPONENT ]; export const DEFAULT_INPUTS_O_DATERANGE_INPUT = [ 'separator', 'olocale:locale', 'startKey', 'endKey', 'valueType: value-type', 'mode', 'placeholderStartDay: placeholder-startday', 'placeholderEndDay: placeholder-endday', ...DEFAULT_INPUTS_O_DATE_INPUT ]; export class ODateRangeInputComponent extends OFormDataComponent { get dateClass() { return this._dateClass; } set dateClass(val) { this._dateClass = val; } set oMinDate(value) { if (value) { const momentD = this.getValueAsMoment(value); if (Util.isDefined(momentD)) { this._oMinDate = this.convertToDate(value); } } } get oMinDate() { return this._oMinDate; } set oMaxDate(value) { if (value) { this._oMaxDate = this.convertToDate(value); } } get oMaxDate() { return this._oMaxDate; } get startKey() { return this._startKey; } set startKey(value) { this._startKey = value; } get endKey() { return this._endKey; } set endKey(value) { this._endKey = value; } get showClearButton() { return this.clearButton && !this.isReadOnly && this.enabled && this.getValue(); } get touchUi() { return this.oTouchUi || false; } set touchUi(val) { this.oTouchUi = val; } isMobileMode() { return this.mode === 'mobile' || (this.mode === 'auto' && this.breakpointObserver.isMatched(Breakpoints.Handset)); } isDesktopMode() { return this.mode === 'desktop' || (this.mode === 'auto' && !this.breakpointObserver.isMatched(Breakpoints.Handset)); } constructor(form, elRef, injector, momentDateAdapter, breakpointObserver) { super(form, elRef, injector); this.momentDateAdapter = momentDateAdapter; this.breakpointObserver = breakpointObserver; this.textInputEnabled = true; this.oTouchUi = false; this.mode = 'auto'; this._startKey = 'startDate'; this._endKey = 'endDate'; this._valueType = 'timestamp'; this.separator = ' - '; this.oformat = 'L'; this.placeholderStartDay = 'DATERANGE.PLACEHOLDER_STARTDATE'; this.placeholderEndDay = 'DATERANGE.PLACEHOLDER_ENDDATE'; this.momentSrv = this.injector.get(MomentService); this.media = this.injector.get(MediaObserver); this.range = new FormGroup({ [this.startKey]: new OFormControl(), [this.endKey]: new OFormControl() }); } ngOnInit() { super.ngOnInit(); this.subscribeToMediaChanges(); if (!this.olocale) { this.olocale = this.momentSrv.getLocale(); } if (this.oformat) { this.momentDateAdapter.oFormat = this.oformat; } this.momentDateAdapter.setLocale(this.olocale); this.onLanguageChangeSubscription = this.translateService.onLanguageChanged.subscribe(() => { this.momentDateAdapter.setLocale(this.translateService.getCurrentLang()); this.setValue(this.getValue()); }); } subscribeToMediaChanges() { this.mediaSubscription = this.media.asObservable().subscribe((change) => { if (['xs', 'sm'].indexOf(change[0].mqAlias) !== -1) { this.touchUi = Util.isDefined(this.oTouchUi) ? this.oTouchUi : true; } if (['md', 'lg', 'xl'].indexOf(change[0].mqAlias) !== -1) { this.touchUi = Util.isDefined(this.oTouchUi) ? this.oTouchUi : false; } }); } open() { if (!this.isReadOnly && this.enabled) { this.picker.open(); } } resolveValidators() { const validators = super.resolveValidators(); validators.push(this.rangeDateValidator.bind(this)); if (Util.isDefined(this.oMinDate)) { validators.push(this.minDateValidator.bind(this)); } if (Util.isDefined(this.oMaxDate)) { validators.push(this.maxDateValidator.bind(this)); } validators.push(this.parseDateValidator.bind(this)); return validators; } isObjectDataRangeNull(objectValue) { return objectValue !== null && objectValue.value !== null && !Util.isDefined(objectValue.value[this.startKey]) && !Util.isDefined(objectValue.value[this.endKey]); } rangeDateValidator(control) { if (control.value instanceof Object && !this.isObjectDataRangeNull(control)) { const endValue = this.getValueAsMoment(control.value[this._endKey]); const startValue = this.getValueAsMoment(control.value[this._startKey]); if (endValue.isSameOrBefore(startValue)) { return { dateRange: true }; } } return {}; } minDateValidator(control) { const mindate = moment(this.oMinDate); if ((control.value instanceof Object) && !this.isObjectDataRangeNull(control)) { const startValue = this.getValueAsMoment(control.value[this._startKey]); if (startValue.isBefore(mindate)) { return { dateRangeMin: { dateMin: mindate.format(this.oformat) } }; } } return {}; } maxDateValidator(control) { const maxdate = moment(this.oMaxDate); if ((control.value instanceof Object) && !this.isObjectDataRangeNull(control)) { const endValue = this.getValueAsMoment(control.value[this._endKey]); if (endValue.isAfter(maxdate)) { return { dateRangeMax: { dateMax: maxdate.format(this.oformat) } }; } } return {}; } parseDateValidator(control) { if ((control.value instanceof Object) && !this.isObjectDataRangeNull(control)) { const endValue = this.getValueAsMoment(control.value[this._endKey]); const startValue = this.getValueAsMoment(control.value[this._startKey]); if (!endValue.isValid() || !startValue.isValid()) { return { dateRangeParse: { format: this.oformat + this.separator + this.oformat } }; } } return {}; } set valueType(val) { this._valueType = Util.convertToODateValueType(val); } get valueType() { return this._valueType; } ngOnDestroy() { super.ngOnDestroy(); if (this.mediaSubscription) { this.mediaSubscription.unsubscribe(); } if (this.onLanguageChangeSubscription) { this.onLanguageChangeSubscription.unsubscribe(); } } setFormValue(val, options, setDirty = false) { let value = val; if (val instanceof OFormValue) { value = val.value; } this.range.setValue(this.ensureODateValueType(value), options); super.setFormValue(value, options, setDirty); } ensureODateValueType(val) { if (!Util.isDefined(val)) { return { [this.startKey]: null, [this.endKey]: null }; } let result = val; const startVal = this.convertToDate(val[this.startKey]); const endVal = this.convertToDate(val[this.endKey]); if (!Util.isDefined(result)) { console.warn(`ODateRangeInputComponent value (${val}) is not consistent with value-type (${this.valueType})`); } else { result = { [this.startKey]: startVal, [this.endKey]: endVal }; } return result; } convertToDate(val) { if (!Util.isDefined(val)) return null; switch (this.valueType) { case 'string': return typeof val === 'string' && moment(val, this.oformat).isValid() ? new Date(moment(val, this.oformat).valueOf()) : null; case 'date': return val instanceof Date ? val : null; case 'timestamp': return typeof val === 'number' ? new Date(val) : null; case 'iso-8601': if (typeof val === 'string') { return moment(val).isValid() ? new Date(moment(val).valueOf()) : null; } else if (typeof val === 'number' && this.getSQLType() === SQLTypes.TIMESTAMP) { return new Date(val); } return null; default: return null; } } onChangeEvent(event) { const dateRangeValue = this.dateRangeInput.value; if (dateRangeValue.start && dateRangeValue.end) { let value = { [this.startKey]: Util.parseByValueType(dateRangeValue.start, this.valueType, this.oformat), [this.endKey]: Util.parseByValueType(dateRangeValue.end, this.valueType, this.oformat) }; this.setValue(value, { changeType: OValueChangeEvent.USER_CHANGE, emitEvent: false, emitModelToViewChange: false }); } } onClickInput(e) { if (!this.textInputEnabled) { this.open(); } } onClickClearValue(event) { super.onClickClearValue(event); this.range.setValue({ [this.startKey]: null, [this.endKey]: null }); this.markFormGroupTouched(); } markFormGroupTouched() { Object.keys(this.range.controls).forEach((key) => { const control = this.range.get(key); control?.markAsTouched(); }); } getValueAsMoment(val) { if (!Util.isDefined(val)) { return val; } let result; switch (true) { case this.valueType === 'string' && typeof val === 'string': result = moment(val, this.oformat); break; case this.valueType === 'date' && val instanceof Date: case this.valueType === 'timestamp' && typeof val === 'number': case this.valueType === 'iso-8601' && typeof val === 'string': result = moment(val); break; case this.valueType === 'iso-8601': if (typeof val !== 'string') { const acceptTimestamp = typeof val === 'number' && this.getSQLType() === SQLTypes.TIMESTAMP; if (acceptTimestamp) { result = moment(val); } } break; default: break; } return Util.isDefined(result) && result.isValid() ? result : undefined; } } ODateRangeInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODateRangeInputComponent, deps: [{ token: forwardRef(() => OFormComponent), optional: true }, { token: i0.ElementRef }, { token: i0.Injector }, { token: i1.DateAdapter }, { token: i2.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); ODateRangeInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ODateRangeInputComponent, selector: "o-daterange-input", inputs: { separator: "separator", olocale: ["locale", "olocale"], startKey: "startKey", endKey: "endKey", valueType: ["value-type", "valueType"], mode: "mode", placeholderStartDay: ["placeholder-startday", "placeholderStartDay"], placeholderEndDay: ["placeholder-endday", "placeholderEndDay"], oformat: ["format", "oformat"], oStartView: ["start-view", "oStartView"], oMinDate: ["min", "oMinDate"], oMaxDate: ["max", "oMaxDate"], oTouchUi: ["touch-ui", "oTouchUi"], oStartAt: ["start-at", "oStartAt"], filterDate: ["filter-date", "filterDate"], textInputEnabled: ["text-input-enabled", "textInputEnabled"], dateClass: ["date-class", "dateClass"] }, outputs: { onChange: "onChange", onValueChange: "onValueChange", onFocus: "onFocus", onBlur: "onBlur" }, providers: [ { provide: DateAdapter, useClass: OntimizeMomentDateAdapter, deps: [MAT_DATE_LOCALE] } ], viewQueries: [{ propertyName: "picker", first: true, predicate: ["picker"], descendants: true, static: true }, { propertyName: "dateRangeInput", first: true, predicate: ["dateRangeInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" [formGroup]=\"getFormGroup()\" [matTooltip]=\"tooltip\" [matTooltipClass]=\"tooltipClass\"\n [matTooltipPosition]=\"tooltipPosition\" [matTooltipShowDelay]=\"tooltipShowDelay\" [matTooltipHideDelay]=\"tooltipHideDelay\">\n\n <mat-form-field [appearance]=\"appearance\" [floatLabel]=\"floatLabel\" [hideRequiredMarker]=\"hideRequiredMarker\" [class.custom-width]=\"hasCustomWidth\"\n class=\"icon-field\" fxFlexFill [subscriptSizing]=\"subscriptSizing\">\n <mat-label *ngIf=\"labelVisible\">{{ olabel | oTranslate }}</mat-label>\n <mat-date-range-input #dateRangeInput [rangePicker]=\"picker\" [id]=\"getAttribute()\" [formGroup]=\"range\" [separator]=\"separator\"\n [required]=\"isRequired\" [min]=\"oMinDate\" [max]=\"oMaxDate\" (focus)=\"innerOnFocus($event)\" (blur)=\"innerOnBlur($event)\">\n <input #startDate matStartDate placeholder=\"{{ placeholderStartDay | oTranslate }}\" [value]=\"startDateValue\"\n [formControlName]=\"startKey\" (dateChange)=\"onChangeEvent($event)\" [readonly]=\"isReadOnly || !textInputEnabled\" (focus)=\"innerOnFocus($event)\"\n (blur)=\"innerOnBlur($event)\" [required]=\"isRequired\">\n <input #endDate matEndDate placeholder=\"{{ placeholderEndDay | oTranslate }}\" [value]=\"endDateValue\" [formControlName]=\"endKey\"\n (dateChange)=\"onChangeEvent($event)\" [readonly]=\"isReadOnly || !textInputEnabled\" (focus)=\"innerOnFocus($event)\" (blur)=\"innerOnBlur($event)\"\n [required]=\"isRequired\">\n </mat-date-range-input>\n\n <button type=\"button\" *ngIf=\"showClearButton\" matSuffix mat-icon-button (click)=\"onClickClearValue($event)\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\" [disabled]=\"isReadOnly || !enabled\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker [disabled]=\"isReadOnly || !enabled\" [class.read-only]=\"isReadOnly\" [touchUi]=\"touchUi\" [dateClass]=\"dateClass\"></mat-date-range-picker>\n\n <mat-error *oMatError=\"hasError('required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRange')\">\n {{ 'FORM_VALIDATION.DATERANGE_INVALID' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeParse')\">\n {{ 'FORM_VALIDATION.DATE_PARSE' | oTranslate }} : {{ getErrorValue('dateRangeParse', 'format') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeMin')\">\n {{ 'FORM_VALIDATION.DATERANGE_MIN' | oTranslate }} : {{ getErrorValue('dateRangeMin', 'dateMin') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeMax')\">\n {{ 'FORM_VALIDATION.DATERANGE_MAX' | oTranslate }} : {{ getErrorValue('dateRangeMax', 'dateMax') }}\n </mat-error>\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ oError.text | oTranslate }}\n </mat-error>\n </mat-form-field>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i4.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i6.OMatErrorDirective, selector: "[oMatError]", inputs: ["oMatError"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i8.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i8.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i8.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i8.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i12.OTranslatePipe, name: "oTranslate" }] }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], ODateRangeInputComponent.prototype, "textInputEnabled", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], ODateRangeInputComponent.prototype, "oTouchUi", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODateRangeInputComponent, decorators: [{ type: Component, args: [{ selector: 'o-daterange-input', outputs: DEFAULT_OUTPUTS_O_DATERANGE_INPUT, inputs: DEFAULT_INPUTS_O_DATERANGE_INPUT, providers: [ { provide: DateAdapter, useClass: OntimizeMomentDateAdapter, deps: [MAT_DATE_LOCALE] } ], template: "<div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" [formGroup]=\"getFormGroup()\" [matTooltip]=\"tooltip\" [matTooltipClass]=\"tooltipClass\"\n [matTooltipPosition]=\"tooltipPosition\" [matTooltipShowDelay]=\"tooltipShowDelay\" [matTooltipHideDelay]=\"tooltipHideDelay\">\n\n <mat-form-field [appearance]=\"appearance\" [floatLabel]=\"floatLabel\" [hideRequiredMarker]=\"hideRequiredMarker\" [class.custom-width]=\"hasCustomWidth\"\n class=\"icon-field\" fxFlexFill [subscriptSizing]=\"subscriptSizing\">\n <mat-label *ngIf=\"labelVisible\">{{ olabel | oTranslate }}</mat-label>\n <mat-date-range-input #dateRangeInput [rangePicker]=\"picker\" [id]=\"getAttribute()\" [formGroup]=\"range\" [separator]=\"separator\"\n [required]=\"isRequired\" [min]=\"oMinDate\" [max]=\"oMaxDate\" (focus)=\"innerOnFocus($event)\" (blur)=\"innerOnBlur($event)\">\n <input #startDate matStartDate placeholder=\"{{ placeholderStartDay | oTranslate }}\" [value]=\"startDateValue\"\n [formControlName]=\"startKey\" (dateChange)=\"onChangeEvent($event)\" [readonly]=\"isReadOnly || !textInputEnabled\" (focus)=\"innerOnFocus($event)\"\n (blur)=\"innerOnBlur($event)\" [required]=\"isRequired\">\n <input #endDate matEndDate placeholder=\"{{ placeholderEndDay | oTranslate }}\" [value]=\"endDateValue\" [formControlName]=\"endKey\"\n (dateChange)=\"onChangeEvent($event)\" [readonly]=\"isReadOnly || !textInputEnabled\" (focus)=\"innerOnFocus($event)\" (blur)=\"innerOnBlur($event)\"\n [required]=\"isRequired\">\n </mat-date-range-input>\n\n <button type=\"button\" *ngIf=\"showClearButton\" matSuffix mat-icon-button (click)=\"onClickClearValue($event)\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\" [disabled]=\"isReadOnly || !enabled\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker [disabled]=\"isReadOnly || !enabled\" [class.read-only]=\"isReadOnly\" [touchUi]=\"touchUi\" [dateClass]=\"dateClass\"></mat-date-range-picker>\n\n <mat-error *oMatError=\"hasError('required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRange')\">\n {{ 'FORM_VALIDATION.DATERANGE_INVALID' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeParse')\">\n {{ 'FORM_VALIDATION.DATE_PARSE' | oTranslate }} : {{ getErrorValue('dateRangeParse', 'format') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeMin')\">\n {{ 'FORM_VALIDATION.DATERANGE_MIN' | oTranslate }} : {{ getErrorValue('dateRangeMin', 'dateMin') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeMax')\">\n {{ 'FORM_VALIDATION.DATERANGE_MAX' | oTranslate }} : {{ getErrorValue('dateRangeMax', 'dateMax') }}\n </mat-error>\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ oError.text | oTranslate }}\n </mat-error>\n </mat-form-field>\n</div>\n" }] }], ctorParameters: function () { return [{ type: i13.OFormComponent, decorators: [{ type: Optional }, { type: Inject, args: [forwardRef(() => OFormComponent)] }] }, { type: i0.ElementRef }, { type: i0.Injector }, { type: i1.DateAdapter }, { type: i2.BreakpointObserver }]; }, propDecorators: { picker: [{ type: ViewChild, args: ['picker', { static: true }] }], textInputEnabled: [], oTouchUi: [], dateRangeInput: [{ type: ViewChild, args: ['dateRangeInput'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1kYXRlcmFuZ2UtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvZGF0ZS1yYW5nZS9vLWRhdGVyYW5nZS1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy9pbnB1dC9kYXRlLXJhbmdlL28tZGF0ZXJhbmdlLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXFCLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFlLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQXFELE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQXNDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekgsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQs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QWUsRUFBRTt3QkFDbkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtxQkFDckI7aUJBQ0Y7Z0JBQ0QsTUFBTTtZQUNSO2dCQUNFLE1BQU07U0FDVDtRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ3hFLENBQUM7O3NIQXZYVSx3QkFBd0Isa0JBd0diLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7MEdBeEczQyx3QkFBd0IsOHhCQUp4QjtRQUNULEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUU7S0FDdkYsb1FDL0NILDA5RkEwQ0E7QURZRTtJQUFDLHFCQUFxQixFQUFFOztrRUFDZ0I7QUFFeEM7SUFBQyxxQkFBcUIsRUFBRTs7MERBQ1M7NEZBVHRCLHdCQUF3QjtrQkFUcEMsU0FBUzsrQkFDRSxtQkFBbUIsV0FFcEIsaUNBQWlDLFVBQ2xDLGdDQUFnQyxhQUM3Qjt3QkFDVCxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLHlCQUF5QixFQUFFLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFO3FCQUN2Rjs7MEJBMEdFLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQzt1SkFyR3RELE1BQU07c0JBREwsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk5QixnQkFBZ0IsTUFHaEIsUUFBUSxNQUdmLGNBQWM7c0JBRGIsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIsIEJyZWFrcG9pbnRzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGZvcndhcmRSZWYsIEluamVjdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZWRpYUNoYW5nZSwgTWVkaWFPYnNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2ZsZXgtbGF5b3V0JztcbmltcG9ydCB7IEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBNQVRfREFURV9MT0NBTEUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IERhdGVSYW5nZSwgTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQsIE1hdERhdGVSYW5nZUlucHV0LCBNYXREYXRlUmFuZ2VQaWNrZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBNb21lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT250aW1pemVNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvZm9ybS12YWx1ZS1vcHRpb25zLnR5cGUnO1xuaW1wb3J0IHsgT0RhdGVWYWx1ZVR5cGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9vLWRhdGUtdmFsdWUudHlwZSc7XG5pbXBvcnQgeyBTUUxUeXBlcyB9IGZyb20gJy4uLy4uLy4uL3V0aWwvc3FsdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybVZhbHVlIH0gZnJvbSAnLi4vLi4vZm9ybS9vLWZvcm0tdmFsdWUnO1xuaW1wb3J0IHsgT0Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9mb3JtL28tZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgREVGQVVMVF9PVVRQVVRTX09fRk9STV9EQVRBX0NPTVBPTkVOVCwgT0Zvcm1EYXRhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vby1mb3JtLWRhdGEtY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IE9WYWx1ZUNoYW5nZUV2ZW50IH0gZnJvbSAnLi4vLi4vby12YWx1ZS1jaGFuZ2UtZXZlbnQuY2xhc3MnO1xuaW1wb3J0IHsgREVGQVVMVF9JTlBVVFNfT19EQVRFX0lOUFVUIH0gZnJvbSAnLi4vZGF0ZS1pbnB1dC9vLWRhdGUtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29udHJvbCB9IGZyb20gJy4uL28tZm9ybS1jb250cm9sLmNsYXNzJztcbmltcG9ydCB7IERhdGVDdXN0b21DbGFzc0Z1bmN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvZGF0ZS1jdXN0b20tY2xhc3MudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19EQVRFUkFOR0VfSU5QVVQgPSBbXG4gIC4uLkRFRkFVTFRfT1VUUFVUU19PX0ZPUk1fREFUQV9DT01QT05FTlRcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX0RBVEVSQU5HRV9JTlBVVCA9IFtcbiAgJ3NlcGFyYXRvcicsXG4gICdvbG9jYWxlOmxvY2FsZScsXG4gICdzdGFydEtleScsXG4gICdlbmRLZXknLFxuICAndmFsdWVUeXBlOiB2YWx1ZS10eXBlJyxcbiAgJ21vZGUnLFxuICAncGxhY2Vob2xkZXJTdGFydERheTogcGxhY2Vob2xkZXItc3RhcnRkYXknLFxuICAncGxhY2Vob2xkZXJFbmREYXk6IHBsYWNlaG9sZGVyLWVuZGRheScsXG4gIC4uLkRFRkFVTFRfSU5QVVRTX09fREFURV9JTlBVVFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby1kYXRlcmFuZ2UtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vby1kYXRlcmFuZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBvdXRwdXRzOiBERUZBVUxUX09VVFBVVFNfT19EQVRFUkFOR0VfSU5QVVQsXG4gIGlucHV0czogREVGQVVMVF9JTlBVVFNfT19EQVRFUkFOR0VfSU5QVVQsXG4gIHByb3ZpZGVyczogW1xuICAgIHsgcHJvdmlkZTogRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBPbnRpbWl6ZU1vbWVudERhdGVBZGFwdGVyLCBkZXBzOiBbTUFUX0RBVEVfTE9DQUxFXSB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgT0RhdGVSYW5nZUlucHV0Q29tcG9uZW50IGV4dGVuZHMgT0Zvcm1EYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xuXG4gIEBWaWV3Q2hpbGQoJ3BpY2tlcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHBpY2tlciE6IE1hdERhdGVSYW5nZVBpY2tlcjxEYXRlPjtcblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIHRleHRJbnB1dEVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwdWJsaWMgb1RvdWNoVWk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdkYXRlUmFuZ2VJbnB1dCcpXG4gIGRhdGVSYW5nZUlucHV0OiBNYXREYXRlUmFuZ2VJbnB1dDxEYXRlPjtcblxuICBwdWJsaWMgbW9kZTogJ21vYmlsZScgfCAnZGVza3RvcCcgfCAnYXV0bycgPSAnYXV0byc7XG5cbiAgc3RhcnREYXRlVmFsdWU6IERhdGU7XG4gIGVuZERhdGVWYWx1ZTogRGF0ZTtcblxuICByYW5nZTogRm9ybUdyb3VwPHsgW3g6IHN0cmluZ106IE9Gb3JtQ29udHJvbDsgfT5cblxuICBwcm90ZWN0ZWQgX2RhdGVDbGFzczogRGF0ZUN1c3RvbUNsYXNzRnVuY3Rpb25cbiAgZ2V0IGRhdGVDbGFzcygpOiBEYXRlQ3VzdG9tQ2xhc3NGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVDbGFzcztcbiAgfVxuXG4gIHNldCBkYXRlQ2xhc3ModmFsOiBEYXRlQ3VzdG9tQ2xhc3NGdW5jdGlvbikge1xuICAgIHRoaXMuX2RhdGVDbGFzcyA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb01pbkRhdGU6IERhdGU7XG4gIHNldCBvTWluRGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjb25zdCBtb21lbnREID0gdGhpcy5nZXRWYWx1ZUFzTW9tZW50KHZhbHVlKVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG1vbWVudEQpKSB7XG4gICAgICAgIHRoaXMuX29NaW5EYXRlID0gdGhpcy5jb252ZXJ0VG9EYXRlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0IG9NaW5EYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9vTWluRGF0ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb01heERhdGU6IERhdGU7XG4gIHNldCBvTWF4RGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9vTWF4RGF0ZSA9IHRoaXMuY29udmVydFRvRGF0ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIGdldCBvTWF4RGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fb01heERhdGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3N0YXJ0S2V5OiBzdHJpbmcgPSAnc3RhcnREYXRlJztcbiAgZ2V0IHN0YXJ0S2V5KCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFydEtleTtcbiAgfVxuICBzZXQgc3RhcnRLZXkodmFsdWUpIHtcbiAgICB0aGlzLl9zdGFydEtleSA9IHZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9lbmRLZXk6IHN0cmluZyA9ICdlbmREYXRlJztcbiAgZ2V0IGVuZEtleSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5kS2V5O1xuICB9XG4gIHNldCBlbmRLZXkodmFsdWUpIHtcbiAgICB0aGlzLl9lbmRLZXkgPSB2YWx1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfdmFsdWVUeXBlOiBPRGF0ZVZhbHVlVHlwZSA9ICd0aW1lc3RhbXAnO1xuXG4gIHB1YmxpYyBzZXBhcmF0b3IgPSAnIC0gJztcblxuICBnZXQgc2hvd0NsZWFyQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsZWFyQnV0dG9uICYmICF0aGlzLmlzUmVhZE9ubHkgJiYgdGhpcy5lbmFibGVkICYmIHRoaXMuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCB0b3VjaFVpKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9Ub3VjaFVpIHx8IGZhbHNlO1xuICB9XG5cbiAgc2V0IHRvdWNoVWkodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5vVG91Y2hVaSA9IHZhbDtcbiAgfVxuXG4gIGlzTW9iaWxlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnbW9iaWxlJyB8fCAodGhpcy5tb2RlID09PSAnYXV0bycgJiYgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXIuaXNNYXRjaGVkKEJyZWFrcG9pbnRzLkhhbmRzZXQpKVxuICB9XG5cbiAgaXNEZXNrdG9wTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZGVza3RvcCcgfHwgKHRoaXMubW9kZSA9PT0gJ2F1dG8nICYmICF0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5pc01hdGNoZWQoQnJlYWtwb2ludHMuSGFuZHNldCkpXG4gIH1cblxuICBwdWJsaWMgb2Zvcm1hdDogc3RyaW5nID0gJ0wnO1xuXG4gIHByb3RlY3RlZCBvbG9jYWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgbW9tZW50U3J2OiBNb21lbnRTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgbWVkaWE6IE1lZGlhT2JzZXJ2ZXI7XG4gIHByb3RlY3RlZCBtZWRpYVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgb25MYW5ndWFnZUNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHB1YmxpYyBwbGFjZWhvbGRlclN0YXJ0RGF5ID0gJ0RBVEVSQU5HRS5QTEFDRUhPTERFUl9TVEFSVERBVEUnO1xuICBwdWJsaWMgcGxhY2Vob2xkZXJFbmREYXkgPSAnREFURVJBTkdFLlBMQUN