@porscheinformatik/clr-addons 15.0.1 → 15.2.1
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/clr-addons.module.d.ts +2 -1
- package/daterangepicker/daterange.constants.d.ts +21 -0
- package/daterangepicker/daterangepicker.module.d.ts +17 -0
- package/daterangepicker/directives/abstract-container.component.d.ts +53 -0
- package/daterangepicker/directives/datepicker/datepicker.component.d.ts +65 -0
- package/daterangepicker/directives/daterangepicker/daterangepicker.directive.d.ts +127 -0
- package/daterangepicker/directives/daterangepicker-container/daterangepicker-container.component.d.ts +118 -0
- package/daterangepicker/directives/if-daterange-error.directive.d.ts +40 -0
- package/daterangepicker/index.d.ts +13 -0
- package/daterangepicker/interfaces/daterange-preset.interface.d.ts +8 -0
- package/daterangepicker/interfaces/daterange.interface.d.ts +12 -0
- package/daterangepicker/models/day.model.d.ts +80 -0
- package/daterangepicker/models/popover-positions.model.d.ts +20 -0
- package/daterangepicker/providers/daterange-control-state.service.d.ts +42 -0
- package/daterangepicker/providers/daterange-parsing.service.d.ts +66 -0
- package/daterangepicker/providers/daterange.service.d.ts +38 -0
- package/daterangepicker/providers/opened-datepickers-tracker.service.d.ts +20 -0
- package/daterangepicker/validators/daterange-max.validator.d.ts +32 -0
- package/daterangepicker/validators/daterange-min.validator.d.ts +32 -0
- package/daterangepicker/validators/daterange-order.validator.d.ts +29 -0
- package/daterangepicker/validators/daterange-required.validator.d.ts +29 -0
- package/dropdown/clr-dropdown-overflow.directive.d.ts +4 -3
- package/esm2020/clr-addons.module.mjs +8 -4
- package/esm2020/daterangepicker/daterange.constants.mjs +27 -0
- package/esm2020/daterangepicker/daterangepicker.module.mjs +58 -0
- package/esm2020/daterangepicker/directives/abstract-container.component.mjs +104 -0
- package/esm2020/daterangepicker/directives/datepicker/datepicker.component.mjs +97 -0
- package/esm2020/daterangepicker/directives/daterangepicker/daterangepicker.directive.mjs +256 -0
- package/esm2020/daterangepicker/directives/daterangepicker-container/daterangepicker-container.component.mjs +251 -0
- package/esm2020/daterangepicker/directives/if-daterange-error.directive.mjs +94 -0
- package/esm2020/daterangepicker/index.mjs +14 -0
- package/esm2020/daterangepicker/interfaces/daterange-preset.interface.mjs +2 -0
- package/esm2020/daterangepicker/interfaces/daterange.interface.mjs +2 -0
- package/esm2020/daterangepicker/models/day.model.mjs +99 -0
- package/esm2020/daterangepicker/models/popover-positions.model.mjs +66 -0
- package/esm2020/daterangepicker/providers/daterange-control-state.service.mjs +62 -0
- package/esm2020/daterangepicker/providers/daterange-parsing.service.mjs +206 -0
- package/esm2020/daterangepicker/providers/daterange.service.mjs +54 -0
- package/esm2020/daterangepicker/providers/opened-datepickers-tracker.service.mjs +36 -0
- package/esm2020/daterangepicker/validators/daterange-max.validator.mjs +85 -0
- package/esm2020/daterangepicker/validators/daterange-min.validator.mjs +85 -0
- package/esm2020/daterangepicker/validators/daterange-order.validator.mjs +75 -0
- package/esm2020/daterangepicker/validators/daterange-required.validator.mjs +71 -0
- package/esm2020/dropdown/clr-dropdown-overflow.directive.mjs +15 -11
- package/esm2020/index.mjs +3 -2
- package/fesm2015/clr-addons.mjs +1920 -264
- package/fesm2015/clr-addons.mjs.map +1 -1
- package/fesm2020/clr-addons.mjs +1900 -264
- package/fesm2020/clr-addons.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ClrAlignment, ClrAxis, ClrSide } from '@clr/angular';
|
|
2
|
+
/**
|
|
3
|
+
* Popover positions.
|
|
4
|
+
* https://github.com/vmware-clarity/ng-clarity/blob/f1a668086bf88bcf5ef1cd36b0d150e45e88def7/projects/angular/src/utils/popover/enums/positions.enum.ts
|
|
5
|
+
*/
|
|
6
|
+
export class PopoverPositions {
|
|
7
|
+
}
|
|
8
|
+
PopoverPositions.options = [
|
|
9
|
+
'bottom-left',
|
|
10
|
+
'bottom-right',
|
|
11
|
+
'left-bottom',
|
|
12
|
+
'left-top',
|
|
13
|
+
'right-bottom',
|
|
14
|
+
'right-top',
|
|
15
|
+
'top-left',
|
|
16
|
+
'top-right',
|
|
17
|
+
];
|
|
18
|
+
PopoverPositions['bottom-left'] = {
|
|
19
|
+
axis: ClrAxis.VERTICAL,
|
|
20
|
+
side: ClrSide.AFTER,
|
|
21
|
+
anchor: ClrAlignment.START,
|
|
22
|
+
content: ClrAlignment.START,
|
|
23
|
+
};
|
|
24
|
+
PopoverPositions['bottom-right'] = {
|
|
25
|
+
axis: ClrAxis.VERTICAL,
|
|
26
|
+
side: ClrSide.AFTER,
|
|
27
|
+
anchor: ClrAlignment.END,
|
|
28
|
+
content: ClrAlignment.END,
|
|
29
|
+
};
|
|
30
|
+
PopoverPositions['left-bottom'] = {
|
|
31
|
+
axis: ClrAxis.HORIZONTAL,
|
|
32
|
+
side: ClrSide.BEFORE,
|
|
33
|
+
anchor: ClrAlignment.START,
|
|
34
|
+
content: ClrAlignment.START,
|
|
35
|
+
};
|
|
36
|
+
PopoverPositions['left-top'] = {
|
|
37
|
+
axis: ClrAxis.HORIZONTAL,
|
|
38
|
+
side: ClrSide.BEFORE,
|
|
39
|
+
anchor: ClrAlignment.CENTER,
|
|
40
|
+
content: ClrAlignment.END,
|
|
41
|
+
};
|
|
42
|
+
PopoverPositions['right-bottom'] = {
|
|
43
|
+
axis: ClrAxis.HORIZONTAL,
|
|
44
|
+
side: ClrSide.AFTER,
|
|
45
|
+
anchor: ClrAlignment.START,
|
|
46
|
+
content: ClrAlignment.START,
|
|
47
|
+
};
|
|
48
|
+
PopoverPositions['right-top'] = {
|
|
49
|
+
axis: ClrAxis.HORIZONTAL,
|
|
50
|
+
side: ClrSide.AFTER,
|
|
51
|
+
anchor: ClrAlignment.CENTER,
|
|
52
|
+
content: ClrAlignment.END,
|
|
53
|
+
};
|
|
54
|
+
PopoverPositions['top-left'] = {
|
|
55
|
+
axis: ClrAxis.VERTICAL,
|
|
56
|
+
side: ClrSide.BEFORE,
|
|
57
|
+
anchor: ClrAlignment.START,
|
|
58
|
+
content: ClrAlignment.START,
|
|
59
|
+
};
|
|
60
|
+
PopoverPositions['top-right'] = {
|
|
61
|
+
axis: ClrAxis.VERTICAL,
|
|
62
|
+
side: ClrSide.BEFORE,
|
|
63
|
+
anchor: ClrAlignment.END,
|
|
64
|
+
content: ClrAlignment.END,
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci1wb3NpdGlvbnMubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY2xyLWFkZG9ucy9kYXRlcmFuZ2VwaWNrZXIvbW9kZWxzL3BvcG92ZXItcG9zaXRpb25zLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFzQixPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbEY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjs7QUFDYix3QkFBTyxHQUFHO0lBQ3RCLGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLFVBQVU7SUFDVixjQUFjO0lBQ2QsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0NBQ1osQ0FBQztBQUVZLCtCQUFhLEdBQXVCO0lBQ2hELElBQUksRUFBRSxPQUFPLENBQUMsUUFBUTtJQUN0QixJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUs7SUFDbkIsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLO0lBQzFCLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSztDQUM1QixDQUFDO0FBRVksZ0NBQWMsR0FBdUI7SUFDakQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRO0lBQ3RCLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSztJQUNuQixNQUFNLEVBQUUsWUFBWSxDQUFDLEdBQUc7SUFDeEIsT0FBTyxFQUFFLFlBQVksQ0FBQyxHQUFHO0NBQzFCLENBQUM7QUFFWSwrQkFBYSxHQUF1QjtJQUNoRCxJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVU7SUFDeEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNO0lBQ3BCLE1BQU0sRUFBRSxZQUFZLENBQUMsS0FBSztJQUMxQixPQUFPLEVBQUUsWUFBWSxDQUFDLEtBQUs7Q0FDNUIsQ0FBQztBQUVZLDRCQUFVLEdBQXVCO0lBQzdDLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVTtJQUN4QixJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDcEIsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO0lBQzNCLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRztDQUMxQixDQUFDO0FBRVksZ0NBQWMsR0FBdUI7SUFDakQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVO0lBQ3hCLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSztJQUNuQixNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUs7SUFDMUIsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLO0NBQzVCLENBQUM7QUFFWSw2QkFBVyxHQUF1QjtJQUM5QyxJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVU7SUFDeEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLO0lBQ25CLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtJQUMzQixPQUFPLEVBQUUsWUFBWSxDQUFDLEdBQUc7Q0FDMUIsQ0FBQztBQUVZLDRCQUFVLEdBQXVCO0lBQzdDLElBQUksRUFBRSxPQUFPLENBQUMsUUFBUTtJQUN0QixJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDcEIsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLO0lBQzFCLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSztDQUM1QixDQUFDO0FBRVksNkJBQVcsR0FBdUI7SUFDOUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRO0lBQ3RCLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTTtJQUNwQixNQUFNLEVBQUUsWUFBWSxDQUFDLEdBQUc7SUFDeEIsT0FBTyxFQUFFLFlBQVksQ0FBQyxHQUFHO0NBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbHJBbGlnbm1lbnQsIENsckF4aXMsIENsclBvcG92ZXJQb3NpdGlvbiwgQ2xyU2lkZSB9IGZyb20gJ0BjbHIvYW5ndWxhcic7XG5cbi8qKlxuICogUG9wb3ZlciBwb3NpdGlvbnMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdm13YXJlLWNsYXJpdHkvbmctY2xhcml0eS9ibG9iL2YxYTY2ODA4NmJmODhiY2Y1ZWYxY2QzNmIwZDE1MGU0NWU4OGRlZjcvcHJvamVjdHMvYW5ndWxhci9zcmMvdXRpbHMvcG9wb3Zlci9lbnVtcy9wb3NpdGlvbnMuZW51bS50c1xuICovXG5leHBvcnQgY2xhc3MgUG9wb3ZlclBvc2l0aW9ucyB7XG4gIHB1YmxpYyBzdGF0aWMgb3B0aW9ucyA9IFtcbiAgICAnYm90dG9tLWxlZnQnLFxuICAgICdib3R0b20tcmlnaHQnLFxuICAgICdsZWZ0LWJvdHRvbScsXG4gICAgJ2xlZnQtdG9wJyxcbiAgICAncmlnaHQtYm90dG9tJyxcbiAgICAncmlnaHQtdG9wJyxcbiAgICAndG9wLWxlZnQnLFxuICAgICd0b3AtcmlnaHQnLFxuICBdO1xuXG4gIHB1YmxpYyBzdGF0aWMgJ2JvdHRvbS1sZWZ0JzogQ2xyUG9wb3ZlclBvc2l0aW9uID0ge1xuICAgIGF4aXM6IENsckF4aXMuVkVSVElDQUwsXG4gICAgc2lkZTogQ2xyU2lkZS5BRlRFUixcbiAgICBhbmNob3I6IENsckFsaWdubWVudC5TVEFSVCxcbiAgICBjb250ZW50OiBDbHJBbGlnbm1lbnQuU1RBUlQsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyAnYm90dG9tLXJpZ2h0JzogQ2xyUG9wb3ZlclBvc2l0aW9uID0ge1xuICAgIGF4aXM6IENsckF4aXMuVkVSVElDQUwsXG4gICAgc2lkZTogQ2xyU2lkZS5BRlRFUixcbiAgICBhbmNob3I6IENsckFsaWdubWVudC5FTkQsXG4gICAgY29udGVudDogQ2xyQWxpZ25tZW50LkVORCxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljICdsZWZ0LWJvdHRvbSc6IENsclBvcG92ZXJQb3NpdGlvbiA9IHtcbiAgICBheGlzOiBDbHJBeGlzLkhPUklaT05UQUwsXG4gICAgc2lkZTogQ2xyU2lkZS5CRUZPUkUsXG4gICAgYW5jaG9yOiBDbHJBbGlnbm1lbnQuU1RBUlQsXG4gICAgY29udGVudDogQ2xyQWxpZ25tZW50LlNUQVJULFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgJ2xlZnQtdG9wJzogQ2xyUG9wb3ZlclBvc2l0aW9uID0ge1xuICAgIGF4aXM6IENsckF4aXMuSE9SSVpPTlRBTCxcbiAgICBzaWRlOiBDbHJTaWRlLkJFRk9SRSxcbiAgICBhbmNob3I6IENsckFsaWdubWVudC5DRU5URVIsXG4gICAgY29udGVudDogQ2xyQWxpZ25tZW50LkVORCxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljICdyaWdodC1ib3R0b20nOiBDbHJQb3BvdmVyUG9zaXRpb24gPSB7XG4gICAgYXhpczogQ2xyQXhpcy5IT1JJWk9OVEFMLFxuICAgIHNpZGU6IENsclNpZGUuQUZURVIsXG4gICAgYW5jaG9yOiBDbHJBbGlnbm1lbnQuU1RBUlQsXG4gICAgY29udGVudDogQ2xyQWxpZ25tZW50LlNUQVJULFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgJ3JpZ2h0LXRvcCc6IENsclBvcG92ZXJQb3NpdGlvbiA9IHtcbiAgICBheGlzOiBDbHJBeGlzLkhPUklaT05UQUwsXG4gICAgc2lkZTogQ2xyU2lkZS5BRlRFUixcbiAgICBhbmNob3I6IENsckFsaWdubWVudC5DRU5URVIsXG4gICAgY29udGVudDogQ2xyQWxpZ25tZW50LkVORCxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljICd0b3AtbGVmdCc6IENsclBvcG92ZXJQb3NpdGlvbiA9IHtcbiAgICBheGlzOiBDbHJBeGlzLlZFUlRJQ0FMLFxuICAgIHNpZGU6IENsclNpZGUuQkVGT1JFLFxuICAgIGFuY2hvcjogQ2xyQWxpZ25tZW50LlNUQVJULFxuICAgIGNvbnRlbnQ6IENsckFsaWdubWVudC5TVEFSVCxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljICd0b3AtcmlnaHQnOiBDbHJQb3BvdmVyUG9zaXRpb24gPSB7XG4gICAgYXhpczogQ2xyQXhpcy5WRVJUSUNBTCxcbiAgICBzaWRlOiBDbHJTaWRlLkJFRk9SRSxcbiAgICBhbmNob3I6IENsckFsaWdubWVudC5FTkQsXG4gICAgY29udGVudDogQ2xyQWxpZ25tZW50LkVORCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQb3BvdmVyIHBvc2l0aW9uLlxuICovXG5leHBvcnQgdHlwZSBQb3BvdmVyUG9zaXRpb24gPSAodHlwZW9mIFBvcG92ZXJQb3NpdGlvbnMub3B0aW9ucylbbnVtYmVyXTtcbiJdfQ==
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { EventEmitter, Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Daterange control state service.
|
|
5
|
+
* Stores data for communication between daterange container and input.
|
|
6
|
+
*/
|
|
7
|
+
export class DaterangeControlStateService {
|
|
8
|
+
constructor() {
|
|
9
|
+
/** Disabled control state. */
|
|
10
|
+
this.disabled = false;
|
|
11
|
+
/** Focused. */
|
|
12
|
+
this.focused = false;
|
|
13
|
+
/** List of validation errors. */
|
|
14
|
+
this.errors = null;
|
|
15
|
+
this._invalid = false;
|
|
16
|
+
this._touched = false;
|
|
17
|
+
/**
|
|
18
|
+
* Event triggered when status changes.
|
|
19
|
+
*/
|
|
20
|
+
this.statusChange = new EventEmitter();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Control invalid status.
|
|
24
|
+
* @returns Control invalid status.
|
|
25
|
+
*/
|
|
26
|
+
get invalid() {
|
|
27
|
+
return this._invalid;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Touched.
|
|
31
|
+
* @returns Touched.
|
|
32
|
+
*/
|
|
33
|
+
get touched() {
|
|
34
|
+
return this._touched;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Update status.
|
|
38
|
+
* Only for valid & invalid status changes.
|
|
39
|
+
* And only if there was a real change.
|
|
40
|
+
* Also updates errors list.
|
|
41
|
+
* Emits `statusChange` event.
|
|
42
|
+
* @param control
|
|
43
|
+
*/
|
|
44
|
+
updateStatus(control) {
|
|
45
|
+
this._touched = control.touched;
|
|
46
|
+
// We only care about valid & invalid status changes.
|
|
47
|
+
// There is an bug where `ClrDaterangepickerDirective.writeValue` is called twice with same value (`null`).
|
|
48
|
+
// Setting ` && (control.touched || control.dirty)` in next if-statement will hide the errors,
|
|
49
|
+
// but the control will still be invalid with errors (just hidden).
|
|
50
|
+
if (['VALID', 'INVALID'].includes(control.status)) {
|
|
51
|
+
this.errors = control.errors;
|
|
52
|
+
this._invalid = control.invalid;
|
|
53
|
+
this.statusChange.emit(this._invalid);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
DaterangeControlStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: DaterangeControlStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
58
|
+
DaterangeControlStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: DaterangeControlStateService });
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: DaterangeControlStateService, decorators: [{
|
|
60
|
+
type: Injectable
|
|
61
|
+
}] });
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXJhbmdlLWNvbnRyb2wtc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jbHItYWRkb25zL2RhdGVyYW5nZXBpY2tlci9wcm92aWRlcnMvZGF0ZXJhbmdlLWNvbnRyb2wtc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHekQ7OztHQUdHO0FBRUgsTUFBTSxPQUFPLDRCQUE0QjtJQUR6QztRQUVFLDhCQUE4QjtRQUN2QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXhCLGVBQWU7UUFDUixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXZCLGlDQUFpQztRQUMxQixXQUFNLEdBQTRCLElBQUksQ0FBQztRQUV0QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBU2pCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUErQnpCOztXQUVHO1FBQ0ksaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0tBQ25EO0lBM0NDOzs7T0FHRztJQUNILElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUdEOzs7T0FHRztJQUNILElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxZQUFZLENBQUMsT0FBd0I7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBRWhDLHFEQUFxRDtRQUNyRCwyR0FBMkc7UUFDM0csOEZBQThGO1FBQzlGLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDOzt5SEFoRFUsNEJBQTRCOzZIQUE1Qiw0QkFBNEI7MkZBQTVCLDRCQUE0QjtrQkFEeEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIERhdGVyYW5nZSBjb250cm9sIHN0YXRlIHNlcnZpY2UuXG4gKiBTdG9yZXMgZGF0YSBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGRhdGVyYW5nZSBjb250YWluZXIgYW5kIGlucHV0LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZXJhbmdlQ29udHJvbFN0YXRlU2VydmljZSB7XG4gIC8qKiBEaXNhYmxlZCBjb250cm9sIHN0YXRlLiAqL1xuICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKiogRm9jdXNlZC4gKi9cbiAgcHVibGljIGZvY3VzZWQgPSBmYWxzZTtcblxuICAvKiogTGlzdCBvZiB2YWxpZGF0aW9uIGVycm9ycy4gKi9cbiAgcHVibGljIGVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2ludmFsaWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIENvbnRyb2wgaW52YWxpZCBzdGF0dXMuXG4gICAqIEByZXR1cm5zIENvbnRyb2wgaW52YWxpZCBzdGF0dXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIF90b3VjaGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUb3VjaGVkLlxuICAgKiBAcmV0dXJucyBUb3VjaGVkLlxuICAgKi9cbiAgcHVibGljIGdldCB0b3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl90b3VjaGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdGF0dXMuXG4gICAqIE9ubHkgZm9yIHZhbGlkICYgaW52YWxpZCBzdGF0dXMgY2hhbmdlcy5cbiAgICogQW5kIG9ubHkgaWYgdGhlcmUgd2FzIGEgcmVhbCBjaGFuZ2UuXG4gICAqIEFsc28gdXBkYXRlcyBlcnJvcnMgbGlzdC5cbiAgICogRW1pdHMgYHN0YXR1c0NoYW5nZWAgZXZlbnQuXG4gICAqIEBwYXJhbSBjb250cm9sXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlU3RhdHVzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkge1xuICAgIHRoaXMuX3RvdWNoZWQgPSBjb250cm9sLnRvdWNoZWQ7XG5cbiAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdmFsaWQgJiBpbnZhbGlkIHN0YXR1cyBjaGFuZ2VzLlxuICAgIC8vIFRoZXJlIGlzIGFuIGJ1ZyB3aGVyZSBgQ2xyRGF0ZXJhbmdlcGlja2VyRGlyZWN0aXZlLndyaXRlVmFsdWVgIGlzIGNhbGxlZCB0d2ljZSB3aXRoIHNhbWUgdmFsdWUgKGBudWxsYCkuXG4gICAgLy8gU2V0dGluZyBgICYmIChjb250cm9sLnRvdWNoZWQgfHwgY29udHJvbC5kaXJ0eSlgIGluIG5leHQgaWYtc3RhdGVtZW50IHdpbGwgaGlkZSB0aGUgZXJyb3JzLFxuICAgIC8vIGJ1dCB0aGUgY29udHJvbCB3aWxsIHN0aWxsIGJlIGludmFsaWQgd2l0aCBlcnJvcnMgKGp1c3QgaGlkZGVuKS5cbiAgICBpZiAoWydWQUxJRCcsICdJTlZBTElEJ10uaW5jbHVkZXMoY29udHJvbC5zdGF0dXMpKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGNvbnRyb2wuZXJyb3JzO1xuICAgICAgdGhpcy5faW52YWxpZCA9IGNvbnRyb2wuaW52YWxpZDtcbiAgICAgIHRoaXMuc3RhdHVzQ2hhbmdlLmVtaXQodGhpcy5faW52YWxpZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRyaWdnZXJlZCB3aGVuIHN0YXR1cyBjaGFuZ2VzLlxuICAgKi9cbiAgcHVibGljIHN0YXR1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { FormatWidth, getLocaleDateFormat } from '@angular/common';
|
|
2
|
+
import { Inject, Injectable, LOCALE_ID } from '@angular/core';
|
|
3
|
+
import { BIG_ENDIAN, DELIMITER_REGEX, LITTLE_ENDIAN, LITTLE_ENDIAN_REGEX, MIDDLE_ENDIAN, MIDDLE_ENDIAN_REGEX, SEPARATOR_TEXT_DEFAULT, USER_INPUT_REGEX, } from '../daterange.constants';
|
|
4
|
+
import { DayModel } from '../models/day.model';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Daterange parsing service.
|
|
8
|
+
* Heavy inspired by `date-io.service.ts` from Clarity.
|
|
9
|
+
* https://github.com/vmware-clarity/ng-clarity/blob/a21fe726fe91ae3c929b8f016359afe354bb89c6/projects/angular/src/forms/datepicker/providers/date-io.service.ts
|
|
10
|
+
*/
|
|
11
|
+
export class DaterangeParsingService {
|
|
12
|
+
constructor(locale) {
|
|
13
|
+
this.locale = locale;
|
|
14
|
+
this.localeDelimiter = [];
|
|
15
|
+
const localeFormat = getLocaleDateFormat(this.locale, FormatWidth.Short);
|
|
16
|
+
const format = localeFormat.toLocaleLowerCase();
|
|
17
|
+
if (LITTLE_ENDIAN_REGEX.test(format)) {
|
|
18
|
+
this.localeDisplayFormat = LITTLE_ENDIAN;
|
|
19
|
+
}
|
|
20
|
+
else if (MIDDLE_ENDIAN_REGEX.test(format)) {
|
|
21
|
+
this.localeDisplayFormat = MIDDLE_ENDIAN;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.localeDisplayFormat = BIG_ENDIAN;
|
|
25
|
+
}
|
|
26
|
+
// Splitting it by date, month and year, leaves us with the delimiters.
|
|
27
|
+
// E.g. `"dd/MM/y".split(/d+|m+|y+/i)` results in `["", "/", "/", ""]`.
|
|
28
|
+
const delimiters = localeFormat.split(DELIMITER_REGEX);
|
|
29
|
+
this.localeDelimiter = [delimiters[1], delimiters[2]];
|
|
30
|
+
}
|
|
31
|
+
/** Locale format. */
|
|
32
|
+
get localeFormat() {
|
|
33
|
+
return (this.localeDisplayFormat.format[0] +
|
|
34
|
+
this.localeDelimiter[0] +
|
|
35
|
+
this.localeDisplayFormat.format[1] +
|
|
36
|
+
this.localeDelimiter[1] +
|
|
37
|
+
this.localeDisplayFormat.format[2]);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Convert daterange to locale friendly text.
|
|
41
|
+
* @param daterange - Daterange.
|
|
42
|
+
* @param separator - Separator between 'from' and 'to' dates.
|
|
43
|
+
* @returns Friendly daterange text.
|
|
44
|
+
*/
|
|
45
|
+
toLocaleString(daterange, separator = SEPARATOR_TEXT_DEFAULT) {
|
|
46
|
+
if (daterange == null) {
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
const { from, to } = daterange;
|
|
50
|
+
if (from == null || to == null) {
|
|
51
|
+
return '';
|
|
52
|
+
}
|
|
53
|
+
const fromDate = from.toDate();
|
|
54
|
+
const toDate = to.toDate();
|
|
55
|
+
const fromDateStr = this.toLocaleDisplayFormatString(fromDate);
|
|
56
|
+
const toDateStr = this.toLocaleDisplayFormatString(toDate);
|
|
57
|
+
return fromDateStr + separator + toDateStr;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Convert date to locale display format string.
|
|
61
|
+
* @param date - Javascript Date object.
|
|
62
|
+
* @returns Locale display format string.
|
|
63
|
+
*/
|
|
64
|
+
toLocaleDisplayFormatString(date) {
|
|
65
|
+
const dateNo = date.getDate();
|
|
66
|
+
const monthNo = date.getMonth() + 1;
|
|
67
|
+
const yearNo = date.getFullYear();
|
|
68
|
+
const dateStr = this.pad(dateNo);
|
|
69
|
+
const monthStr = this.pad(monthNo);
|
|
70
|
+
const delim1 = this.localeDelimiter[0];
|
|
71
|
+
const delim2 = this.localeDelimiter[1];
|
|
72
|
+
if (this.localeDisplayFormat === LITTLE_ENDIAN) {
|
|
73
|
+
return dateStr + delim1 + monthStr + delim2 + yearNo;
|
|
74
|
+
}
|
|
75
|
+
else if (this.localeDisplayFormat === MIDDLE_ENDIAN) {
|
|
76
|
+
return monthStr + delim1 + dateStr + delim2 + yearNo;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
return yearNo + delim1 + monthStr + delim2 + dateStr;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* String padding with zeros.
|
|
84
|
+
* @param num - Number to pad.
|
|
85
|
+
* @returns Padded string.
|
|
86
|
+
*/
|
|
87
|
+
pad(num) {
|
|
88
|
+
return num < 10 ? `0${num}` : `${num}`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Parse daterange string to daterange object.
|
|
92
|
+
* @param daterangeString - Daterange string.
|
|
93
|
+
* @param separator - Separator text.
|
|
94
|
+
* @returns Daterange object.
|
|
95
|
+
*/
|
|
96
|
+
parse(daterangeString, separator = SEPARATOR_TEXT_DEFAULT) {
|
|
97
|
+
if (daterangeString == null || daterangeString === '') {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const [fromString, toString] = daterangeString.split(separator);
|
|
101
|
+
const from = this.getDayModelFromDateString(fromString);
|
|
102
|
+
const to = this.getDayModelFromDateString(toString);
|
|
103
|
+
if (from == null && to == null) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
return { from, to };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get `DayModel` from date string.
|
|
110
|
+
* @param dateString - Date string.
|
|
111
|
+
* @returns DayModel.
|
|
112
|
+
*/
|
|
113
|
+
getDayModelFromDateString(dateString) {
|
|
114
|
+
if (dateString == null || dateString === '') {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const dateParts = dateString.match(USER_INPUT_REGEX);
|
|
118
|
+
if (dateParts == null || dateParts.length !== 3) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const [firstPart, secondPart, thirdPart] = dateParts;
|
|
122
|
+
if (this.localeDisplayFormat === LITTLE_ENDIAN) {
|
|
123
|
+
// secondPart is month && firstPart is date.
|
|
124
|
+
return this.getDayModelFromDateParts(thirdPart, secondPart, firstPart);
|
|
125
|
+
}
|
|
126
|
+
else if (this.localeDisplayFormat === MIDDLE_ENDIAN) {
|
|
127
|
+
// firstPart is month && secondPart is date.
|
|
128
|
+
return this.getDayModelFromDateParts(thirdPart, firstPart, secondPart);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// secondPart is month && thirdPart is date.
|
|
132
|
+
return this.getDayModelFromDateParts(firstPart, secondPart, thirdPart);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get `DayModel` from date string parts.
|
|
137
|
+
* @param yearString - Year string.
|
|
138
|
+
* @param monthString - Month string.
|
|
139
|
+
* @param dateString - Date string.
|
|
140
|
+
* @returns DayModel.
|
|
141
|
+
*/
|
|
142
|
+
getDayModelFromDateParts(yearString, monthString, dateString) {
|
|
143
|
+
// Check for valid date part strings.
|
|
144
|
+
let year = parseInt(yearString);
|
|
145
|
+
if (isNaN(year)) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
let month = parseInt(monthString);
|
|
149
|
+
if (isNaN(month)) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const date = parseInt(dateString);
|
|
153
|
+
if (isNaN(date)) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
// Convert year to 4 digit year.
|
|
157
|
+
year = this.parseToFourDigitYear(year);
|
|
158
|
+
if (year == null) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
// Month is zero-indexed.
|
|
162
|
+
month -= 1;
|
|
163
|
+
// Creating new Javascript Date object, because it will automatically take care of
|
|
164
|
+
// switching to next or previous months & years without we having to worry about it.
|
|
165
|
+
const parsedDate = new Date(year, month, date);
|
|
166
|
+
if (isNaN(parsedDate.getTime())) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
return new DayModel(parsedDate);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Takes in a year and if it is a 2 digit year, returns the corresponding 4 digit year.
|
|
173
|
+
* Window of 80 years before and 20 years after the present year.
|
|
174
|
+
* Credit: https://github.com/globalizejs/globalize/blob/e1b31cd6a4f1cff75b185b68b7a32220aac5196f/src/date/parse.js
|
|
175
|
+
* @param year - Year.
|
|
176
|
+
* @returns Four-digit year.
|
|
177
|
+
*/
|
|
178
|
+
parseToFourDigitYear(year) {
|
|
179
|
+
// Impossible years.
|
|
180
|
+
if (year > 9999 || (year > 100 && year < 999) || year < 10) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
if (year > 999) {
|
|
184
|
+
return year;
|
|
185
|
+
}
|
|
186
|
+
const currYear = new Date().getFullYear();
|
|
187
|
+
const century = Math.floor(currYear / 100) * 100;
|
|
188
|
+
let result = year + century;
|
|
189
|
+
if (result > currYear + 20) {
|
|
190
|
+
result = result - 100;
|
|
191
|
+
}
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
DaterangeParsingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: DaterangeParsingService, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
196
|
+
DaterangeParsingService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: DaterangeParsingService, providedIn: 'root' });
|
|
197
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: DaterangeParsingService, decorators: [{
|
|
198
|
+
type: Injectable,
|
|
199
|
+
args: [{
|
|
200
|
+
providedIn: 'root',
|
|
201
|
+
}]
|
|
202
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
203
|
+
type: Inject,
|
|
204
|
+
args: [LOCALE_ID]
|
|
205
|
+
}] }]; } });
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXJhbmdlLXBhcnNpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jbHItYWRkb25zL2RhdGVyYW5nZXBpY2tlci9wcm92aWRlcnMvZGF0ZXJhbmdlLXBhcnNpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTlELE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxFQUVmLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsZ0JBQWdCLEdBQ2pCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLFFBQVEsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQzs7QUFFakU7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyx1QkFBdUI7SUFlbEMsWUFBdUQsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFickQsb0JBQWUsR0FBa0IsRUFBRSxDQUFDO1FBY2xELE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sTUFBTSxHQUFXLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXhELElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxhQUFhLENBQUM7U0FDMUM7YUFBTSxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsYUFBYSxDQUFDO1NBQzFDO2FBQU07WUFDTCxJ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QyxDQUFDO1FBQy9DLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxvQkFBb0IsQ0FBQyxJQUFZO1FBQ3ZDLG9CQUFvQjtRQUNwQixJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFO1lBQzFELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSxRQUFRLEdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekQsSUFBSSxNQUFNLEdBQVcsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUNwQyxJQUFJLE1BQU0sR0FBRyxRQUFRLEdBQUcsRUFBRSxFQUFFO1lBQzFCLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO1NBQ3ZCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7b0hBL01VLHVCQUF1QixrQkFlUCxTQUFTO3dIQWZ6Qix1QkFBdUIsY0FGdEIsTUFBTTsyRkFFUCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFnQnFCLE1BQU07MkJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1hdFdpZHRoLCBnZXRMb2NhbGVEYXRlRm9ybWF0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIEJJR19FTkRJQU4sXG4gIERFTElNSVRFUl9SRUdFWCxcbiAgSW5wdXREYXRlRGlzcGxheUZvcm1hdCxcbiAgTElUVExFX0VORElBTixcbiAgTElUVExFX0VORElBTl9SRUdFWCxcbiAgTUlERExFX0VORElBTixcbiAgTUlERExFX0VORElBTl9SRUdFWCxcbiAgU0VQQVJBVE9SX1RFWFRfREVGQVVMVCxcbiAgVVNFUl9JTlBVVF9SRUdFWCxcbn0gZnJvbSAnLi4vZGF0ZXJhbmdlLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBOdWxsYWJsZURhdGVyYW5nZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGF0ZXJhbmdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEYXlNb2RlbCwgTnVsbGFibGVEYXlNb2RlbCB9IGZyb20gJy4uL21vZGVscy9kYXkubW9kZWwnO1xuXG4vKipcbiAqIERhdGVyYW5nZSBwYXJzaW5nIHNlcnZpY2UuXG4gKiBIZWF2eSBpbnNwaXJlZCBieSBgZGF0ZS1pby5zZXJ2aWNlLnRzYCBmcm9tIENsYXJpdHkuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdm13YXJlLWNsYXJpdHkvbmctY2xhcml0eS9ibG9iL2EyMWZlNzI2ZmU5MWFlM2M5MjliOGYwMTYzNTlhZmUzNTRiYjg5YzYvcHJvamVjdHMvYW5ndWxhci9zcmMvZm9ybXMvZGF0ZXBpY2tlci9wcm92aWRlcnMvZGF0ZS1pby5zZXJ2aWNlLnRzXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcmFuZ2VQYXJzaW5nU2VydmljZSB7XG4gIHB1YmxpYyByZWFkb25seSBsb2NhbGVEaXNwbGF5Rm9ybWF0OiBJbnB1dERhdGVEaXNwbGF5Rm9ybWF0O1xuICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlRGVsaW1pdGVyOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgLyoqIExvY2FsZSBmb3JtYXQuICovXG4gIHB1YmxpYyBnZXQgbG9jYWxlRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubG9jYWxlRGlzcGxheUZvcm1hdC5mb3JtYXRbMF0gK1xuICAgICAgdGhpcy5sb2NhbGVEZWxpbWl0ZXJbMF0gK1xuICAgICAgdGhpcy5sb2NhbGVEaXNwbGF5Rm9ybWF0LmZvcm1hdFsxXSArXG4gICAgICB0aGlzLmxvY2FsZURlbGltaXRlclsxXSArXG4gICAgICB0aGlzLmxvY2FsZURpc3BsYXlGb3JtYXQuZm9ybWF0WzJdXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSByZWFkb25seSBsb2NhbGU6IHN0cmluZykge1xuICAgIGNvbnN0IGxvY2FsZUZvcm1hdCA9IGdldExvY2FsZURhdGVGb3JtYXQodGhpcy5sb2NhbGUsIEZvcm1hdFdpZHRoLlNob3J0KTtcbiAgICBjb25zdCBmb3JtYXQ6IHN0cmluZyA9IGxvY2FsZUZvcm1hdC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKExJVFRMRV9FTkRJQU5fUkVHRVgudGVzdChmb3JtYXQpKSB7XG4gICAgICB0aGlzLmxvY2FsZURpc3BsYXlGb3JtYXQgPSBMSVRUTEVfRU5ESUFOO1xuICAgIH0gZWxzZSBpZiAoTUlERExFX0VORElBTl9SRUdFWC50ZXN0KGZvcm1hdCkpIHtcbiAgICAgIHRoaXMubG9jYWxlRGlzcGxheUZvcm1hdCA9IE1JRERMRV9FTkRJQU47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9jYWxlRGlzcGxheUZvcm1hdCA9IEJJR19FTkRJQU47XG4gICAgfVxuXG4gICAgLy8gU3BsaXR0aW5nIGl0IGJ5IGRhdGUsIG1vbnRoIGFuZCB5ZWFyLCBsZWF2ZXMgdXMgd2l0aCB0aGUgZGVsaW1pdGVycy5cbiAgICAvLyBFLmcuIGBcImRkL01NL3lcIi5zcGxpdCgvZCt8bSt8eSsvaSlgIHJlc3VsdHMgaW4gYFtcIlwiLCBcIi9cIiwgXCIvXCIsIFwiXCJdYC5cbiAgICBjb25zdCBkZWxpbWl0ZXJzOiBBcnJheTxzdHJpbmc+ID0gbG9jYWxlRm9ybWF0LnNwbGl0KERFTElNSVRFUl9SRUdFWCk7XG4gICAgdGhpcy5sb2NhbGVEZWxpbWl0ZXIgPSBbZGVsaW1pdGVyc1sxXSwgZGVsaW1pdGVyc1syXV07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBkYXRlcmFuZ2UgdG8gbG9jYWxlIGZyaWVuZGx5IHRleHQuXG4gICAqIEBwYXJhbSBkYXRlcmFuZ2UgLSBEYXRlcmFuZ2UuXG4gICAqIEBwYXJhbSBzZXBhcmF0b3IgLSBTZXBhcmF0b3IgYmV0d2VlbiAnZnJvbScgYW5kICd0bycgZGF0ZXMuXG4gICAqIEByZXR1cm5zIEZyaWVuZGx5IGRhdGVyYW5nZSB0ZXh0LlxuICAgKi9cbiAgcHVibGljIHRvTG9jYWxlU3RyaW5nKGRhdGVyYW5nZTogTnVsbGFibGVEYXRlcmFuZ2UsIHNlcGFyYXRvcjogc3RyaW5nID0gU0VQQVJBVE9SX1RFWFRfREVGQVVMVCk6IHN0cmluZyB7XG4gICAgaWYgKGRhdGVyYW5nZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgeyBmcm9tLCB0byB9ID0gZGF0ZXJhbmdlO1xuICAgIGlmIChmcm9tID09IG51bGwgfHwgdG8gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGZyb21EYXRlID0gZnJvbS50b0RhdGUoKTtcbiAgICBjb25zdCB0b0RhdGUgPSB0by50b0RhdGUoKTtcblxuICAgIGNvbnN0IGZyb21EYXRlU3RyID0gdGhpcy50b0xvY2FsZURpc3BsYXlGb3JtYXRTdHJpbmcoZnJvbURhdGUpO1xuICAgIGNvbnN0IHRvRGF0ZVN0ciA9IHRoaXMudG9Mb2NhbGVEaXNwbGF5Rm9ybWF0U3RyaW5nKHRvRGF0ZSk7XG5cbiAgICByZXR1cm4gZnJvbURhdGVTdHIgKyBzZXBhcmF0b3IgKyB0b0RhdGVTdHI7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBkYXRlIHRvIGxvY2FsZSBkaXNwbGF5IGZvcm1hdCBzdHJpbmcuXG4gICAqIEBwYXJhbSBkYXRlIC0gSmF2YXNjcmlwdCBEYXRlIG9iamVjdC5cbiAgICogQHJldHVybnMgTG9jYWxlIGRpc3BsYXkgZm9ybWF0IHN0cmluZy5cbiAgICovXG4gIHByaXZhdGUgdG9Mb2NhbGVEaXNwbGF5Rm9ybWF0U3RyaW5nKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGVObzogbnVtYmVyID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhObzogbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTtcbiAgICBjb25zdCB5ZWFyTm86IG51bWJlciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgIGNvbnN0IGRhdGVTdHI6IHN0cmluZyA9IHRoaXMucGFkKGRhdGVObyk7XG4gICAgY29uc3QgbW9udGhTdHI6IHN0cmluZyA9IHRoaXMucGFkKG1vbnRoTm8pO1xuXG4gICAgY29uc3QgZGVsaW0xID0gdGhpcy5sb2NhbGVEZWxpbWl0ZXJbMF07XG4gICAgY29uc3QgZGVsaW0yID0gdGhpcy5sb2NhbGVEZWxpbWl0ZXJbMV07XG5cbiAgICBpZiAodGhpcy5sb2NhbGVEaXNwbGF5Rm9ybWF0ID09PSBMSVRUTEVfRU5ESUFOKSB7XG4gICAgICByZXR1cm4gZGF0ZVN0ciArIGRlbGltMSArIG1vbnRoU3RyICsgZGVsaW0yICsgeWVhck5vO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sb2NhbGVEaXNwbGF5Rm9ybWF0ID09PSBNSURETEVfRU5ESUFOKSB7XG4gICAgICByZXR1cm4gbW9udGhTdHIgKyBkZWxpbTEgKyBkYXRlU3RyICsgZGVsaW0yICsgeWVhck5vO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geWVhck5vICsgZGVsaW0xICsgbW9udGhTdHIgKyBkZWxpbTIgKyBkYXRlU3RyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcGFkZGluZyB3aXRoIHplcm9zLlxuICAgKiBAcGFyYW0gbnVtIC0gTnVtYmVyIHRvIHBhZC5cbiAgICogQHJldHVybnMgUGFkZGVkIHN0cmluZy5cbiAgICovXG4gIHByaXZhdGUgcGFkKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVtIDwgMTAgPyBgMCR7bnVtfWAgOiBgJHtudW19YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBkYXRlcmFuZ2Ugc3RyaW5nIHRvIGRhdGVyYW5nZSBvYmplY3QuXG4gICAqIEBwYXJhbSBkYXRlcmFuZ2VTdHJpbmcgLSBEYXRlcmFuZ2Ugc3RyaW5nLlxuICAgKiBAcGFyYW0gc2VwYXJhdG9yIC0gU2VwYXJhdG9yIHRleHQuXG4gICAqIEByZXR1cm5zIERhdGVyYW5nZSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgcGFyc2UoZGF0ZXJhbmdlU3RyaW5nOiBzdHJpbmcsIHNlcGFyYXRvcjogc3RyaW5nID0gU0VQQVJBVE9SX1RFWFRfREVGQVVMVCk6IE51bGxhYmxlRGF0ZXJhbmdlIHtcbiAgICBpZiAoZGF0ZXJhbmdlU3RyaW5nID09IG51bGwgfHwgZGF0ZXJhbmdlU3RyaW5nID09PSAnJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW2Zyb21TdHJpbmcsIHRvU3RyaW5nXSA9IGRhdGVyYW5nZVN0cmluZy5zcGxpdChzZXBhcmF0b3IpO1xuICAgIGNvbnN0IGZyb20gPSB0aGlzLmdldERheU1vZGVsRnJvbURhdGVTdHJpbmcoZnJvbVN0cmluZyk7XG4gICAgY29uc3QgdG8gPSB0aGlzLmdldERheU1vZGVsRnJvbURhdGVTdHJpbmcodG9TdHJpbmcpO1xuXG4gICAgaWYgKGZyb20gPT0gbnVsbCAmJiB0byA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4geyBmcm9tLCB0byB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBgRGF5TW9kZWxgIGZyb20gZGF0ZSBzdHJpbmcuXG4gICAqIEBwYXJhbSBkYXRlU3RyaW5nIC0gRGF0ZSBzdHJpbmcuXG4gICAqIEByZXR1cm5zIERheU1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXREYXlNb2RlbEZyb21EYXRlU3RyaW5nKGRhdGVTdHJpbmc6IHN0cmluZyk6IE51bGxhYmxlRGF5TW9kZWwge1xuICAgIGlmIChkYXRlU3RyaW5nID09IG51bGwgfHwgZGF0ZVN0cmluZyA9PT0gJycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGVQYXJ0czogUmVnRXhwTWF0Y2hBcnJheSA9IGRhdGVTdHJpbmcubWF0Y2goVVNFUl9JTlBVVF9SRUdFWCk7XG4gICAgaWYgKGRhdGVQYXJ0cyA9PSBudWxsIHx8IGRhdGVQYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdFBhcnQsIHNlY29uZFBhcnQsIHRoaXJkUGFydF0gPSBkYXRlUGFydHM7XG4gICAgaWYgKHRoaXMubG9jYWxlRGlzcGxheUZvcm1hdCA9PT0gTElUVExFX0VORElBTikge1xuICAgICAgLy8gc2Vjb25kUGFydCBpcyBtb250aCAmJiBmaXJzdFBhcnQgaXMgZGF0ZS5cbiAgICAgIHJldHVybiB0aGlzLmdldERheU1vZGVsRnJvbURhdGVQYXJ0cyh0aGlyZFBhcnQsIHNlY29uZFBhcnQsIGZpcnN0UGFydCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZURpc3BsYXlGb3JtYXQgPT09IE1JRERMRV9FTkRJQU4pIHtcbiAgICAgIC8vIGZpcnN0UGFydCBpcyBtb250aCAmJiBzZWNvbmRQYXJ0IGlzIGRhdGUuXG4gICAgICByZXR1cm4gdGhpcy5nZXREYXlNb2RlbEZyb21EYXRlUGFydHModGhpcmRQYXJ0LCBmaXJzdFBhcnQsIHNlY29uZFBhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZWNvbmRQYXJ0IGlzIG1vbnRoICYmIHRoaXJkUGFydCBpcyBkYXRlLlxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF5TW9kZWxGcm9tRGF0ZVBhcnRzKGZpcnN0UGFydCwgc2Vjb25kUGFydCwgdGhpcmRQYXJ0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGBEYXlNb2RlbGAgZnJvbSBkYXRlIHN0cmluZyBwYXJ0cy5cbiAgICogQHBhcmFtIHllYXJTdHJpbmcgLSBZZWFyIHN0cmluZy5cbiAgICogQHBhcmFtIG1vbnRoU3RyaW5nIC0gTW9udGggc3RyaW5nLlxuICAgKiBAcGFyYW0gZGF0ZVN0cmluZyAtIERhdGUgc3RyaW5nLlxuICAgKiBAcmV0dXJucyBEYXlNb2RlbC5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGF5TW9kZWxGcm9tRGF0ZVBhcnRzKHllYXJTdHJpbmc6IHN0cmluZywgbW9udGhTdHJpbmc6IHN0cmluZywgZGF0ZVN0cmluZzogc3RyaW5nKTogTnVsbGFibGVEYXlNb2RlbCB7XG4gICAgLy8gQ2hlY2sgZm9yIHZhbGlkIGRhdGUgcGFydCBzdHJpbmdzLlxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSBwYXJzZUludCh5ZWFyU3RyaW5nKTtcbiAgICBpZiAoaXNOYU4oeWVhcikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgbW9udGg6IG51bWJlciA9IHBhcnNlSW50KG1vbnRoU3RyaW5nKTtcbiAgICBpZiAoaXNOYU4obW9udGgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZGF0ZTogbnVtYmVyID0gcGFyc2VJbnQoZGF0ZVN0cmluZyk7XG4gICAgaWYgKGlzTmFOKGRhdGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHllYXIgdG8gNCBkaWdpdCB5ZWFyLlxuICAgIHllYXIgPSB0aGlzLnBhcnNlVG9Gb3VyRGlnaXRZZWFyKHllYXIpO1xuICAgIGlmICh5ZWFyID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIE1vbnRoIGlzIHplcm8taW5kZXhlZC5cbiAgICBtb250aCAtPSAxO1xuXG4gICAgLy8gQ3JlYXRpbmcgbmV3IEphdmFzY3JpcHQgRGF0ZSBvYmplY3QsIGJlY2F1c2UgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRha2UgY2FyZSBvZlxuICAgIC8vIHN3aXRjaGluZyB0byBuZXh0IG9yIHByZXZpb3VzIG1vbnRocyAmIHllYXJzIHdpdGhvdXQgd2UgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IGl0LlxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSk7XG4gICAgaWYgKGlzTmFOKHBhcnNlZERhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXlNb2RlbChwYXJzZWREYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBpbiBhIHllYXIgYW5kIGlmIGl0IGlzIGEgMiBkaWdpdCB5ZWFyLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIDQgZGlnaXQgeWVhci5cbiAgICogV2luZG93IG9mIDgwIHllYXJzIGJlZm9yZSBhbmQgMjAgeWVhcnMgYWZ0ZXIgdGhlIHByZXNlbnQgeWVhci5cbiAgICogQ3JlZGl0OiBodHRwczovL2dpdGh1Yi5jb20vZ2xvYmFsaXplanMvZ2xvYmFsaXplL2Jsb2IvZTFiMzFjZDZhNGYxY2ZmNzViMTg1YjY4YjdhMzIyMjBhYWM1MTk2Zi9zcmMvZGF0ZS9wYXJzZS5qc1xuICAgKiBAcGFyYW0geWVhciAtIFllYXIuXG4gICAqIEByZXR1cm5zIEZvdXItZGlnaXQgeWVhci5cbiAgICovXG4gIHByaXZhdGUgcGFyc2VUb0ZvdXJEaWdpdFllYXIoeWVhcjogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgLy8gSW1wb3NzaWJsZSB5ZWFycy5cbiAgICBpZiAoeWVhciA+IDk5OTkgfHwgKHllYXIgPiAxMDAgJiYgeWVhciA8IDk5OSkgfHwgeWVhciA8IDEwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoeWVhciA+IDk5OSkge1xuICAgICAgcmV0dXJuIHllYXI7XG4gICAgfVxuXG4gICAgY29uc3QgY3VyclllYXI6IG51bWJlciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBjZW50dXJ5OiBudW1iZXIgPSBNYXRoLmZsb29yKGN1cnJZZWFyIC8gMTAwKSAqIDEwMDtcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSB5ZWFyICsgY2VudHVyeTtcbiAgICBpZiAocmVzdWx0ID4gY3VyclllYXIgKyAyMCkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IC0gMTAwO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { EventEmitter, Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Daterange service.
|
|
5
|
+
* Keeps track of daterange related values.
|
|
6
|
+
*/
|
|
7
|
+
export class DaterangeService {
|
|
8
|
+
constructor() {
|
|
9
|
+
/** Minimum date that can be selected. */
|
|
10
|
+
this.minDate = null;
|
|
11
|
+
/** Maximum date that can be selected. */
|
|
12
|
+
this.maxDate = null;
|
|
13
|
+
this._selectedDaterange = null;
|
|
14
|
+
/**
|
|
15
|
+
* Event triggered when value changes.
|
|
16
|
+
*/
|
|
17
|
+
this.valueChange = new EventEmitter();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Selected daterange value.
|
|
21
|
+
* @returns Selected daterange value.
|
|
22
|
+
*/
|
|
23
|
+
get selectedDaterange() {
|
|
24
|
+
return this._selectedDaterange;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Set selected daterange value.
|
|
28
|
+
* @param value - New selected daterange value.
|
|
29
|
+
* @param triggerEvent - Trigger change event (default true).
|
|
30
|
+
*/
|
|
31
|
+
updateSelectedDaterange(value, triggerEvent = true) {
|
|
32
|
+
this._selectedDaterange = value;
|
|
33
|
+
if (triggerEvent) {
|
|
34
|
+
this.valueChange.emit(value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Checks if daterange is valid.
|
|
39
|
+
* Daterange is considered invalid when it's empty, or when one of it's properties is absent.
|
|
40
|
+
* @returns Wether daterange is valid.
|
|
41
|
+
*/
|
|
42
|
+
isValid() {
|
|
43
|
+
if (this._selectedDaterange == null || this._selectedDaterange.from == null || this._selectedDaterange.to == null) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
DaterangeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: DaterangeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
50
|
+
DaterangeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: DaterangeService });
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: DaterangeService, decorators: [{
|
|
52
|
+
type: Injectable
|
|
53
|
+
}] });
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXJhbmdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY2xyLWFkZG9ucy9kYXRlcmFuZ2VwaWNrZXIvcHJvdmlkZXJzL2RhdGVyYW5nZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUt6RDs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBRDdCO1FBRUUseUNBQXlDO1FBQ2xDLFlBQU8sR0FBcUIsSUFBSSxDQUFDO1FBRXhDLHlDQUF5QztRQUNsQyxZQUFPLEdBQXFCLElBQUksQ0FBQztRQUVoQyx1QkFBa0IsR0FBc0IsSUFBSSxDQUFDO1FBdUJyRDs7V0FFRztRQUNJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7S0FhNUQ7SUFyQ0M7OztPQUdHO0lBQ0gsSUFBVyxpQkFBaUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx1QkFBdUIsQ0FBQyxLQUF3QixFQUFFLFlBQVksR0FBRyxJQUFJO1FBQzFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFFaEMsSUFBSSxZQUFZLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBT0Q7Ozs7T0FJRztJQUNJLE9BQU87UUFDWixJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDakgsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7NkdBN0NVLGdCQUFnQjtpSEFBaEIsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTnVsbGFibGVEYXRlcmFuZ2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2RhdGVyYW5nZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTnVsbGFibGVEYXlNb2RlbCB9IGZyb20gJy4uL21vZGVscy9kYXkubW9kZWwnO1xuXG4vKipcbiAqIERhdGVyYW5nZSBzZXJ2aWNlLlxuICogS2VlcHMgdHJhY2sgb2YgZGF0ZXJhbmdlIHJlbGF0ZWQgdmFsdWVzLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZXJhbmdlU2VydmljZSB7XG4gIC8qKiBNaW5pbXVtIGRhdGUgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuICovXG4gIHB1YmxpYyBtaW5EYXRlOiBOdWxsYWJsZURheU1vZGVsID0gbnVsbDtcblxuICAvKiogTWF4aW11bSBkYXRlIHRoYXQgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICBwdWJsaWMgbWF4RGF0ZTogTnVsbGFibGVEYXlNb2RlbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfc2VsZWN0ZWREYXRlcmFuZ2U6IE51bGxhYmxlRGF0ZXJhbmdlID0gbnVsbDtcblxuICAvKipcbiAgICogU2VsZWN0ZWQgZGF0ZXJhbmdlIHZhbHVlLlxuICAgKiBAcmV0dXJucyBTZWxlY3RlZCBkYXRlcmFuZ2UgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbGVjdGVkRGF0ZXJhbmdlKCk6IE51bGxhYmxlRGF0ZXJhbmdlIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWREYXRlcmFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlbGVjdGVkIGRhdGVyYW5nZSB2YWx1ZS5cbiAgICogQHBhcmFtIHZhbHVlIC0gTmV3IHNlbGVjdGVkIGRhdGVyYW5nZSB2YWx1ZS5cbiAgICogQHBhcmFtIHRyaWdnZXJFdmVudCAtIFRyaWdnZXIgY2hhbmdlIGV2ZW50IChkZWZhdWx0IHRydWUpLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVNlbGVjdGVkRGF0ZXJhbmdlKHZhbHVlOiBOdWxsYWJsZURhdGVyYW5nZSwgdHJpZ2dlckV2ZW50ID0gdHJ1ZSk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkRGF0ZXJhbmdlID0gdmFsdWU7XG5cbiAgICBpZiAodHJpZ2dlckV2ZW50KSB7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCB0cmlnZ2VyZWQgd2hlbiB2YWx1ZSBjaGFuZ2VzLlxuICAgKi9cbiAgcHVibGljIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOdWxsYWJsZURhdGVyYW5nZT4oKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGRhdGVyYW5nZSBpcyB2YWxpZC5cbiAgICogRGF0ZXJhbmdlIGlzIGNvbnNpZGVyZWQgaW52YWxpZCB3aGVuIGl0J3MgZW1wdHksIG9yIHdoZW4gb25lIG9mIGl0J3MgcHJvcGVydGllcyBpcyBhYnNlbnQuXG4gICAqIEByZXR1cm5zIFdldGhlciBkYXRlcmFuZ2UgaXMgdmFsaWQuXG4gICAqL1xuICBwdWJsaWMgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWREYXRlcmFuZ2UgPT0gbnVsbCB8fCB0aGlzLl9zZWxlY3RlZERhdGVyYW5nZS5mcm9tID09IG51bGwgfHwgdGhpcy5fc2VsZWN0ZWREYXRlcmFuZ2UudG8gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { EventEmitter, Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Keeps track of how many Clarity Datepicker there are open.
|
|
5
|
+
* This is needed for the ClrDaterangepickerContainerComponent, to know when to close the popover.
|
|
6
|
+
*/
|
|
7
|
+
export class OpenedDatepickersTrackerService {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.openedDatepickersCount = 0;
|
|
10
|
+
/**
|
|
11
|
+
* Event triggered when value changes.
|
|
12
|
+
*/
|
|
13
|
+
this.valueChange = new EventEmitter();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Tracks an opened datepicker.
|
|
17
|
+
* @param opened - Opened state.
|
|
18
|
+
*/
|
|
19
|
+
track(opened) {
|
|
20
|
+
if (opened) {
|
|
21
|
+
this.openedDatepickersCount++;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.openedDatepickersCount--;
|
|
25
|
+
}
|
|
26
|
+
this.openedDatepickersCount = Math.max(0, this.openedDatepickersCount);
|
|
27
|
+
this.valueChange.emit(this.openedDatepickersCount !== 0);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
OpenedDatepickersTrackerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: OpenedDatepickersTrackerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
31
|
+
OpenedDatepickersTrackerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: OpenedDatepickersTrackerService, providedIn: 'root' });
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: OpenedDatepickersTrackerService, decorators: [{
|
|
33
|
+
type: Injectable,
|
|
34
|
+
args: [{ providedIn: 'root' }]
|
|
35
|
+
}] });
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmVkLWRhdGVwaWNrZXJzLXRyYWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jbHItYWRkb25zL2RhdGVyYW5nZXBpY2tlci9wcm92aWRlcnMvb3BlbmVkLWRhdGVwaWNrZXJzLXRyYWNrZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFekQ7OztHQUdHO0FBRUgsTUFBTSxPQUFPLCtCQUErQjtJQUQ1QztRQUVVLDJCQUFzQixHQUFHLENBQUMsQ0FBQztRQUVuQzs7V0FFRztRQUNJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztLQWVsRDtJQWJDOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxNQUFlO1FBQzFCLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDL0I7YUFBTTtZQUNMLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDOzs0SEFwQlUsK0JBQStCO2dJQUEvQiwrQkFBK0IsY0FEbEIsTUFBTTsyRkFDbkIsK0JBQStCO2tCQUQzQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IENsYXJpdHkgRGF0ZXBpY2tlciB0aGVyZSBhcmUgb3Blbi5cbiAqIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgQ2xyRGF0ZXJhbmdlcGlja2VyQ29udGFpbmVyQ29tcG9uZW50LCB0byBrbm93IHdoZW4gdG8gY2xvc2UgdGhlIHBvcG92ZXIuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgT3BlbmVkRGF0ZXBpY2tlcnNUcmFja2VyU2VydmljZSB7XG4gIHByaXZhdGUgb3BlbmVkRGF0ZXBpY2tlcnNDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRyaWdnZXJlZCB3aGVuIHZhbHVlIGNoYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhbiBvcGVuZWQgZGF0ZXBpY2tlci5cbiAgICogQHBhcmFtIG9wZW5lZCAtIE9wZW5lZCBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyB0cmFjayhvcGVuZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAob3BlbmVkKSB7XG4gICAgICB0aGlzLm9wZW5lZERhdGVwaWNrZXJzQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuZWREYXRlcGlja2Vyc0NvdW50LS07XG4gICAgfVxuICAgIHRoaXMub3BlbmVkRGF0ZXBpY2tlcnNDb3VudCA9IE1hdGgubWF4KDAsIHRoaXMub3BlbmVkRGF0ZXBpY2tlcnNDb3VudCk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMub3BlbmVkRGF0ZXBpY2tlcnNDb3VudCAhPT0gMCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Directive, forwardRef, Input, Optional } from '@angular/core';
|
|
2
|
+
import { NG_VALIDATORS } from '@angular/forms';
|
|
3
|
+
import { DaterangeService } from '../providers/daterange.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../providers/daterange.service";
|
|
6
|
+
/**
|
|
7
|
+
* Validator for daterangepicker to validate that 'to' date is not after 'max' value.
|
|
8
|
+
* Otherwise will throw corresponding `max` validation error.
|
|
9
|
+
*
|
|
10
|
+
* Validator is applied to the ClrDaterangepickerDirective with `max` attribute.
|
|
11
|
+
* Or when set manually with `clrDaterangeMax` attribute.
|
|
12
|
+
*
|
|
13
|
+
* Validator is active by default when applied. It can be disabled with: `[clrDaterangeMax]="false"`
|
|
14
|
+
*/
|
|
15
|
+
export class ClrDaterangeMaxValidator {
|
|
16
|
+
constructor(daterangeService) {
|
|
17
|
+
this.daterangeService = daterangeService;
|
|
18
|
+
this._active = true;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Disable validator by setting value to `false`.
|
|
22
|
+
*/
|
|
23
|
+
set active(active) {
|
|
24
|
+
this._active = active == null || (active !== false && `${active}` !== 'false');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Validator method. Method that performs synchronous validation against the provided control.
|
|
28
|
+
* @param control - The control to validate against.
|
|
29
|
+
* @returns A map of validation errors if validation fails, otherwise null.
|
|
30
|
+
*/
|
|
31
|
+
validate(control) {
|
|
32
|
+
if (!this._active) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (control.value == null) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const max = this.daterangeService.maxDate;
|
|
39
|
+
if (max == null) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const { to } = control.value;
|
|
43
|
+
if (to == null) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
if (to.isAfter(max)) {
|
|
47
|
+
return {
|
|
48
|
+
[ClrDaterangeMaxValidator.validationErrorName]: {
|
|
49
|
+
max,
|
|
50
|
+
actual: to,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Validation error name. */
|
|
58
|
+
ClrDaterangeMaxValidator.validationErrorName = 'max';
|
|
59
|
+
ClrDaterangeMaxValidator.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: ClrDaterangeMaxValidator, deps: [{ token: i1.DaterangeService, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
60
|
+
ClrDaterangeMaxValidator.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.1", type: ClrDaterangeMaxValidator, selector: "[clrDaterangepicker][max], [clrDaterangeMax]", inputs: { active: ["clrDaterangeMax", "active"] }, providers: [
|
|
61
|
+
{
|
|
62
|
+
provide: NG_VALIDATORS,
|
|
63
|
+
useExisting: forwardRef(() => ClrDaterangeMaxValidator),
|
|
64
|
+
multi: true,
|
|
65
|
+
},
|
|
66
|
+
], ngImport: i0 });
|
|
67
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: ClrDaterangeMaxValidator, decorators: [{
|
|
68
|
+
type: Directive,
|
|
69
|
+
args: [{
|
|
70
|
+
selector: '[clrDaterangepicker][max], [clrDaterangeMax]',
|
|
71
|
+
providers: [
|
|
72
|
+
{
|
|
73
|
+
provide: NG_VALIDATORS,
|
|
74
|
+
useExisting: forwardRef(() => ClrDaterangeMaxValidator),
|
|
75
|
+
multi: true,
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
}]
|
|
79
|
+
}], ctorParameters: function () { return [{ type: i1.DaterangeService, decorators: [{
|
|
80
|
+
type: Optional
|
|
81
|
+
}] }]; }, propDecorators: { active: [{
|
|
82
|
+
type: Input,
|
|
83
|
+
args: ['clrDaterangeMax']
|
|
84
|
+
}] } });
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXJhbmdlLW1heC52YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY2xyLWFkZG9ucy9kYXRlcmFuZ2VwaWNrZXIvdmFsaWRhdG9ycy9kYXRlcmFuZ2UtbWF4LnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBbUIsYUFBYSxFQUErQixNQUFNLGdCQUFnQixDQUFDO0FBSTdGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7QUFFbEU7Ozs7Ozs7O0dBUUc7QUFXSCxNQUFNLE9BQU8sd0JBQXdCO0lBTW5DLFlBQWdELGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRjFFLFlBQU8sR0FBRyxJQUFJLENBQUM7SUFFOEQsQ0FBQztJQUV0Rjs7T0FFRztJQUNILElBQ1csTUFBTSxDQUFDLE1BQTJDO1FBQzNELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksR0FBRyxNQUFNLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBQyxPQUFnRDtRQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSxHQUFHLEdBQXFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDNUQsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2YsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBRTdCLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkIsT0FBTztnQkFDTCxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLEVBQUU7b0JBQzlDLEdBQUc7b0JBQ0gsTUFBTSxFQUFFLEVBQUU7aUJBQ1g7YUFDRixDQUFDO1NBQ0g7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O0FBbERELDZCQUE2QjtBQUNOLDRDQUFtQixHQUFHLEtBQUssQ0FBQztxSEFGeEMsd0JBQXdCO3lHQUF4Qix3QkFBd0IsMEhBUnhCO1FBQ1Q7WUFDRSxPQUFPLEVBQUUsYUFBYTtZQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO1lBQ3ZELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRjsyRkFFVSx3QkFBd0I7a0JBVnBDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDhDQUE4QztvQkFDeEQsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7OzBCQU9xQixRQUFROzRDQU1qQixNQUFNO3NCQURoQixLQUFLO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgZm9yd2FyZFJlZiwgSW5wdXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIE5HX1ZBTElEQVRPUlMsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTnVsbGFibGVEYXRlcmFuZ2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2RhdGVyYW5nZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTnVsbGFibGVEYXlNb2RlbCB9IGZyb20gJy4uL21vZGVscy9kYXkubW9kZWwnO1xuaW1wb3J0IHsgRGF0ZXJhbmdlU2VydmljZSB9IGZyb20gJy4uL3Byb3ZpZGVycy9kYXRlcmFuZ2Uuc2VydmljZSc7XG5cbi8qKlxuICogVmFsaWRhdG9yIGZvciBkYXRlcmFuZ2VwaWNrZXIgdG8gdmFsaWRhdGUgdGhhdCAndG8nIGRhdGUgaXMgbm90IGFmdGVyICdtYXgnIHZhbHVlLlxuICogT3RoZXJ3aXNlIHdpbGwgdGhyb3cgY29ycmVzcG9uZGluZyBgbWF4YCB2YWxpZGF0aW9uIGVycm9yLlxuICpcbiAqIFZhbGlkYXRvciBpcyBhcHBsaWVkIHRvIHRoZSBDbHJEYXRlcmFuZ2VwaWNrZXJEaXJlY3RpdmUgd2l0aCBgbWF4YCBhdHRyaWJ1dGUuXG4gKiBPciB3aGVuIHNldCBtYW51YWxseSB3aXRoIGBjbHJEYXRlcmFuZ2VNYXhgIGF0dHJpYnV0ZS5cbiAqXG4gKiBWYWxpZGF0b3IgaXMgYWN0aXZlIGJ5IGRlZmF1bHQgd2hlbiBhcHBsaWVkLiBJdCBjYW4gYmUgZGlzYWJsZWQgd2l0aDogYFtjbHJEYXRlcmFuZ2VNYXhdPVwiZmFsc2VcImBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NsckRhdGVyYW5nZXBpY2tlcl1bbWF4XSwgW2NsckRhdGVyYW5nZU1heF0nLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2xyRGF0ZXJhbmdlTWF4VmFsaWRhdG9yKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRhdGVyYW5nZU1heFZhbGlkYXRvciBpbXBsZW1lbnRzIFZhbGlkYXRvciB7XG4gIC8qKiBWYWxpZGF0aW9uIGVycm9yIG5hbWUuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmFsaWRhdGlvbkVycm9yTmFtZSA9ICdtYXgnO1xuXG4gIHByaXZhdGUgX2FjdGl2ZSA9IHRydWU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgZGF0ZXJhbmdlU2VydmljZTogRGF0ZXJhbmdlU2VydmljZSkge31cblxuICAvKipcbiAgICogRGlzYWJsZSB2YWxpZGF0b3IgYnkgc2V0dGluZyB2YWx1ZSB0byBgZmFsc2VgLlxuICAgKi9cbiAgQElucHV0KCdjbHJEYXRlcmFuZ2VNYXgnKVxuICBwdWJsaWMgc2V0IGFjdGl2ZShhY3RpdmU6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgdGhpcy5fYWN0aXZlID0gYWN0aXZlID09IG51bGwgfHwgKGFjdGl2ZSAhPT0gZmFsc2UgJiYgYCR7YWN0aXZlfWAgIT09ICdmYWxzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRvciBtZXRob2QuIE1ldGhvZCB0aGF0IHBlcmZvcm1zIHN5bmNocm9ub3VzIHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgcHJvdmlkZWQgY29udHJvbC5cbiAgICogQHBhcmFtIGNvbnRyb2wgLSBUaGUgY29udHJvbCB0byB2YWxpZGF0ZSBhZ2FpbnN0LlxuICAgKiBAcmV0dXJucyBBIG1hcCBvZiB2YWxpZGF0aW9uIGVycm9ycyBpZiB2YWxpZGF0aW9uIGZhaWxzLCBvdGhlcndpc2UgbnVsbC5cbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2w8TnVsbGFibGVEYXRlcmFuZ2UsIGFueT4pOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG1heDogTnVsbGFibGVEYXlNb2RlbCA9IHRoaXMuZGF0ZXJhbmdlU2VydmljZS5tYXhEYXRlO1xuICAgIGlmIChtYXggPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0byB9ID0gY29udHJvbC52YWx1ZTtcblxuICAgIGlmICh0byA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodG8uaXNBZnRlcihtYXgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbQ2xyRGF0ZXJhbmdlTWF4VmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvck5hbWVdOiB7XG4gICAgICAgICAgbWF4LFxuICAgICAgICAgIGFjdHVhbDogdG8sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
|