73 lines
3.2 KiB
JSON
73 lines
3.2 KiB
JSON
{
|
|
"feature_id": "F-137",
|
|
"agent": "reviewer",
|
|
"stage": "review_gate",
|
|
"verdict": "APPROVED",
|
|
"reviewed_at": "2026-08-21T19:03:00Z",
|
|
"summary": "Refactor quirúrgico del flujo de persistencia de PriceStockSection. La sección pasa de tener 4 triggers de guardado dispares (1 botón + 3 blur/Enter) a un único punto de persistencia expuesto via forwardRef + useImperativeHandle.saveAll(). El main button 'Guardar cambios' del ProductEditor ahora coordina los 4 saves con Promise.all. Sin cambios de backend.",
|
|
"checks": [
|
|
{
|
|
"item": "Botón 'Guardar precio' eliminado del DOM",
|
|
"ok": true,
|
|
"evidence": "grep -c 'Guardar precio' PriceStockSection.tsx → 0"
|
|
},
|
|
{
|
|
"item": "Handlers onBlur/onKeyDown de saveStock, saveEan, saveProductMeta eliminados",
|
|
"ok": true,
|
|
"evidence": "grep -nE 'onBlur=\\{save' PriceStockSection.tsx → 0 matches"
|
|
},
|
|
{
|
|
"item": "PriceStockSection convertida a forwardRef y expone PriceStockHandle.saveAll()",
|
|
"ok": true,
|
|
"evidence": "useImperativeHandle en PriceStockSection.tsx; useRef<PriceStockHandle> en ProductEditor.tsx:77"
|
|
},
|
|
{
|
|
"item": "ProductEditor.handleSave llama priceStockRef.current?.saveAll() tras productsApi.create/update",
|
|
"ok": true,
|
|
"evidence": "ProductEditor.tsx:188; tolera saveAll devolviendo fallos parciales sin lanzar"
|
|
},
|
|
{
|
|
"item": "Cada save helper (savePrice/saveStock/saveEan/saveProductMeta) devuelve Promise<boolean> y propaga el error en el state msg",
|
|
"ok": true,
|
|
"evidence": "Diff de PriceStockSection.tsx líneas 154-271 (refactor del return type)"
|
|
},
|
|
{
|
|
"item": "Mensajes de éxito '✓' eliminados; los msg solo muestran texto rojo en error",
|
|
"ok": true,
|
|
"evidence": "Diff en el render de stockMsg/eanMsg/metaMsg (text-red-600 sin text-green-600)"
|
|
},
|
|
{
|
|
"item": "ensureVariant cubre el caso create-flow donde el useEffect de carga aún no ha corrido",
|
|
"ok": true,
|
|
"evidence": "Helper en PriceStockSection.tsx; llamado desde saveAll antes de los 4 saves"
|
|
},
|
|
{
|
|
"item": "Typecheck verde (admin)",
|
|
"ok": true,
|
|
"evidence": "cd project/apps/admin && npx tsc --noEmit → exit 0"
|
|
},
|
|
{
|
|
"item": "Lint verde (admin, ambos archivos)",
|
|
"ok": true,
|
|
"evidence": "0 errors, 7 warnings (todos pre-existentes sobre 'as any' en ProductEditor.tsx)"
|
|
},
|
|
{
|
|
"item": "Build verde (admin)",
|
|
"ok": true,
|
|
"evidence": "npm run build → 'Compiled successfully'; BUILD_ID regenerado"
|
|
},
|
|
{
|
|
"item": "Sin cambios de backend ni de migración",
|
|
"ok": true,
|
|
"evidence": "git diff no toca project/src/ ni project/migrations/"
|
|
},
|
|
{
|
|
"item": "Sin nuevas dependencias",
|
|
"ok": true,
|
|
"evidence": "package.json sin cambios; diff solo en .tsx"
|
|
}
|
|
],
|
|
"issues": [],
|
|
"notes": "El bundle servido en :3004 sigue siendo la versión vieja hasta que el operador ejecute ./scripts/monolith.sh prod restart. No hay forma de verificar end-to-end sin ese restart + smoke test manual en navegador. El patrón forwardRef + useImperativeHandle es idiomático en React 18+ y matchea la API del repo (forwardRef ya se usa en LexicalEditor)."
|
|
}
|