{{-- Zwei Taktungen, ein Aufruf: während der Übernahme zählt jede Sekunde, danach schreibt Proxmox seine Messwerte ohnehin nur einmal pro Minute fort. Der Zwischenspeicher in HostLoadSeries hält die schnelle Taktung vom Host fern. --}}
status, ['pending', 'running', 'waiting'])) wire:poll.4s @else wire:poll.60s @endif> @php $badge = ['pending' => 'pending', 'onboarding' => 'provisioning', 'active' => 'active', 'error' => 'failed', 'disabled' => 'suspended'][$host->status] ?? 'info'; @endphp
{{ __('hosts.back') }}

{{ $host->name }}

{{ __('hosts.status.'.$host->status) }}

{{ $host->public_ip }} · {{ $host->datacenter }}

@if ($run && $run->status === 'failed') {{ __('hosts.retry') }} @endif @if (in_array($host->status, ['active', 'disabled'], true)) {{ $host->status === 'active' ? __('hosts.detail.drain') : __('hosts.detail.activate') }} @endif {{-- Ohne Tunneladresse oder Fingerabdruck kann keine Sitzung entstehen — TerminalTicket::issue() weist das mit einer RuntimeException zurück (Aufgabe 1). Ein Knopf, der das verlässlich auslöst, ist schlechter als gar keiner. --}} @can('hosts.manage') @if ($host->wg_ip && $host->ssh_host_key) {{-- href direkt am Knopf, nicht als drumherum: interaktiver Inhalt in einem Link ist ungültiges HTML, und Mittelklick/ Statuszeile hingen sonst an einem Element, auf dem der Zeiger nie landet (components/ui/button.blade.php Zeile 6-9). --}} {{ __('hosts.terminal.open') }} @endif @endcan {{-- Die Bedingung steht am Bauteil, nicht hier: `issue()` prüft dieselbe, und zwei Fassungen liefen auseinander. --}} @if (\App\Livewire\Admin\ReissueTakeover::eligible($host)) {{ __('hosts.reissue.action') }} @endif {{ __('hosts.remove') }}
{{-- Health + resource overview --}} @php $hdot = ['online' => 'bg-success-bright', 'stale' => 'bg-warning', 'offline' => 'bg-danger'][$health]; // Die Scheibe hinter dem Punkt trägt dieselbe Aussage in Farbe. Vorher // war sie bg-surface-2 auf weißem Grund — technisch da, sichtbar nicht, // und damit eine Fläche, die nichts sagt. $hdisc = ['online' => 'bg-success-bg', 'stale' => 'bg-warning-bg', 'offline' => 'bg-danger-bg'][$health]; $usedPct = $host->usedPct(); @endphp {{-- Ein Kachelraster statt dreier ungleicher Kästen. Vorher standen Zustand, Speicher und eine gemeinsame Kurve nebeneinander: zwei davon halb leer, die dritte überfüllt, und die gemeinsame Kurve brauchte eine Legende, um zu sagen, welche Linie welche ist. Eine Reihe je Kachel löst alle drei Beschwerden auf einmal — die Beschriftung der Kachel benennt die Reihe, also braucht es keine Legende; die Höhen sind durch das Raster gleich statt zufällig; und der leere Platz ist mit Messwerten gefüllt, die es ohnehin schon gab. --}}
@php $pct = fn (?float $v) => $v === null ? '—' : number_format($v, $v < 10 ? 1 : 0, ',', '.'); $mib = fn (?float $v) => $v === null ? '—' : number_format($v, 2, ',', '.'); @endphp @if ($load['available']) @endif @if ($load['available']) @endif {{-- Die Ablage als Ring, wie die Vorlage die Festplatte zeichnet. Der Ring zeigt BELEGT, die Zahl daneben FREI — beides steht dabei, weil ein Ring ohne Beschriftung beides bedeuten kann. --}} @if ($host->total_gb) @endif @if ($load['available']) @endif @if ($load['available']) @endif {{-- Halb so groß wie der Ring nebenan, nicht gleich groß: eine gefüllte Scheibe wiegt optisch weit mehr als ein dünner Ring, und bei 62 px erschlug sie die Kachel. --}}
{{-- Ausstattung: was feststeht. Vorher standen diese Zahlen in Karten, die wie die lebendigen aussahen — deshalb las sich eine Kernzahl wie eine Messung. --}}

{{ __('hosts.detail.spec') }}

