@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,198 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, ViewChildren, ViewEncapsulation, inject } from '@angular/core';
3
+ import { TranslateModule } from '@ngx-translate/core';
4
+ import { CONTEXT_SELECTOR_DEFAULT_FOOTER_BUTTON_LABEL_KEY } from '../../core/constants/context-selector.const';
5
+ import { PopoverComponent } from '../popover/popover.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ngx-translate/core";
8
+ let nextContextSelectorId = 0;
9
+ const CONTEXT_SELECTOR_VIEWPORT_MARGIN = 20;
10
+ export class ContextSelectorComponent {
11
+ static allocateListboxId() {
12
+ const nextId = nextContextSelectorId;
13
+ nextContextSelectorId += 1;
14
+ return `context-selector-list-${nextId}`;
15
+ }
16
+ cdr = inject(ChangeDetectorRef);
17
+ workspaces = [];
18
+ footerButtonLabel = CONTEXT_SELECTOR_DEFAULT_FOOTER_BUTTON_LABEL_KEY;
19
+ showFooterButton = true;
20
+ disabled = false;
21
+ footerButtonClicked = new EventEmitter();
22
+ selected = new EventEmitter();
23
+ listItems;
24
+ listRef;
25
+ listboxId = ContextSelectorComponent.allocateListboxId();
26
+ open = false;
27
+ height = 0;
28
+ selectedItemIndex = 0;
29
+ currentItemIndex = 0;
30
+ get tabindex() {
31
+ return this.disabled ? -1 : 0;
32
+ }
33
+ get selectedWorkspace() {
34
+ return this.workspaces[this.selectedItemIndex] ?? null;
35
+ }
36
+ ngOnChanges(changes) {
37
+ if (changes['workspaces'] || changes['disabled']) {
38
+ this.ensureValidSelection();
39
+ this.cdr.markForCheck();
40
+ }
41
+ }
42
+ onKeydown(event) {
43
+ if (this.disabled || !this.workspaces.length) {
44
+ return;
45
+ }
46
+ if (event.key === 'Enter' || event.key === ' ') {
47
+ event.preventDefault();
48
+ if (this.open) {
49
+ this.selectIndex(this.currentItemIndex);
50
+ }
51
+ else {
52
+ this.toggle();
53
+ }
54
+ return;
55
+ }
56
+ if (event.key === 'Escape') {
57
+ this.close();
58
+ return;
59
+ }
60
+ if (event.key === 'ArrowDown') {
61
+ event.preventDefault();
62
+ this.openIfNeeded();
63
+ this.moveCurrentIndex(1);
64
+ return;
65
+ }
66
+ if (event.key === 'ArrowUp') {
67
+ event.preventDefault();
68
+ this.openIfNeeded();
69
+ this.moveCurrentIndex(-1);
70
+ }
71
+ }
72
+ toggle() {
73
+ if (this.disabled || !this.workspaces.length) {
74
+ return;
75
+ }
76
+ this.open = !this.open;
77
+ if (this.open) {
78
+ this.scheduleListMeasurement();
79
+ }
80
+ this.cdr.markForCheck();
81
+ }
82
+ onPopoverOpenChange(open) {
83
+ if (open) {
84
+ return;
85
+ }
86
+ this.close();
87
+ }
88
+ selectIndex(index) {
89
+ const workspace = this.workspaces[index];
90
+ if (!workspace || workspace.disabled) {
91
+ return;
92
+ }
93
+ this.selectedItemIndex = index;
94
+ this.currentItemIndex = index;
95
+ this.selected.emit(workspace);
96
+ this.close();
97
+ }
98
+ onFooterActionClick() {
99
+ this.close();
100
+ this.footerButtonClicked.emit();
101
+ }
102
+ openIfNeeded() {
103
+ if (this.open) {
104
+ return;
105
+ }
106
+ this.open = true;
107
+ this.scheduleListMeasurement();
108
+ this.cdr.markForCheck();
109
+ }
110
+ moveCurrentIndex(step) {
111
+ if (!this.workspaces.length) {
112
+ return;
113
+ }
114
+ let nextIndex = this.currentItemIndex;
115
+ for (const _workspace of this.workspaces) {
116
+ nextIndex = (nextIndex + step + this.workspaces.length) % this.workspaces.length;
117
+ if (!this.workspaces[nextIndex]?.disabled) {
118
+ this.currentItemIndex = nextIndex;
119
+ this.scrollToCurrentItem();
120
+ this.cdr.markForCheck();
121
+ return;
122
+ }
123
+ }
124
+ }
125
+ close() {
126
+ if (!this.open) {
127
+ return;
128
+ }
129
+ this.open = false;
130
+ this.currentItemIndex = this.selectedItemIndex;
131
+ this.cdr.markForCheck();
132
+ }
133
+ ensureValidSelection() {
134
+ if (!this.workspaces.length) {
135
+ this.selectedItemIndex = 0;
136
+ this.currentItemIndex = 0;
137
+ this.open = false;
138
+ return;
139
+ }
140
+ const nextIndex = this.workspaces.findIndex((workspace) => !workspace.disabled);
141
+ const fallbackIndex = nextIndex >= 0 ? nextIndex : 0;
142
+ if (!this.workspaces[this.selectedItemIndex] || this.workspaces[this.selectedItemIndex].disabled) {
143
+ this.selectedItemIndex = fallbackIndex;
144
+ }
145
+ if (!this.workspaces[this.currentItemIndex] || this.workspaces[this.currentItemIndex].disabled) {
146
+ this.currentItemIndex = this.selectedItemIndex;
147
+ }
148
+ }
149
+ calculateListMaxHeight() {
150
+ const listElement = this.listRef?.nativeElement;
151
+ if (!listElement) {
152
+ return;
153
+ }
154
+ const { top } = listElement.getBoundingClientRect();
155
+ this.height = Math.max(0, window.innerHeight - top - CONTEXT_SELECTOR_VIEWPORT_MARGIN - (this.showFooterButton ? 64 : 0));
156
+ this.cdr.markForCheck();
157
+ }
158
+ scrollToCurrentItem() {
159
+ const currentItem = this.listItems?.toArray()[this.currentItemIndex];
160
+ currentItem?.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
161
+ }
162
+ scheduleListMeasurement() {
163
+ queueMicrotask(() => this.calculateListMaxHeight());
164
+ requestAnimationFrame(() => this.calculateListMaxHeight());
165
+ }
166
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContextSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
167
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ContextSelectorComponent, isStandalone: true, selector: "sdc-context-selector, sdc-workspace-switch", inputs: { workspaces: "workspaces", footerButtonLabel: "footerButtonLabel", showFooterButton: "showFooterButton", disabled: "disabled" }, outputs: { footerButtonClicked: "footerButtonClicked", selected: "selected" }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "attr.tabindex": "this.tabindex" } }, viewQueries: [{ propertyName: "listRef", first: true, predicate: ["listRef"], descendants: true }, { propertyName: "listItems", predicate: ["listItem"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"sdc-context-selector\"\n [class.sdc-context-selector--disabled]=\"disabled\"\n>\n <sdc-popover\n [open]=\"open\"\n appendTo=\"body\"\n [offset]=\"8\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [panelClass]=\"'sdc-context-selector__overlay-panel'\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <button\n sdc-popover-trigger\n type=\"button\"\n class=\"sdc-context-selector__button\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"open ? listboxId : null\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n >\n <span class=\"sdc-context-selector__text\">\n <span class=\"sdc-context-selector__title\">{{ selectedWorkspace?.title }}</span>\n <span class=\"sdc-context-selector__subtitle\">{{ selectedWorkspace?.subtitle }}</span>\n </span>\n\n <span class=\"sdc-context-selector__icons\">\n <i class=\"fas fa-chevron-up\"></i>\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </button>\n\n <div sdc-popover-content class=\"sdc-context-selector__panel\">\n <ul\n #listRef\n [id]=\"listboxId\"\n class=\"sdc-context-selector__list\"\n [style.max-height.px]=\"height\"\n >\n @for (workspace of workspaces; track workspace.id; let i = $index) {\n <li\n #listItem\n class=\"sdc-context-selector__item\"\n [class.sdc-context-selector__item--focused]=\"i === currentItemIndex && !workspace.disabled\"\n [class.sdc-context-selector__item--disabled]=\"workspace.disabled\"\n (click)=\"selectIndex(i)\"\n (keydown.enter)=\"selectIndex(i)\"\n (keydown.space)=\"selectIndex(i)\"\n [attr.tabindex]=\"workspace.disabled ? -1 : 0\"\n >\n <span class=\"sdc-context-selector__text\">\n <span class=\"sdc-context-selector__title\">{{ workspace.title }}</span>\n <span class=\"sdc-context-selector__subtitle\">{{ workspace.subtitle }}</span>\n </span>\n\n @if (i === selectedItemIndex) {\n <i class=\"fas fa-check sdc-context-selector__active-icon\"></i>\n }\n </li>\n }\n </ul>\n\n @if (showFooterButton) {\n <div class=\"sdc-context-selector__footer\">\n <button\n type=\"button\"\n class=\"sdc-context-selector__footer-button\"\n (click)=\"onFooterActionClick()\"\n >\n <i class=\"fas fa-plus\"></i>\n <span>{{ footerButtonLabel | translate }}</span>\n </button>\n </div>\n }\n </div>\n </sdc-popover>\n</div>\n", styles: [".sdc-context-selector{display:block;width:min(100%,20.25rem);max-width:100%;border:1px solid transparent;border-radius:.25rem}.sdc-context-selector:focus{border-color:#428bca}.sdc-context-selector__button{display:flex;width:100%;align-items:center;justify-content:space-between;border:0;border-radius:.25rem;background:#fff;cursor:pointer;text-align:left}.sdc-context-selector__text{display:flex;flex:1 1 auto;flex-direction:column;padding:.75rem}.sdc-context-selector__title{color:#333;font-size:.875rem;font-weight:700;line-height:1.5;text-transform:uppercase}.sdc-context-selector__subtitle{color:#999;font-size:.75rem;line-height:1.5}.sdc-context-selector__icons{display:flex;flex-direction:column;gap:.125rem;margin:0 .75rem}.sdc-context-selector__panel{overflow:hidden;border-radius:.25rem;background:#fff}.sdc-context-selector__list{margin:0;overflow:auto;padding:.25rem 0 0;list-style:none}.sdc-context-selector__item{display:flex;align-items:center;justify-content:space-between;cursor:pointer}.sdc-context-selector__item:hover:not(.sdc-context-selector__item--disabled),.sdc-context-selector__item--focused{background:#f1f7f8}.sdc-context-selector__item--disabled{cursor:default;opacity:.5}.sdc-context-selector__active-icon{margin:0 .75rem;color:#7892a1;font-size:.75rem}.sdc-context-selector__footer{border-top:1px solid #ccc;padding:.75rem}.sdc-context-selector__footer-button{display:flex;width:100%;align-items:center;justify-content:center;gap:.5rem;padding:.5rem .75rem;border:1px solid #d8d8d8;border-radius:.25rem;background:#fff;cursor:pointer}.sdc-context-selector__footer-button:active{border-color:#428bca}.sdc-context-selector--disabled .sdc-context-selector__button{cursor:default}.sdc-context-selector--disabled .sdc-context-selector__title,.sdc-context-selector--disabled .sdc-context-selector__subtitle,.sdc-context-selector--disabled .sdc-context-selector__icons{color:#ccc}::ng-deep .sdc-popover__panel.sdc-context-selector__overlay-panel{padding:0;overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
168
+ }
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContextSelectorComponent, decorators: [{
170
+ type: Component,
171
+ args: [{ selector: 'sdc-context-selector, sdc-workspace-switch', standalone: true, imports: [CommonModule, TranslateModule, PopoverComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div\n class=\"sdc-context-selector\"\n [class.sdc-context-selector--disabled]=\"disabled\"\n>\n <sdc-popover\n [open]=\"open\"\n appendTo=\"body\"\n [offset]=\"8\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [panelClass]=\"'sdc-context-selector__overlay-panel'\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <button\n sdc-popover-trigger\n type=\"button\"\n class=\"sdc-context-selector__button\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"open ? listboxId : null\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n >\n <span class=\"sdc-context-selector__text\">\n <span class=\"sdc-context-selector__title\">{{ selectedWorkspace?.title }}</span>\n <span class=\"sdc-context-selector__subtitle\">{{ selectedWorkspace?.subtitle }}</span>\n </span>\n\n <span class=\"sdc-context-selector__icons\">\n <i class=\"fas fa-chevron-up\"></i>\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </button>\n\n <div sdc-popover-content class=\"sdc-context-selector__panel\">\n <ul\n #listRef\n [id]=\"listboxId\"\n class=\"sdc-context-selector__list\"\n [style.max-height.px]=\"height\"\n >\n @for (workspace of workspaces; track workspace.id; let i = $index) {\n <li\n #listItem\n class=\"sdc-context-selector__item\"\n [class.sdc-context-selector__item--focused]=\"i === currentItemIndex && !workspace.disabled\"\n [class.sdc-context-selector__item--disabled]=\"workspace.disabled\"\n (click)=\"selectIndex(i)\"\n (keydown.enter)=\"selectIndex(i)\"\n (keydown.space)=\"selectIndex(i)\"\n [attr.tabindex]=\"workspace.disabled ? -1 : 0\"\n >\n <span class=\"sdc-context-selector__text\">\n <span class=\"sdc-context-selector__title\">{{ workspace.title }}</span>\n <span class=\"sdc-context-selector__subtitle\">{{ workspace.subtitle }}</span>\n </span>\n\n @if (i === selectedItemIndex) {\n <i class=\"fas fa-check sdc-context-selector__active-icon\"></i>\n }\n </li>\n }\n </ul>\n\n @if (showFooterButton) {\n <div class=\"sdc-context-selector__footer\">\n <button\n type=\"button\"\n class=\"sdc-context-selector__footer-button\"\n (click)=\"onFooterActionClick()\"\n >\n <i class=\"fas fa-plus\"></i>\n <span>{{ footerButtonLabel | translate }}</span>\n </button>\n </div>\n }\n </div>\n </sdc-popover>\n</div>\n", styles: [".sdc-context-selector{display:block;width:min(100%,20.25rem);max-width:100%;border:1px solid transparent;border-radius:.25rem}.sdc-context-selector:focus{border-color:#428bca}.sdc-context-selector__button{display:flex;width:100%;align-items:center;justify-content:space-between;border:0;border-radius:.25rem;background:#fff;cursor:pointer;text-align:left}.sdc-context-selector__text{display:flex;flex:1 1 auto;flex-direction:column;padding:.75rem}.sdc-context-selector__title{color:#333;font-size:.875rem;font-weight:700;line-height:1.5;text-transform:uppercase}.sdc-context-selector__subtitle{color:#999;font-size:.75rem;line-height:1.5}.sdc-context-selector__icons{display:flex;flex-direction:column;gap:.125rem;margin:0 .75rem}.sdc-context-selector__panel{overflow:hidden;border-radius:.25rem;background:#fff}.sdc-context-selector__list{margin:0;overflow:auto;padding:.25rem 0 0;list-style:none}.sdc-context-selector__item{display:flex;align-items:center;justify-content:space-between;cursor:pointer}.sdc-context-selector__item:hover:not(.sdc-context-selector__item--disabled),.sdc-context-selector__item--focused{background:#f1f7f8}.sdc-context-selector__item--disabled{cursor:default;opacity:.5}.sdc-context-selector__active-icon{margin:0 .75rem;color:#7892a1;font-size:.75rem}.sdc-context-selector__footer{border-top:1px solid #ccc;padding:.75rem}.sdc-context-selector__footer-button{display:flex;width:100%;align-items:center;justify-content:center;gap:.5rem;padding:.5rem .75rem;border:1px solid #d8d8d8;border-radius:.25rem;background:#fff;cursor:pointer}.sdc-context-selector__footer-button:active{border-color:#428bca}.sdc-context-selector--disabled .sdc-context-selector__button{cursor:default}.sdc-context-selector--disabled .sdc-context-selector__title,.sdc-context-selector--disabled .sdc-context-selector__subtitle,.sdc-context-selector--disabled .sdc-context-selector__icons{color:#ccc}::ng-deep .sdc-popover__panel.sdc-context-selector__overlay-panel{padding:0;overflow:hidden}\n"] }]
172
+ }], propDecorators: { workspaces: [{
173
+ type: Input,
174
+ args: [{ required: true }]
175
+ }], footerButtonLabel: [{
176
+ type: Input
177
+ }], showFooterButton: [{
178
+ type: Input
179
+ }], disabled: [{
180
+ type: Input
181
+ }], footerButtonClicked: [{
182
+ type: Output
183
+ }], selected: [{
184
+ type: Output
185
+ }], listItems: [{
186
+ type: ViewChildren,
187
+ args: ['listItem']
188
+ }], listRef: [{
189
+ type: ViewChild,
190
+ args: ['listRef']
191
+ }], tabindex: [{
192
+ type: HostBinding,
193
+ args: ['attr.tabindex']
194
+ }], onKeydown: [{
195
+ type: HostListener,
196
+ args: ['keydown', ['$event']]
197
+ }] } });
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NvbnRleHQtc2VsZWN0b3IvY29udGV4dC1zZWxlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NvbnRleHQtc2VsZWN0b3IvY29udGV4dC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUVULFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUdULFlBQVksRUFDWixpQkFBaUIsRUFDakIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZ0RBQWdELEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUUvRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7O0FBRWhFLElBQUkscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO0FBVzVDLE1BQU0sT0FBTyx3QkFBd0I7SUFDM0IsTUFBTSxDQUFDLGlCQUFpQjtRQUM5QixNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQztRQUNyQyxxQkFBcUIsSUFBSSxDQUFDLENBQUM7UUFDM0IsT0FBTyx5QkFBeUIsTUFBTSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVnQixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFdEIsVUFBVSxHQUFnQixFQUFFLENBQUM7SUFDL0MsaUJB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QUM7UUFDckUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDcEQscUJBQXFCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO3dHQXRNVSx3QkFBd0I7NEZBQXhCLHdCQUF3Qiw4bUJDckNyQyw0cEZBK0VBLHNnRURoRFksWUFBWSw4QkFBRSxlQUFlLDRGQUFFLGdCQUFnQjs7NEZBTTlDLHdCQUF3QjtrQkFUcEMsU0FBUzsrQkFDRSw0Q0FBNEMsY0FDMUMsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFHekMsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsUUFBUTs4QkFXZCxVQUFVO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUU2QixTQUFTO3NCQUE1QyxZQUFZO3VCQUFDLFVBQVU7Z0JBQ1EsT0FBTztzQkFBdEMsU0FBUzt1QkFBQyxTQUFTO2dCQVNOLFFBQVE7c0JBRHJCLFdBQVc7dUJBQUMsZUFBZTtnQkFpQmxCLFNBQVM7c0JBRGxCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQgeyBDT05URVhUX1NFTEVDVE9SX0RFRkFVTFRfRk9PVEVSX0JVVFRPTl9MQUJFTF9LRVkgfSBmcm9tICcuLi8uLi9jb3JlL2NvbnN0YW50cy9jb250ZXh0LXNlbGVjdG9yLmNvbnN0JztcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy93b3Jrc3BhY2Utc3dpdGNoLnR5cGUnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQnO1xuXG5sZXQgbmV4dENvbnRleHRTZWxlY3RvcklkID0gMDtcbmNvbnN0IENPTlRFWFRfU0VMRUNUT1JfVklFV1BPUlRfTUFSR0lOID0gMjA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy1jb250ZXh0LXNlbGVjdG9yLCBzZGMtd29ya3NwYWNlLXN3aXRjaCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZSwgUG9wb3ZlckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250ZXh0LXNlbGVjdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29udGV4dC1zZWxlY3Rvci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWRcbn0pXG5leHBvcnQgY2xhc3MgQ29udGV4dFNlbGVjdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYWxsb2NhdGVMaXN0Ym94SWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuZXh0SWQgPSBuZXh0Q29udGV4dFNlbGVjdG9ySWQ7XG4gICAgbmV4dENvbnRleHRTZWxlY3RvcklkICs9IDE7XG4gICAgcmV0dXJuIGBjb250ZXh0LXNlbGVjdG9yLWxpc3QtJHtuZXh0SWR9YDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSB3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VbXSA9IFtdO1xuICBASW5wdXQoKSBmb290ZXJCdXR0b25MYWJlbCA9IENPTlRFWFRfU0VMRUNUT1JfREVGQVVMVF9GT09URVJfQlVUVE9OX0xBQkVMX0tFWTtcbiAgQElucHV0KCkgc2hvd0Zvb3RlckJ1dHRvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGZvb3RlckJ1dHRvbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8V29ya3NwYWNlPigpO1xuXG4gIEBWaWV3Q2hpbGRyZW4oJ2xpc3RJdGVtJykgcHJvdGVjdGVkIGxpc3RJdGVtcz86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XG4gIEBWaWV3Q2hpbGQoJ2xpc3RSZWYnKSBwcm90ZWN0ZWQgbGlzdFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBsaXN0Ym94SWQgPSBDb250ZXh0U2VsZWN0b3JDb21wb25lbnQuYWxsb2NhdGVMaXN0Ym94SWQoKTtcbiAgcHJvdGVjdGVkIG9wZW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGhlaWdodCA9IDA7XG4gIHByb3RlY3RlZCBzZWxlY3RlZEl0ZW1JbmRleCA9IDA7XG4gIHByb3RlY3RlZCBjdXJyZW50SXRlbUluZGV4ID0gMDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICBwcm90ZWN0ZWQgZ2V0IHRhYmluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAtMSA6IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHNlbGVjdGVkV29ya3NwYWNlKCk6IFdvcmtzcGFjZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLndvcmtzcGFjZXNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0gPz8gbnVsbDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snd29ya3NwYWNlcyddIHx8IGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcbiAgICAgIHRoaXMuZW5zdXJlVmFsaWRTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBwcm90ZWN0ZWQgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMud29ya3NwYWNlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0SW5kZXgodGhpcy5jdXJyZW50SXRlbUluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5vcGVuSWZOZWVkZWQoKTtcbiAgICAgIHRoaXMubW92ZUN1cnJlbnRJbmRleCgxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLm9wZW5JZk5lZWRlZCgpO1xuICAgICAgdGhpcy5tb3ZlQ3VycmVudEluZGV4KC0xKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLndvcmtzcGFjZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcblxuICAgIGlmICh0aGlzLm9wZW4pIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVMaXN0TWVhc3VyZW1lbnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblBvcG92ZXJPcGVuQ2hhbmdlKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAob3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RJbmRleChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgd29ya3NwYWNlID0gdGhpcy53b3Jrc3BhY2VzW2luZGV4XTtcblxuICAgIGlmICghd29ya3NwYWNlIHx8IHdvcmtzcGFjZS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmN1cnJlbnRJdGVtSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnNlbGVjdGVkLmVtaXQod29ya3NwYWNlKTtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Gb290ZXJBY3Rpb25DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gICAgdGhpcy5mb290ZXJCdXR0b25DbGlja2VkLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbklmTmVlZGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgIHRoaXMuc2NoZWR1bGVMaXN0TWVhc3VyZW1lbnQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbW92ZUN1cnJlbnRJbmRleChzdGVwOiAxIHwgLTEpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud29ya3NwYWNlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5jdXJyZW50SXRlbUluZGV4O1xuXG4gICAgZm9yIChjb25zdCBfd29ya3NwYWNlIG9mIHRoaXMud29ya3NwYWNlcykge1xuICAgICAgbmV4dEluZGV4ID0gKG5leHRJbmRleCArIHN0ZXAgKyB0aGlzLndvcmtzcGFjZXMubGVuZ3RoKSAlIHRoaXMud29ya3NwYWNlcy5sZW5ndGg7XG5cbiAgICAgIGlmICghdGhpcy53b3Jrc3BhY2VzW25leHRJbmRleF0/LmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEl0ZW1JbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0N1cnJlbnRJdGVtKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudEl0ZW1JbmRleCA9IHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXg7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVZhbGlkU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy53b3Jrc3BhY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnRJdGVtSW5kZXggPSAwO1xuICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy53b3Jrc3BhY2VzLmZpbmRJbmRleCgod29ya3NwYWNlKSA9PiAhd29ya3NwYWNlLmRpc2FibGVkKTtcbiAgICBjb25zdCBmYWxsYmFja0luZGV4ID0gbmV4dEluZGV4ID49IDAgPyBuZXh0SW5kZXggOiAwO1xuXG4gICAgaWYgKCF0aGlzLndvcmtzcGFjZXNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0gfHwgdGhpcy53b3Jrc3BhY2VzW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gZmFsbGJhY2tJbmRleDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMud29ya3NwYWNlc1t0aGlzLmN1cnJlbnRJdGVtSW5kZXhdIHx8IHRoaXMud29ya3NwYWNlc1t0aGlzLmN1cnJlbnRJdGVtSW5kZXhdLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJdGVtSW5kZXggPSB0aGlzLnNlbGVjdGVkSXRlbUluZGV4O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTGlzdE1heEhlaWdodCgpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0RWxlbWVudCA9IHRoaXMubGlzdFJlZj8ubmF0aXZlRWxlbWVudDtcblxuICAgIGlmICghbGlzdEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRvcCB9ID0gbGlzdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heCgwLCB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0b3AgLSBDT05URVhUX1NFTEVDVE9SX1ZJRVdQT1JUX01BUkdJTiAtICh0aGlzLnNob3dGb290ZXJCdXR0b24gPyA2NCA6IDApKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9DdXJyZW50SXRlbSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50SXRlbSA9IHRoaXMubGlzdEl0ZW1zPy50b0FycmF5KClbdGhpcy5jdXJyZW50SXRlbUluZGV4XTtcbiAgICBjdXJyZW50SXRlbT8ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVMaXN0TWVhc3VyZW1lbnQoKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5jYWxjdWxhdGVMaXN0TWF4SGVpZ2h0KCkpO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmNhbGN1bGF0ZUxpc3RNYXhIZWlnaHQoKSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJzZGMtY29udGV4dC1zZWxlY3RvclwiXG4gIFtjbGFzcy5zZGMtY29udGV4dC1zZWxlY3Rvci0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuPlxuICA8c2RjLXBvcG92ZXJcbiAgICBbb3Blbl09XCJvcGVuXCJcbiAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgIFtvZmZzZXRdPVwiOFwiXG4gICAgW21hdGNoVHJpZ2dlcldpZHRoXT1cInRydWVcIlxuICAgIFt0b2dnbGVPblRyaWdnZXJDbGlja109XCJmYWxzZVwiXG4gICAgW3BhbmVsQ2xhc3NdPVwiJ3NkYy1jb250ZXh0LXNlbGVjdG9yX19vdmVybGF5LXBhbmVsJ1wiXG4gICAgKG9wZW5DaGFuZ2UpPVwib25Qb3BvdmVyT3BlbkNoYW5nZSgkZXZlbnQpXCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgIHNkYy1wb3BvdmVyLXRyaWdnZXJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJzZGMtY29udGV4dC1zZWxlY3Rvcl9fYnV0dG9uXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9wZW5cIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJvcGVuID8gbGlzdGJveElkIDogbnVsbFwiXG4gICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbnRleHQtc2VsZWN0b3JfX3RleHRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29udGV4dC1zZWxlY3Rvcl9fdGl0bGVcIj57eyBzZWxlY3RlZFdvcmtzcGFjZT8udGl0bGUgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbnRleHQtc2VsZWN0b3JfX3N1YnRpdGxlXCI+e3sgc2VsZWN0ZWRXb3Jrc3BhY2U/LnN1YnRpdGxlIH19PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb250ZXh0LXNlbGVjdG9yX19pY29uc1wiPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwXCI+PC9pPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICA8L3NwYW4+XG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2IHNkYy1wb3BvdmVyLWNvbnRlbnQgY2xhc3M9XCJzZGMtY29udGV4dC1zZWxlY3Rvcl9fcGFuZWxcIj5cbiAgICAgIDx1bFxuICAgICAgICAjbGlzdFJlZlxuICAgICAgICBbaWRdPVwibGlzdGJveElkXCJcbiAgICAgICAgY2xhc3M9XCJzZGMtY29udGV4dC1zZWxlY3Rvcl9fbGlzdFwiXG4gICAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cImhlaWdodFwiXG4gICAgICA+XG4gICAgICAgIEBmb3IgKHdvcmtzcGFjZSBvZiB3b3Jrc3BhY2VzOyB0cmFjayB3b3Jrc3BhY2UuaWQ7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxsaVxuICAgICAgICAgICNsaXN0SXRlbVxuICAgICAgICAgIGNsYXNzPVwic2RjLWNvbnRleHQtc2VsZWN0b3JfX2l0ZW1cIlxuICAgICAgICAgIFtjbGFzcy5zZGMtY29udGV4dC1zZWxlY3Rvcl9faXRlbS0tZm9jdXNlZF09XCJpID09PSBjdXJyZW50SXRlbUluZGV4ICYmICF3b3Jrc3BhY2UuZGlzYWJsZWRcIlxuICAgICAgICAgIFtjbGFzcy5zZGMtY29udGV4dC1zZWxlY3Rvcl9faXRlbS0tZGlzYWJsZWRdPVwid29ya3NwYWNlLmRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SW5kZXgoaSlcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlbGVjdEluZGV4KGkpXCJcbiAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJzZWxlY3RJbmRleChpKVwiXG4gICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwid29ya3NwYWNlLmRpc2FibGVkID8gLTEgOiAwXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbnRleHQtc2VsZWN0b3JfX3RleHRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbnRleHQtc2VsZWN0b3JfX3RpdGxlXCI+e3sgd29ya3NwYWNlLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29udGV4dC1zZWxlY3Rvcl9fc3VidGl0bGVcIj57eyB3b3Jrc3BhY2Uuc3VidGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgQGlmIChpID09PSBzZWxlY3RlZEl0ZW1JbmRleCkge1xuICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrIHNkYy1jb250ZXh0LXNlbGVjdG9yX19hY3RpdmUtaWNvblwiPjwvaT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGk+XG4gICAgICAgIH1cbiAgICAgIDwvdWw+XG5cbiAgICAgIEBpZiAoc2hvd0Zvb3RlckJ1dHRvbikge1xuICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb250ZXh0LXNlbGVjdG9yX19mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwic2RjLWNvbnRleHQtc2VsZWN0b3JfX2Zvb3Rlci1idXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJvbkZvb3RlckFjdGlvbkNsaWNrKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1c1wiPjwvaT5cbiAgICAgICAgICA8c3Bhbj57eyBmb290ZXJCdXR0b25MYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9zZGMtcG9wb3Zlcj5cbjwvZGl2PlxuIl19
@@ -247,7 +247,7 @@ export class FiltersComponent {
247
247
  return [model];
248
248
  }
249
249
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
250
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FiltersComponent, isStandalone: true, selector: "sdc-filters", inputs: { data: "data", config: "config", loading: "loading", filterColumnClass: "filterColumnClass" }, outputs: { filtered: "filtered" }, usesOnChanges: true, ngImport: i0, template: "<section class=\"grid min-h-10rem\" role=\"search\"\n [attr.aria-label]=\"'platform.datacore.accessibility.filters_section' | translate\">\n @if (config!.search!.show !== false) {\n <div class=\"col-12 md:col-12 lg:col-6 xl:col-4\">\n <sdc-searchbox [disabled]=\"loading\" [label]=\"config!.search!.label || ''\"\n [placeholder]=\"config!.search!.placeholder || ''\" [size]=\"'small'\"\n [triggerMode]=\"config!.search!.triggerMode || 'auto'\" (onSearch)=\"onSearch($event)\" (onClear)=\"onClear()\">\n </sdc-searchbox>\n </div>\n }\n @if (config!.filters!.length) {\n @for (def of config.filters; track def.key) {\n <div class=\"sdc-filters__filter-item\" [ngClass]=\"filterItemColumnClass\" [class.mb-3]=\"isMobile\">\n <sdc-combobox width=\"100%\" [label]=\"def.label || ''\" [disabled]=\"loading\" [placeholder]=\"def.placeholder || ''\"\n [multiple]=\"(def.type ?? 'multiselect') === 'multiselect'\" [options]=\"filterOptionsMap[def.key]\"\n [(ngModel)]=\"selectedValues[def.key]\" (ngModelChange)=\"onComboChange(def.key, $event)\"\n [infoTooltip]=\"def.infoTooltip || ''\"\n [infoTooltipAllowHtml]=\"def.infoTooltipAllowHtml ?? false\"\n [infoTooltipPosition]=\"def.infoTooltipPosition ?? 'right'\"\n [attr.aria-label]=\"\n def.label || \n def.placeholder || \n ('platform.datacore.accessibility.filter_field' | translate)\n \">\n </sdc-combobox>\n </div>\n }\n }\n</section>\n", styles: [".bg-disabled{background-color:var(--p-inputtext-disabled-background)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: ComboboxComponent, selector: "sdc-combobox", inputs: ["multiple", "appendTo", "zIndex", "options", "overrideChipMessage", "maxSelectedLabels", "showClear", "iconSelector", "showIconClass", "infoTooltip", "infoTooltipPosition", "infoTooltipEvent", "infoTooltipAllowHtml"], outputs: ["onSelectedItem", "panelClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
250
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FiltersComponent, isStandalone: true, selector: "sdc-filters", inputs: { data: "data", config: "config", loading: "loading", filterColumnClass: "filterColumnClass" }, outputs: { filtered: "filtered" }, usesOnChanges: true, ngImport: i0, template: "<section class=\"grid min-h-10rem\" role=\"search\"\n [attr.aria-label]=\"'platform.datacore.accessibility.filters_section' | translate\">\n @if (config!.search!.show !== false) {\n <div class=\"col-12 md:col-12 lg:col-6 xl:col-4\">\n <sdc-searchbox [disabled]=\"loading\" [label]=\"config!.search!.label || ''\"\n [placeholder]=\"config!.search!.placeholder || ''\" [size]=\"'small'\"\n [triggerMode]=\"config!.search!.triggerMode || 'auto'\" (onSearch)=\"onSearch($event)\" (onClear)=\"onClear()\">\n </sdc-searchbox>\n </div>\n }\n @if (config!.filters!.length) {\n @for (def of config.filters; track def.key) {\n <div class=\"sdc-filters__filter-item\" [ngClass]=\"filterItemColumnClass\" [class.mb-3]=\"isMobile\">\n <sdc-combobox width=\"100%\" [label]=\"def.label || ''\" [disabled]=\"loading\" [placeholder]=\"def.placeholder || ''\"\n [multiple]=\"(def.type ?? 'multiselect') === 'multiselect'\" [options]=\"filterOptionsMap[def.key]\"\n [(ngModel)]=\"selectedValues[def.key]\" (ngModelChange)=\"onComboChange(def.key, $event)\"\n [infoTooltip]=\"def.infoTooltip || ''\"\n [infoTooltipAllowHtml]=\"def.infoTooltipAllowHtml ?? false\"\n [infoTooltipPosition]=\"def.infoTooltipPosition ?? 'right'\"\n [attr.aria-label]=\"\n def.label || \n def.placeholder || \n ('platform.datacore.accessibility.filter_field' | translate)\n \">\n </sdc-combobox>\n </div>\n }\n }\n</section>\n", styles: [".bg-disabled{background-color:var(--p-inputtext-disabled-background)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: ComboboxComponent, selector: "sdc-combobox", inputs: ["multiple", "appendTo", "zIndex", "options", "overrideChipMessage", "maxSelectedLabels", "showClear", "searchable", "iconSelector", "showIconClass", "infoTooltip", "infoTooltipPosition", "infoTooltipEvent", "infoTooltipAllowHtml"], outputs: ["onSelectedItem", "panelClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
251
251
  }
252
252
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FiltersComponent, decorators: [{
253
253
  type: Component,
@@ -0,0 +1,17 @@
1
+ import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class GanttSideTableComponent {
4
+ tasks = [];
5
+ columnTitle = '';
6
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GanttSideTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GanttSideTableComponent, isStandalone: true, selector: "sdc-gantt-side-table", inputs: { tasks: "tasks", columnTitle: "columnTitle" }, ngImport: i0, template: "<div class=\"sdc-gantt-side-table\">\n <div class=\"sdc-gantt-side-table__header\">{{ columnTitle }}</div>\n\n @for (group of tasks; track group.id) {\n @for (task of group.tasks; track task.id) {\n <div class=\"sdc-gantt-side-table__row\">\n <div class=\"sdc-gantt-side-table__title\" [title]=\"task.name\">{{ task.name }}</div>\n </div>\n }\n }\n</div>\n", styles: [":host{display:block;flex-shrink:0}.sdc-gantt-side-table{border-right:1px solid var(--sdc-gantt-side-table-border, #e0e0e0);display:flex;flex-direction:column;min-width:160px;width:200px}.sdc-gantt-side-table__header{align-items:center;background:var(--sdc-gantt-header-bg, #fff);border-bottom:1px solid var(--sdc-gantt-side-table-border, #e0e0e0);display:flex;font-size:13px;font-weight:600;height:var(--sdc-gantt-row-height, 44px);min-height:calc(var(--sdc-gantt-row-height, 44px) * 2 + 6px);padding:0 12px}.sdc-gantt-side-table__row{align-items:center;border-bottom:1px solid var(--sdc-gantt-side-table-border, #e0e0e0);display:flex;height:var(--sdc-gantt-row-height, 44px);min-height:var(--sdc-gantt-row-height, 44px);padding:0 12px}.sdc-gantt-side-table__row:nth-child(2n){background:var(--sdc-gantt-row-even-bg, #f5f5f5)}.sdc-gantt-side-table__row:nth-child(odd){background:var(--sdc-gantt-row-odd-bg, #fff)}.sdc-gantt-side-table__title{font-size:13px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8
+ }
9
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GanttSideTableComponent, decorators: [{
10
+ type: Component,
11
+ args: [{ standalone: true, selector: 'sdc-gantt-side-table', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div class=\"sdc-gantt-side-table\">\n <div class=\"sdc-gantt-side-table__header\">{{ columnTitle }}</div>\n\n @for (group of tasks; track group.id) {\n @for (task of group.tasks; track task.id) {\n <div class=\"sdc-gantt-side-table__row\">\n <div class=\"sdc-gantt-side-table__title\" [title]=\"task.name\">{{ task.name }}</div>\n </div>\n }\n }\n</div>\n", styles: [":host{display:block;flex-shrink:0}.sdc-gantt-side-table{border-right:1px solid var(--sdc-gantt-side-table-border, #e0e0e0);display:flex;flex-direction:column;min-width:160px;width:200px}.sdc-gantt-side-table__header{align-items:center;background:var(--sdc-gantt-header-bg, #fff);border-bottom:1px solid var(--sdc-gantt-side-table-border, #e0e0e0);display:flex;font-size:13px;font-weight:600;height:var(--sdc-gantt-row-height, 44px);min-height:calc(var(--sdc-gantt-row-height, 44px) * 2 + 6px);padding:0 12px}.sdc-gantt-side-table__row{align-items:center;border-bottom:1px solid var(--sdc-gantt-side-table-border, #e0e0e0);display:flex;height:var(--sdc-gantt-row-height, 44px);min-height:var(--sdc-gantt-row-height, 44px);padding:0 12px}.sdc-gantt-side-table__row:nth-child(2n){background:var(--sdc-gantt-row-even-bg, #f5f5f5)}.sdc-gantt-side-table__row:nth-child(odd){background:var(--sdc-gantt-row-odd-bg, #fff)}.sdc-gantt-side-table__title{font-size:13px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
12
+ }], propDecorators: { tasks: [{
13
+ type: Input
14
+ }], columnTitle: [{
15
+ type: Input
16
+ }] } });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtc2lkZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2dhbnR0L2NvbXBvbmVudHMvZ2FudHQtc2lkZS10YWJsZS9nYW50dC1zaWRlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvZ2FudHQvY29tcG9uZW50cy9nYW50dC1zaWRlLXRhYmxlL2dhbnR0LXNpZGUtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBWTdGLE1BQU0sT0FBTyx1QkFBdUI7SUFDekIsS0FBSyxHQUFxQixFQUFFLENBQUM7SUFDN0IsV0FBVyxHQUFHLEVBQUUsQ0FBQzt3R0FGZix1QkFBdUI7NEZBQXZCLHVCQUF1Qix3SUNacEMsZ1lBV0E7OzRGRENhLHVCQUF1QjtrQkFSbkMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sc0JBQXNCLG1CQUdmLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLFFBQVE7OEJBR2hDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgR2FudHRUYXNrR3JvdXAgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3R5cGVzL2dhbnR0LnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdzZGMtZ2FudHQtc2lkZS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9nYW50dC1zaWRlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2FudHQtc2lkZS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQsXG59KVxuZXhwb3J0IGNsYXNzIEdhbnR0U2lkZVRhYmxlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgdGFza3M6IEdhbnR0VGFza0dyb3VwW10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uVGl0bGUgPSAnJztcbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtZ2FudHQtc2lkZS10YWJsZVwiPlxuICA8ZGl2IGNsYXNzPVwic2RjLWdhbnR0LXNpZGUtdGFibGVfX2hlYWRlclwiPnt7IGNvbHVtblRpdGxlIH19PC9kaXY+XG5cbiAgQGZvciAoZ3JvdXAgb2YgdGFza3M7IHRyYWNrIGdyb3VwLmlkKSB7XG4gICAgQGZvciAodGFzayBvZiBncm91cC50YXNrczsgdHJhY2sgdGFzay5pZCkge1xuICAgICAgPGRpdiBjbGFzcz1cInNkYy1nYW50dC1zaWRlLXRhYmxlX19yb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1nYW50dC1zaWRlLXRhYmxlX190aXRsZVwiIFt0aXRsZV09XCJ0YXNrLm5hbWVcIj57eyB0YXNrLm5hbWUgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Native Date API utilities for the Gantt component.
3
+ * No moment.js dependency.
4
+ */
5
+ // Time constants (in milliseconds)
6
+ const MS_PER_DAY = 86_400_000;
7
+ const MS_PER_HOUR = 3_600_000;
8
+ // Date/time calculation constants
9
+ const SUNDAY = 0;
10
+ const SATURDAY = 6;
11
+ const MONDAY_OFFSET_FROM_SUNDAY = 1;
12
+ const ISO_WEEK_DAY_OFFSET_FOR_MONDAY = -6;
13
+ const FIRST_DAY_OF_MONTH = 1;
14
+ const PADDED_LENGTH = 2;
15
+ /** Add N days to a date (returns new Date, does not mutate). */
16
+ export function addDays(date, days) {
17
+ const d = new Date(date);
18
+ d.setDate(d.getDate() + days);
19
+ return d;
20
+ }
21
+ /** Add N hours to a date (returns new Date, does not mutate). */
22
+ export function addHours(date, hours) {
23
+ const d = new Date(date);
24
+ d.setHours(d.getHours() + hours);
25
+ return d;
26
+ }
27
+ /** Difference in whole days between two dates (b - a). */
28
+ export function diffDays(a, b) {
29
+ return Math.round((b.getTime() - a.getTime()) / MS_PER_DAY);
30
+ }
31
+ /** Difference in whole hours between two dates (b - a). */
32
+ export function diffHours(a, b) {
33
+ return Math.round((b.getTime() - a.getTime()) / MS_PER_HOUR);
34
+ }
35
+ /** Format a date for display (e.g. "01 jan. 2024"). */
36
+ export function formatDate(date, locale = 'pt-BR') {
37
+ return date.toLocaleDateString(locale, { day: '2-digit', month: 'short', year: 'numeric' });
38
+ }
39
+ /** Format as "dd/MM" for grid header labels. */
40
+ export function formatDayMonth(date) {
41
+ const day = String(date.getDate()).padStart(PADDED_LENGTH, '0');
42
+ const month = String(date.getMonth() + 1).padStart(PADDED_LENGTH, '0');
43
+ return `${day}/${month}`;
44
+ }
45
+ /** Format as abbreviated weekday + day number for week headers. */
46
+ export function formatWeekLabel(date, locale = 'pt-BR') {
47
+ return date.toLocaleDateString(locale, { weekday: 'short', day: '2-digit', month: '2-digit' });
48
+ }
49
+ /** Format as abbreviated month + year for month headers. */
50
+ export function formatMonthLabel(date, locale = 'pt-BR') {
51
+ return date.toLocaleDateString(locale, { month: 'short', year: 'numeric' });
52
+ }
53
+ /** Format as "HH:00" for hour headers. */
54
+ export function formatHourLabel(date) {
55
+ return `${String(date.getHours()).padStart(PADDED_LENGTH, '0')}:00`;
56
+ }
57
+ /** Return a new Date set to midnight (start of day). */
58
+ export function startOfDay(date) {
59
+ const d = new Date(date);
60
+ d.setHours(0, 0, 0, 0);
61
+ return d;
62
+ }
63
+ /** Return a new Date set to the first day of the ISO week that contains `date`. */
64
+ export function startOfWeek(date) {
65
+ const d = new Date(date);
66
+ const day = d.getDay(); // 0=Sun … 6=Sat
67
+ const diff = day === SUNDAY ? ISO_WEEK_DAY_OFFSET_FOR_MONDAY : MONDAY_OFFSET_FROM_SUNDAY - day; // Monday-based week
68
+ d.setDate(d.getDate() + diff);
69
+ d.setHours(0, 0, 0, 0);
70
+ return d;
71
+ }
72
+ /** Return a new Date set to the first day of the month that contains `date`. */
73
+ export function startOfMonth(date) {
74
+ return new Date(date.getFullYear(), date.getMonth(), FIRST_DAY_OF_MONTH, 0, 0, 0, 0);
75
+ }
76
+ /** Return a new Date set to the first hour of the current hour slot. */
77
+ export function startOfHour(date) {
78
+ const d = new Date(date);
79
+ d.setMinutes(0, 0, 0);
80
+ return d;
81
+ }
82
+ /** True if two dates fall on the same calendar day. */
83
+ export function isSameDay(a, b) {
84
+ return (a.getFullYear() === b.getFullYear() &&
85
+ a.getMonth() === b.getMonth() &&
86
+ a.getDate() === b.getDate());
87
+ }
88
+ /** True if the given date is a Saturday or Sunday. */
89
+ export function isWeekend(date) {
90
+ const day = date.getDay();
91
+ return day === SUNDAY || day === SATURDAY;
92
+ }
93
+ /** Clamp `value` between `min` and `max`. */
94
+ export function clamp(value, min, max) {
95
+ return Math.max(min, Math.min(max, value));
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtZGF0ZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvZ2FudHQvZ2FudHQtZGF0ZS51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQzlCLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQztBQUU5QixrQ0FBa0M7QUFDbEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztBQUNuQixNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUNwQyxNQUFNLDhCQUE4QixHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQUV4QixnRUFBZ0U7QUFDaEUsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUFVLEVBQUUsSUFBWTtJQUM5QyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM5QixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFVLEVBQUUsS0FBYTtJQUNoRCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUNqQyxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxDQUFPLEVBQUUs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QUFNLFVBQVUsS0FBSyxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsR0FBVztJQUMzRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmF0aXZlIERhdGUgQVBJIHV0aWxpdGllcyBmb3IgdGhlIEdhbnR0IGNvbXBvbmVudC5cbiAqIE5vIG1vbWVudC5qcyBkZXBlbmRlbmN5LlxuICovXG5cbi8vIFRpbWUgY29uc3RhbnRzIChpbiBtaWxsaXNlY29uZHMpXG5jb25zdCBNU19QRVJfREFZID0gODZfNDAwXzAwMDtcbmNvbnN0IE1TX1BFUl9IT1VSID0gM182MDBfMDAwO1xuXG4vLyBEYXRlL3RpbWUgY2FsY3VsYXRpb24gY29uc3RhbnRzXG5jb25zdCBTVU5EQVkgPSAwO1xuY29uc3QgU0FUVVJEQVkgPSA2O1xuY29uc3QgTU9OREFZX09GRlNFVF9GUk9NX1NVTkRBWSA9IDE7XG5jb25zdCBJU09fV0VFS19EQVlfT0ZGU0VUX0ZPUl9NT05EQVkgPSAtNjtcbmNvbnN0IEZJUlNUX0RBWV9PRl9NT05USCA9IDE7XG5jb25zdCBQQURERURfTEVOR1RIID0gMjtcblxuLyoqIEFkZCBOIGRheXMgdG8gYSBkYXRlIChyZXR1cm5zIG5ldyBEYXRlLCBkb2VzIG5vdCBtdXRhdGUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERheXMoZGF0ZTogRGF0ZSwgZGF5czogbnVtYmVyKTogRGF0ZSB7XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gIHJldHVybiBkO1xufVxuXG4vKiogQWRkIE4gaG91cnMgdG8gYSBkYXRlIChyZXR1cm5zIG5ldyBEYXRlLCBkb2VzIG5vdCBtdXRhdGUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEhvdXJzKGRhdGU6IERhdGUsIGhvdXJzOiBudW1iZXIpOiBEYXRlIHtcbiAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGUpO1xuICBkLnNldEhvdXJzKGQuZ2V0SG91cnMoKSArIGhvdXJzKTtcbiAgcmV0dXJuIGQ7XG59XG5cbi8qKiBEaWZmZXJlbmNlIGluIHdob2xlIGRheXMgYmV0d2VlbiB0d28gZGF0ZXMgKGIgLSBhKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmRGF5cyhhOiBEYXRlLCBiOiBEYXRlKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoKGIuZ2V0VGltZSgpIC0gYS5nZXRUaW1lKCkpIC8gTVNfUEVSX0RBWSk7XG59XG5cbi8qKiBEaWZmZXJlbmNlIGluIHdob2xlIGhvdXJzIGJldHdlZW4gdHdvIGRhdGVzIChiIC0gYSkuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZkhvdXJzKGE6IERhdGUsIGI6IERhdGUpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yb3VuZCgoYi5nZXRUaW1lKCkgLSBhLmdldFRpbWUoKSkgLyBNU19QRVJfSE9VUik7XG59XG5cbi8qKiBGb3JtYXQgYSBkYXRlIGZvciBkaXNwbGF5IChlLmcuIFwiMDEgamFuLiAyMDI0XCIpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSwgbG9jYWxlID0gJ3B0LUJSJyk6IHN0cmluZyB7XG4gIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhsb2NhbGUsIHsgZGF5OiAnMi1kaWdpdCcsIG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG59XG5cbi8qKiBGb3JtYXQgYXMgXCJkZC9NTVwiIGZvciBncmlkIGhlYWRlciBsYWJlbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF5TW9udGgoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoUEFEREVEX0xFTkdUSCwgJzAnKTtcbiAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoUEFEREVEX0xFTkdUSCwgJzAnKTtcbiAgcmV0dXJuIGAke2RheX0vJHttb250aH1gO1xufVxuXG4vKiogRm9ybWF0IGFzIGFiYnJldmlhdGVkIHdlZWtkYXkgKyBkYXkgbnVtYmVyIGZvciB3ZWVrIGhlYWRlcnMuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0V2Vla0xhYmVsKGRhdGU6IERhdGUsIGxvY2FsZSA9ICdwdC1CUicpOiBzdHJpbmcge1xuICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdzaG9ydCcsIGRheTogJzItZGlnaXQnLCBtb250aDogJzItZGlnaXQnIH0pO1xufVxuXG4vKiogRm9ybWF0IGFzIGFiYnJldmlhdGVkIG1vbnRoICsgeWVhciBmb3IgbW9udGggaGVhZGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNb250aExhYmVsKGRhdGU6IERhdGUsIGxvY2FsZSA9ICdwdC1CUicpOiBzdHJpbmcge1xuICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG59XG5cbi8qKiBGb3JtYXQgYXMgXCJISDowMFwiIGZvciBob3VyIGhlYWRlcnMuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0SG91ckxhYmVsKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7U3RyaW5nKGRhdGUuZ2V0SG91cnMoKSkucGFkU3RhcnQoUEFEREVEX0xFTkdUSCwgJzAnKX06MDBgO1xufVxuXG4vKiogUmV0dXJuIGEgbmV3IERhdGUgc2V0IHRvIG1pZG5pZ2h0IChzdGFydCBvZiBkYXkpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZEYXkoZGF0ZTogRGF0ZSk6IERhdGUge1xuICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZSk7XG4gIGQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkO1xufVxuXG4vKiogUmV0dXJuIGEgbmV3IERhdGUgc2V0IHRvIHRoZSBmaXJzdCBkYXkgb2YgdGhlIElTTyB3ZWVrIHRoYXQgY29udGFpbnMgYGRhdGVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZXZWVrKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGUpO1xuICBjb25zdCBkYXkgPSBkLmdldERheSgpOyAvLyAwPVN1biDigKYgNj1TYXRcbiAgY29uc3QgZGlmZiA9IGRheSA9PT0gU1VOREFZID8gSVNPX1dFRUtfREFZX09GRlNFVF9GT1JfTU9OREFZIDogTU9OREFZX09GRlNFVF9GUk9NX1NVTkRBWSAtIGRheTsgLy8gTW9uZGF5LWJhc2VkIHdlZWtcbiAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpICsgZGlmZik7XG4gIGQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkO1xufVxuXG4vKiogUmV0dXJuIGEgbmV3IERhdGUgc2V0IHRvIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoIHRoYXQgY29udGFpbnMgYGRhdGVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZNb250aChkYXRlOiBEYXRlKTogRGF0ZSB7XG4gIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgRklSU1RfREFZX09GX01PTlRILCAwLCAwLCAwLCAwKTtcbn1cblxuLyoqIFJldHVybiBhIG5ldyBEYXRlIHNldCB0byB0aGUgZmlyc3QgaG91ciBvZiB0aGUgY3VycmVudCBob3VyIHNsb3QuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRPZkhvdXIoZGF0ZTogRGF0ZSk6IERhdGUge1xuICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZSk7XG4gIGQuc2V0TWludXRlcygwLCAwLCAwKTtcbiAgcmV0dXJuIGQ7XG59XG5cbi8qKiBUcnVlIGlmIHR3byBkYXRlcyBmYWxsIG9uIHRoZSBzYW1lIGNhbGVuZGFyIGRheS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhbWVEYXkoYTogRGF0ZSwgYjogRGF0ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGEuZ2V0RnVsbFllYXIoKSA9PT0gYi5nZXRGdWxsWWVhcigpICYmXG4gICAgYS5nZXRNb250aCgpID09PSBiLmdldE1vbnRoKCkgJiZcbiAgICBhLmdldERhdGUoKSA9PT0gYi5nZXREYXRlKClcbiAgKTtcbn1cblxuLyoqIFRydWUgaWYgdGhlIGdpdmVuIGRhdGUgaXMgYSBTYXR1cmRheSBvciBTdW5kYXkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXZWVrZW5kKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXkoKTtcbiAgcmV0dXJuIGRheSA9PT0gU1VOREFZIHx8IGRheSA9PT0gU0FUVVJEQVk7XG59XG5cbi8qKiBDbGFtcCBgdmFsdWVgIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTtcbn1cbiJdfQ==
@@ -0,0 +1,89 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
2
+ import { GANTT_DEFAULT_COLUMN_TITLE_KEY, GANTT_DEFAULT_VIEW_MODE } from '../../core/constants/gantt.const';
3
+ import { GanttEngine } from './gantt.engine';
4
+ import { GanttSideTableComponent } from './components/gantt-side-table/gantt-side-table.component';
5
+ import * as i0 from "@angular/core";
6
+ export class GanttComponent {
7
+ tasks = [];
8
+ viewMode = GANTT_DEFAULT_VIEW_MODE;
9
+ columnTitle = GANTT_DEFAULT_COLUMN_TITLE_KEY;
10
+ showSideTable = true;
11
+ allowMovement = true;
12
+ hasPopup = true;
13
+ fullWidth = false;
14
+ taskClicked = new EventEmitter();
15
+ taskDateChanged = new EventEmitter();
16
+ viewChanged = new EventEmitter();
17
+ ganttSvgRef;
18
+ get isFullWidth() {
19
+ return this.fullWidth;
20
+ }
21
+ engine = null;
22
+ ngAfterViewInit() {
23
+ this.engine = new GanttEngine(this.ganttSvgRef.nativeElement, this.flattenTasks(), {
24
+ viewMode: this.viewMode,
25
+ allowMovement: this.allowMovement,
26
+ hasPopup: this.hasPopup,
27
+ onTaskClick: (task) => this.taskClicked.emit(task),
28
+ onDateChange: (task, start, end) => this.taskDateChanged.emit({ task, start, end }),
29
+ });
30
+ }
31
+ ngOnChanges(changes) {
32
+ if (!this.engine) {
33
+ return;
34
+ }
35
+ if (changes['viewMode'] || changes['allowMovement'] || changes['hasPopup']) {
36
+ this.engine.updateOptions({
37
+ allowMovement: this.allowMovement,
38
+ hasPopup: this.hasPopup,
39
+ viewMode: this.viewMode
40
+ });
41
+ if (changes['viewMode']) {
42
+ this.viewChanged.emit(this.viewMode);
43
+ }
44
+ }
45
+ if (changes['tasks']) {
46
+ this.engine.refresh(this.flattenTasks());
47
+ }
48
+ }
49
+ ngOnDestroy() {
50
+ this.engine?.destroy();
51
+ this.engine = null;
52
+ }
53
+ flattenTasks() {
54
+ return this.tasks.flatMap((group) => group.tasks);
55
+ }
56
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GanttComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
57
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GanttComponent, isStandalone: true, selector: "sdc-gantt", inputs: { tasks: "tasks", viewMode: "viewMode", columnTitle: "columnTitle", showSideTable: "showSideTable", allowMovement: "allowMovement", hasPopup: "hasPopup", fullWidth: "fullWidth" }, outputs: { taskClicked: "taskClicked", taskDateChanged: "taskDateChanged", viewChanged: "viewChanged" }, host: { properties: { "class.sdc-gantt--full-width": "this.isFullWidth" } }, viewQueries: [{ propertyName: "ganttSvgRef", first: true, predicate: ["ganttSvg"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"sdc-gantt\">\n @if (showSideTable) {\n <sdc-gantt-side-table\n [tasks]=\"tasks\"\n [columnTitle]=\"columnTitle\">\n </sdc-gantt-side-table>\n }\n\n <div class=\"sdc-gantt__svg-container\">\n <svg #ganttSvg class=\"sdc-gantt__svg\" aria-label=\"Gantt chart\"></svg>\n </div>\n</div>\n", styles: [":host{display:block;overflow:hidden}:host.sdc-gantt--full-width{width:100%}.sdc-gantt{--sdc-gantt-header-bg: #fff;--sdc-gantt-row-even-bg: #f5f5f5;--sdc-gantt-row-odd-bg: #fff;--sdc-gantt-grid-color: #e0e0e0;--sdc-gantt-tick-color: #428bca;--sdc-gantt-bar-default-color: #7892a1;--sdc-gantt-bar-selected-stroke: #212533;--sdc-gantt-today-highlight: rgba(255, 233, 121, .5);--sdc-gantt-weekend-highlight: rgba(184, 194, 204, .5);--sdc-gantt-bar-text: #fff;--sdc-gantt-side-table-border: #e0e0e0;--sdc-gantt-row-height: 44px;display:flex;overflow:auto;width:100%}.sdc-gantt__svg-container{flex:1;overflow:auto}.sdc-gantt__svg{display:block;-webkit-user-select:none;user-select:none}::ng-deep .sdc-gantt-row-bg--even{fill:var(--sdc-gantt-row-even-bg, #f5f5f5)}::ng-deep .sdc-gantt-row-bg--odd{fill:var(--sdc-gantt-row-odd-bg, #fff)}::ng-deep .sdc-gantt-grid-line{stroke:var(--sdc-gantt-grid-color, #e0e0e0);stroke-width:1}::ng-deep .sdc-gantt-header-border{stroke:var(--sdc-gantt-grid-color, #cccccc);stroke-width:2}::ng-deep .sdc-gantt-header-cell{fill:var(--sdc-gantt-header-bg, #fff)}::ng-deep .sdc-gantt-header-label{fill:#333;font-family:var(--sdc-font-family, \"Open Sans\", sans-serif);font-size:11px;font-weight:600;pointer-events:none}::ng-deep .sdc-gantt-today{fill:var(--sdc-gantt-today-highlight, rgba(255, 233, 121, .5));pointer-events:none}::ng-deep .sdc-gantt-weekend{fill:var(--sdc-gantt-weekend-highlight, rgba(184, 194, 204, .5));pointer-events:none}::ng-deep .sdc-gantt-bar{opacity:.9;transition:opacity .15s ease-out}::ng-deep .sdc-gantt-bar:hover{opacity:1}::ng-deep .sdc-gantt-bar-group:hover .sdc-gantt-bar{opacity:1}::ng-deep .sdc-gantt-bar-label{fill:var(--sdc-gantt-bar-text, #fff);font-family:var(--sdc-font-family, \"Open Sans\", sans-serif);font-size:11px;pointer-events:none}::ng-deep .sdc-gantt-bar-handle{opacity:0;transition:opacity .15s ease-out}::ng-deep .sdc-gantt-bar-group:hover .sdc-gantt-bar-handle{opacity:1}\n"], dependencies: [{ kind: "component", type: GanttSideTableComponent, selector: "sdc-gantt-side-table", inputs: ["tasks", "columnTitle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GanttComponent, decorators: [{
60
+ type: Component,
61
+ args: [{ standalone: true, imports: [GanttSideTableComponent], selector: 'sdc-gantt', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div class=\"sdc-gantt\">\n @if (showSideTable) {\n <sdc-gantt-side-table\n [tasks]=\"tasks\"\n [columnTitle]=\"columnTitle\">\n </sdc-gantt-side-table>\n }\n\n <div class=\"sdc-gantt__svg-container\">\n <svg #ganttSvg class=\"sdc-gantt__svg\" aria-label=\"Gantt chart\"></svg>\n </div>\n</div>\n", styles: [":host{display:block;overflow:hidden}:host.sdc-gantt--full-width{width:100%}.sdc-gantt{--sdc-gantt-header-bg: #fff;--sdc-gantt-row-even-bg: #f5f5f5;--sdc-gantt-row-odd-bg: #fff;--sdc-gantt-grid-color: #e0e0e0;--sdc-gantt-tick-color: #428bca;--sdc-gantt-bar-default-color: #7892a1;--sdc-gantt-bar-selected-stroke: #212533;--sdc-gantt-today-highlight: rgba(255, 233, 121, .5);--sdc-gantt-weekend-highlight: rgba(184, 194, 204, .5);--sdc-gantt-bar-text: #fff;--sdc-gantt-side-table-border: #e0e0e0;--sdc-gantt-row-height: 44px;display:flex;overflow:auto;width:100%}.sdc-gantt__svg-container{flex:1;overflow:auto}.sdc-gantt__svg{display:block;-webkit-user-select:none;user-select:none}::ng-deep .sdc-gantt-row-bg--even{fill:var(--sdc-gantt-row-even-bg, #f5f5f5)}::ng-deep .sdc-gantt-row-bg--odd{fill:var(--sdc-gantt-row-odd-bg, #fff)}::ng-deep .sdc-gantt-grid-line{stroke:var(--sdc-gantt-grid-color, #e0e0e0);stroke-width:1}::ng-deep .sdc-gantt-header-border{stroke:var(--sdc-gantt-grid-color, #cccccc);stroke-width:2}::ng-deep .sdc-gantt-header-cell{fill:var(--sdc-gantt-header-bg, #fff)}::ng-deep .sdc-gantt-header-label{fill:#333;font-family:var(--sdc-font-family, \"Open Sans\", sans-serif);font-size:11px;font-weight:600;pointer-events:none}::ng-deep .sdc-gantt-today{fill:var(--sdc-gantt-today-highlight, rgba(255, 233, 121, .5));pointer-events:none}::ng-deep .sdc-gantt-weekend{fill:var(--sdc-gantt-weekend-highlight, rgba(184, 194, 204, .5));pointer-events:none}::ng-deep .sdc-gantt-bar{opacity:.9;transition:opacity .15s ease-out}::ng-deep .sdc-gantt-bar:hover{opacity:1}::ng-deep .sdc-gantt-bar-group:hover .sdc-gantt-bar{opacity:1}::ng-deep .sdc-gantt-bar-label{fill:var(--sdc-gantt-bar-text, #fff);font-family:var(--sdc-font-family, \"Open Sans\", sans-serif);font-size:11px;pointer-events:none}::ng-deep .sdc-gantt-bar-handle{opacity:0;transition:opacity .15s ease-out}::ng-deep .sdc-gantt-bar-group:hover .sdc-gantt-bar-handle{opacity:1}\n"] }]
62
+ }], propDecorators: { tasks: [{
63
+ type: Input
64
+ }], viewMode: [{
65
+ type: Input
66
+ }], columnTitle: [{
67
+ type: Input
68
+ }], showSideTable: [{
69
+ type: Input
70
+ }], allowMovement: [{
71
+ type: Input
72
+ }], hasPopup: [{
73
+ type: Input
74
+ }], fullWidth: [{
75
+ type: Input
76
+ }], taskClicked: [{
77
+ type: Output
78
+ }], taskDateChanged: [{
79
+ type: Output
80
+ }], viewChanged: [{
81
+ type: Output
82
+ }], ganttSvgRef: [{
83
+ type: ViewChild,
84
+ args: ['ganttSvg']
85
+ }], isFullWidth: [{
86
+ type: HostBinding,
87
+ args: ['class.sdc-gantt--full-width']
88
+ }] } });
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9nYW50dC9nYW50dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2dhbnR0L2dhbnR0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBTzNHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQzs7QUFXbkcsTUFBTSxPQUFPLGNBQWM7SUFDaEIsS0FBSyxHQUFxQixFQUFFLENBQUM7SUFDN0IsUUFBUSxHQUFrQix1QkFBdUIsQ0FBQztJQUNsRCxXQUFXLEdBQUcsOEJBQThCLENBQUM7SUFDN0MsYUFBYSxHQUFHLElBQUksQ0FBQztJQUNyQixhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUVqQixXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUM1QyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7SUFDaEUsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO0lBRW5DLFdBQVcsQ0FBMEI7SUFFNUQsSUFDYyxXQUFXO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRU8sTUFBTSxHQUF1QixJQUFJLENBQUM7SUFFMUMsZUFBZTtRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLEVBQ25CO1lBQ0UsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbEQsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQztTQUNwRixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7Z0JBQ3hCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO3dHQWpFVSxjQUFjOzRGQUFkLGNBQWMscWpCQ25DM0IsaVVBWUEsczlERGdCWSx1QkFBdUI7OzRGQU90QixjQUFjO2tCQVQxQixTQUFTO2lDQUNJLElBQUksV0FDUCxDQUFDLHVCQUF1QixDQUFDLFlBQ3hCLFdBQVcsbUJBR0osdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsUUFBUTs4QkFHaEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVnQixXQUFXO3NCQUFqQyxTQUFTO3VCQUFDLFVBQVU7Z0JBR1AsV0FBVztzQkFEeEIsV0FBVzt1QkFBQyw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEdBTlRUX0RFRkFVTFRfQ09MVU1OX1RJVExFX0tFWSwgR0FOVFRfREVGQVVMVF9WSUVXX01PREUgfSBmcm9tICcuLi8uLi9jb3JlL2NvbnN0YW50cy9nYW50dC5jb25zdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEdhbnR0VGFzayxcbiAgR2FudHRUYXNrRGF0ZUNoYW5nZWRFdmVudCxcbiAgR2FudHRUYXNrR3JvdXAsXG4gIEdhbnR0Vmlld01vZGUsXG59IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvZ2FudHQudHlwZSc7XG5pbXBvcnQgeyBHYW50dEVuZ2luZSB9IGZyb20gJy4vZ2FudHQuZW5naW5lJztcbmltcG9ydCB7IEdhbnR0U2lkZVRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2dhbnR0LXNpZGUtdGFibGUvZ2FudHQtc2lkZS10YWJsZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0dhbnR0U2lkZVRhYmxlQ29tcG9uZW50XSxcbiAgc2VsZWN0b3I6ICdzZGMtZ2FudHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FudHQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYW50dC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQsXG59KVxuZXhwb3J0IGNsYXNzIEdhbnR0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB0YXNrczogR2FudHRUYXNrR3JvdXBbXSA9IFtdO1xuICBASW5wdXQoKSB2aWV3TW9kZTogR2FudHRWaWV3TW9kZSA9IEdBTlRUX0RFRkFVTFRfVklFV19NT0RFO1xuICBASW5wdXQoKSBjb2x1bW5UaXRsZSA9IEdBTlRUX0RFRkFVTFRfQ09MVU1OX1RJVExFX0tFWTtcbiAgQElucHV0KCkgc2hvd1NpZGVUYWJsZSA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93TW92ZW1lbnQgPSB0cnVlO1xuICBASW5wdXQoKSBoYXNQb3B1cCA9IHRydWU7XG4gIEBJbnB1dCgpIGZ1bGxXaWR0aCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB0YXNrQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8R2FudHRUYXNrPigpO1xuICBAT3V0cHV0KCkgdGFza0RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxHYW50dFRhc2tEYXRlQ2hhbmdlZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgdmlld0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEdhbnR0Vmlld01vZGU+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZ2FudHRTdmcnKSBnYW50dFN2Z1JlZiE6IEVsZW1lbnRSZWY8U1ZHRWxlbWVudD47XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZGMtZ2FudHQtLWZ1bGwtd2lkdGgnKVxuICBwcm90ZWN0ZWQgZ2V0IGlzRnVsbFdpZHRoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZ1bGxXaWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgZW5naW5lOiBHYW50dEVuZ2luZSB8IG51bGwgPSBudWxsO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZ2luZSA9IG5ldyBHYW50dEVuZ2luZShcbiAgICAgIHRoaXMuZ2FudHRTdmdSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgIHRoaXMuZmxhdHRlblRhc2tzKCksXG4gICAgICB7XG4gICAgICAgIHZpZXdNb2RlOiB0aGlzLnZpZXdNb2RlLFxuICAgICAgICBhbGxvd01vdmVtZW50OiB0aGlzLmFsbG93TW92ZW1lbnQsXG4gICAgICAgIGhhc1BvcHVwOiB0aGlzLmhhc1BvcHVwLFxuICAgICAgICBvblRhc2tDbGljazogKHRhc2spID0+IHRoaXMudGFza0NsaWNrZWQuZW1pdCh0YXNrKSxcbiAgICAgICAgb25EYXRlQ2hhbmdlOiAodGFzaywgc3RhcnQsIGVuZCkgPT4gdGhpcy50YXNrRGF0ZUNoYW5nZWQuZW1pdCh7IHRhc2ssIHN0YXJ0LCBlbmQgfSksXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuZ2luZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWyd2aWV3TW9kZSddIHx8IGNoYW5nZXNbJ2FsbG93TW92ZW1lbnQnXSB8fCBjaGFuZ2VzWydoYXNQb3B1cCddKSB7XG4gICAgICB0aGlzLmVuZ2luZS51cGRhdGVPcHRpb25zKHtcbiAgICAgICAgYWxsb3dNb3ZlbWVudDogdGhpcy5hbGxvd01vdmVtZW50LFxuICAgICAgICBoYXNQb3B1cDogdGhpcy5oYXNQb3B1cCxcbiAgICAgICAgdmlld01vZGU6IHRoaXMudmlld01vZGVcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY2hhbmdlc1sndmlld01vZGUnXSkge1xuICAgICAgICB0aGlzLnZpZXdDaGFuZ2VkLmVtaXQodGhpcy52aWV3TW9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3Rhc2tzJ10pIHtcbiAgICAgIHRoaXMuZW5naW5lLnJlZnJlc2godGhpcy5mbGF0dGVuVGFza3MoKSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5lbmdpbmU/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmVuZ2luZSA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZsYXR0ZW5UYXNrcygpOiBHYW50dFRhc2tbXSB7XG4gICAgcmV0dXJuIHRoaXMudGFza3MuZmxhdE1hcCgoZ3JvdXApID0+IGdyb3VwLnRhc2tzKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNkYy1nYW50dFwiPlxuICBAaWYgKHNob3dTaWRlVGFibGUpIHtcbiAgICA8c2RjLWdhbnR0LXNpZGUtdGFibGVcbiAgICAgIFt0YXNrc109XCJ0YXNrc1wiXG4gICAgICBbY29sdW1uVGl0bGVdPVwiY29sdW1uVGl0bGVcIj5cbiAgICA8L3NkYy1nYW50dC1zaWRlLXRhYmxlPlxuICB9XG5cbiAgPGRpdiBjbGFzcz1cInNkYy1nYW50dF9fc3ZnLWNvbnRhaW5lclwiPlxuICAgIDxzdmcgI2dhbnR0U3ZnIGNsYXNzPVwic2RjLWdhbnR0X19zdmdcIiBhcmlhLWxhYmVsPVwiR2FudHQgY2hhcnRcIj48L3N2Zz5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==