Implemented by Ralph autonomous loop. Iteration: 8 Co-Authored-By: Claude <noreply@anthropic.com>
162 lines
7.9 KiB
JSON
162 lines
7.9 KiB
JSON
{
|
|
"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": true,
|
|
"notes": "Completed - CSS media queries hide desktop header, buttons visible at 375x667. Touch targets 48px verified."
|
|
},
|
|
{
|
|
"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": true,
|
|
"notes": "Completed in iteration 3"
|
|
},
|
|
{
|
|
"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": true,
|
|
"notes": "Completed with US-401/US-402 - hiding desktop header eliminated the blank space. Screenshots confirm content starts immediately below MobileTopBar."
|
|
},
|
|
{
|
|
"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": true,
|
|
"notes": "Completed in iteration 4"
|
|
},
|
|
{
|
|
"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": true,
|
|
"notes": "Completed in iteration 5"
|
|
},
|
|
{
|
|
"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": true,
|
|
"notes": "Completed in iteration 7"
|
|
},
|
|
{
|
|
"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": true,
|
|
"notes": "Completed in iteration 8"
|
|
}
|
|
]
|
|
}
|