feat(mobile-fixes-phase3): Complete US-307 - Restructurare Footer Nav (4 butoane noi)

Implemented by Ralph autonomous loop.
Iteration: 1

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-01-12 13:38:58 +00:00
parent b7f442ed33
commit a5740eaf78
16 changed files with 832 additions and 365 deletions

View File

@@ -0,0 +1,253 @@
{
"projectName": "mobile-navigation-improvements",
"branchName": "ralph/unified-mobile-md",
"description": "Extinderea navigării mobile cu Dashboard split, Settings Hub, MobileDrawerMenu și butoane context-aware",
"cssRules": {
"documentation": [
"docs/ONBOARDING_CSS.md",
"docs/DESIGN_TOKENS.md",
"docs/CSS_PATTERNS.md",
"docs/MOBILE_PATTERNS.md"
],
"goldenRules": [
"Folosește DOAR design tokens - NICIODATĂ valori hardcodate",
"Verifică CSS_PATTERNS.md înainte de a scrie CSS nou",
"Testează în AMBELE teme (light + dark mode)",
"NICIODATĂ :deep() în componente (PrimeVue → vendor/)",
"NICIODATĂ duplicate CSS (write once, use everywhere)",
"Mobile: toate paginile folosesc MobileTopBar + MobileBottomNav",
"Mobile: filtrele se pun în BottomSheet, NU inline",
"Mobile: selecția afișează acțiuni în footer, NU în header"
],
"mobileLayoutTokens": {
"topBarHeight": "56px",
"bottomNavHeight": "56px",
"fabSize": "56px",
"fabBottomOffset": "72px",
"touchTargetMin": "48px"
}
},
"userStories": [
{
"id": "US-201",
"title": "MobileBottomNav activ pe Dashboard",
"description": "Ca utilizator mobil vreau să văd footer navigation și pe Dashboard pentru navigare ușoară",
"priority": 1,
"acceptanceCriteria": [
"DashboardView.vue include MobileBottomNav component",
"Link-ul 'Rapoarte' din nav este activ/highlighted pe Dashboard",
"MobileTopBar adăugat cu title 'Dashboard'",
"Verify in browser: navigarea funcționează din Dashboard",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 1"
},
{
"id": "US-202",
"title": "MobileDrawerMenu Material Design cu Profil",
"description": "Ca utilizator mobil vreau meniul hamburger să aibă design Material cu secțiune profil",
"priority": 2,
"acceptanceCriteria": [
"Componentă src/shared/components/mobile/MobileDrawerMenu.vue creată",
"Secțiuni: Header cu logo, Navigare principală, Profil utilizator (nume + logout)",
"Link-uri navigare: Dashboard, Bonuri, Facturi, Balanță, Trezorerie, Setări",
"Active state pe link-ul curent (bazat pe route)",
"Animație slide-in de la stânga",
"Close pe tap outside sau pe link click",
"Dark mode support",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 2"
},
{
"id": "US-208",
"title": "Actualizare Router cu noile rute",
"description": "Ca developer vreau router-ul configurat pentru noile pagini",
"priority": 3,
"acceptanceCriteria": [
"Rută /reports/maturity-analysis → MaturityAnalysisView (lazy loaded)",
"Rută /reports/detailed-invoices → DetailedInvoicesView (lazy loaded)",
"Rută /settings → SettingsHubView (lazy loaded)",
"Redirect /data-entry/ocr-metrics accesibil din Settings Hub",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 3"
},
{
"id": "US-206",
"title": "Creare Pagină Hub Setări",
"description": "Ca utilizator vreau o pagină centrală cu toate opțiunile de setări",
"priority": 4,
"acceptanceCriteria": [
"View nou: src/modules/reports/views/SettingsHubView.vue",
"Route: /settings",
"Carduri pentru: OCR Setări, Cache Stats, Loguri Server, Telegram (dacă admin)",
"MobileTopBar cu title 'Setări'",
"MobileBottomNav cu Setări activ",
"Click pe card navighează la pagina respectivă",
"Design responsive (grid 2x2 pe mobil, 4 columns pe desktop)",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 4"
},
{
"id": "US-204",
"title": "Creare Pagină Analiză Scadențe",
"description": "Ca utilizator vreau o pagină dedicată pentru analiza scadențelor clienți/furnizori",
"priority": 5,
"acceptanceCriteria": [
"View nou: src/modules/reports/views/MaturityAnalysisView.vue",
"Route: /reports/maturity-analysis",
"Conține componenta MaturityAndDetailsCard (partea de analiză scadențe)",
"MobileTopBar cu title 'Analiză Scadențe' și buton ← Înapoi la Dashboard",
"MobileBottomNav activ",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 5"
},
{
"id": "US-205",
"title": "Creare Pagină Facturi Detaliate",
"description": "Ca utilizator vreau o pagină dedicată pentru tabelul facturilor detaliate",
"priority": 6,
"acceptanceCriteria": [
"View nou: src/modules/reports/views/DetailedInvoicesView.vue",
"Route: /reports/detailed-invoices",
"Conține componenta/partea de tabel detaliat din MaturityAndDetailsCard",
"MobileTopBar cu title 'Facturi Detaliate' și buton ← Înapoi",
"MobileBottomNav activ",
"Filtre în BottomSheet pe mobil",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 6"
},
{
"id": "US-203",
"title": "Dashboard KPIs Only View",
"description": "Ca utilizator mobil vreau Dashboard-ul principal să arate doar KPI cards pentru acces rapid",
"priority": 7,
"acceptanceCriteria": [
"DashboardView.vue pe mobil afișează DOAR: SwipeableCards cu KPIs",
"Adăugare 2 carduri quick-link: 'Analiză Scadențe →' și 'Facturi Detaliate →'",
"Click pe quick-link navighează la pagina dedicată",
"Desktop rămâne neschimbat (toate secțiunile)",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 7"
},
{
"id": "US-212",
"title": "Quick Links în Dashboard Mobile",
"description": "Ca utilizator vreau carduri clickabile în Dashboard pentru a ajunge la Scadențe și Facturi",
"priority": 8,
"acceptanceCriteria": [
"După SwipeableCards, 2 carduri: 'Analiză Scadențe' și 'Facturi Detaliate'",
"Design: icon + titlu + săgeată dreaptă (→)",
"Click navighează la pagina respectivă",
"Doar pe mobil (desktop are totul în aceeași pagină)",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 8"
},
{
"id": "US-207",
"title": "Actualizare MobileBottomNav cu link Setări",
"description": "Ca utilizator vreau butonul Setări din footer să ducă la Hub Setări",
"priority": 9,
"acceptanceCriteria": [
"MobileBottomNav: link Setări → /settings (nu /data-entry/ocr-metrics)",
"Icon: pi-cog",
"Active state când pe /settings sau /settings/* sau pagini admin",
"Actualizare în toate paginile care folosesc MobileBottomNav",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 9"
},
{
"id": "US-213",
"title": "Actualizare Hamburger Menu în toate paginile",
"description": "Ca utilizator vreau hamburger menu-ul să funcționeze uniform în toată aplicația",
"priority": 10,
"acceptanceCriteria": [
"Toate paginile cu MobileTopBar: click pe ☰ deschide MobileDrawerMenu",
"MobileDrawerMenu înlocuiește vechiul Sidebar pe mobil",
"Desktop păstrează navigarea existentă",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 10"
},
{
"id": "US-210",
"title": "Creare MobileActionBar Component",
"description": "Ca developer vreau componentă reutilizabilă pentru butoane de acțiune pe mobil",
"priority": 11,
"acceptanceCriteria": [
"Componentă src/shared/components/mobile/MobileActionBar.vue creată",
"Props: actions (array of {label, icon, severity, handler, disabled})",
"Layout: butoane full-width sau side-by-side (2 butoane)",
"Position: fixed bottom, above MobileBottomNav",
"Animație: slide-up la mount",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 11"
},
{
"id": "US-209",
"title": "Butoane Context-Aware în Editare Bon",
"description": "Ca utilizator vreau butoanele din editare bon să se schimbe în funcție de starea bonului",
"priority": 12,
"acceptanceCriteria": [
"ReceiptCreateUnifiedView detectează starea bonului (draft/pending/approved/rejected)",
"Draft: Salvează | Submit pentru Aprobare | Șterge",
"Pending: Salvează | Aprobă | Respinge (dacă are permisiuni)",
"Approved: doar vizualizare (butoane disabled sau ascunse)",
"Rejected: Salvează (re-edit) | Re-submit",
"Butoane în MobileActionBar fix jos pe mobil",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 12"
},
{
"id": "US-211",
"title": "Integrare MobileActionBar în ReceiptCreateUnifiedView",
"description": "Ca utilizator vreau butoanele de acțiune pentru bon să fie în action bar pe mobil",
"priority": 13,
"acceptanceCriteria": [
"ReceiptCreateUnifiedView folosește MobileActionBar pe mobil",
"Desktop păstrează butoanele în form",
"Buton Înapoi în MobileTopBar (deja există din US-105)",
"Action bar dispare când se deschide BottomSheet sau alte overlay-uri",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 13"
},
{
"id": "US-214",
"title": "Actualizare Documentație MOBILE_PATTERNS.md",
"description": "Ca developer viitor vreau documentația actualizată cu noile componente și pattern-uri",
"priority": 14,
"acceptanceCriteria": [
"Secțiune nouă: MobileDrawerMenu (usage, props)",
"Secțiune nouă: MobileActionBar (usage, props)",
"Secțiune actualizată: Navigation patterns (footer → settings hub)",
"Diagrame ASCII actualizate cu noile rute",
"npm run build passes (doar pentru validare că nu s-a stricat nimic)"
],
"passes": true,
"notes": "Completed in iteration 14"
}
]
}

View File

@@ -1,7 +1,7 @@
{
"projectName": "mobile-navigation-improvements",
"projectName": "mobile-fixes-phase3",
"branchName": "ralph/unified-mobile-md",
"description": "Extinderea navigării mobile cu Dashboard split, Settings Hub, MobileDrawerMenu și butoane context-aware",
"description": "Corectări navigare mobilă: footer restructurat, tab-uri Clienți/Furnizori, FAB pe Bonuri, hamburger grupat",
"cssRules": {
"documentation": [
"docs/ONBOARDING_CSS.md",
@@ -14,10 +14,9 @@
"Verifică CSS_PATTERNS.md înainte de a scrie CSS nou",
"Testează în AMBELE teme (light + dark mode)",
"NICIODATĂ :deep() în componente (PrimeVue → vendor/)",
"NICIODATĂ duplicate CSS (write once, use everywhere)",
"Mobile: toate paginile folosesc MobileTopBar + MobileBottomNav",
"Mobile: filtrele se pun în BottomSheet, NU inline",
"Mobile: selecția afișează acțiuni în footer, NU în header"
"Mobile: tab-uri pentru switch Clienți/Furnizori"
],
"mobileLayoutTokens": {
"topBarHeight": "56px",
@@ -29,225 +28,189 @@
},
"userStories": [
{
"id": "US-201",
"title": "MobileBottomNav activ pe Dashboard",
"description": "Ca utilizator mobil vreau să văd footer navigation și pe Dashboard pentru navigare ușoară",
"id": "US-307",
"title": "Restructurare Footer Nav (4 butoane noi)",
"description": "Ca utilizator mobil vreau footer navigation cu: Dashboard | Bonuri | Facturi | Setări",
"priority": 1,
"acceptanceCriteria": [
"DashboardView.vue include MobileBottomNav component",
"Link-ul 'Rapoarte' din nav este activ/highlighted pe Dashboard",
"MobileTopBar adăugat cu title 'Dashboard'",
"Verify in browser: navigarea funcționează din Dashboard",
"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"
],
"passes": true,
"notes": "Completed in iteration 1"
},
{
"id": "US-202",
"title": "MobileDrawerMenu Material Design cu Profil",
"description": "Ca utilizator mobil vreau meniul hamburger să aibă design Material cu secțiune profil",
"id": "US-308",
"title": "Actualizare Hamburger Menu - Grupat pe Categorii",
"description": "Ca utilizator mobil vreau meniul hamburger organizat pe categorii clare",
"priority": 2,
"acceptanceCriteria": [
"Componentă src/shared/components/mobile/MobileDrawerMenu.vue creată",
"Secțiuni: Header cu logo, Navigare principală, Profil utilizator (nume + logout)",
"Link-uri navigare: Dashboard, Bonuri, Facturi, Balanță, Trezorerie, Setări",
"Active state pe link-ul curent (bazat pe route)",
"Animație slide-in de la stânga",
"Close pe tap outside sau pe link click",
"Dark mode support",
"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"
],
"passes": true,
"notes": "Completed in iteration 2"
"passes": false,
"notes": ""
},
{
"id": "US-208",
"title": "Actualizare Router cu noile rute",
"description": "Ca developer vreau router-ul configurat pentru noile pagini",
"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",
"priority": 3,
"acceptanceCriteria": [
"Rută /reports/maturity-analysis → MaturityAnalysisView (lazy loaded)",
"Rută /reports/detailed-invoices → DetailedInvoicesView (lazy loaded)",
"Rută /settings → SettingsHubView (lazy loaded)",
"Redirect /data-entry/ocr-metrics accesibil din Settings Hub",
"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"
],
"passes": true,
"notes": "Completed in iteration 3"
"passes": false,
"notes": ""
},
{
"id": "US-206",
"title": "Creare Pagină Hub Setări",
"description": "Ca utilizator vreau o pagină centrală cu toate opțiunile de setări",
"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",
"priority": 4,
"acceptanceCriteria": [
"View nou: src/modules/reports/views/SettingsHubView.vue",
"Route: /settings",
"Carduri pentru: OCR Setări, Cache Stats, Loguri Server, Telegram (dacă admin)",
"MobileTopBar cu title 'Setări'",
"MobileBottomNav cu Setări activ",
"Click pe card navighează la pagina respectivă",
"Design responsive (grid 2x2 pe mobil, 4 columns pe desktop)",
"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"
],
"passes": true,
"notes": "Completed in iteration 4"
"passes": false,
"notes": ""
},
{
"id": "US-204",
"title": "Creare Pagină Analiză Scadențe",
"description": "Ca utilizator vreau o pagină dedicată pentru analiza scadențelor clienți/furnizori",
"id": "US-301",
"title": "Buton Înapoi în Creare/Editare/Vizualizare Bon",
"description": "Ca utilizator mobil vreau buton ← Înapoi în MobileTopBar pe pagina de bon",
"priority": 5,
"acceptanceCriteria": [
"View nou: src/modules/reports/views/MaturityAnalysisView.vue",
"Route: /reports/maturity-analysis",
"Conține componenta MaturityAndDetailsCard (partea de analiză scadențe)",
"MobileTopBar cu title 'Analiză Scadențe' și buton ← Înapoi la Dashboard",
"MobileBottomNav activ",
"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ă",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 5"
"passes": false,
"notes": ""
},
{
"id": "US-205",
"title": "Creare Pagină Facturi Detaliate",
"description": "Ca utilizator vreau o pagină dedicată pentru tabelul facturilor detaliate",
"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",
"priority": 6,
"acceptanceCriteria": [
"View nou: src/modules/reports/views/DetailedInvoicesView.vue",
"Route: /reports/detailed-invoices",
"Conține componenta/partea de tabel detaliat din MaturityAndDetailsCard",
"MobileTopBar cu title 'Facturi Detaliate' și buton ← Înapoi",
"MobileBottomNav activ",
"Filtre în BottomSheet pe mobil",
"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"
],
"passes": true,
"notes": "Completed in iteration 6"
"passes": false,
"notes": ""
},
{
"id": "US-203",
"title": "Dashboard KPIs Only View",
"description": "Ca utilizator mobil vreau Dashboard-ul principal să arate doar KPI cards pentru acces rapid",
"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",
"priority": 7,
"acceptanceCriteria": [
"DashboardView.vue pe mobil afișează DOAR: SwipeableCards cu KPIs",
"Adăugare 2 carduri quick-link: 'Analiză Scadențe →' și 'Facturi Detaliate →'",
"Click pe quick-link navighează la pagina dedicată",
"Desktop rămâne neschimbat (toate secțiunile)",
"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"
],
"passes": true,
"notes": "Completed in iteration 7"
"passes": false,
"notes": ""
},
{
"id": "US-212",
"title": "Quick Links în Dashboard Mobile",
"description": "Ca utilizator vreau carduri clickabile în Dashboard pentru a ajunge la Scadențe și Facturi",
"id": "US-306",
"title": "Restaurare Butoane Export și Filtrare pe Rapoarte",
"description": "Ca utilizator mobil vreau butoane de export și filtrare pe toate rapoartele",
"priority": 8,
"acceptanceCriteria": [
"După SwipeableCards, 2 carduri: 'Analiză Scadențe' și 'Facturi Detaliate'",
"Design: icon + titlu + săgeată dreaptă (→)",
"Click navighează la pagina respectivă",
"Doar pe mobil (desktop are totul în aceeași pagină)",
"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",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 8"
"passes": false,
"notes": ""
},
{
"id": "US-207",
"title": "Actualizare MobileBottomNav cu link Setări",
"description": "Ca utilizator vreau butonul Setări din footer să ducă la Hub Setări",
"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": [
"MobileBottomNav: link Setări → /settings (nu /data-entry/ocr-metrics)",
"Icon: pi-cog",
"Active state când pe /settings sau /settings/* sau pagini admin",
"Actualizare în toate paginile care folosesc MobileBottomNav",
"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 9"
"passes": false,
"notes": ""
},
{
"id": "US-213",
"title": "Actualizare Hamburger Menu în toate paginile",
"description": "Ca utilizator vreau hamburger menu-ul să funcționeze uniform în toată aplicația",
"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": [
"Toate paginile cu MobileTopBar: click pe ☰ deschide MobileDrawerMenu",
"MobileDrawerMenu înlocuiește vechiul Sidebar pe mobil",
"Desktop păstrează navigarea existentă",
"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 10"
"passes": false,
"notes": ""
},
{
"id": "US-210",
"title": "Creare MobileActionBar Component",
"description": "Ca developer vreau componentă reutilizabilă pentru butoane de acțiune pe mobil",
"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": [
"Componentă src/shared/components/mobile/MobileActionBar.vue creată",
"Props: actions (array of {label, icon, severity, handler, disabled})",
"Layout: butoane full-width sau side-by-side (2 butoane)",
"Position: fixed bottom, above MobileBottomNav",
"Animație: slide-up la mount",
"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 11"
},
{
"id": "US-209",
"title": "Butoane Context-Aware în Editare Bon",
"description": "Ca utilizator vreau butoanele din editare bon să se schimbe în funcție de starea bonului",
"priority": 12,
"acceptanceCriteria": [
"ReceiptCreateUnifiedView detectează starea bonului (draft/pending/approved/rejected)",
"Draft: Salvează | Submit pentru Aprobare | Șterge",
"Pending: Salvează | Aprobă | Respinge (dacă are permisiuni)",
"Approved: doar vizualizare (butoane disabled sau ascunse)",
"Rejected: Salvează (re-edit) | Re-submit",
"Butoane în MobileActionBar fix jos pe mobil",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 12"
},
{
"id": "US-211",
"title": "Integrare MobileActionBar în ReceiptCreateUnifiedView",
"description": "Ca utilizator vreau butoanele de acțiune pentru bon să fie în action bar pe mobil",
"priority": 13,
"acceptanceCriteria": [
"ReceiptCreateUnifiedView folosește MobileActionBar pe mobil",
"Desktop păstrează butoanele în form",
"Buton Înapoi în MobileTopBar (deja există din US-105)",
"Action bar dispare când se deschide BottomSheet sau alte overlay-uri",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 13"
},
{
"id": "US-214",
"title": "Actualizare Documentație MOBILE_PATTERNS.md",
"description": "Ca developer viitor vreau documentația actualizată cu noile componente și pattern-uri",
"priority": 14,
"acceptanceCriteria": [
"Secțiune nouă: MobileDrawerMenu (usage, props)",
"Secțiune nouă: MobileActionBar (usage, props)",
"Secțiune actualizată: Navigation patterns (footer → settings hub)",
"Diagrame ASCII actualizate cu noile rute",
"npm run build passes (doar pentru validare că nu s-a stricat nimic)"
],
"passes": true,
"notes": "Completed in iteration 14"
"passes": false,
"notes": ""
}
]
}

View File

@@ -1,90 +1,17 @@
# Ralph Progress Log - Phase 2
Started: Mon Jan 12 12:03:01 PM UTC 2026
Project: mobile-navigation-improvements
# Ralph Progress Log - Phase 3
Started: Mon Jan 12 01:35:36 PM UTC 2026
Project: mobile-fixes-phase3
Branch: ralph/unified-mobile-md (continuing)
User Stories: 14 (US-201 to US-214)
User Stories: 11 (US-301 to US-311)
---
[2026-01-12 12:03:07] Starting Ralph for project: mobile-navigation-improvements
[2026-01-12 12:03:07] Max iterations: 100
[2026-01-12 12:03:07] === Iteration 1/100 ===
[2026-01-12 12:03:07] Working on story: US-201
[2026-01-12 12:03:07] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_1_US-201.log)
[2026-01-12 12:05:02] SUCCESS: Story US-201 passed!
[2026-01-12 12:05:02] Changes committed
[2026-01-12 12:05:02] Progress: 1/14 stories completed
[2026-01-12 12:05:04] === Iteration 2/100 ===
[2026-01-12 12:05:04] Working on story: US-202
[2026-01-12 12:05:04] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_2_US-202.log)
[2026-01-12 12:07:29] SUCCESS: Story US-202 passed!
[2026-01-12 12:07:29] Changes committed
[2026-01-12 12:07:29] Progress: 2/14 stories completed
[2026-01-12 12:07:31] === Iteration 3/100 ===
[2026-01-12 12:07:31] Working on story: US-208
[2026-01-12 12:07:31] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_3_US-208.log)
[2026-01-12 12:09:57] SUCCESS: Story US-208 passed!
[2026-01-12 12:09:57] Changes committed
[2026-01-12 12:09:57] Progress: 3/14 stories completed
[2026-01-12 12:09:59] === Iteration 4/100 ===
[2026-01-12 12:09:59] Working on story: US-206
[2026-01-12 12:09:59] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_4_US-206.log)
[2026-01-12 12:12:24] SUCCESS: Story US-206 passed!
[2026-01-12 12:12:24] Changes committed
[2026-01-12 12:12:24] Progress: 4/14 stories completed
[2026-01-12 12:12:26] === Iteration 5/100 ===
[2026-01-12 12:12:26] Working on story: US-204
[2026-01-12 12:12:26] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_5_US-204.log)
[2026-01-12 12:14:24] SUCCESS: Story US-204 passed!
[2026-01-12 12:14:24] Changes committed
[2026-01-12 12:14:24] Progress: 5/14 stories completed
[2026-01-12 12:14:26] === Iteration 6/100 ===
[2026-01-12 12:14:26] Working on story: US-205
[2026-01-12 12:14:26] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_6_US-205.log)
[2026-01-12 12:21:23] SUCCESS: Story US-205 passed!
[2026-01-12 12:21:24] Changes committed
[2026-01-12 12:21:24] Progress: 6/14 stories completed
[2026-01-12 12:21:26] === Iteration 7/100 ===
[2026-01-12 12:21:26] Working on story: US-203
[2026-01-12 12:21:26] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_7_US-203.log)
[2026-01-12 12:23:00] SUCCESS: Story US-203 passed!
[2026-01-12 12:23:00] Changes committed
[2026-01-12 12:23:00] Progress: 7/14 stories completed
[2026-01-12 12:23:02] === Iteration 8/100 ===
[2026-01-12 12:23:02] Working on story: US-212
[2026-01-12 12:23:02] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_8_US-212.log)
[2026-01-12 12:23:50] SUCCESS: Story US-212 passed!
[2026-01-12 12:23:50] Changes committed
[2026-01-12 12:23:50] Progress: 8/14 stories completed
[2026-01-12 12:23:52] === Iteration 9/100 ===
[2026-01-12 12:23:52] Working on story: US-207
[2026-01-12 12:23:52] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_9_US-207.log)
[2026-01-12 12:28:03] SUCCESS: Story US-207 passed!
[2026-01-12 12:28:03] Changes committed
[2026-01-12 12:28:03] Progress: 9/14 stories completed
[2026-01-12 12:28:05] === Iteration 10/100 ===
[2026-01-12 12:28:05] Working on story: US-213
[2026-01-12 12:28:05] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_10_US-213.log)
[2026-01-12 12:36:45] SUCCESS: Story US-213 passed!
[2026-01-12 12:36:45] Changes committed
[2026-01-12 12:36:45] Progress: 10/14 stories completed
[2026-01-12 12:36:47] === Iteration 11/100 ===
[2026-01-12 12:36:47] Working on story: US-210
[2026-01-12 12:36:47] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_11_US-210.log)
[2026-01-12 12:38:10] SUCCESS: Story US-210 passed!
[2026-01-12 12:38:10] Changes committed
[2026-01-12 12:38:10] Progress: 11/14 stories completed
[2026-01-12 12:38:12] === Iteration 12/100 ===
[2026-01-12 12:38:12] Working on story: US-209
[2026-01-12 12:38:12] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_12_US-209.log)
[2026-01-12 12:40:29] SUCCESS: Story US-209 passed!
[2026-01-12 12:40:29] Changes committed
[2026-01-12 12:40:29] Progress: 12/14 stories completed
[2026-01-12 12:40:31] === Iteration 13/100 ===
[2026-01-12 12:40:31] Working on story: US-211
[2026-01-12 12:40:31] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_13_US-211.log)
[2026-01-12 12:42:01] SUCCESS: Story US-211 passed!
[2026-01-12 12:42:01] Changes committed
[2026-01-12 12:42:01] Progress: 13/14 stories completed
[2026-01-12 12:42:03] === Iteration 14/100 ===
[2026-01-12 12:42:03] Working on story: US-214
[2026-01-12 12:42:03] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_14_US-214.log)
[2026-01-12 12:45:42] SUCCESS: Story US-214 passed!
[2026-01-12 13:35:41] Starting Ralph for project: mobile-fixes-phase3
[2026-01-12 13:35:41] Max iterations: 100
[2026-01-12 13:35:41] === Iteration 1/100 ===
[2026-01-12 13:35:41] Working on story: US-307
[2026-01-12 13:35:41] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_1_US-307.log)
[2026-01-12 13:35:46] Starting Ralph for project: mobile-fixes-phase3
[2026-01-12 13:35:46] Max iterations: 100
[2026-01-12 13:35:46] === Iteration 1/100 ===
[2026-01-12 13:35:46] Working on story: US-307
[2026-01-12 13:35:46] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_1_US-307.log)
[2026-01-12 13:38:58] SUCCESS: Story US-307 passed!

View File

@@ -558,11 +558,8 @@
</Transition>
<!-- US-103: Mobile Bottom Navigation (using shared component) -->
<MobileBottomNav
v-if="isMobile && !mobileSelectionMode"
:items="mobileBottomNavItems"
@item-click="handleBottomNavClick"
/>
<!-- US-307: Using default nav items (Dashboard, Bonuri, Facturi, Setări) -->
<MobileBottomNav v-if="isMobile && !mobileSelectionMode" />
<!-- Desktop: Compact Data Table with Batch Grouping (US-002) -->
<!-- US-104: Explicit !isMobile check (not v-else) to ensure bulk-actions-bar only shows on desktop -->
@@ -1119,20 +1116,8 @@ const handleTopBarAction = (action) => {
}
}
// US-103: Bottom nav items for MobileBottomNav component
const mobileBottomNavItems = computed(() => [
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri', active: true },
{ icon: 'pi pi-cloud-upload', label: 'Upload' }, // No 'to' - handled via item-click
{ to: '/reports/dashboard', icon: 'pi pi-chart-bar', label: 'Rapoarte' },
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări' }
])
// US-103: Handle bottom nav clicks for items without routes
const handleBottomNavClick = (item) => {
if (item.label === 'Upload') {
openBulkFileInput()
}
}
// US-307: Removed custom mobileBottomNavItems - using MobileBottomNav defaults
// Upload functionality moved to FAB (US-303)
// US-103/US-113: Selection footer actions for MobileSelectionFooter component
// Bonuri batch actions: Delete + Export

View File

@@ -381,11 +381,8 @@
</Card>
</div>
<!-- US-109: Mobile Bottom Navigation -->
<MobileBottomNav
v-if="isMobile"
:items="mobileBottomNavItems"
/>
<!-- US-109/US-307: Mobile Bottom Navigation (using default nav items) -->
<MobileBottomNav v-if="isMobile" />
</div>
</template>
@@ -459,12 +456,7 @@ const handleTopBarAction = (action) => {
};
// US-109: Bottom nav items for MobileBottomNav component
const mobileBottomNavItems = computed(() => [
{ to: "/data-entry", icon: "pi pi-receipt", label: "Bonuri" },
{ to: "/reports/bank-cash-register", icon: "pi pi-wallet", label: "Trezorerie", active: true },
{ to: "/reports/dashboard", icon: "pi pi-chart-bar", label: "Rapoarte" },
{ to: "/settings", icon: "pi pi-cog", label: "Setări" }
]);
// US-307: Removed custom mobileBottomNavItems - using MobileBottomNav defaults
// Handle window resize
const handleResize = () => {

View File

@@ -197,8 +197,8 @@
</template>
</Dialog>
<!-- US-111: Mobile Bottom Navigation -->
<MobileBottomNav v-if="isMobile" :items="mobileBottomNavItems" />
<!-- US-111/US-307: Mobile Bottom Navigation (using default nav items) -->
<MobileBottomNav v-if="isMobile" />
</div>
</template>
@@ -263,18 +263,7 @@ const handleTopBarAction = (action) => {
}
};
// US-111: Bottom nav items for MobileBottomNav component
const mobileBottomNavItems = computed(() => [
{ to: "/data-entry", icon: "pi pi-receipt", label: "Bonuri" },
{
to: "/reports/cache-stats",
icon: "pi pi-database",
label: "Cache",
active: true,
},
{ to: "/reports/dashboard", icon: "pi pi-chart-bar", label: "Rapoarte" },
{ to: "/settings", icon: "pi pi-cog", label: "Setări" },
]);
// US-307: Removed custom mobileBottomNavItems - using MobileBottomNav defaults
// US-111: Handle window resize
const handleResize = () => {

View File

@@ -179,8 +179,8 @@
</div>
</main>
<!-- Mobile Bottom Nav -->
<MobileBottomNav v-if="isMobile" :items="mobileNavItems" />
<!-- Mobile Bottom Nav - US-307: Using default nav items -->
<MobileBottomNav v-if="isMobile" />
</template>
<script setup>
@@ -539,13 +539,8 @@ const handleResize = () => {
windowWidth.value = window.innerWidth;
};
// Mobile navigation items with 'Rapoarte' active (since Dashboard is /reports/dashboard)
const mobileNavItems = computed(() => [
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri' },
{ icon: 'pi pi-cloud-upload', label: 'Upload' },
{ to: '/reports/dashboard', icon: 'pi pi-chart-bar', label: 'Rapoarte', active: true },
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări' }
]);
// US-307: Removed custom mobileNavItems - using MobileBottomNav defaults
// Dashboard is now at /dashboard with its own nav item
// Handle logout from drawer menu
const handleLogout = async () => {

View File

@@ -350,8 +350,8 @@
</div>
</main>
<!-- Mobile Bottom Nav -->
<MobileBottomNav v-if="isMobile" :items="mobileNavItems" />
<!-- Mobile Bottom Nav - US-307: Using default nav items -->
<MobileBottomNav v-if="isMobile" />
<!-- Mobile Filters BottomSheet -->
<BottomSheet v-model="isFilterSheetOpen">
@@ -483,12 +483,7 @@ const topBarActions = computed(() => [
])
// Mobile navigation items
const mobileNavItems = computed(() => [
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri' },
{ icon: 'pi pi-cloud-upload', label: 'Upload' },
{ to: '/reports/dashboard', icon: 'pi pi-chart-bar', label: 'Rapoarte', active: true },
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări' }
])
// US-307: Removed custom mobileNavItems - using MobileBottomNav defaults
// Currency formatter
const formatCurrency = (value) => {

View File

@@ -364,11 +364,8 @@
</Card>
</div>
<!-- US-107: Mobile Bottom Navigation -->
<MobileBottomNav
v-if="isMobile"
:items="mobileBottomNavItems"
/>
<!-- US-107/US-307: Mobile Bottom Navigation (using default nav items) -->
<MobileBottomNav v-if="isMobile" />
</div>
</template>
@@ -442,13 +439,7 @@ const handleTopBarAction = (action) => {
}
};
// US-107: Bottom nav items for MobileBottomNav component
const mobileBottomNavItems = computed(() => [
{ to: "/data-entry", icon: "pi pi-receipt", label: "Bonuri" },
{ to: "/reports/invoices", icon: "pi pi-file-text", label: "Facturi", active: true },
{ to: "/reports/dashboard", icon: "pi pi-chart-bar", label: "Rapoarte" },
{ to: "/settings", icon: "pi pi-cog", label: "Setări" }
]);
// US-307: Removed custom mobileBottomNavItems - using MobileBottomNav defaults
// Handle window resize
const handleResize = () => {

View File

@@ -40,8 +40,8 @@
</div>
</main>
<!-- Mobile Bottom Nav -->
<MobileBottomNav v-if="isMobile" :items="mobileNavItems" />
<!-- Mobile Bottom Nav - US-307: Using default nav items -->
<MobileBottomNav v-if="isMobile" />
</template>
<script setup>
@@ -76,12 +76,7 @@ const handlePeriodChange = (period) => {
}
// Mobile navigation items
const mobileNavItems = computed(() => [
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri' },
{ icon: 'pi pi-cloud-upload', label: 'Upload' },
{ to: '/reports/dashboard', icon: 'pi pi-chart-bar', label: 'Rapoarte', active: true },
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări' }
])
// US-307: Removed custom mobileNavItems - using MobileBottomNav defaults
// Lifecycle
onMounted(() => {

View File

@@ -123,11 +123,8 @@
</template>
</Card>
<!-- US-110: Mobile Bottom Navigation -->
<MobileBottomNav
v-if="isMobile"
:items="mobileBottomNavItems"
/>
<!-- US-110/US-307: Mobile Bottom Navigation (using default nav items) -->
<MobileBottomNav v-if="isMobile" />
</div>
</template>
@@ -218,13 +215,7 @@ const handleTopBarAction = (action) => {
}
}
// US-110: Bottom nav items for MobileBottomNav component
const mobileBottomNavItems = computed(() => [
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri' },
{ to: '/reports/server-logs', icon: 'pi pi-file-edit', label: 'Loguri', active: true },
{ to: '/reports/dashboard', icon: 'pi pi-chart-bar', label: 'Rapoarte' },
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări' }
])
// US-307: Removed custom mobileBottomNavItems - using MobileBottomNav defaults
// US-110: Handle window resize
const handleResize = () => {

View File

@@ -78,8 +78,8 @@
</div>
</main>
<!-- Mobile Bottom Nav -->
<MobileBottomNav v-if="isMobile" :items="mobileNavItems" />
<!-- Mobile Bottom Nav - US-307: Using default nav items -->
<MobileBottomNav v-if="isMobile" />
</template>
<script setup>
@@ -111,13 +111,7 @@ const handleLogout = async () => {
router.push('/login')
}
// Mobile navigation items - Settings is active on this page
const mobileNavItems = computed(() => [
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri' },
{ icon: 'pi pi-cloud-upload', label: 'Upload' },
{ to: '/reports/dashboard', icon: 'pi pi-chart-bar', label: 'Rapoarte' },
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări', active: true }
])
// US-307: Removed custom mobileNavItems - using MobileBottomNav defaults
// Lifecycle
onMounted(() => {

View File

@@ -360,11 +360,8 @@
</Card>
</div>
<!-- US-108: Mobile Bottom Navigation -->
<MobileBottomNav
v-if="isMobile"
:items="mobileBottomNavItems"
/>
<!-- US-108/US-307: Mobile Bottom Navigation (using default nav items) -->
<MobileBottomNav v-if="isMobile" />
</div>
</template>
@@ -429,13 +426,7 @@ const handleTopBarAction = (action) => {
}
};
// US-108: Bottom nav items for MobileBottomNav component
const mobileBottomNavItems = computed(() => [
{ to: "/data-entry", icon: "pi pi-receipt", label: "Bonuri" },
{ to: "/reports/trial-balance", icon: "pi pi-calculator", label: "Balanță", active: true },
{ to: "/reports/dashboard", icon: "pi pi-chart-bar", label: "Rapoarte" },
{ to: "/settings", icon: "pi pi-cog", label: "Setări" }
]);
// US-307: Removed custom mobileBottomNavItems - using MobileBottomNav defaults
// Handle window resize
const handleResize = () => {

View File

@@ -130,13 +130,19 @@ const routes = [
}
]
},
{
path: '/dashboard',
name: 'MainDashboard',
component: () => import('@reports/views/DashboardView.vue'),
meta: { requiresAuth: true, title: 'Dashboard - ROA2WEB' }
},
{
path: '/',
redirect: '/reports/dashboard'
redirect: '/dashboard'
},
{
path: '/:pathMatch(.*)*',
redirect: '/reports/dashboard'
redirect: '/dashboard'
}
]

View File

@@ -42,9 +42,9 @@
* - item-click: Emitted when a button item (without `to`) is clicked
*
* Default items (4 links):
* - Dashboard (/dashboard)
* - Bonuri (/data-entry)
* - Upload (action button)
* - Rapoarte (/reports/dashboard)
* - Facturi (/reports/invoices)
* - Setări (/settings)
*/
@@ -56,9 +56,9 @@ defineProps({
items: {
type: Array,
default: () => [
{ to: '/dashboard', icon: 'pi pi-home', label: 'Dashboard' },
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri' },
{ icon: 'pi pi-cloud-upload', label: 'Upload' },
{ to: '/reports/dashboard', icon: 'pi pi-chart-bar', label: 'Rapoarte' },
{ to: '/reports/invoices', icon: 'pi pi-file-edit', label: 'Facturi' },
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări' }
],
validator: (items) => {

View File

@@ -0,0 +1,400 @@
# PRD: Mobile Navigation Fixes - Phase 3
## 1. Introducere
Acest PRD continuă îmbunătățirile mobile din fazele anterioare, adresând bugfix-uri și ajustări identificate în testare. Scopul este corectarea navigării, restaurarea funcționalităților lipsă și restructurarea meniului footer pentru o experiență consistentă.
**Branch de lucru:** `ralph/unified-mobile-md` (continuare)
## 2. Obiective
### Obiectiv Principal
- **Corectare navigare**: Buton Înapoi funcțional, footer nav consistent pe toate paginile
### Obiective Secundare
- Restaurare butoane export/filtrare pe paginile de rapoarte
- Restructurare footer: Dashboard, Bonuri, Facturi, Setări
- Tab-uri Clienți/Furnizori în Facturi și Scadențe
- Upload doar în butonul + pe pagina Bonuri
### Metrici de Succes
- 100% pagini mobile au footer nav funcțional
- Buton Înapoi pe toate paginile de editare/vizualizare
- Export/Filtrare disponibile pe toate rapoartele
## 3. User Stories
---
### US-301: Buton Înapoi în Creare/Editare/Vizualizare Bon
**Ca** utilizator mobil
**Vreau** buton ← Înapoi în MobileTopBar pe pagina de bon
**Pentru că** acum nu pot reveni la lista de bonuri fără hamburger menu
**Acceptance Criteria:**
- [ ] 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ă
- [ ] npm run build passes
---
### US-302: Footer Nav pe toate Paginile de Setări
**Ca** utilizator mobil
**Vreau** MobileBottomNav pe toate paginile din secțiunea Setări
**Pentru că** unele pagini (OCR Metrics, Cache Stats, Loguri) nu au footer
**Acceptance Criteria:**
- [ ] OCRMetricsView.vue include MobileBottomNav
- [ ] CacheStatsView.vue include MobileBottomNav
- [ ] ServerLogsView.vue include MobileBottomNav
- [ ] TelegramAdminView.vue include MobileBottomNav (dacă există)
- [ ] SettingsHubView.vue include MobileBottomNav (verificare)
- [ ] Setări activ/highlighted în footer pe aceste pagini
- [ ] npm run build passes
---
### US-303: Mutare Upload din Footer în Butonul + pe Bonuri
**Ca** utilizator mobil
**Vreau** funcția Upload să fie în butonul FAB (+) pe pagina Bonuri
**Pentru că** Upload nu are sens în footer pe alte pagini
**Acceptance Criteria:**
- [ ] MobileBottomNav NU mai are link/buton Upload
- [ ] ReceiptsListView.vue are buton FAB (+) în colțul dreapta-jos
- [ ] Click pe FAB deschide meniu: "Bon Nou" | "Upload Bulk"
- [ ] FAB poziționat deasupra MobileBottomNav (bottom: 72px)
- [ ] Verify in browser: FAB apare doar pe pagina Bonuri
- [ ] npm run build passes
---
### US-304: Tab-uri Clienți/Furnizori în Facturi
**Ca** utilizator
**Vreau** pagina Facturi să aibă tab-uri pentru Clienți și Furnizori
**Pentru că** vreau să comut rapid între cele două perspective
**Acceptance Criteria:**
- [ ] InvoicesView.vue modificat cu tab-uri: "Clienți" | "Furnizori"
- [ ] Tab-uri în MobileTopBar sau sub el (design Material)
- [ ] 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
---
### US-305: Tab-uri Clienți/Furnizori în Scadențe
**Ca** utilizator
**Vreau** pagina Scadențe să aibă tab-uri pentru Clienți și Furnizori
**Pentru că** vreau să comut rapid între cele două perspective
**Acceptance Criteria:**
- [ ] MaturityAnalysisView.vue modificat cu tab-uri: "Clienți" | "Furnizori"
- [ ] Tab-uri în MobileTopBar sau sub el (design Material)
- [ ] 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"
- [ ] MobileBottomNav activ (Rapoarte în hamburger menu)
- [ ] Buton ← Înapoi în MobileTopBar
- [ ] npm run build passes
---
### US-306: Restaurare Butoane Export și Filtrare pe Rapoarte (Mobil)
**Ca** utilizator mobil
**Vreau** butoane de export și filtrare pe Facturi, Balanță, Casa/Banca, Lista Bonuri
**Pentru că** aceste funcționalități au dispărut în implementarea anterioară
**Acceptance Criteria:**
- [ ] InvoicesView.vue: buton Export în MobileTopBar actions
- [ ] InvoicesView.vue: buton Filtrare care deschide BottomSheet
- [ ] TrialBalanceView.vue: buton Export în MobileTopBar actions
- [ ] TrialBalanceView.vue: buton Filtrare care deschide BottomSheet
- [ ] BankCashRegisterView.vue: buton Export în MobileTopBar actions
- [ ] BankCashRegisterView.vue: buton Filtrare care deschide BottomSheet
- [ ] ReceiptsListView.vue: buton Export în MobileTopBar actions
- [ ] ReceiptsListView.vue: buton Filtrare care deschide BottomSheet
- [ ] MaturityAnalysisView.vue: buton Export în MobileTopBar actions
- [ ] MaturityAnalysisView.vue: buton Filtrare care deschide BottomSheet
- [ ] Icons: pi-download (export), pi-filter (filtre)
- [ ] npm run build passes
---
### US-307: Restructurare Footer Nav (4 butoane noi)
**Ca** utilizator mobil
**Vreau** footer navigation cu: Dashboard | Bonuri | Facturi | Setări
**Pentru că** vreau acces rapid la cele mai folosite secțiuni
**Acceptance Criteria:**
- [ ] MobileBottomNav cu 4 butoane: Dashboard, Bonuri, Facturi, Setări
- [ ] Dashboard: icon pi-home sau pi-chart-bar, 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
---
### US-308: Actualizare Hamburger Menu - Grupat pe Categorii
**Ca** utilizator mobil
**Vreau** meniul hamburger organizat pe categorii clare
**Pentru că** vreau să găsesc rapid paginile de care am nevoie
**Acceptance Criteria:**
- [ ] MobileDrawerMenu.vue restructurat cu secțiuni:
- [ ] 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 "SETĂRI":
- [ ] Setări → /settings (hub)
- [ ] Separatori vizuali între secțiuni
- [ ] Header cu logo
- [ ] Footer cu profil utilizator și logout
- [ ] npm run build passes
---
### US-309: Cleanup Dashboard Mobile
**Ca** utilizator mobil
**Vreau** Dashboard-ul să afișeze doar KPIs fără quick-links
**Pentru că** navigarea se face din footer și hamburger menu
**Acceptance Criteria:**
- [ ] 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
---
### US-310: Actualizare Router cu Modificările
**Ca** developer
**Vreau** router-ul actualizat pentru noile pagini și modificări
**Pentru că** navigarea trebuie să funcționeze corect
**Acceptance Criteria:**
- [ ] Rută /reports/invoices → InvoicesView (cu tab-uri)
- [ ] Rută /reports/maturity-analysis → MaturityAnalysisView (cu tab-uri)
- [ ] Rutele existente păstrate: /reports/trial-balance, /reports/bank-cash
- [ ] Rutele /reports/detailed-invoices funcționale
- [ ] Cleanup rute nefolosite (dacă există)
- [ ] Toate rutele lazy loaded
- [ ] npm run build passes
---
### US-311: Actualizare Documentație MOBILE_PATTERNS.md
**Ca** developer viitor
**Vreau** documentația actualizată cu modificările din Phase 3
**Pentru că** pattern-urile s-au schimbat
**Acceptance Criteria:**
- [ ] 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
---
## 4. Cerințe Funcționale
1. [REQ-001] Toate paginile de editare/vizualizare au buton Înapoi în MobileTopBar
2. [REQ-002] Footer nav are exact 4 butoane: Dashboard, Bonuri, Facturi, Setări
3. [REQ-003] Upload accesibil DOAR din FAB pe pagina Bonuri
4. [REQ-004] Facturi cu tab-uri Clienți/Furnizori
5. [REQ-005] Scadențe cu tab-uri Clienți/Furnizori
6. [REQ-006] Toate rapoartele au butoane Export și Filtrare pe mobil
7. [REQ-007] Hamburger menu organizat pe categorii: Principale, Rapoarte, Analize, Setări
8. [REQ-008] Dashboard afișează doar KPIs pe mobil
## 5. Non-Goals (Ce NU facem)
- ❌ Nu modificăm layout-ul desktop
- ❌ Nu adăugăm funcționalități noi în backend
- ❌ Nu schimbăm logica de business
- ❌ Nu modificăm stilurile cardurilor existente
- ❌ Nu implementăm notificări sau animații complexe
- ❌ Nu creăm pagini separate pentru Clienți/Furnizori (folosim tab-uri)
## 6. Considerații Tehnice
### Stack/Tehnologii
- Vue 3 Composition API
- Vue Router pentru navigare
- Componente existente: MobileTopBar, MobileBottomNav, BottomSheet, MobileDrawerMenu
- PrimeVue TabView sau custom tabs pentru Clienți/Furnizori
### Patterns de Urmat
- Tab Pattern pentru switch între perspective
- FAB Pattern pentru acțiuni contextuale
- BottomSheet pentru filtre pe mobil
### Dependențe
- US-307 trebuie făcut primul (footer restructurare)
- US-304 și US-305 pot fi făcute în paralel (tab-uri)
- US-308 poate fi făcut independent (hamburger menu)
### Riscuri Tehnice
- **Risc scăzut**: Tab-uri în pagini existente pot necesita refactoring
- Mitigare: Folosire PrimeVue TabView sau custom component simplu
## 7. Considerații UI/UX
### Structură Footer Navigation Nouă
```
┌─────────────────────────────────────────────┐
│ MOBILE BOTTOM NAV (4 butoane) │
├───────────┬───────────┬───────────┬─────────┤
│ Dashboard │ Bonuri │ Facturi │ Setări │
│ 🏠 │ 🧾 │ 📄 │ ⚙️ │
│/dashboard │/data-entry│ /reports/ │/settings│
│ │ │ invoices │ │
└───────────┴───────────┴───────────┴─────────┘
```
### FAB pe Pagina Bonuri
```
┌─────────────────────────────────────────────┐
│ Lista Bonuri 🔍 📥 ☰ │
├─────────────────────────────────────────────┤
│ │
│ [Bon 1] │
│ [Bon 2] │
│ [Bon 3] │
│ ┌───┐ │
│ │ + │ │ ← FAB
│ └───┘ │
├─────────────────────────────────────────────┤
│ Dashboard │ Bonuri │ Facturi │ Setări │
└─────────────────────────────────────────────┘
Click pe FAB →
┌─────────────────┐
│ 📝 Bon Nou │
│ 📤 Upload Bulk │
└─────────────────┘
```
### Pagina Facturi cu Tab-uri
```
┌─────────────────────────────────────────────┐
│ Facturi 🔍 📥 ☰ │
├─────────────────────────────────────────────┤
│ ┌─────────────┬─────────────┐ │
│ │ Clienți │ Furnizori │ ← Tab-uri │
│ └─────────────┴─────────────┘ │
├─────────────────────────────────────────────┤
│ │
│ [Factură 1] │
│ [Factură 2] │
│ [Factură 3] │
│ │
├─────────────────────────────────────────────┤
│ Dashboard │ Bonuri │ Facturi │ Setări │
└─────────────────────────────────────────────┘
```
### Pagina Scadențe cu Tab-uri
```
┌─────────────────────────────────────────────┐
│ ← Scadențe 🔍 📥 ☰ │
├─────────────────────────────────────────────┤
│ ┌─────────────┬─────────────┐ │
│ │ Clienți │ Furnizori │ ← Tab-uri │
│ └─────────────┴─────────────┘ │
├─────────────────────────────────────────────┤
│ │
│ [Scadență 1] │
│ [Scadență 2] │
│ [Scadență 3] │
│ │
├─────────────────────────────────────────────┤
│ Dashboard │ Bonuri │ Facturi │ Setări │
└─────────────────────────────────────────────┘
```
### Hamburger Menu Actualizat (Grupat pe Categorii)
```
┌─────────────────────────────────────────────┐
│ [Logo ROA2WEB] │
│─────────────────────────────────────────────│
│ PRINCIPALE │
│ 🏠 Dashboard │
│ 🧾 Bonuri │
│─────────────────────────────────────────────│
│ RAPOARTE │
│ 📄 Facturi │
│ 📊 Balanță │
│ 💰 Casa și Banca │
│─────────────────────────────────────────────│
│ ANALIZE │
│ ⏰ Scadențe │
│ 📋 Facturi Detaliate │
│─────────────────────────────────────────────│
│ ADMINISTRARE │
│ ⚙️ Setări │
│─────────────────────────────────────────────│
│ 👤 [Username] │
│ [Logout] │
└─────────────────────────────────────────────┘
```
## 8. Success Metrics
- **Navigare**: 100% pagini cu footer nav funcțional
- **Consistență**: Tab-uri identice în Facturi și Scadențe
- **UX**: Max 2 tap-uri pentru orice destinație
- **Funcționalitate**: Export/Filtre disponibile pe toate rapoartele
## 9. Open Questions
- [x] Footer: Dashboard, Bonuri, Facturi, Setări - DA
- [x] Hamburger: Grupat pe categorii - DA
- [x] Facturi/Scadențe: Tab-uri Clienți/Furnizori - DA
---
## Implementare Sugerată (Ordinea User Stories)
### Faza 1: Infrastructură Navigare
1. US-307: Restructurare Footer Nav (4 butoane noi)
2. US-308: Actualizare Hamburger Menu - Grupat pe Categorii
### Faza 2: Tab-uri Clienți/Furnizori
3. US-304: Tab-uri în Facturi
4. US-305: Tab-uri în Scadențe
### Faza 3: Corectări Navigare
5. US-301: Buton Înapoi în editare bon
6. US-302: Footer Nav pe paginile de setări
7. US-303: FAB pe pagina Bonuri (mutare Upload)
### Faza 4: Restaurare Funcționalități
8. US-306: Restaurare Export și Filtrare pe rapoarte
### Faza 5: Cleanup
9. US-309: Cleanup Dashboard Mobile
10. US-310: Actualizare Router
### Faza 6: Documentație
11. US-311: Update MOBILE_PATTERNS.md