@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,367 @@
1
+ import { ApplicationRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Injector, ViewEncapsulation, createComponent, inject } from '@angular/core';
2
+ import { Subject, takeUntil } from 'rxjs';
3
+ import { enableBodyScroll, disableBodyScroll } from '../../../../core/utils/body-scroll.util';
4
+ import { TieredMenuEventService } from '../../services/tiered-menu.event.service';
5
+ import { TieredMenuService } from '../../services/tiered-menu.service';
6
+ import { TieredMenuDividerComponent } from '../tiered-menu-divider/tiered-menu-divider.component';
7
+ import { TieredMenuItemComponent } from '../tiered-menu-item/tiered-menu-item.component';
8
+ import * as i0 from "@angular/core";
9
+ // Menu layout constants
10
+ const TIERED_MENU_ITEM_HEIGHT = 37;
11
+ const TIERED_MENU_DIVIDER_HEIGHT = 5;
12
+ const TIERED_MENU_PADDING = 8;
13
+ const TIERED_MENU_DEFAULT_WIDTH = 176;
14
+ const TIERED_MENU_EXTRA_PADDING = 8;
15
+ export class TieredMenuComponent {
16
+ appRef = inject(ApplicationRef);
17
+ injector = inject(Injector);
18
+ cdr = inject(ChangeDetectorRef);
19
+ tieredMenuService = inject(TieredMenuService);
20
+ eventService = inject(TieredMenuEventService);
21
+ ariaLabel;
22
+ items = [];
23
+ top = 0;
24
+ left = 0;
25
+ menuTriggerEvent = 'hover';
26
+ isSubmenu = false;
27
+ componentRef = null;
28
+ menuElement = null;
29
+ unsubscribe$ = new Subject();
30
+ onResize() {
31
+ this.eventService.closeAllMenusEvent.emit();
32
+ }
33
+ onDocumentClick(event) {
34
+ const target = event.target;
35
+ if (!(target instanceof Element)) {
36
+ this.eventService.closeAllMenusEvent.emit();
37
+ return;
38
+ }
39
+ const clickedInside = target.closest('sdc-tiered-menu-item') || target.closest('sdc-tiered-menu-divider');
40
+ if (!clickedInside) {
41
+ this.eventService.closeAllMenusEvent.emit();
42
+ }
43
+ }
44
+ onKeydownHandler(event) {
45
+ const currentItem = this.getCurrentNavigableItem();
46
+ const action = this.getKeydownAction(event, currentItem);
47
+ if (action) {
48
+ action();
49
+ }
50
+ }
51
+ ngOnInit() {
52
+ this.subscribeEvents();
53
+ if (!this.isSubmenu) {
54
+ this.tieredMenuService.items = this.items;
55
+ this.tieredMenuService.currentItems = this.items;
56
+ this.tieredMenuService.currentItem = this.items[0] ?? null;
57
+ disableBodyScroll();
58
+ requestAnimationFrame(() => this.focusCurrentItem());
59
+ }
60
+ }
61
+ ngOnDestroy() {
62
+ this.unsubscribe$.next();
63
+ this.unsubscribe$.complete();
64
+ }
65
+ focusCurrentItem() {
66
+ const id = this.tieredMenuService.currentItem?.id;
67
+ if (!id) {
68
+ return;
69
+ }
70
+ document.getElementById(id)?.focus();
71
+ }
72
+ incrementCurrentItem() {
73
+ if (!this.tieredMenuService.currentItem) {
74
+ this.tieredMenuService.currentItem = this.tieredMenuService.currentItems[0] ?? null;
75
+ return;
76
+ }
77
+ if (!this.items.includes(this.tieredMenuService.currentItem)) {
78
+ return;
79
+ }
80
+ let nextItem = this.tieredMenuService.currentItem;
81
+ let iterations = 0;
82
+ const maxIterations = this.tieredMenuService.currentItems.length;
83
+ do {
84
+ const currentIndex = this.tieredMenuService.currentItems.indexOf(nextItem) + 1;
85
+ nextItem =
86
+ currentIndex < this.tieredMenuService.currentItems.length
87
+ ? this.tieredMenuService.currentItems[currentIndex]
88
+ : this.tieredMenuService.currentItems[0];
89
+ iterations++;
90
+ } while (nextItem?.divider && iterations < maxIterations);
91
+ // Only update if we found a non-divider item
92
+ if (!nextItem?.divider) {
93
+ this.tieredMenuService.currentItem = nextItem;
94
+ }
95
+ }
96
+ decrementCurrentItem() {
97
+ if (!this.tieredMenuService.currentItem) {
98
+ this.tieredMenuService.currentItem = this.tieredMenuService.currentItems[0] ?? null;
99
+ return;
100
+ }
101
+ if (!this.items.includes(this.tieredMenuService.currentItem)) {
102
+ return;
103
+ }
104
+ let previousItem = this.tieredMenuService.currentItem;
105
+ let iterations = 0;
106
+ const maxIterations = this.tieredMenuService.currentItems.length;
107
+ do {
108
+ const currentIndex = this.tieredMenuService.currentItems.indexOf(previousItem) - 1;
109
+ previousItem =
110
+ currentIndex >= 0
111
+ ? this.tieredMenuService.currentItems[currentIndex]
112
+ : this.tieredMenuService.currentItems[this.tieredMenuService.currentItems.length - 1];
113
+ iterations++;
114
+ } while (previousItem?.divider && iterations < maxIterations);
115
+ // Only update if we found a non-divider item
116
+ if (!previousItem?.divider) {
117
+ this.tieredMenuService.currentItem = previousItem;
118
+ }
119
+ }
120
+ createMenu(items, position) {
121
+ if (this.componentRef || !items.length) {
122
+ return;
123
+ }
124
+ this.componentRef = createComponent(TieredMenuComponent, {
125
+ environmentInjector: this.appRef.injector,
126
+ elementInjector: this.injector
127
+ });
128
+ this.appRef.attachView(this.componentRef.hostView);
129
+ const hostElement = this.componentRef.location.nativeElement;
130
+ document.body.appendChild(hostElement);
131
+ this.componentRef.instance.items = items;
132
+ this.componentRef.instance.isSubmenu = true;
133
+ this.menuElement = hostElement.querySelector('.sdc-tiered-menu');
134
+ this.setMenuPosition(position);
135
+ }
136
+ destroy(propagate = true) {
137
+ if (this.componentRef) {
138
+ // Recursively destroy nested submenus before destroying this component,
139
+ // because componentRef.destroy() cancels subscriptions (ngOnDestroy), which
140
+ // would prevent the child from cleaning up its own submenus.
141
+ this.componentRef.instance.destroy(false);
142
+ this.appRef.detachView(this.componentRef.hostView);
143
+ this.componentRef.destroy();
144
+ this.componentRef = null;
145
+ this.menuElement = null;
146
+ }
147
+ if (propagate) {
148
+ this.eventService.closeAllMenusEvent.emit();
149
+ }
150
+ }
151
+ setMenuPosition(position) {
152
+ if (!this.componentRef) {
153
+ return;
154
+ }
155
+ const { top, right, bottom, left } = position;
156
+ const menuWidth = this.menuElement?.getBoundingClientRect().width ?? TIERED_MENU_DEFAULT_WIDTH;
157
+ const itemsCount = this.countMenuItems(false);
158
+ const dividersCount = this.countMenuItems(true);
159
+ const menuHeight = itemsCount * TIERED_MENU_ITEM_HEIGHT + dividersCount * TIERED_MENU_DIVIDER_HEIGHT + TIERED_MENU_PADDING + TIERED_MENU_EXTRA_PADDING;
160
+ this.setMenuHorizontalPosition(left, right, menuWidth);
161
+ this.setMenuVerticalPosition(top, bottom, menuHeight);
162
+ }
163
+ countMenuItems(isDivider) {
164
+ if (!this.componentRef) {
165
+ return 0;
166
+ }
167
+ return this.componentRef.instance.items.reduce((count, item) => (item.divider === isDivider ? count + 1 : count), 0);
168
+ }
169
+ setMenuHorizontalPosition(left, right, menuWidth) {
170
+ if (!this.componentRef) {
171
+ return;
172
+ }
173
+ this.componentRef.instance.left = this.hasSpaceOnRight(right, menuWidth) ? right : left - menuWidth;
174
+ }
175
+ setMenuVerticalPosition(top, bottom, menuHeight) {
176
+ if (!this.componentRef) {
177
+ return;
178
+ }
179
+ const hasSpaceAtBottom = this.hasSpaceAtBottom(bottom, menuHeight);
180
+ this.componentRef.instance.top = hasSpaceAtBottom ? window.scrollY + top : Math.max(window.innerHeight - menuHeight, window.scrollY);
181
+ }
182
+ hasSpaceOnRight(right, menuWidth) {
183
+ return window.innerWidth - right > menuWidth;
184
+ }
185
+ hasSpaceAtBottom(bottom, menuHeight) {
186
+ return window.innerHeight - bottom > menuHeight;
187
+ }
188
+ subscribeEvents() {
189
+ this.eventService.incrementCurrentItemEvent.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
190
+ this.incrementCurrentItem();
191
+ this.focusCurrentItem();
192
+ });
193
+ this.eventService.decrementCurrentItemEvent.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
194
+ this.decrementCurrentItem();
195
+ this.focusCurrentItem();
196
+ });
197
+ this.eventService.selectItemEvent.pipe(takeUntil(this.unsubscribe$)).subscribe((item) => {
198
+ if (!item) {
199
+ return;
200
+ }
201
+ if (item.submenu) {
202
+ this.eventService.openItemMenuEvent.emit(item);
203
+ }
204
+ else if (item.command) {
205
+ item.command();
206
+ this.eventService.closeAllMenusEvent.emit();
207
+ }
208
+ else {
209
+ this.eventService.closeAllMenusEvent.emit();
210
+ }
211
+ });
212
+ this.eventService.closeAllMenusEvent.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
213
+ this.destroy(false);
214
+ this.tieredMenuService.currentItem = null;
215
+ this.resetCurrentItems();
216
+ this.items = this.tieredMenuService.markAllItemsAsClosed(this.items);
217
+ this.tieredMenuService.items = this.tieredMenuService.markAllItemsAsClosed(this.tieredMenuService.items);
218
+ enableBodyScroll();
219
+ this.cdr.markForCheck();
220
+ });
221
+ this.eventService.openItemMenuEvent.pipe(takeUntil(this.unsubscribe$)).subscribe((item) => {
222
+ if (!item) {
223
+ return;
224
+ }
225
+ if (this.tieredMenuService.currentItem?.parent &&
226
+ item.parent &&
227
+ !this.tieredMenuService.searchTheHierarchy(this.tieredMenuService.currentItem.parent, item)) {
228
+ this.closeCurrentItemAncestors(item);
229
+ }
230
+ this.openItemSubmenu(item);
231
+ });
232
+ this.eventService.closeItemMenuEvent.pipe(takeUntil(this.unsubscribe$)).subscribe((item) => {
233
+ if (!item) {
234
+ return;
235
+ }
236
+ // Only process if this item belongs to the current menu or is an ancestor item
237
+ const isInCurrentItems = this.items.some((entry) => entry.id === item.id);
238
+ const isAncestorOfCurrentItem = this.tieredMenuService.currentItem &&
239
+ this.tieredMenuService.searchTheHierarchy(item, this.tieredMenuService.currentItem);
240
+ if (!isInCurrentItems && !isAncestorOfCurrentItem) {
241
+ return;
242
+ }
243
+ if (item.parent) {
244
+ item.parent.isOpen = false;
245
+ }
246
+ this.tieredMenuService.currentItems =
247
+ item.parent?.parent?.submenu ?? this.tieredMenuService.items;
248
+ this.tieredMenuService.currentItem = item.parent ?? null;
249
+ this.destroy(false);
250
+ requestAnimationFrame(() => this.focusCurrentItem());
251
+ });
252
+ }
253
+ closeCurrentItemAncestors(targetItem) {
254
+ let current = this.tieredMenuService.currentItem;
255
+ if (!current) {
256
+ return;
257
+ }
258
+ // Close ancestors by direct state mutation instead of emitting events to avoid re-entrancy
259
+ while (current && current.parent !== targetItem.parent) {
260
+ current.isOpen = false;
261
+ current = current.parent ?? null;
262
+ }
263
+ if (current) {
264
+ current.isOpen = false;
265
+ }
266
+ // Single change detection run after closing all ancestors
267
+ this.cdr.detectChanges();
268
+ }
269
+ openItemSubmenu(item) {
270
+ if (!item.submenu || item.isOpen || !this.items.includes(item)) {
271
+ return;
272
+ }
273
+ const itemElement = document.getElementById(item.id ?? '');
274
+ if (!itemElement) {
275
+ return;
276
+ }
277
+ this.createMenu(item.submenu, itemElement.getBoundingClientRect());
278
+ this.tieredMenuService.currentItems = item.submenu;
279
+ this.tieredMenuService.currentItem = item.submenu[0] ?? null;
280
+ item.isOpen = true;
281
+ requestAnimationFrame(() => this.focusCurrentItem());
282
+ }
283
+ getCurrentNavigableItem() {
284
+ const currentItem = this.tieredMenuService.currentItem;
285
+ if (!currentItem || !this.items.includes(currentItem)) {
286
+ return null;
287
+ }
288
+ return currentItem;
289
+ }
290
+ getKeydownAction(event, currentItem) {
291
+ switch (event.key) {
292
+ case 'Escape':
293
+ return () => this.closeAllMenus(event, true);
294
+ case 'Tab':
295
+ return () => this.closeAllMenus(event, false);
296
+ case ' ':
297
+ case 'Enter':
298
+ return () => this.selectCurrentItem(event, currentItem);
299
+ case 'ArrowUp':
300
+ return () => this.moveCurrentItem(event, false);
301
+ case 'ArrowDown':
302
+ return () => this.moveCurrentItem(event, true);
303
+ case 'ArrowLeft':
304
+ return () => this.closeCurrentItemMenu(event, currentItem);
305
+ case 'ArrowRight':
306
+ return () => this.openCurrentItemMenu(event, currentItem);
307
+ default:
308
+ return null;
309
+ }
310
+ }
311
+ resetCurrentItems() {
312
+ this.tieredMenuService.currentItems = this.tieredMenuService.items;
313
+ }
314
+ closeAllMenus(event, preventDefault) {
315
+ this.eventService.closeAllMenusEvent.emit();
316
+ if (preventDefault) {
317
+ event.preventDefault();
318
+ }
319
+ }
320
+ selectCurrentItem(event, currentItem) {
321
+ if (!currentItem || currentItem.disabled) {
322
+ return;
323
+ }
324
+ this.eventService.selectItemEvent.emit(currentItem);
325
+ event.preventDefault();
326
+ }
327
+ moveCurrentItem(event, increment) {
328
+ if (increment) {
329
+ this.eventService.incrementCurrentItemEvent.emit();
330
+ }
331
+ else {
332
+ this.eventService.decrementCurrentItemEvent.emit();
333
+ }
334
+ event.preventDefault();
335
+ }
336
+ closeCurrentItemMenu(event, currentItem) {
337
+ if (!currentItem) {
338
+ return;
339
+ }
340
+ this.eventService.closeItemMenuEvent.emit(currentItem);
341
+ this.cdr.detectChanges();
342
+ event.preventDefault();
343
+ }
344
+ openCurrentItemMenu(event, currentItem) {
345
+ if (!currentItem || currentItem.disabled) {
346
+ return;
347
+ }
348
+ this.eventService.openItemMenuEvent.emit(currentItem);
349
+ event.preventDefault();
350
+ }
351
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
352
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TieredMenuComponent, isStandalone: true, selector: "sdc-tiered-menu", host: { listeners: { "window:resize": "onResize()", "document:click": "onDocumentClick($event)", "document:keydown": "onKeydownHandler($event)" } }, ngImport: i0, template: "<div\n class=\"sdc-tiered-menu\"\n role=\"menu\"\n [attr.aria-label]=\"ariaLabel\"\n [style.left.px]=\"left\"\n [style.top.px]=\"top\"\n>\n @for (item of items; track item.id) {\n @if (item.visible && !item.divider) {\n <sdc-tiered-menu-item\n [item]=\"item\"\n [focused]=\"item === tieredMenuService.currentItem\"\n [highlight]=\"item.isOpen === true\"\n [triggerEvent]=\"menuTriggerEvent\"\n [closeOnClick]=\"false\"\n ></sdc-tiered-menu-item>\n }\n @if (item.divider) {\n <sdc-tiered-menu-divider></sdc-tiered-menu-divider>\n }\n }\n</div>\n", styles: [".sdc-tiered-menu{position:absolute;z-index:9999;display:inline-flex;flex-direction:column;min-width:11rem;max-height:100vh;padding:.25rem 0;overflow-y:auto;border:1px solid #ccc;border-radius:.375rem;background:#fff;box-shadow:0 2px 12px #0000001a}\n"], dependencies: [{ kind: "component", type: TieredMenuItemComponent, selector: "sdc-tiered-menu-item", inputs: ["item", "focused", "highlight", "triggerEvent", "closeOnClick"] }, { kind: "component", type: TieredMenuDividerComponent, selector: "sdc-tiered-menu-divider" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
353
+ }
354
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuComponent, decorators: [{
355
+ type: Component,
356
+ args: [{ selector: 'sdc-tiered-menu', standalone: true, imports: [TieredMenuItemComponent, TieredMenuDividerComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div\n class=\"sdc-tiered-menu\"\n role=\"menu\"\n [attr.aria-label]=\"ariaLabel\"\n [style.left.px]=\"left\"\n [style.top.px]=\"top\"\n>\n @for (item of items; track item.id) {\n @if (item.visible && !item.divider) {\n <sdc-tiered-menu-item\n [item]=\"item\"\n [focused]=\"item === tieredMenuService.currentItem\"\n [highlight]=\"item.isOpen === true\"\n [triggerEvent]=\"menuTriggerEvent\"\n [closeOnClick]=\"false\"\n ></sdc-tiered-menu-item>\n }\n @if (item.divider) {\n <sdc-tiered-menu-divider></sdc-tiered-menu-divider>\n }\n }\n</div>\n", styles: [".sdc-tiered-menu{position:absolute;z-index:9999;display:inline-flex;flex-direction:column;min-width:11rem;max-height:100vh;padding:.25rem 0;overflow-y:auto;border:1px solid #ccc;border-radius:.375rem;background:#fff;box-shadow:0 2px 12px #0000001a}\n"] }]
357
+ }], propDecorators: { onResize: [{
358
+ type: HostListener,
359
+ args: ['window:resize']
360
+ }], onDocumentClick: [{
361
+ type: HostListener,
362
+ args: ['document:click', ['$event']]
363
+ }], onKeydownHandler: [{
364
+ type: HostListener,
365
+ args: ['document:keydown', ['$event']]
366
+ }] } });
367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90aWVyZWQtbWVudS9jb21wb25lbnRzL3RpZXJlZC1tZW51L3RpZXJlZC1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdGllcmVkLW1lbnUvY29tcG9uZW50cy90aWVyZWQtbWVudS90aWVyZWQtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUVULFlBQVksRUFDWixRQUFRLEVBR1IsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFOUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDbEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7O0FBRXpGLHdCQUF3QjtBQUN4QixNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUNuQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQUNyQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQUN0QyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQVdw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LENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsUUFBUTs4QkFxQi9CLFFBQVE7c0JBRGpCLFlBQVk7dUJBQUMsZUFBZTtnQkFNbkIsZUFBZTtzQkFEeEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFpQmhDLGdCQUFnQjtzQkFEekIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGNyZWF0ZUNvbXBvbmVudCxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGVuYWJsZUJvZHlTY3JvbGwsIGRpc2FibGVCb2R5U2Nyb2xsIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9ib2R5LXNjcm9sbC51dGlsJztcbmltcG9ydCB0eXBlIHsgVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEsIFRpZXJlZE1lbnVUcmlnZ2VyRXZlbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3R5cGVzL3RpZXJlZC1tZW51LnR5cGUnO1xuaW1wb3J0IHsgVGllcmVkTWVudUV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpZXJlZC1tZW51LmV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGllcmVkTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aWVyZWQtbWVudS5zZXJ2aWNlJztcbmltcG9ydCB7IFRpZXJlZE1lbnVEaXZpZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vdGllcmVkLW1lbnUtZGl2aWRlci90aWVyZWQtbWVudS1kaXZpZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaWVyZWRNZW51SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL3RpZXJlZC1tZW51LWl0ZW0vdGllcmVkLW1lbnUtaXRlbS5jb21wb25lbnQnO1xuXG4vLyBNZW51IGxheW91dCBjb25zdGFudHNcbmNvbnN0IFRJRVJFRF9NRU5VX0lURU1fSEVJR0hUID0gMzc7XG5jb25zdCBUSUVSRURfTUVOVV9ESVZJREVSX0hFSUdIVCA9IDU7XG5jb25zdCBUSUVSRURfTUVOVV9QQURESU5HID0gODtcbmNvbnN0IFRJRVJFRF9NRU5VX0RFRkFVTFRfV0lEVEggPSAxNzY7XG5jb25zdCBUSUVSRURfTUVOVV9FWFRSQV9QQURESU5HID0gODtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2RjLXRpZXJlZC1tZW51JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1RpZXJlZE1lbnVJdGVtQ29tcG9uZW50LCBUaWVyZWRNZW51RGl2aWRlckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90aWVyZWQtbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RpZXJlZC1tZW51LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZFxufSlcbmV4cG9ydCBjbGFzcyBUaWVyZWRNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcFJlZiA9IGluamVjdChBcHBsaWNhdGlvblJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHJlYWRvbmx5IHRpZXJlZE1lbnVTZXJ2aWNlID0gaW5qZWN0KFRpZXJlZE1lbnVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudFNlcnZpY2UgPSBpbmplY3QoVGllcmVkTWVudUV2ZW50U2VydmljZSk7XG5cbiAgcHVibGljIGFyaWFMYWJlbD86IHN0cmluZztcbiAgcHVibGljIGl0ZW1zOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YVtdID0gW107XG4gIHB1YmxpYyB0b3AgPSAwO1xuICBwdWJsaWMgbGVmdCA9IDA7XG4gIHB1YmxpYyBtZW51VHJpZ2dlckV2ZW50OiBUaWVyZWRNZW51VHJpZ2dlckV2ZW50ID0gJ2hvdmVyJztcbiAgcHVibGljIGlzU3VibWVudSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8VGllcmVkTWVudUNvbXBvbmVudD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZW51RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBwcm90ZWN0ZWQgb25SZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudFNlcnZpY2UuY2xvc2VBbGxNZW51c0V2ZW50LmVtaXQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgcHJvdGVjdGVkIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5jbG9zZUFsbE1lbnVzRXZlbnQuZW1pdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0YXJnZXQuY2xvc2VzdCgnc2RjLXRpZXJlZC1tZW51LWl0ZW0nKSB8fCB0YXJnZXQuY2xvc2VzdCgnc2RjLXRpZXJlZC1tZW51LWRpdmlkZXInKTtcblxuICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xuICAgICAgdGhpcy5ldmVudFNlcnZpY2UuY2xvc2VBbGxNZW51c0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgcHJvdGVjdGVkIG9uS2V5ZG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50SXRlbSA9IHRoaXMuZ2V0Q3VycmVudE5hdmlnYWJsZUl0ZW0oKTtcblxuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuZ2V0S2V5ZG93bkFjdGlvbihldmVudCwgY3VycmVudEl0ZW0pO1xuXG4gICAgaWYgKGFjdGlvbikge1xuICAgICAgYWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoKTtcblxuICAgIGlmICghdGhpcy5pc1N1Ym1lbnUpIHtcbiAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IHRoaXMuaXRlbXNbMF0gPz8gbnVsbDtcbiAgICAgIGRpc2FibGVCb2R5U2Nyb2xsKCk7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5mb2N1c0N1cnJlbnRJdGVtKCkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0N1cnJlbnRJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbT8uaWQ7XG4gICAgaWYgKCFpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKT8uZm9jdXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5jcmVtZW50Q3VycmVudEl0ZW0oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKSB7XG4gICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbMF0gPz8gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXRlbXMuaW5jbHVkZXModGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV4dEl0ZW0gPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtO1xuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBjb25zdCBtYXhJdGVyYXRpb25zID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMubGVuZ3RoO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMuaW5kZXhPZihuZXh0SXRlbSkgKyAxO1xuICAgICAgbmV4dEl0ZW0gPVxuICAgICAgICBjdXJyZW50SW5kZXggPCB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcy5sZW5ndGhcbiAgICAgICAgICA/IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zW2N1cnJlbnRJbmRleF1cbiAgICAgICAgICA6IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zWzBdO1xuICAgICAgaXRlcmF0aW9ucysrO1xuICAgIH0gd2hpbGUgKG5leHRJdGVtPy5kaXZpZGVyICYmIGl0ZXJhdGlvbnMgPCBtYXhJdGVyYXRpb25zKTtcblxuICAgIC8vIE9ubHkgdXBkYXRlIGlmIHdlIGZvdW5kIGEgbm9uLWRpdmlkZXIgaXRlbVxuICAgIGlmICghbmV4dEl0ZW0/LmRpdmlkZXIpIHtcbiAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSBuZXh0SXRlbTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlY3JlbWVudEN1cnJlbnRJdGVtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSkge1xuICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zWzBdID8/IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLml0ZW1zLmluY2x1ZGVzKHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHByZXZpb3VzSXRlbSA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW07XG4gICAgbGV0IGl0ZXJhdGlvbnMgPSAwO1xuICAgIGNvbnN0IG1heEl0ZXJhdGlvbnMgPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcy5sZW5ndGg7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcy5pbmRleE9mKHByZXZpb3VzSXRlbSkgLSAxO1xuICAgICAgcHJldmlvdXNJdGVtID1cbiAgICAgICAgY3VycmVudEluZGV4ID49IDBcbiAgICAgICAgICA/IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zW2N1cnJlbnRJbmRleF1cbiAgICAgICAgICA6IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zW3RoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgaXRlcmF0aW9ucysrO1xuICAgIH0gd2hpbGUgKHByZXZpb3VzSXRlbT8uZGl2aWRlciAmJiBpdGVyYXRpb25zIDwgbWF4SXRlcmF0aW9ucyk7XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBpZiB3ZSBmb3VuZCBhIG5vbi1kaXZpZGVyIGl0ZW1cbiAgICBpZiAoIXByZXZpb3VzSXRlbT8uZGl2aWRlcikge1xuICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IHByZXZpb3VzSXRlbTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lbnUoaXRlbXM6IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhW10sIHBvc2l0aW9uOiBET01SZWN0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBvbmVudFJlZiA9IGNyZWF0ZUNvbXBvbmVudChUaWVyZWRNZW51Q29tcG9uZW50LCB7XG4gICAgICBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmFwcFJlZi5pbmplY3RvcixcbiAgICAgIGVsZW1lbnRJbmplY3RvcjogdGhpcy5pbmplY3RvclxuICAgIH0pO1xuICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuXG4gICAgY29uc3QgaG9zdEVsZW1lbnQgPSB0aGlzLmNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaG9zdEVsZW1lbnQpO1xuXG4gICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuaXRlbXMgPSBpdGVtcztcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5pc1N1Ym1lbnUgPSB0cnVlO1xuICAgIHRoaXMubWVudUVsZW1lbnQgPSBob3N0RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2RjLXRpZXJlZC1tZW51Jyk7XG4gICAgdGhpcy5zZXRNZW51UG9zaXRpb24ocG9zaXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95KHByb3BhZ2F0ZSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGRlc3Ryb3kgbmVzdGVkIHN1Ym1lbnVzIGJlZm9yZSBkZXN0cm95aW5nIHRoaXMgY29tcG9uZW50LFxuICAgICAgLy8gYmVjYXVzZSBjb21wb25lbnRSZWYuZGVzdHJveSgpIGNhbmNlbHMgc3Vic2NyaXB0aW9ucyAobmdPbkRlc3Ryb3kpLCB3aGljaFxuICAgICAgLy8gd291bGQgcHJldmVudCB0aGUgY2hpbGQgZnJvbSBjbGVhbmluZyB1cCBpdHMgb3duIHN1Ym1lbnVzLlxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuZGVzdHJveShmYWxzZSk7XG5cbiAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcodGhpcy5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgdGhpcy5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSBudWxsO1xuICAgICAgdGhpcy5tZW51RWxlbWVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHByb3BhZ2F0ZSkge1xuICAgICAgdGhpcy5ldmVudFNlcnZpY2UuY2xvc2VBbGxNZW51c0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldE1lbnVQb3NpdGlvbihwb3NpdGlvbjogRE9NUmVjdCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCB9ID0gcG9zaXRpb247XG4gICAgY29uc3QgbWVudVdpZHRoID0gdGhpcy5tZW51RWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPz8gVElFUkVEX01FTlVfREVGQVVMVF9XSURUSDtcbiAgICBjb25zdCBpdGVtc0NvdW50ID0gdGhpcy5jb3VudE1lbnVJdGVtcyhmYWxzZSk7XG4gICAgY29uc3QgZGl2aWRlcnNDb3VudCA9IHRoaXMuY291bnRNZW51SXRlbXModHJ1ZSk7XG4gICAgY29uc3QgbWVudUhlaWdodCA9IGl0ZW1zQ291bnQgKiBUSUVSRURfTUVOVV9JVEVNX0hFSUdIVCArIGRpdmlkZXJzQ291bnQgKiBUSUVSRURfTUVOVV9ESVZJREVSX0hFSUdIVCArIFRJRVJFRF9NRU5VX1BBRERJTkcgKyBUSUVSRURfTUVOVV9FWFRSQV9QQURESU5HO1xuXG4gICAgdGhpcy5zZXRNZW51SG9yaXpvbnRhbFBvc2l0aW9uKGxlZnQsIHJpZ2h0LCBtZW51V2lkdGgpO1xuICAgIHRoaXMuc2V0TWVudVZlcnRpY2FsUG9zaXRpb24odG9wLCBib3R0b20sIG1lbnVIZWlnaHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3VudE1lbnVJdGVtcyhpc0RpdmlkZXI6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5pdGVtcy5yZWR1Y2UoXG4gICAgICAoY291bnQ6IG51bWJlciwgaXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEpID0+IChpdGVtLmRpdmlkZXIgPT09IGlzRGl2aWRlciA/IGNvdW50ICsgMSA6IGNvdW50KSxcbiAgICAgIDBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZW51SG9yaXpvbnRhbFBvc2l0aW9uKGxlZnQ6IG51bWJlciwgcmlnaHQ6IG51bWJlciwgbWVudVdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UubGVmdCA9IHRoaXMuaGFzU3BhY2VPblJpZ2h0KHJpZ2h0LCBtZW51V2lkdGgpID8gcmlnaHQgOiBsZWZ0IC0gbWVudVdpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZW51VmVydGljYWxQb3NpdGlvbih0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIG1lbnVIZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNTcGFjZUF0Qm90dG9tID0gdGhpcy5oYXNTcGFjZUF0Qm90dG9tKGJvdHRvbSwgbWVudUhlaWdodCk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UudG9wID0gaGFzU3BhY2VBdEJvdHRvbSA/IHdpbmRvdy5zY3JvbGxZICsgdG9wIDogTWF0aC5tYXgod2luZG93LmlubmVySGVpZ2h0IC0gbWVudUhlaWdodCwgd2luZG93LnNjcm9sbFkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNTcGFjZU9uUmlnaHQocmlnaHQ6IG51bWJlciwgbWVudVdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggLSByaWdodCA+IG1lbnVXaWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzU3BhY2VBdEJvdHRvbShib3R0b206IG51bWJlciwgbWVudUhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCAtIGJvdHRvbSA+IG1lbnVIZWlnaHQ7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZUV2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50U2VydmljZS5pbmNyZW1lbnRDdXJyZW50SXRlbUV2ZW50LnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q3VycmVudEl0ZW0oKTtcbiAgICAgIHRoaXMuZm9jdXNDdXJyZW50SXRlbSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGVjcmVtZW50Q3VycmVudEl0ZW1FdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmRlY3JlbWVudEN1cnJlbnRJdGVtKCk7XG4gICAgICB0aGlzLmZvY3VzQ3VycmVudEl0ZW0oKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLnNlbGVjdEl0ZW1FdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uc3VibWVudSkge1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5vcGVuSXRlbU1lbnVFdmVudC5lbWl0KGl0ZW0pO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLmNvbW1hbmQpIHtcbiAgICAgICAgaXRlbS5jb21tYW5kKCk7XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNsb3NlQWxsTWVudXNFdmVudC5lbWl0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5jbG9zZUFsbE1lbnVzRXZlbnQuZW1pdCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuY2xvc2VBbGxNZW51c0V2ZW50LnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGVzdHJveShmYWxzZSk7XG4gICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gbnVsbDtcbiAgICAgIHRoaXMucmVzZXRDdXJyZW50SXRlbXMoKTtcbiAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLm1hcmtBbGxJdGVtc0FzQ2xvc2VkKHRoaXMuaXRlbXMpO1xuICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5pdGVtcyA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UubWFya0FsbEl0ZW1zQXNDbG9zZWQoXG4gICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXNcbiAgICAgICk7XG4gICAgICBlbmFibGVCb2R5U2Nyb2xsKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLm9wZW5JdGVtTWVudUV2ZW50LnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0/LnBhcmVudCAmJlxuICAgICAgICBpdGVtLnBhcmVudCAmJlxuICAgICAgICAhdGhpcy50aWVyZWRNZW51U2VydmljZS5zZWFyY2hUaGVIaWVyYXJjaHkodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbS5wYXJlbnQsIGl0ZW0pXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jbG9zZUN1cnJlbnRJdGVtQW5jZXN0b3JzKGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wZW5JdGVtU3VibWVudShpdGVtKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNsb3NlSXRlbU1lbnVFdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBwcm9jZXNzIGlmIHRoaXMgaXRlbSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IG1lbnUgb3IgaXMgYW4gYW5jZXN0b3IgaXRlbVxuICAgICAgY29uc3QgaXNJbkN1cnJlbnRJdGVtcyA9IHRoaXMuaXRlbXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmlkID09PSBpdGVtLmlkKTtcbiAgICAgIGNvbnN0IGlzQW5jZXN0b3JPZkN1cnJlbnRJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSAmJiBcbiAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5zZWFyY2hUaGVIaWVyYXJjaHkoaXRlbSwgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSk7XG5cbiAgICAgIGlmICghaXNJbkN1cnJlbnRJdGVtcyAmJiAhaXNBbmNlc3Rvck9mQ3VycmVudEl0ZW0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5wYXJlbnQpIHtcbiAgICAgICAgaXRlbS5wYXJlbnQuaXNPcGVuID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zID1cbiAgICAgICAgaXRlbS5wYXJlbnQ/LnBhcmVudD8uc3VibWVudSA/PyB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zO1xuICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IGl0ZW0ucGFyZW50ID8/IG51bGw7XG4gICAgICB0aGlzLmRlc3Ryb3koZmFsc2UpO1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZm9jdXNDdXJyZW50SXRlbSgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VDdXJyZW50SXRlbUFuY2VzdG9ycyh0YXJnZXRJdGVtOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSk6IHZvaWQge1xuICAgIGxldCBjdXJyZW50OiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSB8IG51bGwgPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtO1xuICAgIGlmICghY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENsb3NlIGFuY2VzdG9ycyBieSBkaXJlY3Qgc3RhdGUgbXV0YXRpb24gaW5zdGVhZCBvZiBlbWl0dGluZyBldmVudHMgdG8gYXZvaWQgcmUtZW50cmFuY3lcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50LnBhcmVudCAhPT0gdGFyZ2V0SXRlbS5wYXJlbnQpIHtcbiAgICAgIGN1cnJlbnQuaXNPcGVuID0gZmFsc2U7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgY3VycmVudC5pc09wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgY2hhbmdlIGRldGVjdGlvbiBydW4gYWZ0ZXIgY2xvc2luZyBhbGwgYW5jZXN0b3JzXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuSXRlbVN1Ym1lbnUoaXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEpOiB2b2lkIHtcbiAgICBpZiAoIWl0ZW0uc3VibWVudSB8fCBpdGVtLmlzT3BlbiB8fCAhdGhpcy5pdGVtcy5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaXRlbS5pZCA/PyAnJyk7XG5cbiAgICBpZiAoIWl0ZW1FbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVNZW51KGl0ZW0uc3VibWVudSwgaXRlbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zID0gaXRlbS5zdWJtZW51O1xuICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSBpdGVtLnN1Ym1lbnVbMF0gPz8gbnVsbDtcbiAgICBpdGVtLmlzT3BlbiA9IHRydWU7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZm9jdXNDdXJyZW50SXRlbSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudE5hdmlnYWJsZUl0ZW0oKTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfCBudWxsIHtcbiAgICBjb25zdCBjdXJyZW50SXRlbSA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW07XG5cbiAgICBpZiAoIWN1cnJlbnRJdGVtIHx8ICF0aGlzLml0ZW1zLmluY2x1ZGVzKGN1cnJlbnRJdGVtKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRJdGVtO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRLZXlkb3duQWN0aW9uKFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LFxuICAgIGN1cnJlbnRJdGVtOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSB8IG51bGxcbiAgKTogKCgpID0+IHZvaWQpIHwgbnVsbCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHJldHVybiAoKSA9PiB0aGlzLmNsb3NlQWxsTWVudXMoZXZlbnQsIHRydWUpO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMuY2xvc2VBbGxNZW51cyhldmVudCwgZmFsc2UpO1xuICAgICAgY2FzZSAnICc6XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnNlbGVjdEN1cnJlbnRJdGVtKGV2ZW50LCBjdXJyZW50SXRlbSk7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMubW92ZUN1cnJlbnRJdGVtKGV2ZW50LCBmYWxzZSk7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICByZXR1cm4gKCkgPT4gdGhpcy5tb3ZlQ3VycmVudEl0ZW0oZXZlbnQsIHRydWUpO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMuY2xvc2VDdXJyZW50SXRlbU1lbnUoZXZlbnQsIGN1cnJlbnRJdGVtKTtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICByZXR1cm4gKCkgPT4gdGhpcy5vcGVuQ3VycmVudEl0ZW1NZW51KGV2ZW50LCBjdXJyZW50SXRlbSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Q3VycmVudEl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5pdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VBbGxNZW51cyhldmVudDogS2V5Ym9hcmRFdmVudCwgcHJldmVudERlZmF1bHQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50U2VydmljZS5jbG9zZUFsbE1lbnVzRXZlbnQuZW1pdCgpO1xuXG4gICAgaWYgKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0Q3VycmVudEl0ZW0oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgY3VycmVudEl0ZW06IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhIHwgbnVsbFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWN1cnJlbnRJdGVtIHx8IGN1cnJlbnRJdGVtLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudFNlcnZpY2Uuc2VsZWN0SXRlbUV2ZW50LmVtaXQoY3VycmVudEl0ZW0pO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIG1vdmVDdXJyZW50SXRlbShldmVudDogS2V5Ym9hcmRFdmVudCwgaW5jcmVtZW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGluY3JlbWVudCkge1xuICAgICAgdGhpcy5ldmVudFNlcnZpY2UuaW5jcmVtZW50Q3VycmVudEl0ZW1FdmVudC5lbWl0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRlY3JlbWVudEN1cnJlbnRJdGVtRXZlbnQuZW1pdCgpO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlQ3VycmVudEl0ZW1NZW51KFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LFxuICAgIGN1cnJlbnRJdGVtOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSB8IG51bGxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFjdXJyZW50SXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNsb3NlSXRlbU1lbnVFdmVudC5lbWl0KGN1cnJlbnRJdGVtKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkN1cnJlbnRJdGVtTWVudShcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyZW50SXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIGlmICghY3VycmVudEl0ZW0gfHwgY3VycmVudEl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5vcGVuSXRlbU1lbnVFdmVudC5lbWl0KGN1cnJlbnRJdGVtKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwic2RjLXRpZXJlZC1tZW51XCJcbiAgcm9sZT1cIm1lbnVcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gIFtzdHlsZS5sZWZ0LnB4XT1cImxlZnRcIlxuICBbc3R5bGUudG9wLnB4XT1cInRvcFwiXG4+XG4gIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrIGl0ZW0uaWQpIHtcbiAgQGlmIChpdGVtLnZpc2libGUgJiYgIWl0ZW0uZGl2aWRlcikge1xuICA8c2RjLXRpZXJlZC1tZW51LWl0ZW1cbiAgICBbaXRlbV09XCJpdGVtXCJcbiAgICBbZm9jdXNlZF09XCJpdGVtID09PSB0aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbVwiXG4gICAgW2hpZ2hsaWdodF09XCJpdGVtLmlzT3BlbiA9PT0gdHJ1ZVwiXG4gICAgW3RyaWdnZXJFdmVudF09XCJtZW51VHJpZ2dlckV2ZW50XCJcbiAgICBbY2xvc2VPbkNsaWNrXT1cImZhbHNlXCJcbiAgPjwvc2RjLXRpZXJlZC1tZW51LWl0ZW0+XG4gIH1cbiAgQGlmIChpdGVtLmRpdmlkZXIpIHtcbiAgPHNkYy10aWVyZWQtbWVudS1kaXZpZGVyPjwvc2RjLXRpZXJlZC1tZW51LWRpdmlkZXI+XG4gIH1cbiAgfVxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,11 @@
1
+ import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class TieredMenuDividerComponent {
4
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuDividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TieredMenuDividerComponent, isStandalone: true, selector: "sdc-tiered-menu-divider", ngImport: i0, template: "<div class=\"sdc-tiered-menu-divider\"></div>\n", styles: [".sdc-tiered-menu-divider{height:1px;margin:.125rem 0;background:#ccc}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6
+ }
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuDividerComponent, decorators: [{
8
+ type: Component,
9
+ args: [{ selector: 'sdc-tiered-menu-divider', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div class=\"sdc-tiered-menu-divider\"></div>\n", styles: [".sdc-tiered-menu-divider{height:1px;margin:.125rem 0;background:#ccc}\n"] }]
10
+ }] });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUtZGl2aWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RpZXJlZC1tZW51L2NvbXBvbmVudHMvdGllcmVkLW1lbnUtZGl2aWRlci90aWVyZWQtbWVudS1kaXZpZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdGllcmVkLW1lbnUvY29tcG9uZW50cy90aWVyZWQtbWVudS1kaXZpZGVyL3RpZXJlZC1tZW51LWRpdmlkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFVdEYsTUFBTSxPQUFPLDBCQUEwQjt3R0FBMUIsMEJBQTBCOzRGQUExQiwwQkFBMEIsbUZDVnZDLGlEQUNBOzs0RkRTYSwwQkFBMEI7a0JBUnRDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy10aWVyZWQtbWVudS1kaXZpZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpZXJlZC1tZW51LWRpdmlkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90aWVyZWQtbWVudS1kaXZpZGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZFxufSlcbmV4cG9ydCBjbGFzcyBUaWVyZWRNZW51RGl2aWRlckNvbXBvbmVudCB7fVxuIiwiPGRpdiBjbGFzcz1cInNkYy10aWVyZWQtbWVudS1kaXZpZGVyXCI+PC9kaXY+XG4iXX0=
@@ -0,0 +1,97 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, HostListener, Input, ViewEncapsulation, inject } from '@angular/core';
3
+ import { TIERED_MENU_SUBMENU_OPEN_DELAY_MS } from '../../../../core/constants/tiered-menu.const';
4
+ import { TieredMenuEventService } from '../../services/tiered-menu.event.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class TieredMenuItemComponent {
8
+ eventService = inject(TieredMenuEventService);
9
+ item;
10
+ focused = false;
11
+ highlight = false;
12
+ triggerEvent = 'click';
13
+ closeOnClick = false;
14
+ showTimeoutId;
15
+ ngOnDestroy() {
16
+ window.clearTimeout(this.showTimeoutId);
17
+ }
18
+ onClick() {
19
+ if (this.item.disabled) {
20
+ return;
21
+ }
22
+ if (this.item.submenu) {
23
+ if (!this.item.isOpen) {
24
+ this.eventService.openItemMenuEvent.emit(this.item);
25
+ }
26
+ else if (this.closeOnClick) {
27
+ this.eventService.closeItemMenuEvent.emit(this.item);
28
+ }
29
+ else {
30
+ // submenu is open and closeOnClick is false, do nothing
31
+ }
32
+ return;
33
+ }
34
+ this.eventService.selectItemEvent.emit(this.item);
35
+ }
36
+ onTouchEnd(event) {
37
+ // Prevent synthetic click event from firing after touchend
38
+ event.preventDefault();
39
+ if (this.item.disabled) {
40
+ return;
41
+ }
42
+ if (this.item.submenu) {
43
+ if (!this.item.isOpen) {
44
+ this.eventService.openItemMenuEvent.emit(this.item);
45
+ }
46
+ else if (this.closeOnClick) {
47
+ this.eventService.closeItemMenuEvent.emit(this.item);
48
+ }
49
+ else {
50
+ // submenu is open and closeOnClick is false, do nothing
51
+ }
52
+ return;
53
+ }
54
+ this.eventService.selectItemEvent.emit(this.item);
55
+ }
56
+ onMouseEnter() {
57
+ if (this.item.disabled || this.triggerEvent !== 'hover' || this.item.isOpen) {
58
+ return;
59
+ }
60
+ this.showTimeoutId = window.setTimeout(() => {
61
+ this.eventService.openItemMenuEvent.emit(this.item);
62
+ }, TIERED_MENU_SUBMENU_OPEN_DELAY_MS);
63
+ }
64
+ onMouseLeave() {
65
+ window.clearTimeout(this.showTimeoutId);
66
+ }
67
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
68
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TieredMenuItemComponent, isStandalone: true, selector: "sdc-tiered-menu-item", inputs: { item: "item", focused: "focused", highlight: "highlight", triggerEvent: "triggerEvent", closeOnClick: "closeOnClick" }, host: { listeners: { "click": "onClick()", "touchend": "onTouchEnd($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0, template: "<div\n class=\"sdc-tiered-menu-item\"\n role=\"menuitem\"\n [attr.id]=\"item.id\"\n [tabindex]=\"focused && !item.disabled ? 0 : -1\"\n [attr.aria-disabled]=\"item.disabled || null\"\n [attr.aria-haspopup]=\"item.submenu ? 'menu' : null\"\n [attr.aria-expanded]=\"item.submenu ? item.isOpen : null\"\n [attr.data-key]=\"item.dataKey\"\n [class.sdc-tiered-menu-item--open]=\"item.isOpen\"\n [class.sdc-tiered-menu-item--focused]=\"focused\"\n [class.sdc-tiered-menu-item--disabled]=\"item.disabled\"\n>\n <span class=\"sdc-tiered-menu-item__content\">\n <span\n class=\"sdc-tiered-menu-item__icon\"\n [ngClass]=\"item.iconClass\"\n ></span>\n <span class=\"sdc-tiered-menu-item__label\">{{ item.label }}</span>\n </span>\n\n @if (item.submenu) {\n <span class=\"sdc-tiered-menu-item__submenu-icon fas\">\n <i class=\"fas fa-chevron-right\"></i>\n </span>\n }\n</div>\n", styles: [".sdc-tiered-menu-item{display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-tiered-menu-item:hover{background:#e9e6e6}.sdc-tiered-menu-item--focused{background:#ccc!important}.sdc-tiered-menu-item--open{background:#e4e2e2}.sdc-tiered-menu-item--disabled{opacity:.5;cursor:default}.sdc-tiered-menu-item__content{display:inline-flex;align-items:center}.sdc-tiered-menu-item__label{margin:0 .75rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
69
+ }
70
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuItemComponent, decorators: [{
71
+ type: Component,
72
+ args: [{ selector: 'sdc-tiered-menu-item', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div\n class=\"sdc-tiered-menu-item\"\n role=\"menuitem\"\n [attr.id]=\"item.id\"\n [tabindex]=\"focused && !item.disabled ? 0 : -1\"\n [attr.aria-disabled]=\"item.disabled || null\"\n [attr.aria-haspopup]=\"item.submenu ? 'menu' : null\"\n [attr.aria-expanded]=\"item.submenu ? item.isOpen : null\"\n [attr.data-key]=\"item.dataKey\"\n [class.sdc-tiered-menu-item--open]=\"item.isOpen\"\n [class.sdc-tiered-menu-item--focused]=\"focused\"\n [class.sdc-tiered-menu-item--disabled]=\"item.disabled\"\n>\n <span class=\"sdc-tiered-menu-item__content\">\n <span\n class=\"sdc-tiered-menu-item__icon\"\n [ngClass]=\"item.iconClass\"\n ></span>\n <span class=\"sdc-tiered-menu-item__label\">{{ item.label }}</span>\n </span>\n\n @if (item.submenu) {\n <span class=\"sdc-tiered-menu-item__submenu-icon fas\">\n <i class=\"fas fa-chevron-right\"></i>\n </span>\n }\n</div>\n", styles: [".sdc-tiered-menu-item{display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-tiered-menu-item:hover{background:#e9e6e6}.sdc-tiered-menu-item--focused{background:#ccc!important}.sdc-tiered-menu-item--open{background:#e4e2e2}.sdc-tiered-menu-item--disabled{opacity:.5;cursor:default}.sdc-tiered-menu-item__content{display:inline-flex;align-items:center}.sdc-tiered-menu-item__label{margin:0 .75rem}\n"] }]
73
+ }], propDecorators: { item: [{
74
+ type: Input,
75
+ args: [{ required: true }]
76
+ }], focused: [{
77
+ type: Input
78
+ }], highlight: [{
79
+ type: Input
80
+ }], triggerEvent: [{
81
+ type: Input
82
+ }], closeOnClick: [{
83
+ type: Input
84
+ }], onClick: [{
85
+ type: HostListener,
86
+ args: ['click']
87
+ }], onTouchEnd: [{
88
+ type: HostListener,
89
+ args: ['touchend', ['$event']]
90
+ }], onMouseEnter: [{
91
+ type: HostListener,
92
+ args: ['mouseenter']
93
+ }], onMouseLeave: [{
94
+ type: HostListener,
95
+ args: ['mouseleave']
96
+ }] } });
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUtaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RpZXJlZC1tZW51L2NvbXBvbmVudHMvdGllcmVkLW1lbnUtaXRlbS90aWVyZWQtbWVudS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdGllcmVkLW1lbnUvY29tcG9uZW50cy90aWVyZWQtbWVudS1pdGVtL3RpZXJlZC1tZW51LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUtqRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7O0FBV2xGLE1BQU0sT0FBTyx1QkFBdUI7SUFDakIsWUFBWSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBRXBDLElBQUksQ0FBOEI7SUFDcEQsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFlBQVksR0FBMkIsT0FBTyxDQUFDO0lBQy9DLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFdEIsYUFBYSxDQUFVO0lBRS9CLFdBQVc7UUFDVCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBR1MsT0FBTztRQUNmLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FB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Q0FBQztnQkF5QjFCLFlBQVk7c0JBRHJCLFlBQVk7dUJBQUMsWUFBWTtnQkFZaEIsWUFBWTtzQkFEckIsWUFBWTt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgVElFUkVEX01FTlVfU1VCTUVOVV9PUEVOX0RFTEFZX01TIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9jb25zdGFudHMvdGllcmVkLW1lbnUuY29uc3QnO1xuaW1wb3J0IHR5cGUge1xuICBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSxcbiAgVGllcmVkTWVudVRyaWdnZXJFdmVudFxufSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3R5cGVzL3RpZXJlZC1tZW51LnR5cGUnO1xuaW1wb3J0IHsgVGllcmVkTWVudUV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpZXJlZC1tZW51LmV2ZW50LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtdGllcmVkLW1lbnUtaXRlbScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vdGllcmVkLW1lbnUtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RpZXJlZC1tZW51LWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkXG59KVxuZXhwb3J0IGNsYXNzIFRpZXJlZE1lbnVJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudFNlcnZpY2UgPSBpbmplY3QoVGllcmVkTWVudUV2ZW50U2VydmljZSk7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgaXRlbSE6IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhO1xuICBASW5wdXQoKSBmb2N1c2VkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhpZ2hsaWdodCA9IGZhbHNlO1xuICBASW5wdXQoKSB0cmlnZ2VyRXZlbnQ6IFRpZXJlZE1lbnVUcmlnZ2VyRXZlbnQgPSAnY2xpY2snO1xuICBASW5wdXQoKSBjbG9zZU9uQ2xpY2sgPSBmYWxzZTtcblxuICBwcml2YXRlIHNob3dUaW1lb3V0SWQ/OiBudW1iZXI7XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lb3V0SWQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBwcm90ZWN0ZWQgb25DbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVtLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXRlbS5zdWJtZW51KSB7XG4gICAgICBpZiAoIXRoaXMuaXRlbS5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5ldmVudFNlcnZpY2Uub3Blbkl0ZW1NZW51RXZlbnQuZW1pdCh0aGlzLml0ZW0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNsb3NlT25DbGljaykge1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5jbG9zZUl0ZW1NZW51RXZlbnQuZW1pdCh0aGlzLml0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3VibWVudSBpcyBvcGVuIGFuZCBjbG9zZU9uQ2xpY2sgaXMgZmFsc2UsIGRvIG5vdGhpbmdcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLnNlbGVjdEl0ZW1FdmVudC5lbWl0KHRoaXMuaXRlbSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcsIFsnJGV2ZW50J10pXG4gIHByb3RlY3RlZCBvblRvdWNoRW5kKGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgLy8gUHJldmVudCBzeW50aGV0aWMgY2xpY2sgZXZlbnQgZnJvbSBmaXJpbmcgYWZ0ZXIgdG91Y2hlbmRcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIFxuICAgIGlmICh0aGlzLml0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pdGVtLnN1Ym1lbnUpIHtcbiAgICAgIGlmICghdGhpcy5pdGVtLmlzT3Blbikge1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5vcGVuSXRlbU1lbnVFdmVudC5lbWl0KHRoaXMuaXRlbSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2xvc2VPbkNsaWNrKSB7XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNsb3NlSXRlbU1lbnVFdmVudC5lbWl0KHRoaXMuaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdWJtZW51IGlzIG9wZW4gYW5kIGNsb3NlT25DbGljayBpcyBmYWxzZSwgZG8gbm90aGluZ1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudFNlcnZpY2Uuc2VsZWN0SXRlbUV2ZW50LmVtaXQodGhpcy5pdGVtKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxuICBwcm90ZWN0ZWQgb25Nb3VzZUVudGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLml0ZW0uZGlzYWJsZWQgfHwgdGhpcy50cmlnZ2VyRXZlbnQgIT09ICdob3ZlcicgfHwgdGhpcy5pdGVtLmlzT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1RpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLm9wZW5JdGVtTWVudUV2ZW50LmVtaXQodGhpcy5pdGVtKTtcbiAgICB9LCBUSUVSRURfTUVOVV9TVUJNRU5VX09QRU5fREVMQVlfTVMpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gIHByb3RlY3RlZCBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lb3V0SWQpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwic2RjLXRpZXJlZC1tZW51LWl0ZW1cIlxuICByb2xlPVwibWVudWl0ZW1cIlxuICBbYXR0ci5pZF09XCJpdGVtLmlkXCJcbiAgW3RhYmluZGV4XT1cImZvY3VzZWQgJiYgIWl0ZW0uZGlzYWJsZWQgPyAwIDogLTFcIlxuICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWQgfHwgbnVsbFwiXG4gIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiaXRlbS5zdWJtZW51ID8gJ21lbnUnIDogbnVsbFwiXG4gIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXRlbS5zdWJtZW51ID8gaXRlbS5pc09wZW4gOiBudWxsXCJcbiAgW2F0dHIuZGF0YS1rZXldPVwiaXRlbS5kYXRhS2V5XCJcbiAgW2NsYXNzLnNkYy10aWVyZWQtbWVudS1pdGVtLS1vcGVuXT1cIml0ZW0uaXNPcGVuXCJcbiAgW2NsYXNzLnNkYy10aWVyZWQtbWVudS1pdGVtLS1mb2N1c2VkXT1cImZvY3VzZWRcIlxuICBbY2xhc3Muc2RjLXRpZXJlZC1tZW51LWl0ZW0tLWRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuPlxuICA8c3BhbiBjbGFzcz1cInNkYy10aWVyZWQtbWVudS1pdGVtX19jb250ZW50XCI+XG4gICAgPHNwYW5cbiAgICAgIGNsYXNzPVwic2RjLXRpZXJlZC1tZW51LWl0ZW1fX2ljb25cIlxuICAgICAgW25nQ2xhc3NdPVwiaXRlbS5pY29uQ2xhc3NcIlxuICAgID48L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJzZGMtdGllcmVkLW1lbnUtaXRlbV9fbGFiZWxcIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxuICA8L3NwYW4+XG5cbiAgQGlmIChpdGVtLnN1Ym1lbnUpIHtcbiAgPHNwYW4gY2xhc3M9XCJzZGMtdGllcmVkLW1lbnUtaXRlbV9fc3VibWVudS1pY29uIGZhc1wiPlxuICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHRcIj48L2k+XG4gIDwvc3Bhbj5cbiAgfVxuPC9kaXY+XG4iXX0=