6822d56e11
fix(web): montar Toaster + feedback toast en PermisosEditor [UDT-009]
...
Sonner estaba como dependencia pero el componente Toaster nunca se monto
en el arbol de la app. ChangeMyPasswordPage ya usaba toast() pero no
mostraba nada visualmente. Agregado <Toaster richColors closeButton /> en
App.tsx (top-right) y toasts de exito/error en PermisosEditor.handleSave
para confirmar al usuario que el cambio se persistio.
2026-04-16 10:11:04 -03:00
a30b10ebff
fix(web): UsuarioPermisos shape nested para matchear backend [UDT-009]
...
El backend devuelve { rolPermisos, overrides: {grant, deny}, effective }
(nested) segun spec, pero el frontend lo lee como {grant, deny} planos.
Causaba TypeError: permisoData.grant is not iterable al abrir tab Permisos.
Tests del frontend actualizados con el shape correcto.
2026-04-16 10:06:43 -03:00
b7882613a4
feat(web): UserEditPage con tabs Perfil+Permisos [UDT-009]
2026-04-15 21:50:55 -03:00
9dbf3e895d
feat(web): tabs.tsx + PermisosEditor tri-state [UDT-009]
2026-04-15 21:49:48 -03:00
c1426b2257
feat(web): api + hooks permisos overrides [UDT-009]
2026-04-15 21:48:06 -03:00
06908263f6
fix(web): cablear ResetPasswordModal en UserEditPage [UDT-008]
...
El row click de UsersListPage navega directo a /usuarios/:id/editar,
por lo que el modal montado solo en UserDetailPage no era alcanzable
desde el flujo real. Ahora tambien esta en el header del EditPage,
al lado del boton Volver, oculto cuando el target es el user logueado.
2026-04-15 21:00:08 -03:00
9e93c70d8b
refactor(web): mover Cambiar contraseña de sidebar a menu perfil [UDT-008]
...
La seccion Mi cuenta en el sidebar quedaba desprolija con un unico item.
Se movio Cambiar contraseña al dropdown del avatar en AppHeader donde
pertenece semanticamente.
2026-04-15 20:55:26 -03:00
851fed8692
fix(web): cablear ResetPasswordModal en UserDetailPage [UDT-008]
...
El componente ResetPasswordModal estaba implementado pero nunca montado en una pagina.
Ahora se renderiza en UserDetailPage, oculto cuando el target es el usuario logueado
(evita hit de cannot-self-reset en backend).
2026-04-15 20:54:25 -03:00
2e2d4543ad
feat(web): router wiring completo + nav link usuarios + MustChangePasswordGate integration [UDT-008]
...
- Agrega ProtectedPage helper que combina ProtectedRoute + MustChangePasswordGate + ProtectedLayout
- Rutas nuevas: /usuarios, /usuarios/:id, /usuarios/:id/editar con permisos RBAC
- /perfil/contrasena sin MustChangePasswordGate (evita redirect loop)
- Sidebar: sección "Mi cuenta" con cambio de contraseña; link Usuarios en sección admin
2026-04-15 18:12:54 -03:00
25ed0f6452
feat(web): ChangeMyPasswordPage + ResetPasswordModal — hooks, pages, modal [UDT-008]
2026-04-15 18:09:59 -03:00
64e0a8b5fb
feat(web): UserDetailPage + UserEditPage — get/update/deactivate/reactivate hooks y pages [UDT-008]
2026-04-15 18:06:54 -03:00
9512f4125d
feat(web): UsersListPage — api client, hook, filters, table, pagination [UDT-008]
2026-04-15 18:05:07 -03:00
d998d215e0
feat(web): authStore username+mustChangePassword + MustChangePasswordGate [UDT-008]
2026-04-15 18:02:20 -03:00
96e7290fb7
refactor(web): eliminar guards inline rol admin en páginas de roles/permisos [UDT-006]
2026-04-15 16:49:21 -03:00
f6cdd7650b
feat(web): ProtectedRoute extraído + router migrado + CreateUserPage cleanup [UDT-006]
2026-04-15 16:41:39 -03:00
8935115da9
feat(web): usePermission + CanPerform [UDT-006]
2026-04-15 16:40:23 -03:00
2efd5e2fdb
feat(web): authStore + useLogin persisten permisos [UDT-006]
2026-04-15 16:39:18 -03:00
885a8cef17
feat(web): BATCH 6 - feature permisos con grid por modulo [UDT-005]
...
- api/types.ts: PermisoDto, AssignPermisosRequest
- api/listPermisos, getRolPermisos, assignPermisos
- hooks: usePermisos, useRolPermisos, useAssignPermisos (TanStack Query)
- components/RolPermisosEditor: checkbox-grid agrupado por modulo (codigo.split(':')[0])
- pages/RolPermisosPage: selector rol activo + guard admin + RolPermisosEditor
- router.tsx: ruta /admin/permisos
- AppSidebar.tsx: link Permisos (KeyRound icon) en seccion admin
- tests: 5 smoke tests RolPermisosEditor (render, prefill, toggle, save, 400)
2026-04-15 15:46:49 -03:00
fae06fb8b8
feat(web): UDT-004 gestion de roles + UserForm dinamico
...
- features/roles: API clients (list/get/create/update/deactivate), TanStack Query hooks, RolForm (create + edit variants), RolesList con acciones y guard 409, paginas RolesPage/NewRolPage/EditRolPage
- router.tsx: rutas /admin/roles, /admin/roles/nuevo, /admin/roles/:codigo/editar
- AppSidebar: nav Roles (admin-only)
- features/users: useRolesForSelect wrapper (filtra activo=true), UserForm fetchea roles async con loading/error states; elimina ROL_OPTIONS hardcoded
- tests: 47 vitest verdes (10 authStore + 5 auth api + 7 axios + 3 useCreateUser + 3 RolesList + 5 LoginPage + 7 UserForm + 7 RolForm). Typecheck limpio
2026-04-15 12:58:08 -03:00
dd99e5cc69
feat(web): UDT-003 formulario de alta de usuarios (admin)
...
Agrega CreateUserPage con UserForm (react-hook-form + Zod), hook useCreateUser
(TanStack Query mutation), ruta /users/new protegida y entrada en AppSidebar.
Incluye tests Vitest: UserForm (9 casos) y useCreateUser (3 casos).
2026-04-15 10:57:11 -03:00
96dbeecc0f
fix(web): use endsWith for /auth path exclusion in refresh interceptor
...
Avoids substring-match false positives on future endpoints whose URL could
contain /auth/refresh or /auth/login as infix (W-01 from verify report).
2026-04-14 13:59:37 -03:00
7fadb88da0
docs(web): smoke test checklist UDT-002 — login, refresh, logout, reuse detection
2026-04-14 13:52:59 -03:00
dd4f4dbd5e
test(web): LoginPage — verify setAuth receives expiresIn and calculates expiresAt
2026-04-14 13:51:41 -03:00
bdaaaffaf6
feat(web): axiosClient — request/response interceptors with singleton refresh queue
2026-04-14 13:50:49 -03:00
d40b7247fc
feat(web): authApi — add refresh() and logout() with types and tests
2026-04-14 13:49:39 -03:00
f806e0a483
test(web): authStore TDD — refreshToken, expiresAt, clearAuth, updateAccess, logout async
2026-04-14 13:48:50 -03:00
3b66415e17
fix(web): default API port to 5212
2026-04-14 12:54:36 -03:00
5e1e979377
refactor(web): LoginPage con shadcn Form, zod validation y Alert destructive
2026-04-14 11:21:53 -03:00
7eea0fd17c
feat(ui): app shell con Sidebar, Header, ThemeToggle y HomePage grid de modulos
2026-04-14 11:21:48 -03:00
8acd2975ba
feat(ui): shadcn/ui setup con componentes base, fonts y design tokens
2026-04-14 11:21:43 -03:00
a15d8c166e
chore(udt-001): vite scaffold default assets
2026-04-13 21:36:49 -03:00
f4f063f5f0
test(udt-001): frontend tests (authStore, authApi, LoginPage - 11 tests)
2026-04-13 21:36:40 -03:00
a692576bc3
feat(udt-001): frontend auth UI (Zustand store, TanStack Query, LoginPage, router)
2026-04-13 21:36:32 -03:00
5f6ebccb54
feat(udt-001): frontend scaffold (Vite 6 + React 19 + TS strict + Tailwind 4)
2026-04-13 21:36:17 -03:00