++ Assegna aperta da "Assegna ->" della Home: senza l'elenco dei territori assegnati

La richiesta era per la pagina Assegna, non per la scheda del territorio:
annullata la modifica di f1f3408 (storico nascosto nella scheda) e ora il
link "Assegna ->" della Home porta ?dalla_home=1, con cui Assegna non
mostra ne' carica l'elenco "Territori Assegnati".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Francesco Picone
2026-10-20 17:28:56 +02:00
parent f1f340803a
commit 7d479a2c34
9 changed files with 54 additions and 65 deletions

View File

@@ -235,6 +235,18 @@ Decisioni successive dell'utente (20 ottobre 2026):
(erano `home_giorni_giacenza` e `home_is_prioritario`, anche nel PDF). (erano `home_giorni_giacenza` e `home_is_prioritario`, anche nel PDF).
- "Il mio gruppo" mostra sotto il titolo nome e cognome del sorvegliante. - "Il mio gruppo" mostra sotto il titolo nome e cognome del sorvegliante.
### Assegna aperta dalla Home: senza l'elenco dei territori assegnati (20 ottobre 2026)
Richiesta dell'utente: "quando provengo da un territorio dalla home, non
mostrare lo storico assegnazioni". Avevo capito la scheda del territorio e
ne avevo nascosto lo storico (commit `f1f3408`, poi annullato con un revert):
intendeva la pagina *Assegna* aperta da "Assegna →" della Home, e come
"storico" l'elenco "Territori Assegnati" sotto il modulo. Ora quel link porta
`?dalla_home=1` e `Assegna::$elencoNascosto` toglie `ElencoAssegnati` (che
così non si carica nemmeno). Dal menu o dalla scheda del territorio l'elenco
c'è come prima. Non si usa il `?da=` del ritorno per capirlo: si trasmette di
pagina in pagina.
### Storico assegnazioni in linea (20 ottobre 2026) ### Storico assegnazioni in linea (20 ottobre 2026)
Richiesta dell'utente (screenshot della scheda territorio): le colonne dello Richiesta dell'utente (screenshot della scheda territorio): le colonne dello
@@ -248,13 +260,6 @@ non diventa una scheda). Ordine esplicito: anni dal più recente
proclamatore la colonna Campagna ora dice "Sì — …" / "No" come in quella del proclamatore la colonna Campagna ora dice "Sì — …" / "No" come in quella del
territorio, e c'è il badge "via gruppo …". Test: `StoricoAssegnazioniTest`. territorio, e c'è il badge "via gruppo …". Test: `StoricoAssegnazioniTest`.
Poi, su richiesta dell'utente: **aperta dalla Home la scheda del territorio
non mostra lo storico**. I link della Home ("Da assegnare", "Da rientrare")
portano `?dalla_home=1` e `TerritorioShow::$storicoNascosto` salta anche la
query; resta "Mostra lo storico delle assegnazioni". Non si usa il `?da=` del
ritorno per capirlo: si trasmette di pagina in pagina, e un territorio aperto
da *Assegna* (a sua volta aperta dalla Home) sembrerebbe venire dalla Home.
### Rientro dall'elenco dei territori assegnati (20 ottobre 2026) ### Rientro dall'elenco dei territori assegnati (20 ottobre 2026)
Richiesta dell'utente ("un tasto che va alla registrazione", dallo screenshot Richiesta dell'utente ("un tasto che va alla registrazione", dallo screenshot

View File

@@ -700,9 +700,7 @@ docker compose --profile dev up -d --build
- Badge di stato colorati e indicatore di priorità (manuale o automatica) - Badge di stato colorati e indicatore di priorità (manuale o automatica)
- Dettaglio con visualizzatore PDF e storico assegnazioni per anno teocratico: - Dettaglio con visualizzatore PDF e storico assegnazioni per anno teocratico:
una tabella sola con le colonne in linea, l'anno come riga di separazione, una tabella sola con le colonne in linea, l'anno come riga di separazione,
dal più recente (lo stesso nella scheda del proclamatore). Aperta dalla dal più recente (lo stesso nella scheda del proclamatore)
Home, la scheda non mostra lo storico ("Mostra lo storico delle
assegnazioni" lo apre)
- Link PDF pubblico condivisibile, a scadenza configurabile - Link PDF pubblico condivisibile, a scadenza configurabile
- Soft delete con cestino (ripristino o eliminazione definitiva) - Soft delete con cestino (ripristino o eliminazione definitiva)
- Import massivo di PDF da cartella o archivio ZIP, elaborato in background - Import massivo di PDF da cartella o archivio ZIP, elaborato in background
@@ -733,7 +731,8 @@ docker compose --profile dev up -d --build
può copiare o condividere il link può copiare o condividere il link
- L'elenco dei territori assegnati si carica subito dopo la pagina e si filtra - L'elenco dei territori assegnati si carica subito dopo la pagina e si filtra
nel browser, senza attese; ogni territorio ha il pulsante **Rientro**, che nel browser, senza attese; ogni territorio ha il pulsante **Rientro**, che
porta alla registrazione del rientro e poi torna all'elenco porta alla registrazione del rientro e poi torna all'elenco. Aperta da
"Assegna →" della Home, la pagina mostra solo il modulo, senza l'elenco
- Rientro con calcolo automatico dei giorni - Rientro con calcolo automatico dei giorni
- **Prompt campagna**: se il territorio era fuori durante una campagna viene - **Prompt campagna**: se il territorio era fuori durante una campagna viene
chiesto se è stato percorso per la campagna; oltre la soglia "da rientrare" chiesto se è stato percorso per la campagna; oltre la soglia "da rientrare"

View File

@@ -23,11 +23,19 @@ class Assegna extends Component
// Optional pre-selection from parent context // Optional pre-selection from parent context
public ?int $preselectedTerritorioId = null; public ?int $preselectedTerritorioId = null;
/**
* Aperta da "Assegna →" della Home (?dalla_home=1, lo mette solo la Home)
* la pagina serve ad assegnare quel territorio: l'elenco dei territori
* assegnati sotto il modulo non si mostra (né si carica).
*/
public bool $elencoNascosto = false;
public function mount(?int $territorioId = null) public function mount(?int $territorioId = null)
{ {
$this->preselectedTerritorioId = $territorioId; $this->preselectedTerritorioId = $territorioId;
$this->territorio_id = $territorioId; $this->territorio_id = $territorioId;
$this->assigned_at = now()->format('Y-m-d'); $this->assigned_at = now()->format('Y-m-d');
$this->elencoNascosto = request()->boolean('dalla_home');
// ?invia=<id>: riprende l'invio di un link rimasto in sospeso (dalla // ?invia=<id>: riprende l'invio di un link rimasto in sospeso (dalla
// scheda del territorio). // scheda del territorio).

View File

@@ -13,36 +13,21 @@ class TerritorioShow extends Component
public Territorio $territorio; public Territorio $territorio;
/**
* Aperta dalla Home (?dalla_home=1, lo mettono solo i link della Home) la
* scheda non mostra lo storico delle assegnazioni: lì serve il territorio,
* non la sua storia. "Mostra lo storico" lo apre comunque.
*/
public bool $storicoNascosto = false;
public function mount(Territorio $territorio) public function mount(Territorio $territorio)
{ {
$this->territorio = $territorio->load(['zona', 'tipologia', 'assegnazioneCorrente.proclamatore', 'ultimaAssegnazione']); $this->territorio = $territorio->load(['zona', 'tipologia', 'assegnazioneCorrente.proclamatore', 'ultimaAssegnazione']);
$this->storicoNascosto = request()->boolean('dalla_home');
}
public function mostraStorico(): void
{
$this->storicoNascosto = false;
} }
public function render() public function render()
{ {
$assegnazioni = $this->storicoNascosto $assegnazioni = Assegnazione::where('territorio_id', $this->territorio->id)
? collect() ->with(['proclamatore', 'annoTeocratico', 'campagna', 'creatoDa', 'rientratoDa'])
: Assegnazione::where('territorio_id', $this->territorio->id) ->orderByDesc('assigned_at')
->with(['proclamatore', 'annoTeocratico', 'campagna', 'creatoDa', 'rientratoDa']) ->orderByDesc('id')
->orderByDesc('assigned_at') ->get()
->orderByDesc('id') ->groupBy(fn($a) => $a->annoTeocratico->label)
->get() // Dal più recente: gli anni ("2026-2027") si ordinano come testo.
->groupBy(fn($a) => $a->annoTeocratico->label) ->sortKeysDesc();
// Dal più recente: gli anni ("2026-2027") si ordinano come testo.
->sortKeysDesc();
return view('livewire.territori.territorio-show', [ return view('livewire.territori.territorio-show', [
'activeAssignment' => $this->territorio->assegnazioneCorrente, 'activeAssignment' => $this->territorio->assegnazioneCorrente,

View File

@@ -80,6 +80,9 @@
{{-- Elenco dei territori assegnati: componente a sé, caricato subito {{-- Elenco dei territori assegnati: componente a sé, caricato subito
dopo la pagina (ElencoAssegnati, #[Lazy]). Le azioni del form non dopo la pagina (ElencoAssegnati, #[Lazy]). Le azioni del form non
lo ridisegnano. --}} lo ridisegnano. Non c'è quando si arriva da "Assegna →" della Home
(Assegna::$elencoNascosto). --}}
@unless($elencoNascosto)
<livewire:assegnazioni.elenco-assegnati /> <livewire:assegnazioni.elenco-assegnati />
@endunless
</div> </div>

View File

@@ -109,7 +109,7 @@
<li class="px-5 py-3 flex items-center justify-between hover:bg-gray-50 transition-colors"> <li class="px-5 py-3 flex items-center justify-between hover:bg-gray-50 transition-colors">
<div> <div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<a data-ritorno href="{{ route('territori.show', ['territorio' => $t, 'dalla_home' => 1]) }}" class="text-sm font-semibold text-gray-900 hover:text-indigo-600 transition-colors">N° {{ $t->numero }}</a> <a data-ritorno href="{{ route('territori.show', $t) }}" class="text-sm font-semibold text-gray-900 hover:text-indigo-600 transition-colors">N° {{ $t->numero }}</a>
@if($t->in_priorita) @if($t->in_priorita)
<span class="inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide badge-pulse" style="background:#fef3c7;color:#92400e">★ Prioritario</span> <span class="inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide badge-pulse" style="background:#fef3c7;color:#92400e">★ Prioritario</span>
@endif @endif
@@ -122,7 +122,7 @@
</p> </p>
</div> </div>
@can('territori.assign') @can('territori.assign')
<x-btn data-ritorno variante="primary" tono="tenue" dimensione="sm" :href="route('assegnazioni.assegna', ['territorioId' => $t->id])">Assegna →</x-btn> <x-btn data-ritorno variante="primary" tono="tenue" dimensione="sm" :href="route('assegnazioni.assegna', ['territorioId' => $t->id, 'dalla_home' => 1])">Assegna →</x-btn>
@endcan @endcan
</li> </li>
@empty @empty
@@ -164,7 +164,7 @@
@php($assegnazioneCorrente = $t->assegnazioneCorrente) @php($assegnazioneCorrente = $t->assegnazioneCorrente)
<li class="px-5 py-3 flex items-center justify-between hover:bg-gray-50 transition-colors"> <li class="px-5 py-3 flex items-center justify-between hover:bg-gray-50 transition-colors">
<div> <div>
<a data-ritorno href="{{ route('territori.show', ['territorio' => $t, 'dalla_home' => 1]) }}" class="text-sm font-semibold text-gray-900 hover:text-indigo-600 transition-colors">N° {{ $t->numero }}</a> <a data-ritorno href="{{ route('territori.show', $t) }}" class="text-sm font-semibold text-gray-900 hover:text-indigo-600 transition-colors">N° {{ $t->numero }}</a>
<p class="text-xs text-gray-500"> <p class="text-xs text-gray-500">
{{ $assegnazioneCorrente?->proclamatore?->nome_completo }} {{ $assegnazioneCorrente?->proclamatore?->nome_completo }}
— <span class="font-medium" style="color:#dc2626">{{ $assegnazioneCorrente?->giorni }} gg</span> — <span class="font-medium" style="color:#dc2626">{{ $assegnazioneCorrente?->giorni }} gg</span>

View File

@@ -152,12 +152,7 @@
</div> </div>
@endif @endif
{{-- Assignment history: non quando si arriva dalla Home (TerritorioShow::$storicoNascosto) --}} {{-- Assignment history --}}
@if($storicoNascosto)
<div class="flex justify-end">
<x-btn variante="ghost" dimensione="sm" wire:click="mostraStorico">Mostra lo storico delle assegnazioni</x-btn>
</div>
@else
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"> <div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<div class="flex items-center gap-3 mb-4"> <div class="flex items-center gap-3 mb-4">
<div class="h-8 w-8 rounded-lg flex items-center justify-center" style="background:#eef2ff"> <div class="h-8 w-8 rounded-lg flex items-center justify-center" style="background:#eef2ff">
@@ -218,5 +213,4 @@
</div> </div>
@endif @endif
</div> </div>
@endif
</div> </div>

View File

@@ -261,6 +261,21 @@ class InvioLinkTest extends TestCase
->assertSee(route('piantine.editor', ['nuovo' => 1]), false); ->assertSee(route('piantine.editor', ['nuovo' => 1]), false);
} }
public function test_da_assegna_della_home_l_elenco_dei_territori_assegnati_non_c_e(): void
{
$t = $this->territorioConPdf('7');
$daHome = route('assegnazioni.assegna', ['territorioId' => $t->id, 'dalla_home' => 1]);
// "Assegna →" della Home porta il segnale...
$this->actingAs($this->admin)->get(route('dashboard'))->assertOk()->assertSee($daHome, false);
// ...e Assegna non mostra (né carica) l'elenco dei territori assegnati.
$this->get($daHome)->assertOk()->assertDontSee('assegnazioni.elenco-assegnati', false);
// Aperta dal menu o dalla scheda del territorio, l'elenco c'è.
$this->get(route('assegnazioni.assegna'))->assertSee('assegnazioni.elenco-assegnati', false);
$this->get(route('assegnazioni.assegna', ['territorioId' => $t->id]))->assertSee('assegnazioni.elenco-assegnati', false);
}
public function test_dall_elenco_degli_assegnati_si_va_al_rientro(): void public function test_dall_elenco_degli_assegnati_si_va_al_rientro(): void
{ {
$this->assegna($this->mario(), $this->territorioConPdf('7')); $this->assegna($this->mario(), $this->territorioConPdf('7'));

View File

@@ -62,26 +62,6 @@ class StoricoAssegnazioniTest extends TestCase
$this->assertSame(2, substr_count($html, 'tm-riga-gruppo')); $this->assertSame(2, substr_count($html, 'tm-riga-gruppo'));
} }
public function test_aperta_dalla_home_la_scheda_del_territorio_non_mostra_lo_storico(): void
{
// La Home manda alla scheda con il segnale dalla_home.
$this->actingAs($this->admin)->get(route('dashboard'))->assertOk()
->assertSee(route('territori.show', ['territorio' => $this->territorio, 'dalla_home' => 1]), false);
$this->get(route('territori.show', ['territorio' => $this->territorio, 'dalla_home' => 1]))->assertOk()
->assertDontSee('Storico Assegnazioni')
->assertDontSee('Anno Teocratico')
->assertSee('Mostra lo storico delle assegnazioni');
// Su richiesta si apre; aperta da altrove c'è sempre.
\Livewire\Livewire::actingAs($this->admin)->withQueryParams(['dalla_home' => 1])
->test(\App\Livewire\Territori\TerritorioShow::class, ['territorio' => $this->territorio])
->assertDontSee('Anno Teocratico')
->call('mostraStorico')
->assertSee('Anno Teocratico 2025-2026');
$this->get(route('territori.show', $this->territorio))->assertSee('Storico Assegnazioni');
}
public function test_nella_scheda_del_proclamatore_una_tabella_sola_dal_piu_recente(): void public function test_nella_scheda_del_proclamatore_una_tabella_sola_dal_piu_recente(): void
{ {
$html = $this->actingAs($this->admin)->get(route('proclamatori.show', $this->proclamatore))->assertOk() $html = $this->actingAs($this->admin)->get(route('proclamatori.show', $this->proclamatore))->assertOk()