diff --git a/common/modules/mixly-modules/common/context-menu.js b/common/modules/mixly-modules/common/context-menu.js index c19b949e..20eabcb5 100644 --- a/common/modules/mixly-modules/common/context-menu.js +++ b/common/modules/mixly-modules/common/context-menu.js @@ -41,10 +41,11 @@ class ContextMenu { } } + #selector_ = null; #menus_ = new Registry(); #events_ = new Events(['getMenu']); constructor(selector, config = {}) { - this.selector = selector; + this.#selector_ = selector; this.menu = $.contextMenu({ selector, build: ($trigger) => { @@ -67,20 +68,20 @@ class ContextMenu { return ContextMenu.generate(menu, $trigger, e); } - dispose() { - $.contextMenu('destroy', this.selector); - this.#events_.reset(); - this.#menus_.reset(); - this.menu = null; - this.selector = null; - } - show() { - $(this.selector).contextMenu(); + $(this.#selector_).contextMenu(); } hide() { - $(this.selector).contextMenu('hide'); + $(this.#selector_).contextMenu('hide'); + } + + dispose() { + $.contextMenu('destroy', this.#selector_); + this.#events_.reset(); + this.#menus_.reset(); + this.menu = null; + this.#selector_ = null; } bind(type, func) { diff --git a/common/modules/mixly-modules/common/dropdown-menu.js b/common/modules/mixly-modules/common/dropdown-menu.js index c6220049..e55a2f72 100644 --- a/common/modules/mixly-modules/common/dropdown-menu.js +++ b/common/modules/mixly-modules/common/dropdown-menu.js @@ -1,35 +1,66 @@ goog.loadJs('common', () => { goog.require('tippy'); +goog.require('Mixly.IdGenerator'); goog.require('Mixly.ContextMenu'); goog.provide('Mixly.DropdownMenu'); -const { ContextMenu } = Mixly; +const { + IdGenerator, + ContextMenu +} = Mixly; class DropdownMenu extends ContextMenu { - #contextMenu_ = null; - #layer_ = null; + static { + this.$container = $('
'); + $(document.body).append(this.$container); + } + #shown_ = false; - constructor(selector) { + #layer_ = null; + #contextMenuId_ = ''; + #$contextMenuElem_ = null; + constructor(elem) { + const layer = tippy(elem, { + allowHTML: true, + content: '', + trigger: 'click', + interactive: true, + maxWidth: 'none', + offset: [0, 0], + appendTo: document.body, + arrow: false, + placement: 'bottom-start', + delay: 0, + duration: [0, 0], + onCreate: (instance) => { + $(instance.popper).addClass('mixly-drapdown-menu'); + }, + onMount: () => { + this.show(); + }, + onHide: () => { + this.#shown_ && this.hide(); + } + }); + + const contextMenuId = IdGenerator.generate(); + const selector = `body > .mixly-dropdown-menus > div[m-id="${contextMenuId}"]`; + super(selector, { trigger: 'none', + appendTo: $(layer.popper).children().children(), + zIndex: 1001, position: (opt) => { - opt.$menu.css({ - top: 0, - left: 0, - position: 'relative', - margin: 0 - }); + opt.$menu.css('margin', 0); }, events: { - show: (opt) => { - opt.$menu.detach(); - $('body > .mixly-drapdown-menu > .tippy-box > .tippy-content').empty().append(opt.$menu); - this.#layer_.setProps({}); + show: () => { this.#shown_ = true; + this.#layer_.setProps({}); }, - hide: (opt) => { + hide: () => { this.#shown_ = false; if (this.#layer_.state.isShown) { this.#layer_.hide(); @@ -38,33 +69,26 @@ class DropdownMenu extends ContextMenu { } }); - this.#layer_ = tippy($(selector)[0], { - allowHTML: true, - content: '', - trigger: 'click', - interactive: true, - maxWidth: 'none', - offset: [ 0, 0 ], - appendTo: document.body, - arrow: false, - placement: 'bottom-start', - delay: 0, - duration: [ 0, 0 ], - onCreate: (instance) => { - $(instance.popper).addClass('mixly-drapdown-menu'); - }, - onMount: (instance) => { - this.show(); - }, - onHide: () => { - this.#shown_ && this.hide(); - } - }); + this.#$contextMenuElem_ = $(`