@props(['peer']) {{-- Eine Zeile der Zugangsliste. Ausgelagert, als die Liste in zwei Gruppen zerfiel (Personen und Hosts). Sie zweimal hinzuschreiben hätte geheißen, sie ab dem nächsten Knopf an zwei Stellen zu pflegen — und die zweite fällt erst auf, wenn jemand einen Host-Zugang sucht und ihn anders aussehen sieht als seinen eigenen. Ursprünglicher Kopfkommentar der Liste, weil er die Form dieser Zeile erklärt: Ein Register von Zugängen, keine Tabelle. Sieben Spalten ließen jede davon zu schmal — Namen brachen um, „Letzter Kontakt" brach in seiner eigenen Überschrift um, und die Zeile passte trotzdem nicht. Das sind Eigenschaften EINES Zugangs, keine Größen, die jemand über eine Spalte hinweg vergleicht: also je Zugang eine eigene Zeile, Identität oben, Messwerte darunter in Mono, wo sie sich von selbst untereinander stellen. --}} @php $status = $peer->status(); $tone = [ 'online' => 'border-success-border bg-success-bg text-success', 'idle' => 'border-line-strong bg-surface-2 text-muted', 'blocked' => 'border-danger-border bg-danger-bg text-danger', 'pending' => 'border-warning-border bg-warning-bg text-warning', ][$status]; // Der Strich trägt den Zustand mit, damit ein gesperrter Zugang beim // Überfliegen auffällt, ohne dass jemand eine Plakette liest. $rule = [ 'online' => 'bg-success-bright', 'idle' => 'bg-line-strong', 'blocked' => 'bg-danger', 'pending' => 'bg-warning', ][$status]; @endphp
  • {{ $peer->name }} {{-- Die Plakette bleibt, obwohl die Gruppe daneben dasselbe sagt: eine Zeile wandert beim Suchen aus ihrer Überschrift heraus, und dann steht sie ohne sie da. --}} {{ $peer->host ? __('vpn.host_peer') : __('vpn.operator_peer') }} @if ($peer->owner) {{ $peer->owner->name }} @if ($peer->user_id === auth()->id()) {{ __('vpn.you') }} @endif @elseif (! $peer->host) {{ __('vpn.no_owner') }} @endif
    {{-- Die Messwerte, jeder mit eigener Beschriftung: ohne Kopfzeile müssen sie sich selbst benennen. --}}
    {{ $peer->allowed_ip }} @if ($peer->endpoint) {{ $peer->endpoint }} @endif ↓ {{ \App\Support\Bytes::human($peer->rx_bytes) }}  ↑ {{ \App\Support\Bytes::human($peer->tx_bytes) }} {{ __('vpn.handshake') }}: {{ $peer->last_handshake_at?->diffForHumans() ?? __('vpn.never') }}
    {{ __('vpn.status_'.$status) }}
    {{-- Eine hinterlegte Konfiguration lässt sich erneut abholen; ohne eine gibt es nichts auszugeben, und das zu sagen ist besser als ein fehlender Knopf. --}} @if (! $peer->hasStoredConfig() && $peer->kind === \App\Models\VpnPeer::KIND_STAFF && $peer->user_id === auth()->id()) @endif @can('downloadConfig', $peer) @endcan @can('block', $peer) @endcan @can('update', $peer) @if ($peer->kind === \App\Models\VpnPeer::KIND_STAFF) @endif @endcan @can('delete', $peer) @endcan