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

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 (259) hide show
  1. package/README.md +212 -64
  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/core/accordion/accordion.component.mjs +39 -0
  7. package/esm2022/lib/components/core/alert/alert.component.mjs +71 -0
  8. package/esm2022/lib/components/core/avatar/avatar-dropdown/avatar-dropdown.component.mjs +43 -0
  9. package/esm2022/lib/components/core/avatar/avatar-group/avatar-group.component.mjs +38 -0
  10. package/esm2022/lib/components/core/avatar/avatar.directive.mjs +78 -0
  11. package/esm2022/lib/components/core/avatar/avatar.module.mjs +33 -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 +84 -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 +18 -0
  19. package/esm2022/lib/components/core/chip/chip.component.mjs +136 -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 +55 -0
  24. package/esm2022/lib/components/core/dimmer/dimmer.module.mjs +19 -0
  25. package/esm2022/lib/components/core/dropdown/dropdown/dropdown.component.mjs +144 -0
  26. package/esm2022/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +61 -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 +18 -0
  33. package/esm2022/lib/components/core/modal/modal.component.mjs +194 -0
  34. package/esm2022/lib/components/core/notifications/notifications.component.mjs +111 -0
  35. package/esm2022/lib/components/core/pagination/pagination.component.mjs +130 -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 +25 -0
  39. package/esm2022/lib/components/core/spinner/spinner.component.mjs +30 -0
  40. package/esm2022/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +116 -0
  41. package/esm2022/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +20 -0
  42. package/esm2022/lib/components/core/steppers/steppers.module.mjs +18 -0
  43. package/esm2022/lib/components/core/tab/tab-container/tab-container.component.mjs +63 -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 +18 -0
  46. package/esm2022/lib/components/core/table/sort/sort-header/sort-header.component.mjs +134 -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/table/table.module.mjs +19 -0
  50. package/esm2022/lib/components/core/tooltip/tooltip.directive.mjs +143 -0
  51. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +106 -0
  52. package/esm2022/lib/components/form/checkbox/checkbox.component.mjs +48 -0
  53. package/esm2022/lib/components/form/form.module.mjs +59 -0
  54. package/esm2022/lib/components/form/input/input.component.mjs +187 -0
  55. package/esm2022/lib/components/form/password-input/password-input.component.mjs +149 -0
  56. package/esm2022/lib/components/form/radio-button/radio-button.component.mjs +60 -0
  57. package/esm2022/lib/components/form/range/range.component.mjs +64 -0
  58. package/esm2022/lib/components/form/rating/rating.component.mjs +50 -0
  59. package/esm2022/lib/components/form/select/select.component.mjs +70 -0
  60. package/esm2022/lib/components/form/textarea/textarea.component.mjs +55 -0
  61. package/esm2022/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +142 -0
  62. package/esm2022/lib/components/form/upload-file-list/upload-file-list.component.mjs +107 -0
  63. package/esm2022/lib/components/navigation/back-button/back-button.component.mjs +67 -0
  64. package/esm2022/lib/components/navigation/back-to-top/back-to-top.component.mjs +58 -0
  65. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +51 -0
  66. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +21 -0
  67. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumbs.module.mjs +18 -0
  68. package/esm2022/lib/components/navigation/header/header.component.mjs +87 -0
  69. package/esm2022/lib/components/navigation/megamenu/megamenu.component.mjs +27 -0
  70. package/esm2022/lib/components/navigation/navbar/navbar/navbar.component.mjs +40 -0
  71. package/esm2022/lib/components/navigation/navbar/navbar-item/navbar-item.component.mjs +11 -0
  72. package/esm2022/lib/components/navigation/navbar/navbar.module.mjs +18 -0
  73. package/esm2022/lib/components/utils/error-page/error-page.component.mjs +74 -0
  74. package/esm2022/lib/components/utils/icon/icon.component.mjs +58 -0
  75. package/esm2022/lib/components/utils/language-switcher/language-switcher.component.mjs +50 -0
  76. package/esm2022/lib/design-angular-kit.module.mjs +213 -0
  77. package/esm2022/lib/enums/colors.enums.mjs +12 -0
  78. package/esm2022/lib/enums/sizes.enum.mjs +9 -0
  79. package/esm2022/lib/interfaces/core.mjs +16 -0
  80. package/esm2022/lib/interfaces/design-angular-kit-config.mjs +7 -0
  81. package/esm2022/lib/interfaces/form.mjs +2 -0
  82. package/esm2022/lib/interfaces/icon.mjs +165 -0
  83. package/esm2022/lib/interfaces/sortable-table.mjs +6 -0
  84. package/esm2022/lib/pipes/date-ago.pipe.mjs +56 -0
  85. package/esm2022/lib/pipes/duration.pipe.mjs +110 -0
  86. package/esm2022/lib/pipes/mark-matching-text.pipe.mjs +48 -0
  87. package/esm2022/lib/provide-design-angular-kit.mjs +61 -0
  88. package/esm2022/lib/services/notification/notification.service.mjs +120 -0
  89. package/esm2022/lib/utils/coercion.mjs +18 -0
  90. package/esm2022/lib/utils/date-utils.mjs +160 -0
  91. package/esm2022/lib/utils/file-utils.mjs +73 -0
  92. package/esm2022/lib/utils/regex.mjs +31 -0
  93. package/esm2022/lib/validators/it-validators.mjs +153 -0
  94. package/esm2022/public_api.mjs +99 -0
  95. package/fesm2022/design-angular-kit.mjs +5556 -0
  96. package/fesm2022/design-angular-kit.mjs.map +1 -0
  97. package/lib/abstracts/{abstract-form-component.d.ts → abstract-form.component.d.ts} +12 -14
  98. package/lib/abstracts/abstract.component.d.ts +18 -8
  99. package/lib/components/core/accordion/accordion.component.d.ts +11 -5
  100. package/lib/components/core/alert/alert.component.d.ts +15 -10
  101. package/lib/components/core/avatar/avatar-dropdown/avatar-dropdown.component.d.ts +29 -0
  102. package/lib/components/core/avatar/avatar-group/avatar-group.component.d.ts +13 -0
  103. package/lib/components/core/avatar/avatar.directive.d.ts +33 -0
  104. package/lib/components/core/avatar/avatar.module.d.ts +9 -0
  105. package/lib/components/core/badge/badge.directive.d.ts +14 -7
  106. package/lib/components/core/button/button.directive.d.ts +25 -15
  107. package/lib/components/core/callout/callout.component.d.ts +18 -20
  108. package/lib/components/core/card/card.component.d.ts +46 -18
  109. package/lib/components/core/carousel/carousel/carousel.component.d.ts +34 -15
  110. package/lib/components/core/carousel/carousel-item/carousel-item.component.d.ts +8 -3
  111. package/lib/components/core/carousel/carousel.module.d.ts +8 -0
  112. package/lib/components/core/chip/chip.component.d.ts +29 -15
  113. package/lib/components/core/collapse/collapse.component.d.ts +22 -15
  114. package/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.d.ts +3 -3
  115. package/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.d.ts +3 -3
  116. package/lib/components/core/dimmer/dimmer.component.d.ts +6 -6
  117. package/lib/components/core/dimmer/dimmer.module.d.ts +9 -0
  118. package/lib/components/core/dropdown/dropdown/dropdown.component.d.ts +30 -17
  119. package/lib/components/core/dropdown/dropdown-item/dropdown-item.component.d.ts +15 -12
  120. package/lib/components/core/dropdown/dropdown.module.d.ts +8 -0
  121. package/lib/components/core/forward/forward.directive.d.ts +3 -3
  122. package/lib/components/core/link/link.component.d.ts +14 -10
  123. package/lib/components/core/list/list/list.component.d.ts +20 -6
  124. package/lib/components/core/list/list-item/list-item.component.d.ts +23 -9
  125. package/lib/components/core/list/list.module.d.ts +8 -0
  126. package/lib/components/core/modal/modal.component.d.ts +89 -13
  127. package/lib/components/core/notifications/notifications.component.d.ts +9 -8
  128. package/lib/components/core/pagination/pagination.component.d.ts +71 -10
  129. package/lib/components/core/popover/popover.directive.d.ts +15 -14
  130. package/lib/components/core/progress-bar/progress-bar.component.d.ts +11 -8
  131. package/lib/components/core/progress-button/progress-button.component.d.ts +5 -6
  132. package/lib/components/core/spinner/spinner.component.d.ts +13 -10
  133. package/lib/components/core/steppers/steppers-container/steppers-container.component.d.ts +55 -27
  134. package/lib/components/core/steppers/steppers-item/steppers-item.component.d.ts +5 -4
  135. package/lib/components/core/steppers/steppers.module.d.ts +8 -0
  136. package/lib/components/core/tab/tab-container/tab-container.component.d.ts +15 -12
  137. package/lib/components/core/tab/tab-item/tab-item.component.d.ts +14 -10
  138. package/lib/components/core/tab/tab.module.d.ts +8 -0
  139. package/lib/components/core/table/sort/sort-header/sort-header.component.d.ts +72 -0
  140. package/lib/components/core/table/sort/sort.directive.d.ts +53 -0
  141. package/lib/components/core/table/table.component.d.ts +26 -20
  142. package/lib/components/core/table/table.module.d.ts +9 -0
  143. package/lib/components/core/tooltip/tooltip.directive.d.ts +12 -11
  144. package/lib/components/form/autocomplete/autocomplete.component.d.ts +55 -0
  145. package/lib/components/form/checkbox/checkbox.component.d.ts +23 -12
  146. package/lib/components/form/form.module.d.ts +17 -0
  147. package/lib/components/form/input/input.component.d.ts +42 -43
  148. package/lib/components/form/password-input/password-input.component.d.ts +35 -10
  149. package/lib/components/form/radio-button/radio-button.component.d.ts +20 -11
  150. package/lib/components/form/range/range.component.d.ts +42 -0
  151. package/lib/components/form/rating/rating.component.d.ts +24 -0
  152. package/lib/components/form/select/select.component.d.ts +12 -6
  153. package/lib/components/form/textarea/textarea.component.d.ts +15 -5
  154. package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +18 -12
  155. package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +14 -11
  156. package/lib/components/navigation/back-button/back-button.component.d.ts +8 -8
  157. package/lib/components/navigation/back-to-top/back-to-top.component.d.ts +15 -16
  158. package/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.d.ts +12 -14
  159. package/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +9 -8
  160. package/lib/components/navigation/breadcrumbs/breadcrumbs.module.d.ts +8 -0
  161. package/lib/components/navigation/header/header.component.d.ts +28 -25
  162. package/lib/components/navigation/megamenu/megamenu.component.d.ts +22 -0
  163. package/lib/components/navigation/navbar/navbar/navbar.component.d.ts +16 -0
  164. package/lib/components/navigation/navbar/navbar-item/navbar-item.component.d.ts +5 -0
  165. package/lib/components/navigation/navbar/navbar.module.d.ts +8 -0
  166. package/lib/components/utils/error-page/error-page.component.d.ts +44 -0
  167. package/lib/components/utils/icon/icon.component.d.ts +25 -17
  168. package/lib/components/utils/language-switcher/language-switcher.component.d.ts +9 -5
  169. package/lib/design-angular-kit.module.d.ts +44 -7
  170. package/lib/enums/colors.enums.d.ts +10 -0
  171. package/lib/enums/sizes.enum.d.ts +7 -0
  172. package/lib/interfaces/core.d.ts +16 -15
  173. package/lib/interfaces/design-angular-kit-config.d.ts +30 -0
  174. package/lib/interfaces/form.d.ts +9 -9
  175. package/lib/interfaces/icon.d.ts +4 -3
  176. package/lib/interfaces/sortable-table.d.ts +33 -0
  177. package/lib/pipes/date-ago.pipe.d.ts +17 -0
  178. package/lib/pipes/duration.pipe.d.ts +35 -0
  179. package/lib/pipes/mark-matching-text.pipe.d.ts +15 -7
  180. package/lib/provide-design-angular-kit.d.ts +7 -0
  181. package/lib/services/{notifications/notifications.service.d.ts → notification/notification.service.d.ts} +3 -3
  182. package/lib/utils/coercion.d.ts +14 -0
  183. package/lib/utils/date-utils.d.ts +78 -0
  184. package/lib/utils/file-utils.d.ts +1 -1
  185. package/lib/utils/regex.d.ts +5 -0
  186. package/lib/validators/it-validators.d.ts +9 -2
  187. package/package.json +17 -22
  188. package/public_api.d.ts +31 -4
  189. package/esm2020/lib/abstracts/abstract-form-component.mjs +0 -174
  190. package/esm2020/lib/abstracts/abstract.component.mjs +0 -27
  191. package/esm2020/lib/components/core/accordion/accordion.component.mjs +0 -31
  192. package/esm2020/lib/components/core/alert/alert.component.mjs +0 -69
  193. package/esm2020/lib/components/core/badge/badge.directive.mjs +0 -34
  194. package/esm2020/lib/components/core/button/button.directive.mjs +0 -80
  195. package/esm2020/lib/components/core/callout/callout.component.mjs +0 -84
  196. package/esm2020/lib/components/core/card/card.component.mjs +0 -58
  197. package/esm2020/lib/components/core/carousel/carousel/carousel.component.mjs +0 -66
  198. package/esm2020/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +0 -14
  199. package/esm2020/lib/components/core/chip/chip.component.mjs +0 -89
  200. package/esm2020/lib/components/core/collapse/collapse.component.mjs +0 -101
  201. package/esm2020/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +0 -24
  202. package/esm2020/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +0 -11
  203. package/esm2020/lib/components/core/dimmer/dimmer.component.mjs +0 -59
  204. package/esm2020/lib/components/core/dropdown/dropdown/dropdown.component.mjs +0 -130
  205. package/esm2020/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +0 -68
  206. package/esm2020/lib/components/core/forward/forward.directive.mjs +0 -51
  207. package/esm2020/lib/components/core/link/link.component.mjs +0 -40
  208. package/esm2020/lib/components/core/list/list/list.component.mjs +0 -13
  209. package/esm2020/lib/components/core/list/list-item/list-item.component.mjs +0 -36
  210. package/esm2020/lib/components/core/modal/modal.component.mjs +0 -98
  211. package/esm2020/lib/components/core/notifications/notifications.component.mjs +0 -110
  212. package/esm2020/lib/components/core/pagination/pagination.component.mjs +0 -51
  213. package/esm2020/lib/components/core/popover/popover.directive.mjs +0 -179
  214. package/esm2020/lib/components/core/progress-bar/progress-bar.component.mjs +0 -34
  215. package/esm2020/lib/components/core/progress-button/progress-button.component.mjs +0 -27
  216. package/esm2020/lib/components/core/spinner/spinner.component.mjs +0 -35
  217. package/esm2020/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +0 -119
  218. package/esm2020/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +0 -18
  219. package/esm2020/lib/components/core/tab/tab-container/tab-container.component.mjs +0 -59
  220. package/esm2020/lib/components/core/tab/tab-item/tab-item.component.mjs +0 -36
  221. package/esm2020/lib/components/core/table/table.component.mjs +0 -57
  222. package/esm2020/lib/components/core/tooltip/tooltip.directive.mjs +0 -143
  223. package/esm2020/lib/components/form/checkbox/checkbox.component.mjs +0 -40
  224. package/esm2020/lib/components/form/input/input.component.mjs +0 -222
  225. package/esm2020/lib/components/form/password-input/password-input.component.mjs +0 -112
  226. package/esm2020/lib/components/form/radio-button/radio-button.component.mjs +0 -53
  227. package/esm2020/lib/components/form/select/select.component.mjs +0 -62
  228. package/esm2020/lib/components/form/textarea/textarea.component.mjs +0 -46
  229. package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +0 -137
  230. package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +0 -104
  231. package/esm2020/lib/components/navigation/back-button/back-button.component.mjs +0 -69
  232. package/esm2020/lib/components/navigation/back-to-top/back-to-top.component.mjs +0 -74
  233. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +0 -45
  234. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +0 -23
  235. package/esm2020/lib/components/navigation/header/header.component.mjs +0 -63
  236. package/esm2020/lib/components/utils/icon/icon.component.mjs +0 -54
  237. package/esm2020/lib/components/utils/language-switcher/language-switcher.component.mjs +0 -39
  238. package/esm2020/lib/components/utils/not-found-page/not-found-page.component.mjs +0 -13
  239. package/esm2020/lib/design-angular-kit.module.mjs +0 -56
  240. package/esm2020/lib/interfaces/core.mjs +0 -16
  241. package/esm2020/lib/interfaces/form.mjs +0 -2
  242. package/esm2020/lib/interfaces/icon.mjs +0 -2
  243. package/esm2020/lib/modules/components.module.mjs +0 -257
  244. package/esm2020/lib/pipes/mark-matching-text.pipe.mjs +0 -36
  245. package/esm2020/lib/services/notifications/notifications.service.mjs +0 -120
  246. package/esm2020/lib/utils/boolean-input.mjs +0 -15
  247. package/esm2020/lib/utils/file-utils.mjs +0 -73
  248. package/esm2020/lib/utils/regex.mjs +0 -26
  249. package/esm2020/lib/validators/it-validators.mjs +0 -134
  250. package/esm2020/public_api.mjs +0 -70
  251. package/fesm2015/design-angular-kit.mjs +0 -3850
  252. package/fesm2015/design-angular-kit.mjs.map +0 -1
  253. package/fesm2020/design-angular-kit.mjs +0 -3797
  254. package/fesm2020/design-angular-kit.mjs.map +0 -1
  255. package/lib/components/utils/not-found-page/not-found-page.component.d.ts +0 -5
  256. package/lib/modules/components.module.d.ts +0 -61
  257. package/lib/utils/boolean-input.d.ts +0 -11
  258. /package/{esm2020 → esm2022}/design-angular-kit.mjs +0 -0
  259. /package/{esm2020 → esm2022}/lib/interfaces/utils.mjs +0 -0
