design-angular-kit 1.0.0-0 → 1.0.0-10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/README.md +183 -24
  2. package/assets/i18n/en.json +93 -0
  3. package/assets/i18n/it.json +93 -0
  4. package/esm2020/lib/abstracts/abstract-form-component.mjs +174 -0
  5. package/esm2020/lib/abstracts/abstract.component.mjs +27 -0
  6. package/esm2020/lib/components/core/accordion/accordion.component.mjs +31 -0
  7. package/esm2020/lib/components/core/alert/alert.component.mjs +69 -0
  8. package/esm2020/lib/components/core/badge/badge.directive.mjs +34 -0
  9. package/esm2020/lib/components/core/button/button.directive.mjs +80 -0
  10. package/esm2020/lib/components/core/callout/callout.component.mjs +84 -0
  11. package/esm2020/lib/components/core/card/card.component.mjs +58 -0
  12. package/esm2020/lib/components/core/carousel/carousel/carousel.component.mjs +66 -0
  13. package/esm2020/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +14 -0
  14. package/esm2020/lib/components/core/chip/chip.component.mjs +89 -0
  15. package/esm2020/lib/components/core/collapse/collapse.component.mjs +101 -0
  16. package/esm2020/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +24 -0
  17. package/esm2020/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +11 -0
  18. package/esm2020/lib/components/core/dimmer/dimmer.component.mjs +59 -0
  19. package/esm2020/lib/components/core/dropdown/dropdown/dropdown.component.mjs +130 -0
  20. package/esm2020/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +68 -0
  21. package/esm2020/lib/components/core/forward/forward.directive.mjs +51 -0
  22. package/esm2020/lib/components/core/link/link.component.mjs +40 -0
  23. package/esm2020/lib/components/core/list/list/list.component.mjs +13 -0
  24. package/esm2020/lib/components/core/list/list-item/list-item.component.mjs +36 -0
  25. package/esm2020/lib/components/core/modal/modal.component.mjs +98 -0
  26. package/esm2020/lib/components/core/notifications/notifications.component.mjs +110 -0
  27. package/esm2020/lib/components/core/pagination/pagination.component.mjs +51 -0
  28. package/esm2020/lib/components/core/popover/popover.directive.mjs +179 -0
  29. package/esm2020/lib/components/core/progress-bar/progress-bar.component.mjs +34 -0
  30. package/esm2020/lib/components/core/progress-button/progress-button.component.mjs +27 -0
  31. package/esm2020/lib/components/core/rating/rating.component.mjs +45 -0
  32. package/esm2020/lib/components/core/spinner/spinner.component.mjs +35 -0
  33. package/esm2020/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +119 -0
  34. package/esm2020/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +18 -0
  35. package/esm2020/lib/components/core/tab/tab-container/tab-container.component.mjs +59 -0
  36. package/esm2020/lib/components/core/tab/tab-item/tab-item.component.mjs +36 -0
  37. package/esm2020/lib/components/core/table/table.component.mjs +57 -0
  38. package/esm2020/lib/components/core/tooltip/tooltip.directive.mjs +143 -0
  39. package/esm2020/lib/components/form/checkbox/checkbox.component.mjs +40 -0
  40. package/esm2020/lib/components/form/input/input.component.mjs +222 -0
  41. package/esm2020/lib/components/form/password-input/password-input.component.mjs +112 -0
  42. package/esm2020/lib/components/form/radio-button/radio-button.component.mjs +53 -0
  43. package/esm2020/lib/components/form/select/select.component.mjs +62 -0
  44. package/esm2020/lib/components/form/textarea/textarea.component.mjs +46 -0
  45. package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +137 -0
  46. package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +104 -0
  47. package/esm2020/lib/components/navigation/back-button/back-button.component.mjs +69 -0
  48. package/esm2020/lib/components/navigation/back-to-top/back-to-top.component.mjs +74 -0
  49. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +45 -0
  50. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +23 -0
  51. package/esm2020/lib/components/navigation/header/header.component.mjs +63 -0
  52. package/esm2020/lib/components/utils/icon/icon.component.mjs +54 -0
  53. package/esm2020/lib/components/utils/language-switcher/language-switcher.component.mjs +39 -0
  54. package/esm2020/lib/components/utils/not-found-page/not-found-page.component.mjs +13 -0
  55. package/esm2020/lib/design-angular-kit.module.mjs +45 -131
  56. package/esm2020/lib/interfaces/core.mjs +16 -0
  57. package/esm2020/lib/interfaces/form.mjs +2 -0
  58. package/esm2020/lib/interfaces/icon.mjs +2 -0
  59. package/esm2020/lib/interfaces/utils.mjs +2 -0
  60. package/esm2020/lib/modules/components.module.mjs +261 -0
  61. package/esm2020/lib/pipes/mark-matching-text.pipe.mjs +36 -0
  62. package/esm2020/lib/services/notifications/notifications.service.mjs +120 -0
  63. package/esm2020/lib/utils/boolean-input.mjs +15 -0
  64. package/esm2020/lib/utils/file-utils.mjs +73 -0
  65. package/esm2020/lib/utils/regex.mjs +26 -0
  66. package/esm2020/lib/validators/it-validators.mjs +134 -0
  67. package/esm2020/public_api.mjs +67 -36
  68. package/fesm2015/design-angular-kit.mjs +3424 -2713
  69. package/fesm2015/design-angular-kit.mjs.map +1 -1
  70. package/fesm2020/design-angular-kit.mjs +3391 -2713
  71. package/fesm2020/design-angular-kit.mjs.map +1 -1
  72. package/lib/abstracts/abstract-form-component.d.ts +89 -0
  73. package/lib/abstracts/abstract.component.d.ts +20 -0
  74. package/lib/components/core/accordion/accordion.component.d.ts +12 -0
  75. package/lib/components/core/alert/alert.component.d.ts +39 -0
  76. package/lib/components/core/badge/badge.directive.d.ts +16 -0
  77. package/lib/components/core/button/button.directive.d.ts +36 -0
  78. package/lib/components/core/callout/callout.component.d.ts +47 -0
  79. package/lib/components/core/card/card.component.d.ts +41 -0
  80. package/lib/components/core/carousel/carousel/carousel.component.d.ts +46 -0
  81. package/lib/components/core/carousel/carousel-item/carousel-item.component.d.ts +10 -0
  82. package/lib/components/core/chip/chip.component.d.ts +62 -0
  83. package/lib/components/core/collapse/collapse.component.d.ts +60 -0
  84. package/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.d.ts +12 -0
  85. package/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.d.ts +5 -0
  86. package/lib/components/core/dimmer/dimmer.component.d.ts +24 -0
  87. package/lib/components/core/dropdown/dropdown/dropdown.component.d.ts +81 -0
  88. package/lib/components/core/dropdown/dropdown-item/dropdown-item.component.d.ts +39 -0
  89. package/lib/components/core/forward/forward.directive.d.ts +14 -0
  90. package/lib/components/core/link/link.component.d.ts +31 -0
  91. package/lib/components/core/list/list/list.component.d.ts +10 -0
  92. package/lib/components/core/list/list-item/list-item.component.d.ts +24 -0
  93. package/lib/components/core/modal/modal.component.d.ts +59 -0
  94. package/lib/components/core/notifications/notifications.component.d.ts +44 -0
  95. package/lib/components/core/pagination/pagination.component.d.ts +31 -0
  96. package/lib/components/core/popover/popover.directive.d.ts +98 -0
  97. package/lib/components/core/progress-bar/progress-bar.component.d.ts +28 -0
  98. package/lib/components/core/progress-button/progress-button.component.d.ts +22 -0
  99. package/lib/components/core/rating/rating.component.d.ts +20 -0
  100. package/lib/components/core/spinner/spinner.component.d.ts +21 -0
  101. package/lib/components/core/steppers/steppers-container/steppers-container.component.d.ts +102 -0
  102. package/lib/components/core/steppers/steppers-item/steppers-item.component.d.ts +19 -0
  103. package/lib/components/core/tab/tab-container/tab-container.component.d.ts +30 -0
  104. package/lib/components/core/tab/tab-item/tab-item.component.d.ts +34 -0
  105. package/lib/components/core/table/table.component.d.ts +54 -0
  106. package/lib/components/core/tooltip/tooltip.directive.d.ts +81 -0
  107. package/lib/components/form/checkbox/checkbox.component.d.ts +30 -0
  108. package/lib/components/form/input/input.component.d.ts +96 -0
  109. package/lib/components/form/password-input/password-input.component.d.ts +55 -0
  110. package/lib/components/form/radio-button/radio-button.component.d.ts +29 -0
  111. package/lib/components/form/select/select.component.d.ts +30 -0
  112. package/lib/components/form/textarea/textarea.component.d.ts +24 -0
  113. package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +54 -0
  114. package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +59 -0
  115. package/lib/components/navigation/back-button/back-button.component.d.ts +47 -0
  116. package/lib/components/navigation/back-to-top/back-to-top.component.d.ts +46 -0
  117. package/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.d.ts +30 -0
  118. package/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +22 -0
  119. package/lib/components/navigation/header/header.component.d.ts +30 -0
  120. package/lib/components/utils/icon/icon.component.d.ts +40 -0
  121. package/lib/components/utils/language-switcher/language-switcher.component.d.ts +23 -0
  122. package/lib/components/utils/not-found-page/not-found-page.component.d.ts +5 -0
  123. package/lib/design-angular-kit.module.d.ts +7 -24
  124. package/lib/interfaces/core.d.ts +59 -0
  125. package/lib/interfaces/form.d.ts +67 -0
  126. package/lib/interfaces/icon.d.ts +3 -0
  127. package/lib/interfaces/utils.d.ts +10 -0
  128. package/lib/modules/components.module.d.ts +62 -0
  129. package/lib/services/notifications/notifications.service.d.ts +63 -0
  130. package/lib/utils/boolean-input.d.ts +11 -0
  131. package/lib/utils/file-utils.d.ts +32 -0
  132. package/lib/utils/regex.d.ts +25 -0
  133. package/lib/validators/it-validators.d.ts +58 -0
  134. package/package.json +22 -12
  135. package/public_api.d.ts +59 -35
  136. package/esm2020/lib/badge/badge.directive.mjs +0 -83
  137. package/esm2020/lib/breadcrumb/breadcrumb-item.component.mjs +0 -66
  138. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +0 -89
  139. package/esm2020/lib/button/button.directive.mjs +0 -185
  140. package/esm2020/lib/button/button.module.mjs +0 -18
  141. package/esm2020/lib/checkbox/checkbox.component.mjs +0 -138
  142. package/esm2020/lib/collapse/collapse-group.component.mjs +0 -57
  143. package/esm2020/lib/collapse/collapse-item.component.mjs +0 -79
  144. package/esm2020/lib/collapse/collapse.config.mjs +0 -12
  145. package/esm2020/lib/collapse/collapse.directive.mjs +0 -55
  146. package/esm2020/lib/collapse/collapse.module.mjs +0 -22
  147. package/esm2020/lib/dropdown/dropdown-divider.component.mjs +0 -11
  148. package/esm2020/lib/dropdown/dropdown-item.component.mjs +0 -97
  149. package/esm2020/lib/dropdown/dropdown.component.mjs +0 -143
  150. package/esm2020/lib/dropdown/dropdown.config.mjs +0 -12
  151. package/esm2020/lib/dropdown/dropdown.directive.mjs +0 -156
  152. package/esm2020/lib/dropdown/dropdown.module.mjs +0 -25
  153. package/esm2020/lib/enums/icons.enum.mjs +0 -27
  154. package/esm2020/lib/form-input/form-input-password.utils.mjs +0 -154
  155. package/esm2020/lib/form-input/form-input.component.mjs +0 -495
  156. package/esm2020/lib/form-input/it-prefix.directive.mjs +0 -13
  157. package/esm2020/lib/form-input/it-suffix.directive.mjs +0 -13
  158. package/esm2020/lib/form-input/it-text-prefix.directive.mjs +0 -13
  159. package/esm2020/lib/form-input/it-text-suffix.directive.mjs +0 -13
  160. package/esm2020/lib/form-input/mark-matching-text.pipe.mjs +0 -36
  161. package/esm2020/lib/icon/icon.component.mjs +0 -87
  162. package/esm2020/lib/icon/icon.module.mjs +0 -18
  163. package/esm2020/lib/models/Alignment.mjs +0 -15
  164. package/esm2020/lib/models/ButtonSize.mjs +0 -15
  165. package/esm2020/lib/models/InputType.mjs +0 -44
  166. package/esm2020/lib/models/ThemeColor.mjs +0 -30
  167. package/esm2020/lib/popover/popover.config.mjs +0 -17
  168. package/esm2020/lib/popover/popover.directive.mjs +0 -33
  169. package/esm2020/lib/popover/popover.module.mjs +0 -19
  170. package/esm2020/lib/progress-bar/progress-bar.component.mjs +0 -98
  171. package/esm2020/lib/radio/radio.component.mjs +0 -287
  172. package/esm2020/lib/radio/unique-selection-dispatcher.mjs +0 -55
  173. package/esm2020/lib/tabs/tab-group.component.mjs +0 -177
  174. package/esm2020/lib/tabs/tab.component.mjs +0 -73
  175. package/esm2020/lib/tabs/tabs.module.mjs +0 -20
  176. package/esm2020/lib/toggle/toggle.component.mjs +0 -86
  177. package/esm2020/lib/tooltip/tooltip.config.mjs +0 -17
  178. package/esm2020/lib/tooltip/tooltip.directive.mjs +0 -43
  179. package/esm2020/lib/tooltip/tooltip.module.mjs +0 -19
  180. package/esm2020/lib/util/focus-mouse.directive.mjs +0 -32
  181. package/esm2020/lib/util/util.mjs +0 -12
  182. package/esm2020/lib/util/utils.module.mjs +0 -16
  183. package/lib/badge/badge.directive.d.ts +0 -33
  184. package/lib/breadcrumb/breadcrumb-item.component.d.ts +0 -33
  185. package/lib/breadcrumb/breadcrumb.component.d.ts +0 -33
  186. package/lib/button/button.directive.d.ts +0 -72
  187. package/lib/button/button.module.d.ts +0 -8
  188. package/lib/checkbox/checkbox.component.d.ts +0 -61
  189. package/lib/collapse/collapse-group.component.d.ts +0 -16
  190. package/lib/collapse/collapse-item.component.d.ts +0 -46
  191. package/lib/collapse/collapse.config.d.ts +0 -6
  192. package/lib/collapse/collapse.directive.d.ts +0 -25
  193. package/lib/collapse/collapse.module.d.ts +0 -12
  194. package/lib/dropdown/dropdown-divider.component.d.ts +0 -5
  195. package/lib/dropdown/dropdown-item.component.d.ts +0 -56
  196. package/lib/dropdown/dropdown.component.d.ts +0 -65
  197. package/lib/dropdown/dropdown.config.d.ts +0 -6
  198. package/lib/dropdown/dropdown.directive.d.ts +0 -77
  199. package/lib/dropdown/dropdown.module.d.ts +0 -15
  200. package/lib/enums/icons.enum.d.ts +0 -23
  201. package/lib/form-input/form-input-password.utils.d.ts +0 -45
  202. package/lib/form-input/form-input.component.d.ts +0 -283
  203. package/lib/form-input/it-prefix.directive.d.ts +0 -5
  204. package/lib/form-input/it-suffix.directive.d.ts +0 -5
  205. package/lib/form-input/it-text-prefix.directive.d.ts +0 -5
  206. package/lib/form-input/it-text-suffix.directive.d.ts +0 -5
  207. package/lib/icon/icon.component.d.ts +0 -34
  208. package/lib/icon/icon.module.d.ts +0 -8
  209. package/lib/models/Alignment.d.ts +0 -12
  210. package/lib/models/ButtonSize.d.ts +0 -11
  211. package/lib/models/InputType.d.ts +0 -36
  212. package/lib/models/ThemeColor.d.ts +0 -21
  213. package/lib/popover/popover.config.d.ts +0 -11
  214. package/lib/popover/popover.directive.d.ts +0 -20
  215. package/lib/popover/popover.module.d.ts +0 -9
  216. package/lib/progress-bar/progress-bar.component.d.ts +0 -55
  217. package/lib/radio/radio.component.d.ts +0 -116
  218. package/lib/radio/unique-selection-dispatcher.d.ts +0 -36
  219. package/lib/tabs/tab-group.component.d.ts +0 -71
  220. package/lib/tabs/tab.component.d.ts +0 -44
  221. package/lib/tabs/tabs.module.d.ts +0 -10
  222. package/lib/toggle/toggle.component.d.ts +0 -46
  223. package/lib/tooltip/tooltip.config.d.ts +0 -11
  224. package/lib/tooltip/tooltip.directive.d.ts +0 -27
  225. package/lib/tooltip/tooltip.module.d.ts +0 -9
  226. package/lib/util/focus-mouse.directive.d.ts +0 -13
  227. package/lib/util/util.d.ts +0 -5
  228. package/lib/util/utils.module.d.ts +0 -7
  229. /package/lib/{form-input → pipes}/mark-matching-text.pipe.d.ts +0 -0
