++ add reset program

This commit is contained in:
2026-07-29 14:26:36 +02:00
parent c6abef977d
commit 588910b893
14 changed files with 1524 additions and 183 deletions

View File

@@ -4,62 +4,12 @@
<p class="text-sm text-gray-500 mt-1">Backup completo dell&rsquo;applicazione, import PDF territori, conversione legacy SQL, import ed export XML.</p>
</div>
{{-- Backup completo: e' la sezione che serve nel 99% dei casi, quindi sta
in cima. Le sezioni XML piu' sotto restano per gli usi parziali e per
la conversione dei dump legacy. --}}
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 space-y-5">
<div>
<h2 class="text-lg font-semibold text-gray-900">Backup completo (.zip)</h2>
<p class="text-xs text-gray-500 mt-1">
Un unico pacchetto con <strong>tutti</strong> i dati dell&rsquo;applicazione &mdash; utenti compresi &mdash;
e <strong>tutti i file caricati</strong>: PDF dei territori, miniature e logo.
E&rsquo; l&rsquo;archivio da conservare per rimettere in piedi l&rsquo;installazione da zero.
</p>
</div>
<div class="rounded-lg border border-amber-300 bg-amber-50 p-3 text-xs text-amber-800">
<strong>Dati sensibili.</strong> 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.
</div>
<div class="flex flex-col gap-3 sm:flex-row sm:items-center">
<a href="{{ route('backup.download') }}"
style="display:inline-flex;align-items:center;gap:6px;justify-content:center;min-height:40px;background:#059669;color:#fff;border:1px solid #065f46;border-radius:10px;padding:10px 14px;font-size:14px;font-weight:500;text-decoration:none;">
<svg style="width:16px;height:16px;" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 10v6m0 0l-3-3m3 3l3-3M3 17v3a1 1 0 001 1h16a1 1 0 001-1v-3"/></svg>
Scarica backup completo
</a>
<p class="text-xs text-gray-500">La preparazione dell&rsquo;archivio puo&rsquo; richiedere qualche minuto se ci sono molti PDF.</p>
</div>
<div class="border-t border-gray-200 pt-5">
<h3 class="text-sm font-semibold text-gray-900">Ripristina da backup</h3>
<p class="mt-1 text-xs text-gray-500">
Carica un pacchetto .zip generato qui sopra. Il ripristino <strong>sostituisce</strong> i dati
gestionali correnti e tutti i file caricati.
</p>
<div class="mt-3 rounded-lg border border-red-300 bg-red-50 p-3 text-xs text-red-800">
<strong>Al termine tutti dovranno cambiare password</strong>, amministratore compreso: il pacchetto
contiene le password di ogni account, quindi dopo un ripristino le vecchie non sono piu&rsquo; da
considerarsi segrete. Verrai portato subito sulla schermata di cambio password.
</div>
<form action="{{ route('backup.restore') }}" method="POST" enctype="multipart/form-data" class="mt-4 space-y-4"
onsubmit="return confirm('Confermi il ripristino? I dati gestionali e i file correnti verranno sostituiti, e tutti gli utenti dovranno impostare una nuova password.');">
@csrf
<div>
<input name="backupZip" type="file" accept=".zip,application/zip"
class="block w-full text-sm text-gray-600 file:mr-3 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-medium file:bg-red-50 file:text-red-700 hover:file:bg-red-100">
@error('backupZip') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
</div>
<button type="submit"
style="display:inline-flex;align-items:center;justify-content:center;min-height:40px;background:#dc2626;color:#fff;border:1px solid #991b1b;border-radius:10px;padding:10px 14px;font-size:14px;font-weight:500;">
Ripristina backup
</button>
</form>
</div>
</div>
{{-- Backup, ripristino e zona pericolosa: componente a sé perché ha uno
stato proprio (l'operazione in corso) e un poll che non deve far
ri-renderizzare tutto il resto della pagina. Sta in cima perché è la
sezione che serve nel 99% dei casi; le sezioni XML più sotto restano
per gli usi parziali e per la conversione dei dump legacy. --}}
<livewire:settings.backup-manager />
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 space-y-4"
x-data="{