diff --git a/etc/lime-elements.api.md b/etc/lime-elements.api.md index 1c6dda29da..e92c5af06e 100644 --- a/etc/lime-elements.api.md +++ b/etc/lime-elements.api.md @@ -475,6 +475,7 @@ export namespace Components { "loading": boolean; "open": boolean; "openDirection": OpenDirection; + "rootItem": BreadcrumbsItem; "searcher": MenuSearcher; "surfaceWidth": SurfaceWidth; } @@ -1351,6 +1352,7 @@ namespace JSX_2 { "onSelect"?: (event: LimelMenuCustomEvent) => void; "open"?: boolean; "openDirection"?: OpenDirection; + "rootItem"?: BreadcrumbsItem; "searcher"?: MenuSearcher; "surfaceWidth"?: SurfaceWidth; } diff --git a/src/components/menu/menu.tsx b/src/components/menu/menu.tsx index 963ad18bf5..4d8a78004a 100644 --- a/src/components/menu/menu.tsx +++ b/src/components/menu/menu.tsx @@ -40,9 +40,17 @@ import { } from '../../util/keycodes'; interface MenuCrumbItem extends BreadcrumbsItem { - menuItem: MenuItem; + menuItem?: MenuItem; } +const DEFAULT_ROOT_BREADCRUMBS_ITEM: BreadcrumbsItem = { + text: '', + icon: { + name: 'home', + }, + type: 'icon-only', +}; + /** * @slot trigger - Element to use as a trigger for the menu. * @exampleComponent limel-example-menu-basic @@ -136,6 +144,13 @@ export class Menu { @Prop({ mutable: true }) public currentSubMenu: MenuItem; + /** + * A root breadcrumb item to show above the menu items. + * Clicking it navigates back from a sub-menu to the root menu. + */ + @Prop() + public rootItem: BreadcrumbsItem = DEFAULT_ROOT_BREADCRUMBS_ITEM; + /** * Is emitted when the menu is cancelled. */ @@ -177,9 +192,6 @@ export class Menu { @State() private loadingSubItems: boolean; - @State() - private menuBreadCrumb: MenuCrumbItem[] = []; - @State() private searchValue: string; @@ -262,8 +274,7 @@ export class Menu { } } - @Watch('currentSubMenu') - protected currentSubMenuWatcher() { + private getBreadcrumbsItems() { const breadCrumbItems: MenuCrumbItem[] = []; let currentItem = this.currentSubMenu; while (currentItem) { @@ -275,17 +286,14 @@ export class Menu { currentItem = currentItem.parentItem; } - if (breadCrumbItems.length) { - breadCrumbItems.push({ - text: '', - icon: { - name: 'home', - }, - type: 'icon-only', - } as MenuCrumbItem); + if ( + breadCrumbItems.length || + this.rootItem !== DEFAULT_ROOT_BREADCRUMBS_ITEM + ) { + breadCrumbItems.push(this.rootItem); } - this.menuBreadCrumb = breadCrumbItems.reverse(); + return breadCrumbItems.reverse(); } private renderLoader = () => { @@ -311,7 +319,8 @@ export class Menu { }; private renderBreadcrumb = () => { - if (!this.menuBreadCrumb?.length) { + const breadcrumbsItems = this.getBreadcrumbsItems(); + if (!breadcrumbsItems.length) { return; } @@ -322,7 +331,7 @@ export class Menu { 'flex-shrink': '0', }} onSelect={this.handleBreadcrumbsSelect} - items={this.menuBreadCrumb} + items={breadcrumbsItems} /> ); };