UNPKG

ngx-menubar

Version:

Simple basic menubar with step-into view display menu items(not tree view display) for angular14+.

1 lines 17.3 kB
{"version":3,"file":"ngx-menubar.mjs","sources":["../../../projects/ngx-menubar/src/lib/cyx-menubar.component.ts","../../../projects/ngx-menubar/src/lib/cyx-menubar.component.html","../../../projects/ngx-menubar/src/public-api.ts","../../../projects/ngx-menubar/src/ngx-menubar.ts"],"sourcesContent":["import {Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges} from '@angular/core';\nimport {CommonModule} from \"@angular/common\";\nimport {DomSanitizer, SafeHtml} from \"@angular/platform-browser\";\nimport {BehaviorSubject, debounceTime, distinctUntilChanged, map} from \"rxjs\";\n\n/**\n * Menubar menu item type.\n */\nexport interface IMenuItem {\n id: number | string;\n title: string;\n icon?: string;\n children?: IMenuItem[];\n data?: { [key: string]: any }\n}\n\n/**\n * Global menu item Search configuration type.\n */\nexport interface SearchConfig {\n placeHolder?: string;\n predicate?: (keyword: string, item: IMenuItem) => boolean;\n}\n\n/**\n * Simple basic menubar with step-into view display menu items(not tree view display).\n * @usageNotes\n * ```html\n * <style>\n * .container {\n * width: 350px;\n * height: 500px;\n * box-shadow: 1px 2px 8px rgba(0, 0, 0, .45);\n * }\n * </style>\n *\n * <div class=\"container\">\n * <cyx-menubar #menubar [datasource]=\"navs\"></cyx-menubar>\n * </div>\n * ```\n * @see IMenuItem\n */\n@Component({\n standalone: true,\n selector: 'cyx-menubar',\n templateUrl: 'cyx-menubar.component.html',\n imports: [\n CommonModule\n ],\n styleUrls: ['cyx-menubar.component.scss',\n 'cyx-menubar.light.component.scss',\n 'cyx-menubar.dark.component.scss']\n})\nexport class CyxMenubarComponent implements OnInit, OnChanges {\n /**\n * Default Top menu title.\n */\n @Input() title: string = 'Menu';\n /**\n * Menu items.\n */\n @Input() datasource: IMenuItem[] = [];\n /**\n * Theme color, 'dark' or 'light'.\n */\n @Input() color: string = 'dark';\n /**\n * Show bottom doc panel.\n */\n @Input() showDocPanel: boolean = false;\n /**\n * Show menu icon.\n */\n @Input() showMenuIcon: boolean = true;\n /**\n * Parse icon which from menu item data field {@link IMenuItem#icon}, e.g.\n * ```javascript\n * // menu item data.\n * {id: 1, title: '...', icon: 'deployed_code'}\n *\n * // font icon.\n * icon => `<span class=\"material-symbols-sharp\">${icon}</span>`\n *\n * // svg icon.\n * icon => `<svg viewBox=\"...\">...</svg>`\n * ```\n * @param icon icon name.\n */\n @Input() iconParser: (icon: string) => string = (icon: string) => icon;\n /**\n * Global menu item search configuration.\n */\n @Input() searchConfig: SearchConfig = {\n placeHolder: 'search',\n predicate: (keyword, item) => item.title.toLowerCase().includes(keyword.toLowerCase())\n }\n /**\n * Active item id.\n */\n @Input() active?: number | string;\n /**\n * Menu item click event.\n */\n @Output() itemClick: EventEmitter<IMenuItem> = new EventEmitter<IMenuItem>();\n\n protected indices: number[] = [];\n protected currentTitle?: string | null = null;\n protected currentChildren: IMenuItem[] = [];\n protected flattenItems: IMenuItem[] = [];\n\n /**\n * Selected item.\n */\n selectedItem: IMenuItem | null = null;\n\n private searchPredicate!: (keyword: string, item: IMenuItem) => boolean;\n\n private _displayItems: IMenuItem[] = [];\n protected get displayItems() {\n return this._displayItems;\n }\n\n /**\n * Is menu top level.\n */\n get isTopMenu(): boolean {\n return this.indices.length === 0;\n }\n\n protected readonly searchTerms = new BehaviorSubject<string>('');\n\n constructor(private sanitizer: DomSanitizer) {\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['datasource']) {\n this.doFlatDatasource(this.datasource);\n }\n if (changes['active'] && this.active) {\n this.doActiveItemById(this.active);\n }\n }\n\n ngOnInit(): void {\n this.doFlatDatasource(this.datasource);\n if (this.active) {\n this.doActiveItemById(this.active);\n } else {\n this.currentChildren = this.datasource;\n this._displayItems = this.currentChildren;\n }\n this.searchPredicate = this.searchConfig.predicate || (() => true);\n\n this.searchTerms.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n map(term => term.trim())\n ).subscribe(term => {\n if (term) {\n this._displayItems = this.flattenItems.filter(item => this.searchPredicate(term, item));\n return;\n }\n this._displayItems = this.currentChildren;\n });\n }\n\n protected doActiveItemById(id: number | string) {\n const activeItem = this.flattenItems.find(i => i.id === id);\n if (activeItem) {\n this.currentChildren = [activeItem];\n this._displayItems = this.currentChildren;\n }\n }\n\n private doFlatDatasource(datasource: IMenuItem[]) {\n const flatting = (items: IMenuItem[]): IMenuItem[] => {\n return items.reduce((acc: IMenuItem[], curr) => {\n if (curr.children && curr.children.length > 0) {\n acc.push({\n id: curr.id,\n title: curr.title,\n icon: curr.icon,\n data: curr.data,\n children: curr.children,\n });\n return acc.concat(flatting(curr.children));\n }\n acc.push(curr);\n return acc;\n }, []);\n }\n this.flattenItems = flatting(datasource);\n }\n\n protected iconHTML(icon: string): SafeHtml {\n const iconHTMLString = this.iconParser(icon);\n return this.sanitizer.bypassSecurityTrustHtml(iconHTMLString);\n }\n\n protected clickItem(item: IMenuItem, index: number) {\n this.selectedItem = item;\n if (item.children && item.children.length > 0) {\n this.indices.push(index);\n this.currentTitle = item.title;\n this.currentChildren = item.children;\n this._displayItems = this.currentChildren;\n }\n this.itemClick.emit(item);\n }\n\n protected backward() {\n this.indices.pop();\n if (this.isTopMenu) {\n this.currentTitle = null;\n this.currentChildren = this.datasource;\n this._displayItems = this.currentChildren;\n return;\n }\n let prevItem: IMenuItem | null = null;\n let prevItems: IMenuItem[] = this.datasource;\n for (const index of this.indices) {\n prevItem = prevItems[index];\n prevItems = prevItem.children || [];\n }\n this.currentTitle = prevItem?.title;\n this.currentChildren = prevItems;\n this._displayItems = this.currentChildren;\n }\n\n protected trackById(_: number, item: IMenuItem) {\n return item.id;\n }\n\n protected searchItems(value: string) {\n this.searchTerms.next(value);\n }\n}\n","<div class=\"menubar\" [ngClass]=\"color\">\n <header>\n <div class=\"backrow\" (click)=\"backward()\">\n <svg viewBox=\"0 0 542.187 461.8\" class=\"icon\" *ngIf=\"isTopMenu && showMenuIcon\">\n <g>\n <path\n d=\"M184.508 112.461V1.656h357.677v110.805H184.508M184.508 287.127V176.329h357.679v110.798H184.508M184.508 461.8V351h357.681v110.8H184.508M116.022 58.001c0 32.044-25.974 58.011-58.012 58.011C25.973 116.012 0 90.045 0 58.002 0 25.961 25.973-.005 58.01-.005c32.038 0 58.012 25.967 58.012 58.005M116.022 224.827c0 32.037-25.974 58.01-58.012 58.01-32.037 0-58.01-25.973-58.01-58.01 0-32.036 25.973-58.011 58.01-58.011 32.038 0 58.012 25.975 58.012 58.01M116.022 403.357c0 32.038-25.974 58.011-58.012 58.011-32.037 0-58.01-25.973-58.01-58.01 0-32.04 25.973-58.01 58.01-58.01 32.038 0 58.012 25.97 58.012 58.01\"></path>\n </g>\n </svg>\n <svg viewBox=\"0 0 14.2 21\" class=\"icon\" *ngIf=\"!isTopMenu\">\n <path d=\"M10.5 21l3.7-3.7-6.8-6.8 6.8-6.8L10.5 0 0 10.5z\"></path>\n </svg>\n <h1 class=\"label\" [class.no-icon-title]=\"!showMenuIcon && isTopMenu\">\n <ng-container *ngIf=\"currentTitle else defaultMenu\">{{ currentTitle }}</ng-container>\n <ng-template #defaultMenu>\n {{ title }}\n </ng-template>\n </h1>\n </div>\n </header>\n\n <header class=\"search\">\n <input type=\"text\" #searchBox [placeholder]=\"searchConfig.placeHolder || ''\"\n [value]=\"searchTerms.getValue()\"\n (input)=\"searchItems(searchBox.value)\"\n (keydown.enter)=\"searchItems(searchBox.value)\">\n\n <svg *ngIf=\"searchBox.value else queryIcon\" viewBox=\"0 0 18 18\" class=\"icon small\"\n (click)=\"searchBox.value = '';searchBox.focus();searchTerms.next('');\">\n <path\n d=\"M12.2 9l5.6-5.6c.2-.2.2-.6 0-.8L15.4.2c-.2-.2-.6-.2-.8 0L9 5.8 3.4.2c-.2-.2-.6-.2-.8 0L.2 2.5c-.2.2-.2.6 0 .8L5.8 9 .2 14.6c-.2.2-.2.6 0 .8l2.4 2.4c.2.2.6.2.8 0L9 12.2l5.6 5.6c.2.2.6.2.8 0l2.4-2.4c.2-.2.2-.6 0-.8L12.2 9z\"></path>\n </svg>\n <ng-template #queryIcon>\n <svg viewBox=\"0 0 594.573 594.107\" class=\"icon small\" (click)=\"searchBox.focus()\">\n <path\n d=\"M234.513 411.179c-96.785-.622-175.027-79.878-174.416-176.67.62-96.172 79.352-174.416 175.5-174.421l1.174.003c46.889.294 90.857 18.832 123.8 52.198 32.94 33.367 50.918 77.57 50.616 124.468-.296 46.687-18.703 90.524-51.823 123.42-33.112 32.894-77.04 51.003-123.69 51.003zm351.942 89.513l-3.588-3.585.008-.003-143.352-143.363c19.917-34.312 31.488-74.086 31.76-116.601C472.117 106.987 367.296.816 237.152-.003c-.525-.002-1.035-.002-1.557-.002C106.18 0 .838 104.516.005 234.125-.82 364.271 104.003 470.44 234.133 471.271c.519.002 1.022.005 1.54.005 43.258 0 83.795-11.72 118.664-32.1l143.226 143.241.013-.012 3.581 3.58c10.834 10.832 28.391 10.823 39.219 0l46.079-46.072c10.822-10.822 10.829-28.39 0-39.22\"></path>\n </svg>\n </ng-template>\n </header>\n\n <ul class=\"list\">\n <li *ngFor=\"let item of displayItems;index as i;trackBy:trackById\" (click)=\"clickItem(item,i)\"\n [class.selected]=\"item === selectedItem\">\n <div class=\"title\">\n <ng-container *ngIf=\"item.icon else defaultItemIcon\">\n <div class=\"icon\" [innerHTML]=\"iconHTML(item.icon)\"></div>\n </ng-container>\n <ng-template #defaultItemIcon>\n <svg class=\"icon\" viewBox=\"0 -960 960 960\">\n <path\n d=\"M480.276-96Q401-96 331-126q-70-30-122.5-82.5T126-330.958q-30-69.959-30-149.5Q96-560 126-629.5t82.5-122Q261-804 330.958-834q69.959-30 149.5-30Q560-864 629.5-834t122 82.5Q804-699 834-629.276q30 69.725 30 149Q864-401 834-331q-30 70-82.5 122.5T629.276-126q-69.725 30-149 30Z\"/>\n </svg>\n </ng-template>\n <span class=\"label\">{{ item.title }}</span>\n </div>\n <svg class=\"small icon\" viewBox=\"0 0 14.2 21\"\n *ngIf=\"(item.children && item.children.length > 0)\">\n <path d=\"M14.2 10.5L3.7 0 0 3.7l6.8 6.8L0 17.3 3.7 21z\"></path>\n </svg>\n </li>\n </ul>\n\n <div class=\"doc\" *ngIf=\"showDocPanel\">\n <ng-content></ng-content>\n </div>\n</div>\n","/*\n * Public API Surface of ngx-menubar\n */\n\nexport * from './lib/cyx-menubar.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}