setup viste
This commit is contained in:
@@ -291,26 +291,92 @@ if (!empty($contatto['individuo_id'])) { create }
|
||||
```
|
||||
|
||||
## Prossimi Passi
|
||||
- [DONE] Aggiungere filtro Tag nella vista Documenti — già presente (tag filter bar + colonna Tag in lista/griglia)
|
||||
- [DONE] Gestire il caso `tag[]` vuoto — già gestito da `$request->filled('tag')` in tutti i 4 controller index
|
||||
- [DONE] MailingList — tag support completato (controller, index/create/edit/show views, filter bar)
|
||||
- [DONE] Report — tag columns in ReportColumnRegistry + tag filter in custom reports + UI multi-select
|
||||
- [DONE] Ricerca per Tag — MailingList integrata nei risultati
|
||||
- [DONE] `storeCustom()` ora salva correttamente `tag_filter` e `tag_filter_mode`
|
||||
- [DONE] `MailingListController@store/update` — auto-fetch email da Individuo quando non fornita
|
||||
- [DONE] Verificata presenza `@stack('scripts')` nel layout — presente a riga 305 (prima di `@yield('scripts')`)
|
||||
- [DONE] Verificata mass tag action Documenti (`DocumentoController@massTag`) — funzionante
|
||||
- [DONE] Verificato: tutti i 5 entity controllers passano `$allTags` alle viste index
|
||||
- [DONE] La logica `$toRemove = array_diff($existingIds, $newIds)` in `update()` è corretta — rimuove solo contatti che l'utente ha esplicitamente deselezionato o rimosso dalla tabella. Non necessita modifiche.
|
||||
- [DONE] SweetAlert2 conferma su salvataggio mailing list (edit.blade.php) quando ci sono contatti senza email
|
||||
- [DONE] Normalizzata `invia()` da `flatMap`+`pluck` a `map`+`first()` (1 email per individuo, come `invioElabora()`)
|
||||
- [DONE] Aggiunto logging contatti saltati in `invia()` e `invioElabora()` (quando senza email)
|
||||
- [DONE] Fix: contattiCaricati initialization ora include codice_id/cognome/nome da righe DOM — contatti esistenti non più blank dopo Carica contatti
|
||||
- [DONE] Fix: EmailController@destroy ora redirect a inbox invece che back() (non rimane su email cancellata)
|
||||
- [DONE] Mass action Individui: Assegna Gruppo (route + controller + modal con select gruppi + Assign/Remove radio)
|
||||
- [DONE] Mass action Individui: Assegna Tag (route + controller + modal con _tag-selector)
|
||||
- [DONE] Mass action Gruppi: Assegna Tag (route + controller + modal con _tag-selector)
|
||||
- [DONE] Mass action Gruppi: Elimina (route + controller + modal con conferma, detach membri + delete)
|
||||
- [DONE] Fix: IndividuoController@massGruppo e @massTag ora convertono stringa ids in array (non funzionavano perché hidden input invia stringa, non array)
|
||||
- [DONE] Ricerca per Tag multipli: controller accetta `?tag[]=slug1&tag[]=slug2`, usa `withAllTags` (AND logic) per 2+ tag. Vista aggiornata: checkbox cliccabili per multi-selezione, info boxes unificate, "Vedi tutti" passa tutti i tag
|
||||
- [DONE] ... (existing items)
|
||||
- Verificare end-to-end su remote: tutte le nuove mass action, mailing list con contatti senza email, ricerca multi-tag
|
||||
- [DONE] Fix performance: spostata query `VistaReport::where(...)->get()` da `@php` nel partial `table-settings.blade.php` a tutti i 5 controller (prima veniva eseguita 1 query per ogni pagina load per ogni entity, anche senza mai aprire la modale)
|
||||
- [DONE] Rimosse vecchie modal legacy (`#saveVistaModal`, `#colonneModal`, `#vistaListModal`) da `individui` e `gruppi` — duplicate rispetto al nuovo modal unificato
|
||||
- [DONE] Rimosse vecchie funzioni JS (`saveVista()`, `toggleColumn()`, `showSaveVistaModal()`) da `individui` e `gruppi`
|
||||
- [DONE] Individui: `$allColumns` espanse da 6 a 17 colonne (aggiunte: data_nascita, genere, indirizzo, cap, citta, provincia, tipo_documento, numero_documento, scadenza_documento, note, created_at) — tutte con `<th>`/`<td>` condizionali nella vista
|
||||
- [DONE] Individui: `getColumnIndex()` introdotta per lookup dinamico dell'indice colonna (sostituisce hardcoded `{codice:1, cognome:2, ...}` in `sortTable()` e `applyColumnFilter()`)
|
||||
- [DONE] I controller per eventi, documenti, mailing-liste hanno già `$tableColumns` con flag `visible` — stesso meccanismo di gruppi. Nessuna modifica necessaria.
|
||||
- [DONE] Fix: pulsante edit vista usa `data-*` attributi invece di `onclick` con `addslashes(json_encode(...))` — previene rottura HTML per JSON contenente `"`
|
||||
- [DA FARE] Test browser: caricare ogni pagina entity, verificare default vista, toggle colonne, resize, drag-reorder, print
|
||||
- [DA FARE] Test browser: flusso edit vista (✏️ → popola form → modifica → Aggiorna → reload)
|
||||
- [DA FARE] Test browser: salvare nuova vista, switching tra viste, cancellazione vista
|
||||
|
||||
## 2026-06-10 — Per-User Column Views (colonne visibili, larghezze, ordine)
|
||||
|
||||
**Obiettivo**: Implementare viste colonne personalizzabili per utente su tutte le 5 entity list pages (individui, gruppi, eventi, documenti, mailing-liste), con persistenza tra login.
|
||||
|
||||
### Cosa è stato fatto
|
||||
|
||||
**Migration** (`2026_06_10_044946_add_column_widths_and_order_to_viste_report_table.php`):
|
||||
- Aggiunge `colonne_larghezze` (json) e `colonne_ordine` (json) a `viste_report`
|
||||
- Guardia `Schema::hasColumn` per compatibilità cross-DB (MySQL ↔ SQLite)
|
||||
- Già eseguita in batch 38
|
||||
|
||||
**Backend**:
|
||||
- `VistaReport.php`: `$fillable` + `$casts` (array) per entrambi i nuovi campi
|
||||
- `VistaReportController@store`/`@update`: validazione estesa con `colonne_larghezze`, `colonne_ordine` (array)
|
||||
- Tutti i 5 controller passano alla vista: `$tableColumns` (array `['key','label','visible']`), `$entityType`, `$columnWidths`, `$visibleColumns`, `$allColumns` (varia nome in base al controller)
|
||||
- Tutti i 5 controller ora passano `$userVistas` (precaricate) invece di eseguire query nella view
|
||||
- `IndividuoController`: `$allColumns` espanse con tutte le colonne DB disponibili (da 6 a 17)
|
||||
- `IndividuoController`: aggiunto `use App\Models\VistaReport` per la query `$userVistas`
|
||||
|
||||
**Frontend JS** (`public/js/column-manager.js`):
|
||||
- Classe `ColumnManager`: resize via mouse drag su handle, reorder via HTML5 DnD, persistenza larghezze in `sessionStorage`, fallback da `vista-data` DOM element, `printWithSettings()` che clona la tabella in finestra print-ready
|
||||
|
||||
**Modal** (`resources/views/partials/table-settings.blade.php`):
|
||||
- Modal unificato con 3 tab: Colonne (checkbox visibilità + input larghezza + drag-reorder list), Viste (salva/carica/cancella), Stampa (pulsante print)
|
||||
- Definisce `initTableSettings()` (NON auto-esegue) per evitare race condition con ColumnManager
|
||||
- **RIMOSSA** query `VistaReport::where(...)->get()` dal `@php` block — ora usa `$userVistas` passato dal controller
|
||||
- Non usa più `Auth::id()` direttamente — riceve `$userVistas` già popolato
|
||||
|
||||
**Views** — tutte e 5 aggiornate:
|
||||
- `individui/index.blade.php`:
|
||||
- `$allColumns` nella vista ora ha 17 colonne (vs 6 prima)
|
||||
- `<th>` e `<td>` condizionali per tutte le nuove colonne (data_nascita, genere, indirizzo, cap, citta, provincia, tipo_documento, numero_documento, scadenza_documento, note, created_at)
|
||||
- RIMOSSE modal legacy: `#saveVistaModal`, `#colonneModal`
|
||||
- RIMOSSE funzioni JS legacy: `saveVista()`, `toggleColumn()`
|
||||
- RIMOSSO sync checkboxes nel `DOMContentLoaded` (non più necessari)
|
||||
- NUOVA: `getColumnIndex(colKey)` — lookup dinamico dell'indice colonna basato su `data-column`
|
||||
- `sortTable()` e `applyColumnFilter()` ora usano `getColumnIndex()` invece di hardcoded mappa
|
||||
- `gruppi/index.blade.php`:
|
||||
- RIMOSSE modal legacy: `#saveVistaModal`, `#vistaListModal`
|
||||
- RIMOSSO pulsante "Salva Vista" legacy
|
||||
- RIMOSSE funzioni JS legacy: `showSaveVistaModal()`, `saveVista()`
|
||||
- `eventi/index.blade.php`: colonne dinamiche via `$visibleColumns`, `@section('scripts')` con ColumnManager + `initTableSettings()`
|
||||
- `mailing-liste/index.blade.php`: stessa struttura
|
||||
- `documenti/index.blade.php`: ColumnManager init (non reorderable), column-manager.js incluso
|
||||
- Tutti i `<th>` hanno `data-column` attributo per mapping JS
|
||||
- Tutte chiamano `initTableSettings()` dopo `new ColumnManager()` nel `DOMContentLoaded`
|
||||
|
||||
**Performance fix**:
|
||||
- Rimossa query `VistaReport::where(...)->get()` dal `@php` block in `table-settings.blade.php` (1 query extra per ogni pagina load su 5 entità)
|
||||
- Spostata nei 5 controller come `$userVistas` passata via `compact()`
|
||||
- Totale: -5 query per pagina load (una per ogni entity, anche su pagine non di index)
|
||||
|
||||
**Verifica**:
|
||||
- JS brace balance: OK su tutti i 5 file (node check)
|
||||
- PHP lint: OK su tutti i 5 controller
|
||||
- Presenza `data-column`: individui=19, gruppi=14, eventi=9, mailing-liste=7, documenti=8
|
||||
- Fallback `$visibleColumns` quando `$vista === null`: presente e corretto in tutti i 5 controller
|
||||
- Nessun residuo di vecchie modal legacy in individui e gruppi
|
||||
- Rimosso bottone "Salva Vista" orfano da `individui/index.blade.php` (chiamava `showSaveVistaModal()` non più esistente)
|
||||
- Aggiunto pulsante modifica ✏️ nel tab Viste per ogni vista salvata: popola il form "Salva vista corrente" con nome, default flag e colonne visibili; cambia bottone in "Aggiorna" e fa PUT `/viste/{id}` invece di POST; zero query extra
|
||||
### 2026-06-10 — Fix: editVista onclick → data-* attributes
|
||||
|
||||
**Problema**: Il pulsante modifica vista usava `onclick` con `addslashes(json_encode(...))`. In un attributo HTML delimitato da `"`, il backslash-escaping di `\"` non è gestito in modo standard dai browser — il JSON contenente `"` poteva rompere l'attributo HTML.
|
||||
|
||||
**Fix**:
|
||||
1. Sostituito `onclick` con `data-*` attributi (`data-vista-id`, `data-vista-nome`, `data-vista-default`, `data-vista-colonne`) usando `{{ }}` di Blade (che applica `htmlspecialchars`, codificando `"` → `"` sicuro in HTML).
|
||||
2. `editVista()` ora accetta un array direttamente (non più JSON string da parsare).
|
||||
3. Click handler registrato in `initTableSettings()` via `document.querySelectorAll('.edit-vista-btn')` + `dataset` (browser decodifica automaticamente `"` → `"`).
|
||||
|
||||
### 2026-06-10 — Fix: 405 Method Not Allowed su update vista (via AJAX fetch)
|
||||
|
||||
**Problema**: Modificando una vista e cliccando "Aggiorna", `fetch()` inviava `PUT /viste/{id}` ma il controller `VistaReportController@update` restituiva `return back()` (302 redirect). `fetch()` seguiva il redirect — in alcuni browser il metodo PUT veniva preservato, ma la route `gruppi` accetta solo GET → 405 Method Not Allowed.
|
||||
|
||||
**Fix**:
|
||||
1. `VistaReportController@update` (linea 101-103): aggiunto `if ($request->expectsJson()) { return response()->json([...]); }` — così il fetch riceve JSON 200, non un redirect 302.
|
||||
2. Fetch headers in `table-settings.blade.php`: aggiunto `'Accept': 'application/json'` — necessario perché `expectsJson()` controlla l'header `Accept`, non `Content-Type`.
|
||||
|
||||
Reference in New Issue
Block a user