@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0

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 (262) hide show
  1. package/core/constants/autocomplete.const.d.ts +4 -0
  2. package/core/constants/context-selector.const.d.ts +1 -0
  3. package/core/constants/gantt.const.d.ts +7 -0
  4. package/core/constants/hyperlink.const.d.ts +1 -0
  5. package/core/constants/inline-edit.const.d.ts +4 -0
  6. package/core/constants/kanban.const.d.ts +2 -0
  7. package/core/constants/pin-code-field.const.d.ts +5 -0
  8. package/core/constants/rating-scale.const.d.ts +1 -0
  9. package/core/constants/spotlight.const.d.ts +8 -0
  10. package/core/constants/star-rating.const.d.ts +4 -0
  11. package/core/constants/stepper.const.d.ts +1 -0
  12. package/core/constants/tiered-menu.const.d.ts +3 -0
  13. package/core/types/autocomplete.type.d.ts +9 -0
  14. package/core/types/chat.type.d.ts +12 -0
  15. package/core/types/checkbox-list.type.d.ts +12 -0
  16. package/core/types/gantt.type.d.ts +22 -0
  17. package/core/types/grid-menu.type.d.ts +13 -0
  18. package/core/types/hyperlink.type.d.ts +1 -0
  19. package/core/types/image-cropper.type.d.ts +20 -0
  20. package/core/types/inline-edit.type.d.ts +26 -0
  21. package/core/types/kanban.type.d.ts +36 -0
  22. package/core/types/panel.type.d.ts +16 -0
  23. package/core/types/profile-picture-picker.type.d.ts +9 -0
  24. package/core/types/rating-scale.type.d.ts +5 -0
  25. package/core/types/select-button.type.d.ts +1 -0
  26. package/core/types/spotlight.type.d.ts +34 -0
  27. package/core/types/star-rating.type.d.ts +1 -0
  28. package/core/types/stepper.type.d.ts +20 -0
  29. package/core/types/table-column.type.d.ts +3 -1
  30. package/core/types/table-options.type.d.ts +8 -2
  31. package/core/types/table.type.d.ts +1 -1
  32. package/core/types/tiered-menu.type.d.ts +16 -0
  33. package/core/types/tree.type.d.ts +25 -0
  34. package/core/types/workspace-switch.type.d.ts +6 -0
  35. package/core/utils/body-scroll.util.d.ts +2 -0
  36. package/core/utils/roving-focus.util.d.ts +2 -0
  37. package/core/utils/selection.util.d.ts +3 -0
  38. package/core/utils/tree.util.d.ts +4 -0
  39. package/esm2022/core/constants/autocomplete.const.mjs +5 -0
  40. package/esm2022/core/constants/context-selector.const.mjs +2 -0
  41. package/esm2022/core/constants/gantt.const.mjs +7 -0
  42. package/esm2022/core/constants/hyperlink.const.mjs +2 -1
  43. package/esm2022/core/constants/inline-edit.const.mjs +5 -0
  44. package/esm2022/core/constants/kanban.const.mjs +3 -0
  45. package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
  46. package/esm2022/core/constants/rating-scale.const.mjs +2 -0
  47. package/esm2022/core/constants/spotlight.const.mjs +9 -0
  48. package/esm2022/core/constants/star-rating.const.mjs +5 -0
  49. package/esm2022/core/constants/stepper.const.mjs +2 -0
  50. package/esm2022/core/constants/table.const.mjs +2 -2
  51. package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
  52. package/esm2022/core/types/autocomplete.type.mjs +2 -0
  53. package/esm2022/core/types/chat.type.mjs +2 -0
  54. package/esm2022/core/types/checkbox-list.type.mjs +2 -0
  55. package/esm2022/core/types/gantt.type.mjs +2 -0
  56. package/esm2022/core/types/grid-menu.type.mjs +2 -0
  57. package/esm2022/core/types/hyperlink.type.mjs +1 -1
  58. package/esm2022/core/types/image-cropper.type.mjs +2 -0
  59. package/esm2022/core/types/inline-edit.type.mjs +2 -0
  60. package/esm2022/core/types/kanban.type.mjs +2 -0
  61. package/esm2022/core/types/panel.type.mjs +9 -0
  62. package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
  63. package/esm2022/core/types/rating-scale.type.mjs +2 -0
  64. package/esm2022/core/types/select-button.type.mjs +1 -1
  65. package/esm2022/core/types/spotlight.type.mjs +2 -0
  66. package/esm2022/core/types/star-rating.type.mjs +2 -0
  67. package/esm2022/core/types/stepper.type.mjs +7 -0
  68. package/esm2022/core/types/table-column.type.mjs +1 -1
  69. package/esm2022/core/types/table-options.type.mjs +1 -1
  70. package/esm2022/core/types/table.type.mjs +1 -1
  71. package/esm2022/core/types/tiered-menu.type.mjs +2 -0
  72. package/esm2022/core/types/tree.type.mjs +2 -0
  73. package/esm2022/core/types/workspace-switch.type.mjs +2 -0
  74. package/esm2022/core/utils/body-scroll.util.mjs +19 -0
  75. package/esm2022/core/utils/combobox.util.mjs +3 -2
  76. package/esm2022/core/utils/roving-focus.util.mjs +20 -0
  77. package/esm2022/core/utils/selection.util.mjs +13 -0
  78. package/esm2022/core/utils/string.util.mjs +8 -3
  79. package/esm2022/core/utils/tree.util.mjs +23 -0
  80. package/esm2022/features/accordion/accordion.component.mjs +2 -2
  81. package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
  82. package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
  83. package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
  84. package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
  85. package/esm2022/features/card-list/card/card.component.mjs +63 -99
  86. package/esm2022/features/chat/chat.component.mjs +126 -0
  87. package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
  88. package/esm2022/features/combobox/combobox.component.mjs +20 -8
  89. package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
  90. package/esm2022/features/filters/filters.component.mjs +1 -1
  91. package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
  92. package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
  93. package/esm2022/features/gantt/gantt.component.mjs +89 -0
  94. package/esm2022/features/gantt/gantt.engine.mjs +662 -0
  95. package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
  96. package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
  97. package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
  98. package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
  99. package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
  100. package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
  101. package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
  102. package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
  103. package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
  104. package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
  105. package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
  106. package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
  107. package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
  108. package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
  109. package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
  110. package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
  111. package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
  112. package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
  113. package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
  114. package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
  115. package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
  116. package/esm2022/features/kanban/kanban.component.mjs +198 -0
  117. package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
  118. package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
  119. package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
  120. package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
  121. package/esm2022/features/paginator/paginator.component.mjs +8 -3
  122. package/esm2022/features/panel/panel.component.mjs +43 -11
  123. package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
  124. package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
  125. package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
  126. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
  127. package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
  128. package/esm2022/features/select-button/select-button.component.mjs +7 -4
  129. package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
  130. package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
  131. package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
  132. package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
  133. package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
  134. package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
  135. package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
  136. package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
  137. package/esm2022/features/stepper/stepper.component.mjs +86 -0
  138. package/esm2022/features/switch/switch.component.mjs +12 -8
  139. package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
  140. package/esm2022/features/tab/tab.component.mjs +4 -4
  141. package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
  142. package/esm2022/features/table/table.component.mjs +220 -29
  143. package/esm2022/features/table/utils/table-data.util.mjs +71 -8
  144. package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
  145. package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
  146. package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
  147. package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
  148. package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
  149. package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
  150. package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
  151. package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
  152. package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
  153. package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
  154. package/esm2022/features/tree/tree.component.mjs +211 -0
  155. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
  156. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
  157. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
  158. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
  159. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
  160. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
  161. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
  162. package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
  163. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
  164. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
  165. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
  166. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
  167. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
  168. package/esm2022/locales/en.json +351 -3
  169. package/esm2022/locales/es-CO.json +351 -3
  170. package/esm2022/locales/pt.json +351 -3
  171. package/esm2022/providers/features.provider.mjs +40 -4
  172. package/esm2022/public-api.mjs +56 -3
  173. package/features/accordion/accordion.component.d.ts +1 -1
  174. package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
  175. package/features/autocomplete/autocomplete.component.d.ts +102 -0
  176. package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
  177. package/features/card-list/card/card.component.d.ts +14 -34
  178. package/features/chat/chat.component.d.ts +31 -0
  179. package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
  180. package/features/combobox/combobox.component.d.ts +2 -1
  181. package/features/context-selector/context-selector.component.d.ts +37 -0
  182. package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
  183. package/features/gantt/gantt-date.utils.d.ts +36 -0
  184. package/features/gantt/gantt.component.d.ts +24 -0
  185. package/features/gantt/gantt.engine.d.ts +52 -0
  186. package/features/grid-menu/grid-menu.component.d.ts +29 -0
  187. package/features/hyperlink/hyperlink.component.d.ts +2 -1
  188. package/features/image-cropper/image-cropper.component.d.ts +43 -0
  189. package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
  190. package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
  191. package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
  192. package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
  193. package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
  194. package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
  195. package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
  196. package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
  197. package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
  198. package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
  199. package/features/inline-edit/inline-edit.component.d.ts +13 -0
  200. package/features/interactive-content/interactive-content.directive.d.ts +31 -0
  201. package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
  202. package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
  203. package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
  204. package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
  205. package/features/kanban/kanban.component.d.ts +32 -0
  206. package/features/kanban/services/kanban-event.service.d.ts +15 -0
  207. package/features/loading-state/loading-state.component.d.ts +0 -2
  208. package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
  209. package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
  210. package/features/panel/panel.component.d.ts +12 -3
  211. package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
  212. package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
  213. package/features/rating-scale/rating-scale.component.d.ts +24 -0
  214. package/features/select-button/select-button.component.d.ts +2 -1
  215. package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
  216. package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
  217. package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
  218. package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
  219. package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
  220. package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
  221. package/features/spotlight/spotlight.component.d.ts +59 -0
  222. package/features/star-rating/star-rating.component.d.ts +26 -0
  223. package/features/stepper/stepper.component.d.ts +23 -0
  224. package/features/switch/switch.component.d.ts +2 -1
  225. package/features/tab/tab.component.d.ts +1 -1
  226. package/features/table/components/table-cell-content.component.d.ts +4 -3
  227. package/features/table/table.component.d.ts +40 -5
  228. package/features/table/utils/table-data.util.d.ts +1 -0
  229. package/features/table/utils/table-layout.util.d.ts +1 -0
  230. package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
  231. package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
  232. package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
  233. package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
  234. package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
  235. package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
  236. package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
  237. package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
  238. package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
  239. package/features/tree/tree.component.d.ts +37 -0
  240. package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
  241. package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
  242. package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
  243. package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
  244. package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
  245. package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
  246. package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
  247. package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
  248. package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
  249. package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
  250. package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
  251. package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
  252. package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
  253. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
  254. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  255. package/package.json +8 -8
  256. package/public-api.d.ts +72 -2
  257. package/src/locales/en.json +353 -15
  258. package/src/locales/es-CO.json +352 -14
  259. package/src/locales/pt.json +352 -14
  260. package/styles/sdc-global-variables.scss +1 -1
  261. package/styles.css +1 -1
  262. /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
