design-angular-kit 1.0.0-9 → 1.0.0-prerelease.1

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 (255) hide show
  1. package/README.md +77 -7
  2. package/assets/i18n/en.json +81 -12
  3. package/assets/i18n/it.json +80 -11
  4. package/esm2022/lib/abstracts/abstract-form.component.mjs +187 -0
  5. package/esm2022/lib/abstracts/abstract.component.mjs +45 -0
  6. package/esm2022/lib/components/components.module.mjs +218 -0
  7. package/esm2022/lib/components/core/accordion/accordion.component.mjs +38 -0
  8. package/esm2022/lib/components/core/alert/alert.component.mjs +72 -0
  9. package/esm2022/lib/components/core/avatar/avatar-dropdown/avatar-dropdown.component.mjs +43 -0
  10. package/esm2022/lib/components/core/avatar/avatar-group/avatar-group.component.mjs +38 -0
  11. package/esm2022/lib/components/core/avatar/avatar.directive.mjs +78 -0
  12. package/esm2022/lib/components/core/badge/badge.directive.mjs +39 -0
  13. package/esm2022/lib/components/core/button/button.directive.mjs +86 -0
  14. package/esm2022/lib/components/core/callout/callout.component.mjs +57 -0
  15. package/esm2022/lib/components/core/card/card.component.mjs +59 -0
  16. package/esm2022/lib/components/core/carousel/carousel/carousel.component.mjs +81 -0
  17. package/esm2022/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +19 -0
  18. package/esm2022/lib/components/core/carousel/carousel.module.mjs +23 -0
  19. package/esm2022/lib/components/core/chip/chip.component.mjs +96 -0
  20. package/esm2022/lib/components/core/collapse/collapse.component.mjs +104 -0
  21. package/esm2022/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +24 -0
  22. package/esm2022/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +11 -0
  23. package/esm2022/lib/components/core/dimmer/dimmer.component.mjs +59 -0
  24. package/esm2022/lib/components/core/dimmer/dimmer.module.mjs +27 -0
  25. package/esm2022/lib/components/core/dropdown/dropdown/dropdown.component.mjs +141 -0
  26. package/esm2022/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +62 -0
  27. package/esm2022/lib/components/core/dropdown/dropdown.module.mjs +18 -0
  28. package/esm2022/lib/components/core/forward/forward.directive.mjs +53 -0
  29. package/esm2022/lib/components/core/link/link.component.mjs +42 -0
  30. package/esm2022/lib/components/core/list/list/list.component.mjs +22 -0
  31. package/esm2022/lib/components/core/list/list-item/list-item.component.mjs +51 -0
  32. package/esm2022/lib/components/core/list/list.module.mjs +23 -0
  33. package/esm2022/lib/components/core/modal/modal.component.mjs +195 -0
  34. package/esm2022/lib/components/core/notifications/notifications.component.mjs +112 -0
  35. package/esm2022/lib/components/core/pagination/pagination.component.mjs +127 -0
  36. package/esm2022/lib/components/core/popover/popover.directive.mjs +176 -0
  37. package/esm2022/lib/components/core/progress-bar/progress-bar.component.mjs +34 -0
  38. package/esm2022/lib/components/core/progress-button/progress-button.component.mjs +26 -0
  39. package/esm2022/lib/components/core/spinner/spinner.component.mjs +31 -0
  40. package/esm2022/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +112 -0
  41. package/esm2022/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +19 -0
  42. package/esm2022/lib/components/core/steppers/steppers.module.mjs +23 -0
  43. package/esm2022/lib/components/core/tab/tab-container/tab-container.component.mjs +60 -0
  44. package/esm2022/lib/components/core/tab/tab-item/tab-item.component.mjs +39 -0
  45. package/esm2022/lib/components/core/tab/tab.module.mjs +23 -0
  46. package/esm2022/lib/components/core/table/sort/sort-header/sort-header.component.mjs +136 -0
  47. package/esm2022/lib/components/core/table/sort/sort.directive.mjs +123 -0
  48. package/esm2022/lib/components/core/table/table.component.mjs +45 -0
  49. package/esm2022/lib/components/core/tooltip/tooltip.directive.mjs +143 -0
  50. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +95 -0
  51. package/esm2022/lib/components/form/checkbox/checkbox.component.mjs +48 -0
  52. package/esm2022/lib/components/form/form.module.mjs +59 -0
  53. package/esm2022/lib/components/form/input/input.component.mjs +187 -0
  54. package/esm2022/lib/components/form/password-input/password-input.component.mjs +149 -0
  55. package/esm2022/lib/components/form/radio-button/radio-button.component.mjs +58 -0
  56. package/esm2022/lib/components/form/range/range.component.mjs +64 -0
  57. package/esm2022/lib/components/form/rating/rating.component.mjs +51 -0
  58. package/esm2022/lib/components/form/select/select.component.mjs +70 -0
  59. package/esm2022/lib/components/form/textarea/textarea.component.mjs +55 -0
  60. package/esm2022/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +140 -0
  61. package/esm2022/lib/components/form/upload-file-list/upload-file-list.component.mjs +107 -0
  62. package/esm2022/lib/components/navigation/back-button/back-button.component.mjs +67 -0
  63. package/esm2022/lib/components/navigation/back-to-top/back-to-top.component.mjs +58 -0
  64. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +55 -0
  65. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +21 -0
  66. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumbs.module.mjs +18 -0
  67. package/esm2022/lib/components/navigation/header/header.component.mjs +73 -0
  68. package/esm2022/lib/components/navigation/navbar/navbar/navbar.component.mjs +41 -0
  69. package/esm2022/lib/components/navigation/navbar/navbar-item/navbar-item.component.mjs +13 -0
  70. package/esm2022/lib/components/navigation/navbar/navbar.module.mjs +18 -0
  71. package/esm2022/lib/components/utils/error-page/error-page.component.mjs +75 -0
  72. package/esm2022/lib/components/utils/icon/icon.component.mjs +56 -0
  73. package/esm2022/lib/components/utils/language-switcher/language-switcher.component.mjs +47 -0
  74. package/esm2022/lib/design-angular-kit-config.mjs +15 -0
  75. package/esm2022/lib/design-angular-kit.module.mjs +68 -0
  76. package/esm2022/lib/enums/colors.enums.mjs +12 -0
  77. package/esm2022/lib/enums/sizes.enum.mjs +9 -0
  78. package/esm2022/lib/interfaces/core.mjs +16 -0
  79. package/esm2022/lib/interfaces/design-angular-kit-init.mjs +2 -0
  80. package/esm2022/lib/interfaces/form.mjs +2 -0
  81. package/esm2022/lib/interfaces/icon.mjs +165 -0
  82. package/esm2022/lib/interfaces/sortable-table.mjs +6 -0
  83. package/esm2022/lib/pipes/date-ago.pipe.mjs +56 -0
  84. package/esm2022/lib/pipes/duration.pipe.mjs +110 -0
  85. package/esm2022/lib/pipes/mark-matching-text.pipe.mjs +48 -0
  86. package/esm2022/lib/services/notification/notification.service.mjs +120 -0
  87. package/esm2022/lib/utils/coercion.mjs +18 -0
  88. package/esm2022/lib/utils/date-utils.mjs +160 -0
  89. package/esm2022/lib/utils/file-utils.mjs +73 -0
  90. package/esm2022/lib/utils/regex.mjs +31 -0
  91. package/esm2022/lib/validators/it-validators.mjs +153 -0
  92. package/esm2022/public_api.mjs +98 -0
  93. package/fesm2022/design-angular-kit.mjs +5450 -0
  94. package/fesm2022/design-angular-kit.mjs.map +1 -0
  95. package/lib/abstracts/{abstract-form-component.d.ts → abstract-form.component.d.ts} +12 -14
  96. package/lib/abstracts/abstract.component.d.ts +18 -8
  97. package/lib/components/components.module.d.ts +45 -0
  98. package/lib/components/core/accordion/accordion.component.d.ts +11 -5
  99. package/lib/components/core/alert/alert.component.d.ts +15 -10
  100. package/lib/components/core/avatar/avatar-dropdown/avatar-dropdown.component.d.ts +29 -0
  101. package/lib/components/core/avatar/avatar-group/avatar-group.component.d.ts +13 -0
  102. package/lib/components/core/avatar/avatar.directive.d.ts +33 -0
  103. package/lib/components/core/badge/badge.directive.d.ts +14 -7
  104. package/lib/components/core/button/button.directive.d.ts +25 -15
  105. package/lib/components/core/callout/callout.component.d.ts +18 -20
  106. package/lib/components/core/card/card.component.d.ts +46 -18
  107. package/lib/components/core/carousel/carousel/carousel.component.d.ts +34 -15
  108. package/lib/components/core/carousel/carousel-item/carousel-item.component.d.ts +8 -3
  109. package/lib/components/core/carousel/carousel.module.d.ts +8 -0
  110. package/lib/components/core/chip/chip.component.d.ts +8 -5
  111. package/lib/components/core/collapse/collapse.component.d.ts +22 -15
  112. package/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.d.ts +3 -3
  113. package/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.d.ts +3 -3
  114. package/lib/components/core/dimmer/dimmer.component.d.ts +4 -4
  115. package/lib/components/core/dimmer/dimmer.module.d.ts +9 -0
  116. package/lib/components/core/dropdown/dropdown/dropdown.component.d.ts +24 -17
  117. package/lib/components/core/dropdown/dropdown-item/dropdown-item.component.d.ts +15 -12
  118. package/lib/components/core/dropdown/dropdown.module.d.ts +8 -0
  119. package/lib/components/core/forward/forward.directive.d.ts +3 -3
  120. package/lib/components/core/link/link.component.d.ts +14 -10
  121. package/lib/components/core/list/list/list.component.d.ts +20 -6
  122. package/lib/components/core/list/list-item/list-item.component.d.ts +23 -9
  123. package/lib/components/core/list/list.module.d.ts +8 -0
  124. package/lib/components/core/modal/modal.component.d.ts +89 -13
  125. package/lib/components/core/notifications/notifications.component.d.ts +9 -8
  126. package/lib/components/core/pagination/pagination.component.d.ts +71 -10
  127. package/lib/components/core/popover/popover.directive.d.ts +15 -14
  128. package/lib/components/core/progress-bar/progress-bar.component.d.ts +11 -8
  129. package/lib/components/core/progress-button/progress-button.component.d.ts +5 -6
  130. package/lib/components/core/spinner/spinner.component.d.ts +13 -10
  131. package/lib/components/core/steppers/steppers-container/steppers-container.component.d.ts +55 -27
  132. package/lib/components/core/steppers/steppers-item/steppers-item.component.d.ts +5 -4
  133. package/lib/components/core/steppers/steppers.module.d.ts +8 -0
  134. package/lib/components/core/tab/tab-container/tab-container.component.d.ts +15 -12
  135. package/lib/components/core/tab/tab-item/tab-item.component.d.ts +14 -10
  136. package/lib/components/core/tab/tab.module.d.ts +8 -0
  137. package/lib/components/core/table/sort/sort-header/sort-header.component.d.ts +72 -0
  138. package/lib/components/core/table/sort/sort.directive.d.ts +53 -0
  139. package/lib/components/core/table/table.component.d.ts +26 -20
  140. package/lib/components/core/tooltip/tooltip.directive.d.ts +12 -11
  141. package/lib/components/form/autocomplete/autocomplete.component.d.ts +49 -0
  142. package/lib/components/form/checkbox/checkbox.component.d.ts +23 -12
  143. package/lib/components/form/form.module.d.ts +17 -0
  144. package/lib/components/form/input/input.component.d.ts +42 -43
  145. package/lib/components/form/password-input/password-input.component.d.ts +35 -10
  146. package/lib/components/form/radio-button/radio-button.component.d.ts +20 -11
  147. package/lib/components/form/range/range.component.d.ts +42 -0
  148. package/lib/components/form/rating/rating.component.d.ts +24 -0
  149. package/lib/components/form/select/select.component.d.ts +12 -6
  150. package/lib/components/form/textarea/textarea.component.d.ts +15 -5
  151. package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +5 -5
  152. package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +14 -11
  153. package/lib/components/navigation/back-button/back-button.component.d.ts +8 -8
  154. package/lib/components/navigation/back-to-top/back-to-top.component.d.ts +15 -16
  155. package/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.d.ts +13 -10
  156. package/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +9 -8
  157. package/lib/components/navigation/breadcrumbs/breadcrumbs.module.d.ts +8 -0
  158. package/lib/components/navigation/header/header.component.d.ts +22 -25
  159. package/lib/components/navigation/navbar/navbar/navbar.component.d.ts +16 -0
  160. package/lib/components/navigation/navbar/navbar-item/navbar-item.component.d.ts +5 -0
  161. package/lib/components/navigation/navbar/navbar.module.d.ts +8 -0
  162. package/lib/components/utils/error-page/error-page.component.d.ts +44 -0
  163. package/lib/components/utils/icon/icon.component.d.ts +15 -15
  164. package/lib/components/utils/language-switcher/language-switcher.component.d.ts +9 -5
  165. package/lib/design-angular-kit-config.d.ts +16 -0
  166. package/lib/design-angular-kit.module.d.ts +6 -4
  167. package/lib/enums/colors.enums.d.ts +10 -0
  168. package/lib/enums/sizes.enum.d.ts +7 -0
  169. package/lib/interfaces/core.d.ts +16 -15
  170. package/lib/interfaces/design-angular-kit-init.d.ts +7 -0
  171. package/lib/interfaces/form.d.ts +9 -9
  172. package/lib/interfaces/icon.d.ts +4 -3
  173. package/lib/interfaces/sortable-table.d.ts +33 -0
  174. package/lib/pipes/date-ago.pipe.d.ts +17 -0
  175. package/lib/pipes/duration.pipe.d.ts +35 -0
  176. package/lib/pipes/mark-matching-text.pipe.d.ts +15 -7
  177. package/lib/services/{notifications/notifications.service.d.ts → notification/notification.service.d.ts} +3 -3
  178. package/lib/utils/coercion.d.ts +14 -0
  179. package/lib/utils/date-utils.d.ts +78 -0
  180. package/lib/utils/file-utils.d.ts +1 -1
  181. package/lib/utils/regex.d.ts +5 -0
  182. package/lib/validators/it-validators.d.ts +9 -2
  183. package/package.json +14 -20
  184. package/public_api.d.ts +29 -4
  185. package/esm2020/lib/abstracts/abstract-form-component.mjs +0 -174
  186. package/esm2020/lib/abstracts/abstract.component.mjs +0 -27
  187. package/esm2020/lib/components/core/accordion/accordion.component.mjs +0 -31
  188. package/esm2020/lib/components/core/alert/alert.component.mjs +0 -69
  189. package/esm2020/lib/components/core/badge/badge.directive.mjs +0 -34
  190. package/esm2020/lib/components/core/button/button.directive.mjs +0 -80
  191. package/esm2020/lib/components/core/callout/callout.component.mjs +0 -84
  192. package/esm2020/lib/components/core/card/card.component.mjs +0 -58
  193. package/esm2020/lib/components/core/carousel/carousel/carousel.component.mjs +0 -66
  194. package/esm2020/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +0 -14
  195. package/esm2020/lib/components/core/chip/chip.component.mjs +0 -89
  196. package/esm2020/lib/components/core/collapse/collapse.component.mjs +0 -101
  197. package/esm2020/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +0 -24
  198. package/esm2020/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +0 -11
  199. package/esm2020/lib/components/core/dimmer/dimmer.component.mjs +0 -59
  200. package/esm2020/lib/components/core/dropdown/dropdown/dropdown.component.mjs +0 -130
  201. package/esm2020/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +0 -68
  202. package/esm2020/lib/components/core/forward/forward.directive.mjs +0 -51
  203. package/esm2020/lib/components/core/link/link.component.mjs +0 -40
  204. package/esm2020/lib/components/core/list/list/list.component.mjs +0 -13
  205. package/esm2020/lib/components/core/list/list-item/list-item.component.mjs +0 -36
  206. package/esm2020/lib/components/core/modal/modal.component.mjs +0 -98
  207. package/esm2020/lib/components/core/notifications/notifications.component.mjs +0 -110
  208. package/esm2020/lib/components/core/pagination/pagination.component.mjs +0 -51
  209. package/esm2020/lib/components/core/popover/popover.directive.mjs +0 -179
  210. package/esm2020/lib/components/core/progress-bar/progress-bar.component.mjs +0 -34
  211. package/esm2020/lib/components/core/progress-button/progress-button.component.mjs +0 -27
  212. package/esm2020/lib/components/core/spinner/spinner.component.mjs +0 -35
  213. package/esm2020/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +0 -119
  214. package/esm2020/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +0 -18
  215. package/esm2020/lib/components/core/tab/tab-container/tab-container.component.mjs +0 -59
  216. package/esm2020/lib/components/core/tab/tab-item/tab-item.component.mjs +0 -36
  217. package/esm2020/lib/components/core/table/table.component.mjs +0 -57
  218. package/esm2020/lib/components/core/tooltip/tooltip.directive.mjs +0 -143
  219. package/esm2020/lib/components/form/checkbox/checkbox.component.mjs +0 -40
  220. package/esm2020/lib/components/form/input/input.component.mjs +0 -222
  221. package/esm2020/lib/components/form/password-input/password-input.component.mjs +0 -112
  222. package/esm2020/lib/components/form/radio-button/radio-button.component.mjs +0 -53
  223. package/esm2020/lib/components/form/select/select.component.mjs +0 -62
  224. package/esm2020/lib/components/form/textarea/textarea.component.mjs +0 -46
  225. package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +0 -137
  226. package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +0 -104
  227. package/esm2020/lib/components/navigation/back-button/back-button.component.mjs +0 -69
  228. package/esm2020/lib/components/navigation/back-to-top/back-to-top.component.mjs +0 -74
  229. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +0 -45
  230. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +0 -23
  231. package/esm2020/lib/components/navigation/header/header.component.mjs +0 -63
  232. package/esm2020/lib/components/utils/icon/icon.component.mjs +0 -54
  233. package/esm2020/lib/components/utils/language-switcher/language-switcher.component.mjs +0 -39
  234. package/esm2020/lib/components/utils/not-found-page/not-found-page.component.mjs +0 -13
  235. package/esm2020/lib/design-angular-kit.module.mjs +0 -56
  236. package/esm2020/lib/interfaces/core.mjs +0 -16
  237. package/esm2020/lib/interfaces/form.mjs +0 -2
  238. package/esm2020/lib/interfaces/icon.mjs +0 -2
  239. package/esm2020/lib/modules/components.module.mjs +0 -257
  240. package/esm2020/lib/pipes/mark-matching-text.pipe.mjs +0 -36
  241. package/esm2020/lib/services/notifications/notifications.service.mjs +0 -120
  242. package/esm2020/lib/utils/boolean-input.mjs +0 -15
  243. package/esm2020/lib/utils/file-utils.mjs +0 -73
  244. package/esm2020/lib/utils/regex.mjs +0 -26
  245. package/esm2020/lib/validators/it-validators.mjs +0 -134
  246. package/esm2020/public_api.mjs +0 -70
  247. package/fesm2015/design-angular-kit.mjs +0 -3850
  248. package/fesm2015/design-angular-kit.mjs.map +0 -1
  249. package/fesm2020/design-angular-kit.mjs +0 -3797
  250. package/fesm2020/design-angular-kit.mjs.map +0 -1
  251. package/lib/components/utils/not-found-page/not-found-page.component.d.ts +0 -5
  252. package/lib/modules/components.module.d.ts +0 -61
  253. package/lib/utils/boolean-input.d.ts +0 -11
  254. /package/{esm2020 → esm2022}/design-angular-kit.mjs +0 -0
  255. /package/{esm2020 → esm2022}/lib/interfaces/utils.mjs +0 -0
