i-tech-shared-components 1.1.44 → 1.1.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,6 +20,7 @@ export class DateRangeDatepickerComponent {
20
20
  this.resetForm = new EventEmitter();
21
21
  this.selectionChange = new EventEmitter();
22
22
  this.isOpen = false;
23
+ this.isSelectingRange = false;
23
24
  this.dateRangeForm = new UntypedFormGroup({
24
25
  startDate: new UntypedFormControl('', [Validators.maxLength(10)]),
25
26
  endDate: new UntypedFormControl('', [Validators.maxLength(10)]),
@@ -63,7 +64,28 @@ export class DateRangeDatepickerComponent {
63
64
  }, 120);
64
65
  }
65
66
  setDate(value, element) {
66
- this.selectionChange.emit(value);
67
+ const startDate = value[0];
68
+ const endDate = value[1];
69
+ // If this is the start date being selected (matStartDate input)
70
+ if (element === this.min?.nativeElement) {
71
+ // We're starting a new selection process
72
+ this.isSelectingRange = true;
73
+ // Don't emit any event yet
74
+ }
75
+ // If this is the end date being selected (matEndDate input)
76
+ else if (element === this.max?.nativeElement) {
77
+ // We're completing a selection
78
+ this.isSelectingRange = false;
79
+ // Only emit when we have both dates
80
+ if (startDate && endDate) {
81
+ this.selectionChange.emit(value);
82
+ }
83
+ }
84
+ // Handle clear operation (both null)
85
+ else if (startDate === null && endDate === null) {
86
+ this.isSelectingRange = false;
87
+ this.selectionChange.emit(value);
88
+ }
67
89
  element.blur();
68
90
  }
69
91
  keyEventHandler(event, value, element) {
@@ -72,7 +94,7 @@ export class DateRangeDatepickerComponent {
72
94
  }
73
95
  }
74
96
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangeDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
75
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateRangeDatepickerComponent, isStandalone: true, selector: "i-tech-mat-range-datepicker", inputs: { label: "label", placeholder: "placeholder", value: "value", defaultValue: "defaultValue", key: "key", submit: "submit", clearValue: "clearValue", errorMessage: "errorMessage", onePlaceholder: "onePlaceholder", hintText: "hintText" }, outputs: { resetForm: "resetForm", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "min", first: true, predicate: ["min"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex_column relative mat-date-range-input\"\n [formGroup]=\"dateRangeForm\"\n>\n <div class=\"w-100\" *ngIf=\"label\">\n <mat-label>\n {{ (label || '') | translate }}\n </mat-label>\n </div>\n <mat-form-field appearance=\"outline\" [ngClass]=\"{'opened_calendar': isOpen}\">\n <mat-date-range-input [rangePicker]=\"picker\">\n <input formControlName=\"startDate\"\n [placeholder]=\" (placeholder ? placeholder[0] : 'Start Date')\"\n [title]=\"key ? key.title : 'Date'\"\n [attr.data-accessKey]=\"key ? key.start : 'minStartDate'\"\n [attr.data-parentKey]=\"key ? (key.start + '_' + key.end) : 'minStartDate_maxEndDate'\"\n matStartDate #min\n dateMask\n [errorStateMatcher]=\"customErrorStateMatcher\"\n [rangeFormControl]=\"dateRangeForm.controls['startDate']\"\n (keydown)=\"keyEventHandler($event,[min.value, max.value || null],min)\"\n (dateChange)=\"setDate([min.value, max.value || null],min)\">\n <input formControlName=\"endDate\"\n [placeholder]=\"(placeholder ? placeholder[1] : 'End Date')\"\n [title]=\"key ? key.title : 'Date'\"\n [attr.data-accessKey]=\"key ? key.end : 'maxEndDate'\"\n [attr.data-parentKey]=\"key ? (key.start + '_' + key.end) : 'minStartDate_maxEndDate'\"\n matEndDate #max\n dateMask\n [errorStateMatcher]=\"customErrorStateMatcher\"\n [rangeFormControl]=\"dateRangeForm.controls['endDate']\"\n (keydown)=\"keyEventHandler($event,[min.value, max.value || null],max)\"\n (dateChange)=\"setDate([min.value, max.value || null],max)\">\n </mat-date-range-input>\n <i-tech-icon-button matSuffix\n [iconName]=\"'cancel'\"\n (buttonClick)=\"selectionChange.emit([null, null])\"\n class=\"default-form-icon-color\"\n *ngIf=\"dateRangeForm.get('startDate')?.value && this.dateRangeForm.get('endDate')?.value\"\n ></i-tech-icon-button>\n <i-tech-icon-button\n matSuffix\n [iconName]=\"'date_range'\"\n (buttonClick)=\"picker.open()\"\n class=\"default-form-icon-color\"\n ></i-tech-icon-button>\n <mat-date-range-picker\n #picker\n (closed)=\"isOpen = false;clickForFocusOut()\"\n (opened)=\"isOpen = true\"\n ></mat-date-range-picker>\n <mat-hint *ngIf=\"hintText && !errorMessage\">{{ hintText }}</mat-hint>\n </mat-form-field>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i3.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i3.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i3.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "component", type: IconButtonComponent, selector: "i-tech-icon-button", inputs: ["size", "type", "iconSvg", "iconName", "tooltip", "disabled"], outputs: ["buttonClick"] }, { kind: "directive", type: DateMaskDirective, selector: "[dateMask]", inputs: ["maskType", "matDatepicker", "rangeFormControl"] }] }); }
97
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateRangeDatepickerComponent, isStandalone: true, selector: "i-tech-mat-range-datepicker", inputs: { label: "label", placeholder: "placeholder", value: "value", defaultValue: "defaultValue", key: "key", submit: "submit", clearValue: "clearValue", errorMessage: "errorMessage", onePlaceholder: "onePlaceholder", hintText: "hintText" }, outputs: { resetForm: "resetForm", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "min", first: true, predicate: ["min"], descendants: true }, { propertyName: "max", first: true, predicate: ["max"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex_column relative mat-date-range-input\"\n [formGroup]=\"dateRangeForm\"\n>\n <div class=\"w-100\" *ngIf=\"label\">\n <mat-label>\n {{ (label || '') | translate }}\n </mat-label>\n </div>\n <mat-form-field appearance=\"outline\" [ngClass]=\"{'opened_calendar': isOpen}\">\n <mat-date-range-input [rangePicker]=\"picker\">\n <input formControlName=\"startDate\"\n [placeholder]=\" (placeholder ? placeholder[0] : 'Start Date')\"\n [title]=\"key ? key.title : 'Date'\"\n [attr.data-accessKey]=\"key ? key.start : 'minStartDate'\"\n [attr.data-parentKey]=\"key ? (key.start + '_' + key.end) : 'minStartDate_maxEndDate'\"\n matStartDate #min\n dateMask\n [errorStateMatcher]=\"customErrorStateMatcher\"\n [rangeFormControl]=\"dateRangeForm.controls['startDate']\"\n (keydown)=\"keyEventHandler($event,[min.value, max.value || null],min)\"\n (dateChange)=\"setDate([min.value, max.value || null],min)\">\n <input formControlName=\"endDate\"\n [placeholder]=\"(placeholder ? placeholder[1] : 'End Date')\"\n [title]=\"key ? key.title : 'Date'\"\n [attr.data-accessKey]=\"key ? key.end : 'maxEndDate'\"\n [attr.data-parentKey]=\"key ? (key.start + '_' + key.end) : 'minStartDate_maxEndDate'\"\n matEndDate #max\n dateMask\n [errorStateMatcher]=\"customErrorStateMatcher\"\n [rangeFormControl]=\"dateRangeForm.controls['endDate']\"\n (keydown)=\"keyEventHandler($event,[min.value, max.value || null],max)\"\n (dateChange)=\"setDate([min.value, max.value || null],max)\">\n </mat-date-range-input>\n <i-tech-icon-button matSuffix\n [iconName]=\"'cancel'\"\n (buttonClick)=\"selectionChange.emit([null, null])\"\n class=\"default-form-icon-color\"\n *ngIf=\"dateRangeForm.get('startDate')?.value && this.dateRangeForm.get('endDate')?.value\"\n ></i-tech-icon-button>\n <i-tech-icon-button\n matSuffix\n [iconName]=\"'date_range'\"\n (buttonClick)=\"picker.open()\"\n class=\"default-form-icon-color\"\n ></i-tech-icon-button>\n <mat-date-range-picker\n #picker\n (closed)=\"isOpen = false;clickForFocusOut()\"\n (opened)=\"isOpen = true\"\n ></mat-date-range-picker>\n <mat-hint *ngIf=\"hintText && !errorMessage\">{{ hintText }}</mat-hint>\n </mat-form-field>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i3.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i3.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i3.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "component", type: IconButtonComponent, selector: "i-tech-icon-button", inputs: ["size", "type", "iconSvg", "iconName", "tooltip", "disabled"], outputs: ["buttonClick"] }, { kind: "directive", type: DateMaskDirective, selector: "[dateMask]", inputs: ["maskType", "matDatepicker", "rangeFormControl"] }] }); }
76
98
  }
77
99
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangeDatepickerComponent, decorators: [{
78
100
  type: Component,
@@ -114,5 +136,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
114
136
  }], min: [{
115
137
  type: ViewChild,
116
138
  args: ['min']
139
+ }], max: [{
140
+ type: ViewChild,
141
+ args: ['max']
117
142
  }] } });
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXJhbmdlLWRhdGVwaWNrZXIvZGF0ZS1yYW5nZS1kYXRlcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXJhbmdlLWRhdGVwaWNrZXIvZGF0ZS1yYW5nZS1kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7OztBQWV6RSxNQUFNLE9BQU8sNEJBQTRCO0lBYnpDO1FBbUJXLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsRUFBRSxD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SyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBQyxPQUFPLENBQUMsQ0FBQTtRQUM3QixDQUFDO0lBQ0gsQ0FBQzsrR0F2RVUsNEJBQTRCO21HQUE1Qiw0QkFBNEIsd2xCQy9CekMsNGlGQXFEQSwyQ0QvQkksa0JBQWtCLG1nQkFDbEIsbUJBQW1CLG0yQkFDbkIsbUJBQW1CLGtuQkFDbkIsT0FBTyxvRkFBRSxJQUFJLDRGQUNiLGVBQWUsNEZBQ2YsbUJBQW1CLGlLQUFFLGlCQUFpQjs7NEZBSTdCLDRCQUE0QjtrQkFieEMsU0FBUzsrQkFDRSw2QkFBNkIsV0FFOUI7d0JBQ1Asa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLG1CQUFtQjt3QkFDbkIsT0FBTyxFQUFFLElBQUk7d0JBQ2IsZUFBZTt3QkFDZixtQkFBbUIsRUFBRSxpQkFBaUI7cUJBQ3ZDLGNBQ1csSUFBSTs4QkFHUCxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNjLE1BQU07c0JBQTFCLFNBQVM7dUJBQUMsUUFBUTtnQkFDRCxHQUFHO3NCQUFwQixTQUFTO3VCQUFDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlLCBNYXREYXRlUmFuZ2VQaWNrZXIgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlclwiO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdJZiB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQgeyBJY29uQnV0dG9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ljb24tYnV0dG9uL2ljb24tYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGF0ZU1hc2tEaXJlY3RpdmUgfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy9kYXRlLW1hc2suZGlyZWN0aXZlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ktdGVjaC1tYXQtcmFuZ2UtZGF0ZXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXJhbmdlLWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcbiAgICBOZ0NsYXNzLCBOZ0lmLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBJY29uQnV0dG9uQ29tcG9uZW50LCBEYXRlTWFza0RpcmVjdGl2ZVxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZURhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI/OiBBcnJheTxzdHJpbmc+O1xuICBASW5wdXQoKSB2YWx1ZT86IEFycmF5PHN0cmluZyB8IG51bGw+O1xuICBASW5wdXQoKSBkZWZhdWx0VmFsdWU/OiBBcnJheTxEYXRlPjtcbiAgQElucHV0KCkga2V5Pzoge3N0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nfTtcbiAgQElucHV0KCkgc3VibWl0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNsZWFyVmFsdWUgPSB0cnVlO1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2UgPSAnJztcbiAgQElucHV0KCkgb25lUGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGhpbnRUZXh0ID0gJ01NL0REL1lZWVkgLSBNTS9ERC9ZWVlZJztcbiAgQE91dHB1dCgpIHJlc2V0Rm9ybSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBWaWV3Q2hpbGQoJ3BpY2tlcicpIHBpY2tlciE6IE1hdERhdGVSYW5nZVBpY2tlcjxhbnk+O1xuICBAVmlld0NoaWxkKCdtaW4nKSBtaW4hOiBFbGVtZW50UmVmO1xuICBpc09wZW4gPSBmYWxzZTtcblxuICBkYXRlUmFuZ2VGb3JtID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgIHN0YXJ0RGF0ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwKV0pLFxuICAgIGVuZERhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgxMCldKSxcbiAgfSk7XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIHN0YXJ0RGF0ZTogdGhpcy5kZWZhdWx0VmFsdWVbMF0sXG4gICAgICAgICAgZW5kRGF0ZTogdGhpcy5kZWZhdWx0VmFsdWVbMV1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10/LmN1cnJlbnRWYWx1ZSAmJiAhKGNoYW5nZXNbJ3ZhbHVlJ10uY3VycmVudFZhbHVlWzBdKSkge1xuICAgICAgICBpZiAodGhpcy5waWNrZXIpIHtcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZUZvcm0ucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLnBpY2tlci5zZWxlY3QobnVsbClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWyd2YWx1ZSddICYmIHRoaXMudmFsdWU/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRhdGVSYW5nZUZvcm0uc2V0VmFsdWUoe1xuICAgICAgICAgIHN0YXJ0RGF0ZTogbmV3IERhdGUodGhpcy52YWx1ZVswXSB8fCAnJyksXG4gICAgICAgICAgZW5kRGF0ZTogbmV3IERhdGUodGhpcy52YWx1ZVsxXSB8fCAnJylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LCAxMClcbiAgfVxuXG4gIGNsaWNrRm9yRm9jdXNPdXQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1pbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB0aGlzLm1pbi5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9LDEyMClcbiAgfVxuXG4gIGN1c3RvbUVycm9yU3RhdGVNYXRjaGVyID0ge1xuICAgIGlzRXJyb3JTdGF0ZTogKGNvbnRyb2w6IGFueSwgZm9ybTogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gISEoY29udHJvbCAmJiBjb250cm9sLmludmFsaWQgJiYgdGhpcy5zdWJtaXQpO1xuICAgIH1cbiAgfTtcblxuICBzZXREYXRlKHZhbHVlOiBBcnJheTxzdHJpbmcgfCBudWxsPiwgZWxlbWVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgZWxlbWVudC5ibHVyKCk7XG4gIH1cblxuICBrZXlFdmVudEhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQsdmFsdWU6IEFycmF5PHN0cmluZyB8IG51bGw+LCBlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgdGhpcy5zZXREYXRlKHZhbHVlLGVsZW1lbnQpXG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4X2NvbHVtbiByZWxhdGl2ZSBtYXQtZGF0ZS1yYW5nZS1pbnB1dFwiXG4gICAgIFtmb3JtR3JvdXBdPVwiZGF0ZVJhbmdlRm9ybVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJ3LTEwMFwiICpuZ0lmPVwibGFiZWxcIj5cbiAgICA8bWF0LWxhYmVsPlxuICAgICAge3sgKGxhYmVsIHx8ICcnKSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWxhYmVsPlxuICA8L2Rpdj5cbiAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgW25nQ2xhc3NdPVwieydvcGVuZWRfY2FsZW5kYXInOiBpc09wZW59XCI+XG4gICAgPG1hdC1kYXRlLXJhbmdlLWlucHV0IFtyYW5nZVBpY2tlcl09XCJwaWNrZXJcIj5cbiAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJzdGFydERhdGVcIlxuICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCIgKHBsYWNlaG9sZGVyID8gcGxhY2Vob2xkZXJbMF0gOiAnU3RhcnQgRGF0ZScpXCJcbiAgICAgICAgICAgICBbdGl0bGVdPVwia2V5ID8ga2V5LnRpdGxlIDogICdEYXRlJ1wiXG4gICAgICAgICAgICAgW2F0dHIuZGF0YS1hY2Nlc3NLZXldPVwia2V5ID8ga2V5LnN0YXJ0IDogJ21pblN0YXJ0RGF0ZSdcIlxuICAgICAgICAgICAgIFthdHRyLmRhdGEtcGFyZW50S2V5XT1cImtleSA/IChrZXkuc3RhcnQgKyAnXycgKyBrZXkuZW5kKSA6ICdtaW5TdGFydERhdGVfbWF4RW5kRGF0ZSdcIlxuICAgICAgICAgICAgIG1hdFN0YXJ0RGF0ZSAjbWluXG4gICAgICAgICAgICAgZGF0ZU1hc2tcbiAgICAgICAgICAgICBbZXJyb3JTdGF0ZU1hdGNoZXJdPVwiY3VzdG9tRXJyb3JTdGF0ZU1hdGNoZXJcIlxuICAgICAgICAgICAgIFtyYW5nZUZvcm1Db250cm9sXT1cImRhdGVSYW5nZUZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddXCJcbiAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlFdmVudEhhbmRsZXIoJGV2ZW50LFttaW4udmFsdWUsIG1heC52YWx1ZSB8fCBudWxsXSxtaW4pXCJcbiAgICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJzZXREYXRlKFttaW4udmFsdWUsIG1heC52YWx1ZSB8fCBudWxsXSxtaW4pXCI+XG4gICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZW5kRGF0ZVwiXG4gICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIihwbGFjZWhvbGRlciAgPyBwbGFjZWhvbGRlclsxXSA6ICdFbmQgRGF0ZScpXCJcbiAgICAgICAgICAgICBbdGl0bGVdPVwia2V5ID8ga2V5LnRpdGxlIDogICdEYXRlJ1wiXG4gICAgICAgICAgICAgW2F0dHIuZGF0YS1hY2Nlc3NLZXldPVwia2V5ID8ga2V5LmVuZCA6ICdtYXhFbmREYXRlJ1wiXG4gICAgICAgICAgICAgW2F0dHIuZGF0YS1wYXJlbnRLZXldPVwia2V5ID8gKGtleS5zdGFydCArICdfJyArIGtleS5lbmQpIDogJ21pblN0YXJ0RGF0ZV9tYXhFbmREYXRlJ1wiXG4gICAgICAgICAgICAgbWF0RW5kRGF0ZSAjbWF4XG4gICAgICAgICAgICAgZGF0ZU1hc2tcbiAgICAgICAgICAgICBbZXJyb3JTdGF0ZU1hdGNoZXJdPVwiY3VzdG9tRXJyb3JTdGF0ZU1hdGNoZXJcIlxuICAgICAgICAgICAgIFtyYW5nZUZvcm1Db250cm9sXT1cImRhdGVSYW5nZUZvcm0uY29udHJvbHNbJ2VuZERhdGUnXVwiXG4gICAgICAgICAgICAgKGtleWRvd24pPVwia2V5RXZlbnRIYW5kbGVyKCRldmVudCxbbWluLnZhbHVlLCBtYXgudmFsdWUgfHwgbnVsbF0sbWF4KVwiXG4gICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwic2V0RGF0ZShbbWluLnZhbHVlLCBtYXgudmFsdWUgfHwgbnVsbF0sbWF4KVwiPlxuICAgIDwvbWF0LWRhdGUtcmFuZ2UtaW5wdXQ+XG4gICAgPGktdGVjaC1pY29uLWJ1dHRvbiBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uTmFtZV09XCInY2FuY2VsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwic2VsZWN0aW9uQ2hhbmdlLmVtaXQoW251bGwsIG51bGxdKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRlZmF1bHQtZm9ybS1pY29uLWNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0ZVJhbmdlRm9ybS5nZXQoJ3N0YXJ0RGF0ZScpPy52YWx1ZSAmJiB0aGlzLmRhdGVSYW5nZUZvcm0uZ2V0KCdlbmREYXRlJyk/LnZhbHVlXCJcbiAgICA+PC9pLXRlY2gtaWNvbi1idXR0b24+XG4gICAgPGktdGVjaC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICBbaWNvbk5hbWVdPVwiJ2RhdGVfcmFuZ2UnXCJcbiAgICAgIChidXR0b25DbGljayk9XCJwaWNrZXIub3BlbigpXCJcbiAgICAgIGNsYXNzPVwiZGVmYXVsdC1mb3JtLWljb24tY29sb3JcIlxuICAgID48L2ktdGVjaC1pY29uLWJ1dHRvbj5cbiAgICA8bWF0LWRhdGUtcmFuZ2UtcGlja2VyXG4gICAgICAjcGlja2VyXG4gICAgICAoY2xvc2VkKT1cImlzT3BlbiA9IGZhbHNlO2NsaWNrRm9yRm9jdXNPdXQoKVwiXG4gICAgICAob3BlbmVkKT1cImlzT3BlbiA9IHRydWVcIlxuICAgID48L21hdC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICA8bWF0LWhpbnQgKm5nSWY9XCJoaW50VGV4dCAmJiAhZXJyb3JNZXNzYWdlXCI+e3sgaGludFRleHQgfX08L21hdC1oaW50PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG4iXX0=
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXJhbmdlLWRhdGVwaWNrZXIvZGF0ZS1yYW5nZS1kYXRlcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXJhbmdlLWRhdGVwaWNrZXIvZGF0ZS1yYW5nZS1kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7OztBQWV6RSxNQUFNLE9BQU8sNEJBQTRCO0lBYnpDO1FBbUJXLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsRUFBRSxD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QVM7K0JBQ0UsNkJBQTZCLFdBRTlCO3dCQUNQLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQixtQkFBbUI7d0JBQ25CLE9BQU8sRUFBRSxJQUFJO3dCQUNiLGVBQWU7d0JBQ2YsbUJBQW1CLEVBQUUsaUJBQWlCO3FCQUN2QyxjQUNXLElBQUk7OEJBR1AsS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDYyxNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVE7Z0JBQ0QsR0FBRztzQkFBcEIsU0FBUzt1QkFBQyxLQUFLO2dCQUNFLEdBQUc7c0JBQXBCLFNBQVM7dUJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCwgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUsIE1hdERhdGVSYW5nZVBpY2tlciB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyXCI7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ0lmIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IEljb25CdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vaWNvbi1idXR0b24vaWNvbi1idXR0b24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEYXRlTWFza0RpcmVjdGl2ZSB9IGZyb20gXCIuLi8uLi9kaXJlY3RpdmVzL2RhdGUtbWFzay5kaXJlY3RpdmVcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaS10ZWNoLW1hdC1yYW5nZS1kYXRlcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgIE5nQ2xhc3MsIE5nSWYsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIEljb25CdXR0b25Db21wb25lbnQsIERhdGVNYXNrRGlyZWN0aXZlXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcj86IEFycmF5PHN0cmluZz47XG4gIEBJbnB1dCgpIHZhbHVlPzogQXJyYXk8c3RyaW5nIHwgbnVsbD47XG4gIEBJbnB1dCgpIGRlZmF1bHRWYWx1ZT86IEFycmF5PERhdGU+O1xuICBASW5wdXQoKSBrZXk/OiB7c3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmd9O1xuICBASW5wdXQoKSBzdWJtaXQgPSBmYWxzZTtcbiAgQElucHV0KCkgY2xlYXJWYWx1ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZSA9ICcnO1xuICBASW5wdXQoKSBvbmVQbGFjZWhvbGRlcj86IHN0cmluZztcbiAgQElucHV0KCkgaGludFRleHQgPSAnTU0vREQvWVlZWSAtIE1NL0REL1lZWVknO1xuICBAT3V0cHV0KCkgcmVzZXRGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQFZpZXdDaGlsZCgncGlja2VyJykgcGlja2VyITogTWF0RGF0ZVJhbmdlUGlja2VyPGFueT47XG4gIEBWaWV3Q2hpbGQoJ21pbicpIG1pbiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ21heCcpIG1heCE6IEVsZW1lbnRSZWY7XG4gIGlzT3BlbiA9IGZhbHNlO1xuICBpc1NlbGVjdGluZ1JhbmdlID0gZmFsc2U7XG5cbiAgZGF0ZVJhbmdlRm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcbiAgICBzdGFydERhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgxMCldKSxcbiAgICBlbmREYXRlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTApXSksXG4gIH0pO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFZhbHVlWzBdLFxuICAgICAgICAgIGVuZERhdGU6IHRoaXMuZGVmYXVsdFZhbHVlWzFdXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddPy5jdXJyZW50VmFsdWUgJiYgIShjaGFuZ2VzWyd2YWx1ZSddLmN1cnJlbnRWYWx1ZVswXSkpIHtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyKSB7XG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2VGb3JtLnJlc2V0KCk7XG4gICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc1sndmFsdWUnXSAmJiB0aGlzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VGb3JtLnNldFZhbHVlKHtcbiAgICAgICAgICBzdGFydERhdGU6IG5ldyBEYXRlKHRoaXMudmFsdWVbMF0gfHwgJycpLFxuICAgICAgICAgIGVuZERhdGU6IG5ldyBEYXRlKHRoaXMudmFsdWVbMV0gfHwgJycpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSwgMTApXG4gIH1cblxuICBjbGlja0ZvckZvY3VzT3V0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5taW4ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgdGhpcy5taW4ubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgfSwxMjApXG4gIH1cblxuICBjdXN0b21FcnJvclN0YXRlTWF0Y2hlciA9IHtcbiAgICBpc0Vycm9yU3RhdGU6IChjb250cm9sOiBhbnksIGZvcm06IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuICEhKGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIHRoaXMuc3VibWl0KTtcbiAgICB9XG4gIH07XG5cbiAgc2V0RGF0ZSh2YWx1ZTogQXJyYXk8c3RyaW5nIHwgbnVsbD4sIGVsZW1lbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHZhbHVlWzBdO1xuICAgIGNvbnN0IGVuZERhdGUgPSB2YWx1ZVsxXTtcblxuICAgIC8vIElmIHRoaXMgaXMgdGhlIHN0YXJ0IGRhdGUgYmVpbmcgc2VsZWN0ZWQgKG1hdFN0YXJ0RGF0ZSBpbnB1dClcbiAgICBpZiAoZWxlbWVudCA9PT0gdGhpcy5taW4/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIC8vIFdlJ3JlIHN0YXJ0aW5nIGEgbmV3IHNlbGVjdGlvbiBwcm9jZXNzXG4gICAgICB0aGlzLmlzU2VsZWN0aW5nUmFuZ2UgPSB0cnVlO1xuICAgICAgLy8gRG9uJ3QgZW1pdCBhbnkgZXZlbnQgeWV0XG4gICAgfVxuICAgIC8vIElmIHRoaXMgaXMgdGhlIGVuZCBkYXRlIGJlaW5nIHNlbGVjdGVkIChtYXRFbmREYXRlIGlucHV0KVxuICAgIGVsc2UgaWYgKGVsZW1lbnQgPT09IHRoaXMubWF4Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAvLyBXZSdyZSBjb21wbGV0aW5nIGEgc2VsZWN0aW9uXG4gICAgICB0aGlzLmlzU2VsZWN0aW5nUmFuZ2UgPSBmYWxzZTtcbiAgICAgIC8vIE9ubHkgZW1pdCB3aGVuIHdlIGhhdmUgYm90aCBkYXRlc1xuICAgICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBIYW5kbGUgY2xlYXIgb3BlcmF0aW9uIChib3RoIG51bGwpXG4gICAgZWxzZSBpZiAoc3RhcnREYXRlID09PSBudWxsICYmIGVuZERhdGUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuaXNTZWxlY3RpbmdSYW5nZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZWxlbWVudC5ibHVyKCk7XG4gIH1cblxuICBrZXlFdmVudEhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQsdmFsdWU6IEFycmF5PHN0cmluZyB8IG51bGw+LCBlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgdGhpcy5zZXREYXRlKHZhbHVlLGVsZW1lbnQpXG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4X2NvbHVtbiByZWxhdGl2ZSBtYXQtZGF0ZS1yYW5nZS1pbnB1dFwiXG4gICAgIFtmb3JtR3JvdXBdPVwiZGF0ZVJhbmdlRm9ybVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJ3LTEwMFwiICpuZ0lmPVwibGFiZWxcIj5cbiAgICA8bWF0LWxhYmVsPlxuICAgICAge3sgKGxhYmVsIHx8ICcnKSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWxhYmVsPlxuICA8L2Rpdj5cbiAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgW25nQ2xhc3NdPVwieydvcGVuZWRfY2FsZW5kYXInOiBpc09wZW59XCI+XG4gICAgPG1hdC1kYXRlLXJhbmdlLWlucHV0IFtyYW5nZVBpY2tlcl09XCJwaWNrZXJcIj5cbiAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJzdGFydERhdGVcIlxuICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCIgKHBsYWNlaG9sZGVyID8gcGxhY2Vob2xkZXJbMF0gOiAnU3RhcnQgRGF0ZScpXCJcbiAgICAgICAgICAgICBbdGl0bGVdPVwia2V5ID8ga2V5LnRpdGxlIDogICdEYXRlJ1wiXG4gICAgICAgICAgICAgW2F0dHIuZGF0YS1hY2Nlc3NLZXldPVwia2V5ID8ga2V5LnN0YXJ0IDogJ21pblN0YXJ0RGF0ZSdcIlxuICAgICAgICAgICAgIFthdHRyLmRhdGEtcGFyZW50S2V5XT1cImtleSA/IChrZXkuc3RhcnQgKyAnXycgKyBrZXkuZW5kKSA6ICdtaW5TdGFydERhdGVfbWF4RW5kRGF0ZSdcIlxuICAgICAgICAgICAgIG1hdFN0YXJ0RGF0ZSAjbWluXG4gICAgICAgICAgICAgZGF0ZU1hc2tcbiAgICAgICAgICAgICBbZXJyb3JTdGF0ZU1hdGNoZXJdPVwiY3VzdG9tRXJyb3JTdGF0ZU1hdGNoZXJcIlxuICAgICAgICAgICAgIFtyYW5nZUZvcm1Db250cm9sXT1cImRhdGVSYW5nZUZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddXCJcbiAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlFdmVudEhhbmRsZXIoJGV2ZW50LFttaW4udmFsdWUsIG1heC52YWx1ZSB8fCBudWxsXSxtaW4pXCJcbiAgICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJzZXREYXRlKFttaW4udmFsdWUsIG1heC52YWx1ZSB8fCBudWxsXSxtaW4pXCI+XG4gICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZW5kRGF0ZVwiXG4gICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIihwbGFjZWhvbGRlciAgPyBwbGFjZWhvbGRlclsxXSA6ICdFbmQgRGF0ZScpXCJcbiAgICAgICAgICAgICBbdGl0bGVdPVwia2V5ID8ga2V5LnRpdGxlIDogICdEYXRlJ1wiXG4gICAgICAgICAgICAgW2F0dHIuZGF0YS1hY2Nlc3NLZXldPVwia2V5ID8ga2V5LmVuZCA6ICdtYXhFbmREYXRlJ1wiXG4gICAgICAgICAgICAgW2F0dHIuZGF0YS1wYXJlbnRLZXldPVwia2V5ID8gKGtleS5zdGFydCArICdfJyArIGtleS5lbmQpIDogJ21pblN0YXJ0RGF0ZV9tYXhFbmREYXRlJ1wiXG4gICAgICAgICAgICAgbWF0RW5kRGF0ZSAjbWF4XG4gICAgICAgICAgICAgZGF0ZU1hc2tcbiAgICAgICAgICAgICBbZXJyb3JTdGF0ZU1hdGNoZXJdPVwiY3VzdG9tRXJyb3JTdGF0ZU1hdGNoZXJcIlxuICAgICAgICAgICAgIFtyYW5nZUZvcm1Db250cm9sXT1cImRhdGVSYW5nZUZvcm0uY29udHJvbHNbJ2VuZERhdGUnXVwiXG4gICAgICAgICAgICAgKGtleWRvd24pPVwia2V5RXZlbnRIYW5kbGVyKCRldmVudCxbbWluLnZhbHVlLCBtYXgudmFsdWUgfHwgbnVsbF0sbWF4KVwiXG4gICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwic2V0RGF0ZShbbWluLnZhbHVlLCBtYXgudmFsdWUgfHwgbnVsbF0sbWF4KVwiPlxuICAgIDwvbWF0LWRhdGUtcmFuZ2UtaW5wdXQ+XG4gICAgPGktdGVjaC1pY29uLWJ1dHRvbiBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uTmFtZV09XCInY2FuY2VsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwic2VsZWN0aW9uQ2hhbmdlLmVtaXQoW251bGwsIG51bGxdKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRlZmF1bHQtZm9ybS1pY29uLWNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0ZVJhbmdlRm9ybS5nZXQoJ3N0YXJ0RGF0ZScpPy52YWx1ZSAmJiB0aGlzLmRhdGVSYW5nZUZvcm0uZ2V0KCdlbmREYXRlJyk/LnZhbHVlXCJcbiAgICA+PC9pLXRlY2gtaWNvbi1idXR0b24+XG4gICAgPGktdGVjaC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICBbaWNvbk5hbWVdPVwiJ2RhdGVfcmFuZ2UnXCJcbiAgICAgIChidXR0b25DbGljayk9XCJwaWNrZXIub3BlbigpXCJcbiAgICAgIGNsYXNzPVwiZGVmYXVsdC1mb3JtLWljb24tY29sb3JcIlxuICAgID48L2ktdGVjaC1pY29uLWJ1dHRvbj5cbiAgICA8bWF0LWRhdGUtcmFuZ2UtcGlja2VyXG4gICAgICAjcGlja2VyXG4gICAgICAoY2xvc2VkKT1cImlzT3BlbiA9IGZhbHNlO2NsaWNrRm9yRm9jdXNPdXQoKVwiXG4gICAgICAob3BlbmVkKT1cImlzT3BlbiA9IHRydWVcIlxuICAgID48L21hdC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICA8bWF0LWhpbnQgKm5nSWY9XCJoaW50VGV4dCAmJiAhZXJyb3JNZXNzYWdlXCI+e3sgaGludFRleHQgfX08L21hdC1oaW50PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
2
  import { MatDatepickerModule } from "@angular/material/datepicker";
3
3
  import { NgxMaskDirective } from "ngx-mask";
4
4
  import { FormsModule, ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from "@angular/forms";
@@ -42,6 +42,9 @@ export class DateTimePickerComponent {
42
42
  time: new UntypedFormControl(),
43
43
  date: new UntypedFormControl(),
44
44
  });
45
+ // Track datepicker state
46
+ this.focusTimeoutId = null;
47
+ this.datePickerJustClosed = false;
45
48
  this.ngControl = this.inputService.injectNgControl();
46
49
  }
