Assegna pesava 387 KB e Livewire li rimandava a ogni interazione. - Elenco dei territori assegnati in un componente lazy a sé (ElencoAssegnati): il form compare subito e non lo ridisegna. - Ricerca nell'elenco e anteprima della miniatura nel browser: nessuna richiesta al server mentre si scrive o si sceglie il territorio. - Icone SVG come simboli richiamati con <use>. - Assegnazione::giorni: cast a int (Carbon 3 restituisce un float). Home: "Vedi tutti" diventa un pulsante nella testata dei riquadri. README e HANDOFF aggiornati. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
2.2 KiB
PHP
61 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Assegnazioni;
|
|
|
|
use App\Models\Assegnazione;
|
|
use App\Models\Setting;
|
|
use Illuminate\Support\Str;
|
|
use Livewire\Attributes\Lazy;
|
|
use Livewire\Component;
|
|
|
|
/**
|
|
* L'elenco dei territori assegnati della pagina Assegna, separato dal form.
|
|
*
|
|
* Prima stava nello stesso componente: con ~80 righe la pagina pesava quasi
|
|
* 400 KB e Livewire li rimandava tutti a ogni interazione (scegliere un
|
|
* territorio, scrivere nella ricerca, aprire l'invio del link). Ora:
|
|
* - è un componente a sé, caricato subito dopo la pagina (#[Lazy]): il form
|
|
* compare subito e le sue azioni non ridisegnano l'elenco;
|
|
* - la ricerca filtra le righe nel browser (data-cerca), senza richieste;
|
|
* - le icone sono simboli SVG definiti una volta e richiamati con <use>.
|
|
*/
|
|
#[Lazy]
|
|
class ElencoAssegnati extends Component
|
|
{
|
|
public function toggleLinkSent(int $assegnazioneId): void
|
|
{
|
|
$this->authorize('territori.assign');
|
|
$assegnazione = Assegnazione::findOrFail($assegnazioneId);
|
|
$assegnazione->registraInvioLink(! $assegnazione->link_sent, $assegnazione->link_canale);
|
|
}
|
|
|
|
public function placeholder()
|
|
{
|
|
return view('livewire.assegnazioni.elenco-assegnati-attesa');
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
$assegnazioni = Assegnazione::aperte()
|
|
->with(['territorio.zona', 'proclamatore'])
|
|
->get()
|
|
->sortBy(fn ($a) => (string) $a->territorio?->numero, SORT_NATURAL)
|
|
->values();
|
|
|
|
// Il testo su cui filtra la ricerca nel browser: numero, zona e nome
|
|
// (decifrato qui: in SQL non si potrebbe cercare), senza accenti.
|
|
$cerca = $assegnazioni->mapWithKeys(fn ($a) => [$a->id => Str::lower(Str::ascii(implode(' ', array_filter([
|
|
$a->territorio?->numero,
|
|
$a->territorio?->zona?->nome,
|
|
$a->proclamatore?->nome_completo,
|
|
]))))]);
|
|
|
|
return view('livewire.assegnazioni.elenco-assegnati', [
|
|
'assegnazioni' => $assegnazioni,
|
|
'cerca' => $cerca,
|
|
// Il link scade alla soglia rientro (giorni_per_smarrito).
|
|
'sogliaRientro' => max(1, (int) Setting::getValue('giorni_per_smarrito', 120)),
|
|
]);
|
|
}
|
|
}
|