Add paginated users/roles, user status, frontend permissions, profile pictures, identifier file storage

- Users page: paginated, searchable, sortable with inline roles (no N+1)
- Roles page: paginated, searchable, sortable + /roles/all for dropdowns
- User is_active field with migration, PATCH toggle, auth check (disabled=401)
- Frontend permission checks: auth store loads permissions, sidebar/buttons conditional
- Profile pictures via file storage for users and members, avatar component
- Identifier images use file storage API instead of base64
- Fix TypeScript errors across admin UI
- 64 API tests passing (10 new)
This commit is contained in:
Ryan Moon
2026-03-29 08:16:34 -05:00
parent 92371ff228
commit b9f78639e2
48 changed files with 1689 additions and 643 deletions

View File

@@ -29,7 +29,7 @@ function NewRolePage() {
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: rbacKeys.roles })
toast.success('Role created')
navigate({ to: '/roles' })
navigate({ to: '/roles', search: {} as any })
},
onError: (err) => toast.error(err.message),
})
@@ -153,7 +153,7 @@ function NewRolePage() {
<Button onClick={handleSubmit} disabled={mutation.isPending}>
{mutation.isPending ? 'Creating...' : 'Create Role'}
</Button>
<Button variant="secondary" onClick={() => navigate({ to: '/roles' })}>
<Button variant="secondary" onClick={() => navigate({ to: '/roles', search: {} as any })}>
Cancel
</Button>
</div>