Раньше зона в списке была просто строкой без возможности провалиться внутрь — все устройства смотрелись только через общий плоский список /devices с колонкой "Зона". Теперь клик по зоне открывает её страницу с карточками устройств (иконка по категории, статус online/offline/ unknown точкой с пульсацией для online, external_id) — ровно то, что просили: все устройства и их статус на одном экране при выборе зоны. Заодно список зон переведён с голой таблицы на карточки для консистентности с новой страницей — вся карточка кликабельна и ведёт на show, кнопки изменить/удалить остаются только у owner. ZonePolicy::view уже был публичным (true всем) — новый роут zones.show использует его без изменений.
78 lines
2.1 KiB
PHP
78 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Requests\ZoneRequest;
|
|
use App\Http\Resources\DeviceResource;
|
|
use App\Http\Resources\ZoneResource;
|
|
use App\Models\Zone;
|
|
use App\Services\DeviceShadow;
|
|
use Inertia\Inertia;
|
|
|
|
class ZoneController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$this->authorize('viewAny', Zone::class);
|
|
|
|
$zones = Zone::withCount('devices')->orderBy('name')->get();
|
|
|
|
return Inertia::render('Zones/Index', [
|
|
'zones' => ZoneResource::collection($zones)->resolve(),
|
|
]);
|
|
}
|
|
|
|
public function show(Zone $zone, DeviceShadow $shadow)
|
|
{
|
|
$this->authorize('view', $zone);
|
|
|
|
$devices = $zone->devices()->with('deviceType')->orderBy('name')->get();
|
|
$statuses = $shadow->statuses($devices->pluck('external_id')->all());
|
|
$devices->each(fn ($d) => $d->live_status = $statuses[$d->external_id] ?? 'unknown');
|
|
|
|
return Inertia::render('Zones/Show', [
|
|
'zone' => (new ZoneResource($zone))->resolve(),
|
|
'devices' => DeviceResource::collection($devices)->resolve(),
|
|
]);
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$this->authorize('create', Zone::class);
|
|
|
|
return Inertia::render('Zones/Create');
|
|
}
|
|
|
|
public function store(ZoneRequest $request)
|
|
{
|
|
$request->user()->zones()->create($request->validated());
|
|
|
|
return redirect()->route('zones.index')->with('status', 'Зона создана.');
|
|
}
|
|
|
|
public function edit(Zone $zone)
|
|
{
|
|
$this->authorize('update', $zone);
|
|
|
|
return Inertia::render('Zones/Edit', [
|
|
'zone' => (new ZoneResource($zone))->resolve(),
|
|
]);
|
|
}
|
|
|
|
public function update(ZoneRequest $request, Zone $zone)
|
|
{
|
|
$zone->update($request->validated());
|
|
|
|
return redirect()->route('zones.index')->with('status', 'Зона обновлена.');
|
|
}
|
|
|
|
public function destroy(Zone $zone)
|
|
{
|
|
$this->authorize('delete', $zone);
|
|
|
|
$zone->delete();
|
|
|
|
return redirect()->route('zones.index')->with('status', 'Зона удалена.');
|
|
}
|
|
}
|