diff --git a/MEMORY.md b/MEMORY.md index 3c32d664..c9340030 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -122,5 +122,31 @@ php artisan config:clear 2. `resources/views/impostazioni/index.blade.php:586` — Stesso hidden fallback 3. `EmailSetting::getActive()` ora riceve sempre `is_active` dal form (0 o 1) grazie all'hidden fallback +## 2026-06-08 — Help page: aggiunto tab "Calendario" con documentazione OAuth + +- **`resources/views/help/index.blade.php`**: Aggiunto tab "Calendario" nel menu laterale (dopo Google Drive) e relativo tab-pane content con: + - Requisiti (account Google, API Calendar, OAuth credentials) + - Passo 1: Google Cloud Console — abilitare Google Calendar API, creare OAuth Client ID (Web Application), redirect URI `https://developers.google.com/oauthplayground` + - Passo 2: Ottenere Refresh Token via Google OAuth Playground (Use your own OAuth credentials, scope `calendar`) + - Passo 3: Configurazione nell'app (Impostazioni → Calendario, nuova connessione Google Calendar, inserire Client ID/Secret/Refresh Token) + - Test connessione e sincronizzazione + - Nota: refresh token permanente finché non revocato +- **`resources/views/help/pdf.blade.php`**: Aggiunta sezione "3. Google Calendar" nel TOC e contenuto, rinumerazione da 4 a 8 per sezioni successive + +### Differenza chiave Google Calendar vs Google Drive +- **Drive**: endpoint server `/auth/google-drive/callback` che gestisce automaticamente il callback OAuth e salva refresh token in `storage_repositories` +- **Calendar**: **NON** ha endpoint server dedicato. Refresh token ottenuto manualmente via Google OAuth Playground e incollato nel campo "Refresh Token" del form + +## 2026-06-08 — Pulsante Sync nella pagina calendario eventi + +- **`app/Http/Controllers/CalendarioConnessioneController.php`**: Aggiunto metodo `syncAll()` che itera tutte le connessioni attive (`is_active = true`), esegue `syncEvents()` per ognuna, e restituisce JSON con risultati aggregati. +- **`routes/web.php`**: Aggiunta route `POST /calendario-connessioni/sync-all` → `syncAll` (name: `calendario-connessioni.sync-all`). +- **`resources/views/eventi/calendar.blade.php`**: Aggiunto pulsante "Sync" nel card-tools che: + - Invia POST AJAX a `sync-all` + - Mostra spinner durante l'operazione + - Al completamento mostra alert con riepilogo (connessioni, importati, esportati) + - Richiama `window.calendar.refetchEvents()` per aggiornare la vista FullCalendar +- Esposto `window.calendar` globalmente per accesso dall'handler sync + ## Prossimi Passi - *(nessuno — in attesa di nuove richieste)* diff --git a/app/Http/Controllers/CalendarioConnessioneController.php b/app/Http/Controllers/CalendarioConnessioneController.php index c76479e4..e7fb390f 100644 --- a/app/Http/Controllers/CalendarioConnessioneController.php +++ b/app/Http/Controllers/CalendarioConnessioneController.php @@ -126,6 +126,52 @@ class CalendarioConnessioneController extends Controller return redirect('/impostazioni#calendario')->with('error', 'Errore sync: ' . $errorMsg); } + public function syncAll(): JsonResponse + { + $this->authorizeWrite('settings'); + + $connections = CalendarioConnessione::where('is_active', true)->get(); + $results = []; + + foreach ($connections as $connessione) { + $result = match ($connessione->tipo) { + 'caldav' => app(CalDavService::class)->syncEvents($connessione), + 'google_calendar' => app(GoogleCalendarSyncService::class)->syncEvents($connessione), + default => ['success' => false, 'imported' => 0, 'exported' => 0, 'errors' => ['Tipo sconosciuto']], + }; + + $connessione->update(['last_sync_at' => now()]); + + if ($result['success']) { + $connessione->update(['stato' => 'connesso']); + } else { + $errorMsg = implode('; ', $result['errors']); + $connessione->update(['stato' => 'errore', 'last_error_at' => now(), 'last_error_message' => $errorMsg]); + } + + $results[] = [ + 'id' => $connessione->id, + 'nome' => $connessione->nome, + 'success' => $result['success'], + 'imported' => $result['imported'], + 'exported' => $result['exported'], + 'errors' => $result['errors'], + ]; + } + + $totalImported = array_sum(array_column($results, 'imported')); + $totalExported = array_sum(array_column($results, 'exported')); + $hasErrors = in_array(false, array_column($results, 'success'), true); + + return response()->json([ + 'success' => !$hasErrors, + 'results' => $results, + 'total_imported' => $totalImported, + 'total_exported' => $totalExported, + 'connections' => count($results), + ]); + } + public function reorder(Request $request): JsonResponse { $this->authorizeWrite('settings'); diff --git a/resources/views/eventi/calendar.blade.php b/resources/views/eventi/calendar.blade.php index b37ccbf6..d3d3ab64 100644 --- a/resources/views/eventi/calendar.blade.php +++ b/resources/views/eventi/calendar.blade.php @@ -17,6 +17,9 @@ Nuovo Evento +