{{ __('users.title') }}

{{ __('users.subtitle') }}

{{ $used }} / {{ $limit }}

{{ __('users.seats_used') }}

{{ __('users.seats_note') }}

{{-- Anlegen. Ausdrücklich NICHT einladen: hier entsteht nur die Zeile, die Einladung verschickt der Knopf in der Tabelle. Ein Inhaber soll sein Team vorbereiten können, ohne dass jemand eine Mail bekommt. --}} {{-- Eine Zeile aus Feldern, und alles, was darunter wachsen kann, wächst AUSSERHALB davon. Vorher stand hier `sm:items-end`: Der Fehler unter der E-Mail und der Hinweis unter der Rolle machten ihre Zelle höher, und weil unten ausgerichtet wurde, schob das ihre Eingabefelder nach OBEN. Drei Felder auf drei verschiedenen Höhen, und je nachdem, ob gerade ein Fehler stand, sprang die Zeile. `items-start` und gleich hohe Beschriftungen richten die Felder aneinander aus. Fehler und Hinweis stehen unter der Zeile, wo sie niemanden mehr verschieben. --}}
{{-- Ein leerer Platzhalter in Beschriftungshöhe, damit der Knopf auf der Linie der Felder sitzt — und nicht über einen abgezählten Abstand, der bei der nächsten Schriftgröße nicht mehr stimmt. --}}
{{ __('users.add') }}
@error('inviteEmail')

{{ $message }}

@enderror {{-- Nur zur Rolle, die wirklich gewählt ist. Der Satz stand vorher immer da und beschrieb „Nur Lesen", während „Mitglied" ausgewählt war — eine Erklärung zu etwas, das gar nicht passiert. --}} @if ($inviteRole === 'readonly')

{{ __('users.role_readonly_means') }}

@endif
{{-- Der Mailversand fehlt: gesagt, bevor jemand drückt. Der Einladen-Knopf bleibt trotzdem stehen. Ihn an jeder Zeile verschwinden zu lassen liest sich nicht als „geht hier gerade nicht", sondern als „das kann dieses Produkt nicht" — genau die Beschwerde, die schon einmal dazu geführt hat, dass die Aktionsspalte IMMER gezeichnet wird (siehe Users::render()). Und der Zustand ist vorübergehend: er endet, sobald der Betrieb das Versandkonto ausfüllt, ohne dass sich an dieser Seite etwas ändert. Einmal über der Tabelle statt einmal je Zeile: der Grund ist für alle derselbe, und an jeder Zeile stünde derselbe Satz noch einmal. Der Server weist die Einladung mit derselben Begründung ab — der Knopf verspricht also nichts, was der Hinweis nicht schon zurücknimmt. --}} @unless ($versandBereit) {{ __('users.mail_not_ready') }} @endunless {{-- Seats --}}
@foreach ($seats as $seat) {{-- Was der Inhaber WILL (`status`) und was in der Nextcloud WIRKLICH ist (`nc_state`) stehen in einer Zelle, und der wahre Zustand geht vor: solange der Auftrag läuft oder gescheitert ist, wäre „Eingeladen" eine Behauptung über etwas, das die Warteschlange noch gar nicht erledigt hat. Ohne diese Spalte drückt der Inhaber wieder und wieder, weil nichts sichtbar geschieht. --}} @endforeach
{{ __('users.col_person') }} {{ __('users.role') }} {{ __('users.col_status') }} {{ __('users.col_actions') }}

{{ $seat->name ?: $seat->email }}

@if ($seat->name)

{{ $seat->email }}

@endif
@if ($seat->role === 'owner') {{ __('users.role_owner') }} @else @endif @if ($seat->status === 'revoked') {{-- Entzogen geht dem Zustand vor: ein „wird eingerichtet …" an einer geschlossenen Zeile las sich wie ein Weg zurück, den es an DIESER Zeile nicht gibt. --}} {{ __('users.status_revoked') }}

{{ __('users.revoked_closed') }}

@elseif ($seat->nc_state === \App\Models\Seat::STATE_NONE) {{ __('users.state_none') }} @elseif ($seat->nc_state === \App\Models\Seat::STATE_PENDING) {{ __('users.state_pending') }} @elseif ($seat->nc_state !== \App\Models\Seat::STATE_FAILED) @php $sb = ['active' => 'active', 'invited' => 'provisioning'][$seat->status] ?? 'info'; @endphp {{ __('users.status_'.$seat->status) }} @endif {{-- Der Fehlschlag steht NEBEN dem Entzogen, nicht dahinter. Sonst verschwände genau dort die Rückfahrkarte, wo sie am nötigsten ist: scheitert das `disable`, ist das Konto im Gast weiter offen, während die Zeile „entzogen" sagt — kein Wiederholungslauf (tries = 1), kein Abgleich im Zeitplan, und diese Seite ist die einzige Stelle im Repo, die nc_state überhaupt anzeigt. --}} @if ($seat->nc_state === \App\Models\Seat::STATE_FAILED)
$seat->status === 'revoked'])> {{ __('users.state_failed') }} {{-- Der Grund im Klartext, nicht der Code: 'guest_failed' sagt einem Inhaber nichts, und ein Fehlschlag ohne Grund ist eine Sackgasse. --}}

{{ __('users.error_'.($seat->nc_error ?: 'unexpected')) }}

@php // Dieselbe Bedingung wie in retry(): ein Knopf, der // nur wieder rot zurückkommt, ist schlimmer als // keiner. Eine entzogene oder gesperrte Zeile, die // nie in der Nextcloud ankam, hat dort nichts zu // sperren — da gäbe es nichts zu wiederholen. $wiederholbar = $seat->role !== 'owner' && ($seat->nc_synced_at !== null || ! in_array($seat->status, ['revoked', 'suspended'], true)); @endphp @if ($wiederholbar) @endif
@endif
@if ($seat->status === 'revoked') {{-- Kein Knopf an der Zeile. Der Weg zurück geht durch die Vordertür: das Anlegen-Formular oben, mit derselben Adresse — und damit durch die Platzprüfung, die es an der Zeile nicht gäbe. Gesagt statt leer gelassen, wie bei der Inhaber-Zeile — eine leere Zelle liesse jemanden nach einem Knopf suchen, der absichtlich fehlt. --}} {{ __('users.revoked_final') }} @else {{-- Einladen ist der zweite Vorgang und hat deshalb seinen eigenen Knopf. Er steht nur an einer Zeile, die noch nichts in der Nextcloud hat; ist der Auftrag unterwegs, gibt es nichts zu drücken, und bei einem Fehlschlag steht „Nochmal versuchen" schon in der Zustandsspalte. Nie an der Inhaber-Zeile: dieses Konto legt die Bereitstellung an, nicht das Panel. --}} @if ($seat->role !== 'owner' && $seat->nc_state === \App\Models\Seat::STATE_NONE) @elseif ($seat->role !== 'owner' && $seat->nc_state === \App\Models\Seat::STATE_SYNCED && $seat->status === 'invited') @endif {{-- Rename is offered on every row, the owner included: a row you can do nothing to reads as a broken table, not as a protected one. It opens a modal, never the row itself — see R20. --}} @if ($seat->role === 'owner') {{-- Said, not hidden. The owner keeps their own access; an empty cell would leave somebody hunting for a button that is deliberately absent. --}} {{ __('users.owner_protected') }} @else {{-- Pause first, remove second. Somebody leaving needs their access stopped today; deleting the seat also throws away who held it, which is the half an audit asks about. --}} @endif @endif