{{-- 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. --}}
@foreach ([ [__('hosts.detail.public_ip'), $host->public_ip ?? __('hosts.unknown')], [__('hosts.meta.cores'), $host->cpu_cores ? (string) $host->cpu_cores : '—'], [__('hosts.meta.ram'), $host->total_ram_mb ? round($host->total_ram_mb / 1024).' GB' : '—'], [__('hosts.detail.node'), $host->node ?? __('hosts.unknown')], [__('hosts.meta.wg_ip'), $host->wg_ip ?? __('hosts.unknown')], ] as [$label, $value])
{{ $label }}
{{ $value }}
@endforeach
{{ __('hosts.meta.version') }}
@if ($version['version']) {{-- Die Zahl, die jemand sucht. Die Bau-Kennung steht nur noch im Titel: als eigene Zeile zwang sie die ganze Tafel in eine zweite Reihe, für eine Zeichenkette, die fast niemand liest und niemand abtippt. --}}
Proxmox VE {{ $version['version'] }}
@else
{{ __('hosts.unknown') }}
@endif
{{-- Die Adresse, nicht bloß der Name: ein Klick landet auf der Proxmox-Oberfläche des Hosts. Sie antwortet nur aus dem Tunnel — SecureHostFirewall lässt 8006 ausschließlich aus dem Management-Subnetz zu, und der Name löst nur dort auf. Eine gewöhnliche Zelle wie alle anderen. `title` trägt den vollen Wert, falls er in einem schmalen Fenster doch einmal abgeschnitten wird. --}}
{{-- Die Reserve gehört hierher und nicht auf eine Kachel: die Kacheln zeigen, was gemessen wurde, diese Tafel, was eingestellt ist. Ein Eingabefeld zwischen Messwerten sähe aus, als ließe sich eine Messung ändern. --}} @if ($host->total_gb)
{{ __('hosts.detail.reserve_label') }} % {{ __('hosts.detail.reserve_hint') }}
@endif {{-- Reservierung: "eigener Server" ist sonst nur ein Satz im Angebot. Erst diese Markierung haelt andere Kunden fern (Host::placeableIn()). --}}
@if ($host->reserved_for_customer_id) {{ __('hosts.detail.reserved_for', ['name' => $host->reservedFor?->name ?? __('hosts.unknown')]) }} @else {{ __('hosts.detail.reserved_general') }}
@endif
{{-- Hosted instances. Die Anzahl steht in der Überschrift, statt als eigene Kleinkarte neben der Liste, die sie ohnehin zeigt. --}}

{{ __('hosts.detail.hosted') }} {{ $instances->count() }}

@if ($instances->isEmpty())

{{ __('hosts.detail.no_instances') }}

@else
@foreach ($instances as $inst) @php $ibadge = ['active' => 'active', 'provisioning' => 'provisioning', 'failed' => 'failed', 'suspended' => 'suspended', 'cancellation_scheduled' => 'warning'][$inst->status] ?? 'info'; @endphp @endforeach
{{ $inst->subdomain ?? '—' }} {{ __('billing.plan.'.$inst->plan) }} {{ $inst->disk_gb }} GB {{ __('hosts.istatus.'.$inst->status) }}
@endif
@if ($run && $run->status === 'failed')

{{ __('hosts.error_title') }}

{{ $run->error }}

@endif @php // Zugeklappt, sobald die Übernahme durch ist: fünfzehn abgehakte // Schritte sind auf einem seit Wochen laufenden Host kein Dauerinhalt. // Aufklappbar, nicht weg — wer nachsehen will, warum ein Schritt // wiederholt wurde, findet ihn noch. $onboardingDone = $run && $run->status === \App\Models\ProvisioningRun::STATUS_COMPLETED; @endphp
@if ($onboardingDone) {{--
statt Alpine: ein Aufklapper braucht kein JavaScript, und der Inhalt bleibt für die Suche im Browser und für Screenreader erreichbar. --}}
{{ __('hosts.detail.onboarding_done') }} {{ $run->updated_at?->local()->isoFormat('D. MMM, HH:mm') }}
@else

{{ __('hosts.progress') }}

@if ($run) @else

{{ __('hosts.no_run') }}

@endif @endif

{{ __('hosts.events') }}

@if ($events->isEmpty())

{{ __('hosts.no_run') }}

@else
    @foreach ($events as $event) @php $tone = ['advanced' => 'text-success', 'retry' => 'text-warning', 'failed' => 'text-danger', 'info' => 'text-muted'][$event->outcome] ?? 'text-muted'; @endphp
  1. {{ __('hosts.step.'.$event->step) }}

    {{ __('hosts.outcome.'.$event->outcome) }} · {{ __('hosts.attempt') }} {{ $event->attempt }} @if ($event->message) · {{ $event->message }} @endif

  2. @endforeach
@endif