@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.
Files changed (51) hide show
  1. package/clr-addons.module.d.ts +2 -1
  2. package/daterangepicker/daterange.constants.d.ts +21 -0
  3. package/daterangepicker/daterangepicker.module.d.ts +17 -0
  4. package/daterangepicker/directives/abstract-container.component.d.ts +53 -0
  5. package/daterangepicker/directives/datepicker/datepicker.component.d.ts +65 -0
  6. package/daterangepicker/directives/daterangepicker/daterangepicker.directive.d.ts +127 -0
  7. package/daterangepicker/directives/daterangepicker-container/daterangepicker-container.component.d.ts +118 -0
  8. package/daterangepicker/directives/if-daterange-error.directive.d.ts +40 -0
  9. package/daterangepicker/index.d.ts +13 -0
  10. package/daterangepicker/interfaces/daterange-preset.interface.d.ts +8 -0
  11. package/daterangepicker/interfaces/daterange.interface.d.ts +12 -0
  12. package/daterangepicker/models/day.model.d.ts +80 -0
  13. package/daterangepicker/models/popover-positions.model.d.ts +20 -0
  14. package/daterangepicker/providers/daterange-control-state.service.d.ts +42 -0
  15. package/daterangepicker/providers/daterange-parsing.service.d.ts +66 -0
  16. package/daterangepicker/providers/daterange.service.d.ts +38 -0
  17. package/daterangepicker/providers/opened-datepickers-tracker.service.d.ts +20 -0
  18. package/daterangepicker/validators/daterange-max.validator.d.ts +32 -0
  19. package/daterangepicker/validators/daterange-min.validator.d.ts +32 -0
  20. package/daterangepicker/validators/daterange-order.validator.d.ts +29 -0
  21. package/daterangepicker/validators/daterange-required.validator.d.ts +29 -0
  22. package/dropdown/clr-dropdown-overflow.directive.d.ts +4 -3
  23. package/esm2020/clr-addons.module.mjs +8 -4
  24. package/esm2020/daterangepicker/daterange.constants.mjs +27 -0
  25. package/esm2020/daterangepicker/daterangepicker.module.mjs +58 -0
  26. package/esm2020/daterangepicker/directives/abstract-container.component.mjs +104 -0
  27. package/esm2020/daterangepicker/directives/datepicker/datepicker.component.mjs +97 -0
  28. package/esm2020/daterangepicker/directives/daterangepicker/daterangepicker.directive.mjs +256 -0
  29. package/esm2020/daterangepicker/directives/daterangepicker-container/daterangepicker-container.component.mjs +251 -0
  30. package/esm2020/daterangepicker/directives/if-daterange-error.directive.mjs +94 -0
  31. package/esm2020/daterangepicker/index.mjs +14 -0
  32. package/esm2020/daterangepicker/interfaces/daterange-preset.interface.mjs +2 -0
  33. package/esm2020/daterangepicker/interfaces/daterange.interface.mjs +2 -0
  34. package/esm2020/daterangepicker/models/day.model.mjs +99 -0
  35. package/esm2020/daterangepicker/models/popover-positions.model.mjs +66 -0
  36. package/esm2020/daterangepicker/providers/daterange-control-state.service.mjs +62 -0
  37. package/esm2020/daterangepicker/providers/daterange-parsing.service.mjs +206 -0
  38. package/esm2020/daterangepicker/providers/daterange.service.mjs +54 -0
  39. package/esm2020/daterangepicker/providers/opened-datepickers-tracker.service.mjs +36 -0
  40. package/esm2020/daterangepicker/validators/daterange-max.validator.mjs +85 -0
  41. package/esm2020/daterangepicker/validators/daterange-min.validator.mjs +85 -0
  42. package/esm2020/daterangepicker/validators/daterange-order.validator.mjs +75 -0
  43. package/esm2020/daterangepicker/validators/daterange-required.validator.mjs +71 -0
  44. package/esm2020/dropdown/clr-dropdown-overflow.directive.mjs +15 -11
  45. package/esm2020/index.mjs +3 -2
  46. package/fesm2015/clr-addons.mjs +1920 -264
  47. package/fesm2015/clr-addons.mjs.map +1 -1
  48. package/fesm2020/clr-addons.mjs +1900 -264
  49. package/fesm2020/clr-addons.mjs.map +1 -1
  50. package/index.d.ts +1 -0
  51. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXJhbmdlLXBhcnNpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jbHItYWRkb25zL2RhdGVyYW5nZXBpY2tlci9wcm92aWRlcnMvZGF0ZXJhbmdlLXBhcnNpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTlELE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxFQUVmLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsZ0JBQWdCLEdBQ2pCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLFFBQVEsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQzs7QUFFakU7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyx1QkFBdUI7SUFlbEMsWUFBdUQsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFickQsb0JBQWUsR0FBa0IsRUFBRSxDQUFDO1FBY2xELE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sTUFBTSxHQUFXLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXhELElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxhQUFhLENBQUM7U0FDMUM7YUFBTSxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsYUFBYSxDQUFDO1NBQzFDO2FBQU07WUFDTCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDO1NBQ3ZDO1FBRUQsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSxNQUFNLFVBQVUsR0FBa0IsWUFBWSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUEzQkQscUJBQXFCO0lBQ3JCLElBQVcsWUFBWTtRQUNyQixPQUFPLENBQ0wsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDbkMsQ0FBQztJQUNKLENBQUM7SUFvQkQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsU0FBNEIsRUFBRSxZQUFvQixzQkFBc0I7UUFDNUYsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtZQUM5QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUUzQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNELE9BQU8sV0FBVyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSywyQkFBMkIsQ0FBQyxJQUFVO1FBQzVDLE1BQU0sTUFBTSxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFXLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUxQyxNQUFNLE9BQU8sR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZDLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLGFBQWEsRUFBRTtZQUM5QyxPQUFPLE9BQU8sR0FBRyxNQUFNLEdBQUcsUUFBUSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdEQ7YUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxhQUFhLEVBQUU7WUFDckQsT0FBTyxRQUFRLEdBQUcsTUFBTSxHQUFHLE9BQU8sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQ3REO2FBQU07WUFDTCxPQUFPLE1BQU0sR0FBRyxNQUFNLEdBQUcsUUFBUSxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUM7U0FDdEQ7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEdBQUcsQ0FBQyxHQUFXO1FBQ3JCLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsZUFBdUIsRUFBRSxZQUFvQixzQkFBc0I7UUFDOUUsSUFBSSxlQUFlLElBQUksSUFBSSxJQUFJLGVBQWUsS0FBSyxFQUFFLEVBQUU7WUFDckQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBELElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0sseUJBQXlCLENBQUMsVUFBa0I7UUFDbEQsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLFVBQVUsS0FBSyxFQUFFLEVBQUU7WUFDM0MsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sU0FBUyxHQUFxQixVQUFVLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdkUsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQy9DLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDckQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssYUFBYSxFQUFFO1lBQzlDLDRDQUE0QztZQUM1QyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQ3hFO2FBQU0sSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssYUFBYSxFQUFFO1lBQ3JELDRDQUE0QztZQUM1QyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3hFO2FBQU07WUFDTCw0Q0FBNEM7WUFDNUMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUN4RTtJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyx3QkFBd0IsQ0FBQyxVQUFrQixFQUFFLFdBQW1CLEVBQUUsVUFBa0I7UUFDMUYscUNBQXFDO1FBQ3JDLElBQUksSUFBSSxHQUFXLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLEtBQUssR0FBVyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU0sSUFBSSxHQUFXLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELHlCQUF5QjtRQUN6QixLQUFLLElBQUksQ0FBQyxDQUFDO1FBRVgsa0ZBQWtGO1FBQ2xGLG9GQUFvRjtRQUNwRixNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxvQkFBb0IsQ0FBQyxJQUFZO1FBQ3ZDLG9CQUFvQjtRQUNwQixJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFO1lBQzFELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSxRQUFRLEdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekQsSUFBSSxNQUFNLEdBQVcsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUNwQyxJQUFJLE1BQU0sR0FBRyxRQUFRLEdBQUcsRUFBRSxFQUFFO1lBQzFCLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO1NBQ3ZCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7b0hBL01VLHVCQUF1QixrQkFlUCxTQUFTO3dIQWZ6Qix1QkFBdUIsY0FGdEIsTUFBTTsyRkFFUCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFnQnFCLE1BQU07MkJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1hdFdpZHRoLCBnZXRMb2NhbGVEYXRlRm9ybWF0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIEJJR19FTkRJQU4sXG4gIERFTElNSVRFUl9SRUdFWCxcbiAgSW5wdXREYXRlRGlzcGxheUZvcm1hdCxcbiAgTElUVExFX0VORElBTixcbiAgTElUVExFX0VORElBTl9SRUdFWCxcbiAgTUlERExFX0VORElBTixcbiAgTUlERExFX0VORElBTl9SRUdFWCxcbiAgU0VQQVJBVE9SX1RFWFRfREVGQVVMVCxcbiAgVVNFUl9JTlBVVF9SRUdFWCxcbn0gZnJvbSAnLi4vZGF0ZXJhbmdlLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBOdWxsYWJsZURhdGVyYW5nZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGF0ZXJhbmdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEYXlNb2RlbCwgTnVsbGFibGVEYXlNb2RlbCB9IGZyb20gJy4uL21vZGVscy9kYXkubW9kZWwnO1xuXG4vKipcbiAqIERhdGVyYW5nZSBwYXJzaW5nIHNlcnZpY2UuXG4gKiBIZWF2eSBpbnNwaXJlZCBieSBgZGF0ZS1pby5zZXJ2aWNlLnRzYCBmcm9tIENsYXJpdHkuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdm13YXJlLWNsYXJpdHkvbmctY2xhcml0eS9ibG9iL2EyMWZlNzI2ZmU5MWFlM2M5MjliOGYwMTYzNTlhZmUzNTRiYjg5YzYvcHJvamVjdHMvYW5ndWxhci9zcmMvZm9ybXMvZGF0ZXBpY2tlci9wcm92aWRlcnMvZGF0ZS1pby5zZXJ2aWNlLnRzXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcmFuZ2VQYXJzaW5nU2VydmljZSB7XG4gIHB1YmxpYyByZWFkb25seSBsb2NhbGVEaXNwbGF5Rm9ybWF0OiBJbnB1dERhdGVEaXNwbGF5Rm9ybWF0O1xuICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlRGVsaW1pdGVyOiBBcnJheTxzdHJpbmc+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=