(username, grantsBox, groupMask, groupsForUser = [])
| 961 | } |
| 962 | |
| 963 | function applyGroupLocksForUser(username, grantsBox, groupMask, groupsForUser = []) { |
| 964 | if (!grantsBox || !groupMask) return; |
| 965 | |
| 966 | const groupLabel = groupsForUser.length |
| 967 | ? `${tf("granted_via_groups", "Granted via groups")}: ${groupsForUser.join(", ")}` |
| 968 | : tf("granted_via_groups", "Granted via groups"); |
| 969 | |
| 970 | const safeSelect = (folder) => { |
| 971 | return `.folder-access-row[data-folder="${escapeFolderSelectorValue(folder)}"]`; |
| 972 | }; |
| 973 | |
| 974 | Object.keys(groupMask).forEach(folder => { |
| 975 | const row = grantsBox.querySelector(safeSelect(folder)); |
| 976 | const caps = groupMask[folder] || {}; |
| 977 | if (!row) return; |
| 978 | |
| 979 | const groupNote = row.querySelector('.group-flag-note'); |
| 980 | if (groupNote) { |
| 981 | groupNote.style.display = 'inline-flex'; |
| 982 | groupNote.classList.add('pill-note-strong'); |
| 983 | groupNote.textContent = tf('granted_via_groups', 'Granted via groups'); |
| 984 | if (groupsForUser.length) { |
| 985 | groupNote.textContent += `: ${groupsForUser.join(', ')}`; |
| 986 | } |
| 987 | } |
| 988 | |
| 989 | Object.keys(caps).forEach(cap => { |
| 990 | if (!caps[cap]) return; |
| 991 | const input = row.querySelector(`input[data-cap="${cap}"]`); |
| 992 | if (!input) return; |
| 993 | input.checked = true; |
| 994 | input.disabled = true; |
| 995 | input.setAttribute("data-group-lock", "1"); |
| 996 | input.title = groupLabel; |
| 997 | |
| 998 | const permGroup = input.closest(".perm-group"); |
| 999 | if (permGroup) { |
| 1000 | permGroup.classList.add("group-locked"); |
| 1001 | } |
| 1002 | }); |
| 1003 | |
| 1004 | // Keep the synthetic Write meta toggle aligned with locked granular caps |
| 1005 | const lockedGranular = ['create','upload','edit','rename','copy','delete','extract'] |
| 1006 | .some(cap => caps[cap]); |
| 1007 | const writeInput = row.querySelector('input[data-cap="write"]'); |
| 1008 | if (writeInput && lockedGranular) { |
| 1009 | writeInput.checked = true; |
| 1010 | writeInput.disabled = true; |
| 1011 | writeInput.setAttribute("data-group-lock", "1"); |
| 1012 | writeInput.title = groupLabel; |
| 1013 | } |
| 1014 | }); |
| 1015 | } |
| 1016 | |
| 1017 | export async function populateAdminUserHubSelect(selectEl, onMetaUpdate) { |
| 1018 | if (!selectEl) return; |
no test coverage detected