From 06908263f6f4848bcf7c4ced9b30110c6dabdaeb Mon Sep 17 00:00:00 2001 From: dmolinari Date: Wed, 15 Apr 2026 21:00:08 -0300 Subject: [PATCH] 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. --- .../src/features/users/pages/UserEditPage.tsx | 12 +++++++--- .../features/users/UserEditPage.test.tsx | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/web/src/features/users/pages/UserEditPage.tsx b/src/web/src/features/users/pages/UserEditPage.tsx index bc4b7c6..8ac581d 100644 --- a/src/web/src/features/users/pages/UserEditPage.tsx +++ b/src/web/src/features/users/pages/UserEditPage.tsx @@ -18,6 +18,8 @@ import { } from '@/components/ui/form' import { useUser } from '../hooks/useUser' import { useUpdateUser } from '../hooks/useUpdateUser' +import { ResetPasswordModal } from '../components/ResetPasswordModal' +import { useAuthStore } from '@/stores/authStore' const editSchema = z.object({ nombre: z.string().min(1, 'El nombre es requerido'), @@ -45,6 +47,7 @@ export function UserEditPage() { const { id } = useParams<{ id: string }>() const userId = Number(id) const navigate = useNavigate() + const loggedUserId = useAuthStore((s) => s.user?.id) const { data: user, isLoading } = useUser(userId) const { mutate, isPending, error } = useUpdateUser(userId) @@ -112,9 +115,12 @@ export function UserEditPage() {

Editar Usuario

- +
+ {loggedUserId !== userId && } + +
{/* Username — display only, not editable */} diff --git a/src/web/src/tests/features/users/UserEditPage.test.tsx b/src/web/src/tests/features/users/UserEditPage.test.tsx index b13c183..5b8882c 100644 --- a/src/web/src/tests/features/users/UserEditPage.test.tsx +++ b/src/web/src/tests/features/users/UserEditPage.test.tsx @@ -138,4 +138,28 @@ describe('UserEditPage', () => { // Should NOT navigate expect(mockNavigate).not.toHaveBeenCalled() }) + + it('shows "Resetear contraseña" button when editing another user', async () => { + server.use( + http.get(`${API_URL}/api/v1/users/5`, () => HttpResponse.json(mockUserDetail)), + ) + + renderEditPage(5) + + await waitFor(() => expect(screen.getByDisplayValue('Juan')).toBeInTheDocument()) + expect(screen.getByRole('button', { name: /resetear contraseña/i })).toBeInTheDocument() + }) + + it('hides "Resetear contraseña" button when editing own profile', async () => { + server.use( + http.get(`${API_URL}/api/v1/users/1`, () => + HttpResponse.json({ ...mockUserDetail, id: 1, username: 'admin' }), + ), + ) + + renderEditPage(1) + + await waitFor(() => expect(screen.getByDisplayValue('Juan')).toBeInTheDocument()) + expect(screen.queryByRole('button', { name: /resetear contraseña/i })).not.toBeInTheDocument() + }) })