@ohioepa/oepa-ui-lib 2.0.11 → 2.0.12

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.
@@ -3,7 +3,6 @@ import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/forms";
4
4
  import * as i2 from "@ohioepa/oepa-common-lib";
5
5
  import * as i3 from "@angular/common";
6
- import * as i4 from "ngx-bootstrap/timepicker";
7
6
  export class StartEndTimepickerComponent {
8
7
  fb;
9
8
  idService;
@@ -17,17 +16,17 @@ export class StartEndTimepickerComponent {
17
16
  isDisabled = false;
18
17
  defaultTimeRange = {};
19
18
  offsetHours = 0;
20
- form;
19
+ group;
21
20
  validStart = true;
22
21
  validEnd = true;
23
22
  constructor(fb, idService) {
24
23
  this.fb = fb;
25
24
  this.idService = idService;
26
- this.form = this.fb.group({
25
+ this.group = this.fb.group({
27
26
  start: null,
28
27
  end: null
29
28
  });
30
- this.form.get("start")?.valueChanges.subscribe(time => {
29
+ this.group.get("start")?.valueChanges.subscribe(time => {
31
30
  if (this.validStart) {
32
31
  let tmpTime = new Date(time);
33
32
  tmpTime.setHours(time.getHours() - this.offsetHours);
@@ -42,7 +41,7 @@ export class StartEndTimepickerComponent {
42
41
  }
43
42
  this.timeRangeInfoChange.emit(this.timeRangeInfo);
44
43
  });
45
- this.form.get("end")?.valueChanges.subscribe(time => {
44
+ this.group.get("end")?.valueChanges.subscribe(time => {
46
45
  if (this.validEnd) {
47
46
  let tmpTime = new Date(time);
48
47
  tmpTime.setHours(time.getHours() - this.offsetHours);
@@ -65,10 +64,10 @@ export class StartEndTimepickerComponent {
65
64
  this.validEnd = event;
66
65
  }
67
66
  ngOnInit() {
68
- if (this.form) {
69
- this.startComponentId = this.idService.getComponentId(this.form);
67
+ if (this.group) {
68
+ this.startComponentId = this.idService.getComponentId(this.group);
70
69
  this.startComponentId += (this.startComponentId.length > 0 ? '_' : '') + ('StartTime');
71
- this.endComponentId = this.idService.getComponentId(this.form);
70
+ this.endComponentId = this.idService.getComponentId(this.group);
72
71
  this.endComponentId += (this.endComponentId.length > 0 ? '_' : '') + ('EndTime');
73
72
  }
74
73
  else {
@@ -85,12 +84,12 @@ export class StartEndTimepickerComponent {
85
84
  this.timeRangeInfo.endSecond = this.defaultTimeRange.endSecond;
86
85
  }
87
86
  if (this.timeRangeInfo.startHour) {
88
- this.form.patchValue({
87
+ this.group.patchValue({
89
88
  start: this.setTime(this.timeRangeInfo.startHour, this.timeRangeInfo.startMinute || 0),
90
89
  });
91
90
  }
92
91
  if (this.timeRangeInfo.endHour) {
93
- this.form.patchValue({
92
+ this.group.patchValue({
94
93
  end: this.setTime(this.timeRangeInfo.endHour, this.timeRangeInfo.endMinute || 0),
95
94
  });
96
95
  }
@@ -102,12 +101,31 @@ export class StartEndTimepickerComponent {
102
101
  date.setSeconds(0);
103
102
  return date;
104
103
  }
104
+ onTimeChange(event, field) {
105
+ const value = event.target.value; // "HH:mm"
106
+ if (!value) {
107
+ this.group.get(field)?.setValue(null);
108
+ return;
109
+ }
110
+ const [hours, minutes] = value.split(':').map(Number);
111
+ const date = new Date(this.group.get(field)?.value || new Date());
112
+ date.setHours(hours, minutes, 0, 0);
113
+ this.group.get(field)?.setValue(date, { emitEvent: true });
114
+ }
115
+ toTimeString(value) {
116
+ if (!value)
117
+ return '';
118
+ const d = new Date(value);
119
+ const hh = d.getHours().toString().padStart(2, '0');
120
+ const mm = d.getMinutes().toString().padStart(2, '0');
121
+ return `${hh}:${mm}`;
122
+ }
105
123
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartEndTimepickerComponent, deps: [{ token: i1.FormBuilder }, { token: i2.OepaComponentIdService }], target: i0.ɵɵFactoryTarget.Component });
106
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StartEndTimepickerComponent, selector: "oepa-start-end-timepicker", inputs: { timeRangeInfo: "timeRangeInfo", showValidation: "showValidation", isRequired: "isRequired", isReadOnly: "isReadOnly", isDisabled: "isDisabled", defaultTimeRange: "defaultTimeRange" }, outputs: { timeRangeInfoChange: "timeRangeInfoChange" }, ngImport: i0, template: "<div [formGroup]=\"form\">\n <div class=\"form-group row\">\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validStart}\">\n <div class=\"input-group\">\n <timepicker formControlName=\"start\" [readonlyInput]=\"isReadOnly\" [id]=\"startComponentId+'_StartTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidStart($event)\"></timepicker>\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validStart\">Time is invalid</small>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validEnd}\">\n <div class=\"input-group\">\n <timepicker formControlName=\"end\" [readonlyInput]=\"isReadOnly\" [id]=\"endComponentId+'_EndTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidEnd($event)\"></timepicker>\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validEnd\">Time is invalid</small>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.TimepickerComponent, selector: "timepicker", inputs: ["hourStep", "minuteStep", "secondsStep", "readonlyInput", "disabled", "mousewheel", "arrowkeys", "showSpinners", "showMeridian", "showMinutes", "showSeconds", "meridians", "min", "max", "hoursPlaceholder", "minutesPlaceholder", "secondsPlaceholder"], outputs: ["isValid", "meridianChange"] }] });
124
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StartEndTimepickerComponent, selector: "oepa-start-end-timepicker", inputs: { timeRangeInfo: "timeRangeInfo", showValidation: "showValidation", isRequired: "isRequired", isReadOnly: "isReadOnly", isDisabled: "isDisabled", defaultTimeRange: "defaultTimeRange" }, outputs: { timeRangeInfoChange: "timeRangeInfoChange" }, ngImport: i0, template: "<div [formGroup]=\"group\">\n <div class=\"form-group row\">\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validStart}\">\n <div class=\"input-group\">\n <!-- <timepicker formControlName=\"start\" [readonlyInput]=\"isReadOnly\" [id]=\"startComponentId+'_StartTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidStart($event)\"></timepicker> -->\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get('start')?.value)\"\n (change)=\"onTimeChange($event, 'start')\"\n [readonly]=\"isReadOnly\"\n aria-label=\"Start time input\"\n />\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validStart\">Time is invalid</small>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validEnd}\">\n <div class=\"input-group\">\n <!-- <timepicker formControlName=\"end\" [readonlyInput]=\"isReadOnly\" [id]=\"endComponentId+'_EndTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidEnd($event)\"></timepicker> -->\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get('end')?.value)\"\n (change)=\"onTimeChange($event, 'end')\"\n [readonly]=\"isReadOnly\"\n aria-label=\"End time input\"\n />\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validEnd\">Time is invalid</small>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
107
125
  }
108
126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartEndTimepickerComponent, decorators: [{
109
127
  type: Component,
110
- args: [{ selector: 'oepa-start-end-timepicker', template: "<div [formGroup]=\"form\">\n <div class=\"form-group row\">\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validStart}\">\n <div class=\"input-group\">\n <timepicker formControlName=\"start\" [readonlyInput]=\"isReadOnly\" [id]=\"startComponentId+'_StartTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidStart($event)\"></timepicker>\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validStart\">Time is invalid</small>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validEnd}\">\n <div class=\"input-group\">\n <timepicker formControlName=\"end\" [readonlyInput]=\"isReadOnly\" [id]=\"endComponentId+'_EndTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidEnd($event)\"></timepicker>\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validEnd\">Time is invalid</small>\n </div>\n </div>\n </div>\n</div>\n" }]
128
+ args: [{ selector: 'oepa-start-end-timepicker', template: "<div [formGroup]=\"group\">\n <div class=\"form-group row\">\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validStart}\">\n <div class=\"input-group\">\n <!-- <timepicker formControlName=\"start\" [readonlyInput]=\"isReadOnly\" [id]=\"startComponentId+'_StartTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidStart($event)\"></timepicker> -->\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get('start')?.value)\"\n (change)=\"onTimeChange($event, 'start')\"\n [readonly]=\"isReadOnly\"\n aria-label=\"Start time input\"\n />\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validStart\">Time is invalid</small>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validEnd}\">\n <div class=\"input-group\">\n <!-- <timepicker formControlName=\"end\" [readonlyInput]=\"isReadOnly\" [id]=\"endComponentId+'_EndTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidEnd($event)\"></timepicker> -->\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get('end')?.value)\"\n (change)=\"onTimeChange($event, 'end')\"\n [readonly]=\"isReadOnly\"\n aria-label=\"End time input\"\n />\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validEnd\">Time is invalid</small>\n </div>\n </div>\n </div>\n</div>\n" }]
111
129
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.OepaComponentIdService }], propDecorators: { timeRangeInfo: [{
112
130
  type: Input
113
131
  }], timeRangeInfoChange: [{
@@ -123,4 +141,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
123
141
  }], defaultTimeRange: [{
124
142
  type: Input
125
143
  }] } });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQtZW5kLXRpbWVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9zdGFydC1lbmQtdGltZXBpY2tlci9zdGFydC1lbmQtdGltZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3N0YXJ0LWVuZC10aW1lcGlja2VyL3N0YXJ0LWVuZC10aW1lcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQVUvRSxNQUFNLE9BQU8sMkJBQTJCO0lBbUI1QjtJQUNBO0lBbkJILGdCQUFnQixHQUFHLHlCQUF5QixDQUFDO0lBQzdDLGNBQWMsR0FBRyx5QkFBeUIsQ0FBQztJQUV6QyxhQUFhLEdBQWMsRUFBRSxDQUFDO0lBQzdCLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7SUFFckQsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixnQkFBZ0IsR0FBYyxFQUFFLENBQUM7SUFFbEMsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQVk7SUFDdkIsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNsQixRQUFRLEdBQUcsSUFBSSxDQUFDO0lBRWhCLFlBQ1UsRUFBZSxFQUNmLFNBQWlDO1FBRGpDLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixjQUFTLEdBQVQsU0FBUyxDQUF3QjtRQUV6QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxD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VUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9lcGFDb21wb25lbnRJZFNlcnZpY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuaW1wb3J0IHsgVGltZVJhbmdlIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1lYml6LWxpYic7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLXN0YXJ0LWVuZC10aW1lcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0YXJ0LWVuZC10aW1lcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3RhcnQtZW5kLXRpbWVwaWNrZXIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFN0YXJ0RW5kVGltZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHB1YmxpYyBzdGFydENvbXBvbmVudElkID0gJ09lcGFUaW1lcGlja2VyQ29tcG9uZW50JztcbiAgcHVibGljIGVuZENvbXBvbmVudElkID0gJ09lcGFUaW1lcGlja2VyQ29tcG9uZW50JztcblxuICBASW5wdXQoKSB0aW1lUmFuZ2VJbmZvOiBUaW1lUmFuZ2UgPSB7fTtcbiAgQE91dHB1dCgpIHRpbWVSYW5nZUluZm9DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRpbWVSYW5nZT4oKTtcblxuICBASW5wdXQoKSBzaG93VmFsaWRhdGlvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1JlcXVpcmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgaXNEaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWZhdWx0VGltZVJhbmdlOiBUaW1lUmFuZ2UgPSB7fTtcblxuICBwcml2YXRlIG9mZnNldEhvdXJzID0gMDtcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcbiAgdmFsaWRTdGFydCA9IHRydWU7XG4gIHZhbGlkRW5kID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGlkU2VydmljZTogT2VwYUNvbXBvbmVudElkU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBzdGFydDogbnVsbCxcbiAgICAgIGVuZDogbnVsbFxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuZm9ybS5nZXQoXCJzdGFydFwiKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh0aW1lID0+IHtcbiAgICAgIGlmKHRoaXMudmFsaWRTdGFydCkge1xuICAgICAgICBsZXQgdG1wVGltZTogRGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICB0bXBUaW1lLnNldEhvdXJzKHRpbWUuZ2V0SG91cnMoKSAtIHRoaXMub2Zmc2V0SG91cnMpO1xuICAgICAgICB0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRIb3VyID0gdG1wVGltZS5nZXRIb3VycygpO1xuICAgICAgICB0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRNaW51dGUgPSB0bXBUaW1lLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLnN0YXJ0U2Vjb25kID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGltZVJhbmdlSW5mby5zdGFydEhvdXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudGltZVJhbmdlSW5mby5zdGFydE1pbnV0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLnN0YXJ0U2Vjb25kID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvQ2hhbmdlLmVtaXQodGhpcy50aW1lUmFuZ2VJbmZvKTtcbiAgICB9KTtcbiAgICB0aGlzLmZvcm0uZ2V0KFwiZW5kXCIpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHRpbWUgPT4ge1xuICAgICAgaWYodGhpcy52YWxpZEVuZCkge1xuICAgICAgICBsZXQgdG1wVGltZTogRGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICB0bXBUaW1lLnNldEhvdXJzKHRpbWUuZ2V0SG91cnMoKSAtIHRoaXMub2Zmc2V0SG91cnMpO1xuICAgICAgICB0aGlzLnRpbWVSYW5nZUluZm8uZW5kSG91ciA9IHRtcFRpbWUuZ2V0SG91cnMoKTtcbiAgICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLmVuZE1pbnV0ZSA9IHRtcFRpbWUuZ2V0TWludXRlcygpO1xuICAgICAgICB0aGlzLnRpbWVSYW5nZUluZm8uZW5kU2Vjb25kID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGltZVJhbmdlSW5mby5lbmRIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRpbWVSYW5nZUluZm8uZW5kTWludXRlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRpbWVSYW5nZUluZm8uZW5kU2Vjb25kID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvQ2hhbmdlLmVtaXQodGhpcy50aW1lUmFuZ2VJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzVmFsaWRTdGFydChldmVudDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmFsaWRTdGFydCA9IGV2ZW50O1xuICB9XG4gIGlzVmFsaWRFbmQoZXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkRW5kID0gZXZlbnQ7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICB0aGlzLnN0YXJ0Q29tcG9uZW50SWQgPSB0aGlzLmlkU2VydmljZS5nZXRDb21wb25lbnRJZCh0aGlzLmZvcm0pO1xuICAgICAgdGhpcy5zdGFydENvbXBvbmVudElkICs9ICh0aGlzLnN0YXJ0Q29tcG9uZW50SWQubGVuZ3RoID4gMCA/ICdfJyA6ICcnKSArICgnU3RhcnRUaW1lJyk7XG4gICAgICB0aGlzLmVuZENvbXBvbmVudElkID0gdGhpcy5pZFNlcnZpY2UuZ2V0Q29tcG9uZW50SWQodGhpcy5mb3JtKTtcbiAgICAgIHRoaXMuZW5kQ29tcG9uZW50SWQgKz0gKHRoaXMuZW5kQ29tcG9uZW50SWQubGVuZ3RoID4gMCA/ICdfJyA6ICcnKSArICgnRW5kVGltZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnT09QUyBObyBkYXRlcGlja2VyRm9ybSB5ZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudGltZVJhbmdlSW5mby5zdGFydEhvdXIgJiYgdGhpcy5kZWZhdWx0VGltZVJhbmdlICYmIHRoaXMuZGVmYXVsdFRpbWVSYW5nZS5zdGFydEhvdXIpIHtcbiAgICAgIHRoaXMudGltZVJhbmdlSW5mby5zdGFydEhvdXIgPSB0aGlzLmRlZmF1bHRUaW1lUmFuZ2Uuc3RhcnRIb3VyO1xuICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLnN0YXJ0TWludXRlID0gdGhpcy5kZWZhdWx0VGltZVJhbmdlLnN0YXJ0TWludXRlO1xuICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLnN0YXJ0U2Vjb25kID0gdGhpcy5kZWZhdWx0VGltZVJhbmdlLnN0YXJ0U2Vjb25kO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudGltZVJhbmdlSW5mby5lbmRIb3VyICYmIHRoaXMuZGVmYXVsdFRpbWVSYW5nZSAmJiB0aGlzLmRlZmF1bHRUaW1lUmFuZ2UuZW5kSG91cikge1xuICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLmVuZEhvdXIgPSB0aGlzLmRlZmF1bHRUaW1lUmFuZ2UuZW5kSG91cjtcbiAgICAgIHRoaXMudGltZVJhbmdlSW5mby5lbmRNaW51dGUgPSB0aGlzLmRlZmF1bHRUaW1lUmFuZ2UuZW5kTWludXRlO1xuICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLmVuZFNlY29uZCA9IHRoaXMuZGVmYXVsdFRpbWVSYW5nZS5lbmRTZWNvbmQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGltZVJhbmdlSW5mby5zdGFydEhvdXIpIHtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgc3RhcnQ6IHRoaXMuc2V0VGltZSh0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRIb3VyLCB0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRNaW51dGUgfHwgMCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZVJhbmdlSW5mby5lbmRIb3VyKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGVuZDogdGhpcy5zZXRUaW1lKHRoaXMudGltZVJhbmdlSW5mby5lbmRIb3VyLCB0aGlzLnRpbWVSYW5nZUluZm8uZW5kTWludXRlIHx8IDApLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0VGltZShob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyKTogRGF0ZSB7XG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGRhdGUuc2V0SG91cnMoaG91cik7XG4gICAgZGF0ZS5zZXRNaW51dGVzKG1pbnV0ZSk7XG4gICAgZGF0ZS5zZXRTZWNvbmRzKDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmb3JtLWdyb3VwXCIgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJzpzaG93VmFsaWRhdGlvbiAmJiBpc1JlcXVpcmVkICYmICF2YWxpZFN0YXJ0fVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8dGltZXBpY2tlciBmb3JtQ29udHJvbE5hbWU9XCJzdGFydFwiIFtyZWFkb25seUlucHV0XT1cImlzUmVhZE9ubHlcIiBbaWRdPVwic3RhcnRDb21wb25lbnRJZCsnX1N0YXJ0VGltZSdcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiIChpc1ZhbGlkKT1cImlzVmFsaWRTdGFydCgkZXZlbnQpXCI+PC90aW1lcGlja2VyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNtYWxsIGNsYXNzPVwiaGVscC1ibG9ja1wiICpuZ0lmPVwic2hvd1ZhbGlkYXRpb24gJiYgaXNSZXF1aXJlZCAmJiAhdmFsaWRTdGFydFwiPlRpbWUgaXMgaW52YWxpZDwvc21hbGw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZm9ybS1ncm91cFwiIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCc6c2hvd1ZhbGlkYXRpb24gJiYgaXNSZXF1aXJlZCAmJiAhdmFsaWRFbmR9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgIDx0aW1lcGlja2VyIGZvcm1Db250cm9sTmFtZT1cImVuZFwiIFtyZWFkb25seUlucHV0XT1cImlzUmVhZE9ubHlcIiBbaWRdPVwiZW5kQ29tcG9uZW50SWQrJ19FbmRUaW1lJ1wiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgKGlzVmFsaWQpPVwiaXNWYWxpZEVuZCgkZXZlbnQpXCI+PC90aW1lcGlja2VyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNtYWxsIGNsYXNzPVwiaGVscC1ibG9ja1wiICpuZ0lmPVwic2hvd1ZhbGlkYXRpb24gJiYgaXNSZXF1aXJlZCAmJiAhdmFsaWRFbmRcIj5UaW1lIGlzIGludmFsaWQ8L3NtYWxsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQtZW5kLXRpbWVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9zdGFydC1lbmQtdGltZXBpY2tlci9zdGFydC1lbmQtdGltZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3N0YXJ0LWVuZC10aW1lcGlja2VyL3N0YXJ0LWVuZC10aW1lcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBVS9FLE1BQU0sT0FBTywyQkFBMkI7SUFrQjVCO0lBQ0E7SUFsQkgsZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7SUFDN0MsY0FBYyxHQUFHLHlCQUF5QixDQUFDO0lBRXpDLGFBQWEsR0FBYyxFQUFFLENBQUM7SUFDN0IsbUJBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUNyRCxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLGdCQUFnQixHQUFjLEVBQUUsQ0FBQztJQUVsQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssQ0FBWTtJQUN4QixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFFaEIsWUFDVSxFQUFlLEVBQ2YsU0FBaUM7UUFEakMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGNBQVMsR0FBVCxTQUFTLENBQXdCO1FBRXpDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENB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SztnQkFDSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0UsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcbmltcG9ydCB7IFRpbWVSYW5nZSB9IGZyb20gJ0BvaGlvZXBhL29lcGEtZWJpei1saWInO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1zdGFydC1lbmQtdGltZXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFydC1lbmQtdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YXJ0LWVuZC10aW1lcGlja2VyLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdGFydEVuZFRpbWVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgc3RhcnRDb21wb25lbnRJZCA9ICdPZXBhVGltZXBpY2tlckNvbXBvbmVudCc7XG4gIHB1YmxpYyBlbmRDb21wb25lbnRJZCA9ICdPZXBhVGltZXBpY2tlckNvbXBvbmVudCc7XG4gIFxuICBASW5wdXQoKSB0aW1lUmFuZ2VJbmZvOiBUaW1lUmFuZ2UgPSB7fTtcbiAgQE91dHB1dCgpIHRpbWVSYW5nZUluZm9DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRpbWVSYW5nZT4oKTtcbiAgQElucHV0KCkgc2hvd1ZhbGlkYXRpb24gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1JlYWRPbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZGVmYXVsdFRpbWVSYW5nZTogVGltZVJhbmdlID0ge307XG5cbiAgcHJpdmF0ZSBvZmZzZXRIb3VycyA9IDA7XG4gIHB1YmxpYyBncm91cDogRm9ybUdyb3VwO1xuICB2YWxpZFN0YXJ0ID0gdHJ1ZTtcbiAgdmFsaWRFbmQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgaWRTZXJ2aWNlOiBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBzdGFydDogbnVsbCxcbiAgICAgIGVuZDogbnVsbFxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuZ3JvdXAuZ2V0KFwic3RhcnRcIik/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodGltZSA9PiB7XG4gICAgICBpZih0aGlzLnZhbGlkU3RhcnQpIHtcbiAgICAgICAgbGV0IHRtcFRpbWU6IERhdGUgPSBuZXcgRGF0ZSh0aW1lKTtcbiAgICAgICAgdG1wVGltZS5zZXRIb3Vycyh0aW1lLmdldEhvdXJzKCkgLSB0aGlzLm9mZnNldEhvdXJzKTtcbiAgICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLnN0YXJ0SG91ciA9IHRtcFRpbWUuZ2V0SG91cnMoKTtcbiAgICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLnN0YXJ0TWludXRlID0gdG1wVGltZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIHRoaXMudGltZVJhbmdlSW5mby5zdGFydFNlY29uZCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRNaW51dGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudGltZVJhbmdlSW5mby5zdGFydFNlY29uZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZVJhbmdlSW5mb0NoYW5nZS5lbWl0KHRoaXMudGltZVJhbmdlSW5mbyk7XG4gICAgfSk7XG4gICAgdGhpcy5ncm91cC5nZXQoXCJlbmRcIik/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodGltZSA9PiB7XG4gICAgICBpZih0aGlzLnZhbGlkRW5kKSB7XG4gICAgICAgIGxldCB0bXBUaW1lOiBEYXRlID0gbmV3IERhdGUodGltZSk7XG4gICAgICAgIHRtcFRpbWUuc2V0SG91cnModGltZS5nZXRIb3VycygpIC0gdGhpcy5vZmZzZXRIb3Vycyk7XG4gICAgICAgIHRoaXMudGltZVJhbmdlSW5mby5lbmRIb3VyID0gdG1wVGltZS5nZXRIb3VycygpO1xuICAgICAgICB0aGlzLnRpbWVSYW5nZUluZm8uZW5kTWludXRlID0gdG1wVGltZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIHRoaXMudGltZVJhbmdlSW5mby5lbmRTZWNvbmQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLmVuZEhvdXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudGltZVJhbmdlSW5mby5lbmRNaW51dGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudGltZVJhbmdlSW5mby5lbmRTZWNvbmQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLnRpbWVSYW5nZUluZm9DaGFuZ2UuZW1pdCh0aGlzLnRpbWVSYW5nZUluZm8pO1xuICAgIH0pO1xuICB9XG5cbiAgaXNWYWxpZFN0YXJ0KGV2ZW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZFN0YXJ0ID0gZXZlbnQ7XG4gIH1cbiAgaXNWYWxpZEVuZChldmVudDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmFsaWRFbmQgPSBldmVudDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmdyb3VwKSB7XG4gICAgICB0aGlzLnN0YXJ0Q29tcG9uZW50SWQgPSB0aGlzLmlkU2VydmljZS5nZXRDb21wb25lbnRJZCh0aGlzLmdyb3VwKTtcbiAgICAgIHRoaXMuc3RhcnRDb21wb25lbnRJZCArPSAodGhpcy5zdGFydENvbXBvbmVudElkLmxlbmd0aCA+IDAgPyAnXycgOiAnJykgKyAoJ1N0YXJ0VGltZScpO1xuICAgICAgdGhpcy5lbmRDb21wb25lbnRJZCA9IHRoaXMuaWRTZXJ2aWNlLmdldENvbXBvbmVudElkKHRoaXMuZ3JvdXApO1xuICAgICAgdGhpcy5lbmRDb21wb25lbnRJZCArPSAodGhpcy5lbmRDb21wb25lbnRJZC5sZW5ndGggPiAwID8gJ18nIDogJycpICsgKCdFbmRUaW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdPT1BTIE5vIGRhdGVwaWNrZXJGb3JtIHlldCcpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy50aW1lUmFuZ2VJbmZvLnN0YXJ0SG91ciAmJiB0aGlzLmRlZmF1bHRUaW1lUmFuZ2UgJiYgdGhpcy5kZWZhdWx0VGltZVJhbmdlLnN0YXJ0SG91cikge1xuICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLnN0YXJ0SG91ciA9IHRoaXMuZGVmYXVsdFRpbWVSYW5nZS5zdGFydEhvdXI7XG4gICAgICB0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRNaW51dGUgPSB0aGlzLmRlZmF1bHRUaW1lUmFuZ2Uuc3RhcnRNaW51dGU7XG4gICAgICB0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRTZWNvbmQgPSB0aGlzLmRlZmF1bHRUaW1lUmFuZ2Uuc3RhcnRTZWNvbmQ7XG4gICAgfVxuICAgIGlmICghdGhpcy50aW1lUmFuZ2VJbmZvLmVuZEhvdXIgJiYgdGhpcy5kZWZhdWx0VGltZVJhbmdlICYmIHRoaXMuZGVmYXVsdFRpbWVSYW5nZS5lbmRIb3VyKSB7XG4gICAgICB0aGlzLnRpbWVSYW5nZUluZm8uZW5kSG91ciA9IHRoaXMuZGVmYXVsdFRpbWVSYW5nZS5lbmRIb3VyO1xuICAgICAgdGhpcy50aW1lUmFuZ2VJbmZvLmVuZE1pbnV0ZSA9IHRoaXMuZGVmYXVsdFRpbWVSYW5nZS5lbmRNaW51dGU7XG4gICAgICB0aGlzLnRpbWVSYW5nZUluZm8uZW5kU2Vjb25kID0gdGhpcy5kZWZhdWx0VGltZVJhbmdlLmVuZFNlY29uZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50aW1lUmFuZ2VJbmZvLnN0YXJ0SG91cikge1xuICAgICAgdGhpcy5ncm91cC5wYXRjaFZhbHVlKHtcbiAgICAgICAgc3RhcnQ6IHRoaXMuc2V0VGltZSh0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRIb3VyLCB0aGlzLnRpbWVSYW5nZUluZm8uc3RhcnRNaW51dGUgfHwgMCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZVJhbmdlSW5mby5lbmRIb3VyKSB7XG4gICAgICB0aGlzLmdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgICBlbmQ6IHRoaXMuc2V0VGltZSh0aGlzLnRpbWVSYW5nZUluZm8uZW5kSG91ciwgdGhpcy50aW1lUmFuZ2VJbmZvLmVuZE1pbnV0ZSB8fCAwKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHNldFRpbWUoaG91cjogbnVtYmVyLCBtaW51dGU6IG51bWJlcik6IERhdGUge1xuICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICBkYXRlLnNldEhvdXJzKGhvdXIpO1xuICAgIGRhdGUuc2V0TWludXRlcyhtaW51dGUpO1xuICAgIGRhdGUuc2V0U2Vjb25kcygwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIG9uVGltZUNoYW5nZShldmVudDogYW55LCBmaWVsZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7IC8vIFwiSEg6bW1cIlxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuZ3JvdXAuZ2V0KGZpZWxkKT8uc2V0VmFsdWUobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHZhbHVlLnNwbGl0KCc6JykubWFwKE51bWJlcik7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuZ3JvdXAuZ2V0KGZpZWxkKT8udmFsdWUgfHwgbmV3IERhdGUoKSk7XG4gICAgZGF0ZS5zZXRIb3Vycyhob3VycywgbWludXRlcywgMCwgMCk7XG4gICAgdGhpcy5ncm91cC5nZXQoZmllbGQpPy5zZXRWYWx1ZShkYXRlLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgfVxuXG4gIHRvVGltZVN0cmluZyh2YWx1ZTogRGF0ZSB8IG51bGwpOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgY29uc3QgaGggPSBkLmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1tID0gZC5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuXG4gICAgcmV0dXJuIGAke2hofToke21tfWA7XG4gIH1cblxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmb3JtLWdyb3VwXCIgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJzpzaG93VmFsaWRhdGlvbiAmJiBpc1JlcXVpcmVkICYmICF2YWxpZFN0YXJ0fVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8IS0tIDx0aW1lcGlja2VyIGZvcm1Db250cm9sTmFtZT1cInN0YXJ0XCIgW3JlYWRvbmx5SW5wdXRdPVwiaXNSZWFkT25seVwiIFtpZF09XCJzdGFydENvbXBvbmVudElkKydfU3RhcnRUaW1lJ1wiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgKGlzVmFsaWQpPVwiaXNWYWxpZFN0YXJ0KCRldmVudClcIj48L3RpbWVwaWNrZXI+IC0tPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInRvVGltZVN0cmluZyhncm91cC5nZXQoJ3N0YXJ0Jyk/LnZhbHVlKVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUNoYW5nZSgkZXZlbnQsICdzdGFydCcpXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1JlYWRPbmx5XCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTdGFydCB0aW1lIGlucHV0XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNtYWxsIGNsYXNzPVwiaGVscC1ibG9ja1wiICpuZ0lmPVwic2hvd1ZhbGlkYXRpb24gJiYgaXNSZXF1aXJlZCAmJiAhdmFsaWRTdGFydFwiPlRpbWUgaXMgaW52YWxpZDwvc21hbGw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZm9ybS1ncm91cFwiIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCc6c2hvd1ZhbGlkYXRpb24gJiYgaXNSZXF1aXJlZCAmJiAhdmFsaWRFbmR9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgIDwhLS0gPHRpbWVwaWNrZXIgZm9ybUNvbnRyb2xOYW1lPVwiZW5kXCIgW3JlYWRvbmx5SW5wdXRdPVwiaXNSZWFkT25seVwiIFtpZF09XCJlbmRDb21wb25lbnRJZCsnX0VuZFRpbWUnXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiAoaXNWYWxpZCk9XCJpc1ZhbGlkRW5kKCRldmVudClcIj48L3RpbWVwaWNrZXI+IC0tPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInRvVGltZVN0cmluZyhncm91cC5nZXQoJ2VuZCcpPy52YWx1ZSlcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRpbWVDaGFuZ2UoJGV2ZW50LCAnZW5kJylcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cImlzUmVhZE9ubHlcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVuZCB0aW1lIGlucHV0XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNtYWxsIGNsYXNzPVwiaGVscC1ibG9ja1wiICpuZ0lmPVwic2hvd1ZhbGlkYXRpb24gJiYgaXNSZXF1aXJlZCAmJiAhdmFsaWRFbmRcIj5UaW1lIGlzIGludmFsaWQ8L3NtYWxsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -3,7 +3,6 @@ import * as i0 from "@angular/core";
3
3
  import * as i1 from "@ohioepa/oepa-common-lib";
4
4
  import * as i2 from "@angular/common";
5
5
  import * as i3 from "@angular/forms";
6
- import * as i4 from "ngx-bootstrap/timepicker";
7
6
  export class TimepickerComponent {
8
7
  idService;
9
8
  componentId = 'OepaTimepickerComponent';
@@ -14,6 +13,14 @@ export class TimepickerComponent {
14
13
  constructor(idService) {
15
14
  this.idService = idService;
16
15
  }
16
+ ngOnInit() {
17
+ if (this.group) {
18
+ this.componentId = this.idService.getComponentId(this.group);
19
+ }
20
+ else {
21
+ console.log('OOPS No group yet');
22
+ }
23
+ }
17
24
  checkValidity() {
18
25
  for (const key in this.group.controls) {
19
26
  if (this.group.controls.hasOwnProperty(key) && key === this.field) {
@@ -22,20 +29,31 @@ export class TimepickerComponent {
22
29
  }
23
30
  return null;
24
31
  }
25
- ngOnInit() {
26
- if (this.group) {
27
- this.componentId = this.idService.getComponentId(this.group);
28
- }
29
- else {
30
- console.log('OOPS No group yet');
32
+ onTimeChange(event) {
33
+ const value = event.target.value; // "HH:mm"
34
+ if (!value) {
35
+ this.group.get(this.field)?.setValue(null);
36
+ return;
31
37
  }
38
+ const [hours, minutes] = value.split(':').map(Number);
39
+ const date = new Date(this.group.get(this.field)?.value || new Date());
40
+ date.setHours(hours, minutes, 0, 0);
41
+ this.group.get(this.field)?.setValue(date, { emitEvent: true });
42
+ }
43
+ toTimeString(value) {
44
+ if (!value)
45
+ return '';
46
+ const d = new Date(value);
47
+ const hh = d.getHours().toString().padStart(2, '0');
48
+ const mm = d.getMinutes().toString().padStart(2, '0');
49
+ return `${hh}:${mm}`;
32
50
  }
33
51
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimepickerComponent, deps: [{ token: i1.OepaComponentIdService }], target: i0.ɵɵFactoryTarget.Component });
34
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TimepickerComponent, selector: "oepa-timepicker", inputs: { group: "group", field: "field", showValidation: "showValidation", readonlyInput: "readonlyInput" }, ngImport: i0, template: "<form [formGroup]=\"group\">\n <div class=\"col-md-12 form-group\">\n <div class=\"input-group\" [ngClass]=\"{'is-invalid':showValidation && !checkValidity()}\">\n <timepicker [formControlName]=\"field\" [readonlyInput]=\"readonlyInput\"></timepicker>\n </div>\n <small class=\"invalid-feedback d-block\" *ngIf=\"showValidation && !checkValidity()\">Time is required</small>\n </div>\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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: "component", type: i4.TimepickerComponent, selector: "timepicker", inputs: ["hourStep", "minuteStep", "secondsStep", "readonlyInput", "disabled", "mousewheel", "arrowkeys", "showSpinners", "showMeridian", "showMinutes", "showSeconds", "meridians", "min", "max", "hoursPlaceholder", "minutesPlaceholder", "secondsPlaceholder"], outputs: ["isValid", "meridianChange"] }] });
52
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TimepickerComponent, selector: "oepa-timepicker", inputs: { group: "group", field: "field", showValidation: "showValidation", readonlyInput: "readonlyInput" }, ngImport: i0, template: "<form [formGroup]=\"group\">\n <div class=\"col-md-12 form-group\">\n <div class=\"input-group\" [ngClass]=\"{'is-invalid': showValidation && !checkValidity()}\">\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get(field)?.value)\"\n (change)=\"onTimeChange($event)\"\n [readonly]=\"readonlyInput\"\n aria-label=\"Time input\"\n />\n </div>\n\n <small class=\"invalid-feedback d-block\"\n *ngIf=\"showValidation && !checkValidity()\">\n Time is required\n </small>\n </div>\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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"] }] });
35
53
  }
36
54
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimepickerComponent, decorators: [{
37
55
  type: Component,
38
- args: [{ selector: 'oepa-timepicker', template: "<form [formGroup]=\"group\">\n <div class=\"col-md-12 form-group\">\n <div class=\"input-group\" [ngClass]=\"{'is-invalid':showValidation && !checkValidity()}\">\n <timepicker [formControlName]=\"field\" [readonlyInput]=\"readonlyInput\"></timepicker>\n </div>\n <small class=\"invalid-feedback d-block\" *ngIf=\"showValidation && !checkValidity()\">Time is required</small>\n </div>\n</form>" }]
56
+ args: [{ selector: 'oepa-timepicker', template: "<form [formGroup]=\"group\">\n <div class=\"col-md-12 form-group\">\n <div class=\"input-group\" [ngClass]=\"{'is-invalid': showValidation && !checkValidity()}\">\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get(field)?.value)\"\n (change)=\"onTimeChange($event)\"\n [readonly]=\"readonlyInput\"\n aria-label=\"Time input\"\n />\n </div>\n\n <small class=\"invalid-feedback d-block\"\n *ngIf=\"showValidation && !checkValidity()\">\n Time is required\n </small>\n </div>\n</form>" }]
39
57
  }], ctorParameters: () => [{ type: i1.OepaComponentIdService }], propDecorators: { group: [{
40
58
  type: Input
41
59
  }], field: [{
@@ -45,4 +63,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
45
63
  }], readonlyInput: [{
46
64
  type: Input
47
65
  }] } });
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RpbWVwaWNrZXIvdGltZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RpbWVwaWNrZXIvdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBVXpELE1BQU0sT0FBTyxtQkFBbUI7SUFRVjtJQVBiLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQztJQUV0QyxLQUFLLENBQWE7SUFDbEIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNuQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFL0IsWUFBb0IsU0FBaUM7UUFBakMsY0FBUyxHQUFULFNBQVMsQ0FBd0I7SUFBSSxDQUFDO0lBRTFELGFBQWE7UUFDWCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7d0dBekJVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLHFLQ1ZoQywyWkFPTzs7NEZER00sbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGlCQUFpQjsyRkFPbEIsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgT2VwYUNvbXBvbmVudElkU2VydmljZSB9IGZyb20gJ0BvaGlvZXBhL29lcGEtY29tbW9uLWxpYic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29lcGEtdGltZXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi90aW1lcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGltZXBpY2tlci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVGltZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHB1YmxpYyBjb21wb25lbnRJZCA9ICdPZXBhVGltZXBpY2tlckNvbXBvbmVudCc7XG5cbiAgQElucHV0KCkgZ3JvdXAhOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGZpZWxkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2hvd1ZhbGlkYXRpb24gPSBmYWxzZTtcbiAgQElucHV0KCkgcmVhZG9ubHlJbnB1dCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaWRTZXJ2aWNlOiBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlKSB7IH1cblxuICBjaGVja1ZhbGlkaXR5KCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZ3JvdXAuY29udHJvbHMpIHtcbiAgICAgIGlmICh0aGlzLmdyb3VwLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGtleSkgJiYga2V5ID09PSB0aGlzLmZpZWxkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwLmNvbnRyb2xzW2tleV0uc3RhdHVzID09PSAnVkFMSUQnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmdyb3VwKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudElkID0gdGhpcy5pZFNlcnZpY2UuZ2V0Q29tcG9uZW50SWQodGhpcy5ncm91cCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdPT1BTIE5vIGdyb3VwIHlldCcpO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZm9ybS1ncm91cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnOnNob3dWYWxpZGF0aW9uICYmICFjaGVja1ZhbGlkaXR5KCl9XCI+XG4gICAgICA8dGltZXBpY2tlciBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkXCIgW3JlYWRvbmx5SW5wdXRdPVwicmVhZG9ubHlJbnB1dFwiPjwvdGltZXBpY2tlcj5cbiAgICA8L2Rpdj5cbiAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIGQtYmxvY2tcIiAqbmdJZj1cInNob3dWYWxpZGF0aW9uICYmICFjaGVja1ZhbGlkaXR5KClcIj5UaW1lIGlzIHJlcXVpcmVkPC9zbWFsbD5cbiAgPC9kaXY+XG48L2Zvcm0+Il19
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RpbWVwaWNrZXIvdGltZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RpbWVwaWNrZXIvdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFVekQsTUFBTSxPQUFPLG1CQUFtQjtJQVFWO0lBUGIsV0FBVyxHQUFHLHlCQUF5QixDQUFDO0lBRXRDLEtBQUssQ0FBYTtJQUNsQixLQUFLLEdBQVcsRUFBRSxDQUFDO0lBQ25CLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUUvQixZQUFvQixTQUFpQztRQUFqQyxjQUFTLEdBQVQsU0FBUyxDQUF3QjtJQUFJLENBQUM7SUFFMUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFVO1FBQ3JCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVTtRQUM1QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFrQjtRQUM3QixJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRXRCLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXRELE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7SUFDdkIsQ0FBQzt3R0FoRFUsbUJBQW1COzRGQUFuQixtQkFBbUIscUtDVmhDLHNsQkFrQk87OzRGRFJNLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7MkZBT2xCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE9lcGFDb21wb25lbnRJZFNlcnZpY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLXRpbWVwaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RpbWVwaWNrZXIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgY29tcG9uZW50SWQgPSAnT2VwYVRpbWVwaWNrZXJDb21wb25lbnQnO1xuXG4gIEBJbnB1dCgpIGdyb3VwITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmaWVsZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNob3dWYWxpZGF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlYWRvbmx5SW5wdXQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlkU2VydmljZTogT2VwYUNvbXBvbmVudElkU2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgIHRoaXMuY29tcG9uZW50SWQgPSB0aGlzLmlkU2VydmljZS5nZXRDb21wb25lbnRJZCh0aGlzLmdyb3VwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ09PUFMgTm8gZ3JvdXAgeWV0Jyk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tWYWxpZGl0eSgpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmdyb3VwLmNvbnRyb2xzKSB7XG4gICAgICBpZiAodGhpcy5ncm91cC5jb250cm9scy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGtleSA9PT0gdGhpcy5maWVsZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cC5jb250cm9sc1trZXldLnN0YXR1cyA9PT0gJ1ZBTElEJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBvblRpbWVDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlOyAvLyBcIkhIOm1tXCJcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLmZpZWxkKT8uc2V0VmFsdWUobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHZhbHVlLnNwbGl0KCc6JykubWFwKE51bWJlcik7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuZ3JvdXAuZ2V0KHRoaXMuZmllbGQpPy52YWx1ZSB8fCBuZXcgRGF0ZSgpKTtcbiAgICBkYXRlLnNldEhvdXJzKGhvdXJzLCBtaW51dGVzLCAwLCAwKTtcbiAgICB0aGlzLmdyb3VwLmdldCh0aGlzLmZpZWxkKT8uc2V0VmFsdWUoZGF0ZSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gIH1cblxuICB0b1RpbWVTdHJpbmcodmFsdWU6IERhdGUgfCBudWxsKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBkID0gbmV3IERhdGUodmFsdWUpO1xuICAgIGNvbnN0IGhoID0gZC5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBtbSA9IGQuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcblxuICAgIHJldHVybiBgJHtoaH06JHttbX1gO1xuICB9XG5cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmb3JtLWdyb3VwXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCIgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJzogc2hvd1ZhbGlkYXRpb24gJiYgIWNoZWNrVmFsaWRpdHkoKX1cIj5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwidGltZVwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgW3ZhbHVlXT1cInRvVGltZVN0cmluZyhncm91cC5nZXQoZmllbGQpPy52YWx1ZSlcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5SW5wdXRcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiVGltZSBpbnB1dFwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuXG4gICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBkLWJsb2NrXCJcbiAgICAgICAgICAgKm5nSWY9XCJzaG93VmFsaWRhdGlvbiAmJiAhY2hlY2tWYWxpZGl0eSgpXCI+XG4gICAgICBUaW1lIGlzIHJlcXVpcmVkXG4gICAgPC9zbWFsbD5cbiAgPC9kaXY+XG48L2Zvcm0+Il19
@@ -18,7 +18,7 @@ import * as i6 from '@angular/material/expansion';
18
18
  import { MatExpansionModule } from '@angular/material/expansion';
19
19
  import * as i4$1 from 'ngx-bootstrap/buttons';
20
20
  import { ButtonsModule } from 'ngx-bootstrap/buttons';
21
- import * as i4$2 from 'ngx-bootstrap/timepicker';
21
+ import * as i3$1 from 'ngx-bootstrap/timepicker';
22
22
  import { TimepickerModule } from 'ngx-bootstrap/timepicker';
23
23
  import * as i3 from 'ngx-bootstrap/dropdown';
24
24
  import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
@@ -8161,17 +8161,17 @@ class StartEndTimepickerComponent {
8161
8161
  isDisabled = false;
8162
8162
  defaultTimeRange = {};
8163
8163
  offsetHours = 0;
8164
- form;
8164
+ group;
8165
8165
  validStart = true;
8166
8166
  validEnd = true;
8167
8167
  constructor(fb, idService) {
8168
8168
  this.fb = fb;
8169
8169
  this.idService = idService;
8170
- this.form = this.fb.group({
8170
+ this.group = this.fb.group({
8171
8171
  start: null,
8172
8172
  end: null
8173
8173
  });
8174
- this.form.get("start")?.valueChanges.subscribe(time => {
8174
+ this.group.get("start")?.valueChanges.subscribe(time => {
8175
8175
  if (this.validStart) {
8176
8176
  let tmpTime = new Date(time);
8177
8177
  tmpTime.setHours(time.getHours() - this.offsetHours);
@@ -8186,7 +8186,7 @@ class StartEndTimepickerComponent {
8186
8186
  }
8187
8187
  this.timeRangeInfoChange.emit(this.timeRangeInfo);
8188
8188
  });
8189
- this.form.get("end")?.valueChanges.subscribe(time => {
8189
+ this.group.get("end")?.valueChanges.subscribe(time => {
8190
8190
  if (this.validEnd) {
8191
8191
  let tmpTime = new Date(time);
8192
8192
  tmpTime.setHours(time.getHours() - this.offsetHours);
@@ -8209,10 +8209,10 @@ class StartEndTimepickerComponent {
8209
8209
  this.validEnd = event;
8210
8210
  }
8211
8211
  ngOnInit() {
8212
- if (this.form) {
8213
- this.startComponentId = this.idService.getComponentId(this.form);
8212
+ if (this.group) {
8213
+ this.startComponentId = this.idService.getComponentId(this.group);
8214
8214
  this.startComponentId += (this.startComponentId.length > 0 ? '_' : '') + ('StartTime');
8215
- this.endComponentId = this.idService.getComponentId(this.form);
8215
+ this.endComponentId = this.idService.getComponentId(this.group);
8216
8216
  this.endComponentId += (this.endComponentId.length > 0 ? '_' : '') + ('EndTime');
8217
8217
  }
8218
8218
  else {
@@ -8229,12 +8229,12 @@ class StartEndTimepickerComponent {
8229
8229
  this.timeRangeInfo.endSecond = this.defaultTimeRange.endSecond;
8230
8230
  }
8231
8231
  if (this.timeRangeInfo.startHour) {
8232
- this.form.patchValue({
8232
+ this.group.patchValue({
8233
8233
  start: this.setTime(this.timeRangeInfo.startHour, this.timeRangeInfo.startMinute || 0),
8234
8234
  });
8235
8235
  }
8236
8236
  if (this.timeRangeInfo.endHour) {
8237
- this.form.patchValue({
8237
+ this.group.patchValue({
8238
8238
  end: this.setTime(this.timeRangeInfo.endHour, this.timeRangeInfo.endMinute || 0),
8239
8239
  });
8240
8240
  }
@@ -8246,12 +8246,31 @@ class StartEndTimepickerComponent {
8246
8246
  date.setSeconds(0);
8247
8247
  return date;
8248
8248
  }
8249
+ onTimeChange(event, field) {
8250
+ const value = event.target.value; // "HH:mm"
8251
+ if (!value) {
8252
+ this.group.get(field)?.setValue(null);
8253
+ return;
8254
+ }
8255
+ const [hours, minutes] = value.split(':').map(Number);
8256
+ const date = new Date(this.group.get(field)?.value || new Date());
8257
+ date.setHours(hours, minutes, 0, 0);
8258
+ this.group.get(field)?.setValue(date, { emitEvent: true });
8259
+ }
8260
+ toTimeString(value) {
8261
+ if (!value)
8262
+ return '';
8263
+ const d = new Date(value);
8264
+ const hh = d.getHours().toString().padStart(2, '0');
8265
+ const mm = d.getMinutes().toString().padStart(2, '0');
8266
+ return `${hh}:${mm}`;
8267
+ }
8249
8268
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartEndTimepickerComponent, deps: [{ token: i1$2.FormBuilder }, { token: i1$1.OepaComponentIdService }], target: i0.ɵɵFactoryTarget.Component });
8250
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StartEndTimepickerComponent, selector: "oepa-start-end-timepicker", inputs: { timeRangeInfo: "timeRangeInfo", showValidation: "showValidation", isRequired: "isRequired", isReadOnly: "isReadOnly", isDisabled: "isDisabled", defaultTimeRange: "defaultTimeRange" }, outputs: { timeRangeInfoChange: "timeRangeInfoChange" }, ngImport: i0, template: "<div [formGroup]=\"form\">\n <div class=\"form-group row\">\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validStart}\">\n <div class=\"input-group\">\n <timepicker formControlName=\"start\" [readonlyInput]=\"isReadOnly\" [id]=\"startComponentId+'_StartTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidStart($event)\"></timepicker>\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validStart\">Time is invalid</small>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validEnd}\">\n <div class=\"input-group\">\n <timepicker formControlName=\"end\" [readonlyInput]=\"isReadOnly\" [id]=\"endComponentId+'_EndTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidEnd($event)\"></timepicker>\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validEnd\">Time is invalid</small>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4$2.TimepickerComponent, selector: "timepicker", inputs: ["hourStep", "minuteStep", "secondsStep", "readonlyInput", "disabled", "mousewheel", "arrowkeys", "showSpinners", "showMeridian", "showMinutes", "showSeconds", "meridians", "min", "max", "hoursPlaceholder", "minutesPlaceholder", "secondsPlaceholder"], outputs: ["isValid", "meridianChange"] }] });
8269
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StartEndTimepickerComponent, selector: "oepa-start-end-timepicker", inputs: { timeRangeInfo: "timeRangeInfo", showValidation: "showValidation", isRequired: "isRequired", isReadOnly: "isReadOnly", isDisabled: "isDisabled", defaultTimeRange: "defaultTimeRange" }, outputs: { timeRangeInfoChange: "timeRangeInfoChange" }, ngImport: i0, template: "<div [formGroup]=\"group\">\n <div class=\"form-group row\">\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validStart}\">\n <div class=\"input-group\">\n <!-- <timepicker formControlName=\"start\" [readonlyInput]=\"isReadOnly\" [id]=\"startComponentId+'_StartTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidStart($event)\"></timepicker> -->\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get('start')?.value)\"\n (change)=\"onTimeChange($event, 'start')\"\n [readonly]=\"isReadOnly\"\n aria-label=\"Start time input\"\n />\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validStart\">Time is invalid</small>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validEnd}\">\n <div class=\"input-group\">\n <!-- <timepicker formControlName=\"end\" [readonlyInput]=\"isReadOnly\" [id]=\"endComponentId+'_EndTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidEnd($event)\"></timepicker> -->\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get('end')?.value)\"\n (change)=\"onTimeChange($event, 'end')\"\n [readonly]=\"isReadOnly\"\n aria-label=\"End time input\"\n />\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validEnd\">Time is invalid</small>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
8251
8270
  }
8252
8271
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartEndTimepickerComponent, decorators: [{
8253
8272
  type: Component,
8254
- args: [{ selector: 'oepa-start-end-timepicker', template: "<div [formGroup]=\"form\">\n <div class=\"form-group row\">\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validStart}\">\n <div class=\"input-group\">\n <timepicker formControlName=\"start\" [readonlyInput]=\"isReadOnly\" [id]=\"startComponentId+'_StartTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidStart($event)\"></timepicker>\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validStart\">Time is invalid</small>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validEnd}\">\n <div class=\"input-group\">\n <timepicker formControlName=\"end\" [readonlyInput]=\"isReadOnly\" [id]=\"endComponentId+'_EndTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidEnd($event)\"></timepicker>\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validEnd\">Time is invalid</small>\n </div>\n </div>\n </div>\n</div>\n" }]
8273
+ args: [{ selector: 'oepa-start-end-timepicker', template: "<div [formGroup]=\"group\">\n <div class=\"form-group row\">\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validStart}\">\n <div class=\"input-group\">\n <!-- <timepicker formControlName=\"start\" [readonlyInput]=\"isReadOnly\" [id]=\"startComponentId+'_StartTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidStart($event)\"></timepicker> -->\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get('start')?.value)\"\n (change)=\"onTimeChange($event, 'start')\"\n [readonly]=\"isReadOnly\"\n aria-label=\"Start time input\"\n />\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validStart\">Time is invalid</small>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <div class=\"col-md-12 form-group\" [ngClass]=\"{'is-invalid':showValidation && isRequired && !validEnd}\">\n <div class=\"input-group\">\n <!-- <timepicker formControlName=\"end\" [readonlyInput]=\"isReadOnly\" [id]=\"endComponentId+'_EndTime'\" [disabled]=\"isDisabled\" (isValid)=\"isValidEnd($event)\"></timepicker> -->\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get('end')?.value)\"\n (change)=\"onTimeChange($event, 'end')\"\n [readonly]=\"isReadOnly\"\n aria-label=\"End time input\"\n />\n </div>\n <small class=\"help-block\" *ngIf=\"showValidation && isRequired && !validEnd\">Time is invalid</small>\n </div>\n </div>\n </div>\n</div>\n" }]
8255
8274
  }], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: i1$1.OepaComponentIdService }], propDecorators: { timeRangeInfo: [{
8256
8275
  type: Input
8257
8276
  }], timeRangeInfoChange: [{
@@ -8390,6 +8409,14 @@ class TimepickerComponent {
8390
8409
  constructor(idService) {
8391
8410
  this.idService = idService;
8392
8411
  }
8412
+ ngOnInit() {
8413
+ if (this.group) {
8414
+ this.componentId = this.idService.getComponentId(this.group);
8415
+ }
8416
+ else {
8417
+ console.log('OOPS No group yet');
8418
+ }
8419
+ }
8393
8420
  checkValidity() {
8394
8421
  for (const key in this.group.controls) {
8395
8422
  if (this.group.controls.hasOwnProperty(key) && key === this.field) {
@@ -8398,20 +8425,31 @@ class TimepickerComponent {
8398
8425
  }
8399
8426
  return null;
8400
8427
  }
8401
- ngOnInit() {
8402
- if (this.group) {
8403
- this.componentId = this.idService.getComponentId(this.group);
8404
- }
8405
- else {
8406
- console.log('OOPS No group yet');
8428
+ onTimeChange(event) {
8429
+ const value = event.target.value; // "HH:mm"
8430
+ if (!value) {
8431
+ this.group.get(this.field)?.setValue(null);
8432
+ return;
8407
8433
  }
8434
+ const [hours, minutes] = value.split(':').map(Number);
8435
+ const date = new Date(this.group.get(this.field)?.value || new Date());
8436
+ date.setHours(hours, minutes, 0, 0);
8437
+ this.group.get(this.field)?.setValue(date, { emitEvent: true });
8438
+ }
8439
+ toTimeString(value) {
8440
+ if (!value)
8441
+ return '';
8442
+ const d = new Date(value);
8443
+ const hh = d.getHours().toString().padStart(2, '0');
8444
+ const mm = d.getMinutes().toString().padStart(2, '0');
8445
+ return `${hh}:${mm}`;
8408
8446
  }
8409
8447
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimepickerComponent, deps: [{ token: i1$1.OepaComponentIdService }], target: i0.ɵɵFactoryTarget.Component });
8410
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TimepickerComponent, selector: "oepa-timepicker", inputs: { group: "group", field: "field", showValidation: "showValidation", readonlyInput: "readonlyInput" }, ngImport: i0, template: "<form [formGroup]=\"group\">\n <div class=\"col-md-12 form-group\">\n <div class=\"input-group\" [ngClass]=\"{'is-invalid':showValidation && !checkValidity()}\">\n <timepicker [formControlName]=\"field\" [readonlyInput]=\"readonlyInput\"></timepicker>\n </div>\n <small class=\"invalid-feedback d-block\" *ngIf=\"showValidation && !checkValidity()\">Time is required</small>\n </div>\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4$2.TimepickerComponent, selector: "timepicker", inputs: ["hourStep", "minuteStep", "secondsStep", "readonlyInput", "disabled", "mousewheel", "arrowkeys", "showSpinners", "showMeridian", "showMinutes", "showSeconds", "meridians", "min", "max", "hoursPlaceholder", "minutesPlaceholder", "secondsPlaceholder"], outputs: ["isValid", "meridianChange"] }] });
8448
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TimepickerComponent, selector: "oepa-timepicker", inputs: { group: "group", field: "field", showValidation: "showValidation", readonlyInput: "readonlyInput" }, ngImport: i0, template: "<form [formGroup]=\"group\">\n <div class=\"col-md-12 form-group\">\n <div class=\"input-group\" [ngClass]=\"{'is-invalid': showValidation && !checkValidity()}\">\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get(field)?.value)\"\n (change)=\"onTimeChange($event)\"\n [readonly]=\"readonlyInput\"\n aria-label=\"Time input\"\n />\n </div>\n\n <small class=\"invalid-feedback d-block\"\n *ngIf=\"showValidation && !checkValidity()\">\n Time is required\n </small>\n </div>\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
8411
8449
  }
8412
8450
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimepickerComponent, decorators: [{
8413
8451
  type: Component,
8414
- args: [{ selector: 'oepa-timepicker', template: "<form [formGroup]=\"group\">\n <div class=\"col-md-12 form-group\">\n <div class=\"input-group\" [ngClass]=\"{'is-invalid':showValidation && !checkValidity()}\">\n <timepicker [formControlName]=\"field\" [readonlyInput]=\"readonlyInput\"></timepicker>\n </div>\n <small class=\"invalid-feedback d-block\" *ngIf=\"showValidation && !checkValidity()\">Time is required</small>\n </div>\n</form>" }]
8452
+ args: [{ selector: 'oepa-timepicker', template: "<form [formGroup]=\"group\">\n <div class=\"col-md-12 form-group\">\n <div class=\"input-group\" [ngClass]=\"{'is-invalid': showValidation && !checkValidity()}\">\n <input\n type=\"time\"\n class=\"form-control\"\n [value]=\"toTimeString(group.get(field)?.value)\"\n (change)=\"onTimeChange($event)\"\n [readonly]=\"readonlyInput\"\n aria-label=\"Time input\"\n />\n </div>\n\n <small class=\"invalid-feedback d-block\"\n *ngIf=\"showValidation && !checkValidity()\">\n Time is required\n </small>\n </div>\n</form>" }]
8415
8453
  }], ctorParameters: () => [{ type: i1$1.OepaComponentIdService }], propDecorators: { group: [{
8416
8454
  type: Input
8417
8455
  }], field: [{
@@ -8810,7 +8848,7 @@ class CommonFormsModule {
8810
8848
  TemplateConfirmationModalComponent, TextAreaInputComponent, TextInputComponent, TimeoutModalComponent, TimepickerComponent,
8811
8849
  YesNoComponent, YesNoBooleanComponent, YesNoOtherInputComponent], imports: [CommonModule,
8812
8850
  FormsModule,
8813
- ReactiveFormsModule, i4$1.ButtonsModule, i4.BsDatepickerModule, i4$2.TimepickerModule, i7$1.PaginationModule, i8.PopoverModule, i8$1.TooltipModule, i3.BsDropdownModule, i2$1.ModalModule, i6$1.TypeaheadModule, i10$1.AccordionModule, i11$1.CollapseModule, i12.TabsModule, TableModule,
8851
+ ReactiveFormsModule, i4$1.ButtonsModule, i4.BsDatepickerModule, i3$1.TimepickerModule, i7$1.PaginationModule, i8.PopoverModule, i8$1.TooltipModule, i3.BsDropdownModule, i2$1.ModalModule, i6$1.TypeaheadModule, i10$1.AccordionModule, i11$1.CollapseModule, i12.TabsModule, TableModule,
8814
8852
  CommonLibModule,
8815
8853
  MatExpansionModule,
8816
8854
  NgxMaskDirective, NgxMaskPipe], exports: [AccountSearchInputComponent, AccountSearchModalComponent,