fix error
This commit is contained in:
@@ -1,48 +1,60 @@
|
||||
# 🧠 MEMORY.md — Stato Progetto
|
||||
|
||||
## Goal
|
||||
- Stabilizzare il modale "Carica Documento" e migliorare la gestione cartelle durante l'upload.
|
||||
- Correggere tutti i bug critici identificati nell'applicazione Glastree, a partire dal bug segnalato "rimuovendo un individuo da un gruppo, l'individuo perdeva tutti i contatti"
|
||||
|
||||
## Constraints & Preferences
|
||||
- (none)
|
||||
- Laravel 13, PHP 8.4, AdminLTE 4, MySQL/MariaDB
|
||||
- Zero placeholder, zero TODO, codice funzionante
|
||||
- Compatibilità cross-DB MySQL ↔ SQLite
|
||||
|
||||
## Progress
|
||||
### Done
|
||||
- Aggiunto pulsante "Scarica Guida PDF" nella sidebar di `/help` con nuovo metodo `HelpController::downloadPdf()` e route `GET /help/pdf/download`
|
||||
- Aggiunta card "Backup" in dashboard (small-box bg-navy, icona fa-hdd) con conteggio backup, visibile solo a utenti con `canManage('settings')`
|
||||
- Corretto `modal-body` nel modale `#uploadModal` che chiudeva prematuramente (pulsanti Annulla/Carica finivano fuori dal popup)
|
||||
- Aggiunto campo `visibilita` (select Pubblico/Individuo/Gruppo) nel form di upload documento, mancante e richiesto dal controller
|
||||
- Aggiunto selettore cartelle visibile (`<select name="cartella_id" id="uploadCartellaId">`) nel modale di upload (sostituisce il vecchio hidden input)
|
||||
- Aggiunto pulsante "Nuova cartella" sia nel modale upload (`#uploadNewFolderBtn`) che nel modale "Sposta" (`#massMoveNewFolderBtn`)
|
||||
- Sostituito SweetAlert2 per creazione cartella con il modale Bootstrap `#newFolderModal` già esistente (risolve focus trap Bootstrap 4 che bloccava l'input)
|
||||
- Aggiornato `toggleUploadRepo()` per nascondere/mostrare il gruppo cartella in base alla selezione del repository remoto
|
||||
- Aggiunto flag `window._uploadNewFolder` per comportamento differenziato: da upload aggiunge opzione al select senza ricaricare, da tooltip ricarica la pagina
|
||||
- **Fix backdrop grigio persistente dopo creazione cartella**: ora `#uploadModal` viene prima nascosto (quando si clicca "Nuova cartella") e poi ri-mostrato dopo la creazione nel success handler, risolvendo il conflitto di backdrop tra modali annidati Bootstrap 4
|
||||
- **Fix scroll modal upload**: ristrutturato `<form>` per non avvolgere `.modal-body` e `.modal-footer` (ora è dentro `.modal-body`), così `modal-dialog-scrollable` funziona correttamente. Pulsante submit ha `form="uploadForm"` per collegamento cross-DOM
|
||||
- **Cancellata cache Laravel** (`php artisan optimize:clear`)
|
||||
- **Fix BUG CRITICO 3** – `IndividuoController::update()` (riga 216): avvolto `$individuo->contatti()->delete()` dentro `if ($request->has('contatti'))`. Se il request non contiene il campo `contatti` (es. submit da form annidato), i contatti NON vengono eliminati.
|
||||
- **Fix BUG CRITICO 1** – `individui/edit.blade.php`: convertiti 4 form annidati in pulsanti `type="button"` + `fetch()` AJAX:
|
||||
- Linea 235-240: rimozione gruppo → `deleteGruppoFromEdit()`
|
||||
- Linea 245-267: modifica gruppo inline → `submitEditGruppo()`
|
||||
- Linea 291-319: upload documento → `submitUploadDocumentoIndividuo()`
|
||||
- Linea 350-355: eliminazione documento → `deleteDocumentoFromEdit()`
|
||||
- **Fix BUG CRITICO 2** – `gruppi/edit.blade.php`: convertiti 3 form annidati in pulsanti `type="button"` + `fetch()` AJAX:
|
||||
- Linea 155-180: modifica membro inline → `submitEditMembro()`
|
||||
- Linea 204-231: upload documento → `submitUploadDocumentoGruppo()`
|
||||
- Linea 261-266: eliminazione documento → `deleteDocumentoFromEdit()`
|
||||
- **Fix BUG CRITICO 4** – `gruppi/show.blade.php`: spostati i flash messages (session success/error) DENTRO `@section('content')` invece di essere fuori (non venivano mai visualizzati)
|
||||
- **Fix BUG CRITICO 5** – `eventi/show.blade.php`: rimossi 2 tag `</div>` extra alle linee 214-217 che rompevano la struttura HTML
|
||||
- **Fix BUG CRITICO 6** – `eventi/show.blade.php`: escape JS di `$evento->nome_evento` nella `confirm()` (riga 307) per prevenire stored XSS
|
||||
- **Fix BUG CRITICO 7** – `ImpostazioniController.php`: aggiunto `use App\Models\Documento;` mancante (causava Fatal error in `saveAppSettings()` e `migrateStoragePath()`)
|
||||
- **Fix BUG CRITICO 8** – `ImpostazioniController.php`: sostituito `JSON_CONTAINS()` (non supportato da SQLite) con iterazione PHP su `json_decode()` — compatibile MySQL e SQLite
|
||||
- **Fix BUG CRITICO 9** – `ReportController.php`: corretto `$contatto->email` → `$contatto->valore` (riga 605, colonna `email` non esiste)
|
||||
- **Fix BUG CRITICO 10** – `DocumentoController.php`: prevenuta morph injection in `massUpdate()` sostituendo il fallback `?? $data['visibilita_target_type']` con un `isset()` check sul typeMap + `return back()->with('error')` se il tipo non è valido
|
||||
|
||||
### In Progress
|
||||
- (none)
|
||||
- *(nessuno)*
|
||||
|
||||
### Blocked
|
||||
- (none)
|
||||
- *(nessuno)*
|
||||
|
||||
## Key Decisions
|
||||
- Replicato il codice di creazione cartella con `SweetAlert2` → sostituito con modale Bootstrap `#newFolderModal` perché Bootstrap 4 impedisce il focus su elementi fuori dal `.modal` (focus trap)
|
||||
- Pulsante "Nuova cartella" nello stesso `<form>` del modal di upload riceve `e.preventDefault()` per sicurezza
|
||||
- Per evitare conflitti di backdrop Bootstrap 4 con modali annidati, si nasconde `#uploadModal` prima di mostrare `#newFolderModal` e lo si ripristina dopo il success
|
||||
- Per i form annidati si è scelto l'approccio `type="button"` + `fetch()` AJAX, già utilizzato in `individui/show.blade.php` e `gruppi/edit.blade.php` per funzioni esistenti (`deleteMembro`, `submitGruppoForm`, `uploadAvatar`, etc.)
|
||||
- Per documenti (upload/delete) il controller torna `redirect()`, non JSON. Le funzioni AJAX eseguono `window.location.reload()` dopo il fetch per aggiornare la vista.
|
||||
- `JSON_CONTAINS` sostituito con approccio PHP+json_decode per garantire compatibilità SQLite senza modificare lo schema DB.
|
||||
- `$request->has('contatti')` è la guardia corretta: se il form principale non invia il campo `contatti` (perché il submit proviene da un form annidato), non si cancella nulla.
|
||||
|
||||
## Next Steps
|
||||
- (none)
|
||||
- *(nessuno)* - Tutti i bug critici risolti
|
||||
|
||||
## Critical Context
|
||||
- Bootstrap 4.6.2 con focus trap: impedisce focus su elementi fuori dal `.modal` — SweetAlert2 aggiunge dialog al `<body>`, quindi il suo input non riceve focus
|
||||
- `#newFolderModal` già esisteva con submit handler AJAX a `/documenti/cartelle` e ricaricava pagina — ora con `window._uploadNewFolder` evita reload quando chiamato dall'upload
|
||||
- Bug: backdrop grigio non spariva dopo creazione cartella perché Bootstrap 4 gestisce male i modali annidati (due backdrop concorrenti)
|
||||
- **CAUSA DEL BUG SEGNALATO**: I form annidati in `individui/edit.blade.php` facevano sì che il browser ignorasse i form interni. I pulsanti "Rimuovi" inviavano il form principale → `IndividuoController::update()` → `$individuo->contatti()->delete()` incondizionato.
|
||||
- **Tutti i 10 bug critici sono stati risolti**
|
||||
- I controller di rimozione membro (`GruppoMembroController::destroy()` e `GruppoIndividuoController::destroy()`) usano già `detach()` correttamente — nessun problema lato backend
|
||||
|
||||
## Relevant Files
|
||||
- `app/Http/Controllers/HelpController.php`: metodo `downloadPdf()` + route `/help/pdf/download`
|
||||
- `app/Http/Controllers/HomeController.php`: `$stats['backups']` via `BackupService::list()`
|
||||
- `routes/web.php`: route `/help/pdf/download`
|
||||
- `resources/views/help/index.blade.php`: card-footer con pulsante download PDF
|
||||
- `resources/views/home/dashboard.blade.php`: small-box Backup condizionale
|
||||
- `resources/views/documenti/index.blade.php`: intero modale `#uploadModal` riscritto (visibilita, cartella select, nuova cartella via `#newFolderModal`, toggleUploadRepo); fix backdrop persistente nascondendo/rimostrando `#uploadModal`
|
||||
- `app/Http/Controllers/IndividuoController.php`: Fix BUG 3 – contatti condizionale
|
||||
- `app/Http/Controllers/ImpostazioniController.php`: Fix BUG 7 (use Documento) + BUG 8 (JSON_CONTAINS → PHP)
|
||||
- `app/Http/Controllers/ReportController.php`: Fix BUG 9 (email → valore)
|
||||
- `app/Http/Controllers/DocumentoController.php`: Fix BUG 10 (morph injection prevention)
|
||||
- `resources/views/individui/edit.blade.php`: Fix BUG 1 (4 nested forms → AJAX)
|
||||
- `resources/views/gruppi/edit.blade.php`: Fix BUG 2 (3 nested forms → AJAX)
|
||||
- `resources/views/gruppi/show.blade.php`: Fix BUG 4 (flash inside @section)
|
||||
- `resources/views/eventi/show.blade.php`: Fix BUG 5 (extra divs) + BUG 6 (XSS escape)
|
||||
|
||||
Reference in New Issue
Block a user