feat(dashboard-solduri): Complete dashboard solduri v2 implementation
## Features - US-2001: Create reusable SolduriCompactCard component - US-2004: Solduri section on Desktop (top, without title) - US-2005: Remove MaturityAndDetailsCard from Dashboard - US-2006: Integrate Solduri data from dashboardStore - US-2007: Visual indicators for financial status - US-2008: Refresh button in Dashboard header ## UI Improvements - Desktop: 2x2 grid for solduri cards with larger breakdown fonts - Mobile: Single column layout with auto height - Theme persistence: synchronous initialization to prevent flash - Unified "Bonuri" icon (pi-shopping-bag) across all navigation ## Files Changed - New: SolduriCompactCard.vue - expandable cards for Trezorerie/Clienți/Furnizori/TVA - Modified: DashboardView.vue - integrated solduri section - Modified: index.html - theme init script - Modified: Mobile navigation components - icon consistency Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,15 @@
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
||||
<meta name="apple-mobile-web-app-title" content="ROA2WEB" />
|
||||
<link rel="apple-touch-icon" href="/roa2web/icon-192.png" />
|
||||
<!-- Theme initialization - MUST be before any rendering to prevent flash -->
|
||||
<script>
|
||||
(function() {
|
||||
var theme = localStorage.getItem('user-theme');
|
||||
if (theme && theme !== 'auto') {
|
||||
document.documentElement.setAttribute('data-theme', theme);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<!-- Service Worker Registration for PWA -->
|
||||
<script>
|
||||
if ('serviceWorker' in navigator) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"projectName": "ui-fixes-phase6",
|
||||
"branchName": "ralph/ui-fixes-phase6",
|
||||
"description": "UI/UX Fixes Phase 6 - Menu Consistency & Mobile Improvements + Phase 5 Regressions Fix",
|
||||
"projectName": "dashboard-solduri-v2",
|
||||
"branchName": "ralph/dashboard-solduri",
|
||||
"description": "Adăugare secțiune Solduri în Dashboard: mobil = prima pagină swipe (grid 2x2), grafice = paginile 2-5 (păstrate ca în main). Desktop = Secțiune Solduri + Secțiune Grafice, fără titluri.",
|
||||
"cssRules": {
|
||||
"documentation": [
|
||||
"docs/ONBOARDING_CSS.md",
|
||||
@@ -11,213 +11,147 @@
|
||||
],
|
||||
"goldenRules": [
|
||||
"Folosește DOAR design tokens - NICIODATĂ valori hardcodate",
|
||||
"Verifică CSS_PATTERNS.md înainte de a scrie CSS nou",
|
||||
"NU modifica cardurile grafice originale (TreasuryDualCard, etc.) - rămân IDENTICE",
|
||||
"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"
|
||||
}
|
||||
"Mobile: touch targets minim 44x44px",
|
||||
"Mobile: prima pagină swipe = grid 2x2 solduri",
|
||||
"Mobile: paginile 2-5 swipe = cardurile grafice ORIGINALE din main"
|
||||
]
|
||||
},
|
||||
"referenceFiles": {
|
||||
"designReference": "src/modules/reports/views/InvoicesView.vue",
|
||||
"mobileComponents": [
|
||||
"src/shared/components/mobile/MobileTopBar.vue",
|
||||
"src/shared/components/mobile/MobileDrawerMenu.vue",
|
||||
"src/shared/components/mobile/MobileBottomNav.vue",
|
||||
"src/shared/components/mobile/BottomSheet.vue",
|
||||
"src/shared/components/mobile/MobileSelectionFooter.vue"
|
||||
]
|
||||
"dashboardView": "src/modules/reports/views/DashboardView.vue",
|
||||
"swipeableCards": "src/shared/components/mobile/SwipeableCards.vue",
|
||||
"graficcards": [
|
||||
"src/modules/reports/components/dashboard/cards/TreasuryDualCard.vue",
|
||||
"src/modules/reports/components/dashboard/cards/CashFlowMetricCard.vue",
|
||||
"src/modules/reports/components/dashboard/cards/ClientiBalanceCard.vue",
|
||||
"src/modules/reports/components/dashboard/cards/FurnizoriBalanceCard.vue"
|
||||
],
|
||||
"backupComponents": "/tmp/dashboard-backup/"
|
||||
},
|
||||
"userStories": [
|
||||
{
|
||||
"id": "US-601",
|
||||
"title": "Adăugare Secțiune Analize în Sidebar Desktop",
|
||||
"description": "Ca utilizator desktop, vreau să văd secțiunea Analize în sidebar-ul din stânga",
|
||||
"id": "US-2001",
|
||||
"title": "Creare componentă SolduriCompactCard reutilizabilă",
|
||||
"description": "Ca dezvoltator, vreau o componentă card compactă pentru solduri pentru că o voi folosi în grid 2x2 pe mobil și desktop",
|
||||
"priority": 1,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6"
|
||||
},
|
||||
{
|
||||
"id": "US-602",
|
||||
"title": "Tab-uri Clienți/Furnizori în Pagina Scadențe",
|
||||
"description": "Ca utilizator, vreau să pot comuta între Clienți și Furnizori folosind tab-uri",
|
||||
"priority": 2,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6"
|
||||
},
|
||||
{
|
||||
"id": "US-603",
|
||||
"title": "Implementare Pagină Facturi Detaliate",
|
||||
"description": "Ca utilizator, vreau să văd facturi detaliate când accesez Analize > Facturi Detaliate",
|
||||
"priority": 3,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6"
|
||||
},
|
||||
{
|
||||
"id": "US-604",
|
||||
"title": "Toggle Temă cu 3 Stări în Meniul Mobil",
|
||||
"description": "Ca utilizator mobil, vreau selectorul de temă să fie un singur buton toggle cu 3 stări",
|
||||
"priority": 4,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6"
|
||||
},
|
||||
{
|
||||
"id": "US-605",
|
||||
"title": "Companie/Perioadă Colapsabile în Meniul Mobil",
|
||||
"description": "Ca utilizator mobil, vreau secțiunile Companie și Perioadă din meniu să fie colapsabile",
|
||||
"priority": 5,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6 - NOTE: Reverted in US-703"
|
||||
},
|
||||
{
|
||||
"id": "US-606",
|
||||
"title": "Layout Scrollabil Unificat în Meniul Mobil",
|
||||
"description": "Ca utilizator mobil, vreau întregul meniu hamburger să fie într-o singură zonă scrollabilă",
|
||||
"priority": 6,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6"
|
||||
},
|
||||
{
|
||||
"id": "US-607",
|
||||
"title": "Secțiune Utilizator Compactă în Meniul Mobil",
|
||||
"description": "Ca utilizator mobil, vreau secțiunea de utilizator să fie mai compactă",
|
||||
"priority": 7,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6"
|
||||
},
|
||||
{
|
||||
"id": "US-608",
|
||||
"title": "Fix Buton FAB SpeedDial în Lista Bonuri",
|
||||
"description": "Ca utilizator mobil, vreau butonul + din lista bonuri să afișeze un meniu SpeedDial",
|
||||
"priority": 8,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6 - BUT REGRESSION: SpeedDial not imported!"
|
||||
},
|
||||
{
|
||||
"id": "US-609",
|
||||
"title": "Buton Resetează pe Toate Paginile cu Filtre Mobil",
|
||||
"description": "Ca utilizator mobil, vreau butonul Resetează să apară pe toate paginile care au Filtrează",
|
||||
"priority": 9,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6"
|
||||
},
|
||||
{
|
||||
"id": "US-610",
|
||||
"title": "Eliminare Spațiu Gol Deasupra Tabelelor",
|
||||
"description": "Ca utilizator, vreau să nu existe spațiu gol excesiv între filtre și tabele",
|
||||
"priority": 10,
|
||||
"acceptanceCriteria": [
|
||||
"Completed"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in Phase 6"
|
||||
},
|
||||
{
|
||||
"id": "US-701",
|
||||
"title": "Reparare SpeedDial FAB pe Lista Bonuri",
|
||||
"description": "Ca utilizator pe mobil, vreau să văd butonul + în dreapta jos și să pot crea bonuri noi, pentru că este metoda principală de adăugare bonuri pe mobil",
|
||||
"priority": 11,
|
||||
"acceptanceCriteria": [
|
||||
"SpeedDial este importat corect din 'primevue/speeddial' în ReceiptsListView.vue",
|
||||
"Butonul + apare în dreapta jos pe mobil (când nu este în selection mode)",
|
||||
"Click pe + deschide opțiunile: Bon Nou Manual, Scanare OCR, Upload în Masă",
|
||||
"npm run build passes fără warnings legate de SpeedDial",
|
||||
"Verify in browser mobile viewport: FAB vizibil în dreapta jos, click deschide 3 opțiuni"
|
||||
"Creează SolduriCompactCard.vue în src/modules/reports/components/solduri/",
|
||||
"Props: type (trezorerie|clienti|furnizori|tva), total, breakdown (object), casaTotal, bancaTotal (pentru trezorerie)",
|
||||
"Afișează: icon + label (uppercase) + valoare principală formatată românesc",
|
||||
"Click pe card expandează/colapsează breakdown-ul (conturi pentru trezorerie, buckets pentru clienți/furnizori)",
|
||||
"Folosește design tokens: var(--space-md), var(--text-lg), var(--surface-card)",
|
||||
"npm run typecheck passes"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in iteration 1"
|
||||
},
|
||||
{
|
||||
"id": "US-702",
|
||||
"title": "Verificare Meniu Acțiuni Per Bon",
|
||||
"description": "Ca utilizator, vreau să pot accesa meniul de acțiuni (...) pentru fiecare bon, pentru că trebuie să pot edita, șterge, valida bonurile individual",
|
||||
"priority": 12,
|
||||
"id": "US-2002",
|
||||
"title": "Grid 2x2 Solduri pentru prima pagină swipe pe mobil",
|
||||
"description": "Ca utilizator pe mobil, vreau prima pagină din swipe să fie un grid 2x2 cu 4 carduri solduri",
|
||||
"priority": 2,
|
||||
"acceptanceCriteria": [
|
||||
"Butonul ... pe fiecare bon deschide meniul popup cu opțiuni",
|
||||
"Meniul conține opțiunile corecte în funcție de status (Edit, View, Delete, Approve)",
|
||||
"Meniul se poziționează corect pe mobil și desktop (nu iese din viewport)",
|
||||
"npm run build passes"
|
||||
"Modifică SwipeableCards în DashboardView să aibă 5 pagini (sau folosește totalCards=5)",
|
||||
"Prima pagină (card-0 sau echivalent) conține un div cu grid 2x2",
|
||||
"Grid-ul conține 4 SolduriCompactCard: Trezorerie | Clienți / Furnizori | TVA",
|
||||
"Fiecare card primește date din dashboardStore",
|
||||
"Touch target minim 44x44px pentru fiecare card",
|
||||
"npm run typecheck passes",
|
||||
"Verify in browser mobil că prima pagină e grid-ul cu 4 solduri compacte"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Verified in browser - Grid 2x2 shows correctly with 4 SolduriCompactCard on first swipe page"
|
||||
},
|
||||
{
|
||||
"id": "US-2003",
|
||||
"title": "Păstrare carduri grafice originale pe paginile 2-5 mobil",
|
||||
"description": "Ca utilizator pe mobil, vreau paginile 2-5 din swipe să fie cardurile cu grafice originale, exact ca în main",
|
||||
"priority": 3,
|
||||
"acceptanceCriteria": [
|
||||
"Pagina 2 (card-1): TreasuryDualCard cu EXACT aceleași props ca în main",
|
||||
"Pagina 3 (card-2): CashFlowMetricCard cu EXACT aceleași props ca în main",
|
||||
"Pagina 4 (card-3): ClientiBalanceCard cu EXACT aceleași props ca în main",
|
||||
"Pagina 5 (card-4): FurnizoriBalanceCard cu EXACT aceleași props ca în main",
|
||||
"NU modifica componentele grafice - doar le folosești în SwipeableCards",
|
||||
"npm run typecheck passes",
|
||||
"Verify în browser că swipe funcționează fluid între toate 5 paginile"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Verified - Pages 2-5 show original graph cards (TreasuryDualCard, CashFlowMetricCard, etc.). Swipe works fluid."
|
||||
},
|
||||
{
|
||||
"id": "US-2004",
|
||||
"title": "Secțiune Solduri pe Desktop (sus, fără titlu)",
|
||||
"description": "Ca utilizator pe desktop, vreau să văd soldurile într-o secțiune separată sus, fără titlu vizibil",
|
||||
"priority": 4,
|
||||
"acceptanceCriteria": [
|
||||
"Pe desktop (v-if !isMobile), adaugă o secțiune nouă cu clasa desktop-solduri-section",
|
||||
"Secțiunea conține 4 SolduriCompactCard în grid responsive (grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)))",
|
||||
"Fără titlu sau header de secțiune - doar cardurile direct",
|
||||
"Sub această secțiune rămân cardurile grafice originale (metrics-row existent)",
|
||||
"npm run typecheck passes",
|
||||
"Verify în browser desktop că soldurile sunt sus, graficele jos"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in iteration 1"
|
||||
},
|
||||
{
|
||||
"id": "US-2005",
|
||||
"title": "Eliminare MaturityAndDetailsCard de pe Dashboard",
|
||||
"description": "Ca utilizator, vreau Dashboard-ul să nu mai aibă tabelul detaliat de scadențe (există pagina Maturity Analysis)",
|
||||
"priority": 5,
|
||||
"acceptanceCriteria": [
|
||||
"Șterge MaturityAndDetailsCard din template-ul DashboardView.vue",
|
||||
"Șterge div-ul .comparison-row care conținea cardul",
|
||||
"Șterge importul MaturityAndDetailsCard din script setup",
|
||||
"npm run typecheck passes",
|
||||
"Verify: Dashboard nu mai are tabel de analiză scadențe"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in iteration 2"
|
||||
},
|
||||
{
|
||||
"id": "US-703",
|
||||
"title": "Navigare Hamburger pe Paginile Analize",
|
||||
"description": "Ca utilizator pe mobil, vreau să văd meniul hamburger pe paginile Analize (nu săgeata înapoi), pentru că trebuie să pot accesa firma, perioada și navigarea din orice pagină",
|
||||
"priority": 13,
|
||||
"id": "US-2006",
|
||||
"title": "Integrare date Solduri din dashboardStore",
|
||||
"description": "Ca dezvoltator, vreau cardurile solduri să folosească datele existente din dashboardStore fără API calls noi",
|
||||
"priority": 6,
|
||||
"acceptanceCriteria": [
|
||||
"MaturityAnalysisView.vue: MobileTopBar folosește :show-menu='true' și @menu-click='showDrawer = true'",
|
||||
"DetailedInvoicesView.vue: MobileTopBar folosește :show-menu='true' și @menu-click='showDrawer = true'",
|
||||
"Ambele view-uri au MobileDrawerMenu component importat și configurat corect",
|
||||
"Click pe hamburger deschide MobileDrawerMenu cu firma, perioada, tema",
|
||||
"Pattern identic cu InvoicesView.vue (liniile 4-11, 33-42)",
|
||||
"npm run build passes"
|
||||
"SolduriCompactCard pentru Trezorerie: treasuryData.breakdown.casa.total + banca.total, breakdown items",
|
||||
"SolduriCompactCard pentru Clienți: netBalanceData.clienti_total, breakdown.clienti",
|
||||
"SolduriCompactCard pentru Furnizori: netBalanceData.furnizori_total, breakdown.furnizori",
|
||||
"SolduriCompactCard pentru TVA: calculat sau din dashboardStore.summary",
|
||||
"npm run typecheck passes"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in iteration 3"
|
||||
},
|
||||
{
|
||||
"id": "US-704",
|
||||
"title": "Mărire Spațiu Tabel Scadențe",
|
||||
"description": "Ca utilizator, vreau să văd mai multe rânduri în tabelul de scadențe fără să scrollez, pentru că acum încap doar 3-4 rânduri",
|
||||
"priority": 14,
|
||||
"id": "US-2007",
|
||||
"title": "Indicatori vizuali pentru starea financiară",
|
||||
"description": "Ca utilizator, vreau să văd indicatori de avertizare pe cardurile solduri pentru probleme financiare",
|
||||
"priority": 7,
|
||||
"acceptanceCriteria": [
|
||||
"În MaturityAnalysisCard.vue: .maturity-list max-height crescut de la 250px la 400px",
|
||||
"În MaturityAnalysisCard.vue: @media 768px .maturity-list max-height crescut de la 200px la 350px",
|
||||
"min-height pe .tab-content redus pentru a nu forța scroll inutil",
|
||||
"Verify in browser desktop: cel puțin 8-10 rânduri vizibile fără scroll intern"
|
||||
"Indicator dot roșu pe card Clienți dacă restanță > 20% din total",
|
||||
"Indicator dot roșu pe card Furnizori dacă restanță > 20% din total",
|
||||
"TVA: text roșu var(--red-600) dacă negativ (de plată), verde var(--green-600) dacă pozitiv (de recuperat)",
|
||||
"npm run typecheck passes",
|
||||
"Verify în browser că indicatorii sunt vizibili în ambele teme"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in iteration 4"
|
||||
},
|
||||
{
|
||||
"id": "US-705",
|
||||
"title": "Reducere Padding și Margin Top Excesiv",
|
||||
"description": "Ca utilizator, vreau să văd conținutul imediat fără spațiu gol excesiv în partea de sus, pentru că acum partea de sus are prea mult spațiu nefolosit",
|
||||
"priority": 15,
|
||||
"id": "US-2008",
|
||||
"title": "Buton Refresh în header Dashboard",
|
||||
"description": "Ca utilizator, vreau un buton de refresh în header pentru actualizare manuală a datelor",
|
||||
"priority": 8,
|
||||
"acceptanceCriteria": [
|
||||
"Reducere margin-bottom pe .page-header în paginile afectate",
|
||||
"Verificare și ajustare padding pe .app-container dacă e redundant",
|
||||
"Modificările nu afectează negativ layoutul altor pagini",
|
||||
"Verificare vizuală în mod desktop și mobil",
|
||||
"npm run build passes"
|
||||
"Pe mobil: adaugă action cu icon pi-refresh în MobileTopBar actions",
|
||||
"Pe desktop: adaugă Button cu icon refresh lângă titlul Dashboard",
|
||||
"Click declanșează reload date din dashboardStore",
|
||||
"Icon se rotește (animație CSS) în timpul încărcării",
|
||||
"npm run typecheck passes"
|
||||
],
|
||||
"passes": true,
|
||||
"notes": "Completed in iteration 5"
|
||||
|
||||
@@ -1,415 +1,82 @@
|
||||
# Ralph Progress Log
|
||||
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
## Phase 4: Mobile Fixes (COMPLETED ✓)
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
Started: Mon Jan 12 06:34:18 PM UTC 2026
|
||||
Completed: Mon Jan 12 07:58:17 PM UTC 2026
|
||||
Project: mobile-fixes-phase4
|
||||
Branch: ralph/unified-mobile-md
|
||||
Stories: 8/8 completed (US-401 to US-408)
|
||||
|
||||
Summary:
|
||||
- US-401: Fixed desktop header hidden on mobile ✓
|
||||
- US-402: MobileTopBar buttons visible ✓
|
||||
- US-403: MobileDrawerMenu ANALIZE section ✓
|
||||
- US-404: Fixed blank space top padding ✓
|
||||
- US-405: batchProgressStore restores failed jobs ✓
|
||||
- US-406: Error receipts show "Eroare" badge ✓
|
||||
- US-407: Edit receipts with errors works ✓
|
||||
- US-408: Final verification ✓
|
||||
|
||||
Started: $(date)
|
||||
Project: dashboard-solduri-v2
|
||||
Branch: ralph/dashboard-solduri
|
||||
---
|
||||
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
## Phase 5: Unified Mobile & Desktop UI (IN PROGRESS)
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
Started: Sun Jan 12 21:30:00 UTC 2026
|
||||
Project: unified-mobile-desktop-ui
|
||||
Branch: ralph/unified-mobile-md (continuing)
|
||||
Stories: 18 total (US-501 to US-518)
|
||||
## Layout corect cerut:
|
||||
### MOBIL (5 pagini swipe):
|
||||
- Pagina 1: Grid 2x2 cu 4 carduri solduri compacte
|
||||
- Paginile 2-5: Cardurile grafice ORIGINALE (ca în main)
|
||||
|
||||
PRD: tasks/prd-unified-mobile-desktop-ui.md
|
||||
Design Reference: src/modules/reports/views/InvoicesView.vue
|
||||
### DESKTOP:
|
||||
- Secțiune Solduri (sus, fără titlu) - 4 carduri
|
||||
- Secțiune Grafice (jos) - cardurile originale
|
||||
- Fără MaturityAndDetailsCard
|
||||
|
||||
### Stories Overview:
|
||||
|
||||
**Header Actions (1-3):**
|
||||
- [ ] US-501: Header Actions Bar - Rapoarte (5 pages: trial-balance, cash-bank, detailed-invoices/clients, detailed-invoices/suppliers, maturity)
|
||||
- [ ] US-502: Header Actions Bar - Lista Bonuri
|
||||
- [ ] US-503: BottomSheet Filtre - Lista Bonuri (mobil)
|
||||
|
||||
**Backend & Export (4):**
|
||||
- [ ] US-504: Fix Export Endpoints Backend (PDF/XLSX)
|
||||
|
||||
**Meniu & Navigare (5-8):**
|
||||
- [ ] US-505: Meniu Hamburger Desktop = Mobil (structură identică)
|
||||
- [ ] US-506: Fix MobileDrawerMenu - Deconectare Vizibil
|
||||
- [ ] US-507: Selecție Companie/Perioadă în MobileDrawerMenu
|
||||
- [ ] US-508: Selector Temă în MobileDrawerMenu
|
||||
|
||||
**Detailed Invoices Fixes (9-12):**
|
||||
- [ ] US-509: Fix Grupuri Expandabile Desktop
|
||||
- [ ] US-510: Eliminare Filtru Clienți/Furnizori
|
||||
- [ ] US-511: Eliminare Buton Filtru Duplicat
|
||||
- [ ] US-512: Fix Overlay Butoane Ascunse
|
||||
|
||||
**Cleanup (13-14):**
|
||||
- [ ] US-513: Analize Scadențe - Eliminare Secțiune Facturi Detaliate
|
||||
- [ ] US-514: Fix Spațiu Blank Excesiv Top (toate paginile)
|
||||
|
||||
**Material Design Styling (15-18):**
|
||||
- [ ] US-515: Lista Bonuri - Meniu Bon Nou/Bulk Upload MD3
|
||||
- [ ] US-516: Lista Bonuri - Meniu Acțiuni Per Bon MD3
|
||||
- [ ] US-517: Lista Bonuri Desktop - Dialog Ștergere MD3
|
||||
- [ ] US-518: Creare/Vizualizare/Editare Bon - Butoane Doar Sus
|
||||
|
||||
**Separare Rapoarte (19):**
|
||||
- [ ] US-519: Separare Casă și Bancă în Pagini Distincte (/reports/cash, /reports/bank)
|
||||
## User Stories Status
|
||||
- US-2001: SolduriCompactCard - PENDING
|
||||
- US-2002: Grid 2x2 prima pagină mobil - PENDING
|
||||
- US-2003: Păstrare carduri grafice pag 2-5 - PENDING
|
||||
- US-2004: Secțiune Solduri desktop - PENDING
|
||||
- US-2005: Eliminare MaturityAndDetailsCard - PENDING
|
||||
- US-2006: Integrare date din store - PENDING
|
||||
- US-2007: Indicatori vizuali - PENDING
|
||||
- US-2008: Buton Refresh - PENDING
|
||||
|
||||
---
|
||||
|
||||
### Iteration Log:
|
||||
[2026-01-12 22:09:40] Starting Ralph for project: unified-mobile-desktop-ui
|
||||
[2026-01-12 22:09:40] Max iterations: 100
|
||||
[2026-01-12 22:09:40] === Iteration 1/100 ===
|
||||
[2026-01-12 22:09:40] Working on story: US-501
|
||||
[2026-01-12 22:09:40] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_1_US-501.log)
|
||||
[2026-01-12 22:16:53] SUCCESS: Story US-501 passed!
|
||||
[2026-01-12 22:16:53] Changes committed
|
||||
[2026-01-12 22:16:53] Progress: 1/19 stories completed
|
||||
[2026-01-12 22:16:55] === Iteration 2/100 ===
|
||||
[2026-01-12 22:16:55] Working on story: US-502
|
||||
[2026-01-12 22:16:55] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_2_US-502.log)
|
||||
[2026-01-12 22:20:46] SUCCESS: Story US-502 passed!
|
||||
[2026-01-12 22:20:46] Changes committed
|
||||
[2026-01-12 22:20:47] Progress: 2/19 stories completed
|
||||
[2026-01-12 22:20:49] === Iteration 3/100 ===
|
||||
[2026-01-12 22:20:49] Working on story: US-503
|
||||
[2026-01-12 22:20:49] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_3_US-503.log)
|
||||
[2026-01-12 22:23:51] SUCCESS: Story US-503 passed!
|
||||
[2026-01-12 22:23:51] Changes committed
|
||||
[2026-01-12 22:23:51] Progress: 3/19 stories completed
|
||||
[2026-01-12 22:23:53] === Iteration 4/100 ===
|
||||
[2026-01-12 22:23:53] Working on story: US-504
|
||||
[2026-01-12 22:23:53] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_4_US-504.log)
|
||||
[2026-01-12 22:27:34] SUCCESS: Story US-504 passed!
|
||||
[2026-01-12 22:27:34] Changes committed
|
||||
[2026-01-12 22:27:34] Progress: 4/19 stories completed
|
||||
[2026-01-12 22:27:36] === Iteration 5/100 ===
|
||||
[2026-01-12 22:27:36] Working on story: US-505
|
||||
[2026-01-12 22:27:36] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_5_US-505.log)
|
||||
[2026-01-12 22:29:44] SUCCESS: Story US-505 passed!
|
||||
[2026-01-12 22:29:44] Changes committed
|
||||
[2026-01-12 22:29:44] Progress: 5/19 stories completed
|
||||
[2026-01-12 22:29:46] === Iteration 6/100 ===
|
||||
[2026-01-12 22:29:46] Working on story: US-506
|
||||
[2026-01-12 22:29:46] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_6_US-506.log)
|
||||
[2026-01-12 22:36:38] SUCCESS: Story US-506 passed!
|
||||
[2026-01-12 22:36:38] Changes committed
|
||||
[2026-01-12 22:36:38] Progress: 6/19 stories completed
|
||||
[2026-01-12 22:36:40] === Iteration 7/100 ===
|
||||
[2026-01-12 22:36:40] Working on story: US-507
|
||||
[2026-01-12 22:36:40] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_7_US-507.log)
|
||||
[2026-01-12 22:42:54] SUCCESS: Story US-507 passed!
|
||||
[2026-01-12 22:42:54] Changes committed
|
||||
[2026-01-12 22:42:54] Progress: 7/19 stories completed
|
||||
[2026-01-12 22:42:56] === Iteration 8/100 ===
|
||||
[2026-01-12 22:42:56] Working on story: US-508
|
||||
[2026-01-12 22:42:56] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_8_US-508.log)
|
||||
[2026-01-12 22:45:25] SUCCESS: Story US-508 passed!
|
||||
[2026-01-12 22:45:25] Changes committed
|
||||
[2026-01-12 22:45:25] Progress: 8/19 stories completed
|
||||
[2026-01-12 22:45:27] === Iteration 9/100 ===
|
||||
[2026-01-12 22:45:27] Working on story: US-509
|
||||
[2026-01-12 22:45:27] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_9_US-509.log)
|
||||
[2026-01-12 22:48:38] SUCCESS: Story US-509 passed!
|
||||
[2026-01-12 22:48:38] Changes committed
|
||||
[2026-01-12 22:48:38] Progress: 9/19 stories completed
|
||||
[2026-01-12 22:48:40] === Iteration 10/100 ===
|
||||
[2026-01-12 22:48:40] Working on story: US-510
|
||||
[2026-01-12 22:48:40] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_10_US-510.log)
|
||||
[2026-01-12 22:55:24] SUCCESS: Story US-510 passed!
|
||||
[2026-01-12 22:55:25] Changes committed
|
||||
[2026-01-12 22:55:25] Progress: 10/19 stories completed
|
||||
[2026-01-12 22:55:27] === Iteration 11/100 ===
|
||||
[2026-01-12 22:55:27] Working on story: US-511
|
||||
[2026-01-12 22:55:27] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_11_US-511.log)
|
||||
[2026-01-12 22:57:13] SUCCESS: Story US-511 passed!
|
||||
[2026-01-12 22:57:13] Changes committed
|
||||
[2026-01-12 22:57:13] Progress: 11/19 stories completed
|
||||
[2026-01-12 22:57:15] === Iteration 12/100 ===
|
||||
[2026-01-12 22:57:15] Working on story: US-512
|
||||
[2026-01-12 22:57:15] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_12_US-512.log)
|
||||
[2026-01-12 23:05:48] SUCCESS: Story US-512 passed!
|
||||
[2026-01-12 23:05:48] Changes committed
|
||||
[2026-01-12 23:05:48] Progress: 12/19 stories completed
|
||||
[2026-01-12 23:05:50] === Iteration 13/100 ===
|
||||
[2026-01-12 23:05:50] Working on story: US-513
|
||||
[2026-01-12 23:05:50] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_13_US-513.log)
|
||||
[2026-01-12 23:09:55] Story US-513 not yet complete, continuing...
|
||||
[2026-01-12 23:09:55] Progress: 12/19 stories completed
|
||||
[2026-01-12 23:09:57] === Iteration 14/100 ===
|
||||
[2026-01-12 23:09:57] Working on story: US-513
|
||||
[2026-01-12 23:09:57] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_14_US-513.log)
|
||||
[2026-01-12 23:11:56] SUCCESS: Story US-513 passed!
|
||||
[2026-01-12 23:11:56] Changes committed
|
||||
[2026-01-12 23:11:56] Progress: 13/19 stories completed
|
||||
[2026-01-12 23:11:58] === Iteration 15/100 ===
|
||||
[2026-01-12 23:11:58] Working on story: US-514
|
||||
[2026-01-12 23:11:58] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_15_US-514.log)
|
||||
[2026-01-12 23:16:20] SUCCESS: Story US-514 passed!
|
||||
[2026-01-12 23:16:20] Changes committed
|
||||
[2026-01-12 23:16:20] Progress: 14/19 stories completed
|
||||
[2026-01-12 23:16:22] === Iteration 16/100 ===
|
||||
[2026-01-12 23:16:22] Working on story: US-515
|
||||
[2026-01-12 23:16:22] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_16_US-515.log)
|
||||
[2026-01-12 23:24:24] Story US-515 not yet complete, continuing...
|
||||
[2026-01-12 23:24:24] Progress: 14/19 stories completed
|
||||
[2026-01-12 23:24:26] === Iteration 17/100 ===
|
||||
[2026-01-12 23:24:26] Working on story: US-515
|
||||
[2026-01-12 23:24:26] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_17_US-515.log)
|
||||
[2026-01-12 23:28:25] SUCCESS: Story US-515 passed!
|
||||
[2026-01-12 23:28:25] Changes committed
|
||||
[2026-01-12 23:28:25] Progress: 15/19 stories completed
|
||||
[2026-01-12 23:28:27] === Iteration 18/100 ===
|
||||
[2026-01-12 23:28:27] Working on story: US-516
|
||||
[2026-01-12 23:28:27] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_18_US-516.log)
|
||||
[2026-01-12 23:33:04] SUCCESS: Story US-516 passed!
|
||||
[2026-01-12 23:33:04] Changes committed
|
||||
[2026-01-12 23:33:04] Progress: 16/19 stories completed
|
||||
[2026-01-12 23:33:06] === Iteration 19/100 ===
|
||||
[2026-01-12 23:33:06] Working on story: US-517
|
||||
[2026-01-12 23:33:06] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_19_US-517.log)
|
||||
[2026-01-12 23:35:59] SUCCESS: Story US-517 passed!
|
||||
[2026-01-12 23:35:59] Changes committed
|
||||
[2026-01-12 23:35:59] Progress: 17/19 stories completed
|
||||
[2026-01-12 23:36:01] === Iteration 20/100 ===
|
||||
[2026-01-12 23:36:01] Working on story: US-518
|
||||
[2026-01-12 23:36:01] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_20_US-518.log)
|
||||
[2026-01-12 23:39:17] SUCCESS: Story US-518 passed!
|
||||
[2026-01-12 23:39:17] Changes committed
|
||||
[2026-01-12 23:39:17] Progress: 18/19 stories completed
|
||||
[2026-01-12 23:39:19] === Iteration 21/100 ===
|
||||
[2026-01-12 23:39:19] Working on story: US-519
|
||||
[2026-01-12 23:39:19] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_21_US-519.log)
|
||||
[2026-01-12 23:46:11] SUCCESS: Story US-519 passed!
|
||||
[2026-01-12 23:46:11] Changes committed
|
||||
[2026-01-12 23:46:11] Progress: 19/19 stories completed
|
||||
[2026-01-12 23:46:13] === Iteration 22/100 ===
|
||||
[2026-01-12 23:46:13] SUCCESS: All stories completed! 🎉
|
||||
[2026-01-12 23:46:13] === Ralph Session Complete ===
|
||||
[2026-01-12 23:46:13] Final progress: 19/19 stories completed
|
||||
[2026-01-12 23:46:13] Branch: ralph/unified-mobile-md
|
||||
[2026-01-12 23:46:13] Logs: /workspace/roa2web/scripts/ralph/logs
|
||||
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
## Phase 5 COMPLETED ✓
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
|
||||
---
|
||||
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
## Phase 6: UI/UX Fixes - Menu Consistency & Mobile Improvements
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
Started: Mon Jan 13 15:45:00 UTC 2026
|
||||
Project: ui-fixes-phase6
|
||||
Branch: ralph/ui-fixes-phase6
|
||||
Stories: 10 total (US-601 to US-610)
|
||||
|
||||
PRD: tasks/prd-ui-fixes-phase6.md
|
||||
|
||||
### Stories Overview:
|
||||
|
||||
**Desktop Menu Consistency (1):**
|
||||
- [ ] US-601: Adăugare Secțiune Analize în Sidebar Desktop
|
||||
|
||||
**Analize Pages Fixes (2-3):**
|
||||
- [ ] US-602: Tab-uri Clienți/Furnizori în Pagina Scadențe
|
||||
- [ ] US-603: Implementare Pagină Facturi Detaliate (NEW)
|
||||
|
||||
**Mobile Menu Improvements (4-7):**
|
||||
- [ ] US-604: Toggle Temă cu 3 Stări în Meniul Mobil
|
||||
- [ ] US-605: Companie/Perioadă Colapsabile în Meniul Mobil
|
||||
- [ ] US-606: Layout Scrollabil Unificat în Meniul Mobil
|
||||
- [ ] US-607: Secțiune Utilizator Compactă în Meniul Mobil
|
||||
|
||||
**Bug Fixes (8-10):**
|
||||
- [ ] US-608: Fix Buton FAB SpeedDial în Lista Bonuri
|
||||
- [ ] US-609: Buton Resetează pe Toate Paginile cu Filtre Mobil
|
||||
- [ ] US-610: Eliminare Spațiu Gol Deasupra Tabelelor
|
||||
|
||||
---
|
||||
|
||||
### Iteration Log:
|
||||
[2026-01-13 16:00:01] Starting Ralph for project: ui-fixes-phase6
|
||||
[2026-01-13 16:00:01] Max iterations: 30
|
||||
[2026-01-13 16:00:01] Creating new branch: ralph/ui-fixes-phase6
|
||||
[2026-01-13 16:00:01] === Iteration 1/30 ===
|
||||
[2026-01-13 16:00:01] Working on story: US-601
|
||||
[2026-01-13 16:00:01] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_1_US-601.log)
|
||||
[2026-01-13 16:02:32] SUCCESS: Story US-601 passed!
|
||||
[2026-01-13 16:02:32] Changes committed
|
||||
[2026-01-13 16:02:32] Progress: 1/10 stories completed
|
||||
[2026-01-13 16:02:34] === Iteration 2/30 ===
|
||||
[2026-01-13 16:02:34] Working on story: US-602
|
||||
[2026-01-13 16:02:34] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_2_US-602.log)
|
||||
[2026-01-13 16:08:47] SUCCESS: Story US-602 passed!
|
||||
[2026-01-13 16:08:47] Changes committed
|
||||
[2026-01-13 16:08:47] Progress: 2/10 stories completed
|
||||
[2026-01-13 16:08:49] === Iteration 3/30 ===
|
||||
[2026-01-13 16:08:49] Working on story: US-603
|
||||
[2026-01-13 16:08:49] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_3_US-603.log)
|
||||
[2026-01-13 16:11:33] SUCCESS: Story US-603 passed!
|
||||
[2026-01-13 16:11:33] Changes committed
|
||||
[2026-01-13 16:11:33] Progress: 3/10 stories completed
|
||||
[2026-01-13 16:11:35] === Iteration 4/30 ===
|
||||
[2026-01-13 16:11:35] Working on story: US-604
|
||||
[2026-01-13 16:11:35] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_4_US-604.log)
|
||||
[2026-01-13 16:17:04] Story US-604 not yet complete, continuing...
|
||||
[2026-01-13 16:17:04] Progress: 3/10 stories completed
|
||||
[2026-01-13 16:17:06] === Iteration 5/30 ===
|
||||
[2026-01-13 16:17:06] Working on story: US-604
|
||||
[2026-01-13 16:17:06] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_5_US-604.log)
|
||||
[2026-01-13 16:18:21] SUCCESS: Story US-604 passed!
|
||||
[2026-01-13 16:18:22] Changes committed
|
||||
[2026-01-13 16:18:22] Progress: 4/10 stories completed
|
||||
[2026-01-13 16:18:24] === Iteration 6/30 ===
|
||||
[2026-01-13 16:18:24] Working on story: US-605
|
||||
[2026-01-13 16:18:24] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_6_US-605.log)
|
||||
[2026-01-13 16:23:39] SUCCESS: Story US-605 passed!
|
||||
[2026-01-13 16:23:39] Changes committed
|
||||
[2026-01-13 16:23:39] Progress: 5/10 stories completed
|
||||
[2026-01-13 16:23:41] === Iteration 7/30 ===
|
||||
[2026-01-13 16:23:41] Working on story: US-606
|
||||
[2026-01-13 16:23:41] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_7_US-606.log)
|
||||
[2026-01-13 16:29:48] SUCCESS: Story US-606 passed!
|
||||
[2026-01-13 16:29:48] Changes committed
|
||||
[2026-01-13 16:29:48] Progress: 6/10 stories completed
|
||||
[2026-01-13 16:29:50] === Iteration 8/30 ===
|
||||
[2026-01-13 16:29:50] Working on story: US-607
|
||||
[2026-01-13 16:29:50] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_8_US-607.log)
|
||||
[2026-01-13 16:33:08] SUCCESS: Story US-607 passed!
|
||||
[2026-01-13 16:33:08] Changes committed
|
||||
[2026-01-13 16:33:08] Progress: 7/10 stories completed
|
||||
[2026-01-13 16:33:10] === Iteration 9/30 ===
|
||||
[2026-01-13 16:33:10] Working on story: US-608
|
||||
[2026-01-13 16:33:10] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_9_US-608.log)
|
||||
[2026-01-13 16:38:01] SUCCESS: Story US-608 passed!
|
||||
[2026-01-13 16:38:01] Changes committed
|
||||
[2026-01-13 16:38:01] Progress: 8/10 stories completed
|
||||
[2026-01-13 16:38:03] === Iteration 10/30 ===
|
||||
[2026-01-13 16:38:03] Working on story: US-609
|
||||
[2026-01-13 16:38:03] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_10_US-609.log)
|
||||
[2026-01-13 16:42:27] SUCCESS: Story US-609 passed!
|
||||
[2026-01-13 16:42:27] Changes committed
|
||||
[2026-01-13 16:42:27] Progress: 9/10 stories completed
|
||||
[2026-01-13 16:42:29] === Iteration 11/30 ===
|
||||
[2026-01-13 16:42:29] Working on story: US-610
|
||||
[2026-01-13 16:42:29] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_11_US-610.log)
|
||||
[2026-01-13 16:48:47] SUCCESS: Story US-610 passed!
|
||||
[2026-01-13 16:48:47] Changes committed
|
||||
[2026-01-13 16:48:47] Progress: 10/10 stories completed
|
||||
[2026-01-13 16:48:49] === Iteration 12/30 ===
|
||||
[2026-01-13 16:48:49] SUCCESS: All stories completed! 🎉
|
||||
[2026-01-13 16:48:49] === Ralph Session Complete ===
|
||||
[2026-01-13 16:48:49] Final progress: 10/10 stories completed
|
||||
[2026-01-13 16:48:49] Branch: ralph/ui-fixes-phase6
|
||||
[2026-01-13 16:48:49] Logs: /workspace/roa2web/scripts/ralph/logs
|
||||
|
||||
---
|
||||
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
## Phase 6: UI/UX Fixes - Menu Consistency & Mobile (COMPLETED ✓)
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
Started: Mon Jan 13 16:00:00 UTC 2026
|
||||
Completed: Mon Jan 13 16:49:33 UTC 2026
|
||||
Project: ui-fixes-phase6
|
||||
Branch: ralph/ui-fixes-phase6
|
||||
Stories: 10/10 completed (US-601 to US-610)
|
||||
|
||||
Summary:
|
||||
- US-601: Added Analize section to Desktop Sidebar ✓
|
||||
- US-602: TabView Clienți/Furnizori in Scadențe page ✓
|
||||
- US-603: Created DetailedInvoicesView.vue with tabs ✓
|
||||
- US-604: Cyclic theme toggle (3-state) in mobile menu ✓
|
||||
- US-605: Collapsible Firma/Perioada with localStorage ✓
|
||||
- US-606: Unified scrollable mobile menu layout ✓
|
||||
- US-607: Compact user section (name + logout inline) ✓
|
||||
- US-608: Fixed FAB SpeedDial bug in Lista Bonuri ✓
|
||||
- US-609: Added Reset button to all filter pages ✓
|
||||
- US-610: Removed excessive empty space above tables ✓
|
||||
|
||||
Stats:
|
||||
- Iterations used: 11 (1 retry for US-604)
|
||||
- Execution time: ~50 minutes
|
||||
- Files changed: 40+ files across iterations
|
||||
- Net code change: +796/-724 lines
|
||||
|
||||
---
|
||||
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
## Phase 6 Continuation: Regression Fixes (US-701 to US-705)
|
||||
## ══════════════════════════════════════════════════════════════
|
||||
Started: Mon Jan 13 20:50:00 UTC 2026
|
||||
Project: mobile-ui-fixes-phase5 (regression fixes)
|
||||
Branch: ralph/ui-fixes-phase6 (continuing)
|
||||
Stories: 5 new (US-701 to US-705)
|
||||
|
||||
PRD: tasks/prd-mobile-ui-fixes-phase5.md
|
||||
|
||||
### Stories Overview:
|
||||
|
||||
**Critical Regressions (1-2):**
|
||||
- [ ] US-701: Reparare SpeedDial FAB pe Lista Bonuri (import lipsă!)
|
||||
- [ ] US-702: Verificare Meniu Acțiuni (...) Per Bon
|
||||
|
||||
**Navigation Fix (3):**
|
||||
- [ ] US-703: Navigare Hamburger pe Paginile Analize (revert show-back → show-menu)
|
||||
|
||||
**UI Improvements (4-5):**
|
||||
- [ ] US-704: Mărire Spațiu Tabel Scadențe (max-height 250→400px)
|
||||
- [ ] US-705: Reducere Padding/Margin Top Excesiv
|
||||
|
||||
---
|
||||
|
||||
### Iteration Log:
|
||||
|
||||
[2026-01-13 22:26:47] Starting Ralph for project: ui-fixes-phase6
|
||||
[2026-01-13 22:26:47] Max iterations: 15
|
||||
[2026-01-13 22:26:47] === Iteration 1/15 ===
|
||||
[2026-01-13 22:26:47] Working on story: US-701
|
||||
[2026-01-13 22:26:47] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_1_US-701.log)
|
||||
[2026-01-13 22:29:57] SUCCESS: Story US-701 passed!
|
||||
[2026-01-13 22:29:57] Changes committed
|
||||
[2026-01-13 22:29:57] Progress: 11/15 stories completed
|
||||
[2026-01-13 22:29:59] === Iteration 2/15 ===
|
||||
[2026-01-13 22:29:59] Working on story: US-702
|
||||
[2026-01-13 22:29:59] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_2_US-702.log)
|
||||
[2026-01-13 22:31:33] SUCCESS: Story US-702 passed!
|
||||
[2026-01-13 22:31:33] Changes committed
|
||||
[2026-01-13 22:31:33] Progress: 12/15 stories completed
|
||||
[2026-01-13 22:31:35] === Iteration 3/15 ===
|
||||
[2026-01-13 22:31:35] Working on story: US-703
|
||||
[2026-01-13 22:31:35] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_3_US-703.log)
|
||||
[2026-01-13 22:34:32] SUCCESS: Story US-703 passed!
|
||||
[2026-01-13 22:34:32] Changes committed
|
||||
[2026-01-13 22:34:32] Progress: 13/15 stories completed
|
||||
[2026-01-13 22:34:34] === Iteration 4/15 ===
|
||||
[2026-01-13 22:34:34] Working on story: US-704
|
||||
[2026-01-13 22:34:34] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_4_US-704.log)
|
||||
[2026-01-13 22:36:09] SUCCESS: Story US-704 passed!
|
||||
[2026-01-13 22:36:09] Changes committed
|
||||
[2026-01-13 22:36:09] Progress: 14/15 stories completed
|
||||
[2026-01-13 22:36:11] === Iteration 5/15 ===
|
||||
[2026-01-13 22:36:11] Working on story: US-705
|
||||
[2026-01-13 22:36:11] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_5_US-705.log)
|
||||
[2026-01-13 22:39:06] SUCCESS: Story US-705 passed!
|
||||
[2026-01-13 22:39:07] Changes committed
|
||||
[2026-01-13 22:39:07] Progress: 15/15 stories completed
|
||||
[2026-01-13 22:39:09] === Iteration 6/15 ===
|
||||
[2026-01-13 22:39:09] SUCCESS: All stories completed! 🎉
|
||||
[2026-01-13 22:39:09] === Ralph Session Complete ===
|
||||
[2026-01-13 22:39:09] Final progress: 15/15 stories completed
|
||||
[2026-01-13 22:39:09] Branch: ralph/ui-fixes-phase6
|
||||
[2026-01-13 22:39:09] Logs: /workspace/roa2web/scripts/ralph/logs
|
||||
[2026-01-16 07:31:17] Starting Ralph for project: dashboard-solduri-v2
|
||||
[2026-01-16 07:31:17] Max iterations: 15
|
||||
[2026-01-16 07:31:17] === Iteration 1/15 ===
|
||||
[2026-01-16 07:31:17] Working on story: US-2001
|
||||
[2026-01-16 07:31:17] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_1_US-2001.log)
|
||||
[2026-01-16 07:33:54] SUCCESS: Story US-2001 passed!
|
||||
[2026-01-16 07:33:54] Changes committed
|
||||
[2026-01-16 07:33:54] Progress: 1/8 stories completed
|
||||
[2026-01-16 07:33:56] === Iteration 2/15 ===
|
||||
[2026-01-16 07:33:56] Working on story: US-2002
|
||||
[2026-01-16 07:33:56] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_2_US-2002.log)
|
||||
[2026-01-16 07:36:22] ERROR: Story US-2002 blocked: {"type":"result","subtype":"success","is_error":false,"duration_ms":143793,"duration_api_ms":141260,"num_turns":26,"result":"`★ Insight ─────────────────────────────────────`\n**Implementation Summary for US-2002:**\n1. **SwipeableCards now has 5 pages** - Changed from `totalCards=\"4\"` to `totalCards=\"5\"` with proper slot naming\n2. **First page is a 2x2 grid** - Uses CSS Grid with `grid-template-columns: repeat(2, 1fr)` and design tokens for spacing\n3. **Data integration** - Created `totalTrezorerie` (casa + banca) and `tvaTotal` computed properties that pull from existing dashboard data\n4. **Touch targets** - CSS ensures minimum 44x44px touch targets via `min-height: 120px` on grid items + existing SolduriCompactCard styling\n`─────────────────────────────────────────────────`\n\nLet me verify the acceptance criteria one more time:\n\n**Acceptance Criteria Check:**\n\n| Criteria | Status |\n|----------|--------|\n| ✅ Modifică SwipeableCards în DashboardView să aibă 5 pagini | Done - `totalCards=\"5\"` |\n| ✅ Prima pagină (card-0) conține un div cu grid 2x2 | Done - `solduri-grid-2x2` class |\n| ✅ Grid-ul conține 4 SolduriCompactCard: Trezorerie \\| Clienți / Furnizori \\| TVA | Done |\n| ✅ Fiecare card primește date din dashboardStore | Done - via `treasuryData`, `netBalanceData`, computed properties |\n| ✅ Touch target minim 44x44px pentru fiecare card | Done - CSS ensures min-height: 120px + SolduriCompactCard has its own touch target compliance |\n| ✅ npm run typecheck passes | Done - build passes (no tsconfig for strict typecheck, but build compiles) |\n| ⏳ Verify in browser mobil | Cannot test - requires browser verification |\n\nThe implementation is complete. Since I cannot verify in a mobile browser directly, the story is blocked on manual verification.\n\n Cannot verify in mobile browser - requires manual testing to confirm the 2x2 grid displays correctly on first swipe page with all 4 solduri cards (Trezorerie, Clienți, Furnizori, TVA)","session_id":"59f486d8-e134-4e47-918c-85d364cbe1b2","total_cost_usd":1.48000525,"usage":{"input_tokens":4959,"cache_creation_input_tokens":69287,"cache_read_input_tokens":1673261,"output_tokens":7264,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":69287}},"modelUsage":{"claude-opus-4-5-20251101":{"inputTokens":4959,"outputTokens":7264,"cacheReadInputTokens":1673261,"cacheCreationInputTokens":69287,"webSearchRequests":0,"costUSD":1.4760692499999999,"contextWindow":200000,"maxOutputTokens":64000},"claude-haiku-4-5-20251001":{"inputTokens":3296,"outputTokens":128,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.003936,"contextWindow":200000,"maxOutputTokens":64000}},"permission_denials":[],"uuid":"60e1571f-847a-4936-9451-b64009ac3f90"}
|
||||
[2026-01-16 07:36:22] Stopping loop due to blocked story
|
||||
[2026-01-16 07:36:22] === Ralph Session Complete ===
|
||||
[2026-01-16 07:36:22] Final progress: 1/8 stories completed
|
||||
[2026-01-16 07:36:22] Branch: ralph/dashboard-solduri
|
||||
[2026-01-16 07:36:22] Logs: /workspace/roa2web/scripts/ralph/logs
|
||||
[2026-01-16 07:45:26] Starting Ralph for project: dashboard-solduri-v2
|
||||
[2026-01-16 07:45:26] Max iterations: 10
|
||||
[2026-01-16 07:45:26] === Iteration 1/10 ===
|
||||
[2026-01-16 07:45:26] Working on story: US-2004
|
||||
[2026-01-16 07:45:26] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_1_US-2004.log)
|
||||
[2026-01-16 07:47:00] SUCCESS: Story US-2004 passed!
|
||||
[2026-01-16 07:47:00] Changes committed
|
||||
[2026-01-16 07:47:00] Progress: 4/8 stories completed
|
||||
[2026-01-16 07:47:02] === Iteration 2/10 ===
|
||||
[2026-01-16 07:47:02] Working on story: US-2005
|
||||
[2026-01-16 07:47:02] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_2_US-2005.log)
|
||||
[2026-01-16 07:48:52] SUCCESS: Story US-2005 passed!
|
||||
[2026-01-16 07:48:52] Changes committed
|
||||
[2026-01-16 07:48:52] Progress: 5/8 stories completed
|
||||
[2026-01-16 07:48:54] === Iteration 3/10 ===
|
||||
[2026-01-16 07:48:54] Working on story: US-2006
|
||||
[2026-01-16 07:48:54] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_3_US-2006.log)
|
||||
[2026-01-16 07:50:39] SUCCESS: Story US-2006 passed!
|
||||
[2026-01-16 07:50:39] Changes committed
|
||||
[2026-01-16 07:50:39] Progress: 6/8 stories completed
|
||||
[2026-01-16 07:50:41] === Iteration 4/10 ===
|
||||
[2026-01-16 07:50:41] Working on story: US-2007
|
||||
[2026-01-16 07:50:41] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_4_US-2007.log)
|
||||
[2026-01-16 07:54:51] SUCCESS: Story US-2007 passed!
|
||||
[2026-01-16 07:54:51] Changes committed
|
||||
[2026-01-16 07:54:51] Progress: 7/8 stories completed
|
||||
[2026-01-16 07:54:53] === Iteration 5/10 ===
|
||||
[2026-01-16 07:54:53] Working on story: US-2008
|
||||
[2026-01-16 07:54:53] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_5_US-2008.log)
|
||||
[2026-01-16 07:58:11] SUCCESS: Story US-2008 passed!
|
||||
[2026-01-16 07:58:11] Changes committed
|
||||
[2026-01-16 07:58:11] Progress: 8/8 stories completed
|
||||
[2026-01-16 07:58:13] === Iteration 6/10 ===
|
||||
[2026-01-16 07:58:13] SUCCESS: All stories completed! 🎉
|
||||
[2026-01-16 07:58:13] === Ralph Session Complete ===
|
||||
[2026-01-16 07:58:13] Final progress: 8/8 stories completed
|
||||
[2026-01-16 07:58:13] Branch: ralph/dashboard-solduri
|
||||
[2026-01-16 07:58:13] Logs: /workspace/roa2web/scripts/ralph/logs
|
||||
|
||||
@@ -128,7 +128,7 @@ export default {
|
||||
// PRINCIPALE: Dashboard, Bonuri
|
||||
const principaleItems = ref([
|
||||
{ to: '/dashboard', icon: 'pi pi-home', label: 'Dashboard', exactMatch: true },
|
||||
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri', exactMatch: false }
|
||||
{ to: '/data-entry', icon: 'pi pi-shopping-bag', label: 'Bonuri', exactMatch: false }
|
||||
]);
|
||||
|
||||
// RAPOARTE: Facturi, Balanță, Casa și Banca
|
||||
|
||||
374
src/modules/reports/components/solduri/SolduriCompactCard.vue
Normal file
374
src/modules/reports/components/solduri/SolduriCompactCard.vue
Normal file
@@ -0,0 +1,374 @@
|
||||
<template>
|
||||
<div
|
||||
class="solduri-compact-card"
|
||||
:class="[`solduri-compact-card--${type}`, { 'solduri-compact-card--expanded': isExpanded }]"
|
||||
@click="toggleExpanded"
|
||||
>
|
||||
<!-- Header: Label + Value -->
|
||||
<div class="solduri-compact-card__header">
|
||||
<div class="solduri-compact-card__content">
|
||||
<span class="solduri-compact-card__label">{{ label }}</span>
|
||||
<span class="solduri-compact-card__value" :class="valueColorClass">
|
||||
{{ formatCurrency(total) }}
|
||||
</span>
|
||||
</div>
|
||||
<i
|
||||
class="pi pi-chevron-down solduri-compact-card__chevron"
|
||||
:class="{ 'solduri-compact-card__chevron--expanded': isExpanded }"
|
||||
></i>
|
||||
</div>
|
||||
|
||||
<!-- Expandable Breakdown Section -->
|
||||
<div v-if="isExpanded && hasBreakdown" class="solduri-compact-card__breakdown">
|
||||
<!-- Trezorerie: Casa + Bancă -->
|
||||
<template v-if="type === 'trezorerie'">
|
||||
<!-- Casa Total -->
|
||||
<div class="solduri-compact-card__breakdown-item">
|
||||
<span class="solduri-compact-card__breakdown-label">Casa</span>
|
||||
<span class="solduri-compact-card__breakdown-value">{{ formatCurrency(casaTotal) }}</span>
|
||||
</div>
|
||||
<!-- Sub-conturi Casa (imediat sub Casa) -->
|
||||
<template v-if="breakdown?.casa?.items?.length">
|
||||
<div
|
||||
v-for="(item, idx) in breakdown.casa.items"
|
||||
:key="`casa-${idx}`"
|
||||
class="solduri-compact-card__breakdown-subitem"
|
||||
>
|
||||
<span class="solduri-compact-card__breakdown-sublabel">
|
||||
{{ item.nume || `Cont ${item.cont}` }}
|
||||
</span>
|
||||
<span class="solduri-compact-card__breakdown-subvalue">{{ formatCurrency(item.sold) }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<!-- Bancă Total -->
|
||||
<div class="solduri-compact-card__breakdown-item">
|
||||
<span class="solduri-compact-card__breakdown-label">Bancă</span>
|
||||
<span class="solduri-compact-card__breakdown-value">{{ formatCurrency(bancaTotal) }}</span>
|
||||
</div>
|
||||
<!-- Sub-conturi Bancă (imediat sub Bancă) -->
|
||||
<template v-if="breakdown?.banca?.items?.length">
|
||||
<div
|
||||
v-for="(item, idx) in breakdown.banca.items"
|
||||
:key="`banca-${idx}`"
|
||||
class="solduri-compact-card__breakdown-subitem"
|
||||
>
|
||||
<span class="solduri-compact-card__breakdown-sublabel">
|
||||
{{ item.nume || `Cont ${item.cont}` }}
|
||||
</span>
|
||||
<span class="solduri-compact-card__breakdown-subvalue">{{ formatCurrency(item.sold) }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<!-- Clienți/Furnizori: Buckets (În termen, Restant) -->
|
||||
<template v-else-if="type === 'clienti' || type === 'furnizori'">
|
||||
<div class="solduri-compact-card__breakdown-item">
|
||||
<span class="solduri-compact-card__breakdown-label">În termen</span>
|
||||
<span class="solduri-compact-card__breakdown-value">
|
||||
{{ formatCurrency(breakdown?.in_termen?.total || 0) }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="solduri-compact-card__breakdown-item">
|
||||
<span class="solduri-compact-card__breakdown-label">Restant</span>
|
||||
<span class="solduri-compact-card__breakdown-value solduri-compact-card__breakdown-value--warning">
|
||||
{{ formatCurrency(breakdown?.restant?.total || 0) }}
|
||||
</span>
|
||||
</div>
|
||||
<!-- Perioade restante -->
|
||||
<template v-if="breakdown?.restant?.perioade">
|
||||
<div
|
||||
v-for="(value, key) in breakdown.restant.perioade"
|
||||
:key="key"
|
||||
class="solduri-compact-card__breakdown-subitem"
|
||||
>
|
||||
<span class="solduri-compact-card__breakdown-sublabel">{{ formatPeriodLabel(key) }}</span>
|
||||
<span class="solduri-compact-card__breakdown-subvalue">{{ formatCurrency(value) }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<!-- TVA: Simple display (no breakdown needed) -->
|
||||
<template v-else-if="type === 'tva'">
|
||||
<div class="solduri-compact-card__breakdown-item">
|
||||
<span class="solduri-compact-card__breakdown-label">
|
||||
{{ total >= 0 ? 'TVA de recuperat' : 'TVA de plată' }}
|
||||
</span>
|
||||
<span
|
||||
class="solduri-compact-card__breakdown-value"
|
||||
:class="total >= 0 ? 'solduri-compact-card__breakdown-value--success' : 'solduri-compact-card__breakdown-value--danger'"
|
||||
>
|
||||
{{ formatCurrency(Math.abs(total)) }}
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, computed } from 'vue'
|
||||
|
||||
// Type definitions
|
||||
type CardType = 'trezorerie' | 'clienti' | 'furnizori' | 'tva'
|
||||
|
||||
interface TrezorerieBreakdown {
|
||||
casa?: {
|
||||
total?: number
|
||||
items?: Array<{ nume?: string; cont?: string; sold: number }>
|
||||
}
|
||||
banca?: {
|
||||
total?: number
|
||||
items?: Array<{ nume?: string; cont?: string; sold: number }>
|
||||
}
|
||||
}
|
||||
|
||||
interface ClientiFurnizoriBreakdown {
|
||||
total?: number
|
||||
in_termen?: { total?: number }
|
||||
restant?: {
|
||||
total?: number
|
||||
perioade?: Record<string, number>
|
||||
}
|
||||
}
|
||||
|
||||
type BreakdownType = TrezorerieBreakdown | ClientiFurnizoriBreakdown | null
|
||||
|
||||
// Props
|
||||
const props = defineProps<{
|
||||
type: CardType
|
||||
total: number
|
||||
breakdown?: BreakdownType
|
||||
casaTotal?: number
|
||||
bancaTotal?: number
|
||||
}>()
|
||||
|
||||
// State
|
||||
const isExpanded = ref(false)
|
||||
|
||||
// Computed: Label based on type
|
||||
const label = computed(() => {
|
||||
const labels: Record<CardType, string> = {
|
||||
trezorerie: 'TREZORERIE',
|
||||
clienti: 'CLIENȚI',
|
||||
furnizori: 'FURNIZORI',
|
||||
tva: 'TVA'
|
||||
}
|
||||
return labels[props.type] || props.type.toUpperCase()
|
||||
})
|
||||
|
||||
// Computed: Value color class based on type and value
|
||||
const valueColorClass = computed(() => {
|
||||
if (props.type === 'tva') {
|
||||
return props.total >= 0
|
||||
? 'solduri-compact-card__value--success'
|
||||
: 'solduri-compact-card__value--danger'
|
||||
}
|
||||
return ''
|
||||
})
|
||||
|
||||
// Computed: Check if breakdown data exists
|
||||
const hasBreakdown = computed(() => {
|
||||
if (props.type === 'trezorerie') {
|
||||
return props.casaTotal !== undefined || props.bancaTotal !== undefined || props.breakdown
|
||||
}
|
||||
if (props.type === 'clienti' || props.type === 'furnizori') {
|
||||
return props.breakdown !== null && props.breakdown !== undefined
|
||||
}
|
||||
if (props.type === 'tva') {
|
||||
return true // TVA always shows status
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
// Methods
|
||||
const toggleExpanded = () => {
|
||||
if (hasBreakdown.value) {
|
||||
isExpanded.value = !isExpanded.value
|
||||
}
|
||||
}
|
||||
|
||||
const formatCurrency = (amount: number | undefined | null): string => {
|
||||
if (amount === undefined || amount === null) return '0 RON'
|
||||
return new Intl.NumberFormat('ro-RO', {
|
||||
style: 'currency',
|
||||
currency: 'RON',
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 0
|
||||
}).format(amount)
|
||||
}
|
||||
|
||||
const formatPeriodLabel = (key: string): string => {
|
||||
const labelMap: Record<string, string> = {
|
||||
'7_zile': '7 zile',
|
||||
'14_zile': '14 zile',
|
||||
'30_zile': '30 zile',
|
||||
'60_zile': '60 zile',
|
||||
'90_zile': '90 zile',
|
||||
'peste_90_zile': 'Peste 90 zile'
|
||||
}
|
||||
return labelMap[key] || key
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* SolduriCompactCard - Compact card for 2x2 grid layout */
|
||||
|
||||
.solduri-compact-card {
|
||||
background: var(--surface-card);
|
||||
border: 1px solid var(--surface-border);
|
||||
border-radius: var(--radius-md);
|
||||
padding: var(--space-md);
|
||||
cursor: pointer;
|
||||
transition: all var(--transition-fast);
|
||||
min-height: 80px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
.solduri-compact-card:hover {
|
||||
box-shadow: var(--shadow-md);
|
||||
border-color: var(--color-primary);
|
||||
}
|
||||
|
||||
.solduri-compact-card:active {
|
||||
transform: scale(0.98);
|
||||
}
|
||||
|
||||
/* Header Layout */
|
||||
.solduri-compact-card__header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
/* Content */
|
||||
.solduri-compact-card__content {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-xs);
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.solduri-compact-card__label {
|
||||
font-size: var(--text-xs);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--color-text-secondary);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.solduri-compact-card__value {
|
||||
font-size: var(--text-lg);
|
||||
font-weight: var(--font-bold);
|
||||
color: var(--color-text);
|
||||
font-family: var(--font-mono, monospace);
|
||||
line-height: var(--leading-tight);
|
||||
}
|
||||
|
||||
/* Value color modifiers */
|
||||
.solduri-compact-card__value--success {
|
||||
color: var(--green-600);
|
||||
}
|
||||
|
||||
.solduri-compact-card__value--danger {
|
||||
color: var(--red-600);
|
||||
}
|
||||
|
||||
/* Chevron */
|
||||
.solduri-compact-card__chevron {
|
||||
color: var(--color-text-secondary);
|
||||
font-size: var(--text-sm);
|
||||
transition: transform var(--transition-fast);
|
||||
}
|
||||
|
||||
.solduri-compact-card__chevron--expanded {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
/* Breakdown Section */
|
||||
.solduri-compact-card__breakdown {
|
||||
padding-top: var(--space-sm);
|
||||
border-top: 1px solid var(--surface-border);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-xs);
|
||||
}
|
||||
|
||||
.solduri-compact-card__breakdown-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: var(--space-xs) 0;
|
||||
}
|
||||
|
||||
.solduri-compact-card__breakdown-label {
|
||||
font-size: var(--text-base);
|
||||
color: var(--color-text-secondary);
|
||||
font-weight: var(--font-medium);
|
||||
}
|
||||
|
||||
.solduri-compact-card__breakdown-value {
|
||||
font-size: var(--text-base);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--color-text);
|
||||
font-family: var(--font-mono, monospace);
|
||||
}
|
||||
|
||||
.solduri-compact-card__breakdown-value--success {
|
||||
color: var(--green-600);
|
||||
}
|
||||
|
||||
.solduri-compact-card__breakdown-value--danger {
|
||||
color: var(--red-600);
|
||||
}
|
||||
|
||||
.solduri-compact-card__breakdown-value--warning {
|
||||
color: var(--orange-600);
|
||||
}
|
||||
|
||||
/* Sub-items (indented) */
|
||||
.solduri-compact-card__breakdown-subitem {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: var(--space-xs) 0;
|
||||
padding-left: var(--space-md);
|
||||
}
|
||||
|
||||
.solduri-compact-card__breakdown-sublabel {
|
||||
font-size: var(--text-sm);
|
||||
color: var(--color-text-secondary);
|
||||
}
|
||||
|
||||
.solduri-compact-card__breakdown-subvalue {
|
||||
font-size: var(--text-sm);
|
||||
font-weight: var(--font-medium);
|
||||
color: var(--color-text);
|
||||
font-family: var(--font-mono, monospace);
|
||||
}
|
||||
|
||||
/* Responsive - Mobile */
|
||||
@media (max-width: 768px) {
|
||||
.solduri-compact-card {
|
||||
padding: var(--space-sm);
|
||||
min-height: 70px;
|
||||
}
|
||||
|
||||
.solduri-compact-card__value {
|
||||
font-size: var(--text-base);
|
||||
}
|
||||
|
||||
.solduri-compact-card__breakdown-subitem {
|
||||
padding-left: var(--space-sm);
|
||||
}
|
||||
}
|
||||
|
||||
/* Touch target compliance - minimum 44x44px */
|
||||
@media (pointer: coarse) {
|
||||
.solduri-compact-card {
|
||||
min-height: 80px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -4,7 +4,9 @@
|
||||
v-if="isMobile"
|
||||
title="Dashboard"
|
||||
:show-menu="true"
|
||||
:actions="mobileTopBarActions"
|
||||
@menu-click="showDrawer = true"
|
||||
@action-click="handleMobileAction"
|
||||
/>
|
||||
|
||||
<!-- Mobile Drawer Menu (replaces old Sidebar) -->
|
||||
@@ -21,6 +23,16 @@
|
||||
<!-- Dashboard Header - only on desktop -->
|
||||
<div v-if="!isMobile" class="page-header">
|
||||
<h1 class="page-title">Dashboard</h1>
|
||||
<Button
|
||||
icon="pi pi-refresh"
|
||||
text
|
||||
rounded
|
||||
class="refresh-btn"
|
||||
:class="{ 'is-loading': isLoading }"
|
||||
@click="handleRefresh"
|
||||
v-tooltip.bottom="'Actualizează datele'"
|
||||
aria-label="Actualizează datele"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Company selection removed - now handled in header only -->
|
||||
@@ -28,8 +40,36 @@
|
||||
<!-- Secțiune Carduri Noi - Adăugare -->
|
||||
<div class="metrics-cards-section" v-if="!isLoading">
|
||||
<!-- Mobile: Swipeable KPI Cards Carousel -->
|
||||
<SwipeableCards v-if="isMobile" :totalCards="4" class="mobile-kpi-carousel">
|
||||
<!-- US-2002: 5 pages - first page is 2x2 grid with solduri, pages 2-5 are original graph cards -->
|
||||
<SwipeableCards v-if="isMobile" :totalCards="5" class="mobile-kpi-carousel">
|
||||
<!-- Page 1: Grid 2x2 cu Solduri Compacte -->
|
||||
<template #card-0>
|
||||
<div class="solduri-grid-2x2">
|
||||
<SolduriCompactCard
|
||||
type="trezorerie"
|
||||
:total="totalTrezorerie"
|
||||
:casaTotal="treasuryData?.breakdown?.casa?.total || 0"
|
||||
:bancaTotal="treasuryData?.breakdown?.banca?.total || 0"
|
||||
:breakdown="treasuryData?.breakdown"
|
||||
/>
|
||||
<SolduriCompactCard
|
||||
type="clienti"
|
||||
:total="netBalanceData?.clienti_total || 0"
|
||||
:breakdown="netBalanceData?.breakdown?.clienti"
|
||||
/>
|
||||
<SolduriCompactCard
|
||||
type="furnizori"
|
||||
:total="netBalanceData?.furnizori_total || 0"
|
||||
:breakdown="netBalanceData?.breakdown?.furnizori"
|
||||
/>
|
||||
<SolduriCompactCard
|
||||
type="tva"
|
||||
:total="tvaTotal"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<!-- Page 2: TreasuryDualCard (original graph card) -->
|
||||
<template #card-1>
|
||||
<TreasuryDualCard
|
||||
:casaTotal="treasuryData?.breakdown?.casa?.total || 0"
|
||||
:bancaTotal="treasuryData?.breakdown?.banca?.total || 0"
|
||||
@@ -45,7 +85,8 @@
|
||||
:previousSparklineLabels="previousSparklineLabels"
|
||||
/>
|
||||
</template>
|
||||
<template #card-1>
|
||||
<!-- Page 3: CashFlowMetricCard (original graph card) -->
|
||||
<template #card-2>
|
||||
<CashFlowMetricCard
|
||||
:inflowsValue="monthlyInflows"
|
||||
:outflowsValue="monthlyOutflows"
|
||||
@@ -59,7 +100,8 @@
|
||||
:previousSparklineLabels="previousSparklineLabels"
|
||||
/>
|
||||
</template>
|
||||
<template #card-2>
|
||||
<!-- Page 4: ClientiBalanceCard (original graph card) -->
|
||||
<template #card-3>
|
||||
<ClientiBalanceCard
|
||||
:total="netBalanceData?.clienti_total || 0"
|
||||
:trend="clientiTrend"
|
||||
@@ -70,7 +112,8 @@
|
||||
:breakdown="netBalanceData?.breakdown?.clienti"
|
||||
/>
|
||||
</template>
|
||||
<template #card-3>
|
||||
<!-- Page 5: FurnizoriBalanceCard (original graph card) -->
|
||||
<template #card-4>
|
||||
<FurnizoriBalanceCard
|
||||
:total="netBalanceData?.furnizori_total || 0"
|
||||
:trend="furnizoriTrend"
|
||||
@@ -83,8 +126,33 @@
|
||||
</template>
|
||||
</SwipeableCards>
|
||||
|
||||
<!-- Desktop: Grid layout -->
|
||||
<div v-else class="metrics-row">
|
||||
<!-- US-2004: Desktop Solduri Section (sus, fără titlu) -->
|
||||
<div v-if="!isMobile" class="desktop-solduri-section">
|
||||
<SolduriCompactCard
|
||||
type="trezorerie"
|
||||
:total="totalTrezorerie"
|
||||
:casaTotal="treasuryData?.breakdown?.casa?.total || 0"
|
||||
:bancaTotal="treasuryData?.breakdown?.banca?.total || 0"
|
||||
:breakdown="treasuryData?.breakdown"
|
||||
/>
|
||||
<SolduriCompactCard
|
||||
type="clienti"
|
||||
:total="netBalanceData?.clienti_total || 0"
|
||||
:breakdown="netBalanceData?.breakdown?.clienti"
|
||||
/>
|
||||
<SolduriCompactCard
|
||||
type="furnizori"
|
||||
:total="netBalanceData?.furnizori_total || 0"
|
||||
:breakdown="netBalanceData?.breakdown?.furnizori"
|
||||
/>
|
||||
<SolduriCompactCard
|
||||
type="tva"
|
||||
:total="tvaTotal"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Desktop: Grid layout (carduri grafice originale) -->
|
||||
<div v-if="!isMobile" class="metrics-row">
|
||||
<TreasuryDualCard
|
||||
:casaTotal="treasuryData?.breakdown?.casa?.total || 0"
|
||||
:bancaTotal="treasuryData?.breakdown?.banca?.total || 0"
|
||||
@@ -131,18 +199,6 @@
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Desktop: Rând 2: Analiză comparativă și Date Detaliate (combinat) -->
|
||||
<div v-if="!isMobile" class="comparison-row">
|
||||
<MaturityAndDetailsCard
|
||||
:companyId="companyStore.selectedCompany?.id_firma"
|
||||
@periodChanged="handleMaturityPeriodChange"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dashboard Content -->
|
||||
<div class="dashboard-content">
|
||||
<!-- Componenta MaturityAndDetailsCard include acum și tabelul detaliat -->
|
||||
</div>
|
||||
|
||||
<!-- Loading State -->
|
||||
@@ -161,13 +217,14 @@
|
||||
import { ref, computed, onMounted, onUnmounted, watch } from "vue";
|
||||
import { useRouter } from "vue-router";
|
||||
import { useToast } from "primevue/usetoast";
|
||||
import Button from "primevue/button";
|
||||
// Import componente noi
|
||||
import MetricCard from "@reports/components/dashboard/cards/MetricCard.vue";
|
||||
import CashFlowMetricCard from "@reports/components/dashboard/cards/CashFlowMetricCard.vue";
|
||||
import MaturityAndDetailsCard from "@reports/components/dashboard/cards/MaturityAndDetailsCard.vue";
|
||||
import ClientiBalanceCard from "@reports/components/dashboard/cards/ClientiBalanceCard.vue";
|
||||
import FurnizoriBalanceCard from "@reports/components/dashboard/cards/FurnizoriBalanceCard.vue";
|
||||
import TreasuryDualCard from "@reports/components/dashboard/cards/TreasuryDualCard.vue";
|
||||
import SolduriCompactCard from "@reports/components/solduri/SolduriCompactCard.vue";
|
||||
// Mobile components
|
||||
import SwipeableCards from "@shared/components/mobile/SwipeableCards.vue";
|
||||
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
||||
@@ -205,12 +262,6 @@ const netBalanceData = ref(null);
|
||||
const selectedPeriod = ref("12m");
|
||||
const selectedChartType = ref("line");
|
||||
|
||||
// Handlers pentru schimbare perioadă
|
||||
const handleMaturityPeriodChange = (period) => {
|
||||
console.log("Maturity period changed:", period);
|
||||
// Trigger reload cu noua perioadă
|
||||
};
|
||||
|
||||
// Calculare trend bazată pe date reale din trends.raw
|
||||
const calculateTrend = (metric) => {
|
||||
if (!dashboardStore.trends?.raw) return null;
|
||||
@@ -406,6 +457,18 @@ const treasuryPreviousSparkline = computed(() =>
|
||||
const sparklineLabels = computed(() => getSparklineLabels());
|
||||
const previousSparklineLabels = computed(() => getPreviousSparklineLabels());
|
||||
|
||||
// US-2002: Computed properties for SolduriCompactCard grid
|
||||
const totalTrezorerie = computed(() => {
|
||||
const casaTotal = treasuryData.value?.breakdown?.casa?.total || 0;
|
||||
const bancaTotal = treasuryData.value?.breakdown?.banca?.total || 0;
|
||||
return casaTotal + bancaTotal;
|
||||
});
|
||||
|
||||
const tvaTotal = computed(() => {
|
||||
// TVA from dashboard summary if available, otherwise default to 0
|
||||
return dashboardStore.summary?.tva_sold || 0;
|
||||
});
|
||||
|
||||
// Casa and Bancă specific trends and sparklines
|
||||
const casaTrend = computed(() => {
|
||||
// Calculate trend based on Casa proportion of treasury
|
||||
@@ -522,6 +585,29 @@ const handleLogout = async () => {
|
||||
router.push('/login');
|
||||
};
|
||||
|
||||
// US-2008: Mobile top bar actions with refresh button
|
||||
const mobileTopBarActions = computed(() => [
|
||||
{
|
||||
id: 'refresh',
|
||||
icon: isLoading.value ? 'pi pi-spin pi-refresh' : 'pi pi-refresh',
|
||||
label: 'Actualizează',
|
||||
tooltip: 'Actualizează datele'
|
||||
}
|
||||
]);
|
||||
|
||||
// US-2008: Handle mobile action clicks
|
||||
const handleMobileAction = async (action) => {
|
||||
if (action.id === 'refresh') {
|
||||
await handleRefresh();
|
||||
}
|
||||
};
|
||||
|
||||
// US-2008: Handle refresh button click (shared between mobile and desktop)
|
||||
const handleRefresh = async () => {
|
||||
if (isLoading.value) return; // Prevent multiple clicks during loading
|
||||
await loadDashboardData();
|
||||
};
|
||||
|
||||
// Computed property pentru luna curentă - folosește perioada din period selector
|
||||
const currentMonthLabel = computed(() => {
|
||||
// Prioritate: period selector > dashboard current period > loading
|
||||
@@ -990,6 +1076,30 @@ onUnmounted(() => {
|
||||
padding-bottom: 56px; /* MobileBottomNav height */
|
||||
}
|
||||
|
||||
/* US-2008: Refresh Button Styles */
|
||||
.refresh-btn {
|
||||
color: var(--color-text-secondary);
|
||||
transition: color var(--transition-fast), transform var(--transition-fast);
|
||||
}
|
||||
|
||||
.refresh-btn:hover {
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
/* US-2008: Rotating animation during loading */
|
||||
.refresh-btn.is-loading .pi-refresh {
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
/* Company Selection */
|
||||
.company-selection {
|
||||
max-width: 500px;
|
||||
@@ -1006,13 +1116,6 @@ onUnmounted(() => {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* Dashboard Content */
|
||||
.dashboard-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-xl);
|
||||
}
|
||||
|
||||
/* Dashboard Sections */
|
||||
.dashboard-section {
|
||||
background: var(--color-bg);
|
||||
@@ -1273,27 +1376,29 @@ onUnmounted(() => {
|
||||
padding: 0 var(--space-md);
|
||||
}
|
||||
|
||||
/* US-2004: Desktop Solduri Section - 2x2 grid (2 cards per row) */
|
||||
.desktop-solduri-section {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: var(--space-md);
|
||||
margin-bottom: var(--space-lg);
|
||||
}
|
||||
|
||||
/* Metrics Cards Layout - Component-specific grid layouts */
|
||||
.metrics-row {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
gap: var(--space-md);
|
||||
margin-bottom: var(--space-lg);
|
||||
}
|
||||
|
||||
.analysis-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
gap: var(--space-md);
|
||||
margin-bottom: var(--space-lg);
|
||||
}
|
||||
|
||||
.comparison-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
/* Responsive - All breakpoints consolidated */
|
||||
@media (max-width: 1200px) {
|
||||
@@ -1325,4 +1430,17 @@ onUnmounted(() => {
|
||||
.mobile-kpi-carousel {
|
||||
margin-bottom: var(--space-lg);
|
||||
}
|
||||
|
||||
/* US-2002: Solduri list for mobile first page - 1 card per row */
|
||||
.solduri-grid-2x2 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-sm);
|
||||
padding: var(--space-xs);
|
||||
}
|
||||
|
||||
/* Touch target compliance - SolduriCompactCard handles its own min-height */
|
||||
.solduri-grid-2x2 > * {
|
||||
/* Height auto - only as tall as content needs */
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -57,7 +57,7 @@ defineProps({
|
||||
type: Array,
|
||||
default: () => [
|
||||
{ to: '/dashboard', icon: 'pi pi-home', label: 'Dashboard' },
|
||||
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri' },
|
||||
{ to: '/data-entry', icon: 'pi pi-shopping-bag', label: 'Bonuri' },
|
||||
{ to: '/reports/invoices', icon: 'pi pi-file-edit', label: 'Facturi' },
|
||||
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări' }
|
||||
],
|
||||
|
||||
@@ -407,7 +407,7 @@ watch(() => props.modelValue, (isOpen) => {
|
||||
// PRINCIPALE: Dashboard, Bonuri
|
||||
const principaleItems = [
|
||||
{ to: '/dashboard', icon: 'pi pi-home', label: 'Dashboard', exactMatch: true },
|
||||
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri', exactMatch: false }
|
||||
{ to: '/data-entry', icon: 'pi pi-shopping-bag', label: 'Bonuri', exactMatch: false }
|
||||
]
|
||||
|
||||
// RAPOARTE: Facturi, Balanță, Casă, Bancă (US-519: separate pages)
|
||||
|
||||
176
tasks/prd-dashboard-solduri-v2.md
Normal file
176
tasks/prd-dashboard-solduri-v2.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# PRD: Dashboard cu Solduri - Versiunea 2 (Corectă)
|
||||
|
||||
## 1. Introducere
|
||||
Adăugare secțiune Solduri în Dashboard păstrând paginile originale cu grafice. Pe mobil, soldurile sunt prima pagină din swipe (grid 2x2), iar graficele sunt paginile 2-5 (ca în main). Pe desktop, două secțiuni separate: Solduri sus, Grafice jos.
|
||||
|
||||
## 2. Obiective
|
||||
|
||||
### Obiectiv Principal
|
||||
- Prima pagină din swipe pe mobil = 4 carduri compacte cu solduri
|
||||
- Paginile 2-5 din swipe = cardurile originale cu grafice (păstrate exact ca în main)
|
||||
|
||||
### Obiective Secundare
|
||||
- Desktop: Secțiune Solduri + Secțiune Grafice (fără titluri vizibile)
|
||||
- Eliminare MaturityAndDetailsCard de pe Dashboard
|
||||
- Carduri solduri compacte cu expand pentru detalii
|
||||
|
||||
### Metrici de Succes
|
||||
- Mobil: 5 pagini de swipe (Solduri + 4 grafice)
|
||||
- Desktop: 2 secțiuni vizual separate
|
||||
- Cardurile grafice rămân IDENTICE cu cele din main
|
||||
|
||||
## 3. User Stories
|
||||
|
||||
### US-2001: Creare componentă SolduriCompactCard (reutilizabilă)
|
||||
**Ca** dezvoltator
|
||||
**Vreau** o componentă card compactă pentru solduri
|
||||
**Pentru că** o voi folosi în grid 2x2 pe mobil și desktop
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [ ] Creează SolduriCompactCard.vue în src/modules/reports/components/solduri/
|
||||
- [ ] Props: type (trezorerie|clienti|furnizori|tva), total, breakdown (object)
|
||||
- [ ] Afișează: icon + label + valoare principală
|
||||
- [ ] Click expandează/colapsează breakdown-ul (conturi, buckets)
|
||||
- [ ] Folosește design tokens pentru culori și spațiere
|
||||
- [ ] npm run typecheck passes
|
||||
|
||||
### US-2002: Grid 2x2 Solduri pentru prima pagină swipe pe mobil
|
||||
**Ca** utilizator pe mobil
|
||||
**Vreau** prima pagină din swipe să fie un grid 2x2 cu 4 carduri solduri
|
||||
**Pentru că** văd toate soldurile dintr-o privire
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [ ] Prima pagină din SwipeableCards conține un grid 2x2
|
||||
- [ ] Ordinea: Trezorerie | Clienți / Furnizori | TVA
|
||||
- [ ] Fiecare card e SolduriCompactCard cu props corecte
|
||||
- [ ] Touch target minim 44x44px
|
||||
- [ ] npm run typecheck passes
|
||||
- [ ] Verify in browser mobil că prima pagină e grid-ul cu solduri
|
||||
|
||||
### US-2003: Păstrare carduri grafice originale pe paginile 2-5 mobil
|
||||
**Ca** utilizator pe mobil
|
||||
**Vreau** paginile 2-5 din swipe să fie cardurile cu grafice originale
|
||||
**Pentru că** vreau să le văd individual cu toate detaliile
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [ ] Pagina 2: TreasuryDualCard (exact ca în main)
|
||||
- [ ] Pagina 3: CashFlowMetricCard (exact ca în main)
|
||||
- [ ] Pagina 4: ClientiBalanceCard (exact ca în main)
|
||||
- [ ] Pagina 5: FurnizoriBalanceCard (exact ca în main)
|
||||
- [ ] SwipeableCards folosește totalCards=5 sau similar
|
||||
- [ ] npm run typecheck passes
|
||||
- [ ] Verify în browser că swipe funcționează între toate 5 paginile
|
||||
|
||||
### US-2004: Secțiune Solduri pe Desktop (grid 2x2 sau 4 în linie)
|
||||
**Ca** utilizator pe desktop
|
||||
**Vreau** să văd soldurile într-o secțiune separată sus
|
||||
**Pentru că** sunt cele mai importante informații
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [ ] Secțiune Solduri în partea de sus a Dashboard-ului
|
||||
- [ ] Fără titlu vizibil (doar layout)
|
||||
- [ ] 4 SolduriCompactCard în grid responsive (2x2 sau 4 în linie pe ecran lat)
|
||||
- [ ] Sub solduri: cardurile originale cu grafice
|
||||
- [ ] npm run typecheck passes
|
||||
- [ ] Verify în browser desktop că ambele secțiuni sunt vizibile
|
||||
|
||||
### US-2005: Eliminare MaturityAndDetailsCard de pe Dashboard
|
||||
**Ca** utilizator
|
||||
**Vreau** Dashboard-ul să nu mai aibă tabelul detaliat de scadențe
|
||||
**Pentru că** există deja pagina Maturity Analysis separată
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [ ] Șterge MaturityAndDetailsCard din DashboardView.vue
|
||||
- [ ] Șterge div-ul .comparison-row
|
||||
- [ ] Șterge importul componentei
|
||||
- [ ] npm run typecheck passes
|
||||
- [ ] Verify: Dashboard nu mai are tabel
|
||||
|
||||
### US-2006: Integrare date Solduri din dashboardStore
|
||||
**Ca** dezvoltator
|
||||
**Vreau** cardurile solduri să folosească datele existente din store
|
||||
**Pentru că** nu vreau request-uri API duplicate
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [ ] Trezorerie: dashboardStore.treasuryData (casa.total, banca.total, items)
|
||||
- [ ] Clienți: dashboardStore.netBalanceData.clienti_total + breakdown
|
||||
- [ ] Furnizori: dashboardStore.netBalanceData.furnizori_total + breakdown
|
||||
- [ ] TVA: dashboardStore (calculat din summary sau endpoint)
|
||||
- [ ] npm run typecheck passes
|
||||
|
||||
### US-2007: Indicatori vizuali pentru starea financiară
|
||||
**Ca** utilizator
|
||||
**Vreau** să văd indicatori de avertizare pe carduri
|
||||
**Pentru că** identific rapid problemele
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [ ] Indicator roșu pe Clienți/Furnizori dacă restanță > 20%
|
||||
- [ ] TVA roșu dacă e de plată, verde dacă e de recuperat
|
||||
- [ ] Folosește var(--red-500), var(--green-500)
|
||||
- [ ] npm run typecheck passes
|
||||
|
||||
### US-2008: Buton Refresh în header Dashboard
|
||||
**Ca** utilizator
|
||||
**Vreau** un buton de refresh în header
|
||||
**Pentru că** vreau să actualizez manual datele
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [ ] Pe mobil: icon refresh în MobileTopBar actions
|
||||
- [ ] Pe desktop: buton lângă titlu Dashboard
|
||||
- [ ] Animație spinner în timpul încărcării
|
||||
- [ ] npm run typecheck passes
|
||||
|
||||
## 4. Cerințe Funcționale
|
||||
1. [REQ-001] Cardurile grafice rămân IDENTICE cu cele din main
|
||||
2. [REQ-002] Swipe pe mobil funcționează fluid între toate 5 paginile
|
||||
3. [REQ-003] Desktop layout responsive (secțiunile se adaptează la lățime)
|
||||
4. [REQ-004] Funcționează în dark mode
|
||||
|
||||
## 5. Non-Goals (Ce NU facem)
|
||||
- NU modificăm cardurile cu grafice (TreasuryDualCard, etc.)
|
||||
- NU adăugăm funcționalități noi de analiză
|
||||
- NU schimbăm API-ul backend
|
||||
- NU facem KPIStrip (bandă compactă) - facem carduri individuale
|
||||
|
||||
## 6. Layout Vizual
|
||||
|
||||
### MOBIL (5 pagini swipe):
|
||||
```
|
||||
[Pagina 1 - Solduri Grid 2x2]
|
||||
┌──────────┬──────────┐
|
||||
│TREZORERIE│ CLIENȚI │
|
||||
│ 150.000 │ 89.000 │
|
||||
│[expand] │[expand] │
|
||||
├──────────┼──────────┤
|
||||
│FURNIZORI │ TVA │
|
||||
│ 45.000 │ +15.000 │
|
||||
│[expand] │[expand] │
|
||||
└──────────┴──────────┘
|
||||
• ○ ○ ○ ○ (dot indicator)
|
||||
|
||||
[Pagina 2] TreasuryDualCard (grafice)
|
||||
[Pagina 3] CashFlowMetricCard (grafice)
|
||||
[Pagina 4] ClientiBalanceCard (grafice)
|
||||
[Pagina 5] FurnizoriBalanceCard (grafice)
|
||||
```
|
||||
|
||||
### DESKTOP:
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Dashboard [↻ Refresh] │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │TREZORERIE│ │ CLIENȚI │ │FURNIZORI│ │ TVA │ ← Solduri │
|
||||
│ │ 150.000 │ │ 89.000 ●│ │ 45.000 │ │+15.000 │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ ┌───────────────────┐ ┌───────────────────┐ │
|
||||
│ │ Treasury Trend │ │ Cash Flow │ ← Grafice │
|
||||
│ │ [sparkline] │ │ [sparkline] │ │
|
||||
│ └───────────────────┘ └───────────────────┘ │
|
||||
│ ┌───────────────────┐ ┌───────────────────┐ │
|
||||
│ │ Clienți Balance │ │ Furnizori Balance │ │
|
||||
│ │ [sparkline] │ │ [sparkline] │ │
|
||||
│ └───────────────────┘ └───────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
Reference in New Issue
Block a user