feat: Implement a customizable dashboard with user preferences and a dynamic widget system.

This commit is contained in:
2025-12-04 02:58:33 +01:00
parent e70b30cab8
commit 44c0406fd2
23 changed files with 5682 additions and 178 deletions

View File

@@ -0,0 +1,54 @@
# Zentral Dashboard Widgets
## Stato Attuale
Completato.
## Obiettivo
Implementare un sistema di widget per la dashboard di Zentral.
- I moduli devono poter esporre widget.
- Gli widget sono visibili solo se il modulo è attivo.
- La dashboard deve essere personalizzabile (drag & drop, resize) tramite `react-grid-layout`.
- La configurazione della dashboard deve essere salvata per ogni utente.
## Lavoro Svolto
1. **Backend**:
- Creata entità `UserDashboardPreference` per salvare il layout JSON della dashboard per ogni utente.
- Creato `DashboardController` per salvare/caricare la configurazione.
- Aggiornato `ZentralDbContext` e creata migrazione `AddUserDashboardPreference`.
- *Nota*: Il salvataggio su backend è attualmente disabilitato in favore del `localStorage` su richiesta utente, in attesa del sistema di gestione utenti completo.
2. **Frontend - Setup**:
- Installato `react-grid-layout`.
- Creato `WidgetRegistry` (`src/frontend/src/services/WidgetRegistry.ts`) per gestire i widget disponibili.
- Definita interfaccia `WidgetDefinition`.
- Creata funzione di registrazione `registerWidgets` chiamata in `main.tsx`.
3. **Frontend - Implementazione Widget**:
- Creato `ActiveModulesWidget`: lista moduli attivi (sostituisce la vecchia dashboard statica).
- Creato `WelcomeWidget`: banner di benvenuto.
- Creati widget statistici per tutti i moduli:
- `WarehouseStatsWidget`
- `SalesStatsWidget`
- `PurchasesStatsWidget`
- `ProductionStatsWidget`
- `HRStatsWidget`
- `EventsStatsWidget`
4. **Frontend - Dashboard**:
- Aggiornato `Dashboard.tsx` per usare `ResponsiveGridLayout`.
- Implementata modalità "Edit" per aggiungere/rimuovere/spostare widget.
- Implementato salvataggio della configurazione su `localStorage` (browser).
- Implementato caricamento configurazione con fallback a layout di default (Welcome + Active Modules).
- **Fix Sovrapposizione e Griglia Rigida**:
- Disabilitato ridimensionamento widget (`isResizable={false}`).
- Impostato `compactType={null}` per disabilitare il riposizionamento automatico (galleggiamento) e permettere posizionamento libero.
- Impostato `preventCollision={true}` per impedire sovrapposizioni e spostamenti indesiderati durante il trascinamento.
5. **Testing**:
- Attivati tutti i moduli tramite API.
- Verificato caricamento dashboard con tutti i moduli attivi.
- Verificato funzionamento modalità Edit:
- Ridimensionamento disabilitato.
- Spostamento widget in spazi vuoti funzionante.
- Tentativo di sovrapposizione bloccato (collisione prevenuta).
- Salvataggio layout persistente.