export calendar - modifica impostazioni

This commit is contained in:
2026-05-26 14:10:04 +02:00
parent 60ebd3b652
commit 982d754857
26 changed files with 1609 additions and 289 deletions
+91 -1
View File
@@ -548,4 +548,94 @@ php artisan route:list --name=email
- `resources/views/eventi/show.blade.php`
- `resources/views/eventi/index.blade.php`
(Last updated: 26 Maggio 2026 - Event Types system)
### 26 Maggio 2026 - ACL Fixes & Form Modules Sync
- **Problema**: Form admin utenti (create/edit) aveva lista moduli hardcoded e mancante di `'report'`; user 4 (fbarachino) non aveva permesso `report` né `is_admin`
- **Fix form edit/create**: Sostituito `@foreach(['individui', 'gruppi', 'eventi', 'documenti', 'mailing', 'viste'] as $module)` con `@foreach(\App\Models\User::MODULES as $module)` in entrambe le view (`edit.blade.php:76`, `create.blade.php:66`) — ora la lista è sempre allineata alla costante `User::MODULES`
- **Fix user 4**:
- Aggiunto `'report' => 2` alle permissions (full access)
- Settato `is_admin = true` → `isSuperAdmin()` = true, bypass totale ACL
- `canAccess('report')` = true, tutti i menu sidebar ora visibili
- **Nuovo comando**: `app/Console/Commands/SyncUserPermissions.php` — `php artisan users:sync-permissions`
- Itera tutti gli utenti (inclusi superadmin) e aggiunge con default 0 ogni modulo mancante in `User::MODULES`
- Previene discrepanze future tra permissions salvate e MODULES costante
- **Files modificati**:
- `resources/views/admin/utenti/edit.blade.php`: linea 76, hardcoded → `User::MODULES`
- `resources/views/admin/utenti/create.blade.php`: linea 66, hardcoded → `User::MODULES`
- **File creato**:
- `app/Console/Commands/SyncUserPermissions.php`: nuovo comando artisan
- **Stato sidebar user 4**: `isSuperAdmin()` = true → tutti i menu visibili, `canAccess('report')` = true
### 26 Maggio 2026 - ACL 'settings' Module (Impostazioni/Admin Permission)
- **Problema**: Non esisteva un permesso ACL specifico per accedere al menu Impostazioni e Admin. L'accesso era legato esclusivamente a `isSuperAdmin()` bypass totale. Inoltre l'`ImpostazioniController` usava `authorizeWrite('viste')` come piggyback scorretto.
- **Soluzione**: Nuovo modulo `settings` separato, slegato da `viste` e da `isSuperAdmin()`.
- **Modifiche**:
- `User.php`: aggiunto `'settings'` a `MODULES` (costante linea 36)
- `adminlte.blade.php` sidebar: `@if(Auth::user()->isSuperAdmin())` → `@if(Auth::user()->canManage('settings'))` per menu Impostazioni e Admin (linee 205-226)
- `AdminOnly.php` middleware: `isSuperAdmin()` → `isSuperAdmin() || canManage('settings')` — permette accesso a `/admin/*` anche a non-superadmin con permesso settings:2
- `ImpostazioniController.php`: rimpiazzate tutte le 16 occorrenze di `authorizeWrite('viste')` e `authorizeDelete('viste')` con `'settings'`
- `EmailSettingsController.php`: aggiunto `$this->authorizeWrite('settings')` in tutti i 5 metodi pubblici (index, save, testConnection, testSmtp, syncNow) — prima non avevano alcuna autorizzazione esplicita
- `SyncUserPermissions.php` aggiornato: ora include anche superadmin nella sync (per consistenza dati)
- Eseguito `php artisan users:sync-permissions` → user 1 e 4 aggiornati con `settings: 0`
- **Comportamento risultante**:
- `isSuperAdmin()` bypassa sempre tutto (base Controller.php)
- Utente normale con `settings:2` (Completo) → vede menu Impostazioni+Admin, può operare
- Utente normale con `settings:0` → menu nascosto, 403 su accesso diretto URL
- `settings:1` (Lettura) non basta per operazioni di scrittura (sidebar non mostra il menu perché richiede `canManage`)
- **Files modificati**:
- `app/Models/User.php`: MODULES + 'settings'
- `resources/views/layouts/adminlte.blade.php`: isSuperAdmin → canManage('settings')
- `app/Http/Middleware/AdminOnly.php`: isSuperAdmin || canManage('settings')
- `app/Http/Controllers/ImpostazioniController.php`: viste → settings in 16 authorize calls
- `app/Http/Controllers/Admin/EmailSettingsController.php`: aggiunte 5 authorizeWrite('settings')
- `app/Console/Commands/SyncUserPermissions.php`: superadmin inclusi nella sync
### 26 Maggio 2026 - Fix Salvataggio is_admin (Checkbox Superadmin)
- **Problema**: Non era possibile togliere il flag "Superadmin (bypass ACL)" dall'interfaccia admin. Il flag rimaneva sempre true dopo il salvataggio.
- **Cause** (3 bug concatenati):
1. **`url()` assoluto** nell'action del form edit (`url('/admin/utenti/' . $user->id)`) → da accesso remoto generava `http://localhost/admin/utenti/4`, il POST falliva silenziosamente
2. **Nessun hidden field** per unchecked checkbox → quando la checkbox veniva deselezionata, il campo `is_admin` non veniva inviato nella richiesta. Anche se il controller aveva `?? false`, il combinato col bug #1 impediva il salvataggio
3. **Mancanza `old()`** per lo stato checkbox → su validation error redirect, la checkbox mostrava il valore DB invece del valore inviato
- **Fix applicati**:
- `edit.blade.php`: `url(...)` → path relativo `/admin/utenti/...` (linea 20); aggiunto hidden `<input type="hidden" name="is_admin" value="0">` prima della checkbox; `old()` per stato checkbox e status/role_preset_id
- `create.blade.php`: aggiunto hidden field come sopra; default per `settings` = `'0'` (Nessuno) invece di `'1'` (Lettura) per nuovi utenti
- `UtenteController.php` (store + update): rimosso `?? false` da `$user->is_admin` — ora usa direttamente `$validated['is_admin']` (sempre presente grazie all'hidden field)
- `AuthController.php`: aggiunti `'report' => 0` e `'settings' => 0` ai default permissions per nuove registrazioni (sia first-user che non)
- **Files modificati**:
- `resources/views/admin/utenti/edit.blade.php`: form action, hidden field, old()
- `resources/views/admin/utenti/create.blade.php`: hidden field, settings default 0
- `app/Http/Controllers/Admin/UtenteController.php`: removed ?? false
- `app/Http/Controllers/Auth/AuthController.php`: added report/settings defaults
(Last updated: 26 Maggio 2026 - Fix Salvataggio is_admin)
### 26 Maggio 2026 - Export ICS/iCal Eventi
- **Nuovo Service**: `app/Services/IcsExportService.php` — generazione file ICS RFC 5545
- `generateSingle(Evento)` — esporta un singolo evento
- `generateCollection(iterable)` — esporta multipli eventi in un unico file ICS
- Supporto **RRULE** completo per eventi ricorrenti:
- `settimanale` → `FREQ=WEEKLY;BYDAY=MO`
- `mensile` → `FREQ=MONTHLY;BYSETPOS=1;BYDAY=SU` (con opzionale `BYMONTH`)
- `annuale` → `FREQ=YEARLY;BYMONTH=6;BYMONTHDAY=15`
- `altro` → `FREQ=WEEKLY;BYDAY=MO`
- Timezone `Europe/Rome` per eventi con ora, DATE (all-day) per eventi senza ora
- LOCATION, DESCRIPTION, SUMMARY, UID univoci
- Line folding a 75 caratteri RFC 5545
- Escape di `;`, `,`, `\`, `\n`
- **Nuovi metodi in `EventoController`**:
- `exportIcs(int $id, IcsExportService $ics)` — StreamedResponse download singolo evento
- `exportSelectedIcs(Request $request, IcsExportService $ics)` — StreamedResponse con filtro per ID selezionati o ricerca corrente
- **Routes**:
- `GET /eventi/{evento}/export-ics``eventi.export-ics`
- `POST /eventi/export-ics``eventi.export-selected-ics`
- **View updates**:
- `show.blade.php`: pulsante "Esporta ICS" nella toolbar azioni
- `index.blade.php`: pulsante "Esporta ICS" nella card-tools; se ci sono righe selezionate esporta solo quelle, altrimenti esporta tutti i risultati della ricerca corrente
- `calendar.blade.php`: pulsante "Esporta ICS" che esporta tutti gli eventi
- **Files creati**:
- `app/Services/IcsExportService.php`
- **Files modificati**:
- `app/Http/Controllers/EventoController.php`
- `routes/web.php`
- `resources/views/eventi/show.blade.php`
- `resources/views/eventi/index.blade.php`
- `resources/views/eventi/calendar.blade.php`