Spaces:
Paused
Paused
| import { SubMenu } from './SubMenu.js'; | |
| export class MenuItem { | |
| /**@type {string}*/ icon; | |
| /**@type {boolean}*/ showLabel; | |
| /**@type {string}*/ label; | |
| /**@type {string}*/ title; | |
| /**@type {object}*/ value; | |
| /**@type {function}*/ callback; | |
| /**@type {MenuItem[]}*/ childList = []; | |
| /**@type {SubMenu}*/ subMenu; | |
| /**@type {HTMLElement}*/ root; | |
| /**@type {function}*/ onExpand; | |
| /** | |
| * | |
| * @param {?string} icon | |
| * @param {?boolean} showLabel | |
| * @param {string} label | |
| * @param {?string} title Tooltip | |
| * @param {object} value | |
| * @param {function} callback | |
| * @param {MenuItem[]} children | |
| */ | |
| constructor(icon, showLabel, label, title, value, callback, children = []) { | |
| this.icon = icon; | |
| this.showLabel = showLabel; | |
| this.label = label; | |
| this.title = title; | |
| this.value = value; | |
| this.callback = callback; | |
| this.childList = children; | |
| } | |
| render() { | |
| if (!this.root) { | |
| const item = document.createElement('li'); { | |
| this.root = item; | |
| item.classList.add('list-group-item'); | |
| item.classList.add('ctx-item'); | |
| // if a title/tooltip is set, add it, otherwise use the QR content | |
| // same as for the main QR list | |
| item.title = this.title || this.value; | |
| if (this.callback) { | |
| item.addEventListener('click', (evt) => this.callback(evt, this)); | |
| } | |
| const icon = document.createElement('div'); { | |
| icon.classList.add('qr--button-icon'); | |
| icon.classList.add('fa-solid'); | |
| if (!this.icon) icon.classList.add('qr--hidden'); | |
| else icon.classList.add(this.icon); | |
| item.append(icon); | |
| } | |
| const lbl = document.createElement('div'); { | |
| lbl.classList.add('qr--button-label'); | |
| if (this.icon && !this.showLabel) lbl.classList.add('qr--hidden'); | |
| lbl.textContent = this.label; | |
| item.append(lbl); | |
| } | |
| if (this.childList.length > 0) { | |
| item.classList.add('ctx-has-children'); | |
| const sub = new SubMenu(this.childList); | |
| this.subMenu = sub; | |
| const trigger = document.createElement('div'); { | |
| trigger.classList.add('ctx-expander'); | |
| trigger.textContent = '⋮'; | |
| trigger.addEventListener('click', (evt) => { | |
| evt.stopPropagation(); | |
| this.toggle(); | |
| }); | |
| item.append(trigger); | |
| } | |
| item.addEventListener('mouseover', () => sub.show(item)); | |
| item.addEventListener('mouseleave', () => sub.hide()); | |
| } | |
| } | |
| } | |
| return this.root; | |
| } | |
| expand() { | |
| this.subMenu?.show(this.root); | |
| if (this.onExpand) { | |
| this.onExpand(); | |
| } | |
| } | |
| collapse() { | |
| this.subMenu?.hide(); | |
| } | |
| toggle() { | |
| if (this.subMenu.isActive) { | |
| this.expand(); | |
| } else { | |
| this.collapse(); | |
| } | |
| } | |
| } | |