feat(mobile-fixes-phase4): Complete US-401 - Fix Layout Principal - Ascundere Header Desktop pe Mobil

Implemented by Ralph autonomous loop.
Iteration: 1

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-01-12 18:45:30 +00:00
parent ac2966c629
commit 65eff42312
4 changed files with 311 additions and 1226 deletions

View File

@@ -1,7 +1,7 @@
{
"projectName": "mobile-fixes-phase3",
"projectName": "mobile-fixes-phase4",
"branchName": "ralph/unified-mobile-md",
"description": "Corectări navigare mobilă: footer restructurat, tab-uri Clienți/Furnizori, FAB pe Bonuri, hamburger grupat",
"description": "Fix layout mobil: ascundere header desktop, butoane filter/export vizibile, MobileDrawerMenu cu ANALIZE, persistență bonuri cu eroare",
"cssRules": {
"documentation": [
"docs/ONBOARDING_CSS.md",
@@ -16,7 +16,8 @@
"NICIODATĂ :deep() în componente (PrimeVue → vendor/)",
"Mobile: toate paginile folosesc MobileTopBar + MobileBottomNav",
"Mobile: filtrele se pun în BottomSheet, NU inline",
"Mobile: tab-uri pentru switch Clienți/Furnizori"
"Mobile: v-if='isMobile' pentru componente mobile-only",
"Desktop: v-if='!isMobile' pentru componente desktop-only"
],
"mobileLayoutTokens": {
"topBarHeight": "56px",
@@ -28,189 +29,133 @@
},
"userStories": [
{
"id": "US-307",
"title": "Restructurare Footer Nav (4 butoane noi)",
"description": "Ca utilizator mobil vreau footer navigation cu: Dashboard | Bonuri | Facturi | Setări",
"id": "US-401",
"title": "Fix Layout Principal - Ascundere Header Desktop pe Mobil",
"description": "Ca utilizator mobil vreau să văd doar MobileTopBar și MobileBottomNav, nu header-ul desktop",
"priority": 1,
"acceptanceCriteria": [
"MobileBottomNav cu 4 butoane: Dashboard, Bonuri, Facturi, Setări",
"Dashboard: icon pi-home, route /dashboard",
"Bonuri: icon pi-receipt, route /data-entry",
"Facturi: icon pi-file-edit, route /reports/invoices",
"Setări: icon pi-cog, route /settings",
"Active state corect pe fiecare pagină",
"Ștergere link Upload din footer (mutat în FAB)",
"npm run build passes"
"AppHeader.vue sau componenta părinte are v-if='!isMobile' pentru a se ascunde pe mobil",
"Sidebar-ul desktop (navigation cu Rapoarte/Introduceri Date/Sistem) este ascuns pe mobil cu v-if='!isMobile'",
"MobileTopBar este singurul header vizibil pe viewport < 768px",
"Nu există suprapunere între header desktop și MobileTopBar",
"isMobile computed folosește window.innerWidth < 768 și este reactiv la resize",
"npm run build passes",
"Verify in browser (375x667): Header desktop cu 'Selectare perioada' și 'AXN' NU este vizibil"
],
"passes": true,
"notes": "Completed in iteration 1"
},
{
"id": "US-308",
"title": "Actualizare Hamburger Menu - Grupat pe Categorii",
"description": "Ca utilizator mobil vreau meniul hamburger organizat pe categorii clare",
"id": "US-402",
"title": "Fix MobileTopBar - Butoane Filter/Export Vizibile",
"description": "Ca utilizator mobil pe pagina Facturi/Bonuri vreau să văd butoanele de filtrare și export în header",
"priority": 2,
"acceptanceCriteria": [
"MobileDrawerMenu.vue restructurat cu secțiuni vizuale",
"Secțiune PRINCIPALE: Dashboard → /dashboard, Bonuri → /data-entry",
"Secțiune RAPOARTE: Facturi → /reports/invoices, Balanță → /reports/trial-balance, Casa și Banca → /reports/bank-cash",
"Secțiune ANALIZE: Scadențe → /reports/maturity-analysis, Facturi Detaliate → /reports/detailed-invoices",
"Secțiune ADMINISTRARE: Setări → /settings",
"Separatori vizuali între secțiuni",
"Header cu logo, Footer cu profil utilizator și logout",
"npm run build passes"
"După US-401, pe InvoicesView.vue butoanele Filter/Refresh/Export sunt vizibile în MobileTopBar",
"Pe ReceiptsListView.vue butoanele Filter/Export/More sunt vizibile în MobileTopBar",
"Butoanele au dimensiune touch target minim 48px",
"npm run build passes",
"Verify in browser (375x667): Butoanele sunt vizibile și clickable pe pagina Facturi"
],
"passes": true,
"notes": "Completed in iteration 2"
"passes": false,
"notes": "Depinde de US-401 - butoanele există dar sunt acoperite de header-ul desktop"
},
{
"id": "US-304",
"title": "Tab-uri Clienți/Furnizori în Facturi",
"description": "Ca utilizator vreau pagina Facturi să aibă tab-uri pentru Clienți și Furnizori",
"id": "US-403",
"title": "Fix MobileDrawerMenu - Secțiunea ANALIZE Vizibilă",
"description": "Ca utilizator mobil vreau să văd secțiunea ANALIZE în hamburger menu",
"priority": 3,
"acceptanceCriteria": [
"InvoicesView.vue modificat cu tab-uri: Clienți | Furnizori",
"Tab-uri sub MobileTopBar (design Material, full-width)",
"Switch între tab-uri păstrează filtrele active",
"Default: primul tab activ (Clienți)",
"URL query param pentru tab activ (?tab=suppliers)",
"MobileTopBar cu title Facturi",
"MobileBottomNav activ (Facturi highlighted)",
"npm run build passes"
"Click pe butonul Meniu din MobileTopBar deschide MobileDrawerMenu (nu sidebar desktop)",
"MobileDrawerMenu afișează secțiunile: PRINCIPALE, RAPOARTE, ANALIZE, ADMINISTRARE",
"Secțiunea ANALIZE conține: Scadențe (/reports/maturity-analysis), Facturi Detaliate (/reports/detailed-invoices)",
"Link-urile din ANALIZE navighează corect și închid drawer-ul",
"npm run build passes",
"Verify in browser (375x667): Click pe Meniu → apare MobileDrawerMenu cu secțiunea ANALIZE vizibilă"
],
"passes": true,
"notes": "Completed in iteration 1"
"passes": false,
"notes": "Depinde de US-401 - hamburger-ul deschidea sidebar-ul desktop"
},
{
"id": "US-305",
"title": "Tab-uri Clienți/Furnizori în Scadențe",
"description": "Ca utilizator vreau pagina Scadențe să aibă tab-uri pentru Clienți și Furnizori",
"id": "US-404",
"title": "Fix Spațiu Blank - Padding Corect pentru Mobile",
"description": "Ca utilizator mobil vreau ca paginile să nu aibă spațiu blank excesiv în partea de sus",
"priority": 4,
"acceptanceCriteria": [
"MaturityAnalysisView.vue modificat cu tab-uri: Clienți | Furnizori",
"Tab-uri sub MobileTopBar (design Material, full-width)",
"Switch între tab-uri păstrează filtrele active",
"Default: primul tab activ (Clienți)",
"URL query param pentru tab activ (?tab=suppliers)",
"MobileTopBar cu title Scadențe și buton ← Înapoi",
"MobileBottomNav activ",
"npm run build passes"
"Paginile de rapoarte au padding-top: 56px (doar MobileTopBar height) pe mobil",
"Nu există spațiu blank între MobileTopBar și conținut",
"Tab-urile Clienți/Furnizori sunt imediat sub MobileTopBar pe InvoicesView",
"Status chips sunt imediat sub MobileTopBar pe ReceiptsListView",
"npm run build passes",
"Verify in browser (375x667): Conținutul începe imediat sub MobileTopBar, fără gap de ~120px"
],
"passes": true,
"notes": "Completed in iteration 2"
"passes": false,
"notes": "Depinde de US-401 - spațiul era ocupat de header-ul desktop ascuns incorect"
},
{
"id": "US-301",
"title": "Buton Înapoi în Creare/Editare/Vizualizare Bon",
"description": "Ca utilizator mobil vreau buton ← Înapoi în MobileTopBar pe pagina de bon",
"id": "US-405",
"title": "Fix batchProgressStore - Restaurare Joburi Failed",
"description": "Ca utilizator care a uploadat bonuri cu erori OCR vreau ca acestea să rămână vizibile după refresh",
"priority": 5,
"acceptanceCriteria": [
"ReceiptCreateUnifiedView.vue are MobileTopBar cu showBack=true",
"Click pe ← navighează la /data-entry (lista bonuri)",
"Funcționează în toate modurile: create, edit, view",
"Verify in browser: butonul apare și funcționează",
"În batchProgressStore.js, funcția restoreJobsFromBatch() include joburi cu status 'failed' (nu doar pending/processing)",
"Batch-ul NU este șters din localStorage dacă are joburi failed nerezolvate",
"După refresh, bonurile cu eroare sunt afișate în listă",
"unifiedItems computed include joburile failed pentru afișare",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 3"
"passes": false,
"notes": ""
},
{
"id": "US-302",
"title": "Footer Nav pe toate Paginile de Setări",
"description": "Ca utilizator mobil vreau MobileBottomNav pe toate paginile din secțiunea Setări",
"id": "US-406",
"title": "Fix UI Bonuri cu Eroare - Afișare Corectă pe Mobil",
"description": "Ca utilizator mobil vreau să văd clar că un bon are eroare, nu 'în procesare'",
"priority": 6,
"acceptanceCriteria": [
"OCRMetricsView.vue include MobileBottomNav cu Setări activ",
"CacheStatsView.vue include MobileBottomNav cu Setări activ",
"ServerLogsView.vue include MobileBottomNav cu Setări activ",
"TelegramAdminView.vue include MobileBottomNav cu Setări activ (dacă există)",
"SettingsHubView.vue include MobileBottomNav cu Setări activ",
"npm run build passes"
"Bonurile cu status 'failed' afișează chip/badge 'Eroare' cu culoare roșie (var(--red-500))",
"NU afișează 'În procesare' sau spinner pentru bonuri failed",
"Mesajul de eroare este vizibil (truncat cu ellipsis dacă e prea lung)",
"Utilizatorul poate vedea eroarea completă la click/hover",
"npm run build passes",
"Verify in browser (375x667): Bon cu eroare arată 'Eroare' nu 'În procesare'"
],
"passes": true,
"notes": "Completed in iteration 4"
"passes": false,
"notes": "Depinde de US-405 - bonurile failed trebuie să fie în listă mai întâi"
},
{
"id": "US-303",
"title": "FAB pe Pagina Bonuri (Mutare Upload)",
"description": "Ca utilizator mobil vreau funcția Upload să fie în butonul FAB (+) pe pagina Bonuri",
"id": "US-407",
"title": "Fix Editare Bonuri cu Eroare",
"description": "Ca utilizator care are un bon cu eroare OCR vreau să pot edita bonul pentru a corecta erorile manual",
"priority": 7,
"acceptanceCriteria": [
"ReceiptsListView.vue are buton FAB (+) în colțul dreapta-jos",
"Click pe FAB deschide meniu popup: Bon Nou | Upload Bulk",
"FAB poziționat deasupra MobileBottomNav (bottom: 72px)",
"Bon Nou navighează la /data-entry/receipts/new",
"Upload Bulk navighează la /data-entry/bulk-upload",
"FAB vizibil doar pe mobil (isMobile)",
"npm run build passes"
"Click pe bon cu eroare deschide formularul de editare (ReceiptCreateUnifiedView)",
"La salvare, processing_status este resetat la NULL în baza de date",
"După salvare, bonul poate fi trimis pe workflow (Submit for Approval)",
"Backend endpoint PATCH /receipts/{id} resetează processing_status la NULL când se salvează modificări",
"npm run build passes",
"Verify in browser: Editează bon cu eroare → Salvează → Statusul nu mai arată eroare"
],
"passes": true,
"notes": "Completed in iteration 5"
"passes": false,
"notes": ""
},
{
"id": "US-306",
"title": "Restaurare Butoane Export și Filtrare pe Rapoarte",
"description": "Ca utilizator mobil vreau butoane de export și filtrare pe toate rapoartele",
"id": "US-408",
"title": "Verificare Finală - Toate Fix-urile Funcționează",
"description": "Ca developer vreau să confirm că toate fix-urile din Phase 4 funcționează corect",
"priority": 8,
"acceptanceCriteria": [
"InvoicesView.vue: buton Export (pi-download) și Filtrare (pi-filter) în MobileTopBar actions",
"TrialBalanceView.vue: buton Export și Filtrare în MobileTopBar actions",
"BankCashRegisterView.vue: buton Export și Filtrare în MobileTopBar actions",
"ReceiptsListView.vue: buton Export și Filtrare în MobileTopBar actions",
"MaturityAnalysisView.vue: buton Export și Filtrare în MobileTopBar actions",
"Click pe Filtrare deschide BottomSheet cu filtrele paginii",
"Viewport 375x667: Header desktop (Selectare perioada, AXN) NU este vizibil",
"Viewport 375x667: MobileTopBar cu butoane Filter/Export este vizibil",
"Click pe Meniu deschide MobileDrawerMenu cu secțiunea ANALIZE",
"Pagina Facturi: Tab-uri Clienți/Furnizori imediat sub header, fără spațiu blank",
"Pagina Bonuri: Status chips imediat sub header, fără spațiu blank",
"Upload bon cu eroare: Afișează 'Eroare' nu 'În procesare'",
"Refresh după upload cu eroare: Bonul cu eroare rămâne vizibil în listă",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 6"
},
{
"id": "US-309",
"title": "Cleanup Dashboard Mobile",
"description": "Ca utilizator mobil vreau Dashboard-ul să afișeze doar KPIs fără quick-links",
"priority": 9,
"acceptanceCriteria": [
"DashboardView.vue pe mobil: ștergere quick-link cards dacă există",
"Doar SwipeableCards cu KPIs pe mobil",
"Desktop rămâne neschimbat",
"MobileTopBar cu title Dashboard",
"MobileBottomNav cu Dashboard activ",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 7"
},
{
"id": "US-310",
"title": "Actualizare Router cu Modificările",
"description": "Ca developer vreau router-ul actualizat pentru a funcționa cu noile pagini",
"priority": 10,
"acceptanceCriteria": [
"Rută /reports/invoices → InvoicesView funcțională",
"Rută /reports/maturity-analysis → MaturityAnalysisView funcțională",
"Rutele existente păstrate: /reports/trial-balance, /reports/bank-cash, /reports/detailed-invoices",
"Cleanup rute nefolosite dacă există",
"Toate rutele lazy loaded",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 8"
},
{
"id": "US-311",
"title": "Actualizare Documentație MOBILE_PATTERNS.md",
"description": "Ca developer viitor vreau documentația actualizată cu modificările din Phase 3",
"priority": 11,
"acceptanceCriteria": [
"Secțiune actualizată: Footer Navigation (Dashboard, Bonuri, Facturi, Setări)",
"Secțiune nouă: FAB Pattern pentru acțiuni contextuale",
"Secțiune nouă: Tab Pattern pentru switch Clienți/Furnizori",
"Secțiune actualizată: Hamburger Menu grupat pe categorii",
"Diagrame ASCII actualizate cu noua structură navigare",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 9"
"passes": false,
"notes": ""
}
]
}

File diff suppressed because it is too large Load Diff