@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,169 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { animate, query, stagger, style, transition, trigger } from '@angular/animations';
3
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, forwardRef, inject } from '@angular/core';
4
+ import { FormsModule } from '@angular/forms';
5
+ import { TranslateService } from '@ngx-translate/core';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/forms";
8
+ export class TreeNodeItemComponent {
9
+ cdr = inject(ChangeDetectorRef);
10
+ translate = inject(TranslateService);
11
+ ariaLevel = 1;
12
+ showCheckbox = false;
13
+ treeNodeItem;
14
+ treeNodeItemClicked = new EventEmitter();
15
+ treeNodeEdit = new EventEmitter();
16
+ nodeExpanded = new EventEmitter();
17
+ nodeCollapsed = new EventEmitter();
18
+ input;
19
+ get hasChildren() {
20
+ return !!this.treeNodeItem?.children?.length;
21
+ }
22
+ get editable() {
23
+ return this.treeNodeItem?.editable ?? false;
24
+ }
25
+ get checkboxAriaLabel() {
26
+ return `${this.translate.instant('platform.datacore.tree.select')} ${this.treeNodeItem.label}`;
27
+ }
28
+ get expandAriaLabel() {
29
+ return this.translate.instant('platform.datacore.tree.expand');
30
+ }
31
+ get collapseAriaLabel() {
32
+ return this.translate.instant('platform.datacore.tree.collapse');
33
+ }
34
+ get editInputAriaLabel() {
35
+ return this.translate.instant('platform.datacore.tree.edit_name');
36
+ }
37
+ get editButtonAriaLabel() {
38
+ return this.translate.instant('platform.datacore.tree.edit');
39
+ }
40
+ expandNode() {
41
+ if (this.hasChildren && !this.treeNodeItem.isExpanded) {
42
+ this.toggleExpanded(this.treeNodeItem);
43
+ }
44
+ }
45
+ collapseNode() {
46
+ if (this.hasChildren && this.treeNodeItem.isExpanded) {
47
+ this.toggleExpanded(this.treeNodeItem);
48
+ }
49
+ }
50
+ handleCheckboxChange(event, node) {
51
+ event.stopPropagation();
52
+ this.treeNodeItemClicked.emit({ item: node, event });
53
+ }
54
+ onCheckboxKeydown(event, node) {
55
+ if (event.key !== 'Enter' && event.key !== ' ') {
56
+ return;
57
+ }
58
+ event.preventDefault();
59
+ event.stopPropagation();
60
+ this.treeNodeItemClicked.emit({ item: node, event });
61
+ }
62
+ handleTreeNodeItemClick(event, treeNodeItem) {
63
+ this.treeNodeItemClicked.emit({ item: treeNodeItem ?? this.treeNodeItem, event });
64
+ }
65
+ handleTreeNodeItemKeyboardActivate(event) {
66
+ event.preventDefault();
67
+ this.handleTreeNodeItemClick(event);
68
+ }
69
+ toggleExpanded(treeNodeItem) {
70
+ treeNodeItem.isExpanded = !treeNodeItem.isExpanded;
71
+ if (treeNodeItem.isExpanded) {
72
+ this.nodeExpanded.emit(treeNodeItem);
73
+ }
74
+ else {
75
+ this.nodeCollapsed.emit(treeNodeItem);
76
+ }
77
+ }
78
+ toggleEditing(event) {
79
+ event.stopPropagation();
80
+ this.treeNodeItem.isEditing = !this.treeNodeItem.isEditing;
81
+ this.treeNodeItem.editNewValue = this.treeNodeItem.label;
82
+ this.cdr.detectChanges();
83
+ this.input?.nativeElement.focus();
84
+ }
85
+ cancelEdit(event) {
86
+ event.stopPropagation();
87
+ this.treeNodeItem.isEditing = false;
88
+ this.treeNodeItem.editNewValue = '';
89
+ this.treeNodeItem.editPreviousValue = '';
90
+ this.cdr.detectChanges();
91
+ }
92
+ saveEdit(event) {
93
+ event.stopPropagation();
94
+ this.treeNodeItem.isEditing = false;
95
+ if (!this.treeNodeItem.editNewValue) {
96
+ return;
97
+ }
98
+ this.treeNodeItem.editPreviousValue = this.treeNodeItem.label;
99
+ this.treeNodeItem.label = this.treeNodeItem.editNewValue;
100
+ const revertAction = () => {
101
+ this.treeNodeItem.label = this.treeNodeItem.editPreviousValue ?? this.treeNodeItem.label;
102
+ this.treeNodeItem.isEditing = false;
103
+ this.cdr.detectChanges();
104
+ };
105
+ this.treeNodeEdit.emit({
106
+ revertAction,
107
+ item: this.treeNodeItem,
108
+ newValue: this.treeNodeItem.editNewValue,
109
+ previousValue: this.treeNodeItem.editPreviousValue ?? ''
110
+ });
111
+ }
112
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TreeNodeItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
113
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TreeNodeItemComponent, isStandalone: true, selector: "sdc-tree-node-item", inputs: { ariaLevel: "ariaLevel", showCheckbox: "showCheckbox", treeNodeItem: "treeNodeItem" }, outputs: { treeNodeItemClicked: "treeNodeItemClicked", treeNodeEdit: "treeNodeEdit", nodeExpanded: "nodeExpanded", nodeCollapsed: "nodeCollapsed" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, read: ElementRef }], ngImport: i0, template: "@if (treeNodeItem) {\n<div\n class=\"sdc-tree-node-item\"\n role=\"treeitem\"\n tabindex=\"0\"\n [class.sdc-tree-node-item--selected]=\"treeNodeItem.checked\"\n [class.sdc-tree-node-item--selectable]=\"treeNodeItem.checked === true || treeNodeItem.checked === null\"\n [attr.aria-expanded]=\"hasChildren ? treeNodeItem.isExpanded : null\"\n [attr.aria-selected]=\"treeNodeItem.checked === true ? 'true' : 'false'\"\n [attr.aria-label]=\"treeNodeItem.label\"\n [attr.aria-level]=\"ariaLevel\"\n (keydown.enter)=\"handleTreeNodeItemKeyboardActivate($event)\"\n (keydown.space)=\"handleTreeNodeItemKeyboardActivate($event)\"\n (keydown.arrowRight)=\"expandNode()\"\n (keydown.arrowLeft)=\"collapseNode()\"\n>\n @if (hasChildren) {\n <button\n type=\"button\"\n class=\"sdc-tree-node-item__arrow\"\n (click)=\"$event.stopPropagation(); toggleExpanded(treeNodeItem)\"\n [attr.aria-label]=\"treeNodeItem.isExpanded ? collapseAriaLabel : expandAriaLabel\"\n >\n @if (!treeNodeItem.isExpanded) {\n <i [class]=\"treeNodeItem.collapsedIcon || 'fas fa-chevron-right'\"></i>\n }\n @if (treeNodeItem.isExpanded) {\n <i [class]=\"treeNodeItem.expandedIcon || 'fas fa-chevron-down'\"></i>\n }\n </button>\n }\n\n <div\n class=\"sdc-tree-node-item__content\"\n (click)=\"handleTreeNodeItemClick($event)\"\n (keydown.enter)=\"handleTreeNodeItemKeyboardActivate($event)\"\n (keydown.space)=\"handleTreeNodeItemKeyboardActivate($event)\"\n >\n @if (treeNodeItem.icon || treeNodeItem.isEditing) {\n <span class=\"sdc-tree-node-item__icon\">\n @if (treeNodeItem.icon && !treeNodeItem.isEditing) {\n <i [class]=\"treeNodeItem.icon\"></i>\n }\n @if (treeNodeItem.isEditing) {\n <button\n type=\"button\"\n class=\"sdc-tree-node-item__edit-icon\"\n (click)=\"saveEdit($event)\"\n >\n <i class=\"fas fa-edit\"></i>\n </button>\n }\n </span>\n }\n\n @if (showCheckbox && !treeNodeItem.isEditing) {\n <span class=\"sdc-tree-node-item__checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"treeNodeItem.checked === true\"\n [indeterminate]=\"treeNodeItem.checked === null\"\n [attr.aria-label]=\"checkboxAriaLabel\"\n tabindex=\"0\"\n (click)=\"handleCheckboxChange($event, treeNodeItem)\"\n (keydown)=\"onCheckboxKeydown($event, treeNodeItem)\"\n />\n </span>\n }\n\n <span class=\"sdc-tree-node-item__label\">\n @if (treeNodeItem.isEditing) {\n <input\n #input\n type=\"text\"\n class=\"sdc-tree-node-item__input\"\n [(ngModel)]=\"treeNodeItem.editNewValue\"\n [attr.aria-label]=\"editInputAriaLabel\"\n aria-live=\"polite\"\n (keydown.enter)=\"saveEdit($event)\"\n (keydown.escape)=\"cancelEdit($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n {{ treeNodeItem.label }}\n }\n </span>\n\n @if (editable) {\n <button\n type=\"button\"\n class=\"sdc-tree-node-item__editable\"\n [attr.aria-label]=\"editButtonAriaLabel\"\n (click)=\"toggleEditing($event)\"\n >\n <i class=\"fas fa-pencil-alt\"></i>\n </button>\n }\n </div>\n</div>\n}\n\n@if (hasChildren && treeNodeItem.isExpanded) {\n<div\n @fadeExpand\n class=\"sdc-tree-node-item__children\"\n @childrenAnimation\n>\n @for (child of treeNodeItem.children; track child.id) {\n <sdc-tree-node-item\n class=\"sdc-tree-node-item__child\"\n [showCheckbox]=\"showCheckbox\"\n [treeNodeItem]=\"child\"\n [ariaLevel]=\"ariaLevel + 1\"\n (treeNodeItemClicked)=\"treeNodeItemClicked.emit($event)\"\n (treeNodeEdit)=\"treeNodeEdit.emit($event)\"\n (nodeExpanded)=\"nodeExpanded.emit($event)\"\n (nodeCollapsed)=\"nodeCollapsed.emit($event)\"\n ></sdc-tree-node-item>\n }\n</div>\n}\n", styles: [".sdc-tree-node-item{display:flex;width:100%;cursor:pointer}.sdc-tree-node-item__arrow{display:inline-flex;align-items:center;justify-content:center;padding:.1875rem .5625rem;border:0;background:transparent;cursor:pointer}.sdc-tree-node-item__content{display:flex;flex:1;align-items:center;padding:.1875rem 0}.sdc-tree-node-item__content:hover{background:#f1f7f8}.sdc-tree-node-item__icon,.sdc-tree-node-item__checkbox{display:inline-flex;align-items:center;padding-right:.5625rem}.sdc-tree-node-item__label{display:flex;flex:1;color:#212533;font-size:.875rem;line-height:1.5}.sdc-tree-node-item__editable{display:inline-flex;align-items:center;justify-content:center;padding:.5625rem;border:0;background:transparent;cursor:pointer}.sdc-tree-node-item__input{width:100%}.sdc-tree-node-item--selectable .sdc-tree-node-item__label{font-weight:700}.sdc-tree-node-item--selected .sdc-tree-node-item__content{background:#d5e8ec}.sdc-tree-node-item__children{display:flex;flex-direction:column;gap:.3125rem;overflow:hidden;padding-left:2.2em}.sdc-tree-node-item__child:first-child{padding-top:.3125rem}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => TreeNodeItemComponent), selector: "sdc-tree-node-item", inputs: ["ariaLevel", "showCheckbox", "treeNodeItem"], outputs: ["treeNodeItemClicked", "treeNodeEdit", "nodeExpanded", "nodeCollapsed"] }, { kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "ngmodule", type: i0.forwardRef(() => FormsModule) }, { kind: "directive", type: i0.forwardRef(() => i1.DefaultValueAccessor), selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i0.forwardRef(() => i1.NgControlStatus), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(() => i1.NgModel), selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], animations: [
114
+ trigger('fadeExpand', [
115
+ transition(':enter', [
116
+ style({ height: '0px', opacity: 0, overflow: 'hidden' }),
117
+ animate('200ms ease-out', style({ height: '*', opacity: 1 }))
118
+ ]),
119
+ transition(':leave', [animate('150ms ease-in', style({ height: '0px', opacity: 0 }))])
120
+ ]),
121
+ trigger('childrenAnimation', [
122
+ transition(':enter', [
123
+ query(':enter', [
124
+ style({ opacity: 0, transform: 'translateY(-10px)' }),
125
+ stagger(60, [animate('200ms ease-out', style({ opacity: 1, transform: 'translateY(0)' }))])
126
+ ], { optional: true })
127
+ ])
128
+ ])
129
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
130
+ }
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TreeNodeItemComponent, decorators: [{
132
+ type: Component,
133
+ args: [{ selector: 'sdc-tree-node-item', standalone: true, imports: [CommonModule, FormsModule, forwardRef(() => TreeNodeItemComponent)], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, animations: [
134
+ trigger('fadeExpand', [
135
+ transition(':enter', [
136
+ style({ height: '0px', opacity: 0, overflow: 'hidden' }),
137
+ animate('200ms ease-out', style({ height: '*', opacity: 1 }))
138
+ ]),
139
+ transition(':leave', [animate('150ms ease-in', style({ height: '0px', opacity: 0 }))])
140
+ ]),
141
+ trigger('childrenAnimation', [
142
+ transition(':enter', [
143
+ query(':enter', [
144
+ style({ opacity: 0, transform: 'translateY(-10px)' }),
145
+ stagger(60, [animate('200ms ease-out', style({ opacity: 1, transform: 'translateY(0)' }))])
146
+ ], { optional: true })
147
+ ])
148
+ ])
149
+ ], template: "@if (treeNodeItem) {\n<div\n class=\"sdc-tree-node-item\"\n role=\"treeitem\"\n tabindex=\"0\"\n [class.sdc-tree-node-item--selected]=\"treeNodeItem.checked\"\n [class.sdc-tree-node-item--selectable]=\"treeNodeItem.checked === true || treeNodeItem.checked === null\"\n [attr.aria-expanded]=\"hasChildren ? treeNodeItem.isExpanded : null\"\n [attr.aria-selected]=\"treeNodeItem.checked === true ? 'true' : 'false'\"\n [attr.aria-label]=\"treeNodeItem.label\"\n [attr.aria-level]=\"ariaLevel\"\n (keydown.enter)=\"handleTreeNodeItemKeyboardActivate($event)\"\n (keydown.space)=\"handleTreeNodeItemKeyboardActivate($event)\"\n (keydown.arrowRight)=\"expandNode()\"\n (keydown.arrowLeft)=\"collapseNode()\"\n>\n @if (hasChildren) {\n <button\n type=\"button\"\n class=\"sdc-tree-node-item__arrow\"\n (click)=\"$event.stopPropagation(); toggleExpanded(treeNodeItem)\"\n [attr.aria-label]=\"treeNodeItem.isExpanded ? collapseAriaLabel : expandAriaLabel\"\n >\n @if (!treeNodeItem.isExpanded) {\n <i [class]=\"treeNodeItem.collapsedIcon || 'fas fa-chevron-right'\"></i>\n }\n @if (treeNodeItem.isExpanded) {\n <i [class]=\"treeNodeItem.expandedIcon || 'fas fa-chevron-down'\"></i>\n }\n </button>\n }\n\n <div\n class=\"sdc-tree-node-item__content\"\n (click)=\"handleTreeNodeItemClick($event)\"\n (keydown.enter)=\"handleTreeNodeItemKeyboardActivate($event)\"\n (keydown.space)=\"handleTreeNodeItemKeyboardActivate($event)\"\n >\n @if (treeNodeItem.icon || treeNodeItem.isEditing) {\n <span class=\"sdc-tree-node-item__icon\">\n @if (treeNodeItem.icon && !treeNodeItem.isEditing) {\n <i [class]=\"treeNodeItem.icon\"></i>\n }\n @if (treeNodeItem.isEditing) {\n <button\n type=\"button\"\n class=\"sdc-tree-node-item__edit-icon\"\n (click)=\"saveEdit($event)\"\n >\n <i class=\"fas fa-edit\"></i>\n </button>\n }\n </span>\n }\n\n @if (showCheckbox && !treeNodeItem.isEditing) {\n <span class=\"sdc-tree-node-item__checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"treeNodeItem.checked === true\"\n [indeterminate]=\"treeNodeItem.checked === null\"\n [attr.aria-label]=\"checkboxAriaLabel\"\n tabindex=\"0\"\n (click)=\"handleCheckboxChange($event, treeNodeItem)\"\n (keydown)=\"onCheckboxKeydown($event, treeNodeItem)\"\n />\n </span>\n }\n\n <span class=\"sdc-tree-node-item__label\">\n @if (treeNodeItem.isEditing) {\n <input\n #input\n type=\"text\"\n class=\"sdc-tree-node-item__input\"\n [(ngModel)]=\"treeNodeItem.editNewValue\"\n [attr.aria-label]=\"editInputAriaLabel\"\n aria-live=\"polite\"\n (keydown.enter)=\"saveEdit($event)\"\n (keydown.escape)=\"cancelEdit($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n {{ treeNodeItem.label }}\n }\n </span>\n\n @if (editable) {\n <button\n type=\"button\"\n class=\"sdc-tree-node-item__editable\"\n [attr.aria-label]=\"editButtonAriaLabel\"\n (click)=\"toggleEditing($event)\"\n >\n <i class=\"fas fa-pencil-alt\"></i>\n </button>\n }\n </div>\n</div>\n}\n\n@if (hasChildren && treeNodeItem.isExpanded) {\n<div\n @fadeExpand\n class=\"sdc-tree-node-item__children\"\n @childrenAnimation\n>\n @for (child of treeNodeItem.children; track child.id) {\n <sdc-tree-node-item\n class=\"sdc-tree-node-item__child\"\n [showCheckbox]=\"showCheckbox\"\n [treeNodeItem]=\"child\"\n [ariaLevel]=\"ariaLevel + 1\"\n (treeNodeItemClicked)=\"treeNodeItemClicked.emit($event)\"\n (treeNodeEdit)=\"treeNodeEdit.emit($event)\"\n (nodeExpanded)=\"nodeExpanded.emit($event)\"\n (nodeCollapsed)=\"nodeCollapsed.emit($event)\"\n ></sdc-tree-node-item>\n }\n</div>\n}\n", styles: [".sdc-tree-node-item{display:flex;width:100%;cursor:pointer}.sdc-tree-node-item__arrow{display:inline-flex;align-items:center;justify-content:center;padding:.1875rem .5625rem;border:0;background:transparent;cursor:pointer}.sdc-tree-node-item__content{display:flex;flex:1;align-items:center;padding:.1875rem 0}.sdc-tree-node-item__content:hover{background:#f1f7f8}.sdc-tree-node-item__icon,.sdc-tree-node-item__checkbox{display:inline-flex;align-items:center;padding-right:.5625rem}.sdc-tree-node-item__label{display:flex;flex:1;color:#212533;font-size:.875rem;line-height:1.5}.sdc-tree-node-item__editable{display:inline-flex;align-items:center;justify-content:center;padding:.5625rem;border:0;background:transparent;cursor:pointer}.sdc-tree-node-item__input{width:100%}.sdc-tree-node-item--selectable .sdc-tree-node-item__label{font-weight:700}.sdc-tree-node-item--selected .sdc-tree-node-item__content{background:#d5e8ec}.sdc-tree-node-item__children{display:flex;flex-direction:column;gap:.3125rem;overflow:hidden;padding-left:2.2em}.sdc-tree-node-item__child:first-child{padding-top:.3125rem}\n"] }]
150
+ }], propDecorators: { ariaLevel: [{
151
+ type: Input
152
+ }], showCheckbox: [{
153
+ type: Input
154
+ }], treeNodeItem: [{
155
+ type: Input,
156
+ args: [{ required: true }]
157
+ }], treeNodeItemClicked: [{
158
+ type: Output
159
+ }], treeNodeEdit: [{
160
+ type: Output
161
+ }], nodeExpanded: [{
162
+ type: Output
163
+ }], nodeCollapsed: [{
164
+ type: Output
165
+ }], input: [{
166
+ type: ViewChild,
167
+ args: ['input', { read: ElementRef }]
168
+ }] } });
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90cmVlL2NvbXBvbmVudHMvdHJlZS1ub2RlLWl0ZW0vdHJlZS1ub2RlLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90cmVlL2NvbXBvbmVudHMvdHJlZS1ub2RlLWl0ZW0vdHJlZS1ub2RlLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFGLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBa0N2RCxNQUFNLE9BQU8scUJBQXFCO0lBQ2YsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hDLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU3QyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNILFlBQVksQ0FBd0I7SUFFckQsbUJBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQWdELENBQUM7SUFDdkYsWUFB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Qzs2QkFDOUQsQ0FBQzs0QkFDRixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDdkYsQ0FBQzt3QkFDRixPQUFPLENBQUMsbUJBQW1CLEVBQUU7NEJBQzNCLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0NBQ25CLEtBQUssQ0FDSCxRQUFRLEVBQ1I7b0NBQ0UsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztvQ0FDckQsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQ0FDNUYsRUFDRCxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FDbkI7NkJBQ0YsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIOzhCQU1RLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDcUIsWUFBWTtzQkFBdEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBRWYsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUU2QyxLQUFLO3NCQUF4RCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgYW5pbWF0ZSwgcXVlcnksIHN0YWdnZXIsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbFRyZWVOb2RlSXRlbSwgVHJlZU5vZGVFZGl0IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS90eXBlcy90cmVlLnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtdHJlZS1ub2RlLWl0ZW0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgZm9yd2FyZFJlZigoKSA9PiBUcmVlTm9kZUl0ZW1Db21wb25lbnQpXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtbm9kZS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdHJlZS1ub2RlLWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignZmFkZUV4cGFuZCcsIFtcbiAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnLCBvcGFjaXR5OiAwLCBvdmVyZmxvdzogJ2hpZGRlbicgfSksXG4gICAgICAgIGFuaW1hdGUoJzIwMG1zIGVhc2Utb3V0Jywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgb3BhY2l0eTogMSB9KSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignOmxlYXZlJywgW2FuaW1hdGUoJzE1MG1zIGVhc2UtaW4nLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG9wYWNpdHk6IDAgfSkpXSlcbiAgICBdKSxcbiAgICB0cmlnZ2VyKCdjaGlsZHJlbkFuaW1hdGlvbicsIFtcbiAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgcXVlcnkoXG4gICAgICAgICAgJzplbnRlcicsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0xMHB4KScgfSksXG4gICAgICAgICAgICBzdGFnZ2VyKDYwLCBbYW5pbWF0ZSgnMjAwbXMgZWFzZS1vdXQnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCknIH0pKV0pXG4gICAgICAgICAgXSxcbiAgICAgICAgICB7IG9wdGlvbmFsOiB0cnVlIH1cbiAgICAgICAgKVxuICAgICAgXSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVOb2RlSXRlbUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgQElucHV0KCkgYXJpYUxldmVsID0gMTtcbiAgQElucHV0KCkgc2hvd0NoZWNrYm94ID0gZmFsc2U7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHRyZWVOb2RlSXRlbSE6IEludGVybmFsVHJlZU5vZGVJdGVtO1xuXG4gIEBPdXRwdXQoKSB0cmVlTm9kZUl0ZW1DbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IEludGVybmFsVHJlZU5vZGVJdGVtOyBldmVudDogRXZlbnQgfT4oKTtcbiAgQE91dHB1dCgpIHRyZWVOb2RlRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZU5vZGVFZGl0PigpO1xuICBAT3V0cHV0KCkgbm9kZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJbnRlcm5hbFRyZWVOb2RlSXRlbT4oKTtcbiAgQE91dHB1dCgpIG5vZGVDb2xsYXBzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEludGVybmFsVHJlZU5vZGVJdGVtPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByb3RlY3RlZCBpbnB1dD86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgcHJvdGVjdGVkIGdldCBoYXNDaGlsZHJlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnRyZWVOb2RlSXRlbT8uY2hpbGRyZW4/Lmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZWRpdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJlZU5vZGVJdGVtPy5lZGl0YWJsZSA/PyBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgY2hlY2tib3hBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgncGxhdGZvcm0uZGF0YWNvcmUudHJlZS5zZWxlY3QnKX0gJHt0aGlzLnRyZWVOb2RlSXRlbS5sYWJlbH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBleHBhbmRBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgncGxhdGZvcm0uZGF0YWNvcmUudHJlZS5leHBhbmQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgY29sbGFwc2VBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgncGxhdGZvcm0uZGF0YWNvcmUudHJlZS5jb2xsYXBzZScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBlZGl0SW5wdXRBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgncGxhdGZvcm0uZGF0YWNvcmUudHJlZS5lZGl0X25hbWUnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZWRpdEJ1dHRvbkFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdwbGF0Zm9ybS5kYXRhY29yZS50cmVlLmVkaXQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleHBhbmROb2RlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc0NoaWxkcmVuICYmICF0aGlzLnRyZWVOb2RlSXRlbS5pc0V4cGFuZGVkKSB7XG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkKHRoaXMudHJlZU5vZGVJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY29sbGFwc2VOb2RlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc0NoaWxkcmVuICYmIHRoaXMudHJlZU5vZGVJdGVtLmlzRXhwYW5kZWQpIHtcbiAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQodGhpcy50cmVlTm9kZUl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVDaGVja2JveENoYW5nZShldmVudDogRXZlbnQsIG5vZGU6IEludGVybmFsVHJlZU5vZGVJdGVtKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy50cmVlTm9kZUl0ZW1DbGlja2VkLmVtaXQoeyBpdGVtOiBub2RlLCBldmVudCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNoZWNrYm94S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgbm9kZTogSW50ZXJuYWxUcmVlTm9kZUl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnRyZWVOb2RlSXRlbUNsaWNrZWQuZW1pdCh7IGl0ZW06IG5vZGUsIGV2ZW50IH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVRyZWVOb2RlSXRlbUNsaWNrKGV2ZW50OiBFdmVudCwgdHJlZU5vZGVJdGVtPzogSW50ZXJuYWxUcmVlTm9kZUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLnRyZWVOb2RlSXRlbUNsaWNrZWQuZW1pdCh7IGl0ZW06IHRyZWVOb2RlSXRlbSA/PyB0aGlzLnRyZWVOb2RlSXRlbSwgZXZlbnQgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlVHJlZU5vZGVJdGVtS2V5Ym9hcmRBY3RpdmF0ZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVJdGVtQ2xpY2soZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZUV4cGFuZGVkKHRyZWVOb2RlSXRlbTogSW50ZXJuYWxUcmVlTm9kZUl0ZW0pOiB2b2lkIHtcbiAgICB0cmVlTm9kZUl0ZW0uaXNFeHBhbmRlZCA9ICF0cmVlTm9kZUl0ZW0uaXNFeHBhbmRlZDtcblxuICAgIGlmICh0cmVlTm9kZUl0ZW0uaXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5ub2RlRXhwYW5kZWQuZW1pdCh0cmVlTm9kZUl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5vZGVDb2xsYXBzZWQuZW1pdCh0cmVlTm9kZUl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVFZGl0aW5nKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudHJlZU5vZGVJdGVtLmlzRWRpdGluZyA9ICF0aGlzLnRyZWVOb2RlSXRlbS5pc0VkaXRpbmc7XG4gICAgdGhpcy50cmVlTm9kZUl0ZW0uZWRpdE5ld1ZhbHVlID0gdGhpcy50cmVlTm9kZUl0ZW0ubGFiZWw7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuaW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYW5jZWxFZGl0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudHJlZU5vZGVJdGVtLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMudHJlZU5vZGVJdGVtLmVkaXROZXdWYWx1ZSA9ICcnO1xuICAgIHRoaXMudHJlZU5vZGVJdGVtLmVkaXRQcmV2aW91c1ZhbHVlID0gJyc7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNhdmVFZGl0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudHJlZU5vZGVJdGVtLmlzRWRpdGluZyA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLnRyZWVOb2RlSXRlbS5lZGl0TmV3VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRyZWVOb2RlSXRlbS5lZGl0UHJldmlvdXNWYWx1ZSA9IHRoaXMudHJlZU5vZGVJdGVtLmxhYmVsO1xuICAgIHRoaXMudHJlZU5vZGVJdGVtLmxhYmVsID0gdGhpcy50cmVlTm9kZUl0ZW0uZWRpdE5ld1ZhbHVlO1xuXG4gICAgY29uc3QgcmV2ZXJ0QWN0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy50cmVlTm9kZUl0ZW0ubGFiZWwgPSB0aGlzLnRyZWVOb2RlSXRlbS5lZGl0UHJldmlvdXNWYWx1ZSA/PyB0aGlzLnRyZWVOb2RlSXRlbS5sYWJlbDtcbiAgICAgIHRoaXMudHJlZU5vZGVJdGVtLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH07XG5cbiAgICB0aGlzLnRyZWVOb2RlRWRpdC5lbWl0KHtcbiAgICAgIHJldmVydEFjdGlvbixcbiAgICAgIGl0ZW06IHRoaXMudHJlZU5vZGVJdGVtLFxuICAgICAgbmV3VmFsdWU6IHRoaXMudHJlZU5vZGVJdGVtLmVkaXROZXdWYWx1ZSxcbiAgICAgIHByZXZpb3VzVmFsdWU6IHRoaXMudHJlZU5vZGVJdGVtLmVkaXRQcmV2aW91c1ZhbHVlID8/ICcnXG4gICAgfSk7XG4gIH1cbn1cbiIsIkBpZiAodHJlZU5vZGVJdGVtKSB7XG48ZGl2XG4gIGNsYXNzPVwic2RjLXRyZWUtbm9kZS1pdGVtXCJcbiAgcm9sZT1cInRyZWVpdGVtXCJcbiAgdGFiaW5kZXg9XCIwXCJcbiAgW2NsYXNzLnNkYy10cmVlLW5vZGUtaXRlbS0tc2VsZWN0ZWRdPVwidHJlZU5vZGVJdGVtLmNoZWNrZWRcIlxuICBbY2xhc3Muc2RjLXRyZWUtbm9kZS1pdGVtLS1zZWxlY3RhYmxlXT1cInRyZWVOb2RlSXRlbS5jaGVja2VkID09PSB0cnVlIHx8IHRyZWVOb2RlSXRlbS5jaGVja2VkID09PSBudWxsXCJcbiAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJoYXNDaGlsZHJlbiA/IHRyZWVOb2RlSXRlbS5pc0V4cGFuZGVkIDogbnVsbFwiXG4gIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwidHJlZU5vZGVJdGVtLmNoZWNrZWQgPT09IHRydWUgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmVlTm9kZUl0ZW0ubGFiZWxcIlxuICBbYXR0ci5hcmlhLWxldmVsXT1cImFyaWFMZXZlbFwiXG4gIChrZXlkb3duLmVudGVyKT1cImhhbmRsZVRyZWVOb2RlSXRlbUtleWJvYXJkQWN0aXZhdGUoJGV2ZW50KVwiXG4gIChrZXlkb3duLnNwYWNlKT1cImhhbmRsZVRyZWVOb2RlSXRlbUtleWJvYXJkQWN0aXZhdGUoJGV2ZW50KVwiXG4gIChrZXlkb3duLmFycm93UmlnaHQpPVwiZXhwYW5kTm9kZSgpXCJcbiAgKGtleWRvd24uYXJyb3dMZWZ0KT1cImNvbGxhcHNlTm9kZSgpXCJcbj5cbiAgQGlmIChoYXNDaGlsZHJlbikge1xuICA8YnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJzZGMtdHJlZS1ub2RlLWl0ZW1fX2Fycm93XCJcbiAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVFeHBhbmRlZCh0cmVlTm9kZUl0ZW0pXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRyZWVOb2RlSXRlbS5pc0V4cGFuZGVkID8gY29sbGFwc2VBcmlhTGFiZWwgOiBleHBhbmRBcmlhTGFiZWxcIlxuICA+XG4gICAgQGlmICghdHJlZU5vZGVJdGVtLmlzRXhwYW5kZWQpIHtcbiAgICA8aSBbY2xhc3NdPVwidHJlZU5vZGVJdGVtLmNvbGxhcHNlZEljb24gfHwgJ2ZhcyBmYS1jaGV2cm9uLXJpZ2h0J1wiPjwvaT5cbiAgICB9XG4gICAgQGlmICh0cmVlTm9kZUl0ZW0uaXNFeHBhbmRlZCkge1xuICAgIDxpIFtjbGFzc109XCJ0cmVlTm9kZUl0ZW0uZXhwYW5kZWRJY29uIHx8ICdmYXMgZmEtY2hldnJvbi1kb3duJ1wiPjwvaT5cbiAgICB9XG4gIDwvYnV0dG9uPlxuICB9XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2RjLXRyZWUtbm9kZS1pdGVtX19jb250ZW50XCJcbiAgICAoY2xpY2spPVwiaGFuZGxlVHJlZU5vZGVJdGVtQ2xpY2soJGV2ZW50KVwiXG4gICAgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlVHJlZU5vZGVJdGVtS2V5Ym9hcmRBY3RpdmF0ZSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bi5zcGFjZSk9XCJoYW5kbGVUcmVlTm9kZUl0ZW1LZXlib2FyZEFjdGl2YXRlKCRldmVudClcIlxuICA+XG4gICAgQGlmICh0cmVlTm9kZUl0ZW0uaWNvbiB8fCB0cmVlTm9kZUl0ZW0uaXNFZGl0aW5nKSB7XG4gICAgPHNwYW4gY2xhc3M9XCJzZGMtdHJlZS1ub2RlLWl0ZW1fX2ljb25cIj5cbiAgICAgIEBpZiAodHJlZU5vZGVJdGVtLmljb24gJiYgIXRyZWVOb2RlSXRlbS5pc0VkaXRpbmcpIHtcbiAgICAgIDxpIFtjbGFzc109XCJ0cmVlTm9kZUl0ZW0uaWNvblwiPjwvaT5cbiAgICAgIH1cbiAgICAgIEBpZiAodHJlZU5vZGVJdGVtLmlzRWRpdGluZykge1xuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJzZGMtdHJlZS1ub2RlLWl0ZW1fX2VkaXQtaWNvblwiXG4gICAgICAgIChjbGljayk9XCJzYXZlRWRpdCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvc3Bhbj5cbiAgICB9XG5cbiAgICBAaWYgKHNob3dDaGVja2JveCAmJiAhdHJlZU5vZGVJdGVtLmlzRWRpdGluZykge1xuICAgIDxzcGFuIGNsYXNzPVwic2RjLXRyZWUtbm9kZS1pdGVtX19jaGVja2JveFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtjaGVja2VkXT1cInRyZWVOb2RlSXRlbS5jaGVja2VkID09PSB0cnVlXCJcbiAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwidHJlZU5vZGVJdGVtLmNoZWNrZWQgPT09IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNoZWNrYm94QXJpYUxhYmVsXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNoZWNrYm94Q2hhbmdlKCRldmVudCwgdHJlZU5vZGVJdGVtKVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uQ2hlY2tib3hLZXlkb3duKCRldmVudCwgdHJlZU5vZGVJdGVtKVwiXG4gICAgICAvPlxuICAgIDwvc3Bhbj5cbiAgICB9XG5cbiAgICA8c3BhbiBjbGFzcz1cInNkYy10cmVlLW5vZGUtaXRlbV9fbGFiZWxcIj5cbiAgICAgIEBpZiAodHJlZU5vZGVJdGVtLmlzRWRpdGluZykge1xuICAgICAgPGlucHV0XG4gICAgICAgICNpbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGNsYXNzPVwic2RjLXRyZWUtbm9kZS1pdGVtX19pbnB1dFwiXG4gICAgICAgIFsobmdNb2RlbCldPVwidHJlZU5vZGVJdGVtLmVkaXROZXdWYWx1ZVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZWRpdElucHV0QXJpYUxhYmVsXCJcbiAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2F2ZUVkaXQoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJjYW5jZWxFZGl0KCRldmVudClcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgIHt7IHRyZWVOb2RlSXRlbS5sYWJlbCB9fVxuICAgICAgfVxuICAgIDwvc3Bhbj5cblxuICAgIEBpZiAoZWRpdGFibGUpIHtcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwic2RjLXRyZWUtbm9kZS1pdGVtX19lZGl0YWJsZVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImVkaXRCdXR0b25BcmlhTGFiZWxcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRpbmcoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGVuY2lsLWFsdFwiPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG59XG5cbkBpZiAoaGFzQ2hpbGRyZW4gJiYgdHJlZU5vZGVJdGVtLmlzRXhwYW5kZWQpIHtcbjxkaXZcbiAgQGZhZGVFeHBhbmRcbiAgY2xhc3M9XCJzZGMtdHJlZS1ub2RlLWl0ZW1fX2NoaWxkcmVuXCJcbiAgQGNoaWxkcmVuQW5pbWF0aW9uXG4+XG4gIEBmb3IgKGNoaWxkIG9mIHRyZWVOb2RlSXRlbS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQuaWQpIHtcbiAgPHNkYy10cmVlLW5vZGUtaXRlbVxuICAgIGNsYXNzPVwic2RjLXRyZWUtbm9kZS1pdGVtX19jaGlsZFwiXG4gICAgW3Nob3dDaGVja2JveF09XCJzaG93Q2hlY2tib3hcIlxuICAgIFt0cmVlTm9kZUl0ZW1dPVwiY2hpbGRcIlxuICAgIFthcmlhTGV2ZWxdPVwiYXJpYUxldmVsICsgMVwiXG4gICAgKHRyZWVOb2RlSXRlbUNsaWNrZWQpPVwidHJlZU5vZGVJdGVtQ2xpY2tlZC5lbWl0KCRldmVudClcIlxuICAgICh0cmVlTm9kZUVkaXQpPVwidHJlZU5vZGVFZGl0LmVtaXQoJGV2ZW50KVwiXG4gICAgKG5vZGVFeHBhbmRlZCk9XCJub2RlRXhwYW5kZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAobm9kZUNvbGxhcHNlZCk9XCJub2RlQ29sbGFwc2VkLmVtaXQoJGV2ZW50KVwiXG4gID48L3NkYy10cmVlLW5vZGUtaXRlbT5cbiAgfVxuPC9kaXY+XG59XG4iXX0=
@@ -0,0 +1,211 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
3
+ import { LoadingStateDirective } from '../../core/directives/loading-state.directive';
4
+ import { flattenTree } from '../../core/utils/tree.util';
5
+ import { TreeNodeItemComponent } from './components/tree-node-item/tree-node-item.component';
6
+ import * as i0 from "@angular/core";
7
+ export class TreeComponent {
8
+ treeData = [];
9
+ loading = false;
10
+ selectionMode = 'single';
11
+ showCheckbox = false;
12
+ allExpanded = false;
13
+ _selected = [];
14
+ get selected() {
15
+ return this._selected;
16
+ }
17
+ set selected(value) {
18
+ this._selected = this.normalizeTreeSelection(value);
19
+ }
20
+ selectedChange = new EventEmitter();
21
+ treeNodeItemClicked = new EventEmitter();
22
+ treeNodeEdit = new EventEmitter();
23
+ nodeExpanded = new EventEmitter();
24
+ nodeCollapsed = new EventEmitter();
25
+ ngOnChanges(changes) {
26
+ if (changes['selected'] && this.selected.length) {
27
+ this.syncSelectedChanges();
28
+ }
29
+ if (changes['treeData'] && this.treeData.length && this.allExpanded) {
30
+ this.expandAll();
31
+ }
32
+ if (changes['allExpanded'] && !changes['allExpanded'].firstChange) {
33
+ if (this.allExpanded) {
34
+ this.expandAll();
35
+ }
36
+ else {
37
+ this.collapseAll();
38
+ }
39
+ }
40
+ }
41
+ onTreeNodeItemClicked({ item }) {
42
+ const parsedItem = this.parseInternalTreeNodeItem(item);
43
+ this.treeNodeItemClicked.emit(parsedItem);
44
+ this.toggleChecked(item);
45
+ }
46
+ onTreeNodeEdit(payload) {
47
+ this.treeNodeEdit.emit({
48
+ ...payload,
49
+ item: this.parseInternalTreeNodeItem(payload.item)
50
+ });
51
+ }
52
+ onNodeExpanded(item) {
53
+ this.nodeExpanded.emit(this.parseInternalTreeNodeItem(item));
54
+ }
55
+ onNodeCollapsed(item) {
56
+ this.nodeCollapsed.emit(this.parseInternalTreeNodeItem(item));
57
+ }
58
+ toggleChecked(treeNodeItem) {
59
+ if (!this.multiple) {
60
+ flattenTree(this.treeData).forEach((item) => {
61
+ item.checked = false;
62
+ });
63
+ treeNodeItem.checked = true;
64
+ this.selected = [treeNodeItem];
65
+ this.emitSelection();
66
+ return;
67
+ }
68
+ treeNodeItem.checked = treeNodeItem.checked !== true;
69
+ this.syncChildrenCheckedState(treeNodeItem);
70
+ this.emitSelection();
71
+ }
72
+ syncChildrenCheckedState(selectedTreeNode) {
73
+ const parentChecked = selectedTreeNode.checked;
74
+ if (selectedTreeNode.children) {
75
+ selectedTreeNode.children.forEach((item) => {
76
+ item.checked = parentChecked;
77
+ flattenTree(item.children ?? []).forEach((child) => {
78
+ child.checked = parentChecked;
79
+ });
80
+ });
81
+ }
82
+ else {
83
+ // no children to update
84
+ }
85
+ const updateCheckedStateRecursively = (node) => {
86
+ if (!node.children?.length) {
87
+ return;
88
+ }
89
+ node.children.forEach(updateCheckedStateRecursively);
90
+ const allChildrenChecked = node.children.every((child) => child.checked === true);
91
+ const someChildrenChecked = node.children.some((child) => child.checked === true || child.checked === null);
92
+ const allChildrenUnchecked = node.children.every((child) => child.checked === false || child.checked === undefined);
93
+ if (allChildrenChecked) {
94
+ node.checked = true;
95
+ }
96
+ else if (someChildrenChecked) {
97
+ node.checked = null;
98
+ }
99
+ else if (allChildrenUnchecked) {
100
+ node.checked = false;
101
+ }
102
+ else {
103
+ node.checked = false;
104
+ }
105
+ };
106
+ this.treeData.forEach(updateCheckedStateRecursively);
107
+ }
108
+ emitSelection() {
109
+ const selected = this.selectedElements;
110
+ this.selected = [...selected];
111
+ this.selectedChange.emit(this.multiple ? selected : selected[0]);
112
+ }
113
+ syncSelectedChanges() {
114
+ const flattened = flattenTree(this.treeData);
115
+ flattened.forEach((node) => {
116
+ node.checked = false;
117
+ });
118
+ this.selected.forEach((selectedItem) => {
119
+ const item = flattened.find((node) => node.id === selectedItem.id);
120
+ if (item) {
121
+ item.checked = true;
122
+ if (item.children && this.multiple) {
123
+ item.children.forEach((child) => {
124
+ child.checked = true;
125
+ flattenTree(child.children ?? []).forEach((descendant) => {
126
+ descendant.checked = true;
127
+ });
128
+ });
129
+ }
130
+ }
131
+ });
132
+ if (this.multiple) {
133
+ this.treeData.forEach((node) => this.syncChildrenCheckedState(node));
134
+ }
135
+ this.emitSelection();
136
+ }
137
+ collapseAll() {
138
+ flattenTree(this.treeData).forEach((item) => {
139
+ item.isExpanded = false;
140
+ });
141
+ }
142
+ expandAll() {
143
+ flattenTree(this.treeData).forEach((item) => {
144
+ item.isExpanded = true;
145
+ });
146
+ }
147
+ normalizeTreeSelection(value) {
148
+ if (!value) {
149
+ return [];
150
+ }
151
+ return Array.isArray(value) ? value : [value];
152
+ }
153
+ parseInternalTreeNodeItem(internalTreeNodeItem) {
154
+ return {
155
+ id: internalTreeNodeItem.id,
156
+ label: internalTreeNodeItem.label,
157
+ icon: internalTreeNodeItem.icon,
158
+ checked: internalTreeNodeItem.checked,
159
+ isExpanded: internalTreeNodeItem.isExpanded,
160
+ payload: internalTreeNodeItem.payload,
161
+ editable: internalTreeNodeItem.editable,
162
+ leaf: internalTreeNodeItem.leaf,
163
+ expandedIcon: internalTreeNodeItem.expandedIcon,
164
+ collapsedIcon: internalTreeNodeItem.collapsedIcon,
165
+ children: internalTreeNodeItem.children?.map((child) => this.parseInternalTreeNodeItem(child))
166
+ };
167
+ }
168
+ get selectedElements() {
169
+ return flattenTree(this.treeData).filter((item) => {
170
+ if (item.checked !== true) {
171
+ return false;
172
+ }
173
+ if (!this.multiple) {
174
+ return true;
175
+ }
176
+ return item.leaf === true || !item.children?.length;
177
+ });
178
+ }
179
+ get multiple() {
180
+ return this.selectionMode === 'multiple';
181
+ }
182
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
183
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TreeComponent, isStandalone: true, selector: "sdc-tree", inputs: { treeData: "treeData", loading: "loading", selectionMode: "selectionMode", showCheckbox: "showCheckbox", allExpanded: "allExpanded", selected: "selected" }, outputs: { selectedChange: "selectedChange", treeNodeItemClicked: "treeNodeItemClicked", treeNodeEdit: "treeNodeEdit", nodeExpanded: "nodeExpanded", nodeCollapsed: "nodeCollapsed" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"sdc-tree\"\n *sdcLoadingState=\"loading\"\n>\n @for (item of treeData; track item.id) {\n <sdc-tree-node-item\n [showCheckbox]=\"showCheckbox\"\n [treeNodeItem]=\"item\"\n (nodeExpanded)=\"onNodeExpanded($event)\"\n (nodeCollapsed)=\"onNodeCollapsed($event)\"\n (treeNodeEdit)=\"onTreeNodeEdit($event)\"\n (treeNodeItemClicked)=\"onTreeNodeItemClicked($event)\"\n ></sdc-tree-node-item>\n }\n</div>\n", styles: [".sdc-tree{display:flex;flex-direction:column;gap:.3125rem;margin:.9375rem;padding:.9375rem;border:1px solid #ddd;border-radius:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LoadingStateDirective, selector: "[sdcLoadingState]", inputs: ["sdcLoadingState"] }, { kind: "component", type: TreeNodeItemComponent, selector: "sdc-tree-node-item", inputs: ["ariaLevel", "showCheckbox", "treeNodeItem"], outputs: ["treeNodeItemClicked", "treeNodeEdit", "nodeExpanded", "nodeCollapsed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
184
+ }
185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TreeComponent, decorators: [{
186
+ type: Component,
187
+ args: [{ selector: 'sdc-tree', standalone: true, imports: [CommonModule, LoadingStateDirective, TreeNodeItemComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div\n class=\"sdc-tree\"\n *sdcLoadingState=\"loading\"\n>\n @for (item of treeData; track item.id) {\n <sdc-tree-node-item\n [showCheckbox]=\"showCheckbox\"\n [treeNodeItem]=\"item\"\n (nodeExpanded)=\"onNodeExpanded($event)\"\n (nodeCollapsed)=\"onNodeCollapsed($event)\"\n (treeNodeEdit)=\"onTreeNodeEdit($event)\"\n (treeNodeItemClicked)=\"onTreeNodeItemClicked($event)\"\n ></sdc-tree-node-item>\n }\n</div>\n", styles: [".sdc-tree{display:flex;flex-direction:column;gap:.3125rem;margin:.9375rem;padding:.9375rem;border:1px solid #ddd;border-radius:.25rem}\n"] }]
188
+ }], propDecorators: { treeData: [{
189
+ type: Input
190
+ }], loading: [{
191
+ type: Input
192
+ }], selectionMode: [{
193
+ type: Input
194
+ }], showCheckbox: [{
195
+ type: Input
196
+ }], allExpanded: [{
197
+ type: Input
198
+ }], selected: [{
199
+ type: Input
200
+ }], selectedChange: [{
201
+ type: Output
202
+ }], treeNodeItemClicked: [{
203
+ type: Output
204
+ }], treeNodeEdit: [{
205
+ type: Output
206
+ }], nodeExpanded: [{
207
+ type: Output
208
+ }], nodeCollapsed: [{
209
+ type: Output
210
+ }] } });
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RyZWUvdHJlZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RyZWUvdHJlZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBT3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7QUFXN0YsTUFBTSxPQUFPLGFBQWE7SUFDZixRQUFRLEdBQW1CLEVBQUUsQ0FBQztJQUM5QixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLGFBQWEsR0FBc0IsUUFBUSxDQUFDO0lBQzVDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUVyQixTQUFTLEdBQW1CLEVBQUUsQ0FBQztJQUV2QyxJQUNJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQWdEO1FBQzNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFUyxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWlDLENBQUM7SUFDbkUsbUJBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7SUFDdkQsWUFB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QUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxVQUFVLENBQUM7SUFDM0MsQ0FBQzt3R0F0TlUsYUFBYTs0RkFBYixhQUFhLHNiQy9CMUIseWJBZUEsaU1EVVksWUFBWSwrQkFBRSxxQkFBcUIsMkZBQUUscUJBQXFCOzs0RkFNekQsYUFBYTtrQkFUekIsU0FBUzsrQkFDRSxVQUFVLGNBQ1IsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDLG1CQUdwRCx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxRQUFROzhCQUdoQyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFLRixRQUFRO3NCQURYLEtBQUs7Z0JBUUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBMb2FkaW5nU3RhdGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvbG9hZGluZy1zdGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHR5cGUge1xuICBJbnRlcm5hbFRyZWVOb2RlSXRlbSxcbiAgVHJlZU5vZGVFZGl0LFxuICBUcmVlTm9kZUl0ZW0sXG4gIFRyZWVTZWxlY3Rpb25Nb2RlXG59IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvdHJlZS50eXBlJztcbmltcG9ydCB7IGZsYXR0ZW5UcmVlIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy90cmVlLnV0aWwnO1xuaW1wb3J0IHsgVHJlZU5vZGVJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RyZWUtbm9kZS1pdGVtL3RyZWUtbm9kZS1pdGVtLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy10cmVlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTG9hZGluZ1N0YXRlRGlyZWN0aXZlLCBUcmVlTm9kZUl0ZW1Db21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RyZWUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB0cmVlRGF0YTogVHJlZU5vZGVJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiBUcmVlU2VsZWN0aW9uTW9kZSA9ICdzaW5nbGUnO1xuICBASW5wdXQoKSBzaG93Q2hlY2tib3ggPSBmYWxzZTtcbiAgQElucHV0KCkgYWxsRXhwYW5kZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9zZWxlY3RlZDogVHJlZU5vZGVJdGVtW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0ZWQoKTogVHJlZU5vZGVJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuICBzZXQgc2VsZWN0ZWQodmFsdWU6IFRyZWVOb2RlSXRlbVtdIHwgVHJlZU5vZGVJdGVtIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB0aGlzLm5vcm1hbGl6ZVRyZWVTZWxlY3Rpb24odmFsdWUpO1xuICB9XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlTm9kZUl0ZW1bXSB8IFRyZWVOb2RlSXRlbT4oKTtcbiAgQE91dHB1dCgpIHRyZWVOb2RlSXRlbUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVOb2RlSXRlbT4oKTtcbiAgQE91dHB1dCgpIHRyZWVOb2RlRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZU5vZGVFZGl0PigpO1xuICBAT3V0cHV0KCkgbm9kZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlTm9kZUl0ZW0+KCk7XG4gIEBPdXRwdXQoKSBub2RlQ29sbGFwc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlTm9kZUl0ZW0+KCk7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZCddICYmIHRoaXMuc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnN5bmNTZWxlY3RlZENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sndHJlZURhdGEnXSAmJiB0aGlzLnRyZWVEYXRhLmxlbmd0aCAmJiB0aGlzLmFsbEV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydhbGxFeHBhbmRlZCddICYmICFjaGFuZ2VzWydhbGxFeHBhbmRlZCddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBpZiAodGhpcy5hbGxFeHBhbmRlZCkge1xuICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb2xsYXBzZUFsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblRyZWVOb2RlSXRlbUNsaWNrZWQoe1xuICAgIGl0ZW1cbiAgfToge1xuICAgIGl0ZW06IEludGVybmFsVHJlZU5vZGVJdGVtO1xuICB9KTogdm9pZCB7XG4gICAgY29uc3QgcGFyc2VkSXRlbSA9IHRoaXMucGFyc2VJbnRlcm5hbFRyZWVOb2RlSXRlbShpdGVtKTtcbiAgICB0aGlzLnRyZWVOb2RlSXRlbUNsaWNrZWQuZW1pdChwYXJzZWRJdGVtKTtcbiAgICB0aGlzLnRvZ2dsZUNoZWNrZWQoaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25UcmVlTm9kZUVkaXQocGF5bG9hZDogVHJlZU5vZGVFZGl0KTogdm9pZCB7XG4gICAgdGhpcy50cmVlTm9kZUVkaXQuZW1pdCh7XG4gICAgICAuLi5wYXlsb2FkLFxuICAgICAgaXRlbTogdGhpcy5wYXJzZUludGVybmFsVHJlZU5vZGVJdGVtKHBheWxvYWQuaXRlbSlcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk5vZGVFeHBhbmRlZChpdGVtOiBJbnRlcm5hbFRyZWVOb2RlSXRlbSk6IHZvaWQge1xuICAgIHRoaXMubm9kZUV4cGFuZGVkLmVtaXQodGhpcy5wYXJzZUludGVybmFsVHJlZU5vZGVJdGVtKGl0ZW0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk5vZGVDb2xsYXBzZWQoaXRlbTogSW50ZXJuYWxUcmVlTm9kZUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVDb2xsYXBzZWQuZW1pdCh0aGlzLnBhcnNlSW50ZXJuYWxUcmVlTm9kZUl0ZW0oaXRlbSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVDaGVja2VkKHRyZWVOb2RlSXRlbTogVHJlZU5vZGVJdGVtKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICBmbGF0dGVuVHJlZSh0aGlzLnRyZWVEYXRhKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgICB0cmVlTm9kZUl0ZW0uY2hlY2tlZCA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gW3RyZWVOb2RlSXRlbV07XG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cmVlTm9kZUl0ZW0uY2hlY2tlZCA9IHRyZWVOb2RlSXRlbS5jaGVja2VkICE9PSB0cnVlO1xuICAgIHRoaXMuc3luY0NoaWxkcmVuQ2hlY2tlZFN0YXRlKHRyZWVOb2RlSXRlbSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNDaGlsZHJlbkNoZWNrZWRTdGF0ZShzZWxlY3RlZFRyZWVOb2RlOiBUcmVlTm9kZUl0ZW0pOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRDaGVja2VkID0gc2VsZWN0ZWRUcmVlTm9kZS5jaGVja2VkO1xuXG4gICAgaWYgKHNlbGVjdGVkVHJlZU5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHNlbGVjdGVkVHJlZU5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLmNoZWNrZWQgPSBwYXJlbnRDaGVja2VkO1xuICAgICAgICBmbGF0dGVuVHJlZShpdGVtLmNoaWxkcmVuID8/IFtdKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGNoaWxkLmNoZWNrZWQgPSBwYXJlbnRDaGVja2VkO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBubyBjaGlsZHJlbiB0byB1cGRhdGVcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVDaGVja2VkU3RhdGVSZWN1cnNpdmVseSA9IChub2RlOiBUcmVlTm9kZUl0ZW0pOiB2b2lkID0+IHtcbiAgICAgIGlmICghbm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKHVwZGF0ZUNoZWNrZWRTdGF0ZVJlY3Vyc2l2ZWx5KTtcblxuICAgICAgY29uc3QgYWxsQ2hpbGRyZW5DaGVja2VkID0gbm9kZS5jaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmNoZWNrZWQgPT09IHRydWUpO1xuICAgICAgY29uc3Qgc29tZUNoaWxkcmVuQ2hlY2tlZCA9IG5vZGUuY2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNoaWxkKSA9PiBjaGlsZC5jaGVja2VkID09PSB0cnVlIHx8IGNoaWxkLmNoZWNrZWQgPT09IG51bGxcbiAgICAgICk7XG4gICAgICBjb25zdCBhbGxDaGlsZHJlblVuY2hlY2tlZCA9IG5vZGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgICAgIChjaGlsZCkgPT4gY2hpbGQuY2hlY2tlZCA9PT0gZmFsc2UgfHwgY2hpbGQuY2hlY2tlZCA9PT0gdW5kZWZpbmVkXG4gICAgICApO1xuXG4gICAgICBpZiAoYWxsQ2hpbGRyZW5DaGVja2VkKSB7XG4gICAgICAgIG5vZGUuY2hlY2tlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHNvbWVDaGlsZHJlbkNoZWNrZWQpIHtcbiAgICAgICAgbm9kZS5jaGVja2VkID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoYWxsQ2hpbGRyZW5VbmNoZWNrZWQpIHtcbiAgICAgICAgbm9kZS5jaGVja2VkID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy50cmVlRGF0YS5mb3JFYWNoKHVwZGF0ZUNoZWNrZWRTdGF0ZVJlY3Vyc2l2ZWx5KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50cztcbiAgICB0aGlzLnNlbGVjdGVkID0gWy4uLnNlbGVjdGVkXTtcbiAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5tdWx0aXBsZSA/IHNlbGVjdGVkIDogc2VsZWN0ZWRbMF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jU2VsZWN0ZWRDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IGZsYXR0ZW5UcmVlKHRoaXMudHJlZURhdGEpO1xuICAgIGZsYXR0ZW5lZC5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBub2RlLmNoZWNrZWQgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0ZWQuZm9yRWFjaCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gZmxhdHRlbmVkLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IHNlbGVjdGVkSXRlbS5pZCk7XG5cbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgZmxhdHRlblRyZWUoY2hpbGQuY2hpbGRyZW4gPz8gW10pLmZvckVhY2goKGRlc2NlbmRhbnQpID0+IHtcbiAgICAgICAgICAgICAgZGVzY2VuZGFudC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy50cmVlRGF0YS5mb3JFYWNoKChub2RlKSA9PiB0aGlzLnN5bmNDaGlsZHJlbkNoZWNrZWRTdGF0ZShub2RlKSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGNvbGxhcHNlQWxsKCk6IHZvaWQge1xuICAgIGZsYXR0ZW5UcmVlKHRoaXMudHJlZURhdGEpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW0uaXNFeHBhbmRlZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBhbmRBbGwoKTogdm9pZCB7XG4gICAgZmxhdHRlblRyZWUodGhpcy50cmVlRGF0YSkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaXRlbS5pc0V4cGFuZGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplVHJlZVNlbGVjdGlvbih2YWx1ZTogVHJlZU5vZGVJdGVtW10gfCBUcmVlTm9kZUl0ZW0gfCB1bmRlZmluZWQpOiBUcmVlTm9kZUl0ZW1bXSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW50ZXJuYWxUcmVlTm9kZUl0ZW08VCA9IHVua25vd24+KFxuICAgIGludGVybmFsVHJlZU5vZGVJdGVtOiBJbnRlcm5hbFRyZWVOb2RlSXRlbTxUPlxuICApOiBUcmVlTm9kZUl0ZW08VD4ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogaW50ZXJuYWxUcmVlTm9kZUl0ZW0uaWQsXG4gICAgICBsYWJlbDogaW50ZXJuYWxUcmVlTm9kZUl0ZW0ubGFiZWwsXG4gICAgICBpY29uOiBpbnRlcm5hbFRyZWVOb2RlSXRlbS5pY29uLFxuICAgICAgY2hlY2tlZDogaW50ZXJuYWxUcmVlTm9kZUl0ZW0uY2hlY2tlZCxcbiAgICAgIGlzRXhwYW5kZWQ6IGludGVybmFsVHJlZU5vZGVJdGVtLmlzRXhwYW5kZWQsXG4gICAgICBwYXlsb2FkOiBpbnRlcm5hbFRyZWVOb2RlSXRlbS5wYXlsb2FkLFxuICAgICAgZWRpdGFibGU6IGludGVybmFsVHJlZU5vZGVJdGVtLmVkaXRhYmxlLFxuICAgICAgbGVhZjogaW50ZXJuYWxUcmVlTm9kZUl0ZW0ubGVhZixcbiAgICAgIGV4cGFuZGVkSWNvbjogaW50ZXJuYWxUcmVlTm9kZUl0ZW0uZXhwYW5kZWRJY29uLFxuICAgICAgY29sbGFwc2VkSWNvbjogaW50ZXJuYWxUcmVlTm9kZUl0ZW0uY29sbGFwc2VkSWNvbixcbiAgICAgIGNoaWxkcmVuOiBpbnRlcm5hbFRyZWVOb2RlSXRlbS5jaGlsZHJlbj8ubWFwKChjaGlsZCkgPT4gdGhpcy5wYXJzZUludGVybmFsVHJlZU5vZGVJdGVtKGNoaWxkKSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc2VsZWN0ZWRFbGVtZW50cygpOiBUcmVlTm9kZUl0ZW1bXSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5UcmVlKHRoaXMudHJlZURhdGEpLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uY2hlY2tlZCAhPT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGl0ZW0ubGVhZiA9PT0gdHJ1ZSB8fCAhaXRlbS5jaGlsZHJlbj8ubGVuZ3RoO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ211bHRpcGxlJztcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInNkYy10cmVlXCJcbiAgKnNkY0xvYWRpbmdTdGF0ZT1cImxvYWRpbmdcIlxuPlxuICBAZm9yIChpdGVtIG9mIHRyZWVEYXRhOyB0cmFjayBpdGVtLmlkKSB7XG4gIDxzZGMtdHJlZS1ub2RlLWl0ZW1cbiAgICBbc2hvd0NoZWNrYm94XT1cInNob3dDaGVja2JveFwiXG4gICAgW3RyZWVOb2RlSXRlbV09XCJpdGVtXCJcbiAgICAobm9kZUV4cGFuZGVkKT1cIm9uTm9kZUV4cGFuZGVkKCRldmVudClcIlxuICAgIChub2RlQ29sbGFwc2VkKT1cIm9uTm9kZUNvbGxhcHNlZCgkZXZlbnQpXCJcbiAgICAodHJlZU5vZGVFZGl0KT1cIm9uVHJlZU5vZGVFZGl0KCRldmVudClcIlxuICAgICh0cmVlTm9kZUl0ZW1DbGlja2VkKT1cIm9uVHJlZU5vZGVJdGVtQ2xpY2tlZCgkZXZlbnQpXCJcbiAgPjwvc2RjLXRyZWUtbm9kZS1pdGVtPlxuICB9XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,41 @@
1
+ import { Component, EventEmitter, Input, Output } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class VisualSqlEditorFieldModalComponent {
4
+ visible = false;
5
+ step = "select";
6
+ drafts = [];
7
+ functionEditColumn = null;
8
+ functionDraft = { functionName: "" };
9
+ visibleChange = new EventEmitter();
10
+ closed = new EventEmitter();
11
+ stepChange = new EventEmitter();
12
+ draftsChange = new EventEmitter();
13
+ saved = new EventEmitter();
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorFieldModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: VisualSqlEditorFieldModalComponent, isStandalone: true, selector: "sdc-vse-field-modal", inputs: { visible: "visible", step: "step", drafts: "drafts", functionEditColumn: "functionEditColumn", functionDraft: "functionDraft" }, outputs: { visibleChange: "visibleChange", closed: "closed", stepChange: "stepChange", draftsChange: "draftsChange", saved: "saved" }, ngImport: i0, template: "<ng-container><!-- field modal stub --></ng-container>\n", styles: [""] });
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorFieldModalComponent, decorators: [{
18
+ type: Component,
19
+ args: [{ selector: "sdc-vse-field-modal", standalone: true, imports: [], template: "<ng-container><!-- field modal stub --></ng-container>\n" }]
20
+ }], propDecorators: { visible: [{
21
+ type: Input
22
+ }], step: [{
23
+ type: Input
24
+ }], drafts: [{
25
+ type: Input
26
+ }], functionEditColumn: [{
27
+ type: Input
28
+ }], functionDraft: [{
29
+ type: Input
30
+ }], visibleChange: [{
31
+ type: Output
32
+ }], closed: [{
33
+ type: Output
34
+ }], stepChange: [{
35
+ type: Output
36
+ }], draftsChange: [{
37
+ type: Output
38
+ }], saved: [{
39
+ type: Output
40
+ }] } });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3ItZmllbGQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy92aXN1YWwtc3FsLWVkaXRvci9jb21wb25lbnRzL3Zpc3VhbC1zcWwtZWRpdG9yLWZpZWxkLW1vZGFsL3Zpc3VhbC1zcWwtZWRpdG9yLWZpZWxkLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdmlzdWFsLXNxbC1lZGl0b3IvY29tcG9uZW50cy92aXN1YWwtc3FsLWVkaXRvci1maWVsZC1tb2RhbC92aXN1YWwtc3FsLWVkaXRvci1maWVsZC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVd2RSxNQUFNLE9BQU8sa0NBQWtDO0lBQ2xDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsSUFBSSxHQUFtQixRQUFRLENBQUM7SUFDaEMsTUFBTSxHQUE4QixFQUFFLENBQUM7SUFDdkMsa0JBQWtCLEdBQWtCLElBQUksQ0FBQztJQUN6QyxhQUFhLEdBQW9DLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBRTVELGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBQzVDLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQ2xDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztJQUNoRCxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7SUFDN0QsS0FBSyxHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO3dHQVhoRSxrQ0FBa0M7NEZBQWxDLGtDQUFrQyxnV0NYL0MsMERBQ0E7OzRGRFVhLGtDQUFrQztrQkFQOUMsU0FBUzsrQkFDSSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQLEVBQUU7OEJBS0YsT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRWEsYUFBYTtzQkFBL0IsTUFBTTtnQkFDWSxNQUFNO3NCQUF4QixNQUFNO2dCQUNZLFVBQVU7c0JBQTVCLE1BQU07Z0JBQ1ksWUFBWTtzQkFBOUIsTUFBTTtnQkFDWSxLQUFLO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEeW5hbWljVmlld0J1aWxkZXJGaWVsZCwgRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRGdW5jdGlvbiB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb3JlL3R5cGVzL2R5bmFtaWMtdmlldy1idWlsZGVyLnR5cGVcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRNb2RhbFN0ZXAgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdmlzdWFsLXNxbC1lZGl0b3IudHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwic2RjLXZzZS1maWVsZC1tb2RhbFwiLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW10sXG4gICAgdGVtcGxhdGVVcmw6IFwiLi92aXN1YWwtc3FsLWVkaXRvci1maWVsZC1tb2RhbC5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiLi92aXN1YWwtc3FsLWVkaXRvci1maWVsZC1tb2RhbC5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgVmlzdWFsU3FsRWRpdG9yRmllbGRNb2RhbENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgdmlzaWJsZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHN0ZXA6IEZpZWxkTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgICBASW5wdXQoKSBkcmFmdHM6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkW10gPSBbXTtcbiAgICBASW5wdXQoKSBmdW5jdGlvbkVkaXRDb2x1bW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIGZ1bmN0aW9uRHJhZnQ6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkRnVuY3Rpb24gPSB7IGZ1bmN0aW9uTmFtZTogXCJcIiB9O1xuXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmllbGRNb2RhbFN0ZXA+KCk7XG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGRyYWZ0c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY1ZpZXdCdWlsZGVyRmllbGRbXT4oKTtcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2F2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNWaWV3QnVpbGRlckZpZWxkW10+KCk7XG59XG4iLCI8bmctY29udGFpbmVyPjwhLS0gZmllbGQgbW9kYWwgc3R1YiAtLT48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -0,0 +1,38 @@
1
+ import { Component, EventEmitter, Input, Output } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class VisualSqlEditorFilterModalComponent {
4
+ visible = false;
5
+ editIndex = null;
6
+ step = "select";
7
+ mode = "condition";
8
+ draft = {};
9
+ visibleChange = new EventEmitter();
10
+ closed = new EventEmitter();
11
+ stepChange = new EventEmitter();
12
+ saved = new EventEmitter();
13
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorFilterModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: VisualSqlEditorFilterModalComponent, isStandalone: true, selector: "sdc-vse-filter-modal", inputs: { visible: "visible", editIndex: "editIndex", step: "step", mode: "mode", draft: "draft" }, outputs: { visibleChange: "visibleChange", closed: "closed", stepChange: "stepChange", saved: "saved" }, ngImport: i0, template: "<ng-container><!-- filter modal stub --></ng-container>\n", styles: [""] });
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorFilterModalComponent, decorators: [{
17
+ type: Component,
18
+ args: [{ selector: "sdc-vse-filter-modal", standalone: true, imports: [], template: "<ng-container><!-- filter modal stub --></ng-container>\n" }]
19
+ }], propDecorators: { visible: [{
20
+ type: Input
21
+ }], editIndex: [{
22
+ type: Input
23
+ }], step: [{
24
+ type: Input
25
+ }], mode: [{
26
+ type: Input
27
+ }], draft: [{
28
+ type: Input
29
+ }], visibleChange: [{
30
+ type: Output
31
+ }], closed: [{
32
+ type: Output
33
+ }], stepChange: [{
34
+ type: Output
35
+ }], saved: [{
36
+ type: Output
37
+ }] } });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3ItZmlsdGVyLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdmlzdWFsLXNxbC1lZGl0b3IvY29tcG9uZW50cy92aXN1YWwtc3FsLWVkaXRvci1maWx0ZXItbW9kYWwvdmlzdWFsLXNxbC1lZGl0b3ItZmlsdGVyLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdmlzdWFsLXNxbC1lZGl0b3IvY29tcG9uZW50cy92aXN1YWwtc3FsLWVkaXRvci1maWx0ZXItbW9kYWwvdmlzdWFsLXNxbC1lZGl0b3ItZmlsdGVyLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBV3ZFLE1BQU0sT0FBTyxtQ0FBbUM7SUFDbkMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixTQUFTLEdBQWtCLElBQUksQ0FBQztJQUNoQyxJQUFJLEdBQW9CLFFBQVEsQ0FBQztJQUNqQyxJQUFJLEdBQW9CLFdBQVcsQ0FBQztJQUNwQyxLQUFLLEdBQXNDLEVBQUUsQ0FBQztJQUVwQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUM1QyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUNsQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFDakQsS0FBSyxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO3dHQVYvRCxtQ0FBbUM7NEZBQW5DLG1DQUFtQyw2UkNYaEQsMkRBQ0E7OzRGRFVhLG1DQUFtQztrQkFQL0MsU0FBUzsrQkFDSSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLEVBQUU7OEJBS0YsT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRWEsYUFBYTtzQkFBL0IsTUFBTTtnQkFDWSxNQUFNO3NCQUF4QixNQUFNO2dCQUNZLFVBQVU7c0JBQTVCLE1BQU07Z0JBQ1ksS0FBSztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmUvdHlwZXMvZHluYW1pYy12aWV3LWJ1aWxkZXIudHlwZVwiO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJNb2RhbE1vZGUsIEZpbHRlck1vZGFsU3RlcCB9IGZyb20gXCIuLi8uLi90eXBlcy92aXN1YWwtc3FsLWVkaXRvci50eXBlc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJzZGMtdnNlLWZpbHRlci1tb2RhbFwiLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW10sXG4gICAgdGVtcGxhdGVVcmw6IFwiLi92aXN1YWwtc3FsLWVkaXRvci1maWx0ZXItbW9kYWwuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4vdmlzdWFsLXNxbC1lZGl0b3ItZmlsdGVyLW1vZGFsLmNvbXBvbmVudC5zY3NzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBWaXN1YWxTcWxFZGl0b3JGaWx0ZXJNb2RhbENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgdmlzaWJsZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGVkaXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgc3RlcDogRmlsdGVyTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgICBASW5wdXQoKSBtb2RlOiBGaWx0ZXJNb2RhbE1vZGUgPSBcImNvbmRpdGlvblwiO1xuICAgIEBJbnB1dCgpIGRyYWZ0OiBQYXJ0aWFsPER5bmFtaWNWaWV3QnVpbGRlckZpbHRlcj4gPSB7fTtcblxuICAgIEBPdXRwdXQoKSByZWFkb25seSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlck1vZGFsU3RlcD4oKTtcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2F2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNWaWV3QnVpbGRlckZpbHRlcj4oKTtcbn1cbiIsIjxuZy1jb250YWluZXI+PCEtLSBmaWx0ZXIgbW9kYWwgc3R1YiAtLT48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ import { Component, EventEmitter, Input, Output } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class VisualSqlEditorJoinModalComponent {
4
+ visible = false;
5
+ editIndex = null;
6
+ draft = { sourceColumn: "", targetColumn: "", operator: "" };
7
+ visibleChange = new EventEmitter();
8
+ closed = new EventEmitter();
9
+ saved = new EventEmitter();
10
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorJoinModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: VisualSqlEditorJoinModalComponent, isStandalone: true, selector: "sdc-vse-join-modal", inputs: { visible: "visible", editIndex: "editIndex", draft: "draft" }, outputs: { visibleChange: "visibleChange", closed: "closed", saved: "saved" }, ngImport: i0, template: "<ng-container><!-- join modal stub --></ng-container>\n", styles: [""] });
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorJoinModalComponent, decorators: [{
14
+ type: Component,
15
+ args: [{ selector: "sdc-vse-join-modal", standalone: true, imports: [], template: "<ng-container><!-- join modal stub --></ng-container>\n" }]
16
+ }], propDecorators: { visible: [{
17
+ type: Input
18
+ }], editIndex: [{
19
+ type: Input
20
+ }], draft: [{
21
+ type: Input
22
+ }], visibleChange: [{
23
+ type: Output
24
+ }], closed: [{
25
+ type: Output
26
+ }], saved: [{
27
+ type: Output
28
+ }] } });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3Itam9pbi1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Zpc3VhbC1zcWwtZWRpdG9yL2NvbXBvbmVudHMvdmlzdWFsLXNxbC1lZGl0b3Itam9pbi1tb2RhbC92aXN1YWwtc3FsLWVkaXRvci1qb2luLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdmlzdWFsLXNxbC1lZGl0b3IvY29tcG9uZW50cy92aXN1YWwtc3FsLWVkaXRvci1qb2luLW1vZGFsL3Zpc3VhbC1zcWwtZWRpdG9yLWpvaW4tbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFVdkUsTUFBTSxPQUFPLGlDQUFpQztJQUNqQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLFNBQVMsR0FBa0IsSUFBSSxDQUFDO0lBQ2hDLEtBQUssR0FBMkIsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBRTNFLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBQzVDLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQ2xDLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQzt3R0FQN0QsaUNBQWlDOzRGQUFqQyxpQ0FBaUMscU9DVjlDLHlEQUNBOzs0RkRTYSxpQ0FBaUM7a0JBUDdDLFNBQVM7K0JBQ0ksb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxFQUFFOzhCQUtGLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFYSxhQUFhO3NCQUEvQixNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksS0FBSztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgRHluYW1pY1ZpZXdCdWlsZGVySm9pbiB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb3JlL3R5cGVzL2R5bmFtaWMtdmlldy1idWlsZGVyLnR5cGVcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwic2RjLXZzZS1qb2luLW1vZGFsXCIsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXSxcbiAgICB0ZW1wbGF0ZVVybDogXCIuL3Zpc3VhbC1zcWwtZWRpdG9yLWpvaW4tbW9kYWwuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4vdmlzdWFsLXNxbC1lZGl0b3Itam9pbi1tb2RhbC5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgVmlzdWFsU3FsRWRpdG9ySm9pbk1vZGFsQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSB2aXNpYmxlID0gZmFsc2U7XG4gICAgQElucHV0KCkgZWRpdEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBkcmFmdDogRHluYW1pY1ZpZXdCdWlsZGVySm9pbiA9IHsgc291cmNlQ29sdW1uOiBcIlwiLCB0YXJnZXRDb2x1bW46IFwiXCIsIG9wZXJhdG9yOiBcIlwiIH07XG5cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBzYXZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY1ZpZXdCdWlsZGVySm9pbj4oKTtcbn1cbiIsIjxuZy1jb250YWluZXI+PCEtLSBqb2luIG1vZGFsIHN0dWIgLS0+PC9uZy1jb250YWluZXI+XG4iXX0=