design-angular-kit 1.0.0-0 → 1.0.0-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 (229) hide show
  1. package/README.md +183 -24
  2. package/assets/i18n/en.json +93 -0
  3. package/assets/i18n/it.json +93 -0
  4. package/esm2020/lib/abstracts/abstract-form-component.mjs +174 -0
  5. package/esm2020/lib/abstracts/abstract.component.mjs +27 -0
  6. package/esm2020/lib/components/core/accordion/accordion.component.mjs +31 -0
  7. package/esm2020/lib/components/core/alert/alert.component.mjs +69 -0
  8. package/esm2020/lib/components/core/badge/badge.directive.mjs +34 -0
  9. package/esm2020/lib/components/core/button/button.directive.mjs +80 -0
  10. package/esm2020/lib/components/core/callout/callout.component.mjs +84 -0
  11. package/esm2020/lib/components/core/card/card.component.mjs +58 -0
  12. package/esm2020/lib/components/core/carousel/carousel/carousel.component.mjs +66 -0
  13. package/esm2020/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +14 -0
  14. package/esm2020/lib/components/core/chip/chip.component.mjs +89 -0
  15. package/esm2020/lib/components/core/collapse/collapse.component.mjs +101 -0
  16. package/esm2020/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +24 -0
  17. package/esm2020/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +11 -0
  18. package/esm2020/lib/components/core/dimmer/dimmer.component.mjs +59 -0
  19. package/esm2020/lib/components/core/dropdown/dropdown/dropdown.component.mjs +130 -0
  20. package/esm2020/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +68 -0
  21. package/esm2020/lib/components/core/forward/forward.directive.mjs +51 -0
  22. package/esm2020/lib/components/core/link/link.component.mjs +40 -0
  23. package/esm2020/lib/components/core/list/list/list.component.mjs +13 -0
  24. package/esm2020/lib/components/core/list/list-item/list-item.component.mjs +36 -0
  25. package/esm2020/lib/components/core/modal/modal.component.mjs +98 -0
  26. package/esm2020/lib/components/core/notifications/notifications.component.mjs +110 -0
  27. package/esm2020/lib/components/core/pagination/pagination.component.mjs +51 -0
  28. package/esm2020/lib/components/core/popover/popover.directive.mjs +179 -0
  29. package/esm2020/lib/components/core/progress-bar/progress-bar.component.mjs +34 -0
  30. package/esm2020/lib/components/core/progress-button/progress-button.component.mjs +27 -0
  31. package/esm2020/lib/components/core/rating/rating.component.mjs +45 -0
  32. package/esm2020/lib/components/core/spinner/spinner.component.mjs +35 -0
  33. package/esm2020/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +119 -0
  34. package/esm2020/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +18 -0
  35. package/esm2020/lib/components/core/tab/tab-container/tab-container.component.mjs +59 -0
  36. package/esm2020/lib/components/core/tab/tab-item/tab-item.component.mjs +36 -0
  37. package/esm2020/lib/components/core/table/table.component.mjs +57 -0
  38. package/esm2020/lib/components/core/tooltip/tooltip.directive.mjs +143 -0
  39. package/esm2020/lib/components/form/checkbox/checkbox.component.mjs +40 -0
  40. package/esm2020/lib/components/form/input/input.component.mjs +222 -0
  41. package/esm2020/lib/components/form/password-input/password-input.component.mjs +112 -0
  42. package/esm2020/lib/components/form/radio-button/radio-button.component.mjs +53 -0
  43. package/esm2020/lib/components/form/select/select.component.mjs +62 -0
  44. package/esm2020/lib/components/form/textarea/textarea.component.mjs +46 -0
  45. package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +137 -0
  46. package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +104 -0
  47. package/esm2020/lib/components/navigation/back-button/back-button.component.mjs +69 -0
  48. package/esm2020/lib/components/navigation/back-to-top/back-to-top.component.mjs +74 -0
  49. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +45 -0
  50. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +23 -0
  51. package/esm2020/lib/components/navigation/header/header.component.mjs +63 -0
  52. package/esm2020/lib/components/utils/icon/icon.component.mjs +54 -0
  53. package/esm2020/lib/components/utils/language-switcher/language-switcher.component.mjs +39 -0
  54. package/esm2020/lib/components/utils/not-found-page/not-found-page.component.mjs +13 -0
  55. package/esm2020/lib/design-angular-kit.module.mjs +45 -131
  56. package/esm2020/lib/interfaces/core.mjs +16 -0
  57. package/esm2020/lib/interfaces/form.mjs +2 -0
  58. package/esm2020/lib/interfaces/icon.mjs +2 -0
  59. package/esm2020/lib/interfaces/utils.mjs +2 -0
  60. package/esm2020/lib/modules/components.module.mjs +261 -0
  61. package/esm2020/lib/pipes/mark-matching-text.pipe.mjs +36 -0
  62. package/esm2020/lib/services/notifications/notifications.service.mjs +120 -0
  63. package/esm2020/lib/utils/boolean-input.mjs +15 -0
  64. package/esm2020/lib/utils/file-utils.mjs +73 -0
  65. package/esm2020/lib/utils/regex.mjs +26 -0
  66. package/esm2020/lib/validators/it-validators.mjs +134 -0
  67. package/esm2020/public_api.mjs +67 -36
  68. package/fesm2015/design-angular-kit.mjs +3424 -2713
  69. package/fesm2015/design-angular-kit.mjs.map +1 -1
  70. package/fesm2020/design-angular-kit.mjs +3391 -2713
  71. package/fesm2020/design-angular-kit.mjs.map +1 -1
  72. package/lib/abstracts/abstract-form-component.d.ts +89 -0
  73. package/lib/abstracts/abstract.component.d.ts +20 -0
  74. package/lib/components/core/accordion/accordion.component.d.ts +12 -0
  75. package/lib/components/core/alert/alert.component.d.ts +39 -0
  76. package/lib/components/core/badge/badge.directive.d.ts +16 -0
  77. package/lib/components/core/button/button.directive.d.ts +36 -0
  78. package/lib/components/core/callout/callout.component.d.ts +47 -0
  79. package/lib/components/core/card/card.component.d.ts +41 -0
  80. package/lib/components/core/carousel/carousel/carousel.component.d.ts +46 -0
  81. package/lib/components/core/carousel/carousel-item/carousel-item.component.d.ts +10 -0
  82. package/lib/components/core/chip/chip.component.d.ts +62 -0
  83. package/lib/components/core/collapse/collapse.component.d.ts +60 -0
  84. package/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.d.ts +12 -0
  85. package/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.d.ts +5 -0
  86. package/lib/components/core/dimmer/dimmer.component.d.ts +24 -0
  87. package/lib/components/core/dropdown/dropdown/dropdown.component.d.ts +81 -0
  88. package/lib/components/core/dropdown/dropdown-item/dropdown-item.component.d.ts +39 -0
  89. package/lib/components/core/forward/forward.directive.d.ts +14 -0
  90. package/lib/components/core/link/link.component.d.ts +31 -0
  91. package/lib/components/core/list/list/list.component.d.ts +10 -0
  92. package/lib/components/core/list/list-item/list-item.component.d.ts +24 -0
  93. package/lib/components/core/modal/modal.component.d.ts +59 -0
  94. package/lib/components/core/notifications/notifications.component.d.ts +44 -0
  95. package/lib/components/core/pagination/pagination.component.d.ts +31 -0
  96. package/lib/components/core/popover/popover.directive.d.ts +98 -0
  97. package/lib/components/core/progress-bar/progress-bar.component.d.ts +28 -0
  98. package/lib/components/core/progress-button/progress-button.component.d.ts +22 -0
  99. package/lib/components/core/rating/rating.component.d.ts +20 -0
  100. package/lib/components/core/spinner/spinner.component.d.ts +21 -0
  101. package/lib/components/core/steppers/steppers-container/steppers-container.component.d.ts +102 -0
  102. package/lib/components/core/steppers/steppers-item/steppers-item.component.d.ts +19 -0
  103. package/lib/components/core/tab/tab-container/tab-container.component.d.ts +30 -0
  104. package/lib/components/core/tab/tab-item/tab-item.component.d.ts +34 -0
  105. package/lib/components/core/table/table.component.d.ts +54 -0
  106. package/lib/components/core/tooltip/tooltip.directive.d.ts +81 -0
  107. package/lib/components/form/checkbox/checkbox.component.d.ts +30 -0
  108. package/lib/components/form/input/input.component.d.ts +96 -0
  109. package/lib/components/form/password-input/password-input.component.d.ts +55 -0
  110. package/lib/components/form/radio-button/radio-button.component.d.ts +29 -0
  111. package/lib/components/form/select/select.component.d.ts +30 -0
  112. package/lib/components/form/textarea/textarea.component.d.ts +24 -0
  113. package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +54 -0
  114. package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +59 -0
  115. package/lib/components/navigation/back-button/back-button.component.d.ts +47 -0
  116. package/lib/components/navigation/back-to-top/back-to-top.component.d.ts +46 -0
  117. package/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.d.ts +30 -0
  118. package/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +22 -0
  119. package/lib/components/navigation/header/header.component.d.ts +30 -0
  120. package/lib/components/utils/icon/icon.component.d.ts +40 -0
  121. package/lib/components/utils/language-switcher/language-switcher.component.d.ts +23 -0
  122. package/lib/components/utils/not-found-page/not-found-page.component.d.ts +5 -0
  123. package/lib/design-angular-kit.module.d.ts +7 -24
  124. package/lib/interfaces/core.d.ts +59 -0
  125. package/lib/interfaces/form.d.ts +67 -0
  126. package/lib/interfaces/icon.d.ts +3 -0
  127. package/lib/interfaces/utils.d.ts +10 -0
  128. package/lib/modules/components.module.d.ts +62 -0
  129. package/lib/services/notifications/notifications.service.d.ts +63 -0
  130. package/lib/utils/boolean-input.d.ts +11 -0
  131. package/lib/utils/file-utils.d.ts +32 -0
  132. package/lib/utils/regex.d.ts +25 -0
  133. package/lib/validators/it-validators.d.ts +58 -0
  134. package/package.json +22 -12
  135. package/public_api.d.ts +59 -35
  136. package/esm2020/lib/badge/badge.directive.mjs +0 -83
  137. package/esm2020/lib/breadcrumb/breadcrumb-item.component.mjs +0 -66
  138. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +0 -89
  139. package/esm2020/lib/button/button.directive.mjs +0 -185
  140. package/esm2020/lib/button/button.module.mjs +0 -18
  141. package/esm2020/lib/checkbox/checkbox.component.mjs +0 -138
  142. package/esm2020/lib/collapse/collapse-group.component.mjs +0 -57
  143. package/esm2020/lib/collapse/collapse-item.component.mjs +0 -79
  144. package/esm2020/lib/collapse/collapse.config.mjs +0 -12
  145. package/esm2020/lib/collapse/collapse.directive.mjs +0 -55
  146. package/esm2020/lib/collapse/collapse.module.mjs +0 -22
  147. package/esm2020/lib/dropdown/dropdown-divider.component.mjs +0 -11
  148. package/esm2020/lib/dropdown/dropdown-item.component.mjs +0 -97
  149. package/esm2020/lib/dropdown/dropdown.component.mjs +0 -143
  150. package/esm2020/lib/dropdown/dropdown.config.mjs +0 -12
  151. package/esm2020/lib/dropdown/dropdown.directive.mjs +0 -156
  152. package/esm2020/lib/dropdown/dropdown.module.mjs +0 -25
  153. package/esm2020/lib/enums/icons.enum.mjs +0 -27
  154. package/esm2020/lib/form-input/form-input-password.utils.mjs +0 -154
  155. package/esm2020/lib/form-input/form-input.component.mjs +0 -495
  156. package/esm2020/lib/form-input/it-prefix.directive.mjs +0 -13
  157. package/esm2020/lib/form-input/it-suffix.directive.mjs +0 -13
  158. package/esm2020/lib/form-input/it-text-prefix.directive.mjs +0 -13
  159. package/esm2020/lib/form-input/it-text-suffix.directive.mjs +0 -13
  160. package/esm2020/lib/form-input/mark-matching-text.pipe.mjs +0 -36
  161. package/esm2020/lib/icon/icon.component.mjs +0 -87
  162. package/esm2020/lib/icon/icon.module.mjs +0 -18
  163. package/esm2020/lib/models/Alignment.mjs +0 -15
  164. package/esm2020/lib/models/ButtonSize.mjs +0 -15
  165. package/esm2020/lib/models/InputType.mjs +0 -44
  166. package/esm2020/lib/models/ThemeColor.mjs +0 -30
  167. package/esm2020/lib/popover/popover.config.mjs +0 -17
  168. package/esm2020/lib/popover/popover.directive.mjs +0 -33
  169. package/esm2020/lib/popover/popover.module.mjs +0 -19
  170. package/esm2020/lib/progress-bar/progress-bar.component.mjs +0 -98
  171. package/esm2020/lib/radio/radio.component.mjs +0 -287
  172. package/esm2020/lib/radio/unique-selection-dispatcher.mjs +0 -55
  173. package/esm2020/lib/tabs/tab-group.component.mjs +0 -177
  174. package/esm2020/lib/tabs/tab.component.mjs +0 -73
  175. package/esm2020/lib/tabs/tabs.module.mjs +0 -20
  176. package/esm2020/lib/toggle/toggle.component.mjs +0 -86
  177. package/esm2020/lib/tooltip/tooltip.config.mjs +0 -17
  178. package/esm2020/lib/tooltip/tooltip.directive.mjs +0 -43
  179. package/esm2020/lib/tooltip/tooltip.module.mjs +0 -19
  180. package/esm2020/lib/util/focus-mouse.directive.mjs +0 -32
  181. package/esm2020/lib/util/util.mjs +0 -12
  182. package/esm2020/lib/util/utils.module.mjs +0 -16
  183. package/lib/badge/badge.directive.d.ts +0 -33
  184. package/lib/breadcrumb/breadcrumb-item.component.d.ts +0 -33
  185. package/lib/breadcrumb/breadcrumb.component.d.ts +0 -33
  186. package/lib/button/button.directive.d.ts +0 -72
  187. package/lib/button/button.module.d.ts +0 -8
  188. package/lib/checkbox/checkbox.component.d.ts +0 -61
  189. package/lib/collapse/collapse-group.component.d.ts +0 -16
  190. package/lib/collapse/collapse-item.component.d.ts +0 -46
  191. package/lib/collapse/collapse.config.d.ts +0 -6
  192. package/lib/collapse/collapse.directive.d.ts +0 -25
  193. package/lib/collapse/collapse.module.d.ts +0 -12
  194. package/lib/dropdown/dropdown-divider.component.d.ts +0 -5
  195. package/lib/dropdown/dropdown-item.component.d.ts +0 -56
  196. package/lib/dropdown/dropdown.component.d.ts +0 -65
  197. package/lib/dropdown/dropdown.config.d.ts +0 -6
  198. package/lib/dropdown/dropdown.directive.d.ts +0 -77
  199. package/lib/dropdown/dropdown.module.d.ts +0 -15
  200. package/lib/enums/icons.enum.d.ts +0 -23
  201. package/lib/form-input/form-input-password.utils.d.ts +0 -45
  202. package/lib/form-input/form-input.component.d.ts +0 -283
  203. package/lib/form-input/it-prefix.directive.d.ts +0 -5
  204. package/lib/form-input/it-suffix.directive.d.ts +0 -5
  205. package/lib/form-input/it-text-prefix.directive.d.ts +0 -5
  206. package/lib/form-input/it-text-suffix.directive.d.ts +0 -5
  207. package/lib/icon/icon.component.d.ts +0 -34
  208. package/lib/icon/icon.module.d.ts +0 -8
  209. package/lib/models/Alignment.d.ts +0 -12
  210. package/lib/models/ButtonSize.d.ts +0 -11
  211. package/lib/models/InputType.d.ts +0 -36
  212. package/lib/models/ThemeColor.d.ts +0 -21
  213. package/lib/popover/popover.config.d.ts +0 -11
  214. package/lib/popover/popover.directive.d.ts +0 -20
  215. package/lib/popover/popover.module.d.ts +0 -9
  216. package/lib/progress-bar/progress-bar.component.d.ts +0 -55
  217. package/lib/radio/radio.component.d.ts +0 -116
  218. package/lib/radio/unique-selection-dispatcher.d.ts +0 -36
  219. package/lib/tabs/tab-group.component.d.ts +0 -71
  220. package/lib/tabs/tab.component.d.ts +0 -44
  221. package/lib/tabs/tabs.module.d.ts +0 -10
  222. package/lib/toggle/toggle.component.d.ts +0 -46
  223. package/lib/tooltip/tooltip.config.d.ts +0 -11
  224. package/lib/tooltip/tooltip.directive.d.ts +0 -27
  225. package/lib/tooltip/tooltip.module.d.ts +0 -9
  226. package/lib/util/focus-mouse.directive.d.ts +0 -13
  227. package/lib/util/util.d.ts +0 -5
  228. package/lib/util/utils.module.d.ts +0 -7
  229. /package/lib/{form-input → pipes}/mark-matching-text.pipe.d.ts +0 -0
