fix: [TESIS-132] keep the page wrapper padding when a screen passes sx - #55
Conversation
`PageWrapper` spread its props after its own `sx`, so a screen passing
`sx={{ maxWidth: 1400 }}` replaced the base styles instead of adding to them.
Inventory, orders, new order (both steps) and order edit lost their padding and
centering: the content sat against the sidebar and the top bar, and the search
field label on inventory was cut off.
The caller's `sx` is now appended to the base one, which is how MUI composes an
`sx` that may also be an array.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o the right `Stack` spaces its children with `margin-left` unless `useFlexGap` is set, and that rule is more specific than a child's own `ml: 'auto'`. The search field and the create button on inventory and orders, and the next button on both steps of the new order wizard, ended up next to the content before them instead of against the right edge. With `useFlexGap` the spacing becomes `gap` and `ml: 'auto'` works again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TomasMartin2004
left a comment
There was a problem hiding this comment.
Revisión — TESIS-132 (PR #55) · PageWrapper deja de perder sus estilos base
Revisado sobre TESIS-132-page-wrapper-keeps-base-styles contra origin/master. npm run lint, npm run test y npm run build limpios.
✅ El diagnóstico es exacto y el arreglo es el idiomático
{...props} después del sx propio hacía que el sx del llamador reemplazara el objeto entero, no que se fusionara. Pasar a la forma de array —base primero, lo del llamador después— es como MUI compone sx, y de paso soporta que llegue como array, que es lo que el tipo permite.
Detalle que está bien resuelto y es fácil de pasar por alto: al desestructurar sx fuera de props, el spread ya no puede volver a pisarlo. Sin eso, el orden {...props} antes del sx habría reintroducido el bug por otro camino.
✅ Cinco pantallas arregladas sin tocar ninguna
Confirmado: los cinco llamadores con sx={{ maxWidth: 1400 }} son exactamente los afectados.
InventoryPage.tsx:168 NewOrderPage.tsx:85 OrderEditPage.tsx:68
OrdersPage.tsx:94 ShippingStepPage.tsx:130
Arreglar el componente en vez de las cinco pantallas es lo correcto, y explica por qué el diff es tan chico para cuatro capturas de «antes».
✅ Los tres ejemplos tienen dientes
Volví el componente a sx={sx} y caen los tres, incluido el del caso por defecto:
× centers the page and caps its width by default
× keeps the base styles when the caller overrides one of them
× accepts an array of styles like any other sx
Y me gustó la honestidad del comentario sobre qué no se afirma: el padding va en un media query con var(--mui-spacing) y jsdom no resuelve ninguno de los dos, así que el test verifica el centrado. Decirlo es mejor que escribir una aserción que pase por casualidad.
✅ El segundo problema, el de useFlexGap
Stack separando con margin-left pisa el ml: 'auto' del hijo: es de esas reglas de MUI que uno descubre a la mala. Busqué si quedaba algún caso afuera y no:
$ for f in $(grep -rl "ml: 'auto'" src --include=*.tsx); do
grep -q "<Stack" $f && ! grep -q "useFlexGap" $f && echo "$f"
done
(sin resultados)
El único otro marginLeft: 'auto' del repo está en WarehouseDistributionCard, dentro de un CardFooter con styled() y no de un Stack, así que no le aplica.
Y revisé la pantalla que todavía no entró —CarrierStepPage, de web#52—: usa PageWrapper sx={{ maxWidth: 1400 }}, con lo que se beneficia de este arreglo, y no depende de ningún margen automático, así que no va a necesitar useFlexGap cuando se mergee.
Veredicto
APPROVE.
Un arreglo de seis líneas que corrige cinco pantallas, con la causa bien identificada y ejemplos que fallan si vuelve. Las capturas de antes/después valen por sí solas.
🤖 Generated with Claude Code
🔗 Link
📝 Descripción
Inventario, Órdenes, Nueva orden (pasos 1 y 2) y Modificar orden se veían sin padding ni centrado: el contenido quedaba pegado al sidebar y a la barra superior, y en Inventario el label del buscador aparecía cortado. La causa era que
PageWrapperpasaba{...props}después de su propiosx, así que cuando una pantalla le mandabasx={{ maxWidth: 1400 }}esesxreemplazaba al base completo en vez de sumarse. Ahora elsxde quien lo usa se agrega después del base, que es como MUI compone unsx(que también puede llegar como array). Así se arreglan las 5 pantallas sin tocar ninguna.Con el padding de vuelta quedó a la vista un segundo problema: en Inventario y Órdenes el buscador y el botón de alta no quedaban contra el borde derecho, y en el wizard de nueva orden el botón de avanzar tampoco.
Stacksepara a sus hijos conmargin-leftsalvo que tengauseFlexGap, y esa regla pisa elml: 'auto'del hijo. ConuseFlexGapla separación pasa a sergapy elml: 'auto'vuelve a funcionar.🛠️ Cambios realizados
PageWrapperpara que combine elsxrecibido con sus estilos base (padding,maxWidth,mx: 'auto',width) en vez de reemplazarlos.useFlexGapal encabezado deInventoryPageyOrdersPagey al pie deNewOrderPageyShippingStepPage, para que las acciones y el botón de avanzar queden alineados a la derecha.PageWrapper.test.tsx: cubre el caso por defecto, un override demaxWidthque conserva el centrado y unsxen forma de array. Los dos últimos fallan con el código anterior.🧪 Cómo probarlo (Opcional)
Caso 1: Inventario
Precondición: la API está corriendo y hay una sesión iniciada (por ejemplo
admin@norte.com)./inventory.→ El título, el buscador y la tabla quedan separados del sidebar y de la barra superior, el label "Buscar productos" se ve completo y el buscador y "Nuevo producto" quedan contra el borde derecho.
Caso 2: resto de las pantallas afectadas
/orders,/orders/newy/orders/edit/1.→ Tienen el mismo padding que Inicio o Reportes. En
/ordersel buscador y "Crear orden" quedan a la derecha, y en/orders/newel botón "Siguiente" queda al final de la fila.📸 Evidencia (Opcional)
Capturas a 1440×810 con
admin@norte.com. La de Nueva orden después es de página completa para que se vea el botón «Siguiente» del pie. El paso 2 del wizard no tiene captura: sin una orden empezada redirige al paso 1.¿Afecta la arquitectura o genera un nuevo patrón?
No
🤖 Generated with Claude Code