@@ -0,0 +1,126 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { resolveTranslatableText } from '../../core/utils/i18n.util';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ const CHAT_EMPTY_LABEL_KEY = 'platform.datacore.chat.empty';
9
+ export class ChatComponent {
10
+ translate = inject(TranslateService);
11
+ cdr = inject(ChangeDetectorRef);
12
+ messageListElement;
13
+ messages = [];
14
+ autoScroll = true;
15
+ showAvatar = true;
16
+ showTimestamp = true;
17
+ emptyLabel;
18
+ attachmentOpened = new EventEmitter();
19
+ messageClicked = new EventEmitter();
20
+ set messageList(value) {
21
+ this.messageListElement = value;
22
+ this.scheduleAutoScroll();
23
+ }
24
+ get messageList() {
25
+ return this.messageListElement;
26
+ }
27
+ constructor() {
28
+ this.translate.onLangChange.pipe(takeUntilDestroyed()).subscribe(() => this.cdr.markForCheck());
29
+ }
30
+ ngOnChanges() {
31
+ this.scheduleAutoScroll();
32
+ }
33
+ trackByMessageId(_index, message) {
34
+ return message.id;
35
+ }
36
+ get resolvedEmptyLabel() {
37
+ return resolveTranslatableText(this.translate, this.emptyLabel, CHAT_EMPTY_LABEL_KEY);
38
+ }
39
+ get initials() {
40
+ return (message) => this.buildInitials(message.senderName);
41
+ }
42
+ handleMessageClick(message) {
43
+ this.messageClicked.emit(message);
44
+ }
45
+ handleAttachmentClick(message, event) {
46
+ event.stopPropagation();
47
+ this.attachmentOpened.emit(message);
48
+ }
49
+ resolveAttachmentLabel(message) {
50
+ return message.attachmentName?.trim()
51
+ ?? this.translate.instant('platform.datacore.chat.attachment');
52
+ }
53
+ resolveStatusLabel(status) {
54
+ if (!status) {
55
+ return null;
56
+ }
57
+ return this.translate.instant(`platform.datacore.chat.status.${status}`);
58
+ }
59
+ resolveTimestamp(sentAt) {
60
+ if (!sentAt) {
61
+ return null;
62
+ }
63
+ const date = sentAt instanceof Date ? sentAt : new Date(sentAt);
64
+ if (Number.isNaN(date.getTime())) {
65
+ return null;
66
+ }
67
+ const locale = resolveChatLocale(this.translate.currentLang);
68
+ return new Intl.DateTimeFormat(locale, {
69
+ day: '2-digit',
70
+ hour: '2-digit',
71
+ minute: '2-digit',
72
+ month: '2-digit'
73
+ }).format(date);
74
+ }
75
+ buildInitials(senderName) {
76
+ const parts = senderName.split(/\s+/).filter(Boolean);
77
+ const first = parts[0]?.charAt(0).toUpperCase() ?? '';
78
+ const last = parts.length > 1 ? parts[parts.length - 1]?.charAt(0).toUpperCase() ?? '' : '';
79
+ return `${first}${last}` || 'U';
80
+ }
81
+ scheduleAutoScroll() {
82
+ if (!this.autoScroll || !this.messages.length) {
83
+ return;
84
+ }
85
+ queueMicrotask(() => {
86
+ const list = this.messageListElement?.nativeElement;
87
+ if (!list) {
88
+ return;
89
+ }
90
+ list.scrollTop = list.scrollHeight;
91
+ });
92
+ }
93
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
94
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChatComponent, isStandalone: true, selector: "sdc-chat", inputs: { messages: "messages", autoScroll: "autoScroll", showAvatar: "showAvatar", showTimestamp: "showTimestamp", emptyLabel: "emptyLabel" }, outputs: { attachmentOpened: "attachmentOpened", messageClicked: "messageClicked" }, viewQueries: [{ propertyName: "messageList", first: true, predicate: ["messageList"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"sdc-chat\" [class.sdc-chat--empty]=\"!messages.length\">\n <div *ngIf=\"!messages.length\" class=\"sdc-chat__empty\">\n {{ resolvedEmptyLabel }}\n </div>\n\n <ul *ngIf=\"messages.length\" #messageList class=\"sdc-chat__list\">\n <li\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\n class=\"sdc-chat__message\"\n [class.sdc-chat__message--mine]=\"message.isMine\"\n [class.sdc-chat__message--theirs]=\"!message.isMine\"\n (click)=\"handleMessageClick(message)\"\n (keydown.enter)=\"handleMessageClick(message)\"\n (keydown.space)=\"handleMessageClick(message)\"\n >\n <span *ngIf=\"showAvatar\" class=\"sdc-chat__avatar\">\n <img\n *ngIf=\"message.avatarUrl; else initialsTemplate\"\n class=\"sdc-chat__avatarImage\"\n [alt]=\"message.senderName\"\n [src]=\"message.avatarUrl\"\n width=\"32\"\n height=\"32\"\n />\n\n <ng-template #initialsTemplate>\n <span class=\"sdc-chat__avatarFallback\">{{ initials(message) }}</span>\n </ng-template>\n </span>\n\n <span class=\"sdc-chat__bubble\">\n <span class=\"sdc-chat__meta\">\n <span class=\"sdc-chat__sender\">{{ message.senderName }}</span>\n <span *ngIf=\"showTimestamp && resolveTimestamp(message.sentAt) as timestamp\" class=\"sdc-chat__timestamp\">\n {{ timestamp }}\n </span>\n </span>\n\n <span class=\"sdc-chat__text\">{{ message.text }}</span>\n\n <button\n *ngIf=\"message.attachmentUrl\"\n class=\"sdc-chat__attachment\"\n type=\"button\"\n (click)=\"handleAttachmentClick(message, $event)\"\n >\n {{ resolveAttachmentLabel(message) }}\n </button>\n\n <span *ngIf=\"message.isMine && resolveStatusLabel(message.status) as statusLabel\" class=\"sdc-chat__status\">\n {{ statusLabel }}\n </span>\n </span>\n </li>\n </ul>\n</div>\n", styles: [":host{display:block}.sdc-chat{background:var(--sdc-surface-bg, #ffffff);border:1px solid var(--sdc-surface-border-color, #dedce5);border-radius:1rem;min-height:12rem;overflow:hidden}.sdc-chat--empty{align-items:center;display:flex;justify-content:center}.sdc-chat__empty{color:var(--sdc-text-muted, #6b7280);font-size:.95rem;padding:2rem;text-align:center}.sdc-chat__list{display:flex;flex-direction:column;gap:.875rem;max-height:28rem;overflow-y:auto;padding:1rem}.sdc-chat__message{align-items:flex-end;display:flex;gap:.75rem}.sdc-chat__message--mine{flex-direction:row-reverse}.sdc-chat__avatar,.sdc-chat__avatarFallback,.sdc-chat__avatarImage{border-radius:999px;flex:0 0 auto;height:2.25rem;width:2.25rem}.sdc-chat__avatar{align-items:center;display:inline-flex;justify-content:center}.sdc-chat__avatarFallback{align-items:center;background:#428bca1f;color:var(--p-primary-color, #428bca);display:inline-flex;font-size:.8rem;font-weight:700;justify-content:center}.sdc-chat__avatarImage{display:block;object-fit:cover}.sdc-chat__bubble{background:#1118270a;border-radius:1rem;color:var(--sdc-text-default, #111827);display:flex;flex:0 1 75%;flex-direction:column;gap:.45rem;padding:.75rem .9rem}.sdc-chat__message--mine .sdc-chat__bubble{background:#428bca1f}.sdc-chat__meta{align-items:center;display:flex;gap:.5rem;justify-content:space-between}.sdc-chat__sender{font-size:.85rem;font-weight:700}.sdc-chat__timestamp,.sdc-chat__status{color:var(--sdc-text-muted, #6b7280);font-size:.75rem}.sdc-chat__text{line-height:1.5;white-space:pre-wrap;word-break:break-word}.sdc-chat__attachment{align-self:flex-start;background:transparent;border:0;color:var(--p-primary-color, #428bca);cursor:pointer;font-size:.85rem;font-weight:600;padding:0;text-decoration:underline}@media (max-width: 640px){.sdc-chat__bubble{flex-basis:88%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
95
+ }
96
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComponent, decorators: [{
97
+ type: Component,
98
+ args: [{ selector: 'sdc-chat', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div class=\"sdc-chat\" [class.sdc-chat--empty]=\"!messages.length\">\n <div *ngIf=\"!messages.length\" class=\"sdc-chat__empty\">\n {{ resolvedEmptyLabel }}\n </div>\n\n <ul *ngIf=\"messages.length\" #messageList class=\"sdc-chat__list\">\n <li\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\n class=\"sdc-chat__message\"\n [class.sdc-chat__message--mine]=\"message.isMine\"\n [class.sdc-chat__message--theirs]=\"!message.isMine\"\n (click)=\"handleMessageClick(message)\"\n (keydown.enter)=\"handleMessageClick(message)\"\n (keydown.space)=\"handleMessageClick(message)\"\n >\n <span *ngIf=\"showAvatar\" class=\"sdc-chat__avatar\">\n <img\n *ngIf=\"message.avatarUrl; else initialsTemplate\"\n class=\"sdc-chat__avatarImage\"\n [alt]=\"message.senderName\"\n [src]=\"message.avatarUrl\"\n width=\"32\"\n height=\"32\"\n />\n\n <ng-template #initialsTemplate>\n <span class=\"sdc-chat__avatarFallback\">{{ initials(message) }}</span>\n </ng-template>\n </span>\n\n <span class=\"sdc-chat__bubble\">\n <span class=\"sdc-chat__meta\">\n <span class=\"sdc-chat__sender\">{{ message.senderName }}</span>\n <span *ngIf=\"showTimestamp && resolveTimestamp(message.sentAt) as timestamp\" class=\"sdc-chat__timestamp\">\n {{ timestamp }}\n </span>\n </span>\n\n <span class=\"sdc-chat__text\">{{ message.text }}</span>\n\n <button\n *ngIf=\"message.attachmentUrl\"\n class=\"sdc-chat__attachment\"\n type=\"button\"\n (click)=\"handleAttachmentClick(message, $event)\"\n >\n {{ resolveAttachmentLabel(message) }}\n </button>\n\n <span *ngIf=\"message.isMine && resolveStatusLabel(message.status) as statusLabel\" class=\"sdc-chat__status\">\n {{ statusLabel }}\n </span>\n </span>\n </li>\n </ul>\n</div>\n", styles: [":host{display:block}.sdc-chat{background:var(--sdc-surface-bg, #ffffff);border:1px solid var(--sdc-surface-border-color, #dedce5);border-radius:1rem;min-height:12rem;overflow:hidden}.sdc-chat--empty{align-items:center;display:flex;justify-content:center}.sdc-chat__empty{color:var(--sdc-text-muted, #6b7280);font-size:.95rem;padding:2rem;text-align:center}.sdc-chat__list{display:flex;flex-direction:column;gap:.875rem;max-height:28rem;overflow-y:auto;padding:1rem}.sdc-chat__message{align-items:flex-end;display:flex;gap:.75rem}.sdc-chat__message--mine{flex-direction:row-reverse}.sdc-chat__avatar,.sdc-chat__avatarFallback,.sdc-chat__avatarImage{border-radius:999px;flex:0 0 auto;height:2.25rem;width:2.25rem}.sdc-chat__avatar{align-items:center;display:inline-flex;justify-content:center}.sdc-chat__avatarFallback{align-items:center;background:#428bca1f;color:var(--p-primary-color, #428bca);display:inline-flex;font-size:.8rem;font-weight:700;justify-content:center}.sdc-chat__avatarImage{display:block;object-fit:cover}.sdc-chat__bubble{background:#1118270a;border-radius:1rem;color:var(--sdc-text-default, #111827);display:flex;flex:0 1 75%;flex-direction:column;gap:.45rem;padding:.75rem .9rem}.sdc-chat__message--mine .sdc-chat__bubble{background:#428bca1f}.sdc-chat__meta{align-items:center;display:flex;gap:.5rem;justify-content:space-between}.sdc-chat__sender{font-size:.85rem;font-weight:700}.sdc-chat__timestamp,.sdc-chat__status{color:var(--sdc-text-muted, #6b7280);font-size:.75rem}.sdc-chat__text{line-height:1.5;white-space:pre-wrap;word-break:break-word}.sdc-chat__attachment{align-self:flex-start;background:transparent;border:0;color:var(--p-primary-color, #428bca);cursor:pointer;font-size:.85rem;font-weight:600;padding:0;text-decoration:underline}@media (max-width: 640px){.sdc-chat__bubble{flex-basis:88%}}\n"] }]
99
+ }], ctorParameters: () => [], propDecorators: { messages: [{
100
+ type: Input
101
+ }], autoScroll: [{
102
+ type: Input
103
+ }], showAvatar: [{
104
+ type: Input
105
+ }], showTimestamp: [{
106
+ type: Input
107
+ }], emptyLabel: [{
108
+ type: Input
109
+ }], attachmentOpened: [{
110
+ type: Output
111
+ }], messageClicked: [{
112
+ type: Output
113
+ }], messageList: [{
114
+ type: ViewChild,
115
+ args: ['messageList']
116
+ }] } });
117
+ function resolveChatLocale(language) {
118
+ if (language === 'en') {
119
+ return 'en-US';
120
+ }
121
+ if (language === 'es-CO') {
122
+ return 'es-CO';
123
+ }
124
+ return 'pt-BR';
125
+ }
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NoYXQvY2hhdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NoYXQvY2hhdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFFckUsTUFBTSxvQkFBb0IsR0FBRyw4QkFBOEIsQ0FBQztBQVc1RCxNQUFNLE9BQU8sYUFBYTtJQUNQLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyQyxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDekMsa0JBQWtCLENBQThCO0lBRS9DLFFBQVEsR0FBcUIsRUFBRSxDQUFDO0lBQ2hDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDbEIsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNsQixhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLFVBQVUsQ0FBVTtJQUVuQixnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztJQUN0RCxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7SUFFOUQsSUFDSSxXQUFXLENBQUMsS0FBNkM7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Z0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0gsV0FBVztzQkFEZCxTQUFTO3VCQUFDLGFBQWE7O0FBaUcxQixTQUFTLGlCQUFpQixDQUFDLFFBQTRCO0lBQ3JELElBQUksUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3RCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN6QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBTZGNDaGF0TWVzc2FnZSwgU2RjQ2hhdE1lc3NhZ2VTdGF0dXMgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2NoYXQudHlwZSc7XG5pbXBvcnQgeyByZXNvbHZlVHJhbnNsYXRhYmxlVGV4dCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvaTE4bi51dGlsJztcblxuY29uc3QgQ0hBVF9FTVBUWV9MQUJFTF9LRVkgPSAncGxhdGZvcm0uZGF0YWNvcmUuY2hhdC5lbXB0eSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy1jaGF0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGF0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NoYXQuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWRcbn0pXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgbWVzc2FnZUxpc3RFbGVtZW50PzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQElucHV0KCkgbWVzc2FnZXM6IFNkY0NoYXRNZXNzYWdlW10gPSBbXTtcbiAgQElucHV0KCkgYXV0b1Njcm9sbCA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dBdmF0YXIgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93VGltZXN0YW1wID0gdHJ1ZTtcbiAgQElucHV0KCkgZW1wdHlMYWJlbD86IHN0cmluZztcblxuICBAT3V0cHV0KCkgYXR0YWNobWVudE9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2RjQ2hhdE1lc3NhZ2U+KCk7XG4gIEBPdXRwdXQoKSBtZXNzYWdlQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2RjQ2hhdE1lc3NhZ2U+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWVzc2FnZUxpc3QnKVxuICBzZXQgbWVzc2FnZUxpc3QodmFsdWU6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5tZXNzYWdlTGlzdEVsZW1lbnQgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVkdWxlQXV0b1Njcm9sbCgpO1xuICB9XG5cbiAgZ2V0IG1lc3NhZ2VMaXN0KCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlTGlzdEVsZW1lbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2UucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZWR1bGVBdXRvU2Nyb2xsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tCeU1lc3NhZ2VJZChfaW5kZXg6IG51bWJlciwgbWVzc2FnZTogU2RjQ2hhdE1lc3NhZ2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBtZXNzYWdlLmlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByZXNvbHZlZEVtcHR5TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQodGhpcy50cmFuc2xhdGUsIHRoaXMuZW1wdHlMYWJlbCwgQ0hBVF9FTVBUWV9MQUJFTF9LRVkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpbml0aWFscygpOiAobWVzc2FnZTogU2RjQ2hhdE1lc3NhZ2UpID0+IHN0cmluZyB7XG4gICAgcmV0dXJuIChtZXNzYWdlOiBTZGNDaGF0TWVzc2FnZSkgPT4gdGhpcy5idWlsZEluaXRpYWxzKG1lc3NhZ2Uuc2VuZGVyTmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlTWVzc2FnZUNsaWNrKG1lc3NhZ2U6IFNkY0NoYXRNZXNzYWdlKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlQ2xpY2tlZC5lbWl0KG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUF0dGFjaG1lbnRDbGljayhtZXNzYWdlOiBTZGNDaGF0TWVzc2FnZSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5hdHRhY2htZW50T3BlbmVkLmVtaXQobWVzc2FnZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUF0dGFjaG1lbnRMYWJlbChtZXNzYWdlOiBTZGNDaGF0TWVzc2FnZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuYXR0YWNobWVudE5hbWU/LnRyaW0oKVxuICAgICAgPz8gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgncGxhdGZvcm0uZGF0YWNvcmUuY2hhdC5hdHRhY2htZW50Jyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVN0YXR1c0xhYmVsKHN0YXR1czogU2RjQ2hhdE1lc3NhZ2VTdGF0dXMgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXN0YXR1cykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYHBsYXRmb3JtLmRhdGFjb3JlLmNoYXQuc3RhdHVzLiR7c3RhdHVzfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVUaW1lc3RhbXAoc2VudEF0OiBEYXRlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFzZW50QXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSBzZW50QXQgaW5zdGFuY2VvZiBEYXRlID8gc2VudEF0IDogbmV3IERhdGUoc2VudEF0KTtcblxuICAgIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhbGUgPSByZXNvbHZlQ2hhdExvY2FsZSh0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyk7XG4gICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwge1xuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCdcbiAgICB9KS5mb3JtYXQoZGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSW5pdGlhbHMoc2VuZGVyTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IHNlbmRlck5hbWUuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgZmlyc3QgPSBwYXJ0c1swXT8uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgPz8gJyc7XG4gICAgY29uc3QgbGFzdCA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXT8uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgPz8gJycgOiAnJztcblxuICAgIHJldHVybiBgJHtmaXJzdH0ke2xhc3R9YCB8fCAnVSc7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlQXV0b1Njcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXV0b1Njcm9sbCB8fCAhdGhpcy5tZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gdGhpcy5tZXNzYWdlTGlzdEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIGlmICghbGlzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxpc3Quc2Nyb2xsVG9wID0gbGlzdC5zY3JvbGxIZWlnaHQ7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUNoYXRMb2NhbGUobGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChsYW5ndWFnZSA9PT0gJ2VuJykge1xuICAgIHJldHVybiAnZW4tVVMnO1xuICB9XG5cbiAgaWYgKGxhbmd1YWdlID09PSAnZXMtQ08nKSB7XG4gICAgcmV0dXJuICdlcy1DTyc7XG4gIH1cblxuICByZXR1cm4gJ3B0LUJSJztcbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtY2hhdFwiIFtjbGFzcy5zZGMtY2hhdC0tZW1wdHldPVwiIW1lc3NhZ2VzLmxlbmd0aFwiPlxuICA8ZGl2ICpuZ0lmPVwiIW1lc3NhZ2VzLmxlbmd0aFwiIGNsYXNzPVwic2RjLWNoYXRfX2VtcHR5XCI+XG4gICAge3sgcmVzb2x2ZWRFbXB0eUxhYmVsIH19XG4gIDwvZGl2PlxuXG4gIDx1bCAqbmdJZj1cIm1lc3NhZ2VzLmxlbmd0aFwiICNtZXNzYWdlTGlzdCBjbGFzcz1cInNkYy1jaGF0X19saXN0XCI+XG4gICAgPGxpXG4gICAgICAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBtZXNzYWdlczsgdHJhY2tCeTogdHJhY2tCeU1lc3NhZ2VJZFwiXG4gICAgICBjbGFzcz1cInNkYy1jaGF0X19tZXNzYWdlXCJcbiAgICAgIFtjbGFzcy5zZGMtY2hhdF9fbWVzc2FnZS0tbWluZV09XCJtZXNzYWdlLmlzTWluZVwiXG4gICAgICBbY2xhc3Muc2RjLWNoYXRfX21lc3NhZ2UtLXRoZWlyc109XCIhbWVzc2FnZS5pc01pbmVcIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZU1lc3NhZ2VDbGljayhtZXNzYWdlKVwiXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVNZXNzYWdlQ2xpY2sobWVzc2FnZSlcIlxuICAgICAgKGtleWRvd24uc3BhY2UpPVwiaGFuZGxlTWVzc2FnZUNsaWNrKG1lc3NhZ2UpXCJcbiAgICA+XG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dBdmF0YXJcIiBjbGFzcz1cInNkYy1jaGF0X19hdmF0YXJcIj5cbiAgICAgICAgPGltZ1xuICAgICAgICAgICpuZ0lmPVwibWVzc2FnZS5hdmF0YXJVcmw7IGVsc2UgaW5pdGlhbHNUZW1wbGF0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJzZGMtY2hhdF9fYXZhdGFySW1hZ2VcIlxuICAgICAgICAgIFthbHRdPVwibWVzc2FnZS5zZW5kZXJOYW1lXCJcbiAgICAgICAgICBbc3JjXT1cIm1lc3NhZ2UuYXZhdGFyVXJsXCJcbiAgICAgICAgICB3aWR0aD1cIjMyXCJcbiAgICAgICAgICBoZWlnaHQ9XCIzMlwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNpbml0aWFsc1RlbXBsYXRlPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNoYXRfX2F2YXRhckZhbGxiYWNrXCI+e3sgaW5pdGlhbHMobWVzc2FnZSkgfX08L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNoYXRfX2J1YmJsZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jaGF0X19tZXRhXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY2hhdF9fc2VuZGVyXCI+e3sgbWVzc2FnZS5zZW5kZXJOYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd1RpbWVzdGFtcCAmJiByZXNvbHZlVGltZXN0YW1wKG1lc3NhZ2Uuc2VudEF0KSBhcyB0aW1lc3RhbXBcIiBjbGFzcz1cInNkYy1jaGF0X190aW1lc3RhbXBcIj5cbiAgICAgICAgICAgIHt7IHRpbWVzdGFtcCB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNoYXRfX3RleHRcIj57eyBtZXNzYWdlLnRleHQgfX08L3NwYW4+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwibWVzc2FnZS5hdHRhY2htZW50VXJsXCJcbiAgICAgICAgICBjbGFzcz1cInNkYy1jaGF0X19hdHRhY2htZW50XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQXR0YWNobWVudENsaWNrKG1lc3NhZ2UsICRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcmVzb2x2ZUF0dGFjaG1lbnRMYWJlbChtZXNzYWdlKSB9fVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8c3BhbiAqbmdJZj1cIm1lc3NhZ2UuaXNNaW5lICYmIHJlc29sdmVTdGF0dXNMYWJlbChtZXNzYWdlLnN0YXR1cykgYXMgc3RhdHVzTGFiZWxcIiBjbGFzcz1cInNkYy1jaGF0X19zdGF0dXNcIj5cbiAgICAgICAgICB7eyBzdGF0dXNMYWJlbCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9saT5cbiAgPC91bD5cbjwvZGl2PlxuIl19
@@ -0,0 +1,125 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewEncapsulation, forwardRef, inject } from '@angular/core';
3
+ import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ export class CheckboxListComponent {
7
+ cdr = inject(ChangeDetectorRef);
8
+ data;
9
+ state = this.buildState({ label: '' });
10
+ onChange = () => { };
11
+ onTouched = () => { };
12
+ ngOnChanges(changes) {
13
+ if (changes['data']) {
14
+ this.state = this.buildState(this.data);
15
+ this.cdr.markForCheck();
16
+ }
17
+ }
18
+ writeValue(value) {
19
+ this.state = value ? this.cloneState(value) : this.buildState(this.data);
20
+ this.cdr.markForCheck();
21
+ }
22
+ registerOnChange(onChange) {
23
+ this.onChange = onChange;
24
+ }
25
+ registerOnTouched(onTouched) {
26
+ this.onTouched = onTouched;
27
+ }
28
+ setDisabledState(isDisabled) {
29
+ this.state.disabled = isDisabled;
30
+ this.cdr.markForCheck();
31
+ }
32
+ get renderType() {
33
+ return this.data.renderType ?? 'inline';
34
+ }
35
+ ensureChildState(parentState, child) {
36
+ if (!parentState.children) {
37
+ parentState.children = {};
38
+ }
39
+ if (!parentState.children[child.label]) {
40
+ parentState.children[child.label] = this.buildState(child);
41
+ }
42
+ return parentState.children[child.label];
43
+ }
44
+ onNodeCheckedChange(node, nodeState, event) {
45
+ if (nodeState.disabled) {
46
+ return;
47
+ }
48
+ const checked = event.target.checked;
49
+ this.setBranchChecked(node, nodeState, checked);
50
+ this.syncBranchState(this.data, this.state);
51
+ this.emitStateChange();
52
+ }
53
+ emitStateChange() {
54
+ this.onChange(this.cloneState(this.state));
55
+ this.onTouched();
56
+ this.cdr.markForCheck();
57
+ }
58
+ buildState(node) {
59
+ const children = node.children?.reduce((accumulator, child) => {
60
+ accumulator[child.label] = this.buildState(child);
61
+ return accumulator;
62
+ }, {});
63
+ return {
64
+ checked: false,
65
+ indeterminate: false,
66
+ disabled: false,
67
+ children
68
+ };
69
+ }
70
+ cloneState(state) {
71
+ const children = state.children
72
+ ? Object.entries(state.children).reduce((accumulator, [key, value]) => {
73
+ accumulator[key] = this.cloneState(value);
74
+ return accumulator;
75
+ }, {})
76
+ : undefined;
77
+ return {
78
+ checked: state.checked,
79
+ indeterminate: state.indeterminate,
80
+ disabled: state.disabled,
81
+ children
82
+ };
83
+ }
84
+ setBranchChecked(node, nodeState, checked) {
85
+ nodeState.checked = checked;
86
+ nodeState.indeterminate = false;
87
+ for (const child of node.children ?? []) {
88
+ const childState = this.ensureChildState(nodeState, child);
89
+ this.setBranchChecked(child, childState, checked);
90
+ }
91
+ }
92
+ syncBranchState(node, nodeState) {
93
+ if (!node.children?.length) {
94
+ return nodeState;
95
+ }
96
+ const childStates = node.children.map((child) => this.syncBranchState(child, this.ensureChildState(nodeState, child)));
97
+ const allChecked = childStates.every((childState) => childState.checked);
98
+ const someChecked = childStates.some((childState) => childState.checked || childState.indeterminate);
99
+ nodeState.checked = allChecked;
100
+ nodeState.indeterminate = !allChecked && someChecked;
101
+ return nodeState;
102
+ }
103
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
104
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CheckboxListComponent, isStandalone: true, selector: "sdc-checkbox-list", inputs: { data: "data" }, providers: [
105
+ {
106
+ provide: NG_VALUE_ACCESSOR,
107
+ useExisting: forwardRef(() => CheckboxListComponent),
108
+ multi: true
109
+ }
110
+ ], usesOnChanges: true, ngImport: i0, template: "<ng-template\n #renderNode\n let-node\n let-nodeState=\"nodeState\"\n let-depth=\"depth\"\n>\n <div class=\"sdc-checkbox-list__item\">\n <label\n class=\"sdc-checkbox-list__label\"\n [class.sdc-checkbox-list__label--disabled]=\"nodeState.disabled\"\n [class.sdc-checkbox-list__label--block]=\"node.renderType === 'block'\"\n [class.sdc-checkbox-list__label--inline]=\"(node.renderType ?? renderType) === 'inline'\"\n >\n <input\n type=\"checkbox\"\n class=\"sdc-checkbox-list__input\"\n [checked]=\"nodeState.checked\"\n [disabled]=\"nodeState.disabled\"\n [indeterminate]=\"nodeState.indeterminate ?? false\"\n [attr.aria-checked]=\"nodeState.indeterminate ? 'mixed' : nodeState.checked\"\n [attr.aria-disabled]=\"nodeState.disabled\"\n (change)=\"onNodeCheckedChange(node, nodeState, $event)\"\n />\n <span>{{ node.label }}</span>\n </label>\n\n @if (node.children?.length) {\n <div\n class=\"sdc-checkbox-list__children\"\n [style.margin-left.rem]=\"depth > 0 ? 1.25 : 1\"\n >\n @for (child of node.children; track child.label) {\n <ng-container\n [ngTemplateOutlet]=\"renderNode\"\n [ngTemplateOutletContext]=\"{\n $implicit: child,\n nodeState: ensureChildState(nodeState, child),\n depth: depth + 1\n }\"\n ></ng-container>\n }\n </div>\n }\n </div>\n</ng-template>\n\n<div class=\"sdc-checkbox-list\">\n <ng-container\n [ngTemplateOutlet]=\"renderNode\"\n [ngTemplateOutletContext]=\"{ $implicit: data, nodeState: state, depth: 0 }\"\n ></ng-container>\n</div>\n", styles: [".sdc-checkbox-list,.sdc-checkbox-list__item{display:flex;flex-direction:column;gap:.625rem}.sdc-checkbox-list__label{display:flex;gap:.75rem;color:#212533;font-size:.875rem}.sdc-checkbox-list__label--inline{align-items:center}.sdc-checkbox-list__label--block{flex-direction:column-reverse}.sdc-checkbox-list__label--disabled{opacity:.5;cursor:default}.sdc-checkbox-list__input{position:relative;flex-shrink:0;width:1.25rem;height:1.25rem;border:1px solid #c1c1cc;border-radius:.25rem;cursor:pointer;accent-color:#428bca}.sdc-checkbox-list__children{display:flex;flex-direction:column;gap:.625rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
111
+ }
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxListComponent, decorators: [{
113
+ type: Component,
114
+ args: [{ selector: 'sdc-checkbox-list', standalone: true, imports: [CommonModule, FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [
115
+ {
116
+ provide: NG_VALUE_ACCESSOR,
117
+ useExisting: forwardRef(() => CheckboxListComponent),
118
+ multi: true
119
+ }
120
+ ], template: "<ng-template\n #renderNode\n let-node\n let-nodeState=\"nodeState\"\n let-depth=\"depth\"\n>\n <div class=\"sdc-checkbox-list__item\">\n <label\n class=\"sdc-checkbox-list__label\"\n [class.sdc-checkbox-list__label--disabled]=\"nodeState.disabled\"\n [class.sdc-checkbox-list__label--block]=\"node.renderType === 'block'\"\n [class.sdc-checkbox-list__label--inline]=\"(node.renderType ?? renderType) === 'inline'\"\n >\n <input\n type=\"checkbox\"\n class=\"sdc-checkbox-list__input\"\n [checked]=\"nodeState.checked\"\n [disabled]=\"nodeState.disabled\"\n [indeterminate]=\"nodeState.indeterminate ?? false\"\n [attr.aria-checked]=\"nodeState.indeterminate ? 'mixed' : nodeState.checked\"\n [attr.aria-disabled]=\"nodeState.disabled\"\n (change)=\"onNodeCheckedChange(node, nodeState, $event)\"\n />\n <span>{{ node.label }}</span>\n </label>\n\n @if (node.children?.length) {\n <div\n class=\"sdc-checkbox-list__children\"\n [style.margin-left.rem]=\"depth > 0 ? 1.25 : 1\"\n >\n @for (child of node.children; track child.label) {\n <ng-container\n [ngTemplateOutlet]=\"renderNode\"\n [ngTemplateOutletContext]=\"{\n $implicit: child,\n nodeState: ensureChildState(nodeState, child),\n depth: depth + 1\n }\"\n ></ng-container>\n }\n </div>\n }\n </div>\n</ng-template>\n\n<div class=\"sdc-checkbox-list\">\n <ng-container\n [ngTemplateOutlet]=\"renderNode\"\n [ngTemplateOutletContext]=\"{ $implicit: data, nodeState: state, depth: 0 }\"\n ></ng-container>\n</div>\n", styles: [".sdc-checkbox-list,.sdc-checkbox-list__item{display:flex;flex-direction:column;gap:.625rem}.sdc-checkbox-list__label{display:flex;gap:.75rem;color:#212533;font-size:.875rem}.sdc-checkbox-list__label--inline{align-items:center}.sdc-checkbox-list__label--block{flex-direction:column-reverse}.sdc-checkbox-list__label--disabled{opacity:.5;cursor:default}.sdc-checkbox-list__input{position:relative;flex-shrink:0;width:1.25rem;height:1.25rem;border:1px solid #c1c1cc;border-radius:.25rem;cursor:pointer;accent-color:#428bca}.sdc-checkbox-list__children{display:flex;flex-direction:column;gap:.625rem}\n"] }]
121
+ }], propDecorators: { data: [{
122
+ type: Input,
123
+ args: [{ required: true }]
124
+ }] } });
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NoZWNrYm94LWxpc3QvY2hlY2tib3gtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NoZWNrYm94LWxpc3QvY2hlY2tib3gtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULEtBQUssRUFHTCxpQkFBaUIsRUFDakIsVUFBVSxFQUNWLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUF3QnRGLE1BQU0sT0FBTyxxQkFBcUI7SUFDZixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFdEIsSUFBSSxDQUFvQjtJQUV6QyxLQUFLLEdBQXNCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUU1RCxRQUFRLEdBQXVDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUN4RCxTQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBRXpDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVE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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1xuICBDaGVja2JveExpc3RDaGlsZHJlbixcbiAgQ2hlY2tib3hMaXN0RGF0YSxcbiAgQ2hlY2tib3hMaXN0U3RhdGVcbn0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9jaGVja2JveC1saXN0LnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtY2hlY2tib3gtbGlzdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrYm94LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGVja2JveC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGVja2JveExpc3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBkYXRhITogQ2hlY2tib3hMaXN0RGF0YTtcblxuICBwcm90ZWN0ZWQgc3RhdGU6IENoZWNrYm94TGlzdFN0YXRlID0gdGhpcy5idWlsZFN0YXRlKHsgbGFiZWw6ICcnIH0pO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogQ2hlY2tib3hMaXN0U3RhdGUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuYnVpbGRTdGF0ZSh0aGlzLmRhdGEpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogQ2hlY2tib3hMaXN0U3RhdGUgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9IHZhbHVlID8gdGhpcy5jbG9uZVN0YXRlKHZhbHVlKSA6IHRoaXMuYnVpbGRTdGF0ZSh0aGlzLmRhdGEpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBDaGVja2JveExpc3RTdGF0ZSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHJlbmRlclR5cGUoKTogJ2lubGluZScgfCAnYmxvY2snIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnJlbmRlclR5cGUgPz8gJ2lubGluZSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5zdXJlQ2hpbGRTdGF0ZShwYXJlbnRTdGF0ZTogQ2hlY2tib3hMaXN0U3RhdGUsIGNoaWxkOiBDaGVja2JveExpc3REYXRhKTogQ2hlY2tib3hMaXN0U3RhdGUge1xuICAgIGlmICghcGFyZW50U3RhdGUuY2hpbGRyZW4pIHtcbiAgICAgIHBhcmVudFN0YXRlLmNoaWxkcmVuID0ge307XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnRTdGF0ZS5jaGlsZHJlbltjaGlsZC5sYWJlbF0pIHtcbiAgICAgIHBhcmVudFN0YXRlLmNoaWxkcmVuW2NoaWxkLmxhYmVsXSA9IHRoaXMuYnVpbGRTdGF0ZShjaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudFN0YXRlLmNoaWxkcmVuW2NoaWxkLmxhYmVsXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk5vZGVDaGVja2VkQ2hhbmdlKFxuICAgIG5vZGU6IENoZWNrYm94TGlzdERhdGEsXG4gICAgbm9kZVN0YXRlOiBDaGVja2JveExpc3RTdGF0ZSxcbiAgICBldmVudDogRXZlbnRcbiAgKTogdm9pZCB7XG4gICAgaWYgKG5vZGVTdGF0ZS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gICAgdGhpcy5zZXRCcmFuY2hDaGVja2VkKG5vZGUsIG5vZGVTdGF0ZSwgY2hlY2tlZCk7XG4gICAgdGhpcy5zeW5jQnJhbmNoU3RhdGUodGhpcy5kYXRhLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLmNsb25lU3RhdGUodGhpcy5zdGF0ZSkpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RhdGUobm9kZTogQ2hlY2tib3hMaXN0RGF0YSk6IENoZWNrYm94TGlzdFN0YXRlIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4/LnJlZHVjZTxDaGVja2JveExpc3RDaGlsZHJlbj4oKGFjY3VtdWxhdG9yLCBjaGlsZCkgPT4ge1xuICAgICAgYWNjdW11bGF0b3JbY2hpbGQubGFiZWxdID0gdGhpcy5idWlsZFN0YXRlKGNoaWxkKTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgICBpbmRldGVybWluYXRlOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIGNoaWxkcmVuXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVTdGF0ZShzdGF0ZTogQ2hlY2tib3hMaXN0U3RhdGUpOiBDaGVja2JveExpc3RTdGF0ZSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBzdGF0ZS5jaGlsZHJlblxuICAgICAgPyBPYmplY3QuZW50cmllcyhzdGF0ZS5jaGlsZHJlbikucmVkdWNlPENoZWNrYm94TGlzdENoaWxkcmVuPigoYWNjdW11bGF0b3IsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSB0aGlzLmNsb25lU3RhdGUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgICAgfSwge30pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICBjaGVja2VkOiBzdGF0ZS5jaGVja2VkLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogc3RhdGUuaW5kZXRlcm1pbmF0ZSxcbiAgICAgIGRpc2FibGVkOiBzdGF0ZS5kaXNhYmxlZCxcbiAgICAgIGNoaWxkcmVuXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QnJhbmNoQ2hlY2tlZChub2RlOiBDaGVja2JveExpc3REYXRhLCBub2RlU3RhdGU6IENoZWNrYm94TGlzdFN0YXRlLCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgbm9kZVN0YXRlLmNoZWNrZWQgPSBjaGVja2VkO1xuICAgIG5vZGVTdGF0ZS5pbmRldGVybWluYXRlID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgIGNvbnN0IGNoaWxkU3RhdGUgPSB0aGlzLmVuc3VyZUNoaWxkU3RhdGUobm9kZVN0YXRlLCBjaGlsZCk7XG4gICAgICB0aGlzLnNldEJyYW5jaENoZWNrZWQoY2hpbGQsIGNoaWxkU3RhdGUsIGNoZWNrZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0JyYW5jaFN0YXRlKG5vZGU6IENoZWNrYm94TGlzdERhdGEsIG5vZGVTdGF0ZTogQ2hlY2tib3hMaXN0U3RhdGUpOiBDaGVja2JveExpc3RTdGF0ZSB7XG4gICAgaWYgKCFub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBub2RlU3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRTdGF0ZXMgPSBub2RlLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+XG4gICAgICB0aGlzLnN5bmNCcmFuY2hTdGF0ZShjaGlsZCwgdGhpcy5lbnN1cmVDaGlsZFN0YXRlKG5vZGVTdGF0ZSwgY2hpbGQpKVxuICAgICk7XG5cbiAgICBjb25zdCBhbGxDaGVja2VkID0gY2hpbGRTdGF0ZXMuZXZlcnkoKGNoaWxkU3RhdGUpID0+IGNoaWxkU3RhdGUuY2hlY2tlZCk7XG4gICAgY29uc3Qgc29tZUNoZWNrZWQgPSBjaGlsZFN0YXRlcy5zb21lKFxuICAgICAgKGNoaWxkU3RhdGUpID0+IGNoaWxkU3RhdGUuY2hlY2tlZCB8fCBjaGlsZFN0YXRlLmluZGV0ZXJtaW5hdGVcbiAgICApO1xuXG4gICAgbm9kZVN0YXRlLmNoZWNrZWQgPSBhbGxDaGVja2VkO1xuICAgIG5vZGVTdGF0ZS5pbmRldGVybWluYXRlID0gIWFsbENoZWNrZWQgJiYgc29tZUNoZWNrZWQ7XG5cbiAgICByZXR1cm4gbm9kZVN0YXRlO1xuICB9XG59XG4iLCI8bmctdGVtcGxhdGVcbiAgI3JlbmRlck5vZGVcbiAgbGV0LW5vZGVcbiAgbGV0LW5vZGVTdGF0ZT1cIm5vZGVTdGF0ZVwiXG4gIGxldC1kZXB0aD1cImRlcHRoXCJcbj5cbiAgPGRpdiBjbGFzcz1cInNkYy1jaGVja2JveC1saXN0X19pdGVtXCI+XG4gICAgPGxhYmVsXG4gICAgICBjbGFzcz1cInNkYy1jaGVja2JveC1saXN0X19sYWJlbFwiXG4gICAgICBbY2xhc3Muc2RjLWNoZWNrYm94LWxpc3RfX2xhYmVsLS1kaXNhYmxlZF09XCJub2RlU3RhdGUuZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzLnNkYy1jaGVja2JveC1saXN0X19sYWJlbC0tYmxvY2tdPVwibm9kZS5yZW5kZXJUeXBlID09PSAnYmxvY2snXCJcbiAgICAgIFtjbGFzcy5zZGMtY2hlY2tib3gtbGlzdF9fbGFiZWwtLWlubGluZV09XCIobm9kZS5yZW5kZXJUeXBlID8/IHJlbmRlclR5cGUpID09PSAnaW5saW5lJ1wiXG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIGNsYXNzPVwic2RjLWNoZWNrYm94LWxpc3RfX2lucHV0XCJcbiAgICAgICAgW2NoZWNrZWRdPVwibm9kZVN0YXRlLmNoZWNrZWRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibm9kZVN0YXRlLmRpc2FibGVkXCJcbiAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwibm9kZVN0YXRlLmluZGV0ZXJtaW5hdGUgPz8gZmFsc2VcIlxuICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwibm9kZVN0YXRlLmluZGV0ZXJtaW5hdGUgPyAnbWl4ZWQnIDogbm9kZVN0YXRlLmNoZWNrZWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5vZGVTdGF0ZS5kaXNhYmxlZFwiXG4gICAgICAgIChjaGFuZ2UpPVwib25Ob2RlQ2hlY2tlZENoYW5nZShub2RlLCBub2RlU3RhdGUsICRldmVudClcIlxuICAgICAgLz5cbiAgICAgIDxzcGFuPnt7IG5vZGUubGFiZWwgfX08L3NwYW4+XG4gICAgPC9sYWJlbD5cblxuICAgIEBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJzZGMtY2hlY2tib3gtbGlzdF9fY2hpbGRyZW5cIlxuICAgICAgW3N0eWxlLm1hcmdpbi1sZWZ0LnJlbV09XCJkZXB0aCA+IDAgPyAxLjI1IDogMVwiXG4gICAgPlxuICAgICAgQGZvciAoY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQubGFiZWwpIHtcbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVuZGVyTm9kZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgJGltcGxpY2l0OiBjaGlsZCxcbiAgICAgICAgICBub2RlU3RhdGU6IGVuc3VyZUNoaWxkU3RhdGUobm9kZVN0YXRlLCBjaGlsZCksXG4gICAgICAgICAgZGVwdGg6IGRlcHRoICsgMVxuICAgICAgICB9XCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cInNkYy1jaGVja2JveC1saXN0XCI+XG4gIDxuZy1jb250YWluZXJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyZW5kZXJOb2RlXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGRhdGEsIG5vZGVTdGF0ZTogc3RhdGUsIGRlcHRoOiAwIH1cIlxuICA+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==