3.6 KiB
3.6 KiB
F-123 — Editor de producto: quitar gate, reorder y selector de peso en gramos
Diagnóstico
F-121 (a40d78d) y F-107 (reorder previo) fueron fixes parciales:
- Gate "Guarda primero" sigue activo:
ProductEditor.tsxlíneas 286 y 374 mantienen losdivcon el warning. F-121 solo cambió el flujo post-save (router.push → router.replace+setProductId), no eliminó los textos. Bundle live15z1dcv3uvf3z.jsaún contiene "Guarda primero" (1 ocurrencia). - Reorder incompleto: Marca / Canal / Caducidad están en
ProductEditor.tsxdespués de Descripción. El operador quiere esos campos antes de Descripción, justo debajo de Peso unitario. - Peso unitario en kg con input libre: actualmente
<input type="text" value={unitWeightKg}>con label "Peso unitario (kg)". El operador quiere:- Label "Peso unitario (Gr)"
- Select dropdown con valores [100, 150, 200, 250, 300, 350, 500, 740, custom]
- Al elegir "custom" mostrar input libre en gramos
- Convertir a kg al guardar (dividir por 1000)
Diseño
Cambios
-
ProductEditor.tsx— Eliminar los dos bloques condicionales{productId ? <Section/> : <Warning/>}. Renderizar siempre:<PriceStockSection productId={productId} />(productId puede ser undefined)<ImagesSection productId={productId} />(idem)
-
PriceStockSection.tsx— AceptarproductId?: string:- Si
productIdes undefined → renderizar el formulario con inputs activos, pero desactivar los botones de guardado y mostrar caption "Se guardará al crear el producto". - Si
productIddefinido y la variante aún no carga → mantener el warning actual de "no datos internos de venta". - Si
productIddefinido y variante cargada → comportamiento normal.
- Si
-
ImagesSection.tsx— AceptarproductId?: string:- Si
productIdundefined → mostrar UI con inputs/área de drop deshabilitados y caption. - Si
productIddefinido → comportamiento normal.
- Si
Garantías
- Sin cambios en backend.
- Sin cambios en tipos del API client.
- Los productos ya creados siguen funcionando idéntico (productId siempre truthy → mismo path que antes).
- Para nuevos productos: el operador puede escribir precio, stock, EAN y planificar imágenes desde el inicio; al pulsar "Crear producto" el bundle se persiste (precio/stock/EAN se guardan con
setVariantPrice/setStock/updateVarianttras crear el id; las imágenes vía upload + POST /products/:id/images). El caption avisa que los botones de guardado individual están inactivos hasta tener id.
Riesgos
- Bajo. Cambios puramente UI. Sin migraciones, sin API, sin tipos.
Plan de implementación
- Editar
ProductEditor.tsx:- Quitar los dos bloques de warning.
- Renderizar siempre
<PriceStockSection>y<ImagesSection>. - Mover el bloque Marca/Canal/Caducidad a estar después de
<PriceStockSection>y antes de Descripción.
- Editar
PriceStockSection.tsx:- Prop opcional
productId?: string+ flagpending. - Early return si pending → renderizar UI deshabilitada.
- Reemplazar input libre de peso por
<select>con opciones [100,150,200,250,300,350,500,740,custom]. Custom muestra input auxiliar. - Convertir gramos → kg al llamar API.
- Prop opcional
- Editar
ImagesSection.tsx:- Prop opcional
productId?: string. - Estado pending → renderizar UI deshabilitada con caption.
- Prop opcional
npx tsc --noEmitenapps/admin.npm run buildenapps/admin.- Reiniciar admin (
monolith.sh prod restart). - Verificar bundle servido:
curl /products/new | grep "Guarda primero"→ 0 ocurrencias; HTML contiene el dropdown. - Cerrar gates.