166 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @copyright  (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 | |
|  * @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);
 | |
|   });
 | |
| });
 |