@ndwnu/design-system 3.0.1 → 5.0.0

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 (157) hide show
  1. package/assets/images/dashboard-card-icons/contact.png +0 -0
  2. package/assets/images/dashboard-card-icons/faq.png +0 -0
  3. package/assets/images/dashboard-card-icons/manual.png +0 -0
  4. package/components/alert/alert.component.d.ts +2 -5
  5. package/components/alert/alert.model.d.ts +0 -1
  6. package/components/banner/banner.component.d.ts +38 -0
  7. package/components/banner/banner.model.d.ts +4 -0
  8. package/components/banner/index.d.ts +2 -0
  9. package/components/breadcrumb-group/breadcrumb-group.component.d.ts +1 -1
  10. package/components/card/index.d.ts +2 -2
  11. package/components/collapsible/collapsible.component.d.ts +0 -1
  12. package/components/dashboard-card/dashboard-card.component.d.ts +22 -0
  13. package/components/dashboard-card/index.d.ts +1 -0
  14. package/components/dropdown/dropdown.component.d.ts +4 -4
  15. package/components/form-field/autosuggest/autosuggest-add-option/autosuggest-add-option.component.d.ts +8 -0
  16. package/components/form-field/autosuggest/autosuggest-add-option/index.d.ts +1 -0
  17. package/components/form-field/autosuggest/autosuggest-option/autosuggest-option.component.d.ts +19 -0
  18. package/components/form-field/autosuggest/autosuggest-option/autosuggest-option.model.d.ts +2 -0
  19. package/components/form-field/autosuggest/autosuggest-option/base-autosuggest-option.component.d.ts +27 -0
  20. package/components/form-field/autosuggest/autosuggest-option/index.d.ts +2 -0
  21. package/components/form-field/autosuggest/autosuggest-panel/autosuggest-panel.component.d.ts +39 -0
  22. package/components/form-field/autosuggest/autosuggest.directive.d.ts +72 -0
  23. package/components/form-field/autosuggest/index.d.ts +5 -0
  24. package/components/form-field/autosuggest/match-bold.pipe.d.ts +7 -0
  25. package/components/form-field/checkbox/checkbox.component.d.ts +0 -3
  26. package/components/form-field/clear-search-button/clear-search-button.component.d.ts +15 -0
  27. package/components/form-field/file-upload/file-upload.component.d.ts +4 -11
  28. package/components/form-field/form-field.component.d.ts +19 -23
  29. package/components/form-field/form-field.constant.d.ts +1 -0
  30. package/components/form-field/index.d.ts +3 -0
  31. package/components/form-field/input/input.directive.d.ts +0 -1
  32. package/components/form-field/input-button/index.d.ts +1 -0
  33. package/components/form-field/input-button/input-button.component.d.ts +12 -0
  34. package/components/form-field/input-icon/index.d.ts +1 -0
  35. package/components/form-field/input-icon/input-icon.component.d.ts +5 -0
  36. package/components/form-field/picker-button/picker-button.component.d.ts +14 -0
  37. package/components/form-field/radio-button/radio-button.component.d.ts +0 -2
  38. package/components/form-field/radio-group/radio-group.component.d.ts +0 -1
  39. package/components/icon/icon.component.d.ts +1 -0
  40. package/components/index.d.ts +7 -2
  41. package/components/layout/index.d.ts +1 -0
  42. package/components/layout/layout.component.d.ts +11 -0
  43. package/components/layout-banners/index.d.ts +1 -0
  44. package/components/layout-banners/layout-banners.component.d.ts +5 -0
  45. package/components/loader/index.d.ts +1 -0
  46. package/components/loader/loader.component.d.ts +5 -0
  47. package/components/main-navigation/main-navigation.component.d.ts +8 -6
  48. package/components/main-navigation/main-navigation.imports.d.ts +1 -1
  49. package/components/main-navigation/main-navigation.model.d.ts +1 -0
  50. package/components/main-navigation-menu/main-navigation-menu.component.d.ts +2 -2
  51. package/components/modal/index.d.ts +0 -1
  52. package/components/modal/modal-header/modal-header.component.d.ts +1 -1
  53. package/components/modal/modal-ref.d.ts +3 -0
  54. package/components/modal/modal.component.d.ts +0 -3
  55. package/components/modal/modal.service.d.ts +13 -11
  56. package/components/pill/pill.component.d.ts +1 -3
  57. package/components/tab/tab.component.d.ts +0 -3
  58. package/components/tab-group/tab-group.component.d.ts +1 -2
  59. package/components/tag/index.d.ts +1 -0
  60. package/components/tag/tag.component.d.ts +18 -0
  61. package/core/{styles/ndw-styles.scss → style/styles.css} +495 -219
  62. package/core/{styles/nwb-styles.scss → style/styles.scss} +526 -218
  63. package/esm2022/components/accordion/accordion.component.mjs +8 -8
  64. package/esm2022/components/accordion/accordion.service.mjs +3 -3
  65. package/esm2022/components/alert/alert.component.mjs +12 -29
  66. package/esm2022/components/alert/alert.model.mjs +1 -1
  67. package/esm2022/components/badge/badge.component.mjs +6 -6
  68. package/esm2022/components/banner/banner.component.mjs +61 -0
  69. package/esm2022/components/banner/banner.model.mjs +6 -0
  70. package/esm2022/components/banner/index.mjs +3 -0
  71. package/esm2022/components/breadcrumb/breadcrumb.component.mjs +6 -6
  72. package/esm2022/components/breadcrumb-group/breadcrumb-group.component.mjs +10 -10
  73. package/esm2022/components/button/button.directive.mjs +3 -3
  74. package/esm2022/components/card/card-content/card-content.component.mjs +6 -6
  75. package/esm2022/components/card/card-footer/card-footer.component.mjs +6 -6
  76. package/esm2022/components/card/card-header/card-header.component.mjs +6 -7
  77. package/esm2022/components/card/card.component.mjs +6 -6
  78. package/esm2022/components/collapsible/collapsible.component.mjs +9 -14
  79. package/esm2022/components/dashboard-card/dashboard-card.component.mjs +32 -0
  80. package/esm2022/components/dashboard-card/index.mjs +2 -0
  81. package/esm2022/components/dropdown/dropdown.component.mjs +11 -18
  82. package/esm2022/components/form-field/autosuggest/autosuggest-add-option/autosuggest-add-option.component.mjs +29 -0
  83. package/esm2022/components/form-field/autosuggest/autosuggest-add-option/index.mjs +2 -0
  84. package/esm2022/components/form-field/autosuggest/autosuggest-option/autosuggest-option.component.mjs +45 -0
  85. package/esm2022/components/form-field/autosuggest/autosuggest-option/autosuggest-option.model.mjs +2 -0
  86. package/esm2022/components/form-field/autosuggest/autosuggest-option/base-autosuggest-option.component.mjs +85 -0
  87. package/esm2022/components/form-field/autosuggest/autosuggest-option/index.mjs +3 -0
  88. package/esm2022/components/form-field/autosuggest/autosuggest-panel/autosuggest-panel.component.mjs +82 -0
  89. package/esm2022/components/form-field/autosuggest/autosuggest.directive.mjs +411 -0
  90. package/esm2022/components/form-field/autosuggest/index.mjs +6 -0
  91. package/esm2022/components/form-field/autosuggest/match-bold.pipe.mjs +21 -0
  92. package/esm2022/components/form-field/checkbox/checkbox.component.mjs +13 -27
  93. package/esm2022/components/form-field/checkbox-group/checkbox-group.component.mjs +6 -6
  94. package/esm2022/components/form-field/clear-search-button/clear-search-button.component.mjs +37 -0
  95. package/esm2022/components/form-field/error/error.component.mjs +6 -6
  96. package/esm2022/components/form-field/file-upload/file-upload.component.mjs +48 -93
  97. package/esm2022/components/form-field/form-field.component.mjs +25 -76
  98. package/esm2022/components/form-field/form-field.constant.mjs +2 -0
  99. package/esm2022/components/form-field/index.mjs +4 -1
  100. package/esm2022/components/form-field/info/info.component.mjs +6 -6
  101. package/esm2022/components/form-field/input/input.directive.mjs +5 -11
  102. package/esm2022/components/form-field/input-button/index.mjs +2 -0
  103. package/esm2022/components/form-field/input-button/input-button.component.mjs +23 -0
  104. package/esm2022/components/form-field/input-icon/index.mjs +2 -0
  105. package/esm2022/components/form-field/input-icon/input-icon.component.mjs +12 -0
  106. package/esm2022/components/form-field/month-input/month-input.component.mjs +8 -9
  107. package/esm2022/components/form-field/option-group/option-group.component.mjs +6 -6
  108. package/esm2022/components/form-field/option-group/option.component.mjs +5 -6
  109. package/esm2022/components/form-field/picker-button/picker-button.component.mjs +45 -0
  110. package/esm2022/components/form-field/radio-button/radio-button.component.mjs +12 -22
  111. package/esm2022/components/form-field/radio-group/radio-group.component.mjs +11 -13
  112. package/esm2022/components/form-field/success/success.component.mjs +6 -6
  113. package/esm2022/components/form-field/textarea/auto-grow.directive.mjs +3 -3
  114. package/esm2022/components/icon/action-icon/action-icon.component.mjs +5 -5
  115. package/esm2022/components/icon/icon.component.mjs +15 -10
  116. package/esm2022/components/index.mjs +8 -3
  117. package/esm2022/components/layout/index.mjs +2 -0
  118. package/esm2022/components/layout/layout.component.mjs +20 -0
  119. package/esm2022/components/layout-banners/index.mjs +2 -0
  120. package/esm2022/components/layout-banners/layout-banners.component.mjs +11 -0
  121. package/esm2022/components/loader/index.mjs +2 -0
  122. package/esm2022/components/loader/loader.component.mjs +11 -0
  123. package/esm2022/components/main-navigation/main-navigation.component.mjs +52 -48
  124. package/esm2022/components/main-navigation/main-navigation.model.mjs +1 -1
  125. package/esm2022/components/main-navigation-menu/main-navigation-menu.component.mjs +9 -9
  126. package/esm2022/components/modal/index.mjs +1 -4
  127. package/esm2022/components/modal/modal-content/modal-content.component.mjs +6 -6
  128. package/esm2022/components/modal/modal-footer/modal-footer.component.mjs +6 -6
  129. package/esm2022/components/modal/modal-header/modal-header.component.mjs +9 -11
  130. package/esm2022/components/modal/modal-ref.mjs +4 -0
  131. package/esm2022/components/modal/modal.component.mjs +10 -23
  132. package/esm2022/components/modal/modal.service.mjs +20 -41
  133. package/esm2022/components/multi-select/multi-select.component.mjs +10 -12
  134. package/esm2022/components/pill/pill.component.mjs +12 -20
  135. package/esm2022/components/popover/popover-trigger.directive.mjs +9 -9
  136. package/esm2022/components/router-breadcrumbs/router-breadcrumbs.component.mjs +6 -6
  137. package/esm2022/components/tab/tab.component.mjs +13 -29
  138. package/esm2022/components/tab-group/tab-group.component.mjs +10 -12
  139. package/esm2022/components/tag/index.mjs +2 -0
  140. package/esm2022/components/tag/tag.component.mjs +29 -0
  141. package/esm2022/components/toast/toast.component.mjs +6 -6
  142. package/esm2022/components/toast/toast.service.mjs +4 -4
  143. package/esm2022/components/tooltip/tooltip.component.mjs +7 -7
  144. package/esm2022/components/tooltip/tooltip.directive.mjs +10 -16
  145. package/esm2022/models/aria.model.mjs +2 -0
  146. package/esm2022/models/index.mjs +2 -0
  147. package/fesm2022/ndwnu-design-system.mjs +1279 -660
  148. package/fesm2022/ndwnu-design-system.mjs.map +1 -1
  149. package/models/aria.model.d.ts +1 -0
  150. package/models/index.d.ts +1 -0
  151. package/package.json +1 -1
  152. package/components/modal/modal-trigger.directive.d.ts +0 -16
  153. package/components/removable-pill/index.d.ts +0 -1
  154. package/components/removable-pill/removable-pill.component.d.ts +0 -14
  155. package/esm2022/components/modal/modal-trigger.directive.mjs +0 -46
  156. package/esm2022/components/removable-pill/index.mjs +0 -2
  157. package/esm2022/components/removable-pill/removable-pill.component.mjs +0 -23
