feat: tickets backlog + TPV toggle sidebar

This commit is contained in:
chattie
2026-08-24 15:46:18 +02:00
parent 0dcb0f63a0
commit ba376dbab0
5 changed files with 15568 additions and 3 deletions

View File

@@ -7723,6 +7723,38 @@
"close": true
},
"completed_at": "2026-08-24T06:42:41Z"
},
{
"id": "F-204",
"type": "fix",
"title": "Storefront: Live search no funciona",
"description": "Live search no funciona -> net::ERR_ADDRESS_UNREACHABLE. El endpoint suggest no existe o no está ruteado.",
"priority": "med",
"risk": "low",
"status": "pending",
"created_at": "2026-08-24",
"gates": {
"reviewer": false,
"security": false,
"qa": false
},
"phase": "storefront"
},
{
"id": "F-205",
"type": "feature",
"title": "POS: Toggle columna izquierda",
"description": "Permitir ocultar/mostrar columna izquierda (pendientes/día) en el TPV.",
"priority": "high",
"risk": "low",
"status": "pending",
"created_at": "2026-08-24",
"gates": {
"reviewer": false,
"security": false,
"qa": false
},
"phase": "pos"
}
]
}

7750
backlog/features.json.bak Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -114,6 +114,7 @@ export default function RegisterPage() {
const [todaySales, setTodaySales] = useState<PosPendingSale[]>([]);
const [loadingPending, setLoadingPending] = useState(false);
const [salesTab, setSalesTab] = useState<'pending' | 'day'>('day');
const [showSidebar, setShowSidebar] = useState(true);
const [printingSaleId, setPrintingSaleId] = useState<string | null>(null);
const [restPaymentFor, setRestPaymentFor] = useState<PosPendingSale | null>(null);
const [processingRest, setProcessingRest] = useState(false);
@@ -902,6 +903,7 @@ export default function RegisterPage() {
return (
<div className="flex h-screen" style={{ '--color-primary': '#2D6A4F' } as React.CSSProperties}>
{showSidebar && (
<aside
className="hidden w-[380px] shrink-0 flex-col border-r bg-gray-50 p-3 lg:flex"
aria-label="Pedidos"
@@ -1163,6 +1165,7 @@ export default function RegisterPage() {
</>
)}
</aside>
)}
{/* POS-FIX-4: product added toast */}
{addedToast && (
<div className="pointer-events-none fixed top-6 right-6 z-50 animate-in slide-in-from-top-2 fade-in duration-200">
@@ -1182,6 +1185,14 @@ export default function RegisterPage() {
<span className="rounded-full bg-green-100 px-2 py-0.5 text-xs text-green-700">
Caja abierta
</span>
<button
type="button"
onClick={() => setShowSidebar((v) => !v)}
title={showSidebar ? 'Ocultar panel' : 'Mostrar panel'}
className="ml-2 rounded-lg border border-gray-300 bg-white px-2 py-1 text-xs font-medium text-gray-600 hover:bg-gray-50"
>
{showSidebar ? '◀' : '▶'} Panel
</button>
{!config?.terminal?.settings?.selfpayMode && (
<button
type="button"

View File

@@ -97,10 +97,11 @@ def main():
p.add_argument('--description', default='Need change')
p.add_argument('--priority', choices=LEVEL_CHOICES, default='med')
p.add_argument('--risk', choices=LEVEL_CHOICES, default='low')
p.add_argument('--phase', default=None)
ns, _ = p.parse_known_args(cli_args)
fid = ns.id or next_id(features)
features = data['features']
features.append({
fid = ns.id or next_id(features)
new_feature = {
'id': fid,
'type': ns.type,
'title': ns.title,
@@ -110,7 +111,10 @@ def main():
'status': 'pending',
'created_at': str(date.today()),
'gates': {'reviewer': False, 'security': False, 'qa': False},
})
}
if ns.phase:
new_feature['phase'] = ns.phase
features.append(new_feature)
data['features'] = features
BACKLOG.write_text(json.dumps(data, indent=2, ensure_ascii=False) + '\n', encoding='utf-8')
print(f'Created {fid}: {ns.title}')