@@ -0,0 +1,120 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { filter, Subject } from 'rxjs';
3
+ import { NotificationType } from '../../interfaces/core';
4
+ import * as i0 from "@angular/core";
5
+ export class ItNotificationService {
6
+ constructor() {
7
+ this.subject = new Subject();
8
+ }
9
+ /**
10
+ * Listen on notification arrived
11
+ * @param filterType filter type of notification
12
+ */
13
+ onNotification(filterType) {
14
+ return this.subject.asObservable().pipe(filter(n => n && (!filterType || (n.type === filterType))));
15
+ }
16
+ /**
17
+ * Show new notification
18
+ * @param notification notification
19
+ */
20
+ addNotification(notification) {
21
+ this.subject.next(notification);
22
+ }
23
+ /**
24
+ * Create new Standard notification
25
+ * @param title notification title
26
+ * @param message notification message
27
+ * @param dismissible notification dismissible
28
+ * @param duration notification duration (milliseconds)
29
+ * @param position notification position
30
+ */
31
+ standard(title, message, dismissible, duration, position) {
32
+ this.addNotification({
33
+ type: NotificationType.Standard,
34
+ message,
35
+ title,
36
+ duration,
37
+ dismissible,
38
+ position
39
+ });
40
+ }
41
+ /**
42
+ * Create new Success notification
43
+ * @param title notification title
44
+ * @param message notification message
45
+ * @param dismissible notification dismissible
46
+ * @param duration notification duration (milliseconds)
47
+ * @param position notification position
48
+ */
49
+ success(title, message, dismissible, duration, position) {
50
+ this.addNotification({
51
+ type: NotificationType.Success,
52
+ message,
53
+ title,
54
+ duration,
55
+ dismissible,
56
+ position
57
+ });
58
+ }
59
+ /**
60
+ * Create new Error notification
61
+ * @param title notification title
62
+ * @param message notification message
63
+ * @param dismissible notification dismissible
64
+ * @param duration notification duration (milliseconds)
65
+ * @param position notification position
66
+ */
67
+ error(title, message, dismissible, duration, position) {
68
+ this.addNotification({
69
+ type: NotificationType.Error,
70
+ message,
71
+ title,
72
+ duration,
73
+ dismissible,
74
+ position
75
+ });
76
+ }
77
+ /**
78
+ * Create new Warning notification
79
+ * @param title notification title
80
+ * @param message notification message
81
+ * @param dismissible notification dismissible
82
+ * @param duration notification duration (milliseconds)
83
+ * @param position notification position
84
+ */
85
+ warning(title, message, dismissible, duration, position) {
86
+ this.addNotification({
87
+ type: NotificationType.Warning,
88
+ message,
89
+ title,
90
+ duration,
91
+ dismissible,
92
+ position
93
+ });
94
+ }
95
+ /**
96
+ * Create new Info notification
97
+ * @param title notification title
98
+ * @param message notification message
99
+ * @param dismissible notification dismissible
100
+ * @param duration notification duration (milliseconds)
101
+ * @param position notification position
102
+ */
103
+ info(title, message, dismissible, duration, position) {
104
+ this.addNotification({
105
+ type: NotificationType.Info,
106
+ message,
107
+ title,
108
+ duration,
109
+ dismissible,
110
+ position
111
+ });
112
+ }
113
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ItNotificationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
114
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ItNotificationService, providedIn: 'root' }); }
115
+ }
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ItNotificationService, decorators: [{
117
+ type: Injectable,
118
+ args: [{ providedIn: 'root' }]
119
+ }] });
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQXNDLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBRzdGLE1BQU0sT0FBTyxxQkFBcUI7SUFEbEM7UUFFVSxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQWdCLENBQUM7S0FrSC9DO0lBaEhDOzs7T0FHRztJQUNJLGNBQWMsQ0FBQyxVQUE2QjtRQUNqRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLGVBQWUsQ0FBQyxZQUEwQjtRQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFFBQVEsQ0FBQyxLQUFhLEVBQUUsT0FBZ0IsRUFBRSxXQUFvQixFQUFFLFFBQWlCLEVBQUUsUUFBK0I7UUFDdkgsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUNuQixJQUFJLEVBQUUsZ0JBQWdCLENBQUMsUUFBUTtZQUMvQixPQUFPO1lBQ1AsS0FBSztZQUNMLFFBQVE7WUFDUixXQUFXO1lBQ1gsUUFBUTtTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksT0FBTyxDQUFDLEtBQWEsRUFBRSxPQUFnQixFQUFFLFdBQW9CLEVBQUUsUUFBaUIsRUFBRSxRQUErQjtRQUN0SCxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ25CLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPO1lBQzlCLE9BQU87WUFDUCxLQUFLO1lBQ0wsUUFBUTtZQUNSLFdBQVc7WUFDWCxRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxLQUFLLENBQUMsS0FBYSxFQUFFLE9BQWdCLEVBQUUsV0FBb0IsRUFBRSxRQUFpQixFQUFFLFFBQStCO1FBQ3BILElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbkIsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEtBQUs7WUFDNUIsT0FBTztZQUNQLEtBQUs7WUFDTCxRQUFRO1lBQ1IsV0FBVztZQUNYLFFBQVE7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLE9BQU8sQ0FBQyxLQUFhLEVBQUUsT0FBZ0IsRUFBRSxXQUFvQixFQUFFLFFBQWlCLEVBQUUsUUFBK0I7UUFDdEgsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUNuQixJQUFJLEVBQUUsZ0JBQWdCLENBQUMsT0FBTztZQUM5QixPQUFPO1lBQ1AsS0FBSztZQUNMLFFBQVE7WUFDUixXQUFXO1lBQ1gsUUFBUTtTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksSUFBSSxDQUFDLEtBQWEsRUFBRSxPQUFnQixFQUFFLFdBQW9CLEVBQUUsUUFBaUIsRUFBRSxRQUErQjtRQUNuSCxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ25CLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJO1lBQzNCLE9BQU87WUFDUCxLQUFLO1lBQ0wsUUFBUTtZQUNSLFdBQVc7WUFDWCxRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FsSFUscUJBQXFCO2tIQUFyQixxQkFBcUIsY0FEUixNQUFNOzsyRkFDbkIscUJBQXFCO2tCQURqQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbHRlciwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uLCBOb3RpZmljYXRpb25Qb3NpdGlvbiwgTm90aWZpY2F0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29yZSc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgSXROb3RpZmljYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzdWJqZWN0ID0gbmV3IFN1YmplY3Q8Tm90aWZpY2F0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gb24gbm90aWZpY2F0aW9uIGFycml2ZWRcbiAgICogQHBhcmFtIGZpbHRlclR5cGUgZmlsdGVyIHR5cGUgb2Ygbm90aWZpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgb25Ob3RpZmljYXRpb24oZmlsdGVyVHlwZT86IE5vdGlmaWNhdGlvblR5cGUpOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgIGZpbHRlcihuID0+IG4gJiYgKCFmaWx0ZXJUeXBlIHx8IChuLnR5cGUgPT09IGZpbHRlclR5cGUpKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgbmV3IG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gbm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIGFkZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc3ViamVjdC5uZXh0KG5vdGlmaWNhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG5ldyBTdGFuZGFyZCBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHRpdGxlIG5vdGlmaWNhdGlvbiB0aXRsZVxuICAgKiBAcGFyYW0gbWVzc2FnZSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgKiBAcGFyYW0gZGlzbWlzc2libGUgbm90aWZpY2F0aW9uIGRpc21pc3NpYmxlXG4gICAqIEBwYXJhbSBkdXJhdGlvbiBub3RpZmljYXRpb24gZHVyYXRpb24gKG1pbGxpc2Vjb25kcylcbiAgICogQHBhcmFtIHBvc2l0aW9uIG5vdGlmaWNhdGlvbiBwb3NpdGlvblxuICAgKi9cbiAgcHVibGljIHN0YW5kYXJkKHRpdGxlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIGRpc21pc3NpYmxlPzpib29sZWFuLCBkdXJhdGlvbj86IG51bWJlciwgcG9zaXRpb24/OiBOb3RpZmljYXRpb25Qb3NpdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3RhbmRhcmQsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGl0bGUsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGRpc21pc3NpYmxlLFxuICAgICAgcG9zaXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbmV3IFN1Y2Nlc3Mgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSB0aXRsZSBub3RpZmljYXRpb24gdGl0bGVcbiAgICogQHBhcmFtIG1lc3NhZ2Ugbm90aWZpY2F0aW9uIG1lc3NhZ2VcbiAgICogQHBhcmFtIGRpc21pc3NpYmxlIG5vdGlmaWNhdGlvbiBkaXNtaXNzaWJsZVxuICAgKiBAcGFyYW0gZHVyYXRpb24gbm90aWZpY2F0aW9uIGR1cmF0aW9uIChtaWxsaXNlY29uZHMpXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBub3RpZmljYXRpb24gcG9zaXRpb25cbiAgICovXG4gIHB1YmxpYyBzdWNjZXNzKHRpdGxlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIGRpc21pc3NpYmxlPzpib29sZWFuLCBkdXJhdGlvbj86IG51bWJlciwgcG9zaXRpb24/OiBOb3RpZmljYXRpb25Qb3NpdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2VzcyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aXRsZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgZGlzbWlzc2libGUsXG4gICAgICBwb3NpdGlvblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBuZXcgRXJyb3Igbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSB0aXRsZSBub3RpZmljYXRpb24gdGl0bGVcbiAgICogQHBhcmFtIG1lc3NhZ2Ugbm90aWZpY2F0aW9uIG1lc3NhZ2VcbiAgICogQHBhcmFtIGRpc21pc3NpYmxlIG5vdGlmaWNhdGlvbiBkaXNtaXNzaWJsZVxuICAgKiBAcGFyYW0gZHVyYXRpb24gbm90aWZpY2F0aW9uIGR1cmF0aW9uIChtaWxsaXNlY29uZHMpXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBub3RpZmljYXRpb24gcG9zaXRpb25cbiAgICovXG4gIHB1YmxpYyBlcnJvcih0aXRsZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nLCBkaXNtaXNzaWJsZT86Ym9vbGVhbiwgZHVyYXRpb24/OiBudW1iZXIsIHBvc2l0aW9uPzogTm90aWZpY2F0aW9uUG9zaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmFkZE5vdGlmaWNhdGlvbih7XG4gICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZHVyYXRpb24sXG4gICAgICBkaXNtaXNzaWJsZSxcbiAgICAgIHBvc2l0aW9uXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG5ldyBXYXJuaW5nIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gdGl0bGUgbm90aWZpY2F0aW9uIHRpdGxlXG4gICAqIEBwYXJhbSBtZXNzYWdlIG5vdGlmaWNhdGlvbiBtZXNzYWdlXG4gICAqIEBwYXJhbSBkaXNtaXNzaWJsZSBub3RpZmljYXRpb24gZGlzbWlzc2libGVcbiAgICogQHBhcmFtIGR1cmF0aW9uIG5vdGlmaWNhdGlvbiBkdXJhdGlvbiAobWlsbGlzZWNvbmRzKVxuICAgKiBAcGFyYW0gcG9zaXRpb24gbm90aWZpY2F0aW9uIHBvc2l0aW9uXG4gICAqL1xuICBwdWJsaWMgd2FybmluZyh0aXRsZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nLCBkaXNtaXNzaWJsZT86Ym9vbGVhbiwgZHVyYXRpb24/OiBudW1iZXIsIHBvc2l0aW9uPzogTm90aWZpY2F0aW9uUG9zaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmFkZE5vdGlmaWNhdGlvbih7XG4gICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLldhcm5pbmcsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGl0bGUsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGRpc21pc3NpYmxlLFxuICAgICAgcG9zaXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbmV3IEluZm8gbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSB0aXRsZSBub3RpZmljYXRpb24gdGl0bGVcbiAgICogQHBhcmFtIG1lc3NhZ2Ugbm90aWZpY2F0aW9uIG1lc3NhZ2VcbiAgICogQHBhcmFtIGRpc21pc3NpYmxlIG5vdGlmaWNhdGlvbiBkaXNtaXNzaWJsZVxuICAgKiBAcGFyYW0gZHVyYXRpb24gbm90aWZpY2F0aW9uIGR1cmF0aW9uIChtaWxsaXNlY29uZHMpXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBub3RpZmljYXRpb24gcG9zaXRpb25cbiAgICovXG4gIHB1YmxpYyBpbmZvKHRpdGxlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIGRpc21pc3NpYmxlPzpib29sZWFuLCBkdXJhdGlvbj86IG51bWJlciwgcG9zaXRpb24/OiBOb3RpZmljYXRpb25Qb3NpdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuSW5mbyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aXRsZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgZGlzbWlzc2libGUsXG4gICAgICBwb3NpdGlvblxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,18 @@
1
+ import { booleanAttribute } from "@angular/core";
2
+ /**
3
+ * Transforms a value (typically a string) to a boolean.
4
+ * Intended to be used as a transform function of an input.
5
+ *
6
+ * @usageNotes
7
+ * ```typescript
8
+ * @Input({ transform: booleanAttribute }) status?: boolean;
9
+ * ```
10
+ * @param {BooleanInput} value Value to be transformed.
11
+ *
12
+ * @publicApi
13
+ */
14
+ export function inputToBoolean(value) {
15
+ // Wrap `@angular/core` function to force value type, for ide hits
16
+ return booleanAttribute(value);
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29lcmNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi91dGlscy9jb2VyY2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJakQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQW1CO0lBQ2hELGtFQUFrRTtJQUNsRSxPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBib29sZWFuQXR0cmlidXRlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuZXhwb3J0IHR5cGUgQm9vbGVhbklucHV0ID0gXCJmYWxzZVwiIHwgXCJ0cnVlXCIgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSB2YWx1ZSAodHlwaWNhbGx5IGEgc3RyaW5nKSB0byBhIGJvb2xlYW4uXG4gKiBJbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgdHJhbnNmb3JtIGZ1bmN0aW9uIG9mIGFuIGlucHV0LlxuICpcbiAqICBAdXNhZ2VOb3Rlc1xuICogIGBgYHR5cGVzY3JpcHRcbiAqICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc3RhdHVzPzogYm9vbGVhbjtcbiAqICBgYGBcbiAqIEBwYXJhbSB7Qm9vbGVhbklucHV0fSB2YWx1ZSBWYWx1ZSB0byBiZSB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnB1dFRvQm9vbGVhbih2YWx1ZTogQm9vbGVhbklucHV0KTogYm9vbGVhbiB7XG4gIC8vIFdyYXAgYEBhbmd1bGFyL2NvcmVgIGZ1bmN0aW9uIHRvIGZvcmNlIHZhbHVlIHR5cGUsIGZvciBpZGUgaGl0c1xuICByZXR1cm4gYm9vbGVhbkF0dHJpYnV0ZSh2YWx1ZSk7XG59XG4iXX0=
@@ -0,0 +1,160 @@
1
+ import { shareReplay, takeWhile, timer } from 'rxjs';
2
+ import { map } from 'rxjs/operators';
3
+ export class ItDateUtils {
4
+ /**
5
+ * Add seconds to date
6
+ * @param date the date
7
+ * @param seconds seconds to add
8
+ */
9
+ static addSeconds(date, seconds) {
10
+ const newDate = new Date(date.valueOf());
11
+ newDate.setSeconds(date.getSeconds() + seconds);
12
+ return newDate;
13
+ }
14
+ /**
15
+ * Add minutes to date
16
+ * @param date the date
17
+ * @param minutes minutes to add
18
+ */
19
+ static addMinutes(date, minutes) {
20
+ const newDate = new Date(date.valueOf());
21
+ newDate.setMinutes(date.getMinutes() + minutes);
22
+ return newDate;
23
+ }
24
+ /**
25
+ * Add hours to date
26
+ * @param date the date
27
+ * @param hours hours to add
28
+ */
29
+ static addHours(date, hours) {
30
+ const newDate = new Date(date.valueOf());
31
+ newDate.setHours(date.getHours() + hours);
32
+ return newDate;
33
+ }
34
+ /**
35
+ * Add days to date
36
+ * @param date the date
37
+ * @param days days to add
38
+ */
39
+ static addDays(date, days) {
40
+ const newDate = new Date(date.valueOf());
41
+ newDate.setDate(date.getDate() + days);
42
+ return newDate;
43
+ }
44
+ /**
45
+ * Add years to date
46
+ * @param date the date
47
+ * @param months months to add
48
+ */
49
+ static addMonths(date, months) {
50
+ const newDate = new Date(date.valueOf());
51
+ newDate.setMonth(date.getMonth() + months);
52
+ return newDate;
53
+ }
54
+ /**
55
+ * Add years to date
56
+ * @param date the date
57
+ * @param years years to add
58
+ */
59
+ static addYears(date, years) {
60
+ const newDate = new Date(date.valueOf());
61
+ newDate.setFullYear(date.getFullYear() + years);
62
+ return newDate;
63
+ }
64
+ /**
65
+ * Calculate number of days between two date
66
+ * @param startDate the start date
67
+ * @param endDate the end date
68
+ */
69
+ static countDays(startDate, endDate) {
70
+ const differenceInTime = endDate.getTime() - startDate.getTime();
71
+ return Math.floor(differenceInTime / (1000 * 3600 * 24));
72
+ }
73
+ /**
74
+ * Check if string is a date with iso format
75
+ * @param value the string
76
+ */
77
+ static isIsoString(value) {
78
+ if (!value || !/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/.test(value)) {
79
+ return false;
80
+ }
81
+ const d = new Date(value);
82
+ return !!d && !isNaN(d.getTime()) && d.toISOString() === value;
83
+ }
84
+ /**
85
+ * Convert iso string to Date
86
+ * @param isoString the iso string
87
+ */
88
+ static isoStringToDate(isoString) {
89
+ return isoString ? new Date(Date.parse(isoString)) : null;
90
+ }
91
+ /**
92
+ * Remove time from an iso date string
93
+ * @param isoString the iso string
94
+ */
95
+ static isoStringRemoveTime(isoString) {
96
+ let date = ItDateUtils.isoStringToDate(isoString);
97
+ if (!date) {
98
+ return isoString;
99
+ }
100
+ const offset = date.getTimezoneOffset();
101
+ date = new Date(date.getTime() - offset * 60 * 1000);
102
+ return date.toISOString().substring(0, isoString.indexOf('T'));
103
+ }
104
+ /**
105
+ * Set iso string hours to 0 and format correctly the date (consider timezone offset)
106
+ * @example '2024-03-04T23:00:00.000Z' -> '2024-03-05T00:00:00.000Z'
107
+ * @param isoString the iso string
108
+ */
109
+ static isoStringSetZeroTime(isoString) {
110
+ let date = ItDateUtils.isoStringToDate(isoString);
111
+ if (!date) {
112
+ return isoString;
113
+ }
114
+ const offset = date.getTimezoneOffset();
115
+ date = new Date(date.getTime() - offset * 60 * 1000);
116
+ date.setUTCHours(0, 0, 0, 0);
117
+ return date.toISOString();
118
+ }
119
+ /**
120
+ * Calculate the date time left and return the string format [d h m s]
121
+ * @param endDate
122
+ */
123
+ static timeLeftString(endDate) {
124
+ const endTime = endDate.getTime();
125
+ return timer(0, 1000).pipe(map(() => Math.floor((endTime - new Date().getTime()) / 1000)), takeWhile(delta => delta >= 0), map(delta => {
126
+ const arrayResult = [];
127
+ const days = Math.floor(delta / 60 / 60 / 24);
128
+ if (days > 0) {
129
+ arrayResult.push(days + 'd');
130
+ }
131
+ delta -= days * 60 * 60 * 24;
132
+ const hours = Math.floor(delta / 60 / 60) % 24;
133
+ if (hours > 0) {
134
+ arrayResult.push(hours + 'h');
135
+ }
136
+ delta -= hours * 60 * 60;
137
+ const minutes = Math.floor(delta / 60) % 60;
138
+ arrayResult.push(minutes + 'm');
139
+ delta -= minutes * 60;
140
+ const seconds = delta % 60;
141
+ arrayResult.push(seconds + 's');
142
+ return arrayResult.join(' ');
143
+ }), shareReplay(1));
144
+ }
145
+ /**
146
+ * Calculate the next day of week
147
+ * @param dayOfWeek Day of week 0=Sunday, 1=Monday...4=Thursday...
148
+ * @param hour the specif hour
149
+ * @param minute the specific minute
150
+ */
151
+ static nextWeekDayAndTime(dayOfWeek, hour = 0, minute = 0) {
152
+ const now = new Date();
153
+ const result = new Date(now.getFullYear(), now.getMonth(), now.getDate() + ((7 + dayOfWeek - now.getDay()) % 7), hour, minute, 0, 0);
154
+ if (result < now) {
155
+ result.setDate(result.getDate() + 7);
156
+ }
157
+ return result;
158
+ }
159
+ }
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL3V0aWxzL2RhdGUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxNQUFNLE9BQU8sV0FBVztJQUN0Qjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFVLEVBQUUsT0FBZTtRQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUNoRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBVSxFQUFFLE9BQWU7UUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDaEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVUsRUFBRSxLQUFhO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxD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LFdBQVcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFckksSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIHNoYXJlUmVwbGF5LCB0YWtlV2hpbGUsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBJdERhdGVVdGlscyB7XG4gIC8qKlxuICAgKiBBZGQgc2Vjb25kcyB0byBkYXRlXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlXG4gICAqIEBwYXJhbSBzZWNvbmRzIHNlY29uZHMgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFkZFNlY29uZHMoZGF0ZTogRGF0ZSwgc2Vjb25kczogbnVtYmVyKTogRGF0ZSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcbiAgICBuZXdEYXRlLnNldFNlY29uZHMoZGF0ZS5nZXRTZWNvbmRzKCkgKyBzZWNvbmRzKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbWludXRlcyB0byBkYXRlXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlXG4gICAqIEBwYXJhbSBtaW51dGVzIG1pbnV0ZXMgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFkZE1pbnV0ZXMoZGF0ZTogRGF0ZSwgbWludXRlczogbnVtYmVyKTogRGF0ZSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcbiAgICBuZXdEYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkgKyBtaW51dGVzKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgaG91cnMgdG8gZGF0ZVxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZVxuICAgKiBAcGFyYW0gaG91cnMgaG91cnMgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFkZEhvdXJzKGRhdGU6IERhdGUsIGhvdXJzOiBudW1iZXIpOiBEYXRlIHtcbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xuICAgIG5ld0RhdGUuc2V0SG91cnMoZGF0ZS5nZXRIb3VycygpICsgaG91cnMpO1xuICAgIHJldHVybiBuZXdEYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBkYXlzIHRvIGRhdGVcbiAgICogQHBhcmFtIGRhdGUgdGhlIGRhdGVcbiAgICogQHBhcmFtIGRheXMgZGF5cyB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWRkRGF5cyhkYXRlOiBEYXRlLCBkYXlzOiBudW1iZXIpOiBEYXRlIHtcbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xuICAgIG5ld0RhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRheXMpO1xuICAgIHJldHVybiBuZXdEYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB5ZWFycyB0byBkYXRlXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlXG4gICAqIEBwYXJhbSBtb250aHMgbW9udGhzIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhZGRNb250aHMoZGF0ZTogRGF0ZSwgbW9udGhzOiBudW1iZXIpOiBEYXRlIHtcbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xuICAgIG5ld0RhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgbW9udGhzKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgeWVhcnMgdG8gZGF0ZVxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZVxuICAgKiBAcGFyYW0geWVhcnMgeWVhcnMgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFkZFllYXJzKGRhdGU6IERhdGUsIHllYXJzOiBudW1iZXIpOiBEYXRlIHtcbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoZGF0ZS52YWx1ZU9mKCkpO1xuICAgIG5ld0RhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgeWVhcnMpO1xuICAgIHJldHVybiBuZXdEYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHR3byBkYXRlXG4gICAqIEBwYXJhbSBzdGFydERhdGUgdGhlIHN0YXJ0IGRhdGVcbiAgICogQHBhcmFtIGVuZERhdGUgdGhlIGVuZCBkYXRlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvdW50RGF5cyhzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIGNvbnN0IGRpZmZlcmVuY2VJblRpbWUgPSBlbmREYXRlLmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZGlmZmVyZW5jZUluVGltZSAvICgxMDAwICogMzYwMCAqIDI0KSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc3RyaW5nIGlzIGEgZGF0ZSB3aXRoIGlzbyBmb3JtYXRcbiAgICogQHBhcmFtIHZhbHVlIHRoZSBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNJc29TdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbHVlIHx8ICEvXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0uXFxkezN9Wi8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICByZXR1cm4gISFkICYmICFpc05hTihkLmdldFRpbWUoKSkgJiYgZC50b0lTT1N0cmluZygpID09PSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGlzbyBzdHJpbmcgdG8gRGF0ZVxuICAgKiBAcGFyYW0gaXNvU3RyaW5nIHRoZSBpc28gc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzb1N0cmluZ1RvRGF0ZShpc29TdHJpbmc6IHN0cmluZyB8IG51bGwpOiBEYXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIGlzb1N0cmluZyA/IG5ldyBEYXRlKERhdGUucGFyc2UoaXNvU3RyaW5nKSkgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aW1lIGZyb20gYW4gaXNvIGRhdGUgc3RyaW5nXG4gICAqIEBwYXJhbSBpc29TdHJpbmcgdGhlIGlzbyBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNvU3RyaW5nUmVtb3ZlVGltZShpc29TdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGRhdGUgPSBJdERhdGVVdGlscy5pc29TdHJpbmdUb0RhdGUoaXNvU3RyaW5nKTtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiBpc29TdHJpbmc7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBvZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIGlzb1N0cmluZy5pbmRleE9mKCdUJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpc28gc3RyaW5nIGhvdXJzIHRvIDAgYW5kIGZvcm1hdCBjb3JyZWN0bHkgdGhlIGRhdGUgKGNvbnNpZGVyIHRpbWV6b25lIG9mZnNldClcbiAgICogQGV4YW1wbGUgJzIwMjQtMDMtMDRUMjM6MDA6MDAuMDAwWicgLT4gJzIwMjQtMDMtMDVUMDA6MDA6MDAuMDAwWidcbiAgICogQHBhcmFtIGlzb1N0cmluZyB0aGUgaXNvIHN0cmluZ1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc29TdHJpbmdTZXRaZXJvVGltZShpc29TdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGRhdGUgPSBJdERhdGVVdGlscy5pc29TdHJpbmdUb0RhdGUoaXNvU3RyaW5nKTtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiBpc29TdHJpbmc7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBvZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIGRhdGUgdGltZSBsZWZ0IGFuZCByZXR1cm4gdGhlIHN0cmluZyBmb3JtYXQgW2QgaCBtIHNdXG4gICAqIEBwYXJhbSBlbmREYXRlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRpbWVMZWZ0U3RyaW5nKGVuZERhdGU6IERhdGUpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGVuZFRpbWUgPSBlbmREYXRlLmdldFRpbWUoKTtcbiAgICByZXR1cm4gdGltZXIoMCwgMTAwMCkucGlwZShcbiAgICAgIG1hcCgoKSA9PiBNYXRoLmZsb29yKChlbmRUaW1lIC0gbmV3IERhdGUoKS5nZXRUaW1lKCkpIC8gMTAwMCkpLFxuICAgICAgdGFrZVdoaWxlKGRlbHRhID0+IGRlbHRhID49IDApLFxuICAgICAgbWFwKGRlbHRhID0+IHtcbiAgICAgICAgY29uc3QgYXJyYXlSZXN1bHQ6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgY29uc3QgZGF5cyA9IE1hdGguZmxvb3IoZGVsdGEgLyA2MCAvIDYwIC8gMjQpO1xuICAgICAgICBpZiAoZGF5cyA+IDApIHtcbiAgICAgICAgICBhcnJheVJlc3VsdC5wdXNoKGRheXMgKyAnZCcpO1xuICAgICAgICB9XG4gICAgICAgIGRlbHRhIC09IGRheXMgKiA2MCAqIDYwICogMjQ7XG4gICAgICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihkZWx0YSAvIDYwIC8gNjApICUgMjQ7XG4gICAgICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgICAgICBhcnJheVJlc3VsdC5wdXNoKGhvdXJzICsgJ2gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbHRhIC09IGhvdXJzICogNjAgKiA2MDtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoZGVsdGEgLyA2MCkgJSA2MDtcbiAgICAgICAgYXJyYXlSZXN1bHQucHVzaChtaW51dGVzICsgJ20nKTtcblxuICAgICAgICBkZWx0YSAtPSBtaW51dGVzICogNjA7XG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSBkZWx0YSAlIDYwO1xuICAgICAgICBhcnJheVJlc3VsdC5wdXNoKHNlY29uZHMgKyAncycpO1xuXG4gICAgICAgIHJldHVybiBhcnJheVJlc3VsdC5qb2luKCcgJyk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIG5leHQgZGF5IG9mIHdlZWtcbiAgICogQHBhcmFtIGRheU9mV2VlayBEYXkgb2Ygd2VlayAwPVN1bmRheSwgMT1Nb25kYXkuLi40PVRodXJzZGF5Li4uXG4gICAqIEBwYXJhbSBob3VyIHRoZSBzcGVjaWYgaG91clxuICAgKiBAcGFyYW0gbWludXRlIHRoZSBzcGVjaWZpYyBtaW51dGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbmV4dFdlZWtEYXlBbmRUaW1lKGRheU9mV2VlazogbnVtYmVyLCBob3VyID0gMCwgbWludXRlID0gMCk6IERhdGUge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCBub3cuZ2V0RGF0ZSgpICsgKCg3ICsgZGF5T2ZXZWVrIC0gbm93LmdldERheSgpKSAlIDcpLCBob3VyLCBtaW51dGUsIDAsIDApO1xuXG4gICAgaWYgKHJlc3VsdCA8IG5vdykge1xuICAgICAgcmVzdWx0LnNldERhdGUocmVzdWx0LmdldERhdGUoKSArIDcpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,73 @@
1
+ import { Observable } from 'rxjs';
2
+ export class ItFileUtils {
3
+ /**
4
+ * Return the file size string
5
+ * @param file the file
6
+ * @param decimals decimal to show
7
+ */
8
+ static getFileSizeString(file, decimals = 2) {
9
+ const bytes = file.size;
10
+ if (!+bytes) {
11
+ return '0 Bytes';
12
+ }
13
+ const k = 1024;
14
+ const dm = decimals < 0 ? 0 : decimals;
15
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
16
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
17
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
18
+ }
19
+ /**
20
+ * Convert a file to base64 string
21
+ * @param file the base64 string
22
+ */
23
+ static fileToBase64(file) {
24
+ const reader = new FileReader();
25
+ reader.readAsDataURL(file);
26
+ return new Observable(observer => {
27
+ reader.onload = (e) => {
28
+ const target = e.target;
29
+ if (!target?.result || target.result instanceof ArrayBuffer) {
30
+ return observer.error('Error on parse');
31
+ }
32
+ observer.next(target.result);
33
+ observer.complete();
34
+ };
35
+ reader.onerror = error => {
36
+ observer.error(error);
37
+ };
38
+ });
39
+ }
40
+ /**
41
+ * Convert base64 to Blob
42
+ * @param base64 the base64 string
43
+ * @param mimeType the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types">MIME type</a> (example 'application/pdf')
44
+ */
45
+ static base64ToBlob(base64, mimeType) {
46
+ const byteString = window.atob(base64);
47
+ const arrayBuffer = new ArrayBuffer(byteString.length);
48
+ const int8Array = new Uint8Array(arrayBuffer);
49
+ for (let i = 0; i < byteString.length; i++) {
50
+ int8Array[i] = byteString.charCodeAt(i);
51
+ }
52
+ return new Blob([int8Array], { type: mimeType });
53
+ }
54
+ /**
55
+ * Convert base64 to File
56
+ * @param base64 the base64 string
57
+ * @param mimeType the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types">MIME type</a> (example 'application/pdf')
58
+ * @param filename the file name
59
+ */
60
+ static base64ToFile(base64, mimeType, filename) {
61
+ const fileBlob = ItFileUtils.base64ToBlob(base64, mimeType);
62
+ return new File([fileBlob], filename, { type: mimeType });
63
+ }
64
+ /**
65
+ * Extract the MIME type from base64 string
66
+ * @param base64 the base64 string
67
+ */
68
+ static getMimeTypeFromBase64(base64) {
69
+ const mime = base64.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/);
70
+ return mime?.length ? mime[1] : undefined;
71
+ }
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL3V0aWxzL2ZpbGUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQyxNQUFNLE9BQU8sV0FBVztJQUV0Qjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQVUsRUFBRSxRQUFRLEdBQUcsQ0FBQztRQUN0RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1osT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNmLE1BQU0sRUFBRSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV4RSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFVO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQixPQUFPLElBQUksVUFBVSxDQUFTLFFBQVEsQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDcEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sWUFBWSxXQUFXLEVBQUUsQ0FBQztvQkFDNUQsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzFDLENBQUM7Z0JBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixDQUFDLENBQUM7WUFDRixNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQWMsRUFBRSxRQUFnQjtRQUN6RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQWMsRUFBRSxRQUFnQixFQUFFLFFBQWdCO1FBQzNFLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQWM7UUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDNUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgY2xhc3MgSXRGaWxlVXRpbHMge1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGZpbGUgc2l6ZSBzdHJpbmdcbiAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGVcbiAgICogQHBhcmFtIGRlY2ltYWxzIGRlY2ltYWwgdG8gc2hvd1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRGaWxlU2l6ZVN0cmluZyhmaWxlOiBGaWxlLCBkZWNpbWFscyA9IDIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ5dGVzID0gZmlsZS5zaXplO1xuICAgIGlmICghK2J5dGVzKSB7XG4gICAgICByZXR1cm4gJzAgQnl0ZXMnO1xuICAgIH1cblxuICAgIGNvbnN0IGsgPSAxMDI0O1xuICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzO1xuICAgIGNvbnN0IHNpemVzID0gWydCeXRlcycsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xuXG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuICAgIHJldHVybiBgJHtwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKGRtKSl9ICR7c2l6ZXNbaV19YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgZmlsZSB0byBiYXNlNjQgc3RyaW5nXG4gICAqIEBwYXJhbSBmaWxlIHRoZSBiYXNlNjQgc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZpbGVUb0Jhc2U2NChmaWxlOiBGaWxlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICBpZiAoIXRhcmdldD8ucmVzdWx0IHx8IHRhcmdldC5yZXN1bHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcignRXJyb3Igb24gcGFyc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlci5uZXh0KHRhcmdldC5yZXN1bHQpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYmFzZTY0IHRvIEJsb2JcbiAgICogQHBhcmFtIGJhc2U2NCB0aGUgYmFzZTY0IHN0cmluZ1xuICAgKiBAcGFyYW0gbWltZVR5cGUgdGhlIDxhIGhyZWY9XCJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jhc2ljc19vZl9IVFRQL01JTUVfdHlwZXMvQ29tbW9uX3R5cGVzXCI+TUlNRSB0eXBlPC9hPiAoZXhhbXBsZSAnYXBwbGljYXRpb24vcGRmJylcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYmFzZTY0VG9CbG9iKGJhc2U2NDogc3RyaW5nLCBtaW1lVHlwZTogc3RyaW5nKTogQmxvYiB7XG4gICAgY29uc3QgYnl0ZVN0cmluZyA9IHdpbmRvdy5hdG9iKGJhc2U2NCk7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICAgIGNvbnN0IGludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGludDhBcnJheVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtpbnQ4QXJyYXldLCB7IHR5cGU6IG1pbWVUeXBlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYmFzZTY0IHRvIEZpbGVcbiAgICogQHBhcmFtIGJhc2U2NCB0aGUgYmFzZTY0IHN0cmluZ1xuICAgKiBAcGFyYW0gbWltZVR5cGUgdGhlIDxhIGhyZWY9XCJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jhc2ljc19vZl9IVFRQL01JTUVfdHlwZXMvQ29tbW9uX3R5cGVzXCI+TUlNRSB0eXBlPC9hPiAoZXhhbXBsZSAnYXBwbGljYXRpb24vcGRmJylcbiAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIG5hbWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYmFzZTY0VG9GaWxlKGJhc2U2NDogc3RyaW5nLCBtaW1lVHlwZTogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogRmlsZSB7XG4gICAgY29uc3QgZmlsZUJsb2IgPSBJdEZpbGVVdGlscy5iYXNlNjRUb0Jsb2IoYmFzZTY0LCBtaW1lVHlwZSk7XG4gICAgcmV0dXJuIG5ldyBGaWxlKFtmaWxlQmxvYl0sIGZpbGVuYW1lLCB7IHR5cGU6IG1pbWVUeXBlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgdGhlIE1JTUUgdHlwZSBmcm9tIGJhc2U2NCBzdHJpbmdcbiAgICogQHBhcmFtIGJhc2U2NCB0aGUgYmFzZTY0IHN0cmluZ1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRNaW1lVHlwZUZyb21CYXNlNjQoYmFzZTY0OiBzdHJpbmcpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICBjb25zdCBtaW1lID0gYmFzZTY0Lm1hdGNoKC9kYXRhOihbYS16QS1aMC05XStcXC9bYS16QS1aMC05LS4rXSspLiosLiovKTtcbiAgICByZXR1cm4gbWltZT8ubGVuZ3RoID8gbWltZVsxXSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -0,0 +1,31 @@
1
+ /**
2
+ * General Email Regex (RFC 5322 Official Standard)
3
+ * http://emailregex.com/
4
+ */
5
+ export const EMAIL_REGEX = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
6
+ /**
7
+ * Phone number Regex
8
+ */
9
+ export const PHONE_NUMBER_REGEX = /^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{3})(?: *x(\d+))?\s*$/;
10
+ /**
11
+ * URL Regex
12
+ */
13
+ export const URL_REGEX = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/;
14
+ /**
15
+ * The italian tax code Regex (Codice Fiscale)
16
+ */
17
+ export const ITALIAN_TAX_CODE_REGEX = /^[A-Za-z]{6}[0-9]{2}[A-Za-z]{1}[0-9]{2}[A-Za-z]{1}[0-9]{3}[A-Za-z]{1}$/i;
18
+ /**
19
+ * The VAT number Regex (Partita iva)
20
+ */
21
+ export const VAT_NUMBER_REGEX = /^[0-9]{11}$/;
22
+ /**
23
+ * Italian CAP Regex
24
+ */
25
+ export const CAP_REGEX = /^[0-9]{5}$/;
26
+ /**
27
+ * IBAN Regex
28
+ * https://blog.marketto.it/en/2018/06/validate-any-country-iban/
29
+ */
30
+ export const IBAN_REGEX = /^(?:(?:IT|SM)\d{2}[A-Z]\d{22}|CY\d{2}[A-Z]\d{23}|NL\d{2}[A-Z]{4}\d{10}|LV\d{2}[A-Z]{4}\d{13}|(?:BG|BH|GB|IE)\d{2}[A-Z]{4}\d{14}|GI\d{2}[A-Z]{4}\d{15}|RO\d{2}[A-Z]{4}\d{16}|KW\d{2}[A-Z]{4}\d{22}|MT\d{2}[A-Z]{4}\d{23}|NO\d{13}|(?:DK|FI|GL|FO)\d{16}|MK\d{17}|(?:AT|EE|KZ|LU|XK)\d{18}|(?:BA|HR|LI|CH|CR)\d{19}|(?:GE|DE|LT|ME|RS)\d{20}|IL\d{21}|(?:AD|CZ|ES|MD|SA)\d{22}|PT\d{23}|(?:BE|IS)\d{24}|(?:FR|MR|MC)\d{25}|(?:AL|DO|LB|PL)\d{26}|(?:AZ|HU)\d{27}|(?:GR|MU)\d{28})$/i;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi91dGlscy9yZWdleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsNGFBQTRhLENBQUM7QUFFeGM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpRkFBaUYsQ0FBQztBQUVwSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxtTkFBbU4sQ0FBQztBQUU3Tzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLHlFQUF5RSxDQUFDO0FBRWhIOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0FBRTlDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQztBQUV0Qzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsbWRBQW1kLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYWwgRW1haWwgUmVnZXggKFJGQyA1MzIyIE9mZmljaWFsIFN0YW5kYXJkKVxuICogaHR0cDovL2VtYWlscmVnZXguY29tL1xuICovXG5leHBvcnQgY29uc3QgRU1BSUxfUkVHRVggPSAvKD86W2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKnxcIig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxXFx4MjMtXFx4NWJcXHg1ZC1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKlwiKUAoPzooPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/fFxcWyg/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/fFthLXowLTktXSpbYS16MC05XTooPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMS1cXHg1YVxceDUzLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkrKVxcXSkvO1xuXG4vKipcbiAqIFBob25lIG51bWJlciBSZWdleFxuICovXG5leHBvcnQgY29uc3QgUEhPTkVfTlVNQkVSX1JFR0VYID0gL15cXHMqKD86XFwrPyhcXGR7MSwzfSkpP1stLiAoXSooXFxkezN9KVstLiApXSooXFxkezN9KVstLiBdKihcXGR7M30pKD86ICp4KFxcZCspKT9cXHMqJC87XG5cbi8qKlxuICogVVJMIFJlZ2V4XG4gKi9cbmV4cG9ydCBjb25zdCBVUkxfUkVHRVggPSAvKGh0dHBzPzpcXC9cXC8oPzp3d3dcXC58KD8hd3d3KSlbYS16QS1aMC05XVthLXpBLVowLTktXStbYS16QS1aMC05XVxcLlteXFxzXXsyLH18d3d3XFwuW2EtekEtWjAtOV1bYS16QS1aMC05LV0rW2EtekEtWjAtOV1cXC5bXlxcc117Mix9fGh0dHBzPzpcXC9cXC8oPzp3d3dcXC58KD8hd3d3KSlbYS16QS1aMC05XStcXC5bXlxcc117Mix9fHd3d1xcLlthLXpBLVowLTldK1xcLlteXFxzXXsyLH0pLztcblxuLyoqXG4gKiBUaGUgaXRhbGlhbiB0YXggY29kZSBSZWdleCAoQ29kaWNlIEZpc2NhbGUpXG4gKi9cbmV4cG9ydCBjb25zdCBJVEFMSUFOX1RBWF9DT0RFX1JFR0VYID0gL15bQS1aYS16XXs2fVswLTldezJ9W0EtWmEtel17MX1bMC05XXsyfVtBLVphLXpdezF9WzAtOV17M31bQS1aYS16XXsxfSQvaTtcblxuLyoqXG4gKiBUaGUgVkFUIG51bWJlciBSZWdleCAoUGFydGl0YSBpdmEpXG4gKi9cbmV4cG9ydCBjb25zdCBWQVRfTlVNQkVSX1JFR0VYID0gL15bMC05XXsxMX0kLztcblxuLyoqXG4gKiBJdGFsaWFuIENBUCBSZWdleFxuICovXG5leHBvcnQgY29uc3QgQ0FQX1JFR0VYID0gL15bMC05XXs1fSQvO1xuXG4vKipcbiAqIElCQU4gUmVnZXhcbiAqIGh0dHBzOi8vYmxvZy5tYXJrZXR0by5pdC9lbi8yMDE4LzA2L3ZhbGlkYXRlLWFueS1jb3VudHJ5LWliYW4vXG4gKi9cbmV4cG9ydCBjb25zdCBJQkFOX1JFR0VYID0gL14oPzooPzpJVHxTTSlcXGR7Mn1bQS1aXVxcZHsyMn18Q1lcXGR7Mn1bQS1aXVxcZHsyM318TkxcXGR7Mn1bQS1aXXs0fVxcZHsxMH18TFZcXGR7Mn1bQS1aXXs0fVxcZHsxM318KD86Qkd8Qkh8R0J8SUUpXFxkezJ9W0EtWl17NH1cXGR7MTR9fEdJXFxkezJ9W0EtWl17NH1cXGR7MTV9fFJPXFxkezJ9W0EtWl17NH1cXGR7MTZ9fEtXXFxkezJ9W0EtWl17NH1cXGR7MjJ9fE1UXFxkezJ9W0EtWl17NH1cXGR7MjN9fE5PXFxkezEzfXwoPzpES3xGSXxHTHxGTylcXGR7MTZ9fE1LXFxkezE3fXwoPzpBVHxFRXxLWnxMVXxYSylcXGR7MTh9fCg/OkJBfEhSfExJfENIfENSKVxcZHsxOX18KD86R0V8REV8TFR8TUV8UlMpXFxkezIwfXxJTFxcZHsyMX18KD86QUR8Q1p8RVN8TUR8U0EpXFxkezIyfXxQVFxcZHsyM318KD86QkV8SVMpXFxkezI0fXwoPzpGUnxNUnxNQylcXGR7MjV9fCg/OkFMfERPfExCfFBMKVxcZHsyNn18KD86QVp8SFUpXFxkezI3fXwoPzpHUnxNVSlcXGR7Mjh9KSQvaTtcbiJdfQ==
@@ -0,0 +1,153 @@
1
+ import { Validators } from '@angular/forms';
2
+ import { CAP_REGEX, EMAIL_REGEX, IBAN_REGEX, ITALIAN_TAX_CODE_REGEX, PHONE_NUMBER_REGEX, URL_REGEX, VAT_NUMBER_REGEX } from '../utils/regex';
3
+ export class ItValidators {
4
+ static { this.SpecialCharacterPattern = '!@#$%&*_+=;:|,.'; }
5
+ /**
6
+ * Static pattern validator with custom error
7
+ * @param regex
8
+ * @param error
9
+ */
10
+ static customPattern(regex, error) {
11
+ return (control) => {
12
+ if (!control.value) {
13
+ // if control is empty return no error
14
+ return null;
15
+ }
16
+ // test the value of the control against the regexp supplied
17
+ const valid = regex.test(control.value);
18
+ // if true, return no error (no error), else return error passed in the second parameter
19
+ return valid ? null : error;
20
+ };
21
+ }
22
+ /**
23
+ * Set Validator if the condition is satisfied
24
+ * @param validator the validator to apply if the condition is true
25
+ * @param condition the condition
26
+ */
27
+ static conditional(validator, condition) {
28
+ return formControl => {
29
+ if (!formControl.parent) {
30
+ return null;
31
+ }
32
+ if (condition(formControl)) {
33
+ return validator(formControl);
34
+ }
35
+ return null;
36
+ };
37
+ }
38
+ /**
39
+ * Check whether our password and confirm password are a match
40
+ * @param control
41
+ * @param passwordControlName the password formControlName
42
+ * @param confirmControlName the confirmPassword formControlName
43
+ */
44
+ static passwordMatch(control, passwordControlName = 'password', confirmControlName = 'confirmPassword') {
45
+ const confirmControl = control.get(confirmControlName); // confirmPassword form control
46
+ if (!confirmControl) {
47
+ return null;
48
+ }
49
+ const passwordControl = control.get(passwordControlName); // password form control
50
+ const password = passwordControl?.value; // get password from our password form control
51
+ // compare is the password match
52
+ if ((password && !confirmControl.value) || (confirmControl.value && password !== confirmControl.value)) {
53
+ // if they don't match, set an error in our confirmPassword form control
54
+ confirmControl?.setErrors({ noPasswordMatch: true });
55
+ confirmControl?.markAsTouched();
56
+ return control;
57
+ }
58
+ if (password && passwordControl?.touched) {
59
+ confirmControl?.markAsTouched();
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * Password validator
65
+ * @param minLength minimum password length - default 10
66
+ * @param hasNumber check whether the entered password has a number - default true
67
+ * @param hasCapitalCase check whether the entered password has upper case letter - default true
68
+ * @param hasSmallCase check whether the entered password has a lower-case letter - default true
69
+ * @param hasSpecialCharacters check whether the entered password has a special character - default true
70
+ * @param required the field is required - default true
71
+ */
72
+ static password(minLength = 10, hasNumber = true, hasCapitalCase = true, hasSmallCase = true, hasSpecialCharacters = true, required = true) {
73
+ const validators = [Validators.minLength(minLength)];
74
+ if (hasNumber) {
75
+ validators.push(ItValidators.customPattern(/\d/, { hasNumber }));
76
+ }
77
+ if (hasCapitalCase) {
78
+ validators.push(ItValidators.customPattern(/[A-Z]/, { hasCapitalCase }));
79
+ }
80
+ if (hasSmallCase) {
81
+ validators.push(ItValidators.customPattern(/[a-z]/, { hasSmallCase }));
82
+ }
83
+ if (hasSpecialCharacters) {
84
+ validators.push(ItValidators.customPattern(new RegExp(`[${ItValidators.SpecialCharacterPattern}]`), { hasSpecialCharacters }));
85
+ }
86
+ if (required) {
87
+ validators.push(Validators.required);
88
+ }
89
+ return Validators.compose(validators);
90
+ }
91
+ /**
92
+ * Email validator
93
+ */
94
+ static get email() {
95
+ return Validators.compose([
96
+ Validators.email,
97
+ ItValidators.customPattern(EMAIL_REGEX, { invalidEmail: true })
98
+ ]);
99
+ }
100
+ /**
101
+ * Phone number validator
102
+ */
103
+ static get tel() {
104
+ return ItValidators.customPattern(PHONE_NUMBER_REGEX, { invalidTel: true });
105
+ }
106
+ /**
107
+ * URL validator
108
+ */
109
+ static get url() {
110
+ return ItValidators.customPattern(URL_REGEX, { invalidUrl: true });
111
+ }
112
+ /**
113
+ * Italian Tax Code validator
114
+ */
115
+ static get taxCode() {
116
+ return ItValidators.customPattern(ITALIAN_TAX_CODE_REGEX, { invalidTaxCode: true });
117
+ }
118
+ /**
119
+ * VAT Number validator
120
+ */
121
+ static get vatNumber() {
122
+ return ItValidators.customPattern(VAT_NUMBER_REGEX, { invalidVatNumber: true });
123
+ }
124
+ /**
125
+ * Italian Postal Code validator (CAP)
126
+ */
127
+ static get cap() {
128
+ return ItValidators.customPattern(CAP_REGEX, { invalidCap: true });
129
+ }
130
+ /**
131
+ * IBAN validator
132
+ */
133
+ static get iban() {
134
+ return ItValidators.customPattern(IBAN_REGEX, { invalidIban: true });
135
+ }
136
+ /**
137
+ * Check if value is a valid RegExp
138
+ */
139
+ static get regExp() {
140
+ return (control) => {
141
+ try {
142
+ if (control?.value) {
143
+ new RegExp(control.value);
144
+ }
145
+ }
146
+ catch (e) {
147
+ return { invalidRegex: true };
148
+ }
149
+ return null;
150
+ };
151
+ }
152
+ }
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXQtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL3ZhbGlkYXRvcnMvaXQtdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtELFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFVBQVUsRUFDVixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLE9BQU8sWUFBWTthQUNULDRCQUF1QixHQUFHLGlCQUFpQixDQUFDO0lBRTFEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQWEsRUFBRSxLQUF1QjtRQUNoRSxPQUFPLENBQUMsT0FBd0IsRUFBMkIsRUFBRTtZQUMzRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixzQ0FBc0M7Z0JBQ3RDLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELDREQUE0RDtZQUM1RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV4Qyx3RkFBd0Y7WUFDeEYsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzlCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFzQixFQUFFLFNBQWdEO1FBQ2hHLE9BQU8sV0FBVyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsSUFBSSxTQUFTLENB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MkIsRUFBRTtZQUMzRCxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7b0JBQ25CLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0lBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBDQVBfUkVHRVgsXG4gIEVNQUlMX1JFR0VYLFxuICBJQkFOX1JFR0VYLFxuICBJVEFMSUFOX1RBWF9DT0RFX1JFR0VYLFxuICBQSE9ORV9OVU1CRVJfUkVHRVgsXG4gIFVSTF9SRUdFWCxcbiAgVkFUX05VTUJFUl9SRUdFWFxufSBmcm9tICcuLi91dGlscy9yZWdleCc7XG5cbmV4cG9ydCBjbGFzcyBJdFZhbGlkYXRvcnMge1xuICBwdWJsaWMgc3RhdGljIFNwZWNpYWxDaGFyYWN0ZXJQYXR0ZXJuID0gJyFAIyQlJipfKz07OnwsLic7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBwYXR0ZXJuIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvclxuICAgKiBAcGFyYW0gcmVnZXhcbiAgICogQHBhcmFtIGVycm9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGN1c3RvbVBhdHRlcm4ocmVnZXg6IFJlZ0V4cCwgZXJyb3I6IFZhbGlkYXRpb25FcnJvcnMpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgLy8gaWYgY29udHJvbCBpcyBlbXB0eSByZXR1cm4gbm8gZXJyb3JcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIHRlc3QgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGFnYWluc3QgdGhlIHJlZ2V4cCBzdXBwbGllZFxuICAgICAgY29uc3QgdmFsaWQgPSByZWdleC50ZXN0KGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICAvLyBpZiB0cnVlLCByZXR1cm4gbm8gZXJyb3IgKG5vIGVycm9yKSwgZWxzZSByZXR1cm4gZXJyb3IgcGFzc2VkIGluIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgICByZXR1cm4gdmFsaWQgPyBudWxsIDogZXJyb3I7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVmFsaWRhdG9yIGlmIHRoZSBjb25kaXRpb24gaXMgc2F0aXNmaWVkXG4gICAqIEBwYXJhbSB2YWxpZGF0b3IgdGhlIHZhbGlkYXRvciB0byBhcHBseSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWVcbiAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvbmRpdGlvbmFsKHZhbGlkYXRvcjogVmFsaWRhdG9yRm4sIGNvbmRpdGlvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbik6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gZm9ybUNvbnRyb2wgPT4ge1xuICAgICAgaWYgKCFmb3JtQ29udHJvbC5wYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uKGZvcm1Db250cm9sKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdG9yKGZvcm1Db250cm9sKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciBvdXIgcGFzc3dvcmQgYW5kIGNvbmZpcm0gcGFzc3dvcmQgYXJlIGEgbWF0Y2hcbiAgICogQHBhcmFtIGNvbnRyb2xcbiAgICogQHBhcmFtIHBhc3N3b3JkQ29udHJvbE5hbWUgdGhlIHBhc3N3b3JkIGZvcm1Db250cm9sTmFtZVxuICAgKiBAcGFyYW0gY29uZmlybUNvbnRyb2xOYW1lIHRoZSBjb25maXJtUGFzc3dvcmQgZm9ybUNvbnRyb2xOYW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHBhc3N3b3JkTWF0Y2goY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXNzd29yZENvbnRyb2xOYW1lID0gJ3Bhc3N3b3JkJywgY29uZmlybUNvbnRyb2xOYW1lID0gJ2NvbmZpcm1QYXNzd29yZCcpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICBjb25zdCBjb25maXJtQ29udHJvbCA9IGNvbnRyb2wuZ2V0KGNvbmZpcm1Db250cm9sTmFtZSk7IC8vIGNvbmZpcm1QYXNzd29yZCBmb3JtIGNvbnRyb2xcbiAgICBpZiAoIWNvbmZpcm1Db250cm9sKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzd29yZENvbnRyb2wgPSBjb250cm9sLmdldChwYXNzd29yZENvbnRyb2xOYW1lKTsgLy8gcGFzc3dvcmQgZm9ybSBjb250cm9sXG4gICAgY29uc3QgcGFzc3dvcmQgPSBwYXNzd29yZENvbnRyb2w/LnZhbHVlOyAvLyBnZXQgcGFzc3dvcmQgZnJvbSBvdXIgcGFzc3dvcmQgZm9ybSBjb250cm9sXG5cbiAgICAvLyBjb21wYXJlIGlzIHRoZSBwYXNzd29yZCBtYXRjaFxuICAgIGlmICgocGFzc3dvcmQgJiYgIWNvbmZpcm1Db250cm9sLnZhbHVlKSB8fCAoY29uZmlybUNvbnRyb2wudmFsdWUgJiYgcGFzc3dvcmQgIT09IGNvbmZpcm1Db250cm9sLnZhbHVlKSkge1xuICAgICAgLy8gaWYgdGhleSBkb24ndCBtYXRjaCwgc2V0IGFuIGVycm9yIGluIG91ciBjb25maXJtUGFzc3dvcmQgZm9ybSBjb250cm9sXG4gICAgICBjb25maXJtQ29udHJvbD8uc2V0RXJyb3JzKHsgbm9QYXNzd29yZE1hdGNoOiB0cnVlIH0pO1xuICAgICAgY29uZmlybUNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybiBjb250cm9sO1xuICAgIH1cblxuICAgIGlmIChwYXNzd29yZCAmJiBwYXNzd29yZENvbnRyb2w/LnRvdWNoZWQpIHtcbiAgICAgIGNvbmZpcm1Db250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhc3N3b3JkIHZhbGlkYXRvclxuICAgKiBAcGFyYW0gbWluTGVuZ3RoIG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoIC0gZGVmYXVsdCAxMFxuICAgKiBAcGFyYW0gaGFzTnVtYmVyIGNoZWNrIHdoZXRoZXIgdGhlIGVudGVyZWQgcGFzc3dvcmQgaGFzIGEgbnVtYmVyIC0gZGVmYXVsdCB0cnVlXG4gICAqIEBwYXJhbSBoYXNDYXBpdGFsQ2FzZSBjaGVjayB3aGV0aGVyIHRoZSBlbnRlcmVkIHBhc3N3b3JkIGhhcyB1cHBlciBjYXNlIGxldHRlciAtIGRlZmF1bHQgdHJ1ZVxuICAgKiBAcGFyYW0gaGFzU21hbGxDYXNlIGNoZWNrIHdoZXRoZXIgdGhlIGVudGVyZWQgcGFzc3dvcmQgaGFzIGEgbG93ZXItY2FzZSBsZXR0ZXIgLSBkZWZhdWx0IHRydWVcbiAgICogQHBhcmFtIGhhc1NwZWNpYWxDaGFyYWN0ZXJzIGNoZWNrIHdoZXRoZXIgdGhlIGVudGVyZWQgcGFzc3dvcmQgaGFzIGEgc3BlY2lhbCBjaGFyYWN0ZXIgLSBkZWZhdWx0IHRydWVcbiAgICogQHBhcmFtIHJlcXVpcmVkIHRoZSBmaWVsZCBpcyByZXF1aXJlZCAtIGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwYXNzd29yZChtaW5MZW5ndGggPSAxMCwgaGFzTnVtYmVyID0gdHJ1ZSwgaGFzQ2FwaXRhbENhc2UgPSB0cnVlLCBoYXNTbWFsbENhc2UgPSB0cnVlLCBoYXNTcGVjaWFsQ2hhcmFjdGVycyA9IHRydWUsIHJlcXVpcmVkID0gdHJ1ZSk6IFZhbGlkYXRvckZuIHtcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbVmFsaWRhdG9ycy5taW5MZW5ndGgobWluTGVuZ3RoKV07XG4gICAgaWYgKGhhc051bWJlcikge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKEl0VmFsaWRhdG9ycy5jdXN0b21QYXR0ZXJuKC9cXGQvLCB7IGhhc051bWJlciB9KSk7XG4gICAgfVxuICAgIGlmIChoYXNDYXBpdGFsQ2FzZSkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKEl0VmFsaWRhdG9ycy5jdXN0b21QYXR0ZXJuKC9bQS1aXS8sIHsgaGFzQ2FwaXRhbENhc2UgfSkpO1xuICAgIH1cbiAgICBpZiAoaGFzU21hbGxDYXNlKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goSXRWYWxpZGF0b3JzLmN1c3RvbVBhdHRlcm4oL1thLXpdLywgeyBoYXNTbWFsbENhc2UgfSkpO1xuICAgIH1cbiAgICBpZiAoaGFzU3BlY2lhbENoYXJhY3RlcnMpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybihuZXcgUmVnRXhwKGBbJHtJdFZhbGlkYXRvcnMuU3BlY2lhbENoYXJhY3RlclBhdHRlcm59XWApLCB7IGhhc1NwZWNpYWxDaGFyYWN0ZXJzIH0pKTtcbiAgICB9XG4gICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgfVxuICAgIHJldHVybiA8VmFsaWRhdG9yRm4+VmFsaWRhdG9ycy5jb21wb3NlKHZhbGlkYXRvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHZhbGlkYXRvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQgZW1haWwoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiA8VmFsaWRhdG9yRm4+VmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgIFZhbGlkYXRvcnMuZW1haWwsXG4gICAgICBJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybihFTUFJTF9SRUdFWCwgeyBpbnZhbGlkRW1haWw6IHRydWUgfSlcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaG9uZSBudW1iZXIgdmFsaWRhdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldCB0ZWwoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiBJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybihQSE9ORV9OVU1CRVJfUkVHRVgsIHsgaW52YWxpZFRlbDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVUkwgdmFsaWRhdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldCB1cmwoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiBJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybihVUkxfUkVHRVgsIHsgaW52YWxpZFVybDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGFsaWFuIFRheCBDb2RlIHZhbGlkYXRvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQgdGF4Q29kZSgpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIEl0VmFsaWRhdG9ycy5jdXN0b21QYXR0ZXJuKElUQUxJQU5fVEFYX0NPREVfUkVHRVgsIHsgaW52YWxpZFRheENvZGU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVkFUIE51bWJlciB2YWxpZGF0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHZhdE51bWJlcigpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIEl0VmFsaWRhdG9ycy5jdXN0b21QYXR0ZXJuKFZBVF9OVU1CRVJfUkVHRVgsIHsgaW52YWxpZFZhdE51bWJlcjogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGFsaWFuIFBvc3RhbCBDb2RlIHZhbGlkYXRvciAoQ0FQKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQgY2FwKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gSXRWYWxpZGF0b3JzLmN1c3RvbVBhdHRlcm4oQ0FQX1JFR0VYLCB7IGludmFsaWRDYXA6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSUJBTiB2YWxpZGF0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGliYW4oKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiBJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybihJQkFOX1JFR0VYLCB7IGludmFsaWRJYmFuOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhbHVlIGlzIGEgdmFsaWQgUmVnRXhwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldCByZWdFeHAoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGNvbnRyb2w/LnZhbHVlKSB7XG4gICAgICAgICAgbmV3IFJlZ0V4cChjb250cm9sLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBpbnZhbGlkUmVnZXg6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==