Spaces:
Running
Running
/** | |
* @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); | |
} | |
} | |
} | |