2023-04-19 05:20:02 +08:00
|
|
|
import {Component} from './component';
|
2019-04-13 19:07:27 +08:00
|
|
|
|
2022-11-15 20:44:57 +08:00
|
|
|
export class PermissionsTable extends Component {
|
2019-04-13 19:07:27 +08:00
|
|
|
|
2022-10-02 20:57:32 +08:00
|
|
|
setup() {
|
|
|
|
this.container = this.$el;
|
2022-11-03 21:28:07 +08:00
|
|
|
this.cellSelector = this.$opts.cellSelector || 'td,th';
|
|
|
|
this.rowSelector = this.$opts.rowSelector || 'tr';
|
2019-04-13 19:07:27 +08:00
|
|
|
|
|
|
|
// Handle toggle all event
|
2022-10-02 20:57:32 +08:00
|
|
|
for (const toggleAllElem of (this.$manyRefs.toggleAll || [])) {
|
|
|
|
toggleAllElem.addEventListener('click', this.toggleAllClick.bind(this));
|
|
|
|
}
|
2019-04-13 19:07:27 +08:00
|
|
|
|
|
|
|
// Handle toggle row event
|
2022-10-02 20:57:32 +08:00
|
|
|
for (const toggleRowElem of (this.$manyRefs.toggleRow || [])) {
|
2019-04-13 19:07:27 +08:00
|
|
|
toggleRowElem.addEventListener('click', this.toggleRowClick.bind(this));
|
|
|
|
}
|
2019-04-13 20:16:18 +08:00
|
|
|
|
|
|
|
// Handle toggle column event
|
2022-10-02 20:57:32 +08:00
|
|
|
for (const toggleColElem of (this.$manyRefs.toggleColumn || [])) {
|
2019-04-13 20:16:18 +08:00
|
|
|
toggleColElem.addEventListener('click', this.toggleColumnClick.bind(this));
|
|
|
|
}
|
2019-04-13 19:07:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
toggleAllClick(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
this.toggleAllInElement(this.container);
|
|
|
|
}
|
|
|
|
|
|
|
|
toggleRowClick(event) {
|
|
|
|
event.preventDefault();
|
2022-11-03 21:28:07 +08:00
|
|
|
this.toggleAllInElement(event.target.closest(this.rowSelector));
|
2019-04-13 19:07:27 +08:00
|
|
|
}
|
|
|
|
|
2019-04-13 20:16:18 +08:00
|
|
|
toggleColumnClick(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
|
2022-11-03 21:28:07 +08:00
|
|
|
const tableCell = event.target.closest(this.cellSelector);
|
2019-04-13 20:16:18 +08:00
|
|
|
const colIndex = Array.from(tableCell.parentElement.children).indexOf(tableCell);
|
2022-11-03 21:28:07 +08:00
|
|
|
const tableRows = this.container.querySelectorAll(this.rowSelector);
|
2019-04-13 20:16:18 +08:00
|
|
|
const inputsToToggle = [];
|
|
|
|
|
2023-04-19 05:20:02 +08:00
|
|
|
for (const row of tableRows) {
|
2019-04-13 20:16:18 +08:00
|
|
|
const targetCell = row.children[colIndex];
|
|
|
|
if (targetCell) {
|
|
|
|
inputsToToggle.push(...targetCell.querySelectorAll('input[type=checkbox]'));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.toggleAllInputs(inputsToToggle);
|
|
|
|
}
|
|
|
|
|
2019-04-13 19:07:27 +08:00
|
|
|
toggleAllInElement(domElem) {
|
2019-04-13 20:16:18 +08:00
|
|
|
const inputsToToggle = domElem.querySelectorAll('input[type=checkbox]');
|
|
|
|
this.toggleAllInputs(inputsToToggle);
|
|
|
|
}
|
|
|
|
|
|
|
|
toggleAllInputs(inputsToToggle) {
|
|
|
|
const currentState = inputsToToggle.length > 0 ? inputsToToggle[0].checked : false;
|
2023-04-19 05:20:02 +08:00
|
|
|
for (const checkbox of inputsToToggle) {
|
2019-04-13 19:07:27 +08:00
|
|
|
checkbox.checked = !currentState;
|
|
|
|
checkbox.dispatchEvent(new Event('change'));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-04-19 05:20:02 +08:00
|
|
|
}
|