@ngrdt/menu 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngrdt-menu.mjs","sources":["../../../../@ngrdt/menu/src/lib/private-models.ts","../../../../@ngrdt/menu/src/lib/models.ts","../../../../@ngrdt/menu/src/lib/utils.ts","../../../../@ngrdt/menu/src/lib/menu-overlay/rdt-menu-overlay.component.ts","../../../../@ngrdt/menu/src/lib/menu-overlay/rdt-menu-overlay.component.html","../../../../@ngrdt/menu/src/lib/menu-base/rdt-menu-base.component.ts","../../../../@ngrdt/menu/src/lib/menu/rdt-menu.component.ts","../../../../@ngrdt/menu/src/lib/menu/rdt-menu.component.html","../../../../@ngrdt/menu/src/lib/menu-bar/rdt-menu-bar.component.ts","../../../../@ngrdt/menu/src/lib/menu-bar/rdt-menu-bar.component.html","../../../../@ngrdt/menu/src/lib/rdt-menu.module.ts","../../../../@ngrdt/menu/src/ngrdt-menu.ts"],"sourcesContent":["import { RdtRoute } from '@ngrdt/router';\r\nimport { RdtShortcut } from '@ngrdt/shortcuts';\r\nimport { RdtStringUtils, WindowOpenTargetType } from '@ngrdt/utils';\r\nimport { RdtMenuItem } from './models';\r\nimport { Injector } from '@angular/core';\r\n\r\nexport interface RdtMenuItemBase<TIcon = string> {\r\n label: string;\r\n icon?: TIcon;\r\n shortcut?: RdtShortcut;\r\n command?: () => void;\r\n visible?: () => boolean;\r\n queryParams?: { [key: string]: any };\r\n requiredParent?: RdtRoute;\r\n dataTestId?: string;\r\n}\r\n\r\nexport interface ParsedRdtMenuItemWithChildren<TIcon = string>\r\n extends RdtMenuItemBase<TIcon> {\r\n items: ParsedRdtMenuItem[];\r\n dataTestId: string;\r\n routerLink?: never;\r\n externalLink?: never;\r\n icon?: never;\r\n target?: never;\r\n}\r\n\r\nexport interface ParsedRdtMenuItemWithRoute<TIcon = string>\r\n extends RdtMenuItemBase<TIcon> {\r\n dataTestId: string;\r\n items?: never;\r\n routerLink?: string[];\r\n externalLink?: never;\r\n icon?: TIcon;\r\n target: WindowOpenTargetType;\r\n}\r\n\r\nexport interface ParsedRdtMenuItemWithLink<TIcon = string>\r\n extends RdtMenuItemBase<TIcon> {\r\n dataTestId: string;\r\n items?: never;\r\n routerLink?: never;\r\n externalLink?: string;\r\n icon?: TIcon;\r\n target: WindowOpenTargetType;\r\n}\r\n\r\nexport type ParsedRdtMenuItem =\r\n | ParsedRdtMenuItemWithRoute\r\n | ParsedRdtMenuItemWithChildren\r\n | ParsedRdtMenuItemWithLink;\r\n\r\nexport function parseMenuItems(\r\n items: RdtMenuItem[],\r\n injector: Injector,\r\n prefix = ''\r\n): ParsedRdtMenuItem[] {\r\n return items\r\n .map((item) => {\r\n let newPrefix: string;\r\n if (item.dataTestId) {\r\n newPrefix = item.dataTestId;\r\n } else if (prefix) {\r\n newPrefix = RdtStringUtils.getDataTestId(item.label, prefix);\r\n } else {\r\n newPrefix = RdtStringUtils.getDataTestId(item.label);\r\n }\r\n const newDataTestId = RdtStringUtils.getDataTestId(\r\n newPrefix,\r\n null,\r\n 'menu-item'\r\n );\r\n const res: RdtMenuItemBase = {\r\n label: item.label,\r\n icon: item.icon,\r\n shortcut: item.shortcut,\r\n command: item.command,\r\n visible: item.visible,\r\n queryParams: item.queryParams,\r\n requiredParent: item.requiredParent,\r\n dataTestId: newDataTestId,\r\n };\r\n if (item.items) {\r\n const childrenRes = res as ParsedRdtMenuItemWithChildren;\r\n const parsedChildren = parseMenuItems(item.items, injector, newPrefix);\r\n if (parsedChildren.length > 0) {\r\n childrenRes.items = parsedChildren;\r\n }\r\n return childrenRes;\r\n } else if (item.routerLink) {\r\n const linkRes = res as ParsedRdtMenuItemWithRoute;\r\n linkRes.target = item.target ?? '_self';\r\n if (item.routerLink) {\r\n linkRes.routerLink = [item.routerLink.createAbsoluteUrl()];\r\n if (!res.visible && item.routerLink.hasCanBeEnteredGuard) {\r\n const canBeEntered = item.routerLink.canBeEntered.bind(\r\n item.routerLink\r\n );\r\n linkRes.visible = () => canBeEntered(injector);\r\n }\r\n }\r\n return linkRes;\r\n } else {\r\n const linkRes = res as ParsedRdtMenuItemWithLink;\r\n if (item.externalLink) {\r\n if (item.queryParams) {\r\n linkRes.externalLink = RdtStringUtils.appendQueryParams(\r\n item.externalLink,\r\n item.queryParams\r\n );\r\n } else {\r\n linkRes.externalLink = item.externalLink;\r\n }\r\n }\r\n linkRes.target = item.target ?? '_blank';\r\n return linkRes;\r\n }\r\n })\r\n .filter((item) => !item.visible || item.visible())\r\n .filter(\r\n (item) =>\r\n item.externalLink ||\r\n item['routerLink'] ||\r\n item.command ||\r\n (item['items']?.length ?? 0) > 0\r\n );\r\n}\r\n","import { RdtRoute } from '@ngrdt/router';\r\nimport { RdtMenuItemBase } from './private-models';\r\nimport {\r\n RdtHorizontalDirection,\r\n RdtVerticalDirection,\r\n WindowOpenTargetType,\r\n} from '@ngrdt/utils';\r\nimport { InjectionToken } from '@angular/core';\r\n\r\nexport interface RdtMenuItemWithRoute extends RdtMenuItemBase {\r\n items?: never;\r\n routerLink?: RdtRoute;\r\n externalLink?: never;\r\n target?: never;\r\n}\r\n\r\nexport interface RdtMenuItemWithLink extends RdtMenuItemBase {\r\n items?: never;\r\n externalLink: string;\r\n routerLink?: never;\r\n target?: WindowOpenTargetType;\r\n}\r\n\r\nexport interface RdtMenuItemWithChildren extends RdtMenuItemBase {\r\n items: RdtMenuItem[];\r\n routerLink?: never;\r\n externalLink?: never;\r\n target?: WindowOpenTargetType;\r\n}\r\n\r\nexport type RdtMenuItem =\r\n | RdtMenuItemWithChildren\r\n | RdtMenuItemWithRoute\r\n | RdtMenuItemWithLink;\r\n\r\nexport enum RdtMenuShortcutMode {\r\n FOCUS_ITEM = 'focus-item',\r\n OPEN_SUBMENU = 'open-submenu',\r\n}\r\n\r\nexport const RDT_MENU_MARGIN_TOP_PROPERTY_NAME = '--rdt-menu-margin-top';\r\nexport const RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME = '--rdt-menu-margin-bottom';\r\nexport const RDT_MENU_MARGIN_LEFT_PROPERTY_NAME = '--rdt-menu-margin-left';\r\nexport const RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME = '--rdt-menu-margin-right';\r\n\r\nexport const DEFAULT_MENU_HORIZONTAL_DIR = 'left';\r\nexport const DEFAULT_MENU_VERTICAL_DIR = 'down';\r\n\r\nexport const RDT_MENU_HORIZONTAL_DIR_PROVIDER =\r\n new InjectionToken<RdtHorizontalDirection>('RDT_MENU_HORIZONTAL_DIR');\r\nexport const RDT_MENU_VERTICAL_DIR_PROVIDER =\r\n new InjectionToken<RdtVerticalDirection>('RDT_MENU_VERTICAL_DIR');\r\n","import { RdtShortcut } from '@ngrdt/shortcuts';\r\nimport {\r\n Nullable,\r\n RdtHorizontalDirection,\r\n RdtVerticalDirection,\r\n} from '@ngrdt/utils';\r\nimport {\r\n ParsedRdtMenuItem,\r\n ParsedRdtMenuItemWithChildren,\r\n ParsedRdtMenuItemWithRoute,\r\n} from './private-models';\r\n\r\nexport const INVISIBLE_CLASS = 'invisible';\r\nexport const FOCUS_VISIBLE = 'focus-visible';\r\n\r\nexport interface Size {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface VertOffset {\r\n top: number;\r\n bottom: number;\r\n}\r\n\r\nexport interface HorOffset {\r\n left: number;\r\n right: number;\r\n}\r\n\r\nexport interface VertDirWithOffset {\r\n dir: RdtVerticalDirection;\r\n top: number;\r\n}\r\n\r\nexport interface HorDirWithOffset {\r\n dir: RdtHorizontalDirection;\r\n left: number;\r\n}\r\n\r\nexport interface ParsedRdtMenuItemWithShortcut {\r\n path: ParsedRdtMenuItem[];\r\n shortcut: RdtShortcut;\r\n}\r\n\r\nfunction getChildRoutesMapRec(\r\n item: ParsedRdtMenuItem,\r\n map: Map<ParsedRdtMenuItem, string[][]>\r\n): string[][] {\r\n let childRoutes: string[][][];\r\n\r\n if (menuItemHasChildren(item)) {\r\n childRoutes = item.items.map((child) => getChildRoutesMapRec(child, map));\r\n } else {\r\n childRoutes = [];\r\n }\r\n\r\n let res: string[][];\r\n\r\n if (menuItemHasRoute(item) && item.routerLink) {\r\n res = [item.routerLink].concat(...childRoutes);\r\n } else {\r\n res = ([] as string[][]).concat(...childRoutes);\r\n }\r\n map.set(item, res);\r\n return res;\r\n}\r\n\r\nexport function getChildRoutesMap(items: ParsedRdtMenuItem[]) {\r\n const map = new Map<ParsedRdtMenuItem, string[][]>();\r\n\r\n items.forEach((item) => getChildRoutesMapRec(item, map));\r\n return map;\r\n}\r\n\r\nexport function findNextItemWithPrefix(\r\n items: ParsedRdtMenuItem[],\r\n itemIndex: number,\r\n prefix: string\r\n) {\r\n const len = items.length;\r\n prefix = prefix.toLocaleLowerCase();\r\n for (let i = (itemIndex + 1) % len; i !== itemIndex; i = (i + 1) % len) {\r\n const label = items[i].label.toLocaleLowerCase();\r\n if (label.startsWith(prefix)) {\r\n return i;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function menuItemHasChildren(\r\n item: ParsedRdtMenuItem\r\n): item is ParsedRdtMenuItemWithChildren {\r\n return 'items' in item;\r\n}\r\n\r\nexport function menuItemHasRoute(\r\n item: ParsedRdtMenuItem\r\n): item is ParsedRdtMenuItemWithRoute {\r\n return 'routerLink' in item;\r\n}\r\n\r\nfunction getMenuItemsShortcutsRec(\r\n item: ParsedRdtMenuItem,\r\n currentPath: ParsedRdtMenuItem[],\r\n res: ParsedRdtMenuItemWithShortcut[]\r\n) {\r\n const path = [...currentPath, item];\r\n if (item.shortcut) {\r\n res.push({\r\n path: path,\r\n shortcut: item.shortcut,\r\n });\r\n }\r\n if (menuItemHasChildren(item)) {\r\n item.items.forEach((child) => getMenuItemsShortcutsRec(child, path, res));\r\n }\r\n}\r\n\r\nexport function getMenuItemsShortcuts(items: ParsedRdtMenuItem[]) {\r\n const res: ParsedRdtMenuItemWithShortcut[] = [];\r\n const initialPath: ParsedRdtMenuItem[] = [];\r\n items.forEach((item) => getMenuItemsShortcutsRec(item, initialPath, res));\r\n return res;\r\n}\r\n\r\nexport function areHorDirsEqual(\r\n a: Nullable<HorDirWithOffset>,\r\n b: Nullable<HorDirWithOffset>\r\n) {\r\n if (!a) {\r\n return !b;\r\n }\r\n if (!b) {\r\n return !a;\r\n }\r\n return a.dir === b.dir && a.left === b.left;\r\n}\r\n\r\nexport function areVertDirsEqual(\r\n a: Nullable<VertDirWithOffset>,\r\n b: Nullable<VertDirWithOffset>\r\n) {\r\n if (!a) {\r\n return !b;\r\n }\r\n if (!b) {\r\n return !a;\r\n }\r\n return a.dir === b.dir && a.top === b.top;\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n HostBinding,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n QueryList,\r\n Renderer2,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewChildren,\r\n inject,\r\n} from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n RdtShortcut,\r\n RdtShortcutEvent,\r\n RdtShortcutService,\r\n} from '@ngrdt/shortcuts';\r\nimport {\r\n KB_CODE,\r\n RdtHorizontalDirection,\r\n RdtObjectUtils,\r\n RdtStringUtils,\r\n RdtVerticalDirection,\r\n} from '@ngrdt/utils';\r\nimport { delay, first, map, of } from 'rxjs';\r\nimport {\r\n DEFAULT_MENU_HORIZONTAL_DIR,\r\n DEFAULT_MENU_VERTICAL_DIR,\r\n} from '../models';\r\nimport {\r\n ParsedRdtMenuItem,\r\n ParsedRdtMenuItemWithChildren,\r\n} from '../private-models';\r\nimport {\r\n FOCUS_VISIBLE,\r\n HorDirWithOffset,\r\n VertDirWithOffset,\r\n areHorDirsEqual,\r\n areVertDirsEqual,\r\n findNextItemWithPrefix,\r\n menuItemHasChildren,\r\n menuItemHasRoute,\r\n} from '../utils';\r\nimport { RdtMenuBaseComponent } from '../menu-base/rdt-menu-base.component';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n// TODO: Split positioning and shortcut/focus management in separate classes\r\n@Component({\r\n selector: 'rdt-menu-overlay',\r\n templateUrl: './rdt-menu-overlay.component.html',\r\n styleUrls: ['./rdt-menu-overlay.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RdtMenuOverlayComponent\r\n implements OnInit, OnChanges, AfterViewInit\r\n{\r\n readonly elRef: ElementRef<HTMLElement> = inject(ElementRef<HTMLElement>);\r\n readonly destroyRef = inject(DestroyRef);\r\n\r\n private readonly renderer = inject(Renderer2);\r\n private readonly topLevelMenu = inject(RdtMenuBaseComponent);\r\n private readonly parentMenu = inject(RdtMenuOverlayComponent, {\r\n optional: true,\r\n skipSelf: true,\r\n });\r\n private readonly cd = inject(ChangeDetectorRef);\r\n private readonly router = inject(Router);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly shortcutService = inject(RdtShortcutService);\r\n\r\n @ViewChildren(RdtMenuOverlayComponent)\r\n private children!: QueryList<RdtMenuOverlayComponent>;\r\n\r\n @ViewChildren('focusableItem')\r\n private focusableElements!: QueryList<ElementRef<HTMLLIElement>>;\r\n\r\n @ViewChild('menuItemContainer')\r\n private menuItemContainer!: ElementRef<HTMLUListElement>;\r\n\r\n @Input()\r\n item!: ParsedRdtMenuItemWithChildren;\r\n\r\n @Input()\r\n level!: number;\r\n\r\n @Input()\r\n preferredHorizontalDir: RdtHorizontalDirection = DEFAULT_MENU_HORIZONTAL_DIR;\r\n\r\n @Input()\r\n preferredVerticalDir: RdtVerticalDirection = DEFAULT_MENU_VERTICAL_DIR;\r\n\r\n @HostBinding('class.expanded')\r\n @Input()\r\n expanded = false;\r\n\r\n @Input()\r\n autofocusItem: 'first' | 'last' | null = null;\r\n\r\n // Element used to relatively position menu,\r\n // typically parent element.\r\n // If not specified, parent element is used.\r\n @Input()\r\n anchorElement?: HTMLElement;\r\n\r\n @HostBinding('attr.role')\r\n private roleAttr = 'menu';\r\n\r\n @HostBinding('attr.tabindex')\r\n private tabindexAttr = '-1';\r\n\r\n @HostBinding('style.z-index')\r\n get zIndex() {\r\n return this.level + 10;\r\n }\r\n\r\n get isRootLevel() {\r\n return this.level === 0;\r\n }\r\n\r\n // Bounding box of this excluding any extra offset.\r\n private _box!: DOMRect;\r\n get box() {\r\n return this._box;\r\n }\r\n\r\n // Bounding box of parent element.\r\n private _anchorBox!: DOMRect;\r\n private _containerPadding = { top: 0, bottom: 0 };\r\n\r\n // Recalculate child components only after they are initialized.\r\n private _viewWasInit = false;\r\n\r\n // Currently applied vertical and horizontal directions.\r\n protected verticalDir: VertDirWithOffset | null = null;\r\n protected horizontalDir: HorDirWithOffset | null = null;\r\n\r\n protected expandedChild: ParsedRdtMenuItem | null = null;\r\n protected autofocusSubmenuItem: 'first' | 'last' | null = null;\r\n\r\n readonly keyActions = {\r\n [KB_CODE.ARROW.UP]: (index: number) => this.focusPrevItem(index),\r\n [KB_CODE.ARROW.DOWN]: (index: number) => this.focusNextItem(index),\r\n [KB_CODE.ARROW.RIGHT]: (index: number) => this.openSubmenu(index, 'first'),\r\n [KB_CODE.ARROW.LEFT]: () => this.closeSelf(),\r\n [KB_CODE.HOME]: () => this.focusItem(0),\r\n [KB_CODE.END]: () => this.focusItem(this.item.items.length - 1),\r\n [KB_CODE.ESCAPE]: () => this.closeSelf(),\r\n [KB_CODE.ENTER]: (index: number) => this.invokeItemClickByIndex(index),\r\n [KB_CODE.SPACEBAR]: (index: number) => this.invokeItemClickByIndex(index),\r\n };\r\n\r\n ngOnInit() {\r\n this.setClasses();\r\n this.listenTabKeyPress();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const recalcTriggers = [\r\n 'preferredHorizontalDir',\r\n 'preferredVerticalDir',\r\n 'expanded',\r\n ];\r\n if (recalcTriggers.some((key) => key in changes) && this._viewWasInit) {\r\n this.recalculatePosition(\r\n this.preferredHorizontalDir,\r\n this.preferredVerticalDir\r\n );\r\n }\r\n\r\n if (!this.expanded) {\r\n this.expandedChild = null;\r\n }\r\n\r\n if ('expanded' in changes && this.expanded) {\r\n // Wait for Angular to set .expanded class,\r\n // because invisible elements cannot be focused.\r\n setTimeout(() => {\r\n switch (this.autofocusItem) {\r\n case null:\r\n this.focusItem(0, false);\r\n break;\r\n case 'first':\r\n this.focusItem(0, true);\r\n break;\r\n case 'last':\r\n this.focusItem(this.item.items.length - 1, true);\r\n }\r\n });\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.measureContainerPadding();\r\n this.recalculatePosition(\r\n this.preferredHorizontalDir,\r\n this.preferredVerticalDir\r\n );\r\n this._viewWasInit = true;\r\n }\r\n\r\n private getMinOffsetLeft() {\r\n return this.topLevelMenu.bodyMargin.left;\r\n }\r\n\r\n private getMaxOffsetLeft() {\r\n return (\r\n this.topLevelMenu.clientSize.width -\r\n this._box.width -\r\n this.topLevelMenu.bodyMargin.right\r\n );\r\n }\r\n\r\n private getMinOffsetTop() {\r\n return this.topLevelMenu.bodyMargin.top;\r\n }\r\n\r\n private getMaxOffsetTop() {\r\n return (\r\n this.topLevelMenu.clientSize.height -\r\n this._box.height -\r\n this.topLevelMenu.bodyMargin.bottom\r\n );\r\n }\r\n\r\n recalculatePosition(\r\n preferredHorizontalDir: RdtHorizontalDirection,\r\n preferredVerticalDir: RdtVerticalDirection\r\n ) {\r\n // Make menu invisible so the menu does not move around in case of slow computer.\r\n this.measureBoundingRect();\r\n\r\n if (!this._box || !this._anchorBox) {\r\n return;\r\n }\r\n\r\n const newHorDir = this.getRealHorizontalDir(preferredHorizontalDir);\r\n const newVertDir = this.getRealVerticalDir(preferredVerticalDir);\r\n\r\n // Horizontal direction\r\n if (newHorDir.dir === 'right') {\r\n newHorDir.left += this._anchorBox.left;\r\n if (!this.isRootLevel) {\r\n newHorDir.left += this._anchorBox.width;\r\n }\r\n } else if (newHorDir.dir === 'left') {\r\n newHorDir.left += this._anchorBox.left - this._box.width;\r\n\r\n if (this.isRootLevel) {\r\n newHorDir.left += this._anchorBox.width;\r\n }\r\n }\r\n\r\n // Restrictions from left menu and right menu\r\n newHorDir.left = Math.min(\r\n Math.max(this.getMinOffsetLeft(), newHorDir.left),\r\n this.getMaxOffsetLeft()\r\n );\r\n\r\n // Vertical direction\r\n if (newVertDir.dir === 'down') {\r\n newVertDir.top = this._anchorBox.top;\r\n if (this.isRootLevel) {\r\n newVertDir.top += this._anchorBox.height;\r\n } else {\r\n newVertDir.top -= this._containerPadding.top;\r\n }\r\n } else if (newVertDir.dir === 'up') {\r\n newVertDir.top = this._anchorBox.top - this._box.height;\r\n if (!this.isRootLevel) {\r\n newVertDir.top += this._anchorBox.height + this._containerPadding.top;\r\n }\r\n }\r\n\r\n // Restrictions from header and footer\r\n newVertDir.top = Math.min(\r\n Math.max(this.getMinOffsetTop(), newVertDir.top),\r\n this.getMaxOffsetTop()\r\n );\r\n\r\n if (\r\n !areHorDirsEqual(this.horizontalDir, newHorDir) ||\r\n !areVertDirsEqual(this.verticalDir, newVertDir)\r\n ) {\r\n this.horizontalDir = newHorDir;\r\n this.verticalDir = newVertDir;\r\n this.setClasses();\r\n this.measureBoundingRect();\r\n }\r\n\r\n this.recalculateChildren();\r\n }\r\n\r\n onItemClick(item: ParsedRdtMenuItem) {\r\n const hasChildren = menuItemHasChildren(item);\r\n if (hasChildren && this.expandedChild !== item) {\r\n this.autofocusSubmenuItem = null;\r\n this.expandedChild = item;\r\n } else {\r\n this.expandedChild = null;\r\n }\r\n // Could also listen to router events, but might be triggered by\r\n // child router navigation.\r\n if (!hasChildren) {\r\n this.topLevelMenu.closeSubmenus();\r\n }\r\n if (typeof item.command === 'function') {\r\n item.command();\r\n }\r\n }\r\n\r\n invokeItemClick(item: ParsedRdtMenuItem) {\r\n if (menuItemHasRoute(item) && item.routerLink) {\r\n this.router.navigate(item.routerLink);\r\n }\r\n this.onItemClick(item);\r\n this.autofocusSubmenuItem = 'first';\r\n }\r\n\r\n getChildRoutes(item: ParsedRdtMenuItem) {\r\n return this.topLevelMenu.getChildRoutes(item);\r\n }\r\n\r\n closeSubmenus(focusExpanded = false) {\r\n if (focusExpanded && this.expandedChild) {\r\n this.focusItem(this.expandedChild);\r\n }\r\n this.expandedChild = null;\r\n this.cd.markForCheck();\r\n }\r\n\r\n focusItemRecursively(path: ParsedRdtMenuItem[]) {\r\n const children = [...path];\r\n const thisItem = children.shift()!;\r\n\r\n this.autofocusSubmenuItem = null;\r\n this.autofocusItem = null;\r\n\r\n if (children.length > 0) {\r\n this.expandAndGetChild(thisItem)\r\n .pipe(delay(1))\r\n .subscribe((overlay) => {\r\n overlay.focusItemRecursively(children);\r\n });\r\n } else {\r\n // First focus the correct item because submenu might have focus on it.\r\n // Removing focused element from DOM results in window:focusout event\r\n // and that closes all menus\r\n this.focusItem(thisItem);\r\n // Now close submenus and therefore remove them from DOM\r\n this.closeSubmenus();\r\n // Wait until they are removed and focus the correct item again\r\n setTimeout(() => this.focusItem(thisItem), 1);\r\n }\r\n }\r\n\r\n private expandAndGetChild(item: ParsedRdtMenuItem) {\r\n if (this.item.items.indexOf(item) < 0) {\r\n throw new Error(\r\n 'Attempting to expand item that is not child item of this.item'\r\n );\r\n }\r\n this.expandedChild = item;\r\n this.cd.markForCheck();\r\n\r\n const child = this.children.find((child) => child.item === item);\r\n if (child) {\r\n return of(child);\r\n } else {\r\n return this.children.changes.pipe(\r\n map(() => this.children.find((child) => child.item === item)),\r\n first(RdtObjectUtils.notNullGuard)\r\n );\r\n }\r\n }\r\n\r\n protected onKeyDown(itemIndex: number, event: KeyboardEvent) {\r\n const hasAction = event.code in this.keyActions;\r\n const isLetter =\r\n RdtStringUtils.isAlphabetCharacter(event.key) ||\r\n RdtStringUtils.isNumericCharacter(event.key);\r\n\r\n if (hasAction || isLetter) {\r\n event.preventDefault();\r\n }\r\n if (hasAction) {\r\n event.stopPropagation();\r\n }\r\n\r\n if (hasAction) {\r\n this.keyActions[event.code](itemIndex);\r\n } else if (isLetter) {\r\n const next = findNextItemWithPrefix(\r\n this.item.items,\r\n itemIndex,\r\n event.key\r\n );\r\n if (next !== null) {\r\n this.focusItem(next);\r\n }\r\n }\r\n }\r\n\r\n private onTabKeyPress(event: RdtShortcutEvent) {\r\n // Do not prevent default to correctly switch to previous element\r\n event.originalEvent.stopPropagation();\r\n // Wait for document.activeElement to switch to new element\r\n setTimeout(() => {\r\n if (!this.elRef.nativeElement.contains(this.document.activeElement)) {\r\n this.closeSelf(false);\r\n }\r\n }, 1);\r\n }\r\n\r\n private invokeItemClickByIndex(itemIndex: number) {\r\n const item = this.item.items[itemIndex];\r\n if (!item) {\r\n return;\r\n }\r\n this.invokeItemClick(item);\r\n }\r\n\r\n private focusItem(item: number | ParsedRdtMenuItem, visibleFocus = true) {\r\n let itemIndex: number;\r\n\r\n if (typeof item === 'number') {\r\n itemIndex = item;\r\n } else {\r\n itemIndex = this.item.items.indexOf(item);\r\n }\r\n\r\n if (itemIndex >= 0 && itemIndex < this.focusableElements.length) {\r\n this.blurAllFocusable();\r\n this.focusFocusable(itemIndex, visibleFocus);\r\n }\r\n }\r\n\r\n private blurAllFocusable() {\r\n this.focusableElements.forEach((el) =>\r\n this.renderer.removeClass(el.nativeElement, FOCUS_VISIBLE)\r\n );\r\n }\r\n\r\n private focusFocusable(itemIndex: number, visibleFocus: boolean) {\r\n const elRef = this.focusableElements.get(itemIndex);\r\n if (elRef) {\r\n if (visibleFocus) {\r\n this.renderer.addClass(elRef.nativeElement, FOCUS_VISIBLE);\r\n }\r\n elRef.nativeElement.focus();\r\n }\r\n }\r\n\r\n private focusNextItem(itemIndex: number) {\r\n const next = (itemIndex + 1) % this.item.items.length;\r\n this.focusItem(next);\r\n }\r\n\r\n private focusPrevItem(itemIndex: number) {\r\n const prev =\r\n (itemIndex - 1 + this.item.items.length) % this.item.items.length;\r\n this.focusItem(prev);\r\n }\r\n\r\n private openSubmenu(itemIndex: number, visibleFocus: 'first' | 'last') {\r\n if (\r\n itemIndex < this.item.items.length &&\r\n menuItemHasChildren(this.item.items[itemIndex])\r\n ) {\r\n this.expandedChild = this.item.items[itemIndex];\r\n this.autofocusSubmenuItem = visibleFocus;\r\n }\r\n }\r\n\r\n private closeSelf(focusExpanded = true) {\r\n if (this.parentMenu) {\r\n this.parentMenu.closeSubmenus(focusExpanded);\r\n } else {\r\n this.topLevelMenu.closeSubmenus(focusExpanded);\r\n }\r\n }\r\n\r\n @HostListener('window:focusout', ['$event'])\r\n private checkActiveElement(event: FocusEvent) {\r\n if (this.topLevelMenu.closeOnFocusOut) {\r\n const thisEl = this.elRef.nativeElement;\r\n const target = event.relatedTarget;\r\n if (!(target instanceof HTMLElement) || !thisEl.contains(target)) {\r\n this.expandedChild = null;\r\n }\r\n }\r\n }\r\n\r\n // Calculates direction of this menu and offset in case\r\n // menu won't fit in left nor right of parent menu.\r\n private getRealHorizontalDir(\r\n preferredHorizontalDir: RdtHorizontalDirection\r\n ): HorDirWithOffset {\r\n let left: number;\r\n let right: number;\r\n // This menu is directly under menubar\r\n if (this.level === 0) {\r\n left = this._anchorBox.right - this._box.width;\r\n right =\r\n this.topLevelMenu.clientSize.width -\r\n (this._anchorBox.left + this._box.width);\r\n } else {\r\n // Menu is nested\r\n right =\r\n this.topLevelMenu.clientSize.width -\r\n (this._anchorBox.right + this._box.width);\r\n left = this._anchorBox.left - this._box.width;\r\n }\r\n\r\n left -= this.topLevelMenu.bodyMargin.left;\r\n right -= this.topLevelMenu.bodyMargin.right;\r\n\r\n if (preferredHorizontalDir === 'right') {\r\n // We use preferred if possible.\r\n if (right >= 0) {\r\n return { dir: 'right', left: 0 };\r\n // Then the other one.\r\n } else if (left >= 0) {\r\n return { dir: 'left', left: 0 };\r\n // Edge case if neither direction can be used (ultra narrow screen).\r\n // Choose direction that covers least of parent menu.\r\n } else {\r\n return this.getNarrowScreenHorizontalDir(left, right);\r\n }\r\n } else {\r\n if (left >= 0) {\r\n return { dir: 'left', left: 0 };\r\n } else if (right >= 0) {\r\n return { dir: 'right', left: 0 };\r\n } else {\r\n return this.getNarrowScreenHorizontalDir(left, right);\r\n }\r\n }\r\n }\r\n\r\n // Finds out where to put menu in case screen is too narrow for two menus\r\n // to fit next to each other. Minimizes area of parent menu covered by this.\r\n private getNarrowScreenHorizontalDir(\r\n left: number,\r\n right: number\r\n ): HorDirWithOffset {\r\n const screenStart = this.topLevelMenu.bodyMargin.left;\r\n const screenEnd =\r\n this.topLevelMenu.clientSize.width - this.topLevelMenu.bodyMargin.right;\r\n const screenCenter = (screenStart - screenEnd) / 2;\r\n\r\n const leftStart = Math.max(this._anchorBox.left, screenStart);\r\n const leftEnd = Math.min(\r\n this._anchorBox.left + this._anchorBox.width,\r\n screenCenter\r\n );\r\n\r\n const rightStart = Math.max(screenCenter, leftEnd);\r\n const rightEnd = Math.min(\r\n this._anchorBox.left + this._anchorBox.width,\r\n screenEnd\r\n );\r\n\r\n if (leftEnd - leftStart > rightEnd - rightStart) {\r\n return { dir: 'right', left: right };\r\n } else {\r\n return { dir: 'left', left: -left };\r\n }\r\n }\r\n\r\n private getRealVerticalDir(\r\n preferredVerticalDir: RdtVerticalDirection\r\n ): VertDirWithOffset {\r\n let bottom: number;\r\n let top: number;\r\n\r\n if (this.level === 0) {\r\n bottom =\r\n this.topLevelMenu.clientSize.height +\r\n this._anchorBox.bottom -\r\n this._box.height;\r\n top = this._anchorBox.top - this._box.height;\r\n } else {\r\n bottom =\r\n this.topLevelMenu.clientSize.height -\r\n this._anchorBox.top -\r\n this._box.height;\r\n top = this._anchorBox.bottom - this._box.height;\r\n }\r\n\r\n top -= this.topLevelMenu.bodyMargin.top;\r\n bottom -= this.topLevelMenu.bodyMargin.bottom;\r\n\r\n if (preferredVerticalDir === 'down') {\r\n if (bottom >= 0) {\r\n return { dir: 'down', top: 0 };\r\n } else if (top >= 0) {\r\n return { dir: 'up', top: 0 };\r\n } else {\r\n return { dir: preferredVerticalDir, top: 0 };\r\n }\r\n } else {\r\n if (top >= 0) {\r\n return { dir: 'up', top: 0 };\r\n } else if (bottom >= 0) {\r\n return { dir: 'down', top: 0 };\r\n } else {\r\n return { dir: preferredVerticalDir, top: 0 };\r\n }\r\n }\r\n }\r\n\r\n // Measures bounding rect of this and offset container\r\n // Should always be called after parent menu has already been measured.\r\n private measureBoundingRect() {\r\n this._box = this.elRef.nativeElement.getBoundingClientRect();\r\n const anchor =\r\n this.anchorElement ?? this.elRef.nativeElement.parentElement!;\r\n this._anchorBox = anchor.getBoundingClientRect();\r\n }\r\n\r\n private measureContainerPadding() {\r\n const computedStyles = getComputedStyle(\r\n this.menuItemContainer.nativeElement\r\n );\r\n const paddingTop = parseFloat(computedStyles.paddingTop);\r\n const paddingBottom = parseFloat(computedStyles.paddingBottom);\r\n this._containerPadding = { top: paddingTop, bottom: paddingBottom };\r\n }\r\n\r\n private recalculateChildren() {\r\n if (this.expanded && this.horizontalDir && this.verticalDir) {\r\n this.children.forEach((child) =>\r\n child.recalculatePosition(\r\n this.horizontalDir!.dir,\r\n this.verticalDir!.dir\r\n )\r\n );\r\n }\r\n }\r\n\r\n private setClasses() {\r\n if (this.verticalDir) {\r\n if (this.verticalDir.dir === 'up') {\r\n this.setClass('rdt-overlay-up');\r\n this.removeClass('rdt-overlay-down');\r\n } else {\r\n this.removeClass('rdt-overlay-up');\r\n this.setClass('rdt-overlay-down');\r\n }\r\n this.setOffset('top', this.verticalDir.top);\r\n }\r\n\r\n if (this.horizontalDir) {\r\n if (this.horizontalDir.dir === 'left') {\r\n this.setClass('rdt-overlay-left');\r\n this.removeClass('rdt-overlay-right');\r\n } else {\r\n this.removeClass('rdt-overlay-left');\r\n this.setClass('rdt-overlay-right');\r\n }\r\n this.setOffset('left', this.horizontalDir.left);\r\n }\r\n\r\n if (this.isRootLevel) {\r\n this.setClass('rdt-menu-root');\r\n this.removeClass('rdt-menu-sub');\r\n } else {\r\n this.removeClass('rdt-menu-root');\r\n this.setClass('rdt-menu-sub');\r\n }\r\n }\r\n\r\n private setClass(className: string) {\r\n this.renderer.addClass(this.elRef.nativeElement, className);\r\n }\r\n\r\n private removeClass(className: string) {\r\n this.renderer.removeClass(this.elRef.nativeElement, className);\r\n }\r\n\r\n private setOffset(direction: 'top' | 'left', value: number) {\r\n this.renderer.setStyle(this.elRef.nativeElement, direction, `${value}px`);\r\n }\r\n\r\n private listenTabKeyPress() {\r\n const shiftTab = RdtShortcut.createUnsafe('shift', 'tab');\r\n const tab = RdtShortcut.createUnsafe('tab');\r\n this.shortcutService\r\n .listen([tab, shiftTab], {\r\n element: this.elRef.nativeElement,\r\n preventDefault: false,\r\n })\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((event) => this.onTabKeyPress(event));\r\n }\r\n}\r\n","<ul class=\"menu-item-container\" role=\"presentation\" #menuItemContainer>\r\n <li\r\n *ngFor=\"let item of item.items; let i = index\"\r\n role=\"presentation\"\r\n class=\"menu-item\"\r\n (rdtKeyListener)=\"onKeyDown(i, $event)\"\r\n rdtAnyRouteActive=\"menu-item-route-active\"\r\n [watchedRoutes]=\"getChildRoutes(item)\"\r\n #anchorEl\r\n >\r\n <ng-container *ngIf=\"!item.routerLink && !item.externalLink\">\r\n <button\r\n #focusableItem\r\n class=\"menu-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [attr.aria-haspopup]=\"item.items ? 'menu' : null\"\r\n [attr.aria-expanded]=\"item === expandedChild\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n {{ item.label }}\r\n\r\n <div class=\"menu-item-right-content\">\r\n <span *ngIf=\"item.shortcut\" class=\"menu-item-shortcut\">\r\n {{ item.shortcut.label }}\r\n </span>\r\n <!-- TODO:\r\n <vnsh-icon\r\n *ngIf=\"item.items\"\r\n name=\"chevron_right\"\r\n class=\"menu-item-icon\"\r\n />\r\n <vnsh-icon\r\n *ngIf=\"item.icon\"\r\n [name]=\"item.icon\"\r\n class=\"menu-item-icon\"\r\n />\r\n -->\r\n <span class=\"menu-item-icon\" *ngIf=\"item.items\">&gt;</span>\r\n </div>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-template #linkBody let-item>\r\n {{ item.label }}\r\n\r\n <div class=\"menu-item-right-content\">\r\n <span *ngIf=\"item.shortcut\" class=\"menu-item-shortcut\">\r\n {{ item.shortcut.label }}\r\n </span>\r\n <!-- TODO:\r\n <vnsh-icon\r\n *ngIf=\"item.icon\"\r\n [name]=\"item.icon\"\r\n class=\"menu-item-icon\"\r\n />\r\n --></div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"item.routerLink\">\r\n <a\r\n #focusableItem\r\n class=\"menu-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [routerLink]=\"item.routerLink\"\r\n [queryParams]=\"item.queryParams\"\r\n [target]=\"item.target\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"linkBody; context: { $implicit: item }\"\r\n />\r\n </a>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.externalLink\">\r\n <a\r\n #focusableItem\r\n class=\"menu-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [href]=\"item.externalLink\"\r\n [target]=\"item.target\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"linkBody; context: { $implicit: item }\"\r\n />\r\n </a>\r\n </ng-container>\r\n\r\n <!-- Child menus exist only if this menu is expanded. -->\r\n <!-- Only one invisible level is always attached to DOM, the rest does not exist. -->\r\n <rdt-menu-overlay\r\n *ngIf=\"item.items && expanded\"\r\n [item]=\"$any(item)\"\r\n [expanded]=\"item === expandedChild\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"horizontalDir?.dir!\"\r\n [preferredVerticalDir]=\"verticalDir?.dir!\"\r\n [level]=\"level + 1\"\r\n [anchorElement]=\"anchorEl\"\r\n />\r\n </li>\r\n</ul>\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectorRef,\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n EnvironmentInjector,\r\n HostBinding,\r\n HostListener,\r\n inject,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n QueryList,\r\n Renderer2,\r\n SimpleChanges,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n animationFrameScheduler,\r\n fromEvent,\r\n Subscription,\r\n throttleTime,\r\n} from 'rxjs';\r\nimport {\r\n DEFAULT_MENU_HORIZONTAL_DIR,\r\n DEFAULT_MENU_VERTICAL_DIR,\r\n RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME,\r\n RDT_MENU_MARGIN_LEFT_PROPERTY_NAME,\r\n RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME,\r\n RDT_MENU_MARGIN_TOP_PROPERTY_NAME,\r\n RdtMenuShortcutMode,\r\n} from '../models';\r\nimport {\r\n findNextItemWithPrefix,\r\n FOCUS_VISIBLE,\r\n getChildRoutesMap,\r\n getMenuItemsShortcuts,\r\n menuItemHasChildren,\r\n menuItemHasRoute,\r\n ParsedRdtMenuItemWithShortcut,\r\n Size,\r\n} from '../utils';\r\nimport { RdtRoute, RdtRouterService } from '@ngrdt/router';\r\nimport { RdtShortcut, RdtShortcutService } from '@ngrdt/shortcuts';\r\nimport { RdtMenuOverlayComponent } from '../menu-overlay/rdt-menu-overlay.component';\r\nimport { ParsedRdtMenuItem } from '../private-models';\r\nimport {\r\n KB_CODE,\r\n RdtHorizontalDirection,\r\n RdtStringUtils,\r\n RdtVerticalDirection,\r\n} from '@ngrdt/utils';\r\n\r\n@Directive()\r\nexport abstract class RdtMenuBaseComponent\r\n implements OnInit, OnChanges, AfterViewInit\r\n{\r\n @Input()\r\n preferredVerticalDir: RdtVerticalDirection = DEFAULT_MENU_VERTICAL_DIR;\r\n\r\n @Input()\r\n preferredHorizontalDir: RdtHorizontalDirection = DEFAULT_MENU_HORIZONTAL_DIR;\r\n\r\n // Mode only matters if item has shortcut and only children, no command nor routerLink\r\n // FOCUS_ITEM will put focus on item with shortcut\r\n // OPEN_SUBMENU will open its submenu and put focus on the first item in it\r\n // If item has command or routerLink, it will always be activated and everything closed\r\n @Input()\r\n shortcutMode: 'focus-item' | 'open-submenu' =\r\n RdtMenuShortcutMode.OPEN_SUBMENU;\r\n\r\n @Input({ transform: booleanAttribute })\r\n closeOnFocusOut = true;\r\n\r\n readonly cd = inject(ChangeDetectorRef);\r\n readonly destroyRef = inject(DestroyRef);\r\n protected readonly rdtRouter = inject(RdtRouterService);\r\n protected readonly elRef: ElementRef<HTMLElement> = inject(ElementRef);\r\n protected readonly document = inject(DOCUMENT);\r\n protected readonly renderer = inject(Renderer2);\r\n protected readonly router = inject(Router);\r\n protected readonly shortcutService = inject(RdtShortcutService);\r\n protected readonly injector = inject(EnvironmentInjector);\r\n\r\n @ViewChildren(RdtMenuOverlayComponent)\r\n protected children!: QueryList<RdtMenuOverlayComponent>;\r\n\r\n @ViewChildren('focusableItem')\r\n protected focusableElements!: QueryList<ElementRef<HTMLElement>>;\r\n\r\n @HostBinding('class')\r\n classes = 'rdt-menu-base';\r\n\r\n protected expanded: ParsedRdtMenuItem | null = null;\r\n protected autofocusSubmenuItem: 'first' | 'last' | null = null;\r\n protected parsedItems!: ParsedRdtMenuItem[];\r\n\r\n get clientSize() {\r\n return this._clientSize;\r\n }\r\n private _clientSize!: Size;\r\n\r\n get bodyMargin() {\r\n return this._bodyMargin;\r\n }\r\n private _bodyMargin!: {\r\n top: number;\r\n bottom: number;\r\n left: number;\r\n right: number;\r\n };\r\n\r\n protected allParsedItems!: ParsedRdtMenuItem[];\r\n protected childRoutesMap: Map<ParsedRdtMenuItem, string[][]> = new Map();\r\n protected shortcutSub = new Subscription();\r\n protected shortcutMap: Record<string, ParsedRdtMenuItem[]> = {};\r\n\r\n readonly keyActions = {\r\n [KB_CODE.ARROW.LEFT]: (index: number) => this.focusPrevItem(index),\r\n [KB_CODE.ARROW.RIGHT]: (index: number) => this.focusNextItem(index),\r\n [KB_CODE.ARROW.DOWN]: (index: number) => this.openSubmenu(index, 'first'),\r\n [KB_CODE.ARROW.UP]: (index: number) => this.openSubmenu(index, 'last'),\r\n [KB_CODE.HOME]: () => this.focusItem(0),\r\n [KB_CODE.END]: () => this.focusItem(this.parsedItems.length - 1),\r\n [KB_CODE.ENTER]: (index: number) => this.invokeItemClickByIndex(index),\r\n [KB_CODE.SPACEBAR]: (index: number) => this.invokeItemClickByIndex(index),\r\n };\r\n\r\n // Returns all routes asociated with item or its subitems.\r\n getChildRoutes(item: ParsedRdtMenuItem) {\r\n return this.childRoutesMap.get(item) ?? [];\r\n }\r\n\r\n ngOnInit() {\r\n this.childRoutesMap = getChildRoutesMap(this.parsedItems);\r\n this.rdtRouter.navigationEnd$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((ev) => this.filterItems());\r\n this.measure();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.children) {\r\n this.recalculateChildren();\r\n }\r\n if ('items' in changes) {\r\n this.childRoutesMap = getChildRoutesMap(this.parsedItems);\r\n this.listenShortcuts();\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.listenWindowResize();\r\n\r\n // Not using timeout results in horizontal overflow on html element\r\n setTimeout(() => {\r\n this.measure();\r\n this.recalculateChildren();\r\n }, 50);\r\n }\r\n\r\n recalculateChildren() {\r\n this.children.forEach((child) => {\r\n child.recalculatePosition(\r\n this.preferredHorizontalDir,\r\n this.preferredVerticalDir\r\n );\r\n });\r\n }\r\n\r\n closeSubmenus(focusExpanded = false) {\r\n if (focusExpanded && this.expanded) {\r\n this.focusItem(this.expanded);\r\n }\r\n this.expanded = null;\r\n this.cd.markForCheck();\r\n }\r\n\r\n protected onItemClick(item: ParsedRdtMenuItem) {\r\n if (menuItemHasChildren(item) && this.expanded !== item) {\r\n this.autofocusSubmenuItem = null;\r\n this.expanded = item;\r\n } else {\r\n this.expanded = null;\r\n }\r\n if (typeof item.command === 'function') {\r\n item.command();\r\n }\r\n }\r\n\r\n protected onKeyDown(itemIndex: number, event: KeyboardEvent) {\r\n const hasAction = event.code in this.keyActions;\r\n const isLetter =\r\n RdtStringUtils.isAlphabetCharacter(event.key) ||\r\n RdtStringUtils.isNumericCharacter(event.key);\r\n\r\n if (hasAction || isLetter) {\r\n event.preventDefault();\r\n }\r\n\r\n if (hasAction) {\r\n event.stopPropagation();\r\n }\r\n\r\n if (hasAction) {\r\n this.keyActions[event.code](itemIndex);\r\n } else if (isLetter) {\r\n const next = findNextItemWithPrefix(\r\n this.parsedItems,\r\n itemIndex,\r\n event.key\r\n );\r\n if (next !== null) {\r\n this.focusItem(next);\r\n }\r\n }\r\n }\r\n\r\n protected invokeItemClick(item: ParsedRdtMenuItem) {\r\n if (menuItemHasRoute(item) && item.routerLink) {\r\n this.router.navigate(item.routerLink);\r\n }\r\n this.onItemClick(item);\r\n this.autofocusSubmenuItem = 'first';\r\n }\r\n\r\n protected filterItems() {\r\n const current = this.rdtRouter.parseAbsoluteUrl();\r\n if (!current) {\r\n this.parsedItems = this.allParsedItems;\r\n } else {\r\n this.parsedItems = this.filterRec(this.allParsedItems, current);\r\n }\r\n this.cd.markForCheck();\r\n }\r\n\r\n protected filterRec(\r\n items: ParsedRdtMenuItem[],\r\n current: { route: RdtRoute; params: Record<string, any> }\r\n ): ParsedRdtMenuItem[] {\r\n let currentParent = current.route;\r\n const currentParams = current.params;\r\n\r\n const filtered = items.filter((item) => {\r\n if (!item.requiredParent) {\r\n return true;\r\n }\r\n const required = item.requiredParent;\r\n while (currentParent.absolutePath !== required.absolutePath) {\r\n currentParent = currentParent.parent!;\r\n if (!currentParent) {\r\n return false;\r\n }\r\n }\r\n let requiredParent: RdtRoute | null = required;\r\n do {\r\n const path = requiredParent.absolutePath;\r\n if (path in currentParams) {\r\n for (const key in requiredParent.staticParams) {\r\n if (currentParams[path][key] !== requiredParent.staticParams[key]) {\r\n return false;\r\n }\r\n }\r\n }\r\n requiredParent = requiredParent.parent;\r\n } while (requiredParent);\r\n return true;\r\n });\r\n\r\n return filtered.map((item) => {\r\n if (item.items) {\r\n return {\r\n ...item,\r\n items: this.filterRec(item.items, current),\r\n };\r\n } else {\r\n return item;\r\n }\r\n });\r\n }\r\n\r\n protected invokeItemClickByIndex(itemIndex: number) {\r\n const item = this.parsedItems[itemIndex];\r\n if (!item) {\r\n return;\r\n }\r\n this.invokeItemClick(item);\r\n }\r\n\r\n protected openSubmenu(itemIndex: number, visibleFocus: 'first' | 'last') {\r\n if (\r\n itemIndex < this.parsedItems.length &&\r\n menuItemHasChildren(this.parsedItems[itemIndex])\r\n ) {\r\n const item = this.parsedItems[itemIndex];\r\n this.autofocusSubmenuItem = visibleFocus;\r\n this.expanded = item;\r\n }\r\n }\r\n\r\n protected focusItem(item: number | ParsedRdtMenuItem) {\r\n let itemIndex: number;\r\n\r\n if (typeof item === 'number') {\r\n itemIndex = item;\r\n } else {\r\n itemIndex = this.parsedItems.indexOf(item);\r\n }\r\n\r\n if (itemIndex >= 0 && itemIndex < this.focusableElements.length) {\r\n this.blurAllFocusable();\r\n this.focusFocusable(itemIndex);\r\n }\r\n }\r\n\r\n protected focusNextItem(itemIndex: number) {\r\n const next = (itemIndex + 1) % this.parsedItems.length;\r\n this.focusItem(next);\r\n }\r\n\r\n protected focusPrevItem(itemIndex: number) {\r\n const prev =\r\n (itemIndex - 1 + this.parsedItems.length) % this.parsedItems.length;\r\n this.focusItem(prev);\r\n }\r\n\r\n protected blurAllFocusable() {\r\n this.focusableElements.forEach((el) =>\r\n this.renderer.removeClass(el.nativeElement, FOCUS_VISIBLE)\r\n );\r\n }\r\n\r\n protected focusFocusable(itemIndex: number) {\r\n const elRef = this.focusableElements.get(itemIndex);\r\n if (elRef) {\r\n this.renderer.addClass(elRef.nativeElement, FOCUS_VISIBLE);\r\n elRef.nativeElement.focus();\r\n }\r\n }\r\n\r\n // Closes menu if user navigates outside it using Tab.\r\n @HostListener('window:focusout', ['$event'])\r\n protected checkActiveElement(event: FocusEvent) {\r\n if (this.closeOnFocusOut) {\r\n const thisEl = this.elRef.nativeElement;\r\n const target = event.relatedTarget;\r\n if (!(target instanceof HTMLElement) || !thisEl.contains(target)) {\r\n this.expanded = null;\r\n }\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n protected onDocumentClick(event: PointerEvent) {\r\n const target = event.target as HTMLElement;\r\n const elRef = this.elRef.nativeElement;\r\n if (!elRef.contains(target)) {\r\n this.closeSubmenus();\r\n }\r\n }\r\n\r\n protected measure() {\r\n this.measureClientSize();\r\n this.readMargin();\r\n }\r\n\r\n protected readMargin() {\r\n const computedStyle = getComputedStyle(this.elRef.nativeElement);\r\n const topVal = computedStyle.getPropertyValue(\r\n RDT_MENU_MARGIN_TOP_PROPERTY_NAME\r\n );\r\n const bottomVal = computedStyle.getPropertyValue(\r\n RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME\r\n );\r\n const leftVal = computedStyle.getPropertyValue(\r\n RDT_MENU_MARGIN_LEFT_PROPERTY_NAME\r\n );\r\n const rightVal = computedStyle.getPropertyValue(\r\n RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME\r\n );\r\n this._bodyMargin = {\r\n top: parseInt(topVal) || 0,\r\n bottom: parseInt(bottomVal) || 0,\r\n left: parseInt(leftVal) || 0,\r\n right: parseInt(rightVal) || 0,\r\n };\r\n }\r\n\r\n protected measureClientSize() {\r\n this._clientSize = {\r\n width: this.document.body.clientWidth,\r\n height: this.document.body.clientHeight,\r\n };\r\n }\r\n\r\n protected listenWindowResize() {\r\n fromEvent(window, 'resize')\r\n .pipe(\r\n throttleTime(0, animationFrameScheduler, { trailing: true }),\r\n takeUntilDestroyed(this.destroyRef)\r\n )\r\n .subscribe(() => {\r\n this.measure();\r\n this.recalculateChildren();\r\n });\r\n }\r\n\r\n protected listenShortcuts() {\r\n const itemsWithShortcuts = getMenuItemsShortcuts(this.parsedItems);\r\n const shortcuts: RdtShortcut[] = itemsWithShortcuts.map(\r\n (it) => it.shortcut\r\n );\r\n\r\n this.shortcutMap = this.getShortcutMap(itemsWithShortcuts);\r\n this.shortcutSub.unsubscribe();\r\n this.shortcutSub = this.shortcutService\r\n .listen(shortcuts)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((evt) => this.onShortcut(evt.shortcut));\r\n }\r\n\r\n protected getShortcutMap(\r\n itemsWithShortcuts: ParsedRdtMenuItemWithShortcut[]\r\n ) {\r\n const shortcutMap: Record<string, ParsedRdtMenuItem[]> = {};\r\n itemsWithShortcuts.forEach((item) => {\r\n shortcutMap[item.shortcut.hotkeysValue] = item.path;\r\n });\r\n return shortcutMap;\r\n }\r\n\r\n protected onShortcut(shortcut: RdtShortcut) {\r\n const path = this.shortcutMap[shortcut.hotkeysValue];\r\n if (!path) {\r\n console.warn(\r\n `Menu shortcut ${shortcut.hotkeysValue} was detected, but there is no path associated with it.`,\r\n this.shortcutMap\r\n );\r\n }\r\n const last = path[path.length - 1];\r\n const hasRoute = menuItemHasRoute(last);\r\n const hasCommand = typeof last.command === 'function';\r\n if (hasRoute || hasCommand) {\r\n this.closeSubmenus(false);\r\n if (hasCommand) {\r\n last.command!();\r\n }\r\n if (hasRoute) {\r\n this.router.navigate(last.routerLink!);\r\n }\r\n } else {\r\n this.activateItemRecursively(path);\r\n }\r\n }\r\n\r\n protected activateItemRecursively(path: ParsedRdtMenuItem[]) {\r\n const children = [...path];\r\n\r\n if (this.shortcutMode === RdtMenuShortcutMode.OPEN_SUBMENU) {\r\n const last = children[children.length - 1];\r\n if (menuItemHasChildren(last) && last.items[0]) {\r\n children.push(last.items[0]);\r\n }\r\n }\r\n\r\n const thisItem = children.shift()!;\r\n\r\n if (children.length > 0) {\r\n this.expanded = thisItem;\r\n const overlay = this.children.find((child) => child.item === thisItem);\r\n overlay!.focusItemRecursively(children);\r\n } else {\r\n this.expanded = null;\r\n this.focusItem(thisItem);\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n Input,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { RdtMenuItem } from '../models';\r\nimport { parseMenuItems } from '../private-models';\r\nimport { RdtMenuBaseComponent } from '../menu-base/rdt-menu-base.component';\r\nimport {\r\n RDT_BUTTON_BASE_PROVIDER,\r\n RdtButtonBase,\r\n RdtButtonBaseInt,\r\n} from '@ngrdt/button';\r\n\r\n@Component({\r\n selector: 'rdt-menu',\r\n templateUrl: './rdt-menu.component.html',\r\n styleUrl: './rdt-menu.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: RdtMenuBaseComponent,\r\n useExisting: RdtMenuComponent,\r\n },\r\n ],\r\n})\r\nexport class RdtMenuComponent extends RdtMenuBaseComponent {\r\n protected readonly buttonClass = inject(RDT_BUTTON_BASE_PROVIDER);\r\n\r\n @Input()\r\n dataTestId = '';\r\n\r\n @Input({ required: true })\r\n get item() {\r\n return this._item;\r\n }\r\n set item(value: RdtMenuItem) {\r\n this._item = value;\r\n this.allParsedItems = parseMenuItems([value], this.injector);\r\n this.filterItems();\r\n }\r\n private _item!: RdtMenuItem;\r\n\r\n @ViewChild(RdtButtonBase, { static: true })\r\n button!: RdtButtonBaseInt;\r\n\r\n get parsedItem() {\r\n return this.parsedItems[0];\r\n }\r\n\r\n get buttonInputs(): Record<string, any> {\r\n return {\r\n 'attr.role': 'menuitem',\r\n 'attr.aria-haspopup': 'menu',\r\n 'attr.aria-expanded': this.expanded === this.parsedItem,\r\n tabIndex: 0,\r\n dataTestId: this.dataTestId,\r\n text: this.parsedItem.label,\r\n icon: this.parsedItem.icon,\r\n };\r\n }\r\n}\r\n","<ng-container\r\n #focusableItem\r\n *ngComponentOutlet=\"buttonClass; inputs: buttonInputs\"\r\n/>\r\n\r\n<rdt-menu-overlay\r\n *ngIf=\"parsedItem\"\r\n [item]=\"$any(parsedItem)\"\r\n [expanded]=\"expanded === parsedItem\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"preferredHorizontalDir\"\r\n [preferredVerticalDir]=\"preferredVerticalDir\"\r\n [level]=\"0\"\r\n/>\r\n<!-- TODO: Fix\r\n<rdt-menu-overlay\r\n *ngIf=\"parsedItem\"\r\n [anchorElement]=\"focusableItem.elRef.nativeElement\"\r\n [item]=\"$any(parsedItem)\"\r\n [expanded]=\"expanded === parsedItem\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"preferredHorizontalDir\"\r\n [preferredVerticalDir]=\"preferredVerticalDir\"\r\n [level]=\"0\"\r\n/>\r\n-->\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n numberAttribute,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { RdtMenuBaseComponent } from '../menu-base/rdt-menu-base.component';\r\nimport { RdtMenuItem } from '../models';\r\nimport { parseMenuItems } from '../private-models';\r\n\r\n@Component({\r\n selector: 'rdt-menu-bar',\r\n templateUrl: './rdt-menu-bar.component.html',\r\n styleUrl: './rdt-menu-bar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: RdtMenuBaseComponent,\r\n useExisting: RdtMenuBarComponent,\r\n },\r\n ],\r\n})\r\nexport class RdtMenuBarComponent extends RdtMenuBaseComponent {\r\n @Input()\r\n get items() {\r\n return this._items;\r\n }\r\n set items(value: RdtMenuItem[]) {\r\n this._items = value;\r\n this.allParsedItems = parseMenuItems(value, this.injector);\r\n this.filterItems();\r\n }\r\n private _items!: RdtMenuItem[];\r\n\r\n @Input({ transform: numberAttribute })\r\n headerHeight = 0;\r\n\r\n @Input({ transform: numberAttribute })\r\n footerHeight = 0;\r\n\r\n @HostBinding('attr.role')\r\n private roleAttr = 'menubar';\r\n}\r\n","<ul class=\"menu-bar-item-container\" role=\"presentation\">\r\n <li\r\n *ngFor=\"let item of parsedItems; let i = index\"\r\n class=\"menu-bar-item\"\r\n role=\"presentation\"\r\n rdtAnyRouteActive=\"menu-bar-item-route-active\"\r\n [watchedRoutes]=\"getChildRoutes(item)\"\r\n (rdtKeyListener)=\"onKeyDown(i, $event)\"\r\n #anchorEl\r\n >\r\n <ng-container *ngIf=\"!item.routerLink && !item.externalLink\">\r\n <button\r\n #focusableItem\r\n class=\"menu-bar-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [attr.aria-haspopup]=\"item.items ? 'menu' : null\"\r\n [attr.aria-expanded]=\"item === expanded\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n {{ item.label }}\r\n\r\n <div class=\"menu-bar-item-right-content\">\r\n <span *ngIf=\"item.shortcut\" class=\"menu-item-shortcut\">\r\n {{ item.shortcut.label }}\r\n </span>\r\n <!-- TODO\r\n <vnsh-icon\r\n *ngIf=\"item.items\"\r\n name=\"expand_more\"\r\n class=\"menu-bar-item-icon\"\r\n inverted\r\n />\r\n <vnsh-icon\r\n *ngIf=\"item.icon\"\r\n [name]=\"item.icon\"\r\n class=\"menu-bar-item-icon\"\r\n inverted\r\n />\r\n -->\r\n <span class=\"menu-bar-item-icon\" *ngIf=\"item.items\">v</span>\r\n </div>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-template #linkBody let-item>\r\n {{ item.label }}\r\n\r\n <div class=\"menu-bar-item-right-content\">\r\n <span *ngIf=\"item.shortcut\" class=\"menu-item-shortcut\">\r\n {{ item.shortcut.label }}\r\n </span>\r\n <!--\r\n <vnsh-icon\r\n *ngIf=\"item.icon\"\r\n [name]=\"item.icon\"\r\n class=\"menu-bar-item-icon\"\r\n inverted\r\n />\r\n --></div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"item.routerLink\">\r\n <a\r\n #focusableItem\r\n class=\"menu-bar-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [routerLink]=\"item.routerLink\"\r\n [target]=\"item.target!\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"linkBody; context: { $implicit: item }\"\r\n />\r\n </a>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.externalLink\">\r\n <a\r\n #focusableItem\r\n class=\"menu-bar-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [href]=\"item.externalLink\"\r\n [target]=\"item.target\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"linkBody; context: { $implicit: item }\"\r\n />\r\n </a>\r\n </ng-container>\r\n\r\n <rdt-menu-overlay\r\n *ngIf=\"item.items\"\r\n [item]=\"$any(item)\"\r\n [expanded]=\"item === expanded\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"preferredHorizontalDir\"\r\n [preferredVerticalDir]=\"preferredVerticalDir\"\r\n [level]=\"0\"\r\n [anchorElement]=\"anchorEl\"\r\n />\r\n </li>\r\n</ul>\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { RdtMenuOverlayComponent } from './menu-overlay/rdt-menu-overlay.component';\r\nimport { RdtKeyListenerDirective } from '@ngrdt/shortcuts';\r\nimport { RdtAnyRouteActiveDirective } from '@ngrdt/router';\r\nimport { RdtMenuComponent } from './menu/rdt-menu.component';\r\nimport { RdtMenuBarComponent } from './menu-bar/rdt-menu-bar.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n RdtAnyRouteActiveDirective,\r\n RdtKeyListenerDirective,\r\n ],\r\n declarations: [\r\n RdtMenuOverlayComponent,\r\n RdtMenuComponent,\r\n RdtMenuBarComponent,\r\n ],\r\n exports: [RdtMenuComponent, RdtMenuBarComponent],\r\n})\r\nexport class RdtMenuModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2.RdtMenuOverlayComponent","i5.RdtMenuOverlayComponent"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from './lib/menu/rdt-menu.component';
2
+ export * from './lib/menu-bar/rdt-menu-bar.component';
3
+ export * from './lib/models';
4
+ export * from './lib/rdt-menu.module';
@@ -0,0 +1,16 @@
1
+ import { RdtMenuItem } from '../models';
2
+ import { RdtMenuBaseComponent } from '../menu-base/rdt-menu-base.component';
3
+ import { RdtButtonBaseInt } from '@ngrdt/button';
4
+ import * as i0 from "@angular/core";
5
+ export declare class RdtMenuComponent extends RdtMenuBaseComponent {
6
+ protected readonly buttonClass: import("@angular/core").Type<RdtButtonBaseInt<string>>;
7
+ dataTestId: string;
8
+ get item(): RdtMenuItem;
9
+ set item(value: RdtMenuItem);
10
+ private _item;
11
+ button: RdtButtonBaseInt;
12
+ get parsedItem(): import("../private-models").ParsedRdtMenuItem;
13
+ get buttonInputs(): Record<string, any>;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtMenuComponent, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<RdtMenuComponent, "rdt-menu", never, { "dataTestId": { "alias": "dataTestId"; "required": false; }; "item": { "alias": "item"; "required": true; }; }, {}, never, never, false, never>;
16
+ }
@@ -0,0 +1,15 @@
1
+ import { RdtMenuBaseComponent } from '../menu-base/rdt-menu-base.component';
2
+ import { RdtMenuItem } from '../models';
3
+ import * as i0 from "@angular/core";
4
+ export declare class RdtMenuBarComponent extends RdtMenuBaseComponent {
5
+ get items(): RdtMenuItem[];
6
+ set items(value: RdtMenuItem[]);
7
+ private _items;
8
+ headerHeight: number;
9
+ footerHeight: number;
10
+ private roleAttr;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtMenuBarComponent, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<RdtMenuBarComponent, "rdt-menu-bar", never, { "items": { "alias": "items"; "required": false; }; "headerHeight": { "alias": "headerHeight"; "required": false; }; "footerHeight": { "alias": "footerHeight"; "required": false; }; }, {}, never, never, false, never>;
13
+ static ngAcceptInputType_headerHeight: unknown;
14
+ static ngAcceptInputType_footerHeight: unknown;
15
+ }
@@ -0,0 +1,81 @@
1
+ import { AfterViewInit, ChangeDetectorRef, DestroyRef, ElementRef, EnvironmentInjector, OnChanges, OnInit, QueryList, Renderer2, SimpleChanges } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { Subscription } from 'rxjs';
4
+ import { ParsedRdtMenuItemWithShortcut, Size } from '../utils';
5
+ import { RdtRoute, RdtRouterService } from '@ngrdt/router';
6
+ import { RdtShortcut, RdtShortcutService } from '@ngrdt/shortcuts';
7
+ import { RdtMenuOverlayComponent } from '../menu-overlay/rdt-menu-overlay.component';
8
+ import { ParsedRdtMenuItem } from '../private-models';
9
+ import { RdtHorizontalDirection, RdtVerticalDirection } from '@ngrdt/utils';
10
+ import * as i0 from "@angular/core";
11
+ export declare abstract class RdtMenuBaseComponent implements OnInit, OnChanges, AfterViewInit {
12
+ preferredVerticalDir: RdtVerticalDirection;
13
+ preferredHorizontalDir: RdtHorizontalDirection;
14
+ shortcutMode: 'focus-item' | 'open-submenu';
15
+ closeOnFocusOut: boolean;
16
+ readonly cd: ChangeDetectorRef;
17
+ readonly destroyRef: DestroyRef;
18
+ protected readonly rdtRouter: RdtRouterService;
19
+ protected readonly elRef: ElementRef<HTMLElement>;
20
+ protected readonly document: Document;
21
+ protected readonly renderer: Renderer2;
22
+ protected readonly router: Router;
23
+ protected readonly shortcutService: RdtShortcutService;
24
+ protected readonly injector: EnvironmentInjector;
25
+ protected children: QueryList<RdtMenuOverlayComponent>;
26
+ protected focusableElements: QueryList<ElementRef<HTMLElement>>;
27
+ classes: string;
28
+ protected expanded: ParsedRdtMenuItem | null;
29
+ protected autofocusSubmenuItem: 'first' | 'last' | null;
30
+ protected parsedItems: ParsedRdtMenuItem[];
31
+ get clientSize(): Size;
32
+ private _clientSize;
33
+ get bodyMargin(): {
34
+ top: number;
35
+ bottom: number;
36
+ left: number;
37
+ right: number;
38
+ };
39
+ private _bodyMargin;
40
+ protected allParsedItems: ParsedRdtMenuItem[];
41
+ protected childRoutesMap: Map<ParsedRdtMenuItem, string[][]>;
42
+ protected shortcutSub: Subscription;
43
+ protected shortcutMap: Record<string, ParsedRdtMenuItem[]>;
44
+ readonly keyActions: {
45
+ [x: string]: (index: number) => void;
46
+ };
47
+ getChildRoutes(item: ParsedRdtMenuItem): string[][];
48
+ ngOnInit(): void;
49
+ ngOnChanges(changes: SimpleChanges): void;
50
+ ngAfterViewInit(): void;
51
+ recalculateChildren(): void;
52
+ closeSubmenus(focusExpanded?: boolean): void;
53
+ protected onItemClick(item: ParsedRdtMenuItem): void;
54
+ protected onKeyDown(itemIndex: number, event: KeyboardEvent): void;
55
+ protected invokeItemClick(item: ParsedRdtMenuItem): void;
56
+ protected filterItems(): void;
57
+ protected filterRec(items: ParsedRdtMenuItem[], current: {
58
+ route: RdtRoute;
59
+ params: Record<string, any>;
60
+ }): ParsedRdtMenuItem[];
61
+ protected invokeItemClickByIndex(itemIndex: number): void;
62
+ protected openSubmenu(itemIndex: number, visibleFocus: 'first' | 'last'): void;
63
+ protected focusItem(item: number | ParsedRdtMenuItem): void;
64
+ protected focusNextItem(itemIndex: number): void;
65
+ protected focusPrevItem(itemIndex: number): void;
66
+ protected blurAllFocusable(): void;
67
+ protected focusFocusable(itemIndex: number): void;
68
+ protected checkActiveElement(event: FocusEvent): void;
69
+ protected onDocumentClick(event: PointerEvent): void;
70
+ protected measure(): void;
71
+ protected readMargin(): void;
72
+ protected measureClientSize(): void;
73
+ protected listenWindowResize(): void;
74
+ protected listenShortcuts(): void;
75
+ protected getShortcutMap(itemsWithShortcuts: ParsedRdtMenuItemWithShortcut[]): Record<string, ParsedRdtMenuItem[]>;
76
+ protected onShortcut(shortcut: RdtShortcut): void;
77
+ protected activateItemRecursively(path: ParsedRdtMenuItem[]): void;
78
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtMenuBaseComponent, never>;
79
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RdtMenuBaseComponent, never, never, { "preferredVerticalDir": { "alias": "preferredVerticalDir"; "required": false; }; "preferredHorizontalDir": { "alias": "preferredHorizontalDir"; "required": false; }; "shortcutMode": { "alias": "shortcutMode"; "required": false; }; "closeOnFocusOut": { "alias": "closeOnFocusOut"; "required": false; }; }, {}, never, never, false, never>;
80
+ static ngAcceptInputType_closeOnFocusOut: unknown;
81
+ }
@@ -0,0 +1,80 @@
1
+ import { AfterViewInit, DestroyRef, ElementRef, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
+ import { RdtHorizontalDirection, RdtVerticalDirection } from '@ngrdt/utils';
3
+ import { ParsedRdtMenuItem, ParsedRdtMenuItemWithChildren } from '../private-models';
4
+ import { HorDirWithOffset, VertDirWithOffset } from '../utils';
5
+ import * as i0 from "@angular/core";
6
+ export declare class RdtMenuOverlayComponent implements OnInit, OnChanges, AfterViewInit {
7
+ readonly elRef: ElementRef<HTMLElement>;
8
+ readonly destroyRef: DestroyRef;
9
+ private readonly renderer;
10
+ private readonly topLevelMenu;
11
+ private readonly parentMenu;
12
+ private readonly cd;
13
+ private readonly router;
14
+ private readonly document;
15
+ private readonly shortcutService;
16
+ private children;
17
+ private focusableElements;
18
+ private menuItemContainer;
19
+ item: ParsedRdtMenuItemWithChildren;
20
+ level: number;
21
+ preferredHorizontalDir: RdtHorizontalDirection;
22
+ preferredVerticalDir: RdtVerticalDirection;
23
+ expanded: boolean;
24
+ autofocusItem: 'first' | 'last' | null;
25
+ anchorElement?: HTMLElement;
26
+ private roleAttr;
27
+ private tabindexAttr;
28
+ get zIndex(): number;
29
+ get isRootLevel(): boolean;
30
+ private _box;
31
+ get box(): DOMRect;
32
+ private _anchorBox;
33
+ private _containerPadding;
34
+ private _viewWasInit;
35
+ protected verticalDir: VertDirWithOffset | null;
36
+ protected horizontalDir: HorDirWithOffset | null;
37
+ protected expandedChild: ParsedRdtMenuItem | null;
38
+ protected autofocusSubmenuItem: 'first' | 'last' | null;
39
+ readonly keyActions: {
40
+ [x: string]: (index: number) => void;
41
+ };
42
+ ngOnInit(): void;
43
+ ngOnChanges(changes: SimpleChanges): void;
44
+ ngAfterViewInit(): void;
45
+ private getMinOffsetLeft;
46
+ private getMaxOffsetLeft;
47
+ private getMinOffsetTop;
48
+ private getMaxOffsetTop;
49
+ recalculatePosition(preferredHorizontalDir: RdtHorizontalDirection, preferredVerticalDir: RdtVerticalDirection): void;
50
+ onItemClick(item: ParsedRdtMenuItem): void;
51
+ invokeItemClick(item: ParsedRdtMenuItem): void;
52
+ getChildRoutes(item: ParsedRdtMenuItem): string[][];
53
+ closeSubmenus(focusExpanded?: boolean): void;
54
+ focusItemRecursively(path: ParsedRdtMenuItem[]): void;
55
+ private expandAndGetChild;
56
+ protected onKeyDown(itemIndex: number, event: KeyboardEvent): void;
57
+ private onTabKeyPress;
58
+ private invokeItemClickByIndex;
59
+ private focusItem;
60
+ private blurAllFocusable;
61
+ private focusFocusable;
62
+ private focusNextItem;
63
+ private focusPrevItem;
64
+ private openSubmenu;
65
+ private closeSelf;
66
+ private checkActiveElement;
67
+ private getRealHorizontalDir;
68
+ private getNarrowScreenHorizontalDir;
69
+ private getRealVerticalDir;
70
+ private measureBoundingRect;
71
+ private measureContainerPadding;
72
+ private recalculateChildren;
73
+ private setClasses;
74
+ private setClass;
75
+ private removeClass;
76
+ private setOffset;
77
+ private listenTabKeyPress;
78
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtMenuOverlayComponent, never>;
79
+ static ɵcmp: i0.ɵɵComponentDeclaration<RdtMenuOverlayComponent, "rdt-menu-overlay", never, { "item": { "alias": "item"; "required": false; }; "level": { "alias": "level"; "required": false; }; "preferredHorizontalDir": { "alias": "preferredHorizontalDir"; "required": false; }; "preferredVerticalDir": { "alias": "preferredVerticalDir"; "required": false; }; "expanded": { "alias": "expanded"; "required": false; }; "autofocusItem": { "alias": "autofocusItem"; "required": false; }; "anchorElement": { "alias": "anchorElement"; "required": false; }; }, {}, never, never, false, never>;
80
+ }
@@ -0,0 +1,35 @@
1
+ import { RdtRoute } from '@ngrdt/router';
2
+ import { RdtMenuItemBase } from './private-models';
3
+ import { RdtHorizontalDirection, RdtVerticalDirection, WindowOpenTargetType } from '@ngrdt/utils';
4
+ import { InjectionToken } from '@angular/core';
5
+ export interface RdtMenuItemWithRoute extends RdtMenuItemBase {
6
+ items?: never;
7
+ routerLink?: RdtRoute;
8
+ externalLink?: never;
9
+ target?: never;
10
+ }
11
+ export interface RdtMenuItemWithLink extends RdtMenuItemBase {
12
+ items?: never;
13
+ externalLink: string;
14
+ routerLink?: never;
15
+ target?: WindowOpenTargetType;
16
+ }
17
+ export interface RdtMenuItemWithChildren extends RdtMenuItemBase {
18
+ items: RdtMenuItem[];
19
+ routerLink?: never;
20
+ externalLink?: never;
21
+ target?: WindowOpenTargetType;
22
+ }
23
+ export type RdtMenuItem = RdtMenuItemWithChildren | RdtMenuItemWithRoute | RdtMenuItemWithLink;
24
+ export declare enum RdtMenuShortcutMode {
25
+ FOCUS_ITEM = "focus-item",
26
+ OPEN_SUBMENU = "open-submenu"
27
+ }
28
+ export declare const RDT_MENU_MARGIN_TOP_PROPERTY_NAME = "--rdt-menu-margin-top";
29
+ export declare const RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME = "--rdt-menu-margin-bottom";
30
+ export declare const RDT_MENU_MARGIN_LEFT_PROPERTY_NAME = "--rdt-menu-margin-left";
31
+ export declare const RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME = "--rdt-menu-margin-right";
32
+ export declare const DEFAULT_MENU_HORIZONTAL_DIR = "left";
33
+ export declare const DEFAULT_MENU_VERTICAL_DIR = "down";
34
+ export declare const RDT_MENU_HORIZONTAL_DIR_PROVIDER: InjectionToken<RdtHorizontalDirection>;
35
+ export declare const RDT_MENU_VERTICAL_DIR_PROVIDER: InjectionToken<RdtVerticalDirection>;
@@ -0,0 +1,43 @@
1
+ import { RdtRoute } from '@ngrdt/router';
2
+ import { RdtShortcut } from '@ngrdt/shortcuts';
3
+ import { WindowOpenTargetType } from '@ngrdt/utils';
4
+ import { RdtMenuItem } from './models';
5
+ import { Injector } from '@angular/core';
6
+ export interface RdtMenuItemBase<TIcon = string> {
7
+ label: string;
8
+ icon?: TIcon;
9
+ shortcut?: RdtShortcut;
10
+ command?: () => void;
11
+ visible?: () => boolean;
12
+ queryParams?: {
13
+ [key: string]: any;
14
+ };
15
+ requiredParent?: RdtRoute;
16
+ dataTestId?: string;
17
+ }
18
+ export interface ParsedRdtMenuItemWithChildren<TIcon = string> extends RdtMenuItemBase<TIcon> {
19
+ items: ParsedRdtMenuItem[];
20
+ dataTestId: string;
21
+ routerLink?: never;
22
+ externalLink?: never;
23
+ icon?: never;
24
+ target?: never;
25
+ }
26
+ export interface ParsedRdtMenuItemWithRoute<TIcon = string> extends RdtMenuItemBase<TIcon> {
27
+ dataTestId: string;
28
+ items?: never;
29
+ routerLink?: string[];
30
+ externalLink?: never;
31
+ icon?: TIcon;
32
+ target: WindowOpenTargetType;
33
+ }
34
+ export interface ParsedRdtMenuItemWithLink<TIcon = string> extends RdtMenuItemBase<TIcon> {
35
+ dataTestId: string;
36
+ items?: never;
37
+ routerLink?: never;
38
+ externalLink?: string;
39
+ icon?: TIcon;
40
+ target: WindowOpenTargetType;
41
+ }
42
+ export type ParsedRdtMenuItem = ParsedRdtMenuItemWithRoute | ParsedRdtMenuItemWithChildren | ParsedRdtMenuItemWithLink;
43
+ export declare function parseMenuItems(items: RdtMenuItem[], injector: Injector, prefix?: string): ParsedRdtMenuItem[];
@@ -0,0 +1,13 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./menu-overlay/rdt-menu-overlay.component";
3
+ import * as i2 from "./menu/rdt-menu.component";
4
+ import * as i3 from "./menu-bar/rdt-menu-bar.component";
5
+ import * as i4 from "@angular/common";
6
+ import * as i5 from "@angular/router";
7
+ import * as i6 from "@ngrdt/router";
8
+ import * as i7 from "@ngrdt/shortcuts";
9
+ export declare class RdtMenuModule {
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtMenuModule, never>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<RdtMenuModule, [typeof i1.RdtMenuOverlayComponent, typeof i2.RdtMenuComponent, typeof i3.RdtMenuBarComponent], [typeof i4.CommonModule, typeof i5.RouterModule, typeof i6.RdtAnyRouteActiveDirective, typeof i7.RdtKeyListenerDirective], [typeof i2.RdtMenuComponent, typeof i3.RdtMenuBarComponent]>;
12
+ static ɵinj: i0.ɵɵInjectorDeclaration<RdtMenuModule>;
13
+ }
package/lib/utils.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ import { RdtShortcut } from '@ngrdt/shortcuts';
2
+ import { Nullable, RdtHorizontalDirection, RdtVerticalDirection } from '@ngrdt/utils';
3
+ import { ParsedRdtMenuItem, ParsedRdtMenuItemWithChildren, ParsedRdtMenuItemWithRoute } from './private-models';
4
+ export declare const INVISIBLE_CLASS = "invisible";
5
+ export declare const FOCUS_VISIBLE = "focus-visible";
6
+ export interface Size {
7
+ width: number;
8
+ height: number;
9
+ }
10
+ export interface VertOffset {
11
+ top: number;
12
+ bottom: number;
13
+ }
14
+ export interface HorOffset {
15
+ left: number;
16
+ right: number;
17
+ }
18
+ export interface VertDirWithOffset {
19
+ dir: RdtVerticalDirection;
20
+ top: number;
21
+ }
22
+ export interface HorDirWithOffset {
23
+ dir: RdtHorizontalDirection;
24
+ left: number;
25
+ }
26
+ export interface ParsedRdtMenuItemWithShortcut {
27
+ path: ParsedRdtMenuItem[];
28
+ shortcut: RdtShortcut;
29
+ }
30
+ export declare function getChildRoutesMap(items: ParsedRdtMenuItem[]): Map<ParsedRdtMenuItem, string[][]>;
31
+ export declare function findNextItemWithPrefix(items: ParsedRdtMenuItem[], itemIndex: number, prefix: string): number | null;
32
+ export declare function menuItemHasChildren(item: ParsedRdtMenuItem): item is ParsedRdtMenuItemWithChildren;
33
+ export declare function menuItemHasRoute(item: ParsedRdtMenuItem): item is ParsedRdtMenuItemWithRoute;
34
+ export declare function getMenuItemsShortcuts(items: ParsedRdtMenuItem[]): ParsedRdtMenuItemWithShortcut[];
35
+ export declare function areHorDirsEqual(a: Nullable<HorDirWithOffset>, b: Nullable<HorDirWithOffset>): boolean;
36
+ export declare function areVertDirsEqual(a: Nullable<VertDirWithOffset>, b: Nullable<VertDirWithOffset>): boolean;
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@ngrdt/menu",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^18.2.0",
6
+ "@angular/core": "^18.2.0",
7
+ "@angular/router": "^18.2.0",
8
+ "rxjs": ">=7.0.0",
9
+ "@ngrdt/router": ">=0.0.4",
10
+ "@ngrdt/utils": ">=0.0.4",
11
+ "@ngrdt/button": ">=0.0.1"
12
+ },
13
+ "sideEffects": false,
14
+ "module": "fesm2022/ngrdt-menu.mjs",
15
+ "typings": "index.d.ts",
16
+ "exports": {
17
+ "./package.json": {
18
+ "default": "./package.json"
19
+ },
20
+ ".": {
21
+ "types": "./index.d.ts",
22
+ "esm2022": "./esm2022/ngrdt-menu.mjs",
23
+ "esm": "./esm2022/ngrdt-menu.mjs",
24
+ "default": "./fesm2022/ngrdt-menu.mjs"
25
+ }
26
+ },
27
+ "dependencies": {
28
+ "tslib": "^2.3.0"
29
+ }
30
+ }