class PermissionsTable { constructor(elem) { this.container = elem; // Handle toggle all event const toggleAll = elem.querySelector('[permissions-table-toggle-all]'); toggleAll.addEventListener('click', this.toggleAllClick.bind(this)); // Handle toggle row event const toggleRowElems = elem.querySelectorAll('[permissions-table-toggle-all-in-row]'); for (let toggleRowElem of toggleRowElems) { toggleRowElem.addEventListener('click', this.toggleRowClick.bind(this)); } // Handle toggle column event const toggleColumnElems = elem.querySelectorAll('[permissions-table-toggle-all-in-column]'); for (let toggleColElem of toggleColumnElems) { toggleColElem.addEventListener('click', this.toggleColumnClick.bind(this)); } } toggleAllClick(event) { event.preventDefault(); this.toggleAllInElement(this.container); } toggleRowClick(event) { event.preventDefault(); this.toggleAllInElement(event.target.closest('tr')); } toggleColumnClick(event) { event.preventDefault(); const tableCell = event.target.closest('th,td'); const colIndex = Array.from(tableCell.parentElement.children).indexOf(tableCell); const tableRows = tableCell.closest('table').querySelectorAll('tr'); const inputsToToggle = []; for (let row of tableRows) { const targetCell = row.children[colIndex]; if (targetCell) { inputsToToggle.push(...targetCell.querySelectorAll('input[type=checkbox]')); } } this.toggleAllInputs(inputsToToggle); } toggleAllInElement(domElem) { const inputsToToggle = domElem.querySelectorAll('input[type=checkbox]'); this.toggleAllInputs(inputsToToggle); } toggleAllInputs(inputsToToggle) { const currentState = inputsToToggle.length > 0 ? inputsToToggle[0].checked : false; for (let checkbox of inputsToToggle) { checkbox.checked = !currentState; checkbox.dispatchEvent(new Event('change')); } } } export default PermissionsTable;