47
50
  ngAfterViewInit() {
@@ -50,6 +53,11 @@ export class DateTimePickerComponent {
50
53
  this.setValue();
51
54
  });
52
55
  }
56
+ ngOnDestroy() {
57
+ if (this.focusTimeoutId) {
58
+ clearTimeout(this.focusTimeoutId);
59
+ }
60
+ }
53
61
  setValue() {
54
62
  if (!this.ngControl?.control) {
55
63
  return;
@@ -67,13 +75,28 @@ export class DateTimePickerComponent {
67
75
  time: this.parseDateService.changeFormat(dateTime, 'HH:mm')
68
76
  }, { emitEvent: false });
69
77
  }
70
- dateChange(timeInput) {
71
- if (!timeInput.value) {
72
- timeInput.focus();
78
+ onDatePickerClosed() {
79
+ // Update form value first
80
+ this.setDateTimeValue();
81
+ // Mark that the datepicker just closed
82
+ this.datePickerJustClosed = true;
83
+ // Clear any existing timeout
84
+ if (this.focusTimeoutId) {
85
+ clearTimeout(this.focusTimeoutId);
73
86
  }
74
- this.setDatTimeValue();
87
+ // Use a callback that runs outside Angular's change detection
88
+ this.focusTimeoutId = setTimeout(() => {
89
+ // Focus time input
90
+ if (this.timeInput?.nativeElement) {
91
+ this.timeInput.nativeElement.focus();
92
+ }
93
+ // Reset flag after enough time
94
+ setTimeout(() => {
95
+ this.datePickerJustClosed = false;
96
+ }, 200);
97
+ }, 100); // Longer delay to let Angular Material finish its work
75
98
  }
76
- setDatTimeValue() {
99
+ setDateTimeValue() {
77
100
  if (this.form.value.date && this.form.value.time) {
78
101
  const date = this.parseDateService.changeFormat(this.form.value.date, 'YYYY-MM-DD');
79
102
  const time = this.form.value.time;
@@ -84,20 +107,50 @@ export class DateTimePickerComponent {
84
107
  }
85
108
  this.dateChangeEvent.emit();
86
109
  }
87
- onFocus() {
110
+ onFocus(event) {
111
+ // If datepicker just closed and focus is going to date input, move it to time input
112
+ if (this.datePickerJustClosed) {
113
+ const target = event.target;
114
+ const dateInput = document.querySelector('input[formControlName="date"]');
115
+ if (target === dateInput) {
116
+ // Cancel any existing focus timeout
117
+ if (this.focusTimeoutId) {
118
+ clearTimeout(this.focusTimeoutId);
119
+ }
120
+ // Set new timeout to focus time input
121
+ this.focusTimeoutId = setTimeout(() => {
122
+ if (this.timeInput?.nativeElement) {
123
+ this.timeInput.nativeElement.focus();
124
+ }
125
+ }, 10);
126
+ return;
127
+ }
128
+ }
88
129
  this.isFocused = true;
89
130
  }
90
- onBlur() {
91
- this.isFocused = false;
131
+ onBlur(event) {
132
+ // Don't handle blur during datepicker transitions
133
+ if (this.datePickerJustClosed) {
134
+ return;
135
+ }
136
+ // Check if focus is moving to another element within our component
137
+ setTimeout(() => {
138
+ const dateInput = document.querySelector('input[formControlName="date"]');
139
+ const timeInput = this.timeInput?.nativeElement;
140
+ const activeElement = document.activeElement;
141
+ if (activeElement !== dateInput && activeElement !== timeInput) {
142
+ this.isFocused = false;
143
+ }
144
+ }, 50);
92
145
  }
93
146
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateTimePickerComponent, deps: [{ token: i1.InputService }, { token: i2.ParseDateService }], target: i0.ɵɵFactoryTarget.Component }); }
94
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateTimePickerComponent, isStandalone: true, selector: "i-tech-date-time-picker", inputs: { label: "label", submit: "submit", required: "required", disabled: "disabled" }, outputs: { dateChangeEvent: "dateChangeEvent" }, providers: [ParseDateService], ngImport: i0, template: "<div class=\"date_time_picker_container\"\n *ngIf=\"ngControl?.control\"\n [class.readonly_field]=\"disabled\"\n>\n <mat-label [ngClass]=\"{'readonly-color': disabled}\">{{label | translate}}</mat-label>\n <span *ngIf=\"required\" class=\"required-input\" [ngClass]=\"{'readonly-color': disabled}\"> *</span>\n\n <div class=\"date_time_picker\"\n [formGroup]=\"form\"\n [ngClass]=\"{'focused': isFocused, 'disabled': disabled}\"\n >\n <input type=\"text\" dateMask class=\"date\"\n placeholder=\"mm/dd/yy\"\n formControlName=\"date\"\n [matDatepicker]=\"DatePicker\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && DatePicker.open()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (selectionchange)=\"dateChange(dateElement)\"\n >\n <mat-datepicker #DatePicker></mat-datepicker>\n <input type=\"time\"\n #dateElement\n class=\"time\"\n formControlName=\"time\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (change)=\"setDatTimeValue()\"\n />\n </div>\n <!-- Error Messages -->\n <mat-error *ngIf=\"!!(ngControl.control.errors && submit)\">\n {{ngControl.control | generateErrorMessages : (label || '')}}\n </mat-error>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "directive", type: DateMaskDirective, selector: "[dateMask]", inputs: ["maskType", "matDatepicker", "rangeFormControl"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { 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: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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: MatLabel, selector: "mat-label" }, { kind: "pipe", type: GenerateErrorMessagesPipe, name: "generateErrorMessages" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }] }); }
147
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateTimePickerComponent, isStandalone: true, selector: "i-tech-date-time-picker", inputs: { label: "label", submit: "submit", required: "required", disabled: "disabled" }, outputs: { dateChangeEvent: "dateChangeEvent" }, providers: [ParseDateService], viewQueries: [{ propertyName: "timeInput", first: true, predicate: ["dateElement"], descendants: true }], ngImport: i0, template: "<div class=\"date_time_picker_container\"\n *ngIf=\"ngControl?.control\"\n [class.readonly_field]=\"disabled\"\n>\n <mat-label [ngClass]=\"{'readonly-color': disabled}\">{{label | translate}}</mat-label>\n <span *ngIf=\"required\" class=\"required-input\" [ngClass]=\"{'readonly-color': disabled}\"> *</span>\n\n <div class=\"date_time_picker\"\n [formGroup]=\"form\"\n [ngClass]=\"{'focused': isFocused, 'disabled': disabled}\"\n >\n <input type=\"text\" dateMask class=\"date\"\n placeholder=\"mm/dd/yy\"\n formControlName=\"date\"\n [matDatepicker]=\"DatePicker\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && DatePicker.open()\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n >\n <mat-datepicker #DatePicker\n (closed)=\"onDatePickerClosed()\">\n </mat-datepicker>\n <input type=\"time\"\n #dateElement\n class=\"time\"\n formControlName=\"time\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (change)=\"setDateTimeValue()\"\n />\n </div>\n <!-- Error Messages -->\n <mat-error *ngIf=\"!!(ngControl.control.errors && submit)\">\n {{ngControl.control | generateErrorMessages : (label || '')}}\n </mat-error>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "directive", type: DateMaskDirective, selector: "[dateMask]", inputs: ["maskType", "matDatepicker", "rangeFormControl"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { 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: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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: MatLabel, selector: "mat-label" }, { kind: "pipe", type: GenerateErrorMessagesPipe, name: "generateErrorMessages" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }] }); }
95
148
  }
96
149
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateTimePickerComponent, decorators: [{
97
150
  type: Component,
98
151
  args: [{ selector: 'i-tech-date-time-picker', imports: [MatDatepickerModule, NgxMaskDirective, DateMaskDirective, TranslateModule,
99
152
  FormsModule, NgClass, ReactiveFormsModule, MatLabel, GenerateErrorMessagesPipe, NgIf, MatError
100
- ], standalone: true, providers: [ParseDateService], template: "<div class=\"date_time_picker_container\"\n *ngIf=\"ngControl?.control\"\n [class.readonly_field]=\"disabled\"\n>\n <mat-label [ngClass]=\"{'readonly-color': disabled}\">{{label | translate}}</mat-label>\n <span *ngIf=\"required\" class=\"required-input\" [ngClass]=\"{'readonly-color': disabled}\"> *</span>\n\n <div class=\"date_time_picker\"\n [formGroup]=\"form\"\n [ngClass]=\"{'focused': isFocused, 'disabled': disabled}\"\n >\n <input type=\"text\" dateMask class=\"date\"\n placeholder=\"mm/dd/yy\"\n formControlName=\"date\"\n [matDatepicker]=\"DatePicker\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && DatePicker.open()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (selectionchange)=\"dateChange(dateElement)\"\n >\n <mat-datepicker #DatePicker></mat-datepicker>\n <input type=\"time\"\n #dateElement\n class=\"time\"\n formControlName=\"time\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (change)=\"setDatTimeValue()\"\n />\n </div>\n <!-- Error Messages -->\n <mat-error *ngIf=\"!!(ngControl.control.errors && submit)\">\n {{ngControl.control | generateErrorMessages : (label || '')}}\n </mat-error>\n</div>\n" }]
153
+ ], standalone: true, providers: [ParseDateService], template: "<div class=\"date_time_picker_container\"\n *ngIf=\"ngControl?.control\"\n [class.readonly_field]=\"disabled\"\n>\n <mat-label [ngClass]=\"{'readonly-color': disabled}\">{{label | translate}}</mat-label>\n <span *ngIf=\"required\" class=\"required-input\" [ngClass]=\"{'readonly-color': disabled}\"> *</span>\n\n <div class=\"date_time_picker\"\n [formGroup]=\"form\"\n [ngClass]=\"{'focused': isFocused, 'disabled': disabled}\"\n >\n <input type=\"text\" dateMask class=\"date\"\n placeholder=\"mm/dd/yy\"\n formControlName=\"date\"\n [matDatepicker]=\"DatePicker\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && DatePicker.open()\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n >\n <mat-datepicker #DatePicker\n (closed)=\"onDatePickerClosed()\">\n </mat-datepicker>\n <input type=\"time\"\n #dateElement\n class=\"time\"\n formControlName=\"time\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (change)=\"setDateTimeValue()\"\n />\n </div>\n <!-- Error Messages -->\n <mat-error *ngIf=\"!!(ngControl.control.errors && submit)\">\n {{ngControl.control | generateErrorMessages : (label || '')}}\n </mat-error>\n</div>\n" }]
101
154
  }], ctorParameters: () => [{ type: i1.InputService }, { type: i2.ParseDateService }], propDecorators: { dateChangeEvent: [{
102
155
  type: Output
103
156
  }], label: [{
@@ -108,5 +161,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
108
161
  type: Input
109
162
  }], disabled: [{
110
163
  type: Input
164
+ }], timeInput: [{
165
+ type: ViewChild,
166
+ args: ['dateElement']
111
167
  }] } });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZGF0ZS10aW1lLXBpY2tlci9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXRpbWUtcGlja2VyL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFFTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7O0FBWXJGLE1BQU0sT0FBTyx1QkFBdUI7SUFLbEMsSUFBYSxRQUFR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QUFFLGVBQWU7d0JBQ2hGLFdBQVcsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLHlCQUF5QixFQUFFLElBQUksRUFBRSxRQUFRO3FCQUMvRixjQUNXLElBQUksYUFDTCxDQUFDLGdCQUFnQixDQUFDO2dIQUtuQixlQUFlO3NCQUF4QixNQUFNO2dCQUNFLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDTyxRQUFRO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlclwiO1xuaW1wb3J0IHsgTmd4TWFza0RpcmVjdGl2ZSB9IGZyb20gXCJuZ3gtbWFza1wiO1xuaW1wb3J0IHtcbiAgRm9ybUNvbnRyb2xOYW1lLFxuICBGb3Jtc01vZHVsZSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVW50eXBlZEZvcm1Db250cm9sLFxuICBVbnR5cGVkRm9ybUdyb3VwXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdJZiB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IE1hdEVycm9yLCBNYXRMYWJlbCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgRGF0ZU1hc2tEaXJlY3RpdmUgfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy9kYXRlLW1hc2suZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBQYXJzZURhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3BhcnNlLWRhdGUuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5wdXRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2lucHV0LnNlcnZpY2VcIjtcbmltcG9ydCB7IEdlbmVyYXRlRXJyb3JNZXNzYWdlc1BpcGUgfSBmcm9tIFwiLi4vLi4vcGlwZXMvZ2VuZXJhdGUtZXJyb3ItbWVzc2FnZXMucGlwZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpLXRlY2gtZGF0ZS10aW1lLXBpY2tlcicsXG4gIGltcG9ydHM6IFtNYXREYXRlcGlja2VyTW9kdWxlLCBOZ3hNYXNrRGlyZWN0aXZlLERhdGVNYXNrRGlyZWN0aXZlLCBUcmFuc2xhdGVNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsIE5nQ2xhc3MsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE1hdExhYmVsLCBHZW5lcmF0ZUVycm9yTWVzc2FnZXNQaXBlLCBOZ0lmLCBNYXRFcnJvclxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBwcm92aWRlcnM6IFtQYXJzZURhdGVTZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVRpbWVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQElucHV0KCkgbGFiZWwhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN1Ym1pdCA9IGZhbHNlO1xuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBzZXQgZGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgdGhpcy5mb3JtLmdldCgndGltZScpPy5kaXNhYmxlKCk7XG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkYXRlJyk/LmRpc2FibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtLmdldCgndGltZScpPy5lbmFibGUoKTtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2RhdGUnKT8uZW5hYmxlKCk7XG4gICAgfVxuICB9O1xuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cbiAgaXNGb2N1c2VkID0gZmFsc2U7XG4gIGZvcm0gPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7XG4gICAgdGltZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpLFxuICAgIGRhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgfSlcbiAgbmdDb250cm9sOiBGb3JtQ29udHJvbE5hbWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIGlucHV0U2VydmljZTogSW5wdXRTZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSBwYXJzZURhdGVTZXJ2aWNlOiBQYXJzZURhdGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMubmdDb250cm9sID0gdGhpcy5pbnB1dFNlcnZpY2UuaW5qZWN0TmdDb250cm9sKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRWYWx1ZSgpO1xuICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFZhbHVlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubmdDb250cm9sPy5jb250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGVUaW1lID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWx1ZTtcbiAgICBpZiAoIWRhdGVUaW1lKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGRhdGU6IG51bGwsXG4gICAgICAgIHRpbWU6IG51bGxcbiAgICAgIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBkYXRlOiBuZXcgRGF0ZSh0aGlzLnBhcnNlRGF0ZVNlcnZpY2UuY2hhbmdlRm9ybWF0KGRhdGVUaW1lLCdZWVlZLU1NLUREJykgKyAnVCcgKyAnMDA6MDA6MDAnKSxcbiAgICAgIHRpbWU6IHRoaXMucGFyc2VEYXRlU2VydmljZS5jaGFuZ2VGb3JtYXQoZGF0ZVRpbWUsJ0hIOm1tJylcbiAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSlcbiAgfVxuXG4gIHB1YmxpYyBkYXRlQ2hhbmdlKHRpbWVJbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGltZUlucHV0LnZhbHVlKSB7XG4gICAgICB0aW1lSW5wdXQuZm9jdXMoKTtcbiAgICB9XG4gICAgdGhpcy5zZXREYXRUaW1lVmFsdWUoKVxuICB9XG5cbiAgcHVibGljIHNldERhdFRpbWVWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtLnZhbHVlLmRhdGUgJiYgdGhpcy5mb3JtLnZhbHVlLnRpbWUpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnBhcnNlRGF0ZVNlcnZpY2UuY2hhbmdlRm9ybWF0KHRoaXMuZm9ybS52YWx1ZS5kYXRlICwgJ1lZWVktTU0tREQnKTtcbiAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLmZvcm0udmFsdWUudGltZTtcbiAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wucGF0Y2hWYWx1ZShkYXRlICsgJ1QnICsgdGltZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnBhdGNoVmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICB0aGlzLmRhdGVDaGFuZ2VFdmVudC5lbWl0KClcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBvbkJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRhdGVfdGltZV9waWNrZXJfY29udGFpbmVyXCJcbiAgICAgKm5nSWY9XCJuZ0NvbnRyb2w/LmNvbnRyb2xcIlxuICAgICBbY2xhc3MucmVhZG9ubHlfZmllbGRdPVwiZGlzYWJsZWRcIlxuPlxuICAgIDxtYXQtbGFiZWwgW25nQ2xhc3NdPVwieydyZWFkb25seS1jb2xvcic6IGRpc2FibGVkfVwiPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgIDxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWlucHV0XCIgW25nQ2xhc3NdPVwieydyZWFkb25seS1jb2xvcic6IGRpc2FibGVkfVwiPiAqPC9zcGFuPlxuXG4gICAgPGRpdiBjbGFzcz1cImRhdGVfdGltZV9waWNrZXJcIlxuICAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsnZm9jdXNlZCc6IGlzRm9jdXNlZCwgJ2Rpc2FibGVkJzogZGlzYWJsZWR9XCJcbiAgICA+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGRhdGVNYXNrIGNsYXNzPVwiZGF0ZVwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIm1tL2RkL3l5XCJcbiAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRhdGVcIlxuICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiRGF0ZVBpY2tlclwiXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBEYXRlUGlja2VyLm9wZW4oKVwiXG4gICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAgICAgICAgICAgIChzZWxlY3Rpb25jaGFuZ2UpPVwiZGF0ZUNoYW5nZShkYXRlRWxlbWVudClcIlxuICAgICAgICA+XG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjRGF0ZVBpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgICAgI2RhdGVFbGVtZW50XG4gICAgICAgICAgICAgICBjbGFzcz1cInRpbWVcIlxuICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGltZVwiXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXG4gICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldERhdFRpbWVWYWx1ZSgpXCJcbiAgICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEVycm9yIE1lc3NhZ2VzIC0tPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCIhIShuZ0NvbnRyb2wuY29udHJvbC5lcnJvcnMgJiYgc3VibWl0KVwiPlxuICAgICAgICB7e25nQ29udHJvbC5jb250cm9sIHwgZ2VuZXJhdGVFcnJvck1lc3NhZ2VzIDogKGxhYmVsIHx8ICcnKX19XG4gICAgPC9tYXQtZXJyb3I+XG48L2Rpdj5cbiJdfQ==
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZGF0ZS10aW1lLXBpY2tlci9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXRpbWUtcGlja2VyL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDNUMsT0FBTyxFQUVMLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFckUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7Ozs7QUFZckYsTUFBTSxPQUFPLHVCQUF1QjtJQUts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QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXJcIjtcbmltcG9ydCB7IE5neE1hc2tEaXJlY3RpdmUgfSBmcm9tIFwibmd4LW1hc2tcIjtcbmltcG9ydCB7XG4gIEZvcm1Db250cm9sTmFtZSxcbiAgRm9ybXNNb2R1bGUsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcbiAgVW50eXBlZEZvcm1Hcm91cFxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IE5nQ2xhc3MsIE5nSWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBNYXRFcnJvciwgTWF0TGFiZWwgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IERhdGVNYXNrRGlyZWN0aXZlIH0gZnJvbSBcIi4uLy4uL2RpcmVjdGl2ZXMvZGF0ZS1tYXNrLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgUGFyc2VEYXRlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9wYXJzZS1kYXRlLnNlcnZpY2VcIjtcbmltcG9ydCB7IElucHV0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9pbnB1dC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBHZW5lcmF0ZUVycm9yTWVzc2FnZXNQaXBlIH0gZnJvbSBcIi4uLy4uL3BpcGVzL2dlbmVyYXRlLWVycm9yLW1lc3NhZ2VzLnBpcGVcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaS10ZWNoLWRhdGUtdGltZS1waWNrZXInLFxuICBpbXBvcnRzOiBbTWF0RGF0ZXBpY2tlck1vZHVsZSwgTmd4TWFza0RpcmVjdGl2ZSwgRGF0ZU1hc2tEaXJlY3RpdmUsIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSwgTmdDbGFzcywgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTWF0TGFiZWwsIEdlbmVyYXRlRXJyb3JNZXNzYWdlc1BpcGUsIE5nSWYsIE1hdEVycm9yXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW1BhcnNlRGF0ZVNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXRlVGltZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBJbnB1dCgpIGxhYmVsITogc3RyaW5nO1xuICBASW5wdXQoKSBzdWJtaXQgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ3RpbWUnKT8uZGlzYWJsZSgpO1xuICAgICAgdGhpcy5mb3JtLmdldCgnZGF0ZScpPy5kaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ3RpbWUnKT8uZW5hYmxlKCk7XG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkYXRlJyk/LmVuYWJsZSgpO1xuICAgIH1cbiAgfTtcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2RhdGVFbGVtZW50JykgdGltZUlucHV0ITogRWxlbWVudFJlZjtcblxuICBpc0ZvY3VzZWQgPSBmYWxzZTtcbiAgZm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcbiAgICB0aW1lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKCksXG4gICAgZGF0ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpLFxuICB9KVxuICBuZ0NvbnRyb2w6IEZvcm1Db250cm9sTmFtZTtcblxuICAvLyBUcmFjayBkYXRlcGlja2VyIHN0YXRlXG4gIHByaXZhdGUgZm9jdXNUaW1lb3V0SWQ6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgZGF0ZVBpY2tlckp1c3RDbG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgaW5wdXRTZXJ2aWNlOiBJbnB1dFNlcnZpY2UsXG4gICAgICBwcml2YXRlIHBhcnNlRGF0ZVNlcnZpY2U6IFBhcnNlRGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmlucHV0U2VydmljZS5pbmplY3ROZ0NvbnRyb2woKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFZhbHVlKCk7XG4gICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoKVxuICAgIH0pXG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb2N1c1RpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNUaW1lb3V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm5nQ29udHJvbD8uY29udHJvbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRlVGltZSA9IHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCFkYXRlVGltZSkge1xuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBkYXRlOiBudWxsLFxuICAgICAgICB0aW1lOiBudWxsXG4gICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgZGF0ZTogbmV3IERhdGUodGhpcy5wYXJzZURhdGVTZXJ2aWNlLmNoYW5nZUZvcm1hdChkYXRlVGltZSwgJ1lZWVktTU0tREQnKSArICdUJyArICcwMDowMDowMCcpLFxuICAgICAgdGltZTogdGhpcy5wYXJzZURhdGVTZXJ2aWNlLmNoYW5nZUZvcm1hdChkYXRlVGltZSwgJ0hIOm1tJylcbiAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSlcbiAgfVxuXG4gIHB1YmxpYyBvbkRhdGVQaWNrZXJDbG9zZWQoKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIGZvcm0gdmFsdWUgZmlyc3RcbiAgICB0aGlzLnNldERhdGVUaW1lVmFsdWUoKTtcblxuICAgIC8vIE1hcmsgdGhhdCB0aGUgZGF0ZXBpY2tlciBqdXN0IGNsb3NlZFxuICAgIHRoaXMuZGF0ZVBpY2tlckp1c3RDbG9zZWQgPSB0cnVlO1xuXG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXRcbiAgICBpZiAodGhpcy5mb2N1c1RpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNUaW1lb3V0SWQpO1xuICAgIH1cblxuICAgIC8vIFVzZSBhIGNhbGxiYWNrIHRoYXQgcnVucyBvdXRzaWRlIEFuZ3VsYXIncyBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgdGhpcy5mb2N1c1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gRm9jdXMgdGltZSBpbnB1dFxuICAgICAgaWYgKHRoaXMudGltZUlucHV0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMudGltZUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgZmxhZyBhZnRlciBlbm91Z2ggdGltZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGF0ZVBpY2tlckp1c3RDbG9zZWQgPSBmYWxzZTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfSwgMTAwKTsgLy8gTG9uZ2VyIGRlbGF5IHRvIGxldCBBbmd1bGFyIE1hdGVyaWFsIGZpbmlzaCBpdHMgd29ya1xuICB9XG5cbiAgcHVibGljIHNldERhdGVUaW1lVmFsdWUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybS52YWx1ZS5kYXRlICYmIHRoaXMuZm9ybS52YWx1ZS50aW1lKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5wYXJzZURhdGVTZXJ2aWNlLmNoYW5nZUZvcm1hdCh0aGlzLmZvcm0udmFsdWUuZGF0ZSwgJ1lZWVktTU0tREQnKTtcbiAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLmZvcm0udmFsdWUudGltZTtcbiAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wucGF0Y2hWYWx1ZShkYXRlICsgJ1QnICsgdGltZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnBhdGNoVmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICB0aGlzLmRhdGVDaGFuZ2VFdmVudC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIC8vIElmIGRhdGVwaWNrZXIganVzdCBjbG9zZWQgYW5kIGZvY3VzIGlzIGdvaW5nIHRvIGRhdGUgaW5wdXQsIG1vdmUgaXQgdG8gdGltZSBpbnB1dFxuICAgIGlmICh0aGlzLmRhdGVQaWNrZXJKdXN0Q2xvc2VkKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBkYXRlSW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtmb3JtQ29udHJvbE5hbWU9XCJkYXRlXCJdJyk7XG5cbiAgICAgIGlmICh0YXJnZXQgPT09IGRhdGVJbnB1dCkge1xuICAgICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIGZvY3VzIHRpbWVvdXRcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNUaW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5mb2N1c1RpbWVvdXRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgbmV3IHRpbWVvdXQgdG8gZm9jdXMgdGltZSBpbnB1dFxuICAgICAgICB0aGlzLmZvY3VzVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMudGltZUlucHV0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBvbkJsdXIoZXZlbnQ/OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgLy8gRG9uJ3QgaGFuZGxlIGJsdXIgZHVyaW5nIGRhdGVwaWNrZXIgdHJhbnNpdGlvbnNcbiAgICBpZiAodGhpcy5kYXRlUGlja2VySnVzdENsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGZvY3VzIGlzIG1vdmluZyB0byBhbm90aGVyIGVsZW1lbnQgd2l0aGluIG91ciBjb21wb25lbnRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGVJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W2Zvcm1Db250cm9sTmFtZT1cImRhdGVcIl0nKTtcbiAgICAgIGNvbnN0IHRpbWVJbnB1dCA9IHRoaXMudGltZUlucHV0Py5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIGlmIChhY3RpdmVFbGVtZW50ICE9PSBkYXRlSW5wdXQgJiYgYWN0aXZlRWxlbWVudCAhPT0gdGltZUlucHV0KSB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgNTApO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZV90aW1lX3BpY2tlcl9jb250YWluZXJcIlxuICAgICAqbmdJZj1cIm5nQ29udHJvbD8uY29udHJvbFwiXG4gICAgIFtjbGFzcy5yZWFkb25seV9maWVsZF09XCJkaXNhYmxlZFwiXG4+XG4gICAgPG1hdC1sYWJlbCBbbmdDbGFzc109XCJ7J3JlYWRvbmx5LWNvbG9yJzogZGlzYWJsZWR9XCI+e3tsYWJlbCB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XG4gICAgPHNwYW4gKm5nSWY9XCJyZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWQtaW5wdXRcIiBbbmdDbGFzc109XCJ7J3JlYWRvbmx5LWNvbG9yJzogZGlzYWJsZWR9XCI+ICo8L3NwYW4+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZV90aW1lX3BpY2tlclwiXG4gICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgICAgICAgW25nQ2xhc3NdPVwieydmb2N1c2VkJzogaXNGb2N1c2VkLCAnZGlzYWJsZWQnOiBkaXNhYmxlZH1cIlxuICAgID5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZGF0ZU1hc2sgY2xhc3M9XCJkYXRlXCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwibW0vZGQveXlcIlxuICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZVwiXG4gICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJEYXRlUGlja2VyXCJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwiIWRpc2FibGVkICYmIERhdGVQaWNrZXIub3BlbigpXCJcbiAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjRGF0ZVBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJvbkRhdGVQaWNrZXJDbG9zZWQoKVwiPlxuICAgICAgICA8L21hdC1kYXRlcGlja2VyPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgICAgI2RhdGVFbGVtZW50XG4gICAgICAgICAgICAgICBjbGFzcz1cInRpbWVcIlxuICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGltZVwiXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldERhdGVUaW1lVmFsdWUoKVwiXG4gICAgICAgIC8+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBFcnJvciBNZXNzYWdlcyAtLT5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiISEobmdDb250cm9sLmNvbnRyb2wuZXJyb3JzICYmIHN1Ym1pdClcIj5cbiAgICAgICAge3tuZ0NvbnRyb2wuY29udHJvbCB8IGdlbmVyYXRlRXJyb3JNZXNzYWdlcyA6IChsYWJlbCB8fCAnJyl9fVxuICAgIDwvbWF0LWVycm9yPlxuPC9kaXY+XG4iXX0=
@@ -1201,6 +1201,7 @@ class DateRangeDatepickerComponent {
1201
1201
  this.resetForm = new EventEmitter();
1202
1202
  this.selectionChange = new EventEmitter();
1203
1203
  this.isOpen = false;
1204
+ this.isSelectingRange = false;
1204
1205
  this.dateRangeForm = new UntypedFormGroup({
1205
1206
  startDate: new UntypedFormControl('', [Validators.maxLength(10)]),
1206
1207
  endDate: new UntypedFormControl('', [Validators.maxLength(10)]),
@@ -1244,7 +1245,28 @@ class DateRangeDatepickerComponent {
1244
1245
  }, 120);
1245
1246
  }
1246
1247
  setDate(value, element) {
1247
- this.selectionChange.emit(value);
1248
+ const startDate = value[0];
1249
+ const endDate = value[1];
1250
+ // If this is the start date being selected (matStartDate input)
1251
+ if (element === this.min?.nativeElement) {
1252
+ // We're starting a new selection process
1253
+ this.isSelectingRange = true;
1254
+ // Don't emit any event yet
1255
+ }
1256
+ // If this is the end date being selected (matEndDate input)
1257
+ else if (element === this.max?.nativeElement) {
1258
+ // We're completing a selection
1259
+ this.isSelectingRange = false;
1260
+ // Only emit when we have both dates
1261
+ if (startDate && endDate) {
1262
+ this.selectionChange.emit(value);
1263
+ }
1264
+ }
1265
+ // Handle clear operation (both null)
1266
+ else if (startDate === null && endDate === null) {
1267
+ this.isSelectingRange = false;
1268
+ this.selectionChange.emit(value);
1269
+ }
1248
1270
  element.blur();
1249
1271
  }
1250
1272
  keyEventHandler(event, value, element) {
@@ -1253,7 +1275,7 @@ class DateRangeDatepickerComponent {
1253
1275
  }
1254
1276
  }
1255
1277
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangeDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1256
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateRangeDatepickerComponent, isStandalone: true, selector: "i-tech-mat-range-datepicker", inputs: { label: "label", placeholder: "placeholder", value: "value", defaultValue: "defaultValue", key: "key", submit: "submit", clearValue: "clearValue", errorMessage: "errorMessage", onePlaceholder: "onePlaceholder", hintText: "hintText" }, outputs: { resetForm: "resetForm", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "min", first: true, predicate: ["min"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex_column relative mat-date-range-input\"\n [formGroup]=\"dateRangeForm\"\n>\n <div class=\"w-100\" *ngIf=\"label\">\n <mat-label>\n {{ (label || '') | translate }}\n </mat-label>\n </div>\n <mat-form-field appearance=\"outline\" [ngClass]=\"{'opened_calendar': isOpen}\">\n <mat-date-range-input [rangePicker]=\"picker\">\n <input formControlName=\"startDate\"\n [placeholder]=\" (placeholder ? placeholder[0] : 'Start Date')\"\n [title]=\"key ? key.title : 'Date'\"\n [attr.data-accessKey]=\"key ? key.start : 'minStartDate'\"\n [attr.data-parentKey]=\"key ? (key.start + '_' + key.end) : 'minStartDate_maxEndDate'\"\n matStartDate #min\n dateMask\n [errorStateMatcher]=\"customErrorStateMatcher\"\n [rangeFormControl]=\"dateRangeForm.controls['startDate']\"\n (keydown)=\"keyEventHandler($event,[min.value, max.value || null],min)\"\n (dateChange)=\"setDate([min.value, max.value || null],min)\">\n <input formControlName=\"endDate\"\n [placeholder]=\"(placeholder ? placeholder[1] : 'End Date')\"\n [title]=\"key ? key.title : 'Date'\"\n [attr.data-accessKey]=\"key ? key.end : 'maxEndDate'\"\n [attr.data-parentKey]=\"key ? (key.start + '_' + key.end) : 'minStartDate_maxEndDate'\"\n matEndDate #max\n dateMask\n [errorStateMatcher]=\"customErrorStateMatcher\"\n [rangeFormControl]=\"dateRangeForm.controls['endDate']\"\n (keydown)=\"keyEventHandler($event,[min.value, max.value || null],max)\"\n (dateChange)=\"setDate([min.value, max.value || null],max)\">\n </mat-date-range-input>\n <i-tech-icon-button matSuffix\n [iconName]=\"'cancel'\"\n (buttonClick)=\"selectionChange.emit([null, null])\"\n class=\"default-form-icon-color\"\n *ngIf=\"dateRangeForm.get('startDate')?.value && this.dateRangeForm.get('endDate')?.value\"\n ></i-tech-icon-button>\n <i-tech-icon-button\n matSuffix\n [iconName]=\"'date_range'\"\n (buttonClick)=\"picker.open()\"\n class=\"default-form-icon-color\"\n ></i-tech-icon-button>\n <mat-date-range-picker\n #picker\n (closed)=\"isOpen = false;clickForFocusOut()\"\n (opened)=\"isOpen = true\"\n ></mat-date-range-picker>\n <mat-hint *ngIf=\"hintText && !errorMessage\">{{ hintText }}</mat-hint>\n </mat-form-field>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3$1.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i3$1.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i3$1.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i3$1.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: IconButtonComponent, selector: "i-tech-icon-button", inputs: ["size", "type", "iconSvg", "iconName", "tooltip", "disabled"], outputs: ["buttonClick"] }, { kind: "directive", type: DateMaskDirective, selector: "[dateMask]", inputs: ["maskType", "matDatepicker", "rangeFormControl"] }] }); }
1278
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateRangeDatepickerComponent, isStandalone: true, selector: "i-tech-mat-range-datepicker", inputs: { label: "label", placeholder: "placeholder", value: "value", defaultValue: "defaultValue", key: "key", submit: "submit", clearValue: "clearValue", errorMessage: "errorMessage", onePlaceholder: "onePlaceholder", hintText: "hintText" }, outputs: { resetForm: "resetForm", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "min", first: true, predicate: ["min"], descendants: true }, { propertyName: "max", first: true, predicate: ["max"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex_column relative mat-date-range-input\"\n [formGroup]=\"dateRangeForm\"\n>\n <div class=\"w-100\" *ngIf=\"label\">\n <mat-label>\n {{ (label || '') | translate }}\n </mat-label>\n </div>\n <mat-form-field appearance=\"outline\" [ngClass]=\"{'opened_calendar': isOpen}\">\n <mat-date-range-input [rangePicker]=\"picker\">\n <input formControlName=\"startDate\"\n [placeholder]=\" (placeholder ? placeholder[0] : 'Start Date')\"\n [title]=\"key ? key.title : 'Date'\"\n [attr.data-accessKey]=\"key ? key.start : 'minStartDate'\"\n [attr.data-parentKey]=\"key ? (key.start + '_' + key.end) : 'minStartDate_maxEndDate'\"\n matStartDate #min\n dateMask\n [errorStateMatcher]=\"customErrorStateMatcher\"\n [rangeFormControl]=\"dateRangeForm.controls['startDate']\"\n (keydown)=\"keyEventHandler($event,[min.value, max.value || null],min)\"\n (dateChange)=\"setDate([min.value, max.value || null],min)\">\n <input formControlName=\"endDate\"\n [placeholder]=\"(placeholder ? placeholder[1] : 'End Date')\"\n [title]=\"key ? key.title : 'Date'\"\n [attr.data-accessKey]=\"key ? key.end : 'maxEndDate'\"\n [attr.data-parentKey]=\"key ? (key.start + '_' + key.end) : 'minStartDate_maxEndDate'\"\n matEndDate #max\n dateMask\n [errorStateMatcher]=\"customErrorStateMatcher\"\n [rangeFormControl]=\"dateRangeForm.controls['endDate']\"\n (keydown)=\"keyEventHandler($event,[min.value, max.value || null],max)\"\n (dateChange)=\"setDate([min.value, max.value || null],max)\">\n </mat-date-range-input>\n <i-tech-icon-button matSuffix\n [iconName]=\"'cancel'\"\n (buttonClick)=\"selectionChange.emit([null, null])\"\n class=\"default-form-icon-color\"\n *ngIf=\"dateRangeForm.get('startDate')?.value && this.dateRangeForm.get('endDate')?.value\"\n ></i-tech-icon-button>\n <i-tech-icon-button\n matSuffix\n [iconName]=\"'date_range'\"\n (buttonClick)=\"picker.open()\"\n class=\"default-form-icon-color\"\n ></i-tech-icon-button>\n <mat-date-range-picker\n #picker\n (closed)=\"isOpen = false;clickForFocusOut()\"\n (opened)=\"isOpen = true\"\n ></mat-date-range-picker>\n <mat-hint *ngIf=\"hintText && !errorMessage\">{{ hintText }}</mat-hint>\n </mat-form-field>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3$1.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i3$1.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i3$1.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i3$1.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: IconButtonComponent, selector: "i-tech-icon-button", inputs: ["size", "type", "iconSvg", "iconName", "tooltip", "disabled"], outputs: ["buttonClick"] }, { kind: "directive", type: DateMaskDirective, selector: "[dateMask]", inputs: ["maskType", "matDatepicker", "rangeFormControl"] }] }); }
1257
1279
  }
1258
1280
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangeDatepickerComponent, decorators: [{
1259
1281
  type: Component,
@@ -1295,6 +1317,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1295
1317
  }], min: [{
1296
1318
  type: ViewChild,
1297
1319
  args: ['min']
1320
+ }], max: [{
1321
+ type: ViewChild,
1322
+ args: ['max']
1298
1323
  }] } });
1299
1324
 
1300
1325
  var DropdownSelectionType;
@@ -1424,6 +1449,9 @@ class DateTimePickerComponent {
1424
1449
  time: new UntypedFormControl(),
1425
1450
  date: new UntypedFormControl(),
1426
1451
  });
