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.",
|
"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",
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
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",
|
"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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user