design-angular-kit 1.0.0-2 → 1.0.0-20

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 (220) hide show
  1. package/README.md +102 -26
  2. package/assets/i18n/en.json +122 -0
  3. package/assets/i18n/it.json +52 -11
  4. package/esm2022/lib/abstracts/abstract-form.component.mjs +186 -0
  5. package/esm2022/lib/abstracts/abstract.component.mjs +45 -0
  6. package/esm2022/lib/components/components.module.mjs +188 -0
  7. package/esm2022/lib/components/core/accordion/accordion.component.mjs +38 -0
  8. package/esm2022/lib/components/core/alert/alert.component.mjs +74 -0
  9. package/esm2022/lib/components/core/badge/badge.directive.mjs +38 -0
  10. package/esm2022/lib/components/core/button/button.directive.mjs +85 -0
  11. package/esm2022/lib/components/core/callout/callout.component.mjs +57 -0
  12. package/esm2022/lib/components/core/card/card.component.mjs +64 -0
  13. package/esm2022/lib/components/core/carousel/carousel/carousel.component.mjs +89 -0
  14. package/esm2022/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +19 -0
  15. package/esm2022/lib/components/core/carousel/carousel.module.mjs +23 -0
  16. package/esm2022/lib/components/core/chip/chip.component.mjs +96 -0
  17. package/esm2022/lib/components/core/collapse/collapse.component.mjs +101 -0
  18. package/esm2022/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +24 -0
  19. package/esm2022/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +11 -0
  20. package/esm2022/lib/components/core/dimmer/dimmer.component.mjs +59 -0
  21. package/esm2022/lib/components/core/dimmer/dimmer.module.mjs +27 -0
  22. package/esm2022/lib/components/core/dropdown/dropdown/dropdown.component.mjs +143 -0
  23. package/esm2022/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +68 -0
  24. package/esm2022/lib/components/core/dropdown/dropdown.module.mjs +18 -0
  25. package/esm2022/lib/components/core/forward/forward.directive.mjs +53 -0
  26. package/esm2022/lib/components/core/link/link.component.mjs +46 -0
  27. package/esm2022/lib/components/core/list/list/list.component.mjs +17 -0
  28. package/esm2022/lib/components/core/list/list-item/list-item.component.mjs +40 -0
  29. package/esm2022/lib/components/core/list/list.module.mjs +23 -0
  30. package/esm2022/lib/components/core/modal/modal.component.mjs +192 -0
  31. package/esm2022/lib/components/core/notifications/notifications.component.mjs +111 -0
  32. package/esm2022/lib/components/core/pagination/pagination.component.mjs +133 -0
  33. package/esm2022/lib/components/core/popover/popover.directive.mjs +175 -0
  34. package/esm2022/lib/components/core/progress-bar/progress-bar.component.mjs +35 -0
  35. package/esm2022/lib/components/core/progress-button/progress-button.component.mjs +27 -0
  36. package/esm2022/lib/components/core/spinner/spinner.component.mjs +36 -0
  37. package/esm2022/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +138 -0
  38. package/esm2022/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +19 -0
  39. package/esm2022/lib/components/core/steppers/steppers.module.mjs +23 -0
  40. package/esm2022/lib/components/core/tab/tab-container/tab-container.component.mjs +60 -0
  41. package/esm2022/lib/components/core/tab/tab-item/tab-item.component.mjs +36 -0
  42. package/esm2022/lib/components/core/tab/tab.module.mjs +23 -0
  43. package/esm2022/lib/components/core/table/table.component.mjs +57 -0
  44. package/esm2022/lib/components/core/tooltip/tooltip.directive.mjs +142 -0
  45. package/esm2022/lib/components/form/checkbox/checkbox.component.mjs +49 -0
  46. package/esm2022/lib/components/form/form.module.mjs +55 -0
  47. package/esm2022/lib/components/form/input/input.component.mjs +239 -0
  48. package/esm2022/lib/components/form/password-input/password-input.component.mjs +155 -0
  49. package/esm2022/lib/components/form/radio-button/radio-button.component.mjs +69 -0
  50. package/esm2022/lib/components/form/range/range.component.mjs +64 -0
  51. package/esm2022/lib/components/form/rating/rating.component.mjs +51 -0
  52. package/esm2022/lib/components/form/select/select.component.mjs +70 -0
  53. package/esm2022/lib/components/form/textarea/textarea.component.mjs +47 -0
  54. package/esm2022/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +140 -0
  55. package/esm2022/lib/components/form/upload-file-list/upload-file-list.component.mjs +112 -0
  56. package/esm2022/lib/components/navigation/back-button/back-button.component.mjs +71 -0
  57. package/esm2022/lib/components/navigation/back-to-top/back-to-top.component.mjs +64 -0
  58. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +57 -0
  59. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +23 -0
  60. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumbs.module.mjs +18 -0
  61. package/esm2022/lib/components/navigation/header/header.component.mjs +58 -0
  62. package/esm2022/lib/components/utils/error-page/error-page.component.mjs +81 -0
  63. package/esm2022/lib/components/utils/icon/icon.component.mjs +55 -0
  64. package/esm2022/lib/components/utils/language-switcher/language-switcher.component.mjs +47 -0
  65. package/esm2022/lib/design-angular-kit-config.mjs +15 -0
  66. package/esm2022/lib/design-angular-kit.module.mjs +68 -0
  67. package/esm2022/lib/interfaces/core.mjs +16 -0
  68. package/esm2022/lib/interfaces/design-angular-kit-init.mjs +2 -0
  69. package/esm2022/lib/interfaces/form.mjs +2 -0
  70. package/esm2022/lib/interfaces/icon.mjs +165 -0
  71. package/esm2022/lib/interfaces/utils.mjs +2 -0
  72. package/esm2022/lib/pipes/mark-matching-text.pipe.mjs +37 -0
  73. package/esm2022/lib/services/notification/notification.service.mjs +120 -0
  74. package/esm2022/lib/utils/file-utils.mjs +73 -0
  75. package/esm2022/lib/utils/regex.mjs +31 -0
  76. package/esm2022/lib/validators/it-validators.mjs +153 -0
  77. package/esm2022/public_api.mjs +85 -0
  78. package/fesm2022/design-angular-kit.mjs +4649 -0
  79. package/fesm2022/design-angular-kit.mjs.map +1 -0
  80. package/lib/abstracts/{abstract-form-component.d.ts → abstract-form.component.d.ts} +12 -10
  81. package/lib/abstracts/abstract.component.d.ts +24 -8
  82. package/lib/components/components.module.d.ts +40 -0
  83. package/lib/components/core/accordion/accordion.component.d.ts +11 -9
  84. package/lib/components/core/alert/alert.component.d.ts +32 -5
  85. package/lib/components/core/badge/badge.directive.d.ts +12 -6
  86. package/lib/components/core/button/button.directive.d.ts +24 -17
  87. package/lib/components/core/callout/callout.component.d.ts +26 -17
  88. package/lib/components/core/card/card.component.d.ts +23 -13
  89. package/lib/components/core/carousel/carousel/carousel.component.d.ts +34 -15
  90. package/lib/components/core/carousel/carousel-item/carousel-item.component.d.ts +8 -3
  91. package/lib/components/core/carousel/carousel.module.d.ts +8 -0
  92. package/lib/components/core/chip/chip.component.d.ts +8 -5
  93. package/lib/components/core/collapse/collapse.component.d.ts +16 -15
  94. package/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.d.ts +3 -3
  95. package/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.d.ts +3 -3
  96. package/lib/components/core/dimmer/dimmer.component.d.ts +4 -4
  97. package/lib/components/core/dimmer/dimmer.module.d.ts +9 -0
  98. package/lib/components/core/dropdown/dropdown/dropdown.component.d.ts +53 -10
  99. package/lib/components/core/dropdown/dropdown-item/dropdown-item.component.d.ts +8 -13
  100. package/lib/components/core/dropdown/dropdown.module.d.ts +8 -0
  101. package/lib/components/core/forward/forward.directive.d.ts +3 -3
  102. package/lib/components/core/link/link.component.d.ts +9 -10
  103. package/lib/components/core/list/list/list.component.d.ts +6 -5
  104. package/lib/components/core/list/list-item/list-item.component.d.ts +12 -8
  105. package/lib/components/core/list/list.module.d.ts +8 -0
  106. package/lib/components/core/modal/modal.component.d.ts +83 -14
  107. package/lib/components/core/notifications/notifications.component.d.ts +25 -11
  108. package/lib/components/core/pagination/pagination.component.d.ts +71 -10
  109. package/lib/components/core/popover/popover.directive.d.ts +15 -14
  110. package/lib/components/core/progress-bar/progress-bar.component.d.ts +6 -6
  111. package/lib/components/core/progress-button/progress-button.component.d.ts +5 -5
  112. package/lib/components/core/spinner/spinner.component.d.ts +6 -6
  113. package/lib/components/core/steppers/steppers-container/steppers-container.component.d.ts +128 -0
  114. package/lib/components/core/steppers/steppers-item/steppers-item.component.d.ts +20 -0
  115. package/lib/components/core/steppers/steppers.module.d.ts +8 -0
  116. package/lib/components/core/tab/tab-container/tab-container.component.d.ts +14 -12
  117. package/lib/components/core/tab/tab-item/tab-item.component.d.ts +11 -11
  118. package/lib/components/core/tab/tab.module.d.ts +8 -0
  119. package/lib/components/core/table/table.component.d.ts +14 -14
  120. package/lib/components/core/tooltip/tooltip.directive.d.ts +12 -11
  121. package/lib/components/form/checkbox/checkbox.component.d.ts +13 -10
  122. package/lib/components/form/form.module.d.ts +16 -0
  123. package/lib/components/form/input/input.component.d.ts +59 -13
  124. package/lib/components/form/password-input/password-input.component.d.ts +33 -8
  125. package/lib/components/form/radio-button/radio-button.component.d.ts +7 -6
  126. package/lib/components/form/range/range.component.d.ts +42 -0
  127. package/lib/components/form/rating/rating.component.d.ts +24 -0
  128. package/lib/components/form/select/select.component.d.ts +12 -6
  129. package/lib/components/form/textarea/textarea.component.d.ts +5 -5
  130. package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +8 -7
  131. package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +11 -9
  132. package/lib/components/navigation/back-button/back-button.component.d.ts +4 -4
  133. package/lib/components/navigation/back-to-top/back-to-top.component.d.ts +28 -13
  134. package/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.d.ts +11 -9
  135. package/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +6 -6
  136. package/lib/components/navigation/breadcrumbs/breadcrumbs.module.d.ts +8 -0
  137. package/lib/components/navigation/header/header.component.d.ts +9 -13
  138. package/lib/components/utils/error-page/error-page.component.d.ts +44 -0
  139. package/lib/components/utils/icon/icon.component.d.ts +14 -16
  140. package/lib/components/utils/language-switcher/language-switcher.component.d.ts +27 -0
  141. package/lib/design-angular-kit-config.d.ts +16 -0
  142. package/lib/design-angular-kit.module.d.ts +9 -4
  143. package/lib/interfaces/core.d.ts +40 -16
  144. package/lib/interfaces/design-angular-kit-init.d.ts +7 -0
  145. package/lib/interfaces/form.d.ts +32 -8
  146. package/lib/interfaces/icon.d.ts +4 -3
  147. package/lib/interfaces/utils.d.ts +10 -0
  148. package/lib/pipes/mark-matching-text.pipe.d.ts +10 -0
  149. package/lib/services/{notifications/notifications.service.d.ts → notification/notification.service.d.ts} +20 -20
  150. package/lib/utils/boolean-input.d.ts +1 -1
  151. package/lib/utils/file-utils.d.ts +5 -0
  152. package/lib/utils/regex.d.ts +5 -0
  153. package/lib/validators/it-validators.d.ts +16 -9
  154. package/package.json +13 -17
  155. package/public_api.d.ts +21 -4
  156. package/esm2020/lib/abstracts/abstract-form-component.mjs +0 -165
  157. package/esm2020/lib/abstracts/abstract.component.mjs +0 -20
  158. package/esm2020/lib/components/core/accordion/accordion.component.mjs +0 -20
  159. package/esm2020/lib/components/core/alert/alert.component.mjs +0 -29
  160. package/esm2020/lib/components/core/badge/badge.directive.mjs +0 -34
  161. package/esm2020/lib/components/core/button/button.directive.mjs +0 -78
  162. package/esm2020/lib/components/core/callout/callout.component.mjs +0 -59
  163. package/esm2020/lib/components/core/card/card.component.mjs +0 -58
  164. package/esm2020/lib/components/core/carousel/carousel/carousel.component.mjs +0 -66
  165. package/esm2020/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +0 -14
  166. package/esm2020/lib/components/core/chip/chip.component.mjs +0 -89
  167. package/esm2020/lib/components/core/collapse/collapse.component.mjs +0 -96
  168. package/esm2020/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +0 -24
  169. package/esm2020/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +0 -11
  170. package/esm2020/lib/components/core/dimmer/dimmer.component.mjs +0 -59
  171. package/esm2020/lib/components/core/dropdown/dropdown/dropdown.component.mjs +0 -60
  172. package/esm2020/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +0 -71
  173. package/esm2020/lib/components/core/forward/forward.directive.mjs +0 -51
  174. package/esm2020/lib/components/core/link/link.component.mjs +0 -39
  175. package/esm2020/lib/components/core/list/list/list.component.mjs +0 -13
  176. package/esm2020/lib/components/core/list/list-item/list-item.component.mjs +0 -36
  177. package/esm2020/lib/components/core/modal/modal.component.mjs +0 -98
  178. package/esm2020/lib/components/core/notifications/notifications.component.mjs +0 -66
  179. package/esm2020/lib/components/core/pagination/pagination.component.mjs +0 -51
  180. package/esm2020/lib/components/core/popover/popover.directive.mjs +0 -176
  181. package/esm2020/lib/components/core/progress-bar/progress-bar.component.mjs +0 -34
  182. package/esm2020/lib/components/core/progress-button/progress-button.component.mjs +0 -27
  183. package/esm2020/lib/components/core/spinner/spinner.component.mjs +0 -35
  184. package/esm2020/lib/components/core/tab/tab-container/tab-container.component.mjs +0 -33
  185. package/esm2020/lib/components/core/tab/tab-item/tab-item.component.mjs +0 -36
  186. package/esm2020/lib/components/core/table/table.component.mjs +0 -57
  187. package/esm2020/lib/components/core/tooltip/tooltip.directive.mjs +0 -140
  188. package/esm2020/lib/components/form/checkbox/checkbox.component.mjs +0 -40
  189. package/esm2020/lib/components/form/input/input.component.mjs +0 -159
  190. package/esm2020/lib/components/form/password-input/password-input.component.mjs +0 -112
  191. package/esm2020/lib/components/form/radio-button/radio-button.component.mjs +0 -53
  192. package/esm2020/lib/components/form/select/select.component.mjs +0 -62
  193. package/esm2020/lib/components/form/textarea/textarea.component.mjs +0 -46
  194. package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +0 -134
  195. package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +0 -99
  196. package/esm2020/lib/components/navigation/back-button/back-button.component.mjs +0 -69
  197. package/esm2020/lib/components/navigation/back-to-top/back-to-top.component.mjs +0 -39
  198. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +0 -45
  199. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +0 -23
  200. package/esm2020/lib/components/navigation/header/header.component.mjs +0 -61
  201. package/esm2020/lib/components/utils/icon/icon.component.mjs +0 -54
  202. package/esm2020/lib/components/utils/not-found-page/not-found-page.component.mjs +0 -13
  203. package/esm2020/lib/design-angular-kit.module.mjs +0 -42
  204. package/esm2020/lib/interfaces/core.mjs +0 -16
  205. package/esm2020/lib/interfaces/form.mjs +0 -2
  206. package/esm2020/lib/interfaces/icon.mjs +0 -2
  207. package/esm2020/lib/modules/components.module.mjs +0 -241
  208. package/esm2020/lib/services/notifications/notifications.service.mjs +0 -122
  209. package/esm2020/lib/utils/file-utils.mjs +0 -65
  210. package/esm2020/lib/utils/regex.mjs +0 -26
  211. package/esm2020/lib/validators/it-validators.mjs +0 -131
  212. package/esm2020/public_api.mjs +0 -64
  213. package/fesm2015/design-angular-kit.mjs +0 -3271
  214. package/fesm2015/design-angular-kit.mjs.map +0 -1
  215. package/fesm2020/design-angular-kit.mjs +0 -3231
  216. package/fesm2020/design-angular-kit.mjs.map +0 -1
  217. package/lib/components/utils/not-found-page/not-found-page.component.d.ts +0 -5
  218. package/lib/modules/components.module.d.ts +0 -57
  219. /package/{esm2020 → esm2022}/design-angular-kit.mjs +0 -0
  220. /package/{esm2020 → esm2022}/lib/utils/boolean-input.mjs +0 -0
