@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.
- package/esm2022/lib/start-end-timepicker/start-end-timepicker.component.mjs +31 -13
- package/esm2022/lib/timepicker/timepicker.component.mjs +28 -10
- package/fesm2022/ohioepa-oepa-ui-lib.mjs +59 -21
- package/fesm2022/ohioepa-oepa-ui-lib.mjs.map +1 -1
- package/lib/start-end-timepicker/start-end-timepicker.component.d.ts +3 -1
- package/lib/timepicker/timepicker.component.d.ts +3 -1
- package/ohioepa-oepa-ui-lib-2.0.12.tgz +0 -0
- package/package.json +1 -1
- package/ohioepa-oepa-ui-lib-2.0.11.tgz +0 -0
|
@@ -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
|
-
|
|
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.
|
|
25
|
+
this.group = this.fb.group({
|
|
27
26
|
start: null,
|
|
28
27
|
end: null
|
|
29
28
|
});
|
|
30
|
-
this.
|
|
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.
|
|
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.
|
|
69
|
-
this.startComponentId = this.idService.getComponentId(this.
|
|
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.
|
|
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.
|
|
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.
|
|
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]=\"
|
|
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]=\"
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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\"
|
|
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\"
|
|
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,
|
|
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
|
|
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
|
-
|
|
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.
|
|
8170
|
+
this.group = this.fb.group({
|
|
8171
8171
|
start: null,
|
|
8172
8172
|
end: null
|
|
8173
8173
|
});
|
|
8174
|
-
this.
|
|
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.
|
|
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.
|
|
8213
|
-
this.startComponentId = this.idService.getComponentId(this.
|
|
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.
|
|
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.
|
|
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.
|
|
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]=\"
|
|
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]=\"
|
|
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
|
-
|
|
8402
|
-
|
|
8403
|
-
|
|
8404
|
-
|
|
8405
|
-
|
|
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\"
|
|
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\"
|
|
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,
|
|
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,
|