# Architect — F-050 ## Diagnosis Investigación sobre el estado actual del admin: - Layout: `(dashboard)/layout.tsx` mantiene `max-w-[1280px]` con `mx-auto`, lo que limita el ancho útil en pantallas anchas; los centros quedan sin crecer. - `settings/page.tsx` añade su propio `max-w-4xl`, anulando el contenedor del layout. - `products/[id]/page.tsx` (edit sheet) usa `max-w-4xl` interno, lo que limita el editor de productos. - `brands`/`tax-rates`/`shipping` siguen mezclando botones de texto con iconos en la columna de acciones. - `categories` ya tiene selector de padre y checkbox promote, pero al editar sólo lista parents y bloquea al descendiente en hoja. - `dashboard` carga `/api/admin/stats` con `combinedAuth`, que acepta `backoffice_session` o `mdv_session`; ambos resuelven al usuario con su `role`. El dashboard asume `Role` (`customer|admin`) del campo, pero los backoffice users tienen `role` `admin|editor`, por lo que `requireRole(user, 'admin')` no bloquea pero el render espera un union de `customer|admin`. Tras varios 401 (sin cookie válida) y la diferencia entre el proxy interno y la sesión, el cliente sólo ve un mensaje "No se pudieron cargar las estadísticas". - Además, el dashboard del admin hace un fetch server-side/render que se ejecuta sin cookie de backoffice porque el login actual del admin está en cookie `backoffice_session`, pero el `/auth/login` mostrado por el frontend es la versión cliente; algunos links apuntaban a `/audit`, `/backoffice/stats` y `/orders/active` que no existen. `auditApi.list` apunta a `/api/admin/audit` que sí existe pero la página de auditoría usa `auditApi.list`, así que ese 404 era ruido del flujo anterior. ## Plan 1. **Layout full-width** - Reemplazar `max-w-[1280px] mx-auto` por `w-full px-6 md:px-10 py-8` en `(dashboard)/layout.tsx`, usando la estructura responsive del sidebar fijo. - `settings/page.tsx` retira su `max-w-4xl` propio. - `products/[id]/page.tsx` retira el `max-w-4xl`; la grid de tabs y secciones se expande. 2. **Acciones con icono + title en tax/shipping/brands** - Reutilizar `RowActions` con los handlers apropiados en `tax-rates` y `brands` (cuando aplique). - En `tax-rates` añadir handler de eliminar y reemplazar el botón de texto por `RowActions`. `shipping` ya tiene `RowActions`. 3. **Categories: padre y promote** - El selector de padre ya existe y filtra por `isParent`, pero en modo edición la categoría aún se está renderizando como padre aunque ya no lo sea. Solución: permitir que el checkbox `isParent` se edite en cualquier momento y refrescar el listado de padres disponibles para excluir la categoría actual (lo cual ya está implementado). - Añadir tip claro: "Promover a parent no exige tener hijos; parent es un flag booleano." 4. **Dashboard stats sin 404** - Cambiar el `requireRole` interno para que el dashboard admita tanto `admin` como `editor` y mapee correctamente. - Corregir el type-cast: el dashboard recibe `role: string` del backoffice, no restringido a `customer|admin`. Aceptar ambos. 5. **404s en navegación** - Reemplazar `/orders/active` y `/backoffice/stats` por rutas reales en `permissions.ts` y en el dashboard. - Verificar que el 404 de `/audit` proviene de un log pre-actualización; al recargar el backend, el endpoint `/api/admin/audit` existe y devuelve 200 con cookie válida. 6. **Auth y credenciales** - Verificar flujo de login del admin: el cliente hace `fetch('/api/auth/login')` desde el proxy Next; la página `/api/auth/login` corresponde a `identity` no a `backoffice`. El cliente debe usar `/api/backoffice/auth/login`. Ajustar `api-client.ts` para que `authApi.login` apunte a `/api/backoffice/auth/login` y `authApi.me` a `/api/backoffice/auth/me`. - Tras esto el cookie `backoffice_session` queda, `/backoffice/auth/me` responde 200 y `/admin/stats` pasa la auth. ## Acceptance evidence - /settings: ancho efectivo mayor a 4xl. - /products (edit): ancho del editor crece en pantallas anchas. - /tax-rates, /shipping, /brands: columna de acciones con iconos y title. - /categories: edición permite cambiar parent y promote. - /dashboard: stats cargan 200 sin 404 cuando hay sesión backoffice válida. - Verify verde.