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(".")) {
0 ? (depth + 1) * 0.5 : undefined"
[style.padding-block]="depth === 0 ? 'var(--gap-default)' : undefined"
[sdRouterLink]="getMenuRouterLinkOption(menu)"
(click)="onMenuClick(menu, dropdownIndex)"
[selected]="getIsMenuSelected(menu)"
[layout]="'flat'"
>
@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;
}