package/README.md CHANGED
@@ -45,10 +45,12 @@ Sul branch `main` potete trovare il codice dei lavori in corso e nella [mileston
45
45
 
46
46
  **Commenti e contributi di tutta la community sono più che benvenuti!** 🎉
47
47
 
48
- #### Link veloci
49
- [Preview di Vercel (aggiornata ad ogni commit)](https://design-angular-kit.vercel.app/) |
50
- [Discussione sulla nuova release](https://github.com/italia/design-angular-kit/discussions/127) |
51
- [Milestone 1.0.0](https://github.com/italia/design-angular-kit/milestone/3)
48
+ ## Link utili
49
+ - [Video Meetup Angular Roma: Angular, Bootstrap Italia e non solo..](https://www.youtube.com/live/asGk-mYU-zM?feature=share)
50
+ - [Demo Design Angular Kit](https://github.com/cri99/demo-design-angular-kit)
51
+ - [Preview di Vercel (aggiornata ad ogni commit)](https://design-angular-kit.vercel.app/)
52
+ - [Discussione sulla nuova release](https://github.com/italia/design-angular-kit/discussions/127)
53
+ - [Milestone 1.0.0](https://github.com/italia/design-angular-kit/milestone/3)
52
54
 
53
55
  ## Come iniziare
54
56
 
@@ -61,11 +63,63 @@ npm install design-angular-kit@unstable --save
61
63
  Procedi a registrare `DesignAngularKitModule` nel tuo **app.module.ts**.
62
64
 
63
65
  ```typescript
64
- imports: [
66
+ import {DesignAngularKitModule, ItComponentsModule} from 'design-angular-kit';
67
+
68
+ @NgModule({
69
+ imports: [
65
70
  ...
66
- TranslateModule.forRoot(),
67
- DesignAngularKitModule
68
- ]
71
+ DesignAngularKitModule,
72
+ ItComponentsModule // importa tutti i componenti della libreria
73
+ ]
74
+ })
75
+ ```
76
+ <details>
77
+ <summary>Configurazione custom della libreria</summary>
78
+
79
+ ```typescript
80
+ import {DesignAngularKitModule, DesignAngularKitInit} from 'design-angular-kit';
81
+
82
+ // Puoi aggiungere alla libreria una configurazione iniziale
83
+ const initConfig: DesignAngularKitInit | undefined = {
84
+ /**
85
+ * The initial path in the `href` attribute in the `IconComponent` component
86
+ * @default './bootstrap-italia/dist/svg/sprites.svg'
87
+ */
88
+ iconHref: string | undefined,
89
+ };
90
+
91
+ @NgModule({
92
+ imports: [
93
+ ...
94
+ DesignAngularKitModule.forRoot(initConfig)
95
+ ]
96
+ })
97
+ ```
98
+ </details>
99
+
100
+ Usa `ItComponentsModule` per importare tutti i componenti della libreria, in alternativa puoi importare solo i componenti/moduli di cui hai bisogno, ad es. Alert, Paginazione e Breadcrumb.
101
+
102
+ ```typescript
103
+ import {ItAlertComponent, ItPaginationComponent, ItBreadcrumbsModule} from 'design-angular-kit';
104
+
105
+ @NgModule({
106
+ imports: [
107
+ ItAlertComponent,
108
+ ItPaginationComponent,
109
+ ItBreadcrumbsModule // Include ItBreadcrumbComponent e ItBreadcrumbItemComponent
110
+ ],
111
+ })
112
+ export class YourAppModule {
113
+ }
114
+
115
+ @Component({
116
+ selector: 'app-product',
117
+ standalone: true,
118
+ imports: [ItAlertComponent],
119
+ templateUrl: './product.component.html'
120
+ })
121
+ export class ProductComponent {
122
+ }
69
123
  ```
70
124
 
71
125
  ### Importazione stili bootstrap-italia
@@ -145,35 +199,57 @@ Modifica il tuo `angular.json` aggiungendo:
145
199
  ]
146
200
  ```
147
201
 
202
+ #### Localizzazione esistente
203
+
148
204
  Se utilizzi già i file di localizzazione nella tua app, puoi utilizzare la libreria [ngx-translate-multi-http-loader](https://www.npmjs.com/package/ngx-translate-multi-http-loader)
149
205
  per caricare i file di localizzazione dell'app e di `design-angular-kit`
150
206
 
151
207
  Modifica nel tuo `app.module.ts`:
152
208
 
153
209
  ```typescript
154
- imports: [
155
- ...
156
- HttpClientModule,
157
- TranslateModule.forRoot({
158
- loader: {
159
- provide: TranslateLoader,
160
- useFactory: (http: HttpBackend) => new MultiTranslateHttpLoader(http, [
161
- './assets/i18n/', // Your i18n location
162
- './bootstrap-italia/i18n/'
163
- ]),
164
- deps: [HttpBackend],
210
+ @NgModule({
211
+ imports: [
212
+ ...
213
+ HttpClientModule,
214
+ TranslateModule.forRoot({
215
+ loader: {
216
+ provide: TranslateLoader,
217
+ useFactory: (http: HttpBackend) => new MultiTranslateHttpLoader(http, [
218
+ './bootstrap-italia/i18n/', // Load library translations first, so you can edit the keys in your localization file
219
+ './assets/i18n/' // Your i18n location
220
+ ]),
221
+ deps: [HttpBackend]
222
+ },
165
223
  defaultLanguage: 'it'
166
- }
167
- }),
168
- DesignAngularKitModule
169
- ]
224
+ }),
225
+ DesignAngularKitModule
226
+ ]
227
+ })
170
228
  ```
171
229
 
172
- #### Usa la localizzazione personalizzata
230
+ Se vuoi personalizzare le nostre label puoi aggiungere le localizzazioni nei tuoi file json, sovrascrivendo le [chiavi del json della libreria](projects/design-angular-kit/assets/i18n/it.json).
173
231
 
174
- Aggiungi la localizzazione personalizzata nella tua cartella `assets/bootstrap-italia/i18n/` (crea il percorso se non esiste). Il json deve avere [questo formato](projects/design-angular-kit/assets/i18n/it.json).
232
+ Puoi utilizzare le label localizzate di `design-angular-kit` nella tua applicazione, ad esempio `{{'it.errors.required-field' | translate}}`. [Vedi le nostre label](projects/design-angular-kit/assets/i18n/it.json)
233
+
234
+ #### Localizzazione non esistente
235
+
236
+ Se non utilizzi i file di localizzazione nella tua app, devi aggiungere il provider `TranslateStore` nel tuo `app.module.ts`:
237
+
238
+ ```typescript
239
+ @NgModule({
240
+ imports: [
241
+ ...
242
+ DesignAngularKitModule,
243
+ ],
244
+ providers: [
245
+ TranslateStore
246
+ ],
247
+ })
248
+ ```
175
249
 
176
- Se utilizzi già i file di localizzazione nella tua app, puoi aggiungere le localizzazioni nei tuoi file json, sovrascrivendo le chiavi del json della libreria.
250
+ Se vuoi personalizzare le nostre label:
251
+ - Non includere il supporto i18n nel tuo `angular.json` ma crea i tuoi file di localizzazione personalizzati nella tua cartella `assets/bootstrap-italia/i18n/` (crea il percorso se non esiste).
252
+ - Il json deve avere [questo formato](projects/design-angular-kit/assets/i18n/it.json).
177
253
 
178
254
  ### Supporto animazione
179
255
 
@@ -0,0 +1,122 @@
1
+ {
2
+ "it": {
3
+ "general": {
4
+ "save": "Save",
5
+ "send": "Send",
6
+ "abort": "Abort",
7
+ "close": "Close",
8
+ "continue": "Continue",
9
+ "edit": "Edit",
10
+ "show": "Show",
11
+ "show-all": "Show all",
12
+ "details": "Details",
13
+ "download": "Download"
14
+ },
15
+ "errors": {
16
+ "generic": "An error has occurred",
17
+ "generic-support-message": "There was an unexpected error. Please try again later or contact support.",
18
+ "invalid-field": "This field is invalid",
19
+ "required-field": "This field is required",
20
+ "check-all-fields": "Check that you have filled in all the fields correctly",
21
+ "min-invalid": "The minimum value for this field is: {{min}}",
22
+ "max-invalid": "The maximum value for this field is: {{max}}",
23
+ "min-length-invalid": "The minimum length for this field is: {{min}}",
24
+ "max-length-invalid": "The maximum length for this field is: {{max}}",
25
+ "email-invalid": "Enter a valid email",
26
+ "tel-invalid": "Please enter a valid phone number format",
27
+ "url-invalid": "Please enter a valid URL",
28
+ "tax-code-invalid": "Enter a valid tax code",
29
+ "vat-number-invalid": "Enter a valid VAT number",
30
+ "cap-invalid": "Enter a valid zip code",
31
+ "iban-invalid": "Enter a valid IBAN",
32
+ "regex-invalid": "Please enter a valid REGEX expression",
33
+ "pattern-invalid": "The field must have the pattern {{pattern}}",
34
+ "password-no-match": "Passwords must match",
35
+ "password-min-length": "The password must contain at least {{minLength}} characters!",
36
+ "password-number": "The password must have at least a number!",
37
+ "password-capital-case": "The password should contain at least an uppercase character!",
38
+ "password-small-case": "The password must contain at least a lowercase character!",
39
+ "password-special-character": "The password must contain at least a special character!"
40
+ },
41
+ "core": {
42
+ "close-modal": "Close modal window",
43
+ "close-notification": "Close Notification: {{title}}",
44
+ "close-alert": "Close alert",
45
+ "page": "Page",
46
+ "previous": "Previous",
47
+ "previous-page": "Previous page",
48
+ "next": "Next",
49
+ "next-page": "Next page",
50
+ "go-to": "Go to",
51
+ "page-of-total": "Page {{page}} of {{total}}",
52
+ "progress": "Progress",
53
+ "loading": "Loading",
54
+ "active": "Active",
55
+ "remove": "Delete",
56
+ "confirm": "Confirm",
57
+ "confirmed": "Confirmed",
58
+ "step": "Step",
59
+ "step-of": "Step {{current}} of {{available}}",
60
+ "back": "Back",
61
+ "forward": "Forward",
62
+ "rate-star": "Rate {{current}} out of {{total}} stars",
63
+ "rating-star": "Rating {{current}} out of {{total}} stars"
64
+ },
65
+ "form": {
66
+ "caps-inserted": "CAPS LOCK entered",
67
+ "password-strength-meter": {
68
+ "description": {
69
+ "default": "Enter at least {{minLength}} characters",
70
+ "number": "a number",
71
+ "capital-case": "an uppercase character",
72
+ "special-character": "a special character"
73
+ },
74
+ "password-short": "Very weak password",
75
+ "password-bad": "Weak password",
76
+ "password-good": "Secure password",
77
+ "password-strong": "Very secure password"
78
+ },
79
+ "increase-value": "Increase value",
80
+ "decrease-value": "Decrease value",
81
+ "upload": "Upload",
82
+ "upload-drag-file": "Drag the file to upload it",
83
+ "upload-loading": "Loading...",
84
+ "upload-complete": "Upload completed",
85
+ "upload-or": "or",
86
+ "upload-select-device": "select it from the device",
87
+ "uploaded-file": "File uploaded: {{name}}",
88
+ "delete-file": "Delete file {{name}}"
89
+ },
90
+ "navigation": {
91
+ "home": "Home",
92
+ "go-back": "Go back",
93
+ "upper-level": "Upper level",
94
+ "secondary-navigation": "Secondary navigation",
95
+ "login": "Log in",
96
+ "full-login": "Access the personal area",
97
+ "search": "Search",
98
+ "website-search": "Search in the site",
99
+ "navigation-path": "Navigation path"
100
+ },
101
+ "utils": {
102
+ "selected": "Selected",
103
+ "language-selection": "Language selection: {{lang}}",
104
+ "select-language": "Select a language",
105
+ "error-page": {
106
+ "404": {
107
+ "title": "Resource not found",
108
+ "description": "Oops! The resource you are looking for was not found, go back to the homepage and use the menu to continue browsing."
109
+ },
110
+ "403": {
111
+ "title": "Forbidden",
112
+ "description": "You are not authorized to access this resource!"
113
+ },
114
+ "500": {
115
+ "title": "An error has occurred",
116
+ "description": "There was an unexpected error. Please try again later or contact support."
117
+ },
118
+ "go-to-homepage": "Return to homepage"
119
+ }
120
+ }
121
+ }
122
+ }
@@ -4,10 +4,13 @@
4
4
  "save": "Salva",
5
5
  "send": "Invia",
6
6
  "abort": "Annulla",
7
+ "close": "Chiudi",
7
8
  "continue": "Continua",
8
9
  "edit": "Modifica",
10
+ "show": "Visualizza",
9
11
  "show-all": "Mostra tutto",
10
- "details": "Dettagli"
12
+ "details": "Dettagli",
13
+ "download": "Scarica"
11
14
  },
12
15
  "errors": {
13
16
  "generic": "Si è verificato un errore",
@@ -18,35 +21,61 @@
18
21
  "min-invalid": "Il valore minimo per questo campo è: {{min}}",
19
22
  "max-invalid": "Il valore massimo per questo campo è: {{max}}",
20
23
  "min-length-invalid": "La lunghezza minima per questo campo è: {{min}}",
21
- "max-length-invalid": "La lunghezza minima per questo campo è: {{max}}",
24
+ "max-length-invalid": "La lunghezza massima per questo campo è: {{max}}",
22
25
  "email-invalid": "Inserisci un email valida",
23
26
  "tel-invalid": "Inserisci un formato telefonico valido",
24
27
  "url-invalid": "Inserisci un url valido",
25
28
  "tax-code-invalid": "Inserisci un codice fiscale valido",
26
29
  "vat-number-invalid": "Inserisci una partita iva valida",
27
30
  "cap-invalid": "Inserisci un CAP valido",
31
+ "iban-invalid": "Inserisci un IBAN valido",
28
32
  "regex-invalid": "Inserisci un espressione REGEX valida",
29
33
  "pattern-invalid": "Il campo deve avere il pattern {{pattern}}",
30
34
  "password-no-match": "Le password devono essere identiche",
31
35
  "password-min-length": "La password deve contenere almeno {{minLength}} caratteri!",
32
- "password-number": "La password deve avere almeno 1 numero!",
33
- "password-capital-case": "La password deve contenere almeno 1 carattere maiuscolo!",
34
- "password-small-case": "La password deve contenere almeno 1 carattere minuscolo!",
35
- "password-special-character": "La password deve contenere almeno 1 carattere speciale!"
36
+ "password-number": "La password deve avere almeno un numero!",
37
+ "password-capital-case": "La password deve contenere almeno un carattere maiuscolo!",
38
+ "password-small-case": "La password deve contenere almeno un carattere minuscolo!",
39
+ "password-special-character": "La password deve contenere almeno un carattere speciale!"
36
40
  },
37
41
  "core": {
38
42
  "close-modal": "Chiudi finestra modale",
39
43
  "close-notification": "Chiudi notifica: {{title}}",
40
44
  "close-alert": "Chiudi avviso",
41
45
  "page": "Pagina",
46
+ "previous": "Precedente",
42
47
  "previous-page": "Pagina precedente",
48
+ "next": "Successiva",
43
49
  "next-page": "Pagina successiva",
50
+ "go-to": "Vai a",
51
+ "page-of-total": "Pagina {{page}} di {{total}}",
44
52
  "progress": "Progresso",
45
53
  "loading": "Caricamento",
46
54
  "active": "Attivo",
47
- "remove": "Elimina"
55
+ "remove": "Elimina",
56
+ "confirm": "Conferma",
57
+ "confirmed": "Confermato",
58
+ "step": "Step",
59
+ "step-of": "Step {{current}} di {{available}}",
60
+ "back": "Indietro",
61
+ "forward": "Avanti",
62
+ "rate-star": "Valuta {{current}} stelle su {{total}}",
63
+ "rating-star": "Valutazione {{current}} stelle su {{total}}"
48
64
  },
49
65
  "form": {
66
+ "caps-inserted": "CAPS LOCK inserito",
67
+ "password-strength-meter": {
68
+ "description": {
69
+ "default": "Inserisci almeno {{minLength}} caratteri",
70
+ "number": "un numero",
71
+ "capital-case": "un carattere maiuscolo",
72
+ "special-character": "un carattere speciale"
73
+ },
74
+ "password-short": "Password molto debole",
75
+ "password-bad": "Password debole",
76
+ "password-good": "Password sicura",
77
+ "password-strong": "Password molto sicura"
78
+ },
50
79
  "increase-value": "Aumenta valore",
51
80
  "decrease-value": "Diminuisci valore",
52
81
  "upload": "Upload",
@@ -70,10 +99,22 @@
70
99
  "navigation-path": "Percorso di navigazione"
71
100
  },
72
101
  "utils": {
73
- "404": {
74
- "title": "Risorsa non trovata",
75
- "description": "Oops! La risorsa che cerchi non è stata trovata, torna alla homepage e utilizza il menu per continuare la navigazione.",
76
- "go-back": "Torna indietro",
102
+ "selected": "Selezionata",
103
+ "language-selection": "Selezione lingua: {{lang}}",
104
+ "select-language": "Seleziona una lingua",
105
+ "error-page": {
106
+ "404": {
107
+ "title": "Risorsa non trovata",
108
+ "description": "Oops! La risorsa che cerchi non è stata trovata, torna alla homepage e utilizza il menu per continuare la navigazione."
109
+ },
110
+ "403": {
111
+ "title": "Non autorizzato",
112
+ "description": "Non sei autorizzato ad accedere a questa risorsa!"
113
+ },
114
+ "500": {
115
+ "title": "Si è verificato un errore",
116
+ "description": "Si è verificato un errore imprevisto. Riprova più tardi o contatta il supporto."
117
+ },
77
118
  "go-to-homepage": "Torna alla homepage"
78
119
  }
79
120
  }
@@ -0,0 +1,186 @@
1
+ import { FormControl } from '@angular/forms';
2
+ import { Component, Input, Optional, Self } from '@angular/core';
3
+ import { ItAbstractComponent } from './abstract.component';
4
+ import { isFalseBooleanInput, isTrueBooleanInput } from '../utils/boolean-input';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@ngx-translate/core";
7
+ import * as i2 from "@angular/forms";
8
+ export class ItAbstractFormComponent extends ItAbstractComponent {
9
+ /**
10
+ * Set the disabled state
11
+ */
12
+ set disabled(isDisabled) {
13
+ this.setDisabledState(isTrueBooleanInput(isDisabled));
14
+ }
15
+ constructor(_translateService, _ngControl) {
16
+ super();
17
+ this._translateService = _translateService;
18
+ this._ngControl = _ngControl;
19
+ /**
20
+ * Validation color display mode (validation triggered if field is touched or not pristine)
21
+ * - <b>true</b>: Always show the validation color
22
+ * - <b>false</b>: Never show validation color
23
+ * - <b>only-valid</b>: Show only valid validation color
24
+ * - <b>only-invalid</b>: Show only invalid validation color
25
+ * @default <b>only-invalid</b>: Show only invalid validation color
26
+ */
27
+ this.validationMode = 'only-invalid';
28
+ this.onChange = (_) => {
29
+ };
30
+ this.onTouched = () => {
31
+ };
32
+ this.control = new FormControl();
33
+ this._ngControl && (this._ngControl.valueAccessor = this);
34
+ }
35
+ /**
36
+ * Check if field is invalid (Validation failed)
37
+ */
38
+ get isInvalid() {
39
+ if (this.validationMode === 'only-valid' || (this.validationMode !== 'only-invalid' && isFalseBooleanInput(this.validationMode))) {
40
+ return undefined;
41
+ }
42
+ if (this._ngControl) {
43
+ return this._ngControl.invalid === true && (!this._ngControl.pristine || this._ngControl.touched === true);
44
+ }
45
+ return this.control.invalid && (!this.control.pristine || this.control.touched);
46
+ }
47
+ /**
48
+ * Check if field is valid (Validation successful)
49
+ */
50
+ get isValid() {
51
+ if (this.validationMode === 'only-invalid' || (this.validationMode !== 'only-valid' && isFalseBooleanInput(this.validationMode))) {
52
+ return undefined;
53
+ }
54
+ if (this._ngControl) {
55
+ return this._ngControl.valid === true && (!this._ngControl.pristine || this._ngControl.touched === true);
56
+ }
57
+ return this.control.valid && (!this.control.pristine || this.control.touched);
58
+ }
59
+ /**
60
+ * Return the invalid message string from TranslateService
61
+ */
62
+ get invalidMessage() {
63
+ if (this.hasError('required')) {
64
+ return this._translateService.get('it.errors.required-field');
65
+ }
66
+ return this._translateService.get('it.errors.invalid-field');
67
+ }
68
+ ngOnInit() {
69
+ if (this._ngControl?.control) {
70
+ this.control.setValidators(this._ngControl.control.validator);
71
+ }
72
+ }
73
+ registerOnChange(fn) {
74
+ this.control.valueChanges.subscribe(fn);
75
+ this.onChange = fn;
76
+ }
77
+ registerOnTouched(fn) {
78
+ this.onTouched = fn;
79
+ }
80
+ setDisabledState(isDisabled) {
81
+ if (isDisabled) {
82
+ return this.control.disable();
83
+ }
84
+ this.control.enable();
85
+ }
86
+ writeValue(value) {
87
+ this.control.setValue(value, { emitEvent: false });
88
+ this._changeDetectorRef.detectChanges();
89
+ }
90
+ /**
91
+ * Mark the control as touched
92
+ */
93
+ markAsTouched() {
94
+ if (!this.control.touched) {
95
+ this.onTouched();
96
+ }
97
+ }
98
+ /**
99
+ * Fired to check if form control is touched
100
+ */
101
+ ngDoCheck() {
102
+ if (this._ngControl?.control) {
103
+ const ngControl = this._ngControl.control;
104
+ if (this.control.touched !== ngControl.touched) {
105
+ if (ngControl.touched) {
106
+ this.control.markAsTouched();
107
+ }
108
+ else {
109
+ this.control.markAsUntouched();
110
+ }
111
+ }
112
+ if (this.control.pristine !== ngControl.pristine) {
113
+ if (ngControl.pristine) {
114
+ this.control.markAsPristine();
115
+ }
116
+ else {
117
+ this.control.markAsDirty();
118
+ }
119
+ }
120
+ }
121
+ this._changeDetectorRef.detectChanges();
122
+ }
123
+ /**
124
+ * Add the validators in control and parent control
125
+ * @param validators the validators
126
+ * @protected
127
+ */
128
+ addValidators(validators) {
129
+ if (!Array.isArray(validators)) {
130
+ validators = [validators];
131
+ }
132
+ validators.forEach(validator => {
133
+ if (!this.control.hasValidator(validator)) {
134
+ this.control.addValidators(validator);
135
+ }
136
+ if (this._ngControl?.control && !this._ngControl.control.hasValidator(validator)) {
137
+ this._ngControl.control.addValidators(validator);
138
+ }
139
+ });
140
+ }
141
+ /**
142
+ * Reports whether the control with the given path has the error specified. <br/>
143
+ * If the control is not present, false is returned.
144
+ * @param errorCode The code of the error to check
145
+ * @param path A list of control names that designates how to move from the current control
146
+ * to the control that should be queried for errors.
147
+ * @returns whether the given error is present in the control at the given path.
148
+ */
149
+ hasError(errorCode, path) {
150
+ if (this._ngControl) {
151
+ return this._ngControl.hasError(errorCode, path);
152
+ }
153
+ return this.control.hasError(errorCode, path);
154
+ }
155
+ /**
156
+ * Reports error data for the control with the given path.
157
+ * @param errorCode The code of the error to check
158
+ * @param path A list of control names that designates how to move from the current control
159
+ * to the control that should be queried for errors.
160
+ * @returns error data for that particular error. If the control or error is not present,
161
+ * null is returned.
162
+ */
163
+ getError(errorCode, path) {
164
+ if (this._ngControl) {
165
+ return this._ngControl.getError(errorCode, path);
166
+ }
167
+ return this.control.getError(errorCode, path);
168
+ }
169
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItAbstractFormComponent, deps: [{ token: i1.TranslateService }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
170
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: ItAbstractFormComponent, selector: "ng-component", inputs: { label: "label", validationMode: "validationMode", disabled: "disabled" }, usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
171
+ }
172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItAbstractFormComponent, decorators: [{
173
+ type: Component,
174
+ args: [{ template: '' }]
175
+ }], ctorParameters: function () { return [{ type: i1.TranslateService }, { type: i2.NgControl, decorators: [{
176
+ type: Self
177
+ }, {
178
+ type: Optional
179
+ }] }]; }, propDecorators: { label: [{
180
+ type: Input
181
+ }], validationMode: [{
182
+ type: Input
183
+ }], disabled: [{
184
+ type: Input
185
+ }] } });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9hYnN0cmFjdHMvYWJzdHJhY3QtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixXQUFXLEVBQTBCLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0YsT0FBTyxFQUFFLFNBQVMsRUFBVyxLQUFLLEVBQVUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQWdCLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFLL0YsTUFBTSxPQUFnQix1QkFBaUMsU0FBUSxtQkFBbUI7SUFpQmhGOztPQUVHO0lBQ0gsSUFBYSxRQUFRLENBQUMsVUFBd0I7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQU9ELFlBQ3FCLGlCQUFtQyxFQUNmLFVBQXFCO1FBRTVELEtBQUssRUFBRSxDQUFDO1FBSFcsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNmLGVBQVUsR0FBVixVQUFVLENBQVc7UUF4QjlEOzs7Ozs7O1dBT0c7UUFDTSxtQkFBYyxHQUFpRCxjQUFjLENBQUM7UUFvRXZGLGFBQVEsR0FBRyxDQUFDLENBQUksRUFBRSxFQUFFO1FBQ3BCLENBQUMsQ0FBQztRQUVGLGNBQVMsR0FBRyxHQUFHLEVBQUU7UUFDakIsQ0FBQyxDQUFDO1FBckRBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxh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RyxjQUFjO3NCQUF0QixLQUFLO2dCQUtPLFFBQVE7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5nQ29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21wb25lbnQsIERvQ2hlY2ssIElucHV0LCBPbkluaXQsIE9wdGlvbmFsLCBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJdEFic3RyYWN0Q29tcG9uZW50IH0gZnJvbSAnLi9hYnN0cmFjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBpc0ZhbHNlQm9vbGVhbklucHV0LCBpc1RydWVCb29sZWFuSW5wdXQgfSBmcm9tICcuLi91dGlscy9ib29sZWFuLWlucHV0JztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7IHRlbXBsYXRlOiAnJyB9KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEl0QWJzdHJhY3RGb3JtQ29tcG9uZW50PFQgPSBhbnk+IGV4dGVuZHMgSXRBYnN0cmFjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIERvQ2hlY2sge1xuXG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgb2YgZm9ybSBjb250cm9sXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogVmFsaWRhdGlvbiBjb2xvciBkaXNwbGF5IG1vZGUgKHZhbGlkYXRpb24gdHJpZ2dlcmVkIGlmIGZpZWxkIGlzIHRvdWNoZWQgb3Igbm90IHByaXN0aW5lKVxuICAgKiAtIDxiPnRydWU8L2I+OiBBbHdheXMgc2hvdyB0aGUgdmFsaWRhdGlvbiBjb2xvclxuICAgKiAtIDxiPmZhbHNlPC9iPjogTmV2ZXIgc2hvdyB2YWxpZGF0aW9uIGNvbG9yXG4gICAqIC0gPGI+b25seS12YWxpZDwvYj46IFNob3cgb25seSB2YWxpZCB2YWxpZGF0aW9uIGNvbG9yXG4gICAqIC0gPGI+b25seS1pbnZhbGlkPC9iPjogU2hvdyBvbmx5IGludmFsaWQgdmFsaWRhdGlvbiBjb2xvclxuICAgKiBAZGVmYXVsdCA8Yj5vbmx5LWludmFsaWQ8L2I+OiBTaG93IG9ubHkgaW52YWxpZCB2YWxpZGF0aW9uIGNvbG9yXG4gICAqL1xuICBASW5wdXQoKSB2YWxpZGF0aW9uTW9kZTogQm9vbGVhbklucHV0IHwgJ29ubHktdmFsaWQnIHwgJ29ubHktaW52YWxpZCcgPSAnb25seS1pbnZhbGlkJztcblxuICAvKipcbiAgICogU2V0IHRoZSBkaXNhYmxlZCBzdGF0ZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKGlzRGlzYWJsZWQ6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuc2V0RGlzYWJsZWRTdGF0ZShpc1RydWVCb29sZWFuSW5wdXQoaXNEaXNhYmxlZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGZvcm0gY29udHJvbFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnRyb2w6IEZvcm1Db250cm9sPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAU2VsZigpIEBPcHRpb25hbCgpIHByb3RlY3RlZCByZWFkb25seSBfbmdDb250cm9sOiBOZ0NvbnRyb2xcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgICB0aGlzLl9uZ0NvbnRyb2wgJiYgKHRoaXMuX25nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZmllbGQgaXMgaW52YWxpZCAoVmFsaWRhdGlvbiBmYWlsZWQpXG4gICAqL1xuICBnZXQgaXNJbnZhbGlkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnZhbGlkYXRpb25Nb2RlID09PSAnb25seS12YWxpZCcgfHwgKHRoaXMudmFsaWRhdGlvbk1vZGUgIT09ICdvbmx5LWludmFsaWQnICYmIGlzRmFsc2VCb29sZWFuSW5wdXQodGhpcy52YWxpZGF0aW9uTW9kZSkpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uZ0NvbnRyb2wuaW52YWxpZCA9PT0gdHJ1ZSAmJiAoIXRoaXMuX25nQ29udHJvbC5wcmlzdGluZSB8fCB0aGlzLl9uZ0NvbnRyb2wudG91Y2hlZCA9PT0gdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRyb2wuaW52YWxpZCAmJiAoIXRoaXMuY29udHJvbC5wcmlzdGluZSB8fCB0aGlzLmNvbnRyb2wudG91Y2hlZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZmllbGQgaXMgdmFsaWQgKFZhbGlkYXRpb24gc3VjY2Vzc2Z1bClcbiAgICovXG4gIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnZhbGlkYXRpb25Nb2RlID09PSAnb25seS1pbnZhbGlkJyB8fCAodGhpcy52YWxpZGF0aW9uTW9kZSAhPT0gJ29ubHktdmFsaWQnICYmIGlzRmFsc2VCb29sZWFuSW5wdXQodGhpcy52YWxpZGF0aW9uTW9kZSkpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uZ0NvbnRyb2wudmFsaWQgPT09IHRydWUgJiYgKCF0aGlzLl9uZ0NvbnRyb2wucHJpc3RpbmUgfHwgdGhpcy5fbmdDb250cm9sLnRvdWNoZWQgPT09IHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250cm9sLnZhbGlkICYmICghdGhpcy5jb250cm9sLnByaXN0aW5lIHx8IHRoaXMuY29udHJvbC50b3VjaGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGludmFsaWQgbWVzc2FnZSBzdHJpbmcgZnJvbSBUcmFuc2xhdGVTZXJ2aWNlXG4gICAqL1xuICBnZXQgaW52YWxpZE1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMucmVxdWlyZWQtZmllbGQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5pbnZhbGlkLWZpZWxkJyk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbmdDb250cm9sPy5jb250cm9sKSB7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsaWRhdG9ycygodGhpcy5fbmdDb250cm9sLmNvbnRyb2wgYXMgRm9ybUNvbnRyb2wpLnZhbGlkYXRvcik7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogVCkgPT4ge1xuICB9O1xuXG4gIG9uVG91Y2hlZCA9ICgpID0+IHtcbiAgfTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZShmbik7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udHJvbC5kaXNhYmxlKCk7XG4gICAgfVxuICAgIHRoaXMuY29udHJvbC5lbmFibGUoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogTWFyayB0aGUgY29udHJvbCBhcyB0b3VjaGVkXG4gICAqL1xuICBtYXJrQXNUb3VjaGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250cm9sLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVkIHRvIGNoZWNrIGlmIGZvcm0gY29udHJvbCBpcyB0b3VjaGVkXG4gICAqL1xuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMuX25nQ29udHJvbD8uY29udHJvbCkge1xuICAgICAgY29uc3QgbmdDb250cm9sID0gdGhpcy5fbmdDb250cm9sLmNvbnRyb2w7XG4gICAgICBpZiAodGhpcy5jb250cm9sLnRvdWNoZWQgIT09IG5nQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgIGlmIChuZ0NvbnRyb2wudG91Y2hlZCkge1xuICAgICAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250cm9sLm1hcmtBc1VudG91Y2hlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250cm9sLnByaXN0aW5lICE9PSBuZ0NvbnRyb2wucHJpc3RpbmUpIHtcbiAgICAgICAgaWYgKG5nQ29udHJvbC5wcmlzdGluZSkge1xuICAgICAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIHZhbGlkYXRvcnMgaW4gY29udHJvbCBhbmQgcGFyZW50IGNvbnRyb2xcbiAgICogQHBhcmFtIHZhbGlkYXRvcnMgdGhlIHZhbGlkYXRvcnNcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFkZFZhbGlkYXRvcnModmFsaWRhdG9yczogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdKTogdm9pZCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbGlkYXRvcnMpKSB7XG4gICAgICB2YWxpZGF0b3JzID0gW3ZhbGlkYXRvcnNdO1xuICAgIH1cblxuICAgIHZhbGlkYXRvcnMuZm9yRWFjaCh2YWxpZGF0b3IgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuaGFzVmFsaWRhdG9yKHZhbGlkYXRvcikpIHtcbiAgICAgICAgdGhpcy5jb250cm9sLmFkZFZhbGlkYXRvcnModmFsaWRhdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX25nQ29udHJvbD8uY29udHJvbCAmJiAhdGhpcy5fbmdDb250cm9sLmNvbnRyb2wuaGFzVmFsaWRhdG9yKHZhbGlkYXRvcikpIHtcbiAgICAgICAgdGhpcy5fbmdDb250cm9sLmNvbnRyb2wuYWRkVmFsaWRhdG9ycyh2YWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBwYXRoIGhhcyB0aGUgZXJyb3Igc3BlY2lmaWVkLiA8YnIvPlxuICAgKiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBlcnJvckNvZGUgVGhlIGNvZGUgb2YgdGhlIGVycm9yIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBwYXRoIEEgbGlzdCBvZiBjb250cm9sIG5hbWVzIHRoYXQgZGVzaWduYXRlcyBob3cgdG8gbW92ZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRyb2xcbiAgICogdG8gdGhlIGNvbnRyb2wgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBmb3IgZXJyb3JzLlxuICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlcnJvciBpcyBwcmVzZW50IGluIHRoZSBjb250cm9sIGF0IHRoZSBnaXZlbiBwYXRoLlxuICAgKi9cbiAgcHVibGljIGhhc0Vycm9yKGVycm9yQ29kZTogc3RyaW5nLCBwYXRoPzogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uZ0NvbnRyb2wuaGFzRXJyb3IoZXJyb3JDb2RlLCBwYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbC5oYXNFcnJvcihlcnJvckNvZGUsIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgZXJyb3IgZGF0YSBmb3IgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgY29kZSBvZiB0aGUgZXJyb3IgdG8gY2hlY2tcbiAgICogQHBhcmFtIHBhdGggQSBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgdGhhdCBkZXNpZ25hdGVzIGhvdyB0byBtb3ZlIGZyb20gdGhlIGN1cnJlbnQgY29udHJvbFxuICAgKiB0byB0aGUgY29udHJvbCB0aGF0IHNob3VsZCBiZSBxdWVyaWVkIGZvciBlcnJvcnMuXG4gICAqIEByZXR1cm5zIGVycm9yIGRhdGEgZm9yIHRoYXQgcGFydGljdWxhciBlcnJvci4gSWYgdGhlIGNvbnRyb2wgb3IgZXJyb3IgaXMgbm90IHByZXNlbnQsXG4gICAqIG51bGwgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0RXJyb3IoZXJyb3JDb2RlOiBzdHJpbmcsIHBhdGg/OiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgc3RyaW5nKTogYW55IHtcbiAgICBpZiAodGhpcy5fbmdDb250cm9sKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbmdDb250cm9sLmdldEVycm9yKGVycm9yQ29kZSwgcGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRyb2wuZ2V0RXJyb3IoZXJyb3JDb2RlLCBwYXRoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,45 @@
1
+ import { ChangeDetectorRef, Component, ElementRef, EventEmitter, inject, Input, Output, Renderer2 } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class ItAbstractComponent {
4
+ /**
5
+ * Counter of active instances
6
+ * @private
7
+ */
8
+ static { this.instances = 0; }
9
+ constructor() {
10
+ /**
11
+ * The element ID
12
+ */
13
+ this.id = this.getDefaultId();
14
+ this._renderer = inject(Renderer2);
15
+ this._elementRef = inject(ElementRef);
16
+ this._changeDetectorRef = inject(ChangeDetectorRef);
17
+ this.valueChanges = new EventEmitter();
18
+ }
19
+ ngAfterViewInit() {
20
+ this._renderer.removeAttribute(this._elementRef.nativeElement, 'id');
21
+ }
22
+ ngOnChanges(changes) {
23
+ this.valueChanges.next(); // The inputs were changed
24
+ }
25
+ /**
26
+ * Generate unique id for components
27
+ * @private
28
+ */
29
+ getDefaultId() {
30
+ const name = this.constructor.name.replace('Component', '');
31
+ const kebabName = name.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());
32
+ return `${kebabName}-${ItAbstractComponent.instances++}`;
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItAbstractComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: ItAbstractComponent, selector: "ng-component", inputs: { id: "id" }, outputs: { valueChanges: "valueChanges" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItAbstractComponent, decorators: [{
38
+ type: Component,
39
+ args: [{ template: '' }]
40
+ }], ctorParameters: function () { return []; }, propDecorators: { id: [{
41
+ type: Input
42
+ }], valueChanges: [{
43
+ type: Output
44
+ }] } });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvYWJzdHJhY3RzL2Fic3RyYWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQzs7QUFHdkIsTUFBTSxPQUFnQixtQkFBbUI7SUFZdkM7OztPQUdHO2FBQ1ksY0FBUyxHQUFHLENBQUMsQUFBSixDQUFLO0lBTzdCO1FBckJBOztXQUVHO1FBQ00sT0FBRSxHQUFXLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQW1CeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUMvQyxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQjtJQUN0RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssWUFBWTtRQUNsQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6RyxPQUFPLEdBQUcsU0FBUyxJQUFJLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7SUFDM0QsQ0FBQzs4R0EvQ21CLG1CQUFtQjtrR0FBbkIsbUJBQW1CLDBJQURsQixFQUFFOzsyRkFDSCxtQkFBbUI7a0JBRHhDLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFOzBFQU1oQixFQUFFO3NCQUFWLEtBQUs7Z0JBS1csWUFBWTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7IHRlbXBsYXRlOiAnJyB9KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEl0QWJzdHJhY3RDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBJRFxuICAgKi9cbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9IHRoaXMuZ2V0RGVmYXVsdElkKCk7XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gY29tcG9uZW50IGlucHV0IGF0dHJpYnV0ZXMgd2FzIGNoYW5nZWRcbiAgICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgdmFsdWVDaGFuZ2VzOiBFdmVudEVtaXR0ZXI8dm9pZD47XG5cbiAgLyoqXG4gICAqIENvdW50ZXIgb2YgYWN0aXZlIGluc3RhbmNlc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VzID0gMDtcblxuXG4gIHByb3RlY3RlZCByZWFkb25seSBfcmVuZGVyZXI6IFJlbmRlcmVyMjsgLy8gSW5qZWN0ZWRcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9lbGVtZW50UmVmOiBFbGVtZW50UmVmOyAvLyBJbmplY3RlZFxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZjsgLy8gSW5qZWN0ZWRcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9yZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gICAgdGhpcy52YWx1ZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lkJyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZXMubmV4dCgpOyAvLyBUaGUgaW5wdXRzIHdlcmUgY2hhbmdlZFxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHVuaXF1ZSBpZCBmb3IgY29tcG9uZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXREZWZhdWx0SWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLnJlcGxhY2UoJ0NvbXBvbmVudCcsICcnKTtcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBuYW1lLnJlcGxhY2UoL1tBLVpdKyg/IVthLXpdKXxbQS1aXS9nLCAoJCwgb2ZzKSA9PiAob2ZzID8gJy0nIDogJycpICsgJC50b0xvd2VyQ2FzZSgpKTtcbiAgICByZXR1cm4gYCR7a2ViYWJOYW1lfS0ke0l0QWJzdHJhY3RDb21wb25lbnQuaW5zdGFuY2VzKyt9YDtcbiAgfVxufVxuIl19