46 lines
1.5 KiB
PHP
46 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire;
|
|
|
|
use App\Models\Room;
|
|
use App\Services\HomeStatus;
|
|
use Livewire\Attributes\Layout;
|
|
use Livewire\Attributes\On;
|
|
use Livewire\Component;
|
|
|
|
#[Layout('layouts.app')]
|
|
class Dashboard extends Component
|
|
{
|
|
/** Live update: any device state change re-renders (re-queries) the dashboard. */
|
|
#[On('echo-private:home,.DeviceStateChanged')]
|
|
public function onDeviceStateChanged(): void
|
|
{
|
|
// no-op — the listener firing triggers a Livewire re-render with fresh data.
|
|
}
|
|
|
|
public function render(HomeStatus $home)
|
|
{
|
|
$devices = $home->devices();
|
|
|
|
// Group by room in room order; room-less devices go into a trailing "no room" group
|
|
// so they never disappear from the overview.
|
|
$groups = [];
|
|
foreach (Room::orderBy('sort')->orderBy('name')->get() as $room) {
|
|
$roomDevices = $devices->where('room_id', $room->id)->values();
|
|
if ($roomDevices->isNotEmpty()) {
|
|
$groups[] = ['name' => $room->name, 'devices' => $roomDevices];
|
|
}
|
|
}
|
|
$unassigned = $devices->whereNull('room_id')->values();
|
|
if ($unassigned->isNotEmpty()) {
|
|
$groups[] = ['name' => __('dashboard.no_room'), 'devices' => $unassigned];
|
|
}
|
|
|
|
return view('livewire.dashboard', [
|
|
'groups' => $groups,
|
|
'summary' => $home->summary($devices),
|
|
'warningCount' => count($home->warnings($devices)),
|
|
]);
|
|
}
|
|
}
|