|
|
|
|
|
|
|
|
|
export class SubMenu { |
|
itemList = []; |
|
isActive = false; |
|
|
|
root; |
|
|
|
|
|
|
|
|
|
constructor(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(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(parent) { |
|
if (this.isActive) { |
|
this.hide(); |
|
} else { |
|
this.show(parent); |
|
} |
|
} |
|
} |
|
|