fix 1.2.7
This commit is contained in:
@@ -122,5 +122,31 @@ php artisan config:clear
|
|||||||
2. `resources/views/impostazioni/index.blade.php:586` — Stesso hidden fallback
|
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
|
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
|
## Prossimi Passi
|
||||||
- *(nessuno — in attesa di nuove richieste)*
|
- *(nessuno — in attesa di nuove richieste)*
|
||||||
|
|||||||
@@ -126,6 +126,52 @@ class CalendarioConnessioneController extends Controller
|
|||||||
return redirect('/impostazioni#calendario')->with('error', 'Errore sync: ' . $errorMsg);
|
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
|
public function reorder(Request $request): JsonResponse
|
||||||
{
|
{
|
||||||
$this->authorizeWrite('settings');
|
$this->authorizeWrite('settings');
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
<a href="{{ route('eventi.create') }}" class="btn btn-success btn-sm">
|
<a href="{{ route('eventi.create') }}" class="btn btn-success btn-sm">
|
||||||
<i class="fas fa-plus mr-1"></i> Nuovo Evento
|
<i class="fas fa-plus mr-1"></i> Nuovo Evento
|
||||||
</a>
|
</a>
|
||||||
|
<button type="button" class="btn btn-info btn-sm" id="syncCalendarsBtn" onclick="syncCalendars()">
|
||||||
|
<i class="fas fa-sync mr-1"></i> Sync
|
||||||
|
</button>
|
||||||
<form action="{{ route('eventi.export-selected-ics') }}" method="POST" class="d-inline">
|
<form action="{{ route('eventi.export-selected-ics') }}" method="POST" class="d-inline">
|
||||||
@csrf
|
@csrf
|
||||||
<button type="submit" class="btn btn-success btn-sm">
|
<button type="submit" class="btn btn-success btn-sm">
|
||||||
@@ -40,10 +43,44 @@
|
|||||||
@section('scripts')
|
@section('scripts')
|
||||||
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.10/index.global.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.10/index.global.min.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
function syncCalendars() {
|
||||||
|
var btn = document.getElementById('syncCalendarsBtn');
|
||||||
|
btn.disabled = true;
|
||||||
|
btn.innerHTML = '<i class="fas fa-spinner fa-spin mr-1"></i> Sync...';
|
||||||
|
|
||||||
|
fetch('{{ route('calendario-connessioni.sync-all') }}', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.content || '',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then(function(r) { return r.json(); })
|
||||||
|
.then(function(data) {
|
||||||
|
var msg = data.connections + ' connessioni sincronizzate.';
|
||||||
|
msg += ' Importati: ' + data.total_imported + ', Esportati: ' + data.total_exported + '.';
|
||||||
|
if (data.success) {
|
||||||
|
alert('✅ Sync completato!\n' + msg);
|
||||||
|
} else {
|
||||||
|
alert('⚠️ Sync completato con errori.\n' + msg);
|
||||||
|
}
|
||||||
|
if (window.calendar) {
|
||||||
|
window.calendar.refetchEvents();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function(err) {
|
||||||
|
alert('❌ Errore sync: ' + err.message);
|
||||||
|
})
|
||||||
|
.finally(function() {
|
||||||
|
btn.disabled = false;
|
||||||
|
btn.innerHTML = '<i class="fas fa-sync mr-1"></i> Sync';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
var calendarEl = document.getElementById('calendar');
|
var calendarEl = document.getElementById('calendar');
|
||||||
|
|
||||||
var calendar = new FullCalendar.Calendar(calendarEl, {
|
window.calendar = new FullCalendar.Calendar(calendarEl, {
|
||||||
initialView: 'dayGridMonth',
|
initialView: 'dayGridMonth',
|
||||||
locale: 'it',
|
locale: 'it',
|
||||||
headerToolbar: {
|
headerToolbar: {
|
||||||
@@ -97,7 +134,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
calendar.render();
|
window.calendar.render();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endsection
|
@endsection
|
||||||
@@ -27,6 +27,11 @@
|
|||||||
<i class="fab fa-google-drive mr-2"></i> Google Drive
|
<i class="fab fa-google-drive mr-2"></i> Google Drive
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="#help-calendario" data-toggle="tab">
|
||||||
|
<i class="fas fa-calendar-alt mr-2"></i> Calendario
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#help-tipologie" data-toggle="tab">
|
<a class="nav-link" href="#help-tipologie" data-toggle="tab">
|
||||||
<i class="fas fa-tags mr-2"></i> Tipologie e Dati
|
<i class="fas fa-tags mr-2"></i> Tipologie e Dati
|
||||||
@@ -194,6 +199,75 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{{-- Calendario --}}
|
||||||
|
<div class="tab-pane" id="help-calendario">
|
||||||
|
<div class="card card-outline card-info">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title"><i class="fas fa-calendar-alt mr-2"></i> Google Calendar</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<h5>Cos'è</h5>
|
||||||
|
<p>Integrazione con Google Calendar per sincronizzare gli eventi tra l'app e il tuo calendario Google. Supporta import, export e sincronizzazione bidirezionale.</p>
|
||||||
|
|
||||||
|
<h5>Requisiti</h5>
|
||||||
|
<ol>
|
||||||
|
<li>Un account Google / Google Workspace</li>
|
||||||
|
<li>Un progetto sulla <strong>Google Cloud Console</strong> con l'API Google Calendar abilitata</li>
|
||||||
|
<li>Credenziali OAuth 2.0 (Client ID e Client Secret)</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h5>Passo 1: Creare il progetto Google Cloud</h5>
|
||||||
|
<ol>
|
||||||
|
<li>Vai su <a href="https://console.developers.google.com/" target="_blank">Google Cloud Console</a></li>
|
||||||
|
<li>Crea un nuovo progetto o selezionane uno esistente</li>
|
||||||
|
<li>Vai a <strong>API e servizi → Libreria</strong></li>
|
||||||
|
<li>Cerca "<strong>Google Calendar API</strong>" e <strong>abilitala</strong></li>
|
||||||
|
<li>Vai a <strong>API e servizi → Credenziali</strong></li>
|
||||||
|
<li>Clicca "<strong>Crea credenziali → ID client OAuth</strong>"</li>
|
||||||
|
<li>Tipo applicazione: "<strong>Applicazione Web</strong>"</li>
|
||||||
|
<li><strong>URI di reindirizzamento autorizzato:</strong> aggiungi <code>https://developers.google.com/oauthplayground</code></li>
|
||||||
|
<li>Completa la creazione e <strong>copia Client ID e Client Secret</strong></li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h5>Passo 2: Ottenere il Refresh Token (Google OAuth Playground)</h5>
|
||||||
|
<p>A differenza di Google Drive, per Google Calendar il refresh token va ottenuto manualmente tramite il Google OAuth Playground:</p>
|
||||||
|
<ol>
|
||||||
|
<li>Vai su <a href="https://developers.google.com/oauthplayground" target="_blank">Google OAuth Playground</a></li>
|
||||||
|
<li>Clicca l'ingranaggio ⚙️ in alto a destra</li>
|
||||||
|
<li>Spunta "<strong>Use your own OAuth credentials</strong>"</li>
|
||||||
|
<li>Incolla <strong>Client ID</strong> e <strong>Client Secret</strong> creati al Passo 1</li>
|
||||||
|
<li>Nella colonna sinistra, espandi "<strong>Google Calendar API v3</strong>" e seleziona lo scope <code>https://www.googleapis.com/auth/calendar</code></li>
|
||||||
|
<li>Clicca "<strong>Authorize APIs</strong>" e autorizza con l'account Google</li>
|
||||||
|
<li>Clicca "<strong>Exchange authorization code for tokens</strong>"</li>
|
||||||
|
<li><strong>Copia il Refresh Token</strong> generato</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h5>Passo 3: Configurazione nell'app</h5>
|
||||||
|
<ol>
|
||||||
|
<li>Vai in <strong>Impostazioni → Calendario</strong></li>
|
||||||
|
<li>Clicca "<strong>Nuova Connessione</strong>"</li>
|
||||||
|
<li>Inserisci un nome descrittivo (es. "Calendario Lavoro")</li>
|
||||||
|
<li>Seleziona tipo <strong>Google Calendar</strong></li>
|
||||||
|
<li>Incolla <strong>Client ID</strong>, <strong>Client Secret</strong> e il <strong>Refresh Token</strong> ottenuto</li>
|
||||||
|
<li><strong>Calendar ID (opzionale):</strong> lascia <code>primary</code> per il calendario principale, oppure inserisci l'ID di un calendario specifico (lo trovi in Google Calendar → Impostazioni calendario → ID calendario)</li>
|
||||||
|
<li>Seleziona la <strong>direzione di sincronizzazione</strong> (import, export o bidirezionale)</li>
|
||||||
|
<li>Clicca "<strong>Salva</strong>"</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h5>Test connessione</h5>
|
||||||
|
<p>Dopo aver salvato, usa il pulsante <span class="badge badge-success"><i class="fas fa-plug"></i> Test</span> nella tabella delle connessioni per verificare che l'autorizzazione funzioni correttamente.</p>
|
||||||
|
|
||||||
|
<h5>Sincronizzazione</h5>
|
||||||
|
<p>Dopo aver configurato la connessione, puoi sincronizzare gli eventi manualmente cliccando <span class="badge badge-primary"><i class="fas fa-sync"></i> Sync</span>. La sincronizzazione automatica viene eseguita in base all'intervallo impostato (richiede il cron di Laravel configurato).</p>
|
||||||
|
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<i class="fas fa-info-circle mr-2"></i>
|
||||||
|
Il Refresh Token è <strong>permanente</strong> finché non viene revocato dall'utente. Se la connessione smette di funzionare, potrebbe essere necessario rigenerarlo ripetendo il Passo 2.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{{-- Tipologie e Dati --}}
|
{{-- Tipologie e Dati --}}
|
||||||
<div class="tab-pane" id="help-tipologie">
|
<div class="tab-pane" id="help-tipologie">
|
||||||
<div class="card card-outline card-success">
|
<div class="card card-outline card-success">
|
||||||
|
|||||||
@@ -62,6 +62,7 @@
|
|||||||
<ol>
|
<ol>
|
||||||
<li><a href="#webdav">WebDAV / Nextcloud</a></li>
|
<li><a href="#webdav">WebDAV / Nextcloud</a></li>
|
||||||
<li><a href="#googledrive">Google Drive</a></li>
|
<li><a href="#googledrive">Google Drive</a></li>
|
||||||
|
<li><a href="#calendario">Google Calendar</a></li>
|
||||||
<li><a href="#tipologie">Tipologie e Gestione Dati</a></li>
|
<li><a href="#tipologie">Tipologie e Gestione Dati</a></li>
|
||||||
<li><a href="#email">Email / SMTP</a></li>
|
<li><a href="#email">Email / SMTP</a></li>
|
||||||
<li><a href="#installazione">Guida all'Installazione</a></li>
|
<li><a href="#installazione">Guida all'Installazione</a></li>
|
||||||
@@ -182,8 +183,72 @@
|
|||||||
|
|
||||||
<div class="page-break"></div>
|
<div class="page-break"></div>
|
||||||
|
|
||||||
{{-- 3. Tipologie e Dati --}}
|
{{-- 3. Google Calendar --}}
|
||||||
<h2 id="tipologie">3. Tipologie e Gestione Dati</h2>
|
<h2 id="calendario">3. Google Calendar</h2>
|
||||||
|
|
||||||
|
<h3>Cos'è</h3>
|
||||||
|
<p>Integrazione con Google Calendar per sincronizzare gli eventi tra l'app e il tuo calendario Google. Supporta import, export e sincronizzazione bidirezionale.</p>
|
||||||
|
|
||||||
|
<h3>Requisiti</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Un account Google / Google Workspace</li>
|
||||||
|
<li>Un progetto sulla <strong>Google Cloud Console</strong> con l'API Google Calendar abilitata</li>
|
||||||
|
<li>Credenziali OAuth 2.0 (Client ID e Client Secret)</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h3>Passo 1: Creare il progetto Google Cloud</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Vai su <strong>Google Cloud Console</strong> (console.developers.google.com)</li>
|
||||||
|
<li>Crea un nuovo progetto o selezionane uno esistente</li>
|
||||||
|
<li>Vai a <strong>API e servizi → Libreria</strong></li>
|
||||||
|
<li>Cerca "<strong>Google Calendar API</strong>" e <strong>abilitala</strong></li>
|
||||||
|
<li>Vai a <strong>API e servizi → Credenziali</strong></li>
|
||||||
|
<li>Clicca "<strong>Crea credenziali → ID client OAuth</strong>"</li>
|
||||||
|
<li>Tipo applicazione: "<strong>Applicazione Web</strong>"</li>
|
||||||
|
<li><strong>URI di reindirizzamento autorizzato:</strong> aggiungi <code>https://developers.google.com/oauthplayground</code></li>
|
||||||
|
<li>Completa la creazione e <strong>copia Client ID e Client Secret</strong></li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h3>Passo 2: Ottenere il Refresh Token</h3>
|
||||||
|
<p>A differenza di Google Drive, per Google Calendar il refresh token va ottenuto manualmente tramite il Google OAuth Playground:</p>
|
||||||
|
<ol>
|
||||||
|
<li>Vai su <strong>Google OAuth Playground</strong> (developers.google.com/oauthplayground)</li>
|
||||||
|
<li>Clicca l'ingranaggio ⚙️ in alto a destra</li>
|
||||||
|
<li>Spunta "<strong>Use your own OAuth credentials</strong>"</li>
|
||||||
|
<li>Incolla <strong>Client ID</strong> e <strong>Client Secret</strong> creati al Passo 1</li>
|
||||||
|
<li>Nella colonna sinistra, espandi "<strong>Google Calendar API v3</strong>" e seleziona lo scope <code>https://www.googleapis.com/auth/calendar</code></li>
|
||||||
|
<li>Clicca "<strong>Authorize APIs</strong>" e autorizza con l'account Google</li>
|
||||||
|
<li>Clicca "<strong>Exchange authorization code for tokens</strong>"</li>
|
||||||
|
<li><strong>Copia il Refresh Token</strong> generato</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h3>Passo 3: Configurazione nell'app</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Vai in <strong>Impostazioni → Calendario</strong></li>
|
||||||
|
<li>Clicca "<strong>Nuova Connessione</strong>"</li>
|
||||||
|
<li>Inserisci un nome descrittivo (es. "Calendario Lavoro")</li>
|
||||||
|
<li>Seleziona tipo <strong>Google Calendar</strong></li>
|
||||||
|
<li>Incolla <strong>Client ID</strong>, <strong>Client Secret</strong> e il <strong>Refresh Token</strong> ottenuto</li>
|
||||||
|
<li><strong>Calendar ID (opzionale):</strong> lascia <code>primary</code> per il calendario principale, oppure inserisci l'ID di un calendario specifico</li>
|
||||||
|
<li>Seleziona la <strong>direzione di sincronizzazione</strong> (import, export o bidirezionale)</li>
|
||||||
|
<li>Clicca "<strong>Salva</strong>"</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h3>Test connessione</h3>
|
||||||
|
<p>Dopo aver salvato, usa il pulsante <strong>Test</strong> nella tabella delle connessioni per verificare che l'autorizzazione funzioni correttamente.</p>
|
||||||
|
|
||||||
|
<h3>Sincronizzazione</h3>
|
||||||
|
<p>Dopo aver configurato la connessione, puoi sincronizzare gli eventi manualmente cliccando <strong>Sync</strong>. La sincronizzazione automatica viene eseguita in base all'intervallo impostato (richiede il cron di Laravel configurato).</p>
|
||||||
|
|
||||||
|
<div class="callout callout-info">
|
||||||
|
<h4>Refresh Token permanente</h4>
|
||||||
|
<p>Il Refresh Token è permanente finché non viene revocato dall'utente. Se la connessione smette di funzionare, potrebbe essere necessario rigenerarlo ripetendo il Passo 2.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="page-break"></div>
|
||||||
|
|
||||||
|
{{-- 4. Tipologie e Dati --}}
|
||||||
|
<h2 id="tipologie">4. Tipologie e Gestione Dati</h2>
|
||||||
|
|
||||||
<h3>Tipologie Documenti</h3>
|
<h3>Tipologie Documenti</h3>
|
||||||
<p>Le tipologie classificano i documenti (avatar, galleria, documento, statuto, altro).</p>
|
<p>Le tipologie classificano i documenti (avatar, galleria, documento, statuto, altro).</p>
|
||||||
@@ -210,8 +275,8 @@
|
|||||||
|
|
||||||
<div class="page-break"></div>
|
<div class="page-break"></div>
|
||||||
|
|
||||||
{{-- 4. Email / SMTP --}}
|
{{-- 5. Email / SMTP --}}
|
||||||
<h2 id="email">4. Email / SMTP</h2>
|
<h2 id="email">5. Email / SMTP</h2>
|
||||||
|
|
||||||
<h3>Configurazione Email</h3>
|
<h3>Configurazione Email</h3>
|
||||||
<p>Vai in <strong>Impostazioni → Email</strong> per configurare la posta elettronica.</p>
|
<p>Vai in <strong>Impostazioni → Email</strong> per configurare la posta elettronica.</p>
|
||||||
@@ -264,8 +329,8 @@
|
|||||||
|
|
||||||
<div class="page-break"></div>
|
<div class="page-break"></div>
|
||||||
|
|
||||||
{{-- 5. Installazione --}}
|
{{-- 6. Installazione --}}
|
||||||
<h2 id="installazione">5. Guida all'Installazione</h2>
|
<h2 id="installazione">6. Guida all'Installazione</h2>
|
||||||
|
|
||||||
<h3>Panoramica</h3>
|
<h3>Panoramica</h3>
|
||||||
<p>L'installazione avviene tramite l'interattivo <code>install.php</code> che guida passo-passo. Supporta due modalità:</p>
|
<p>L'installazione avviene tramite l'interattivo <code>install.php</code> che guida passo-passo. Supporta due modalità:</p>
|
||||||
@@ -411,8 +476,8 @@ sudo systemctl reload apache2</pre>
|
|||||||
|
|
||||||
<div class="page-break"></div>
|
<div class="page-break"></div>
|
||||||
|
|
||||||
{{-- 6. Backup e Migrazione --}}
|
{{-- 7. Backup e Migrazione --}}
|
||||||
<h2 id="backup">6. Backup e Migrazione Server</h2>
|
<h2 id="backup">7. Backup e Migrazione Server</h2>
|
||||||
|
|
||||||
<h3>Cos'è</h3>
|
<h3>Cos'è</h3>
|
||||||
<p>Il sistema di backup crea un archivio ZIP contenente tutto il necessario per ripristinare l'applicazione su un nuovo server. Include database, file caricati e configurazione.</p>
|
<p>Il sistema di backup crea un archivio ZIP contenente tutto il necessario per ripristinare l'applicazione su un nuovo server. Include database, file caricati e configurazione.</p>
|
||||||
@@ -591,8 +656,8 @@ sudo certbot --apache -d glastree.esempio.it</pre>
|
|||||||
|
|
||||||
<div class="page-break"></div>
|
<div class="page-break"></div>
|
||||||
|
|
||||||
{{-- 7. Docker --}}
|
{{-- 8. Docker --}}
|
||||||
<h2 id="docker">7. Docker</h2>
|
<h2 id="docker">8. Docker</h2>
|
||||||
|
|
||||||
<h3>Creare un'immagine Docker con dati di base</h3>
|
<h3>Creare un'immagine Docker con dati di base</h3>
|
||||||
<p>Puoi creare un'immagine Docker pronta all'uso che include l'applicazione e i dati di base (tipologie documenti, tipologie eventi, ruoli). Scegli la configurazione in base alle tue esigenze:</p>
|
<p>Puoi creare un'immagine Docker pronta all'uso che include l'applicazione e i dati di base (tipologie documenti, tipologie eventi, ruoli). Scegli la configurazione in base alle tue esigenze:</p>
|
||||||
|
|||||||
@@ -203,6 +203,7 @@ Route::put('/calendario-connessioni/{id}', [App\Http\Controllers\CalendarioConne
|
|||||||
Route::delete('/calendario-connessioni/{id}', [App\Http\Controllers\CalendarioConnessioneController::class, 'destroy'])->middleware('auth')->name('calendario-connessioni.destroy');
|
Route::delete('/calendario-connessioni/{id}', [App\Http\Controllers\CalendarioConnessioneController::class, 'destroy'])->middleware('auth')->name('calendario-connessioni.destroy');
|
||||||
Route::post('/calendario-connessioni/{id}/test', [App\Http\Controllers\CalendarioConnessioneController::class, 'test'])->middleware('auth')->name('calendario-connessioni.test');
|
Route::post('/calendario-connessioni/{id}/test', [App\Http\Controllers\CalendarioConnessioneController::class, 'test'])->middleware('auth')->name('calendario-connessioni.test');
|
||||||
Route::post('/calendario-connessioni/{id}/sync', [App\Http\Controllers\CalendarioConnessioneController::class, 'sync'])->middleware('auth')->name('calendario-connessioni.sync');
|
Route::post('/calendario-connessioni/{id}/sync', [App\Http\Controllers\CalendarioConnessioneController::class, 'sync'])->middleware('auth')->name('calendario-connessioni.sync');
|
||||||
|
Route::post('/calendario-connessioni/sync-all', [App\Http\Controllers\CalendarioConnessioneController::class, 'syncAll'])->middleware('auth')->name('calendario-connessioni.sync-all');
|
||||||
Route::post('/calendario-connessioni/reorder', [App\Http\Controllers\CalendarioConnessioneController::class, 'reorder'])->middleware('auth')->name('calendario-connessioni.reorder');
|
Route::post('/calendario-connessioni/reorder', [App\Http\Controllers\CalendarioConnessioneController::class, 'reorder'])->middleware('auth')->name('calendario-connessioni.reorder');
|
||||||
|
|
||||||
// Storage Repositories (Opzione B)
|
// Storage Repositories (Opzione B)
|
||||||
|
|||||||
Vendored
+2
-2
@@ -3,7 +3,7 @@
|
|||||||
'name' => 'laravel/laravel',
|
'name' => 'laravel/laravel',
|
||||||
'pretty_version' => 'dev-main',
|
'pretty_version' => 'dev-main',
|
||||||
'version' => 'dev-main',
|
'version' => 'dev-main',
|
||||||
'reference' => 'cbe3470c8c6202f5f7091777692490fb074b0af9',
|
'reference' => '90093a086b35dce8edd97fce09d32d2be42853e8',
|
||||||
'type' => 'project',
|
'type' => 'project',
|
||||||
'install_path' => __DIR__ . '/../../',
|
'install_path' => __DIR__ . '/../../',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
@@ -427,7 +427,7 @@
|
|||||||
'laravel/laravel' => array(
|
'laravel/laravel' => array(
|
||||||
'pretty_version' => 'dev-main',
|
'pretty_version' => 'dev-main',
|
||||||
'version' => 'dev-main',
|
'version' => 'dev-main',
|
||||||
'reference' => 'cbe3470c8c6202f5f7091777692490fb074b0af9',
|
'reference' => '90093a086b35dce8edd97fce09d32d2be42853e8',
|
||||||
'type' => 'project',
|
'type' => 'project',
|
||||||
'install_path' => __DIR__ . '/../../',
|
'install_path' => __DIR__ . '/../../',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|||||||
Reference in New Issue
Block a user