@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.
- package/core/constants/autocomplete.const.d.ts +4 -0
- package/core/constants/context-selector.const.d.ts +1 -0
- package/core/constants/gantt.const.d.ts +7 -0
- package/core/constants/hyperlink.const.d.ts +1 -0
- package/core/constants/inline-edit.const.d.ts +4 -0
- package/core/constants/kanban.const.d.ts +2 -0
- package/core/constants/pin-code-field.const.d.ts +5 -0
- package/core/constants/rating-scale.const.d.ts +1 -0
- package/core/constants/spotlight.const.d.ts +8 -0
- package/core/constants/star-rating.const.d.ts +4 -0
- package/core/constants/stepper.const.d.ts +1 -0
- package/core/constants/tiered-menu.const.d.ts +3 -0
- package/core/types/autocomplete.type.d.ts +9 -0
- package/core/types/chat.type.d.ts +12 -0
- package/core/types/checkbox-list.type.d.ts +12 -0
- package/core/types/gantt.type.d.ts +22 -0
- package/core/types/grid-menu.type.d.ts +13 -0
- package/core/types/hyperlink.type.d.ts +1 -0
- package/core/types/image-cropper.type.d.ts +20 -0
- package/core/types/inline-edit.type.d.ts +26 -0
- package/core/types/kanban.type.d.ts +36 -0
- package/core/types/panel.type.d.ts +16 -0
- package/core/types/profile-picture-picker.type.d.ts +9 -0
- package/core/types/rating-scale.type.d.ts +5 -0
- package/core/types/select-button.type.d.ts +1 -0
- package/core/types/spotlight.type.d.ts +34 -0
- package/core/types/star-rating.type.d.ts +1 -0
- package/core/types/stepper.type.d.ts +20 -0
- package/core/types/table-column.type.d.ts +3 -1
- package/core/types/table-options.type.d.ts +8 -2
- package/core/types/table.type.d.ts +1 -1
- package/core/types/tiered-menu.type.d.ts +16 -0
- package/core/types/tree.type.d.ts +25 -0
- package/core/types/workspace-switch.type.d.ts +6 -0
- package/core/utils/body-scroll.util.d.ts +2 -0
- package/core/utils/roving-focus.util.d.ts +2 -0
- package/core/utils/selection.util.d.ts +3 -0
- package/core/utils/tree.util.d.ts +4 -0
- package/esm2022/core/constants/autocomplete.const.mjs +5 -0
- package/esm2022/core/constants/context-selector.const.mjs +2 -0
- package/esm2022/core/constants/gantt.const.mjs +7 -0
- package/esm2022/core/constants/hyperlink.const.mjs +2 -1
- package/esm2022/core/constants/inline-edit.const.mjs +5 -0
- package/esm2022/core/constants/kanban.const.mjs +3 -0
- package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
- package/esm2022/core/constants/rating-scale.const.mjs +2 -0
- package/esm2022/core/constants/spotlight.const.mjs +9 -0
- package/esm2022/core/constants/star-rating.const.mjs +5 -0
- package/esm2022/core/constants/stepper.const.mjs +2 -0
- package/esm2022/core/constants/table.const.mjs +2 -2
- package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
- package/esm2022/core/types/autocomplete.type.mjs +2 -0
- package/esm2022/core/types/chat.type.mjs +2 -0
- package/esm2022/core/types/checkbox-list.type.mjs +2 -0
- package/esm2022/core/types/gantt.type.mjs +2 -0
- package/esm2022/core/types/grid-menu.type.mjs +2 -0
- package/esm2022/core/types/hyperlink.type.mjs +1 -1
- package/esm2022/core/types/image-cropper.type.mjs +2 -0
- package/esm2022/core/types/inline-edit.type.mjs +2 -0
- package/esm2022/core/types/kanban.type.mjs +2 -0
- package/esm2022/core/types/panel.type.mjs +9 -0
- package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
- package/esm2022/core/types/rating-scale.type.mjs +2 -0
- package/esm2022/core/types/select-button.type.mjs +1 -1
- package/esm2022/core/types/spotlight.type.mjs +2 -0
- package/esm2022/core/types/star-rating.type.mjs +2 -0
- package/esm2022/core/types/stepper.type.mjs +7 -0
- package/esm2022/core/types/table-column.type.mjs +1 -1
- package/esm2022/core/types/table-options.type.mjs +1 -1
- package/esm2022/core/types/table.type.mjs +1 -1
- package/esm2022/core/types/tiered-menu.type.mjs +2 -0
- package/esm2022/core/types/tree.type.mjs +2 -0
- package/esm2022/core/types/workspace-switch.type.mjs +2 -0
- package/esm2022/core/utils/body-scroll.util.mjs +19 -0
- package/esm2022/core/utils/combobox.util.mjs +3 -2
- package/esm2022/core/utils/roving-focus.util.mjs +20 -0
- package/esm2022/core/utils/selection.util.mjs +13 -0
- package/esm2022/core/utils/string.util.mjs +8 -3
- package/esm2022/core/utils/tree.util.mjs +23 -0
- package/esm2022/features/accordion/accordion.component.mjs +2 -2
- package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
- package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
- package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
- package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
- package/esm2022/features/card-list/card/card.component.mjs +63 -99
- package/esm2022/features/chat/chat.component.mjs +126 -0
- package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
- package/esm2022/features/combobox/combobox.component.mjs +20 -8
- package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
- package/esm2022/features/filters/filters.component.mjs +1 -1
- package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
- package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
- package/esm2022/features/gantt/gantt.component.mjs +89 -0
- package/esm2022/features/gantt/gantt.engine.mjs +662 -0
- package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
- package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
- package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
- package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
- package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
- package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
- package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
- package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
- package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
- package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
- package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
- package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
- package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
- package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
- package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
- package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
- package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
- package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
- package/esm2022/features/kanban/kanban.component.mjs +198 -0
- package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
- package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
- package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
- package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
- package/esm2022/features/paginator/paginator.component.mjs +8 -3
- package/esm2022/features/panel/panel.component.mjs +43 -11
- package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
- package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
- package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
- package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
- package/esm2022/features/select-button/select-button.component.mjs +7 -4
- package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
- package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
- package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
- package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
- package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
- package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
- package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
- package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
- package/esm2022/features/stepper/stepper.component.mjs +86 -0
- package/esm2022/features/switch/switch.component.mjs +12 -8
- package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
- package/esm2022/features/tab/tab.component.mjs +4 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
- package/esm2022/features/table/table.component.mjs +220 -29
- package/esm2022/features/table/utils/table-data.util.mjs +71 -8
- package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
- package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
- package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
- package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
- package/esm2022/features/tree/tree.component.mjs +211 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
- package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
- package/esm2022/locales/en.json +351 -3
- package/esm2022/locales/es-CO.json +351 -3
- package/esm2022/locales/pt.json +351 -3
- package/esm2022/providers/features.provider.mjs +40 -4
- package/esm2022/public-api.mjs +56 -3
- package/features/accordion/accordion.component.d.ts +1 -1
- package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
- package/features/autocomplete/autocomplete.component.d.ts +102 -0
- package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
- package/features/card-list/card/card.component.d.ts +14 -34
- package/features/chat/chat.component.d.ts +31 -0
- package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
- package/features/combobox/combobox.component.d.ts +2 -1
- package/features/context-selector/context-selector.component.d.ts +37 -0
- package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
- package/features/gantt/gantt-date.utils.d.ts +36 -0
- package/features/gantt/gantt.component.d.ts +24 -0
- package/features/gantt/gantt.engine.d.ts +52 -0
- package/features/grid-menu/grid-menu.component.d.ts +29 -0
- package/features/hyperlink/hyperlink.component.d.ts +2 -1
- package/features/image-cropper/image-cropper.component.d.ts +43 -0
- package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
- package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
- package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
- package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
- package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
- package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
- package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
- package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
- package/features/inline-edit/inline-edit.component.d.ts +13 -0
- package/features/interactive-content/interactive-content.directive.d.ts +31 -0
- package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
- package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
- package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
- package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
- package/features/kanban/kanban.component.d.ts +32 -0
- package/features/kanban/services/kanban-event.service.d.ts +15 -0
- package/features/loading-state/loading-state.component.d.ts +0 -2
- package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
- package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
- package/features/panel/panel.component.d.ts +12 -3
- package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
- package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
- package/features/rating-scale/rating-scale.component.d.ts +24 -0
- package/features/select-button/select-button.component.d.ts +2 -1
- package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
- package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
- package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
- package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
- package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
- package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
- package/features/spotlight/spotlight.component.d.ts +59 -0
- package/features/star-rating/star-rating.component.d.ts +26 -0
- package/features/stepper/stepper.component.d.ts +23 -0
- package/features/switch/switch.component.d.ts +2 -1
- package/features/tab/tab.component.d.ts +1 -1
- package/features/table/components/table-cell-content.component.d.ts +4 -3
- package/features/table/table.component.d.ts +40 -5
- package/features/table/utils/table-data.util.d.ts +1 -0
- package/features/table/utils/table-layout.util.d.ts +1 -0
- package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
- package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
- package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
- package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
- package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
- package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
- package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
- package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
- package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
- package/features/tree/tree.component.d.ts +37 -0
- package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
- package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
- package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
- package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
- package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
- package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
- package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
- package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +8 -8
- package/public-api.d.ts +72 -2
- package/src/locales/en.json +353 -15
- package/src/locales/es-CO.json +352 -14
- package/src/locales/pt.json +352 -14
- package/styles/sdc-global-variables.scss +1 -1
- package/styles.css +1 -1
- /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, HostListener, ViewEncapsulation, inject } from '@angular/core';
|
|
3
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
4
|
+
import { disableBodyScroll } from '../../../../core/utils/body-scroll.util';
|
|
5
|
+
import { TieredMenuEventService } from '../../services/tiered-menu.event.service';
|
|
6
|
+
import { TieredMenuService } from '../../services/tiered-menu.service';
|
|
7
|
+
import { TieredMenuDividerComponent } from '../tiered-menu-divider/tiered-menu-divider.component';
|
|
8
|
+
import { TieredMenuItemComponent } from '../tiered-menu-item/tiered-menu-item.component';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/common";
|
|
11
|
+
export class TieredMenuNestedComponent {
|
|
12
|
+
tieredMenuService = inject(TieredMenuService);
|
|
13
|
+
eventService = inject(TieredMenuEventService);
|
|
14
|
+
ariaLabel;
|
|
15
|
+
items = [];
|
|
16
|
+
top = 0;
|
|
17
|
+
left = 0;
|
|
18
|
+
lastOpenItem;
|
|
19
|
+
unsubscribe$ = new Subject();
|
|
20
|
+
onResize() {
|
|
21
|
+
this.eventService.closeAllMenusEvent.emit();
|
|
22
|
+
}
|
|
23
|
+
onDocumentClick(event) {
|
|
24
|
+
const target = event.target;
|
|
25
|
+
const clickedInside = target.closest('sdc-tiered-menu-item') || target.closest('sdc-tiered-menu-divider');
|
|
26
|
+
if (!clickedInside) {
|
|
27
|
+
this.eventService.closeAllMenusEvent.emit();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
onKeydownHandler(event) {
|
|
31
|
+
switch (event.key) {
|
|
32
|
+
case 'Escape':
|
|
33
|
+
this.eventService.closeAllMenusEvent.emit();
|
|
34
|
+
break;
|
|
35
|
+
case ' ':
|
|
36
|
+
case 'Enter':
|
|
37
|
+
this.eventService.selectItemEvent.emit(this.tieredMenuService.currentItem);
|
|
38
|
+
break;
|
|
39
|
+
case 'ArrowLeft':
|
|
40
|
+
this.eventService.closeItemMenuEvent.emit(this.tieredMenuService.currentItem?.parent ?? null);
|
|
41
|
+
break;
|
|
42
|
+
case 'ArrowRight':
|
|
43
|
+
this.eventService.openItemMenuEvent.emit(this.tieredMenuService.currentItem);
|
|
44
|
+
break;
|
|
45
|
+
case 'ArrowUp':
|
|
46
|
+
this.eventService.decrementCurrentItemEvent.emit();
|
|
47
|
+
break;
|
|
48
|
+
case 'ArrowDown':
|
|
49
|
+
this.eventService.incrementCurrentItemEvent.emit();
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
// do nothing for other keys
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
ngOnInit() {
|
|
57
|
+
this.tieredMenuService.currentItems = this.items;
|
|
58
|
+
this.subscribeEvents();
|
|
59
|
+
disableBodyScroll();
|
|
60
|
+
}
|
|
61
|
+
ngOnDestroy() {
|
|
62
|
+
this.unsubscribe$.next();
|
|
63
|
+
this.unsubscribe$.complete();
|
|
64
|
+
// Note: enableBodyScroll() should be called by the parent component that manages
|
|
65
|
+
// the overall menu lifecycle, not here. Calling it unconditionally in ngOnDestroy
|
|
66
|
+
// breaks when multiple menus are open (desktop + nested) as the first destruction
|
|
67
|
+
// would prematurely re-enable scroll for the remaining open menus.
|
|
68
|
+
}
|
|
69
|
+
incrementCurrentItem() {
|
|
70
|
+
if (!this.tieredMenuService.currentItem) {
|
|
71
|
+
this.tieredMenuService.currentItem = this.tieredMenuService.currentItems[0] ?? null;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
let nextItem = this.tieredMenuService.currentItem;
|
|
75
|
+
let iterations = 0;
|
|
76
|
+
const maxIterations = this.tieredMenuService.currentItems.length;
|
|
77
|
+
do {
|
|
78
|
+
const currentIndex = this.tieredMenuService.currentItems.indexOf(nextItem) + 1;
|
|
79
|
+
nextItem =
|
|
80
|
+
currentIndex < this.tieredMenuService.currentItems.length
|
|
81
|
+
? this.tieredMenuService.currentItems[currentIndex]
|
|
82
|
+
: this.tieredMenuService.currentItems[0];
|
|
83
|
+
iterations++;
|
|
84
|
+
} while (nextItem?.divider && iterations < maxIterations);
|
|
85
|
+
// Only update if we found a non-divider item
|
|
86
|
+
if (!nextItem?.divider) {
|
|
87
|
+
this.tieredMenuService.currentItem = nextItem;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
decrementCurrentItem() {
|
|
91
|
+
if (!this.tieredMenuService.currentItem) {
|
|
92
|
+
this.tieredMenuService.currentItem = this.tieredMenuService.currentItems[0] ?? null;
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
let previousItem = this.tieredMenuService.currentItem;
|
|
96
|
+
let iterations = 0;
|
|
97
|
+
const maxIterations = this.tieredMenuService.currentItems.length;
|
|
98
|
+
do {
|
|
99
|
+
const currentIndex = this.tieredMenuService.currentItems.indexOf(previousItem) - 1;
|
|
100
|
+
previousItem =
|
|
101
|
+
currentIndex >= 0
|
|
102
|
+
? this.tieredMenuService.currentItems[currentIndex]
|
|
103
|
+
: this.tieredMenuService.currentItems[this.tieredMenuService.currentItems.length - 1];
|
|
104
|
+
iterations++;
|
|
105
|
+
} while (previousItem?.divider && iterations < maxIterations);
|
|
106
|
+
// Only update if we found a non-divider item
|
|
107
|
+
if (!previousItem?.divider) {
|
|
108
|
+
this.tieredMenuService.currentItem = previousItem;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
closeItem(item) {
|
|
112
|
+
let current = this.lastOpenItem;
|
|
113
|
+
while (current && current !== item) {
|
|
114
|
+
current.isOpen = false;
|
|
115
|
+
current = current.parent;
|
|
116
|
+
}
|
|
117
|
+
item.isOpen = false;
|
|
118
|
+
this.tieredMenuService.currentItem = current ?? this.tieredMenuService.items[0] ?? null;
|
|
119
|
+
this.tieredMenuService.currentItems = current?.parent?.submenu ?? this.tieredMenuService.items;
|
|
120
|
+
}
|
|
121
|
+
openItem(item) {
|
|
122
|
+
if (!item.submenu) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
item.isOpen = true;
|
|
126
|
+
this.tieredMenuService.currentItems = item.submenu;
|
|
127
|
+
if (this.tieredMenuService.currentItem) {
|
|
128
|
+
this.tieredMenuService.currentItem = item.submenu[0] ?? null;
|
|
129
|
+
}
|
|
130
|
+
this.lastOpenItem = item;
|
|
131
|
+
}
|
|
132
|
+
subscribeEvents() {
|
|
133
|
+
this.eventService.incrementCurrentItemEvent.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
|
|
134
|
+
this.incrementCurrentItem();
|
|
135
|
+
});
|
|
136
|
+
this.eventService.decrementCurrentItemEvent.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
|
|
137
|
+
this.decrementCurrentItem();
|
|
138
|
+
});
|
|
139
|
+
this.eventService.selectItemEvent.pipe(takeUntil(this.unsubscribe$)).subscribe((item) => {
|
|
140
|
+
if (item?.command) {
|
|
141
|
+
item.command();
|
|
142
|
+
this.eventService.closeAllMenusEvent.emit();
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
this.eventService.openItemMenuEvent.pipe(takeUntil(this.unsubscribe$)).subscribe((item) => {
|
|
146
|
+
if (!item) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!this.tieredMenuService.currentItems.includes(item)) {
|
|
150
|
+
let current = this.lastOpenItem;
|
|
151
|
+
while (current?.parent?.parent) {
|
|
152
|
+
current = current.parent;
|
|
153
|
+
}
|
|
154
|
+
this.eventService.closeItemMenuEvent.emit(current?.parent ?? current ?? null);
|
|
155
|
+
}
|
|
156
|
+
this.lastOpenItem = item;
|
|
157
|
+
this.openItem(item);
|
|
158
|
+
});
|
|
159
|
+
this.eventService.closeItemMenuEvent.pipe(takeUntil(this.unsubscribe$)).subscribe((item) => {
|
|
160
|
+
if (item) {
|
|
161
|
+
this.closeItem(item);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuNestedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
166
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TieredMenuNestedComponent, isStandalone: true, selector: "sdc-tiered-menu-nested", host: { listeners: { "window:resize": "onResize()", "document:click": "onDocumentClick($event)", "document:keydown": "onKeydownHandler($event)" } }, ngImport: i0, template: "<div\n class=\"sdc-tiered-menu sdc-tiered-menu--nested\"\n [attr.aria-label]=\"ariaLabel\"\n [style.top.px]=\"top\"\n [style.left.px]=\"left\"\n>\n <ng-container\n [ngTemplateOutlet]=\"itemsTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: items }\"\n ></ng-container>\n</div>\n\n<ng-template\n #itemsTemplate\n let-items\n>\n @for (item of items; track item.id) {\n <div>\n @if (item.visible && !item.divider) {\n <sdc-tiered-menu-item\n [item]=\"item\"\n [focused]=\"item === tieredMenuService.currentItem\"\n [closeOnClick]=\"true\"\n ></sdc-tiered-menu-item>\n }\n @if (item.divider) {\n <sdc-tiered-menu-divider></sdc-tiered-menu-divider>\n }\n @if (item.submenu && item.isOpen) {\n <div class=\"sdc-tiered-menu--nested__submenu\">\n <ng-container\n [ngTemplateOutlet]=\"itemsTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.submenu }\"\n ></ng-container>\n </div>\n }\n </div>\n }\n</ng-template>\n", styles: [".sdc-tiered-menu{position:absolute;z-index:9999;display:inline-flex;flex-direction:column;width:calc(100vw - 8px);min-width:11rem;padding:.25rem 0;overflow:auto;border:1px solid #ccc;border-radius:.375rem;background:#fff;box-shadow:0 2px 12px #0000001a}.sdc-tiered-menu--nested__submenu{margin-left:1.5rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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 });
|
|
167
|
+
}
|
|
168
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuNestedComponent, decorators: [{
|
|
169
|
+
type: Component,
|
|
170
|
+
args: [{ selector: 'sdc-tiered-menu-nested', standalone: true, imports: [CommonModule, TieredMenuItemComponent, TieredMenuDividerComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div\n class=\"sdc-tiered-menu sdc-tiered-menu--nested\"\n [attr.aria-label]=\"ariaLabel\"\n [style.top.px]=\"top\"\n [style.left.px]=\"left\"\n>\n <ng-container\n [ngTemplateOutlet]=\"itemsTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: items }\"\n ></ng-container>\n</div>\n\n<ng-template\n #itemsTemplate\n let-items\n>\n @for (item of items; track item.id) {\n <div>\n @if (item.visible && !item.divider) {\n <sdc-tiered-menu-item\n [item]=\"item\"\n [focused]=\"item === tieredMenuService.currentItem\"\n [closeOnClick]=\"true\"\n ></sdc-tiered-menu-item>\n }\n @if (item.divider) {\n <sdc-tiered-menu-divider></sdc-tiered-menu-divider>\n }\n @if (item.submenu && item.isOpen) {\n <div class=\"sdc-tiered-menu--nested__submenu\">\n <ng-container\n [ngTemplateOutlet]=\"itemsTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.submenu }\"\n ></ng-container>\n </div>\n }\n </div>\n }\n</ng-template>\n", styles: [".sdc-tiered-menu{position:absolute;z-index:9999;display:inline-flex;flex-direction:column;width:calc(100vw - 8px);min-width:11rem;padding:.25rem 0;overflow:auto;border:1px solid #ccc;border-radius:.375rem;background:#fff;box-shadow:0 2px 12px #0000001a}.sdc-tiered-menu--nested__submenu{margin-left:1.5rem}\n"] }]
|
|
171
|
+
}], propDecorators: { onResize: [{
|
|
172
|
+
type: HostListener,
|
|
173
|
+
args: ['window:resize']
|
|
174
|
+
}], onDocumentClick: [{
|
|
175
|
+
type: HostListener,
|
|
176
|
+
args: ['document:click', ['$event']]
|
|
177
|
+
}], onKeydownHandler: [{
|
|
178
|
+
type: HostListener,
|
|
179
|
+
args: ['document:keydown', ['$event']]
|
|
180
|
+
}] } });
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUtbmVzdGVkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdGllcmVkLW1lbnUvY29tcG9uZW50cy90aWVyZWQtbWVudS1uZXN0ZWQvdGllcmVkLW1lbnUtbmVzdGVkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdGllcmVkLW1lbnUvY29tcG9uZW50cy90aWVyZWQtbWVudS1uZXN0ZWQvdGllcmVkLW1lbnUtbmVzdGVkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQW9CLE1BQU0seUNBQXlDLENBQUM7QUFFOUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDbEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7OztBQVd6RixNQUFNLE9BQU8seUJBQXlCO0lBQzNCLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3RDLFlBQVksR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUV4RCxTQUFTLENBQVU7SUFDbkIsS0FBSyxHQUFpQyxFQUFFLENBQUM7SUFD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QjtrQkFUckMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHVCQUF1QixFQUFFLDBCQUEwQixDQUFDLG1CQUczRCx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxRQUFROzhCQWUvQixRQUFRO3NCQURqQixZQUFZO3VCQUFDLGVBQWU7Z0JBTW5CLGVBQWU7c0JBRHhCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBV2hDLGdCQUFnQjtzQkFEekIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGRpc2FibGVCb2R5U2Nyb2xsLCBlbmFibGVCb2R5U2Nyb2xsIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9ib2R5LXNjcm9sbC51dGlsJztcbmltcG9ydCB0eXBlIHsgVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3R5cGVzL3RpZXJlZC1tZW51LnR5cGUnO1xuaW1wb3J0IHsgVGllcmVkTWVudUV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpZXJlZC1tZW51LmV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGllcmVkTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aWVyZWQtbWVudS5zZXJ2aWNlJztcbmltcG9ydCB7IFRpZXJlZE1lbnVEaXZpZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vdGllcmVkLW1lbnUtZGl2aWRlci90aWVyZWQtbWVudS1kaXZpZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaWVyZWRNZW51SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL3RpZXJlZC1tZW51LWl0ZW0vdGllcmVkLW1lbnUtaXRlbS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtdGllcmVkLW1lbnUtbmVzdGVkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVGllcmVkTWVudUl0ZW1Db21wb25lbnQsIFRpZXJlZE1lbnVEaXZpZGVyQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpZXJlZC1tZW51LW5lc3RlZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RpZXJlZC1tZW51LW5lc3RlZC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWRcbn0pXG5leHBvcnQgY2xhc3MgVGllcmVkTWVudU5lc3RlZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgdGllcmVkTWVudVNlcnZpY2UgPSBpbmplY3QoVGllcmVkTWVudVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50U2VydmljZSA9IGluamVjdChUaWVyZWRNZW51RXZlbnRTZXJ2aWNlKTtcblxuICBwdWJsaWMgYXJpYUxhYmVsPzogc3RyaW5nO1xuICBwdWJsaWMgaXRlbXM6IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhW10gPSBbXTtcbiAgcHVibGljIHRvcCA9IDA7XG4gIHB1YmxpYyBsZWZ0ID0gMDtcblxuICBwcml2YXRlIGxhc3RPcGVuSXRlbT86IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhO1xuICBwcml2YXRlIHJlYWRvbmx5IHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIHByb3RlY3RlZCBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50U2VydmljZS5jbG9zZUFsbE1lbnVzRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBwcm90ZWN0ZWQgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQ7XG4gICAgY29uc3QgY2xpY2tlZEluc2lkZSA9IHRhcmdldC5jbG9zZXN0KCdzZGMtdGllcmVkLW1lbnUtaXRlbScpIHx8IHRhcmdldC5jbG9zZXN0KCdzZGMtdGllcmVkLW1lbnUtZGl2aWRlcicpO1xuXG4gICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5jbG9zZUFsbE1lbnVzRXZlbnQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxuICBwcm90ZWN0ZWQgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5jbG9zZUFsbE1lbnVzRXZlbnQuZW1pdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5zZWxlY3RJdGVtRXZlbnQuZW1pdCh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5jbG9zZUl0ZW1NZW51RXZlbnQuZW1pdCh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtPy5wYXJlbnQgPz8gbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLm9wZW5JdGVtTWVudUV2ZW50LmVtaXQodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRlY3JlbWVudEN1cnJlbnRJdGVtRXZlbnQuZW1pdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmluY3JlbWVudEN1cnJlbnRJdGVtRXZlbnQuZW1pdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGRvIG5vdGhpbmcgZm9yIG90aGVyIGtleXNcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIHRoaXMuc3Vic2NyaWJlRXZlbnRzKCk7XG4gICAgZGlzYWJsZUJvZHlTY3JvbGwoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICAgIC8vIE5vdGU6IGVuYWJsZUJvZHlTY3JvbGwoKSBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBwYXJlbnQgY29tcG9uZW50IHRoYXQgbWFuYWdlc1xuICAgIC8vIHRoZSBvdmVyYWxsIG1lbnUgbGlmZWN5Y2xlLCBub3QgaGVyZS4gQ2FsbGluZyBpdCB1bmNvbmRpdGlvbmFsbHkgaW4gbmdPbkRlc3Ryb3lcbiAgICAvLyBicmVha3Mgd2hlbiBtdWx0aXBsZSBtZW51cyBhcmUgb3BlbiAoZGVza3RvcCArIG5lc3RlZCkgYXMgdGhlIGZpcnN0IGRlc3RydWN0aW9uXG4gICAgLy8gd291bGQgcHJlbWF0dXJlbHkgcmUtZW5hYmxlIHNjcm9sbCBmb3IgdGhlIHJlbWFpbmluZyBvcGVuIG1lbnVzLlxuICB9XG5cbiAgcHJpdmF0ZSBpbmNyZW1lbnRDdXJyZW50SXRlbSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pIHtcbiAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtc1swXSA/PyBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXh0SXRlbSA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW07XG4gICAgbGV0IGl0ZXJhdGlvbnMgPSAwO1xuICAgIGNvbnN0IG1heEl0ZXJhdGlvbnMgPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcy5sZW5ndGg7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcy5pbmRleE9mKG5leHRJdGVtKSArIDE7XG4gICAgICBuZXh0SXRlbSA9XG4gICAgICAgIGN1cnJlbnRJbmRleCA8IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zLmxlbmd0aFxuICAgICAgICAgID8gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbY3VycmVudEluZGV4XVxuICAgICAgICAgIDogdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbMF07XG4gICAgICBpdGVyYXRpb25zKys7XG4gICAgfSB3aGlsZSAobmV4dEl0ZW0/LmRpdmlkZXIgJiYgaXRlcmF0aW9ucyA8IG1heEl0ZXJhdGlvbnMpO1xuXG4gICAgLy8gT25seSB1cGRhdGUgaWYgd2UgZm91bmQgYSBub24tZGl2aWRlciBpdGVtXG4gICAgaWYgKCFuZXh0SXRlbT8uZGl2aWRlcikge1xuICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IG5leHRJdGVtO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVjcmVtZW50Q3VycmVudEl0ZW0oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKSB7XG4gICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbMF0gPz8gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcHJldmlvdXNJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbTtcbiAgICBsZXQgaXRlcmF0aW9ucyA9IDA7XG4gICAgY29uc3QgbWF4SXRlcmF0aW9ucyA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zLmxlbmd0aDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zLmluZGV4T2YocHJldmlvdXNJdGVtKSAtIDE7XG4gICAgICBwcmV2aW91c0l0ZW0gPVxuICAgICAgICBjdXJyZW50SW5kZXggPj0gMFxuICAgICAgICAgID8gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbY3VycmVudEluZGV4XVxuICAgICAgICAgIDogdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICBpdGVyYXRpb25zKys7XG4gICAgfSB3aGlsZSAocHJldmlvdXNJdGVtPy5kaXZpZGVyICYmIGl0ZXJhdGlvbnMgPCBtYXhJdGVyYXRpb25zKTtcblxuICAgIC8vIE9ubHkgdXBkYXRlIGlmIHdlIGZvdW5kIGEgbm9uLWRpdmlkZXIgaXRlbVxuICAgIGlmICghcHJldmlvdXNJdGVtPy5kaXZpZGVyKSB7XG4gICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gcHJldmlvdXNJdGVtO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VJdGVtKGl0ZW06IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhKTogdm9pZCB7XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLmxhc3RPcGVuSXRlbTtcblxuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IGl0ZW0pIHtcbiAgICAgIGN1cnJlbnQuaXNPcGVuID0gZmFsc2U7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaXRlbS5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gY3VycmVudCA/PyB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zWzBdID8/IG51bGw7XG4gICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMgPSBjdXJyZW50Py5wYXJlbnQ/LnN1Ym1lbnUgPz8gdGhpcy50aWVyZWRNZW51U2VydmljZS5pdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgb3Blbkl0ZW0oaXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEpOiB2b2lkIHtcbiAgICBpZiAoIWl0ZW0uc3VibWVudSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGl0ZW0uaXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcyA9IGl0ZW0uc3VibWVudTtcblxuICAgIGlmICh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKSB7XG4gICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gaXRlbS5zdWJtZW51WzBdID8/IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0T3Blbkl0ZW0gPSBpdGVtO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudFNlcnZpY2UuaW5jcmVtZW50Q3VycmVudEl0ZW1FdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmluY3JlbWVudEN1cnJlbnRJdGVtKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kZWNyZW1lbnRDdXJyZW50SXRlbUV2ZW50LnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGVjcmVtZW50Q3VycmVudEl0ZW0oKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLnNlbGVjdEl0ZW1FdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0/LmNvbW1hbmQpIHtcbiAgICAgICAgaXRlbS5jb21tYW5kKCk7XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNsb3NlQWxsTWVudXNFdmVudC5lbWl0KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5vcGVuSXRlbU1lbnVFdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcy5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMubGFzdE9wZW5JdGVtO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Py5wYXJlbnQ/LnBhcmVudCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNsb3NlSXRlbU1lbnVFdmVudC5lbWl0KGN1cnJlbnQ/LnBhcmVudCA/PyBjdXJyZW50ID8/IG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxhc3RPcGVuSXRlbSA9IGl0ZW07XG4gICAgICB0aGlzLm9wZW5JdGVtKGl0ZW0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuY2xvc2VJdGVtTWVudUV2ZW50LnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICB0aGlzLmNsb3NlSXRlbShpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInNkYy10aWVyZWQtbWVudSBzZGMtdGllcmVkLW1lbnUtLW5lc3RlZFwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgW3N0eWxlLnRvcC5weF09XCJ0b3BcIlxuICBbc3R5bGUubGVmdC5weF09XCJsZWZ0XCJcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1zVGVtcGxhdGVcIlxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbXMgfVwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgI2l0ZW1zVGVtcGxhdGVcbiAgbGV0LWl0ZW1zXG4+XG4gIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrIGl0ZW0uaWQpIHtcbiAgPGRpdj5cbiAgICBAaWYgKGl0ZW0udmlzaWJsZSAmJiAhaXRlbS5kaXZpZGVyKSB7XG4gICAgPHNkYy10aWVyZWQtbWVudS1pdGVtXG4gICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgIFtmb2N1c2VkXT1cIml0ZW0gPT09IHRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtXCJcbiAgICAgIFtjbG9zZU9uQ2xpY2tdPVwidHJ1ZVwiXG4gICAgPjwvc2RjLXRpZXJlZC1tZW51LWl0ZW0+XG4gICAgfVxuICAgIEBpZiAoaXRlbS5kaXZpZGVyKSB7XG4gICAgPHNkYy10aWVyZWQtbWVudS1kaXZpZGVyPjwvc2RjLXRpZXJlZC1tZW51LWRpdmlkZXI+XG4gICAgfVxuICAgIEBpZiAoaXRlbS5zdWJtZW51ICYmIGl0ZW0uaXNPcGVuKSB7XG4gICAgPGRpdiBjbGFzcz1cInNkYy10aWVyZWQtbWVudS0tbmVzdGVkX19zdWJtZW51XCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1zVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0uc3VibWVudSB9XCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { ApplicationRef, ChangeDetectorRef, Directive, ElementRef, EventEmitter, HostListener, Injector, Input, Output, createComponent, inject } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import { TIERED_MENU_DEFAULT_TRIGGER_EVENT, TIERED_MENU_MOBILE_BREAKPOINT_PX } from '../../../core/constants/tiered-menu.const';
|
|
4
|
+
import { enableBodyScroll } from '../../../core/utils/body-scroll.util';
|
|
5
|
+
import { TieredMenuNestedComponent } from '../components/tiered-menu-nested/tiered-menu-nested.component';
|
|
6
|
+
import { TieredMenuComponent } from '../components/tiered-menu/tiered-menu.component';
|
|
7
|
+
import { TieredMenuEventService } from '../services/tiered-menu.event.service';
|
|
8
|
+
import { TieredMenuGlobalService } from '../services/tiered-menu.global.service';
|
|
9
|
+
import { TieredMenuService } from '../services/tiered-menu.service';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
const TIERED_MENU_DEFAULT_WIDTH = 176;
|
|
12
|
+
const TIERED_MENU_ITEM_HEIGHT_DIRECTIVE = 37;
|
|
13
|
+
const TIERED_MENU_DIVIDER_HEIGHT_DIRECTIVE = 5;
|
|
14
|
+
const TIERED_MENU_PADDING_DIRECTIVE = 8;
|
|
15
|
+
const TIERED_MENU_MARGIN = 4;
|
|
16
|
+
export class TieredMenuDirective {
|
|
17
|
+
elementRef = inject((ElementRef));
|
|
18
|
+
appRef = inject(ApplicationRef);
|
|
19
|
+
injector = inject(Injector);
|
|
20
|
+
eventService = inject(TieredMenuEventService);
|
|
21
|
+
tieredMenuService = inject(TieredMenuService);
|
|
22
|
+
globalService = inject(TieredMenuGlobalService);
|
|
23
|
+
cdr = inject(ChangeDetectorRef);
|
|
24
|
+
items = [];
|
|
25
|
+
focusedItem;
|
|
26
|
+
triggerEvent = TIERED_MENU_DEFAULT_TRIGGER_EVENT;
|
|
27
|
+
ariaLabel;
|
|
28
|
+
tieredMenuOpened = new EventEmitter();
|
|
29
|
+
tieredMenuClosed = new EventEmitter();
|
|
30
|
+
set dataCoreItems(value) {
|
|
31
|
+
this.setItems(value);
|
|
32
|
+
}
|
|
33
|
+
set legacyItems(value) {
|
|
34
|
+
this.setItems(value);
|
|
35
|
+
}
|
|
36
|
+
setItems(value) {
|
|
37
|
+
if (value) {
|
|
38
|
+
this.items = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
componentRef = null;
|
|
42
|
+
isNested = false;
|
|
43
|
+
isOpen = false;
|
|
44
|
+
unsubscribe$ = new Subject();
|
|
45
|
+
lastActiveElement;
|
|
46
|
+
itemsAreValid = false;
|
|
47
|
+
resizeObserver = new ResizeObserver(() => {
|
|
48
|
+
this.setMenuPosition();
|
|
49
|
+
this.componentRef?.hostView.detectChanges();
|
|
50
|
+
});
|
|
51
|
+
ngOnInit() {
|
|
52
|
+
this.itemsAreValid = !!this.items?.length;
|
|
53
|
+
if (!this.itemsAreValid) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.subscribeEvents();
|
|
57
|
+
}
|
|
58
|
+
ngOnChanges(changes) {
|
|
59
|
+
if (!this.itemsAreValid) {
|
|
60
|
+
this.itemsAreValid = !!this.items?.length;
|
|
61
|
+
if (this.itemsAreValid) {
|
|
62
|
+
this.subscribeEvents();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (!this.itemsAreValid) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (changes['items']) {
|
|
69
|
+
this.updateServiceItems();
|
|
70
|
+
this.cdr.detectChanges();
|
|
71
|
+
this.rebuildMenu();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
ngOnDestroy() {
|
|
75
|
+
this.unsubscribe$.next();
|
|
76
|
+
this.unsubscribe$.complete();
|
|
77
|
+
this.destroy();
|
|
78
|
+
}
|
|
79
|
+
onClick(event) {
|
|
80
|
+
if (!this.itemsAreValid || this.triggerEvent !== 'click' || this.isOpen) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this.lastActiveElement = document.activeElement;
|
|
84
|
+
this.createMenu();
|
|
85
|
+
event.preventDefault();
|
|
86
|
+
event.stopPropagation();
|
|
87
|
+
}
|
|
88
|
+
onMouseEnter() {
|
|
89
|
+
if (!this.itemsAreValid || this.triggerEvent !== 'hover' || this.isOpen) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this.lastActiveElement = document.activeElement;
|
|
93
|
+
this.createMenu();
|
|
94
|
+
}
|
|
95
|
+
createMenu() {
|
|
96
|
+
this.updateServiceItems();
|
|
97
|
+
if (this.componentRef || !this.tieredMenuService.items.length) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this.globalService.lastInstance?.destroy();
|
|
101
|
+
this.globalService.lastInstance = this;
|
|
102
|
+
this.lastActiveElement?.blur?.();
|
|
103
|
+
this.isOpen = true;
|
|
104
|
+
this.tieredMenuOpened.emit();
|
|
105
|
+
this.isNested = document.body.clientWidth < TIERED_MENU_MOBILE_BREAKPOINT_PX;
|
|
106
|
+
if (this.isNested) {
|
|
107
|
+
this.createNestedMenu();
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.createTieredMenu();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
createTieredMenu() {
|
|
114
|
+
this.componentRef = createComponent(TieredMenuComponent, {
|
|
115
|
+
environmentInjector: this.appRef.injector,
|
|
116
|
+
elementInjector: this.injector
|
|
117
|
+
});
|
|
118
|
+
this.appRef.attachView(this.componentRef.hostView);
|
|
119
|
+
document.body.appendChild(this.componentRef.location.nativeElement);
|
|
120
|
+
this.setMenuComponentProperties();
|
|
121
|
+
const menuElement = this.componentRef.location.nativeElement.querySelector('.sdc-tiered-menu');
|
|
122
|
+
if (menuElement) {
|
|
123
|
+
this.resizeObserver.observe(menuElement);
|
|
124
|
+
}
|
|
125
|
+
this.setMenuPosition();
|
|
126
|
+
}
|
|
127
|
+
createNestedMenu() {
|
|
128
|
+
this.componentRef = createComponent(TieredMenuNestedComponent, {
|
|
129
|
+
environmentInjector: this.appRef.injector,
|
|
130
|
+
elementInjector: this.injector
|
|
131
|
+
});
|
|
132
|
+
this.appRef.attachView(this.componentRef.hostView);
|
|
133
|
+
document.body.appendChild(this.componentRef.location.nativeElement);
|
|
134
|
+
this.setMenuComponentProperties();
|
|
135
|
+
this.setMenuPosition();
|
|
136
|
+
}
|
|
137
|
+
destroy() {
|
|
138
|
+
if (!this.componentRef) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.isOpen = false;
|
|
142
|
+
this.tieredMenuClosed.emit();
|
|
143
|
+
this.appRef.detachView(this.componentRef.hostView);
|
|
144
|
+
this.componentRef.destroy();
|
|
145
|
+
this.componentRef = null;
|
|
146
|
+
this.resizeObserver.disconnect();
|
|
147
|
+
this.tieredMenuService.currentItems = this.tieredMenuService.items;
|
|
148
|
+
this.tieredMenuService.currentItem = this.tieredMenuService.items[0] ?? null;
|
|
149
|
+
// Restore focus to the element that was focused before opening the menu
|
|
150
|
+
enableBodyScroll();
|
|
151
|
+
this.lastActiveElement?.focus?.();
|
|
152
|
+
}
|
|
153
|
+
setMenuPosition() {
|
|
154
|
+
if (!this.componentRef) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const itemHeight = TIERED_MENU_ITEM_HEIGHT_DIRECTIVE;
|
|
158
|
+
const dividerHeight = TIERED_MENU_DIVIDER_HEIGHT_DIRECTIVE;
|
|
159
|
+
const padding = TIERED_MENU_PADDING_DIRECTIVE;
|
|
160
|
+
const margin = TIERED_MENU_MARGIN;
|
|
161
|
+
const menuElement = this.componentRef.location.nativeElement.querySelector('.sdc-tiered-menu');
|
|
162
|
+
const menuWidth = menuElement?.clientWidth ?? TIERED_MENU_DEFAULT_WIDTH;
|
|
163
|
+
const { bottom, left, right } = this.elementRef.nativeElement.getBoundingClientRect();
|
|
164
|
+
const itemsCount = this.tieredMenuService.items.reduce((count, item) => (!item.divider ? count + 1 : count), 0);
|
|
165
|
+
const dividersCount = this.tieredMenuService.items.reduce((count, item) => (item.divider ? count + 1 : count), 0);
|
|
166
|
+
const menuHeight = itemsCount * itemHeight + dividersCount * dividerHeight + padding + margin;
|
|
167
|
+
const rightFreeSpace = window.innerWidth - right;
|
|
168
|
+
const bottomFreeSpace = window.innerHeight - bottom;
|
|
169
|
+
this.componentRef.instance.top =
|
|
170
|
+
bottomFreeSpace <= menuHeight ? Math.max(window.scrollY + bottom - menuHeight, 0) : window.scrollY + bottom + margin;
|
|
171
|
+
this.componentRef.instance.left =
|
|
172
|
+
this.isNested || rightFreeSpace <= menuWidth ? window.scrollX + right - menuWidth : window.scrollX + left;
|
|
173
|
+
if (this.isNested) {
|
|
174
|
+
this.componentRef.instance.left = margin;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
setMenuComponentProperties() {
|
|
178
|
+
if (!this.componentRef) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
this.componentRef.instance.items = this.tieredMenuService.items;
|
|
182
|
+
this.componentRef.instance.ariaLabel = this.ariaLabel;
|
|
183
|
+
if (this.componentRef.instance instanceof TieredMenuComponent) {
|
|
184
|
+
this.componentRef.instance.menuTriggerEvent = this.triggerEvent;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
subscribeEvents() {
|
|
188
|
+
this.eventService.closeAllMenusEvent.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
|
|
189
|
+
this.tieredMenuService.items = this.tieredMenuService.markAllItemsAsClosed(this.tieredMenuService.items);
|
|
190
|
+
this.destroy();
|
|
191
|
+
enableBodyScroll();
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
rebuildMenu() {
|
|
195
|
+
this.destroy();
|
|
196
|
+
}
|
|
197
|
+
updateServiceItems() {
|
|
198
|
+
this.tieredMenuService.items = this.tieredMenuService.normalizeData(this.items);
|
|
199
|
+
this.tieredMenuService.currentItems = this.tieredMenuService.items;
|
|
200
|
+
// Find the focused item by matching the original object reference or label (if no match found)
|
|
201
|
+
if (this.focusedItem) {
|
|
202
|
+
const focusedIndex = this.items.indexOf(this.focusedItem);
|
|
203
|
+
this.tieredMenuService.currentItem = focusedIndex >= 0 && focusedIndex < this.tieredMenuService.items.length
|
|
204
|
+
? this.tieredMenuService.items[focusedIndex]
|
|
205
|
+
: this.tieredMenuService.items[0] ?? null;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
this.tieredMenuService.currentItem = this.tieredMenuService.items[0] ?? null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
212
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: TieredMenuDirective, isStandalone: true, selector: "[sdcTieredMenu],[sTieredMenu]", inputs: { items: "items", focusedItem: "focusedItem", triggerEvent: "triggerEvent", ariaLabel: "ariaLabel", dataCoreItems: ["sdcTieredMenu", "dataCoreItems"], legacyItems: ["sTieredMenu", "legacyItems"] }, outputs: { tieredMenuOpened: "tieredMenuOpened", tieredMenuClosed: "tieredMenuClosed" }, host: { listeners: { "click": "onClick($event)", "mouseenter": "onMouseEnter()" } }, providers: [TieredMenuEventService, TieredMenuService], usesOnChanges: true, ngImport: i0 });
|
|
213
|
+
}
|
|
214
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuDirective, decorators: [{
|
|
215
|
+
type: Directive,
|
|
216
|
+
args: [{
|
|
217
|
+
selector: '[sdcTieredMenu],[sTieredMenu]',
|
|
218
|
+
standalone: true,
|
|
219
|
+
providers: [TieredMenuEventService, TieredMenuService]
|
|
220
|
+
}]
|
|
221
|
+
}], propDecorators: { items: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], focusedItem: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}], triggerEvent: [{
|
|
226
|
+
type: Input
|
|
227
|
+
}], ariaLabel: [{
|
|
228
|
+
type: Input
|
|
229
|
+
}], tieredMenuOpened: [{
|
|
230
|
+
type: Output
|
|
231
|
+
}], tieredMenuClosed: [{
|
|
232
|
+
type: Output
|
|
233
|
+
}], dataCoreItems: [{
|
|
234
|
+
type: Input,
|
|
235
|
+
args: ['sdcTieredMenu']
|
|
236
|
+
}], legacyItems: [{
|
|
237
|
+
type: Input,
|
|
238
|
+
args: ['sTieredMenu']
|
|
239
|
+
}], onClick: [{
|
|
240
|
+
type: HostListener,
|
|
241
|
+
args: ['click', ['$event']]
|
|
242
|
+
}], onMouseEnter: [{
|
|
243
|
+
type: HostListener,
|
|
244
|
+
args: ['mouseenter']
|
|
245
|
+
}] } });
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90aWVyZWQtbWVudS9kaXJlY3RpdmVzL3RpZXJlZC1tZW51LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsY0FBYyxFQUNkLGlCQUFpQixFQUVqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFJTCxNQUFNLEVBRU4sZUFBZSxFQUNmLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNoSSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQU14RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUMxRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFFcEUsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFDdEMsTUFBTSxpQ0FBaUMsR0FBRyxFQUFFLENBQUM7QUFDN0MsTUFBTSxvQ0FBb0MsR0FBRyxDQUFDLENBQUM7QUFDL0MsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFDeEMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFPN0IsTUFBTSxPQUFPLG1CQUFtQjtJQUNiLFVB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LGlCQUFpQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUMvRSxDQUFDO0lBQ0gsQ0FBQzt3R0FyUFUsbUJBQW1COzRGQUFuQixtQkFBbUIsd2NBRm5CLENBQUMsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUM7OzRGQUUzQyxtQkFBbUI7a0JBTC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLCtCQUErQjtvQkFDekMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFNBQVMsRUFBRSxDQUFDLHNCQUFzQixFQUFFLGlCQUFpQixDQUFDO2lCQUN2RDs4QkFXUSxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsV0FBVztzQkFEakIsS0FBSztnQkFJQyxZQUFZO3NCQURsQixLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFHVyxnQkFBZ0I7c0JBQWhDLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUdJLGFBQWE7c0JBRHZCLEtBQUs7dUJBQUMsZUFBZTtnQkFNWCxXQUFXO3NCQURyQixLQUFLO3VCQUFDLGFBQWE7Z0JBMERWLE9BQU87c0JBRGhCLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWF2QixZQUFZO3NCQURyQixZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBcHBsaWNhdGlvblJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudFJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGNyZWF0ZUNvbXBvbmVudCxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFRJRVJFRF9NRU5VX0RFRkFVTFRfVFJJR0dFUl9FVkVOVCwgVElFUkVEX01FTlVfTU9CSUxFX0JSRUFLUE9JTlRfUFggfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbnN0YW50cy90aWVyZWQtbWVudS5jb25zdCc7XG5pbXBvcnQgeyBlbmFibGVCb2R5U2Nyb2xsIH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9ib2R5LXNjcm9sbC51dGlsJztcbmltcG9ydCB0eXBlIHtcbiAgVGllcmVkTWVudUl0ZW1EYXRhLFxuICBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSxcbiAgVGllcmVkTWVudVRyaWdnZXJFdmVudFxufSBmcm9tICcuLi8uLi8uLi9jb3JlL3R5cGVzL3RpZXJlZC1tZW51LnR5cGUnO1xuaW1wb3J0IHsgVGllcmVkTWVudU5lc3RlZENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvdGllcmVkLW1lbnUtbmVzdGVkL3RpZXJlZC1tZW51LW5lc3RlZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGllcmVkTWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvdGllcmVkLW1lbnUvdGllcmVkLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IFRpZXJlZE1lbnVFdmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90aWVyZWQtbWVudS5ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFRpZXJlZE1lbnVHbG9iYWxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdGllcmVkLW1lbnUuZ2xvYmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGllcmVkTWVudVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90aWVyZWQtbWVudS5zZXJ2aWNlJztcblxuY29uc3QgVElFUkVEX01FTlVfREVGQVVMVF9XSURUSCA9IDE3NjtcbmNvbnN0IFRJRVJFRF9NRU5VX0lURU1fSEVJR0hUX0RJUkVDVElWRSA9IDM3O1xuY29uc3QgVElFUkVEX01FTlVfRElWSURFUl9IRUlHSFRfRElSRUNUSVZFID0gNTtcbmNvbnN0IFRJRVJFRF9NRU5VX1BBRERJTkdfRElSRUNUSVZFID0gODtcbmNvbnN0IFRJRVJFRF9NRU5VX01BUkdJTiA9IDQ7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzZGNUaWVyZWRNZW51XSxbc1RpZXJlZE1lbnVdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbVGllcmVkTWVudUV2ZW50U2VydmljZSwgVGllcmVkTWVudVNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFRpZXJlZE1lbnVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBSZWYgPSBpbmplY3QoQXBwbGljYXRpb25SZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudFNlcnZpY2UgPSBpbmplY3QoVGllcmVkTWVudUV2ZW50U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGllcmVkTWVudVNlcnZpY2UgPSBpbmplY3QoVGllcmVkTWVudVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbFNlcnZpY2UgPSBpbmplY3QoVGllcmVkTWVudUdsb2JhbFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGl0ZW1zOiBUaWVyZWRNZW51SXRlbURhdGFbXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmb2N1c2VkSXRlbT86IFRpZXJlZE1lbnVJdGVtRGF0YTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdHJpZ2dlckV2ZW50OiBUaWVyZWRNZW51VHJpZ2dlckV2ZW50ID0gVElFUkVEX01FTlVfREVGQVVMVF9UUklHR0VSX0VWRU5UIGFzIFRpZXJlZE1lbnVUcmlnZ2VyRXZlbnQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFyaWFMYWJlbD86IHN0cmluZztcblxuICBAT3V0cHV0KCkgcHVibGljIHRpZXJlZE1lbnVPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgdGllcmVkTWVudUNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBASW5wdXQoJ3NkY1RpZXJlZE1lbnUnKVxuICBwdWJsaWMgc2V0IGRhdGFDb3JlSXRlbXModmFsdWU6IFRpZXJlZE1lbnVJdGVtRGF0YVtdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc2V0SXRlbXModmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCdzVGllcmVkTWVudScpXG4gIHB1YmxpYyBzZXQgbGVnYWN5SXRlbXModmFsdWU6IFRpZXJlZE1lbnVJdGVtRGF0YVtdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc2V0SXRlbXModmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJdGVtcyh2YWx1ZTogVGllcmVkTWVudUl0ZW1EYXRhW10gfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLml0ZW1zID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUaWVyZWRNZW51Q29tcG9uZW50IHwgVGllcmVkTWVudU5lc3RlZENvbXBvbmVudD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc05lc3RlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgbGFzdEFjdGl2ZUVsZW1lbnQ/OiBFbGVtZW50O1xuICBwcml2YXRlIGl0ZW1zQXJlVmFsaWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgdGhpcy5zZXRNZW51UG9zaXRpb24oKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZj8uaG9zdFZpZXcuZGV0ZWN0Q2hhbmdlcygpO1xuICB9KTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zQXJlVmFsaWQgPSAhIXRoaXMuaXRlbXM/Lmxlbmd0aDtcblxuICAgIGlmICghdGhpcy5pdGVtc0FyZVZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXRlbXNBcmVWYWxpZCkge1xuICAgICAgdGhpcy5pdGVtc0FyZVZhbGlkID0gISF0aGlzLml0ZW1zPy5sZW5ndGg7XG4gICAgICBpZiAodGhpcy5pdGVtc0FyZVZhbGlkKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlRXZlbnRzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLml0ZW1zQXJlVmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snaXRlbXMnXSkge1xuICAgICAgdGhpcy51cGRhdGVTZXJ2aWNlSXRlbXMoKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMucmVidWlsZE1lbnUoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgcHJvdGVjdGVkIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXRlbXNBcmVWYWxpZCB8fCB0aGlzLnRyaWdnZXJFdmVudCAhPT0gJ2NsaWNrJyB8fCB0aGlzLmlzT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGFzdEFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgdGhpcy5jcmVhdGVNZW51KCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxuICBwcm90ZWN0ZWQgb25Nb3VzZUVudGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pdGVtc0FyZVZhbGlkIHx8IHRoaXMudHJpZ2dlckV2ZW50ICE9PSAnaG92ZXInIHx8IHRoaXMuaXNPcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0QWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgRWxlbWVudDtcbiAgICB0aGlzLmNyZWF0ZU1lbnUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVNlcnZpY2VJdGVtcygpO1xuXG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmIHx8ICF0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZ2xvYmFsU2VydmljZS5sYXN0SW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmdsb2JhbFNlcnZpY2UubGFzdEluc3RhbmNlID0gdGhpcztcbiAgICAodGhpcy5sYXN0QWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCk/LmJsdXI/LigpO1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnRpZXJlZE1lbnVPcGVuZWQuZW1pdCgpO1xuICAgIHRoaXMuaXNOZXN0ZWQgPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgVElFUkVEX01FTlVfTU9CSUxFX0JSRUFLUE9JTlRfUFg7XG5cbiAgICBpZiAodGhpcy5pc05lc3RlZCkge1xuICAgICAgdGhpcy5jcmVhdGVOZXN0ZWRNZW51KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlVGllcmVkTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGllcmVkTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudFJlZiA9IGNyZWF0ZUNvbXBvbmVudChUaWVyZWRNZW51Q29tcG9uZW50LCB7XG4gICAgICBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmFwcFJlZi5pbmplY3RvcixcbiAgICAgIGVsZW1lbnRJbmplY3RvcjogdGhpcy5pbmplY3RvclxuICAgIH0pO1xuICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgdGhpcy5zZXRNZW51Q29tcG9uZW50UHJvcGVydGllcygpO1xuICAgIGNvbnN0IG1lbnVFbGVtZW50ID0gKHRoaXMuY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoJy5zZGMtdGllcmVkLW1lbnUnKTtcbiAgICBpZiAobWVudUVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShtZW51RWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuc2V0TWVudVBvc2l0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5lc3RlZE1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSBjcmVhdGVDb21wb25lbnQoVGllcmVkTWVudU5lc3RlZENvbXBvbmVudCwge1xuICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy5hcHBSZWYuaW5qZWN0b3IsXG4gICAgICBlbGVtZW50SW5qZWN0b3I6IHRoaXMuaW5qZWN0b3JcbiAgICB9KTtcbiAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KHRoaXMuY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIHRoaXMuc2V0TWVudUNvbXBvbmVudFByb3BlcnRpZXMoKTtcbiAgICB0aGlzLnNldE1lbnVQb3NpdGlvbigpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy50aWVyZWRNZW51Q2xvc2VkLmVtaXQoKTtcbiAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KHRoaXMuY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSBudWxsO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5pdGVtcztcbiAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5pdGVtc1swXSA/PyBudWxsO1xuICAgIFxuICAgIC8vIFJlc3RvcmUgZm9jdXMgdG8gdGhlIGVsZW1lbnQgdGhhdCB3YXMgZm9jdXNlZCBiZWZvcmUgb3BlbmluZyB0aGUgbWVudVxuICAgIGVuYWJsZUJvZHlTY3JvbGwoKTtcbiAgICAodGhpcy5sYXN0QWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCk/LmZvY3VzPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TWVudVBvc2l0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtSGVpZ2h0ID0gVElFUkVEX01FTlVfSVRFTV9IRUlHSFRfRElSRUNUSVZFO1xuICAgIGNvbnN0IGRpdmlkZXJIZWlnaHQgPSBUSUVSRURfTUVOVV9ESVZJREVSX0hFSUdIVF9ESVJFQ1RJVkU7XG4gICAgY29uc3QgcGFkZGluZyA9IFRJRVJFRF9NRU5VX1BBRERJTkdfRElSRUNUSVZFO1xuICAgIGNvbnN0IG1hcmdpbiA9IFRJRVJFRF9NRU5VX01BUkdJTjtcbiAgICBjb25zdCBtZW51RWxlbWVudCA9ICh0aGlzLmNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKCcuc2RjLXRpZXJlZC1tZW51Jyk7XG4gICAgY29uc3QgbWVudVdpZHRoID0gbWVudUVsZW1lbnQ/LmNsaWVudFdpZHRoID8/IFRJRVJFRF9NRU5VX0RFRkFVTFRfV0lEVEg7XG4gICAgY29uc3QgeyBib3R0b20sIGxlZnQsIHJpZ2h0IH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBpdGVtc0NvdW50ID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5pdGVtcy5yZWR1Y2UoXG4gICAgICAoY291bnQ6IG51bWJlciwgaXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEpID0+ICghaXRlbS5kaXZpZGVyID8gY291bnQgKyAxIDogY291bnQpLFxuICAgICAgMFxuICAgICk7XG4gICAgY29uc3QgZGl2aWRlcnNDb3VudCA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXMucmVkdWNlKFxuICAgICAgKGNvdW50OiBudW1iZXIsIGl0ZW06IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhKSA9PiAoaXRlbS5kaXZpZGVyID8gY291bnQgKyAxIDogY291bnQpLFxuICAgICAgMFxuICAgICk7XG4gICAgY29uc3QgbWVudUhlaWdodCA9IGl0ZW1zQ291bnQgKiBpdGVtSGVpZ2h0ICsgZGl2aWRlcnNDb3VudCAqIGRpdmlkZXJIZWlnaHQgKyBwYWRkaW5nICsgbWFyZ2luO1xuICAgIGNvbnN0IHJpZ2h0RnJlZVNwYWNlID0gd2luZG93LmlubmVyV2lkdGggLSByaWdodDtcbiAgICBjb25zdCBib3R0b21GcmVlU3BhY2UgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBib3R0b207XG5cbiAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS50b3AgPVxuICAgICAgYm90dG9tRnJlZVNwYWNlIDw9IG1lbnVIZWlnaHQgPyBNYXRoLm1heCh3aW5kb3cuc2Nyb2xsWSArIGJvdHRvbSAtIG1lbnVIZWlnaHQsIDApIDogd2luZG93LnNjcm9sbFkgKyBib3R0b20gKyBtYXJnaW47XG4gICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UubGVmdCA9XG4gICAgICB0aGlzLmlzTmVzdGVkIHx8IHJpZ2h0RnJlZVNwYWNlIDw9IG1lbnVXaWR0aCA/IHdpbmRvdy5zY3JvbGxYICsgcmlnaHQgLSBtZW51V2lkdGggOiB3aW5kb3cuc2Nyb2xsWCArIGxlZnQ7XG5cbiAgICBpZiAodGhpcy5pc05lc3RlZCkge1xuICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UubGVmdCA9IG1hcmdpbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldE1lbnVDb21wb25lbnRQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5pdGVtcyA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXM7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuYXJpYUxhYmVsID0gdGhpcy5hcmlhTGFiZWw7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlIGluc3RhbmNlb2YgVGllcmVkTWVudUNvbXBvbmVudCkge1xuICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UubWVudVRyaWdnZXJFdmVudCA9IHRoaXMudHJpZ2dlckV2ZW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNsb3NlQWxsTWVudXNFdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5tYXJrQWxsSXRlbXNBc0Nsb3NlZCh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zKTtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgZW5hYmxlQm9keVNjcm9sbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWJ1aWxkTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VydmljZUl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXMgPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLm5vcm1hbGl6ZURhdGEodGhpcy5pdGVtcyk7XG4gICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMgPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIGZvY3VzZWQgaXRlbSBieSBtYXRjaGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0IHJlZmVyZW5jZSBvciBsYWJlbCAoaWYgbm8gbWF0Y2ggZm91bmQpXG4gICAgaWYgKHRoaXMuZm9jdXNlZEl0ZW0pIHtcbiAgICAgIGNvbnN0IGZvY3VzZWRJbmRleCA9IHRoaXMuaXRlbXMuaW5kZXhPZih0aGlzLmZvY3VzZWRJdGVtKTtcbiAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSBmb2N1c2VkSW5kZXggPj0gMCAmJiBmb2N1c2VkSW5kZXggPCB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zLmxlbmd0aFxuICAgICAgICA/IHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXNbZm9jdXNlZEluZGV4XVxuICAgICAgICA6IHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXNbMF0gPz8gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXNbMF0gPz8gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EventEmitter, Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class TieredMenuEventService {
|
|
4
|
+
incrementCurrentItemEvent = new EventEmitter();
|
|
5
|
+
decrementCurrentItemEvent = new EventEmitter();
|
|
6
|
+
closeAllMenusEvent = new EventEmitter();
|
|
7
|
+
selectItemEvent = new EventEmitter();
|
|
8
|
+
openItemMenuEvent = new EventEmitter();
|
|
9
|
+
closeItemMenuEvent = new EventEmitter();
|
|
10
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuEventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
11
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuEventService });
|
|
12
|
+
}
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuEventService, decorators: [{
|
|
14
|
+
type: Injectable
|
|
15
|
+
}] });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUuZXZlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdGllcmVkLW1lbnUvc2VydmljZXMvdGllcmVkLW1lbnUuZXZlbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLekQsTUFBTSxPQUFPLHNCQUFzQjtJQUMxQix5QkFBeUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQ3JELHlCQUF5QixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDckQsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUM5QyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQXFDLENBQUM7SUFDeEUsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQXFDLENBQUM7SUFDMUUsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQXFDLENBQUM7d0dBTnZFLHNCQUFzQjs0R0FBdEIsc0JBQXNCOzs0RkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3R5cGVzL3RpZXJlZC1tZW51LnR5cGUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGllcmVkTWVudUV2ZW50U2VydmljZSB7XG4gIHB1YmxpYyBpbmNyZW1lbnRDdXJyZW50SXRlbUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBwdWJsaWMgZGVjcmVtZW50Q3VycmVudEl0ZW1FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgcHVibGljIGNsb3NlQWxsTWVudXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgcHVibGljIHNlbGVjdEl0ZW1FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8VGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfCBudWxsPigpO1xuICBwdWJsaWMgb3Blbkl0ZW1NZW51RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhIHwgbnVsbD4oKTtcbiAgcHVibGljIGNsb3NlSXRlbU1lbnVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8VGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfCBudWxsPigpO1xufVxuIl19
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class TieredMenuGlobalService {
|
|
4
|
+
lastInstance = null;
|
|
5
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuGlobalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
6
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuGlobalService, providedIn: 'root' });
|
|
7
|
+
}
|
|
8
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuGlobalService, decorators: [{
|
|
9
|
+
type: Injectable,
|
|
10
|
+
args: [{ providedIn: 'root' }]
|
|
11
|
+
}] });
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUuZ2xvYmFsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RpZXJlZC1tZW51L3NlcnZpY2VzL3RpZXJlZC1tZW51Lmdsb2JhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyx1QkFBdUI7SUFDM0IsWUFBWSxHQUErQixJQUFJLENBQUM7d0dBRDVDLHVCQUF1Qjs0R0FBdkIsdUJBQXVCLGNBRFYsTUFBTTs7NEZBQ25CLHVCQUF1QjtrQkFEbkMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgVGllcmVkTWVudURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGllcmVkLW1lbnUuZGlyZWN0aXZlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaWVyZWRNZW51R2xvYmFsU2VydmljZSB7XG4gIHB1YmxpYyBsYXN0SW5zdGFuY2U6IFRpZXJlZE1lbnVEaXJlY3RpdmUgfCBudWxsID0gbnVsbDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class TieredMenuService {
|
|
4
|
+
currentItem = null;
|
|
5
|
+
currentItems = [];
|
|
6
|
+
items = [];
|
|
7
|
+
idCounter = 0;
|
|
8
|
+
normalizeData(items, parent) {
|
|
9
|
+
return items.map((entry) => {
|
|
10
|
+
const item = {
|
|
11
|
+
visible: true,
|
|
12
|
+
...entry,
|
|
13
|
+
id: this.generateId(),
|
|
14
|
+
parent,
|
|
15
|
+
isOpen: false
|
|
16
|
+
};
|
|
17
|
+
if (item.submenu) {
|
|
18
|
+
item.submenu = this.normalizeData(item.submenu, item);
|
|
19
|
+
}
|
|
20
|
+
return item;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
markAllItemsAsClosed(items) {
|
|
24
|
+
return items.map((item) => ({
|
|
25
|
+
...item,
|
|
26
|
+
isOpen: false,
|
|
27
|
+
submenu: item.submenu ? this.markAllItemsAsClosed(item.submenu) : undefined
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
searchTheHierarchy(itemA, itemB) {
|
|
31
|
+
let current = itemB;
|
|
32
|
+
while (current) {
|
|
33
|
+
if (current === itemA) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
current = current.parent;
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
generateId() {
|
|
41
|
+
return `sdc-tiered-menu-${Date.now()}-${this.idCounter++}`;
|
|
42
|
+
}
|
|
43
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
44
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuService });
|
|
45
|
+
}
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuService, decorators: [{
|
|
47
|
+
type: Injectable
|
|
48
|
+
}] });
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvdGllcmVkLW1lbnUvc2VydmljZXMvdGllcmVkLW1lbnUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8saUJBQWlCO0lBQ3JCLFdBQVcsR0FBc0MsSUFBSSxDQUFDO0lBQ3RELFlBQVksR0FBaUMsRUFBRSxDQUFDO0lBQ2hELEtBQUssR0FBaUMsRUFBRSxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFZixhQUFhLENBQ2xCLEtBQTJCLEVBQzNCLE1BQW1DO1FBRW5DLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxHQUErQjtnQkFDdkMsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsR0FBRyxLQUFLO2dCQUNSLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNyQixNQUFNO2dCQUNOLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxLQUFtQztRQUM3RCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUIsR0FBRyxJQUFJO1lBQ1AsTUFBTSxFQUFFLEtBQUs7WUFDYixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUM1RSxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTSxrQkFBa0IsQ0FDdkIsS0FBaUMsRUFDakMsS0FBaUM7UUFFakMsSUFBSSxPQUFPLEdBQTJDLEtBQUssQ0FBQztRQUU1RCxPQUFPLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzNCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sbUJBQW1CLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUM3RCxDQUFDO3dHQXREVSxpQkFBaUI7NEdBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBUaWVyZWRNZW51SXRlbURhdGEsIFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90eXBlcy90aWVyZWQtbWVudS50eXBlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRpZXJlZE1lbnVTZXJ2aWNlIHtcbiAgcHVibGljIGN1cnJlbnRJdGVtOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgY3VycmVudEl0ZW1zOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YVtdID0gW107XG4gIHB1YmxpYyBpdGVtczogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGFbXSA9IFtdO1xuICBwcml2YXRlIGlkQ291bnRlciA9IDA7XG5cbiAgcHVibGljIG5vcm1hbGl6ZURhdGEoXG4gICAgaXRlbXM6IFRpZXJlZE1lbnVJdGVtRGF0YVtdLFxuICAgIHBhcmVudD86IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhXG4gICk6IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhW10ge1xuICAgIHJldHVybiBpdGVtcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBpdGVtOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSA9IHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgLi4uZW50cnksXG4gICAgICAgIGlkOiB0aGlzLmdlbmVyYXRlSWQoKSxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpc09wZW46IGZhbHNlXG4gICAgICB9O1xuXG4gICAgICBpZiAoaXRlbS5zdWJtZW51KSB7XG4gICAgICAgIGl0ZW0uc3VibWVudSA9IHRoaXMubm9ybWFsaXplRGF0YShpdGVtLnN1Ym1lbnUsIGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrQWxsSXRlbXNBc0Nsb3NlZChpdGVtczogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGFbXSk6IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhW10ge1xuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAuLi5pdGVtLFxuICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgIHN1Ym1lbnU6IGl0ZW0uc3VibWVudSA/IHRoaXMubWFya0FsbEl0ZW1zQXNDbG9zZWQoaXRlbS5zdWJtZW51KSA6IHVuZGVmaW5lZFxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2hUaGVIaWVyYXJjaHkoXG4gICAgaXRlbUE6IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhLFxuICAgIGl0ZW1COiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YVxuICApOiBib29sZWFuIHtcbiAgICBsZXQgY3VycmVudDogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfCB1bmRlZmluZWQgPSBpdGVtQjtcblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBpZiAoY3VycmVudCA9PT0gaXRlbUEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHNkYy10aWVyZWQtbWVudS0ke0RhdGUubm93KCl9LSR7dGhpcy5pZENvdW50ZXIrK31gO1xuICB9XG59XG4iXX0=
|