Host-Liste holt sich ihren Stand selbst; die Ausstattung braucht keine Zeile nur fuer die Adresse

main
nexxo 2026-08-02 17:00:30 +02:00
parent f294db5259
commit 325e69f8f0
3 changed files with 36 additions and 9 deletions

View File

@ -50,6 +50,11 @@ class Hosts extends Component
return view('livewire.admin.hosts', [
'hosts' => $hosts,
// Ob gerade etwas an einem Host passiert — entscheidet nur, wie oft
// die Seite nachfasst. `disabled` zählt dazu: so steht ein Host da,
// dessen Entfernung in der Warteschlange hängt, und genau dann will
// man nicht eine Minute auf das Verschwinden warten.
'busy' => $hosts->contains(fn ($host) => in_array($host->status, ['pending', 'onboarding', 'disabled'], true)),
'datacenters' => Datacenter::query()->orderBy('name')->get(),
'statuses' => ['pending', 'onboarding', 'active', 'error', 'disabled'],
'total' => Host::query()->count(),

View File

@ -136,7 +136,18 @@
Messung. --}}
<div class="rounded-lg border border-line bg-surface p-5 shadow-xs animate-rise [animation-delay:60ms]">
<h2 class="mb-3 text-xs font-semibold text-muted">{{ __('hosts.detail.spec') }}</h2>
<dl class="grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-3 lg:grid-cols-6">
{{-- Vier Spalten, nicht sechs.
Mit sechs füllten die sechs alten Einträge die Reihe exakt aus, und
die Adresse bekam als siebter eine ganze eigene Zeile links ein
Wert, rechts daneben nichts. Eine Zeile, die nur entstand, weil ein
Feld dazukam.
Bei vier Spalten stehen sieben Werte als 4 + 3, und jede Zelle wird
BREITER statt schmaler: rund 265 px statt 190. Der Domainname
braucht etwa 200 er passt jetzt in eine gewöhnliche Zelle, statt
eine eigene Zeile zu erzwingen oder abgeschnitten zu werden. --}}
<dl class="grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-3 lg:grid-cols-4">
@foreach ([
[__('hosts.detail.public_ip'), $host->public_ip ?? __('hosts.unknown')],
[__('hosts.meta.cores'), $host->cpu_cores ? (string) $host->cpu_cores : '—'],
@ -166,17 +177,15 @@
SecureHostFirewall lässt 8006 ausschließlich aus dem
Management-Subnetz zu, und der Name löst nur dort auf.
col-span-full statt eines sechsten schmalen Feldes: die Tafel
hatte sechs Einträge in sechs Spalten, keine Lücke für einen
siebten. Eine siebte schmale Spalte hätte die Adresse mitten im
Domainnamen abgeschnitten genau die Zeichenkette, die hier
lesbar sein muss. Eine eigene, volle Zeile lässt sie stehen. --}}
<div class="col-span-full min-w-0">
Eine gewöhnliche Zelle wie alle anderen. `title` trägt den
vollen Wert, falls er in einem schmalen Fenster doch einmal
abgeschnitten wird. --}}
<div class="min-w-0">
<dt class="text-xs text-muted">{{ __('hosts.detail.fqdn') }}</dt>
<dd class="mt-0.5 truncate font-mono text-sm font-semibold">
<a href="https://{{ $fqdn }}:8006" target="_blank" rel="noopener"
class="text-accent-text underline-offset-2 hover:underline"
title="{{ __('hosts.detail.fqdn_hint') }}">{{ $fqdn }}</a>
title="{{ $fqdn }} — {{ __('hosts.detail.fqdn_hint') }}">{{ $fqdn }}</a>
</dd>
</div>
</dl>

View File

@ -1,4 +1,17 @@
<div class="space-y-5">
{{-- Die Liste holt sich ihren Stand selbst.
Sie tat es nicht, und das fiel an zwei Stellen auf: Zustand, VPN und
Belegung standen so lange still, bis jemand neu lud und ein entfernter
Host blieb sichtbar, obwohl er schon weg war. Beides sah aus, als sei
nichts passiert.
Schneller, solange etwas in Arbeit ist: `ConfirmRemoveHost` setzt den Host
auf `disabled` und wirft `PurgeHost` in die Warteschlange, die erst auf die
Runner-Sperre wartet. In dieser Zeit steht die Zeile noch da, und ohne
kurzes Nachfassen bliebe sie es gefühlt für immer. Läuft nichts, reicht die
Minute die Seite soll nicht dauernd Abfragen erzeugen, nur weil sie offen
ist. --}}
<div class="space-y-5" @if ($busy) wire:poll.5s @else wire:poll.60s @endif>
<div class="flex items-start justify-between gap-4 animate-rise">
<div>
<h1 class="text-2xl font-bold tracking-tight text-ink">{{ __('hosts.title') }}</h1>