Built-in Groups admin screen (todo §5); /admin/groups list (search/sort/paginate) + create/delete + membership (add/remove users & nested groups), writing only to Keto — gated admin-only + CSRF-guarded like Users (Kratos read only to label pickers). A group = Keto subject set Group:<name>#members, exists while it has ≥1 member: create writes the first-member tuple, delete removes all by partial-filter. Extracted shared admin-nav.ts (Dashboard·Users·Groups); new generic rowHeader <th scope=row> data-table cell. Stability-reviewer run as a local PR: symmetric subject UUID-validation, duplicate-name rejection, malformed-%→404. 228→237 units + typecheck green; core Keto interactions boot-verified live
This commit is contained in:
@@ -673,6 +673,8 @@ th[aria-sort="descending"] .sort-ico { transform: rotate(180deg); }
|
||||
border: 1px solid var(--border); border-radius: var(--radius);
|
||||
}
|
||||
.form-actions { display: flex; gap: 10px; justify-content: flex-end; }
|
||||
.card-title { margin: 0; font-size: 14px; font-weight: 600; }
|
||||
.inline-form { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
|
||||
.admin-actions { flex-flow: row wrap; gap: 10px; align-items: center; }
|
||||
.admin-actions form { margin: 0; }
|
||||
.btn-danger { color: var(--neg); border-color: var(--neg-bd); }
|
||||
|
||||
Reference in New Issue
Block a user