iss-ctrl 0.0.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 (74) hide show
  1. package/README.md +24 -0
  2. package/components/autocomplete/autocomplete.component.d.ts +6 -0
  3. package/components/base-ctrl.d.ts +33 -0
  4. package/components/checkbox/checkbox.component.d.ts +16 -0
  5. package/components/chips/chips.component.d.ts +6 -0
  6. package/components/ctrl-array/ctrl-array.component.d.ts +6 -0
  7. package/components/date-picker/date-adapter.d.ts +37 -0
  8. package/components/date-picker/date-picker.component.d.ts +15 -0
  9. package/components/date-range-picker/date-range-picker.component.d.ts +19 -0
  10. package/components/datetime-picker/datetime-picker.component.d.ts +14 -0
  11. package/components/datetime-range-picker/datetime-range-picker.component.d.ts +6 -0
  12. package/components/file-picker/file-picker.component.d.ts +17 -0
  13. package/components/hints/hints.component.d.ts +9 -0
  14. package/components/input/input.component.d.ts +8 -0
  15. package/components/mobile/COUNTRIES.d.ts +2 -0
  16. package/components/mobile/mobile.component.d.ts +26 -0
  17. package/components/mobile/phone.service.d.ts +17 -0
  18. package/components/note/note.component.d.ts +6 -0
  19. package/components/plate-number/plate-number.component.d.ts +16 -0
  20. package/components/radio/radio.component.d.ts +11 -0
  21. package/components/select/select.component.d.ts +20 -0
  22. package/components/slide-toggle/slide-toggle.component.d.ts +7 -0
  23. package/components/textarea/textarea.component.d.ts +6 -0
  24. package/components/time-picker/time-picker.component.d.ts +19 -0
  25. package/components/toggle-button/toggle-button.component.d.ts +16 -0
  26. package/directives/droppable.directive.d.ts +10 -0
  27. package/esm2022/components/autocomplete/autocomplete.component.mjs +17 -0
  28. package/esm2022/components/base-ctrl.mjs +93 -0
  29. package/esm2022/components/checkbox/checkbox.component.mjs +73 -0
  30. package/esm2022/components/chips/chips.component.mjs +17 -0
  31. package/esm2022/components/ctrl-array/ctrl-array.component.mjs +17 -0
  32. package/esm2022/components/date-picker/date-adapter.mjs +183 -0
  33. package/esm2022/components/date-picker/date-picker.component.mjs +55 -0
  34. package/esm2022/components/date-range-picker/date-range-picker.component.mjs +101 -0
  35. package/esm2022/components/datetime-picker/datetime-picker.component.mjs +79 -0
  36. package/esm2022/components/datetime-range-picker/datetime-range-picker.component.mjs +17 -0
  37. package/esm2022/components/file-picker/file-picker.component.mjs +121 -0
  38. package/esm2022/components/hints/hints.component.mjs +66 -0
  39. package/esm2022/components/input/input.component.mjs +32 -0
  40. package/esm2022/components/mobile/COUNTRIES.mjs +2041 -0
  41. package/esm2022/components/mobile/mobile.component.mjs +141 -0
  42. package/esm2022/components/mobile/phone.service.mjs +99 -0
  43. package/esm2022/components/note/note.component.mjs +17 -0
  44. package/esm2022/components/plate-number/plate-number.component.mjs +114 -0
  45. package/esm2022/components/radio/radio.component.mjs +40 -0
  46. package/esm2022/components/select/select.component.mjs +124 -0
  47. package/esm2022/components/slide-toggle/slide-toggle.component.mjs +23 -0
  48. package/esm2022/components/textarea/textarea.component.mjs +17 -0
  49. package/esm2022/components/time-picker/time-picker.component.mjs +169 -0
  50. package/esm2022/components/toggle-button/toggle-button.component.mjs +87 -0
  51. package/esm2022/directives/droppable.directive.mjs +39 -0
  52. package/esm2022/interfaces/country.interface.mjs +2 -0
  53. package/esm2022/interfaces/date-range-emission-object.mjs +2 -0
  54. package/esm2022/interfaces/hint.interface.mjs +2 -0
  55. package/esm2022/interfaces/iso2.interface.mjs +2 -0
  56. package/esm2022/interfaces/mobile.interface.mjs +2 -0
  57. package/esm2022/interfaces/option.interface.mjs +2 -0
  58. package/esm2022/interfaces/time.interface.mjs +2 -0
  59. package/esm2022/iss-ctrl.mjs +5 -0
  60. package/esm2022/pipes/select-status.pipe.mjs +18 -0
  61. package/esm2022/public-api.mjs +20 -0
  62. package/fesm2022/iss-ctrl.mjs +3659 -0
  63. package/fesm2022/iss-ctrl.mjs.map +1 -0
  64. package/index.d.ts +5 -0
  65. package/interfaces/country.interface.d.ts +10 -0
  66. package/interfaces/date-range-emission-object.d.ts +5 -0
  67. package/interfaces/hint.interface.d.ts +5 -0
  68. package/interfaces/iso2.interface.d.ts +1 -0
  69. package/interfaces/mobile.interface.d.ts +11 -0
  70. package/interfaces/option.interface.d.ts +4 -0
  71. package/interfaces/time.interface.d.ts +5 -0
  72. package/package.json +25 -0
  73. package/pipes/select-status.pipe.d.ts +8 -0
  74. package/public-api.d.ts +19 -0
