feat(F-162): completed feature

This commit is contained in:
chattie
2026-08-22 18:18:38 +02:00
parent 29c2a4495c
commit b1bbaa1055
11 changed files with 64 additions and 26 deletions

View File

@@ -6768,13 +6768,15 @@
"description": "Add final Tienda column to inventory, matching product list, linking to storefront product page.", "description": "Add final Tienda column to inventory, matching product list, linking to storefront product page.",
"priority": "med", "priority": "med",
"risk": "low", "risk": "low",
"status": "pending", "status": "done",
"created_at": "2026-08-22", "created_at": "2026-08-22",
"gates": { "gates": {
"reviewer": false, "reviewer": true,
"security": false, "security": true,
"qa": false "qa": true,
} "close": true
},
"completed_at": "2026-08-22T16:18:38Z"
}, },
{ {
"id": "F-163", "id": "F-163",

View File

@@ -6,6 +6,8 @@ import type { ProductVariant, StockAvailability, VariantPrice } from '@/types';
interface ProductRow { interface ProductRow {
productId: string; productId: string;
productName: string; productName: string;
productSlug: string;
productActive: boolean;
variant: ProductVariant; variant: ProductVariant;
stock: StockAvailability | null; stock: StockAvailability | null;
price: VariantPrice | null; price: VariantPrice | null;
@@ -114,6 +116,8 @@ export default function InventoryPage() {
productRows.push({ productRows.push({
productId: product.id, productId: product.id,
productName: product.name, productName: product.name,
productSlug: product.slug,
productActive: product.state === 'active',
variant, variant,
stock: null, stock: null,
price: null, price: null,
@@ -385,6 +389,7 @@ export default function InventoryPage() {
<th className="px-4 py-3 font-semibold text-gray-600 text-xs uppercase tracking-wide">Margen</th> <th className="px-4 py-3 font-semibold text-gray-600 text-xs uppercase tracking-wide">Margen</th>
<th className="px-4 py-3 font-semibold text-gray-600 text-xs uppercase tracking-wide">Stock</th> <th className="px-4 py-3 font-semibold text-gray-600 text-xs uppercase tracking-wide">Stock</th>
<th className="px-4 py-3 font-semibold text-gray-600 text-xs uppercase tracking-wide">Estado</th> <th className="px-4 py-3 font-semibold text-gray-600 text-xs uppercase tracking-wide">Estado</th>
<th className="px-4 py-3 font-semibold text-gray-600 text-xs uppercase tracking-wide">Tienda</th>
</tr> </tr>
</thead> </thead>
<tbody className="divide-y divide-gray-50"> <tbody className="divide-y divide-gray-50">
@@ -535,6 +540,24 @@ export default function InventoryPage() {
<td className="px-4 py-3"> <td className="px-4 py-3">
<StockBadge qty={row.stock?.availableQuantity ?? 0} /> <StockBadge qty={row.stock?.availableQuantity ?? 0} />
</td> </td>
<td className="px-4 py-3">
{row.productActive ? (
<a
href={`http://192.168.18.93:3003/products/${row.productSlug}`}
target="_blank"
rel="noopener noreferrer"
aria-label={`Ver ${row.productName} en la tienda`}
title="Ver en la tienda"
className="inline-flex h-8 w-8 items-center justify-center rounded-lg bg-green-50 text-green-600 transition-colors hover:bg-green-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#2D6A4F]"
>
<svg aria-hidden="true" className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
<path strokeLinecap="round" strokeLinejoin="round" d="M10 6H6a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-4M14 4h6m0 0v6m0-6L10 14" />
</svg>
</a>
) : (
<span className="text-gray-300"></span>
)}
</td>
</tr> </tr>
); );
})} })}

View File

@@ -0,0 +1,3 @@
# F-162 — Diseño
Extender `ProductRow` local con slug y estado activo obtenidos del listado ya cargado. Añadir la última columna Tienda copiando el patrón visual/accesible de Productos. Sin nuevas peticiones ni lógica duplicada.

View File

@@ -0,0 +1,3 @@
# F-162
Inventario incluye columna Tienda con enlace al producto activo en frontend.

View File

@@ -0,0 +1,3 @@
# F-162 — Implementer
Inventario conserva slug/estado del producto ya cargado y añade columna final Tienda con el mismo enlace externo accesible del listado Productos. Sin requests adicionales. Admin build y tsc PASS.

View File

@@ -0,0 +1 @@
{"feature_id":"F-162","agent":"leader","stage":"close","verdict":"APPROVED","checks":[{"item":"all gates/build","ok":true}],"issues":[]}

View File

@@ -0,0 +1 @@
{"feature_id":"F-162","agent":"qa","stage":"qa_gate","verdict":"APPROVED","checks":[{"item":"last column Tienda","ok":true},{"item":"active link URL","ok":true},{"item":"inactive fallback","ok":true},{"item":"build","ok":true}],"issues":[]}

View File

@@ -0,0 +1 @@
{"feature_id":"F-162","agent":"reviewer","stage":"review_gate","verdict":"APPROVED","checks":[{"item":"pattern reused","ok":true},{"item":"no extra requests","ok":true},{"item":"build","ok":true}],"issues":[]}

View File

@@ -0,0 +1 @@
{"feature_id":"F-162","agent":"security","stage":"security_gate","verdict":"APPROVED","checks":[{"item":"noopener noreferrer","ok":true},{"item":"slug from API","ok":true}],"issues":[]}

View File

@@ -1,3 +1,3 @@
# F-165Use brand logo in collapsed sidebar # F-162Add storefront product link to inventory
Sustituir el emoji del sidebar colapsado por `/images/logo-main.png`, con dimensiones icon-only y `alt="mercadodevida"`. Mantener el logo completo en expanded/mobile. Añadir columna final **Tienda** en Inventario. Cada producto activo enlaza a `http://192.168.18.93:3003/products/{slug}` en nueva pestaña, reutilizando icono, estilos y seguridad `noopener noreferrer` del listado Productos.

View File

@@ -1,68 +1,68 @@
{ {
"feature_id": "F-165", "feature_id": "F-162",
"stage": "close", "stage": "close",
"agent": "leader", "agent": "leader",
"action": "Close collapsed logo fix", "action": "Close Inventory link fix",
"state": "running", "state": "running",
"next_agent": "leader", "next_agent": "leader",
"waiting_for": "Seleccionar una feature pending y actualizar este estado", "waiting_for": "Seleccionar una feature pending y actualizar este estado",
"updated_at": "2026-08-22T16:15:43Z", "updated_at": "2026-08-22T16:18:19Z",
"timeline": [ "timeline": [
{ {
"ts": "2026-08-22T16:13:46Z", "ts": "2026-08-22T16:16:06Z",
"agent": "leader", "agent": "leader",
"stage": "intake", "stage": "intake",
"state": "running", "state": "running",
"message": "Replace collapsed emoji with brand logo" "message": "Add storefront link column to Inventory"
}, },
{ {
"ts": "2026-08-22T16:13:57Z", "ts": "2026-08-22T16:16:31Z",
"agent": "architect", "agent": "architect",
"stage": "design", "stage": "design",
"state": "running", "state": "running",
"message": "Specify collapsed brand mark" "message": "Reuse Products storefront link pattern"
}, },
{ {
"ts": "2026-08-22T16:14:08Z", "ts": "2026-08-22T16:16:54Z",
"agent": "implementer", "agent": "implementer",
"stage": "build", "stage": "build",
"state": "running", "state": "running",
"message": "Render logo-main in collapsed sidebar" "message": "Add Tienda link column to Inventory"
}, },
{ {
"ts": "2026-08-22T16:14:37Z", "ts": "2026-08-22T16:17:31Z",
"agent": "reviewer", "agent": "reviewer",
"stage": "review_gate", "stage": "review_gate",
"state": "running", "state": "running",
"message": "Review collapsed brand logo" "message": "Review Inventory storefront link"
}, },
{ {
"ts": "2026-08-22T16:14:54Z", "ts": "2026-08-22T16:17:46Z",
"agent": "security", "agent": "security",
"stage": "security_gate", "stage": "security_gate",
"state": "running", "state": "running",
"message": "Check static asset change" "message": "Check external storefront link safety"
}, },
{ {
"ts": "2026-08-22T16:15:02Z", "ts": "2026-08-22T16:17:57Z",
"agent": "qa", "agent": "qa",
"stage": "qa_gate", "stage": "qa_gate",
"state": "running", "state": "running",
"message": "Validate collapsed logo acceptance" "message": "Validate Inventory Tienda column"
}, },
{ {
"ts": "2026-08-22T16:15:31Z", "ts": "2026-08-22T16:18:09Z",
"agent": "documenter", "agent": "documenter",
"stage": "document", "stage": "document",
"state": "running", "state": "running",
"message": "Document collapsed logo" "message": "Document Inventory storefront link"
}, },
{ {
"ts": "2026-08-22T16:15:43Z", "ts": "2026-08-22T16:18:19Z",
"agent": "leader", "agent": "leader",
"stage": "close", "stage": "close",
"state": "running", "state": "running",
"message": "Close collapsed logo fix" "message": "Close Inventory link fix"
} }
] ]
} }