Implements workspace-scoped managed tenant onboarding wizard (Filament v5 / Livewire v4) with strict RBAC (404/403 semantics), resumable sessions, provider connection selection/creation, verification OperationRun, and optional bootstrap. Removes legacy onboarding entrypoints and adds Pest coverage + spec artifacts (073). ## Summary <!-- Kurz: Was ändert sich und warum? --> ## Spec-Driven Development (SDD) - [ ] Es gibt eine Spec unter `specs/<NNN>-<feature>/` - [ ] Enthaltene Dateien: `plan.md`, `tasks.md`, `spec.md` - [ ] Spec beschreibt Verhalten/Acceptance Criteria (nicht nur Implementation) - [ ] Wenn sich Anforderungen während der Umsetzung geändert haben: Spec/Plan/Tasks wurden aktualisiert ## Implementation - [ ] Implementierung entspricht der Spec - [ ] Edge cases / Fehlerfälle berücksichtigt - [ ] Keine unbeabsichtigten Änderungen außerhalb des Scopes ## Tests - [ ] Tests ergänzt/aktualisiert (Pest/PHPUnit) - [ ] Relevante Tests lokal ausgeführt (`./vendor/bin/sail artisan test` oder `php artisan test`) ## Migration / Config / Ops (falls relevant) - [ ] Migration(en) enthalten und getestet - [ ] Rollback bedacht (rückwärts kompatibel, sichere Migration) - [ ] Neue Env Vars dokumentiert (`.env.example` / Doku) - [ ] Queue/cron/storage Auswirkungen geprüft ## UI (Filament/Livewire) (falls relevant) - [ ] UI-Flows geprüft - [ ] Screenshots/Notizen hinzugefügt ## Notes <!-- Links, Screenshots, Follow-ups, offene Punkte --> Co-authored-by: Ahmed Darrazi <ahmeddarrazi@adsmac.fritz.box> Reviewed-on: #88
61 lines
2.8 KiB
PHP
61 lines
2.8 KiB
PHP
<x-filament-panels::page>
|
|
<x-filament::section>
|
|
<div class="flex flex-col gap-4">
|
|
<div class="text-sm text-gray-600 dark:text-gray-300">
|
|
Select a tenant to continue.
|
|
</div>
|
|
|
|
@php
|
|
$tenants = $this->getTenants();
|
|
@endphp
|
|
|
|
@if ($tenants->isEmpty())
|
|
<div class="rounded-md border border-gray-200 bg-gray-50 p-4 text-sm text-gray-700 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-200">
|
|
<div class="font-medium text-gray-900 dark:text-gray-100">No tenants are available for your account.</div>
|
|
<div class="mt-1 text-sm text-gray-600 dark:text-gray-300">
|
|
Switch workspaces, or contact an administrator.
|
|
</div>
|
|
|
|
<div class="mt-4 flex flex-col gap-2 sm:flex-row">
|
|
<x-filament::button
|
|
type="button"
|
|
color="gray"
|
|
tag="a"
|
|
href="{{ route('filament.admin.pages.choose-workspace') }}"
|
|
>
|
|
Change workspace
|
|
</x-filament::button>
|
|
</div>
|
|
</div>
|
|
@else
|
|
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3">
|
|
@foreach ($tenants as $tenant)
|
|
<div
|
|
wire:key="tenant-{{ $tenant->id }}"
|
|
x-data
|
|
@click="if ($event.target.closest('button,a,input,select,textarea')) return; $refs.form.submit();"
|
|
class="cursor-pointer rounded-lg border border-gray-200 p-4 dark:border-gray-800"
|
|
>
|
|
<form x-ref="form" method="POST" action="{{ route('admin.select-tenant') }}" class="flex flex-col gap-3">
|
|
@csrf
|
|
<input type="hidden" name="tenant_id" value="{{ (int) $tenant->id }}" />
|
|
<div class="font-medium text-gray-900 dark:text-gray-100">
|
|
{{ $tenant->name }}
|
|
</div>
|
|
|
|
<x-filament::button
|
|
type="submit"
|
|
color="primary"
|
|
class="w-full"
|
|
>
|
|
Continue
|
|
</x-filament::button>
|
|
</form>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</x-filament::section>
|
|
</x-filament-panels::page>
|