feat(F-162): completed feature
This commit is contained in:
@@ -6768,13 +6768,15 @@
|
||||
"description": "Add final Tienda column to inventory, matching product list, linking to storefront product page.",
|
||||
"priority": "med",
|
||||
"risk": "low",
|
||||
"status": "pending",
|
||||
"status": "done",
|
||||
"created_at": "2026-08-22",
|
||||
"gates": {
|
||||
"reviewer": false,
|
||||
"security": false,
|
||||
"qa": false
|
||||
}
|
||||
"reviewer": true,
|
||||
"security": true,
|
||||
"qa": true,
|
||||
"close": true
|
||||
},
|
||||
"completed_at": "2026-08-22T16:18:38Z"
|
||||
},
|
||||
{
|
||||
"id": "F-163",
|
||||
|
||||
@@ -6,6 +6,8 @@ import type { ProductVariant, StockAvailability, VariantPrice } from '@/types';
|
||||
interface ProductRow {
|
||||
productId: string;
|
||||
productName: string;
|
||||
productSlug: string;
|
||||
productActive: boolean;
|
||||
variant: ProductVariant;
|
||||
stock: StockAvailability | null;
|
||||
price: VariantPrice | null;
|
||||
@@ -114,6 +116,8 @@ export default function InventoryPage() {
|
||||
productRows.push({
|
||||
productId: product.id,
|
||||
productName: product.name,
|
||||
productSlug: product.slug,
|
||||
productActive: product.state === 'active',
|
||||
variant,
|
||||
stock: 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">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">Tienda</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-gray-50">
|
||||
@@ -535,6 +540,24 @@ export default function InventoryPage() {
|
||||
<td className="px-4 py-3">
|
||||
<StockBadge qty={row.stock?.availableQuantity ?? 0} />
|
||||
</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>
|
||||
);
|
||||
})}
|
||||
|
||||
3
work/artifacts/F-162/architect.md
Normal file
3
work/artifacts/F-162/architect.md
Normal 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.
|
||||
3
work/artifacts/F-162/documenter.md
Normal file
3
work/artifacts/F-162/documenter.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# F-162
|
||||
|
||||
Inventario incluye columna Tienda con enlace al producto activo en frontend.
|
||||
3
work/artifacts/F-162/implementer.md
Normal file
3
work/artifacts/F-162/implementer.md
Normal 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.
|
||||
1
work/artifacts/F-162/leader-close.json
Normal file
1
work/artifacts/F-162/leader-close.json
Normal file
@@ -0,0 +1 @@
|
||||
{"feature_id":"F-162","agent":"leader","stage":"close","verdict":"APPROVED","checks":[{"item":"all gates/build","ok":true}],"issues":[]}
|
||||
1
work/artifacts/F-162/qa.json
Normal file
1
work/artifacts/F-162/qa.json
Normal 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":[]}
|
||||
1
work/artifacts/F-162/reviewer.json
Normal file
1
work/artifacts/F-162/reviewer.json
Normal 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":[]}
|
||||
1
work/artifacts/F-162/security.json
Normal file
1
work/artifacts/F-162/security.json
Normal 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":[]}
|
||||
@@ -1,3 +1,3 @@
|
||||
# F-165 — Use brand logo in collapsed sidebar
|
||||
# F-162 — Add 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.
|
||||
|
||||
@@ -1,68 +1,68 @@
|
||||
{
|
||||
"feature_id": "F-165",
|
||||
"feature_id": "F-162",
|
||||
"stage": "close",
|
||||
"agent": "leader",
|
||||
"action": "Close collapsed logo fix",
|
||||
"action": "Close Inventory link fix",
|
||||
"state": "running",
|
||||
"next_agent": "leader",
|
||||
"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": [
|
||||
{
|
||||
"ts": "2026-08-22T16:13:46Z",
|
||||
"ts": "2026-08-22T16:16:06Z",
|
||||
"agent": "leader",
|
||||
"stage": "intake",
|
||||
"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",
|
||||
"stage": "design",
|
||||
"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",
|
||||
"stage": "build",
|
||||
"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",
|
||||
"stage": "review_gate",
|
||||
"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",
|
||||
"stage": "security_gate",
|
||||
"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",
|
||||
"stage": "qa_gate",
|
||||
"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",
|
||||
"stage": "document",
|
||||
"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",
|
||||
"stage": "close",
|
||||
"state": "running",
|
||||
"message": "Close collapsed logo fix"
|
||||
"message": "Close Inventory link fix"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user