@@ -0,0 +1,222 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { AbstractFormComponent } from '../../../abstracts/abstract-form-component';
3
+ import { Validators } from '@angular/forms';
4
+ import { ItValidators } from '../../../validators/it-validators';
5
+ import { isTrueBooleanInput } from '../../../utils/boolean-input';
6
+ import { debounceTime, distinctUntilChanged, map, Observable, of, switchMap } from 'rxjs';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
9
+ import * as i2 from "@angular/forms";
10
+ import * as i3 from "../../utils/icon/icon.component";
11
+ import * as i4 from "../../../pipes/mark-matching-text.pipe";
12
+ export class InputComponent extends AbstractFormComponent {
13
+ constructor() {
14
+ super(...arguments);
15
+ /**
16
+ * The input type
17
+ * @default text
18
+ */
19
+ this.type = 'text';
20
+ /**
21
+ * The input placeholder
22
+ */
23
+ this.placeholder = '';
24
+ /**
25
+ * Time span [ms] has passed without another source emission, to delay data filtering.
26
+ * Useful when the user is typing multiple letters
27
+ * @default 300 [ms]
28
+ */
29
+ this.autocompleteDebounceTime = 300;
30
+ /**
31
+ * Fired when the Autocomplete Item has been selected
32
+ */
33
+ this.onAutocompleteSelected = new EventEmitter();
34
+ this.showAutocompletion = false;
35
+ /** Observable da cui vengono emessi i risultati dell'auto completamento */
36
+ this.autocompleteResults$ = new Observable();
37
+ }
38
+ get isActiveLabel() {
39
+ const value = this.control.value;
40
+ if ((!!value && value !== 0) || value === 0 || !!this.placeholder) {
41
+ return true;
42
+ }
43
+ if (this.type === 'number' && (isTrueBooleanInput(this.currency) || isTrueBooleanInput(this.percentage))) {
44
+ return true;
45
+ }
46
+ return this.type === 'date' || this.type === 'time' || this.type === 'color';
47
+ }
48
+ /**
49
+ * Check is readonly field
50
+ */
51
+ get isReadonly() {
52
+ return this.readonly === 'plaintext' || isTrueBooleanInput(this.readonly);
53
+ }
54
+ /**
55
+ * Return the invalid message string from TranslateService
56
+ */
57
+ get invalidMessage() {
58
+ if (this.hasError('min') && this.min) {
59
+ return this._translateService.get('it.errors.min-invalid', {
60
+ min: this.min
61
+ });
62
+ }
63
+ if (this.hasError('max') && this.max) {
64
+ return this._translateService.get('it.errors.max-invalid', {
65
+ max: this.max
66
+ });
67
+ }
68
+ if (this.hasError('minlength')) {
69
+ const error = this.getError('minlength');
70
+ return this._translateService.get('it.errors.min-length-invalid', { min: error.requiredLength });
71
+ }
72
+ if (this.hasError('maxlength')) {
73
+ const error = this.getError('maxlength');
74
+ return this._translateService.get('it.errors.max-length-invalid', { max: error.requiredLength });
75
+ }
76
+ if (this.hasError('email') || this.hasError('invalidEmail')) {
77
+ return this._translateService.get('it.errors.email-invalid');
78
+ }
79
+ if (this.hasError('invalidTel')) {
80
+ return this._translateService.get('it.errors.tel-invalid');
81
+ }
82
+ if (this.hasError('invalidUrl')) {
83
+ return this._translateService.get('it.errors.url-invalid');
84
+ }
85
+ if (this.hasError('invalidTaxCode')) {
86
+ return this._translateService.get('it.errors.tax-code-invalid');
87
+ }
88
+ if (this.hasError('invalidVatNumber')) {
89
+ return this._translateService.get('it.errors.vat-number-invalid');
90
+ }
91
+ if (this.hasError('invalidCap')) {
92
+ return this._translateService.get('it.errors.cap-invalid');
93
+ }
94
+ if (this.hasError('invalidRegex')) {
95
+ return this._translateService.get('it.errors.regex-invalid');
96
+ }
97
+ if (this.hasError('pattern')) {
98
+ const error = this.getError('pattern');
99
+ return this._translateService.get('it.errors.pattern-invalid', { pattern: error.requiredPattern });
100
+ }
101
+ return super.invalidMessage;
102
+ }
103
+ ngOnInit() {
104
+ super.ngOnInit();
105
+ const validators = [];
106
+ switch (this.type) {
107
+ case 'number':
108
+ if (isTrueBooleanInput(this.percentage)) {
109
+ this.min = this.min || 0;
110
+ this.max = this.max || 100;
111
+ }
112
+ // Dynamic min/max validators
113
+ validators.push((control) => this.min ? Validators.min(this.min)(control) : null);
114
+ validators.push((control) => this.max ? Validators.max(this.max)(control) : null);
115
+ break;
116
+ case 'email':
117
+ validators.push(ItValidators.email);
118
+ break;
119
+ case 'tel':
120
+ validators.push(ItValidators.tel);
121
+ break;
122
+ case 'url':
123
+ validators.push(ItValidators.url);
124
+ break;
125
+ }
126
+ this.addValidators(validators);
127
+ this.autocompleteResults$ = this.getAutocompleteResults$();
128
+ }
129
+ /**
130
+ * Increment or decrease the input number value of step
131
+ * @param decrease true to decrease value
132
+ */
133
+ incrementNumber(decrease = false) {
134
+ if (this.type !== 'number') {
135
+ return;
136
+ }
137
+ const step = (this.step === 'any' ? 1 : (this.step ?? 1));
138
+ let value = Number(this.control.value);
139
+ value = (isNaN(value) ? 0 : value) + (decrease ? -step : step);
140
+ value = Math.round(value * 1e12) / 1e12; // prevent js decimal error
141
+ if (this.min !== undefined && value < this.min) {
142
+ value = this.min;
143
+ }
144
+ else if (this.max !== undefined && value > this.max) {
145
+ value = this.max;
146
+ }
147
+ this.control.setValue(value);
148
+ }
149
+ /**
150
+ * Create the autocomplete list
151
+ */
152
+ getAutocompleteResults$() {
153
+ if (this.type !== 'search') {
154
+ return of({ searchedValue: '', relatedEntries: [] });
155
+ }
156
+ return this.control.valueChanges.pipe(debounceTime(this.autocompleteDebounceTime), // Delay filter data after time span has passed without another source emission, useful when the user is typing multiple letters
157
+ distinctUntilChanged(), // Only if searchValue is distinct in comparison to the last value
158
+ switchMap(searchedValue => {
159
+ if (!this.autocompleteData) {
160
+ return of({ searchedValue, relatedEntries: [] });
161
+ }
162
+ const autoCompleteData$ = Array.isArray(this.autocompleteData) ? of(this.autocompleteData) : this.autocompleteData(searchedValue);
163
+ return autoCompleteData$.pipe(map(autocompleteData => {
164
+ if (!searchedValue) {
165
+ return { searchedValue, relatedEntries: [] };
166
+ }
167
+ const lowercaseValue = searchedValue.toLowerCase();
168
+ const relatedEntries = autocompleteData.filter(item => item.value?.toLowerCase().includes(lowercaseValue));
169
+ return { searchedValue, relatedEntries };
170
+ }));
171
+ }));
172
+ }
173
+ onEntryClick(entry, event) {
174
+ // Se non è stato definito un link associato all'elemento dell'autocomplete, probabilmente il desiderata
175
+ // non è effettuare la navigazione al default '#', pertanto in tal caso meglio annullare la navigazione.
176
+ if (!entry.link) {
177
+ event.preventDefault();
178
+ }
179
+ this.onAutocompleteSelected.next(entry);
180
+ this.control.setValue(entry.value);
181
+ this.showAutocompletion = false;
182
+ }
183
+ autocompleteItemTrackByValueFn(index, item) {
184
+ return item.value;
185
+ }
186
+ onKeyDown() {
187
+ this.showAutocompletion = this.type === 'search';
188
+ }
189
+ }
190
+ InputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: InputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
191
+ InputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: InputComponent, selector: "it-input[id]", inputs: { type: "type", placeholder: "placeholder", description: "description", readonly: "readonly", max: "max", min: "min", step: "step", currency: "currency", percentage: "percentage", adaptive: "adaptive", autocompleteData: "autocompleteData", autocompleteDebounceTime: "autocompleteDebounceTime" }, outputs: { onAutocompleteSelected: "onAutocompleteSelected" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n (keydown)=\"onKeyDown()\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n <ng-container *ngIf=\"type === 'search'\">\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n <ng-container *ngIf=\"autocompleteResults$ | async as autocomplete\">\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n <li *ngFor=\"let entry of autocomplete.relatedEntries; trackBy: autocompleteItemTrackByValueFn\"\n (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\">\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [name]=\"entry.icon\" size=\"sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | markMatchingText: autocomplete.searchedValue\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n <!-- FINE gestione AUTOCOMPLETAMENTO -->\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.IconComponent, selector: "it-icon[name]", inputs: ["name", "size", "color", "padded", "class"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.MarkMatchingTextPipe, name: "markMatchingText" }] });
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: InputComponent, decorators: [{
193
+ type: Component,
194
+ args: [{ selector: 'it-input[id]', template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n (keydown)=\"onKeyDown()\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n <ng-container *ngIf=\"type === 'search'\">\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n <ng-container *ngIf=\"autocompleteResults$ | async as autocomplete\">\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n <li *ngFor=\"let entry of autocomplete.relatedEntries; trackBy: autocompleteItemTrackByValueFn\"\n (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\">\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [name]=\"entry.icon\" size=\"sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | markMatchingText: autocomplete.searchedValue\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n <!-- FINE gestione AUTOCOMPLETAMENTO -->\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}\n"] }]
195
+ }], propDecorators: { type: [{
196
+ type: Input
197
+ }], placeholder: [{
198
+ type: Input
199
+ }], description: [{
200
+ type: Input
201
+ }], readonly: [{
202
+ type: Input
203
+ }], max: [{
204
+ type: Input
205
+ }], min: [{
206
+ type: Input
207
+ }], step: [{
208
+ type: Input
209
+ }], currency: [{
210
+ type: Input
211
+ }], percentage: [{
212
+ type: Input
213
+ }], adaptive: [{
214
+ type: Input
215
+ }], autocompleteData: [{
216
+ type: Input
217
+ }], autocompleteDebounceTime: [{
218
+ type: Input
219
+ }], onAutocompleteSelected: [{
220
+ type: Output
221
+ }] } });
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRW5GLE9BQU8sRUFBZ0MsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBTzFGLE1BQU0sT0FBTyxjQUFlLFNBQVEscUJBQXNDO0lBTDFFOztRQU9FOzs7V0FHRztRQUNNLFNBQUksR0FBcUIsTUFBTSxDQUFDO1FBRXpDOztXQUVHO1FBQ00sZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFrRGxDOzs7O1dBSUc7UUFDTSw2QkFBd0IsR0FBVyxHQUFHLENBQUM7UUFFaEQ7O1dBRUc7UUFDTywyQkFBc0IsR0FBbUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV0Rix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUEwRTNCLDJFQUEyRTtRQUMzRSx5QkFB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eEI7UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxLQUFhLEVBQUUsSUFBc0I7UUFDbEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQ25ELENBQUM7OzJHQTlQVSxjQUFjOytGQUFkLGNBQWMsMGJDYjNCLHl5SUF3R0E7MkZEM0ZhLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0UsY0FBYzs4QkFVZixJQUFJO3NCQUFaLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csR0FBRztzQkFBWCxLQUFLO2dCQUtHLEdBQUc7c0JBQVgsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQU9HLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFLSSxzQkFBc0I7c0JBQS9CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYWJzdHJhY3RzL2Fic3RyYWN0LWZvcm0tY29tcG9uZW50JztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZUl0ZW0sIElucHV0Q29udHJvbFR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2Zvcm0nO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEl0VmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uLy4uL3ZhbGlkYXRvcnMvaXQtdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGlzVHJ1ZUJvb2xlYW5JbnB1dCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Jvb2xlYW4taW5wdXQnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2l0LWlucHV0W2lkXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnQ8c3RyaW5nIHwgbnVtYmVyPiB7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCB0eXBlXG4gICAqIEBkZWZhdWx0IHRleHRcbiAgICovXG4gIEBJbnB1dCgpIHR5cGU6IElucHV0Q29udHJvbFR5cGUgPSAndGV4dCc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBwbGFjZWhvbGRlclxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgZGVzY3JpcHRpb25cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUbyBwcmV2ZW50IG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGFpbmVkIHZhbHVlLlxuICAgKiAtIDxiPnBsYWludGV4dDwvYj46IFJlYWRvbmx5IGZpZWxkIGluIHRoZSBmb3JtIHN0eWxpemVkIGFzIHBsYWluIHRleHRcbiAgICovXG4gIEBJbnB1dCgpIHJlYWRvbmx5PzogQm9vbGVhbklucHV0IHwgJ3BsYWludGV4dCc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXggdmFsdWUgW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBtYXg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW4gdmFsdWUgW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBtaW4/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGVwIHZhbHVlIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgc3RlcD86IG51bWJlciB8ICdhbnknO1xuXG4gIC8qKlxuICAgKiBJZiBpcyBhIGN1cnJlbmN5IG51bWJlciBbVXNlZCBvbmx5IGluIHR5cGUgPSAnbnVtYmVyJ11cbiAgICovXG4gIEBJbnB1dCgpIGN1cnJlbmN5PzogQm9vbGVhbklucHV0O1xuXG4gIC8qKlxuICAgKiBJZiBpcyBhIHBlcmNlbnRhZ2UgbnVtYmVyIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgcGVyY2VudGFnZT86IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogVG8gbWFrZSB0aGUgbnVtZXJpYyBmaWVsZCBhdXRvbWF0aWNhbGx5IHJlc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiBpdC4gW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBhZGFwdGl2ZT86IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBsaXN0IG9mIHNlYXJjaGFibGUgZWxlbWVudHMgb24gd2hpY2ggdG8gYmFzZSB0aGUgaW5wdXQgYXV0b2NvbXBsZXRlIHN5c3RlbSBbT3B0aW9uYWwuIFVzZWQgb25seSBpbiB0eXBlID0gJ3NlYXJjaCddXG4gICAqIElmIHlvdSBuZWVkIHRvIHJldHJpZXZlIGl0ZW1zIHZpYSBBUEksIGNhbiBwYXNzIGEgZnVuY3Rpb24gb2YgT2JzZXJ2YWJsZVxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZURhdGE/OiBBcnJheTxBdXRvY29tcGxldGVJdGVtPiB8ICgoc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PEF1dG9jb21wbGV0ZUl0ZW0+Pik7XG5cbiAgLyoqXG4gICAqIFRpbWUgc3BhbiBbbXNdIGhhcyBwYXNzZWQgd2l0aG91dCBhbm90aGVyIHNvdXJjZSBlbWlzc2lvbiwgdG8gZGVsYXkgZGF0YSBmaWx0ZXJpbmcuXG4gICAqIFVzZWZ1bCB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZyBtdWx0aXBsZSBsZXR0ZXJzXG4gICAqIEBkZWZhdWx0IDMwMCBbbXNdXG4gICAqL1xuICBASW5wdXQoKSBhdXRvY29tcGxldGVEZWJvdW5jZVRpbWU6IG51bWJlciA9IDMwMDtcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgQXV0b2NvbXBsZXRlIEl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWRcbiAgICovXG4gIEBPdXRwdXQoKSBvbkF1dG9jb21wbGV0ZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8QXV0b2NvbXBsZXRlSXRlbT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgc2hvd0F1dG9jb21wbGV0aW9uID0gZmFsc2U7XG5cblxuICBnZXQgaXNBY3RpdmVMYWJlbCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udHJvbC52YWx1ZTtcbiAgICBpZiAoKCEhdmFsdWUgJiYgdmFsdWUgIT09IDApIHx8IHZhbHVlID09PSAwIHx8ICEhdGhpcy5wbGFjZWhvbGRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ251bWJlcicgJiYgKGlzVHJ1ZUJvb2xlYW5JbnB1dCh0aGlzLmN1cnJlbmN5KSB8fCBpc1RydWVCb29sZWFuSW5wdXQodGhpcy5wZXJjZW50YWdlKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdkYXRlJyB8fCB0aGlzLnR5cGUgPT09ICd0aW1lJyB8fCB0aGlzLnR5cGUgPT09ICdjb2xvcic7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaXMgcmVhZG9ubHkgZmllbGRcbiAgICovXG4gIGdldCBpc1JlYWRvbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5ID09PSAncGxhaW50ZXh0JyB8fCBpc1RydWVCb29sZWFuSW5wdXQodGhpcy5yZWFkb25seSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbnZhbGlkIG1lc3NhZ2Ugc3RyaW5nIGZyb20gVHJhbnNsYXRlU2VydmljZVxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGludmFsaWRNZXNzYWdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ21pbicpICYmIHRoaXMubWluKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5taW4taW52YWxpZCcsIHtcbiAgICAgICAgbWluOiB0aGlzLm1pblxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdtYXgnKSAmJiB0aGlzLm1heCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMubWF4LWludmFsaWQnLCB7XG4gICAgICAgIG1heDogdGhpcy5tYXhcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignbWlubGVuZ3RoJykpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5nZXRFcnJvcignbWlubGVuZ3RoJyk7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5taW4tbGVuZ3RoLWludmFsaWQnLCB7IG1pbjogZXJyb3IucmVxdWlyZWRMZW5ndGggfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmdldEVycm9yKCdtYXhsZW5ndGgnKTtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLm1heC1sZW5ndGgtaW52YWxpZCcsIHsgbWF4OiBlcnJvci5yZXF1aXJlZExlbmd0aCB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2VtYWlsJykgfHwgdGhpcy5oYXNFcnJvcignaW52YWxpZEVtYWlsJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLmVtYWlsLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRUZWwnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMudGVsLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRVcmwnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMudXJsLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRUYXhDb2RlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnRheC1jb2RlLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRWYXROdW1iZXInKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMudmF0LW51bWJlci1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkQ2FwJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLmNhcC1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkUmVnZXgnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMucmVnZXgtaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuZ2V0RXJyb3IoJ3BhdHRlcm4nKTtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnBhdHRlcm4taW52YWxpZCcsIHsgcGF0dGVybjogZXJyb3IucmVxdWlyZWRQYXR0ZXJuIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5pbnZhbGlkTWVzc2FnZTtcbiAgfVxuXG4gIC8qKiBPYnNlcnZhYmxlIGRhIGN1aSB2ZW5nb25vIGVtZXNzaSBpIHJpc3VsdGF0aSBkZWxsJ2F1dG8gY29tcGxldGFtZW50byAqL1xuICBhdXRvY29tcGxldGVSZXN1bHRzJDogT2JzZXJ2YWJsZTx7IHNlYXJjaGVkVmFsdWU6IHN0cmluZywgcmVsYXRlZEVudHJpZXM6IEFycmF5PEF1dG9jb21wbGV0ZUl0ZW0+IH0+ID0gbmV3IE9ic2VydmFibGUoKTtcblxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICBjb25zdCB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbXTtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaWYgKGlzVHJ1ZUJvb2xlYW5JbnB1dCh0aGlzLnBlcmNlbnRhZ2UpKSB7XG4gICAgICAgICAgdGhpcy5taW4gPSB0aGlzLm1pbiB8fCAwO1xuICAgICAgICAgIHRoaXMubWF4ID0gdGhpcy5tYXggfHwgMTAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHluYW1pYyBtaW4vbWF4IHZhbGlkYXRvcnNcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHRoaXMubWluID8gVmFsaWRhdG9ycy5taW4odGhpcy5taW4pKGNvbnRyb2wpIDogbnVsbCk7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB0aGlzLm1heCA/IFZhbGlkYXRvcnMubWF4KHRoaXMubWF4KShjb250cm9sKSA6IG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEl0VmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGVsJzpcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEl0VmFsaWRhdG9ycy50ZWwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VybCc6XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChJdFZhbGlkYXRvcnMudXJsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlUmVzdWx0cyQgPSB0aGlzLmdldEF1dG9jb21wbGV0ZVJlc3VsdHMkKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5jcmVtZW50IG9yIGRlY3JlYXNlIHRoZSBpbnB1dCBudW1iZXIgdmFsdWUgb2Ygc3RlcFxuICAgKiBAcGFyYW0gZGVjcmVhc2UgdHJ1ZSB0byBkZWNyZWFzZSB2YWx1ZVxuICAgKi9cbiAgaW5jcmVtZW50TnVtYmVyKGRlY3JlYXNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGVwID0gKHRoaXMuc3RlcCA9PT0gJ2FueScgPyAxIDogKHRoaXMuc3RlcCA/PyAxKSk7XG4gICAgbGV0IHZhbHVlID0gTnVtYmVyKHRoaXMuY29udHJvbC52YWx1ZSk7XG4gICAgdmFsdWUgPSAoaXNOYU4odmFsdWUpID8gMCA6IHZhbHVlKSArIChkZWNyZWFzZSA/IC1zdGVwIDogc3RlcCk7XG4gICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlICogMWUxMikgLyAxZTEyOyAvLyBwcmV2ZW50IGpzIGRlY2ltYWwgZXJyb3JcblxuICAgIGlmICh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgdGhpcy5taW4pIHtcbiAgICAgIHZhbHVlID0gdGhpcy5taW47XG4gICAgfSBlbHNlIGlmICh0aGlzLm1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYXV0b2NvbXBsZXRlIGxpc3RcbiAgICovXG4gIHByaXZhdGUgZ2V0QXV0b2NvbXBsZXRlUmVzdWx0cyQoKTogT2JzZXJ2YWJsZTx7IHNlYXJjaGVkVmFsdWU6IHN0cmluZywgcmVsYXRlZEVudHJpZXM6IEFycmF5PEF1dG9jb21wbGV0ZUl0ZW0+IH0+IHtcbiAgICBpZiAodGhpcy50eXBlICE9PSAnc2VhcmNoJykge1xuICAgICAgcmV0dXJuIG9mKHsgc2VhcmNoZWRWYWx1ZTogJycsIHJlbGF0ZWRFbnRyaWVzOiBbXSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLmF1dG9jb21wbGV0ZURlYm91bmNlVGltZSksIC8vIERlbGF5IGZpbHRlciBkYXRhIGFmdGVyIHRpbWUgc3BhbiBoYXMgcGFzc2VkIHdpdGhvdXQgYW5vdGhlciBzb3VyY2UgZW1pc3Npb24sIHVzZWZ1bCB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZyBtdWx0aXBsZSBsZXR0ZXJzXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCAvLyBPbmx5IGlmIHNlYXJjaFZhbHVlIGlzIGRpc3RpbmN0IGluIGNvbXBhcmlzb24gdG8gdGhlIGxhc3QgdmFsdWVcbiAgICAgIHN3aXRjaE1hcChzZWFyY2hlZFZhbHVlID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9jb21wbGV0ZURhdGEpIHtcbiAgICAgICAgICByZXR1cm4gb2YoeyBzZWFyY2hlZFZhbHVlLCByZWxhdGVkRW50cmllczogW10gfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdXRvQ29tcGxldGVEYXRhJCA9IEFycmF5LmlzQXJyYXkodGhpcy5hdXRvY29tcGxldGVEYXRhKSA/IG9mKHRoaXMuYXV0b2NvbXBsZXRlRGF0YSkgOiB0aGlzLmF1dG9jb21wbGV0ZURhdGEoc2VhcmNoZWRWYWx1ZSk7XG4gICAgICAgIHJldHVybiBhdXRvQ29tcGxldGVEYXRhJC5waXBlKFxuICAgICAgICAgIG1hcChhdXRvY29tcGxldGVEYXRhID0+IHtcbiAgICAgICAgICAgIGlmICghc2VhcmNoZWRWYWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4geyBzZWFyY2hlZFZhbHVlLCByZWxhdGVkRW50cmllczogW10gfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG93ZXJjYXNlVmFsdWUgPSBzZWFyY2hlZFZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRW50cmllcyA9IGF1dG9jb21wbGV0ZURhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS52YWx1ZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlcmNhc2VWYWx1ZSkpO1xuXG4gICAgICAgICAgICByZXR1cm4geyBzZWFyY2hlZFZhbHVlLCByZWxhdGVkRW50cmllcyB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvbkVudHJ5Q2xpY2soZW50cnk6IEF1dG9jb21wbGV0ZUl0ZW0sIGV2ZW50OiBFdmVudCkge1xuICAgIC8vIFNlIG5vbiDDqCBzdGF0byBkZWZpbml0byB1biBsaW5rIGFzc29jaWF0byBhbGwnZWxlbWVudG8gZGVsbCdhdXRvY29tcGxldGUsIHByb2JhYmlsbWVudGUgaWwgZGVzaWRlcmF0YVxuICAgIC8vIG5vbiDDqCBlZmZldHR1YXJlIGxhIG5hdmlnYXppb25lIGFsIGRlZmF1bHQgJyMnLCBwZXJ0YW50byBpbiB0YWwgY2FzbyBtZWdsaW8gYW5udWxsYXJlIGxhIG5hdmlnYXppb25lLlxuICAgIGlmICghZW50cnkubGluaykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uQXV0b2NvbXBsZXRlU2VsZWN0ZWQubmV4dChlbnRyeSk7XG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGVudHJ5LnZhbHVlKTtcbiAgICB0aGlzLnNob3dBdXRvY29tcGxldGlvbiA9IGZhbHNlO1xuICB9XG5cbiAgYXV0b2NvbXBsZXRlSXRlbVRyYWNrQnlWYWx1ZUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IEF1dG9jb21wbGV0ZUl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgfVxuXG4gIG9uS2V5RG93bigpIHtcbiAgICB0aGlzLnNob3dBdXRvY29tcGxldGlvbiA9IHRoaXMudHlwZSA9PT0gJ3NlYXJjaCc7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1wcmVwZW5kXCIgW2NsYXNzLmQtbm9uZV09XCIhcHJlcGVuZFRleHQuaGFzQ2hpbGROb2RlcygpICYmICFwcmVwZW5kLmhhc0NoaWxkTm9kZXMoKVwiPlxuICAgICAgPGRpdiAjcHJlcGVuZD5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3ByZXBlbmRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiICNwcmVwZW5kVGV4dD5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3ByZXBlbmRUZXh0XVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cImlkXCIgW2NsYXNzLmFjdGl2ZV09XCJpc0FjdGl2ZUxhYmVsXCJcbiAgICAgICAgICAgW2NsYXNzLmVtcHR5LXByZXBlbmQtbGFiZWxdPVwiIXByZXBlbmRUZXh0Lmhhc0NoaWxkTm9kZXMoKSAmJiAhcHJlcGVuZC5oYXNDaGlsZE5vZGVzKClcIj5cbiAgICAgIHt7bGFiZWx9fVxuICAgIDwvbGFiZWw+XG5cbiAgICA8c3BhbiAqbmdJZj1cInR5cGUgPT09ICdudW1iZXInXCJcbiAgICAgICAgICBjbGFzcz1cImlucHV0LW51bWJlclwiXG4gICAgICAgICAgW2NsYXNzLmlucHV0LW51bWJlci1jdXJyZW5jeV09XCJjdXJyZW5jeVwiXG4gICAgICAgICAgW2NsYXNzLmlucHV0LW51bWJlci1wZXJjZW50YWdlXT1cInBlcmNlbnRhZ2VcIlxuICAgICAgICAgIFtjbGFzcy5pbnB1dC1udW1iZXItYWRhcHRpdmVdPVwiYWRhcHRpdmVcIj5cblxuICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICAgICAgW3N0ZXBdPVwic3RlcCA/PyBudWxsXCJcbiAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJpc0ludmFsaWRcIlxuICAgICAgICAgICAgIFtjbGFzcy5pcy12YWxpZF09XCJpc1ZhbGlkXCJcbiAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICBbcmVhZG9ubHldPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpZCArICctZGVzY3JpcHRpb24nXCJcbiAgICAgICAgICAgICAoYmx1cik9XCJtYXJrQXNUb3VjaGVkKClcIiAvPlxuXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImlucHV0LW51bWJlci1hZGRcIiAoY2xpY2spPVwiaW5jcmVtZW50TnVtYmVyKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj57eydpdC5mb3JtLmluY3JlYXNlLXZhbHVlJ319PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImlucHV0LW51bWJlci1zdWJcIiAoY2xpY2spPVwiaW5jcmVtZW50TnVtYmVyKHRydWUpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+e3snaXQuZm9ybS5kZWNyZWFzZS12YWx1ZSd9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvc3Bhbj5cblxuICAgIDxpbnB1dCAqbmdJZj1cInR5cGUgIT09ICdudW1iZXInXCJcbiAgICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICAgW3R5cGVdPVwidHlwZVwiXG4gICAgICAgICAgIFtjbGFzcy5mb3JtLWNvbnRyb2xdPVwicmVhZG9ubHkgIT09ICdwbGFpbnRleHQnXCJcbiAgICAgICAgICAgW2NsYXNzLmZvcm0tY29udHJvbC1wbGFpbnRleHRdPVwicmVhZG9ubHkgPT09ICdwbGFpbnRleHQnXCJcbiAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaXNJbnZhbGlkXCJcbiAgICAgICAgICAgW2NsYXNzLmlzLXZhbGlkXT1cImlzVmFsaWRcIlxuICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgIFtyZWFkb25seV09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKClcIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImlkICsgJy1kZXNjcmlwdGlvbidcIlxuICAgICAgICAgICAoYmx1cik9XCJtYXJrQXNUb3VjaGVkKClcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthcHBlbmRdXCI+PC9uZy1jb250ZW50PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwZW5kVGV4dF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPHNtYWxsICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBbaWRdPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiIGNsYXNzPVwiZm9ybS10ZXh0XCI+e3tkZXNjcmlwdGlvbn19PC9zbWFsbD5cblxuICA8IS0tIElOSVpJTyBnZXN0aW9uZSBBVVRPQ09NUExFVEFNRU5UTyAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09ICdzZWFyY2gnXCI+XG4gICAgPCEtLSBJY29uYSBsZW50ZSBwZXIgYXV0b2NvbXBsZXRhbWVudG8gLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJhdXRvY29tcGxldGUtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPGl0LWljb24gbmFtZT1cInNlYXJjaFwiIHNpemU9XCJzbVwiPjwvaXQtaWNvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXV0b2NvbXBsZXRlUmVzdWx0cyQgfCBhc3luYyBhcyBhdXRvY29tcGxldGVcIj5cbiAgICAgIDwhLS0gTGlzdGEgZGkgYXV0b2NvbXBsZXRhbWVudG8gLS0+XG4gICAgICA8dWwgY2xhc3M9XCJhdXRvY29tcGxldGUtbGlzdFwiIFtjbGFzcy5hdXRvY29tcGxldGUtbGlzdC1zaG93XT1cImF1dG9jb21wbGV0ZS5yZWxhdGVkRW50cmllcz8ubGVuZ3RoICYmIHNob3dBdXRvY29tcGxldGlvblwiPlxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGVudHJ5IG9mIGF1dG9jb21wbGV0ZS5yZWxhdGVkRW50cmllczsgdHJhY2tCeTogYXV0b2NvbXBsZXRlSXRlbVRyYWNrQnlWYWx1ZUZuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkVudHJ5Q2xpY2soZW50cnksICRldmVudClcIj5cbiAgICAgICAgICA8YSBbaHJlZl09XCJlbnRyeS5saW5rXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXV0b2NvbXBsZXRlSXRlbVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYXV0b2NvbXBsZXRlSXRlbVRlbXBsYXRlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhciBzaXplLXNtXCIgKm5nSWY9XCJlbnRyeS5hdmF0YXJTcmNQYXRoXCI+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJlbnRyeS5hdmF0YXJTcmNQYXRoXCIgW2FsdF09XCJlbnRyeS5hdmF0YXJBbHRUZXh0XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpdC1pY29uICpuZ0lmPVwiZW50cnkuaWNvblwiIFtuYW1lXT1cImVudHJ5Lmljb25cIiBzaXplPVwic21cIj48L2l0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF1dG9jb21wbGV0ZS1saXN0LXRleHRcIj5cbiAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwiZW50cnkudmFsdWUgfCBtYXJrTWF0Y2hpbmdUZXh0OiBhdXRvY29tcGxldGUuc2VhcmNoZWRWYWx1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxlbSAqbmdJZj1cImVudHJ5LmxhYmVsXCI+e3tlbnRyeS5sYWJlbH19PC9lbT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8IS0tIEZJTkUgZ2VzdGlvbmUgQVVUT0NPTVBMRVRBTUVOVE8gLS0+XG5cbiAgPGRpdiAqbmdJZj1cImlzSW52YWxpZFwiIGNsYXNzPVwiZm9ybS1mZWVkYmFjayBqdXN0LXZhbGlkYXRlLWVycm9yLWxhYmVsXCIgW2lkXT1cImlkICsgJy1lcnJvcidcIj5cbiAgICA8ZGl2ICNjdXN0b21FcnJvcj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltlcnJvcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21FcnJvci5oYXNDaGlsZE5vZGVzKClcIj57e2ludmFsaWRNZXNzYWdlIHwgYXN5bmN9fTwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,112 @@
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import { AbstractFormComponent } from '../../../abstracts/abstract-form-component';
3
+ import { ItValidators } from '../../../validators/it-validators';
4
+ import { isTrueBooleanInput } from '../../../utils/boolean-input';
5
+ import { InputPassword } from 'bootstrap-italia';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "../../utils/icon/icon.component";
10
+ export class PasswordInputComponent extends AbstractFormComponent {
11
+ constructor() {
12
+ super(...arguments);
13
+ /**
14
+ * The password minimum length
15
+ * @default 10
16
+ */
17
+ this.minLength = 10;
18
+ /**
19
+ * The password must contain at least one number
20
+ * @default true
21
+ */
22
+ this.useNumber = true;
23
+ /**
24
+ * The password must contain at least one uppercase character
25
+ * @default true
26
+ */
27
+ this.useCapitalCase = true;
28
+ /**
29
+ * The password must contain at least one lowercase character
30
+ * @default true
31
+ */
32
+ this.useSmallCase = true;
33
+ /**
34
+ * The password must contain at least one special character
35
+ * @default true
36
+ */
37
+ this.useSpecialCharacters = true;
38
+ /**
39
+ * The input placeholder
40
+ */
41
+ this.placeholder = '';
42
+ }
43
+ ngOnInit() {
44
+ super.ngOnInit();
45
+ this.addValidators(ItValidators.password(this.minLength, this.useNumber, this.useCapitalCase, this.useSmallCase, this.useSpecialCharacters));
46
+ }
47
+ ngAfterViewInit() {
48
+ super.ngAfterViewInit();
49
+ if (this.inputElement) {
50
+ this.inputPasswordBs = new InputPassword(this.inputElement.nativeElement, {
51
+ ...this.description && { enterPass: this.description },
52
+ showText: this.isStrengthMeter,
53
+ minimumLength: this.minLength
54
+ });
55
+ }
56
+ }
57
+ get isStrengthMeter() {
58
+ return isTrueBooleanInput(this.showStrengthMeter);
59
+ }
60
+ /**
61
+ * Return the invalid message string from TranslateService
62
+ */
63
+ get invalidMessage() {
64
+ if (this.hasError('noPasswordMatch')) {
65
+ return this._translateService.get('it.errors.password-no-match');
66
+ }
67
+ if (this.hasError('minlength')) {
68
+ return this._translateService.get('it.errors.password-min-length', {
69
+ minLength: this.minLength
70
+ });
71
+ }
72
+ if (this.hasError('hasNumber')) {
73
+ return this._translateService.get('it.errors.password-number');
74
+ }
75
+ if (this.hasError('hasCapitalCase')) {
76
+ return this._translateService.get('it.errors.password-capital-case');
77
+ }
78
+ if (this.hasError('hasSmallCase')) {
79
+ return this._translateService.get('it.errors.password-capital-case');
80
+ }
81
+ if (this.hasError('hasSpecialCharacters')) {
82
+ return this._translateService.get('it.errors.password-special-character');
83
+ }
84
+ return super.invalidMessage;
85
+ }
86
+ }
87
+ PasswordInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: PasswordInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
88
+ PasswordInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: PasswordInputComponent, selector: "it-password-input[id]", inputs: { minLength: "minLength", useNumber: "useNumber", useCapitalCase: "useCapitalCase", useSmallCase: "useSmallCase", useSpecialCharacters: "useSpecialCharacters", placeholder: "placeholder", description: "description", showStrengthMeter: "showStrengthMeter" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"!!control.value || !!placeholder\">{{label}}</label>\n\n <input type=\"password\"\n [id]=\"id\"\n class=\"form-control input-password\"\n [class.input-password-strength-meter]=\"isStrengthMeter\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [attr.aria-describedby]=\"id + '-description'\" #input>\n\n <span class=\"password-icon\" aria-hidden=\"true\">\n <it-icon name=\"password-visible\" size=\"sm\" class=\"password-icon-visible\"></it-icon>\n <it-icon name=\"password-invisible\" size=\"sm\" class=\"password-icon-invisible d-none\"></it-icon>\n </span>\n\n <small *ngIf=\"description && !isStrengthMeter\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError><ng-content select=\"[error]\"></ng-content></div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.IconComponent, selector: "it-icon[name]", inputs: ["name", "size", "color", "padded", "class"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: PasswordInputComponent, decorators: [{
90
+ type: Component,
91
+ args: [{ selector: 'it-password-input[id]', template: "<div class=\"form-group\">\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"!!control.value || !!placeholder\">{{label}}</label>\n\n <input type=\"password\"\n [id]=\"id\"\n class=\"form-control input-password\"\n [class.input-password-strength-meter]=\"isStrengthMeter\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [attr.aria-describedby]=\"id + '-description'\" #input>\n\n <span class=\"password-icon\" aria-hidden=\"true\">\n <it-icon name=\"password-visible\" size=\"sm\" class=\"password-icon-visible\"></it-icon>\n <it-icon name=\"password-invisible\" size=\"sm\" class=\"password-icon-invisible d-none\"></it-icon>\n </span>\n\n <small *ngIf=\"description && !isStrengthMeter\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError><ng-content select=\"[error]\"></ng-content></div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}\n"] }]
92
+ }], propDecorators: { minLength: [{
93
+ type: Input
94
+ }], useNumber: [{
95
+ type: Input
96
+ }], useCapitalCase: [{
97
+ type: Input
98
+ }], useSmallCase: [{
99
+ type: Input
100
+ }], useSpecialCharacters: [{
101
+ type: Input
102
+ }], placeholder: [{
103
+ type: Input
104
+ }], description: [{
105
+ type: Input
106
+ }], showStrengthMeter: [{
107
+ type: Input
108
+ }], inputElement: [{
109
+ type: ViewChild,
110
+ args: ['input']
111
+ }] } });
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3Bhc3N3b3JkLWlucHV0L3Bhc3N3b3JkLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9wYXNzd29yZC1pbnB1dC9wYXNzd29yZC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWpFLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7O0FBT2pELE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxxQkFBNkI7SUFMekU7O1FBT0U7OztXQUdHO1FBQ00sY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUVoQzs7O1dBR0c7UUFDTSxjQUFTLEdBQVksSUFBSSxDQUFDO1FBRW5DOzs7V0FHRztRQUNNLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBRXhDOzs7V0FHRztRQUNNLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRXRDOzs7V0FHRztRQUNNLHlCQUFvQixHQUFZLElBQUksQ0FBQztRQUU5Qzs7V0FFRztRQUNNLGdCQUFXLEdBQVcsRUFBRSxDQUFDO0tBd0VuQztJQXZEVSxRQUFRO1FBQ2YsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FDdEMsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxvQkFBb0IsQ0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVRLGVBQWU7UUFDdEIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFO2dCQUN4RSxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDdEQsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUM5QixhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDOUIsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYSxjQUFjO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRTtnQkFDakUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCLENBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDbkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDdEU7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDdEU7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUN6QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUMzRTtRQUVELE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQztJQUM5QixDQUFDOzttSEExR1Usc0JBQXNCO3VHQUF0QixzQkFBc0IscWNDWm5DLHlzQ0EwQkE7MkZEZGEsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLHVCQUF1Qjs4QkFVeEIsU0FBUztzQkFBakIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLO2dCQU1HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBTUcsWUFBWTtzQkFBcEIsS0FBSztnQkFNRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFLc0IsWUFBWTtzQkFBdkMsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9hYnN0cmFjdHMvYWJzdHJhY3QtZm9ybS1jb21wb25lbnQnO1xuaW1wb3J0IHsgSXRWYWxpZGF0b3JzIH0gZnJvbSAnLi4vLi4vLi4vdmFsaWRhdG9ycy9pdC12YWxpZGF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgaXNUcnVlQm9vbGVhbklucHV0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYm9vbGVhbi1pbnB1dCc7XG5pbXBvcnQgeyBJbnB1dFBhc3N3b3JkIH0gZnJvbSAnYm9vdHN0cmFwLWl0YWxpYSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2l0LXBhc3N3b3JkLWlucHV0W2lkXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYXNzd29yZC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Bhc3N3b3JkLWlucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRJbnB1dENvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Rm9ybUNvbXBvbmVudDxzdHJpbmc+IHtcblxuICAvKipcbiAgICogVGhlIHBhc3N3b3JkIG1pbmltdW0gbGVuZ3RoXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBASW5wdXQoKSBtaW5MZW5ndGg6IG51bWJlciA9IDEwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFzc3dvcmQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBudW1iZXJcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgdXNlTnVtYmVyOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIHBhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdXBwZXJjYXNlIGNoYXJhY3RlclxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKSB1c2VDYXBpdGFsQ2FzZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGxvd2VyY2FzZSBjaGFyYWN0ZXJcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgdXNlU21hbGxDYXNlOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIHBhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgc3BlY2lhbCBjaGFyYWN0ZXJcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgdXNlU3BlY2lhbENoYXJhY3RlcnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcGxhY2Vob2xkZXJcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogVGhlIGlucHV0IGRlc2NyaXB0aW9uXG4gICAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRW5hYmxlIHRvIHNob3cgdGhlIHN0cmVuZ3RoIG1ldGVyXG4gICAqL1xuICBASW5wdXQoKSBzaG93U3RyZW5ndGhNZXRlcj86IEJvb2xlYW5JbnB1dDtcblxuXG4gIGlucHV0UGFzc3dvcmRCcz86IElucHV0UGFzc3dvcmQ7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXQnKSBwcml2YXRlIGlucHV0RWxlbWVudD86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIHRoaXMuYWRkVmFsaWRhdG9ycyhJdFZhbGlkYXRvcnMucGFzc3dvcmQoXG4gICAgICB0aGlzLm1pbkxlbmd0aCxcbiAgICAgIHRoaXMudXNlTnVtYmVyLFxuICAgICAgdGhpcy51c2VDYXBpdGFsQ2FzZSxcbiAgICAgIHRoaXMudXNlU21hbGxDYXNlLFxuICAgICAgdGhpcy51c2VTcGVjaWFsQ2hhcmFjdGVyc1xuICAgICkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuXG4gICAgaWYgKHRoaXMuaW5wdXRFbGVtZW50KSB7XG4gICAgICB0aGlzLmlucHV0UGFzc3dvcmRCcyA9IG5ldyBJbnB1dFBhc3N3b3JkKHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgICAgLi4udGhpcy5kZXNjcmlwdGlvbiAmJiB7IGVudGVyUGFzczogdGhpcy5kZXNjcmlwdGlvbiB9LFxuICAgICAgICBzaG93VGV4dDogdGhpcy5pc1N0cmVuZ3RoTWV0ZXIsXG4gICAgICAgIG1pbmltdW1MZW5ndGg6IHRoaXMubWluTGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNTdHJlbmd0aE1ldGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1RydWVCb29sZWFuSW5wdXQodGhpcy5zaG93U3RyZW5ndGhNZXRlcik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbnZhbGlkIG1lc3NhZ2Ugc3RyaW5nIGZyb20gVHJhbnNsYXRlU2VydmljZVxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGludmFsaWRNZXNzYWdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ25vUGFzc3dvcmRNYXRjaCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5wYXNzd29yZC1uby1tYXRjaCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignbWlubGVuZ3RoJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnBhc3N3b3JkLW1pbi1sZW5ndGgnLCB7XG4gICAgICAgIG1pbkxlbmd0aDogdGhpcy5taW5MZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaGFzTnVtYmVyJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnBhc3N3b3JkLW51bWJlcicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaGFzQ2FwaXRhbENhc2UnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMucGFzc3dvcmQtY2FwaXRhbC1jYXNlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdoYXNTbWFsbENhc2UnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMucGFzc3dvcmQtY2FwaXRhbC1jYXNlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdoYXNTcGVjaWFsQ2hhcmFjdGVycycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5wYXNzd29yZC1zcGVjaWFsLWNoYXJhY3RlcicpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5pbnZhbGlkTWVzc2FnZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIFtmb3JdPVwiaWRcIiBbY2xhc3MuYWN0aXZlXT1cIiEhY29udHJvbC52YWx1ZSB8fCAhIXBsYWNlaG9sZGVyXCI+e3tsYWJlbH19PC9sYWJlbD5cblxuICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1wYXNzd29yZFwiXG4gICAgICAgICBbY2xhc3MuaW5wdXQtcGFzc3dvcmQtc3RyZW5ndGgtbWV0ZXJdPVwiaXNTdHJlbmd0aE1ldGVyXCJcbiAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImlzSW52YWxpZFwiXG4gICAgICAgICBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpZCArICctZGVzY3JpcHRpb24nXCIgI2lucHV0PlxuXG4gIDxzcGFuIGNsYXNzPVwicGFzc3dvcmQtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxpdC1pY29uIG5hbWU9XCJwYXNzd29yZC12aXNpYmxlXCIgc2l6ZT1cInNtXCIgY2xhc3M9XCJwYXNzd29yZC1pY29uLXZpc2libGVcIj48L2l0LWljb24+XG4gICAgPGl0LWljb24gbmFtZT1cInBhc3N3b3JkLWludmlzaWJsZVwiIHNpemU9XCJzbVwiIGNsYXNzPVwicGFzc3dvcmQtaWNvbi1pbnZpc2libGUgZC1ub25lXCI+PC9pdC1pY29uPlxuICA8L3NwYW4+XG5cbiAgPHNtYWxsICpuZ0lmPVwiZGVzY3JpcHRpb24gJiYgIWlzU3RyZW5ndGhNZXRlclwiIFtpZF09XCJpZCArICctZGVzY3JpcHRpb24nXCIgY2xhc3M9XCJmb3JtLXRleHRcIj57e2Rlc2NyaXB0aW9ufX08L3NtYWxsPlxuXG4gIDxkaXYgKm5nSWY9XCJpc0ludmFsaWRcIiBjbGFzcz1cImZvcm0tZmVlZGJhY2sganVzdC12YWxpZGF0ZS1lcnJvci1sYWJlbFwiIFtpZF09XCJpZCArICctZXJyb3InXCI+XG4gICAgPGRpdiAjY3VzdG9tRXJyb3I+PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Vycm9yXVwiPjwvbmctY29udGVudD48L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1c3RvbUVycm9yLmhhc0NoaWxkTm9kZXMoKVwiPnt7aW52YWxpZE1lc3NhZ2UgfCBhc3luY319PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,53 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { AbstractFormComponent } from '../../../abstracts/abstract-form-component';
3
+ import { isFalseBooleanInput, isTrueBooleanInput } from '../../../utils/boolean-input';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@angular/forms";
7
+ export class RadioButtonComponent extends AbstractFormComponent {
8
+ constructor() {
9
+ super(...arguments);
10
+ /**
11
+ * If show radio inline
12
+ * @default false
13
+ */
14
+ this.inline = false;
15
+ /**
16
+ * If is radio group
17
+ * @default false
18
+ */
19
+ this.group = false;
20
+ }
21
+ get isInline() {
22
+ return isTrueBooleanInput(this.inline);
23
+ }
24
+ get isGroup() {
25
+ return isTrueBooleanInput(this.group);
26
+ }
27
+ get name() {
28
+ return this._ngControl?.name?.toString() || '';
29
+ }
30
+ ngOnInit() {
31
+ super.ngOnInit();
32
+ if (this.control.value || !this.value || isFalseBooleanInput(this.checked)) {
33
+ return;
34
+ }
35
+ this.writeValue(this.value);
36
+ return this.onChange(this.value);
37
+ }
38
+ }
39
+ RadioButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: RadioButtonComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
40
+ RadioButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: RadioButtonComponent, selector: "it-radio-button[id][value]", inputs: { value: "value", inline: "inline", group: "group", checked: "checked" }, usesInheritance: true, ngImport: i0, template: "<ng-container>\n <div class=\"form-check\"\n [class.form-check-group]=\"isGroup\"\n [class.form-check-inline]=\"isInline\">\n\n <input\n [id]=\"id\"\n type=\"radio\"\n [value]=\"value\"\n class=\"form-check-input\"\n [name]=\"name\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [attr.aria-describedby]=\"id + '-help'\">\n\n <label class=\"form-check-label\" [for]=\"id\">\n <div #customLabel>\n <ng-content select=\"[label]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customLabel.hasChildNodes()\">{{label}}</ng-container>\n </label>\n\n <small *ngIf=\"isGroup\" [id]=\"id + '-help'\" class=\"form-text\">\n <ng-content></ng-content>\n </small>\n\n <div *ngIf=\"isInvalid && isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n\n </div>\n\n <div *ngIf=\"isInvalid && !isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: RadioButtonComponent, decorators: [{
42
+ type: Component,
43
+ args: [{ selector: 'it-radio-button[id][value]', template: "<ng-container>\n <div class=\"form-check\"\n [class.form-check-group]=\"isGroup\"\n [class.form-check-inline]=\"isInline\">\n\n <input\n [id]=\"id\"\n type=\"radio\"\n [value]=\"value\"\n class=\"form-check-input\"\n [name]=\"name\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [attr.aria-describedby]=\"id + '-help'\">\n\n <label class=\"form-check-label\" [for]=\"id\">\n <div #customLabel>\n <ng-content select=\"[label]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customLabel.hasChildNodes()\">{{label}}</ng-container>\n </label>\n\n <small *ngIf=\"isGroup\" [id]=\"id + '-help'\" class=\"form-text\">\n <ng-content></ng-content>\n </small>\n\n <div *ngIf=\"isInvalid && isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n\n </div>\n\n <div *ngIf=\"isInvalid && !isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</ng-container>\n" }]
44
+ }], propDecorators: { value: [{
45
+ type: Input
46
+ }], inline: [{
47
+ type: Input
48
+ }], group: [{
49
+ type: Input
50
+ }], checked: [{
51
+ type: Input
52
+ }] } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9yYWRpby1idXR0b24vcmFkaW8tYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9yYWRpby1idXR0b24vcmFkaW8tYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBZ0IsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7OztBQU9yRyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEscUJBQXNDO0lBTGhGOztRQVlFOzs7V0FHRztRQUNNLFdBQU0sR0FBaUIsS0FBSyxDQUFDO1FBRXRDOzs7V0FHRztRQUNNLFVBQUssR0FBaUIsS0FBSyxDQUFDO0tBNkJ0QztJQXRCQyxJQUFJLFFBQVE7UUFDVixPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFUSxRQUFRO1FBQ2YsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMxRSxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7O2lIQTdDVSxvQkFBb0I7cUdBQXBCLG9CQUFvQiwyS0NUakMsaThDQTJDQTsyRkRsQ2Esb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLDRCQUE0Qjs4QkFTN0IsS0FBSztzQkFBYixLQUFLO2dCQU1HLE1BQU07c0JBQWQsS0FBSztnQkFNRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYWJzdHJhY3RzL2Fic3RyYWN0LWZvcm0tY29tcG9uZW50JztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgaXNGYWxzZUJvb2xlYW5JbnB1dCwgaXNUcnVlQm9vbGVhbklucHV0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYm9vbGVhbi1pbnB1dCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2l0LXJhZGlvLWJ1dHRvbltpZF1bdmFsdWVdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhZGlvLWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JhZGlvLWJ1dHRvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJhZGlvQnV0dG9uQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50PHN0cmluZyB8IG51bWJlcj4ge1xuXG4gIC8qKlxuICAgKiBUaGUgcmFkaW8gdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiBzaG93IHJhZGlvIGlubGluZVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgaW5saW5lOiBCb29sZWFuSW5wdXQgPSBmYWxzZTtcblxuICAvKipcbiAgICogSWYgaXMgcmFkaW8gZ3JvdXBcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIGdyb3VwOiBCb29sZWFuSW5wdXQgPSBmYWxzZTtcblxuICAvKipcbiAgICogSWYgaXMgcmFkaW8gaXMgY2hlY2tlZFxuICAgKi9cbiAgQElucHV0KCkgY2hlY2tlZD86IEJvb2xlYW5JbnB1dDtcblxuICBnZXQgaXNJbmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVHJ1ZUJvb2xlYW5JbnB1dCh0aGlzLmlubGluZSk7XG4gIH1cblxuICBnZXQgaXNHcm91cCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNUcnVlQm9vbGVhbklucHV0KHRoaXMuZ3JvdXApO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmdDb250cm9sPy5uYW1lPy50b1N0cmluZygpIHx8ICcnO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIGlmICh0aGlzLmNvbnRyb2wudmFsdWUgfHwgIXRoaXMudmFsdWUgfHwgaXNGYWxzZUJvb2xlYW5JbnB1dCh0aGlzLmNoZWNrZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICAgIHJldHVybiB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiXG4gICAgICAgW2NsYXNzLmZvcm0tY2hlY2stZ3JvdXBdPVwiaXNHcm91cFwiXG4gICAgICAgW2NsYXNzLmZvcm0tY2hlY2staW5saW5lXT1cImlzSW5saW5lXCI+XG5cbiAgICA8aW5wdXRcbiAgICAgIFtpZF09XCJpZFwiXG4gICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXG4gICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImlzSW52YWxpZFwiXG4gICAgICBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImlkICsgJy1oZWxwJ1wiPlxuXG4gICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwiaWRcIj5cbiAgICAgIDxkaXYgI2N1c3RvbUxhYmVsPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbGFiZWxdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1c3RvbUxhYmVsLmhhc0NoaWxkTm9kZXMoKVwiPnt7bGFiZWx9fTwvbmctY29udGFpbmVyPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8c21hbGwgKm5nSWY9XCJpc0dyb3VwXCIgW2lkXT1cImlkICsgJy1oZWxwJ1wiIGNsYXNzPVwiZm9ybS10ZXh0XCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9zbWFsbD5cblxuICAgIDxkaXYgKm5nSWY9XCJpc0ludmFsaWQgJiYgaXNHcm91cFwiIGNsYXNzPVwiZm9ybS1mZWVkYmFjayBqdXN0LXZhbGlkYXRlLWVycm9yLWxhYmVsXCIgW2lkXT1cImlkICsgJy1lcnJvcidcIj5cbiAgICAgIDxkaXYgI2N1c3RvbUVycm9yPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZXJyb3JdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1c3RvbUVycm9yLmhhc0NoaWxkTm9kZXMoKVwiPnt7aW52YWxpZE1lc3NhZ2UgfCBhc3luY319PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImlzSW52YWxpZCAmJiAhaXNHcm91cFwiIGNsYXNzPVwiZm9ybS1mZWVkYmFjayBqdXN0LXZhbGlkYXRlLWVycm9yLWxhYmVsXCIgW2lkXT1cImlkICsgJy1lcnJvcidcIj5cbiAgICA8ZGl2ICNjdXN0b21FcnJvcj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltlcnJvcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21FcnJvci5oYXNDaGlsZE5vZGVzKClcIj57e2ludmFsaWRNZXNzYWdlIHwgYXN5bmN9fTwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
@@ -0,0 +1,62 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { AbstractFormComponent } from '../../../abstracts/abstract-form-component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/forms";
6
+ export class SelectComponent extends AbstractFormComponent {
7
+ ngOnInit() {
8
+ super.ngOnInit();
9
+ if (this.control.value) {
10
+ return;
11
+ }
12
+ const selectedOption = this.options.find(this.optionIsSelected);
13
+ if (selectedOption) {
14
+ this.writeValue(selectedOption.value);
15
+ return this.onChange(selectedOption.value);
16
+ }
17
+ const selectedGroupOption = this.groups?.flatMap(g => g.options).find(this.optionIsSelected);
18
+ if (selectedGroupOption) {
19
+ this.writeValue(selectedGroupOption.value);
20
+ this.onChange(selectedGroupOption.value);
21
+ }
22
+ }
23
+ /**
24
+ * Check if the option is selected
25
+ * @param option the option
26
+ */
27
+ optionIsSelected(option) {
28
+ if (option.selected === true) {
29
+ return true;
30
+ }
31
+ if (typeof option.selected === 'function') {
32
+ return option.selected(this.control.value);
33
+ }
34
+ return false;
35
+ }
36
+ /**
37
+ * Check if the option is disabled
38
+ * @param option the option
39
+ */
40
+ optionIsDisabled(option) {
41
+ if (option.disabled === true) {
42
+ return true;
43
+ }
44
+ if (typeof option.disabled === 'function') {
45
+ return option.disabled(this.control.value);
46
+ }
47
+ return false;
48
+ }
49
+ }
50
+ SelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
51
+ SelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: SelectComponent, selector: "it-select[id][options]", inputs: { options: "options", groups: "groups", description: "description" }, usesInheritance: true, ngImport: i0, template: "<div class=\"select-wrapper\">\n <label [for]=\"id\">{{label}}</label>\n <select [id]=\"id\" [formControl]=\"control\" [attr.aria-describedby]=\"id + '-description'\">\n <option *ngFor=\"let option of options\" [disabled]=\"optionIsDisabled(option)\" [value]=\"option.value\">\n {{option.text ?? option.value}}\n </option>\n\n <ng-container *ngIf=\"groups\">\n <optgroup *ngFor=\"let group of groups\" [label]=\"group.label\">\n <option *ngFor=\"let option of group.options\" [disabled]=\"optionIsDisabled(option)\" [value]=\"option.value\">\n {{option.text ?? option.value}}\n </option>\n </optgroup>\n </ng-container>\n </select>\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n</div>\n", styles: [".select-wrapper{margin-bottom:1.7rem}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: SelectComponent, decorators: [{
53
+ type: Component,
54
+ args: [{ selector: 'it-select[id][options]', template: "<div class=\"select-wrapper\">\n <label [for]=\"id\">{{label}}</label>\n <select [id]=\"id\" [formControl]=\"control\" [attr.aria-describedby]=\"id + '-description'\">\n <option *ngFor=\"let option of options\" [disabled]=\"optionIsDisabled(option)\" [value]=\"option.value\">\n {{option.text ?? option.value}}\n </option>\n\n <ng-container *ngIf=\"groups\">\n <optgroup *ngFor=\"let group of groups\" [label]=\"group.label\">\n <option *ngFor=\"let option of group.options\" [disabled]=\"optionIsDisabled(option)\" [value]=\"option.value\">\n {{option.text ?? option.value}}\n </option>\n </optgroup>\n </ng-container>\n </select>\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n</div>\n", styles: [".select-wrapper{margin-bottom:1.7rem}\n"] }]
55
+ }], propDecorators: { options: [{
56
+ type: Input
57
+ }], groups: [{
58
+ type: Input
59
+ }], description: [{
60
+ type: Input
61
+ }] } });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7O0FBUW5GLE1BQU0sT0FBTyxlQUFnQixTQUFRLHFCQUFxQjtJQWlCL0MsUUFBUTtRQUNmLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUNELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hFLElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7UUFFRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3RixJQUFJLG1CQUFtQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBQyxNQUEyQjtRQUMxQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUU7WUFDekMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBQyxNQUEyQjtRQUMxQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUU7WUFDekMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7OzRHQWxFVSxlQUFlO2dHQUFmLGVBQWUsbUtDVDVCLGl5QkFpQkE7MkZEUmEsZUFBZTtrQkFMM0IsU0FBUzsrQkFDRSx3QkFBd0I7OEJBU3pCLE9BQU87c0JBQWYsS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Fic3RyYWN0cy9hYnN0cmFjdC1mb3JtLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWxlY3RDb250cm9sR3JvdXAsIFNlbGVjdENvbnRyb2xPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2Zvcm0nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdC1zZWxlY3RbaWRdW29wdGlvbnNdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlbGVjdC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Rm9ybUNvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWxlY3Qgb3B0aW9uc1xuICAgKi9cbiAgQElucHV0KCkgb3B0aW9ucyE6IEFycmF5PFNlbGVjdENvbnRyb2xPcHRpb24+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0IGdyb3VwIG9wdGlvbnNcbiAgICovXG4gIEBJbnB1dCgpIGdyb3Vwcz86IEFycmF5PFNlbGVjdENvbnRyb2xHcm91cD47XG5cbiAgLyoqXG4gICAqIFRoZSBzZWxlY3QgZGVzY3JpcHRpb25cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICBpZiAodGhpcy5jb250cm9sLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQodGhpcy5vcHRpb25Jc1NlbGVjdGVkKTtcbiAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZShzZWxlY3RlZE9wdGlvbi52YWx1ZSk7XG4gICAgICByZXR1cm4gdGhpcy5vbkNoYW5nZShzZWxlY3RlZE9wdGlvbi52YWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cE9wdGlvbiA9IHRoaXMuZ3JvdXBzPy5mbGF0TWFwKGcgPT4gZy5vcHRpb25zKS5maW5kKHRoaXMub3B0aW9uSXNTZWxlY3RlZCk7XG4gICAgaWYgKHNlbGVjdGVkR3JvdXBPcHRpb24pIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZShzZWxlY3RlZEdyb3VwT3B0aW9uLnZhbHVlKTtcbiAgICAgIHRoaXMub25DaGFuZ2Uoc2VsZWN0ZWRHcm91cE9wdGlvbi52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBvcHRpb24gaXMgc2VsZWN0ZWRcbiAgICogQHBhcmFtIG9wdGlvbiB0aGUgb3B0aW9uXG4gICAqL1xuICBvcHRpb25Jc1NlbGVjdGVkKG9wdGlvbjogU2VsZWN0Q29udHJvbE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmIChvcHRpb24uc2VsZWN0ZWQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uLnNlbGVjdGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gb3B0aW9uLnNlbGVjdGVkKHRoaXMuY29udHJvbC52YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBvcHRpb24gaXMgZGlzYWJsZWRcbiAgICogQHBhcmFtIG9wdGlvbiB0aGUgb3B0aW9uXG4gICAqL1xuICBvcHRpb25Jc0Rpc2FibGVkKG9wdGlvbjogU2VsZWN0Q29udHJvbE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmIChvcHRpb24uZGlzYWJsZWQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uLmRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gb3B0aW9uLmRpc2FibGVkKHRoaXMuY29udHJvbC52YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cbiAgPGxhYmVsIFtmb3JdPVwiaWRcIj57e2xhYmVsfX08L2xhYmVsPlxuICA8c2VsZWN0IFtpZF09XCJpZFwiIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCIgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpZCArICctZGVzY3JpcHRpb24nXCI+XG4gICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIiBbZGlzYWJsZWRdPVwib3B0aW9uSXNEaXNhYmxlZChvcHRpb24pXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAge3tvcHRpb24udGV4dCA/PyBvcHRpb24udmFsdWV9fVxuICAgIDwvb3B0aW9uPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3Vwc1wiPlxuICAgICAgPG9wdGdyb3VwICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHNcIiBbbGFiZWxdPVwiZ3JvdXAubGFiZWxcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGdyb3VwLm9wdGlvbnNcIiBbZGlzYWJsZWRdPVwib3B0aW9uSXNEaXNhYmxlZChvcHRpb24pXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgIHt7b3B0aW9uLnRleHQgPz8gb3B0aW9uLnZhbHVlfX1cbiAgICAgICAgPC9vcHRpb24+XG4gICAgICA8L29wdGdyb3VwPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3NlbGVjdD5cbiAgPHNtYWxsICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBbaWRdPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiIGNsYXNzPVwiZm9ybS10ZXh0XCI+e3tkZXNjcmlwdGlvbn19PC9zbWFsbD5cbjwvZGl2PlxuIl19