(row)
| 546 | } |
| 547 | |
| 548 | function wireRow(row) { |
| 549 | const isAdminRow = row.dataset.admin === '1'; |
| 550 | const cbView = row.querySelector('input[data-cap="view"]'); |
| 551 | const cbViewOwn = row.querySelector('input[data-cap="viewOwn"]'); |
| 552 | const cbWrite = row.querySelector('input[data-cap="write"]'); |
| 553 | const cbManage = row.querySelector('input[data-cap="manage"]'); |
| 554 | const cbCreate = row.querySelector('input[data-cap="create"]'); |
| 555 | const cbUpload = row.querySelector('input[data-cap="upload"]'); |
| 556 | const cbEdit = row.querySelector('input[data-cap="edit"]'); |
| 557 | const cbRename = row.querySelector('input[data-cap="rename"]'); |
| 558 | const cbCopy = row.querySelector('input[data-cap="copy"]'); |
| 559 | const cbMove = row.querySelector('input[data-cap="move"]'); |
| 560 | const cbDelete = row.querySelector('input[data-cap="delete"]'); |
| 561 | const cbExtract = row.querySelector('input[data-cap="extract"]'); |
| 562 | const cbShareF = row.querySelector('input[data-cap="shareFile"]'); |
| 563 | const cbShareFo = row.querySelector('input[data-cap="shareFolder"]'); |
| 564 | const cbInherit = row.querySelector('input[data-inherit]'); |
| 565 | const markExplicit = () => { row.dataset.explicit = '1'; }; |
| 566 | if (isAdminRow) { |
| 567 | qsa(row, 'input[type="checkbox"]').forEach(cb => cb.disabled = true); |
| 568 | const note = row.querySelector('.inherit-flag-note'); |
| 569 | if (note) { |
| 570 | note.style.display = 'inline-flex'; |
| 571 | note.textContent = tf('admin_full_access', 'Admin: full access (not editable)'); |
| 572 | note.classList.add('pill-note-strong'); |
| 573 | } |
| 574 | row.classList.add('admin-locked-row'); |
| 575 | return; |
| 576 | } |
| 577 | |
| 578 | const granular = [cbCreate, cbUpload, cbEdit, cbRename, cbCopy, cbMove, cbDelete, cbExtract]; |
| 579 | |
| 580 | const applyManage = () => { |
| 581 | if (cbManage && cbManage.checked) { |
| 582 | if (cbView) cbView.checked = true; |
| 583 | if (cbWrite) cbWrite.checked = true; |
| 584 | granular.forEach(cb => { if (cb) cb.checked = true; }); |
| 585 | if (cbShareF) cbShareF.checked = true; |
| 586 | if (cbShareFo && !cbShareFo.disabled) cbShareFo.checked = true; |
| 587 | } |
| 588 | }; |
| 589 | |
| 590 | const syncWriteFromGranular = () => { |
| 591 | if (!cbWrite) return; |
| 592 | cbWrite.checked = granular.some(cb => cb && cb.checked); |
| 593 | }; |
| 594 | const applyWrite = () => { |
| 595 | if (!cbWrite) return; |
| 596 | granular.forEach(cb => { if (cb) cb.checked = cbWrite.checked; }); |
| 597 | const any = granular.some(cb => cb && cb.checked); |
| 598 | if (any && cbView && !cbView.checked && cbViewOwn && !cbViewOwn.checked) cbViewOwn.checked = true; |
| 599 | }; |
| 600 | |
| 601 | const onShareFile = () => { |
| 602 | if (cbShareF && cbShareF.checked && cbView && !cbView.checked && cbViewOwn && !cbViewOwn.checked) { |
| 603 | cbViewOwn.checked = true; |
| 604 | } |
| 605 | }; |
nothing calls this directly
no test coverage detected