@@ -0,0 +1,82 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, inject, input, output, signal, TemplateRef, viewChild, ViewChildren, } from '@angular/core';
2
+ import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';
3
+ import { IconComponent } from '../../../icon';
4
+ import { AutosuggestAddOptionComponent } from '../autosuggest-add-option';
5
+ import { AutosuggestOptionComponent } from '../autosuggest-option';
6
+ import { NgTemplateOutlet } from '@angular/common';
7
+ import * as i0 from "@angular/core";
8
+ const DEFAULTMAXRESULTS = 100;
9
+ const DEFAULTNORESULTTEXT = 'Geen resultaten gevonden. Probeer een andere zoekterm.';
10
+ export class AutosuggestPanelComponent {
11
+ constructor() {
12
+ // Inputs
13
+ this.suggestions = input([]);
14
+ this.enableAddOption = input(false);
15
+ this.maxResults = input(DEFAULTMAXRESULTS);
16
+ this.noResultText = input(DEFAULTNORESULTTEXT);
17
+ this.displayWith = input();
18
+ // Outputs
19
+ this.opened = output();
20
+ this.closed = output();
21
+ this.optionSelected = output();
22
+ this.addOption = output();
23
+ this.template = viewChild.required(TemplateRef);
24
+ this.panel = viewChild.required('panel');
25
+ // Variables & Signals
26
+ this.searchTerm = signal('');
27
+ this.slicedOptions = computed(() => this.suggestions().slice(0, this.maxResults()));
28
+ this.hasMoreResults = computed(() => this.suggestions().length > this.maxResults());
29
+ this.numberOfLeftOverResults = computed(() => this.suggestions().length - this.maxResults());
30
+ this.showPanel = false;
31
+ this.isOpen = false;
32
+ this.changeDetectorRef = inject(ChangeDetectorRef);
33
+ this.id = `ndw-autosuggest-${crypto.randomUUID()}`;
34
+ }
35
+ ngAfterViewInit() {
36
+ this.keyManager = new ActiveDescendantKeyManager(this.items)
37
+ .withPageUpDown()
38
+ .withWrap()
39
+ .withTypeAhead();
40
+ this.setVisibility();
41
+ }
42
+ ngOnDestroy() {
43
+ this.keyManager?.destroy();
44
+ }
45
+ // Methods
46
+ getLabelOption(option) {
47
+ const displayFn = this.displayWith();
48
+ return displayFn ? displayFn(option) : option;
49
+ }
50
+ setScrollTop(scrollTop) {
51
+ const panel = this.panel();
52
+ if (panel) {
53
+ panel.nativeElement.scrollTop = scrollTop;
54
+ }
55
+ }
56
+ setVisibility() {
57
+ this.showPanel = !!this.items?.length;
58
+ this.changeDetectorRef.markForCheck();
59
+ }
60
+ emitSelectEvent(option) {
61
+ this.optionSelected.emit(option.value() ?? null);
62
+ }
63
+ addNewOption(value) {
64
+ this.optionSelected.emit(value);
65
+ this.addOption.emit(value);
66
+ }
67
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: AutosuggestPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
68
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: AutosuggestPanelComponent, isStandalone: true, selector: "ndw-autosuggest", inputs: { suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, enableAddOption: { classPropertyName: "enableAddOption", publicName: "enableAddOption", isSignal: true, isRequired: false, transformFunction: null }, maxResults: { classPropertyName: "maxResults", publicName: "maxResults", isSignal: true, isRequired: false, transformFunction: null }, noResultText: { classPropertyName: "noResultText", publicName: "noResultText", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed", optionSelected: "optionSelected", addOption: "addOption" }, viewQueries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "items", predicate: ["option"], descendants: true }], exportAs: ["apAutocomplete"], ngImport: i0, template: "<ng-template>\n @if (suggestions().length === 0 && !enableAddOption()) {\n <div class=\"ndw-autosuggest-panel\">\n <ng-container *ngTemplateOutlet=\"emptyResults\"></ng-container>\n </div>\n } @else {\n <datalist #panel class=\"ndw-autosuggest-panel\">\n @for (option of slicedOptions(); track option) {\n <ndw-autosuggest-option\n #option\n [value]=\"option\"\n [label]=\"getLabelOption(option)\"\n [searchTerm]=\"searchTerm()\"\n />\n }\n\n @if (enableAddOption()) {\n @if (!!searchTerm().trim()) {\n <ndw-autosuggest-add-option\n #option\n [value]=\"searchTerm()\"\n (addOption)=\"addNewOption($event)\"\n />\n } @else if (!suggestions().length) {\n <ng-container *ngTemplateOutlet=\"emptyResults\"></ng-container>\n }\n }\n\n @if (hasMoreResults()) {\n <p class=\"ndw-autosuggest-panel__more-results\">\n Er zijn nog {{ numberOfLeftOverResults() }} niet-getoonde resultaten, maak je zoekopdracht\n specifieker\n </p>\n }\n </datalist>\n }\n</ng-template>\n\n<ng-template #emptyResults>\n <div class=\"ndw-autosuggest-panel__empty\">\n <ndw-icon>sentiment_dissatisfied</ndw-icon>\n {{ noResultText() }}\n </div>\n</ng-template>\n", styles: [".ndw-autosuggest-panel{--dropdown-line-height: 26px;--dropdown-max-line-items: 7;--dropdown-max-height: calc(var(--dropdown-line-height) * var(--dropdown-max-line-items));display:block;overflow:auto;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;max-height:var(--dropdown-max-height);width:100%;border:1px solid var(--ndw-color-grey-200);border-radius:var(--ndw-border-radius-sm);padding:0;margin-top:2px;background-color:var(--ndw-color-white);box-shadow:var(--ndw-elevation-popover)}.ndw-autosuggest-panel>ndw-autosuggest-option:not(:last-child){border-bottom:1px solid var(--ndw-color-grey-200)}.ndw-autosuggest-panel__more-results{font-size:var(--ndw-font-size-sm);color:var(--ndw-color-grey-400);text-align:center}.ndw-autosuggest-panel__empty{display:grid;justify-items:center;margin:auto;padding:var(--ndw-spacing-sm) var(--ndw-spacing-md);gap:var(--ndw-spacing-xs);max-width:300px;box-sizing:border-box;font-size:var(--ndw-font-size-sm);text-align:center;color:var(--ndw-color-grey-400)}\n"], dependencies: [{ kind: "component", type: AutosuggestOptionComponent, selector: "ndw-autosuggest-option", inputs: ["searchTerm", "label"] }, { kind: "component", type: AutosuggestAddOptionComponent, selector: "ndw-autosuggest-add-option", outputs: ["addOption"] }, { kind: "component", type: IconComponent, selector: "ndw-icon", inputs: ["size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
69
+ }
70
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: AutosuggestPanelComponent, decorators: [{
71
+ type: Component,
72
+ args: [{ selector: 'ndw-autosuggest', standalone: true, imports: [
73
+ AutosuggestOptionComponent,
74
+ AutosuggestAddOptionComponent,
75
+ IconComponent,
76
+ NgTemplateOutlet,
77
+ ], changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'apAutocomplete', template: "<ng-template>\n @if (suggestions().length === 0 && !enableAddOption()) {\n <div class=\"ndw-autosuggest-panel\">\n <ng-container *ngTemplateOutlet=\"emptyResults\"></ng-container>\n </div>\n } @else {\n <datalist #panel class=\"ndw-autosuggest-panel\">\n @for (option of slicedOptions(); track option) {\n <ndw-autosuggest-option\n #option\n [value]=\"option\"\n [label]=\"getLabelOption(option)\"\n [searchTerm]=\"searchTerm()\"\n />\n }\n\n @if (enableAddOption()) {\n @if (!!searchTerm().trim()) {\n <ndw-autosuggest-add-option\n #option\n [value]=\"searchTerm()\"\n (addOption)=\"addNewOption($event)\"\n />\n } @else if (!suggestions().length) {\n <ng-container *ngTemplateOutlet=\"emptyResults\"></ng-container>\n }\n }\n\n @if (hasMoreResults()) {\n <p class=\"ndw-autosuggest-panel__more-results\">\n Er zijn nog {{ numberOfLeftOverResults() }} niet-getoonde resultaten, maak je zoekopdracht\n specifieker\n </p>\n }\n </datalist>\n }\n</ng-template>\n\n<ng-template #emptyResults>\n <div class=\"ndw-autosuggest-panel__empty\">\n <ndw-icon>sentiment_dissatisfied</ndw-icon>\n {{ noResultText() }}\n </div>\n</ng-template>\n", styles: [".ndw-autosuggest-panel{--dropdown-line-height: 26px;--dropdown-max-line-items: 7;--dropdown-max-height: calc(var(--dropdown-line-height) * var(--dropdown-max-line-items));display:block;overflow:auto;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;max-height:var(--dropdown-max-height);width:100%;border:1px solid var(--ndw-color-grey-200);border-radius:var(--ndw-border-radius-sm);padding:0;margin-top:2px;background-color:var(--ndw-color-white);box-shadow:var(--ndw-elevation-popover)}.ndw-autosuggest-panel>ndw-autosuggest-option:not(:last-child){border-bottom:1px solid var(--ndw-color-grey-200)}.ndw-autosuggest-panel__more-results{font-size:var(--ndw-font-size-sm);color:var(--ndw-color-grey-400);text-align:center}.ndw-autosuggest-panel__empty{display:grid;justify-items:center;margin:auto;padding:var(--ndw-spacing-sm) var(--ndw-spacing-md);gap:var(--ndw-spacing-xs);max-width:300px;box-sizing:border-box;font-size:var(--ndw-font-size-sm);text-align:center;color:var(--ndw-color-grey-400)}\n"] }]
78
+ }], ctorParameters: () => [], propDecorators: { items: [{
79
+ type: ViewChildren,
80
+ args: ['option']
81
+ }] } });
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b3N1Z2dlc3QtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmR3L3NyYy9jb21wb25lbnRzL2Zvcm0tZmllbGQvYXV0b3N1Z2dlc3QvYXV0b3N1Z2dlc3QtcGFuZWwvYXV0b3N1Z2dlc3QtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmR3L3NyYy9jb21wb25lbnRzL2Zvcm0tZmllbGQvYXV0b3N1Z2dlc3QvYXV0b3N1Z2dlc3QtcGFuZWwvYXV0b3N1Z2dlc3QtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFFBQVEsRUFFUixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFFTixNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUtuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFFbkQsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7QUFDOUIsTUFBTSxtQkFBbUIsR0FBRyx3REFBd0QsQ0FBQztBQWdCckYsTUFBTSxPQUFPLHlCQUF5QjtJQXFDcEM7UUFwQ0EsU0FBUztRQUNPLGdCQUFXLEdBQUcsS0FBSyxDQUFxQixFQUFFLENBQUMsQ0FBQztRQUM1QyxvQkFBZSxHQUFHLEtBQUssQ0FBVSxL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QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDOzhHQWpGVSx5QkFBeUI7a0dBQXpCLHlCQUF5QiwwNkJBaUJVLFdBQVcsb1FDOUQzRCwyMENBNENBLHdpQ0RUSSwwQkFBMEIsb0dBQzFCLDZCQUE2QiwrRkFDN0IsYUFBYSx1RUFDYixnQkFBZ0I7OzJGQU9QLHlCQUF5QjtrQkFkckMsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1A7d0JBQ1AsMEJBQTBCO3dCQUMxQiw2QkFBNkI7d0JBQzdCLGFBQWE7d0JBQ2IsZ0JBQWdCO3FCQUNqQixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTSxZQUNyQyxnQkFBZ0I7d0RBa0JuQixLQUFLO3NCQURYLFlBQVk7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgc2lnbmFsLFxuICBUZW1wbGF0ZVJlZixcbiAgdmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pY29uJztcbmltcG9ydCB7IEF1dG9zdWdnZXN0QWRkT3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYXV0b3N1Z2dlc3QtYWRkLW9wdGlvbic7XG5pbXBvcnQgeyBBdXRvc3VnZ2VzdE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2F1dG9zdWdnZXN0LW9wdGlvbic7XG5pbXBvcnQge1xuICBBdXRvc3VnZ2VzdE9wdGlvbixcbiAgQXV0b3N1Z2dlc3RPcHRpb25zLFxufSBmcm9tICcuLi9hdXRvc3VnZ2VzdC1vcHRpb24vYXV0b3N1Z2dlc3Qtb3B0aW9uLm1vZGVsJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5jb25zdCBERUZBVUxUTUFYUkVTVUxUUyA9IDEwMDtcbmNvbnN0IERFRkFVTFROT1JFU1VMVFRFWFQgPSAnR2VlbiByZXN1bHRhdGVuIGdldm9uZGVuLiBQcm9iZWVyIGVlbiBhbmRlcmUgem9la3Rlcm0uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmR3LWF1dG9zdWdnZXN0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEF1dG9zdWdnZXN0T3B0aW9uQ29tcG9uZW50LFxuICAgIEF1dG9zdWdnZXN0QWRkT3B0aW9uQ29tcG9uZW50LFxuICAgIEljb25Db21wb25lbnQsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9zdWdnZXN0LXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2F1dG9zdWdnZXN0LXBhbmVsLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGV4cG9ydEFzOiAnYXBBdXRvY29tcGxldGUnLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRvc3VnZ2VzdFBhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLy8gSW5wdXRzXG4gIHB1YmxpYyByZWFkb25seSBzdWdnZXN0aW9ucyA9IGlucHV0PEF1dG9zdWdnZXN0T3B0aW9ucz4oW10pO1xuICBwdWJsaWMgcmVhZG9ubHkgZW5hYmxlQWRkT3B0aW9uID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4UmVzdWx0cyA9IGlucHV0PG51bWJlcj4oREVGQVVMVE1BWFJFU1VMVFMpO1xuICBwdWJsaWMgcmVhZG9ubHkgbm9SZXN1bHRUZXh0ID0gaW5wdXQ8c3RyaW5nPihERUZBVUxUTk9SRVNVTFRURVhUKTtcbiAgcHVibGljIHJlYWRvbmx5IGRpc3BsYXlXaXRoID0gaW5wdXQ8KHZhbHVlOiBBdXRvc3VnZ2VzdE9wdGlvbikgPT4gc3RyaW5nPigpO1xuXG4gIC8vIE91dHB1dHNcbiAgcHVibGljIHJlYWRvbmx5IG9wZW5lZCA9IG91dHB1dDx2b2lkPigpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvc2VkID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25TZWxlY3RlZCA9IG91dHB1dDxBdXRvc3VnZ2VzdE9wdGlvbiB8IG51bGw+KCk7XG4gIHB1YmxpYyByZWFkb25seSBhZGRPcHRpb24gPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gIC8vIFZpZXcgUmVmZXJlbmNlc1xuICBAVmlld0NoaWxkcmVuKCdvcHRpb24nKVxuICBwdWJsaWMgaXRlbXMhOiBRdWVyeUxpc3Q8QXV0b3N1Z2dlc3RPcHRpb25Db21wb25lbnQgfCBBdXRvc3VnZ2VzdEFkZE9wdGlvbkNvbXBvbmVudD47XG4gIHB1YmxpYyByZWFkb25seSB0ZW1wbGF0ZSA9IHZpZXdDaGlsZC5yZXF1aXJlZChUZW1wbGF0ZVJlZik7XG4gIHB1YmxpYyByZWFkb25seSBwYW5lbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ3BhbmVsJyk7XG5cbiAgLy8gVmFyaWFibGVzICYgU2lnbmFsc1xuICBwdWJsaWMgcmVhZG9ubHkgc2VhcmNoVGVybSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHVibGljIHJlYWRvbmx5IHNsaWNlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN1Z2dlc3Rpb25zKCkuc2xpY2UoMCwgdGhpcy5tYXhSZXN1bHRzKCkpKTtcbiAgcHVibGljIHJlYWRvbmx5IGhhc01vcmVSZXN1bHRzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdWdnZXN0aW9ucygpLmxlbmd0aCA+IHRoaXMubWF4UmVzdWx0cygpKTtcbiAgcHVibGljIHJlYWRvbmx5IG51bWJlck9mTGVmdE92ZXJSZXN1bHRzID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5zdWdnZXN0aW9ucygpLmxlbmd0aCAtIHRoaXMubWF4UmVzdWx0cygpLFxuICApO1xuXG4gIHB1YmxpYyBrZXlNYW5hZ2VyOlxuICAgIHwgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXI8QXV0b3N1Z2dlc3RPcHRpb25Db21wb25lbnQgfCBBdXRvc3VnZ2VzdEFkZE9wdGlvbkNvbXBvbmVudD5cbiAgICB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHNob3dQYW5lbCA9IGZhbHNlO1xuICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlkID0gYG5kdy1hdXRvc3VnZ2VzdC0ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5rZXlNYW5hZ2VyID0gbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyPFxuICAgICAgQXV0b3N1Z2dlc3RPcHRpb25Db21wb25lbnQgfCBBdXRvc3VnZ2VzdEFkZE9wdGlvbkNvbXBvbmVudFxuICAgID4odGhpcy5pdGVtcylcbiAgICAgIC53aXRoUGFnZVVwRG93bigpXG4gICAgICAud2l0aFdyYXAoKVxuICAgICAgLndpdGhUeXBlQWhlYWQoKTtcbiAgICB0aGlzLnNldFZpc2liaWxpdHkoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmtleU1hbmFnZXI/LmRlc3Ryb3koKTtcbiAgfVxuXG4gIC8vIE1ldGhvZHNcbiAgcHVibGljIGdldExhYmVsT3B0aW9uKG9wdGlvbjogQXV0b3N1Z2dlc3RPcHRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpc3BsYXlGbiA9IHRoaXMuZGlzcGxheVdpdGgoKTtcbiAgICByZXR1cm4gZGlzcGxheUZuID8gZGlzcGxheUZuKG9wdGlvbikgOiAob3B0aW9uIGFzIHN0cmluZyk7XG4gIH1cblxuICBwdWJsaWMgc2V0U2Nyb2xsVG9wKHNjcm9sbFRvcDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGFuZWwgPSB0aGlzLnBhbmVsKCk7XG5cbiAgICBpZiAocGFuZWwpIHtcbiAgICAgIHBhbmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd1BhbmVsID0gISF0aGlzLml0ZW1zPy5sZW5ndGg7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0U2VsZWN0RXZlbnQob3B0aW9uOiBBdXRvc3VnZ2VzdE9wdGlvbkNvbXBvbmVudCB8IEF1dG9zdWdnZXN0QWRkT3B0aW9uQ29tcG9uZW50KTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25TZWxlY3RlZC5lbWl0KG9wdGlvbi52YWx1ZSgpID8/IG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFkZE5ld09wdGlvbih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25TZWxlY3RlZC5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLmFkZE9wdGlvbi5lbWl0KHZhbHVlKTtcbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlPlxuICBAaWYgKHN1Z2dlc3Rpb25zKCkubGVuZ3RoID09PSAwICYmICFlbmFibGVBZGRPcHRpb24oKSkge1xuICAgIDxkaXYgY2xhc3M9XCJuZHctYXV0b3N1Z2dlc3QtcGFuZWxcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVJlc3VsdHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gICAgPGRhdGFsaXN0ICNwYW5lbCBjbGFzcz1cIm5kdy1hdXRvc3VnZ2VzdC1wYW5lbFwiPlxuICAgICAgQGZvciAob3B0aW9uIG9mIHNsaWNlZE9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uKSB7XG4gICAgICAgIDxuZHctYXV0b3N1Z2dlc3Qtb3B0aW9uXG4gICAgICAgICAgI29wdGlvblxuICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIlxuICAgICAgICAgIFtsYWJlbF09XCJnZXRMYWJlbE9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgICBbc2VhcmNoVGVybV09XCJzZWFyY2hUZXJtKClcIlxuICAgICAgICAvPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGVuYWJsZUFkZE9wdGlvbigpKSB7XG4gICAgICAgIEBpZiAoISFzZWFyY2hUZXJtKCkudHJpbSgpKSB7XG4gICAgICAgICAgPG5kdy1hdXRvc3VnZ2VzdC1hZGQtb3B0aW9uXG4gICAgICAgICAgICAjb3B0aW9uXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VhcmNoVGVybSgpXCJcbiAgICAgICAgICAgIChhZGRPcHRpb24pPVwiYWRkTmV3T3B0aW9uKCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH0gQGVsc2UgaWYgKCFzdWdnZXN0aW9ucygpLmxlbmd0aCkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVJlc3VsdHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBAaWYgKGhhc01vcmVSZXN1bHRzKCkpIHtcbiAgICAgICAgPHAgY2xhc3M9XCJuZHctYXV0b3N1Z2dlc3QtcGFuZWxfX21vcmUtcmVzdWx0c1wiPlxuICAgICAgICAgIEVyIHppam4gbm9nIHt7IG51bWJlck9mTGVmdE92ZXJSZXN1bHRzKCkgfX0gbmlldC1nZXRvb25kZSByZXN1bHRhdGVuLCBtYWFrIGplIHpvZWtvcGRyYWNodFxuICAgICAgICAgIHNwZWNpZmlla2VyXG4gICAgICAgIDwvcD5cbiAgICAgIH1cbiAgICA8L2RhdGFsaXN0PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5UmVzdWx0cz5cbiAgPGRpdiBjbGFzcz1cIm5kdy1hdXRvc3VnZ2VzdC1wYW5lbF9fZW1wdHlcIj5cbiAgICA8bmR3LWljb24+c2VudGltZW50X2Rpc3NhdGlzZmllZDwvbmR3LWljb24+XG4gICAge3sgbm9SZXN1bHRUZXh0KCkgfX1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -0,0 +1,411 @@
1
+ /* eslint max-lines: off */
2
+ // Based on https://github.com/angular/components/tree/main/src/material/autocomplete
3
+ import { hasModifierKey } from '@angular/cdk/keycodes';
4
+ import { ConnectionPositionPair, Overlay, OverlayConfig, ViewportRuler, } from '@angular/cdk/overlay';
5
+ import { TemplatePortal } from '@angular/cdk/portal';
6
+ import { DOCUMENT } from '@angular/common';
7
+ import { ChangeDetectorRef, DestroyRef, Directive, ElementRef, forwardRef, inject, input, NgZone, output, ViewContainerRef, } from '@angular/core';
8
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
10
+ import { defer, delay, filter, fromEvent, map, merge, of, Subject, switchMap, take, } from 'rxjs';
11
+ import { AutocompleteOptionSelectionChange, } from './autosuggest-option/autosuggest-option.component';
12
+ import { INPUT_CONTAINER_CLASS } from '../form-field.constant';
13
+ import * as i0 from "@angular/core";
14
+ export class AutosuggestDirective {
15
+ constructor() {
16
+ this.ndwAutosuggest = input.required();
17
+ this.filter = output();
18
+ this.overlayAttached = false;
19
+ this.overlayRef = null;
20
+ this.canOpenOnNextFocus = true;
21
+ this.valueOnAttach = null;
22
+ this.valueOnLastKeydown = null;
23
+ this.closeKeyEventStream = new Subject();
24
+ this.zone = inject(NgZone);
25
+ this.element = inject(ElementRef);
26
+ this.viewContainerRef = inject(ViewContainerRef);
27
+ this.overlay = inject(Overlay);
28
+ this.changeDetectorRef = inject(ChangeDetectorRef);
29
+ this.document = inject(DOCUMENT);
30
+ this.viewportRuler = inject(ViewportRuler);
31
+ this.destroyRef = inject(DestroyRef);
32
+ this.optionSelections = defer(() => {
33
+ const options = this.autosuggest.items;
34
+ if (this.autosuggest && options) {
35
+ return merge(...options.map((option) => option.selectionChange));
36
+ }
37
+ return this.zone.onStable.asObservable().pipe(take(1), switchMap(() => this.optionSelections));
38
+ });
39
+ this.handlePanelKeydown = (event) => {
40
+ if ((event.key === 'Escape' && !hasModifierKey(event)) ||
41
+ (event.key === 'ArrowUp' && hasModifierKey(event, 'altKey'))) {
42
+ this.closeKeyEventStream.next();
43
+ this.resetActiveItem();
44
+ event.stopPropagation();
45
+ event.preventDefault();
46
+ }
47
+ };
48
+ this.windowBlurHandler = () => {
49
+ this.canOpenOnNextFocus =
50
+ this.document?.activeElement !== this.element.nativeElement || this.panelOpen;
51
+ };
52
+ this.onChange = () => { };
53
+ this.onTouched = () => { };
54
+ }
55
+ get panelOpen() {
56
+ return this.overlayAttached && !!this.autosuggest?.showPanel;
57
+ }
58
+ get activeOption() {
59
+ const keyManager = this.autosuggest?.keyManager;
60
+ return keyManager?.activeItem ?? null;
61
+ }
62
+ get autosuggest() {
63
+ return this.ndwAutosuggest();
64
+ }
65
+ get panelClosingActions() {
66
+ return merge(this.optionSelections, this.autosuggest.keyManager.tabOut.pipe(filter(() => this.overlayAttached)), this.closeKeyEventStream, this.getOutsideClickStream(), this.overlayRef
67
+ ? this.overlayRef.detachments().pipe(filter(() => this.overlayAttached))
68
+ : of()).pipe(map((event) => (event instanceof AutocompleteOptionSelectionChange ? event : null)));
69
+ }
70
+ ngAfterViewInit() {
71
+ const window = this.getWindow();
72
+ if (typeof window !== 'undefined') {
73
+ this.zone.runOutsideAngular(() => {
74
+ window.addEventListener('blur', this.windowBlurHandler);
75
+ });
76
+ }
77
+ }
78
+ ngOnDestroy() {
79
+ const window = this.getWindow();
80
+ if (typeof window !== 'undefined') {
81
+ window.removeEventListener('blur', this.windowBlurHandler);
82
+ }
83
+ this.closingActionsSubscription?.unsubscribe();
84
+ this.keydownSubscription?.unsubscribe();
85
+ this.closeKeyEventStream.complete();
86
+ this.destroyPanel();
87
+ }
88
+ openPanel(valueOnAttach = this.element.nativeElement.value) {
89
+ this.attachOverlay(valueOnAttach);
90
+ }
91
+ closePanel() {
92
+ if (!this.overlayAttached) {
93
+ return;
94
+ }
95
+ if (this.panelOpen) {
96
+ this.autosuggest.closed?.emit();
97
+ }
98
+ this.autosuggest.isOpen = false;
99
+ this.overlayAttached = false;
100
+ if (this.overlayRef?.hasAttached()) {
101
+ this.overlayRef.detach();
102
+ this.closingActionsSubscription?.unsubscribe();
103
+ this.keydownSubscription?.unsubscribe();
104
+ }
105
+ this.changeDetectorRef.detectChanges();
106
+ // Dispatch an input event to trigger the form-field component change detection.
107
+ this.element.nativeElement.dispatchEvent(new Event('input'));
108
+ }
109
+ handleFocus() {
110
+ this.filter.emit(this.element.nativeElement.value);
111
+ if (!this.canOpenOnNextFocus) {
112
+ this.canOpenOnNextFocus = true;
113
+ this.blur();
114
+ }
115
+ else if (this.canOpen()) {
116
+ this.previousValue = this.element.nativeElement.value;
117
+ this.attachOverlay(this.previousValue);
118
+ }
119
+ }
120
+ writeValue(value) {
121
+ Promise.resolve(null).then(() => this.setTriggerValue(value));
122
+ }
123
+ registerOnChange(fn) {
124
+ this.onChange = fn;
125
+ }
126
+ registerOnTouched(fn) {
127
+ this.onTouched = fn;
128
+ }
129
+ clearValue() {
130
+ this.writeValue('');
131
+ this.onChange('');
132
+ }
133
+ handleClick() {
134
+ if (this.canOpen() && !this.panelOpen) {
135
+ this.openPanel();
136
+ }
137
+ }
138
+ handleKeydown(event) {
139
+ const code = event.code;
140
+ if (event.key === 'Escape') {
141
+ event.preventDefault();
142
+ }
143
+ this.valueOnLastKeydown = this.element.nativeElement.value;
144
+ if (this.activeOption && code === 'Enter' && this.panelOpen) {
145
+ this.activeOption.selectViaInteraction();
146
+ this.resetActiveItem();
147
+ event.preventDefault();
148
+ }
149
+ else if (this.autosuggest) {
150
+ const prevActiveItem = this.autosuggest.keyManager?.activeItem;
151
+ const isArrowKey = code === 'ArrowUp' || code === 'ArrowDown';
152
+ if (code === 'Tab' || (isArrowKey && this.panelOpen)) {
153
+ this.autosuggest.keyManager?.onKeydown(event);
154
+ }
155
+ else if (isArrowKey && this.canOpen()) {
156
+ this.openPanel();
157
+ }
158
+ if (isArrowKey || this.autosuggest.keyManager?.activeItem !== prevActiveItem) {
159
+ this.scrollToOption();
160
+ if (this.activeOption) {
161
+ this.assignOptionValue(this.activeOption.value() ?? null);
162
+ }
163
+ }
164
+ }
165
+ }
166
+ handleInput(event) {
167
+ const target = event.target;
168
+ let value = target.value;
169
+ this.filter.emit(value);
170
+ this.autosuggest.searchTerm.set(value);
171
+ // Based on `NumberValueAccessor` from forms.
172
+ if (target.type === 'number') {
173
+ value = value === '' ? null : parseFloat(value);
174
+ }
175
+ if (this.previousValue !== value) {
176
+ this.previousValue = value;
177
+ if (!this.autosuggest) {
178
+ this.onChange(value);
179
+ }
180
+ if (!value) {
181
+ this.clearPreviousSelectedOption(null, true);
182
+ }
183
+ if (this.canOpen() && this.document.activeElement === event.target) {
184
+ const valueOnAttach = this.valueOnLastKeydown ?? this.element.nativeElement.value;
185
+ this.valueOnLastKeydown = null;
186
+ this.openPanel(valueOnAttach);
187
+ }
188
+ }
189
+ }
190
+ setDisabledState(isDisabled) {
191
+ this.element.nativeElement.disabled = isDisabled;
192
+ }
193
+ destroyPanel() {
194
+ if (this.overlayRef) {
195
+ this.closePanel();
196
+ this.overlayRef.dispose();
197
+ this.overlayRef = null;
198
+ }
199
+ }
200
+ attachOverlay(valueOnAttach = this.element.nativeElement.value) {
201
+ if (!this.autosuggest) {
202
+ throw Error('Cannot open autosuggest panel because the autosuggest is not defined.');
203
+ }
204
+ let overlayRef = this.overlayRef;
205
+ if (!overlayRef) {
206
+ this.portal = new TemplatePortal(this.autosuggest.template(), this.viewContainerRef);
207
+ overlayRef = this.overlay.create(this.getOverlayConfig());
208
+ this.overlayRef = overlayRef;
209
+ this.viewportRuler
210
+ .change()
211
+ .pipe(takeUntilDestroyed(this.destroyRef))
212
+ .subscribe(() => {
213
+ if (this.panelOpen && overlayRef) {
214
+ overlayRef.updateSize({ width: this.getHostWidth() });
215
+ }
216
+ });
217
+ this.initKeydownEvents();
218
+ }
219
+ if (overlayRef && !overlayRef.hasAttached()) {
220
+ overlayRef.attach(this.portal);
221
+ this.valueOnAttach = valueOnAttach;
222
+ this.closingActionsSubscription = this.subscribeToClosingActions();
223
+ this.keydownSubscription = overlayRef.keydownEvents().subscribe(this.handlePanelKeydown);
224
+ }
225
+ const wasOpen = this.panelOpen;
226
+ this.autosuggest.setVisibility();
227
+ this.autosuggest.isOpen = true;
228
+ this.overlayAttached = true;
229
+ if (this.panelOpen && wasOpen !== this.panelOpen) {
230
+ this.autosuggest.opened.emit();
231
+ }
232
+ }
233
+ initKeydownEvents() {
234
+ this.overlayRef?.keydownEvents()?.subscribe((event) => {
235
+ if (event.code === 'ArrowUp' && event.altKey) {
236
+ this.resetActiveItem();
237
+ this.closeKeyEventStream.next();
238
+ event.stopPropagation();
239
+ event.preventDefault();
240
+ this.blur();
241
+ }
242
+ });
243
+ }
244
+ getOverlayConfig() {
245
+ return new OverlayConfig({
246
+ positionStrategy: this.getOverlayPosition(),
247
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
248
+ width: this.getHostWidth(),
249
+ });
250
+ }
251
+ getHostWidth() {
252
+ return this.bindingElement().getBoundingClientRect().width;
253
+ }
254
+ bindingElement() {
255
+ const element = this.element.nativeElement;
256
+ const parentElement = element.parentElement;
257
+ return parentElement?.classList?.contains(INPUT_CONTAINER_CLASS) ? parentElement : element;
258
+ }
259
+ getOverlayPosition() {
260
+ const positions = [
261
+ new ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }),
262
+ ];
263
+ return this.overlay
264
+ .position()
265
+ .flexibleConnectedTo(this.bindingElement())
266
+ .withPositions(positions)
267
+ .withFlexibleDimensions(false)
268
+ .withPush(false);
269
+ }
270
+ resetActiveItem() {
271
+ const activeItemIndex = 0;
272
+ if (this.autosuggest.keyManager) {
273
+ this.autosuggest.keyManager.setActiveItem(activeItemIndex);
274
+ }
275
+ }
276
+ blur() {
277
+ this.element.nativeElement.blur();
278
+ }
279
+ getOutsideClickStream() {
280
+ return merge(fromEvent(this.document, 'click'), fromEvent(this.document, 'touchend')).pipe(filter((event) => {
281
+ const clickTarget = event.target;
282
+ return (this.overlayAttached &&
283
+ clickTarget !== this.element.nativeElement &&
284
+ this.document.activeElement !== this.element.nativeElement &&
285
+ !!this.overlayRef &&
286
+ !this.overlayRef.overlayElement.contains(clickTarget));
287
+ }));
288
+ }
289
+ subscribeToClosingActions() {
290
+ const items = this.autosuggest.items;
291
+ const firstStable = this.zone.onStable.asObservable().pipe(take(1));
292
+ const optionChanges = items.changes.pipe(delay(0));
293
+ return merge(firstStable, optionChanges)
294
+ .pipe(switchMap(() => {
295
+ const wasOpen = this.panelOpen;
296
+ this.resetActiveItem();
297
+ this.autosuggest.setVisibility();
298
+ if (this.panelOpen) {
299
+ this.overlayRef?.updatePosition();
300
+ if (wasOpen !== this.panelOpen) {
301
+ this.autosuggest.opened?.emit();
302
+ }
303
+ }
304
+ return this.panelClosingActions;
305
+ }), take(1))
306
+ .subscribe((event) => this.setValueAndClose(event));
307
+ }
308
+ setValueAndClose(event) {
309
+ const toSelect = event ? event.source : null;
310
+ if (toSelect) {
311
+ this.clearPreviousSelectedOption(toSelect);
312
+ this.onChange(toSelect.value());
313
+ this.assignOptionValue(toSelect.value() ?? null);
314
+ this.autosuggest.emitSelectEvent(toSelect);
315
+ this.element.nativeElement.focus();
316
+ }
317
+ else if (this.element.nativeElement.value !== this.valueOnAttach) {
318
+ this.clearPreviousSelectedOption(null);
319
+ this.assignOptionValue(null);
320
+ this.onChange(null);
321
+ }
322
+ this.closePanel();
323
+ }
324
+ assignOptionValue(value) {
325
+ const toDisplay = this.getDisplayValue(value);
326
+ if (value == null) {
327
+ this.clearPreviousSelectedOption(null, false);
328
+ }
329
+ this.updateNativeInputValue(toDisplay ?? '');
330
+ }
331
+ getDisplayValue(value) {
332
+ if (!value) {
333
+ return '';
334
+ }
335
+ const displayWithFn = this.autosuggest.displayWith();
336
+ return this.autosuggest && displayWithFn ? displayWithFn(value) : value;
337
+ }
338
+ updateNativeInputValue(value) {
339
+ this.element.nativeElement.value = value;
340
+ this.previousValue = value;
341
+ this.changeDetectorRef.markForCheck();
342
+ }
343
+ scrollToOption() {
344
+ const index = this.autosuggest.keyManager?.activeItemIndex ?? 0;
345
+ if (index === 0) {
346
+ this.autosuggest.setScrollTop(0);
347
+ }
348
+ else {
349
+ const newScrollPosition = index * 26;
350
+ this.autosuggest.setScrollTop(newScrollPosition);
351
+ }
352
+ }
353
+ setTriggerValue(value) {
354
+ const inputValue = value ?? '';
355
+ this.element.nativeElement.value = inputValue;
356
+ this.previousValue = inputValue;
357
+ }
358
+ clearPreviousSelectedOption(skip, emitEvent) {
359
+ this.onChange(null);
360
+ this.autosuggest.items?.forEach((option) => {
361
+ if (option !== skip && option.selected) {
362
+ option.deselect(emitEvent);
363
+ }
364
+ });
365
+ }
366
+ canOpen() {
367
+ const element = this.element.nativeElement;
368
+ return !element.readOnly && !element.disabled;
369
+ }
370
+ getWindow() {
371
+ return this.document?.defaultView ?? window;
372
+ }
373
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: AutosuggestDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
374
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.1", type: AutosuggestDirective, isStandalone: true, selector: "input[ndwAutosuggest], textarea[ndwAutosuggest]", inputs: { ndwAutosuggest: { classPropertyName: "ndwAutosuggest", publicName: "ndwAutosuggest", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { filter: "filter" }, host: { listeners: { "focus": "handleFocus()", "blur": "onTouched()", "input": "handleInput($event)", "keydown": "handleKeydown($event)", "click": "handleClick()" }, properties: { "attr.role": "\"combobox\"", "attr.autocomplete": "\"off\"", "attr.aria-autocomplete": "\"list\"", "attr.aria-activedescendant": "(panelOpen && activeOption) ? activeOption.id : null", "attr.aria-expanded": "panelOpen.toString()", "attr.aria-owns": "!panelOpen ? null : ndwAutosuggest()?.id", "attr.aria-haspopup": "\"true\"" } }, providers: [
375
+ {
376
+ provide: NG_VALUE_ACCESSOR,
377
+ useExisting: forwardRef(() => AutosuggestDirective),
378
+ multi: true,
379
+ },
380
+ ], exportAs: ["ndwAutosuggestTrigger"], ngImport: i0 }); }
381
+ }
382
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: AutosuggestDirective, decorators: [{
383
+ type: Directive,
384
+ args: [{
385
+ selector: 'input[ndwAutosuggest], textarea[ndwAutosuggest]',
386
+ exportAs: 'ndwAutosuggestTrigger',
387
+ standalone: true,
388
+ host: {
389
+ '[attr.role]': '"combobox"',
390
+ '[attr.autocomplete]': '"off"',
391
+ '[attr.aria-autocomplete]': '"list"',
392
+ '[attr.aria-activedescendant]': '(panelOpen && activeOption) ? activeOption.id : null',
393
+ '[attr.aria-expanded]': 'panelOpen.toString()',
394
+ '[attr.aria-owns]': '!panelOpen ? null : ndwAutosuggest()?.id',
395
+ '[attr.aria-haspopup]': '"true"',
396
+ '(focus)': 'handleFocus()',
397
+ '(blur)': 'onTouched()',
398
+ '(input)': 'handleInput($event)',
399
+ '(keydown)': 'handleKeydown($event)',
400
+ '(click)': 'handleClick()',
401
+ },
402
+ providers: [
403
+ {
404
+ provide: NG_VALUE_ACCESSOR,
405
+ useExisting: forwardRef(() => AutosuggestDirective),
406
+ multi: true,
407
+ },
408
+ ],
409
+ }]
410
+ }] });
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b3N1Z2dlc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmR3L3NyYy9jb21wb25lbnRzL2Zvcm0tZmllbGQvYXV0b3N1Z2dlc3QvYXV0b3N1Z2dlc3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUUzQixxRkFBcUY7QUFFckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxzQkFBc0IsRUFFdEIsT0FBTyxFQUNQLGFBQWEsRUFFYixhQUFhLEdBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUVOLE1BQU0sRUFDTixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssRUFFTCxFQUFFLEVBQ0YsT0FBTyxFQUVQLFNBQVMsRUFDVCxJQUFJLEdBQ0wsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQ0wsaUNBQWlDLEdBRWxDLE1BQU0sbURBQW1ELENBQUM7QUFFM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBNkIvRCxNQUFNLE9BQU8sb0JBQW9CO0lB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LEVBQUU7d0JBQ0osYUFBYSxFQUFFLFlBQVk7d0JBQzNCLHFCQUFxQixFQUFFLE9BQU87d0JBQzlCLDBCQUEwQixFQUFFLFFBQVE7d0JBQ3BDLDhCQUE4QixFQUFFLHNEQUFzRDt3QkFDdEYsc0JBQXNCLEVBQUUsc0JBQXNCO3dCQUM5QyxrQkFBa0IsRUFBRSwwQ0FBMEM7d0JBQzlELHNCQUFzQixFQUFFLFFBQVE7d0JBQ2hDLFNBQVMsRUFBRSxlQUFlO3dCQUMxQixRQUFRLEVBQUUsYUFBYTt3QkFDdkIsU0FBUyxFQUFFLHFCQUFxQjt3QkFDaEMsV0FBVyxFQUFFLHVCQUF1Qjt3QkFDcEMsU0FBUyxFQUFFLGVBQWU7cUJBQzNCO29CQUNELFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbWF4LWxpbmVzOiBvZmYgKi9cblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy90cmVlL21haW4vc3JjL21hdGVyaWFsL2F1dG9jb21wbGV0ZVxuXG5pbXBvcnQgeyBoYXNNb2RpZmllcktleSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uUG9zaXRpb25QYWlyLFxuICBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXG4gIE92ZXJsYXksXG4gIE92ZXJsYXlDb25maWcsXG4gIE92ZXJsYXlSZWYsXG4gIFZpZXdwb3J0UnVsZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGVzdHJveVJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGRlZmVyLFxuICBkZWxheSxcbiAgZmlsdGVyLFxuICBmcm9tRXZlbnQsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBdXRvc3VnZ2VzdEFkZE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vYXV0b3N1Z2dlc3QtYWRkLW9wdGlvbic7XG5pbXBvcnQge1xuICBBdXRvY29tcGxldGVPcHRpb25TZWxlY3Rpb25DaGFuZ2UsXG4gIEF1dG9zdWdnZXN0T3B0aW9uQ29tcG9uZW50LFxufSBmcm9tICcuL2F1dG9zdWdnZXN0LW9wdGlvbi9hdXRvc3VnZ2VzdC1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IEF1dG9zdWdnZXN0UGFuZWxDb21wb25lbnQgfSBmcm9tICcuL2F1dG9zdWdnZXN0LXBhbmVsL2F1dG9zdWdnZXN0LXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJTlBVVF9DT05UQUlORVJfQ0xBU1MgfSBmcm9tICcuLi9mb3JtLWZpZWxkLmNvbnN0YW50JztcbmltcG9ydCB7IEF1dG9zdWdnZXN0T3B0aW9uIH0gZnJvbSAnLi9hdXRvc3VnZ2VzdC1vcHRpb24vYXV0b3N1Z2dlc3Qtb3B0aW9uLm1vZGVsJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbbmR3QXV0b3N1Z2dlc3RdLCB0ZXh0YXJlYVtuZHdBdXRvc3VnZ2VzdF0nLFxuICBleHBvcnRBczogJ25kd0F1dG9zdWdnZXN0VHJpZ2dlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIucm9sZV0nOiAnXCJjb21ib2JveFwiJyxcbiAgICAnW2F0dHIuYXV0b2NvbXBsZXRlXSc6ICdcIm9mZlwiJyxcbiAgICAnW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdJzogJ1wibGlzdFwiJyxcbiAgICAnW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XSc6ICcocGFuZWxPcGVuICYmIGFjdGl2ZU9wdGlvbikgPyBhY3RpdmVPcHRpb24uaWQgOiBudWxsJyxcbiAgICAnW2F0dHIuYXJpYS1leHBhbmRlZF0nOiAncGFuZWxPcGVuLnRvU3RyaW5nKCknLFxuICAgICdbYXR0ci5hcmlhLW93bnNdJzogJyFwYW5lbE9wZW4gPyBudWxsIDogbmR3QXV0b3N1Z2dlc3QoKT8uaWQnLFxuICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdcInRydWVcIicsXG4gICAgJyhmb2N1cyknOiAnaGFuZGxlRm9jdXMoKScsXG4gICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKScsXG4gICAgJyhpbnB1dCknOiAnaGFuZGxlSW5wdXQoJGV2ZW50KScsXG4gICAgJyhrZXlkb3duKSc6ICdoYW5kbGVLZXlkb3duKCRldmVudCknLFxuICAgICcoY2xpY2spJzogJ2hhbmRsZUNsaWNrKCknLFxuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF1dG9zdWdnZXN0RGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9zdWdnZXN0RGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyByZWFkb25seSBuZHdBdXRvc3VnZ2VzdCA9IGlucHV0LnJlcXVpcmVkPEF1dG9zdWdnZXN0UGFuZWxDb21wb25lbnQ+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGZpbHRlciA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBvdmVybGF5QXR0YWNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9ydGFsOiBUZW1wbGF0ZVBvcnRhbCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwcmV2aW91c1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUga2V5ZG93blN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNhbk9wZW5Pbk5leHRGb2N1cyA9IHRydWU7XG4gIHByaXZhdGUgdmFsdWVPbkF0dGFjaDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdmFsdWVPbkxhc3RLZXlkb3duOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZUtleUV2ZW50U3RyZWFtID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50ID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvclJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdwb3J0UnVsZXIgPSBpbmplY3QoVmlld3BvcnRSdWxlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBwdWJsaWMgZ2V0IHBhbmVsT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vdmVybGF5QXR0YWNoZWQgJiYgISF0aGlzLmF1dG9zdWdnZXN0Py5zaG93UGFuZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZU9wdGlvbigpOiBBdXRvc3VnZ2VzdE9wdGlvbkNvbXBvbmVudCB8IEF1dG9zdWdnZXN0QWRkT3B0aW9uQ29tcG9uZW50IHwgbnVsbCB7XG4gICAgY29uc3Qga2V5TWFuYWdlciA9IHRoaXMuYXV0b3N1Z2dlc3Q/LmtleU1hbmFnZXI7XG4gICAgcmV0dXJuIGtleU1hbmFnZXI/LmFjdGl2ZUl0ZW0gPz8gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXV0b3N1Z2dlc3QoKTogQXV0b3N1Z2dlc3RQYW5lbENvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMubmR3QXV0b3N1Z2dlc3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHBhbmVsQ2xvc2luZ0FjdGlvbnMoKTogT2JzZXJ2YWJsZTxBdXRvY29tcGxldGVPcHRpb25TZWxlY3Rpb25DaGFuZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgdGhpcy5vcHRpb25TZWxlY3Rpb25zLFxuICAgICAgdGhpcy5hdXRvc3VnZ2VzdCEua2V5TWFuYWdlciEudGFiT3V0LnBpcGUoZmlsdGVyKCgpID0+IHRoaXMub3ZlcmxheUF0dGFjaGVkKSksXG4gICAgICB0aGlzLmNsb3NlS2V5RXZlbnRTdHJlYW0sXG4gICAgICB0aGlzLmdldE91dHNpZGVDbGlja1N0cmVhbSgpLFxuICAgICAgdGhpcy5vdmVybGF5UmVmXG4gICAgICAgID8gdGhpcy5vdmVybGF5UmVmLmRldGFjaG1lbnRzKCkucGlwZShmaWx0ZXIoKCkgPT4gdGhpcy5vdmVybGF5QXR0YWNoZWQpKVxuICAgICAgICA6IG9mKCksXG4gICAgKS5waXBlKG1hcCgoZXZlbnQpID0+IChldmVudCBpbnN0YW5jZW9mIEF1dG9jb21wbGV0ZU9wdGlvblNlbGVjdGlvbkNoYW5nZSA/IGV2ZW50IDogbnVsbCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uU2VsZWN0aW9uczogT2JzZXJ2YWJsZTxBdXRvY29tcGxldGVPcHRpb25TZWxlY3Rpb25DaGFuZ2U+ID0gZGVmZXIoKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmF1dG9zdWdnZXN0Lml0ZW1zO1xuXG4gICAgaWYgKHRoaXMuYXV0b3N1Z2dlc3QgJiYgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIG1lcmdlKC4uLm9wdGlvbnMubWFwKChvcHRpb24pID0+IG9wdGlvbi5zZWxlY3Rpb25DaGFuZ2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy56b25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMub3B0aW9uU2VsZWN0aW9ucyksXG4gICAgKTtcbiAgfSk7XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCB3aW5kb3cgPSB0aGlzLmdldFdpbmRvdygpO1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMud2luZG93Qmx1ckhhbmRsZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuZ2V0V2luZG93KCk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy53aW5kb3dCbHVySGFuZGxlcik7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmtleWRvd25TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jbG9zZUtleUV2ZW50U3RyZWFtLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kZXN0cm95UGFuZWwoKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuUGFuZWwodmFsdWVPbkF0dGFjaDogc3RyaW5nID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaE92ZXJsYXkodmFsdWVPbkF0dGFjaCk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheUF0dGFjaGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmF1dG9zdWdnZXN0LmNsb3NlZD8uZW1pdCgpO1xuICAgIH1cblxuICAgIHRoaXMuYXV0b3N1Z2dlc3QhLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3ZlcmxheUF0dGFjaGVkID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICB0aGlzLmNsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5rZXlkb3duU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gRGlzcGF0Y2ggYW4gaW5wdXQgZXZlbnQgdG8gdHJpZ2dlciB0aGUgZm9ybS1maWVsZCBjb21wb25lbnQgY2hhbmdlIGRldGVjdGlvbi5cbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnKSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXIuZW1pdCh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSk7XG5cbiAgICBpZiAoIXRoaXMuY2FuT3Blbk9uTmV4dEZvY3VzKSB7XG4gICAgICB0aGlzLmNhbk9wZW5Pbk5leHRGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FuT3BlbigpKSB7XG4gICAgICB0aGlzLnByZXZpb3VzVmFsdWUgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICAgIHRoaXMuYXR0YWNoT3ZlcmxheSh0aGlzLnByZXZpb3VzVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oKCkgPT4gdGhpcy5zZXRUcmlnZ2VyVmFsdWUodmFsdWUgYXMgc3RyaW5nKSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVWYWx1ZSgnJyk7XG4gICAgdGhpcy5vbkNoYW5nZSgnJyk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FuT3BlbigpICYmICF0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5vcGVuUGFuZWwoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGUgPSBldmVudC5jb2RlO1xuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZU9uTGFzdEtleWRvd24gPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZU9wdGlvbiAmJiBjb2RlID09PSAnRW50ZXInICYmIHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmFjdGl2ZU9wdGlvbi5zZWxlY3RWaWFJbnRlcmFjdGlvbigpO1xuICAgICAgdGhpcy5yZXNldEFjdGl2ZUl0ZW0oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmF1dG9zdWdnZXN0KSB7XG4gICAgICBjb25zdCBwcmV2QWN0aXZlSXRlbSA9IHRoaXMuYXV0b3N1Z2dlc3Qua2V5TWFuYWdlcj8uYWN0aXZlSXRlbTtcbiAgICAgIGNvbnN0IGlzQXJyb3dLZXkgPSBjb2RlID09PSAnQXJyb3dVcCcgfHwgY29kZSA9PT0gJ0Fycm93RG93bic7XG5cbiAgICAgIGlmIChjb2RlID09PSAnVGFiJyB8fCAoaXNBcnJvd0tleSAmJiB0aGlzLnBhbmVsT3BlbikpIHtcbiAgICAgICAgdGhpcy5hdXRvc3VnZ2VzdC5rZXlNYW5hZ2VyPy5vbktleWRvd24oZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChpc0Fycm93S2V5ICYmIHRoaXMuY2FuT3BlbigpKSB7XG4gICAgICAgIHRoaXMub3BlblBhbmVsKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Fycm93S2V5IHx8IHRoaXMuYXV0b3N1Z2dlc3Qua2V5TWFuYWdlcj8uYWN0aXZlSXRlbSAhPT0gcHJldkFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb09wdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU9wdGlvbikge1xuICAgICAgICAgIHRoaXMuYXNzaWduT3B0aW9uVmFsdWUodGhpcy5hY3RpdmVPcHRpb24udmFsdWUoKSA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGxldCB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCA9IHRhcmdldC52YWx1ZTtcbiAgICB0aGlzLmZpbHRlci5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLmF1dG9zdWdnZXN0LnNlYXJjaFRlcm0uc2V0KHZhbHVlKTtcblxuICAgIC8vIEJhc2VkIG9uIGBOdW1iZXJWYWx1ZUFjY2Vzc29yYCBmcm9tIGZvcm1zLlxuICAgIGlmICh0YXJnZXQudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgPT09ICcnID8gbnVsbCA6IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByZXZpb3VzVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLnByZXZpb3VzVmFsdWUgPSB2YWx1ZTtcblxuICAgICAgaWYgKCF0aGlzLmF1dG9zdWdnZXN0KSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJQcmV2aW91c1NlbGVjdGVkT3B0aW9uKG51bGwsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jYW5PcGVuKCkgJiYgdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBldmVudC50YXJnZXQpIHtcbiAgICAgICAgY29uc3QgdmFsdWVPbkF0dGFjaCA9IHRoaXMudmFsdWVPbkxhc3RLZXlkb3duID8/IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlT25MYXN0S2V5ZG93biA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlblBhbmVsKHZhbHVlT25BdHRhY2gpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZVBhbmVsS2V5ZG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmIChcbiAgICAgIChldmVudC5rZXkgPT09ICdFc2NhcGUnICYmICFoYXNNb2RpZmllcktleShldmVudCkpIHx8XG4gICAgICAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgaGFzTW9kaWZpZXJLZXkoZXZlbnQsICdhbHRLZXknKSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2xvc2VLZXlFdmVudFN0cmVhbS5uZXh0KCk7XG4gICAgICB0aGlzLnJlc2V0QWN0aXZlSXRlbSgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd0JsdXJIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuY2FuT3Blbk9uTmV4dEZvY3VzID1cbiAgICAgIHRoaXMuZG9jdW1lbnQ/LmFjdGl2ZUVsZW1lbnQgIT09IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50IHx8IHRoaXMucGFuZWxPcGVuO1xuICB9O1xuXG4gIHB1YmxpYyBvbkNoYW5nZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHB1YmxpYyBvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7fTtcblxuICBwcml2YXRlIGRlc3Ryb3lQYW5lbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoT3ZlcmxheSh2YWx1ZU9uQXR0YWNoOiBzdHJpbmcgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hdXRvc3VnZ2VzdCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBvcGVuIGF1dG9zdWdnZXN0IHBhbmVsIGJlY2F1c2UgdGhlIGF1dG9zdWdnZXN0IGlzIG5vdCBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIGxldCBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5UmVmO1xuXG4gICAgaWYgKCFvdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLnBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmF1dG9zdWdnZXN0LnRlbXBsYXRlKCksIHRoaXMudmlld0NvbnRhaW5lclJlZik7XG4gICAgICBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh0aGlzLmdldE92ZXJsYXlDb25maWcoKSk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSBvdmVybGF5UmVmO1xuXG4gICAgICB0aGlzLnZpZXdwb3J0UnVsZXJcbiAgICAgICAgLmNoYW5nZSgpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4gJiYgb3ZlcmxheVJlZikge1xuICAgICAgICAgICAgb3ZlcmxheVJlZi51cGRhdGVTaXplKHsgd2lkdGg6IHRoaXMuZ2V0SG9zdFdpZHRoKCkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5pbml0S2V5ZG93bkV2ZW50cygpO1xuICAgIH1cblxuICAgIGlmIChvdmVybGF5UmVmICYmICFvdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIG92ZXJsYXlSZWYuYXR0YWNoKHRoaXMucG9ydGFsKTtcbiAgICAgIHRoaXMudmFsdWVPbkF0dGFjaCA9IHZhbHVlT25BdHRhY2g7XG4gICAgICB0aGlzLmNsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpYmVUb0Nsb3NpbmdBY3Rpb25zKCk7XG4gICAgICB0aGlzLmtleWRvd25TdWJzY3JpcHRpb24gPSBvdmVybGF5UmVmLmtleWRvd25FdmVudHMoKS5zdWJzY3JpYmUodGhpcy5oYW5kbGVQYW5lbEtleWRvd24pO1xuICAgIH1cblxuICAgIGNvbnN0IHdhc09wZW4gPSB0aGlzLnBhbmVsT3BlbjtcbiAgICB0aGlzLmF1dG9zdWdnZXN0LnNldFZpc2liaWxpdHkoKTtcbiAgICB0aGlzLmF1dG9zdWdnZXN0LmlzT3BlbiA9IHRydWU7XG4gICAgdGhpcy5vdmVybGF5QXR0YWNoZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMucGFuZWxPcGVuICYmIHdhc09wZW4gIT09IHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmF1dG9zdWdnZXN0Lm9wZW5lZC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0S2V5ZG93bkV2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLm92ZXJsYXlSZWY/LmtleWRvd25FdmVudHMoKT8uc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdBcnJvd1VwJyAmJiBldmVudC5hbHRLZXkpIHtcbiAgICAgICAgdGhpcy5yZXNldEFjdGl2ZUl0ZW0oKTtcbiAgICAgICAgdGhpcy5jbG9zZUtleUV2ZW50U3RyZWFtLm5leHQoKTtcblxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldE92ZXJsYXlDb25maWcoKTogT3ZlcmxheUNvbmZpZyB7XG4gICAgcmV0dXJuIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMuZ2V0T3ZlcmxheVBvc2l0aW9uKCksXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpLFxuICAgICAgd2lkdGg6IHRoaXMuZ2V0SG9zdFdpZHRoKCksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEhvc3RXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJpbmRpbmdFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGJpbmRpbmdFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgcGFyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICByZXR1cm4gcGFyZW50RWxlbWVudD8uY2xhc3NMaXN0Py5jb250YWlucyhJTlBVVF9DT05UQUlORVJfQ0xBU1MpID8gcGFyZW50RWxlbWVudCA6IGVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldE92ZXJsYXlQb3NpdGlvbigpOiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IFtcbiAgICAgIG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKFxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdib3R0b20nIH0sXG4gICAgICAgIHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9LFxuICAgICAgKSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheVxuICAgICAgLnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuYmluZGluZ0VsZW1lbnQoKSlcbiAgICAgIC53aXRoUG9zaXRpb25zKHBvc2l0aW9ucylcbiAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgLndpdGhQdXNoKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRBY3RpdmVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUl0ZW1JbmRleCA9IDA7XG5cbiAgICBpZiAodGhpcy5hdXRvc3VnZ2VzdC5rZXlNYW5hZ2VyKSB7XG4gICAgICB0aGlzLmF1dG9zdWdnZXN0LmtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShhY3RpdmVJdGVtSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gIH1cblxuICBwcml2YXRlIGdldE91dHNpZGVDbGlja1N0cmVhbSgpOiBPYnNlcnZhYmxlPEV2ZW50PiB7XG4gICAgcmV0dXJuIG1lcmdlKGZyb21FdmVudCh0aGlzLmRvY3VtZW50LCAnY2xpY2snKSwgZnJvbUV2ZW50KHRoaXMuZG9jdW1lbnQsICd0b3VjaGVuZCcpKS5waXBlKFxuICAgICAgZmlsdGVyKChldmVudDogRXZlbnQpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgY2xpY2tUYXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLm92ZXJsYXlBdHRhY2hlZCAmJlxuICAgICAgICAgIGNsaWNrVGFyZ2V0ICE9PSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCAmJlxuICAgICAgICAgIHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgJiZcbiAgICAgICAgICAhIXRoaXMub3ZlcmxheVJlZiAmJlxuICAgICAgICAgICF0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY29udGFpbnMoY2xpY2tUYXJnZXQpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0Nsb3NpbmdBY3Rpb25zKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmF1dG9zdWdnZXN0IS5pdGVtcztcblxuICAgIGNvbnN0IGZpcnN0U3RhYmxlID0gdGhpcy56b25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZSgxKSk7XG4gICAgY29uc3Qgb3B0aW9uQ2hhbmdlcyA9IGl0ZW1zLmNoYW5nZXMucGlwZShkZWxheSgwKSk7XG5cbiAgICByZXR1cm4gbWVyZ2UoZmlyc3RTdGFibGUsIG9wdGlvbkNoYW5nZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB3YXNPcGVuID0gdGhpcy5wYW5lbE9wZW47XG4gICAgICAgICAgdGhpcy5yZXNldEFjdGl2ZUl0ZW0oKTtcbiAgICAgICAgICB0aGlzLmF1dG9zdWdnZXN0LnNldFZpc2liaWxpdHkoKTtcblxuICAgICAgICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvbigpO1xuXG4gICAgICAgICAgICBpZiAod2FzT3BlbiAhPT0gdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRvc3VnZ2VzdC5vcGVuZWQ/LmVtaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5wYW5lbENsb3NpbmdBY3Rpb25zO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLnNldFZhbHVlQW5kQ2xvc2UoZXZlbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWVBbmRDbG9zZShldmVudDogQXV0b2NvbXBsZXRlT3B0aW9uU2VsZWN0aW9uQ2hhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHRvU2VsZWN0ID0gZXZlbnQgPyBldmVudC5zb3VyY2UgOiBudWxsO1xuXG4gICAgaWYgKHRvU2VsZWN0KSB7XG4gICAgICB0aGlzLmNsZWFyUHJldmlvdXNTZWxlY3RlZE9wdGlvbih0b1NlbGVjdCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRvU2VsZWN0LnZhbHVlKCkpO1xuICAgICAgdGhpcy5hc3NpZ25PcHRpb25WYWx1ZSh0b1NlbGVjdC52YWx1ZSgpID8/IG51bGwpO1xuICAgICAgdGhpcy5hdXRvc3VnZ2VzdC5lbWl0U2VsZWN0RXZlbnQodG9TZWxlY3QpO1xuICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlICE9PSB0aGlzLnZhbHVlT25BdHRhY2gpIHtcbiAgICAgIHRoaXMuY2xlYXJQcmV2aW91c1NlbGVjdGVkT3B0aW9uKG51bGwpO1xuICAgICAgdGhpcy5hc3NpZ25PcHRpb25WYWx1ZShudWxsKTtcbiAgICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gIH1cblxuICBwcml2YXRlIGFzc2lnbk9wdGlvblZhbHVlKHZhbHVlOiBBdXRvc3VnZ2VzdE9wdGlvbiB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCB0b0Rpc3BsYXkgPSB0aGlzLmdldERpc3BsYXlWYWx1ZSh2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgdGhpcy5jbGVhclByZXZpb3VzU2VsZWN0ZWRPcHRpb24obnVsbCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTmF0aXZlSW5wdXRWYWx1ZSh0b0Rpc3BsYXkgPz8gJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VmFsdWUodmFsdWU6IEF1dG9zdWdnZXN0T3B0aW9uIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3BsYXlXaXRoRm4gPSB0aGlzLmF1dG9zdWdnZXN0LmRpc3BsYXlXaXRoKCk7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3N1Z2dlc3QgJiYgZGlzcGxheVdpdGhGbiA/IGRpc3BsYXlXaXRoRm4odmFsdWUpIDogKHZhbHVlIGFzIHN0cmluZyk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU5hdGl2ZUlucHV0VmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9PcHRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmF1dG9zdWdnZXN0LmtleU1hbmFnZXI/LmFjdGl2ZUl0ZW1JbmRleCA/PyAwO1xuXG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICB0aGlzLmF1dG9zdWdnZXN0LnNldFNjcm9sbFRvcCgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3U2Nyb2xsUG9zaXRpb24gPSBpbmRleCAqIDI2O1xuICAgICAgdGhpcy5hdXRvc3VnZ2VzdC5zZXRTY3JvbGxUb3AobmV3U2Nyb2xsUG9zaXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0VHJpZ2dlclZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gdmFsdWUgPz8gJyc7XG5cbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IGlucHV0VmFsdWU7XG4gICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gaW5wdXRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJQcmV2aW91c1NlbGVjdGVkT3B0aW9uKFxuICAgIHNraXA6IEF1dG9zdWdnZXN0T3B0aW9uQ29tcG9uZW50IHwgQXV0b3N1Z2dlc3RBZGRPcHRpb25Db21wb25lbnQgfCBudWxsLFxuICAgIGVtaXRFdmVudD86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XG4gICAgdGhpcy5hdXRvc3VnZ2VzdC5pdGVtcz8uZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAob3B0aW9uICE9PSBza2lwICYmIG9wdGlvbi5zZWxlY3RlZCkge1xuICAgICAgICBvcHRpb24uZGVzZWxlY3QoZW1pdEV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuT3BlbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuICFlbGVtZW50LnJlYWRPbmx5ICYmICFlbGVtZW50LmRpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXaW5kb3coKTogV2luZG93IHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudD8uZGVmYXVsdFZpZXcgPz8gd2luZG93O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ export * from './autosuggest.directive';
2
+ export * from './autosuggest-option/autosuggest-option.model';
3
+ export * from './autosuggest-option/autosuggest-option.component';
4
+ export * from './autosuggest-panel/autosuggest-panel.component';
5
+ export * from './autosuggest-add-option/autosuggest-add-option.component';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZHcvc3JjL2NvbXBvbmVudHMvZm9ybS1maWVsZC9hdXRvc3VnZ2VzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLGlEQUFpRCxDQUFDO0FBQ2hFLGNBQWMsMkRBQTJELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2F1dG9zdWdnZXN0LmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2F1dG9zdWdnZXN0LW9wdGlvbi9hdXRvc3VnZ2VzdC1vcHRpb24ubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9hdXRvc3VnZ2VzdC1vcHRpb24vYXV0b3N1Z2dlc3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2F1dG9zdWdnZXN0LXBhbmVsL2F1dG9zdWdnZXN0LXBhbmVsLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2F1dG9zdWdnZXN0LWFkZC1vcHRpb24vYXV0b3N1Z2dlc3QtYWRkLW9wdGlvbi5jb21wb25lbnQnO1xuIl19