{ "projectName": "mobile-fixes-phase4", "branchName": "ralph/unified-mobile-md", "description": "Fix layout mobil: ascundere header desktop, butoane filter/export vizibile, MobileDrawerMenu cu ANALIZE, persistență bonuri cu eroare", "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/)", "Mobile: toate paginile folosesc MobileTopBar + MobileBottomNav", "Mobile: filtrele se pun în BottomSheet, NU inline", "Mobile: v-if='isMobile' pentru componente mobile-only", "Desktop: v-if='!isMobile' pentru componente desktop-only" ], "mobileLayoutTokens": { "topBarHeight": "56px", "bottomNavHeight": "56px", "fabSize": "56px", "fabBottomOffset": "72px", "touchTargetMin": "48px" } }, "userStories": [ { "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": [ "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-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": [ "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": false, "notes": "Depinde de US-401 - butoanele există dar sunt acoperite de header-ul desktop" }, { "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": [ "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": false, "notes": "Depinde de US-401 - hamburger-ul deschidea sidebar-ul desktop" }, { "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": [ "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": false, "notes": "Depinde de US-401 - spațiul era ocupat de header-ul desktop ascuns incorect" }, { "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": [ "Î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": false, "notes": "" }, { "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": [ "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": false, "notes": "Depinde de US-405 - bonurile failed trebuie să fie în listă mai întâi" }, { "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": [ "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": false, "notes": "" }, { "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": [ "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": false, "notes": "" } ] }