design-angular-kit 1.0.0-1 → 1.0.0-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +152 -18
  2. package/assets/i18n/it.json +81 -0
  3. package/esm2020/lib/abstracts/abstract-form-component.mjs +165 -0
  4. package/esm2020/lib/abstracts/abstract.component.mjs +20 -0
  5. package/esm2020/lib/components/core/accordion/accordion.component.mjs +20 -0
  6. package/esm2020/lib/components/core/alert/alert.component.mjs +29 -0
  7. package/esm2020/lib/components/core/badge/badge.directive.mjs +34 -0
  8. package/esm2020/lib/components/core/button/button.directive.mjs +78 -0
  9. package/esm2020/lib/components/core/callout/callout.component.mjs +84 -0
  10. package/esm2020/lib/components/core/card/card.component.mjs +58 -0
  11. package/esm2020/lib/components/core/carousel/carousel/carousel.component.mjs +66 -0
  12. package/esm2020/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +14 -0
  13. package/esm2020/lib/components/core/chip/chip.component.mjs +89 -0
  14. package/esm2020/lib/components/core/collapse/collapse.component.mjs +96 -0
  15. package/esm2020/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +24 -0
  16. package/esm2020/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +11 -0
  17. package/esm2020/lib/components/core/dimmer/dimmer.component.mjs +59 -0
  18. package/esm2020/lib/components/core/dropdown/dropdown/dropdown.component.mjs +60 -0
  19. package/esm2020/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +71 -0
  20. package/esm2020/lib/components/core/forward/forward.directive.mjs +51 -0
  21. package/esm2020/lib/components/core/link/link.component.mjs +39 -0
  22. package/esm2020/lib/components/core/list/list/list.component.mjs +13 -0
  23. package/esm2020/lib/components/core/list/list-item/list-item.component.mjs +36 -0
  24. package/esm2020/lib/components/core/modal/modal.component.mjs +98 -0
  25. package/esm2020/lib/components/core/notifications/notifications.component.mjs +66 -0
  26. package/esm2020/lib/components/core/pagination/pagination.component.mjs +51 -0
  27. package/esm2020/lib/components/core/popover/popover.directive.mjs +176 -0
  28. package/esm2020/lib/components/core/progress-bar/progress-bar.component.mjs +34 -0
  29. package/esm2020/lib/components/core/progress-button/progress-button.component.mjs +27 -0
  30. package/esm2020/lib/components/core/spinner/spinner.component.mjs +35 -0
  31. package/esm2020/lib/components/core/tab/tab-container/tab-container.component.mjs +33 -0
  32. package/esm2020/lib/components/core/tab/tab-item/tab-item.component.mjs +36 -0
  33. package/esm2020/lib/components/core/table/table.component.mjs +57 -0
  34. package/esm2020/lib/components/core/tooltip/tooltip.directive.mjs +140 -0
  35. package/esm2020/lib/components/form/checkbox/checkbox.component.mjs +40 -0
  36. package/esm2020/lib/components/form/input/input.component.mjs +226 -0
  37. package/esm2020/lib/components/form/password-input/password-input.component.mjs +112 -0
  38. package/esm2020/lib/components/form/radio-button/radio-button.component.mjs +53 -0
  39. package/esm2020/lib/components/form/select/select.component.mjs +62 -0
  40. package/esm2020/lib/components/form/textarea/textarea.component.mjs +46 -0
  41. package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +134 -0
  42. package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +99 -0
  43. package/esm2020/lib/components/navigation/back-button/back-button.component.mjs +69 -0
  44. package/esm2020/lib/components/navigation/back-to-top/back-to-top.component.mjs +39 -0
  45. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +45 -0
  46. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +23 -0
  47. package/esm2020/lib/components/navigation/header/header.component.mjs +61 -0
  48. package/esm2020/lib/components/utils/icon/icon.component.mjs +54 -0
  49. package/esm2020/lib/components/utils/not-found-page/not-found-page.component.mjs +13 -0
  50. package/esm2020/lib/design-angular-kit.module.mjs +32 -132
  51. package/esm2020/lib/interfaces/core.mjs +16 -0
  52. package/esm2020/lib/interfaces/form.mjs +2 -0
  53. package/esm2020/lib/interfaces/icon.mjs +2 -0
  54. package/esm2020/lib/modules/components.module.mjs +245 -0
  55. package/esm2020/lib/pipes/mark-matching-text.pipe.mjs +36 -0
  56. package/esm2020/lib/services/notifications/notifications.service.mjs +122 -0
  57. package/esm2020/lib/utils/boolean-input.mjs +15 -0
  58. package/esm2020/lib/utils/file-utils.mjs +65 -0
  59. package/esm2020/lib/utils/regex.mjs +26 -0
  60. package/esm2020/lib/validators/it-validators.mjs +131 -0
  61. package/esm2020/public_api.mjs +62 -36
  62. package/fesm2015/design-angular-kit.mjs +2856 -2640
  63. package/fesm2015/design-angular-kit.mjs.map +1 -1
  64. package/fesm2020/design-angular-kit.mjs +2837 -2640
  65. package/fesm2020/design-angular-kit.mjs.map +1 -1
  66. package/lib/abstracts/abstract-form-component.d.ts +84 -0
  67. package/lib/abstracts/abstract.component.d.ts +14 -0
  68. package/lib/components/core/accordion/accordion.component.d.ts +16 -0
  69. package/lib/components/core/alert/alert.component.d.ts +17 -0
  70. package/lib/components/core/badge/badge.directive.d.ts +16 -0
  71. package/lib/components/core/button/button.directive.d.ts +38 -0
  72. package/lib/components/core/callout/callout.component.d.ts +47 -0
  73. package/lib/components/core/card/card.component.d.ts +41 -0
  74. package/lib/components/core/carousel/carousel/carousel.component.d.ts +46 -0
  75. package/lib/components/core/carousel/carousel-item/carousel-item.component.d.ts +10 -0
  76. package/lib/components/core/chip/chip.component.d.ts +62 -0
  77. package/lib/components/core/collapse/collapse.component.d.ts +59 -0
  78. package/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.d.ts +12 -0
  79. package/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.d.ts +5 -0
  80. package/lib/components/core/dimmer/dimmer.component.d.ts +24 -0
  81. package/lib/components/core/dropdown/dropdown/dropdown.component.d.ts +43 -0
  82. package/lib/components/core/dropdown/dropdown-item/dropdown-item.component.d.ts +44 -0
  83. package/lib/components/core/forward/forward.directive.d.ts +14 -0
  84. package/lib/components/core/link/link.component.d.ts +34 -0
  85. package/lib/components/core/list/list/list.component.d.ts +10 -0
  86. package/lib/components/core/list/list-item/list-item.component.d.ts +24 -0
  87. package/lib/components/core/modal/modal.component.d.ts +59 -0
  88. package/lib/components/core/notifications/notifications.component.d.ts +30 -0
  89. package/lib/components/core/pagination/pagination.component.d.ts +31 -0
  90. package/lib/components/core/popover/popover.directive.d.ts +97 -0
  91. package/lib/components/core/progress-bar/progress-bar.component.d.ts +28 -0
  92. package/lib/components/core/progress-button/progress-button.component.d.ts +22 -0
  93. package/lib/components/core/spinner/spinner.component.d.ts +21 -0
  94. package/lib/components/core/tab/tab-container/tab-container.component.d.ts +28 -0
  95. package/lib/components/core/tab/tab-item/tab-item.component.d.ts +34 -0
  96. package/lib/components/core/table/table.component.d.ts +54 -0
  97. package/lib/components/core/tooltip/tooltip.directive.d.ts +80 -0
  98. package/lib/components/form/checkbox/checkbox.component.d.ts +30 -0
  99. package/lib/components/form/input/input.component.d.ts +94 -0
  100. package/lib/components/form/password-input/password-input.component.d.ts +54 -0
  101. package/lib/components/form/radio-button/radio-button.component.d.ts +29 -0
  102. package/lib/components/form/select/select.component.d.ts +30 -0
  103. package/lib/components/form/textarea/textarea.component.d.ts +24 -0
  104. package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +53 -0
  105. package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +57 -0
  106. package/lib/components/navigation/back-button/back-button.component.d.ts +47 -0
  107. package/lib/components/navigation/back-to-top/back-to-top.component.d.ts +27 -0
  108. package/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.d.ts +30 -0
  109. package/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +22 -0
  110. package/lib/components/navigation/header/header.component.d.ts +28 -0
  111. package/lib/components/utils/icon/icon.component.d.ts +40 -0
  112. package/lib/components/utils/not-found-page/not-found-page.component.d.ts +5 -0
  113. package/lib/design-angular-kit.module.d.ts +4 -24
  114. package/lib/interfaces/core.d.ts +36 -0
  115. package/lib/interfaces/form.d.ts +61 -0
  116. package/lib/interfaces/icon.d.ts +3 -0
  117. package/lib/modules/components.module.d.ts +58 -0
  118. package/lib/{form-input → pipes}/mark-matching-text.pipe.d.ts +0 -0
  119. package/lib/services/notifications/notifications.service.d.ts +63 -0
  120. package/lib/utils/boolean-input.d.ts +11 -0
  121. package/lib/utils/file-utils.d.ts +27 -0
  122. package/lib/utils/regex.d.ts +25 -0
  123. package/lib/validators/it-validators.d.ts +58 -0
  124. package/package.json +20 -13
  125. package/public_api.d.ts +54 -35
  126. package/esm2020/lib/badge/badge.directive.mjs +0 -83
  127. package/esm2020/lib/breadcrumb/breadcrumb-item.component.mjs +0 -66
  128. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +0 -89
  129. package/esm2020/lib/button/button.directive.mjs +0 -185
  130. package/esm2020/lib/button/button.module.mjs +0 -18
  131. package/esm2020/lib/checkbox/checkbox.component.mjs +0 -138
  132. package/esm2020/lib/collapse/collapse-group.component.mjs +0 -57
  133. package/esm2020/lib/collapse/collapse-item.component.mjs +0 -79
  134. package/esm2020/lib/collapse/collapse.config.mjs +0 -12
  135. package/esm2020/lib/collapse/collapse.directive.mjs +0 -55
  136. package/esm2020/lib/collapse/collapse.module.mjs +0 -22
  137. package/esm2020/lib/dropdown/dropdown-divider.component.mjs +0 -11
  138. package/esm2020/lib/dropdown/dropdown-item.component.mjs +0 -97
  139. package/esm2020/lib/dropdown/dropdown.component.mjs +0 -143
  140. package/esm2020/lib/dropdown/dropdown.config.mjs +0 -12
  141. package/esm2020/lib/dropdown/dropdown.directive.mjs +0 -156
  142. package/esm2020/lib/dropdown/dropdown.module.mjs +0 -25
  143. package/esm2020/lib/enums/icons.enum.mjs +0 -27
  144. package/esm2020/lib/form-input/form-input-password.utils.mjs +0 -154
  145. package/esm2020/lib/form-input/form-input.component.mjs +0 -495
  146. package/esm2020/lib/form-input/it-prefix.directive.mjs +0 -13
  147. package/esm2020/lib/form-input/it-suffix.directive.mjs +0 -13
  148. package/esm2020/lib/form-input/it-text-prefix.directive.mjs +0 -13
  149. package/esm2020/lib/form-input/it-text-suffix.directive.mjs +0 -13
  150. package/esm2020/lib/form-input/mark-matching-text.pipe.mjs +0 -36
  151. package/esm2020/lib/icon/icon.component.mjs +0 -87
  152. package/esm2020/lib/icon/icon.module.mjs +0 -18
  153. package/esm2020/lib/models/Alignment.mjs +0 -15
  154. package/esm2020/lib/models/ButtonSize.mjs +0 -15
  155. package/esm2020/lib/models/InputType.mjs +0 -44
  156. package/esm2020/lib/models/ThemeColor.mjs +0 -30
  157. package/esm2020/lib/popover/popover.config.mjs +0 -17
  158. package/esm2020/lib/popover/popover.directive.mjs +0 -33
  159. package/esm2020/lib/popover/popover.module.mjs +0 -19
  160. package/esm2020/lib/progress-bar/progress-bar.component.mjs +0 -98
  161. package/esm2020/lib/radio/radio.component.mjs +0 -287
  162. package/esm2020/lib/radio/unique-selection-dispatcher.mjs +0 -55
  163. package/esm2020/lib/tabs/tab-group.component.mjs +0 -177
  164. package/esm2020/lib/tabs/tab.component.mjs +0 -73
  165. package/esm2020/lib/tabs/tabs.module.mjs +0 -20
  166. package/esm2020/lib/toggle/toggle.component.mjs +0 -86
  167. package/esm2020/lib/tooltip/tooltip.config.mjs +0 -17
  168. package/esm2020/lib/tooltip/tooltip.directive.mjs +0 -43
  169. package/esm2020/lib/tooltip/tooltip.module.mjs +0 -19
  170. package/esm2020/lib/util/focus-mouse.directive.mjs +0 -32
  171. package/esm2020/lib/util/util.mjs +0 -12
  172. package/esm2020/lib/util/utils.module.mjs +0 -16
  173. package/lib/badge/badge.directive.d.ts +0 -33
  174. package/lib/breadcrumb/breadcrumb-item.component.d.ts +0 -33
  175. package/lib/breadcrumb/breadcrumb.component.d.ts +0 -33
  176. package/lib/button/button.directive.d.ts +0 -72
  177. package/lib/button/button.module.d.ts +0 -8
  178. package/lib/checkbox/checkbox.component.d.ts +0 -61
  179. package/lib/collapse/collapse-group.component.d.ts +0 -16
  180. package/lib/collapse/collapse-item.component.d.ts +0 -46
  181. package/lib/collapse/collapse.config.d.ts +0 -6
  182. package/lib/collapse/collapse.directive.d.ts +0 -25
  183. package/lib/collapse/collapse.module.d.ts +0 -12
  184. package/lib/dropdown/dropdown-divider.component.d.ts +0 -5
  185. package/lib/dropdown/dropdown-item.component.d.ts +0 -56
  186. package/lib/dropdown/dropdown.component.d.ts +0 -65
  187. package/lib/dropdown/dropdown.config.d.ts +0 -6
  188. package/lib/dropdown/dropdown.directive.d.ts +0 -77
  189. package/lib/dropdown/dropdown.module.d.ts +0 -15
  190. package/lib/enums/icons.enum.d.ts +0 -23
  191. package/lib/form-input/form-input-password.utils.d.ts +0 -45
  192. package/lib/form-input/form-input.component.d.ts +0 -283
  193. package/lib/form-input/it-prefix.directive.d.ts +0 -5
  194. package/lib/form-input/it-suffix.directive.d.ts +0 -5
  195. package/lib/form-input/it-text-prefix.directive.d.ts +0 -5
  196. package/lib/form-input/it-text-suffix.directive.d.ts +0 -5
  197. package/lib/icon/icon.component.d.ts +0 -34
  198. package/lib/icon/icon.module.d.ts +0 -8
  199. package/lib/models/Alignment.d.ts +0 -12
  200. package/lib/models/ButtonSize.d.ts +0 -11
  201. package/lib/models/InputType.d.ts +0 -36
  202. package/lib/models/ThemeColor.d.ts +0 -21
  203. package/lib/popover/popover.config.d.ts +0 -11
  204. package/lib/popover/popover.directive.d.ts +0 -20
  205. package/lib/popover/popover.module.d.ts +0 -9
  206. package/lib/progress-bar/progress-bar.component.d.ts +0 -55
  207. package/lib/radio/radio.component.d.ts +0 -116
  208. package/lib/radio/unique-selection-dispatcher.d.ts +0 -36
  209. package/lib/tabs/tab-group.component.d.ts +0 -71
  210. package/lib/tabs/tab.component.d.ts +0 -44
  211. package/lib/tabs/tabs.module.d.ts +0 -10
  212. package/lib/toggle/toggle.component.d.ts +0 -46
  213. package/lib/tooltip/tooltip.config.d.ts +0 -11
  214. package/lib/tooltip/tooltip.directive.d.ts +0 -27
  215. package/lib/tooltip/tooltip.module.d.ts +0 -9
  216. package/lib/util/focus-mouse.directive.d.ts +0 -13
  217. package/lib/util/util.d.ts +0 -5
  218. package/lib/util/utils.module.d.ts +0 -7
