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
7d96d5ff18
feat(api): ResetPassword admin — TempPasswordGenerator, handler, endpoint POST /{id}/password/reset [UDT-008]
...
Batch 7: POST /api/v1/users/{id}/password/reset (admin only).
- TempPasswordGenerator: RandomNumberGenerator.Fill, 12-char min, full charset diversity, never logs result
- ResetUsuarioPasswordCommandHandler: self-reset guard, 404, hash, mustChangePassword=true, revoke all tokens
- ExceptionFilter: CannotSelfResetException → 400 {error: cannot-self-reset}
- Unit tests: TempPasswordGeneratorTests (8), ResetUsuarioPasswordCommandHandlerTests (5)
- Integration tests: ResetPasswordEndpointTests (6) — 200/length/self-reset/404/401/403
2026-04-15 17:55:45 -03:00
a3bd066f7b
feat(api): ChangeMyPassword — validator, handler, endpoint PUT /me/password [UDT-008]
2026-04-15 17:52:15 -03:00
473566f255
feat(api): Deactivate + Reactivate usuarios — idempotentes, anti-lockout, revoke tokens [UDT-008]
2026-04-15 17:50:54 -03:00
14c385fdb1
feat(api): UpdateUsuario — handler, validator, anti-lockout guard, revoke tokens [UDT-008]
2026-04-15 17:49:19 -03:00
2925336783
feat(api): List + GetById usuarios — handlers, repo, endpoints [UDT-008]
2026-04-15 17:46:23 -03:00
9dcd63543e
feat(auth): extend LoginResponse with username + mustChangePassword + ultimoLogin [UDT-008]
2026-04-15 17:39:48 -03:00
d1f7b3805b
feat(domain): V008 migration + Usuario with-methods + DomainException hierarchy [UDT-008]
2026-04-15 17:36:46 -03:00
5ddc5ddf02
chore(udt-008): bootstrap rama feature/UDT-008 [UDT-008]
2026-04-15 17:34:12 -03:00