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:
124
app/Livewire/Piantine/Pubblicazione.php
Normal file
124
app/Livewire/Piantine/Pubblicazione.php
Normal file
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Piantine;
|
||||
|
||||
use App\Livewire\Concerns\Avvisa;
|
||||
use App\Models\TerritorioMappa;
|
||||
use App\Services\Piantine\PubblicazionePiantina;
|
||||
use Livewire\Attributes\Locked;
|
||||
use Livewire\Attributes\On;
|
||||
use Livewire\Component;
|
||||
|
||||
/**
|
||||
* La finestra di pubblicazione, uguale nell'editor e nella gestione.
|
||||
*
|
||||
* Si apre con l'evento "pubblica-piantina", prepara l'anteprima in coda
|
||||
* (controllando a intervalli quando è pronta), la mostra, e solo su
|
||||
* "Conferma" sostituisce il PDF del territorio. Chiuderla butta l'anteprima.
|
||||
*/
|
||||
class Pubblicazione extends Component
|
||||
{
|
||||
use Avvisa;
|
||||
|
||||
#[Locked]
|
||||
public ?int $mappaId = null;
|
||||
|
||||
#[Locked]
|
||||
public ?string $token = null;
|
||||
|
||||
public string $fase = '';
|
||||
|
||||
public string $messaggio = '';
|
||||
|
||||
public string $etichetta = '';
|
||||
|
||||
#[On('pubblica-piantina')]
|
||||
public function apri(int $mappaId, PubblicazionePiantina $pubblicazione): void
|
||||
{
|
||||
$this->chiudi($pubblicazione);
|
||||
|
||||
$mappa = TerritorioMappa::with('territorio.zona')->find($mappaId);
|
||||
if (! $mappa) {
|
||||
$this->avvisaErrore('La piantina non esiste più.');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->mappaId = $mappa->id;
|
||||
$this->etichetta = $mappa->etichetta();
|
||||
|
||||
try {
|
||||
$this->token = $pubblicazione->avvia($mappa);
|
||||
} catch (\RuntimeException $e) {
|
||||
$this->fase = PubblicazionePiantina::ERRORE;
|
||||
$this->messaggio = $e->getMessage();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->aggiorna($pubblicazione);
|
||||
}
|
||||
|
||||
/** Chiamata a intervalli finché l'anteprima è in preparazione. */
|
||||
public function aggiorna(PubblicazionePiantina $pubblicazione): void
|
||||
{
|
||||
if (! $this->token) {
|
||||
return;
|
||||
}
|
||||
|
||||
$stato = $pubblicazione->stato($this->token);
|
||||
|
||||
if (! $stato) {
|
||||
$this->fase = PubblicazionePiantina::ERRORE;
|
||||
$this->messaggio = 'L\'anteprima è scaduta: generala di nuovo.';
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->fase = $stato['stato'];
|
||||
$this->messaggio = $stato['messaggio'] ?? '';
|
||||
}
|
||||
|
||||
public function conferma(PubblicazionePiantina $pubblicazione): void
|
||||
{
|
||||
if (! $this->token) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$mappa = $pubblicazione->conferma($this->token);
|
||||
} catch (\RuntimeException $e) {
|
||||
$this->fase = PubblicazionePiantina::ERRORE;
|
||||
$this->messaggio = $e->getMessage();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->reset(['mappaId', 'token', 'fase', 'messaggio', 'etichetta']);
|
||||
|
||||
$this->avvisa("{$mappa->etichetta()} pubblicata: il PDF del territorio è stato sostituito, il precedente è nello storico.");
|
||||
$this->dispatch('piantina-pubblicata', mappaId: $mappa->id);
|
||||
}
|
||||
|
||||
/** Riprova dopo un errore, con lo stato attuale della piantina. */
|
||||
public function riprova(PubblicazionePiantina $pubblicazione): void
|
||||
{
|
||||
if ($this->mappaId) {
|
||||
$this->apri($this->mappaId, $pubblicazione);
|
||||
}
|
||||
}
|
||||
|
||||
public function chiudi(PubblicazionePiantina $pubblicazione): void
|
||||
{
|
||||
if ($this->token) {
|
||||
$pubblicazione->annulla($this->token);
|
||||
}
|
||||
|
||||
$this->reset(['mappaId', 'token', 'fase', 'messaggio', 'etichetta']);
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.piantine.pubblicazione');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user