feat(unita-immobiliare): FHD screen width optimization, Condomino vs Inquilino role toggle buttons, and tab deduplication (task-d095b0e23b)

This commit is contained in:
michele 2026-08-30 19:48:50 +02:00
parent 1c31fed982
commit 23741f453b
3 changed files with 95 additions and 34 deletions

View File

@ -98,6 +98,8 @@ public static function canAccess(): bool
public string $tab = 'riepilogo';
public string $condInquilActive = 'C';
public array $millesimiPerTabella = [];
public array $dirittiProprieta = [];
@ -791,7 +793,16 @@ public function getEstrattoContoNominativoDettaglioProperty(): array
}
if (! $selectedItem) {
$selectedItem = end($timeline);
$roleTarget = $this->condInquilActive === 'I' ? 'Inquilino' : 'Condomino / Proprietario';
foreach ($timeline as $t) {
if (($t['ruolo'] ?? '') === $roleTarget) {
$selectedItem = $t;
break;
}
}
if (! $selectedItem) {
$selectedItem = end($timeline);
}
}
$idCond = $selectedItem['id_cond'] ?? 0;
@ -1204,6 +1215,18 @@ public function getUnitaOptions(): array
return $this->unitaOptionsCache;
}
public function setCondInquilActive(string $role): void
{
$role = strtoupper(trim($role));
if (in_array($role, ['C', 'CONDOMINO', 'CONDOMINI'], true)) {
$this->condInquilActive = 'C';
$this->estrattoTipo = 'condomini';
} elseif (in_array($role, ['I', 'INQUILINO', 'INQUILINI'], true)) {
$this->condInquilActive = 'I';
$this->estrattoTipo = 'inquilini';
}
}
public function setEstrattoTipo(string $tipo): void
{
$tipo = strtolower(trim($tipo));
@ -1211,7 +1234,8 @@ public function setEstrattoTipo(string $tipo): void
return;
}
$this->estrattoTipo = $tipo;
$this->estrattoTipo = $tipo;
$this->condInquilActive = $tipo === 'inquilini' ? 'I' : 'C';
}
/**

View File

@ -1,6 +1,6 @@
<x-filament-panels::page>
<div class="mx-auto max-w-7xl space-y-4">
{{-- BARRA PULSANTINI ICONICI COMPATTI UNIFICATA (SENZA SCROLL ORIZZONTALE) --}}
<div class="w-full max-w-full space-y-4 px-2 lg:px-6">
{{-- BARRA NAVIGAZIONE UNIFICATA E COMPATTA --}}
<div class="mb-2 flex flex-wrap items-center justify-between gap-2 rounded-xl border border-slate-200 bg-white/80 p-2 shadow-xs backdrop-blur-xs">
<div class="flex flex-wrap items-center gap-1.5">
<a href="{{ \App\Filament\Pages\Gescon\StabiliArchivio::getUrl(panel: 'admin-filament') }}"
@ -29,35 +29,6 @@ class="inline-flex items-center gap-1.5 rounded-lg border border-slate-200 bg-sl
<span>Catasto</span>
</a>
</div>
{{-- Sotto-Tab della pagina corrente --}}
<div class="flex flex-wrap items-center gap-1">
<button type="button" wire:click="setTab('riepilogo')"
class="inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium transition {{ $tab === 'riepilogo' ? 'bg-indigo-700 text-white shadow-md ring-2 ring-indigo-500/20 font-semibold' : 'bg-slate-100 text-slate-600 hover:bg-slate-200' }}">
<span>📊</span>
<span>Riepilogo</span>
</button>
<button type="button" wire:click="setTab('nominativi')"
class="inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium transition {{ $tab === 'nominativi' ? 'bg-indigo-700 text-white shadow-md ring-2 ring-indigo-500/20 font-semibold' : 'bg-slate-100 text-slate-600 hover:bg-slate-200' }}">
<span>👥</span>
<span>Nominativi & Subentri</span>
</button>
<button type="button" wire:click="setTab('estratto_conto')"
class="inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium transition {{ $tab === 'estratto_conto' ? 'bg-indigo-700 text-white shadow-md ring-2 ring-indigo-500/20 font-semibold' : 'bg-slate-100 text-slate-600 hover:bg-slate-200' }}">
<span>🧾</span>
<span>Estratto Conto & Pagamenti</span>
</button>
<button type="button" wire:click="setTab('millesimi')"
class="inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium transition {{ $tab === 'millesimi' ? 'bg-indigo-700 text-white shadow-md ring-2 ring-indigo-500/20 font-semibold' : 'bg-slate-100 text-slate-600 hover:bg-slate-200' }}">
<span>📐</span>
<span>Tabelle Millesimali</span>
</button>
<button type="button" wire:click="setTab('catasto')"
class="inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium transition {{ $tab === 'catasto' ? 'bg-indigo-700 text-white shadow-md ring-2 ring-indigo-500/20 font-semibold' : 'bg-slate-100 text-slate-600 hover:bg-slate-200' }}">
<span>🏛️</span>
<span>Catasto</span>
</button>
</div>
</div>
@php
@ -71,7 +42,7 @@ class="inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-me
];
@endphp
{{-- CONTROLLI COMPATTI SELEZIONE UNITÀ & VISTA --}}
{{-- CONTROLLI COMPATTI SELEZIONE UNITÀ & PULSANTI RUOLO CONDOMINO / INQUILINO --}}
<div class="mb-3 flex flex-wrap items-center justify-between gap-3 rounded-xl border border-slate-200 bg-white p-2.5 shadow-xs">
<div class="flex flex-wrap items-center gap-2.5">
<a href="{{ $this->getBackUrl() }}" class="inline-flex items-center gap-1 rounded-lg border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs font-semibold text-slate-600 transition hover:bg-slate-100 hover:text-slate-900">
@ -97,6 +68,20 @@ class="inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-me
<span class="inline-flex items-center justify-center rounded-lg border border-slate-200 bg-slate-50 px-2.5 py-1 text-xs font-semibold text-slate-400 opacity-50">Succ. &rarr;</span>
@endif
</div>
{{-- SELETTORE ESPLICITO RUOLO CONDOMINO / INQUILINO --}}
<div class="flex items-center gap-1 rounded-lg border border-slate-200 bg-slate-100 p-1">
<button type="button" wire:click="setCondInquilActive('C')"
class="inline-flex items-center gap-1.5 rounded-md px-3 py-1 text-xs font-bold transition {{ ($condInquilActive ?? 'C') === 'C' ? 'bg-amber-600 text-white shadow-xs' : 'text-slate-600 hover:text-slate-900' }}">
<span>🏢</span>
<span>Condomino (Proprietari)</span>
</button>
<button type="button" wire:click="setCondInquilActive('I')"
class="inline-flex items-center gap-1.5 rounded-md px-3 py-1 text-xs font-bold transition {{ ($condInquilActive ?? 'C') === 'I' ? 'bg-indigo-600 text-white shadow-xs' : 'text-slate-600 hover:text-slate-900' }}">
<span>👤</span>
<span>Inquilino</span>
</button>
</div>
</div>
<div class="flex flex-wrap items-center gap-2">

View File

@ -0,0 +1,52 @@
<?php
use App\Filament\Pages\UnitaImmobiliarePage;
use App\Models\Stabile;
use App\Models\UnitaImmobiliare;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Livewire\Livewire;
test('unita immobiliare page allows toggling between condomino and inquilino role', function () {
DB::table('amministratori')->insertOrIgnore([
'id' => 1,
'nome' => 'Admin',
'cognome' => 'Test',
'created_at' => now(),
'updated_at' => now(),
]);
$user = User::factory()->create();
if (method_exists($user, 'assignRole')) {
\Spatie\Permission\Models\Role::firstOrCreate(['name' => 'admin', 'guard_name' => 'web']);
$user->assignRole('admin');
}
$stabile = Stabile::create([
'amministratore_id' => 1,
'codice_stabile' => '0013',
'denominazione' => 'Stabile Test 0013',
'indirizzo' => 'Via Ottaviano 105',
'citta' => 'Roma',
'cap' => '00192',
'provincia' => 'RM',
]);
$unita = UnitaImmobiliare::create([
'stabile_id' => $stabile->id,
'scala' => 'A',
'interno' => '1',
'codice_unita' => '0013-A-1',
]);
Livewire::actingAs($user)
->test(UnitaImmobiliarePage::class, ['unita_id' => $unita->id])
->assertSet('condInquilActive', 'C')
->assertSet('estrattoTipo', 'condomini')
->call('setCondInquilActive', 'I')
->assertSet('condInquilActive', 'I')
->assertSet('estrattoTipo', 'inquilini')
->call('setCondInquilActive', 'C')
->assertSet('condInquilActive', 'C')
->assertSet('estrattoTipo', 'condomini');
});