@@ -1,287 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, forwardRef, ChangeDetectionStrategy, Directive, ContentChildren, Optional, HostBinding } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./unique-selection-dispatcher";
5
- import * as i2 from "../util/focus-mouse.directive";
6
- let identifier = 0;
7
- function _coerceBooleanProperty(value) {
8
- return value != null && `${value}` !== 'false';
9
- }
10
- export class RadioChange {
11
- constructor(source, value) {
12
- this.source = source;
13
- this.value = value;
14
- }
15
- }
16
- export class RadioGroupDirective {
17
- constructor(_changeDetector) {
18
- this._changeDetector = _changeDetector;
19
- this.role = 'radiogroup';
20
- /**
21
- * Il valore selezionato per il gruppo. Dovrebbe essere uguale al valore del radio button selezionato se
22
- * *esiste* un radio button con un valore corrispondente. Se *non esiste* un radio button corrispondente
23
- * questo valore persiste ed è applicato nel caso in cui un nuovo radio button viene aggiunto con il valore
24
- * corrispondente.
25
- */
26
- this._value = null;
27
- /** L'attributo HTML name da applicare ai radio button in questo gruppo */
28
- this._name = `it-radio-group-${identifier++}`;
29
- /** Il radio button attualmente selezionato. */
30
- this._selected = null;
31
- /** se `value` è stato settato al suo valore iniziale. */
32
- this._isInitialized = false;
33
- /** Se il radio group è disabilitato. */
34
- this._disabled = false;
35
- /**
36
- * Evento emesso quando il valore del gruppo cambia.
37
- * Gli eventi di change sono emessi soltanto quando il valore cambia a causa dell'interazione dell'utente
38
- * con il radio button (stesso comportamento di `<input type-"radio">`).
39
- */
40
- this.change = new EventEmitter();
41
- /** Il metodo da chiamare per aggiornare ngModel */
42
- this._controlValueAccessorChangeFn = () => { };
43
- this.onTouched = () => { };
44
- }
45
- /** Nome del gruppo di radio button. Tutti i radio button all'interno del gruppo avranno questo nome. */
46
- get name() { return this._name; }
47
- set name(value) {
48
- this._name = value;
49
- this._updateRadioButtonNames();
50
- }
51
- /** Valore del radio button. */
52
- get value() { return this._value; }
53
- set value(newValue) {
54
- if (this._value !== newValue) {
55
- this._value = newValue;
56
- this._updateSelectedRadioFromValue();
57
- this._checkSelectedRadioButton();
58
- }
59
- }
60
- _checkSelectedRadioButton() {
61
- if (this._selected && !this._selected.checked) {
62
- this._selected.checked = true;
63
- }
64
- }
65
- /** Il radio button selezionato. */
66
- get selected() { return this._selected; }
67
- set selected(selected) {
68
- this._selected = selected;
69
- this.value = selected ? selected.value : null;
70
- this._checkSelectedRadioButton();
71
- }
72
- /** Se il gruppo è disabled */
73
- get disabled() { return this._disabled; }
74
- set disabled(value) {
75
- this._disabled = _coerceBooleanProperty(value);
76
- this._markRadiosForCheck();
77
- }
78
- /**
79
- * Inizializza le proprietà quando il contenuto dei figliè disponibile.
80
- * Questo permette di propagare gli attributi rilevanti ai radio buttons associati.
81
- */
82
- ngAfterContentInit() {
83
- this._isInitialized = true;
84
- }
85
- _touch() {
86
- if (this.onTouched) {
87
- this.onTouched();
88
- }
89
- }
90
- _updateRadioButtonNames() {
91
- if (this._radios) {
92
- this._radios.forEach(radio => {
93
- radio.name = this.name;
94
- });
95
- }
96
- }
97
- /** Aggiorna il radio button `selected` a seconda del suo _value. */
98
- _updateSelectedRadioFromValue() {
99
- this._selected = null;
100
- this._radios.forEach(radio => {
101
- radio.checked = this.value === radio.value;
102
- if (radio.checked) {
103
- this._selected = radio;
104
- }
105
- });
106
- }
107
- /** Invia l'evento change con la selezione corrente e il valore del gruppo. */
108
- _emitChangeEvent() {
109
- if (this._isInitialized) {
110
- this.change.emit(new RadioChange(this._selected, this._value));
111
- }
112
- }
113
- _markRadiosForCheck() {
114
- if (this._radios) {
115
- this._radios.forEach(radio => radio._markForCheck());
116
- }
117
- }
118
- writeValue(value) {
119
- this.value = value;
120
- this._changeDetector.markForCheck();
121
- }
122
- registerOnChange(fn) {
123
- this._controlValueAccessorChangeFn = fn;
124
- }
125
- registerOnTouched(fn) {
126
- this.onTouched = fn;
127
- }
128
- }
129
- RadioGroupDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RadioGroupDirective, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
130
- RadioGroupDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: RadioGroupDirective, selector: "it-radio-group", inputs: { name: "name", value: "value", selected: "selected", disabled: "disabled" }, outputs: { change: "change" }, host: { properties: { "attr.role": "this.role" } }, providers: [{
131
- provide: NG_VALUE_ACCESSOR,
132
- useExisting: forwardRef(() => RadioGroupDirective),
133
- multi: true
134
- }], queries: [{ propertyName: "_radios", predicate: i0.forwardRef(function () { return RadioButtonComponent; }), descendants: true }], exportAs: ["itRadioGroup"], ngImport: i0 });
135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RadioGroupDirective, decorators: [{
136
- type: Directive,
137
- args: [{
138
- selector: 'it-radio-group',
139
- exportAs: 'itRadioGroup',
140
- providers: [{
141
- provide: NG_VALUE_ACCESSOR,
142
- useExisting: forwardRef(() => RadioGroupDirective),
143
- multi: true
144
- }]
145
- }]
146
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { role: [{
147
- type: HostBinding,
148
- args: ['attr.role']
149
- }], change: [{
150
- type: Output
151
- }], _radios: [{
152
- type: ContentChildren,
153
- args: [forwardRef(() => RadioButtonComponent), { descendants: true }]
154
- }], name: [{
155
- type: Input
156
- }], value: [{
157
- type: Input
158
- }], selected: [{
159
- type: Input
160
- }], disabled: [{
161
- type: Input
162
- }] } });
163
- /**
164
- * Un radio button con design bootstrap italia. Supporta tutte le funzionalità di una radio HTML5,
165
- * ed espone una API simile. Una `<it-radio-button>` può essere checked, unchecked, o disabled.
166
- */
167
- export class RadioButtonComponent {
168
- constructor(radioGroup, _changeDetector, _radioDispatcher) {
169
- this._changeDetector = _changeDetector;
170
- this._radioDispatcher = _radioDispatcher;
171
- this.id = `radio-${identifier++}`;
172
- /**
173
- * Evento emesso quando il valore `checked` del radio button cambia.
174
- */
175
- this.change = new EventEmitter();
176
- /** Se il radio button è checked. */
177
- this._checked = false;
178
- /** il valore assegnato al radio button. */
179
- this._value = null;
180
- this._removeUniqueSelectionListener = () => { };
181
- this.radioGroup = radioGroup;
182
- this._removeUniqueSelectionListener =
183
- _radioDispatcher.listen((id, name) => {
184
- if (id !== this.id && name === this.name) {
185
- this.checked = false;
186
- }
187
- });
188
- }
189
- /** se il radio button è checked. */
190
- get checked() { return this._checked; }
191
- set checked(value) {
192
- const newCheckedState = _coerceBooleanProperty(value);
193
- if (this._checked !== newCheckedState) {
194
- this._checked = newCheckedState;
195
- if (newCheckedState && this.radioGroup && this.radioGroup.value !== this.value) {
196
- this.radioGroup.selected = this;
197
- }
198
- else if (!newCheckedState && this.radioGroup && this.radioGroup.value === this.value) {
199
- this.radioGroup.selected = null;
200
- }
201
- if (newCheckedState) {
202
- this._radioDispatcher.notify(this.id, this.name);
203
- }
204
- this._changeDetector.markForCheck();
205
- }
206
- }
207
- /** Il valore di questo radio button. */
208
- get value() { return this._value; }
209
- set value(value) {
210
- if (this._value !== value) {
211
- this._value = value;
212
- if (this.radioGroup !== null) {
213
- if (!this.checked) {
214
- this.checked = this.radioGroup.value === value;
215
- }
216
- if (this.checked) {
217
- this.radioGroup.selected = this;
218
- }
219
- }
220
- }
221
- }
222
- /** Se il radio button è disabled. */
223
- get disabled() {
224
- return this._disabled || (this.radioGroup !== null && this.radioGroup.disabled);
225
- }
226
- set disabled(value) {
227
- const newDisabledState = !!value;
228
- if (this._disabled !== newDisabledState) {
229
- this._disabled = newDisabledState;
230
- this._changeDetector.markForCheck();
231
- }
232
- }
233
- /**
234
- * Segna il radio button come da controllare per la change detection.
235
- */
236
- _markForCheck() {
237
- this._changeDetector.markForCheck();
238
- }
239
- ngOnInit() {
240
- if (this.radioGroup) {
241
- // Se il radio button è all'interno di un gruppo, determina se deve essere selezionato
242
- this.checked = this.radioGroup.value === this._value;
243
- // Copia il `name` del radio group
244
- this.name = this.radioGroup.name;
245
- }
246
- }
247
- ngOnDestroy() {
248
- this._removeUniqueSelectionListener();
249
- }
250
- _emitChangeEvent() {
251
- this.change.emit(new RadioChange(this, this._value));
252
- }
253
- _onInputChange(event) {
254
- event.stopPropagation();
255
- const groupValueChanged = this.radioGroup && this.value !== this.radioGroup.value;
256
- this.checked = true;
257
- this._emitChangeEvent();
258
- if (this.radioGroup) {
259
- this.radioGroup._controlValueAccessorChangeFn(this.value);
260
- this.radioGroup._touch();
261
- if (groupValueChanged) {
262
- this.radioGroup._emitChangeEvent();
263
- }
264
- }
265
- }
266
- }
267
- RadioButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RadioButtonComponent, deps: [{ token: RadioGroupDirective, optional: true }, { token: i0.ChangeDetectorRef }, { token: i1.UniqueSelectionDispatcher }], target: i0.ɵɵFactoryTarget.Component });
268
- RadioButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: RadioButtonComponent, selector: "it-radio-button", inputs: { name: "name", label: "label", checked: "checked", value: "value", disabled: "disabled" }, outputs: { change: "change" }, exportAs: ["itRadioButton"], ngImport: i0, template: "<div class=\"form-check\">\n <input type=\"radio\"\n focusMouse\n [id]=\"id\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n (change)=\"_onInputChange($event)\">\n <label\n [attr.for]=\"id\">{{label}}</label>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.FocusMouseDirective, selector: "[focusMouse]", exportAs: ["focusMouse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
269
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RadioButtonComponent, decorators: [{
270
- type: Component,
271
- args: [{ selector: 'it-radio-button', exportAs: 'itRadioButton', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-check\">\n <input type=\"radio\"\n focusMouse\n [id]=\"id\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n (change)=\"_onInputChange($event)\">\n <label\n [attr.for]=\"id\">{{label}}</label>\n</div>\n" }]
272
- }], ctorParameters: function () { return [{ type: RadioGroupDirective, decorators: [{
273
- type: Optional
274
- }] }, { type: i0.ChangeDetectorRef }, { type: i1.UniqueSelectionDispatcher }]; }, propDecorators: { name: [{
275
- type: Input
276
- }], label: [{
277
- type: Input
278
- }], checked: [{
279
- type: Input
280
- }], value: [{
281
- type: Input
282
- }], disabled: [{
283
- type: Input
284
- }], change: [{
285
- type: Output
286
- }] } });
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvcmFkaW8vcmFkaW8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvcmFkaW8vcmFkaW8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixVQUFVLEVBQ1YsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBSWYsUUFBUSxFQUNSLFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFHekUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBRW5CLFNBQVMsc0JBQXNCLENBQUMsS0FBVTtJQUN4QyxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsS0FBSyxPQUFPLENBQUM7QUFDakQsQ0FBQztBQUVELE1BQU0sT0FBTyxXQUFXO0lBQ3RCLFlBQ1MsTUFBNEIsRUFDNUIsS0FBVTtRQURWLFdBQU0sR0FBTixNQUFNLENBQXNCO1FBQzVCLFVBQUssR0FBTCxLQUFLLENBQUs7SUFDZixDQUFDO0NBQ047QUFXRCxNQUFNLE9BQU8sbUJBQW1CO0lBb0Y5QixZQUNVLGVBQWtDO1FBQWxDLG9CQUFlLEdBQWYsZUFBZSxDQUFtQjtRQW5GbEIsU0FBSSxHQUFHLFlBQVksQ0FBQztRQUU5Qzs7Ozs7V0FLRztRQUNLLFdBQU0sR0FBUSxJQUFJLENBQUM7UUFFM0IsMEVBQTBFO1FBQ2xFLFVBQUssR0FBRyxrQkFBa0IsVUFBVSxFQUFFLEVBQUUsQ0FBQztRQUVqRCwrQ0FBK0M7UUFDdkMsY0FBUyxHQUFnQyxJ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Y2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIGZvcndhcmRSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBEaXJlY3RpdmUsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlciB9IGZyb20gJy4vdW5pcXVlLXNlbGVjdGlvbi1kaXNwYXRjaGVyJztcblxubGV0IGlkZW50aWZpZXIgPSAwO1xuXG5mdW5jdGlvbiBfY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgYCR7dmFsdWV9YCAhPT0gJ2ZhbHNlJztcbn1cblxuZXhwb3J0IGNsYXNzIFJhZGlvQ2hhbmdlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNvdXJjZTogUmFkaW9CdXR0b25Db21wb25lbnQsXG4gICAgcHVibGljIHZhbHVlOiBhbnlcbiAgKSB7IH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaXQtcmFkaW8tZ3JvdXAnLCAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gIGV4cG9ydEFzOiAnaXRSYWRpb0dyb3VwJyxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhZGlvR3JvdXBEaXJlY3RpdmUpLFxuICAgIG11bHRpOiB0cnVlXG4gIH1dXG59KVxuZXhwb3J0IGNsYXNzIFJhZGlvR3JvdXBEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSByb2xlID0gJ3JhZGlvZ3JvdXAnO1xuXG4gIC8qKlxuICAgKiBJbCB2YWxvcmUgc2VsZXppb25hdG8gcGVyIGlsIGdydXBwby4gRG92cmViYmUgZXNzZXJlIHVndWFsZSBhbCB2YWxvcmUgZGVsIHJhZGlvIGJ1dHRvbiBzZWxlemlvbmF0byBzZVxuICAgKiAqZXNpc3RlKiB1biByYWRpbyBidXR0b24gY29uIHVuIHZhbG9yZSBjb3JyaXNwb25kZW50ZS4gU2UgKm5vbiBlc2lzdGUqIHVuIHJhZGlvIGJ1dHRvbiBjb3JyaXNwb25kZW50ZVxuICAgKiBxdWVzdG8gdmFsb3JlIHBlcnNpc3RlIGVkIMOoIGFwcGxpY2F0byBuZWwgY2FzbyBpbiBjdWkgdW4gbnVvdm8gcmFkaW8gYnV0dG9uIHZpZW5lIGFnZ2l1bnRvIGNvbiBpbCB2YWxvcmVcbiAgICogY29ycmlzcG9uZGVudGUuXG4gICAqL1xuICBwcml2YXRlIF92YWx1ZTogYW55ID0gbnVsbDtcblxuICAvKiogTCdhdHRyaWJ1dG8gSFRNTCBuYW1lIGRhIGFwcGxpY2FyZSBhaSByYWRpbyBidXR0b24gaW4gcXVlc3RvIGdydXBwbyAqL1xuICBwcml2YXRlIF9uYW1lID0gYGl0LXJhZGlvLWdyb3VwLSR7aWRlbnRpZmllcisrfWA7XG5cbiAgLyoqIElsIHJhZGlvIGJ1dHRvbiBhdHR1YWxtZW50ZSBzZWxlemlvbmF0by4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWQ6IFJhZGlvQnV0dG9uQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIHNlIGB2YWx1ZWAgw6ggc3RhdG8gc2V0dGF0byBhbCBzdW8gdmFsb3JlIGluaXppYWxlLiAqL1xuICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgLyoqIFNlIGlsIHJhZGlvIGdyb3VwIMOoIGRpc2FiaWxpdGF0by4gKi9cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuXG5cbiAgLyoqXG4gICAqIEV2ZW50byBlbWVzc28gcXVhbmRvIGlsIHZhbG9yZSBkZWwgZ3J1cHBvIGNhbWJpYS5cbiAgICogR2xpIGV2ZW50aSBkaSBjaGFuZ2Ugc29ubyBlbWVzc2kgc29sdGFudG8gcXVhbmRvIGlsIHZhbG9yZSBjYW1iaWEgYSBjYXVzYSBkZWxsJ2ludGVyYXppb25lIGRlbGwndXRlbnRlXG4gICAqIGNvbiBpbCByYWRpbyBidXR0b24gKHN0ZXNzbyBjb21wb3J0YW1lbnRvIGRpIGA8aW5wdXQgdHlwZS1cInJhZGlvXCI+YCkuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8UmFkaW9DaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4oKTtcblxuICAvKiogcmFkaW8gYnV0dG9ucyBmaWdsaS4gKi9cbiAgQENvbnRlbnRDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IFJhZGlvQnV0dG9uQ29tcG9uZW50KSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBfcmFkaW9zOiBRdWVyeUxpc3Q8UmFkaW9CdXR0b25Db21wb25lbnQ+OyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG5cbiAgLyoqIElsIG1ldG9kbyBkYSBjaGlhbWFyZSBwZXIgYWdnaW9ybmFyZSBuZ01vZGVsICovXG4gIF9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAvKiogTm9tZSBkZWwgZ3J1cHBvIGRpIHJhZGlvIGJ1dHRvbi4gVHV0dGkgaSByYWRpbyBidXR0b24gYWxsJ2ludGVybm8gZGVsIGdydXBwbyBhdnJhbm5vIHF1ZXN0byBub21lLiAqL1xuICBASW5wdXQoKVxuICBnZXQgbmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbmFtZTsgfVxuICBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICAgIHRoaXMuX3VwZGF0ZVJhZGlvQnV0dG9uTmFtZXMoKTtcbiAgfVxuXG4gIC8qKiBWYWxvcmUgZGVsIHJhZGlvIGJ1dHRvbi4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfVxuICBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkUmFkaW9Gcm9tVmFsdWUoKTtcbiAgICAgIHRoaXMuX2NoZWNrU2VsZWN0ZWRSYWRpb0J1dHRvbigpO1xuICAgIH1cbiAgfVxuXG4gIF9jaGVja1NlbGVjdGVkUmFkaW9CdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkICYmICF0aGlzLl9zZWxlY3RlZC5jaGVja2VkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKiogSWwgcmFkaW8gYnV0dG9uIHNlbGV6aW9uYXRvLiAqL1xuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZDsgfVxuICBzZXQgc2VsZWN0ZWQoc2VsZWN0ZWQ6IFJhZGlvQnV0dG9uQ29tcG9uZW50IHwgbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkID8gc2VsZWN0ZWQudmFsdWUgOiBudWxsO1xuICAgIHRoaXMuX2NoZWNrU2VsZWN0ZWRSYWRpb0J1dHRvbigpO1xuICB9XG5cbiAgLyoqIFNlIGlsIGdydXBwbyDDqCBkaXNhYmxlZCAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kaXNhYmxlZDsgfVxuICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IF9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuX21hcmtSYWRpb3NGb3JDaGVjaygpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIEluaXppYWxpenphIGxlIHByb3ByaWV0w6AgcXVhbmRvIGlsIGNvbnRlbnV0byBkZWkgZmlnbGnDqCBkaXNwb25pYmlsZS5cbiAgICogUXVlc3RvIHBlcm1ldHRlIGRpIHByb3BhZ2FyZSBnbGkgYXR0cmlidXRpIHJpbGV2YW50aSBhaSByYWRpbyBidXR0b25zIGFzc29jaWF0aS5cbiAgICovXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIF90b3VjaCgpIHtcbiAgICBpZiAodGhpcy5vblRvdWNoZWQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUmFkaW9CdXR0b25OYW1lcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmFkaW9zKSB7XG4gICAgICB0aGlzLl9yYWRpb3MuZm9yRWFjaChyYWRpbyA9PiB7XG4gICAgICAgIHJhZGlvLm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQWdnaW9ybmEgaWwgcmFkaW8gYnV0dG9uIGBzZWxlY3RlZGAgYSBzZWNvbmRhIGRlbCBzdW8gX3ZhbHVlLiAqL1xuICBwcml2YXRlIF91cGRhdGVTZWxlY3RlZFJhZGlvRnJvbVZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gbnVsbDtcbiAgICB0aGlzLl9yYWRpb3MuZm9yRWFjaChyYWRpbyA9PiB7XG4gICAgICByYWRpby5jaGVja2VkID0gdGhpcy52YWx1ZSA9PT0gcmFkaW8udmFsdWU7XG4gICAgICBpZiAocmFkaW8uY2hlY2tlZCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHJhZGlvO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEludmlhIGwnZXZlbnRvIGNoYW5nZSBjb24gbGEgc2VsZXppb25lIGNvcnJlbnRlIGUgaWwgdmFsb3JlIGRlbCBncnVwcG8uICovXG4gIF9lbWl0Q2hhbmdlRXZlbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQobmV3IFJhZGlvQ2hhbmdlKHRoaXMuX3NlbGVjdGVkLCB0aGlzLl92YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIF9tYXJrUmFkaW9zRm9yQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMuX3JhZGlvcykge1xuICAgICAgdGhpcy5fcmFkaW9zLmZvckVhY2gocmFkaW8gPT4gcmFkaW8uX21hcmtGb3JDaGVjaygpKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG59XG5cbi8qKlxuICogVW4gcmFkaW8gYnV0dG9uIGNvbiBkZXNpZ24gYm9vdHN0cmFwIGl0YWxpYS4gU3VwcG9ydGEgdHV0dGUgbGUgZnVuemlvbmFsaXTDoCBkaSB1bmEgcmFkaW8gSFRNTDUsXG4gKiBlZCBlc3BvbmUgdW5hIEFQSSBzaW1pbGUuIFVuYSBgPGl0LXJhZGlvLWJ1dHRvbj5gIHB1w7IgZXNzZXJlIGNoZWNrZWQsIHVuY2hlY2tlZCwgbyBkaXNhYmxlZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaXQtcmFkaW8tYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhZGlvLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmFkaW8uY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdpdFJhZGlvQnV0dG9uJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUmFkaW9CdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgaWQgPSBgcmFkaW8tJHtpZGVudGlmaWVyKyt9YDtcblxuICAvKiogQXR0cmlidXRvICduYW1lJyB1c2F0byBwZXIgcmFnZ3J1cHBhcmUgaSByYWRpbyBidXR0b24gcGVyIHVuJ3VuaWNhIHNlbGV6aW9uZS4gKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBMJ2V0aWNoZXR0YSBkZWxyYWRpbyBidXR0b24uICovXG4gIEBJbnB1dCgpXG4gIGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIHNlIGlsIHJhZGlvIGJ1dHRvbiDDqCBjaGVja2VkLiAqL1xuICBASW5wdXQoKVxuICBnZXQgY2hlY2tlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7IH1cbiAgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBuZXdDaGVja2VkU3RhdGUgPSBfY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAodGhpcy5fY2hlY2tlZCAhPT0gbmV3Q2hlY2tlZFN0YXRlKSB7XG4gICAgICB0aGlzLl9jaGVja2VkID0gbmV3Q2hlY2tlZFN0YXRlO1xuICAgICAgaWYgKG5ld0NoZWNrZWRTdGF0ZSAmJiB0aGlzLnJhZGlvR3JvdXAgJiYgdGhpcy5yYWRpb0dyb3VwLnZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMucmFkaW9Hcm91cC5zZWxlY3RlZCA9IHRoaXM7XG4gICAgICB9IGVsc2UgaWYgKCFuZXdDaGVja2VkU3RhdGUgJiYgdGhpcy5yYWRpb0dyb3VwICYmIHRoaXMucmFkaW9Hcm91cC52YWx1ZSA9PT0gdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnJhZGlvR3JvdXAuc2VsZWN0ZWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3Q2hlY2tlZFN0YXRlKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvRGlzcGF0Y2hlci5ub3RpZnkodGhpcy5pZCwgdGhpcy5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIElsIHZhbG9yZSBkaSBxdWVzdG8gcmFkaW8gYnV0dG9uLiAqL1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLnJhZGlvR3JvdXAgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrZWQgPSB0aGlzLnJhZGlvR3JvdXAudmFsdWUgPT09IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgICB0aGlzLnJhZGlvR3JvdXAuc2VsZWN0ZWQgPSB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlIGlsIHJhZGlvIGJ1dHRvbiDDqCBkaXNhYmxlZC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCAodGhpcy5yYWRpb0dyb3VwICE9PSBudWxsICYmIHRoaXMucmFkaW9Hcm91cC5kaXNhYmxlZCk7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgbmV3RGlzYWJsZWRTdGF0ZSA9ICEhdmFsdWU7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVkICE9PSBuZXdEaXNhYmxlZFN0YXRlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IG5ld0Rpc2FibGVkU3RhdGU7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlbnRvIGVtZXNzbyBxdWFuZG8gaWwgdmFsb3JlIGBjaGVja2VkYCBkZWwgcmFkaW8gYnV0dG9uIGNhbWJpYS5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFJhZGlvQ2hhbmdlPigpO1xuXG4gIC8qKiBJbCByYWRpbyBncm91cCBwYWRyZS4gUHXDsiBlc3NlcmUgcHJlc2VudGUgbyBtZW5vLiAqL1xuICByYWRpb0dyb3VwOiBSYWRpb0dyb3VwRGlyZWN0aXZlO1xuXG4gIC8qKiBTZSBpbCByYWRpbyBidXR0b24gw6ggY2hlY2tlZC4gKi9cbiAgcHJpdmF0ZSBfY2hlY2tlZCA9IGZhbHNlO1xuXG4gIC8qKiBTZSBpbCByYWRpbyBidXR0b24gw6ggZGlzYWJsZWQuICovXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xuXG4gIC8qKiBpbCB2YWxvcmUgYXNzZWduYXRvIGFsIHJhZGlvIGJ1dHRvbi4gKi9cbiAgcHJpdmF0ZSBfdmFsdWU6IGFueSA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlVW5pcXVlU2VsZWN0aW9uTGlzdGVuZXI6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcmFkaW9Hcm91cDogUmFkaW9Hcm91cERpcmVjdGl2ZSxcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBfcmFkaW9EaXNwYXRjaGVyOiBVbmlxdWVTZWxlY3Rpb25EaXNwYXRjaGVyXG4gICkge1xuICAgIHRoaXMucmFkaW9Hcm91cCA9IHJhZGlvR3JvdXA7XG5cbiAgICB0aGlzLl9yZW1vdmVVbmlxdWVTZWxlY3Rpb25MaXN0ZW5lciA9XG4gICAgICBfcmFkaW9EaXNwYXRjaGVyLmxpc3RlbigoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChpZCAhPT0gdGhpcy5pZCAmJiBuYW1lID09PSB0aGlzLm5hbWUpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VnbmEgaWwgcmFkaW8gYnV0dG9uIGNvbWUgZGEgY29udHJvbGxhcmUgcGVyIGxhIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAqL1xuICBfbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmFkaW9Hcm91cCkge1xuICAgICAgLy8gU2UgaWwgcmFkaW8gYnV0dG9uIMOoIGFsbCdpbnRlcm5vIGRpIHVuIGdydXBwbywgZGV0ZXJtaW5hIHNlIGRldmUgZXNzZXJlIHNlbGV6aW9uYXRvXG4gICAgICB0aGlzLmNoZWNrZWQgPSB0aGlzLnJhZGlvR3JvdXAudmFsdWUgPT09IHRoaXMuX3ZhbHVlO1xuICAgICAgLy8gQ29waWEgaWwgYG5hbWVgIGRlbCByYWRpbyBncm91cFxuICAgICAgdGhpcy5uYW1lID0gdGhpcy5yYWRpb0dyb3VwLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcmVtb3ZlVW5pcXVlU2VsZWN0aW9uTGlzdGVuZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXRDaGFuZ2VFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KG5ldyBSYWRpb0NoYW5nZSh0aGlzLCB0aGlzLl92YWx1ZSkpO1xuICB9XG5cbiAgX29uSW5wdXRDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBncm91cFZhbHVlQ2hhbmdlZCA9IHRoaXMucmFkaW9Hcm91cCAmJiB0aGlzLnZhbHVlICE9PSB0aGlzLnJhZGlvR3JvdXAudmFsdWU7XG4gICAgdGhpcy5jaGVja2VkID0gdHJ1ZTtcbiAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTtcblxuICAgIGlmICh0aGlzLnJhZGlvR3JvdXApIHtcbiAgICAgIHRoaXMucmFkaW9Hcm91cC5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMucmFkaW9Hcm91cC5fdG91Y2goKTtcbiAgICAgIGlmIChncm91cFZhbHVlQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLnJhZGlvR3JvdXAuX2VtaXRDaGFuZ2VFdmVudCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIj5cbiAgPGlucHV0IHR5cGU9XCJyYWRpb1wiXG4gICAgZm9jdXNNb3VzZVxuICAgIFtpZF09XCJpZFwiXG4gICAgW2NoZWNrZWRdPVwiY2hlY2tlZFwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgIChjaGFuZ2UpPVwiX29uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiPlxuICA8bGFiZWxcbiAgICBbYXR0ci5mb3JdPVwiaWRcIj57e2xhYmVsfX08L2xhYmVsPlxuPC9kaXY+XG4iXX0=
@@ -1,55 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { Injectable } from '@angular/core';
9
- import * as i0 from "@angular/core";
10
- /**
11
- * Class to coordinate unique selection based on name.
12
- * Intended to be consumed as an Angular service.
13
- * This service is needed because native radio change events are only fired on the item currently
14
- * being selected, and we still need to uncheck the previous selection.
15
- *
16
- * This service does not *store* any IDs and names because they may change at any time, so it is
17
- * less error-prone if they are simply passed through when the events occur.
18
- */
19
- export class UniqueSelectionDispatcher {
20
- constructor() {
21
- this._listeners = [];
22
- }
23
- /**
24
- * Notify other items that selection for the given name has been set.
25
- * @param id ID of the item.
26
- * @param name Name of the item.
27
- */
28
- notify(id, name) {
29
- for (const listener of this._listeners) {
30
- listener(id, name);
31
- }
32
- }
33
- /**
34
- * Listen for future changes to item selection.
35
- * @return Function used to deregister listener
36
- */
37
- listen(listener) {
38
- this._listeners.push(listener);
39
- return () => {
40
- this._listeners = this._listeners.filter((registered) => {
41
- return listener !== registered;
42
- });
43
- };
44
- }
45
- ngOnDestroy() {
46
- this._listeners = [];
47
- }
48
- }
49
- UniqueSelectionDispatcher.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UniqueSelectionDispatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
50
- UniqueSelectionDispatcher.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UniqueSelectionDispatcher, providedIn: 'root' });
51
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UniqueSelectionDispatcher, decorators: [{
52
- type: Injectable,
53
- args: [{ providedIn: 'root' }]
54
- }] });
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLXNlbGVjdGlvbi1kaXNwYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvcmFkaW8vdW5pcXVlLXNlbGVjdGlvbi1kaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7O0FBTXBEOzs7Ozs7OztHQVFHO0FBRUgsTUFBTSxPQUFPLHlCQUF5QjtJQUR0QztRQUVVLGVBQVUsR0FBd0MsRUFBRSxDQUFDO0tBNkI5RDtJQTNCQzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEVBQVUsRUFBRSxJQUFZO1FBQzdCLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN0QyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxRQUEyQztRQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixPQUFPLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUE2QyxFQUFFLEVBQUU7Z0JBQ3pGLE9BQU8sUUFBUSxLQUFLLFVBQVUsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7dUhBN0JVLHlCQUF5QjsySEFBekIseUJBQXlCLGNBRGIsTUFBTTs0RkFDbEIseUJBQXlCO2tCQURyQyxVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0luamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cblxuLy8gVXNlcnMgb2YgdGhlIERpc3BhdGNoZXIgbmV2ZXIgbmVlZCB0byBzZWUgdGhpcyB0eXBlLCBidXQgVHlwZVNjcmlwdCByZXF1aXJlcyBpdCB0byBiZSBleHBvcnRlZC5cbmV4cG9ydCB0eXBlIFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXJMaXN0ZW5lciA9IChpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKlxuICogQ2xhc3MgdG8gY29vcmRpbmF0ZSB1bmlxdWUgc2VsZWN0aW9uIGJhc2VkIG9uIG5hbWUuXG4gKiBJbnRlbmRlZCB0byBiZSBjb25zdW1lZCBhcyBhbiBBbmd1bGFyIHNlcnZpY2UuXG4gKiBUaGlzIHNlcnZpY2UgaXMgbmVlZGVkIGJlY2F1c2UgbmF0aXZlIHJhZGlvIGNoYW5nZSBldmVudHMgYXJlIG9ubHkgZmlyZWQgb24gdGhlIGl0ZW0gY3VycmVudGx5XG4gKiBiZWluZyBzZWxlY3RlZCwgYW5kIHdlIHN0aWxsIG5lZWQgdG8gdW5jaGVjayB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLlxuICpcbiAqIFRoaXMgc2VydmljZSBkb2VzIG5vdCAqc3RvcmUqIGFueSBJRHMgYW5kIG5hbWVzIGJlY2F1c2UgdGhleSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLCBzbyBpdCBpc1xuICogbGVzcyBlcnJvci1wcm9uZSBpZiB0aGV5IGFyZSBzaW1wbHkgcGFzc2VkIHRocm91Z2ggd2hlbiB0aGUgZXZlbnRzIG9jY3VyLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBVbmlxdWVTZWxlY3Rpb25EaXNwYXRjaGVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBVbmlxdWVTZWxlY3Rpb25EaXNwYXRjaGVyTGlzdGVuZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBOb3RpZnkgb3RoZXIgaXRlbXMgdGhhdCBzZWxlY3Rpb24gZm9yIHRoZSBnaXZlbiBuYW1lIGhhcyBiZWVuIHNldC5cbiAgICogQHBhcmFtIGlkIElEIG9mIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgbm90aWZ5KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihpZCwgbmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgZnV0dXJlIGNoYW5nZXMgdG8gaXRlbSBzZWxlY3Rpb24uXG4gICAqIEByZXR1cm4gRnVuY3Rpb24gdXNlZCB0byBkZXJlZ2lzdGVyIGxpc3RlbmVyXG4gICAqL1xuICBsaXN0ZW4obGlzdGVuZXI6IFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXJMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzLmZpbHRlcigocmVnaXN0ZXJlZDogVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlckxpc3RlbmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5lciAhPT0gcmVnaXN0ZXJlZDtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgfVxufVxuIl19
@@ -1,177 +0,0 @@
1
- import { Component, ContentChildren, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';
2
- import { Subscription, merge } from 'rxjs';
3
- import { Util } from '../util/util';
4
- import { ItTabComponent } from './tab.component';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "../util/focus-mouse.directive";
8
- /** Usato per generare ID univoci per ogni componente tab */
9
- let nextId = 0;
10
- /** Un change event emesso ai cambi di selezione. */
11
- export class TabChangeEvent {
12
- }
13
- /**
14
- * Un componente tab-group con design bootstrap italia. Utilizzabile con il tag `<it-tab-group>`.
15
- *
16
- * Supporta al suo interno tab di base `<it-tab>` con una label e un contenuto.
17
- */
18
- export class ItTabGroupComponent {
19
- constructor(_changeDetectorRef) {
20
- this._changeDetectorRef = _changeDetectorRef;
21
- /** L'indice del tab che dovrebbe essere selezionato dopo che il contenuto e' stato controllato */
22
- this._indexToSelect = 0;
23
- /** Subscription all'aggiunta e rimozione di tab. */
24
- this._tabsSubscription = Subscription.EMPTY;
25
- /** Subscription ai cambiamenti alle label dei tab. */
26
- this._tabLabelSubscription = Subscription.EMPTY;
27
- this._isPill = false;
28
- this._selectedIndex = null;
29
- this._dark = false;
30
- /** abilita il supporto al data-binding bidirezionale `[(selectedIndex)]` */
31
- this.selectedIndexChange = new EventEmitter();
32
- /** emesso quando la selezione del tab cambia. */
33
- this.selectedTabChange = new EventEmitter(true);
34
- this._groupId = nextId++;
35
- }
36
- /** Se le tab sono formattate come pill. */
37
- get pill() { return this._isPill; }
38
- set pill(value) {
39
- this._isPill = Util.coerceBooleanProperty(value);
40
- }
41
- /** L'indice della tab attiva. */
42
- get selectedIndex() { return this._selectedIndex; }
43
- set selectedIndex(value) {
44
- this._indexToSelect = Util.coerceNumberProperty(value, null);
45
- }
46
- /**
47
- * Se il tab-group ha un tema scuro
48
- */
49
- get dark() { return this._dark; }
50
- set dark(value) {
51
- this._dark = Util.coerceBooleanProperty(value);
52
- }
53
- /**
54
- * Dopo che il contenuto è controllato, il componente conosce i tab che sono stati definiti
55
- * e qual è l'indice del tab selezionato.
56
- */
57
- ngAfterContentChecked() {
58
- this.changeTab(this._indexToSelect);
59
- }
60
- changeTab(newIndex) {
61
- // Non fissare `indexToSelect` immediatamente nel setter perchè può accadere che
62
- // il numero di tab cambi prima che avvenga la change detection.
63
- const indexToSelect = this._indexToSelect = this._clampTabIndex(newIndex);
64
- // Se il nuovo tab è disabilitato, non fare niente
65
- if (this._tabs && this._tabs.length > 0 && this._tabs.toArray()[indexToSelect].disabled) {
66
- return;
67
- }
68
- if (this._selectedIndex !== indexToSelect && this._selectedIndex != null) {
69
- const tabChangeEvent = this._createChangeEvent(indexToSelect);
70
- this.selectedTabChange.emit(tabChangeEvent);
71
- // Emetto questo valore dopo che è partita la change detection
72
- // dal momento che il contenuto controllato potrebbe contenere questa variabile
73
- Promise.resolve().then(() => this.selectedIndexChange.emit(indexToSelect));
74
- }
75
- // Setta la posizione per ogni tab.
76
- this._tabs.forEach((tab, index) => {
77
- tab.position = index - indexToSelect;
78
- tab.isActive = index === indexToSelect;
79
- });
80
- if (this._selectedIndex !== indexToSelect) {
81
- this._selectedIndex = indexToSelect;
82
- this._changeDetectorRef.markForCheck();
83
- }
84
- }
85
- ngAfterContentInit() {
86
- this._subscribeToTabLabels();
87
- // Sottoscrivi al cambiamento nel numero di tab, così da
88
- // poter ri-renderizzare il contenuto quando nuove tab vengono aggiunte o rimosse.
89
- this._tabsSubscription = this._tabs.changes.subscribe(() => {
90
- const indexToSelect = this._clampTabIndex(this._indexToSelect);
91
- // Mantieni il tab selezionato precedentemente se un nuovo tab è aggiunto o rimosso e non ci sono
92
- // cambiamenti espliciti che selezionino un tab differente.
93
- if (indexToSelect === this._selectedIndex) {
94
- const tabs = this._tabs.toArray();
95
- for (let i = 0; i < tabs.length; i++) {
96
- if (tabs[i].isActive) {
97
- // Assegna `_indexToSelect` e `_selectedIndex` in modo da non emettere un change event
98
- // per evitare al consumer loop infiniti in alcuni casi limite come ad esempio
99
- // se si aggiunge un tab all'interno dell'evento `selectedIndexChange`.
100
- this._indexToSelect = this._selectedIndex = i;
101
- break;
102
- }
103
- }
104
- }
105
- this._subscribeToTabLabels();
106
- this._changeDetectorRef.markForCheck();
107
- });
108
- }
109
- ngOnDestroy() {
110
- this._tabsSubscription.unsubscribe();
111
- this._tabLabelSubscription.unsubscribe();
112
- }
113
- _createChangeEvent(index) {
114
- const event = new TabChangeEvent;
115
- event.index = index;
116
- if (this._tabs && this._tabs.length) {
117
- event.tab = this._tabs.toArray()[index];
118
- }
119
- return event;
120
- }
121
- /**
122
- * Sottoscrivi a cambiamenti nelle label dei tab. Necessario perchè l'input per la label è sul TabComponent
123
- * mentre il data binding è all'interno di TabGroupComponent. Per fare in modo che il binding sia aggiornato
124
- * bisogna sottoscriversi ai cambiamenti e azionare la change detection in maniera manuale.
125
- */
126
- _subscribeToTabLabels() {
127
- if (this._tabLabelSubscription) {
128
- this._tabLabelSubscription.unsubscribe();
129
- }
130
- this._tabLabelSubscription = merge(...this._tabs.map(tab => tab._disableChange), ...this._tabs.map(tab => tab._labelChange)).subscribe(() => {
131
- this._changeDetectorRef.markForCheck();
132
- });
133
- }
134
- /** fissa l'indice tra 0 e la dimensione dei tab. */
135
- _clampTabIndex(index) {
136
- return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));
137
- }
138
- /** ritorna un id univoco per ogni label di tab */
139
- _getTabLabelId(i) {
140
- return `it-tab-label-${this._groupId}-${i}`;
141
- }
142
- /** ritorna un id univoco per ogni elemento di contenuto del tab */
143
- _getTabContentId(i) {
144
- return `it-tab-content-${this._groupId}-${i}`;
145
- }
146
- /** restituisce il tabIndex del tab. */
147
- _getTabIndex(tab, idx) {
148
- if (tab.disabled) {
149
- return null;
150
- }
151
- return this.selectedIndex === idx ? 0 : -1;
152
- }
153
- _handleClick($event, index) {
154
- $event.preventDefault();
155
- this.changeTab(index);
156
- }
157
- }
158
- ItTabGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ItTabGroupComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
159
- ItTabGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ItTabGroupComponent, selector: "it-tab-group", inputs: { pill: "pill", selectedIndex: "selectedIndex", dark: "dark" }, outputs: { selectedIndexChange: "selectedIndexChange", selectedTabChange: "selectedTabChange" }, queries: [{ propertyName: "_tabs", predicate: ItTabComponent }], exportAs: ["itTabGroup"], ngImport: i0, template: "<ul class=\"nav\" [ngClass]=\"{'nav-dark': dark, 'nav-tabs': !pill, 'nav-pills mb-3': pill}\" role=\"tablist\">\n\n <li class=\"nav-item\" *ngFor=\"let tab of _tabs; let i = index\">\n <a\n focusMouse\n href=\"#\"\n role=\"tab\"\n [attr.aria-controls]=\"_getTabContentId(i)\"\n [attr.aria-selected]=\"selectedIndex == i\"\n [attr.aria-label]=\"tab.ariaLabel || null\"\n [attr.aria-labelledby]=\"(!tab.ariaLabel && tab.ariaLabelledby) ? tab.ariaLabelledby : null\"\n [ngClass]=\"{ 'nav-link': true, 'active': selectedIndex == i, 'disabled': tab.disabled }\"\n [id]=\"_getTabLabelId(i)\"\n (click)=\"_handleClick($event, i)\"\n >\n <i *ngIf=\"tab.icon\" class=\"it-ico-lg d-block text-center\" [ngClass]=\"tab.icon\"></i>\n {{tab.label}}\n </a>\n </li>\n</ul>\n<div class=\"tab-content\">\n <ng-container *ngFor=\"let tab of _tabs; let i = index\">\n <div\n [ngClass]=\"{ 'tab-pane p-3': true, 'show active': selectedIndex == i }\"\n [id]=\"_getTabContentId(i)\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"_getTabLabelId(i)\">\n <ng-container *ngTemplateOutlet=\"tab._implicitContent\"></ng-container>\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.FocusMouseDirective, selector: "[focusMouse]", exportAs: ["focusMouse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
160
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ItTabGroupComponent, decorators: [{
161
- type: Component,
162
- args: [{ selector: 'it-tab-group', exportAs: 'itTabGroup', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"nav\" [ngClass]=\"{'nav-dark': dark, 'nav-tabs': !pill, 'nav-pills mb-3': pill}\" role=\"tablist\">\n\n <li class=\"nav-item\" *ngFor=\"let tab of _tabs; let i = index\">\n <a\n focusMouse\n href=\"#\"\n role=\"tab\"\n [attr.aria-controls]=\"_getTabContentId(i)\"\n [attr.aria-selected]=\"selectedIndex == i\"\n [attr.aria-label]=\"tab.ariaLabel || null\"\n [attr.aria-labelledby]=\"(!tab.ariaLabel && tab.ariaLabelledby) ? tab.ariaLabelledby : null\"\n [ngClass]=\"{ 'nav-link': true, 'active': selectedIndex == i, 'disabled': tab.disabled }\"\n [id]=\"_getTabLabelId(i)\"\n (click)=\"_handleClick($event, i)\"\n >\n <i *ngIf=\"tab.icon\" class=\"it-ico-lg d-block text-center\" [ngClass]=\"tab.icon\"></i>\n {{tab.label}}\n </a>\n </li>\n</ul>\n<div class=\"tab-content\">\n <ng-container *ngFor=\"let tab of _tabs; let i = index\">\n <div\n [ngClass]=\"{ 'tab-pane p-3': true, 'show active': selectedIndex == i }\"\n [id]=\"_getTabContentId(i)\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"_getTabLabelId(i)\">\n <ng-container *ngTemplateOutlet=\"tab._implicitContent\"></ng-container>\n </div>\n </ng-container>\n</div>\n" }]
163
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { _tabs: [{
164
- type: ContentChildren,
165
- args: [ItTabComponent]
166
- }], pill: [{
167
- type: Input
168
- }], selectedIndex: [{
169
- type: Input
170
- }], dark: [{
171
- type: Input
172
- }], selectedIndexChange: [{
173
- type: Output
174
- }], selectedTabChange: [{
175
- type: Output
176
- }] } });
177
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL3RhYnMvdGFiLWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL3RhYnMvdGFiLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsZUFBZSxFQUVmLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBSWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFFakQsNERBQTREO0FBQzVELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQUVmLG9EQUFvRDtBQUNwRCxNQUFNLE9BQU8sY0FBYztDQUsxQjtBQUVBOzs7O0VBSUU7QUFTSCxNQUFNLE9BQU8sbUJBQW1CO0lBaUQ5QixZQUFvQixrQkFBcUM7UUFBckMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQTdDekQsa0dBQWtHO1FBQzFGLG1CQUFjLEdBQWtCLENBQUMsQ0FBQztRQUUxQyxvREFBb0Q7UUFDNUMsc0JBQWlCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUUvQyxzREFBc0Q7UUFDOUMsMEJBQXFCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQVEzQyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBU2hCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQVVyQyxVQUFLLEdBQUcsS0FBSyxDQUFDO1FB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QUksR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNoQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQWEsRUFBRSxLQUFhO1FBQ3ZDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7O2lIQWxMVSxtQkFBbUI7cUdBQW5CLG1CQUFtQixtUEFFYixjQUFjLHVEQzVDakMsOHRDQStCQTs0RkRXYSxtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsY0FBYyxZQUNkLFlBQVksaUJBR1AsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTt3R0FJZCxLQUFLO3NCQUFyQyxlQUFlO3VCQUFDLGNBQWM7Z0JBYTNCLElBQUk7c0JBRFAsS0FBSztnQkFVRixhQUFhO3NCQURoQixLQUFLO2dCQVdGLElBQUk7c0JBRFAsS0FBSztnQkFRYSxtQkFBbUI7c0JBQXJDLE1BQU07Z0JBR1ksaUJBQWlCO3NCQUFuQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICBPbkRlc3Ryb3lcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IEl0VGFiQ29tcG9uZW50IH0gZnJvbSAnLi90YWIuY29tcG9uZW50JztcblxuLyoqIFVzYXRvIHBlciBnZW5lcmFyZSBJRCB1bml2b2NpIHBlciBvZ25pIGNvbXBvbmVudGUgdGFiICovXG5sZXQgbmV4dElkID0gMDtcblxuLyoqIFVuIGNoYW5nZSBldmVudCBlbWVzc28gYWkgY2FtYmkgZGkgc2VsZXppb25lLiAqL1xuZXhwb3J0IGNsYXNzIFRhYkNoYW5nZUV2ZW50IHtcbiAgLyoqIEluZGljZSBkZWwgdGFiIHNlbGV6aW9uYXRvLiAqL1xuICBpbmRleDogbnVtYmVyO1xuICAvKiogUmlmZXJpbWVudG8gYWwgdGFiIHNlbGV6aW9uYXRvLiAqL1xuICB0YWI6IEl0VGFiQ29tcG9uZW50O1xufVxuXG4gLyoqXG4gKiBVbiBjb21wb25lbnRlIHRhYi1ncm91cCBjb24gZGVzaWduIGJvb3RzdHJhcCBpdGFsaWEuIFV0aWxpenphYmlsZSBjb24gaWwgdGFnIGA8aXQtdGFiLWdyb3VwPmAuXG4gKlxuICogU3VwcG9ydGEgYWwgc3VvIGludGVybm8gdGFiIGRpIGJhc2UgYDxpdC10YWI+YCBjb24gdW5hIGxhYmVsIGUgdW4gY29udGVudXRvLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdC10YWItZ3JvdXAnLFxuICBleHBvcnRBczogJ2l0VGFiR3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFiLWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFiLWdyb3VwLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBJdFRhYkdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgT25EZXN0cm95IHtcblxuICBAQ29udGVudENoaWxkcmVuKEl0VGFiQ29tcG9uZW50KSBfdGFiczogUXVlcnlMaXN0PEl0VGFiQ29tcG9uZW50PjtcblxuICAvKiogTCdpbmRpY2UgZGVsIHRhYiBjaGUgZG92cmViYmUgZXNzZXJlIHNlbGV6aW9uYXRvIGRvcG8gY2hlIGlsIGNvbnRlbnV0byBlJyBzdGF0byBjb250cm9sbGF0byAqL1xuICBwcml2YXRlIF9pbmRleFRvU2VsZWN0OiBudW1iZXIgfCBudWxsID0gMDtcblxuICAvKiogU3Vic2NyaXB0aW9uIGFsbCdhZ2dpdW50YSBlIHJpbW96aW9uZSBkaSB0YWIuICovXG4gIHByaXZhdGUgX3RhYnNTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgLyoqIFN1YnNjcmlwdGlvbiBhaSBjYW1iaWFtZW50aSBhbGxlIGxhYmVsIGRlaSB0YWIuICovXG4gIHByaXZhdGUgX3RhYkxhYmVsU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIC8qKiBTZSBsZSB0YWIgc29ubyBmb3JtYXR0YXRlIGNvbWUgcGlsbC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHBpbGwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc1BpbGw7IH1cbiAgc2V0IHBpbGwodmFsdWUpIHtcbiAgICB0aGlzLl9pc1BpbGwgPSBVdGlsLmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfaXNQaWxsID0gZmFsc2U7XG5cblxuICAvKiogTCdpbmRpY2UgZGVsbGEgdGFiIGF0dGl2YS4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHNlbGVjdGVkSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7IHJldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4OyB9XG4gIHNldCBzZWxlY3RlZEluZGV4KHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XG4gICAgdGhpcy5faW5kZXhUb1NlbGVjdCA9IFV0aWwuY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUsIG51bGwpO1xuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZSBpbCB0YWItZ3JvdXAgaGEgdW4gdGVtYSBzY3Vyb1xuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRhcmsoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kYXJrOyB9XG4gIHNldCBkYXJrKHZhbHVlKSB7XG4gICAgdGhpcy5fZGFyayA9IFV0aWwuY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9kYXJrID0gZmFsc2U7XG5cbiAgLyoqIGFiaWxpdGEgaWwgc3VwcG9ydG8gYWwgZGF0YS1iaW5kaW5nIGJpZGlyZXppb25hbGUgYFsoc2VsZWN0ZWRJbmRleCldYCAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0ZWRJbmRleENoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAvKiogZW1lc3NvIHF1YW5kbyBsYSBzZWxlemlvbmUgZGVsIHRhYiBjYW1iaWEuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RlZFRhYkNoYW5nZTogRXZlbnRFbWl0dGVyPFRhYkNoYW5nZUV2ZW50PiA9XG4gICAgICBuZXcgRXZlbnRFbWl0dGVyPFRhYkNoYW5nZUV2ZW50Pih0cnVlKTtcblxuICBwcml2YXRlIF9ncm91cElkOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy5fZ3JvdXBJZCA9IG5leHRJZCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIERvcG8gY2hlIGlsIGNvbnRlbnV0byDDqCBjb250cm9sbGF0bywgaWwgY29tcG9uZW50ZSBjb25vc2NlIGkgdGFiIGNoZSBzb25vIHN0YXRpIGRlZmluaXRpXG4gICAqIGUgcXVhbCDDqCBsJ2luZGljZSBkZWwgdGFiIHNlbGV6aW9uYXRvLlxuICAgKi9cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlVGFiKHRoaXMuX2luZGV4VG9TZWxlY3QpO1xuICB9XG5cbiAgY2hhbmdlVGFiKG5ld0luZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIC8vIE5vbiBmaXNzYXJlIGBpbmRleFRvU2VsZWN0YCBpbW1lZGlhdGFtZW50ZSBuZWwgc2V0dGVyIHBlcmNow6ggcHXDsiBhY2NhZGVyZSBjaGVcbiAgICAvLyBpbCBudW1lcm8gZGkgdGFiIGNhbWJpIHByaW1hIGNoZSBhdnZlbmdhIGxhIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgY29uc3QgaW5kZXhUb1NlbGVjdCA9IHRoaXMuX2luZGV4VG9TZWxlY3QgPSB0aGlzLl9jbGFtcFRhYkluZGV4KG5ld0luZGV4KTtcblxuICAgIC8vIFNlIGlsIG51b3ZvIHRhYiDDqCBkaXNhYmlsaXRhdG8sIG5vbiBmYXJlIG5pZW50ZVxuICAgIGlmICh0aGlzLl90YWJzICYmIHRoaXMuX3RhYnMubGVuZ3RoID4gMCAmJiB0aGlzLl90YWJzLnRvQXJyYXkoKVtpbmRleFRvU2VsZWN0XS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEluZGV4ICE9PSBpbmRleFRvU2VsZWN0ICYmIHRoaXMuX3NlbGVjdGVkSW5kZXggIT0gbnVsbCkge1xuICAgICAgY29uc3QgdGFiQ2hhbmdlRXZlbnQgPSB0aGlzLl9jcmVhdGVDaGFuZ2VFdmVudChpbmRleFRvU2VsZWN0KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJDaGFuZ2UuZW1pdCh0YWJDaGFuZ2VFdmVudCk7XG4gICAgICAvLyBFbWV0dG8gcXVlc3RvIHZhbG9yZSBkb3BvIGNoZSDDqCBwYXJ0aXRhIGxhIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIC8vIGRhbCBtb21lbnRvIGNoZSBpbCBjb250ZW51dG8gY29udHJvbGxhdG8gcG90cmViYmUgY29udGVuZXJlIHF1ZXN0YSB2YXJpYWJpbGVcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5zZWxlY3RlZEluZGV4Q2hhbmdlLmVtaXQoaW5kZXhUb1NlbGVjdCkpO1xuICAgIH1cblxuICAgIC8vIFNldHRhIGxhIHBvc2l6aW9uZSBwZXIgb2duaSB0YWIuXG4gICAgdGhpcy5fdGFicy5mb3JFYWNoKCh0YWI6IEl0VGFiQ29tcG9uZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICB0YWIucG9zaXRpb24gPSBpbmRleCAtIGluZGV4VG9TZWxlY3Q7XG4gICAgICB0YWIuaXNBY3RpdmUgPSBpbmRleCA9PT0gaW5kZXhUb1NlbGVjdDtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEluZGV4ICE9PSBpbmRleFRvU2VsZWN0KSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gaW5kZXhUb1NlbGVjdDtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpYmVUb1RhYkxhYmVscygpO1xuXG4gICAgLy8gU290dG9zY3JpdmkgYWwgY2FtYmlhbWVudG8gbmVsIG51bWVybyBkaSB0YWIsIGNvc8OsIGRhXG4gICAgLy8gcG90ZXIgcmktcmVuZGVyaXp6YXJlIGlsIGNvbnRlbnV0byBxdWFuZG8gbnVvdmUgdGFiIHZlbmdvbm8gYWdnaXVudGUgbyByaW1vc3NlLlxuICAgIHRoaXMuX3RhYnNTdWJzY3JpcHRpb24gPSB0aGlzLl90YWJzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4VG9TZWxlY3QgPSB0aGlzLl9jbGFtcFRhYkluZGV4KHRoaXMuX2luZGV4VG9TZWxlY3QpO1xuXG4gICAgICAvLyBNYW50aWVuaSBpbCB0YWIgc2VsZXppb25hdG8gcHJlY2VkZW50ZW1lbnRlIHNlIHVuIG51b3ZvIHRhYiDDqCBhZ2dpdW50byBvIHJpbW9zc28gZSBub24gY2kgc29ub1xuICAgICAgLy8gY2FtYmlhbWVudGkgZXNwbGljaXRpIGNoZSBzZWxlemlvbmlubyB1biB0YWIgZGlmZmVyZW50ZS5cbiAgICAgIGlmIChpbmRleFRvU2VsZWN0ID09PSB0aGlzLl9zZWxlY3RlZEluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRhYnMgPSB0aGlzLl90YWJzLnRvQXJyYXkoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGFic1tpXS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgLy8gQXNzZWduYSBgX2luZGV4VG9TZWxlY3RgIGUgYF9zZWxlY3RlZEluZGV4YCBpbiBtb2RvIGRhIG5vbiBlbWV0dGVyZSB1biBjaGFuZ2UgZXZlbnRcbiAgICAgICAgICAgIC8vIHBlciBldml0YXJlIGFsIGNvbnN1bWVyIGxvb3AgaW5maW5pdGkgaW4gYWxjdW5pIGNhc2kgbGltaXRlIGNvbWUgYWQgZXNlbXBpb1xuICAgICAgICAgICAgLy8gc2Ugc2kgYWdnaXVuZ2UgdW4gdGFiIGFsbCdpbnRlcm5vIGRlbGwnZXZlbnRvIGBzZWxlY3RlZEluZGV4Q2hhbmdlYC5cbiAgICAgICAgICAgIHRoaXMuX2luZGV4VG9TZWxlY3QgPSB0aGlzLl9zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdWJzY3JpYmVUb1RhYkxhYmVscygpO1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl90YWJzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUNoYW5nZUV2ZW50KGluZGV4OiBudW1iZXIpOiBUYWJDaGFuZ2VFdmVudCB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgVGFiQ2hhbmdlRXZlbnQ7XG4gICAgZXZlbnQuaW5kZXggPSBpbmRleDtcbiAgICBpZiAodGhpcy5fdGFicyAmJiB0aGlzLl90YWJzLmxlbmd0aCkge1xuICAgICAgZXZlbnQudGFiID0gdGhpcy5fdGFicy50b0FycmF5KClbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cblxuICAvKipcbiAgICogU290dG9zY3JpdmkgYSBjYW1iaWFtZW50aSBuZWxsZSBsYWJlbCBkZWkgdGFiLiBOZWNlc3NhcmlvIHBlcmNow6ggbCdpbnB1dCBwZXIgbGEgbGFiZWwgw6ggc3VsIFRhYkNvbXBvbmVudFxuICAgKiBtZW50cmUgaWwgZGF0YSBiaW5kaW5nIMOoIGFsbCdpbnRlcm5vIGRpIFRhYkdyb3VwQ29tcG9uZW50LiBQZXIgZmFyZSBpbiBtb2RvIGNoZSBpbCBiaW5kaW5nIHNpYSBhZ2dpb3JuYXRvXG4gICAqIGJpc29nbmEgc290dG9zY3JpdmVyc2kgYWkgY2FtYmlhbWVudGkgZSBhemlvbmFyZSBsYSBjaGFuZ2UgZGV0ZWN0aW9uIGluIG1hbmllcmEgbWFudWFsZS5cbiAgICovXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvVGFiTGFiZWxzKCkge1xuICAgIGlmICh0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbiA9IG1lcmdlKFxuICAgICAgICAuLi50aGlzLl90YWJzLm1hcCh0YWIgPT4gdGFiLl9kaXNhYmxlQ2hhbmdlKSxcbiAgICAgICAgLi4udGhpcy5fdGFicy5tYXAodGFiID0+IHRhYi5fbGFiZWxDaGFuZ2UpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogZmlzc2EgbCdpbmRpY2UgdHJhIDAgZSBsYSBkaW1lbnNpb25lIGRlaSB0YWIuICovXG4gIHByaXZhdGUgX2NsYW1wVGFiSW5kZXgoaW5kZXg6IG51bWJlciB8IG51bGwpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLl90YWJzLmxlbmd0aCAtIDEsIE1hdGgubWF4KGluZGV4IHx8IDAsIDApKTtcbiAgfVxuXG4gIC8qKiByaXRvcm5hIHVuIGlkIHVuaXZvY28gcGVyIG9nbmkgbGFiZWwgZGkgdGFiICovXG4gIF9nZXRUYWJMYWJlbElkKGk6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBpdC10YWItbGFiZWwtJHt0aGlzLl9ncm91cElkfS0ke2l9YDtcbiAgfVxuXG4gIC8qKiByaXRvcm5hIHVuIGlkIHVuaXZvY28gcGVyIG9nbmkgZWxlbWVudG8gZGkgY29udGVudXRvIGRlbCB0YWIgKi9cbiAgX2dldFRhYkNvbnRlbnRJZChpOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaXQtdGFiLWNvbnRlbnQtJHt0aGlzLl9ncm91cElkfS0ke2l9YDtcbiAgfVxuXG4gIC8qKiByZXN0aXR1aXNjZSBpbCB0YWJJbmRleCBkZWwgdGFiLiAqL1xuICBfZ2V0VGFiSW5kZXgodGFiOiBJdFRhYkNvbXBvbmVudCwgaWR4OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodGFiLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gaWR4ID8gMCA6IC0xO1xuICB9XG5cbiAgX2hhbmRsZUNsaWNrKCRldmVudDogRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmNoYW5nZVRhYihpbmRleCk7XG4gIH1cblxufVxuIiwiPHVsIGNsYXNzPVwibmF2XCIgW25nQ2xhc3NdPVwieyduYXYtZGFyayc6IGRhcmssICduYXYtdGFicyc6ICFwaWxsLCAnbmF2LXBpbGxzIG1iLTMnOiBwaWxsfVwiIHJvbGU9XCJ0YWJsaXN0XCI+XG5cbiAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIiAqbmdGb3I9XCJsZXQgdGFiIG9mIF90YWJzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPGFcbiAgICBmb2N1c01vdXNlXG4gICAgICBocmVmPVwiI1wiXG4gICAgICByb2xlPVwidGFiXCJcbiAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiX2dldFRhYkNvbnRlbnRJZChpKVwiXG4gICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInNlbGVjdGVkSW5kZXggPT0gaVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYi5hcmlhTGFiZWwgfHwgbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiKCF0YWIuYXJpYUxhYmVsICYmIHRhYi5hcmlhTGFiZWxsZWRieSkgPyB0YWIuYXJpYUxhYmVsbGVkYnkgOiBudWxsXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ25hdi1saW5rJzogdHJ1ZSwgJ2FjdGl2ZSc6IHNlbGVjdGVkSW5kZXggPT0gaSwgJ2Rpc2FibGVkJzogdGFiLmRpc2FibGVkIH1cIlxuICAgICAgW2lkXT1cIl9nZXRUYWJMYWJlbElkKGkpXCJcbiAgICAgIChjbGljayk9XCJfaGFuZGxlQ2xpY2soJGV2ZW50LCBpKVwiXG4gICAgICA+XG4gICAgICA8aSAqbmdJZj1cInRhYi5pY29uXCIgY2xhc3M9XCJpdC1pY28tbGcgZC1ibG9jayB0ZXh0LWNlbnRlclwiIFtuZ0NsYXNzXT1cInRhYi5pY29uXCI+PC9pPlxuICAgICAge3t0YWIubGFiZWx9fVxuICAgIDwvYT5cbiAgPC9saT5cbjwvdWw+XG48ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGFiIG9mIF90YWJzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPGRpdlxuICAgICAgW25nQ2xhc3NdPVwieyAndGFiLXBhbmUgcC0zJzogdHJ1ZSwgJ3Nob3cgYWN0aXZlJzogc2VsZWN0ZWRJbmRleCA9PSBpIH1cIlxuICAgICAgW2lkXT1cIl9nZXRUYWJDb250ZW50SWQoaSlcIlxuICAgICAgcm9sZT1cInRhYnBhbmVsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJfZ2V0VGFiTGFiZWxJZChpKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYi5faW1wbGljaXRDb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=