@acpaas-ui/ngx-forms 6.1.8 → 6.1.10

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 (178) hide show
  1. package/.eslintrc.json +42 -0
  2. package/LICENSE.md +21 -0
  3. package/dist/README.md +23 -0
  4. package/dist/esm2020/lib/auto-complete/auto-complete.module.mjs +23 -0
  5. package/dist/esm2020/lib/auto-complete/components/auto-complete/auto-complete.component.mjs +265 -0
  6. package/dist/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +232 -0
  7. package/dist/esm2020/lib/datepicker/datepicker.module.mjs +54 -0
  8. package/dist/esm2020/lib/range-slider/components/range-slider/range-slider.component.mjs +297 -0
  9. package/dist/esm2020/lib/range-slider/range-slider.module.mjs +19 -0
  10. package/dist/esm2020/lib/search-filter/components/search-filter/search-filter.component.mjs +149 -0
  11. package/dist/esm2020/lib/search-filter/search-filter.module.mjs +21 -0
  12. package/{esm2020 → dist/esm2020}/lib/shared/services/search.service.mjs +6 -6
  13. package/dist/esm2020/lib/timepicker/components/timepicker/timepicker.component.mjs +130 -0
  14. package/dist/esm2020/lib/timepicker/timepicker.module.mjs +21 -0
  15. package/dist/esm2020/lib/upload/components/upload/upload.component.mjs +69 -0
  16. package/dist/esm2020/lib/upload/components/upload-input/upload-input.component.mjs +39 -0
  17. package/dist/esm2020/lib/upload/components/upload-queue/upload-queue.component.mjs +42 -0
  18. package/dist/esm2020/lib/upload/components/upload-zone/upload-zone.component.mjs +143 -0
  19. package/dist/esm2020/lib/upload/components/validation-list/validation-list.component.mjs +33 -0
  20. package/dist/esm2020/lib/upload/services/validation-messages.service.mjs +29 -0
  21. package/dist/esm2020/lib/upload/upload.module.mjs +44 -0
  22. package/{fesm2015 → dist/fesm2015}/acpaas-ui-ngx-forms.mjs +141 -994
  23. package/dist/fesm2015/acpaas-ui-ngx-forms.mjs.map +1 -0
  24. package/dist/fesm2020/acpaas-ui-ngx-forms.mjs +1727 -0
  25. package/dist/fesm2020/acpaas-ui-ngx-forms.mjs.map +1 -0
  26. package/dist/package.json +44 -0
  27. package/karma.conf.js +38 -0
  28. package/ng-package.json +8 -0
  29. package/package.json +6 -30
  30. package/src/lib/auto-complete/README.md +148 -0
  31. package/src/lib/auto-complete/auto-complete.module.ts +15 -0
  32. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.html +51 -0
  33. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.scss +4 -0
  34. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.spec.ts +378 -0
  35. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.ts +281 -0
  36. package/src/lib/auto-complete/public-api.ts +2 -0
  37. package/src/lib/datepicker/README.md +110 -0
  38. package/src/lib/datepicker/components/datepicker/datepicker.component.html +47 -0
  39. package/src/lib/datepicker/components/datepicker/datepicker.component.scss +13 -0
  40. package/src/lib/datepicker/components/datepicker/datepicker.component.spec.ts +204 -0
  41. package/src/lib/datepicker/components/datepicker/datepicker.component.ts +251 -0
  42. package/src/lib/datepicker/datepicker.conf.ts +11 -0
  43. package/src/lib/datepicker/datepicker.module.ts +50 -0
  44. package/src/lib/datepicker/public-api.ts +8 -0
  45. package/src/lib/datepicker/types/datepicker.types.ts +8 -0
  46. package/src/lib/range-slider/README.md +56 -0
  47. package/src/lib/range-slider/components/range-slider/range-slider.component.html +46 -0
  48. package/src/lib/range-slider/components/range-slider/range-slider.component.scss +12 -0
  49. package/src/lib/range-slider/components/range-slider/range-slider.component.spec.ts +216 -0
  50. package/src/lib/range-slider/components/range-slider/range-slider.component.ts +301 -0
  51. package/src/lib/range-slider/public-api.ts +3 -0
  52. package/src/lib/range-slider/range-slider.module.ts +11 -0
  53. package/src/lib/range-slider/types/range-slider.types.ts +4 -0
  54. package/src/lib/search-filter/README.md +86 -0
  55. package/src/lib/search-filter/components/search-filter/search-filter.component.html +66 -0
  56. package/src/lib/search-filter/components/search-filter/search-filter.component.scss +23 -0
  57. package/src/lib/search-filter/components/search-filter/search-filter.component.spec.ts +264 -0
  58. package/src/lib/search-filter/components/search-filter/search-filter.component.ts +140 -0
  59. package/src/lib/search-filter/public-api.ts +3 -0
  60. package/src/lib/search-filter/search-filter.module.ts +13 -0
  61. package/src/lib/search-filter/types/search-filter.types.ts +4 -0
  62. package/src/lib/shared/services/search.service.spec.ts +78 -0
  63. package/src/lib/shared/services/search.service.ts +32 -0
  64. package/src/lib/shared/types/search.types.ts +6 -0
  65. package/src/lib/timepicker/README.md +84 -0
  66. package/src/lib/timepicker/classes/timepicker.validators.spec.ts +54 -0
  67. package/src/lib/timepicker/classes/timepicker.validators.ts +61 -0
  68. package/src/lib/timepicker/components/timepicker/timepicker.component.html +37 -0
  69. package/src/lib/timepicker/components/timepicker/timepicker.component.scss +3 -0
  70. package/src/lib/timepicker/components/timepicker/timepicker.component.spec.ts +161 -0
  71. package/src/lib/timepicker/components/timepicker/timepicker.component.ts +128 -0
  72. package/src/lib/timepicker/public-api.ts +4 -0
  73. package/src/lib/timepicker/timepicker.module.ts +13 -0
  74. package/src/lib/timepicker/types/timepicker.types.ts +5 -0
  75. package/src/lib/upload/README.md +283 -0
  76. package/src/lib/upload/classes/uploader.class.spec.ts +100 -0
  77. package/src/lib/upload/classes/uploader.class.ts +144 -0
  78. package/src/lib/upload/components/upload/upload.component.html +28 -0
  79. package/src/lib/upload/components/upload/upload.component.scss +3 -0
  80. package/src/lib/upload/components/upload/upload.component.spec.ts +117 -0
  81. package/src/lib/upload/components/upload/upload.component.ts +50 -0
  82. package/src/lib/upload/components/upload-input/upload-input.component.html +11 -0
  83. package/src/lib/upload/components/upload-input/upload-input.component.spec.ts +55 -0
  84. package/src/lib/upload/components/upload-input/upload-input.component.ts +35 -0
  85. package/src/lib/upload/components/upload-queue/upload-queue.component.html +16 -0
  86. package/src/lib/upload/components/upload-queue/upload-queue.component.spec.ts +99 -0
  87. package/src/lib/upload/components/upload-queue/upload-queue.component.ts +36 -0
  88. package/src/lib/upload/components/upload-zone/upload-zone.component.html +55 -0
  89. package/src/lib/upload/components/upload-zone/upload-zone.component.scss +3 -0
  90. package/src/lib/upload/components/upload-zone/upload-zone.component.spec.ts +144 -0
  91. package/src/lib/upload/components/upload-zone/upload-zone.component.ts +142 -0
  92. package/src/lib/upload/components/validation-list/validation-list.component.html +15 -0
  93. package/src/lib/upload/components/validation-list/validation-list.component.spec.ts +57 -0
  94. package/src/lib/upload/components/validation-list/validation-list.component.ts +29 -0
  95. package/src/lib/upload/public-api.ts +10 -0
  96. package/src/lib/upload/services/validation-messages.service.spec.ts +66 -0
  97. package/src/lib/upload/services/validation-messages.service.ts +27 -0
  98. package/src/lib/upload/types/upload.types.ts +20 -0
  99. package/src/lib/upload/upload.conf.ts +15 -0
  100. package/src/lib/upload/upload.module.ts +34 -0
  101. package/src/public-api.ts +6 -0
  102. package/src/test.ts +9 -0
  103. package/tsconfig.lib.json +26 -0
  104. package/tsconfig.spec.json +17 -0
  105. package/esm2020/lib/auto-complete/auto-complete.module.mjs +0 -24
  106. package/esm2020/lib/auto-complete/components/auto-complete/auto-complete.component.mjs +0 -347
  107. package/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +0 -308
  108. package/esm2020/lib/datepicker/datepicker.module.mjs +0 -55
  109. package/esm2020/lib/range-slider/components/range-slider/range-slider.component.mjs +0 -349
  110. package/esm2020/lib/range-slider/range-slider.module.mjs +0 -20
  111. package/esm2020/lib/search-filter/components/search-filter/search-filter.component.mjs +0 -266
  112. package/esm2020/lib/search-filter/search-filter.module.mjs +0 -22
  113. package/esm2020/lib/timepicker/components/timepicker/timepicker.component.mjs +0 -243
  114. package/esm2020/lib/timepicker/timepicker.module.mjs +0 -22
  115. package/esm2020/lib/upload/components/upload/upload.component.mjs +0 -97
  116. package/esm2020/lib/upload/components/upload-input/upload-input.component.mjs +0 -56
  117. package/esm2020/lib/upload/components/upload-queue/upload-queue.component.mjs +0 -78
  118. package/esm2020/lib/upload/components/upload-zone/upload-zone.component.mjs +0 -252
  119. package/esm2020/lib/upload/components/validation-list/validation-list.component.mjs +0 -64
  120. package/esm2020/lib/upload/services/validation-messages.service.mjs +0 -29
  121. package/esm2020/lib/upload/upload.module.mjs +0 -45
  122. package/fesm2015/acpaas-ui-ngx-forms.mjs.map +0 -1
  123. package/fesm2020/acpaas-ui-ngx-forms.mjs +0 -2394
  124. package/fesm2020/acpaas-ui-ngx-forms.mjs.map +0 -1
  125. /package/{esm2020 → dist/esm2020}/acpaas-ui-ngx-forms.mjs +0 -0
  126. /package/{esm2020 → dist/esm2020}/lib/auto-complete/public-api.mjs +0 -0
  127. /package/{esm2020 → dist/esm2020}/lib/datepicker/datepicker.conf.mjs +0 -0
  128. /package/{esm2020 → dist/esm2020}/lib/datepicker/public-api.mjs +0 -0
  129. /package/{esm2020 → dist/esm2020}/lib/datepicker/types/datepicker.types.mjs +0 -0
  130. /package/{esm2020 → dist/esm2020}/lib/range-slider/public-api.mjs +0 -0
  131. /package/{esm2020 → dist/esm2020}/lib/range-slider/types/range-slider.types.mjs +0 -0
  132. /package/{esm2020 → dist/esm2020}/lib/search-filter/public-api.mjs +0 -0
  133. /package/{esm2020 → dist/esm2020}/lib/search-filter/types/search-filter.types.mjs +0 -0
  134. /package/{esm2020 → dist/esm2020}/lib/shared/types/search.types.mjs +0 -0
  135. /package/{esm2020 → dist/esm2020}/lib/timepicker/classes/timepicker.validators.mjs +0 -0
  136. /package/{esm2020 → dist/esm2020}/lib/timepicker/public-api.mjs +0 -0
  137. /package/{esm2020 → dist/esm2020}/lib/timepicker/types/timepicker.types.mjs +0 -0
  138. /package/{esm2020 → dist/esm2020}/lib/upload/classes/uploader.class.mjs +0 -0
  139. /package/{esm2020 → dist/esm2020}/lib/upload/public-api.mjs +0 -0
  140. /package/{esm2020 → dist/esm2020}/lib/upload/types/upload.types.mjs +0 -0
  141. /package/{esm2020 → dist/esm2020}/lib/upload/upload.conf.mjs +0 -0
  142. /package/{esm2020 → dist/esm2020}/public-api.mjs +0 -0
  143. /package/{index.d.ts → dist/index.d.ts} +0 -0
  144. /package/{lib → dist/lib}/auto-complete/auto-complete.module.d.ts +0 -0
  145. /package/{lib → dist/lib}/auto-complete/components/auto-complete/auto-complete.component.d.ts +0 -0
  146. /package/{lib → dist/lib}/auto-complete/public-api.d.ts +0 -0
  147. /package/{lib → dist/lib}/datepicker/components/datepicker/datepicker.component.d.ts +0 -0
  148. /package/{lib → dist/lib}/datepicker/datepicker.conf.d.ts +0 -0
  149. /package/{lib → dist/lib}/datepicker/datepicker.module.d.ts +0 -0
  150. /package/{lib → dist/lib}/datepicker/public-api.d.ts +0 -0
  151. /package/{lib → dist/lib}/datepicker/types/datepicker.types.d.ts +0 -0
  152. /package/{lib → dist/lib}/range-slider/components/range-slider/range-slider.component.d.ts +0 -0
  153. /package/{lib → dist/lib}/range-slider/public-api.d.ts +0 -0
  154. /package/{lib → dist/lib}/range-slider/range-slider.module.d.ts +0 -0
  155. /package/{lib → dist/lib}/range-slider/types/range-slider.types.d.ts +0 -0
  156. /package/{lib → dist/lib}/search-filter/components/search-filter/search-filter.component.d.ts +0 -0
  157. /package/{lib → dist/lib}/search-filter/public-api.d.ts +0 -0
  158. /package/{lib → dist/lib}/search-filter/search-filter.module.d.ts +0 -0
  159. /package/{lib → dist/lib}/search-filter/types/search-filter.types.d.ts +0 -0
  160. /package/{lib → dist/lib}/shared/services/search.service.d.ts +0 -0
  161. /package/{lib → dist/lib}/shared/types/search.types.d.ts +0 -0
  162. /package/{lib → dist/lib}/timepicker/classes/timepicker.validators.d.ts +0 -0
  163. /package/{lib → dist/lib}/timepicker/components/timepicker/timepicker.component.d.ts +0 -0
  164. /package/{lib → dist/lib}/timepicker/public-api.d.ts +0 -0
  165. /package/{lib → dist/lib}/timepicker/timepicker.module.d.ts +0 -0
  166. /package/{lib → dist/lib}/timepicker/types/timepicker.types.d.ts +0 -0
  167. /package/{lib → dist/lib}/upload/classes/uploader.class.d.ts +0 -0
  168. /package/{lib → dist/lib}/upload/components/upload/upload.component.d.ts +0 -0
  169. /package/{lib → dist/lib}/upload/components/upload-input/upload-input.component.d.ts +0 -0
  170. /package/{lib → dist/lib}/upload/components/upload-queue/upload-queue.component.d.ts +0 -0
  171. /package/{lib → dist/lib}/upload/components/upload-zone/upload-zone.component.d.ts +0 -0
  172. /package/{lib → dist/lib}/upload/components/validation-list/validation-list.component.d.ts +0 -0
  173. /package/{lib → dist/lib}/upload/public-api.d.ts +0 -0
  174. /package/{lib → dist/lib}/upload/services/validation-messages.service.d.ts +0 -0
  175. /package/{lib → dist/lib}/upload/types/upload.types.d.ts +0 -0
  176. /package/{lib → dist/lib}/upload/upload.conf.d.ts +0 -0
  177. /package/{lib → dist/lib}/upload/upload.module.d.ts +0 -0
  178. /package/{public-api.d.ts → dist/public-api.d.ts} +0 -0
