diff --git a/MEMORY.md b/MEMORY.md
index ef92eb17..52a076b3 100644
--- a/MEMORY.md
+++ b/MEMORY.md
@@ -13,7 +13,7 @@ App gestionale Laravel 13 con AdminLTE 4 per gestione Persone e Gruppi.
| **Email (IMAP/SMTP)** | ✅ Completo | Sync messaggi, firma, allegati, mittenti multipli, XOAUTH2 OAuth |
| **Google OAuth 2.0** | ✅ Implementato | Unified (Email/Drive/Calendar), UI impostazioni, XOAUTH2 SMTP+IMAP |
| **Repository Remoti** | ✅ Completo | WebDAV, Google Drive, OAuth |
-| **Calendario** | ✅ Completo | Google Calendar, CalDAV, sync bidirezionale, pulsante sync |
+| **Calendario** | ✅ Completo | Google Calendar, CalDAV, sync bidirezionale, pulsante sync, fix salvataggio campi sensibili |
| **Report** | ✅ Completo | Custom report con colonne/filtri salvabili, tag filter |
| **Help / Documentazione** | ✅ Completo | Tab Google Drive + Calendar in help page, PDF export |
| **Distribuzione** | ✅ Completo | build-dist.sh, fix path/cache/permessi/symlink |
@@ -24,6 +24,7 @@ App gestionale Laravel 13 con AdminLTE 4 per gestione Persone e Gruppi.
- **2026-06-09**: Tag completato (MailingList, Report, Ricerca), @stack scripts fix, storeCustom tag_filter fix, MailingList edit JS fix
- **2026-06-10**: Per-User Column Views, ColumnManager JS, editVista data-* fix, 405 AJAX fix
- **2026-06-17**: Google OAuth 2.0 unificato (revert Socialite, unified OAuth per Email/Drive/Calendar, XOAUTH2 SMTP+IMAP, UI impostazioni)
+- **2026-06-17**: Fix CalendarioConnessione — `encryptAndSetConfig()` perdeva campi sensibili in edit, `is_active` checkbox senza hidden fallback, query duplicata nella view
## Funzionalità Implementate
@@ -558,6 +559,33 @@ if (!empty($contatto['individuo_id'])) { create }
**Fix** (`app/Http/Controllers/DocumentoController.php`):
- Aggiunto `->whereNull('cartella_id')` alla query di root, così mostra solo documenti **senza cartella** (radice). Per vedere i documenti dentro una cartella bisogna navigarci dentro con `?folder_id=X`.
+## 2026-06-17 — Fix: CalendarioConnessione — salvataggio perdeva password/client_secret in edit + is_active sempre true
+
+**Problema**: Salvando una connessione calendario esistente (CalDAV o Google Calendar), i campi sensibili (password, client_secret) venivano sovrascritti con stringa vuota. Il test connessione e la sincronizzazione fallivano silenziosamente.
+
+**Root cause 1 — `encryptAndSetConfig()` sovrascrive campi vuoti**:
+- Il JS di edit (`editCalendario()`) azzera `config[password]` e `config[client_secret]` per sicurezza (valore `''`, placeholder `......`)
+- `encryptAndSetConfig()` in `CalendarioConnessione.php` controllava `$config[$field] !== ''` e saltava la crittografia, ma poi eseguiva `$this->config = $config` — la stringa vuota sovrascriveva il valore crittato precedente
+- `StorageRepository` NON aveva questo bug: `StorageRepositoryService::encryptSensitiveConfig()` preserva i campi esistenti con `} elseif (empty($config[$field]) && !empty($existingConfig[$field])) { $config[$field] = $existingConfig[$field]; }`
+
+**Root cause 2 — `is_active` checkbox senza hidden fallback**:
+- Stesso bug già fixato per email (2026-06-08): checkbox `is_active` senza ``
+- Quando non spuntato, il campo non veniva inviato → `$request->boolean('is_active', true)` restituiva sempre `true`
+- La connessione restava sempre attiva indipendentemente dallo switch
+
+**Root cause 3 — Query duplicata nella view**:
+- `resources/views/impostazioni/index.blade.php:773` ri-eseguiva `CalendarioConnessione::orderBy('ordine')->get()` nonostante il controller lo passasse già via `compact()`
+
+**Fix**:
+1. **`app/Models/CalendarioConnessione.php:56`** — `encryptAndSetConfig()` ora accetta `array $existingConfig = []` e preserva i valori crittati esistenti quando il campo submitted è vuoto (stesso pattern di `StorageRepositoryService::encryptSensitiveConfig()`)
+2. **`app/Http/Controllers/CalendarioConnessioneController.php:67`** — `update()` passa `$connessione->config` come secondo parametro a `encryptAndSetConfig()`
+3. **`resources/views/impostazioni/index.blade.php:1576`** — Aggiunto `` prima della checkbox
+4. **`resources/views/impostazioni/index.blade.php:773`** — Rimossa query duplicata `@php $calendarioConnessioni = ...`
+
+**Verifica**:
+- PHP lint: OK su entrambi i file modificati
+- JS brace balance: OK
+
## 2026-06-17 — Fix: Documenti mass tag "nessun documento selezionato"
**Problema**: Stesso identico bug di Eventi — toolbar button chiamava `$('#massTagModal').modal('show')` e il listener `show.bs.modal` non sempre popolava i campi.
@@ -602,3 +630,38 @@ Aggiunto `if (!Schema::hasTable('table_name')) { ... }` wrapper a 28 migration f
### Risultato
`php artisan migrate --seed` è ora completamente idempotente. Zero errori su 64 migration + 6 seeder. Re-run è un no-op.
+
+## 2026-06-17 — Fix: MailingList tag management (mass tag + per-riga + attiva checkbox)
+
+**Problema**: Nella GUI non era possibile assegnare tag alle mailing list né singolarmente né via azione massiva.
+
+**Root cause**:
+1. **Nessuna route mass-tag per mailing-liste** — Eventi, Documenti, Individui, Gruppi avevano `POST /{entity}/mass-tag` ma MailingList no
+2. **Nessun metodo `massTag()` in MailingListController** — assente rispetto agli altri 4 controller
+3. **Nessun pulsante per-riga tag** nella index view (mancava `