Editor piantine: bozza automatica e pubblicazione con anteprima
- Il disegno è bozza e si salva da solo; i dati del territorio si modificano dall'editor e valgono subito nel gestionale. - Un solo "Pubblica" (immagine + PDF), uguale in editor e gestione: anteprima preparata in coda su disco privato, conferma obbligatoria, rifiutata se nel frattempo è cambiato qualcosa di stampato. - Stati Bozza / Pubblicata / Modifiche da pubblicare, calcolati sull'impronta di confine e dati stampati e sul PDF in uso. - Gestione riscritta: stato, ricerca, filtri, storico paginato. - Editor ridisegnato a tre zone, utilizzabile anche su tablet e telefono. - Avvisi via evento (trait Avvisa + <x-avvisi>). - .gitattributes: script shell sempre LF, altrimenti il container locale su Windows non parte. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
50
resources/views/components/avvisi.blade.php
Normal file
50
resources/views/components/avvisi.blade.php
Normal file
@@ -0,0 +1,50 @@
|
||||
{{--
|
||||
Avvisi galleggianti: raccolgono l'evento "avviso" che i componenti
|
||||
Livewire lanciano con il trait Avvisa, e che arriva anche dopo un'azione
|
||||
che ridisegna solo il componente.
|
||||
|
||||
sessione: true per mostrare anche i messaggi flash della richiesta (il
|
||||
telaio a schermo intero, che non ha una fascia messaggi sua). Il telaio
|
||||
normale li mostra già in testa alla pagina, quindi lì resta false.
|
||||
|
||||
Gli avvisi di conferma si chiudono da soli; quelli di errore restano
|
||||
finché non li si chiude, perché vanno letti.
|
||||
--}}
|
||||
@props(['sessione' => false])
|
||||
|
||||
@php
|
||||
$iniziali = [];
|
||||
if ($sessione && session()->has('success')) {
|
||||
$iniziali[] = ['tipo' => 'ok', 'testo' => session('success')];
|
||||
}
|
||||
if ($sessione && session()->has('error')) {
|
||||
$iniziali[] = ['tipo' => 'errore', 'testo' => session('error')];
|
||||
}
|
||||
@endphp
|
||||
|
||||
<div class="tm-avvisi" role="status" aria-live="polite"
|
||||
x-data="{
|
||||
avvisi: [],
|
||||
prossimo: 0,
|
||||
aggiungi(tipo, testo) {
|
||||
const id = ++this.prossimo;
|
||||
this.avvisi.push({ id, tipo, testo });
|
||||
if (tipo !== 'errore') setTimeout(() => this.togli(id), 4500);
|
||||
},
|
||||
togli(id) { this.avvisi = this.avvisi.filter(a => a.id !== id); },
|
||||
}"
|
||||
x-init="@js($iniziali).forEach(a => aggiungi(a.tipo, a.testo))"
|
||||
@avviso.window="aggiungi($event.detail.tipo, $event.detail.testo)">
|
||||
<template x-for="avviso in avvisi" :key="avviso.id">
|
||||
<div class="tm-avviso" :class="avviso.tipo === 'errore' ? 'tm-avviso-errore' : 'tm-avviso-ok'"
|
||||
x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-2"
|
||||
x-transition:leave="transition ease-in duration-200"
|
||||
x-transition:leave-end="opacity-0">
|
||||
<svg x-show="avviso.tipo !== 'errore'" viewBox="0 0 24 24" fill="none" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<svg x-show="avviso.tipo === 'errore'" viewBox="0 0 24 24" fill="none" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
|
||||
<span x-text="avviso.testo"></span>
|
||||
<button type="button" @click="togli(avviso.id)" class="tm-avviso-chiudi" aria-label="Chiudi il messaggio">×</button>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
@@ -212,6 +212,11 @@
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Gli avvisi delle azioni Livewire (trait Avvisa). I flash della
|
||||
richiesta restano nella fascia in testa al contenuto, qui sopra. --}}
|
||||
<x-avvisi />
|
||||
|
||||
@livewireScripts
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
Serve a una cosa sola: la mappa dell'editor delle piantine, che deve
|
||||
prendersi tutta la finestra. I messaggi non spingono il contenuto verso il
|
||||
basso come nelle altre pagine — comparirebbe una fascia che sposta la mappa
|
||||
mentre ci si sta disegnando sopra — ma galleggiano sopra, in alto al centro,
|
||||
e si tolgono da soli.
|
||||
mentre ci si sta disegnando sopra — ma galleggiano sopra, in alto al centro
|
||||
(<x-avvisi>, che raccoglie anche quelli lanciati dalle azioni Livewire).
|
||||
--}}
|
||||
<html lang="it" class="h-full tm-app">
|
||||
<head>
|
||||
@@ -22,33 +22,7 @@
|
||||
{{ $slot }}
|
||||
</main>
|
||||
|
||||
<div class="tm-avvisi" role="status" aria-live="polite">
|
||||
@if (session()->has('success'))
|
||||
<div x-data="{ mostra: true }" x-show="mostra" x-cloak
|
||||
x-init="setTimeout(() => mostra = false, 4500)"
|
||||
x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-2"
|
||||
x-transition:leave="transition ease-in duration-200"
|
||||
x-transition:leave-end="opacity-0"
|
||||
class="tm-avviso tm-avviso-ok">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<span>{{ session('success') }}</span>
|
||||
<button type="button" @click="mostra = false" class="tm-avviso-chiudi" aria-label="Chiudi il messaggio">×</button>
|
||||
</div>
|
||||
@endif
|
||||
@if (session()->has('error'))
|
||||
<div x-data="{ mostra: true }" x-show="mostra" x-cloak
|
||||
x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-2"
|
||||
x-transition:leave="transition ease-in duration-200"
|
||||
x-transition:leave-end="opacity-0"
|
||||
class="tm-avviso tm-avviso-errore">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
|
||||
<span>{{ session('error') }}</span>
|
||||
<button type="button" @click="mostra = false" class="tm-avviso-chiudi" aria-label="Chiudi il messaggio">×</button>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<x-avvisi :sessione="true" />
|
||||
|
||||
@livewireScripts
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user