166 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @copyright  (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 | |
|  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 | |
|  */
 | |
| 
 | |
| const treeselectmenu = document.getElementById('treeselectmenu');
 | |
| const direction = document.dir !== undefined ? document.dir : document.documentElement.dir;
 | |
| document.querySelectorAll('.treeselect li').forEach(li => {
 | |
|   // Add icons
 | |
|   const icon = document.createElement('span');
 | |
|   // add tabindex to the span
 | |
|   icon.setAttribute('tabindex', '0');
 | |
|   icon.classList.add('icon-');
 | |
|   li.prepend(icon);
 | |
|   if (li.querySelector('ul.treeselect-sub')) {
 | |
|     // Add classes to Expand/Collapse icons
 | |
|     li.querySelector('span.icon-').classList.add('treeselect-toggle', 'icon-chevron-down');
 | |
| 
 | |
|     // Append drop down menu in nodes
 | |
|     if (treeselectmenu) {
 | |
|       li.querySelector('div.treeselect-item label').insertAdjacentHTML('afterend', treeselectmenu.innerHTML);
 | |
|     }
 | |
|     const sub = li.querySelector('ul.treeselect-sub');
 | |
|     const expand = li.querySelector('div.treeselect-menu-expand');
 | |
|     if (!sub.querySelector('ul.treeselect-sub') && expand) {
 | |
|       expand.remove();
 | |
|     }
 | |
|   }
 | |
| });
 | |
| 
 | |
| // Takes care of the Expand/Collapse of a node
 | |
| document.querySelectorAll('span.treeselect-toggle').forEach(toggle => {
 | |
|   toggle.addEventListener('click', ({
 | |
|     target
 | |
|   }) => {
 | |
|     const chevron = direction === 'rtl' ? 'icon-chevron-left' : 'icon-chevron-right';
 | |
| 
 | |
|     // Take care of parent UL
 | |
|     const {
 | |
|       parentNode
 | |
|     } = target;
 | |
|     if (parentNode.querySelector('ul.treeselect-sub').classList.contains('hidden')) {
 | |
|       target.classList.remove(chevron);
 | |
|       target.classList.add('icon-chevron-down');
 | |
|       parentNode.querySelectorAll('ul.treeselect-sub').forEach(item => item.classList.remove('hidden'));
 | |
|       parentNode.querySelectorAll('ul.treeselect-sub i.treeselect-toggle').forEach(item => {
 | |
|         item.classList.add('icon-chevron-down');
 | |
|         item.classList.remove(chevron);
 | |
|       });
 | |
|     } else {
 | |
|       target.classList.add(chevron);
 | |
|       target.classList.remove('icon-chevron-down');
 | |
|       parentNode.querySelectorAll('ul.treeselect-sub').forEach(item => item.classList.add('hidden'));
 | |
|       parentNode.querySelectorAll('ul.treeselect-sub i.treeselect-toggle').forEach(item => {
 | |
|         item.classList.remove('icon-chevron-down');
 | |
|         item.classList.add(chevron);
 | |
|       });
 | |
|     }
 | |
|   });
 | |
|   toggle.addEventListener('keypress', event => {
 | |
|     if (event.key === 'Enter') {
 | |
|       toggle.click();
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Takes care of the filtering
 | |
| document.getElementById('treeselectfilter').addEventListener('keyup', ({
 | |
|   target
 | |
| }) => {
 | |
|   const noResults = document.getElementById('noresultsfound');
 | |
|   const text = target.value.toLowerCase();
 | |
|   let hidden = 0;
 | |
|   noResults.classList.add('hidden');
 | |
|   const listItems = document.querySelectorAll('.treeselect li');
 | |
|   listItems.forEach(item => {
 | |
|     if (item.innerText.toLowerCase().includes(text)) {
 | |
|       item.classList.remove('d-none');
 | |
|     } else {
 | |
|       item.classList.add('d-none');
 | |
|       hidden += 1;
 | |
|     }
 | |
|   });
 | |
|   if (hidden === listItems.length) {
 | |
|     noResults.classList.remove('hidden');
 | |
|   }
 | |
| });
 | |
| 
 | |
| // Checks all checkboxes the tree
 | |
| document.getElementById('treeCheckAll').addEventListener('click', () => {
 | |
|   document.querySelectorAll('.treeselect input').forEach(input => {
 | |
|     input.checked = true;
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Unchecks all checkboxes the tree
 | |
| document.getElementById('treeUncheckAll').addEventListener('click', () => {
 | |
|   document.querySelectorAll('.treeselect input').forEach(input => {
 | |
|     input.checked = false;
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Expands all subtrees
 | |
| document.getElementById('treeExpandAll').addEventListener('click', () => {
 | |
|   document.querySelectorAll('ul.treeselect ul.treeselect-sub').forEach(input => input.classList.remove('hidden'));
 | |
|   document.querySelectorAll('ul.treeselect span.treeselect-toggle').forEach(item => {
 | |
|     item.classList.remove('icon-chevron-right');
 | |
|     item.classList.add('icon-chevron-down');
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Collapses all subtrees
 | |
| document.getElementById('treeCollapseAll').addEventListener('click', () => {
 | |
|   document.querySelectorAll('ul.treeselect ul.treeselect-sub').forEach(input => input.classList.add('hidden'));
 | |
|   document.querySelectorAll('ul.treeselect span.treeselect-toggle').forEach(item => {
 | |
|     item.classList.remove('icon-chevron-down');
 | |
|     item.classList.add('icon-chevron-right');
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Take care of children check/uncheck all
 | |
| document.querySelectorAll('a.checkall').forEach(item => {
 | |
|   item.addEventListener('click', ({
 | |
|     target
 | |
|   }) => {
 | |
|     target.closest('li').querySelectorAll('ul.treeselect-sub input').forEach(input => {
 | |
|       input.checked = true;
 | |
|     });
 | |
|   });
 | |
| });
 | |
| document.querySelectorAll('a.uncheckall').forEach(item => {
 | |
|   item.addEventListener('click', ({
 | |
|     target
 | |
|   }) => {
 | |
|     target.closest('li').querySelectorAll('ul.treeselect-sub input').forEach(input => {
 | |
|       input.checked = false;
 | |
|     });
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Take care of children toggle all
 | |
| document.querySelectorAll('a.expandall').forEach(item => {
 | |
|   item.addEventListener('click', ({
 | |
|     target
 | |
|   }) => {
 | |
|     const parent = target.closest('ul');
 | |
|     parent.querySelectorAll('ul.treeselect-sub').forEach(input => input.classList.remove('hidden'));
 | |
|     parent.querySelectorAll('ul.treeselect-sub .treeselect-toggle').forEach(toggle => {
 | |
|       toggle.classList.remove('icon-chevron-right');
 | |
|       toggle.classList.add('icon-chevron-down');
 | |
|     });
 | |
|   });
 | |
| });
 | |
| document.querySelectorAll('a.collapseall').forEach(item => {
 | |
|   item.addEventListener('click', ({
 | |
|     target
 | |
|   }) => {
 | |
|     const parent = target.closest('ul');
 | |
|     parent.querySelectorAll('ul.treeselect-sub').forEach(input => input.classList.add('hidden'));
 | |
|     parent.querySelectorAll('ul.treeselect-sub .treeselect-toggle').forEach(toggle => {
 | |
|       toggle.classList.remove('icon-chevron-down');
 | |
|       toggle.classList.add('icon-chevron-right');
 | |
|     });
 | |
|   });
 | |
| });
 |