+
+ setSearch(e.target.value)}
+ onClear={() => setSearch('')}
+ className={styles.listHeaderSearch}
+ />
+
+
+
+ {creating && (
+
+ )}
+
+
+ {filtered.map((user) => (
+
setSelectedId(user.id)}
+ >
+
+
+
+ {user.displayName}
+ {user.provider !== 'local' && (
+
+ )}
+
+
+ {user.email} · {getUserGroupPath(user)}
+
+
+ {user.directRoles.map((r) => )}
+ {user.directGroups.map((gId) => {
+ const g = MOCK_GROUPS.find((gr) => gr.id === gId)
+ return g ? : null
+ })}
+
+
+
+ ))}
+
+
+ {selected ? (
+ <>
+
+
+
+
+ updateUser(selected.id, { displayName: v })}
+ />
+
+
{selected.email}
+
+
+
+
+
+ Status
+
+ ID
+ {selected.id}
+ Created
+ {new Date(selected.createdAt).toLocaleDateString()}
+ Provider
+ {selected.provider}
+
+
+
Group membership (direct only)
+
+ {selected.directGroups.map((gId) => {
+ const g = MOCK_GROUPS.find((gr) => gr.id === gId)
+ return g ? (
+ updateUser(selected.id, {
+ directGroups: selected.directGroups.filter((id) => id !== gId),
+ })}
+ />
+ ) : null
+ })}
+ {selected.directGroups.length === 0 && (
+ (no groups)
+ )}
+
+
+ updateUser(selected.id, {
+ directGroups: [...selected.directGroups, ...ids],
+ })}
+ placeholder="Add groups..."
+ />
+
+
+
Effective roles (direct + inherited)
+
+ {effectiveRoles.map(({ role, source }) => (
+ updateUser(selected.id, {
+ directRoles: selected.directRoles.filter((r) => r !== role),
+ }) : undefined}
+ />
+ ))}
+ {effectiveRoles.length === 0 && (
+ (no roles)
+ )}
+
+ {effectiveRoles.some((r) => r.source !== 'direct') && (
+
+ Roles with ↑ are inherited through group membership
+
+ )}
+
+ updateUser(selected.id, {
+ directRoles: [...selected.directRoles, ...roles],
+ })}
+ placeholder="Add roles..."
+ />
+
+ >
+ ) : (
+
Select a user to view details
+ )}
+