(checked)
| 605 | }; |
| 606 | |
| 607 | const cascadeManage = (checked) => { |
| 608 | const base = row.dataset.folder || ""; |
| 609 | if (!base) return; |
| 610 | qsa(container, '.folder-access-row').forEach(r => { |
| 611 | const f = r.dataset.folder || ""; |
| 612 | if (!f || f === base) return; |
| 613 | if (!f.startsWith(base + '/')) return; |
| 614 | const m = r.querySelector('input[data-cap="manage"]'); |
| 615 | const v = r.querySelector('input[data-cap="view"]'); |
| 616 | const w = r.querySelector('input[data-cap="write"]'); |
| 617 | const vo = r.querySelector('input[data-cap="viewOwn"]'); |
| 618 | const boxes = [ |
| 619 | 'create', 'upload', 'edit', 'rename', 'copy', 'delete', 'extract', 'shareFile', 'shareFolder' |
| 620 | ].map(c => r.querySelector(`input[data-cap="${c}"]`)); |
| 621 | if (m) m.checked = checked; |
| 622 | if (v) v.checked = checked; |
| 623 | if (w) w.checked = checked; |
| 624 | if (vo) { vo.checked = false; vo.disabled = checked; } |
| 625 | boxes.forEach(b => { if (b) b.checked = checked; }); |
| 626 | enforceShareFolderRule(r); |
| 627 | if (checked) { |
| 628 | r.dataset.explicit = '1'; |
| 629 | } |
| 630 | }); |
| 631 | refreshInheritance(); |
| 632 | }; |
| 633 | |
| 634 | if (cbManage) cbManage.addEventListener('change', () => { applyManage(); onShareFile(); cascadeManage(cbManage.checked); markExplicit(); }); |
| 635 | if (cbWrite) cbWrite.addEventListener('change', () => { applyWrite(); markExplicit(); refreshInheritance(); }); |
no test coverage detected