package/README.md CHANGED
@@ -1,39 +1,86 @@
1
- [![NPM](https://img.shields.io/npm/v/design-angular-kit.svg)](https://www.npmjs.com/package/design-angular-kit)
2
- [![Build](https://github.com/italia/design-angular-kit/actions/workflows/ci.yml/badge.svg)](https://github.com/italia/design-angular-kit/actions)
3
- [![codecov](https://codecov.io/gh/italia/design-angular-kit/branch/main/graph/badge.svg?token=0Ud6YSFi0r)](https://codecov.io/gh/italia/design-angular-kit)
4
- [![License](https://img.shields.io/github/license/italia/design-angular-kit.svg)](https://github.com/italia/design-angular-kit/blob/main/LICENSE)
5
- [![GitHub issues](https://img.shields.io/github/issues/italia/design-angular-kit.svg)](https://github.com/italia/design-angular-kit/issues)
6
- [![Join the #design channel](https://img.shields.io/badge/Slack%20channel-%23design-blue.svg)](https://developersitalia.slack.com/messages/C7VPAUVB3/)
7
- [![Get invited](https://slack.developers.italia.it/badge.svg)](https://slack.developers.italia.it/)
1
+ <h1 align="center">Design Angular Kit</h1>
2
+
3
+ <p align="center">
4
+ <img src=".github/angular_design_kit.png" alt="angular-logo" width="120px" height="120px"/>
5
+ <br>
6
+ <i>Design Angular Kit è un toolkit basato su Bootstrap Italia
7
+ <br> per la creazione di applicazioni web sviluppate con Angular.</i>
8
+ <br>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://italia.github.io/design-angular-kit"><strong>italia.github.io/design-angular-kit</strong></a>
13
+ <br>
14
+ </p>
15
+
16
+ <p align="center">
17
+ <a href="https://www.npmjs.com/package/design-angular-kit"><img src="https://img.shields.io/npm/v/design-angular-kit/unstable.svg" alt="NPM"></a>
18
+ <a href="https://github.com/italia/design-angular-kit/actions"><img src="https://github.com/italia/design-angular-kit/actions/workflows/ci.yml/badge.svg" alt="Build"></a>
19
+ <a href="https://codecov.io/gh/italia/design-angular-kit"><img src="https://codecov.io/gh/italia/design-angular-kit/branch/main/graph/badge.svg?token=0Ud6YSFi0r" alt="codecov"></a>
20
+ <a href="https://github.com/italia/design-angular-kit/blob/main/LICENSE"><img src="https://img.shields.io/github/license/italia/design-angular-kit.svg" alt="License"></a>
21
+ <a href="https://github.com/italia/design-angular-kit/issues"><img src="https://img.shields.io/github/issues/italia/design-angular-kit.svg" alt="GitHub issues"></a>
22
+ </p>
23
+
24
+ <p align="center">
25
+ <a href="https://developersitalia.slack.com/messages/C04H3C19D52/">
26
+ <img src="https://img.shields.io/badge/Slack%20channel-%23design--dev--angular-blue.svg" alt="Join the #design-dev-angular channel" />
27
+ </a>
28
+ <a href="https://slack.developers.italia.it/">
29
+ <img src="https://slack.developers.italia.it/badge.svg" alt="Get invited" />
30
+ </a>
31
+ </p>
32
+
33
+ _⚠️ Attenzione: questo codice è ancora in fase di sviluppo e non è pronto per essere utilizzato! Stiamo lavorando all'aggiornamento per portare il kit alla versione 1.0.0, commenti e contributi di tutta la community sono più che benvenuti! Se si necessita della vecchia versione il codice e la sua documentazione possono essere reperiti [qua](https://github.com/italia/design-angular-kit/tree/0.x)._
34
+
35
+ ## Verso la versione 1.0.0 📣
36
+
37
+ Sono partite le lavorazioni per l'aggiornamento del kit Angular a Bootstrap Italia 2 (basato su Bootstrap 5).
38
+ Sul branch `main` potete trovare il codice dei lavori in corso e nella [milestone Version 1.0.0](https://github.com/italia/design-angular-kit/milestone/3) un piano preliminare delle attività. La vecchia versione è da considerarsi deprecata.
39
+
40
+ 👉🏻 È possibile contribuire a questa nuova versione in vari modi:
41
+
42
+ * Con il proprio codice, prendendo in carico una issue tra quelle aperte e non già assegnate tra [le issue](https://github.com/italia/design-angular-kit/issues) di Angular Kit (è sufficiente anche un commento sulla issue per notificare la volontà di presa in carico).
43
+ * Attraverso la segnalazione di bug o miglioramenti al [repository ufficiale](https://github.com/italia/design-angular-kit/) di Angular Kit.
44
+ * Scrivendoci sul [canale dedicato](https://developersitalia.slack.com/messages/C04H3C19D52/) di Slack.
45
+
46
+ **Commenti e contributi di tutta la community sono più che benvenuti!** 🎉
47
+
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)
8
54
 
9
- # Design Angular Kit
10
-
11
- Design Angular Kit è un toolkit basato su Bootstrap Italia per la creazione di applicazioni web sviluppate con Angular.
55
+ ## Come iniziare
12
56
 
13
- _⚠️ Attenzione: questo codice è ancora in fase di sviluppo e non è pronto per essere utilizzato! Se si necessita della vecchia versione il codice e la sua documentazione possono essere reperiti [qua](https://github.com/italia/design-angular-kit/tree/0.x)._
57
+ Design Angular Kit è disponibile su NPM, per installarlo su una applicazione esistente sulla quale provare la libreria (attualmente non stabile) esegui il comando
14
58
 
15
- #### Link veloci
16
- [Preview di Vercel (aggiornata ad ogni commit)](https://design-angular-kit.vercel.app/) |
17
- [Discussione sulla nuova release](https://github.com/italia/design-angular-kit/discussions/127) |
18
- [Contribuire](https://github.com/italia/design-angular-kit/blob/main/CONTRIBUTING.md)
59
+ ```
60
+ npm install design-angular-kit@unstable --save
61
+ ```
19
62
 
20
- ## Come iniziare
63
+ Procedi a registrare `DesignAngularKitModule` nel tuo **app.module.ts**.
21
64
 
22
- Design Angular Kit è disponibile su NPM, se hai una applicazione esistente esegui il comando seguente per scaricarlo nel tuo progetto.
23
- ```
24
- npm install design-angular-kit --save
65
+ ```typescript
66
+ @NgModule({
67
+ imports: [
68
+ ...
69
+ DesignAngularKitModule
70
+ ]
71
+ })
25
72
  ```
26
73
 
27
- #### Importazione stili bootstrap-italia
74
+ ### Importazione stili bootstrap-italia
28
75
  Configura gli stili richiesti nel file `styles.scss`. Importa la libreria SCSS come mostrato nell'esempio qui sotto.
29
76
 
30
77
  ```scss
31
78
  // Importazione libreria SCSS di bootstrap-italia
32
- @import '../node_modules/bootstrap-italia/src/scss/bootstrap-italia.scss';
33
-
79
+ @import "bootstrap-italia/src/scss/bootstrap-italia";
34
80
  ```
35
81
 
36
- #### Come personalizzare e sovrascrivere le variabili di default della libreria (es. colori, font-family, misure, ecc.)
82
+ <details>
83
+ <summary>Come personalizzare e sovrascrivere le variabili di default della libreria (es. colori, font-family, misure, ecc.)</summary>
37
84
 
38
85
  Bootstrap Italia eredita ed estende tutte le variabili di default di Bootstrap, sovrascrivendo
39
86
  alcuni valori in fase di compilazione e impostandone di nuovi all’occorenza. Un esempio fra tutti è
@@ -65,10 +112,106 @@ $font-family-sans-serif: 'Custom Font', Arial, Helvetica, sans-serif;
65
112
  $font-family-monospace: 'Custom Font', 'Courier New', Courier, monospace;
66
113
 
67
114
  // Importazione libreria SCSS di bootstrap-italia
68
- @import '../node_modules/bootstrap-italia/src/scss/bootstrap-italia.scss';
115
+ @import 'bootstrap-italia/src/scss/bootstrap-italia';
116
+ ```
117
+ </details>
118
+
119
+ ### Supporto icone e assets
120
+
121
+ Per aggiungere il supporto icone/assets, modifica il tuo `angular.json` aggiungendo:
122
+
123
+ ```
124
+ "assets": [
125
+ ...
126
+ {
127
+ "glob": "**/*",
128
+ "input": "./node_modules/bootstrap-italia/",
129
+ "output": "/bootstrap-italia/"
130
+ }
131
+ ]
132
+ ```
133
+
134
+ ### Supporto i18n (localizzazione)
135
+
136
+ La libreria usa [ngx-translate](https://github.com/ngx-translate/core) per aggiungere le localizazioni i18n.
137
+
138
+ Modifica il tuo `angular.json` aggiungendo:
139
+
140
+ ```
141
+ "assets": [
142
+ ...
143
+ {
144
+ "glob": "**/*",
145
+ "input": "./node_modules/design-angular-kit/assets/i18n",
146
+ "output": "/bootstrap-italia/i18n/"
147
+ }
148
+ ]
149
+ ```
150
+
151
+ #### Localizzazione esistente
152
+
153
+ 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)
154
+ per caricare i file di localizzazione dell'app e di `design-angular-kit`
155
+
156
+ Modifica nel tuo `app.module.ts`:
157
+
158
+ ```typescript
159
+ @NgModule({
160
+ imports: [
161
+ ...
162
+ HttpClientModule,
163
+ TranslateModule.forRoot({
164
+ loader: {
165
+ provide: TranslateLoader,
166
+ useFactory: (http: HttpBackend) => new MultiTranslateHttpLoader(http, [
167
+ './bootstrap-italia/i18n/', // Load library translations first, so you can edit the keys in your localization file
168
+ './assets/i18n/' // Your i18n location
169
+ ]),
170
+ deps: [HttpBackend]
171
+ },
172
+ defaultLanguage: 'it'
173
+ }),
174
+ DesignAngularKitModule
175
+ ]
176
+ })
69
177
  ```
70
178
 
179
+ 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).
71
180
 
181
+ 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)
182
+
183
+ #### Localizzazione non esistente
184
+
185
+ Se non utilizzi i file di localizzazione nella tua app, devi aggiungere il provider `TranslateStore` nel tuo `app.module.ts`:
186
+
187
+ ```typescript
188
+ @NgModule({
189
+ imports: [
190
+ ...
191
+ DesignAngularKitModule,
192
+ ],
193
+ providers: [
194
+ TranslateStore
195
+ ],
196
+ })
197
+ ```
198
+
199
+ Se vuoi personalizzare le nostre label:
200
+ - 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).
201
+ - Il json deve avere [questo formato](projects/design-angular-kit/assets/i18n/it.json).
202
+
203
+ ### Supporto animazione
204
+
205
+ La libreria usa BrowserAnimationsModule per gestire alcune animazioni.
206
+
207
+ Per abilitarle, bisogna aggiungere al tuo `app.module.ts` il modulo :
208
+
209
+ ```typescript
210
+ imports: [
211
+ ...
212
+ BrowserAnimationsModule
213
+ ]
214
+ ```
72
215
 
73
216
  ## Segnalazione bug e richieste di aiuto
74
217
 
@@ -112,3 +255,19 @@ npm run start
112
255
  ```
113
256
  npm run test
114
257
  ```
258
+
259
+ # Contributor della libreria
260
+
261
+ Un grazie speciale a chi ha reso possibile lo sviluppo di questa nuova versione!
262
+
263
+ [![Cristian Borelli](https://github.com/cri99.png?size=100)](https://github.com/cri99) | [![Antonino Bonanno](https://github.com/AntoninoBonanno.png?size=100)](https://github.com/AntoninoBonanno) | [![NetService](https://www.net-serv.it/css/internet/agid/images/svg/logo-netservicesrl.svg)](https://www.net-serv.it/) | [![Alessio Napolitano](https://github.com/alenap93.png?size=100)](https://github.com/alenap93) |
264
+ --- | --- | --- | --- |
265
+ Cristian Borelli | Antonino Bonanno | NetService | Alessio Napolitano |
266
+
267
+ ---
268
+
269
+ Tutti i contributor (*made with [contributors-img](https://contrib.rocks)*)
270
+
271
+ <a href = "https://github.com/italia/design-angular-kit/graphs/contributors">
272
+ <img src = "https://contrib.rocks/image?repo=italia/design-angular-kit"/>
273
+ </a>
@@ -0,0 +1,93 @@
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-all": "Show all",
11
+ "details": "Details"
12
+ },
13
+ "errors": {
14
+ "generic": "An error has occurred",
15
+ "generic-support-message": "There was an unexpected error. Please try again later or contact support.",
16
+ "invalid-field": "This field is invalid",
17
+ "required-field": "This field is required",
18
+ "check-all-fields": "Check that you have filled in all the fields correctly",
19
+ "min-invalid": "The minimum value for this field is: {{min}}",
20
+ "max-invalid": "The maximum value for this field is: {{max}}",
21
+ "min-length-invalid": "The minimum length for this field is: {{min}}",
22
+ "max-length-invalid": "The minimum length for this field is: {{max}}",
23
+ "email-invalid": "Enter a valid email",
24
+ "tel-invalid": "Please enter a valid phone number format",
25
+ "url-invalid": "Please enter a valid URL",
26
+ "tax-code-invalid": "Enter a valid tax code",
27
+ "vat-number-invalid": "Enter a valid VAT number",
28
+ "cap-invalid": "Enter a valid zip code",
29
+ "regex-invalid": "Please enter a valid REGEX expression",
30
+ "pattern-invalid": "The field must have the pattern {{pattern}}",
31
+ "password-no-match": "Passwords must match",
32
+ "password-min-length": "Password must contain at least {{minLength}} characters!",
33
+ "password-number": "The password must have at least 1 number!",
34
+ "password-capital-case": "The password should contain at least 1 uppercase character!",
35
+ "password-small-case": "Password must contain at least 1 lowercase character!",
36
+ "password-special-character": "Password must contain at least 1 special character!"
37
+ },
38
+ "core": {
39
+ "close-modal": "Close modal window",
40
+ "close-notification": "Close Notification: {{title}}",
41
+ "close-alert": "Close alert",
42
+ "page": "Page",
43
+ "previous-page": "Previous page",
44
+ "next-page": "Next page",
45
+ "progress": "Progress",
46
+ "loading": "Loading",
47
+ "active": "Active",
48
+ "remove": "Delete",
49
+ "confirm": "Confirm",
50
+ "confirmed": "Confirmed",
51
+ "step": "Step",
52
+ "step-of": "Step {{current}} of {{available}}",
53
+ "back": "Back",
54
+ "forward": "Forward",
55
+ "rate-star": "Rate {{current}} out of {{total}} stars",
56
+ "rating-star": "Rating {{current}} out of {{total}} stars"
57
+ },
58
+ "form": {
59
+ "increase-value": "Increase value",
60
+ "decrease-value": "Decrease value",
61
+ "upload": "Upload",
62
+ "upload-drag-file": "Drag the file to upload it",
63
+ "upload-loading": "Loading...",
64
+ "upload-complete": "Upload completed",
65
+ "upload-or": "or",
66
+ "upload-select-device": "select it from the device",
67
+ "uploaded-file": "File uploaded: {{name}}",
68
+ "delete-file": "Delete file {{name}}"
69
+ },
70
+ "navigation": {
71
+ "home": "Home",
72
+ "go-back": "Go back",
73
+ "upper-level": "Upper level",
74
+ "secondary-navigation": "Secondary navigation",
75
+ "login": "Log in",
76
+ "full-login": "Access the personal area",
77
+ "search": "Search",
78
+ "website-search": "Search in the site",
79
+ "navigation-path": "Navigation path"
80
+ },
81
+ "utils": {
82
+ "selected": "Selected",
83
+ "language-selection": "Language selection: {{lang}}",
84
+ "select-language": "Select a language",
85
+ "404": {
86
+ "title": "Resource not found",
87
+ "description": "Oops! The resource you are looking for was not found, go back to the homepage and use the menu to continue browsing.",
88
+ "go-back": "Go back",
89
+ "go-to-homepage": "Return to homepage"
90
+ }
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "it": {
3
+ "general": {
4
+ "save": "Salva",
5
+ "send": "Invia",
6
+ "abort": "Annulla",
7
+ "close": "Chiudi",
8
+ "continue": "Continua",
9
+ "edit": "Modifica",
10
+ "show-all": "Mostra tutto",
11
+ "details": "Dettagli"
12
+ },
13
+ "errors": {
14
+ "generic": "Si è verificato un errore",
15
+ "generic-support-message": "Si è verificato un errore imprevisto. Riprova più tardi o contatta il supporto.",
16
+ "invalid-field": "Questo campo non è valido",
17
+ "required-field": "Questo campo è obbligatorio",
18
+ "check-all-fields": "Verifica di aver compilato correttamente tutti i campi",
19
+ "min-invalid": "Il valore minimo per questo campo è: {{min}}",
20
+ "max-invalid": "Il valore massimo per questo campo è: {{max}}",
21
+ "min-length-invalid": "La lunghezza minima per questo campo è: {{min}}",
22
+ "max-length-invalid": "La lunghezza minima per questo campo è: {{max}}",
23
+ "email-invalid": "Inserisci un email valida",
24
+ "tel-invalid": "Inserisci un formato telefonico valido",
25
+ "url-invalid": "Inserisci un url valido",
26
+ "tax-code-invalid": "Inserisci un codice fiscale valido",
27
+ "vat-number-invalid": "Inserisci una partita iva valida",
28
+ "cap-invalid": "Inserisci un CAP valido",
29
+ "regex-invalid": "Inserisci un espressione REGEX valida",
30
+ "pattern-invalid": "Il campo deve avere il pattern {{pattern}}",
31
+ "password-no-match": "Le password devono essere identiche",
32
+ "password-min-length": "La password deve contenere almeno {{minLength}} caratteri!",
33
+ "password-number": "La password deve avere almeno 1 numero!",
34
+ "password-capital-case": "La password deve contenere almeno 1 carattere maiuscolo!",
35
+ "password-small-case": "La password deve contenere almeno 1 carattere minuscolo!",
36
+ "password-special-character": "La password deve contenere almeno 1 carattere speciale!"
37
+ },
38
+ "core": {
39
+ "close-modal": "Chiudi finestra modale",
40
+ "close-notification": "Chiudi notifica: {{title}}",
41
+ "close-alert": "Chiudi avviso",
42
+ "page": "Pagina",
43
+ "previous-page": "Pagina precedente",
44
+ "next-page": "Pagina successiva",
45
+ "progress": "Progresso",
46
+ "loading": "Caricamento",
47
+ "active": "Attivo",
48
+ "remove": "Elimina",
49
+ "confirm": "Conferma",
50
+ "confirmed": "Confermato",
51
+ "step": "Step",
52
+ "step-of": "Step {{current}} di {{available}}",
53
+ "back": "Indietro",
54
+ "forward": "Avanti",
55
+ "rate-star": "Valuta {{current}} stelle su {{total}}",
56
+ "rating-star": "Valutazione {{current}} stelle su {{total}}"
57
+ },
58
+ "form": {
59
+ "increase-value": "Aumenta valore",
60
+ "decrease-value": "Diminuisci valore",
61
+ "upload": "Upload",
62
+ "upload-drag-file": "Trascina il file per caricarlo",
63
+ "upload-loading": "Caricamento in corso...",
64
+ "upload-complete": "Caricamento completato",
65
+ "upload-or": "oppure",
66
+ "upload-select-device": "selezionalo dal dispositivo",
67
+ "uploaded-file": "File caricato: {{name}}",
68
+ "delete-file": "Elimina file {{name}}"
69
+ },
70
+ "navigation": {
71
+ "home": "Home",
72
+ "go-back": "Torna indietro",
73
+ "upper-level": "Livello superiore",
74
+ "secondary-navigation": "Navigazione secondaria",
75
+ "login": "Accedi",
76
+ "full-login": "Accedi all'area personale",
77
+ "search": "Cerca",
78
+ "website-search": "Cerca nel sito",
79
+ "navigation-path": "Percorso di navigazione"
80
+ },
81
+ "utils": {
82
+ "selected": "Selezionata",
83
+ "language-selection": "Selezione lingua: {{lang}}",
84
+ "select-language": "Seleziona una lingua",
85
+ "404": {
86
+ "title": "Risorsa non trovata",
87
+ "description": "Oops! La risorsa che cerchi non è stata trovata, torna alla homepage e utilizza il menu per continuare la navigazione.",
88
+ "go-back": "Torna indietro",
89
+ "go-to-homepage": "Torna alla homepage"
90
+ }
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,174 @@
1
+ import { FormControl } from '@angular/forms';
2
+ import { Component, Input, Optional, Self } from '@angular/core';
3
+ import { AbstractComponent } from './abstract.component';
4
+ import { isFalseBooleanInput, isTrueBooleanInput } from '../utils/boolean-input';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "@ngx-translate/core";
8
+ export class AbstractFormComponent extends AbstractComponent {
9
+ constructor(_ngControl, _translateService, _renderer, _elementRef, _changeDetectorRef) {
10
+ super(_renderer, _elementRef, _changeDetectorRef);
11
+ this._ngControl = _ngControl;
12
+ this._translateService = _translateService;
13
+ this._renderer = _renderer;
14
+ this._elementRef = _elementRef;
15
+ this._changeDetectorRef = _changeDetectorRef;
16
+ /**
17
+ * Validation color display mode (validation triggered if field is touched or not pristine)
18
+ * - <b>true</b>: Always show the validation color
19
+ * - <b>false</b>: Never show validation color
20
+ * - <b>only-valid</b>: Show only valid validation color
21
+ * - <b>only-invalid</b>: Show only invalid validation color
22
+ * @default <b>only-invalid</b>: Show only invalid validation color
23
+ */
24
+ this.validationMode = 'only-invalid';
25
+ this.onChange = (_) => {
26
+ };
27
+ this.onTouched = () => {
28
+ };
29
+ this.control = new FormControl();
30
+ this._ngControl && (this._ngControl.valueAccessor = this);
31
+ }
32
+ /**
33
+ * Set the disabled state
34
+ */
35
+ set disabled(isDisabled) {
36
+ this.setDisabledState(isTrueBooleanInput(isDisabled));
37
+ }
38
+ /**
39
+ * Check if field is invalid (Validation failed)
40
+ */
41
+ get isInvalid() {
42
+ if (this.validationMode === 'only-valid' || (this.validationMode !== 'only-invalid' && isFalseBooleanInput(this.validationMode))) {
43
+ return undefined;
44
+ }
45
+ if (this._ngControl) {
46
+ return this._ngControl.invalid === true && (!this._ngControl.pristine || this._ngControl.touched === true);
47
+ }
48
+ return this.control.invalid && (!this.control.pristine || this.control.touched);
49
+ }
50
+ /**
51
+ * Check if field is valid (Validation successful)
52
+ */
53
+ get isValid() {
54
+ if (this.validationMode === 'only-invalid' || (this.validationMode !== 'only-valid' && isFalseBooleanInput(this.validationMode))) {
55
+ return undefined;
56
+ }
57
+ if (this._ngControl) {
58
+ return this._ngControl.valid === true && (!this._ngControl.pristine || this._ngControl.touched === true);
59
+ }
60
+ return this.control.valid && (!this.control.pristine || this.control.touched);
61
+ }
62
+ /**
63
+ * Return the invalid message string from TranslateService
64
+ */
65
+ get invalidMessage() {
66
+ if (this.control.hasError('required')) {
67
+ return this._translateService.get('it.errors.required-field');
68
+ }
69
+ return this._translateService.get('it.errors.invalid-field');
70
+ }
71
+ ngOnInit() {
72
+ if (this._ngControl) {
73
+ this.control.setValidators(this._ngControl.control.validator);
74
+ }
75
+ }
76
+ registerOnChange(fn) {
77
+ this.control.valueChanges.subscribe(fn);
78
+ this.onChange = fn;
79
+ }
80
+ registerOnTouched(fn) {
81
+ this.onTouched = fn;
82
+ }
83
+ setDisabledState(isDisabled) {
84
+ if (isDisabled) {
85
+ return this.control.disable();
86
+ }
87
+ this.control.enable();
88
+ }
89
+ writeValue(value) {
90
+ this.control.setValue(value, { emitEvent: false });
91
+ }
92
+ /**
93
+ * Mark the control as touched
94
+ */
95
+ markAsTouched() {
96
+ if (!this.control.touched) {
97
+ this.onTouched();
98
+ }
99
+ }
100
+ /**
101
+ * Fired to check if form control is touched
102
+ */
103
+ ngDoCheck() {
104
+ if (this.control.touched) {
105
+ return;
106
+ }
107
+ if (this._ngControl?.control?.touched) {
108
+ this.control.markAsTouched();
109
+ }
110
+ }
111
+ /**
112
+ * Add the validators in control and parent control
113
+ * @param validators the validators
114
+ * @protected
115
+ */
116
+ addValidators(validators) {
117
+ if (!Array.isArray(validators)) {
118
+ validators = [validators];
119
+ }
120
+ validators.forEach(validator => {
121
+ if (!this.control.hasValidator(validator)) {
122
+ this.control.addValidators(validator);
123
+ }
124
+ if (this._ngControl?.control && !this._ngControl.control.hasValidator(validator)) {
125
+ this._ngControl.control.addValidators(validator);
126
+ }
127
+ });
128
+ }
129
+ /**
130
+ * Reports whether the control with the given path has the error specified. <br/>
131
+ * If the control is not present, false is returned.
132
+ * @param errorCode The code of the error to check
133
+ * @param path A list of control names that designates how to move from the current control
134
+ * to the control that should be queried for errors.
135
+ * @returns whether the given error is present in the control at the given path.
136
+ */
137
+ hasError(errorCode, path) {
138
+ if (this._ngControl) {
139
+ return this._ngControl.hasError(errorCode, path);
140
+ }
141
+ return this.control.hasError(errorCode, path);
142
+ }
143
+ /**
144
+ * Reports error data for the control with the given path.
145
+ * @param errorCode The code of the error to check
146
+ * @param path A list of control names that designates how to move from the current control
147
+ * to the control that should be queried for errors.
148
+ * @returns error data for that particular error. If the control or error is not present,
149
+ * null is returned.
150
+ */
151
+ getError(errorCode, path) {
152
+ if (this._ngControl) {
153
+ return this._ngControl.getError(errorCode, path);
154
+ }
155
+ return this.control.getError(errorCode, path);
156
+ }
157
+ }
158
+ AbstractFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AbstractFormComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i2.TranslateService }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
159
+ AbstractFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: AbstractFormComponent, selector: "ng-component", inputs: { label: "label", validationMode: "validationMode", disabled: "disabled" }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AbstractFormComponent, decorators: [{
161
+ type: Component,
162
+ args: [{ template: '' }]
163
+ }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
164
+ type: Self
165
+ }, {
166
+ type: Optional
167
+ }] }, { type: i2.TranslateService }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { label: [{
168
+ type: Input
169
+ }], validationMode: [{
170
+ type: Input
171
+ }], disabled: [{
172
+ type: Input
173
+ }] } });
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZm9ybS1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9hYnN0cmFjdHMvYWJzdHJhY3QtZm9ybS1jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixXQUFXLEVBQTBCLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0YsT0FBTyxFQUVMLFNBQVMsRUFHVCxLQUFLLEVBRUwsUUFBUSxFQUVSLElBQUksRUFDTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQWdCLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFLL0YsTUFBTSxPQUFPLHFCQUErQixTQUFRLGlCQUFpQjtJQTZCbkUsWUFDeUMsVUFBcUIsRUFDekMsaUJBQW1DLEVBQzFCLFNBQW9CLEVBQ3BCLFdBQXVCLEVBQ3ZCLGtCQUFxQztRQUVqRSxLQUFLLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBTlgsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUN6QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQzFCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQTNCbkU7Ozs7Ozs7V0FPRztRQUNNLG1CQUFjLEdBQWlELGNBQWMsQ0FBQztRQXVFdkYsYUFBUSxHQUFHLENBQUMsQ0FBSSxFQUFFLEVBQUU7UUFDcEIsQ0FBQyxDQUFDO1FBRUYsY0FBUyxHQUFHLEdBQUcsRUFBRTtRQUNqQixDQUFDLENBQUM7UUFyREEsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2pD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QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFFBQVEsQ0FBQyxTQUFpQixFQUFFLElBQXNDO1FBQ3ZFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNsRDtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksUUFBUSxDQUFDLFNBQWlCLEVBQUUsSUFBc0M7UUFDdkUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7a0hBdExVLHFCQUFxQjtzR0FBckIscUJBQXFCLCtKQURYLEVBQUU7MkZBQ1oscUJBQXFCO2tCQURqQyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTs7MEJBK0J0QixJQUFJOzswQkFBSSxRQUFROzRKQXpCVixLQUFLO3NCQUFiLEtBQUs7Z0JBVUcsY0FBYztzQkFBdEIsS0FBSztnQkFLTyxRQUFRO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOZ0NvbnRyb2wsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgU2VsZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29tcG9uZW50IH0gZnJvbSAnLi9hYnN0cmFjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBpc0ZhbHNlQm9vbGVhbklucHV0LCBpc1RydWVCb29sZWFuSW5wdXQgfSBmcm9tICcuLi91dGlscy9ib29sZWFuLWlucHV0JztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7IHRlbXBsYXRlOiAnJyB9KVxuZXhwb3J0IGNsYXNzIEFic3RyYWN0Rm9ybUNvbXBvbmVudDxUID0gYW55PiBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRG9DaGVjayB7XG5cbiAgLyoqXG4gICAqIFRoZSBsYWJlbCBvZiBmb3JtIGNvbnRyb2xcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIGNvbG9yIGRpc3BsYXkgbW9kZSAodmFsaWRhdGlvbiB0cmlnZ2VyZWQgaWYgZmllbGQgaXMgdG91Y2hlZCBvciBub3QgcHJpc3RpbmUpXG4gICAqIC0gPGI+dHJ1ZTwvYj46IEFsd2F5cyBzaG93IHRoZSB2YWxpZGF0aW9uIGNvbG9yXG4gICAqIC0gPGI+ZmFsc2U8L2I+OiBOZXZlciBzaG93IHZhbGlkYXRpb24gY29sb3JcbiAgICogLSA8Yj5vbmx5LXZhbGlkPC9iPjogU2hvdyBvbmx5IHZhbGlkIHZhbGlkYXRpb24gY29sb3JcbiAgICogLSA8Yj5vbmx5LWludmFsaWQ8L2I+OiBTaG93IG9ubHkgaW52YWxpZCB2YWxpZGF0aW9uIGNvbG9yXG4gICAqIEBkZWZhdWx0IDxiPm9ubHktaW52YWxpZDwvYj46IFNob3cgb25seSBpbnZhbGlkIHZhbGlkYXRpb24gY29sb3JcbiAgICovXG4gIEBJbnB1dCgpIHZhbGlkYXRpb25Nb2RlOiBCb29sZWFuSW5wdXQgfCAnb25seS12YWxpZCcgfCAnb25seS1pbnZhbGlkJyA9ICdvbmx5LWludmFsaWQnO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRpc2FibGVkIHN0YXRlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZGlzYWJsZWQoaXNEaXNhYmxlZDogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5zZXREaXNhYmxlZFN0YXRlKGlzVHJ1ZUJvb2xlYW5JbnB1dChpc0Rpc2FibGVkKSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgZm9ybSBjb250cm9sXG4gICAqL1xuICBjb250cm9sOiBGb3JtQ29udHJvbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAU2VsZigpIEBPcHRpb25hbCgpIHByb3RlY3RlZCByZWFkb25seSBfbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoX3JlbmRlcmVyLCBfZWxlbWVudFJlZiwgX2NoYW5nZURldGVjdG9yUmVmKTtcbiAgICB0aGlzLmNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgICB0aGlzLl9uZ0NvbnRyb2wgJiYgKHRoaXMuX25nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZmllbGQgaXMgaW52YWxpZCAoVmFsaWRhdGlvbiBmYWlsZWQpXG4gICAqL1xuICBnZXQgaXNJbnZhbGlkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnZhbGlkYXRpb25Nb2RlID09PSAnb25seS12YWxpZCcgfHwgKHRoaXMudmFsaWRhdGlvbk1vZGUgIT09ICdvbmx5LWludmFsaWQnICYmIGlzRmFsc2VCb29sZWFuSW5wdXQodGhpcy52YWxpZGF0aW9uTW9kZSkpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uZ0NvbnRyb2wuaW52YWxpZCA9PT0gdHJ1ZSAmJiAoIXRoaXMuX25nQ29udHJvbC5wcmlzdGluZSB8fCB0aGlzLl9uZ0NvbnRyb2wudG91Y2hlZCA9PT0gdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRyb2wuaW52YWxpZCAmJiAoIXRoaXMuY29udHJvbC5wcmlzdGluZSB8fCB0aGlzLmNvbnRyb2wudG91Y2hlZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZmllbGQgaXMgdmFsaWQgKFZhbGlkYXRpb24gc3VjY2Vzc2Z1bClcbiAgICovXG4gIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnZhbGlkYXRpb25Nb2RlID09PSAnb25seS1pbnZhbGlkJyB8fCAodGhpcy52YWxpZGF0aW9uTW9kZSAhPT0gJ29ubHktdmFsaWQnICYmIGlzRmFsc2VCb29sZWFuSW5wdXQodGhpcy52YWxpZGF0aW9uTW9kZSkpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uZ0NvbnRyb2wudmFsaWQgPT09IHRydWUgJiYgKCF0aGlzLl9uZ0NvbnRyb2wucHJpc3RpbmUgfHwgdGhpcy5fbmdDb250cm9sLnRvdWNoZWQgPT09IHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250cm9sLnZhbGlkICYmICghdGhpcy5jb250cm9sLnByaXN0aW5lIHx8IHRoaXMuY29udHJvbC50b3VjaGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGludmFsaWQgbWVzc2FnZSBzdHJpbmcgZnJvbSBUcmFuc2xhdGVTZXJ2aWNlXG4gICAqL1xuICBnZXQgaW52YWxpZE1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5jb250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5yZXF1aXJlZC1maWVsZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLmludmFsaWQtZmllbGQnKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWxpZGF0b3JzKCh0aGlzLl9uZ0NvbnRyb2wuY29udHJvbCBhcyBGb3JtQ29udHJvbCkudmFsaWRhdG9yKTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZSA9IChfOiBUKSA9PiB7XG4gIH07XG5cbiAgb25Ub3VjaGVkID0gKCkgPT4ge1xuICB9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGZuKTtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250cm9sLmRpc2FibGUoKTtcbiAgICB9XG4gICAgdGhpcy5jb250cm9sLmVuYWJsZSgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogVCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhlIGNvbnRyb2wgYXMgdG91Y2hlZFxuICAgKi9cbiAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbC50b3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlZCB0byBjaGVjayBpZiBmb3JtIGNvbnRyb2wgaXMgdG91Y2hlZFxuICAgKi9cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmICh0aGlzLmNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbmdDb250cm9sPy5jb250cm9sPy50b3VjaGVkKSB7XG4gICAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIHZhbGlkYXRvcnMgaW4gY29udHJvbCBhbmQgcGFyZW50IGNvbnRyb2xcbiAgICogQHBhcmFtIHZhbGlkYXRvcnMgdGhlIHZhbGlkYXRvcnNcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFkZFZhbGlkYXRvcnModmFsaWRhdG9yczogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdKTogdm9pZCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbGlkYXRvcnMpKSB7XG4gICAgICB2YWxpZGF0b3JzID0gW3ZhbGlkYXRvcnNdO1xuICAgIH1cblxuICAgIHZhbGlkYXRvcnMuZm9yRWFjaCh2YWxpZGF0b3IgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNvbnRyb2wuaGFzVmFsaWRhdG9yKHZhbGlkYXRvcikpIHtcbiAgICAgICAgdGhpcy5jb250cm9sLmFkZFZhbGlkYXRvcnModmFsaWRhdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX25nQ29udHJvbD8uY29udHJvbCAmJiAhdGhpcy5fbmdDb250cm9sLmNvbnRyb2wuaGFzVmFsaWRhdG9yKHZhbGlkYXRvcikpIHtcbiAgICAgICAgdGhpcy5fbmdDb250cm9sLmNvbnRyb2wuYWRkVmFsaWRhdG9ycyh2YWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBwYXRoIGhhcyB0aGUgZXJyb3Igc3BlY2lmaWVkLiA8YnIvPlxuICAgKiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBlcnJvckNvZGUgVGhlIGNvZGUgb2YgdGhlIGVycm9yIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBwYXRoIEEgbGlzdCBvZiBjb250cm9sIG5hbWVzIHRoYXQgZGVzaWduYXRlcyBob3cgdG8gbW92ZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRyb2xcbiAgICogdG8gdGhlIGNvbnRyb2wgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBmb3IgZXJyb3JzLlxuICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlcnJvciBpcyBwcmVzZW50IGluIHRoZSBjb250cm9sIGF0IHRoZSBnaXZlbiBwYXRoLlxuICAgKi9cbiAgcHVibGljIGhhc0Vycm9yKGVycm9yQ29kZTogc3RyaW5nLCBwYXRoPzogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uZ0NvbnRyb2wuaGFzRXJyb3IoZXJyb3JDb2RlLCBwYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbC5oYXNFcnJvcihlcnJvckNvZGUsIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgZXJyb3IgZGF0YSBmb3IgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgY29kZSBvZiB0aGUgZXJyb3IgdG8gY2hlY2tcbiAgICogQHBhcmFtIHBhdGggQSBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgdGhhdCBkZXNpZ25hdGVzIGhvdyB0byBtb3ZlIGZyb20gdGhlIGN1cnJlbnQgY29udHJvbFxuICAgKiB0byB0aGUgY29udHJvbCB0aGF0IHNob3VsZCBiZSBxdWVyaWVkIGZvciBlcnJvcnMuXG4gICAqIEByZXR1cm5zIGVycm9yIGRhdGEgZm9yIHRoYXQgcGFydGljdWxhciBlcnJvci4gSWYgdGhlIGNvbnRyb2wgb3IgZXJyb3IgaXMgbm90IHByZXNlbnQsXG4gICAqIG51bGwgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0RXJyb3IoZXJyb3JDb2RlOiBzdHJpbmcsIHBhdGg/OiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgc3RyaW5nKTogYW55IHtcbiAgICBpZiAodGhpcy5fbmdDb250cm9sKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbmdDb250cm9sLmdldEVycm9yKGVycm9yQ29kZSwgcGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRyb2wuZ2V0RXJyb3IoZXJyb3JDb2RlLCBwYXRoKTtcbiAgfVxufVxuIl19