()
| 1238 | } |
| 1239 | |
| 1240 | async function loadUserPermissionsList() { |
| 1241 | const listContainer = document.getElementById("userPermissionsList"); |
| 1242 | if (!listContainer) return; |
| 1243 | listContainer.innerHTML = `<p>${t("loading")}…</p>`; |
| 1244 | const sourceId = getFolderAccessSourceId(); |
| 1245 | |
| 1246 | try { |
| 1247 | const [usersRes, groupsMap] = await Promise.all([ |
| 1248 | fetch("/api/admin/getUsers.php", { credentials: "include" }).then(safeJson), |
| 1249 | fetchAllGroups().catch(() => ({})) |
| 1250 | ]); |
| 1251 | |
| 1252 | const users = Array.isArray(usersRes) ? usersRes : (usersRes.users || []); |
| 1253 | const groups = groupsMap && typeof groupsMap === "object" ? groupsMap : {}; |
| 1254 | |
| 1255 | if (!users.length && !Object.keys(groups).length) { |
| 1256 | listContainer.innerHTML = `<p>${t("no_users_found")}</p>`; |
| 1257 | return; |
| 1258 | } |
| 1259 | |
| 1260 | __groupsCache = groups || {}; |
| 1261 | |
| 1262 | const folders = await getAllFolders(true, sourceId); |
| 1263 | const orderedFolders = ["root", ...folders.filter(f => f !== "root")]; |
| 1264 | |
| 1265 | const userGroupMap = {}; |
| 1266 | Object.keys(groups).forEach(gName => { |
| 1267 | const g = groups[gName] || {}; |
| 1268 | const members = Array.isArray(g.members) ? g.members : []; |
| 1269 | members.forEach(m => { |
| 1270 | const u = String(m || "").trim(); |
| 1271 | if (!u) return; |
| 1272 | if (!userGroupMap[u]) userGroupMap[u] = []; |
| 1273 | userGroupMap[u].push(gName); |
| 1274 | }); |
| 1275 | }); |
| 1276 | |
| 1277 | listContainer.innerHTML = ""; |
| 1278 | |
| 1279 | const groupNames = Object.keys(groups).sort((a, b) => a.localeCompare(b)); |
| 1280 | if (groupNames.length) { |
| 1281 | const groupHeader = document.createElement("div"); |
| 1282 | groupHeader.className = "muted"; |
| 1283 | groupHeader.style.margin = "4px 0 6px"; |
| 1284 | groupHeader.textContent = tf("groups_header", "Groups"); |
| 1285 | listContainer.appendChild(groupHeader); |
| 1286 | |
| 1287 | groupNames.forEach(name => { |
| 1288 | const g = groups[name] || {}; |
| 1289 | const label = g.label || name; |
| 1290 | const members = Array.isArray(g.members) ? g.members : []; |
| 1291 | const membersSummary = members.length |
| 1292 | ? members.join(", ") |
| 1293 | : tf("no_members", "No members yet"); |
| 1294 | |
| 1295 | const row = document.createElement("div"); |
| 1296 | row.classList.add("user-permission-row", "group-permission-row"); |
| 1297 | row.setAttribute("data-group-name", name); |
no test coverage detected