- 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>
125 lines
3.3 KiB
PHP
125 lines
3.3 KiB
PHP
<?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');
|
|
}
|
|
}
|