# PRD: Mobile Fixes Phase 4 - Layout & State Issues ## 1. Introducere După completarea Phase 3 (11/11 stories), au fost identificate probleme critice în modul mobil prin testare Playwright. Cauza principală este că layout-ul desktop (AppHeader + sidebar) rămâne vizibil pe viewport mobil, acoperind componentele mobile (MobileTopBar, MobileDrawerMenu). În plus, există probleme cu persistența bonurilor cu eroare la upload. ## 2. Obiective ### Obiectiv Principal - Corectarea layout-ului mobil pentru a afișa DOAR componentele mobile pe viewport < 768px ### Obiective Secundare - Restaurarea corectă a bonurilor cu eroare după refresh - Permiterea editării bonurilor cu eroare pentru corectare ### Metrici de Succes - Playwright test: Header desktop ASCUNS pe viewport 375px - Playwright test: MobileTopBar cu butoane filter/export VIZIBILE - Playwright test: MobileDrawerMenu afișează secțiunea ANALIZE - Playwright test: Bonuri cu eroare rămân vizibile după refresh ## 3. User Stories ### US-401: Fix Layout Principal - Ascundere Header Desktop pe Mobil **Ca** utilizator mobil **Vreau** să văd doar MobileTopBar și MobileBottomNav **Pentru că** header-ul desktop ocupă spațiu și acoperă butoanele mobile **Acceptance Criteria:** - [ ] AppHeader.vue are `v-if="!isMobile"` pentru a se ascunde pe mobil - [ ] Sidebar-ul desktop (navigation cu Rapoarte/Introduceri Date/Sistem) este ascuns pe mobil - [ ] MobileTopBar este singurul header vizibil pe viewport < 768px - [ ] Nu există suprapunere între header desktop și MobileTopBar - [ ] npm run build passes - [ ] Verify in browser (375x667): Header desktop NU este vizibil ### US-402: Fix MobileTopBar - Butoane Filter/Export Vizibile **Ca** utilizator mobil pe pagina Facturi/Bonuri **Vreau** să văd butoanele de filtrare și export în header **Pentru că** acum sunt ascunse/acoperite de header-ul desktop **Acceptance Criteria:** - [ ] Pe InvoicesView.vue, butoanele Filter/Refresh/Export sunt vizibile în MobileTopBar - [ ] Pe ReceiptsListView.vue, butoanele Filter/Export/More sunt vizibile în MobileTopBar - [ ] Click pe butonul Filter deschide BottomSheet cu filtre - [ ] Click pe butonul Export declanșează descărcarea - [ ] npm run build passes - [ ] Verify in browser (375x667): Butoanele sunt vizibile și funcționale pe pagina Facturi ### US-403: Fix MobileDrawerMenu - Secțiunea ANALIZE Vizibilă **Ca** utilizator mobil **Vreau** să văd secțiunea ANALIZE în hamburger menu **Pentru că** acum se deschide sidebar-ul desktop în loc de MobileDrawerMenu **Acceptance Criteria:** - [ ] 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, Facturi Detaliate - [ ] Link-urile din ANALIZE navighează corect - [ ] npm run build passes - [ ] Verify in browser (375x667): Click pe Meniu → apare drawer cu secțiunea ANALIZE ### US-404: Fix Spațiu Blank - Padding Corect pentru Mobile **Ca** utilizator mobil **Vreau** ca paginile să nu aibă spațiu blank excesiv în partea de sus **Pentru că** acum există ~120px spațiu gol unde ar fi header-ul desktop **Acceptance Criteria:** - [ ] Paginile de rapoarte au padding-top corect pentru MobileTopBar (56px) - [ ] Nu există spațiu blank între MobileTopBar și conținut - [ ] Tab-urile Clienți/Furnizori sunt imediat sub MobileTopBar - [ ] npm run build passes - [ ] Verify in browser (375x667): Nu există spațiu blank excesiv pe pagina Facturi ### US-405: Fix batchProgressStore - Restaurare Joburi Failed **Ca** utilizator care a uploadat bonuri cu erori OCR **Vreau** ca bonurile cu eroare să rămână vizibile după refresh **Pentru că** acum dispar și nu pot fi editate **Acceptance Criteria:** - [ ] `restoreJobsFromBatch()` în batchProgressStore.js include joburi cu status 'failed' - [ ] Batch-ul NU este șters din localStorage dacă are joburi failed - [ ] După refresh, bonurile cu eroare sunt afișate cu status vizual "Eroare" - [ ] `unifiedItems` computed include joburile failed pentru afișare - [ ] npm run build passes - [ ] Verify in browser: Upload bon cu eroare → Refresh → Bonul cu eroare rămâne vizibil ### US-406: Fix UI Bonuri cu Eroare - Afișare Corectă pe Mobil **Ca** utilizator mobil **Vreau** să văd clar că un bon are eroare (nu "în procesare") **Pentru că** acum bonurile failed arată ca și cum ar fi încă în procesare **Acceptance Criteria:** - [ ] Bonurile cu status 'failed' afișează chip/badge "Eroare" (roșu) - [ ] NU afișează "În procesare" pentru bonuri failed - [ ] Mesajul de eroare este vizibil (truncat dacă e prea lung) - [ ] npm run build passes - [ ] Verify in browser (375x667): Bon cu eroare arată "Eroare" nu "În procesare" ### US-407: Fix Editare Bonuri cu Eroare **Ca** utilizator care are un bon cu eroare OCR **Vreau** să pot edita bonul pentru a corecta erorile manual **Pentru că** acum nu pot salva modificările sau re-trimite pe workflow **Acceptance Criteria:** - [ ] Click pe bon cu eroare deschide formularul de editare - [ ] La salvare, `processing_status` este resetat la NULL - [ ] După salvare, bonul poate fi trimis pe workflow (Submit for Approval) - [ ] Backend endpoint PATCH /receipts/{id} resetează processing_status - [ ] npm run build passes - [ ] Verify in browser: Editează bon cu eroare → Salvează → Poate fi trimis pe workflow ### US-408: Verificare Finală cu Playwright **Ca** developer **Vreau** verificare automată a tuturor fix-urilor **Pentru că** trebuie confirmate toate scenariile înainte de merge **Acceptance Criteria:** - [ ] Test 1: Viewport 375x667 → Header desktop ASCUNS - [ ] Test 2: Viewport 375x667 → MobileTopBar cu butoane VIZIBILE - [ ] Test 3: Click Meniu → MobileDrawerMenu cu ANALIZE - [ ] Test 4: Pagina Facturi → Tab-uri + butoane imediat vizibile (fără blank) - [ ] Test 5: Upload bon cu eroare → Arată "Eroare" nu "În procesare" - [ ] Test 6: Refresh → Bonul cu eroare rămâne - [ ] npm run build passes ## 4. Cerințe Funcționale 1. [REQ-001] Pe viewport < 768px, AppHeader și sidebar desktop trebuie ascunse complet 2. [REQ-002] MobileTopBar trebuie să fie singurul header vizibil pe mobil 3. [REQ-003] MobileDrawerMenu trebuie să se deschidă la click pe butonul Meniu din MobileTopBar 4. [REQ-004] Butoanele actions din MobileTopBar trebuie să fie vizibile și funcționale 5. [REQ-005] batchProgressStore trebuie să restaureze și să afișeze joburi cu status 'failed' 6. [REQ-006] Editarea unui bon cu eroare trebuie să reseteze processing_status pentru re-workflow ## 5. Non-Goals (Ce NU facem) - NU modificăm layout-ul desktop (rămâne neschimbat) - NU adăugăm funcționalități noi (doar fix-uri) - NU modificăm stilurile cardurilor de bonuri - NU schimbăm structura hamburger menu (doar ne asigurăm că se deschide corect) ## 6. Considerații Tehnice ### Stack/Tehnologii - Vue 3 Composition API - PrimeVue components - Pinia stores (batchProgressStore) - CSS media queries / v-if cu isMobile computed ### Patterns de Urmat - `isMobile` computed bazat pe `window.innerWidth < 768` - `v-if="!isMobile"` pentru componente desktop-only - `v-if="isMobile"` pentru componente mobile-only ### Fișiere Cheie de Modificat | Fișier | Modificare | |--------|------------| | `src/App.vue` sau layout component | v-if pentru AppHeader/sidebar | | `src/shared/components/layout/AppHeader.vue` | Verificare isMobile | | `src/modules/reports/views/InvoicesView.vue` | CSS padding-top | | `src/modules/data-entry/views/ReceiptsListView.vue` | CSS padding-top | | `src/stores/batchProgressStore.js` | Include 'failed' în restore | | `backend/modules/data_entry/routers/receipts.py` | Reset processing_status | ### Riscuri Tehnice - Modificarea layout-ului principal poate afecta toate paginile - testare completă necesară - isMobile computed trebuie să fie reactiv la resize ## 7. Considerații UI/UX - Mobile layout trebuie să fie curat, fără suprapuneri - Butoanele touch target minim 48px - Feedback vizual clar pentru starea bonurilor (Eroare vs În procesare) - Tranziție smooth pentru MobileDrawerMenu ## 8. Success Metrics - 100% teste Playwright trec - 0 suprapuneri vizuale pe viewport mobil - Bonuri cu eroare persistent după refresh - Timp de încărcare pagină neschimbat ## 9. Open Questions - [x] Cauza exactă a problemei? → Header desktop nu este ascuns pe mobil (confirmat prin Playwright) - [x] isMobile computed există? → Trebuie verificat în layout principal - [ ] Există alte pagini afectate de layout? → De verificat după fix