/** * @copyright (C) 2018 Open Source Matters, Inc. * @license GNU General Public License version 2 or later; see LICENSE.txt */ const options = Joomla.getOptions('menus-edit-modules', {}); const viewLevels = options.viewLevels || []; const menuId = options.itemId || 0; const assigned1 = document.getElementById('jform_toggle_modules_assigned1'); const assigned0 = document.getElementById('jform_toggle_modules_assigned0'); const published1 = document.getElementById('jform_toggle_modules_published1'); const published0 = document.getElementById('jform_toggle_modules_published0'); if (assigned1) { assigned1.addEventListener('click', () => { document.querySelectorAll('tr.no').forEach(item => { item.classList.add('table-row'); item.classList.remove('hidden'); }); }); } if (assigned0) { assigned0.addEventListener('click', () => { document.querySelectorAll('tr.no').forEach(item => { item.classList.add('hidden'); item.classList.remove('table-row'); }); }); } if (published1) { published1.addEventListener('click', () => { document.querySelectorAll('.table tr.unpublished').forEach(item => { item.classList.add('table-row'); item.classList.remove('hidden'); }); }); } if (published0) { published0.addEventListener('click', () => { document.querySelectorAll('.table tr.unpublished').forEach(item => { item.classList.add('hidden'); item.classList.remove('table-row'); }); }); } /** * A helper to create an element * @param {String} tag * @param {String} content * @param {Array} classList * @returns {HTMLElement} */ const createElement = (tag, content, classList = []) => { const el = document.createElement(tag); el.textContent = content; if (classList.length) { el.classList.add(...classList); } return el; }; /** * Update module in list * @param {Object} data */ const updateView = data => { const modId = data.id; const updPosition = data.position; const updTitle = data.title; const updMenus = data.assignment; const updStatus = data.status; const updAccess = data.access; const tmpMenu = document.getElementById(`menus-${modId}`); const tmpRow = document.getElementById(`tr-${modId}`); const tmpStatus = document.getElementById(`status-${modId}`); const assigned = data.assigned || []; const inMenus = assigned.map(v => Math.abs(v)); const inAssignedList = inMenus.indexOf(menuId); let assignedState = 0; // 0 = No, 1 = Yes, 2 = All // Update assignment badge if (updMenus === '-') { assignedState = 0; } else if (updMenus === 0) { assignedState = 2; } else if (updMenus > 0) { if (inAssignedList >= 0) { assignedState = 1; } else if (inAssignedList < 0) { assignedState = 0; } } else if (updMenus < 0) { if (inAssignedList >= 0) { assignedState = 0; } else if (inAssignedList < 0) { assignedState = 1; } } switch (assignedState) { case 1: tmpMenu.innerHTML = createElement('span', Joomla.Text._('JYES'), ['badge', 'bg-success']).outerHTML; tmpRow.classList.add('no'); break; case 2: tmpMenu.innerHTML = createElement('span', Joomla.Text._('JALL'), ['badge', 'bg-info']).outerHTML; tmpRow.classList.add('no'); break; case 0: default: tmpMenu.innerHTML = createElement('span', Joomla.Text._('JNO'), ['badge', 'bg-danger']).outerHTML; tmpRow.classList.add('no'); } // Update status if (updStatus === 1) { tmpStatus.innerHTML = createElement('span', Joomla.Text._('JYES'), ['badge', 'bg-success']).outerHTML; tmpRow.classList.remove('unpublished'); } else if (updStatus === 0) { tmpStatus.innerHTML = createElement('span', Joomla.Text._('JNO'), ['badge', 'bg-danger']).outerHTML; tmpRow.classList.add('unpublished'); } else if (updStatus === -2) { tmpStatus.innerHTML = createElement('span', Joomla.Text._('JTRASHED'), ['badge', 'bg-secondary']).outerHTML; tmpRow.classList.add('unpublished'); } // Update Title, Position and Access document.querySelector(`#title-${modId}`).textContent = updTitle; document.querySelector(`#position-${modId}`).textContent = updPosition; document.querySelector(`#access-${modId}`).textContent = viewLevels[updAccess] || ''; }; /** * Message listener * @param {MessageEvent} event */ const msgListener = function msgListener(event) { // Avoid cross origins if (event.origin !== window.location.origin) return; // Check message if (event.data.messageType === 'joomla:content-select' && event.data.contentType === 'com_modules.module') { // Update view, if there are any changes if (event.data.id) { updateView(event.data); } // Close dialog this.close(); } }; // Listen when "add module" dialog opens, and add message listener document.addEventListener('joomla-dialog:open', ({ target }) => { if (!target.classList.contains('menus-dialog-module-editing')) return; // Create a listener with current dialog context const listener = msgListener.bind(target); // Wait for a message window.addEventListener('message', listener); // Remove listener on close target.addEventListener('joomla-dialog:close', () => { window.removeEventListener('message', listener); }); });