@@ -1,347 +0,0 @@
1
- import { Component, ContentChild, EventEmitter, forwardRef, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { get, isEqual } from 'lodash-es';
4
- import { FlyoutDirective, FlyoutZoneDirective } from '@acpaas-ui/ngx-flyout';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../../shared/services/search.service";
7
- import * as i2 from "@angular/common";
8
- import * as i3 from "@angular/forms";
9
- import * as i4 from "@acpaas-ui/ngx-flyout";
10
- import * as i5 from "@acpaas-ui/ngx-selectable-list";
11
- function AutoCompleteComponent_div_2_span_1_Template(rf, ctx) { if (rf & 1) {
12
- i0.ɵɵelementStart(0, "span", 7);
13
- i0.ɵɵelement(1, "span", 8);
14
- i0.ɵɵelementStart(2, "span", 9);
15
- i0.ɵɵtext(3);
16
- i0.ɵɵelementEnd()();
17
- } if (rf & 2) {
18
- const ctx_r1 = i0.ɵɵnextContext(2);
19
- i0.ɵɵadvance(3);
20
- i0.ɵɵtextInterpolate(ctx_r1.loadingText);
21
- } }
22
- function AutoCompleteComponent_div_2_span_2_Template(rf, ctx) { if (rf & 1) {
23
- i0.ɵɵelementStart(0, "span", 10);
24
- i0.ɵɵtext(1);
25
- i0.ɵɵelementEnd();
26
- } if (rf & 2) {
27
- const ctx_r2 = i0.ɵɵnextContext(2);
28
- i0.ɵɵadvance(1);
29
- i0.ɵɵtextInterpolate(ctx_r2.searchIncentiveText);
30
- } }
31
- function AutoCompleteComponent_div_2_span_3_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelementStart(0, "span", 10);
33
- i0.ɵɵtext(1);
34
- i0.ɵɵelementEnd();
35
- } if (rf & 2) {
36
- const ctx_r3 = i0.ɵɵnextContext(2);
37
- i0.ɵɵadvance(1);
38
- i0.ɵɵtextInterpolate(ctx_r3.noResultsText);
39
- } }
40
- function AutoCompleteComponent_div_2_aui_selectable_list_4_Template(rf, ctx) { if (rf & 1) {
41
- const _r6 = i0.ɵɵgetCurrentView();
42
- i0.ɵɵelementStart(0, "aui-selectable-list", 11);
43
- i0.ɵɵlistener("selected", function AutoCompleteComponent_div_2_aui_selectable_list_4_Template_aui_selectable_list_selected_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r5 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r5.onSelect($event)); });
44
- i0.ɵɵelementEnd();
45
- } if (rf & 2) {
46
- const ctx_r4 = i0.ɵɵnextContext(2);
47
- i0.ɵɵproperty("index", ctx_r4.index)("itemTemplate", ctx_r4.template)("items", ctx_r4.results)("label", ctx_r4.label)("search", ctx_r4.query);
48
- } }
49
- function AutoCompleteComponent_div_2_Template(rf, ctx) { if (rf & 1) {
50
- i0.ɵɵelementStart(0, "div", 3);
51
- i0.ɵɵtemplate(1, AutoCompleteComponent_div_2_span_1_Template, 4, 1, "span", 4);
52
- i0.ɵɵtemplate(2, AutoCompleteComponent_div_2_span_2_Template, 2, 1, "span", 5);
53
- i0.ɵɵtemplate(3, AutoCompleteComponent_div_2_span_3_Template, 2, 1, "span", 5);
54
- i0.ɵɵtemplate(4, AutoCompleteComponent_div_2_aui_selectable_list_4_Template, 1, 5, "aui-selectable-list", 6);
55
- i0.ɵɵelementEnd();
56
- } if (rf & 2) {
57
- const ctx_r0 = i0.ɵɵnextContext();
58
- i0.ɵɵadvance(1);
59
- i0.ɵɵproperty("ngIf", ctx_r0.focused && ctx_r0.loadingText && ctx_r0.searching);
60
- i0.ɵɵadvance(1);
61
- i0.ɵɵproperty("ngIf", ctx_r0.focused && ctx_r0.searchIncentiveText && !ctx_r0.searching && !ctx_r0.query && !ctx_r0.results.length);
62
- i0.ɵɵadvance(1);
63
- i0.ɵɵproperty("ngIf", ctx_r0.focused && ctx_r0.noResultsText && !ctx_r0.searching && ctx_r0.query && !ctx_r0.results.length);
64
- i0.ɵɵadvance(1);
65
- i0.ɵɵproperty("ngIf", ctx_r0.results.length > 0 && !(ctx_r0.focused && ctx_r0.loadingText && ctx_r0.searching));
66
- } }
67
- export class AutoCompleteComponent {
68
- constructor(ref, searchService) {
69
- this.ref = ref;
70
- this.searchService = searchService;
71
- this.results = []; // The values for the selectable list
72
- this.data = []; // The values to search in when remote search is disabled
73
- this.remote = false; // Disable or enamble remote search
74
- this.minCharacters = 0;
75
- this.clearInvalid = false;
76
- this.showAllByDefault = false;
77
- this.autoComplete = 'off';
78
- // Eventemitter for searchvalue (parent object should update the results with this param)
79
- this.search = new EventEmitter();
80
- // eslint-disable-next-line @angular-eslint/no-output-native
81
- this.select = new EventEmitter();
82
- this.query = '';
83
- this.index = -1; // index for active element in selectable list, by default -1 (so it starts in the input field)
84
- this.selectedItem = null; // keep a backup of the selectedItem
85
- this.searching = false; // track remote search state
86
- this.focused = false;
87
- this.isDisabled = false;
88
- this.remoteValue = false;
89
- this.updateModel = (_) => { };
90
- }
91
- // CONTROL_VALUE_ACCESSOR interface
92
- writeValue(value = '') {
93
- if (this.value) {
94
- const selected = this.data.find((item) => item[this.value] === value);
95
- if (selected) {
96
- return (this.query = selected[this.label]);
97
- }
98
- if (this.remote && !!value) {
99
- this.remoteValue = true;
100
- }
101
- }
102
- this.query = value;
103
- }
104
- // CONTROL_VALUE_ACCESSOR interface
105
- registerOnChange(fn) {
106
- this.updateModel = fn;
107
- }
108
- // CONTROL_VALUE_ACCESSOR interface
109
- registerOnTouched() { }
110
- setDisabledState(isDisabled) {
111
- this.isDisabled = isDisabled;
112
- }
113
- ngOnInit() {
114
- if (Array.isArray(this.data) && this.data.length > 0 && !this.query && this.showAllByDefault) {
115
- this.results = [...this.data];
116
- }
117
- }
118
- // OnChanges interface
119
- ngOnChanges(changes) {
120
- if (!changes) {
121
- return;
122
- }
123
- const newData = get(changes, 'data.currentValue', []);
124
- if (!isEqual(newData, get(changes, 'data.previousValue', []))) {
125
- if (this.remote) {
126
- this.remoteSearch();
127
- }
128
- else {
129
- this.localSearch();
130
- }
131
- }
132
- if (changes.results && changes.results.currentValue) {
133
- this.searching = false;
134
- }
135
- }
136
- propagateChange(item) {
137
- this.query = item !== null ? (this.label ? item[this.label] : item) : '';
138
- this.select.emit(item);
139
- if (!item) {
140
- return;
141
- }
142
- const key = this.value ? this.value : this.label ? this.label : null;
143
- this.updateModel(key ? item[key] || '' : item);
144
- this.selectedItem = item;
145
- }
146
- /**
147
- * triggers on input value change
148
- */
149
- doSearch() {
150
- this.index = -1; // reset index
151
- this.searching = true;
152
- if (this.remote) {
153
- this.search.emit(this.query); // ask for new remote data
154
- }
155
- else {
156
- this.localSearch();
157
- }
158
- this.openFlyout(); // open the flyout when there is a change
159
- }
160
- /**
161
- * triggers on selectable-list:select -> onClick event in selectable-list
162
- */
163
- onSelect(item) {
164
- this.propagateChange(item);
165
- this.closeFlyout(); // Close the flyout manually
166
- }
167
- onFlyoutClosed() {
168
- // there is only 1 result, select it
169
- if (this.index >= 0 && this.results.length === 1) {
170
- return this.onSelect(this.results[0]);
171
- }
172
- // there is no query nor selected item, clear the selected item
173
- if (!this.query && this.index < 0) {
174
- return this.onSelect(null);
175
- }
176
- // reset the query for an invalid query if clearInvalid is true
177
- if (this.clearInvalid && this.query && !this.results.length && this.index < 0) {
178
- this.query = this.selectedItem ? (this.label ? this.selectedItem[this.label] : this.selectedItem) : '';
179
- }
180
- }
181
- onKeyArrowDown() {
182
- if (this.index < this.results.length - 1) {
183
- this.scrollList(1);
184
- }
185
- this.openFlyout();
186
- }
187
- onKeyArrowUp() {
188
- if (this.index >= 0) {
189
- this.scrollList(-1);
190
- }
191
- }
192
- onKeyEnter(event) {
193
- event.preventDefault(); // Do not submit form when selecting an item.
194
- const query = this.index >= 0 ? this.results[this.index] : this.query;
195
- this.propagateChange(query);
196
- this.closeFlyout();
197
- }
198
- onKeyEscape() {
199
- this.closeFlyout();
200
- }
201
- onFocus() {
202
- this.focused = true;
203
- this.openFlyout();
204
- }
205
- openFlyout() {
206
- if (this.flyout) {
207
- this.flyout.open();
208
- }
209
- }
210
- closeFlyout() {
211
- if (this.flyout) {
212
- this.flyout.close();
213
- }
214
- this.focused = false;
215
- }
216
- localSearch() {
217
- this.results = this.searchService.search(this.data, {
218
- minLength: this.minCharacters,
219
- key: this.label,
220
- query: this.query,
221
- showAllByDefault: this.showAllByDefault,
222
- });
223
- if (this.results.length === 1 && this.query === this.results[0][this.label]) {
224
- this.index = 0;
225
- }
226
- this.searching = false;
227
- }
228
- remoteSearch() {
229
- if (!this.remoteValue || !this.data) {
230
- return;
231
- }
232
- const selected = this.data.find((item) => {
233
- if (this.value) {
234
- return item[this.value] === this.query;
235
- }
236
- return item === this.query;
237
- });
238
- if (selected) {
239
- this.query = this.label ? selected[this.label] : selected;
240
- }
241
- else {
242
- this.query = '';
243
- }
244
- this.remoteValue = false;
245
- }
246
- scrollList(factor) {
247
- this.index += factor;
248
- if (!this.flyoutZone) {
249
- return;
250
- }
251
- const liItems = this.flyoutZone.element.getElementsByTagName('li');
252
- const liHeight = liItems[1] ? liItems[1].offsetHeight : liItems[0].offsetHeight;
253
- const zoneHeight = this.flyoutZone.element.offsetHeight;
254
- const offset = zoneHeight / liHeight / 2;
255
- this.flyoutZone.element.scrollTop = this.index * liHeight - offset * liHeight;
256
- }
257
- }
258
- /** @nocollapse */ AutoCompleteComponent.ɵfac = function AutoCompleteComponent_Factory(t) { return new (t || AutoCompleteComponent)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.SearchService)); };
259
- /** @nocollapse */ AutoCompleteComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: AutoCompleteComponent, selectors: [["aui-auto-complete"]], contentQueries: function AutoCompleteComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
260
- i0.ɵɵcontentQuery(dirIndex, TemplateRef, 7);
261
- } if (rf & 2) {
262
- let _t;
263
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.template = _t.first);
264
- } }, viewQuery: function AutoCompleteComponent_Query(rf, ctx) { if (rf & 1) {
265
- i0.ɵɵviewQuery(FlyoutDirective, 7);
266
- i0.ɵɵviewQuery(FlyoutZoneDirective, 7);
267
- } if (rf & 2) {
268
- let _t;
269
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.flyout = _t.first);
270
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.flyoutZone = _t.first);
271
- } }, inputs: { id: "id", placeholder: "placeholder", description: "description", inputLabel: "inputLabel", results: "results", data: "data", remote: "remote", minCharacters: "minCharacters", clearInvalid: "clearInvalid", searchIncentiveText: "searchIncentiveText", loadingText: "loadingText", noResultsText: "noResultsText", showAllByDefault: "showAllByDefault", autoComplete: "autoComplete", label: "label", value: "value" }, outputs: { search: "search", select: "select" }, features: [i0.ɵɵProvidersFeature([
272
- {
273
- provide: NG_VALUE_ACCESSOR,
274
- useExisting: forwardRef((() => AutoCompleteComponent)),
275
- multi: true,
276
- },
277
- ]), i0.ɵɵNgOnChangesFeature], decls: 3, vars: 7, consts: [["aria-haspopup", "listbox", "auiFlyout", "", 1, "m-flyout", "m-flyout--scrollable", "m-flyout--full", "o-auto-complete", 3, "toggleClick", "closed"], ["aria-autocomplete", "list", "auiFlyoutAction", "", "auiSelectableActions", "", "type", "text", 1, "a-input", 3, "ngModel", "disabled", "id", "placeholder", "autocomplete", "focus", "keyArrowDown", "keyArrowUp", "keyEnter", "keyEscape", "ngModelChange"], ["auiFlyoutZone", "", 4, "ngIf"], ["auiFlyoutZone", ""], ["class", "a-spinner a-spinner--s u-margin-xs", "role", "alert", 4, "ngIf"], ["class", "o-auto-complete__info u-text-light u-margin-xs", 4, "ngIf"], [3, "index", "itemTemplate", "items", "label", "search", "selected", 4, "ngIf"], ["role", "alert", 1, "a-spinner", "a-spinner--s", "u-margin-xs"], [1, "a-spinner__circle"], [1, "a-spinner__text"], [1, "o-auto-complete__info", "u-text-light", "u-margin-xs"], [3, "index", "itemTemplate", "items", "label", "search", "selected"]], template: function AutoCompleteComponent_Template(rf, ctx) { if (rf & 1) {
278
- i0.ɵɵelementStart(0, "div", 0);
279
- i0.ɵɵlistener("closed", function AutoCompleteComponent_Template_div_closed_0_listener() { return ctx.onFlyoutClosed(); });
280
- i0.ɵɵelementStart(1, "input", 1);
281
- i0.ɵɵlistener("focus", function AutoCompleteComponent_Template_input_focus_1_listener() { return ctx.onFocus(); })("keyArrowDown", function AutoCompleteComponent_Template_input_keyArrowDown_1_listener() { return ctx.onKeyArrowDown(); })("keyArrowUp", function AutoCompleteComponent_Template_input_keyArrowUp_1_listener() { return ctx.onKeyArrowUp(); })("keyEnter", function AutoCompleteComponent_Template_input_keyEnter_1_listener($event) { return ctx.onKeyEnter($event); })("keyEscape", function AutoCompleteComponent_Template_input_keyEscape_1_listener() { return ctx.onKeyEscape(); })("ngModelChange", function AutoCompleteComponent_Template_input_ngModelChange_1_listener($event) { return ctx.query = $event; })("ngModelChange", function AutoCompleteComponent_Template_input_ngModelChange_1_listener() { return ctx.doSearch(); });
282
- i0.ɵɵelementEnd();
283
- i0.ɵɵtemplate(2, AutoCompleteComponent_div_2_Template, 5, 4, "div", 2);
284
- i0.ɵɵelementEnd();
285
- } if (rf & 2) {
286
- i0.ɵɵproperty("toggleClick", false);
287
- i0.ɵɵadvance(1);
288
- i0.ɵɵproperty("ngModel", ctx.query)("disabled", ctx.isDisabled ? true : null)("id", ctx.id)("placeholder", ctx.placeholder)("autocomplete", ctx.autoComplete);
289
- i0.ɵɵadvance(1);
290
- i0.ɵɵproperty("ngIf", !ctx.isDisabled);
291
- } }, dependencies: [i2.NgIf, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.FlyoutActionDirective, i4.FlyoutZoneDirective, i4.FlyoutDirective, i5.SelectableListComponent, i5.SelectableActionsDirective], styles: [".o-auto-complete[_ngcontent-%COMP%], .o-auto-complete__info[_ngcontent-%COMP%]{display:block}"] });
292
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AutoCompleteComponent, [{
293
- type: Component,
294
- args: [{ selector: 'aui-auto-complete', providers: [
295
- {
296
- provide: NG_VALUE_ACCESSOR,
297
- useExisting: forwardRef((() => AutoCompleteComponent)),
298
- multi: true,
299
- },
300
- ], template: "<div\n (closed)=\"onFlyoutClosed()\"\n [toggleClick]=\"false\"\n aria-haspopup=\"listbox\"\n auiFlyout\n class=\"m-flyout m-flyout--scrollable m-flyout--full o-auto-complete\"\n>\n <input\n (focus)=\"onFocus()\"\n (keyArrowDown)=\"onKeyArrowDown()\"\n (keyArrowUp)=\"onKeyArrowUp()\"\n (keyEnter)=\"onKeyEnter($event)\"\n (keyEscape)=\"onKeyEscape()\"\n [(ngModel)]=\"query\"\n (ngModelChange)=\"doSearch()\"\n [disabled]=\"isDisabled ? true : null\"\n [id]=\"id\"\n [placeholder]=\"placeholder\"\n aria-autocomplete=\"list\"\n auiFlyoutAction\n auiSelectableActions\n [autocomplete]=\"autoComplete\"\n type=\"text\"\n class=\"a-input\"\n />\n <div *ngIf=\"!isDisabled\" auiFlyoutZone>\n <span *ngIf=\"focused && loadingText && searching\" class=\"a-spinner a-spinner--s u-margin-xs\" role=\"alert\">\n <span class=\"a-spinner__circle\"></span>\n <span class=\"a-spinner__text\">{{ loadingText }}</span>\n </span>\n <span\n *ngIf=\"focused && searchIncentiveText && !searching && !query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ searchIncentiveText }}</span\n >\n <span\n *ngIf=\"focused && noResultsText && !searching && query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ noResultsText }}</span\n >\n <aui-selectable-list\n (selected)=\"onSelect($event)\"\n *ngIf=\"results.length > 0 && !(focused && loadingText && searching)\"\n [index]=\"index\"\n [itemTemplate]=\"template\"\n [items]=\"results\"\n [label]=\"label\"\n [search]=\"query\"\n ></aui-selectable-list>\n </div>\n</div>\n", styles: [".o-auto-complete,.o-auto-complete__info{display:block}\n"] }]
301
- }], function () { return [{ type: i0.ElementRef }, { type: i1.SearchService }]; }, { id: [{
302
- type: Input
303
- }], placeholder: [{
304
- type: Input
305
- }], description: [{
306
- type: Input
307
- }], inputLabel: [{
308
- type: Input
309
- }], results: [{
310
- type: Input
311
- }], data: [{
312
- type: Input
313
- }], remote: [{
314
- type: Input
315
- }], minCharacters: [{
316
- type: Input
317
- }], clearInvalid: [{
318
- type: Input
319
- }], searchIncentiveText: [{
320
- type: Input
321
- }], loadingText: [{
322
- type: Input
323
- }], noResultsText: [{
324
- type: Input
325
- }], showAllByDefault: [{
326
- type: Input
327
- }], autoComplete: [{
328
- type: Input
329
- }], label: [{
330
- type: Input
331
- }], value: [{
332
- type: Input
333
- }], search: [{
334
- type: Output
335
- }], select: [{
336
- type: Output
337
- }], flyout: [{
338
- type: ViewChild,
339
- args: [FlyoutDirective, { static: true }]
340
- }], flyoutZone: [{
341
- type: ViewChild,
342
- args: [FlyoutZoneDirective, { static: true }]
343
- }], template: [{
344
- type: ContentChild,
345
- args: [TemplateRef, { static: true }]
346
- }] }); })();
347
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2F1dG8tY29tcGxldGUvY29tcG9uZW50cy9hdXRvLWNvbXBsZXRlL2F1dG8tY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hdXRvLWNvbXBsZXRlL2NvbXBvbmVudHMvYXV0by1jb21wbGV0ZS9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7O0lDVXpFLCtCQUEwRztJQUN4RywwQkFBdUM7SUFDdkMsK0JBQThCO0lBQUEsWUFBaUI7SUFBQSxpQkFBTyxFQUFBOzs7SUFBeEIsZUFBaUI7SUFBakIsd0NBQWlCOzs7SUFFakQsZ0NBR0c7SUFBQSxZQUF5QjtJQUFBLGlCQUMzQjs7O0lBREUsZUFBeUI7SUFBekIsZ0RBQXlCOzs7SUFFNUIsZ0NBR0c7SUFBQSxZQUFtQjtJQUFBLGlCQUNyQjs7O0lBREUsZUFBbUI7SUFBbkIsMENBQW1COzs7O0lBRXRCLCtDQVFDO0lBUEMsa05BQVksZUFBQSx1QkFBZ0IsQ0FBQSxJQUFDO0lBTzlCLGlCQUFzQjs7O0lBTHJCLG9DQUFlLGlDQUFBLHlCQUFBLHVCQUFBLHdCQUFBOzs7SUFsQm5CLDhCQUF1QztJQUNyQyw4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QUFLO1lBQ0csYUFBYTtrQkFBckIsS0FBSztZQUNHLGdCQUFnQjtrQkFBeEIsS0FBSztZQUNHLFlBQVk7a0JBQXBCLEtBQUs7WUFHRyxLQUFLO2tCQUFiLEtBQUs7WUFDRyxLQUFLO2tCQUFiLEtBQUs7WUFHSSxNQUFNO2tCQUFmLE1BQU07WUFFRyxNQUFNO2tCQUFmLE1BQU07WUFFdUMsTUFBTTtrQkFBbkQsU0FBUzttQkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1lBQ00sVUFBVTtrQkFBM0QsU0FBUzttQkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFFSSxRQUFRO2tCQUEzRCxZQUFZO21CQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBnZXQsIGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgRmx5b3V0RGlyZWN0aXZlLCBGbHlvdXRab25lRGlyZWN0aXZlIH0gZnJvbSAnQGFjcGFhcy11aS9uZ3gtZmx5b3V0JztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvc2VhcmNoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdWktYXV0by1jb21wbGV0ZScsXG4gIHN0eWxlVXJsczogWycuL2F1dG8tY29tcGxldGUuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG8tY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF1dG9Db21wbGV0ZUNvbXBvbmVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9Db21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlucHV0TGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgcmVzdWx0czogYW55W10gPSBbXTsgLy8gVGhlIHZhbHVlcyBmb3IgdGhlIHNlbGVjdGFibGUgbGlzdFxuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdOyAvLyBUaGUgdmFsdWVzIHRvIHNlYXJjaCBpbiB3aGVuIHJlbW90ZSBzZWFyY2ggaXMgZGlzYWJsZWRcbiAgQElucHV0KCkgcmVtb3RlID0gZmFsc2U7IC8vIERpc2FibGUgb3IgZW5hbWJsZSByZW1vdGUgc2VhcmNoXG4gIEBJbnB1dCgpIG1pbkNoYXJhY3RlcnMgPSAwO1xuICBASW5wdXQoKSBjbGVhckludmFsaWQgPSBmYWxzZTtcbiAgQElucHV0KCkgc2VhcmNoSW5jZW50aXZlVGV4dDogc3RyaW5nO1xuICBASW5wdXQoKSBsb2FkaW5nVGV4dDogc3RyaW5nO1xuICBASW5wdXQoKSBub1Jlc3VsdHNUZXh0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dBbGxCeURlZmF1bHQgPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b0NvbXBsZXRlID0gJ29mZic7XG5cbiAgLy8gc3BlY2lmeSB3aGljaCBsYWJlbC92YWx1ZSBwcm9wcyB0byB1c2VcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZztcblxuICAvLyBFdmVudGVtaXR0ZXIgZm9yIHNlYXJjaHZhbHVlIChwYXJlbnQgb2JqZWN0IHNob3VsZCB1cGRhdGUgdGhlIHJlc3VsdHMgd2l0aCB0aGlzIHBhcmFtKVxuICBAT3V0cHV0KCkgc2VhcmNoOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoRmx5b3V0RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBmbHlvdXQ6IEZseW91dERpcmVjdGl2ZTtcbiAgQFZpZXdDaGlsZChGbHlvdXRab25lRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBmbHlvdXRab25lOiBGbHlvdXRab25lRGlyZWN0aXZlO1xuXG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwdWJsaWMgcXVlcnkgPSAnJztcbiAgcHVibGljIGluZGV4ID0gLTE7IC8vIGluZGV4IGZvciBhY3RpdmUgZWxlbWVudCBpbiBzZWxlY3RhYmxlIGxpc3QsIGJ5IGRlZmF1bHQgLTEgKHNvIGl0IHN0YXJ0cyBpbiB0aGUgaW5wdXQgZmllbGQpXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW06IGFueSA9IG51bGw7IC8vIGtlZXAgYSBiYWNrdXAgb2YgdGhlIHNlbGVjdGVkSXRlbVxuICBwdWJsaWMgc2VhcmNoaW5nID0gZmFsc2U7IC8vIHRyYWNrIHJlbW90ZSBzZWFyY2ggc3RhdGVcbiAgcHVibGljIGZvY3VzZWQgPSBmYWxzZTtcbiAgcHVibGljIGlzRGlzYWJsZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlbW90ZVZhbHVlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSkge31cblxuICBwdWJsaWMgdXBkYXRlTW9kZWwgPSAoXzogYW55KSA9PiB7fTtcblxuICAvLyBDT05UUk9MX1ZBTFVFX0FDQ0VTU09SIGludGVyZmFjZVxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZSA9ICcnKSB7XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5kYXRhLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbVt0aGlzLnZhbHVlXSA9PT0gdmFsdWUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnF1ZXJ5ID0gc2VsZWN0ZWRbdGhpcy5sYWJlbF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yZW1vdGUgJiYgISF2YWx1ZSkge1xuICAgICAgICB0aGlzLnJlbW90ZVZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnF1ZXJ5ID0gdmFsdWU7XG4gIH1cblxuICAvLyBDT05UUk9MX1ZBTFVFX0FDQ0VTU09SIGludGVyZmFjZVxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbikge1xuICAgIHRoaXMudXBkYXRlTW9kZWwgPSBmbjtcbiAgfVxuXG4gIC8vIENPTlRST0xfVkFMVUVfQUNDRVNTT1IgaW50ZXJmYWNlXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZCgpIHt9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhKSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCAmJiAhdGhpcy5xdWVyeSAmJiB0aGlzLnNob3dBbGxCeURlZmF1bHQpIHtcbiAgICAgIHRoaXMucmVzdWx0cyA9IFsuLi50aGlzLmRhdGFdO1xuICAgIH1cbiAgfVxuXG4gIC8vIE9uQ2hhbmdlcyBpbnRlcmZhY2VcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIWNoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdEYXRhID0gZ2V0KGNoYW5nZXMsICdkYXRhLmN1cnJlbnRWYWx1ZScsIFtdKTtcbiAgICBpZiAoIWlzRXF1YWwobmV3RGF0YSwgZ2V0KGNoYW5nZXMsICdkYXRhLnByZXZpb3VzVmFsdWUnLCBbXSkpKSB7XG4gICAgICBpZiAodGhpcy5yZW1vdGUpIHtcbiAgICAgICAgdGhpcy5yZW1vdGVTZWFyY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9jYWxTZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5yZXN1bHRzICYmIGNoYW5nZXMucmVzdWx0cy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb3BhZ2F0ZUNoYW5nZShpdGVtOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gaXRlbSAhPT0gbnVsbCA/ICh0aGlzLmxhYmVsID8gaXRlbVt0aGlzLmxhYmVsXSA6IGl0ZW0pIDogJyc7XG4gICAgdGhpcy5zZWxlY3QuZW1pdChpdGVtKTtcblxuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlIDogdGhpcy5sYWJlbCA/IHRoaXMubGFiZWwgOiBudWxsO1xuICAgIHRoaXMudXBkYXRlTW9kZWwoa2V5ID8gaXRlbVtrZXldIHx8ICcnIDogaXRlbSk7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJzIG9uIGlucHV0IHZhbHVlIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIGRvU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXggPSAtMTsgLy8gcmVzZXQgaW5kZXhcbiAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5yZW1vdGUpIHtcbiAgICAgIHRoaXMuc2VhcmNoLmVtaXQodGhpcy5xdWVyeSk7IC8vIGFzayBmb3IgbmV3IHJlbW90ZSBkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9jYWxTZWFyY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5GbHlvdXQoKTsgLy8gb3BlbiB0aGUgZmx5b3V0IHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2VcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyBvbiBzZWxlY3RhYmxlLWxpc3Q6c2VsZWN0IC0+IG9uQ2xpY2sgZXZlbnQgaW4gc2VsZWN0YWJsZS1saXN0XG4gICAqL1xuICBwdWJsaWMgb25TZWxlY3QoaXRlbTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoaXRlbSk7XG4gICAgdGhpcy5jbG9zZUZseW91dCgpOyAvLyBDbG9zZSB0aGUgZmx5b3V0IG1hbnVhbGx5XG4gIH1cblxuICBwdWJsaWMgb25GbHlvdXRDbG9zZWQoKTogdm9pZCB7XG4gICAgLy8gdGhlcmUgaXMgb25seSAxIHJlc3VsdCwgc2VsZWN0IGl0XG4gICAgaWYgKHRoaXMuaW5kZXggPj0gMCAmJiB0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5vblNlbGVjdCh0aGlzLnJlc3VsdHNbMF0pO1xuICAgIH1cblxuICAgIC8vIHRoZXJlIGlzIG5vIHF1ZXJ5IG5vciBzZWxlY3RlZCBpdGVtLCBjbGVhciB0aGUgc2VsZWN0ZWQgaXRlbVxuICAgIGlmICghdGhpcy5xdWVyeSAmJiB0aGlzLmluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIHRoaXMub25TZWxlY3QobnVsbCk7XG4gICAgfVxuXG4gICAgLy8gcmVzZXQgdGhlIHF1ZXJ5IGZvciBhbiBpbnZhbGlkIHF1ZXJ5IGlmIGNsZWFySW52YWxpZCBpcyB0cnVlXG4gICAgaWYgKHRoaXMuY2xlYXJJbnZhbGlkICYmIHRoaXMucXVlcnkgJiYgIXRoaXMucmVzdWx0cy5sZW5ndGggJiYgdGhpcy5pbmRleCA8IDApIHtcbiAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlbGVjdGVkSXRlbSA/ICh0aGlzLmxhYmVsID8gdGhpcy5zZWxlY3RlZEl0ZW1bdGhpcy5sYWJlbF0gOiB0aGlzLnNlbGVjdGVkSXRlbSkgOiAnJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25LZXlBcnJvd0Rvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5kZXggPCB0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5zY3JvbGxMaXN0KDEpO1xuICAgIH1cblxuICAgIHRoaXMub3BlbkZseW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9uS2V5QXJyb3dVcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLnNjcm9sbExpc3QoLTEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbktleUVudGVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIERvIG5vdCBzdWJtaXQgZm9ybSB3aGVuIHNlbGVjdGluZyBhbiBpdGVtLlxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmluZGV4ID49IDAgPyB0aGlzLnJlc3VsdHNbdGhpcy5pbmRleF0gOiB0aGlzLnF1ZXJ5O1xuXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UocXVlcnkpO1xuICAgIHRoaXMuY2xvc2VGbHlvdXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleUVzY2FwZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlRmx5b3V0KCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgIHRoaXMub3BlbkZseW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9wZW5GbHlvdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmx5b3V0KSB7XG4gICAgICB0aGlzLmZseW91dC5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsb3NlRmx5b3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZseW91dCkge1xuICAgICAgdGhpcy5mbHlvdXQuY2xvc2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NhbFNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdHMgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoKHRoaXMuZGF0YSwge1xuICAgICAgbWluTGVuZ3RoOiB0aGlzLm1pbkNoYXJhY3RlcnMsXG4gICAgICBrZXk6IHRoaXMubGFiZWwsXG4gICAgICBxdWVyeTogdGhpcy5xdWVyeSxcbiAgICAgIHNob3dBbGxCeURlZmF1bHQ6IHRoaXMuc2hvd0FsbEJ5RGVmYXVsdCxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAxICYmIHRoaXMucXVlcnkgPT09IHRoaXMucmVzdWx0c1swXVt0aGlzLmxhYmVsXSkge1xuICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdGVTZWFyY2goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlbW90ZVZhbHVlIHx8ICF0aGlzLmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZGF0YS5maW5kKChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpdGVtW3RoaXMudmFsdWVdID09PSB0aGlzLnF1ZXJ5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbSA9PT0gdGhpcy5xdWVyeTtcbiAgICB9KTtcblxuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMubGFiZWwgPyBzZWxlY3RlZFt0aGlzLmxhYmVsXSA6IHNlbGVjdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdGVWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNjcm9sbExpc3QoZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4ICs9IGZhY3RvcjtcblxuICAgIGlmICghdGhpcy5mbHlvdXRab25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGlJdGVtcyA9IHRoaXMuZmx5b3V0Wm9uZS5lbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaScpO1xuICAgIGNvbnN0IGxpSGVpZ2h0ID0gbGlJdGVtc1sxXSA/IGxpSXRlbXNbMV0ub2Zmc2V0SGVpZ2h0IDogbGlJdGVtc1swXS5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3Qgem9uZUhlaWdodCA9IHRoaXMuZmx5b3V0Wm9uZS5lbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBvZmZzZXQgPSB6b25lSGVpZ2h0IC8gbGlIZWlnaHQgLyAyO1xuXG4gICAgdGhpcy5mbHlvdXRab25lLmVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5pbmRleCAqIGxpSGVpZ2h0IC0gb2Zmc2V0ICogbGlIZWlnaHQ7XG4gIH1cbn1cbiIsIjxkaXZcbiAgKGNsb3NlZCk9XCJvbkZseW91dENsb3NlZCgpXCJcbiAgW3RvZ2dsZUNsaWNrXT1cImZhbHNlXCJcbiAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICBhdWlGbHlvdXRcbiAgY2xhc3M9XCJtLWZseW91dCBtLWZseW91dC0tc2Nyb2xsYWJsZSBtLWZseW91dC0tZnVsbCBvLWF1dG8tY29tcGxldGVcIlxuPlxuICA8aW5wdXRcbiAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAoa2V5QXJyb3dEb3duKT1cIm9uS2V5QXJyb3dEb3duKClcIlxuICAgIChrZXlBcnJvd1VwKT1cIm9uS2V5QXJyb3dVcCgpXCJcbiAgICAoa2V5RW50ZXIpPVwib25LZXlFbnRlcigkZXZlbnQpXCJcbiAgICAoa2V5RXNjYXBlKT1cIm9uS2V5RXNjYXBlKClcIlxuICAgIFsobmdNb2RlbCldPVwicXVlcnlcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cImRvU2VhcmNoKClcIlxuICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgIFtpZF09XCJpZFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxuICAgIGF1aUZseW91dEFjdGlvblxuICAgIGF1aVNlbGVjdGFibGVBY3Rpb25zXG4gICAgW2F1dG9jb21wbGV0ZV09XCJhdXRvQ29tcGxldGVcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBjbGFzcz1cImEtaW5wdXRcIlxuICAvPlxuICA8ZGl2ICpuZ0lmPVwiIWlzRGlzYWJsZWRcIiBhdWlGbHlvdXRab25lPlxuICAgIDxzcGFuICpuZ0lmPVwiZm9jdXNlZCAmJiBsb2FkaW5nVGV4dCAmJiBzZWFyY2hpbmdcIiBjbGFzcz1cImEtc3Bpbm5lciBhLXNwaW5uZXItLXMgdS1tYXJnaW4teHNcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiYS1zcGlubmVyX19jaXJjbGVcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImEtc3Bpbm5lcl9fdGV4dFwiPnt7IGxvYWRpbmdUZXh0IH19PC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhblxuICAgICAgKm5nSWY9XCJmb2N1c2VkICYmIHNlYXJjaEluY2VudGl2ZVRleHQgJiYgIXNlYXJjaGluZyAmJiAhcXVlcnkgJiYgIXJlc3VsdHMubGVuZ3RoXCJcbiAgICAgIGNsYXNzPVwiby1hdXRvLWNvbXBsZXRlX19pbmZvIHUtdGV4dC1saWdodCB1LW1hcmdpbi14c1wiXG4gICAgICA+e3sgc2VhcmNoSW5jZW50aXZlVGV4dCB9fTwvc3BhblxuICAgID5cbiAgICA8c3BhblxuICAgICAgKm5nSWY9XCJmb2N1c2VkICYmIG5vUmVzdWx0c1RleHQgJiYgIXNlYXJjaGluZyAmJiBxdWVyeSAmJiAhcmVzdWx0cy5sZW5ndGhcIlxuICAgICAgY2xhc3M9XCJvLWF1dG8tY29tcGxldGVfX2luZm8gdS10ZXh0LWxpZ2h0IHUtbWFyZ2luLXhzXCJcbiAgICAgID57eyBub1Jlc3VsdHNUZXh0IH19PC9zcGFuXG4gICAgPlxuICAgIDxhdWktc2VsZWN0YWJsZS1saXN0XG4gICAgICAoc2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cInJlc3VsdHMubGVuZ3RoID4gMCAmJiAhKGZvY3VzZWQgJiYgbG9hZGluZ1RleHQgJiYgc2VhcmNoaW5nKVwiXG4gICAgICBbaW5kZXhdPVwiaW5kZXhcIlxuICAgICAgW2l0ZW1UZW1wbGF0ZV09XCJ0ZW1wbGF0ZVwiXG4gICAgICBbaXRlbXNdPVwicmVzdWx0c1wiXG4gICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgW3NlYXJjaF09XCJxdWVyeVwiXG4gICAgPjwvYXVpLXNlbGVjdGFibGUtbGlzdD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==