const template = document.createElement('template'); template.innerHTML = ` `; /** * @class SeCMenuDialog */ export class SeCMenuDialog extends HTMLElement { /** * @function constructor */ constructor () { super(); // create the shadowDom and insert the template this._shadowRoot = this.attachShadow({mode: 'open'}); this._shadowRoot.append(template.content.cloneNode(true)); this._workarea = document.getElementById('workarea'); this.$dialog = this._shadowRoot.querySelector('#cmenu_canvas'); this.$copyLink = this._shadowRoot.querySelector('#se-copy'); this.$cutLink = this._shadowRoot.querySelector('#se-cut'); this.$pasteLink = this._shadowRoot.querySelector('#se-paste'); this.$pasteInPlaceLink = this._shadowRoot.querySelector('#se-paste-in-place'); this.$deleteLink = this._shadowRoot.querySelector('#se-delete'); this.$groupLink = this._shadowRoot.querySelector('#se-group'); this.$ungroupLink = this._shadowRoot.querySelector('#se-ungroup'); this.$moveFrontLink = this._shadowRoot.querySelector('#se-move-front'); this.$moveUpLink = this._shadowRoot.querySelector('#se-move-up'); this.$moveDownLink = this._shadowRoot.querySelector('#se-move-down'); this.$moveBackLink = this._shadowRoot.querySelector('#se-move-back'); } /** * @function observedAttributes * @returns {any} observed */ static get observedAttributes () { return ['disableallmenu', 'enablemenuitems', 'disablemenuitems']; } /** * @function attributeChangedCallback * @param {string} name * @param {string} oldValue * @param {string} newValue * @returns {void} */ attributeChangedCallback (name, oldValue, newValue) { let eles = []; const sdowRoot = this._shadowRoot; switch (name) { case 'disableallmenu': if (newValue === 'true') { const elesli = sdowRoot.querySelectorAll('li'); elesli.forEach(function (eleli) { eleli.classList.add('disabled'); }); } break; case 'enablemenuitems': eles = newValue.split(','); eles.forEach(function (ele) { const selEle = sdowRoot.querySelector('a[href*="' + ele + '"]'); selEle.parentElement.classList.remove('disabled'); }); break; case 'disablemenuitems': eles = newValue.split(','); eles.forEach(function (ele) { const selEle = sdowRoot.querySelector('a[href*="' + ele + '"]'); selEle.parentElement.classList.add('disabled'); }); break; default: // super.attributeChangedCallback(name, oldValue, newValue); break; } } /** * @function get * @returns {any} */ get disableallmenu () { return this.getAttribute('disableallmenu'); } /** * @function set * @returns {void} */ set disableallmenu (value) { this.setAttribute('disableallmenu', value); } /** * @function get * @returns {any} */ get enablemenuitems () { return this.getAttribute('enablemenuitems'); } /** * @function set * @returns {void} */ set enablemenuitems (value) { this.setAttribute('enablemenuitems', value); } /** * @function get * @returns {any} */ get disablemenuitems () { return this.getAttribute('disablemenuitems'); } /** * @function set * @returns {void} */ set disablemenuitems (value) { this.setAttribute('disablemenuitems', value); } /** * @function connectedCallback * @returns {void} */ connectedCallback () { const current = this; const onMenuOpenHandler = (e) => { e.preventDefault(); current.$dialog.style.top = e.pageY + 'px'; current.$dialog.style.left = e.pageX + 'px'; current.$dialog.style.display = 'block'; }; const onMenuCloseHandler = (e) => { if (e.button !== 2) { current.$dialog.style.display = 'none'; } }; const onMenuClickHandler = (e, action) => { const triggerEvent = new CustomEvent('change', {detail: { trigger: action }}); this.dispatchEvent(triggerEvent); }; this._workarea.addEventListener('contextmenu', onMenuOpenHandler); this._workarea.addEventListener('mousedown', onMenuCloseHandler); this.$cutLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'cut')); this.$copyLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'copy')); this.$pasteLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'paste')); this.$pasteInPlaceLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'paste_in_place')); this.$deleteLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'delete')); this.$groupLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'group')); this.$ungroupLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'ungroup')); this.$moveFrontLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'move_front')); this.$moveUpLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'move_up')); this.$moveDownLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'move_down')); this.$moveBackLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'move_back')); } } // Register customElements.define('se-cmenu_canvas-dialog', SeCMenuDialog);