@sebgroup/green-angular 4.6.1 → 4.6.3

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 (189) hide show
  1. package/esm2022/src/v-angular/base-control-value-accessor/base-control-value-accessor.component.mjs +9 -9
  2. package/esm2022/src/v-angular/button/button.component.mjs +5 -5
  3. package/esm2022/src/v-angular/character-countdown/character-countdown.directive.mjs +5 -5
  4. package/esm2022/src/v-angular/core/core.globals.mjs +3 -3
  5. package/esm2022/src/v-angular/dropdown/dropdown-list/dropdown-list.component.mjs +4 -4
  6. package/esm2022/src/v-angular/dropdown/typeahead/index.mjs +4 -1
  7. package/esm2022/src/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.mjs +5 -5
  8. package/esm2022/src/v-angular/dropdown/typeahead/typeahead.directive.mjs +177 -0
  9. package/esm2022/src/v-angular/info-circle/info-circle.component.mjs +3 -3
  10. package/esm2022/src/v-angular/input/input.component.mjs +7 -7
  11. package/esm2022/src/v-angular/input-mask/input-mask-format.pipe.mjs +5 -4
  12. package/esm2022/src/v-angular/input-mask/input-mask.directive.mjs +8 -8
  13. package/esm2022/src/v-angular/modal/dialog/dialog.component.mjs +16 -16
  14. package/esm2022/src/v-angular/modal/fold-out/fold-out.directive.mjs +3 -3
  15. package/esm2022/src/v-angular/modal/modal.globals.mjs +3 -3
  16. package/esm2022/src/v-angular/modal/slide-out/slide-out.component.mjs +15 -15
  17. package/esm2022/src/v-angular/textarea/textarea.component.mjs +4 -3
  18. package/esm2022/src/v-angular/textarea/textarea.module.mjs +5 -4
  19. package/esm2022/src/v-angular/tooltip/tooltip.directive.mjs +13 -13
  20. package/esm2022/v-angular/base-control-value-accessor/base-control-value-accessor.component.mjs +287 -0
  21. package/esm2022/v-angular/base-control-value-accessor/base-control-value-accessor.module.mjs +17 -0
  22. package/esm2022/v-angular/base-control-value-accessor/index.mjs +3 -0
  23. package/esm2022/v-angular/breadcrumbs/breadcrumbs.component.mjs +25 -0
  24. package/esm2022/v-angular/breadcrumbs/breadcrumbs.module.mjs +20 -0
  25. package/esm2022/v-angular/breadcrumbs/index.mjs +3 -0
  26. package/esm2022/v-angular/button/button.component.mjs +108 -0
  27. package/esm2022/v-angular/button/button.module.mjs +20 -0
  28. package/esm2022/v-angular/button/index.mjs +3 -0
  29. package/esm2022/v-angular/card/card.component.mjs +11 -0
  30. package/esm2022/v-angular/card/card.module.mjs +18 -0
  31. package/esm2022/v-angular/card/index.mjs +3 -0
  32. package/esm2022/v-angular/character-countdown/character-countdown.directive.mjs +51 -0
  33. package/esm2022/v-angular/character-countdown/character-countdown.module.mjs +18 -0
  34. package/esm2022/v-angular/character-countdown/index.mjs +3 -0
  35. package/esm2022/v-angular/checkbox/checkbox.component.mjs +72 -0
  36. package/esm2022/v-angular/checkbox/checkbox.module.mjs +19 -0
  37. package/esm2022/v-angular/checkbox/index.mjs +3 -0
  38. package/esm2022/v-angular/dropdown/dropdown-list/dropdown-list.component.mjs +256 -0
  39. package/esm2022/v-angular/dropdown/dropdown-list/index.mjs +2 -0
  40. package/esm2022/v-angular/dropdown/dropdown.component.mjs +239 -0
  41. package/esm2022/v-angular/dropdown/dropdown.module.mjs +22 -0
  42. package/esm2022/v-angular/dropdown/index.mjs +6 -0
  43. package/esm2022/v-angular/dropdown/typeahead/index.mjs +6 -0
  44. package/esm2022/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.mjs +98 -0
  45. package/esm2022/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.mjs +85 -0
  46. package/esm2022/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.mjs +132 -0
  47. package/esm2022/v-angular/dropdown/typeahead/typeahead.directive.mjs +177 -0
  48. package/esm2022/v-angular/dropdown/typeahead/typeahead.module.mjs +33 -0
  49. package/esm2022/v-angular/i18n/i18n.json +12 -0
  50. package/esm2022/v-angular/i18n/i18n.module.mjs +83 -0
  51. package/esm2022/v-angular/i18n/i18n.test.module.mjs +89 -0
  52. package/esm2022/v-angular/i18n/index.mjs +3 -0
  53. package/esm2022/v-angular/index.mjs +18 -0
  54. package/esm2022/v-angular/info-circle/index.mjs +3 -0
  55. package/esm2022/v-angular/info-circle/info-circle.component.mjs +28 -0
  56. package/esm2022/v-angular/info-circle/info-circle.module.mjs +21 -0
  57. package/esm2022/v-angular/input/index.mjs +3 -0
  58. package/esm2022/v-angular/input/input.component.mjs +221 -0
  59. package/esm2022/v-angular/input/input.module.mjs +32 -0
  60. package/esm2022/v-angular/input-mask/config.mjs +9 -0
  61. package/esm2022/v-angular/input-mask/constants.mjs +2 -0
  62. package/esm2022/v-angular/input-mask/index.mjs +6 -0
  63. package/esm2022/v-angular/input-mask/input-mask-format.pipe.mjs +21 -0
  64. package/esm2022/v-angular/input-mask/input-mask.directive.mjs +165 -0
  65. package/esm2022/v-angular/input-mask/input-mask.module.mjs +35 -0
  66. package/esm2022/v-angular/input-mask/input-mask.types.mjs +2 -0
  67. package/esm2022/v-angular/modal/dialog/dialog.component.mjs +190 -0
  68. package/esm2022/v-angular/modal/fold-out/fold-out.component.mjs +56 -0
  69. package/esm2022/v-angular/modal/fold-out/fold-out.directive.mjs +19 -0
  70. package/esm2022/v-angular/modal/index.mjs +6 -0
  71. package/esm2022/v-angular/modal/modal.globals.mjs +20 -0
  72. package/esm2022/v-angular/modal/modal.module.mjs +40 -0
  73. package/esm2022/v-angular/modal/modal.types.mjs +2 -0
  74. package/esm2022/v-angular/modal/slide-out/slide-out.component.mjs +229 -0
  75. package/esm2022/v-angular/radio/index.mjs +3 -0
  76. package/esm2022/v-angular/radio/radio.component.mjs +130 -0
  77. package/esm2022/v-angular/radio/radio.module.mjs +20 -0
  78. package/esm2022/v-angular/sebgroup-green-angular-v-angular.mjs +5 -0
  79. package/esm2022/v-angular/textarea/index.mjs +3 -0
  80. package/esm2022/v-angular/textarea/textarea.component.mjs +102 -0
  81. package/esm2022/v-angular/textarea/textarea.module.mjs +19 -0
  82. package/esm2022/v-angular/tooltip/index.mjs +3 -0
  83. package/esm2022/v-angular/tooltip/tooltip.directive.mjs +273 -0
  84. package/esm2022/v-angular/tooltip/tooltip.module.mjs +18 -0
  85. package/esm2022/v-angular/v-angular.module.mjs +80 -0
  86. package/fesm2022/sebgroup-green-angular-src-v-angular-base-control-value-accessor.mjs +8 -8
  87. package/fesm2022/sebgroup-green-angular-src-v-angular-base-control-value-accessor.mjs.map +1 -1
  88. package/fesm2022/sebgroup-green-angular-src-v-angular-button.mjs +4 -4
  89. package/fesm2022/sebgroup-green-angular-src-v-angular-button.mjs.map +1 -1
  90. package/fesm2022/sebgroup-green-angular-src-v-angular-character-countdown.mjs +4 -4
  91. package/fesm2022/sebgroup-green-angular-src-v-angular-character-countdown.mjs.map +1 -1
  92. package/fesm2022/sebgroup-green-angular-src-v-angular-core.mjs +2 -2
  93. package/fesm2022/sebgroup-green-angular-src-v-angular-core.mjs.map +1 -1
  94. package/fesm2022/sebgroup-green-angular-src-v-angular-dropdown.mjs +179 -10
  95. package/fesm2022/sebgroup-green-angular-src-v-angular-dropdown.mjs.map +1 -1
  96. package/fesm2022/sebgroup-green-angular-src-v-angular-info-circle.mjs +2 -2
  97. package/fesm2022/sebgroup-green-angular-src-v-angular-info-circle.mjs.map +1 -1
  98. package/fesm2022/sebgroup-green-angular-src-v-angular-input-mask.mjs +11 -10
  99. package/fesm2022/sebgroup-green-angular-src-v-angular-input-mask.mjs.map +1 -1
  100. package/fesm2022/sebgroup-green-angular-src-v-angular-input.mjs +6 -6
  101. package/fesm2022/sebgroup-green-angular-src-v-angular-input.mjs.map +1 -1
  102. package/fesm2022/sebgroup-green-angular-src-v-angular-modal.mjs +33 -33
  103. package/fesm2022/sebgroup-green-angular-src-v-angular-modal.mjs.map +1 -1
  104. package/fesm2022/sebgroup-green-angular-src-v-angular-textarea.mjs +7 -5
  105. package/fesm2022/sebgroup-green-angular-src-v-angular-textarea.mjs.map +1 -1
  106. package/fesm2022/sebgroup-green-angular-src-v-angular-tooltip.mjs +12 -12
  107. package/fesm2022/sebgroup-green-angular-src-v-angular-tooltip.mjs.map +1 -1
  108. package/fesm2022/sebgroup-green-angular-v-angular.mjs +3408 -0
  109. package/fesm2022/sebgroup-green-angular-v-angular.mjs.map +1 -0
  110. package/package.json +8 -2
  111. package/src/v-angular/base-control-value-accessor/base-control-value-accessor.component.d.ts +3 -3
  112. package/src/v-angular/button/button.component.d.ts +2 -2
  113. package/src/v-angular/character-countdown/character-countdown.directive.d.ts +1 -1
  114. package/src/v-angular/core/core.globals.d.ts +1 -1
  115. package/src/v-angular/dropdown/typeahead/index.d.ts +3 -0
  116. package/src/v-angular/dropdown/typeahead/typeahead.directive.d.ts +76 -0
  117. package/src/v-angular/input/input.component.d.ts +3 -3
  118. package/src/v-angular/input-mask/input-mask-format.pipe.d.ts +1 -1
  119. package/src/v-angular/input-mask/input-mask.directive.d.ts +2 -2
  120. package/src/v-angular/modal/dialog/dialog.component.d.ts +5 -5
  121. package/src/v-angular/modal/fold-out/fold-out.directive.d.ts +1 -1
  122. package/src/v-angular/modal/modal.globals.d.ts +1 -1
  123. package/src/v-angular/modal/slide-out/slide-out.component.d.ts +6 -6
  124. package/src/v-angular/textarea/textarea.module.d.ts +2 -1
  125. package/src/v-angular/tooltip/tooltip.directive.d.ts +4 -4
  126. package/v-angular/base-control-value-accessor/base-control-value-accessor.component.d.ts +124 -0
  127. package/v-angular/base-control-value-accessor/base-control-value-accessor.module.d.ts +7 -0
  128. package/v-angular/base-control-value-accessor/index.d.ts +2 -0
  129. package/v-angular/breadcrumbs/breadcrumbs.component.d.ts +18 -0
  130. package/v-angular/breadcrumbs/breadcrumbs.module.d.ts +10 -0
  131. package/v-angular/breadcrumbs/index.d.ts +2 -0
  132. package/v-angular/button/button.component.d.ts +62 -0
  133. package/v-angular/button/button.module.d.ts +10 -0
  134. package/v-angular/button/index.d.ts +2 -0
  135. package/v-angular/card/card.component.d.ts +5 -0
  136. package/v-angular/card/card.module.d.ts +8 -0
  137. package/v-angular/card/index.d.ts +2 -0
  138. package/v-angular/character-countdown/character-countdown.directive.d.ts +17 -0
  139. package/v-angular/character-countdown/character-countdown.module.d.ts +8 -0
  140. package/v-angular/character-countdown/index.d.ts +2 -0
  141. package/v-angular/checkbox/checkbox.component.d.ts +27 -0
  142. package/v-angular/checkbox/checkbox.module.d.ts +9 -0
  143. package/v-angular/checkbox/index.d.ts +2 -0
  144. package/v-angular/dropdown/dropdown-list/dropdown-list.component.d.ts +89 -0
  145. package/v-angular/dropdown/dropdown-list/index.d.ts +1 -0
  146. package/v-angular/dropdown/dropdown.component.d.ts +99 -0
  147. package/v-angular/dropdown/dropdown.module.d.ts +12 -0
  148. package/v-angular/dropdown/index.d.ts +5 -0
  149. package/v-angular/dropdown/typeahead/index.d.ts +5 -0
  150. package/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.d.ts +34 -0
  151. package/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.d.ts +34 -0
  152. package/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.d.ts +59 -0
  153. package/v-angular/dropdown/typeahead/typeahead.directive.d.ts +76 -0
  154. package/v-angular/dropdown/typeahead/typeahead.module.d.ts +11 -0
  155. package/v-angular/i18n/i18n.module.d.ts +15 -0
  156. package/v-angular/i18n/i18n.test.module.d.ts +27 -0
  157. package/v-angular/i18n/index.d.ts +2 -0
  158. package/v-angular/index.d.ts +17 -0
  159. package/v-angular/info-circle/index.d.ts +2 -0
  160. package/v-angular/info-circle/info-circle.component.d.ts +16 -0
  161. package/v-angular/info-circle/info-circle.module.d.ts +10 -0
  162. package/v-angular/input/index.d.ts +2 -0
  163. package/v-angular/input/input.component.d.ts +90 -0
  164. package/v-angular/input/input.module.d.ts +11 -0
  165. package/v-angular/input-mask/config.d.ts +6 -0
  166. package/v-angular/input-mask/constants.d.ts +2 -0
  167. package/v-angular/input-mask/index.d.ts +5 -0
  168. package/v-angular/input-mask/input-mask-format.pipe.d.ts +8 -0
  169. package/v-angular/input-mask/input-mask.directive.d.ts +39 -0
  170. package/v-angular/input-mask/input-mask.module.d.ts +11 -0
  171. package/v-angular/input-mask/input-mask.types.d.ts +20 -0
  172. package/v-angular/modal/dialog/dialog.component.d.ts +55 -0
  173. package/v-angular/modal/fold-out/fold-out.component.d.ts +24 -0
  174. package/v-angular/modal/fold-out/fold-out.directive.d.ts +6 -0
  175. package/v-angular/modal/index.d.ts +5 -0
  176. package/v-angular/modal/modal.globals.d.ts +13 -0
  177. package/v-angular/modal/modal.module.d.ts +13 -0
  178. package/v-angular/modal/modal.types.d.ts +5 -0
  179. package/v-angular/modal/slide-out/slide-out.component.d.ts +76 -0
  180. package/v-angular/radio/index.d.ts +2 -0
  181. package/v-angular/radio/radio.component.d.ts +48 -0
  182. package/v-angular/radio/radio.module.d.ts +9 -0
  183. package/v-angular/textarea/index.d.ts +2 -0
  184. package/v-angular/textarea/textarea.component.d.ts +44 -0
  185. package/v-angular/textarea/textarea.module.d.ts +9 -0
  186. package/v-angular/tooltip/index.d.ts +2 -0
  187. package/v-angular/tooltip/tooltip.directive.d.ts +106 -0
  188. package/v-angular/tooltip/tooltip.module.d.ts +8 -0
  189. package/v-angular/v-angular.module.d.ts +23 -0
