Conversation
nhopeatall
left a comment
There was a problem hiding this comment.
Summary
LGTM — Clean implementation that follows the established credentials page pattern exactly. CI passes, route registration is correct, backend authorization is solid (admin-only via adminProcedure, superadmin escalation guards).
Should Fix (non-blocking)
-
web/src/components/settings/user-form-dialog.tsx:26-31 — Stale form state on reopen: The
UserFormDialoginusers.tsxis rendered unconditionally (always mounted). After creating a user and closing the dialog, reopening "New User" will show the previously entered name/email/role becauseuseStateonly initializes on mount. AuseEffectthat resets fields whenopentransitions totrue(or addingkey={createOpen ? 'open' : 'closed'}on the dialog) would fix this. Note: this is the same pattern as the existingCredentialFormDialog, so it's a pre-existing issue — not introduced by this PR. -
web/src/components/settings/user-form-dialog.tsx:116-121 — The
<select>uses raw HTML with hand-rolled Tailwind classes instead of the project'sSelect/SelectTrigger/SelectItemcomponents from@/components/ui/select.js. Using the existing UI component would give consistent focus-ring behavior, keyboard navigation, and dark mode styling for free.
🕵️ claude-code · claude-opus-4-6 · run details
Inline feedback on
|
Summary
/settings/usersroute page that loads users viatrpc.users.listwith loading/error statesUsersTablecomponent with Name, Email, Role (Badge), Created columns and Edit/Delete actions withAlertDialogconfirmationUserFormDialogsupporting Create and Edit modes (Name, Email, Password, Role); password optional in Edit modesettingsUsersRouteinroute-tree.tsUsersicon from lucide-react) to the Settings section insidebar.tsxCloses: https://trello.com/c/taDscRmL/323-as-an-admin-i-want-a-users-settings-page-in-the-dashboard-so-that-i-can-manage-org-users-via-the-web-ui
Test plan
/settings/users— page loads with user list or loading/error statesnpm run typecheckandcd web && npx tsc --noEmitboth passnpm run lintpasses🤖 Generated with Claude Code