{{-- Zone 1 e 2 della pagina: creazione del pacchetto e ripristino. Avanzamento e log non stanno piu' qui: vanno alla console unica agganciata in fondo alla finestra (partials/console-operazioni.blade.php). In questa sezione restano i comandi e l'esito, cioe' le uniche cose che riguardano *questa* zona; prima invece la pagina aveva un pannello di avanzamento in cima, una console a meta' e un "Dettaglio" richiudibile, e la stessa operazione si raccontava in tre posti diversi. Il JavaScript del caricamento sta ancora dentro l'attributo x-data, quindi valgono le regole di sempre: dentro quel blocco NON possono comparire virgolette doppie, da nessuna parte, neanche nei commenti — un attributo HTML finisce alla prima, e questa pagina si e' gia' rotta cosi' due volte. Gli apostrofi italiani stanno nei backtick, dove non richiedono accorgimenti: la sequenza \' scritta a mano nel sorgente Blade chiude la stringa invece di proteggere l'apostrofo. --}} @php $op = $operazione; $stato = $op['status'] ?? null; $tipo = $op['tipo'] ?? null; // "Il posto e' occupato da qualcun altro": i pulsanti si spengono, ma il // messaggio deve dire quale operazione sta lavorando, non un generico // divieto. $occupato = $this->inCorso; @endphp
inCorso) wire:poll.{{ $this->intervalloPoll }}="aggiorna" @endif> @if($erroreOperazione !== '') @endif {{-- ═══ Zona 1 — Backup ═══════════════════════════════════════════ --}}

1 · Backup completo (.zip)

Un unico pacchetto con tutti i dati dell’applicazione — utenti compresi — e tutti i file caricati: PDF dei territori, miniature e logo. È l’archivio da conservare per rimettere in piedi l’installazione da zero.

Dati sensibili. Il pacchetto include gli utenti con le password (hash), i nomi dei proclamatori in chiaro e le mappe dei territori. Conservalo in un luogo sicuro e non condividerlo.
le direttive Blade non vengono compilate, il tag resta letterale e il PHP prodotto va in errore di sintassi. --}} :disabled="$occupato"> Crea e scarica backup {{-- L'archivio resta scaricabile finche' l'operazione e' in vista: un download interrotto non deve costringere a rifare tutto. --}} @if($this->archivioPronto && $tipo === 'backup') Scarica di nuovo {{ $op['result']['nome_download'] ?? '' }} — {{ number_format(($op['result']['dimensione'] ?? 0) / 1048576, 1, ',', '.') }} MB @endif @if($occupato) Un’operazione è già in corso: l’avanzamento è nella console in fondo. @else L’archivio si genera in background e compare nella console in fondo. @endif
@if($stato === 'failed' && $tipo === 'backup') @endif @if($stato === 'completed' && $tipo === 'backup' && ($op['result']['messaggio'] ?? null))

{{ $op['result']['messaggio'] }}

@endif
{{-- ═══ Zona 2 — Ripristino ═══════════════════════════════════════ --}}

2 · Ripristina da backup

Carica un pacchetto .zip generato qui sopra. Il ripristino sostituisce i dati gestionali correnti e tutti i file caricati.

Al termine tutti dovranno cambiare password, amministratore compreso: il pacchetto contiene le password di ogni account, quindi dopo un ripristino le vecchie non sono più da considerarsi segrete. Verrai portato subito sulla schermata di cambio password.
@csrf
{{-- La dimensione si controlla gia' alla selezione: sapere subito che il file e' fuori limite evita di aspettare un caricamento destinato a essere tagliato. --}}

Dimensione massima accettata: {{ \App\Http\Controllers\Settings\BackupController::maxUploadMb() }} MB (variabile MAX_UPLOAD_MB).

{{-- Caricamento: percentuale reale dell'upload, non del ripristino. Resta qui e non nella console perche' e' l'unica fase che avviene nel browser: la console racconta, questa barra misura. --}}
Ripristina backup @if($occupato) Un’altra operazione è in corso: attendi che finisca. @endif
@if($stato === 'failed' && $tipo === 'restore') @endif @if($stato === 'completed' && $tipo === 'restore' && ($op['result']['messaggio'] ?? null))

{{ $op['result']['messaggio'] }}

@endif