@@ -0,0 +1,73 @@
1
+ import { Component, input, signal, } from "@angular/core";
2
+ import { NG_VALUE_ACCESSOR, ReactiveFormsModule } from "@angular/forms";
3
+ import { BaseCtrl } from "../base-ctrl";
4
+ import { MatCheckboxModule } from "@angular/material/checkbox";
5
+ import { SelectStatusPipe } from "../../pipes/select-status.pipe";
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/checkbox";
8
+ export class CheckboxComponent extends BaseCtrl {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.options = input.required();
12
+ this.selectedOptions = signal(new Map());
13
+ }
14
+ writeValue(value) {
15
+ this.#reset();
16
+ if (value === null || value === undefined) {
17
+ return;
18
+ }
19
+ const values = value.split(",").map((val) => val.trim());
20
+ let selectedOptions = this.options().filter((option) => values.includes(option.value));
21
+ this.addToSelectedOptionsMap(this.#selectedOptionsMapFactory(selectedOptions));
22
+ this.ctrl.setValue(selectedOptions);
23
+ }
24
+ addToSelectedOptionsMap(option) {
25
+ if (option) {
26
+ this.selectedOptions = signal(option);
27
+ }
28
+ }
29
+ onCheckboxChange(checked, value) {
30
+ const selectedOption = this.options().find(option => option.value == value);
31
+ this.selectedOptions.update((prev) => {
32
+ const options = prev;
33
+ if (checked)
34
+ options.set(selectedOption?.value, selectedOption);
35
+ else
36
+ options.delete(selectedOption?.value);
37
+ return options;
38
+ });
39
+ this.getEmissionValue(this.selectedOptions());
40
+ }
41
+ stringifySelectedOptions() {
42
+ if (!this.selectedOptions()?.size) {
43
+ return null;
44
+ }
45
+ return Array.from(this.selectedOptions(), ([value]) => value).join();
46
+ }
47
+ getEmissionValue(options) {
48
+ this.addToSelectedOptionsMap(options);
49
+ this.emitValue(this.stringifySelectedOptions());
50
+ }
51
+ #selectedOptionsMapFactory(selectedOptions) {
52
+ let selectedOptionsMap = new Map();
53
+ for (let option of selectedOptions) {
54
+ selectedOptionsMap.set(option.value, option);
55
+ }
56
+ return selectedOptionsMap;
57
+ }
58
+ #reset() {
59
+ this.selectedOptions().clear();
60
+ this.ctrl.setValue(null);
61
+ }
62
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CheckboxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
63
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: CheckboxComponent, isStandalone: true, selector: "iss-ctrl-checkbox", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
64
+ { provide: NG_VALUE_ACCESSOR, useExisting: CheckboxComponent, multi: true },
65
+ ], usesInheritance: true, ngImport: i0, template: "<ul class=\"list-unstyled\">\r\n @for (option of options(); track option.value; ) {\r\n <li class=\"mb-2\">\r\n <mat-checkbox\r\n [checked]=\"option | selectStatus: selectedOptions()\"\r\n (change)=\"onCheckboxChange($event.checked, option.value)\"\r\n >\r\n {{ option.label }}\r\n </mat-checkbox>\r\n </li>\r\n }\r\n</ul>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "pipe", type: SelectStatusPipe, name: "selectStatus" }] }); }
66
+ }
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CheckboxComponent, decorators: [{
68
+ type: Component,
69
+ args: [{ selector: "iss-ctrl-checkbox", standalone: true, imports: [ReactiveFormsModule, MatCheckboxModule, SelectStatusPipe], providers: [
70
+ { provide: NG_VALUE_ACCESSOR, useExisting: CheckboxComponent, multi: true },
71
+ ], template: "<ul class=\"list-unstyled\">\r\n @for (option of options(); track option.value; ) {\r\n <li class=\"mb-2\">\r\n <mat-checkbox\r\n [checked]=\"option | selectStatus: selectedOptions()\"\r\n (change)=\"onCheckboxChange($event.checked, option.value)\"\r\n >\r\n {{ option.label }}\r\n </mat-checkbox>\r\n </li>\r\n }\r\n</ul>\r\n" }]
72
+ }] });
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQWUsTUFBTSxHQUFrQixNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXRDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDOzs7QUFZaEUsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFFBQVE7SUFWL0M7O1FBV0UsWUFBTyxHQUEwQixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEQsb0JBQWUsR0FBd0MsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFrQixDQUFDLENBQUM7S0E2RDFGO0lBM0RVLFVBQVUsQ0FBQyxLQUFvQjtRQUN0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQWEsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFD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RSxnQkFBZ0IsQ0FBQyxhQUd4RDt3QkFDVCxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLG1CQUFtQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7cUJBQzFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIGlucHV0LCBJbnB1dFNpZ25hbCwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCx9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge0Jhc2VDdHJsfSBmcm9tIFwiLi4vYmFzZS1jdHJsXCI7XHJcbmltcG9ydCB7T3B0aW9ufSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9vcHRpb24uaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7TWF0Q2hlY2tib3hNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5pbXBvcnQge1NlbGVjdFN0YXR1c1BpcGV9IGZyb20gXCIuLi8uLi9waXBlcy9zZWxlY3Qtc3RhdHVzLnBpcGVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImlzcy1jdHJsLWNoZWNrYm94XCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZSwgTWF0Q2hlY2tib3hNb2R1bGUsIFNlbGVjdFN0YXR1c1BpcGVdLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY2hlY2tib3guY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL2NoZWNrYm94LmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7cHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBDaGVja2JveENvbXBvbmVudCwgbXVsdGk6IHRydWV9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGVja2JveENvbXBvbmVudCBleHRlbmRzIEJhc2VDdHJsIHtcclxuICBvcHRpb25zOiBJbnB1dFNpZ25hbDxPcHRpb25bXT4gPSBpbnB1dC5yZXF1aXJlZCgpO1xyXG4gIHNlbGVjdGVkT3B0aW9uczogV3JpdGFibGVTaWduYWw8TWFwPHN0cmluZywgT3B0aW9uPj4gPSBzaWduYWwobmV3IE1hcDxzdHJpbmcsIE9wdGlvbj4oKSk7XHJcblxyXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcclxuICAgIHRoaXMuI3Jlc2V0KCk7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gdmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgodmFsOiBzdHJpbmcpID0+IHZhbC50cmltKCkpO1xyXG5cclxuICAgIGxldCBzZWxlY3RlZE9wdGlvbnM6IE9wdGlvbltdID0gdGhpcy5vcHRpb25zKCkuZmlsdGVyKChvcHRpb246IE9wdGlvbikgPT4gdmFsdWVzLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkpO1xyXG4gICAgdGhpcy5hZGRUb1NlbGVjdGVkT3B0aW9uc01hcCh0aGlzLiNzZWxlY3RlZE9wdGlvbnNNYXBGYWN0b3J5KHNlbGVjdGVkT3B0aW9ucykpO1xyXG4gICAgdGhpcy5jdHJsLnNldFZhbHVlKHNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBhZGRUb1NlbGVjdGVkT3B0aW9uc01hcChvcHRpb246IE1hcDxzdHJpbmcsIE9wdGlvbj4pIHtcclxuICAgIGlmIChvcHRpb24pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSBzaWduYWwob3B0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2hlY2tib3hDaGFuZ2UoY2hlY2tlZDogYm9vbGVhbiwgdmFsdWU6IHN0cmluZykge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMoKS5maW5kKG9wdGlvbiA9PiBvcHRpb24udmFsdWUgPT0gdmFsdWUpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zLnVwZGF0ZSgocHJldikgPT4ge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gcHJldjtcclxuXHJcbiAgICAgIGlmIChjaGVja2VkKSBvcHRpb25zLnNldChzZWxlY3RlZE9wdGlvbj8udmFsdWUhLCBzZWxlY3RlZE9wdGlvbiEpO1xyXG4gICAgICBlbHNlIG9wdGlvbnMuZGVsZXRlKHNlbGVjdGVkT3B0aW9uPy52YWx1ZSEpO1xyXG5cclxuICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmdldEVtaXNzaW9uVmFsdWUodGhpcy5zZWxlY3RlZE9wdGlvbnMoKSk7XHJcbiAgfVxyXG5cclxuICBzdHJpbmdpZnlTZWxlY3RlZE9wdGlvbnMoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRPcHRpb25zKCk/LnNpemUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5zZWxlY3RlZE9wdGlvbnMoKSwgKFt2YWx1ZV0pID0+IHZhbHVlKS5qb2luKCk7XHJcbiAgfVxyXG5cclxuICBnZXRFbWlzc2lvblZhbHVlKG9wdGlvbnM6IGFueSkge1xyXG4gICAgdGhpcy5hZGRUb1NlbGVjdGVkT3B0aW9uc01hcChvcHRpb25zKTtcclxuICAgIHRoaXMuZW1pdFZhbHVlKHRoaXMuc3RyaW5naWZ5U2VsZWN0ZWRPcHRpb25zKCkpO1xyXG4gIH1cclxuXHJcbiAgI3NlbGVjdGVkT3B0aW9uc01hcEZhY3Rvcnkoc2VsZWN0ZWRPcHRpb25zOiBPcHRpb25bXSkge1xyXG4gICAgbGV0IHNlbGVjdGVkT3B0aW9uc01hcDogTWFwPHN0cmluZywgT3B0aW9uPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICBmb3IgKGxldCBvcHRpb24gb2Ygc2VsZWN0ZWRPcHRpb25zKSB7XHJcbiAgICAgIHNlbGVjdGVkT3B0aW9uc01hcC5zZXQob3B0aW9uLnZhbHVlLCBvcHRpb24pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uc01hcDtcclxuICB9XHJcblxyXG4gICNyZXNldCgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zKCkuY2xlYXIoKTtcclxuICAgIHRoaXMuY3RybC5zZXRWYWx1ZShudWxsKTtcclxuICB9XHJcbn1cclxuIiwiPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZFwiPlxyXG4gIEBmb3IgKG9wdGlvbiBvZiBvcHRpb25zKCk7IHRyYWNrIG9wdGlvbi52YWx1ZTsgKSB7XHJcbiAgICA8bGkgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICBbY2hlY2tlZF09XCJvcHRpb24gfCBzZWxlY3RTdGF0dXM6IHNlbGVjdGVkT3B0aW9ucygpXCJcclxuICAgICAgICAoY2hhbmdlKT1cIm9uQ2hlY2tib3hDaGFuZ2UoJGV2ZW50LmNoZWNrZWQsIG9wdGlvbi52YWx1ZSlcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XHJcbiAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgPC9saT5cclxuICB9XHJcbjwvdWw+XHJcbiJdfQ==
@@ -0,0 +1,17 @@
1
+ import { Component } from "@angular/core";
2
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
3
+ import { BaseCtrl } from "../base-ctrl";
4
+ import * as i0 from "@angular/core";
5
+ export class ChipsComponent extends BaseCtrl {
6
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ChipsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
7
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: ChipsComponent, isStandalone: true, selector: "iss-ctrl-chips", providers: [
8
+ { provide: NG_VALUE_ACCESSOR, useExisting: ChipsComponent, multi: true }
9
+ ], usesInheritance: true, ngImport: i0, template: "<p>chips works!</p>\r\n", styles: [""] }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ChipsComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: "iss-ctrl-chips", standalone: true, imports: [], providers: [
14
+ { provide: NG_VALUE_ACCESSOR, useExisting: ChipsComponent, multi: true }
15
+ ], template: "<p>chips works!</p>\r\n" }]
16
+ }] });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvY2hpcHMvY2hpcHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvY2hpcHMvY2hpcHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sY0FBYyxDQUFDOztBQVl0QyxNQUFNLE9BQU8sY0FBZSxTQUFRLFFBQVE7OEdBQS9CLGNBQWM7a0dBQWQsY0FBYyw2REFKZDtZQUNULEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztTQUN2RSxpRENaSCx5QkFDQTs7MkZEYWEsY0FBYztrQkFWMUIsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1AsRUFBRSxhQUdBO3dCQUNULEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztxQkFDdkUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7QmFzZUN0cmx9IGZyb20gXCIuLi9iYXNlLWN0cmxcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImlzcy1jdHJsLWNoaXBzXCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXSxcclxuICB0ZW1wbGF0ZVVybDogXCIuL2NoaXBzLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9jaGlwcy5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge3Byb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogQ2hpcHNDb21wb25lbnQsIG11bHRpOiB0cnVlfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENoaXBzQ29tcG9uZW50IGV4dGVuZHMgQmFzZUN0cmwge1xyXG5cclxufVxyXG4iLCI8cD5jaGlwcyB3b3JrcyE8L3A+XHJcbiJdfQ==
@@ -0,0 +1,17 @@
1
+ import { Component } from "@angular/core";
2
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
3
+ import { BaseCtrl } from "../base-ctrl";
4
+ import * as i0 from "@angular/core";
5
+ export class CtrlArrayComponent extends BaseCtrl {
6
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CtrlArrayComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
7
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: CtrlArrayComponent, isStandalone: true, selector: "iss-ctrl-ctrl-array", providers: [
8
+ { provide: NG_VALUE_ACCESSOR, useExisting: CtrlArrayComponent, multi: true }
9
+ ], usesInheritance: true, ngImport: i0, template: "<p>ctrl-array works!</p>\r\n", styles: [""] }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CtrlArrayComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: "iss-ctrl-ctrl-array", standalone: true, imports: [], providers: [
14
+ { provide: NG_VALUE_ACCESSOR, useExisting: CtrlArrayComponent, multi: true }
15
+ ], template: "<p>ctrl-array works!</p>\r\n" }]
16
+ }] });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RybC1hcnJheS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pc3MtY3RybC9zcmMvY29tcG9uZW50cy9jdHJsLWFycmF5L2N0cmwtYXJyYXkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvY3RybC1hcnJheS9jdHJsLWFycmF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGNBQWMsQ0FBQzs7QUFZdEMsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFFBQVE7OEdBQW5DLGtCQUFrQjtrR0FBbEIsa0JBQWtCLGtFQUpsQjtZQUNULEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO1NBQzNFLGlEQ1pILDhCQUNBOzsyRkRhYSxrQkFBa0I7a0JBVjlCLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUCxFQUFFLGFBR0E7d0JBQ1QsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO3FCQUMzRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge05HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtCYXNlQ3RybH0gZnJvbSBcIi4uL2Jhc2UtY3RybFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiaXNzLWN0cmwtY3RybC1hcnJheVwiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW10sXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9jdHJsLWFycmF5LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9jdHJsLWFycmF5LmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7cHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBDdHJsQXJyYXlDb21wb25lbnQsIG11bHRpOiB0cnVlfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEN0cmxBcnJheUNvbXBvbmVudCBleHRlbmRzIEJhc2VDdHJsIHtcclxuXHJcbn1cclxuIiwiPHA+Y3RybC1hcnJheSB3b3JrcyE8L3A+XHJcbiJdfQ==
@@ -0,0 +1,183 @@
1
+ import { Inject, Injectable, Optional } from "@angular/core";
2
+ import { DateAdapter, MAT_DATE_LOCALE } from "@angular/material/core";
3
+ import { addDays, addMonths, addYears, format, formatISO, getDate, getDay, getDaysInMonth, getMonth, getYear, isDate, isValid, parse, parseISO, } from "date-fns";
4
+ import * as i0 from "@angular/core";
5
+ const WEEK_STARTS_ON = 0;
6
+ export const DATE_FORMAT_ADAPTER = {
7
+ parse: {
8
+ dateInput: "dd/MM/yyyy"
9
+ },
10
+ display: {
11
+ dateInput: "dd/MM/yyyy",
12
+ monthYearLabel: "LLLL y",
13
+ dateA11yLabel: "dd/MM/yyyy",
14
+ monthYearA11yLabel: "MMMM y"
15
+ }
16
+ };
17
+ /** Creates an array and fills it with values. */
18
+ function range(length, valueFunction) {
19
+ const valuesArray = Array(length);
20
+ for (let i = 0; i < length; i++) {
21
+ valuesArray[i] = valueFunction(i);
22
+ }
23
+ return valuesArray;
24
+ }
25
+ // date-fns doesn't have a way to read/print month names or days of the week directly,
26
+ // so we get them by formatting a date with a format that produces the desired month/day.
27
+ const MONTH_FORMATS = {
28
+ long: "LLLL",
29
+ short: "LLL",
30
+ narrow: "LLLLL",
31
+ };
32
+ const DAY_OF_WEEK_FORMATS = {
33
+ long: "EEEE",
34
+ short: "EEE",
35
+ narrow: "EEEEE",
36
+ };
37
+ export class ISSDateAdapter extends DateAdapter {
38
+ constructor(matDateLocale) {
39
+ super();
40
+ this.setLocale(matDateLocale);
41
+ }
42
+ getYear(date) {
43
+ return getYear(date);
44
+ }
45
+ getMonth(date) {
46
+ return getMonth(date);
47
+ }
48
+ getDate(date) {
49
+ return getDate(date);
50
+ }
51
+ getDayOfWeek(date) {
52
+ return getDay(date);
53
+ }
54
+ getMonthNames(style) {
55
+ const pattern = MONTH_FORMATS[style];
56
+ return range(12, i => this.format(new Date(2017, i, 1), pattern));
57
+ }
58
+ getDateNames() {
59
+ const dtf = typeof Intl !== "undefined"
60
+ ? new Intl.DateTimeFormat(this.locale.code, {
61
+ day: "numeric",
62
+ timeZone: "utc",
63
+ })
64
+ : null;
65
+ return range(31, i => {
66
+ if (dtf) {
67
+ // date-fns doesn't appear to support this functionality.
68
+ // Fall back to `Intl` on supported browsers.
69
+ const date = new Date();
70
+ date.setUTCFullYear(2017, 0, i + 1);
71
+ date.setUTCHours(0, 0, 0, 0);
72
+ return dtf.format(date).replace(/[\u200e\u200f]/g, "");
73
+ }
74
+ return i + "";
75
+ });
76
+ }
77
+ getDayOfWeekNames(style) {
78
+ const pattern = DAY_OF_WEEK_FORMATS[style];
79
+ return range(7, i => this.format(new Date(2017, 0, i + 1), pattern));
80
+ }
81
+ getYearName(date) {
82
+ return this.format(date, "y");
83
+ }
84
+ getFirstDayOfWeek() {
85
+ return WEEK_STARTS_ON;
86
+ }
87
+ getNumDaysInMonth(date) {
88
+ return getDaysInMonth(date);
89
+ }
90
+ clone(date) {
91
+ return new Date(date.getTime());
92
+ }
93
+ createDate(year, month, date) {
94
+ const result = new Date();
95
+ result.setFullYear(year, month, date);
96
+ result.setHours(0, 0, 0, 0);
97
+ return result;
98
+ }
99
+ today() {
100
+ return new Date();
101
+ }
102
+ parse(value, parseFormat) {
103
+ if (typeof value === "string" && value.length > 0) {
104
+ const iso8601Date = parseISO(value);
105
+ if (this.isValid(iso8601Date)) {
106
+ return iso8601Date;
107
+ }
108
+ const formats = Array.isArray(parseFormat) ? parseFormat : [parseFormat];
109
+ if (!parseFormat.length) {
110
+ throw Error("Formats array must not be empty.");
111
+ }
112
+ for (const currentFormat of formats) {
113
+ const fromFormat = parse(value, currentFormat, new Date(), { locale: this.locale });
114
+ if (this.isValid(fromFormat)) {
115
+ return fromFormat;
116
+ }
117
+ }
118
+ return this.invalid();
119
+ }
120
+ else if (typeof value === "number") {
121
+ return new Date(value);
122
+ }
123
+ else if (value instanceof Date) {
124
+ return this.clone(value);
125
+ }
126
+ return null;
127
+ }
128
+ format(date, displayFormat) {
129
+ if (!this.isValid(date)) {
130
+ throw Error("DateFnsAdapter: Cannot format invalid date.");
131
+ }
132
+ return format(date, displayFormat, { locale: this.locale });
133
+ }
134
+ addCalendarYears(date, years) {
135
+ return addYears(date, years);
136
+ }
137
+ addCalendarMonths(date, months) {
138
+ return addMonths(date, months);
139
+ }
140
+ addCalendarDays(date, days) {
141
+ return addDays(date, days);
142
+ }
143
+ toIso8601(date) {
144
+ return formatISO(date, { representation: "date" });
145
+ }
146
+ /**
147
+ * Returns the given value if given a valid Date or null. Deserializes valid ISO 8601 strings
148
+ * (https://www.ietf.org/rfc/rfc3339.txt) into valid Dates and empty string into null. Returns an
149
+ * invalid date for all other values.
150
+ */
151
+ deserialize(value) {
152
+ if (typeof value === "string") {
153
+ if (!value) {
154
+ return null;
155
+ }
156
+ const date = parseISO(value);
157
+ if (this.isValid(date)) {
158
+ return date;
159
+ }
160
+ }
161
+ return super.deserialize(value);
162
+ }
163
+ isDateInstance(obj) {
164
+ return isDate(obj);
165
+ }
166
+ isValid(date) {
167
+ return isValid(date);
168
+ }
169
+ invalid() {
170
+ return new Date(NaN);
171
+ }
172
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ISSDateAdapter, deps: [{ token: MAT_DATE_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
173
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ISSDateAdapter }); }
174
+ }
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ISSDateAdapter, decorators: [{
176
+ type: Injectable
177
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
178
+ type: Optional
179
+ }, {
180
+ type: Inject,
181
+ args: [MAT_DATE_LOCALE]
182
+ }] }] });
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvZGF0ZS1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUMsV0FBVyxFQUFFLGVBQWUsRUFBaUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRixPQUFPLEVBQ0wsT0FBTyxFQUNQLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxPQUFPLEVBQ1AsTUFBTSxFQUNOLGNBQWMsRUFDZCxRQUFRLEVBQ1IsT0FBTyxFQUNQLE1BQU0sRUFDTixPQUFPLEVBRVAsS0FBSyxFQUNMLFFBQVEsR0FDVCxNQUFNLFVBQVUsQ0FBQzs7QUFFbEIsTUFBTSxjQUFjLEdBQVcsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFtQjtJQUNqRCxLQUFLLEVBQUU7UUFDTCxTQUFTLEVBQUUsWUFBWTtLQUN4QjtJQUNELE9BQU8sRUFBRTtRQUNQLFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLGNBQWMsRUFBRSxRQUFRO1FBQ3hCLGFBQWEsRUFBRSxZQUFZO1FBQzNCLGtCQUFrQixFQUFFLFFBQVE7S0FDN0I7Q0FDRixDQUFDO0FBR0YsaURBQWlEO0FBQ2pELFNBQVMsS0FBSyxDQUFJLE1BQWMsRUFBRSxhQUFtQztJQUNuRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENB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IHtJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0RhdGVBZGFwdGVyLCBNQVRfREFURV9MT0NBTEUsIE1hdERhdGVGb3JtYXRzfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIGFkZERheXMsXHJcbiAgYWRkTW9udGhzLFxyXG4gIGFkZFllYXJzLFxyXG4gIGZvcm1hdCxcclxuICBmb3JtYXRJU08sXHJcbiAgZ2V0RGF0ZSxcclxuICBnZXREYXksXHJcbiAgZ2V0RGF5c0luTW9udGgsXHJcbiAgZ2V0TW9udGgsXHJcbiAgZ2V0WWVhcixcclxuICBpc0RhdGUsXHJcbiAgaXNWYWxpZCxcclxuICBMb2NhbGUsXHJcbiAgcGFyc2UsXHJcbiAgcGFyc2VJU08sXHJcbn0gZnJvbSBcImRhdGUtZm5zXCI7XHJcblxyXG5jb25zdCBXRUVLX1NUQVJUU19PTjogbnVtYmVyID0gMDtcclxuXHJcbmV4cG9ydCBjb25zdCBEQVRFX0ZPUk1BVF9BREFQVEVSOiBNYXREYXRlRm9ybWF0cyA9IHtcclxuICBwYXJzZToge1xyXG4gICAgZGF0ZUlucHV0OiBcImRkL01NL3l5eXlcIlxyXG4gIH0sXHJcbiAgZGlzcGxheToge1xyXG4gICAgZGF0ZUlucHV0OiBcImRkL01NL3l5eXlcIixcclxuICAgIG1vbnRoWWVhckxhYmVsOiBcIkxMTEwgeVwiLFxyXG4gICAgZGF0ZUExMXlMYWJlbDogXCJkZC9NTS95eXl5XCIsXHJcbiAgICBtb250aFllYXJBMTF5TGFiZWw6IFwiTU1NTSB5XCJcclxuICB9XHJcbn07XHJcblxyXG5cclxuLyoqIENyZWF0ZXMgYW4gYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdmFsdWVzLiAqL1xyXG5mdW5jdGlvbiByYW5nZTxUPihsZW5ndGg6IG51bWJlciwgdmFsdWVGdW5jdGlvbjogKGluZGV4OiBudW1iZXIpID0+IFQpOiBUW10ge1xyXG4gIGNvbnN0IHZhbHVlc0FycmF5ID0gQXJyYXkobGVuZ3RoKTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICB2YWx1ZXNBcnJheVtpXSA9IHZhbHVlRnVuY3Rpb24oaSk7XHJcbiAgfVxyXG4gIHJldHVybiB2YWx1ZXNBcnJheTtcclxufVxyXG5cclxuLy8gZGF0ZS1mbnMgZG9lc24ndCBoYXZlIGEgd2F5IHRvIHJlYWQvcHJpbnQgbW9udGggbmFtZXMgb3IgZGF5cyBvZiB0aGUgd2VlayBkaXJlY3RseSxcclxuLy8gc28gd2UgZ2V0IHRoZW0gYnkgZm9ybWF0dGluZyBhIGRhdGUgd2l0aCBhIGZvcm1hdCB0aGF0IHByb2R1Y2VzIHRoZSBkZXNpcmVkIG1vbnRoL2RheS5cclxuY29uc3QgTU9OVEhfRk9STUFUUyA9IHtcclxuICBsb25nOiBcIkxMTExcIixcclxuICBzaG9ydDogXCJMTExcIixcclxuICBuYXJyb3c6IFwiTExMTExcIixcclxufTtcclxuXHJcbmNvbnN0IERBWV9PRl9XRUVLX0ZPUk1BVFMgPSB7XHJcbiAgbG9uZzogXCJFRUVFXCIsXHJcbiAgc2hvcnQ6IFwiRUVFXCIsXHJcbiAgbmFycm93OiBcIkVFRUVFXCIsXHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBJU1NEYXRlQWRhcHRlciBleHRlbmRzIERhdGVBZGFwdGVyPERhdGUsIExvY2FsZT4ge1xyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RBVEVfTE9DQUxFKSBtYXREYXRlTG9jYWxlOiB7fSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuc2V0TG9jYWxlKG1hdERhdGVMb2NhbGUgYXMgTG9jYWxlKTtcclxuICB9XHJcblxyXG4gIGdldFllYXIoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZ2V0WWVhcihkYXRlKTtcclxuICB9XHJcblxyXG4gIGdldE1vbnRoKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGdldE1vbnRoKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZShkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBnZXREYXRlKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGdldERheShkYXRlKTtcclxuICB9XHJcblxyXG4gIGdldE1vbnRoTmFtZXMoc3R5bGU6IFwibG9uZ1wiIHwgXCJzaG9ydFwiIHwgXCJuYXJyb3dcIik6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IHBhdHRlcm4gPSBNT05USF9GT1JNQVRTW3N0eWxlXTtcclxuICAgIHJldHVybiByYW5nZSgxMiwgaSA9PiB0aGlzLmZvcm1hdChuZXcgRGF0ZSgyMDE3LCBpLCAxKSwgcGF0dGVybikpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZU5hbWVzKCk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGR0ZiA9XHJcbiAgICAgIHR5cGVvZiBJbnRsICE9PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgPyBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZS5jb2RlLCB7XHJcbiAgICAgICAgICBkYXk6IFwibnVtZXJpY1wiLFxyXG4gICAgICAgICAgdGltZVpvbmU6IFwidXRjXCIsXHJcbiAgICAgICAgfSlcclxuICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgcmV0dXJuIHJhbmdlKDMxLCBpID0+IHtcclxuICAgICAgaWYgKGR0Zikge1xyXG4gICAgICAgIC8vIGRhdGUtZm5zIGRvZXNuJ3QgYXBwZWFyIHRvIHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LlxyXG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBgSW50bGAgb24gc3VwcG9ydGVkIGJyb3dzZXJzLlxyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoMjAxNywgMCwgaSArIDEpO1xyXG4gICAgICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XHJcbiAgICAgICAgcmV0dXJuIGR0Zi5mb3JtYXQoZGF0ZSkucmVwbGFjZSgvW1xcdTIwMGVcXHUyMDBmXS9nLCBcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGkgKyBcIlwiO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXREYXlPZldlZWtOYW1lcyhzdHlsZTogXCJsb25nXCIgfCBcInNob3J0XCIgfCBcIm5hcnJvd1wiKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgcGF0dGVybiA9IERBWV9PRl9XRUVLX0ZPUk1BVFNbc3R5bGVdO1xyXG4gICAgcmV0dXJuIHJhbmdlKDcsIGkgPT4gdGhpcy5mb3JtYXQobmV3IERhdGUoMjAxNywgMCwgaSArIDEpLCBwYXR0ZXJuKSk7XHJcbiAgfVxyXG5cclxuICBnZXRZZWFyTmFtZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1hdChkYXRlLCBcInlcIik7XHJcbiAgfVxyXG5cclxuICBnZXRGaXJzdERheU9mV2VlaygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIFdFRUtfU1RBUlRTX09OO1xyXG4gIH1cclxuXHJcbiAgZ2V0TnVtRGF5c0luTW9udGgoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZ2V0RGF5c0luTW9udGgoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBjbG9uZShkYXRlOiBEYXRlKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlRGF0ZSh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRhdGU6IG51bWJlcik6IERhdGUge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUoKTtcclxuICAgIHJlc3VsdC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF0ZSk7XHJcbiAgICByZXN1bHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHRvZGF5KCk6IERhdGUge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwYXJzZSh2YWx1ZTogYW55LCBwYXJzZUZvcm1hdDogc3RyaW5nIHwgc3RyaW5nW10pOiBEYXRlIHwgbnVsbCB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaXNvODYwMURhdGUgPSBwYXJzZUlTTyh2YWx1ZSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKGlzbzg2MDFEYXRlKSkge1xyXG4gICAgICAgIHJldHVybiBpc284NjAxRGF0ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZm9ybWF0cyA9IEFycmF5LmlzQXJyYXkocGFyc2VGb3JtYXQpID8gcGFyc2VGb3JtYXQgOiBbcGFyc2VGb3JtYXRdO1xyXG5cclxuICAgICAgaWYgKCFwYXJzZUZvcm1hdC5sZW5ndGgpIHtcclxuICAgICAgICB0aHJvdyBFcnJvcihcIkZvcm1hdHMgYXJyYXkgbXVzdCBub3QgYmUgZW1wdHkuXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRGb3JtYXQgb2YgZm9ybWF0cykge1xyXG4gICAgICAgIGNvbnN0IGZyb21Gb3JtYXQgPSBwYXJzZSh2YWx1ZSwgY3VycmVudEZvcm1hdCwgbmV3IERhdGUoKSwge2xvY2FsZTogdGhpcy5sb2NhbGV9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZChmcm9tRm9ybWF0KSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZyb21Gb3JtYXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkKCk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2xvbmUodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0KGRhdGU6IERhdGUsIGRpc3BsYXlGb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuaXNWYWxpZChkYXRlKSkge1xyXG4gICAgICB0aHJvdyBFcnJvcihcIkRhdGVGbnNBZGFwdGVyOiBDYW5ub3QgZm9ybWF0IGludmFsaWQgZGF0ZS5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcm1hdChkYXRlLCBkaXNwbGF5Rm9ybWF0LCB7bG9jYWxlOiB0aGlzLmxvY2FsZX0pO1xyXG4gIH1cclxuXHJcbiAgYWRkQ2FsZW5kYXJZZWFycyhkYXRlOiBEYXRlLCB5ZWFyczogbnVtYmVyKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gYWRkWWVhcnMoZGF0ZSwgeWVhcnMpO1xyXG4gIH1cclxuXHJcbiAgYWRkQ2FsZW5kYXJNb250aHMoZGF0ZTogRGF0ZSwgbW9udGhzOiBudW1iZXIpOiBEYXRlIHtcclxuICAgIHJldHVybiBhZGRNb250aHMoZGF0ZSwgbW9udGhzKTtcclxuICB9XHJcblxyXG4gIGFkZENhbGVuZGFyRGF5cyhkYXRlOiBEYXRlLCBkYXlzOiBudW1iZXIpOiBEYXRlIHtcclxuICAgIHJldHVybiBhZGREYXlzKGRhdGUsIGRheXMpO1xyXG4gIH1cclxuXHJcbiAgdG9Jc284NjAxKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGZvcm1hdElTTyhkYXRlLCB7cmVwcmVzZW50YXRpb246IFwiZGF0ZVwifSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB2YWx1ZSBpZiBnaXZlbiBhIHZhbGlkIERhdGUgb3IgbnVsbC4gRGVzZXJpYWxpemVzIHZhbGlkIElTTyA4NjAxIHN0cmluZ3NcclxuICAgKiAoaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMzMzkudHh0KSBpbnRvIHZhbGlkIERhdGVzIGFuZCBlbXB0eSBzdHJpbmcgaW50byBudWxsLiBSZXR1cm5zIGFuXHJcbiAgICogaW52YWxpZCBkYXRlIGZvciBhbGwgb3RoZXIgdmFsdWVzLlxyXG4gICAqL1xyXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHZhbHVlOiBhbnkpOiBEYXRlIHwgbnVsbCB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBkYXRlID0gcGFyc2VJU08odmFsdWUpO1xyXG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKGRhdGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdXBlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBpc0RhdGVJbnN0YW5jZShvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzRGF0ZShvYmopO1xyXG4gIH1cclxuXHJcbiAgaXNWYWxpZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gaXNWYWxpZChkYXRlKTtcclxuICB9XHJcblxyXG4gIGludmFsaWQoKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,55 @@
1
+ import { Component, inject, input } from "@angular/core";
2
+ import { BaseCtrl } from "../base-ctrl";
3
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR, ReactiveFormsModule } from "@angular/forms";
4
+ import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from "@angular/material/core";
5
+ import { MatFormFieldModule } from "@angular/material/form-field";
6
+ import { MatDatepickerModule } from "@angular/material/datepicker";
7
+ import { MatInputModule } from "@angular/material/input";
8
+ import { MatIconModule } from "@angular/material/icon";
9
+ import { DATE_FORMAT_ADAPTER, ISSDateAdapter } from "./date-adapter";
10
+ import { DatePipe } from "@angular/common";
11
+ import { enGB } from "date-fns/locale";
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/material/form-field";
14
+ import * as i2 from "@angular/material/input";
15
+ import * as i3 from "@angular/material/datepicker";
16
+ import * as i4 from "@angular/forms";
17
+ export class DatePickerComponent extends BaseCtrl {
18
+ constructor() {
19
+ super(...arguments);
20
+ this.disabledDays = input([]);
21
+ this.minDate = input(null);
22
+ this.maxDate = input(null);
23
+ this.#datePipe = inject(DatePipe);
24
+ this.calendarDaysFilter = (d) => {
25
+ const day = (d || new Date()).getDay();
26
+ return !(this.disabledDays().includes(day));
27
+ };
28
+ }
29
+ #datePipe;
30
+ emit($event) {
31
+ const selectedDateString = this.#datePipe.transform($event.value, "yyyy-MM-ddTHH:mm:ss") + "Z";
32
+ this.emitValue(selectedDateString);
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DatePickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
35
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.0", type: DatePickerComponent, isStandalone: true, selector: "iss-ctrl-date-picker", inputs: { disabledDays: { classPropertyName: "disabledDays", publicName: "disabledDays", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
36
+ DatePipe,
37
+ { provide: DateAdapter, useClass: ISSDateAdapter },
38
+ { provide: MAT_DATE_FORMATS, useValue: DATE_FORMAT_ADAPTER },
39
+ { provide: MAT_DATE_LOCALE, useValue: enGB },
40
+ { provide: NG_VALUE_ACCESSOR, useExisting: DatePickerComponent, multi: true },
41
+ { provide: NG_VALIDATORS, useExisting: DatePickerComponent, multi: true },
42
+ ], usesInheritance: true, ngImport: i0, template: "<mat-form-field>\r\n <input\r\n class=\"cursor-pointer\"\r\n matInput\r\n readonly\r\n [matDatepicker]=\"picker\"\r\n (click)=\"picker.open(); markAsTouched()\"\r\n [formControl]=\"ctrl\"\r\n [min]=\"minDate()\"\r\n [max]=\"maxDate()\"\r\n [placeholder]=\"'dd/mm/yyyy'\"\r\n [matDatepickerFilter]=\"calendarDaysFilter\"\r\n (dateChange)=\"emit($event)\"\r\n />\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n</mat-form-field>\r\n", styles: ["::ng-deep tr:has(>.mat-calendar-body-label[colspan=\"7\"]){opacity:0!important;display:none}::ng-deep .mat-datepicker-content .mat-calendar{height:unset!important}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DatePickerComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ selector: "iss-ctrl-date-picker", standalone: true, imports: [MatFormFieldModule, MatInputModule, MatDatepickerModule, MatIconModule, ReactiveFormsModule], providers: [
47
+ DatePipe,
48
+ { provide: DateAdapter, useClass: ISSDateAdapter },
49
+ { provide: MAT_DATE_FORMATS, useValue: DATE_FORMAT_ADAPTER },
50
+ { provide: MAT_DATE_LOCALE, useValue: enGB },
51
+ { provide: NG_VALUE_ACCESSOR, useExisting: DatePickerComponent, multi: true },
52
+ { provide: NG_VALIDATORS, useExisting: DatePickerComponent, multi: true },
53
+ ], template: "<mat-form-field>\r\n <input\r\n class=\"cursor-pointer\"\r\n matInput\r\n readonly\r\n [matDatepicker]=\"picker\"\r\n (click)=\"picker.open(); markAsTouched()\"\r\n [formControl]=\"ctrl\"\r\n [min]=\"minDate()\"\r\n [max]=\"maxDate()\"\r\n [placeholder]=\"'dd/mm/yyyy'\"\r\n [matDatepickerFilter]=\"calendarDaysFilter\"\r\n (dateChange)=\"emit($event)\"\r\n />\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n</mat-form-field>\r\n", styles: ["::ng-deep tr:has(>.mat-calendar-body-label[colspan=\"7\"]){opacity:0!important;display:none}::ng-deep .mat-datepicker-content .mat-calendar{height:unset!important}\n"] }]
54
+ }] });
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hHLE9BQU8sRUFBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdEYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUEwQixtQkFBbUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzFGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7Ozs7OztBQWlCckMsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFFBQVE7SUFmakQ7O1FBZ0JFLGlCQUFZLEdBQTBCLEtBQUssQ0FBVyxFQUFFLENBQUMsQ0FBQztRQUMxRCxZQUFPLEdBQTZCLEtBQUssQ0FBYyxJQUFJLENBQUMsQ0FBQztRQUM3RCxZQUFPLEdBQTZCLEtBQUssQ0FBYyxJQUFJLENBQUMsQ0FBQztRQUM3RCxjQUFTLEdBQWEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdCLHVCQUFrQixHQUFHLENBQUMsQ0FBYyxFQUFXLEVBQUU7WUFDekQsTUFBTSxHQUFHLEdBQVcsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUM7S0FNSDtJQVhDLFNBQVMsQ0FBOEI7SUFPN0IsSUFBSSxDQUFDLE1BQW9DO1FBQ2pELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMvRixJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQzs4R0FkVSxtQkFBbUI7a0dBQW5CLG1CQUFtQix3ZEFUbkI7WUFDVCxRQUFRO1lBQ1IsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUM7WUFDaEQsRUFBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFDO1lBQzFELEVBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDO1lBQzFDLEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO1lBQzNFLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztTQUN4RSxpREN6QkgseWlCQWlCQSw4TkRBWSxrQkFBa0IsMFdBQUUsY0FBYywwV0FBRSxtQkFBbUIsaWdCQUFFLGFBQWEsOEJBQUUsbUJBQW1COzsyRkFVMUYsbUJBQW1CO2tCQWYvQixTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBR1AsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixDQUFDLGFBQzNGO3dCQUNULFFBQVE7d0JBQ1IsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUM7d0JBQ2hELEVBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBQzt3QkFDMUQsRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUM7d0JBQzFDLEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcscUJBQXFCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQzt3QkFDM0UsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcscUJBQXFCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztxQkFDeEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgaW5qZWN0LCBpbnB1dCwgSW5wdXRTaWduYWx9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QmFzZUN0cmx9IGZyb20gXCIuLi9iYXNlLWN0cmxcIjtcclxuaW1wb3J0IHtOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9yfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtEYXRlQWRhcHRlciwgTUFUX0RBVEVfRk9STUFUUywgTUFUX0RBVEVfTE9DQUxFfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZVwiO1xyXG5pbXBvcnQge01hdEZvcm1GaWVsZE1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHtNYXREYXRlcGlja2VySW5wdXRFdmVudCwgTWF0RGF0ZXBpY2tlck1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXJcIjtcclxuaW1wb3J0IHtNYXRJbnB1dE1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2lucHV0XCI7XHJcbmltcG9ydCB7TWF0SWNvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtEQVRFX0ZPUk1BVF9BREFQVEVSLCBJU1NEYXRlQWRhcHRlcn0gZnJvbSBcIi4vZGF0ZS1hZGFwdGVyXCI7XHJcbmltcG9ydCB7RGF0ZVBpcGV9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtlbkdCfSBmcm9tIFwiZGF0ZS1mbnMvbG9jYWxlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJpc3MtY3RybC1kYXRlLXBpY2tlclwiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vZGF0ZS1waWNrZXIuY29tcG9uZW50LnNjc3NcIixcclxuICBpbXBvcnRzOiBbTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0RGF0ZXBpY2tlck1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICBEYXRlUGlwZSxcclxuICAgIHtwcm92aWRlOiBEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IElTU0RhdGVBZGFwdGVyfSxcclxuICAgIHtwcm92aWRlOiBNQVRfREFURV9GT1JNQVRTLCB1c2VWYWx1ZTogREFURV9GT1JNQVRfQURBUFRFUn0sXHJcbiAgICB7cHJvdmlkZTogTUFUX0RBVEVfTE9DQUxFLCB1c2VWYWx1ZTogZW5HQn0sXHJcbiAgICB7cHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBEYXRlUGlja2VyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZX0sXHJcbiAgICB7cHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IERhdGVQaWNrZXJDb21wb25lbnQsIG11bHRpOiB0cnVlfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlckNvbXBvbmVudCBleHRlbmRzIEJhc2VDdHJsIGltcGxlbWVudHMgVmFsaWRhdG9yIHtcclxuICBkaXNhYmxlZERheXM6IElucHV0U2lnbmFsPG51bWJlcltdPiA9IGlucHV0PG51bWJlcltdPihbXSk7XHJcbiAgbWluRGF0ZTogSW5wdXRTaWduYWw8RGF0ZSB8IG51bGw+ID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xyXG4gIG1heERhdGU6IElucHV0U2lnbmFsPERhdGUgfCBudWxsPiA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcclxuICAjZGF0ZVBpcGU6IERhdGVQaXBlID0gaW5qZWN0KERhdGVQaXBlKTtcclxuXHJcbiAgcHJvdGVjdGVkIGNhbGVuZGFyRGF5c0ZpbHRlciA9IChkOiBEYXRlIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xyXG4gICAgY29uc3QgZGF5OiBudW1iZXIgPSAoZCB8fCBuZXcgRGF0ZSgpKS5nZXREYXkoKTtcclxuICAgIHJldHVybiAhKHRoaXMuZGlzYWJsZWREYXlzKCkuaW5jbHVkZXMoZGF5KSk7XHJcbiAgfTtcclxuXHJcbiAgcHJvdGVjdGVkIGVtaXQoJGV2ZW50OiBNYXREYXRlcGlja2VySW5wdXRFdmVudDxhbnk+KSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZERhdGVTdHJpbmcgPSB0aGlzLiNkYXRlUGlwZS50cmFuc2Zvcm0oJGV2ZW50LnZhbHVlLCBcInl5eXktTU0tZGRUSEg6bW06c3NcIikgKyBcIlpcIjtcclxuICAgIHRoaXMuZW1pdFZhbHVlKHNlbGVjdGVkRGF0ZVN0cmluZyk7XHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtZm9ybS1maWVsZD5cclxuICA8aW5wdXRcclxuICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgbWF0SW5wdXRcclxuICAgIHJlYWRvbmx5XHJcbiAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxyXG4gICAgKGNsaWNrKT1cInBpY2tlci5vcGVuKCk7IG1hcmtBc1RvdWNoZWQoKVwiXHJcbiAgICBbZm9ybUNvbnRyb2xdPVwiY3RybFwiXHJcbiAgICBbbWluXT1cIm1pbkRhdGUoKVwiXHJcbiAgICBbbWF4XT1cIm1heERhdGUoKVwiXHJcbiAgICBbcGxhY2Vob2xkZXJdPVwiJ2RkL21tL3l5eXknXCJcclxuICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cImNhbGVuZGFyRGF5c0ZpbHRlclwiXHJcbiAgICAoZGF0ZUNoYW5nZSk9XCJlbWl0KCRldmVudClcIlxyXG4gIC8+XHJcbiAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRJY29uU3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuPC9tYXQtZm9ybS1maWVsZD5cclxuIl19
@@ -0,0 +1,101 @@
1
+ import { Component, inject, input, output } from "@angular/core";
2
+ import { FormControl, FormGroup, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from "@angular/forms";
3
+ import { BaseCtrl } from "../base-ctrl";
4
+ import { DatePipe } from "@angular/common";
5
+ import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from "@angular/material/core";
6
+ import { MatDatepickerModule } from "@angular/material/datepicker";
7
+ import { MatFormFieldModule } from "@angular/material/form-field";
8
+ import { DATE_FORMAT_ADAPTER, ISSDateAdapter } from "../date-picker/date-adapter";
9
+ import { enGB } from "date-fns/locale";
10
+ import { Subscription } from "rxjs";
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/material/form-field";
13
+ import * as i2 from "@angular/material/datepicker";
14
+ import * as i3 from "@angular/forms";
15
+ export class DateRangePickerComponent extends BaseCtrl {
16
+ constructor() {
17
+ super(...arguments);
18
+ this.disabledDays = input([]);
19
+ this.minDate = input(null);
20
+ this.maxDate = input(null);
21
+ this.onDateRangeObjectChange = output();
22
+ this.range = new FormGroup({
23
+ start: new FormControl(null),
24
+ end: new FormControl(null),
25
+ });
26
+ this.#datePipe = inject(DatePipe);
27
+ this.#sub = new Subscription();
28
+ this.calendarDaysFilter = (d) => {
29
+ const day = (d || new Date()).getDay();
30
+ return !(this.disabledDays().includes(day));
31
+ };
32
+ }
33
+ #datePipe;
34
+ #sub;
35
+ ngOnInit() {
36
+ this.#sub.add(this.range.valueChanges.subscribe((values) => {
37
+ if (values.start && values.end) {
38
+ this.emitValue(this.#getEmissionValue(values.start, values.end));
39
+ this.onDateRangeObjectChange.emit(this.#getEmissionObject(values.start, values.end));
40
+ }
41
+ }));
42
+ }
43
+ writeValue(value) {
44
+ if (typeof value === "string") {
45
+ const valArr = value?.split(",");
46
+ const valObj = {
47
+ start: valArr[0],
48
+ end: valArr[1],
49
+ };
50
+ this.range.patchValue(valObj, { emitEvent: false });
51
+ }
52
+ }
53
+ ngOnDestroy() {
54
+ this.#sub.unsubscribe();
55
+ }
56
+ #getDuration(startDate, endDate) {
57
+ let start = new Date(startDate).getTime();
58
+ let end = new Date(endDate).getTime();
59
+ return Math.ceil((end - start) / (1000 * 60 * 60 * 24) + 1);
60
+ }
61
+ #getFormatedDate(date) {
62
+ return this.#datePipe.transform(date, "yyyy-MM-ddTHH:mm:ss") + "Z";
63
+ }
64
+ #getFormatedEndDate(endDate) {
65
+ let inputDate = new Date(new Date(endDate).setHours(23, 59, 59));
66
+ return this.#getFormatedDate(inputDate);
67
+ }
68
+ #getEmissionValue(start, end) {
69
+ let formatedStart = this.#getFormatedDate(start);
70
+ let formatedEnd = this.#getFormatedEndDate(end);
71
+ return `${formatedStart},${formatedEnd}`;
72
+ }
73
+ #getEmissionObject(start, end) {
74
+ return {
75
+ duration: this.#getDuration(start, end),
76
+ start: this.#getFormatedDate(start),
77
+ end: this.#getFormatedEndDate(end)
78
+ };
79
+ }
80
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DateRangePickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
81
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.0", type: DateRangePickerComponent, isStandalone: true, selector: "iss-ctrl-date-range-picker", inputs: { disabledDays: { classPropertyName: "disabledDays", publicName: "disabledDays", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onDateRangeObjectChange: "onDateRangeObjectChange" }, providers: [
82
+ DatePipe,
83
+ { provide: DateAdapter, useClass: ISSDateAdapter },
84
+ { provide: MAT_DATE_FORMATS, useValue: DATE_FORMAT_ADAPTER },
85
+ { provide: MAT_DATE_LOCALE, useValue: enGB },
86
+ { provide: NG_VALUE_ACCESSOR, useExisting: DateRangePickerComponent, multi: true },
87
+ ], usesInheritance: true, ngImport: i0, template: "<mat-form-field>\r\n <mat-date-range-input\r\n [formGroup]=\"range\"\r\n [rangePicker]=\"picker\"\r\n [min]=\"minDate()\"\r\n [max]=\"maxDate()\"\r\n [dateFilter]=\"calendarDaysFilter\"\r\n >\r\n <input\r\n matStartDate\r\n formControlName=\"start\"\r\n placeholder=\"dd/mm/yyyy\"\r\n (click)=\"picker.open(); markAsTouched()\"\r\n />\r\n <input\r\n matEndDate\r\n formControlName=\"end\"\r\n placeholder=\"dd/mm/yyyy\"\r\n (click)=\"picker.open(); markAsTouched()\"\r\n />\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n</mat-form-field>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i2.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i2.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i2.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: DateRangePickerComponent, decorators: [{
90
+ type: Component,
91
+ args: [{ selector: "iss-ctrl-date-range-picker", standalone: true, imports: [
92
+ MatFormFieldModule, MatDatepickerModule, FormsModule, ReactiveFormsModule,
93
+ ], providers: [
94
+ DatePipe,
95
+ { provide: DateAdapter, useClass: ISSDateAdapter },
96
+ { provide: MAT_DATE_FORMATS, useValue: DATE_FORMAT_ADAPTER },
97
+ { provide: MAT_DATE_LOCALE, useValue: enGB },
98
+ { provide: NG_VALUE_ACCESSOR, useExisting: DateRangePickerComponent, multi: true },
99
+ ], template: "<mat-form-field>\r\n <mat-date-range-input\r\n [formGroup]=\"range\"\r\n [rangePicker]=\"picker\"\r\n [min]=\"minDate()\"\r\n [max]=\"maxDate()\"\r\n [dateFilter]=\"calendarDaysFilter\"\r\n >\r\n <input\r\n matStartDate\r\n formControlName=\"start\"\r\n placeholder=\"dd/mm/yyyy\"\r\n (click)=\"picker.open(); markAsTouched()\"\r\n />\r\n <input\r\n matEndDate\r\n formControlName=\"end\"\r\n placeholder=\"dd/mm/yyyy\"\r\n (click)=\"picker.open(); markAsTouched()\"\r\n />\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n</mat-form-field>\r\n" }]
100
+ }] });
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvZGF0ZS1yYW5nZS1waWNrZXIvZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXNzLWN0cmwvc3JjL2NvbXBvbmVudHMvZGF0ZS1yYW5nZS1waWNrZXIvZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFrQyxNQUFNLEVBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNHLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ2hGLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNyQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7OztBQW1CbEMsTUFBTSxPQUFPLHdCQUF5QixTQUFRLFFBQVE7SUFoQnREOztRQWlCRSxpQkFBWSxH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QztTQUNqRixpREMxQkgsbXVCQXdCQSx5RERSSSxrQkFBa0IsMFdBQUUsbUJBQW1CLG96QkFBRSxXQUFXLGtqQkFBRSxtQkFBbUI7OzJGQVloRSx3QkFBd0I7a0JBaEJwQyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1A7d0JBQ1Asa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLG1CQUFtQjtxQkFDMUUsYUFHVTt3QkFDVCxRQUFRO3dCQUNSLEVBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFDO3dCQUNoRCxFQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUM7d0JBQzFELEVBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDO3dCQUMxQyxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLDBCQUEwQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7cUJBQ2pGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIGluamVjdCwgaW5wdXQsIElucHV0U2lnbmFsLCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBPdXRwdXRFbWl0dGVyUmVmfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7QmFzZUN0cmx9IGZyb20gXCIuLi9iYXNlLWN0cmxcIjtcclxuaW1wb3J0IHtEYXRlUGlwZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge0RhdGVBZGFwdGVyLCBNQVRfREFURV9GT1JNQVRTLCBNQVRfREFURV9MT0NBTEV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XHJcbmltcG9ydCB7TWF0RGF0ZXBpY2tlck1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXJcIjtcclxuaW1wb3J0IHtNYXRGb3JtRmllbGRNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XHJcbmltcG9ydCB7REFURV9GT1JNQVRfQURBUFRFUiwgSVNTRGF0ZUFkYXB0ZXJ9IGZyb20gXCIuLi9kYXRlLXBpY2tlci9kYXRlLWFkYXB0ZXJcIjtcclxuaW1wb3J0IHtlbkdCfSBmcm9tIFwiZGF0ZS1mbnMvbG9jYWxlXCI7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0RhdGVSYW5nZUVtaXNzaW9uT2JqZWN0fSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9kYXRlLXJhbmdlLWVtaXNzaW9uLW9iamVjdFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiaXNzLWN0cmwtZGF0ZS1yYW5nZS1waWNrZXJcIixcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0RGF0ZXBpY2tlck1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogXCIuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgRGF0ZVBpcGUsXHJcbiAgICB7cHJvdmlkZTogRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBJU1NEYXRlQWRhcHRlcn0sXHJcbiAgICB7cHJvdmlkZTogTUFUX0RBVEVfRk9STUFUUywgdXNlVmFsdWU6IERBVEVfRk9STUFUX0FEQVBURVJ9LFxyXG4gICAge3Byb3ZpZGU6IE1BVF9EQVRFX0xPQ0FMRSwgdXNlVmFsdWU6IGVuR0J9LFxyXG4gICAge3Byb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZX0sXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50IGV4dGVuZHMgQmFzZUN0cmwgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgZGlzYWJsZWREYXlzOiBJbnB1dFNpZ25hbDxudW1iZXJbXT4gPSBpbnB1dDxudW1iZXJbXT4oW10pO1xyXG4gIG1pbkRhdGU6IElucHV0U2lnbmFsPERhdGUgfCBudWxsPiA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcclxuICBtYXhEYXRlOiBJbnB1dFNpZ25hbDxEYXRlIHwgbnVsbD4gPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XHJcbiAgb25EYXRlUmFuZ2VPYmplY3RDaGFuZ2U6IE91dHB1dEVtaXR0ZXJSZWY8RGF0ZVJhbmdlRW1pc3Npb25PYmplY3Q+ID0gb3V0cHV0KCk7XHJcbiAgcmVhZG9ubHkgcmFuZ2U6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgc3RhcnQ6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgIGVuZDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gIH0pO1xyXG4gICNkYXRlUGlwZTogRGF0ZVBpcGUgPSBpbmplY3QoRGF0ZVBpcGUpO1xyXG4gICNzdWI6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLiNzdWIuYWRkKFxyXG4gICAgICB0aGlzLnJhbmdlLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlcykgPT4ge1xyXG4gICAgICAgIGlmICh2YWx1ZXMuc3RhcnQgJiYgdmFsdWVzLmVuZCkge1xyXG4gICAgICAgICAgdGhpcy5lbWl0VmFsdWUodGhpcy4jZ2V0RW1pc3Npb25WYWx1ZSh2YWx1ZXMuc3RhcnQsIHZhbHVlcy5lbmQpKTtcclxuICAgICAgICAgIHRoaXMub25EYXRlUmFuZ2VPYmplY3RDaGFuZ2UuZW1pdCh0aGlzLiNnZXRFbWlzc2lvbk9iamVjdCh2YWx1ZXMuc3RhcnQsIHZhbHVlcy5lbmQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRm9ybURhdGEgfCBudWxsKSB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGNvbnN0IHZhbEFycjogc3RyaW5nW10gPSB2YWx1ZT8uc3BsaXQoXCIsXCIpO1xyXG4gICAgICBjb25zdCB2YWxPYmogPSB7XHJcbiAgICAgICAgc3RhcnQ6IHZhbEFyclswXSxcclxuICAgICAgICBlbmQ6IHZhbEFyclsxXSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5yYW5nZS5wYXRjaFZhbHVlKHZhbE9iaiwge2VtaXRFdmVudDogZmFsc2V9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy4jc3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2FsZW5kYXJEYXlzRmlsdGVyID0gKGQ6IERhdGUgfCBudWxsKTogYm9vbGVhbiA9PiB7XHJcbiAgICBjb25zdCBkYXk6IG51bWJlciA9IChkIHx8IG5ldyBEYXRlKCkpLmdldERheSgpO1xyXG4gICAgcmV0dXJuICEodGhpcy5kaXNhYmxlZERheXMoKS5pbmNsdWRlcyhkYXkpKTtcclxuICB9O1xyXG5cclxuICAjZ2V0RHVyYXRpb24oc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlKSB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSkuZ2V0VGltZSgpO1xyXG4gICAgbGV0IGVuZDogbnVtYmVyID0gbmV3IERhdGUoZW5kRGF0ZSkuZ2V0VGltZSgpO1xyXG4gICAgcmV0dXJuIE1hdGguY2VpbCgoZW5kIC0gc3RhcnQpIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpICsgMSk7XHJcbiAgfVxyXG5cclxuICAjZ2V0Rm9ybWF0ZWREYXRlKGRhdGU6IERhdGUpIHtcclxuICAgIHJldHVybiB0aGlzLiNkYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSwgXCJ5eXl5LU1NLWRkVEhIOm1tOnNzXCIpICsgXCJaXCI7XHJcbiAgfVxyXG5cclxuICAjZ2V0Rm9ybWF0ZWRFbmREYXRlKGVuZERhdGU6IERhdGUpIHtcclxuICAgIGxldCBpbnB1dERhdGU6IERhdGUgPSBuZXcgRGF0ZShuZXcgRGF0ZShlbmREYXRlKS5zZXRIb3VycygyMywgNTksIDU5KSk7XHJcbiAgICByZXR1cm4gdGhpcy4jZ2V0Rm9ybWF0ZWREYXRlKGlucHV0RGF0ZSk7XHJcbiAgfVxyXG5cclxuICAjZ2V0RW1pc3Npb25WYWx1ZShzdGFydDogRGF0ZSwgZW5kOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBmb3JtYXRlZFN0YXJ0OiBzdHJpbmcgPSB0aGlzLiNnZXRGb3JtYXRlZERhdGUoc3RhcnQpO1xyXG4gICAgbGV0IGZvcm1hdGVkRW5kOiBzdHJpbmcgPSB0aGlzLiNnZXRGb3JtYXRlZEVuZERhdGUoZW5kKTtcclxuICAgIHJldHVybiBgJHtmb3JtYXRlZFN0YXJ0fSwke2Zvcm1hdGVkRW5kfWA7XHJcbiAgfVxyXG5cclxuICAjZ2V0RW1pc3Npb25PYmplY3Qoc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSk6IERhdGVSYW5nZUVtaXNzaW9uT2JqZWN0IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGR1cmF0aW9uOiB0aGlzLiNnZXREdXJhdGlvbihzdGFydCwgZW5kKSxcclxuICAgICAgc3RhcnQ6IHRoaXMuI2dldEZvcm1hdGVkRGF0ZShzdGFydCksXHJcbiAgICAgIGVuZDogdGhpcy4jZ2V0Rm9ybWF0ZWRFbmREYXRlKGVuZClcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtZm9ybS1maWVsZD5cclxuICA8bWF0LWRhdGUtcmFuZ2UtaW5wdXRcclxuICAgIFtmb3JtR3JvdXBdPVwicmFuZ2VcIlxyXG4gICAgW3JhbmdlUGlja2VyXT1cInBpY2tlclwiXHJcbiAgICBbbWluXT1cIm1pbkRhdGUoKVwiXHJcbiAgICBbbWF4XT1cIm1heERhdGUoKVwiXHJcbiAgICBbZGF0ZUZpbHRlcl09XCJjYWxlbmRhckRheXNGaWx0ZXJcIlxyXG4gID5cclxuICAgIDxpbnB1dFxyXG4gICAgICBtYXRTdGFydERhdGVcclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnRcIlxyXG4gICAgICBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIlxyXG4gICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKTsgbWFya0FzVG91Y2hlZCgpXCJcclxuICAgIC8+XHJcbiAgICA8aW5wdXRcclxuICAgICAgbWF0RW5kRGF0ZVxyXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJlbmRcIlxyXG4gICAgICBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIlxyXG4gICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKTsgbWFya0FzVG91Y2hlZCgpXCJcclxuICAgIC8+XHJcbiAgPC9tYXQtZGF0ZS1yYW5nZS1pbnB1dD5cclxuICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gIDxtYXQtZGF0ZS1yYW5nZS1waWNrZXIgI3BpY2tlcj48L21hdC1kYXRlLXJhbmdlLXBpY2tlcj5cclxuPC9tYXQtZm9ybS1maWVsZD5cclxuIl19