{{ __('admin_settings.subtitle') }}
{{ __('admin_settings.update_only_releases') }}
@endif {{-- Where it is. "Läuft gerade" alone is what sends an operator to the shell: a queued update does nothing visible until the agent picks it up, and while it runs the site is in maintenance mode and this page is unreachable. Both look identical to "wedged" without a time — hence the live countdown, replacing what used to be a static "spätestens um 17:19" that read as a promise nothing then visibly kept. There is no countdown any more, for either. It was wrong in fact — the target was recomputed on every poll, and where the interval the agent reported was shorter than the timer actually installed on that host it landed in the past every time and reset to a full minute, so it ran backwards a few seconds and jumped, forever. And it was wrong in kind: a check starts nothing, and an update now starts at once. A queued run says so in a sentence; a queued check says nothing beyond its badge. --}} @if ($update['running']){{ __('admin_settings.update_step', ['step' => $update['phase']]) }}
@if ($update['started_at']){{ __('admin_settings.update_since', ['when' => $update['started_at']->diffForHumans()]) }}
@endif @else{{ $update['instant'] ? __('admin_settings.update_starting') : __('admin_settings.update_starting_queued') }}
@endif{{ __('admin_settings.update_offline_hint') }}
{{ __('admin_settings.update_last_run', [ 'state' => __('admin_settings.update_state.'.$update['last_state']), 'when' => $update['last_finished_at']?->diffForHumans() ?? '—', ]) }} @if ($update['last_started_at'] && $update['last_finished_at']) · {{ __('admin_settings.update_took', ['duration' => $update['last_started_at']->diffForHumans($update['last_finished_at'], true)]) }} @endif {{-- Only on a failure: on a run that worked the last step is "left maintenance mode", which says nothing. --}} @if ($update['last_state'] === 'failed' && $update['last_phase']) · {{ __('admin_settings.update_failed_at', ['step' => $update['last_phase']]) }} @endif
@endif {{-- Open while it runs: "läuft gerade" on its own tells an operator nothing about whether it is progressing or wedged. --}} @if ($updateLog){{ $updateLog }}
{{ $sitePublic ? __('admin_settings.site_public_body') : __('admin_settings.site_hidden_body') }}
{{ __('admin_settings.site_your_view', ['ip' => request()->ip()]) }} {{ $viewerOnVpn ? __('admin_settings.site_via_vpn') : __('admin_settings.site_not_vpn') }}
{{ $consoleRestricted ? __('admin_settings.console_locked_body') : __('admin_settings.console_open_body') }}
{{ __('admin_settings.console_your_ip', ['ip' => $viewerIp]) }}
{{ __('admin_settings.console_always') }}
@foreach ($consoleVpnRanges as $range){{ __('admin_settings.console_extra') }}
@forelse ($consoleIps as $ip){{ __('admin_settings.console_none') }}
@endforelse {{-- The hint sits under the row, not inside it: as a sibling of the field it made the flex row as tall as field-plus-hint, and the button stretched to match. --}}{{ __('admin_settings.two_factor_body') }}
@error('requireTwoFactor'){{ $message }}
@enderror{{ __('admin_settings.staff_sub') }}
{{ __('admin_settings.invite_hint') }}
@if ($invitedPassword){{ __('admin_settings.temp_title') }}
{{ __('admin_settings.temp_hint') }}
| {{ __('admin_settings.col_person') }} | {{ __('admin_settings.role') }} | {{ __('admin_settings.col_actions') }} |
|---|---|---|
|
{{ $s['name'] }} @if ($s['self'])({{ __('admin_settings.you') }})@endif {{ $s['email'] }} |
@if ($s['self']) {{ __('admin_settings.role_'.\Illuminate\Support\Str::slug($s['role'])) }} @else @endif | {{-- Your own row has no actions — you cannot revoke yourself — and an empty cell reads as a bug rather than as a rule. --}} @if ($s['self']) — @endif @unless ($s['self']) @endunless |