1452
+ // Track datepicker state
1453
+ this.focusTimeoutId = null;
1454
+ this.datePickerJustClosed = false;
1427
1455
  this.ngControl = this.inputService.injectNgControl();
1428
1456
  }
1429
1457
  ngAfterViewInit() {
@@ -1432,6 +1460,11 @@ class DateTimePickerComponent {
1432
1460
  this.setValue();
1433
1461
  });
1434
1462
  }
1463
+ ngOnDestroy() {
1464
+ if (this.focusTimeoutId) {
1465
+ clearTimeout(this.focusTimeoutId);
1466
+ }
1467
+ }
1435
1468
  setValue() {
1436
1469
  if (!this.ngControl?.control) {
1437
1470
  return;
@@ -1449,13 +1482,28 @@ class DateTimePickerComponent {
1449
1482
  time: this.parseDateService.changeFormat(dateTime, 'HH:mm')
1450
1483
  }, { emitEvent: false });
1451
1484
  }
1452
- dateChange(timeInput) {
1453
- if (!timeInput.value) {
1454
- timeInput.focus();
1455
- }
1456
- this.setDatTimeValue();
1485
+ onDatePickerClosed() {
1486
+ // Update form value first
1487
+ this.setDateTimeValue();
1488
+ // Mark that the datepicker just closed
1489
+ this.datePickerJustClosed = true;
1490
+ // Clear any existing timeout
1491
+ if (this.focusTimeoutId) {
1492
+ clearTimeout(this.focusTimeoutId);
1493
+ }
1494
+ // Use a callback that runs outside Angular's change detection
1495
+ this.focusTimeoutId = setTimeout(() => {
1496
+ // Focus time input
1497
+ if (this.timeInput?.nativeElement) {
1498
+ this.timeInput.nativeElement.focus();
1499
+ }
1500
+ // Reset flag after enough time
1501
+ setTimeout(() => {
1502
+ this.datePickerJustClosed = false;
1503
+ }, 200);
1504
+ }, 100); // Longer delay to let Angular Material finish its work
1457
1505
  }
1458
- setDatTimeValue() {
1506
+ setDateTimeValue() {
1459
1507
  if (this.form.value.date && this.form.value.time) {
1460
1508
  const date = this.parseDateService.changeFormat(this.form.value.date, 'YYYY-MM-DD');
1461
1509
  const time = this.form.value.time;
@@ -1466,20 +1514,50 @@ class DateTimePickerComponent {
1466
1514
  }
1467
1515
  this.dateChangeEvent.emit();
1468
1516
  }
1469
- onFocus() {
1517
+ onFocus(event) {
1518
+ // If datepicker just closed and focus is going to date input, move it to time input
1519
+ if (this.datePickerJustClosed) {
1520
+ const target = event.target;
1521
+ const dateInput = document.querySelector('input[formControlName="date"]');
1522
+ if (target === dateInput) {
1523
+ // Cancel any existing focus timeout
1524
+ if (this.focusTimeoutId) {
1525
+ clearTimeout(this.focusTimeoutId);
1526
+ }
1527
+ // Set new timeout to focus time input
1528
+ this.focusTimeoutId = setTimeout(() => {
1529
+ if (this.timeInput?.nativeElement) {
1530
+ this.timeInput.nativeElement.focus();
1531
+ }
1532
+ }, 10);
1533
+ return;
1534
+ }
1535
+ }
1470
1536
  this.isFocused = true;
1471
1537
  }
1472
- onBlur() {
1473
- this.isFocused = false;
1538
+ onBlur(event) {
1539
+ // Don't handle blur during datepicker transitions
1540
+ if (this.datePickerJustClosed) {
1541
+ return;
1542
+ }
1543
+ // Check if focus is moving to another element within our component
1544
+ setTimeout(() => {
1545
+ const dateInput = document.querySelector('input[formControlName="date"]');
1546
+ const timeInput = this.timeInput?.nativeElement;
1547
+ const activeElement = document.activeElement;
1548
+ if (activeElement !== dateInput && activeElement !== timeInput) {
1549
+ this.isFocused = false;
1550
+ }
1551
+ }, 50);
1474
1552
  }
1475
1553
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateTimePickerComponent, deps: [{ token: InputService }, { token: ParseDateService }], target: i0.ɵɵFactoryTarget.Component }); }
1476
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateTimePickerComponent, isStandalone: true, selector: "i-tech-date-time-picker", inputs: { label: "label", submit: "submit", required: "required", disabled: "disabled" }, outputs: { dateChangeEvent: "dateChangeEvent" }, providers: [ParseDateService], ngImport: i0, template: "<div class=\"date_time_picker_container\"\n *ngIf=\"ngControl?.control\"\n [class.readonly_field]=\"disabled\"\n>\n <mat-label [ngClass]=\"{'readonly-color': disabled}\">{{label | translate}}</mat-label>\n <span *ngIf=\"required\" class=\"required-input\" [ngClass]=\"{'readonly-color': disabled}\"> *</span>\n\n <div class=\"date_time_picker\"\n [formGroup]=\"form\"\n [ngClass]=\"{'focused': isFocused, 'disabled': disabled}\"\n >\n <input type=\"text\" dateMask class=\"date\"\n placeholder=\"mm/dd/yy\"\n formControlName=\"date\"\n [matDatepicker]=\"DatePicker\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && DatePicker.open()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (selectionchange)=\"dateChange(dateElement)\"\n >\n <mat-datepicker #DatePicker></mat-datepicker>\n <input type=\"time\"\n #dateElement\n class=\"time\"\n formControlName=\"time\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (change)=\"setDatTimeValue()\"\n />\n </div>\n <!-- Error Messages -->\n <mat-error *ngIf=\"!!(ngControl.control.errors && submit)\">\n {{ngControl.control | generateErrorMessages : (label || '')}}\n </mat-error>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3$1.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i3$1.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "directive", type: DateMaskDirective, selector: "[dateMask]", inputs: ["maskType", "matDatepicker", "rangeFormControl"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "pipe", type: GenerateErrorMessagesPipe, name: "generateErrorMessages" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }] }); }
1554
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateTimePickerComponent, isStandalone: true, selector: "i-tech-date-time-picker", inputs: { label: "label", submit: "submit", required: "required", disabled: "disabled" }, outputs: { dateChangeEvent: "dateChangeEvent" }, providers: [ParseDateService], viewQueries: [{ propertyName: "timeInput", first: true, predicate: ["dateElement"], descendants: true }], ngImport: i0, template: "<div class=\"date_time_picker_container\"\n *ngIf=\"ngControl?.control\"\n [class.readonly_field]=\"disabled\"\n>\n <mat-label [ngClass]=\"{'readonly-color': disabled}\">{{label | translate}}</mat-label>\n <span *ngIf=\"required\" class=\"required-input\" [ngClass]=\"{'readonly-color': disabled}\"> *</span>\n\n <div class=\"date_time_picker\"\n [formGroup]=\"form\"\n [ngClass]=\"{'focused': isFocused, 'disabled': disabled}\"\n >\n <input type=\"text\" dateMask class=\"date\"\n placeholder=\"mm/dd/yy\"\n formControlName=\"date\"\n [matDatepicker]=\"DatePicker\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && DatePicker.open()\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n >\n <mat-datepicker #DatePicker\n (closed)=\"onDatePickerClosed()\">\n </mat-datepicker>\n <input type=\"time\"\n #dateElement\n class=\"time\"\n formControlName=\"time\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (change)=\"setDateTimeValue()\"\n />\n </div>\n <!-- Error Messages -->\n <mat-error *ngIf=\"!!(ngControl.control.errors && submit)\">\n {{ngControl.control | generateErrorMessages : (label || '')}}\n </mat-error>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3$1.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i3$1.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "directive", type: DateMaskDirective, selector: "[dateMask]", inputs: ["maskType", "matDatepicker", "rangeFormControl"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "pipe", type: GenerateErrorMessagesPipe, name: "generateErrorMessages" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }] }); }
1477
1555
  }
1478
1556
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateTimePickerComponent, decorators: [{
1479
1557
  type: Component,
1480
1558
  args: [{ selector: 'i-tech-date-time-picker', imports: [MatDatepickerModule, NgxMaskDirective, DateMaskDirective, TranslateModule,
1481
1559
  FormsModule, NgClass, ReactiveFormsModule, MatLabel, GenerateErrorMessagesPipe, NgIf, MatError
1482
- ], standalone: true, providers: [ParseDateService], template: "<div class=\"date_time_picker_container\"\n *ngIf=\"ngControl?.control\"\n [class.readonly_field]=\"disabled\"\n>\n <mat-label [ngClass]=\"{'readonly-color': disabled}\">{{label | translate}}</mat-label>\n <span *ngIf=\"required\" class=\"required-input\" [ngClass]=\"{'readonly-color': disabled}\"> *</span>\n\n <div class=\"date_time_picker\"\n [formGroup]=\"form\"\n [ngClass]=\"{'focused': isFocused, 'disabled': disabled}\"\n >\n <input type=\"text\" dateMask class=\"date\"\n placeholder=\"mm/dd/yy\"\n formControlName=\"date\"\n [matDatepicker]=\"DatePicker\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && DatePicker.open()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (selectionchange)=\"dateChange(dateElement)\"\n >\n <mat-datepicker #DatePicker></mat-datepicker>\n <input type=\"time\"\n #dateElement\n class=\"time\"\n formControlName=\"time\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (change)=\"setDatTimeValue()\"\n />\n </div>\n <!-- Error Messages -->\n <mat-error *ngIf=\"!!(ngControl.control.errors && submit)\">\n {{ngControl.control | generateErrorMessages : (label || '')}}\n </mat-error>\n</div>\n" }]
1560
+ ], standalone: true, providers: [ParseDateService], template: "<div class=\"date_time_picker_container\"\n *ngIf=\"ngControl?.control\"\n [class.readonly_field]=\"disabled\"\n>\n <mat-label [ngClass]=\"{'readonly-color': disabled}\">{{label | translate}}</mat-label>\n <span *ngIf=\"required\" class=\"required-input\" [ngClass]=\"{'readonly-color': disabled}\"> *</span>\n\n <div class=\"date_time_picker\"\n [formGroup]=\"form\"\n [ngClass]=\"{'focused': isFocused, 'disabled': disabled}\"\n >\n <input type=\"text\" dateMask class=\"date\"\n placeholder=\"mm/dd/yy\"\n formControlName=\"date\"\n [matDatepicker]=\"DatePicker\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && DatePicker.open()\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n >\n <mat-datepicker #DatePicker\n (closed)=\"onDatePickerClosed()\">\n </mat-datepicker>\n <input type=\"time\"\n #dateElement\n class=\"time\"\n formControlName=\"time\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (change)=\"setDateTimeValue()\"\n />\n </div>\n <!-- Error Messages -->\n <mat-error *ngIf=\"!!(ngControl.control.errors && submit)\">\n {{ngControl.control | generateErrorMessages : (label || '')}}\n </mat-error>\n</div>\n" }]
1483
1561
  }], ctorParameters: () => [{ type: InputService }, { type: ParseDateService }], propDecorators: { dateChangeEvent: [{
1484
1562
  type: Output
1485
1563
  }], label: [{
@@ -1490,6 +1568,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1490
1568
  type: Input
1491
1569
  }], disabled: [{
1492
1570
  type: Input
1571
+ }], timeInput: [{
1572
+ type: ViewChild,
1573
+ args: ['dateElement']
1493
1574
  }] } });
1494
1575
 
1495
1576
  /*