From 180514a039b77050b028d7e9e9f50bf19135d687 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Tue, 24 Mar 2026 08:21:11 +0100 Subject: [PATCH] fix: align RBAC user management styling with mock design MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Split pane: card layout with border, border-radius, box-shadow matching mock's bordered panel look - List pane: bg-surface background, padded header with border-bottom - Entity items: border-bottom separators instead of gap spacing, flex-start alignment for multi-line content - Detail pane: bg-surface background, 20px padding, right border-radius - User meta line: show email + group path (like mock's "email · group") - Create form: raised background with bottom border Co-Authored-By: Claude Opus 4.6 (1M context) --- ui/src/pages/Admin/UserManagement.module.css | 215 +++++++++++++++---- ui/src/pages/Admin/UsersTab.tsx | 6 +- 2 files changed, 184 insertions(+), 37 deletions(-) diff --git a/ui/src/pages/Admin/UserManagement.module.css b/ui/src/pages/Admin/UserManagement.module.css index 614244b4..8613d45c 100644 --- a/ui/src/pages/Admin/UserManagement.module.css +++ b/ui/src/pages/Admin/UserManagement.module.css @@ -1,48 +1,191 @@ -.statStrip { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-bottom: 16px; } -.splitPane { display: grid; grid-template-columns: 52fr 48fr; height: calc(100vh - 280px); } -.listPane { overflow-y: auto; border-right: 1px solid var(--border-subtle); padding-right: 16px; } -.detailPane { overflow-y: auto; padding-left: 16px; } -.listHeader { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; } -.entityList { display: flex; flex-direction: column; gap: 2px; } +.statStrip { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; + margin-bottom: 16px; +} + +.splitPane { + display: grid; + grid-template-columns: 52fr 48fr; + gap: 1px; + background: var(--border-subtle); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-lg); + min-height: 500px; + box-shadow: var(--shadow-card); +} + +.listPane { + background: var(--bg-surface); + display: flex; + flex-direction: column; + border-radius: var(--radius-lg) 0 0 var(--radius-lg); +} + +.detailPane { + background: var(--bg-surface); + overflow-y: auto; + padding: 20px; + border-radius: 0 var(--radius-lg) var(--radius-lg) 0; +} + +.listHeader { + display: flex; + align-items: center; + gap: 8px; + padding: 12px; + border-bottom: 1px solid var(--border-subtle); +} + +.listHeader input { flex: 1; } + +.entityList { + flex: 1; + overflow-y: auto; +} + .entityItem { - display: flex; align-items: center; gap: 10px; padding: 8px 10px; - cursor: pointer; border-radius: 6px; transition: background 0.1s; + display: flex; + align-items: flex-start; + gap: 10px; + padding: 10px 12px; + cursor: pointer; + transition: background 0.1s; + border-bottom: 1px solid var(--border-subtle); } -.entityItem:hover { background: var(--bg-hover); } -.entityItemSelected { background: var(--bg-raised); } -.entityInfo { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; } -.entityName { font-weight: 600; font-size: 13px; display: flex; align-items: center; gap: 6px; } -.entityMeta { font-size: 11px; color: var(--text-muted); } -.entityTags { display: flex; gap: 4px; flex-wrap: wrap; margin-top: 2px; } + +.entityItem:last-child { + border-bottom: none; +} + +.entityItem:hover { + background: var(--bg-hover); +} + +.entityItemSelected { + background: var(--bg-raised); +} + +.entityInfo { + display: flex; + flex-direction: column; + gap: 2px; + flex: 1; + min-width: 0; +} + +.entityName { + font-weight: 600; + font-size: 13px; + display: flex; + align-items: center; + gap: 6px; + color: var(--text-primary); +} + +.entityMeta { + font-size: 11px; + color: var(--text-muted); + margin-top: 2px; +} + +.entityTags { + display: flex; + gap: 4px; + flex-wrap: wrap; + margin-top: 4px; +} + .createForm { - background: var(--bg-surface); border: 1px solid var(--border-subtle); - border-radius: var(--radius-lg); padding: 12px; margin-bottom: 12px; + background: var(--bg-raised); + border-bottom: 1px solid var(--border-subtle); + padding: 12px; } -.createFormActions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 8px; } + +.createFormActions { + display: flex; + gap: 8px; + justify-content: flex-end; + margin-top: 8px; +} + .detailHeader { - display: flex; align-items: center; gap: 12px; - margin-bottom: 16px; padding-bottom: 16px; border-bottom: 1px solid var(--border-subtle); + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; + padding-bottom: 16px; + border-bottom: 1px solid var(--border-subtle); } + .metaGrid { - display: grid; grid-template-columns: 100px 1fr; gap: 6px 12px; - font-size: 13px; margin-bottom: 16px; + display: grid; + grid-template-columns: 100px 1fr; + gap: 6px 12px; + font-size: 13px; + margin-bottom: 16px; } + .metaLabel { - font-weight: 700; font-size: 10px; text-transform: uppercase; - letter-spacing: 0.6px; color: var(--text-muted); -} -.sectionTags { display: flex; gap: 4px; flex-wrap: wrap; margin-bottom: 8px; } -.inheritedNote { font-size: 11px; font-style: italic; color: var(--text-muted); margin-top: 4px; } -.securitySection { - padding: 12px; border: 1px solid var(--border-subtle); - border-radius: var(--radius-lg); margin-bottom: 16px; -} -.resetForm { display: flex; gap: 8px; margin-top: 8px; } -.emptyDetail { - display: flex; align-items: center; justify-content: center; - height: 100%; color: var(--text-muted); font-size: 13px; + font-weight: 700; + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.6px; + color: var(--text-muted); } + .sectionTitle { - font-size: 13px; font-weight: 700; color: var(--text-primary); - margin-bottom: 8px; margin-top: 16px; + font-size: 13px; + font-weight: 700; + color: var(--text-primary); + margin-bottom: 8px; + margin-top: 16px; +} + +.sectionTags { + display: flex; + gap: 4px; + flex-wrap: wrap; + margin-bottom: 8px; +} + +.inheritedNote { + font-size: 11px; + font-style: italic; + color: var(--text-muted); + margin-top: 4px; +} + +.securitySection { + padding: 12px; + border: 1px solid var(--border-subtle); + border-radius: var(--radius-lg); + margin-bottom: 16px; +} + +.resetForm { + display: flex; + gap: 8px; + margin-top: 8px; +} + +.emptyDetail { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + color: var(--text-muted); + font-size: 13px; +} + +.emptySearch { + padding: 20px; + text-align: center; + color: var(--text-muted); + font-size: 12px; +} + +.providerBadge { + font-size: 9px; } diff --git a/ui/src/pages/Admin/UsersTab.tsx b/ui/src/pages/Admin/UsersTab.tsx index 24830d30..7ed9c8b9 100644 --- a/ui/src/pages/Admin/UsersTab.tsx +++ b/ui/src/pages/Admin/UsersTab.tsx @@ -307,7 +307,11 @@ export default function UsersTab() { )} - {user.email &&
{user.email}
} +
+ {user.email || user.userId} + {user.directGroups.length > 0 && ` · ${user.directGroups.map((g) => g.name).join(', ')}`} + {user.directGroups.length === 0 && ' · no groups'} +
{(user.directRoles.length > 0 || user.directGroups.length > 0) && (
{user.directRoles.map((r) => (