@@ -0,0 +1,85 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ export class NgvTypeaheadHighlightComponent {
5
+ constructor() {
6
+ this.text = '';
7
+ this.input = '';
8
+ /**
9
+ * Regexp of characters that are allowed in textContent without being found in textToHighlight
10
+ * Allow whitespaces.
11
+ * */
12
+ this.allowedNonMatchingChars = new RegExp(/\s/);
13
+ }
14
+ ngOnChanges(changes) {
15
+ const { textContent, textToHighlight } = changes;
16
+ if (textContent?.currentValue != null)
17
+ this.text = `${textContent.currentValue}`;
18
+ if (textToHighlight?.currentValue != null)
19
+ this.input = `${textToHighlight.currentValue}`;
20
+ this.updateValues();
21
+ }
22
+ updateValues() {
23
+ const splittedText = this.text.toLocaleLowerCase().split('');
24
+ const splittedInput = this.input.toLocaleLowerCase().split('');
25
+ const { start, end } = this.getHighlightedPart(splittedText, splittedInput);
26
+ // If user input is not found within the textcontent, reset options and return.
27
+ if (start === -1 || end === -1) {
28
+ this.prefix = this.match = this.suffix = '';
29
+ return;
30
+ }
31
+ this.prefix = this.text.substring(0, start);
32
+ this.match = this.text.substring(start, end);
33
+ this.suffix = this.text.substring(end);
34
+ }
35
+ /**
36
+ * Function that finds the start and end index of where the input is located within the text to display.
37
+ * First occurence is returned. Allows for spaces to occur despite input not matching space.
38
+ * Loops through each character in splittedText and when a char in splittedText equlas the first character of
39
+ * splittedInput, evaluate wether it's match on the entire input.
40
+ * - If it's => return indexes.
41
+ * - If it's not => break out and check next char in outer loop.
42
+ * @param splittedText the text content splitted in an array
43
+ * @param splittedInput the input splitted in an array
44
+ * @returns { start: number, end: number } Indexes of where the match starts and ends in the text displatyed
45
+ */
46
+ getHighlightedPart(splittedText, splittedInput) {
47
+ let start = -1;
48
+ let end = -1;
49
+ for (let i = 0; i < splittedText.length; i++) {
50
+ // If start and end have been set, break and return
51
+ if (start > -1 || end > -1)
52
+ break;
53
+ // If current char match first in input, try see if whole input match from that index
54
+ if (splittedText[i] === splittedInput[0]) {
55
+ let matches = 1;
56
+ for (let t = 1; t <= splittedText.length; t++) {
57
+ // If match on last character of input, we're finished.
58
+ if (matches === splittedInput.length) {
59
+ start = i;
60
+ end = start + t;
61
+ break;
62
+ }
63
+ if (splittedText[t + i] === splittedInput[matches])
64
+ matches++;
65
+ else if (this.allowedNonMatchingChars.test(splittedText[t + i]))
66
+ continue; // Ignore whitespace, continue
67
+ else
68
+ break; // No match, break out of inner loop to check next char in text
69
+ }
70
+ }
71
+ }
72
+ return { start, end };
73
+ }
74
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadHighlightComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
75
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgvTypeaheadHighlightComponent, selector: "nggv-typeahead-highlight", inputs: { textContent: "textContent", textToHighlight: "textToHighlight" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!this.match\">{{ textContent }}</ng-container>\n<!-- Note that this is sensitive to line breaks producing extra spacing between the different parts -->\n<ng-container *ngIf=\"!!this.match\">\n {{ prefix || '' }}<span class=\"match\">{{ match }}</span>{{ suffix ||''}}\n</ng-container>", styles: [":host .match{font-weight:500}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadHighlightComponent, decorators: [{
78
+ type: Component,
79
+ args: [{ selector: 'nggv-typeahead-highlight', template: "<ng-container *ngIf=\"!this.match\">{{ textContent }}</ng-container>\n<!-- Note that this is sensitive to line breaks producing extra spacing between the different parts -->\n<ng-container *ngIf=\"!!this.match\">\n {{ prefix || '' }}<span class=\"match\">{{ match }}</span>{{ suffix ||''}}\n</ng-container>", styles: [":host .match{font-weight:500}\n"] }]
80
+ }], propDecorators: { textContent: [{
81
+ type: Input
82
+ }], textToHighlight: [{
83
+ type: Input
84
+ }] } });
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLWhpZ2hsaWdodC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL3YtYW5ndWxhci9kcm9wZG93bi90eXBlYWhlYWQvdHlwZWFoZWFkLWhpZ2hsaWdodC90eXBlYWhlYWQtaGlnaGxpZ2h0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zcmMvdi1hbmd1bGFyL2Ryb3Bkb3duL3R5cGVhaGVhZC90eXBlYWhlYWQtaGlnaGxpZ2h0L3R5cGVhaGVhZC1oaWdobGlnaHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQTRCLE1BQU0sZUFBZSxDQUFBOzs7QUFPMUUsTUFBTSxPQUFPLDhCQUE4QjtJQUwzQztRQWVFLFNBQUksR0FBRyxFQUFFLENBQUE7UUFDVCxVQUFLLEdBQUcsRUFBRSxDQUFBO1FBRVY7OzthQUdLO1FBQ0wsNEJBQXVCLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7S0FvRTNDO0lBbEVDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxNQUFNLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQTtRQUNoRCxJQUFJLFdBQVcsRUFBRSxZQUFZLElBQUksSUFBSTtZQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQzNDLElBQUksZUFBZSxFQUFFLFlBQVksSUFBSSxJQUFJO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDaEQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQ3JCLENBQUM7SUFFTyxZQUFZO1FBQ2xCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDNUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUU5RCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFFM0UsK0VBQStFO1FBQy9FLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUE7WUFDM0MsT0FBTTtTQUNQO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNLLGtCQUFrQixDQUN4QixZQUFzQixFQUN0QixhQUF1QjtRQUV2QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNkLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBRVosS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUMsbURBQW1EO1lBQ25ELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQUUsTUFBSztZQUVqQyxxRkFBcUY7WUFDckYsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUE7Z0JBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzdDLHVEQUF1RDtvQkFDdkQsSUFBSSxPQUFPLEtBQUssYUFBYSxDQUFDLE1BQU0sRUFBRTt3QkFDcEMsS0FBSyxHQUFHLENBQUMsQ0FBQTt3QkFDVCxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQTt3QkFDZixNQUFLO3FCQUNOO29CQUNELElBQUksWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsT0FBTyxDQUFDO3dCQUFFLE9BQU8sRUFBRSxDQUFBO3lCQUN4RCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDN0QsU0FBUSxDQUFDLDhCQUE4Qjs7d0JBQ3BDLE1BQUssQ0FBQywrREFBK0Q7aUJBQzNFO2FBQ0Y7U0FDRjtRQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUE7SUFDdkIsQ0FBQzsrR0FwRlUsOEJBQThCO21HQUE5Qiw4QkFBOEIsaUtDUDNDLHVUQUllOzs0RkRHRiw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0UsMEJBQTBCOzhCQU0zQixXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ2d2LXR5cGVhaGVhZC1oaWdobGlnaHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdHlwZWFoZWFkLWhpZ2hsaWdodC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3R5cGVhaGVhZC1oaWdobGlnaHQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd2VHlwZWFoZWFkSGlnaGxpZ2h0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIFRoZSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIGluIHRoZSBkcm9wZG93biBsaXN0ICovXG4gIEBJbnB1dCgpIHRleHRDb250ZW50Pzogc3RyaW5nXG4gIC8qKiBUaGUgc3Vic3RyaW5nIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHdpdGhpbiB0ZXh0Q29udGVudCAqL1xuICBASW5wdXQoKSB0ZXh0VG9IaWdobGlnaHQ/OiBzdHJpbmdcblxuICBwcmVmaXg/OiBzdHJpbmcgLy8gU3Vic3RyaW5nIGJlZm9yZSB0aGUgbWF0Y2hcbiAgbWF0Y2g/OiBzdHJpbmcgLy8gVGhlIG1hdGNoXG4gIHN1ZmZpeD86IHN0cmluZyAvLyBTdWJzdHJpbmcgYWZ0ZXIgdGhlIG1hdGNoXG5cbiAgdGV4dCA9ICcnXG4gIGlucHV0ID0gJydcblxuICAvKipcbiAgICogUmVnZXhwIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsb3dlZCBpbiB0ZXh0Q29udGVudCB3aXRob3V0IGJlaW5nIGZvdW5kIGluIHRleHRUb0hpZ2hsaWdodFxuICAgKiBBbGxvdyB3aGl0ZXNwYWNlcy5cbiAgICogKi9cbiAgYWxsb3dlZE5vbk1hdGNoaW5nQ2hhcnMgPSBuZXcgUmVnRXhwKC9cXHMvKVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCB7IHRleHRDb250ZW50LCB0ZXh0VG9IaWdobGlnaHQgfSA9IGNoYW5nZXNcbiAgICBpZiAodGV4dENvbnRlbnQ/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKVxuICAgICAgdGhpcy50ZXh0ID0gYCR7dGV4dENvbnRlbnQuY3VycmVudFZhbHVlfWBcbiAgICBpZiAodGV4dFRvSGlnaGxpZ2h0Py5jdXJyZW50VmFsdWUgIT0gbnVsbClcbiAgICAgIHRoaXMuaW5wdXQgPSBgJHt0ZXh0VG9IaWdobGlnaHQuY3VycmVudFZhbHVlfWBcbiAgICB0aGlzLnVwZGF0ZVZhbHVlcygpXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZhbHVlcygpIHtcbiAgICBjb25zdCBzcGxpdHRlZFRleHQgPSB0aGlzLnRleHQudG9Mb2NhbGVMb3dlckNhc2UoKS5zcGxpdCgnJylcbiAgICBjb25zdCBzcGxpdHRlZElucHV0ID0gdGhpcy5pbnB1dC50b0xvY2FsZUxvd2VyQ2FzZSgpLnNwbGl0KCcnKVxuXG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLmdldEhpZ2hsaWdodGVkUGFydChzcGxpdHRlZFRleHQsIHNwbGl0dGVkSW5wdXQpXG5cbiAgICAvLyBJZiB1c2VyIGlucHV0IGlzIG5vdCBmb3VuZCB3aXRoaW4gdGhlIHRleHRjb250ZW50LCByZXNldCBvcHRpb25zIGFuZCByZXR1cm4uXG4gICAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7XG4gICAgICB0aGlzLnByZWZpeCA9IHRoaXMubWF0Y2ggPSB0aGlzLnN1ZmZpeCA9ICcnXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5wcmVmaXggPSB0aGlzLnRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0KVxuICAgIHRoaXMubWF0Y2ggPSB0aGlzLnRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpXG4gICAgdGhpcy5zdWZmaXggPSB0aGlzLnRleHQuc3Vic3RyaW5nKGVuZClcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0aGF0IGZpbmRzIHRoZSBzdGFydCBhbmQgZW5kIGluZGV4IG9mIHdoZXJlIHRoZSBpbnB1dCBpcyBsb2NhdGVkIHdpdGhpbiB0aGUgdGV4dCB0byBkaXNwbGF5LlxuICAgKiBGaXJzdCBvY2N1cmVuY2UgaXMgcmV0dXJuZWQuIEFsbG93cyBmb3Igc3BhY2VzIHRvIG9jY3VyIGRlc3BpdGUgaW5wdXQgbm90IG1hdGNoaW5nIHNwYWNlLlxuICAgKiBMb29wcyB0aHJvdWdoIGVhY2ggY2hhcmFjdGVyIGluIHNwbGl0dGVkVGV4dCBhbmQgd2hlbiBhIGNoYXIgaW4gc3BsaXR0ZWRUZXh0IGVxdWxhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mXG4gICAqIHNwbGl0dGVkSW5wdXQsIGV2YWx1YXRlIHdldGhlciBpdCdzIG1hdGNoIG9uIHRoZSBlbnRpcmUgaW5wdXQuXG4gICAqIC0gSWYgaXQncyA9PiByZXR1cm4gaW5kZXhlcy5cbiAgICogLSBJZiBpdCdzIG5vdCA9PiBicmVhayBvdXQgYW5kIGNoZWNrIG5leHQgY2hhciBpbiBvdXRlciBsb29wLlxuICAgKiBAcGFyYW0gc3BsaXR0ZWRUZXh0IHRoZSB0ZXh0IGNvbnRlbnQgc3BsaXR0ZWQgaW4gYW4gYXJyYXlcbiAgICogQHBhcmFtIHNwbGl0dGVkSW5wdXQgdGhlIGlucHV0IHNwbGl0dGVkIGluIGFuIGFycmF5XG4gICAqIEByZXR1cm5zIHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfSBJbmRleGVzIG9mIHdoZXJlIHRoZSBtYXRjaCBzdGFydHMgYW5kIGVuZHMgaW4gdGhlIHRleHQgZGlzcGxhdHllZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIaWdobGlnaHRlZFBhcnQoXG4gICAgc3BsaXR0ZWRUZXh0OiBzdHJpbmdbXSxcbiAgICBzcGxpdHRlZElucHV0OiBzdHJpbmdbXSxcbiAgKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHtcbiAgICBsZXQgc3RhcnQgPSAtMVxuICAgIGxldCBlbmQgPSAtMVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdHRlZFRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIElmIHN0YXJ0IGFuZCBlbmQgaGF2ZSBiZWVuIHNldCwgYnJlYWsgYW5kIHJldHVyblxuICAgICAgaWYgKHN0YXJ0ID4gLTEgfHwgZW5kID4gLTEpIGJyZWFrXG5cbiAgICAgIC8vIElmIGN1cnJlbnQgY2hhciBtYXRjaCBmaXJzdCBpbiBpbnB1dCwgdHJ5IHNlZSBpZiB3aG9sZSBpbnB1dCBtYXRjaCBmcm9tIHRoYXQgaW5kZXhcbiAgICAgIGlmIChzcGxpdHRlZFRleHRbaV0gPT09IHNwbGl0dGVkSW5wdXRbMF0pIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSAxXG4gICAgICAgIGZvciAobGV0IHQgPSAxOyB0IDw9IHNwbGl0dGVkVGV4dC5sZW5ndGg7IHQrKykge1xuICAgICAgICAgIC8vIElmIG1hdGNoIG9uIGxhc3QgY2hhcmFjdGVyIG9mIGlucHV0LCB3ZSdyZSBmaW5pc2hlZC5cbiAgICAgICAgICBpZiAobWF0Y2hlcyA9PT0gc3BsaXR0ZWRJbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gaVxuICAgICAgICAgICAgZW5kID0gc3RhcnQgKyB0XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3BsaXR0ZWRUZXh0W3QgKyBpXSA9PT0gc3BsaXR0ZWRJbnB1dFttYXRjaGVzXSkgbWF0Y2hlcysrXG4gICAgICAgICAgZWxzZSBpZiAodGhpcy5hbGxvd2VkTm9uTWF0Y2hpbmdDaGFycy50ZXN0KHNwbGl0dGVkVGV4dFt0ICsgaV0pKVxuICAgICAgICAgICAgY29udGludWUgLy8gSWdub3JlIHdoaXRlc3BhY2UsIGNvbnRpbnVlXG4gICAgICAgICAgZWxzZSBicmVhayAvLyBObyBtYXRjaCwgYnJlYWsgb3V0IG9mIGlubmVyIGxvb3AgdG8gY2hlY2sgbmV4dCBjaGFyIGluIHRleHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH1cbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0aGlzLm1hdGNoXCI+e3sgdGV4dENvbnRlbnQgfX08L25nLWNvbnRhaW5lcj5cbjwhLS0gTm90ZSB0aGF0IHRoaXMgaXMgc2Vuc2l0aXZlIHRvIGxpbmUgYnJlYWtzIHByb2R1Y2luZyBleHRyYSBzcGFjaW5nIGJldHdlZW4gdGhlIGRpZmZlcmVudCBwYXJ0cyAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhIXRoaXMubWF0Y2hcIj5cbiAgICB7eyBwcmVmaXggfHwgJycgfX08c3BhbiBjbGFzcz1cIm1hdGNoXCI+e3sgbWF0Y2ggfX08L3NwYW4+e3sgc3VmZml4IHx8Jyd9fVxuPC9uZy1jb250YWluZXI+Il19
@@ -0,0 +1,132 @@
1
+ import { ChangeDetectorRef, Component, ElementRef, HostListener, Inject, Input, Optional, Renderer2, Self, } from '@angular/core';
2
+ import { NgControl } from '@angular/forms';
3
+ import { takeUntil } from 'rxjs';
4
+ import { TRANSLOCO_SCOPE } from '@ngneat/transloco';
5
+ import { NgvDropdownComponent } from '../../dropdown.component';
6
+ import { NgvInputComponent } from '@sebgroup/green-angular/src/v-angular/input';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/forms";
9
+ import * as i2 from "@angular/common";
10
+ export class NgvTypeaheadInputComponent extends NgvInputComponent {
11
+ get dropdownButton() {
12
+ return this.hostComponent.inputRef?.nativeElement;
13
+ }
14
+ constructor(element, renderer2, ngControl, translocoScope, cdr) {
15
+ super(ngControl, translocoScope, cdr);
16
+ this.element = element;
17
+ this.renderer2 = renderer2;
18
+ this.ngControl = ngControl;
19
+ this.translocoScope = translocoScope;
20
+ this.cdr = cdr;
21
+ /** Boolean to indicate wether the dropdown is expanded or not, to apply appropriate styling */
22
+ this.expanded = false;
23
+ super.ngOnInit();
24
+ }
25
+ ngOnInit() {
26
+ this.autocomplete = 'off';
27
+ this.debounceTime = 0;
28
+ this.hostComponent.selectOnSingleOption = false;
29
+ this.moveInput();
30
+ this.handleExpandedChange();
31
+ }
32
+ /**
33
+ * @internal
34
+ * Allow space to be inputted as text
35
+ * @param event fired containing which key was released.
36
+ */
37
+ onKeyUp(event) {
38
+ if (event.code === 'Space') {
39
+ event.preventDefault();
40
+ }
41
+ }
42
+ /**
43
+ * @internal
44
+ * First time the dropdown is expanded, move the input sp it becomes a child of the dropdown button
45
+ * to better reflect semantics and styling.
46
+ */
47
+ moveInput() {
48
+ // Workaround to execute code in setTimeout due to hooks management etc.
49
+ setTimeout(() => {
50
+ // Only move if parent dropdown is found
51
+ if (this.dropdownButton) {
52
+ this.renderer2.appendChild(this.dropdownButton.querySelector('button'), this.element.nativeElement);
53
+ // Get the height of the parent button so the input can be explicitly set to the same height since it's absolutely positioned
54
+ this.buttonHeight =
55
+ this.dropdownButton.getBoundingClientRect().height || 32; // Default to 2em;
56
+ }
57
+ }, 0);
58
+ }
59
+ /**
60
+ * @internal
61
+ * When dropdown is expanded, focus on the input. If a value is selected, set it in the input.
62
+ * When the dropdown is collapsed, empty the input from text.
63
+ */
64
+ handleExpandedChange() {
65
+ this.hostComponent.expandedChange
66
+ .pipe(takeUntil(this._destroy$))
67
+ .subscribe((state) => {
68
+ this.expanded = state;
69
+ if (this.expanded) {
70
+ // Weird workaround for setting focus. Didn't set focus, but wrapping in setTimeout solved it.
71
+ // See suggestion here: https://github.com/ionic-team/stencil/issues/3772#issuecomment-1292599609
72
+ setTimeout(() => this.setFocus());
73
+ // Format and interpolate result since return type can be other than string from the formatter
74
+ const formattedValue = `${this.formatSelected(this.hostComponent.state)}`;
75
+ this.setInput(formattedValue, false);
76
+ }
77
+ else
78
+ this.setInput('', true);
79
+ });
80
+ }
81
+ /**
82
+ * @internal Formats the selected option to display in the input. Interpolate the returned value
83
+ * since we don't know the return type or label type.
84
+ * @param value The selected value
85
+ * @returns The formatted value
86
+ */
87
+ formatSelected(value) {
88
+ if (value?.key == null)
89
+ return '';
90
+ // If no formatter exists, return the label or empty string
91
+ if (!this.selectedFormatter)
92
+ return value.label ?? '';
93
+ // If a formatter exists, use it
94
+ return this.selectedFormatter(value) ?? '';
95
+ }
96
+ /**
97
+ * Sets the input programmatically instead of native HTML input event.
98
+ * @param input
99
+ */
100
+ setInput(input, triggerFilter) {
101
+ this.state = input;
102
+ if (triggerFilter) {
103
+ this.onChange(this.state);
104
+ this.inputChange$.next(this.state);
105
+ }
106
+ }
107
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadInputComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.NgControl, optional: true, self: true }, { token: TRANSLOCO_SCOPE, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
108
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgvTypeaheadInputComponent, selector: "nggv-typeahead-input", inputs: { hostComponent: "hostComponent", resultFormatter: "resultFormatter", selectedFormatter: "selectedFormatter" }, host: { listeners: { "document:keyup": "onKeyUp($event)" } }, usesInheritance: true, ngImport: i0, template: "<ng-container>\n <div class=\"input-wrapper\"\n [ngClass]=\"{ 'expanded': expanded, 'collapsed': !expanded }\"\n [ngStyle]=\"{ 'height.px': buttonHeight }\"\n (click)=\"$event.stopPropagation();\">\n <!-- INPUT FIELD -->\n <div class=\"input-group\">\n <input #input\n [id]=\"id + '-input'\"\n class=\"sdv-field\"\n [attr.type]=\"type\"\n [attr.name]=\"name\"\n [attr.required]=\"required\"\n [attr.email]=\"email\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n [attr.maxlength]=\"maxlength\"\n [attr.minlength]=\"minlength\"\n [pattern]=\"pattern\"\n [disabled]=\"disabled\"\n [autocomplete]=\"autocomplete\"\n [autofocus]=\"autofocus\"\n [readOnly]=\"readonly\"\n [attr.role]=\"role\"\n [attr.placeholder]=\"placeholder\"\n [attr.aria-label]=\"description\"\n [value]=\"state\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\" />\n </div>\n </div>\n</ng-container>", styles: [":host{position:absolute;top:0;left:0;width:calc(100% - 2.625em)}:host .input-wrapper{border:none;box-shadow:none}:host .input-wrapper.expanded{display:flex}:host .input-wrapper.expanded .input-group input.sdv-field{height:100%;width:100%;min-height:unset;margin-left:1px;border:none;box-shadow:none}:host .input-wrapper.collapsed{display:none}:host .input-wrapper .input-group{width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
109
+ }
110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadInputComponent, decorators: [{
111
+ type: Component,
112
+ args: [{ selector: 'nggv-typeahead-input', template: "<ng-container>\n <div class=\"input-wrapper\"\n [ngClass]=\"{ 'expanded': expanded, 'collapsed': !expanded }\"\n [ngStyle]=\"{ 'height.px': buttonHeight }\"\n (click)=\"$event.stopPropagation();\">\n <!-- INPUT FIELD -->\n <div class=\"input-group\">\n <input #input\n [id]=\"id + '-input'\"\n class=\"sdv-field\"\n [attr.type]=\"type\"\n [attr.name]=\"name\"\n [attr.required]=\"required\"\n [attr.email]=\"email\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n [attr.maxlength]=\"maxlength\"\n [attr.minlength]=\"minlength\"\n [pattern]=\"pattern\"\n [disabled]=\"disabled\"\n [autocomplete]=\"autocomplete\"\n [autofocus]=\"autofocus\"\n [readOnly]=\"readonly\"\n [attr.role]=\"role\"\n [attr.placeholder]=\"placeholder\"\n [attr.aria-label]=\"description\"\n [value]=\"state\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\" />\n </div>\n </div>\n</ng-container>", styles: [":host{position:absolute;top:0;left:0;width:calc(100% - 2.625em)}:host .input-wrapper{border:none;box-shadow:none}:host .input-wrapper.expanded{display:flex}:host .input-wrapper.expanded .input-group input.sdv-field{height:100%;width:100%;min-height:unset;margin-left:1px;border:none;box-shadow:none}:host .input-wrapper.collapsed{display:none}:host .input-wrapper .input-group{width:100%}\n"] }]
113
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.NgControl, decorators: [{
114
+ type: Self
115
+ }, {
116
+ type: Optional
117
+ }] }, { type: undefined, decorators: [{
118
+ type: Optional
119
+ }, {
120
+ type: Inject,
121
+ args: [TRANSLOCO_SCOPE]
122
+ }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { hostComponent: [{
123
+ type: Input
124
+ }], resultFormatter: [{
125
+ type: Input
126
+ }], selectedFormatter: [{
127
+ type: Input
128
+ }], onKeyUp: [{
129
+ type: HostListener,
130
+ args: ['document:keyup', ['$event']]
131
+ }] } });
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zcmMvdi1hbmd1bGFyL2Ryb3Bkb3duL3R5cGVhaGVhZC90eXBlYWhlYWQtaW5wdXQvdHlwZWFoZWFkLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zcmMvdi1hbmd1bGFyL2Ryb3Bkb3duL3R5cGVhaGVhZC90eXBlYWhlYWQtaW5wdXQvdHlwZWFoZWFkLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsU0FBUyxFQUNULElBQUksR0FDTCxNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVoQyxPQUFPLEVBQUUsZUFBZSxFQUFrQixNQUFNLG1CQUFtQixDQUFBO0FBR25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFBOzs7O0FBTy9FLE1BQU0sT0FBTywwQkFDWCxTQUFRLGlCQUFpQjtJQVl6QixJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUE7SUFDbkQsQ0FBQztJQVFELFlBQ1UsT0FBbUIsRUFDbkIsU0FBb0IsRUFDRCxTQUFvQixFQUdyQyxjQUE4QixFQUM5QixHQUFzQjtRQUVoQyxLQUFLLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxHQUFHLENB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LENBQUE7UUFDbEIsSUFBSSxhQUFhLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQ25DO0lBQ0gsQ0FBQzsrR0E1SFUsMEJBQTBCLDBIQTRCM0IsZUFBZTttR0E1QmQsMEJBQTBCLHlRQzVCdkMscXlDQWlDZTs7NEZETEYsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHNCQUFzQjs7MEJBOEI3QixJQUFJOzswQkFBSSxRQUFROzswQkFDaEIsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxlQUFlOzRFQXZCaEIsYUFBYTtzQkFBckIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkF3Q04sT0FBTztzQkFETixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgU2VsZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJ1xuXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzJ1xuXG5pbXBvcnQgeyBUUkFOU0xPQ09fU0NPUEUsIFRyYW5zbG9jb1Njb3BlIH0gZnJvbSAnQG5nbmVhdC90cmFuc2xvY28nXG5cbmltcG9ydCB7IE9wdGlvbkJhc2UgfSBmcm9tICdAc2ViZ3JvdXAvZ3JlZW4tYW5ndWxhci9zcmMvdi1hbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBOZ3ZEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Ryb3Bkb3duLmNvbXBvbmVudCdcbmltcG9ydCB7IE5ndklucHV0Q29tcG9uZW50IH0gZnJvbSAnQHNlYmdyb3VwL2dyZWVuLWFuZ3VsYXIvc3JjL3YtYW5ndWxhci9pbnB1dCdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmdndi10eXBlYWhlYWQtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdHlwZWFoZWFkLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdHlwZWFoZWFkLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE5ndlR5cGVhaGVhZElucHV0Q29tcG9uZW50XG4gIGV4dGVuZHMgTmd2SW5wdXRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveVxue1xuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBob3N0IGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIGhvc3RDb21wb25lbnQhOiBOZ3ZEcm9wZG93bkNvbXBvbmVudFxuXG4gIC8qKiBGb3JtYXRzIGVhY2ggaXRlbSB0aGF0IGlzIGRpc3BsYXllZCBhcyBhbiBvcHRpb24uIE9ubHkgYXBwbGllcyBmb3JtYXQgaWYgdGhlIG9wdGlvbiBpZiBpdCBpbXBsZW1lbnQgT3B0aW9uIGludGVyZmFjZS4gKi9cbiAgQElucHV0KCkgcmVzdWx0Rm9ybWF0dGVyPzogKG9wdGlvbjogT3B0aW9uQmFzZTxhbnk+KSA9PiBzdHJpbmdcblxuICAvKiogRm9ybWF0cyB0aGUgc2VsZWN0ZWQgaXRlbSBpbiB0aGUgaW5wdXQgd2hlbiBkcm9wZG93biBpcyBvcGVuZWQuIElmIG5vIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGRpc3BsYXkgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBvYmplY3RzIGxhYmVsIHByb3BlcnR5ICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9ybWF0dGVyPzogKHNlbGVjdGVkOiBPcHRpb25CYXNlPGFueT4pID0+IHN0cmluZ1xuXG4gIGdldCBkcm9wZG93bkJ1dHRvbigpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdENvbXBvbmVudC5pbnB1dFJlZj8ubmF0aXZlRWxlbWVudFxuICB9XG5cbiAgLyoqIEJvb2xlYW4gdG8gaW5kaWNhdGUgd2V0aGVyIHRoZSBkcm9wZG93biBpcyBleHBhbmRlZCBvciBub3QsIHRvIGFwcGx5IGFwcHJvcHJpYXRlIHN0eWxpbmcgKi9cbiAgZXhwYW5kZWQgPSBmYWxzZVxuXG4gIC8qKiBVc2VkIHRvIGRldGVybWluZSB0aGUgaGVpZ2h0IG9mIHRoZSBpbnB1dGluIGh0bWwgKi9cbiAgYnV0dG9uSGVpZ2h0PzogbnVtYmVyXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFRSQU5TTE9DT19TQ09QRSlcbiAgICBwcm90ZWN0ZWQgdHJhbnNsb2NvU2NvcGU6IFRyYW5zbG9jb1Njb3BlLFxuICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICBzdXBlcihuZ0NvbnRyb2wsIHRyYW5zbG9jb1Njb3BlLCBjZHIpXG4gICAgc3VwZXIubmdPbkluaXQoKVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hdXRvY29tcGxldGUgPSAnb2ZmJ1xuICAgIHRoaXMuZGVib3VuY2VUaW1lID0gMFxuICAgIHRoaXMuaG9zdENvbXBvbmVudC5zZWxlY3RPblNpbmdsZU9wdGlvbiA9IGZhbHNlXG5cbiAgICB0aGlzLm1vdmVJbnB1dCgpXG4gICAgdGhpcy5oYW5kbGVFeHBhbmRlZENoYW5nZSgpXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEFsbG93IHNwYWNlIHRvIGJlIGlucHV0dGVkIGFzIHRleHRcbiAgICogQHBhcmFtIGV2ZW50IGZpcmVkIGNvbnRhaW5pbmcgd2hpY2gga2V5IHdhcyByZWxlYXNlZC5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleXVwJywgWyckZXZlbnQnXSlcbiAgb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChldmVudC5jb2RlID09PSAnU3BhY2UnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBGaXJzdCB0aW1lIHRoZSBkcm9wZG93biBpcyBleHBhbmRlZCwgbW92ZSB0aGUgaW5wdXQgc3AgaXQgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBkcm9wZG93biBidXR0b25cbiAgICogdG8gYmV0dGVyIHJlZmxlY3Qgc2VtYW50aWNzIGFuZCBzdHlsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBtb3ZlSW5wdXQoKSB7XG4gICAgLy8gV29ya2Fyb3VuZCB0byBleGVjdXRlIGNvZGUgaW4gc2V0VGltZW91dCBkdWUgdG8gaG9va3MgbWFuYWdlbWVudCBldGMuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBPbmx5IG1vdmUgaWYgcGFyZW50IGRyb3Bkb3duIGlzIGZvdW5kXG4gICAgICBpZiAodGhpcy5kcm9wZG93bkJ1dHRvbikge1xuICAgICAgICB0aGlzLnJlbmRlcmVyMi5hcHBlbmRDaGlsZChcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duQnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLFxuICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICApXG4gICAgICAgIC8vIEdldCB0aGUgaGVpZ2h0IG9mIHRoZSBwYXJlbnQgYnV0dG9uIHNvIHRoZSBpbnB1dCBjYW4gYmUgZXhwbGljaXRseSBzZXQgdG8gdGhlIHNhbWUgaGVpZ2h0IHNpbmNlIGl0J3MgYWJzb2x1dGVseSBwb3NpdGlvbmVkXG4gICAgICAgIHRoaXMuYnV0dG9uSGVpZ2h0ID1cbiAgICAgICAgICB0aGlzLmRyb3Bkb3duQnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCB8fCAzMiAvLyBEZWZhdWx0IHRvIDJlbTtcbiAgICAgIH1cbiAgICB9LCAwKVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBXaGVuIGRyb3Bkb3duIGlzIGV4cGFuZGVkLCBmb2N1cyBvbiB0aGUgaW5wdXQuIElmIGEgdmFsdWUgaXMgc2VsZWN0ZWQsIHNldCBpdCBpbiB0aGUgaW5wdXQuXG4gICAqIFdoZW4gdGhlIGRyb3Bkb3duIGlzIGNvbGxhcHNlZCwgZW1wdHkgdGhlIGlucHV0IGZyb20gdGV4dC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRXhwYW5kZWRDaGFuZ2UoKSB7XG4gICAgdGhpcy5ob3N0Q29tcG9uZW50LmV4cGFuZGVkQ2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgdGhpcy5leHBhbmRlZCA9IHN0YXRlXG5cbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgICAvLyBXZWlyZCB3b3JrYXJvdW5kIGZvciBzZXR0aW5nIGZvY3VzLiBEaWRuJ3Qgc2V0IGZvY3VzLCBidXQgd3JhcHBpbmcgaW4gc2V0VGltZW91dCBzb2x2ZWQgaXQuXG4gICAgICAgICAgLy8gU2VlIHN1Z2dlc3Rpb24gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL2lvbmljLXRlYW0vc3RlbmNpbC9pc3N1ZXMvMzc3MiNpc3N1ZWNvbW1lbnQtMTI5MjU5OTYwOVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRGb2N1cygpKVxuICAgICAgICAgIC8vIEZvcm1hdCBhbmQgaW50ZXJwb2xhdGUgcmVzdWx0IHNpbmNlIHJldHVybiB0eXBlIGNhbiBiZSBvdGhlciB0aGFuIHN0cmluZyBmcm9tIHRoZSBmb3JtYXR0ZXJcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGAke3RoaXMuZm9ybWF0U2VsZWN0ZWQodGhpcy5ob3N0Q29tcG9uZW50LnN0YXRlKX1gXG4gICAgICAgICAgdGhpcy5zZXRJbnB1dChmb3JtYXR0ZWRWYWx1ZSwgZmFsc2UpXG4gICAgICAgIH0gZWxzZSB0aGlzLnNldElucHV0KCcnLCB0cnVlKVxuICAgICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgRm9ybWF0cyB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIGlucHV0LiBJbnRlcnBvbGF0ZSB0aGUgcmV0dXJuZWQgdmFsdWVcbiAgICogc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgcmV0dXJuIHR5cGUgb3IgbGFiZWwgdHlwZS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdFNlbGVjdGVkKHZhbHVlOiBPcHRpb25CYXNlPGFueT4pIHtcbiAgICBpZiAodmFsdWU/LmtleSA9PSBudWxsKSByZXR1cm4gJydcbiAgICAvLyBJZiBubyBmb3JtYXR0ZXIgZXhpc3RzLCByZXR1cm4gdGhlIGxhYmVsIG9yIGVtcHR5IHN0cmluZ1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEZvcm1hdHRlcikgcmV0dXJuIHZhbHVlLmxhYmVsID8/ICcnXG4gICAgLy8gSWYgYSBmb3JtYXR0ZXIgZXhpc3RzLCB1c2UgaXRcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZvcm1hdHRlcih2YWx1ZSkgPz8gJydcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbnB1dCBwcm9ncmFtbWF0aWNhbGx5IGluc3RlYWQgb2YgbmF0aXZlIEhUTUwgaW5wdXQgZXZlbnQuXG4gICAqIEBwYXJhbSBpbnB1dFxuICAgKi9cbiAgcHJpdmF0ZSBzZXRJbnB1dChpbnB1dDogc3RyaW5nLCB0cmlnZ2VyRmlsdGVyOiBib29sZWFuKSB7XG4gICAgdGhpcy5zdGF0ZSA9IGlucHV0XG4gICAgaWYgKHRyaWdnZXJGaWx0ZXIpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5zdGF0ZSlcbiAgICAgIHRoaXMuaW5wdXRDaGFuZ2UkLm5leHQodGhpcy5zdGF0ZSlcbiAgICB9XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdleHBhbmRlZCc6IGV4cGFuZGVkLCAnY29sbGFwc2VkJzogIWV4cGFuZGVkIH1cIlxuICAgICAgICBbbmdTdHlsZV09XCJ7ICdoZWlnaHQucHgnOiBidXR0b25IZWlnaHQgfVwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XG4gICAgICAgIDwhLS0gSU5QVVQgRklFTEQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGlucHV0ICNpbnB1dFxuICAgICAgICAgICAgICAgIFtpZF09XCJpZCArICctaW5wdXQnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNkdi1maWVsZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIudHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgIFthdHRyLnJlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5lbWFpbF09XCJlbWFpbFwiXG4gICAgICAgICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgICAgICAgICBbc3RlcF09XCJzdGVwXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwibWF4bGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5taW5sZW5ndGhdPVwibWlubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJwYXR0ZXJuXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cInJvbGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwic3RhdGVcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj4iXX0=
@@ -0,0 +1,177 @@
1
+ import { Directive, ElementRef, EventEmitter, Host, HostListener, Input, Optional, Output, ViewContainerRef, } from '@angular/core';
2
+ import { distinctUntilChanged, from, Subject, takeUntil, tap, withLatestFrom, } from 'rxjs';
3
+ import { NgvDropdownComponent } from '../dropdown.component';
4
+ import { NgvInputComponent } from '@sebgroup/green-angular/src/v-angular/input';
5
+ import { NgvTypeaheadDropdownListComponent } from '../typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component';
6
+ import { NgvTypeaheadInputComponent } from './typeahead-input/typeahead-input.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../dropdown.component";
9
+ import * as i2 from "@sebgroup/green-angular/src/v-angular/input";
10
+ export class NgvTypeaheadDirective {
11
+ /** Function that filter the inputvalue */
12
+ set nggvTypeahead(value) {
13
+ this.typeaheadFunction = value;
14
+ // If inputsubscription already exists, unsubscribe and subscribe again
15
+ if (this.inputSubscription$) {
16
+ this.inputSubscription$?.unsubscribe();
17
+ this.inputSubscription$ = undefined;
18
+ this.handleInputChanges();
19
+ }
20
+ }
21
+ /** Forward text inputs to apply the filter function*/
22
+ onNgvInput(event) {
23
+ this.inputValue$.next(event);
24
+ }
25
+ /** Helper to the determine if the host is nggv-drodpown or nggv-input*/
26
+ get hostIsDropdown() {
27
+ return !!this.hostDropdown;
28
+ }
29
+ /** Predefined options */
30
+ get defaultNullishOption() {
31
+ return { key: null, label: this.unselectLabel || '\u00A0' };
32
+ }
33
+ get emptyOption() {
34
+ return { key: null, label: 'label.nomatchingoptions', disabled: true };
35
+ }
36
+ /** Name of the component. nggv-dropdown if NgvDropdownComponent or nggv-input if NgvInputComponent */
37
+ get localName() {
38
+ return this.element.nativeElement.localName;
39
+ }
40
+ constructor(viewContainerRef, element, hostDropdown, hostInput) {
41
+ this.viewContainerRef = viewContainerRef;
42
+ this.element = element;
43
+ this.hostDropdown = hostDropdown;
44
+ this.hostInput = hostInput;
45
+ /** Allow option to be unselected in the dropdown even if it is required. Defaults to true */
46
+ this.allowUnselect = true;
47
+ /** Emits the entered string the user has written in the input */
48
+ this.filterPhraseChange = new EventEmitter();
49
+ this.inputValue$ = new Subject();
50
+ this.onDestroy$ = new Subject();
51
+ }
52
+ ngOnInit() {
53
+ this.handleInputChanges();
54
+ this.inputValue$.next('');
55
+ if (this.hostIsDropdown)
56
+ this.createInput();
57
+ else
58
+ this.createDropdownList();
59
+ }
60
+ ngOnDestroy() {
61
+ this.onDestroy$.next(true);
62
+ this.onDestroy$.complete();
63
+ }
64
+ /**
65
+ * @internal
66
+ * Core functionality of typeahead. Emits input, then filters the result based on the supplied function
67
+ * If directive is applied on nggv-input, manually show or hide options in the list.
68
+ * If directive is applied on nggv-dropdown, let the dropdown itself choose when to open or close
69
+ */
70
+ handleInputChanges() {
71
+ this.inputSubscription$ = this.inputValue$
72
+ .pipe(takeUntil(this.onDestroy$), distinctUntilChanged(), tap((inputValue) => this.filterPhraseChange.emit(inputValue)), this.typeaheadFunction ? this.typeaheadFunction : () => from([]), withLatestFrom(this.inputValue$))
73
+ .subscribe(([filteredValues, input]) => this.setOptions(filteredValues, input));
74
+ }
75
+ /**
76
+ * @internal
77
+ * Creates a nggv-input if the host itself is not a text-input
78
+ * Set styles to not display the input when closed
79
+ * Trigger filtering when changes occur in the field
80
+ * */
81
+ createInput() {
82
+ // Create the input component
83
+ this.inputComponent = this.viewContainerRef.createComponent(NgvTypeaheadInputComponent);
84
+ // Forward necessary info to component
85
+ this.inputComponent.setInput('hostComponent', this.hostDropdown);
86
+ this.inputComponent.setInput('selectedFormatter', this.selectedFormatter);
87
+ this.inputComponent.setInput('resultFormatter', this.resultFormatter);
88
+ // Listen to value changes
89
+ this.inputComponent.instance.nggvInput
90
+ .pipe(takeUntil(this.onDestroy$))
91
+ .subscribe((inputValue) => this.inputValue$.next(inputValue));
92
+ }
93
+ /** @internal Creates a nggv-dropdown-list if the host itself is a nggv-input */
94
+ createDropdownList() {
95
+ this.dropdownListComponent = this.viewContainerRef.createComponent(NgvTypeaheadDropdownListComponent);
96
+ this.dropdownListComponent.setInput('hostComponent', this.hostInput);
97
+ }
98
+ /**
99
+ * @internal Sets the options the user can select.
100
+ * If the host is a nggv-dropdown, utilize the dropdown itself to display the options
101
+ * If the host is a nggv-input, use the created nggv-dropdown-list to displaye the options
102
+ * @param filteredValues The options to display in the dropdown
103
+ * @param emptyInput If the input is empty
104
+ */
105
+ setOptions(filteredValues, input) {
106
+ if (!filteredValues)
107
+ return;
108
+ // Conditionally add empty or nullish option if it's allowed, the input is empty and does not already contain nullish
109
+ const allowNullish = this.allowUnselect &&
110
+ !input &&
111
+ !(Object.keys(filteredValues[0]).includes('key') &&
112
+ filteredValues[0].key == null);
113
+ if (filteredValues.length === 0) {
114
+ filteredValues = [this.emptyOption];
115
+ }
116
+ else if (allowNullish) {
117
+ filteredValues = [this.defaultNullishOption].concat(filteredValues);
118
+ }
119
+ if (this.hostIsDropdown) {
120
+ // Add nullish option when no input is written (or when dropdown is epanded and has a selection)
121
+ this.hostDropdown.allowControlNullishOption = false;
122
+ this.hostDropdown.options = this.formatOptions(filteredValues);
123
+ this.hostDropdown.textToHighlight = `${input || ''}`;
124
+ this.hostDropdown.detectChanges();
125
+ return;
126
+ }
127
+ if (!this.hostIsDropdown) {
128
+ this.dropdownListComponent.setInput('options', this.formatOptions(filteredValues));
129
+ this.dropdownListComponent.setInput('textToHighlight', `${input || ''}`);
130
+ }
131
+ }
132
+ /**
133
+ * @internal Formats the available options to display in the dropdown list
134
+ * @param options The selected value
135
+ * @returns The formatted value
136
+ */
137
+ formatOptions(options) {
138
+ if (!options)
139
+ return [];
140
+ if (!this.resultFormatter)
141
+ return options;
142
+ return options.map((value) => value?.label ? this.resultFormatter?.(value) : value);
143
+ }
144
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i1.NgvDropdownComponent, host: true, optional: true }, { token: i2.NgvInputComponent, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
145
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: NgvTypeaheadDirective, isStandalone: true, selector: "nggv-input[nggvTypeahead], nggv-dropdown[nggvTypeahead]", inputs: { nggvTypeahead: "nggvTypeahead", resultFormatter: "resultFormatter", selectedFormatter: "selectedFormatter", allowUnselect: "allowUnselect", unselectLabel: "unselectLabel" }, outputs: { filterPhraseChange: "filterPhraseChange" }, host: { listeners: { "nggvInput": "onNgvInput($event)" } }, ngImport: i0 }); }
146
+ }
147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadDirective, decorators: [{
148
+ type: Directive,
149
+ args: [{
150
+ selector: 'nggv-input[nggvTypeahead], nggv-dropdown[nggvTypeahead]',
151
+ standalone: true,
152
+ }]
153
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i1.NgvDropdownComponent, decorators: [{
154
+ type: Optional
155
+ }, {
156
+ type: Host
157
+ }] }, { type: i2.NgvInputComponent, decorators: [{
158
+ type: Optional
159
+ }, {
160
+ type: Host
161
+ }] }]; }, propDecorators: { nggvTypeahead: [{
162
+ type: Input
163
+ }], resultFormatter: [{
164
+ type: Input
165
+ }], selectedFormatter: [{
166
+ type: Input
167
+ }], allowUnselect: [{
168
+ type: Input
169
+ }], unselectLabel: [{
170
+ type: Input
171
+ }], filterPhraseChange: [{
172
+ type: Output
173
+ }], onNgvInput: [{
174
+ type: HostListener,
175
+ args: ['nggvInput', ['$event']]
176
+ }] } });
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zcmMvdi1hbmd1bGFyL2Ryb3Bkb3duL3R5cGVhaGVhZC90eXBlYWhlYWQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixJQUFJLEVBQ0osWUFBWSxFQUNaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQTtBQUV0QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLElBQUksRUFFSixPQUFPLEVBRVAsU0FBUyxFQUNULEdBQUcsRUFDSCxjQUFjLEdBQ2YsTUFBTSxNQUFNLENBQUE7QUFHYixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQTtBQUMvRSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3RUFBd0UsQ0FBQTtBQUMxSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQTs7OztBQU14RixNQUFNLE9BQU8scUJBQXFCO0lBT2hDLDBDQUEwQztJQUMxQyxJQUFhLGFBQWEsQ0FBQyxLQUFnRDtRQUN6RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFBO1FBRTlCLHVFQUF1RTtRQUN2RSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLENBQUE7WUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQTtZQUNuQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtTQUMxQjtJQUNILENBQUM7SUFpQkQsc0RBQXNEO0lBQ2YsVUFBVSxDQUFDLEtBQVU7UUFD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QUNILENBQUM7K0dBM0xVLHFCQUFxQjttR0FBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQUpqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx5REFBeUQ7b0JBQ25FLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBc0VJLFFBQVE7OzBCQUFJLElBQUk7OzBCQUNoQixRQUFROzswQkFBSSxJQUFJOzRDQTlETixhQUFhO3NCQUF6QixLQUFLO2dCQVlHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBR2dDLFVBQVU7c0JBQWhELFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50UmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5cbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmcm9tLFxuICBPcGVyYXRvckZ1bmN0aW9uLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcydcblxuaW1wb3J0IHsgT3B0aW9uLCBPcHRpb25CYXNlIH0gZnJvbSAnQHNlYmdyb3VwL2dyZWVuLWFuZ3VsYXIvc3JjL3YtYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgTmd2RHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi9kcm9wZG93bi5jb21wb25lbnQnXG5pbXBvcnQgeyBOZ3ZJbnB1dENvbXBvbmVudCB9IGZyb20gJ0BzZWJncm91cC9ncmVlbi1hbmd1bGFyL3NyYy92LWFuZ3VsYXIvaW5wdXQnXG5pbXBvcnQgeyBOZ3ZUeXBlYWhlYWREcm9wZG93bkxpc3RDb21wb25lbnQgfSBmcm9tICcuLi90eXBlYWhlYWQvdHlwZWFoZWFkLWRyb3Bkb3duLWxpc3QvdHlwZWFoZWFkLWRyb3Bkb3duLWxpc3QuY29tcG9uZW50J1xuaW1wb3J0IHsgTmd2VHlwZWFoZWFkSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3R5cGVhaGVhZC1pbnB1dC90eXBlYWhlYWQtaW5wdXQuY29tcG9uZW50J1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICduZ2d2LWlucHV0W25nZ3ZUeXBlYWhlYWRdLCBuZ2d2LWRyb3Bkb3duW25nZ3ZUeXBlYWhlYWRdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTmd2VHlwZWFoZWFkRGlyZWN0aXZlPFxuICAgIEsgPSBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIFYgPSBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIFQgZXh0ZW5kcyBPcHRpb248SywgVj4gPSBPcHRpb248SywgVj4sXG4gID5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveVxue1xuICAvKiogRnVuY3Rpb24gdGhhdCBmaWx0ZXIgdGhlIGlucHV0dmFsdWUgKi9cbiAgQElucHV0KCkgc2V0IG5nZ3ZUeXBlYWhlYWQodmFsdWU6IE9wZXJhdG9yRnVuY3Rpb248c3RyaW5nLCBUW10+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50eXBlYWhlYWRGdW5jdGlvbiA9IHZhbHVlXG5cbiAgICAvLyBJZiBpbnB1dHN1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cywgdW5zdWJzY3JpYmUgYW5kIHN1YnNjcmliZSBhZ2FpblxuICAgIGlmICh0aGlzLmlucHV0U3Vic2NyaXB0aW9uJCkge1xuICAgICAgdGhpcy5pbnB1dFN1YnNjcmlwdGlvbiQ/LnVuc3Vic2NyaWJlKClcbiAgICAgIHRoaXMuaW5wdXRTdWJzY3JpcHRpb24kID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmhhbmRsZUlucHV0Q2hhbmdlcygpXG4gICAgfVxuICB9XG5cbiAgLyoqIEZvcm1hdHMgZWFjaCBpdGVtIHRoYXQgaXMgZGlzcGxheWVkIGFzIGFuIG9wdGlvbi4gT25seSBhcHBsaWVzIGZvcm1hdCBpZiB0aGUgb3B0aW9uIGlmIGl0IGltcGxlbWVudCBPcHRpb24gaW50ZXJmYWNlLiAqL1xuICBASW5wdXQoKSByZXN1bHRGb3JtYXR0ZXI/OiAob3B0aW9uOiBPcHRpb25CYXNlPGFueT4pID0+IHN0cmluZ1xuXG4gIC8qKiBGb3JtYXRzIHRoZSBzZWxlY3RlZCBpdGVtIGluIHRoZSBpbnB1dCB3aGVuIGRyb3Bkb3duIGlzIG9wZW5lZC4gSWYgbm8gZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHdpbGwgZGlzcGxheSB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIG9iamVjdHMgbGFiZWwgcHJvcGVydHkgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRGb3JtYXR0ZXI/OiAoc2VsZWN0ZWQ6IE9wdGlvbkJhc2U8YW55PikgPT4gc3RyaW5nXG5cbiAgLyoqIEFsbG93IG9wdGlvbiB0byBiZSB1bnNlbGVjdGVkIGluIHRoZSBkcm9wZG93biBldmVuIGlmIGl0IGlzIHJlcXVpcmVkLiBEZWZhdWx0cyB0byB0cnVlICovXG4gIEBJbnB1dCgpIGFsbG93VW5zZWxlY3QgPSB0cnVlXG5cbiAgLyoqIEN1c3RvbSBsYWJlbCBmb3IgdGhlIHVuc2VsZWN0IG9wdGlvbiAqL1xuICBASW5wdXQoKSB1bnNlbGVjdExhYmVsPzogc3RyaW5nXG5cbiAgLyoqIEVtaXRzIHRoZSBlbnRlcmVkIHN0cmluZyB0aGUgdXNlciBoYXMgd3JpdHRlbiBpbiB0aGUgaW5wdXQgKi9cbiAgQE91dHB1dCgpIGZpbHRlclBocmFzZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpXG5cbiAgLyoqIEZvcndhcmQgdGV4dCBpbnB1dHMgdG8gYXBwbHkgdGhlIGZpbHRlciBmdW5jdGlvbiovXG4gIEBIb3N0TGlzdGVuZXIoJ25nZ3ZJbnB1dCcsIFsnJGV2ZW50J10pIG9uTmd2SW5wdXQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuaW5wdXRWYWx1ZSQubmV4dChldmVudClcbiAgfVxuXG4gIC8qKiBIZWxwZXIgdG8gdGhlIGRldGVybWluZSBpZiB0aGUgaG9zdCBpcyBuZ2d2LWRyb2Rwb3duIG9yIG5nZ3YtaW5wdXQqL1xuICBnZXQgaG9zdElzRHJvcGRvd24oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5ob3N0RHJvcGRvd25cbiAgfVxuXG4gIC8qKiBQcmVkZWZpbmVkIG9wdGlvbnMgKi9cbiAgZ2V0IGRlZmF1bHROdWxsaXNoT3B0aW9uKCk6IE9wdGlvbkJhc2U8YW55PiB7XG4gICAgcmV0dXJuIHsga2V5OiBudWxsLCBsYWJlbDogdGhpcy51bnNlbGVjdExhYmVsIHx8ICdcXHUwMEEwJyB9XG4gIH1cblxuICBnZXQgZW1wdHlPcHRpb24oKTogT3B0aW9uQmFzZTxhbnk+IHtcbiAgICByZXR1cm4geyBrZXk6IG51bGwsIGxhYmVsOiAnbGFiZWwubm9tYXRjaGluZ29wdGlvbnMnLCBkaXNhYmxlZDogdHJ1ZSB9XG4gIH1cblxuICAvKiogTmFtZSBvZiB0aGUgY29tcG9uZW50LiBuZ2d2LWRyb3Bkb3duIGlmIE5ndkRyb3Bkb3duQ29tcG9uZW50IG9yIG5nZ3YtaW5wdXQgaWYgTmd2SW5wdXRDb21wb25lbnQgKi9cbiAgZ2V0IGxvY2FsTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQubG9jYWxOYW1lXG4gIH1cblxuICBkcm9wZG93bkxpc3RDb21wb25lbnQhOiBDb21wb25lbnRSZWY8Tmd2VHlwZWFoZWFkRHJvcGRvd25MaXN0Q29tcG9uZW50PlxuICBpbnB1dENvbXBvbmVudCE6IENvbXBvbmVudFJlZjxOZ3ZUeXBlYWhlYWRJbnB1dENvbXBvbmVudD5cblxuICBwcml2YXRlIHR5cGVhaGVhZEZ1bmN0aW9uPzogT3BlcmF0b3JGdW5jdGlvbjxzdHJpbmcsIFRbXT5cbiAgcHJpdmF0ZSBpbnB1dFZhbHVlJCA9IG5ldyBTdWJqZWN0PGFueT4oKVxuICBwcml2YXRlIGlucHV0U3Vic2NyaXB0aW9uJD86IFN1YnNjcmlwdGlvblxuICBwcml2YXRlIG9uRGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBASG9zdCgpIHByaXZhdGUgaG9zdERyb3Bkb3duOiBOZ3ZEcm9wZG93bkNvbXBvbmVudCxcbiAgICBAT3B0aW9uYWwoKSBASG9zdCgpIHByaXZhdGUgaG9zdElucHV0OiBOZ3ZJbnB1dENvbXBvbmVudCxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaGFuZGxlSW5wdXRDaGFuZ2VzKClcbiAgICB0aGlzLmlucHV0VmFsdWUkLm5leHQoJycpXG5cbiAgICBpZiAodGhpcy5ob3N0SXNEcm9wZG93bikgdGhpcy5jcmVhdGVJbnB1dCgpXG4gICAgZWxzZSB0aGlzLmNyZWF0ZURyb3Bkb3duTGlzdCgpXG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveSQubmV4dCh0cnVlKVxuICAgIHRoaXMub25EZXN0cm95JC5jb21wbGV0ZSgpXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIENvcmUgZnVuY3Rpb25hbGl0eSBvZiB0eXBlYWhlYWQuIEVtaXRzIGlucHV0LCB0aGVuIGZpbHRlcnMgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGUgc3VwcGxpZWQgZnVuY3Rpb25cbiAgICogSWYgZGlyZWN0aXZlIGlzIGFwcGxpZWQgb24gbmdndi1pbnB1dCwgbWFudWFsbHkgc2hvdyBvciBoaWRlIG9wdGlvbnMgaW4gdGhlIGxpc3QuXG4gICAqIElmIGRpcmVjdGl2ZSBpcyBhcHBsaWVkIG9uIG5nZ3YtZHJvcGRvd24sIGxldCB0aGUgZHJvcGRvd24gaXRzZWxmIGNob29zZSB3aGVuIHRvIG9wZW4gb3IgY2xvc2VcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlSW5wdXRDaGFuZ2VzKCkge1xuICAgIHRoaXMuaW5wdXRTdWJzY3JpcHRpb24kID0gdGhpcy5pbnB1dFZhbHVlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YXAoKGlucHV0VmFsdWUpID0+IHRoaXMuZmlsdGVyUGhyYXNlQ2hhbmdlLmVtaXQoaW5wdXRWYWx1ZSkpLFxuICAgICAgICB0aGlzLnR5cGVhaGVhZEZ1bmN0aW9uID8gdGhpcy50eXBlYWhlYWRGdW5jdGlvbiA6ICgpID0+IGZyb20oW10pLFxuICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmlucHV0VmFsdWUkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKFtmaWx0ZXJlZFZhbHVlcywgaW5wdXRdKSA9PlxuICAgICAgICB0aGlzLnNldE9wdGlvbnMoZmlsdGVyZWRWYWx1ZXMsIGlucHV0KSxcbiAgICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQ3JlYXRlcyBhIG5nZ3YtaW5wdXQgaWYgdGhlIGhvc3QgaXRzZWxmIGlzIG5vdCBhIHRleHQtaW5wdXRcbiAgICogU2V0IHN0eWxlcyB0byBub3QgZGlzcGxheSB0aGUgaW5wdXQgd2hlbiBjbG9zZWRcbiAgICogVHJpZ2dlciBmaWx0ZXJpbmcgd2hlbiBjaGFuZ2VzIG9jY3VyIGluIHRoZSBmaWVsZFxuICAgKiAqL1xuICBwcml2YXRlIGNyZWF0ZUlucHV0KCkge1xuICAgIC8vIENyZWF0ZSB0aGUgaW5wdXQgY29tcG9uZW50XG4gICAgdGhpcy5pbnB1dENvbXBvbmVudCA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXG4gICAgICBOZ3ZUeXBlYWhlYWRJbnB1dENvbXBvbmVudCxcbiAgICApXG4gICAgLy8gRm9yd2FyZCBuZWNlc3NhcnkgaW5mbyB0byBjb21wb25lbnRcbiAgICB0aGlzLmlucHV0Q29tcG9uZW50LnNldElucHV0KCdob3N0Q29tcG9uZW50JywgdGhpcy5ob3N0RHJvcGRvd24pXG4gICAgdGhpcy5pbnB1dENvbXBvbmVudC5zZXRJbnB1dCgnc2VsZWN0ZWRGb3JtYXR0ZXInLCB0aGlzLnNlbGVjdGVkRm9ybWF0dGVyKVxuICAgIHRoaXMuaW5wdXRDb21wb25lbnQuc2V0SW5wdXQoJ3Jlc3VsdEZvcm1hdHRlcicsIHRoaXMucmVzdWx0Rm9ybWF0dGVyKVxuICAgIC8vIExpc3RlbiB0byB2YWx1ZSBjaGFuZ2VzXG4gICAgdGhpcy5pbnB1dENvbXBvbmVudC5pbnN0YW5jZS5uZ2d2SW5wdXRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoaW5wdXRWYWx1ZSkgPT4gdGhpcy5pbnB1dFZhbHVlJC5uZXh0KGlucHV0VmFsdWUpKVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBDcmVhdGVzIGEgbmdndi1kcm9wZG93bi1saXN0IGlmIHRoZSBob3N0IGl0c2VsZiBpcyBhIG5nZ3YtaW5wdXQgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEcm9wZG93bkxpc3QoKSB7XG4gICAgdGhpcy5kcm9wZG93bkxpc3RDb21wb25lbnQgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgTmd2VHlwZWFoZWFkRHJvcGRvd25MaXN0Q29tcG9uZW50LFxuICAgIClcbiAgICB0aGlzLmRyb3Bkb3duTGlzdENvbXBvbmVudC5zZXRJbnB1dCgnaG9zdENvbXBvbmVudCcsIHRoaXMuaG9zdElucHV0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBTZXRzIHRoZSBvcHRpb25zIHRoZSB1c2VyIGNhbiBzZWxlY3QuXG4gICAqIElmIHRoZSBob3N0IGlzIGEgbmdndi1kcm9wZG93biwgdXRpbGl6ZSB0aGUgZHJvcGRvd24gaXRzZWxmIHRvIGRpc3BsYXkgdGhlIG9wdGlvbnNcbiAgICogSWYgdGhlIGhvc3QgaXMgYSBuZ2d2LWlucHV0LCB1c2UgdGhlIGNyZWF0ZWQgbmdndi1kcm9wZG93bi1saXN0IHRvIGRpc3BsYXllIHRoZSBvcHRpb25zXG4gICAqIEBwYXJhbSBmaWx0ZXJlZFZhbHVlcyBUaGUgb3B0aW9ucyB0byBkaXNwbGF5IGluIHRoZSBkcm9wZG93blxuICAgKiBAcGFyYW0gZW1wdHlJbnB1dCBJZiB0aGUgaW5wdXQgaXMgZW1wdHlcbiAgICovXG4gIHByaXZhdGUgc2V0T3B0aW9ucyhmaWx0ZXJlZFZhbHVlczogVFtdLCBpbnB1dDogc3RyaW5nKSB7XG4gICAgaWYgKCFmaWx0ZXJlZFZhbHVlcykgcmV0dXJuXG4gICAgLy8gQ29uZGl0aW9uYWxseSBhZGQgZW1wdHkgb3IgbnVsbGlzaCBvcHRpb24gaWYgaXQncyBhbGxvd2VkLCB0aGUgaW5wdXQgaXMgZW1wdHkgYW5kIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBudWxsaXNoXG4gICAgY29uc3QgYWxsb3dOdWxsaXNoID1cbiAgICAgIHRoaXMuYWxsb3dVbnNlbGVjdCAmJlxuICAgICAgIWlucHV0ICYmXG4gICAgICAhKFxuICAgICAgICBPYmplY3Qua2V5cyhmaWx0ZXJlZFZhbHVlc1swXSkuaW5jbHVkZXMoJ2tleScpICYmXG4gICAgICAgIGZpbHRlcmVkVmFsdWVzWzBdLmtleSA9PSBudWxsXG4gICAgICApXG4gICAgaWYgKGZpbHRlcmVkVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZmlsdGVyZWRWYWx1ZXMgPSBbdGhpcy5lbXB0eU9wdGlvbl1cbiAgICB9IGVsc2UgaWYgKGFsbG93TnVsbGlzaCkge1xuICAgICAgZmlsdGVyZWRWYWx1ZXMgPSBbdGhpcy5kZWZhdWx0TnVsbGlzaE9wdGlvbl0uY29uY2F0KGZpbHRlcmVkVmFsdWVzKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmhvc3RJc0Ryb3Bkb3duKSB7XG4gICAgICAvLyBBZGQgbnVsbGlzaCBvcHRpb24gd2hlbiBubyBpbnB1dCBpcyB3cml0dGVuIChvciB3aGVuIGRyb3Bkb3duIGlzIGVwYW5kZWQgYW5kIGhhcyBhIHNlbGVjdGlvbilcbiAgICAgIHRoaXMuaG9zdERyb3Bkb3duLmFsbG93Q29udHJvbE51bGxpc2hPcHRpb24gPSBmYWxzZVxuICAgICAgdGhpcy5ob3N0RHJvcGRvd24ub3B0aW9ucyA9IHRoaXMuZm9ybWF0T3B0aW9ucyhmaWx0ZXJlZFZhbHVlcylcbiAgICAgIHRoaXMuaG9zdERyb3Bkb3duLnRleHRUb0hpZ2hsaWdodCA9IGAke2lucHV0IHx8ICcnfWBcbiAgICAgIHRoaXMuaG9zdERyb3Bkb3duLmRldGVjdENoYW5nZXMoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhvc3RJc0Ryb3Bkb3duKSB7XG4gICAgICB0aGlzLmRyb3Bkb3duTGlzdENvbXBvbmVudC5zZXRJbnB1dChcbiAgICAgICAgJ29wdGlvbnMnLFxuICAgICAgICB0aGlzLmZvcm1hdE9wdGlvbnMoZmlsdGVyZWRWYWx1ZXMpLFxuICAgICAgKVxuICAgICAgdGhpcy5kcm9wZG93bkxpc3RDb21wb25lbnQuc2V0SW5wdXQoJ3RleHRUb0hpZ2hsaWdodCcsIGAke2lucHV0IHx8ICcnfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBGb3JtYXRzIHRoZSBhdmFpbGFibGUgb3B0aW9ucyB0byBkaXNwbGF5IGluIHRoZSBkcm9wZG93biBsaXN0XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdE9wdGlvbnMob3B0aW9uczogVFtdKTogT3B0aW9uQmFzZTxhbnk+W10ge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFtdXG4gICAgaWYgKCF0aGlzLnJlc3VsdEZvcm1hdHRlcikgcmV0dXJuIG9wdGlvbnNcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAoKHZhbHVlKSA9PlxuICAgICAgdmFsdWU/LmxhYmVsID8gdGhpcy5yZXN1bHRGb3JtYXR0ZXI/Lih2YWx1ZSkgOiB2YWx1ZSxcbiAgICApXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { NgvTypeaheadHighlightComponent } from './typeahead-highlight/typeahead-highlight.component';
4
+ import { NgvTypeaheadInputComponent } from './typeahead-input/typeahead-input.component';
5
+ import { NgvTooltipModule } from '@sebgroup/green-angular/src/v-angular/tooltip';
6
+ import { NgvTypeaheadDropdownListComponent } from './typeahead-dropdown-list/typeahead-dropdown-list.component';
7
+ import * as i0 from "@angular/core";
8
+ export class NgvTypeaheadModule {
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadModule, declarations: [NgvTypeaheadHighlightComponent,
11
+ NgvTypeaheadInputComponent,
12
+ NgvTypeaheadDropdownListComponent], imports: [CommonModule, NgvTooltipModule], exports: [NgvTypeaheadHighlightComponent,
13
+ NgvTypeaheadInputComponent,
14
+ NgvTypeaheadDropdownListComponent] }); }
15
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadModule, imports: [CommonModule, NgvTooltipModule] }); }
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvTypeaheadModule, decorators: [{
18
+ type: NgModule,
19
+ args: [{
20
+ declarations: [
21
+ NgvTypeaheadHighlightComponent,
22
+ NgvTypeaheadInputComponent,
23
+ NgvTypeaheadDropdownListComponent,
24
+ ],
25
+ imports: [CommonModule, NgvTooltipModule],
26
+ exports: [
27
+ NgvTypeaheadHighlightComponent,
28
+ NgvTypeaheadInputComponent,
29
+ NgvTypeaheadDropdownListComponent,
30
+ ],
31
+ }]
32
+ }] });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zcmMvdi1hbmd1bGFyL2Ryb3Bkb3duL3R5cGVhaGVhZC90eXBlYWhlYWQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFBO0FBQ3BHLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFBO0FBQ3hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFBO0FBQ2hGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLDZEQUE2RCxDQUFBOztBQWUvRyxNQUFNLE9BQU8sa0JBQWtCOytHQUFsQixrQkFBa0I7Z0hBQWxCLGtCQUFrQixpQkFYM0IsOEJBQThCO1lBQzlCLDBCQUEwQjtZQUMxQixpQ0FBaUMsYUFFekIsWUFBWSxFQUFFLGdCQUFnQixhQUV0Qyw4QkFBOEI7WUFDOUIsMEJBQTBCO1lBQzFCLGlDQUFpQztnSEFHeEIsa0JBQWtCLFlBUG5CLFlBQVksRUFBRSxnQkFBZ0I7OzRGQU83QixrQkFBa0I7a0JBYjlCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLDhCQUE4Qjt3QkFDOUIsMEJBQTBCO3dCQUMxQixpQ0FBaUM7cUJBQ2xDO29CQUNELE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQztvQkFDekMsT0FBTyxFQUFFO3dCQUNQLDhCQUE4Qjt3QkFDOUIsMEJBQTBCO3dCQUMxQixpQ0FBaUM7cUJBQ2xDO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHsgTmd2VHlwZWFoZWFkSGlnaGxpZ2h0Q29tcG9uZW50IH0gZnJvbSAnLi90eXBlYWhlYWQtaGlnaGxpZ2h0L3R5cGVhaGVhZC1oaWdobGlnaHQuY29tcG9uZW50J1xuaW1wb3J0IHsgTmd2VHlwZWFoZWFkSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3R5cGVhaGVhZC1pbnB1dC90eXBlYWhlYWQtaW5wdXQuY29tcG9uZW50J1xuaW1wb3J0IHsgTmd2VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0BzZWJncm91cC9ncmVlbi1hbmd1bGFyL3NyYy92LWFuZ3VsYXIvdG9vbHRpcCdcbmltcG9ydCB7IE5ndlR5cGVhaGVhZERyb3Bkb3duTGlzdENvbXBvbmVudCB9IGZyb20gJy4vdHlwZWFoZWFkLWRyb3Bkb3duLWxpc3QvdHlwZWFoZWFkLWRyb3Bkb3duLWxpc3QuY29tcG9uZW50J1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBOZ3ZUeXBlYWhlYWRIaWdobGlnaHRDb21wb25lbnQsXG4gICAgTmd2VHlwZWFoZWFkSW5wdXRDb21wb25lbnQsXG4gICAgTmd2VHlwZWFoZWFkRHJvcGRvd25MaXN0Q29tcG9uZW50LFxuICBdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBOZ3ZUb29sdGlwTW9kdWxlXSxcbiAgZXhwb3J0czogW1xuICAgIE5ndlR5cGVhaGVhZEhpZ2hsaWdodENvbXBvbmVudCxcbiAgICBOZ3ZUeXBlYWhlYWRJbnB1dENvbXBvbmVudCxcbiAgICBOZ3ZUeXBlYWhlYWREcm9wZG93bkxpc3RDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndlR5cGVhaGVhZE1vZHVsZSB7fVxuIl19
@@ -0,0 +1,12 @@
1
+ {
2
+ "error.fieldinputmask": "Invalid value pattern",
3
+ "error.fieldrequired": "Field must have content",
4
+ "error.fieldmaxlength": "Field content should not be longer than {{requiredLength}} characters",
5
+ "label.defaultlabel": "Label",
6
+ "label.maxlength": "characters left",
7
+ "label.optional": "Optional",
8
+ "button_cancel": "Cancel",
9
+ "button_apply": "Apply",
10
+ "button_save": "Save",
11
+ "text_dialogue": "You can supply the content seen here either through the <code>[content]=\"string\"</code> property or</br>by passing children between the opening and closing tags <code>&lt;c-dialog&gt; ...children &lt;/c-dialog&gt;</code>"
12
+ }
@@ -0,0 +1,83 @@
1
+ import { Inject, Injectable, isDevMode, NgModule } from '@angular/core';
2
+ import { delay, lastValueFrom, of } from 'rxjs';
3
+ import { provideTransloco, provideTranslocoMissingHandler, TRANSLOCO_TRANSPILER, TranslocoModule, } from '@ngneat/transloco';
4
+ import defaultLang from './i18n.json';
5
+ import * as i0 from "@angular/core";
6
+ export class NgvMissingHandler {
7
+ constructor(transpiler) {
8
+ this.transpiler = transpiler;
9
+ }
10
+ handle(key, _, params) {
11
+ const keyWithoutLocale = key.charAt(2) === '.' ? key.substring(3) : key;
12
+ const withoutScope = keyWithoutLocale.replace(/^((?:\w+)(?<!label|heading|button|alt|link|title|href|fieldhelp|error|text|image|list)(?:\.))/, '');
13
+ const transpiledKey = this.transpiler.transpile(defaultLang[keyWithoutLocale], params, {}, keyWithoutLocale);
14
+ return transpiledKey || withoutScope;
15
+ }
16
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvMissingHandler, deps: [{ token: TRANSLOCO_TRANSPILER }], target: i0.ɵɵFactoryTarget.Injectable }); }
17
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvMissingHandler }); }
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvMissingHandler, decorators: [{
20
+ type: Injectable
21
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
22
+ type: Inject,
23
+ args: [TRANSLOCO_TRANSPILER]
24
+ }] }]; } });
25
+ const en = {
26
+ 'error.fieldinputmask': 'Invalid value pattern',
27
+ 'error.fieldrequired': 'Field must have content',
28
+ 'error.fieldmaxlength': 'Field content should not be longer than {{requiredLength}} characters',
29
+ 'label.defaultlabel': 'Label',
30
+ 'label.maxlength': 'characters left',
31
+ 'label.optional': 'Optional',
32
+ };
33
+ const sv = {
34
+ 'error.fieldinputmask': 'Icke giltigt tecken mönster',
35
+ 'error.fieldrequired': 'Fältet får inte lämnas tomt',
36
+ 'error.fieldmaxlength': 'Fältinnehållet måste vara längre än {{requiredLength}} tecken',
37
+ 'label.maxlength': 'tecken kvar',
38
+ };
39
+ class TranslocoInlineLoader {
40
+ getTranslation(lang) {
41
+ if (lang === 'sv') {
42
+ return lastValueFrom(of(sv).pipe(delay(1500)));
43
+ }
44
+ return lastValueFrom(of(en).pipe(delay(500)));
45
+ }
46
+ }
47
+ export class NgvI18nModule {
48
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvI18nModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
49
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: NgvI18nModule, exports: [TranslocoModule] }); }
50
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvI18nModule, providers: [
51
+ provideTransloco({
52
+ config: {
53
+ availableLangs: ['en', 'sv'],
54
+ defaultLang: 'en',
55
+ // Remove this option if your application doesn't support changing language in runtime.
56
+ reRenderOnLangChange: true,
57
+ prodMode: !isDevMode(),
58
+ },
59
+ loader: TranslocoInlineLoader,
60
+ }),
61
+ provideTranslocoMissingHandler(NgvMissingHandler),
62
+ ], imports: [TranslocoModule] }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgvI18nModule, decorators: [{
65
+ type: NgModule,
66
+ args: [{
67
+ providers: [
68
+ provideTransloco({
69
+ config: {
70
+ availableLangs: ['en', 'sv'],
71
+ defaultLang: 'en',
72
+ // Remove this option if your application doesn't support changing language in runtime.
73
+ reRenderOnLangChange: true,
74
+ prodMode: !isDevMode(),
75
+ },
76
+ loader: TranslocoInlineLoader,
77
+ }),
78
+ provideTranslocoMissingHandler(NgvMissingHandler),
79
+ ],
80
+ exports: [TranslocoModule],
81
+ }]
82
+ }] });
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL3YtYW5ndWxhci9pMThuL2kxOG4ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEUsT0FBTyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsOEJBQThCLEVBQzlCLG9CQUFvQixFQUlwQixlQUFlLEdBRWhCLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDOztBQUd0QyxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLFlBQWtELFVBQStCO1FBQS9CLGVBQVUsR0FBVixVQUFVLENBQXFCO0lBQUcsQ0FBQztJQUNyRixNQUFNLENBQUMsR0FBVyxFQUFFLENBQThCLEVBQUUsTUFBZTtRQUNqRSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDeEUsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUMzQywrRkFBK0YsRUFDL0YsRUFBRSxDQUNILENBQUM7UUFDRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FDN0MsV0FBVyxDQUFDLGdCQUE0QyxDQUFDLEVBQ3pELE1BQU0sRUFDTixFQUFFLEVBQ0YsZ0JBQWdCLENBQ2pCLENBQUM7UUFDRixPQUFPLGFBQWEsSUFBSSxZQUFZLENBQUM7SUFDdkMsQ0FBQzsrR0FmVSxpQkFBaUIsa0JBQ1Isb0JBQW9CO21IQUQ3QixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVU7OzBCQUVJLE1BQU07MkJBQUMsb0JBQW9COztBQWlCMUMsTUFBTSxFQUFFLEdBQUc7SUFDVCxzQkFBc0IsRUFBRSx1QkFBdUI7SUFDL0MscUJBQXFCLEVBQUUseUJBQXlCO0lBQ2hELHNCQUFzQixFQUFFLHVFQUF1RTtJQUMvRixvQkFBb0IsRUFBRSxPQUFPO0lBQzdCLGlCQUFpQixFQUFFLGlCQUFpQjtJQUNwQyxnQkFBZ0IsRUFBRSxVQUFVO0NBQzdCLENBQUM7QUFFRixNQUFNLEVBQUUsR0FBRztJQUNULHNCQUFzQixFQUFFLDZCQUE2QjtJQUNyRCxxQkFBcUIsRUFBRSw2QkFBNkI7SUFDcEQsc0JBQXNCLEVBQUUsK0RBQStEO0lBQ3ZGLGlCQUFpQixFQUFFLGFBQWE7Q0FDakMsQ0FBQztBQUNGLE1BQU0scUJBQXFCO0lBQ3pCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNqQixPQUFPLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxPQUFPLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGO0FBa0JELE1BQU0sT0FBTyxhQUFhOytHQUFiLGFBQWE7Z0hBQWIsYUFBYSxZQUZkLGVBQWU7Z0hBRWQsYUFBYSxhQWZiO1lBQ1QsZ0JBQWdCLENBQUM7Z0JBQ2YsTUFBTSxFQUFFO29CQUNOLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7b0JBQzVCLFdBQVcsRUFBRSxJQUFJO29CQUNqQix1RkFBdUY7b0JBQ3ZGLG9CQUFvQixFQUFFLElBQUk7b0JBQzFCLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRTtpQkFDdkI7Z0JBQ0QsTUFBTSxFQUFFLHFCQUFxQjthQUM5QixDQUFDO1lBQ0YsOEJBQThCLENBQUMsaUJBQWlCLENBQUM7U0FDbEQsWUFDUyxlQUFlOzs0RkFFZCxhQUFhO2tCQWhCekIsUUFBUTttQkFBQztvQkFDUixTQUFTLEVBQUU7d0JBQ1QsZ0JBQWdCLENBQUM7NEJBQ2YsTUFBTSxFQUFFO2dDQUNOLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7Z0NBQzVCLFdBQVcsRUFBRSxJQUFJO2dDQUNqQix1RkFBdUY7Z0NBQ3ZGLG9CQUFvQixFQUFFLElBQUk7Z0NBQzFCLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRTs2QkFDdkI7NEJBQ0QsTUFBTSxFQUFFLHFCQUFxQjt5QkFDOUIsQ0FBQzt3QkFDRiw4QkFBOEIsQ0FBQyxpQkFBaUIsQ0FBQztxQkFDbEQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO2lCQUMzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgaXNEZXZNb2RlLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBkZWxheSwgbGFzdFZhbHVlRnJvbSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgSGFzaE1hcCxcbiAgcHJvdmlkZVRyYW5zbG9jbyxcbiAgcHJvdmlkZVRyYW5zbG9jb01pc3NpbmdIYW5kbGVyLFxuICBUUkFOU0xPQ09fVFJBTlNQSUxFUixcbiAgVHJhbnNsb2NvTG9hZGVyLFxuICBUcmFuc2xvY29NaXNzaW5nSGFuZGxlcixcbiAgVHJhbnNsb2NvTWlzc2luZ0hhbmRsZXJEYXRhLFxuICBUcmFuc2xvY29Nb2R1bGUsXG4gIFRyYW5zbG9jb1RyYW5zcGlsZXIsXG59IGZyb20gJ0BuZ25lYXQvdHJhbnNsb2NvJztcblxuaW1wb3J0IGRlZmF1bHRMYW5nIGZyb20gJy4vaTE4bi5qc29uJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5ndk1pc3NpbmdIYW5kbGVyIGltcGxlbWVudHMgVHJhbnNsb2NvTWlzc2luZ0hhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KFRSQU5TTE9DT19UUkFOU1BJTEVSKSBwcml2YXRlIHRyYW5zcGlsZXI6IFRyYW5zbG9jb1RyYW5zcGlsZXIpIHt9XG4gIGhhbmRsZShrZXk6IHN0cmluZywgXzogVHJhbnNsb2NvTWlzc2luZ0hhbmRsZXJEYXRhLCBwYXJhbXM6IEhhc2hNYXApIHtcbiAgICBjb25zdCBrZXlXaXRob3V0TG9jYWxlID0ga2V5LmNoYXJBdCgyKSA9PT0gJy4nID8ga2V5LnN1YnN0cmluZygzKSA6IGtleTtcbiAgICBjb25zdCB3aXRob3V0U2NvcGUgPSBrZXlXaXRob3V0TG9jYWxlLnJlcGxhY2UoXG4gICAgICAvXigoPzpcXHcrKSg/PCFsYWJlbHxoZWFkaW5nfGJ1dHRvbnxhbHR8bGlua3x0aXRsZXxocmVmfGZpZWxkaGVscHxlcnJvcnx0ZXh0fGltYWdlfGxpc3QpKD86XFwuKSkvLFxuICAgICAgJycsXG4gICAgKTtcbiAgICBjb25zdCB0cmFuc3BpbGVkS2V5ID0gdGhpcy50cmFuc3BpbGVyLnRyYW5zcGlsZShcbiAgICAgIGRlZmF1bHRMYW5nW2tleVdpdGhvdXRMb2NhbGUgYXMga2V5b2YgdHlwZW9mIGRlZmF1bHRMYW5nXSxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHt9LFxuICAgICAga2V5V2l0aG91dExvY2FsZSxcbiAgICApO1xuICAgIHJldHVybiB0cmFuc3BpbGVkS2V5IHx8IHdpdGhvdXRTY29wZTtcbiAgfVxufVxuXG5jb25zdCBlbiA9IHtcbiAgJ2Vycm9yLmZpZWxkaW5wdXRtYXNrJzogJ0ludmFsaWQgdmFsdWUgcGF0dGVybicsXG4gICdlcnJvci5maWVsZHJlcXVpcmVkJzogJ0ZpZWxkIG11c3QgaGF2ZSBjb250ZW50JyxcbiAgJ2Vycm9yLmZpZWxkbWF4bGVuZ3RoJzogJ0ZpZWxkIGNvbnRlbnQgc2hvdWxkIG5vdCBiZSBsb25nZXIgdGhhbiB7e3JlcXVpcmVkTGVuZ3RofX0gY2hhcmFjdGVycycsXG4gICdsYWJlbC5kZWZhdWx0bGFiZWwnOiAnTGFiZWwnLFxuICAnbGFiZWwubWF4bGVuZ3RoJzogJ2NoYXJhY3RlcnMgbGVmdCcsXG4gICdsYWJlbC5vcHRpb25hbCc6ICdPcHRpb25hbCcsXG59O1xuXG5jb25zdCBzdiA9IHtcbiAgJ2Vycm9yLmZpZWxkaW5wdXRtYXNrJzogJ0lja2UgZ2lsdGlndCB0ZWNrZW4gbcO2bnN0ZXInLFxuICAnZXJyb3IuZmllbGRyZXF1aXJlZCc6ICdGw6RsdGV0IGbDpXIgaW50ZSBsw6RtbmFzIHRvbXQnLFxuICAnZXJyb3IuZmllbGRtYXhsZW5ndGgnOiAnRsOkbHRpbm5laMOlbGxldCBtw6VzdGUgdmFyYSBsw6RuZ3JlIMOkbiB7e3JlcXVpcmVkTGVuZ3RofX0gdGVja2VuJyxcbiAgJ2xhYmVsLm1heGxlbmd0aCc6ICd0ZWNrZW4ga3ZhcicsXG59O1xuY2xhc3MgVHJhbnNsb2NvSW5saW5lTG9hZGVyIGltcGxlbWVudHMgVHJhbnNsb2NvTG9hZGVyIHtcbiAgZ2V0VHJhbnNsYXRpb24obGFuZzogc3RyaW5nKSB7XG4gICAgaWYgKGxhbmcgPT09ICdzdicpIHtcbiAgICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKG9mKHN2KS5waXBlKGRlbGF5KDE1MDApKSk7XG4gICAgfVxuICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKG9mKGVuKS5waXBlKGRlbGF5KDUwMCkpKTtcbiAgfVxufVxuXG5ATmdNb2R1bGUoe1xuICBwcm92aWRlcnM6IFtcbiAgICBwcm92aWRlVHJhbnNsb2NvKHtcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBhdmFpbGFibGVMYW5nczogWydlbicsICdzdiddLFxuICAgICAgICBkZWZhdWx0TGFuZzogJ2VuJyxcbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgb3B0aW9uIGlmIHlvdXIgYXBwbGljYXRpb24gZG9lc24ndCBzdXBwb3J0IGNoYW5naW5nIGxhbmd1YWdlIGluIHJ1bnRpbWUuXG4gICAgICAgIHJlUmVuZGVyT25MYW5nQ2hhbmdlOiB0cnVlLFxuICAgICAgICBwcm9kTW9kZTogIWlzRGV2TW9kZSgpLFxuICAgICAgfSxcbiAgICAgIGxvYWRlcjogVHJhbnNsb2NvSW5saW5lTG9hZGVyLFxuICAgIH0pLFxuICAgIHByb3ZpZGVUcmFuc2xvY29NaXNzaW5nSGFuZGxlcihOZ3ZNaXNzaW5nSGFuZGxlciksXG4gIF0sXG4gIGV4cG9ydHM6IFtUcmFuc2xvY29Nb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3ZJMThuTW9kdWxlIHt9XG4iXX0=