/** * @copyright (C) 2012 Open Source Matters, Inc. * @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'); }); }); });