homeos/app/Livewire/Dashboard.php

49 lines
1.5 KiB
PHP

<?php
namespace App\Livewire;
use App\Livewire\Concerns\TogglesEntities;
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
{
use TogglesEntities;
/** 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)),
]);
}
}