feat(F-167): completed feature

This commit is contained in:
chattie
2026-08-22 19:17:36 +02:00
parent 767860d546
commit 56eee88315
11 changed files with 74 additions and 55 deletions

View File

@@ -6853,13 +6853,15 @@
"description": "Order edit layout uses three balanced columns: Actions/Products/Payment, Customer/Shipping and billing addresses, Shipping/Summary/History.",
"priority": "high",
"risk": "med",
"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-22T17:17:36Z"
},
{
"id": "F-168",

View File

@@ -365,7 +365,7 @@ export default function OrderDetailPage() {
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
{/* Main content */}
<div className="lg:col-span-2 space-y-6">
<div className="space-y-6">
{/* Actions */}
{allowed.length > 0 && (
<div className="bg-white border border-gray-200 rounded-xl p-6">
@@ -521,9 +521,43 @@ export default function OrderDetailPage() {
</div>
)}
</div>
<div className="bg-white border border-gray-200 rounded-xl p-6">
<h2 className="font-bold text-gray-900 mb-4">Pago</h2>
{order.payment ? (
<div className="space-y-1 text-sm">
<div className="flex justify-between">
<span className="text-gray-600">Método</span>
<span className="font-medium text-gray-900 capitalize">{order.payment.provider.replace(/_/g, ' ')}</span>
</div>
{order.payment.last4 && (
<div className="flex justify-between">
<span className="text-gray-600">Últimos 4</span>
<span className="font-mono font-medium text-gray-900">····{order.payment.last4}</span>
</div>
)}
<div className="flex justify-between">
<span className="text-gray-600">Importe</span>
<span className="font-medium text-gray-900">{formatPrice(order.payment.amountCents)}</span>
</div>
<div className="flex justify-between items-center">
<span className="text-gray-600">Estado</span>
<span className={`inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium ${
order.payment.status === 'succeeded' ? 'bg-green-100 text-green-800' :
order.payment.status === 'failed' ? 'bg-red-100 text-red-800' :
order.payment.status === 'refunded' ? 'bg-amber-100 text-amber-800' :
'bg-gray-100 text-gray-800'
}`}>
{order.payment.status}
</span>
</div>
</div>
) : (
<p className="text-sm text-gray-500">No hay una transacción de pago registrada para este pedido.</p>
)}
</div>
</div>
{/* Sidebar */}
{/* Customer column */}
<div className="space-y-6">
{/* F-140: Customer + Addresses + Payment */}
<div className="bg-white border border-gray-200 rounded-xl p-6">
@@ -572,40 +606,10 @@ export default function OrderDetailPage() {
)}
</div>
<div className="bg-white border border-gray-200 rounded-xl p-6">
<h2 className="font-bold text-gray-900 mb-4">Pago</h2>
{order.payment ? (
<div className="space-y-1 text-sm">
<div className="flex justify-between">
<span className="text-gray-600">Método</span>
<span className="font-medium text-gray-900 capitalize">{order.payment.provider.replace(/_/g, ' ')}</span>
</div>
{order.payment.last4 && (
<div className="flex justify-between">
<span className="text-gray-600">Últimos 4</span>
<span className="font-mono font-medium text-gray-900">····{order.payment.last4}</span>
</div>
)}
<div className="flex justify-between">
<span className="text-gray-600">Importe</span>
<span className="font-medium text-gray-900">{formatPrice(order.payment.amountCents)}</span>
</div>
<div className="flex justify-between items-center">
<span className="text-gray-600">Estado</span>
<span className={`inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium ${
order.payment.status === 'succeeded' ? 'bg-green-100 text-green-800' :
order.payment.status === 'failed' ? 'bg-red-100 text-red-800' :
order.payment.status === 'refunded' ? 'bg-amber-100 text-amber-800' :
'bg-gray-100 text-gray-800'
}`}>
{order.payment.status}
</span>
</div>
</div>
) : (
<p className="text-sm text-gray-500">No hay una transacción de pago registrada para este pedido.</p>
)}
</div>
</div>
{/* Shipping column */}
<div className="space-y-6">
{/* F-140 already shown above — keep existing Envío section */}
{/* Envío */}
<div className="bg-white border border-gray-200 rounded-xl p-6">

View File

@@ -0,0 +1,3 @@
# F-167
Use three independent responsive column wrappers, avoiding shared CSS-grid row heights.

View File

@@ -0,0 +1,3 @@
# F-167
Pedido usa tres columnas equilibradas en escritorio.

View File

@@ -0,0 +1,3 @@
# F-167
Order editor now has three independent desktop columns: Actions/Products/Payment; Customer/Shipping address/Billing address; Shipping/Summary/History. Mobile remains stacked. Admin build/typecheck pass.

View File

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

View File

@@ -0,0 +1 @@
{"feature_id":"F-167","agent":"qa","stage":"qa_gate","verdict":"APPROVED","checks":[{"item":"three columns","ok":true},{"item":"build/typecheck","ok":true}],"issues":[]}

View File

@@ -0,0 +1 @@
{"feature_id":"F-167","agent":"reviewer","stage":"review_gate","verdict":"APPROVED","checks":[{"item":"exact section distribution","ok":true},{"item":"responsive stack","ok":true}],"issues":[]}

View File

@@ -0,0 +1 @@
{"feature_id":"F-167","agent":"security","stage":"security_gate","verdict":"APPROVED","checks":[{"item":"presentation only","ok":true}],"issues":[]}

View File

@@ -1,3 +1,3 @@
# F-172My Account session loop
# F-167 — Three-column order editor
Storefront login receives `mdv_session`, while /api/auth/me and logout incorrectly use `session_token`. Align proxy routes to the backend cookie so hydration/navigation preserves the authenticated user.
Desktop column 1: Actions, Products, Payment. Column 2: Customer, Shipping address, Billing address. Column 3: Shipping controls, Summary, History. Mobile remains a readable single stack.

View File

@@ -1,64 +1,64 @@
{
"feature_id": "F-172",
"feature_id": "F-167",
"stage": "close",
"agent": "leader",
"action": "close",
"state": "running",
"next_agent": "leader",
"waiting_for": "Seleccionar una feature pending y actualizar este estado",
"updated_at": "2026-08-22T17:16:08Z",
"updated_at": "2026-08-22T17:17:36Z",
"timeline": [
{
"ts": "2026-08-22T17:15:07Z",
"ts": "2026-08-22T17:16:49Z",
"agent": "leader",
"stage": "intake",
"state": "running",
"message": "Align storefront auth session cookie"
"message": "Reflow order editor into three balanced columns"
},
{
"ts": "2026-08-22T17:15:07Z",
"ts": "2026-08-22T17:16:49Z",
"agent": "architect",
"stage": "design",
"state": "running",
"message": "design"
},
{
"ts": "2026-08-22T17:15:07Z",
"ts": "2026-08-22T17:16:49Z",
"agent": "implementer",
"stage": "build",
"state": "running",
"message": "Fix storefront session cookie"
"message": "Reflow order sections into three columns"
},
{
"ts": "2026-08-22T17:16:07Z",
"ts": "2026-08-22T17:17:36Z",
"agent": "reviewer",
"stage": "review_gate",
"state": "running",
"message": "review"
},
{
"ts": "2026-08-22T17:16:07Z",
"ts": "2026-08-22T17:17:36Z",
"agent": "security",
"stage": "security_gate",
"state": "running",
"message": "security"
},
{
"ts": "2026-08-22T17:16:07Z",
"ts": "2026-08-22T17:17:36Z",
"agent": "qa",
"stage": "qa_gate",
"state": "running",
"message": "qa"
},
{
"ts": "2026-08-22T17:16:08Z",
"ts": "2026-08-22T17:17:36Z",
"agent": "documenter",
"stage": "document",
"state": "running",
"message": "document"
},
{
"ts": "2026-08-22T17:16:08Z",
"ts": "2026-08-22T17:17:36Z",
"agent": "leader",
"stage": "close",
"state": "running",