This commit is contained in:
2025-11-29 00:50:22 +01:00
parent 6bc65c2a29
commit 30b4bb4626
11 changed files with 518 additions and 59 deletions

View File

@@ -46,13 +46,37 @@ XX. **Nome Problema (FIX/IMPLEMENTATO DATA):** - **Problema:** Descrizione breve
## Quick Start - Session Recovery
**Ultima sessione:** 28 Novembre 2025 (pomeriggio - sera)
**Ultima sessione:** 28 Novembre 2025 (notte)
**Stato progetto:** Migrazione Oracle APEX → .NET + React TypeScript in corso
**Lavoro completato nell'ultima sessione:**
- **NUOVA FEATURE: Sistema Collaborazione Real-Time Globale** - IN CORSO
- **NUOVA FEATURE: Sincronizzazione Real-Time Efficiente** - COMPLETATO
- **Prima:** Al salvataggio veniva inviata solo una notifica `DataSaved`, l'altra sessione ricaricava il template dal server (lento)
- **Dopo:** Al salvataggio viene inviato l'intero template via SignalR (`BroadcastTemplateSync`), l'altra sessione lo applica direttamente (istantaneo)
- **Compressione automatica** per template > 10KB usando gzip via browser's CompressionStream API
- **Version tracking** per gestione conflitti (ignora template con versione più vecchia)
- Nuovo metodo Hub: `BroadcastTemplateSync(roomKey, templateJson, version, compressed)`
- Nuovo evento: `TemplateSync` con decompressione automatica lato client
- **FIX: Limite messaggio SignalR** - Aumentato `MaximumReceiveMessageSize` a 1MB in `Program.cs` (default era 32KB)
- **File modificati:**
- `CollaborationHub.cs` - Aggiunto `BroadcastTemplateSync` e `TemplateSyncMessage` con campo `Compressed`
- `collaboration.ts` - Aggiunto `broadcastTemplateSync()`, utilities compressione/decompressione (`compressString`, `decompressString`), handler `TemplateSync`
- `CollaborationContext.tsx` - Esposto `broadcastTemplateSync` e `onTemplateSync`
- `ReportEditorPage.tsx` - Sostituito `sendDataSaved()` con `broadcastTemplateSync()`, aggiunto handler per applicare template ricevuti
- `Program.cs` - Configurato SignalR con `MaximumReceiveMessageSize = 1MB`
- **FIX: Auto-Save Event-Based con Debounce** - COMPLETATO
- Riscritto auto-save per triggerare ad ogni modifica (non a intervalli)
- Debounce di 500ms per evitare salvataggi multipli durante editing rapido
- Usa `useRef` per `saveMutation`, `template`, `templateInfo` per evitare re-creazione del timeout
- Dipendenze effect: solo `autoSaveEnabled`, `isNew`, `hasUnsavedChanges`, `templateHistory.undoCount`
- Il check `isPending` avviene al momento dell'esecuzione del timeout, non come dipendenza
**Lavoro completato nelle sessioni precedenti (28 Novembre 2025 pomeriggio - sera):**
- **NUOVA FEATURE: Sistema Collaborazione Real-Time Globale** - COMPLETATO
- Migrato da sistema report-specific a sistema globale per tutta l'app
- `CollaborationHub.cs` - Hub SignalR generico per qualsiasi entità/pagina
- `collaboration.ts` - Service singleton per gestione connessione
@@ -61,7 +85,6 @@ XX. **Nome Problema (FIX/IMPLEMENTATO DATA):** - **Problema:** Descrizione breve
- Room-based collaboration con formato `{entityType}:{entityId}`
- **FIX: Incompatibilità versione SignalR** - Rimosso package `Microsoft.AspNetCore.SignalR.Common` v10.0.0 incompatibile con .NET 9, downgrade client `@microsoft/signalr` a v8.0.7
- **FIX: Auto-save non funzionante** - Usati `useRef` per evitare re-run dell'effect causato da `saveMutation` nelle dependencies
- **IN DEBUG:** Sincronizzazione real-time tra sessioni - Il salvataggio manuale sincronizza, l'auto-save invia la notifica ma la sessione 2 non la riceve ancora
**Lavoro completato nelle sessioni precedenti (28 Novembre 2025 tarda notte):**
@@ -1077,22 +1100,47 @@ frontend/src/
- **Soluzione:** Usati `useRef` per `saveMutation`, `template`, e `templateInfo` per evitare che l'effect si ri-esegua inutilmente
- **File:** `ReportEditorPage.tsx`
22. **Sistema Collaborazione Real-Time (IN CORSO 28/11/2025):**
22. **Sistema Collaborazione Real-Time (COMPLETATO 28/11/2025):**
- **Obiettivo:** Collaborazione stile Google Docs su tutto l'applicativo
- **Architettura implementata:**
- `CollaborationHub.cs` - Hub SignalR generico con room-based collaboration
- `collaboration.ts` - Service singleton frontend
- `CollaborationContext.tsx` - React Context con `useCollaborationRoom` hook
- Room key format: `{entityType}:{entityId}` (es. `report-template:2`)
- **Stato attuale:**
- Connessione e join room funzionanti
- Salvataggio manuale notifica le altre sessioni correttamente
- Auto-save invia `sendDataSaved()` ma le altre sessioni non ricevono la notifica
- **Debug in corso:** Aggiunto logging dettagliato per tracciare il flusso dei messaggi
- **File principali:**
- Backend: `CollaborationHub.cs`
- Frontend: `collaboration.ts`, `CollaborationContext.tsx`, `ReportEditorPage.tsx`
23. **Sincronizzazione Real-Time Lenta (FIX 28/11/2025 sera):**
- **Problema:** Al salvataggio (manuale o auto-save), l'altra sessione impiegava diversi secondi per vedere le modifiche
- **Causa:** Il sistema usava `DataSaved` notification che causava un reload del template dal server (`queryClient.invalidateQueries`)
- **Soluzione:** Implementato `BroadcastTemplateSync` che invia l'intero template via SignalR direttamente alle altre sessioni:
- Nuovo metodo Hub `BroadcastTemplateSync(roomKey, templateJson, version, compressed)`
- L'altra sessione riceve il template e lo applica istantaneamente con `historyActions.setWithoutHistory()`
- Aggiunto version tracking per evitare di applicare versioni più vecchie
- Compressione automatica gzip per template > 10KB (usa browser's CompressionStream API)
- **File:** `CollaborationHub.cs`, `collaboration.ts`, `CollaborationContext.tsx`, `ReportEditorPage.tsx`
24. **Limite Messaggio SignalR (FIX 28/11/2025 notte):**
- **Problema:** La connessione SignalR si disconnetteva con errore "The maximum message size of 32768B was exceeded"
- **Causa:** Il template compresso (~110KB) superava il limite di default di SignalR (32KB)
- **Soluzione:** Configurato `MaximumReceiveMessageSize = 1MB` in `Program.cs`:
```csharp
builder.Services.AddSignalR(options => {
options.MaximumReceiveMessageSize = 1024 * 1024; // 1MB
})
```
- **File:** `Program.cs`
25. **Auto-Save Non Funzionante (FIX 28/11/2025 notte):**
- **Problema:** L'auto-save non si attivava anche con modifiche non salvate
- **Causa:** Le dipendenze dell'effect includevano `saveMutation`, `template`, `templateInfo` che cambiano ad ogni render, causando reset continui del timeout
- **Soluzione:** Approccio event-based con debounce usando refs:
- `saveMutationRef`, `templateForSaveRef`, `templateInfoForSaveRef` per accedere ai valori correnti senza re-triggerare l'effect
- Dipendenze effect ridotte a: `autoSaveEnabled`, `isNew`, `hasUnsavedChanges`, `templateHistory.undoCount`
- Check `isPending` spostato dentro il callback del setTimeout
- **File:** `ReportEditorPage.tsx`
### Schema Database Report System
Le tabelle sono già nel DbContext (`AppollinareDbContext.cs`):