import { ChangeDetectionStrategy, Component, input, viewChildren, ViewEncapsulation, } from "@angular/core"; import { injectFullPageCodeSignal } from "../../core/routing/injectFullPageCodeSignal"; import { type SdMenu, getMenuRouterLinkOption as menuRouterLinkOption, getIsMenuSelected as menuIsSelected, } from "../../core/routing/menu-utils"; import { NgTemplateOutlet } from "@angular/common"; import { SdTypedTemplate } from "../../core/template/sd-typed-template"; import { SdRouterLink } from "../../core/routing/sd-router-link"; import { SdDropdown } from "../../controls/dropdown/sd-dropdown"; import { SdDropdownPopup } from "../../controls/dropdown/sd-dropdown-popup"; import { SdList } from "../../controls/list/sd-list"; import { SdListItem } from "../../controls/list/sd-list-item"; import { SdButton } from "../../controls/button/sd-button"; import { NgIcon } from "@ng-icons/core"; import { tablerCaretDown } from "@ng-icons/tabler-icons"; @Component({ selector: "sd-topbar-menu", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [ NgTemplateOutlet, SdTypedTemplate, SdRouterLink, SdDropdown, SdDropdownPopup, SdList, SdListItem, SdButton, NgIcon, ], host: { "class": "flex-row gap-sm", }, styles: [ /* language=SCSS */ ` sd-topbar-menu { sd-list sd-list { background: var(--trans-lightest); } } `, ], template: ` @for (menu of menus(); track menu.codeChain.join("."); let i = $index) { @if (menu.icon) { } {{ menu.title }} @if (menu.children) { } @else { } } @for (menu of currMenus; track menu.codeChain.join(".")) { @if (menu.icon) {   } {{ menu.title }} @if (menu.children) { } } `, }) export class SdTopbarMenu { menus = input([]); getMenuIsSelectedFn = input<(menu: SdMenu) => boolean>(); fullPageCode = injectFullPageCodeSignal(); private readonly _dropdowns = viewChildren(SdDropdown); getMenuRouterLinkOption( menu: SdMenu, ): { link: string; queryParams: Record | undefined } | undefined { return menuRouterLinkOption(menu); } getIsMenuSelected(menu: SdMenu): boolean { return menuIsSelected(menu, this.fullPageCode(), this.getMenuIsSelectedFn()); } onMenuClick(menu: SdMenu, dropdownIndex: number): void { if (menu.url != null) { window.open(menu.url, "_blank"); } if (menu.children == null) { this._dropdowns()[dropdownIndex].open.set(false); } } protected readonly itemTemplateType!: { menus: SdMenu[]; depth: number; dropdownIndex: number; }; protected readonly tablerCaretDown = tablerCaretDown; }