Skip to content

fix: [TESIS-999025] explain a rejected product save inside the edit form - #70

Closed
LauAubert wants to merge 1 commit into
masterfrom
TESIS-999025-edit-product-shows-save-errors
Closed

LauAubert wants to merge 1 commit into
masterfrom
TESIS-999025-edit-product-shows-save-errors

Conversation

@LauAubert

Copy link
Copy Markdown
Member

Ticket de Jira

https://proyectofinalfrlp.atlassian.net/browse/TESIS-999025

ID provisorio: se reemplaza por la clave real al cargar la card en Jira. Card: cards/025.md. Sale de una auditoría de código del front (TESIS-89).


Descripción

Cuando el guardado del modal de edición de producto fallaba con algo que no fuera el 412, ProductDetailPage dibujaba el mensaje en el cuerpo de la página, que queda tapado por el fondo del diálogo abierto. El usuario veía el botón volver de «Guardando…» y nada más: un 409 porque una venta o una transferencia tenía tomado el stock del producto (ADR-009), un 422 por un dato rechazado o un corte de red parecían un guardado que terminaba sin hacer nada. CreateProductModal ya recibía submitError; EditProductModal no.

Repro en master: editar el stock de un producto mientras se crea una orden del mismo producto → el PUT responde 409 «stock for this warehouse is being written by another operation, please retry» → el modal queda igual, sin aviso.

  • EditProductModal recibe submitError y lo muestra en un Alert arriba del formulario, donde el usuario está mirando. Lo cargado queda intacto.
  • ProductDetailPage traduce el rechazo por status —el stock está ocupado (409), algún dato no pasó (422), o un reintento genérico— en lugar del mensaje crudo en inglés, y saca el banner de la página.
  • El 412 no cambia: lo sigue explicando el aviso de conflicto del modal, y la condición sigue mirando isConflict para que no se filtre como error genérico durante el refetch.
  • Tests de la página: el 409 se explica dentro del diálogo, el mensaje crudo nunca aparece, y el 412 no se muestra como error genérico.

Evidencia visual

Pendiente de captura.


Cómo probar

  1. Abrir el detalle de un producto → «Editar producto».
  2. Forzar un 409 (guardar el stock mientras otra pestaña crea una orden del mismo producto, o con la API caída para el caso genérico) → el diálogo muestra el aviso arriba del formulario y lo cargado sigue ahí.
  3. Un 412 (otra pestaña guardó antes) sigue mostrando el aviso de conflicto con la lista de cambios.

Verificación: npm run test (679 tests, 0 fallas), npm run lint, npm run format:check y npm run build limpios.


Impacto y consideraciones

¿Introduce breaking changes?
No

¿Requiere nuevas variables de entorno?
No

¿Afecta la arquitectura o genera un nuevo patrón?
No. Mismo contrato que CreateProductModal.submitError.

Conflicto esperable con proyecto-web#60/#61/#66 (tocan ProductDetailPage.tsx y el modal de edición en otras zonas).

🤖 Generated with Claude Code

Any failure of the product save other than the 412 was drawn in the body of
the detail page, which the backdrop of the open edit dialog covers. A 409
because a sale or transfer held the stock lock, a 422 or a network failure
looked like a save that finished and did nothing.

The edit modal now takes a submitError and shows it above the form, where
the user is looking, with the typed data intact. The raw English message of
the API is replaced by one per status: the stock is busy (409), some data
was refused (422), or a generic retry. The 412 keeps its own conflict notice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@TomasMartin2004

Copy link
Copy Markdown
Contributor

Revisado. No lo mergearía para esta entrega.

El bug es real: cuando el guardado del modal de edición falla con algo que no es el 412, el mensaje se dibuja en el cuerpo de ProductDetailPage, que queda tapado por el fondo del diálogo abierto. Un 409 por stock tomado (ADR-009), un 422 o un corte de red se ven igual que un guardado que no terminó.

Lo dejo afuera porque es una mejora de presentación de errores en un camino de excepción, no un fallo del sistema: el guardado efectivamente no se hizo y el estado queda consistente. Comparado con lo que sí mergearía —500 en todos los listados, ventas que se pierden sin señal, una pantalla que dice que la empresa no existe cuando la API parpadea— no entra en la misma categoría.

Lo agruparía con #71, #74 y #75 en una sola card de pulido de errores de la UI, para después de la entrega.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants