{{-- 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 {{-- 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') }}

@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. 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. --}}
{{ __('hosts.detail.fqdn') }}
{{ $fqdn }}
{{-- 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