Spaces:
Paused
Paused
| /** | |
| * @typedef {import('./MenuItem.js').MenuItem} MenuItem | |
| */ | |
| export class SubMenu { | |
| /**@type {MenuItem[]}*/ itemList = []; | |
| /**@type {Boolean}*/ isActive = false; | |
| /**@type {HTMLElement}*/ root; | |
| constructor(/**@type {MenuItem[]}*/items) { | |
| this.itemList = items; | |
| } | |
| render() { | |
| if (!this.root) { | |
| const menu = document.createElement('ul'); { | |
| this.root = menu; | |
| menu.classList.add('list-group'); | |
| menu.classList.add('ctx-menu'); | |
| menu.classList.add('ctx-sub-menu'); | |
| this.itemList.forEach(it => menu.append(it.render())); | |
| } | |
| } | |
| return this.root; | |
| } | |
| show(/**@type {HTMLElement}*/parent) { | |
| if (this.isActive) return; | |
| this.isActive = true; | |
| this.render(); | |
| parent.append(this.root); | |
| requestAnimationFrame(() => { | |
| const rect = this.root.getBoundingClientRect(); | |
| console.log(window.innerHeight, rect); | |
| if (rect.bottom > window.innerHeight - 5) { | |
| this.root.style.top = `${window.innerHeight - 5 - rect.bottom}px`; | |
| } | |
| if (rect.right > window.innerWidth - 5) { | |
| this.root.style.left = 'unset'; | |
| this.root.style.right = '100%'; | |
| } | |
| }); | |
| } | |
| hide() { | |
| if (this.root) { | |
| this.root.remove(); | |
| this.root.style.top = ''; | |
| this.root.style.left = ''; | |
| } | |
| this.isActive = false; | |
| } | |
| toggle(/**@type {HTMLElement}*/parent) { | |
| if (this.isActive) { | |
| this.hide(); | |
| } else { | |
| this.show(parent); | |
| } | |
| } | |
| } | |