@@ -0,0 +1,64 @@
1
+ import { ChangeDetectionStrategy, Component, Input, ViewChild } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ItAbstractFormComponent } from '../../../abstracts/abstract-form.component';
4
+ import { ReactiveFormsModule } from '@angular/forms';
5
+ import { distinctUntilChanged, startWith } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/forms";
9
+ export class ItRangeComponent extends ItAbstractFormComponent {
10
+ ngOnInit() {
11
+ super.ngOnInit();
12
+ this.subscription = this.control.valueChanges.pipe(distinctUntilChanged(), startWith(undefined)).subscribe(() => this.updateSliderColor());
13
+ }
14
+ ngOnChanges(changes) {
15
+ if (changes['leftColor']) {
16
+ this.slider.nativeElement.style.setProperty('--range-left-color', this.leftColor ?? null);
17
+ }
18
+ if (changes['rightColor']) {
19
+ this.slider.nativeElement.style.setProperty('--range-right-color', this.rightColor ?? null);
20
+ }
21
+ }
22
+ ngOnDestroy() {
23
+ this.subscription?.unsubscribe();
24
+ }
25
+ writeValue(value) {
26
+ super.writeValue(value);
27
+ this.updateSliderColor();
28
+ }
29
+ /**
30
+ * Update the percentage of slider color
31
+ * @private
32
+ */
33
+ updateSliderColor() {
34
+ if (!this.leftColor || !this.rightColor) {
35
+ return;
36
+ }
37
+ const max = Number(this.slider.nativeElement.max) || 100;
38
+ const min = Number(this.slider.nativeElement.min) || 0;
39
+ // Calculate visible width
40
+ const diff = max - min;
41
+ const val = (((this.control.value ?? (diff / 2)) - min) * 100) / diff;
42
+ this.slider.nativeElement.style.setProperty('--range-percentage', `${val}%`);
43
+ }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
45
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: ItRangeComponent, isStandalone: true, selector: "it-range", inputs: { max: "max", min: "min", step: "step", leftColor: "leftColor", rightColor: "rightColor" }, viewQueries: [{ propertyName: "slider", first: true, predicate: ["slider"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex justify-content-between align-items-center\">\n <label *ngIf=\"label\" [for]=\"id\" class=\"form-label\">{{label}}</label>\n <ng-content></ng-content>\n</div>\n\n<input #slider\n [id]=\"id\"\n type=\"range\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n class=\"form-range\"\n [class.double-color]=\"!!leftColor && !!rightColor\"\n [formControl]=\"control\">\n", styles: [".form-range.double-color::-webkit-slider-runnable-track{background:linear-gradient(to right,var(--range-left-color) var(--range-percentage),var(--range-right-color) var(--range-percentage))}.form-range.double-color::-moz-range-track{background:linear-gradient(to right,var(--range-left-color) var(--range-percentage),var(--range-right-color) var(--range-percentage))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
46
+ }
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItRangeComponent, decorators: [{
48
+ type: Component,
49
+ args: [{ selector: 'it-range', standalone: true, imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"d-flex justify-content-between align-items-center\">\n <label *ngIf=\"label\" [for]=\"id\" class=\"form-label\">{{label}}</label>\n <ng-content></ng-content>\n</div>\n\n<input #slider\n [id]=\"id\"\n type=\"range\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n class=\"form-range\"\n [class.double-color]=\"!!leftColor && !!rightColor\"\n [formControl]=\"control\">\n", styles: [".form-range.double-color::-webkit-slider-runnable-track{background:linear-gradient(to right,var(--range-left-color) var(--range-percentage),var(--range-right-color) var(--range-percentage))}.form-range.double-color::-moz-range-track{background:linear-gradient(to right,var(--range-left-color) var(--range-percentage),var(--range-right-color) var(--range-percentage))}\n"] }]
50
+ }], propDecorators: { max: [{
51
+ type: Input
52
+ }], min: [{
53
+ type: Input
54
+ }], step: [{
55
+ type: Input
56
+ }], leftColor: [{
57
+ type: Input
58
+ }], rightColor: [{
59
+ type: Input
60
+ }], slider: [{
61
+ type: ViewChild,
62
+ args: ['slider', { static: true }]
63
+ }] } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3JhbmdlL3JhbmdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9yYW5nZS9yYW5nZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxLQUFLLEVBS0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFnQixNQUFNLE1BQU0sQ0FBQzs7OztBQVVyRSxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsdUJBQWtEO0lBbUM3RSxRQUFRO1FBQ2YsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNoRCxvQkFBb0IsRUFBRSxFQUN0QixTQUFTLENBQUMsU0FBUyxDQUFDLENBQ3JCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVRLFdBQVcsQ0FBQyxPQUFzQjtRQUN6QyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUM7U0FDM0Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUM7U0FDN0Y7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVRLFVBQVUsQ0FBQyxLQUFnQztRQUNsRCxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3ZDLE9BQU87U0FDUjtRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDekQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2RCwwQkFBMEI7UUFDMUIsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMvRSxDQUFDOzhHQTdFVSxnQkFBZ0I7a0dBQWhCLGdCQUFnQixvVUN4QjdCLHNiQWNBLDBhREtZLFlBQVksa0lBQUUsbUJBQW1COzsyRkFLaEMsZ0JBQWdCO2tCQVI1QixTQUFTOytCQUNFLFVBQVUsY0FDUixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsbUJBRzNCLHVCQUF1QixDQUFDLE1BQU07OEJBT3RDLEdBQUc7c0JBQVgsS0FBSztnQkFLRyxHQUFHO3NCQUFYLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQU9HLFNBQVM7c0JBQWpCLEtBQUs7Z0JBT0csVUFBVTtzQkFBbEIsS0FBSztnQkFFaUMsTUFBTTtzQkFBNUMsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJdEFic3RyYWN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Fic3RyYWN0cy9hYnN0cmFjdC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN0YXJ0V2l0aCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2l0LXJhbmdlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yYW5nZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JhbmdlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEl0UmFuZ2VDb21wb25lbnQgZXh0ZW5kcyBJdEFic3RyYWN0Rm9ybUNvbXBvbmVudDxudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4IHZhbHVlXG4gICAqL1xuICBASW5wdXQoKSBtYXg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW4gdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpIG1pbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHN0ZXAgdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpIHN0ZXA/OiBudW1iZXIgfCAnYW55JztcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG9uIGxlZnQgb2YgdGh1bWIgW1JlcXVpcmUgcmlnaHRDb2xvcl1cbiAgICogQGV4YW1wbGUgJyMwZDZlZmQnIG9yICd2YXIoLS1icy1wcmltYXJ5KSdcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkICgndmFyKC0tYnMtZ3JheS0zMDApJylcbiAgICovXG4gIEBJbnB1dCgpIGxlZnRDb2xvcj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG9uIHJpZ2h0IG9mIHRodW1iIFtSZXF1aXJlIGxlZnRDb2xvcl1cbiAgICogQGV4YW1wbGUgJyMwZDZlZmQnIG9yICd2YXIoLS1icy1wcmltYXJ5KSdcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkICgndmFyKC0tYnMtZ3JheS0zMDApJylcbiAgICovXG4gIEBJbnB1dCgpIHJpZ2h0Q29sb3I/OiBzdHJpbmc7XG5cbiAgQFZpZXdDaGlsZCgnc2xpZGVyJywgeyBzdGF0aWM6IHRydWUgfSkgc2xpZGVyITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN0YXJ0V2l0aCh1bmRlZmluZWQpXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVTbGlkZXJDb2xvcigpKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snbGVmdENvbG9yJ10pIHtcbiAgICAgIHRoaXMuc2xpZGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tcmFuZ2UtbGVmdC1jb2xvcicsIHRoaXMubGVmdENvbG9yID8/IG51bGwpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sncmlnaHRDb2xvciddKSB7XG4gICAgICB0aGlzLnNsaWRlci5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLXJhbmdlLXJpZ2h0LWNvbG9yJywgdGhpcy5yaWdodENvbG9yID8/IG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIHRoaXMudXBkYXRlU2xpZGVyQ29sb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHBlcmNlbnRhZ2Ugb2Ygc2xpZGVyIGNvbG9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVNsaWRlckNvbG9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5sZWZ0Q29sb3IgfHwgIXRoaXMucmlnaHRDb2xvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heCA9IE51bWJlcih0aGlzLnNsaWRlci5uYXRpdmVFbGVtZW50Lm1heCkgfHwgMTAwO1xuICAgIGNvbnN0IG1pbiA9IE51bWJlcih0aGlzLnNsaWRlci5uYXRpdmVFbGVtZW50Lm1pbikgfHwgMDtcblxuICAgIC8vIENhbGN1bGF0ZSB2aXNpYmxlIHdpZHRoXG4gICAgY29uc3QgZGlmZiA9IG1heCAtIG1pbjtcbiAgICBjb25zdCB2YWwgPSAoKCh0aGlzLmNvbnRyb2wudmFsdWUgPz8gKGRpZmYgLyAyKSkgLSBtaW4pICogMTAwKSAvIGRpZmY7XG4gICAgdGhpcy5zbGlkZXIubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1yYW5nZS1wZXJjZW50YWdlJywgYCR7dmFsfSVgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cImlkXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3tsYWJlbH19PC9sYWJlbD5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5cbjxpbnB1dCAjc2xpZGVyXG4gICAgICAgW2lkXT1cImlkXCJcbiAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgIFttaW5dPVwibWluXCJcbiAgICAgICBbbWF4XT1cIm1heFwiXG4gICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgY2xhc3M9XCJmb3JtLXJhbmdlXCJcbiAgICAgICBbY2xhc3MuZG91YmxlLWNvbG9yXT1cIiEhbGVmdENvbG9yICYmICEhcmlnaHRDb2xvclwiXG4gICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIj5cbiJdfQ==
@@ -0,0 +1,51 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import { ItAbstractFormComponent } from '../../../abstracts/abstract-form.component';
3
+ import { TranslateModule } from '@ngx-translate/core';
4
+ import { NgForOf } from '@angular/common';
5
+ import { ReactiveFormsModule } from '@angular/forms';
6
+ import { ItIconComponent } from '../../utils/icon/icon.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@ngx-translate/core";
9
+ import * as i2 from "@angular/forms";
10
+ export class ItRatingComponent extends ItAbstractFormComponent {
11
+ constructor() {
12
+ super(...arguments);
13
+ /**
14
+ * Number of stars to show
15
+ * @default 5
16
+ */
17
+ this.starCount = 5;
18
+ this.stars = this.generateStars();
19
+ }
20
+ ngOnChanges(changes) {
21
+ super.ngOnChanges(changes);
22
+ if (changes['starCount'] || !this.stars.length) {
23
+ this.stars = this.generateStars();
24
+ }
25
+ }
26
+ ngOnInit() {
27
+ super.ngOnInit();
28
+ if (!this.control.value && !!this.value) {
29
+ this.writeValue(this.value);
30
+ this.onChange(this.value);
31
+ }
32
+ }
33
+ /**
34
+ * Generate the array of stars
35
+ * @private
36
+ */
37
+ generateStars() {
38
+ return Array.from({ length: this.starCount }, (_, i) => i + 1).reverse();
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItRatingComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
41
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: ItRatingComponent, isStandalone: true, selector: "it-rating", inputs: { value: "value", starCount: "starCount" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<fieldset class=\"rating\"\n [class.rating-label]=\"!!label\"\n [class.rating-read-only]=\"control.disabled\">\n <legend>\n <span>{{label}}</span>\n <span class=\"visually-hidden\">\n {{'it.core.rating-star'|translate : { current: control.value || 0, total: stars.length } }}\n </span>\n </legend>\n\n <ng-container *ngFor=\"let starValue of stars\">\n <input [id]=\"id + '-' + starValue\"\n type=\"radio\"\n [name]=\"id\"\n [value]=\"starValue\"\n [attr.aria-hidden]=\"control.disabled\"\n [formControl]=\"control\" />\n\n <label class=\"full\" [for]=\"id + '-' + starValue\">\n <it-icon name=\"star-full\" size=\"sm\"></it-icon>\n <span class=\"visually-hidden\">\n {{'it.core.rate-star'|translate : { current: starValue, total: stars.length } }}\n </span>\n </label>\n </ng-container>\n\n</fieldset>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ItIconComponent, selector: "it-icon[name]", inputs: ["name", "size", "color", "padded", "svgClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItRatingComponent, decorators: [{
44
+ type: Component,
45
+ args: [{ standalone: true, selector: 'it-rating', changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, NgForOf, ReactiveFormsModule, ItIconComponent], template: "<fieldset class=\"rating\"\n [class.rating-label]=\"!!label\"\n [class.rating-read-only]=\"control.disabled\">\n <legend>\n <span>{{label}}</span>\n <span class=\"visually-hidden\">\n {{'it.core.rating-star'|translate : { current: control.value || 0, total: stars.length } }}\n </span>\n </legend>\n\n <ng-container *ngFor=\"let starValue of stars\">\n <input [id]=\"id + '-' + starValue\"\n type=\"radio\"\n [name]=\"id\"\n [value]=\"starValue\"\n [attr.aria-hidden]=\"control.disabled\"\n [formControl]=\"control\" />\n\n <label class=\"full\" [for]=\"id + '-' + starValue\">\n <it-icon name=\"star-full\" size=\"sm\"></it-icon>\n <span class=\"visually-hidden\">\n {{'it.core.rate-star'|translate : { current: starValue, total: stars.length } }}\n </span>\n </label>\n </ng-container>\n\n</fieldset>\n" }]
46
+ }], propDecorators: { value: [{
47
+ type: Input
48
+ }], starCount: [{
49
+ type: Input
50
+ }] } });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9yYXRpbmcvcmF0aW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9yYXRpbmcvcmF0aW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7OztBQVNsRSxNQUFNLE9BQU8saUJBQWtCLFNBQVEsdUJBQWtEO0lBUHpGOztRQWNFOzs7V0FHRztRQUNNLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFFckIsVUFBSyxHQUFrQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7S0EwQnZEO0lBeEJVLFdBQVcsQ0FBQyxPQUFzQjtRQUN6QyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNCLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRVEsUUFBUTtRQUNmLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssYUFBYTtRQUNuQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNFLENBQUM7OEdBdENVLGlCQUFpQjtrR0FBakIsaUJBQWlCLHFLQ2Q5Qiw2NUJBMkJBLDJDRGZZLGVBQWUsNEZBQUUsT0FBTyxrSEFBRSxtQkFBbUIsNnhCQUFFLGVBQWU7OzJGQUU3RCxpQkFBaUI7a0JBUDdCLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLFdBQVcsbUJBRUosdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxDQUFDOzhCQU9oRSxLQUFLO3NCQUFiLEtBQUs7Z0JBTUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSXRBYnN0cmFjdEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9hYnN0cmFjdHMvYWJzdHJhY3QtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBOZ0Zvck9mIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi91dGlscy9pY29uL2ljb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnaXQtcmF0aW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhdGluZy5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBOZ0Zvck9mLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBJdEljb25Db21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIEl0UmF0aW5nQ29tcG9uZW50IGV4dGVuZHMgSXRBYnN0cmFjdEZvcm1Db21wb25lbnQ8bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgLyoqXG4gICAqIFRoZSByYXRpbmcgdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBzdGFycyB0byBzaG93XG4gICAqIEBkZWZhdWx0IDVcbiAgICovXG4gIEBJbnB1dCgpIHN0YXJDb3VudDogbnVtYmVyID0gNTtcblxuICBwcm90ZWN0ZWQgc3RhcnM6IEFycmF5PG51bWJlcj4gPSB0aGlzLmdlbmVyYXRlU3RhcnMoKTtcblxuICBvdmVycmlkZSBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG5cbiAgICBpZiAoY2hhbmdlc1snc3RhckNvdW50J10gfHwgIXRoaXMuc3RhcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnN0YXJzID0gdGhpcy5nZW5lcmF0ZVN0YXJzKCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIGlmICghdGhpcy5jb250cm9sLnZhbHVlICYmICEhdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIGFycmF5IG9mIHN0YXJzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlU3RhcnMoKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuc3RhckNvdW50IH0sIChfLCBpKSA9PiBpICsgMSkucmV2ZXJzZSgpO1xuICB9XG59XG4iLCI8ZmllbGRzZXQgY2xhc3M9XCJyYXRpbmdcIlxuICAgICAgICAgIFtjbGFzcy5yYXRpbmctbGFiZWxdPVwiISFsYWJlbFwiXG4gICAgICAgICAgW2NsYXNzLnJhdGluZy1yZWFkLW9ubHldPVwiY29udHJvbC5kaXNhYmxlZFwiPlxuICA8bGVnZW5kPlxuICAgIDxzcGFuPnt7bGFiZWx9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPlxuICAgICAgICB7eydpdC5jb3JlLnJhdGluZy1zdGFyJ3x0cmFuc2xhdGUgOiB7IGN1cnJlbnQ6IGNvbnRyb2wudmFsdWUgfHwgMCwgdG90YWw6IHN0YXJzLmxlbmd0aCB9IH19XG4gICAgPC9zcGFuPlxuICA8L2xlZ2VuZD5cblxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGFyVmFsdWUgb2Ygc3RhcnNcIj5cbiAgICA8aW5wdXQgW2lkXT1cImlkICsgJy0nICsgc3RhclZhbHVlXCJcbiAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgW25hbWVdPVwiaWRcIlxuICAgICAgICAgICBbdmFsdWVdPVwic3RhclZhbHVlXCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiY29udHJvbC5kaXNhYmxlZFwiXG4gICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCIgLz5cblxuICAgIDxsYWJlbCBjbGFzcz1cImZ1bGxcIiBbZm9yXT1cImlkICsgJy0nICsgc3RhclZhbHVlXCI+XG4gICAgICA8aXQtaWNvbiBuYW1lPVwic3Rhci1mdWxsXCIgc2l6ZT1cInNtXCI+PC9pdC1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5cbiAgICAgICAge3snaXQuY29yZS5yYXRlLXN0YXInfHRyYW5zbGF0ZSA6IHsgY3VycmVudDogc3RhclZhbHVlLCB0b3RhbDogc3RhcnMubGVuZ3RoIH0gfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICA8L25nLWNvbnRhaW5lcj5cblxuPC9maWVsZHNldD5cbiJdfQ==
@@ -0,0 +1,70 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { ItAbstractFormComponent } from '../../../abstracts/abstract-form.component';
3
+ import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
4
+ import { ReactiveFormsModule } from '@angular/forms';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ export class ItSelectComponent extends ItAbstractFormComponent {
8
+ ngOnInit() {
9
+ super.ngOnInit();
10
+ if (this.control.value) {
11
+ return;
12
+ }
13
+ const selectedOption = this.options?.find(this.optionIsSelected);
14
+ if (selectedOption) {
15
+ this.writeValue(selectedOption.value);
16
+ if (this._ngControl?.control && selectedOption.value !== this._ngControl.control.value) {
17
+ this.onChange(selectedOption.value);
18
+ }
19
+ return;
20
+ }
21
+ const selectedGroupOption = this.groups?.flatMap(g => g.options).find(this.optionIsSelected);
22
+ if (selectedGroupOption) {
23
+ this.writeValue(selectedGroupOption.value);
24
+ if (this._ngControl?.control && selectedGroupOption.value !== this._ngControl.control.value) {
25
+ this.onChange(selectedGroupOption.value);
26
+ }
27
+ }
28
+ }
29
+ /**
30
+ * Check if the option is selected
31
+ * @param option the option
32
+ */
33
+ optionIsSelected(option) {
34
+ if (option.selected === true) {
35
+ return true;
36
+ }
37
+ if (typeof option.selected === 'function') {
38
+ return option.selected(this.control.value);
39
+ }
40
+ return false;
41
+ }
42
+ /**
43
+ * Check if the option is disabled
44
+ * @param option the option
45
+ */
46
+ optionIsDisabled(option) {
47
+ if (option.disabled === true) {
48
+ return true;
49
+ }
50
+ if (typeof option.disabled === 'function') {
51
+ return option.disabled(this.control.value);
52
+ }
53
+ return false;
54
+ }
55
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
56
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: ItSelectComponent, isStandalone: true, selector: "it-select", inputs: { options: "options", groups: "groups", description: "description", defaultOption: "defaultOption" }, usesInheritance: true, ngImport: i0, template: "<div class=\"select-wrapper\">\n <label *ngIf=\"label\" [for]=\"id\">{{label}}</label>\n <select [id]=\"id\" [formControl]=\"control\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n (blur)=\"markAsTouched()\"\n [attr.aria-describedby]=\"id + '-description'\">\n\n <option *ngIf=\"defaultOption\" [ngValue]=\"null\" disabled selected>\n {{defaultOption}}\n </option>\n\n <ng-content></ng-content>\n\n <ng-container *ngIf=\"options\">\n <option *ngFor=\"let option of options\" [disabled]=\"optionIsDisabled(option)\" [ngValue]=\"option.value\">\n {{option.text ?? option.value}}\n </option>\n </ng-container>\n\n <ng-container *ngIf=\"groups\">\n <optgroup *ngFor=\"let group of groups\" [label]=\"group.label\">\n <option *ngFor=\"let option of group.options\" [disabled]=\"optionIsDisabled(option)\" [ngValue]=\"option.value\">\n {{option.text ?? option.value}}\n </option>\n </optgroup>\n </ng-container>\n </select>\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".select-wrapper{margin-bottom:1.7rem}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
57
+ }
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItSelectComponent, decorators: [{
59
+ type: Component,
60
+ args: [{ standalone: true, selector: 'it-select', imports: [NgIf, NgForOf, ReactiveFormsModule, AsyncPipe], template: "<div class=\"select-wrapper\">\n <label *ngIf=\"label\" [for]=\"id\">{{label}}</label>\n <select [id]=\"id\" [formControl]=\"control\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n (blur)=\"markAsTouched()\"\n [attr.aria-describedby]=\"id + '-description'\">\n\n <option *ngIf=\"defaultOption\" [ngValue]=\"null\" disabled selected>\n {{defaultOption}}\n </option>\n\n <ng-content></ng-content>\n\n <ng-container *ngIf=\"options\">\n <option *ngFor=\"let option of options\" [disabled]=\"optionIsDisabled(option)\" [ngValue]=\"option.value\">\n {{option.text ?? option.value}}\n </option>\n </ng-container>\n\n <ng-container *ngIf=\"groups\">\n <optgroup *ngFor=\"let group of groups\" [label]=\"group.label\">\n <option *ngFor=\"let option of group.options\" [disabled]=\"optionIsDisabled(option)\" [ngValue]=\"option.value\">\n {{option.text ?? option.value}}\n </option>\n </optgroup>\n </ng-container>\n </select>\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".select-wrapper{margin-bottom:1.7rem}\n"] }]
61
+ }], propDecorators: { options: [{
62
+ type: Input
63
+ }], groups: [{
64
+ type: Input
65
+ }], description: [{
66
+ type: Input
67
+ }], defaultOption: [{
68
+ type: Input
69
+ }] } });
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXJGLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFTckQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLHVCQUF1QjtJQXVCbkQsUUFBUTtRQUNmLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUNELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pFLElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLElBQUksY0FBYyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7Z0JBQ3RGLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3JDO1lBQ0QsT0FBTztTQUNSO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0YsSUFBSSxtQkFBbUIsRUFBRTtZQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtnQkFDM0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxQztTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLE1BQTJCO1FBQzFDLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUN6QyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLE1BQTJCO1FBQzFDLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUN6QyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs4R0E3RVUsaUJBQWlCO2tHQUFqQixpQkFBaUIsME1DYjlCLGk4Q0FxQ0EsaUdEMUJZLElBQUksNkZBQUUsT0FBTyxrSEFBRSxtQkFBbUIsZ3RCQUFFLFNBQVM7OzJGQUU1QyxpQkFBaUI7a0JBUDdCLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLFdBQVcsV0FHWixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxDQUFDOzhCQU8vQyxPQUFPO3NCQUFmLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSXRBYnN0cmFjdEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9hYnN0cmFjdHMvYWJzdHJhY3QtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VsZWN0Q29udHJvbEdyb3VwLCBTZWxlY3RDb250cm9sT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9mb3JtJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdpdC1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtOZ0lmLCBOZ0Zvck9mLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBBc3luY1BpcGVdXG59KVxuZXhwb3J0IGNsYXNzIEl0U2VsZWN0Q29tcG9uZW50IGV4dGVuZHMgSXRBYnN0cmFjdEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0IG9wdGlvbnNcbiAgICovXG4gIEBJbnB1dCgpIG9wdGlvbnM6IEFycmF5PFNlbGVjdENvbnRyb2xPcHRpb24+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0IGdyb3VwIG9wdGlvbnNcbiAgICovXG4gIEBJbnB1dCgpIGdyb3VwczogQXJyYXk8U2VsZWN0Q29udHJvbEdyb3VwPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHNlbGVjdCBkZXNjcmlwdGlvblxuICAgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHNldCwgYWRkIGEgYGRpc2FibGVkIHNlbGVjdGVkYCBvcHRpb24gd2l0aCB2YWx1ZSBgbnVsbGAgYW5kIGFzIHRleHQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAgICogQGV4YW1wbGUgJ1NlbGVjdCBhbiBvcHRpb24nXG4gICAqL1xuICBASW5wdXQoKSBkZWZhdWx0T3B0aW9uPzogc3RyaW5nO1xuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICBpZiAodGhpcy5jb250cm9sLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zPy5maW5kKHRoaXMub3B0aW9uSXNTZWxlY3RlZCk7XG4gICAgaWYgKHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICB0aGlzLndyaXRlVmFsdWUoc2VsZWN0ZWRPcHRpb24udmFsdWUpO1xuICAgICAgaWYgKHRoaXMuX25nQ29udHJvbD8uY29udHJvbCAmJiBzZWxlY3RlZE9wdGlvbi52YWx1ZSAhPT0gdGhpcy5fbmdDb250cm9sLmNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShzZWxlY3RlZE9wdGlvbi52YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cE9wdGlvbiA9IHRoaXMuZ3JvdXBzPy5mbGF0TWFwKGcgPT4gZy5vcHRpb25zKS5maW5kKHRoaXMub3B0aW9uSXNTZWxlY3RlZCk7XG4gICAgaWYgKHNlbGVjdGVkR3JvdXBPcHRpb24pIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZShzZWxlY3RlZEdyb3VwT3B0aW9uLnZhbHVlKTtcbiAgICAgIGlmICh0aGlzLl9uZ0NvbnRyb2w/LmNvbnRyb2wgJiYgc2VsZWN0ZWRHcm91cE9wdGlvbi52YWx1ZSAhPT0gdGhpcy5fbmdDb250cm9sLmNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShzZWxlY3RlZEdyb3VwT3B0aW9uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIG9wdGlvbiBpcyBzZWxlY3RlZFxuICAgKiBAcGFyYW0gb3B0aW9uIHRoZSBvcHRpb25cbiAgICovXG4gIG9wdGlvbklzU2VsZWN0ZWQob3B0aW9uOiBTZWxlY3RDb250cm9sT3B0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKG9wdGlvbi5zZWxlY3RlZCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb24uc2VsZWN0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBvcHRpb24uc2VsZWN0ZWQodGhpcy5jb250cm9sLnZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0gb3B0aW9uIHRoZSBvcHRpb25cbiAgICovXG4gIG9wdGlvbklzRGlzYWJsZWQob3B0aW9uOiBTZWxlY3RDb250cm9sT3B0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKG9wdGlvbi5kaXNhYmxlZCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb24uZGlzYWJsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBvcHRpb24uZGlzYWJsZWQodGhpcy5jb250cm9sLnZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIFtmb3JdPVwiaWRcIj57e2xhYmVsfX08L2xhYmVsPlxuICA8c2VsZWN0IFtpZF09XCJpZFwiIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcbiAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJpc0ludmFsaWRcIlxuICAgICAgICAgIFtjbGFzcy5pcy12YWxpZF09XCJpc1ZhbGlkXCJcbiAgICAgICAgICAoYmx1cik9XCJtYXJrQXNUb3VjaGVkKClcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiPlxuXG4gICAgPG9wdGlvbiAqbmdJZj1cImRlZmF1bHRPcHRpb25cIiBbbmdWYWx1ZV09XCJudWxsXCIgZGlzYWJsZWQgc2VsZWN0ZWQ+XG4gICAgICB7e2RlZmF1bHRPcHRpb259fVxuICAgIDwvb3B0aW9uPlxuXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbnNcIj5cbiAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCIgW2Rpc2FibGVkXT1cIm9wdGlvbklzRGlzYWJsZWQob3B0aW9uKVwiIFtuZ1ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICB7e29wdGlvbi50ZXh0ID8/IG9wdGlvbi52YWx1ZX19XG4gICAgICA8L29wdGlvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cHNcIj5cbiAgICAgIDxvcHRncm91cCAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZ3JvdXBzXCIgW2xhYmVsXT1cImdyb3VwLmxhYmVsXCI+XG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBncm91cC5vcHRpb25zXCIgW2Rpc2FibGVkXT1cIm9wdGlvbklzRGlzYWJsZWQob3B0aW9uKVwiIFtuZ1ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgIHt7b3B0aW9uLnRleHQgPz8gb3B0aW9uLnZhbHVlfX1cbiAgICAgICAgPC9vcHRpb24+XG4gICAgICA8L29wdGdyb3VwPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3NlbGVjdD5cbiAgPHNtYWxsICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBbaWRdPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiIGNsYXNzPVwiZm9ybS10ZXh0XCI+e3tkZXNjcmlwdGlvbn19PC9zbWFsbD5cblxuICA8ZGl2ICpuZ0lmPVwiaXNJbnZhbGlkXCIgY2xhc3M9XCJmb3JtLWZlZWRiYWNrIGp1c3QtdmFsaWRhdGUtZXJyb3ItbGFiZWxcIiBbaWRdPVwiaWQgKyAnLWVycm9yJ1wiPlxuICAgIDxkaXYgI2N1c3RvbUVycm9yPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Vycm9yXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1c3RvbUVycm9yLmhhc0NoaWxkTm9kZXMoKVwiPnt7aW52YWxpZE1lc3NhZ2UgfCBhc3luY319PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,55 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import { ItAbstractFormComponent } from '../../../abstracts/abstract-form.component';
3
+ import { AsyncPipe, NgIf } from '@angular/common';
4
+ import { ReactiveFormsModule } from '@angular/forms';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ export class ItTextareaComponent extends ItAbstractFormComponent {
8
+ constructor() {
9
+ super(...arguments);
10
+ /**
11
+ * Textarea Rows
12
+ * @default 3
13
+ */
14
+ this.rows = 3;
15
+ /**
16
+ * The textarea placeholder
17
+ */
18
+ this.placeholder = '';
19
+ }
20
+ /**
21
+ * Return the invalid message string from TranslateService
22
+ */
23
+ get invalidMessage() {
24
+ if (this.hasError('maxlength')) {
25
+ const error = this.getError('maxlength');
26
+ return this._translateService.get('it.errors.max-length-invalid', { max: error.requiredLength });
27
+ }
28
+ if (this.hasError('pattern')) {
29
+ const error = this.getError('pattern');
30
+ return this._translateService.get('it.errors.pattern-invalid', { pattern: error.requiredPattern });
31
+ }
32
+ return super.invalidMessage;
33
+ }
34
+ /**
35
+ * Check is readonly field
36
+ */
37
+ get isReadonly() {
38
+ return this.readonly === 'plaintext' || !!this.readonly;
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItTextareaComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
41
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: ItTextareaComponent, isStandalone: true, selector: "it-textarea", inputs: { rows: "rows", placeholder: "placeholder", description: "description", readonly: "readonly" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"!!control.value || !!placeholder\">{{label}}</label>\n <textarea\n [id]=\"id\"\n [rows]=\"rows\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [readonly]=\"isReadonly\"\n (blur)=\"markAsTouched()\"></textarea>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError><ng-content select=\"[error]\"></ng-content></div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: ["textarea.is-invalid{border-color:#cc334d}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItTextareaComponent, decorators: [{
44
+ type: Component,
45
+ args: [{ standalone: true, selector: 'it-textarea', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgIf, ReactiveFormsModule, AsyncPipe], template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"!!control.value || !!placeholder\">{{label}}</label>\n <textarea\n [id]=\"id\"\n [rows]=\"rows\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [readonly]=\"isReadonly\"\n (blur)=\"markAsTouched()\"></textarea>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError><ng-content select=\"[error]\"></ng-content></div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: ["textarea.is-invalid{border-color:#cc334d}\n"] }]
46
+ }], propDecorators: { rows: [{
47
+ type: Input
48
+ }], placeholder: [{
49
+ type: Input
50
+ }], description: [{
51
+ type: Input
52
+ }], readonly: [{
53
+ type: Input
54
+ }] } });
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVyRixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFVckQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLHVCQUFrRDtJQVIzRjs7UUFVRTs7O1dBR0c7UUFDTSxTQUFJLEdBQVksQ0FBQyxDQUFDO1FBRTNCOztXQUVHO1FBQ00sZ0JBQVcsR0FBVyxFQUFFLENBQUM7S0FvQ25DO0lBdEJDOztPQUVHO0lBQ0gsSUFBYSxjQUFjO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztTQUNsRztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztTQUNwRztRQUVELE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFjLFVBQVU7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUMxRCxDQUFDOzhHQTlDVSxtQkFBbUI7a0dBQW5CLG1CQUFtQixzTUNkaEMsNDVCQW9CQSxxR0RSWSxJQUFJLDRGQUFFLG1CQUFtQixxa0JBQUUsU0FBUzs7MkZBRW5DLG1CQUFtQjtrQkFSL0IsU0FBUztpQ0FDSSxJQUFJLFlBQ04sYUFBYSxtQkFHTix1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFNBQVMsQ0FBQzs4QkFRdEMsSUFBSTtzQkFBWixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFPRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEl0QWJzdHJhY3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYWJzdHJhY3RzL2Fic3RyYWN0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdpdC10ZXh0YXJlYScsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0YXJlYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RleHRhcmVhLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbTmdJZiwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQXN5bmNQaXBlXVxufSlcbmV4cG9ydCBjbGFzcyBJdFRleHRhcmVhQ29tcG9uZW50IGV4dGVuZHMgSXRBYnN0cmFjdEZvcm1Db21wb25lbnQ8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4ge1xuXG4gIC8qKlxuICAgKiBUZXh0YXJlYSBSb3dzXG4gICAqIEBkZWZhdWx0IDNcbiAgICovXG4gIEBJbnB1dCgpIHJvd3M/OiBudW1iZXIgPSAzO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dGFyZWEgcGxhY2Vob2xkZXJcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogVGhlIGlucHV0IGRlc2NyaXB0aW9uXG4gICAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUbyBwcmV2ZW50IG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGFpbmVkIHZhbHVlLlxuICAgKiAtIDxiPnBsYWludGV4dDwvYj46IFJlYWRvbmx5IGZpZWxkIGluIHRoZSBmb3JtIHN0eWxpemVkIGFzIHBsYWluIHRleHRcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiB8ICdwbGFpbnRleHQnIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGludmFsaWQgbWVzc2FnZSBzdHJpbmcgZnJvbSBUcmFuc2xhdGVTZXJ2aWNlXG4gICAqL1xuICBvdmVycmlkZSBnZXQgaW52YWxpZE1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5oYXNFcnJvcignbWF4bGVuZ3RoJykpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5nZXRFcnJvcignbWF4bGVuZ3RoJyk7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5tYXgtbGVuZ3RoLWludmFsaWQnLCB7IG1heDogZXJyb3IucmVxdWlyZWRMZW5ndGggfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdwYXR0ZXJuJykpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5nZXRFcnJvcigncGF0dGVybicpO1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMucGF0dGVybi1pbnZhbGlkJywgeyBwYXR0ZXJuOiBlcnJvci5yZXF1aXJlZFBhdHRlcm4gfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmludmFsaWRNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlzIHJlYWRvbmx5IGZpZWxkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzUmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHkgPT09ICdwbGFpbnRleHQnIHx8ICEhdGhpcy5yZWFkb25seTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cImlkXCIgW2NsYXNzLmFjdGl2ZV09XCIhIWNvbnRyb2wudmFsdWUgfHwgISFwbGFjZWhvbGRlclwiPnt7bGFiZWx9fTwvbGFiZWw+XG4gIDx0ZXh0YXJlYVxuICAgIFtpZF09XCJpZFwiXG4gICAgW3Jvd3NdPVwicm93c1wiXG4gICAgW2NsYXNzLmZvcm0tY29udHJvbF09XCJyZWFkb25seSAhPT0gJ3BsYWludGV4dCdcIlxuICAgIFtjbGFzcy5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0XT1cInJlYWRvbmx5ID09PSAncGxhaW50ZXh0J1wiXG4gICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaXNJbnZhbGlkXCJcbiAgICBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgW3JlYWRvbmx5XT1cImlzUmVhZG9ubHlcIlxuICAgIChibHVyKT1cIm1hcmtBc1RvdWNoZWQoKVwiPjwvdGV4dGFyZWE+XG5cbiAgPHNtYWxsICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBbaWRdPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiIGNsYXNzPVwiZm9ybS10ZXh0XCI+e3tkZXNjcmlwdGlvbn19PC9zbWFsbD5cbiAgPGRpdiAqbmdJZj1cImlzSW52YWxpZFwiIGNsYXNzPVwiZm9ybS1mZWVkYmFjayBqdXN0LXZhbGlkYXRlLWVycm9yLWxhYmVsXCIgW2lkXT1cImlkICsgJy1lcnJvcidcIj5cbiAgICA8ZGl2ICNjdXN0b21FcnJvcj48bmctY29udGVudCBzZWxlY3Q9XCJbZXJyb3JdXCI+PC9uZy1jb250ZW50PjwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tRXJyb3IuaGFzQ2hpbGROb2RlcygpXCI+e3tpbnZhbGlkTWVzc2FnZSB8IGFzeW5jfX08L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,140 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
2
+ import { ItAbstractComponent } from '../../../abstracts/abstract.component';
3
+ import { ItFileUtils } from '../../../utils/file-utils';
4
+ import { ProgressDonut } from 'bootstrap-italia';
5
+ import { ItIconComponent } from '../../utils/icon/icon.component';
6
+ import { NgIf, NgOptimizedImage } from '@angular/common';
7
+ import { TranslateModule } from '@ngx-translate/core';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@ngx-translate/core";
10
+ export class ItUploadDragDropComponent extends ItAbstractComponent {
11
+ constructor() {
12
+ super(...arguments);
13
+ /**
14
+ * The accepted file type to upload <br>
15
+ * Possible values: <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types">MIME Types</a> separated by comma
16
+ * @example application/pdf,image/png
17
+ * @default *
18
+ */
19
+ this.accept = '*';
20
+ /**
21
+ * Fired when file start to upload
22
+ */
23
+ this.fileStartUpload = new EventEmitter();
24
+ this.isDragover = false;
25
+ this.isLoading = false;
26
+ this.isSuccess = false;
27
+ }
28
+ ngAfterViewInit() {
29
+ super.ngAfterViewInit();
30
+ if (this.donutElement) {
31
+ this.donut = ProgressDonut.getOrCreateInstance(this.donutElement.nativeElement);
32
+ }
33
+ }
34
+ // Dragover listener
35
+ onDragOver(evt) {
36
+ evt.preventDefault();
37
+ evt.stopPropagation();
38
+ this.isDragover = !this.isLoading;
39
+ }
40
+ // Dragleave listener
41
+ onDragLeave(evt) {
42
+ evt.preventDefault();
43
+ evt.stopPropagation();
44
+ this.isDragover = false;
45
+ }
46
+ // Drop leave listener
47
+ onDrop(evt) {
48
+ evt.preventDefault();
49
+ evt.stopPropagation();
50
+ this.isDragover = false;
51
+ const files = evt.dataTransfer?.files;
52
+ if (this.isLoading || !files?.length) {
53
+ return;
54
+ }
55
+ this.start(files[0]);
56
+ }
57
+ /**
58
+ * On load file from input
59
+ * @param event
60
+ */
61
+ onLoadFile(event) {
62
+ const files = event.target?.files;
63
+ if (!files?.length) {
64
+ return;
65
+ }
66
+ this.start(files[0]);
67
+ }
68
+ /**
69
+ * Start the upload file
70
+ * @param file
71
+ */
72
+ start(file) {
73
+ if (this.accept !== '*' && !this.accept.includes(file.type)) {
74
+ return;
75
+ }
76
+ this.reset();
77
+ this.isLoading = true;
78
+ const splitName = file.name.split('.');
79
+ this.filename = splitName[0];
80
+ this.extension = splitName[1]?.toUpperCase();
81
+ this.fileSize = ItFileUtils.getFileSizeString(file);
82
+ this.fileStartUpload.emit(file);
83
+ }
84
+ /**
85
+ * Percentage of upload
86
+ * @param value the percentage [0 - 100]
87
+ */
88
+ progress(value) {
89
+ if (!this.isLoading) {
90
+ return;
91
+ }
92
+ if (value >= 100) {
93
+ this.success();
94
+ }
95
+ else {
96
+ this.donut?.set(((value < 0) ? 0 : value) / 100);
97
+ }
98
+ }
99
+ /**
100
+ * Upload success
101
+ */
102
+ success() {
103
+ this.isLoading = false;
104
+ this.isSuccess = true;
105
+ this._changeDetectorRef.detectChanges();
106
+ }
107
+ /**
108
+ * Reset file uploader
109
+ */
110
+ reset() {
111
+ this.isLoading = false;
112
+ this.isSuccess = false;
113
+ this.filename = this.extension = this.fileSize = undefined;
114
+ this.donut?.set(0);
115
+ this._changeDetectorRef.detectChanges();
116
+ }
117
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItUploadDragDropComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
118
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: ItUploadDragDropComponent, isStandalone: true, selector: "it-upload-drag-drop", inputs: { accept: "accept" }, outputs: { fileStartUpload: "fileStartUpload" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" } }, viewQueries: [{ propertyName: "donutElement", first: true, predicate: ["donutElement"], descendants: true }], exportAs: ["itUploadDragDrop"], usesInheritance: true, ngImport: i0, template: "<div class=\"upload-dragdrop\" [class.dragover]=\"isDragover\" [class.loading]=\"isLoading\" [class.success]=\"isSuccess\">\n <div class=\"upload-dragdrop-image\">\n <img ngSrc=\"/bootstrap-italia/dist/assets/upload-drag-drop-icon.svg\"\n alt=\"drag-drop-icon\" aria-hidden=\"true\" [width]=\"180\" [height]=\"180\">\n <div class=\"upload-dragdrop-loading\">\n <div class=\"progress-donut\" #donutElement></div>\n </div>\n <div class=\"upload-dragdrop-success\">\n <it-icon name=\"check\"></it-icon>\n </div>\n </div>\n <div class=\"upload-dragdrop-text\">\n <p class=\"upload-dragdrop-weight\">\n <it-icon name=\"file\" size=\"xs\"></it-icon>\n {{extension}} ({{fileSize}})\n </p>\n <h5>{{filename || ('it.form.upload-drag-file'|translate)}}</h5>\n <p *ngIf=\"isLoading\">{{'it.form.upload-loading'|translate}}</p>\n <p *ngIf=\"isSuccess\">{{'it.form.upload-complete'|translate}}</p>\n <p *ngIf=\"!isLoading && !isSuccess\">{{'it.form.upload-or'|translate}}\n <input type=\"file\" [id]=\"id\" class=\"upload-dragdrop-input\" [accept]=\"accept\" (change)=\"onLoadFile($event)\"/>\n <label [for]=\"id\">{{'it.form.upload-select-device'|translate}}</label>\n </p>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: ItIconComponent, selector: "it-icon[name]", inputs: ["name", "size", "color", "padded", "svgClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
119
+ }
120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ItUploadDragDropComponent, decorators: [{
121
+ type: Component,
122
+ args: [{ standalone: true, selector: 'it-upload-drag-drop', exportAs: 'itUploadDragDrop', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ItIconComponent, NgIf, TranslateModule, NgOptimizedImage], template: "<div class=\"upload-dragdrop\" [class.dragover]=\"isDragover\" [class.loading]=\"isLoading\" [class.success]=\"isSuccess\">\n <div class=\"upload-dragdrop-image\">\n <img ngSrc=\"/bootstrap-italia/dist/assets/upload-drag-drop-icon.svg\"\n alt=\"drag-drop-icon\" aria-hidden=\"true\" [width]=\"180\" [height]=\"180\">\n <div class=\"upload-dragdrop-loading\">\n <div class=\"progress-donut\" #donutElement></div>\n </div>\n <div class=\"upload-dragdrop-success\">\n <it-icon name=\"check\"></it-icon>\n </div>\n </div>\n <div class=\"upload-dragdrop-text\">\n <p class=\"upload-dragdrop-weight\">\n <it-icon name=\"file\" size=\"xs\"></it-icon>\n {{extension}} ({{fileSize}})\n </p>\n <h5>{{filename || ('it.form.upload-drag-file'|translate)}}</h5>\n <p *ngIf=\"isLoading\">{{'it.form.upload-loading'|translate}}</p>\n <p *ngIf=\"isSuccess\">{{'it.form.upload-complete'|translate}}</p>\n <p *ngIf=\"!isLoading && !isSuccess\">{{'it.form.upload-or'|translate}}\n <input type=\"file\" [id]=\"id\" class=\"upload-dragdrop-input\" [accept]=\"accept\" (change)=\"onLoadFile($event)\"/>\n <label [for]=\"id\">{{'it.form.upload-select-device'|translate}}</label>\n </p>\n </div>\n</div>\n" }]
123
+ }], propDecorators: { accept: [{
124
+ type: Input
125
+ }], fileStartUpload: [{
126
+ type: Output
127
+ }], donutElement: [{
128
+ type: ViewChild,
129
+ args: ['donutElement']
130
+ }], onDragOver: [{
131
+ type: HostListener,
132
+ args: ['dragover', ['$event']]
133
+ }], onDragLeave: [{
134
+ type: HostListener,
135
+ args: ['dragleave', ['$event']]
136
+ }], onDrop: [{
137
+ type: HostListener,
138
+ args: ['drop', ['$event']]
139
+ }] } });
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWRyYWctZHJvcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vdXBsb2FkLWRyYWctZHJvcC91cGxvYWQtZHJhZy1kcm9wLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS91cGxvYWQtZHJhZy1kcm9wL3VwbG9hZC1kcmFnLWRyb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUFVdEQsTUFBTSxPQUFPLHlCQUEwQixTQUFRLG1CQUFtQjtJQVJsRTs7UUFVRTs7Ozs7V0FLRztRQUNNLFdBQU0sR0FBVyxHQUFHLENBQUM7UUFFOUI7O1dBRUc7UUFDTyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFckQsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixjQUFTLEdBQVksS0FB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TUFBTTtzQkFEWixZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJdEFic3RyYWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYWJzdHJhY3RzL2Fic3RyYWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJdEZpbGVVdGlscyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2ZpbGUtdXRpbHMnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NEb251dCB9IGZyb20gJ2Jvb3RzdHJhcC1pdGFsaWEnO1xuaW1wb3J0IHsgSXRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ0lmLCBOZ09wdGltaXplZEltYWdlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdpdC11cGxvYWQtZHJhZy1kcm9wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC1kcmFnLWRyb3AuY29tcG9uZW50Lmh0bWwnLFxuICBleHBvcnRBczogJ2l0VXBsb2FkRHJhZ0Ryb3AnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0l0SWNvbkNvbXBvbmVudCwgTmdJZiwgVHJhbnNsYXRlTW9kdWxlLCBOZ09wdGltaXplZEltYWdlXVxufSlcbmV4cG9ydCBjbGFzcyBJdFVwbG9hZERyYWdEcm9wQ29tcG9uZW50IGV4dGVuZHMgSXRBYnN0cmFjdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjZXB0ZWQgZmlsZSB0eXBlIHRvIHVwbG9hZCA8YnI+XG4gICAqIFBvc3NpYmxlIHZhbHVlczogPGEgaHJlZj1cImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlcy9Db21tb25fdHlwZXNcIj5NSU1FIFR5cGVzPC9hPiBzZXBhcmF0ZWQgYnkgY29tbWFcbiAgICogQGV4YW1wbGUgYXBwbGljYXRpb24vcGRmLGltYWdlL3BuZ1xuICAgKiBAZGVmYXVsdCAqXG4gICAqL1xuICBASW5wdXQoKSBhY2NlcHQ6IHN0cmluZyA9ICcqJztcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBmaWxlIHN0YXJ0IHRvIHVwbG9hZFxuICAgKi9cbiAgQE91dHB1dCgpIGZpbGVTdGFydFVwbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcblxuICBpc0RyYWdvdmVyOiBib29sZWFuID0gZmFsc2U7XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1N1Y2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBkb251dD86IFByb2dyZXNzRG9udXQ7XG5cbiAgQFZpZXdDaGlsZCgnZG9udXRFbGVtZW50JykgcHJpdmF0ZSBkb251dEVsZW1lbnQ/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBmaWxlbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9uPzogc3RyaW5nO1xuICBmaWxlU2l6ZT86IHN0cmluZztcblxuICBvdmVycmlkZSBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgaWYgKHRoaXMuZG9udXRFbGVtZW50KSB7XG4gICAgICB0aGlzLmRvbnV0ID0gUHJvZ3Jlc3NEb251dC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMuZG9udXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERyYWdvdmVyIGxpc3RlbmVyXG4gIEBIb3N0TGlzdGVuZXIoJ2RyYWdvdmVyJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uRHJhZ092ZXIoZXZ0OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0RyYWdvdmVyID0gIXRoaXMuaXNMb2FkaW5nO1xuICB9XG5cblxuICAvLyBEcmFnbGVhdmUgbGlzdGVuZXJcbiAgQEhvc3RMaXN0ZW5lcignZHJhZ2xlYXZlJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uRHJhZ0xlYXZlKGV2dDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNEcmFnb3ZlciA9IGZhbHNlO1xuICB9XG5cbiAgLy8gRHJvcCBsZWF2ZSBsaXN0ZW5lclxuICBASG9zdExpc3RlbmVyKCdkcm9wJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uRHJvcChldnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuaXNEcmFnb3ZlciA9IGZhbHNlO1xuICAgIGNvbnN0IGZpbGVzID0gZXZ0LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nIHx8ICFmaWxlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhcnQoZmlsZXNbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIGxvYWQgZmlsZSBmcm9tIGlucHV0XG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgb25Mb2FkRmlsZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk/LmZpbGVzO1xuICAgIGlmICghZmlsZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0KGZpbGVzWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgdXBsb2FkIGZpbGVcbiAgICogQHBhcmFtIGZpbGVcbiAgICovXG4gIHB1YmxpYyBzdGFydChmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWNjZXB0ICE9PSAnKicgJiYgIXRoaXMuYWNjZXB0LmluY2x1ZGVzKGZpbGUudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgY29uc3Qgc3BsaXROYW1lID0gZmlsZS5uYW1lLnNwbGl0KCcuJyk7XG4gICAgdGhpcy5maWxlbmFtZSA9IHNwbGl0TmFtZVswXTtcbiAgICB0aGlzLmV4dGVuc2lvbiA9IHNwbGl0TmFtZVsxXT8udG9VcHBlckNhc2UoKTtcbiAgICB0aGlzLmZpbGVTaXplID0gSXRGaWxlVXRpbHMuZ2V0RmlsZVNpemVTdHJpbmcoZmlsZSk7XG5cbiAgICB0aGlzLmZpbGVTdGFydFVwbG9hZC5lbWl0KGZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmNlbnRhZ2Ugb2YgdXBsb2FkXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgcGVyY2VudGFnZSBbMCAtIDEwMF1cbiAgICovXG4gIHB1YmxpYyBwcm9ncmVzcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+PSAxMDApIHtcbiAgICAgIHRoaXMuc3VjY2VzcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvbnV0Py5zZXQoKCh2YWx1ZSA8IDApID8gMCA6IHZhbHVlKSAvIDEwMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBzdWNjZXNzXG4gICAqL1xuICBwdWJsaWMgc3VjY2VzcygpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNTdWNjZXNzID0gdHJ1ZTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZmlsZSB1cGxvYWRlclxuICAgKi9cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLmZpbGVuYW1lID0gdGhpcy5leHRlbnNpb24gPSB0aGlzLmZpbGVTaXplID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZG9udXQ/LnNldCgwKTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInVwbG9hZC1kcmFnZHJvcFwiIFtjbGFzcy5kcmFnb3Zlcl09XCJpc0RyYWdvdmVyXCIgW2NsYXNzLmxvYWRpbmddPVwiaXNMb2FkaW5nXCIgW2NsYXNzLnN1Y2Nlc3NdPVwiaXNTdWNjZXNzXCI+XG4gIDxkaXYgY2xhc3M9XCJ1cGxvYWQtZHJhZ2Ryb3AtaW1hZ2VcIj5cbiAgICA8aW1nIG5nU3JjPVwiL2Jvb3RzdHJhcC1pdGFsaWEvZGlzdC9hc3NldHMvdXBsb2FkLWRyYWctZHJvcC1pY29uLnN2Z1wiXG4gICAgICAgICBhbHQ9XCJkcmFnLWRyb3AtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFt3aWR0aF09XCIxODBcIiBbaGVpZ2h0XT1cIjE4MFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtZHJhZ2Ryb3AtbG9hZGluZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWRvbnV0XCIgI2RvbnV0RWxlbWVudD48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWRyYWdkcm9wLXN1Y2Nlc3NcIj5cbiAgICAgIDxpdC1pY29uIG5hbWU9XCJjaGVja1wiPjwvaXQtaWNvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ1cGxvYWQtZHJhZ2Ryb3AtdGV4dFwiPlxuICAgIDxwIGNsYXNzPVwidXBsb2FkLWRyYWdkcm9wLXdlaWdodFwiPlxuICAgICAgPGl0LWljb24gbmFtZT1cImZpbGVcIiBzaXplPVwieHNcIj48L2l0LWljb24+XG4gICAgICB7e2V4dGVuc2lvbn19ICh7e2ZpbGVTaXplfX0pXG4gICAgPC9wPlxuICAgIDxoNT57e2ZpbGVuYW1lIHx8ICgnaXQuZm9ybS51cGxvYWQtZHJhZy1maWxlJ3x0cmFuc2xhdGUpfX08L2g1PlxuICAgIDxwICpuZ0lmPVwiaXNMb2FkaW5nXCI+e3snaXQuZm9ybS51cGxvYWQtbG9hZGluZyd8dHJhbnNsYXRlfX08L3A+XG4gICAgPHAgKm5nSWY9XCJpc1N1Y2Nlc3NcIj57eydpdC5mb3JtLnVwbG9hZC1jb21wbGV0ZSd8dHJhbnNsYXRlfX08L3A+XG4gICAgPHAgKm5nSWY9XCIhaXNMb2FkaW5nICYmICFpc1N1Y2Nlc3NcIj57eydpdC5mb3JtLnVwbG9hZC1vcid8dHJhbnNsYXRlfX1cbiAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIFtpZF09XCJpZFwiIGNsYXNzPVwidXBsb2FkLWRyYWdkcm9wLWlucHV0XCIgW2FjY2VwdF09XCJhY2NlcHRcIiAoY2hhbmdlKT1cIm9uTG9hZEZpbGUoJGV2ZW50KVwiLz5cbiAgICAgIDxsYWJlbCBbZm9yXT1cImlkXCI+e3snaXQuZm9ybS51cGxvYWQtc2VsZWN0LWRldmljZSd8dHJhbnNsYXRlfX08L2xhYmVsPlxuICAgIDwvcD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==