fix: consolidate tenant creation + harden selection flows #131

Merged
ahmido merged 12 commits from 107-workspace-chooser into dev 2026-02-22 19:54:26 +00:00
Showing only changes of commit 88ba8a14d8 - Show all commits

View File

@ -1,76 +1,131 @@
<x-filament-panels::page> <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">
Workspace: <span class="font-medium text-gray-900 dark:text-gray-100">{{ $this->workspace->name }}</span>
</div>
@php @php
$tenants = $this->getTenants(); $tenants = $this->getTenants();
@endphp @endphp
@if ($tenants->isEmpty()) @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"> {{-- Empty state enterprise-grade --}}
<div class="font-medium text-gray-900 dark:text-gray-100">No managed tenants yet.</div> <div class="mx-auto max-w-md">
<div class="mt-1 text-sm text-gray-600 dark:text-gray-300"> <div class="rounded-xl border border-gray-200 bg-white p-8 text-center shadow-sm dark:border-white/10 dark:bg-white/5">
Add a managed tenant to start inventory, drift, backups, and policy management. {{-- Workspace context badge --}}
<div class="mb-5 inline-flex items-center gap-1.5 rounded-full border border-gray-200 bg-gray-50 px-3 py-1 text-xs font-medium text-gray-600 dark:border-white/10 dark:bg-white/5 dark:text-gray-400">
<x-filament::icon icon="heroicon-m-building-office-2" class="h-3.5 w-3.5" />
{{ $this->workspace->name }}
</div> </div>
<div class="mt-4 flex flex-col gap-2 sm:flex-row"> {{-- Icon --}}
<div class="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-primary-50 dark:bg-primary-950/30">
<x-filament::icon
icon="heroicon-o-server-stack"
class="h-7 w-7 text-primary-500 dark:text-primary-400"
/>
</div>
<h3 class="text-base font-semibold text-gray-900 dark:text-white">No managed tenants yet</h3>
<p class="mx-auto mt-2 max-w-xs text-sm text-gray-500 dark:text-gray-400">
Connect your first Microsoft Entra tenant to start managing inventory, backups, drift detection, and policies.
</p>
<div class="mt-6 flex flex-col items-center gap-3">
<x-filament::button <x-filament::button
type="button"
color="primary"
tag="a" tag="a"
href="{{ route('admin.onboarding') }}" href="{{ route('admin.onboarding') }}"
icon="heroicon-m-plus"
size="lg"
> >
Start onboarding Add tenant
</x-filament::button> </x-filament::button>
<x-filament::button <a href="{{ route('filament.admin.pages.choose-workspace') }}"
type="button" class="inline-flex items-center gap-1.5 text-sm text-gray-500 transition-colors hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200">
color="gray" <x-filament::icon icon="heroicon-m-arrows-right-left" class="h-4 w-4" />
tag="a" Switch workspace
href="{{ route('filament.admin.pages.choose-workspace') }}" </a>
> </div>
Change workspace
</x-filament::button>
</div> </div>
</div> </div>
@else @else
<div class="flex items-center justify-between gap-3"> {{-- Tenant list --}}
<div class="text-sm text-gray-600 dark:text-gray-300"> <div class="mx-auto max-w-3xl">
{{ $tenants->count() }} managed tenant{{ $tenants->count() === 1 ? '' : 's' }} {{-- Header row --}}
<div class="mb-6 flex items-center justify-between">
<div class="flex items-center gap-2">
<div class="inline-flex items-center gap-1.5 rounded-full border border-gray-200 bg-gray-50 px-3 py-1 text-xs font-medium text-gray-600 dark:border-white/10 dark:bg-white/5 dark:text-gray-400">
<x-filament::icon icon="heroicon-m-building-office-2" class="h-3.5 w-3.5" />
{{ $this->workspace->name }}
</div>
<span class="text-sm text-gray-500 dark:text-gray-400">
&middot; {{ $tenants->count() }} {{ \Illuminate\Support\Str::plural('tenant', $tenants->count()) }}
</span>
</div> </div>
<x-filament::button <x-filament::button
type="button"
color="gray" color="gray"
size="sm"
wire:click="goToChooseTenant" wire:click="goToChooseTenant"
icon="heroicon-m-arrow-right"
icon-position="after"
> >
Choose tenant Choose tenant
</x-filament::button> </x-filament::button>
</div> </div>
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3"> {{-- Tenant cards --}}
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-{{ min($tenants->count(), 3) }}">
@foreach ($tenants as $tenant) @foreach ($tenants as $tenant)
<div wire:key="tenant-{{ $tenant->id }}" class="rounded-lg border border-gray-200 p-4 dark:border-gray-800"> <button
<div class="flex flex-col gap-3"> type="button"
<div class="font-medium text-gray-900 dark:text-gray-100"> wire:key="tenant-{{ $tenant->id }}"
{{ $tenant->name }} wire:click="openTenant({{ (int) $tenant->id }})"
class="group relative flex flex-col rounded-xl border border-gray-200 bg-white p-5 text-left shadow-sm transition-all duration-150 hover:border-gray-300 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:border-white/10 dark:bg-white/5 dark:hover:border-white/20 dark:focus:ring-offset-gray-900"
>
{{-- Loading overlay --}}
<div wire:loading wire:target="openTenant({{ (int) $tenant->id }})"
class="absolute inset-0 z-10 flex items-center justify-center rounded-xl bg-white/80 dark:bg-gray-900/80">
<x-filament::loading-indicator class="h-5 w-5 text-primary-500" />
</div> </div>
<x-filament::button <div class="flex items-start gap-3">
type="button" <div class="flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-gray-100 group-hover:bg-gray-200 dark:bg-white/10 dark:group-hover:bg-white/15">
color="primary" <x-filament::icon
wire:click="openTenant({{ (int) $tenant->id }})" icon="heroicon-o-server-stack"
> class="h-5 w-5 text-gray-500 group-hover:text-gray-600 dark:text-gray-400 dark:group-hover:text-gray-300"
Open />
</x-filament::button> </div>
<div class="min-w-0 flex-1">
<h3 class="truncate text-sm font-semibold text-gray-900 dark:text-white">
{{ $tenant->name }}
</h3>
<p class="mt-0.5 truncate text-xs text-gray-500 dark:text-gray-400">
{{ $tenant->external_id ?? 'No external ID' }}
</p>
</div> </div>
</div> </div>
{{-- Hover arrow --}}
<div class="absolute right-4 top-5 opacity-0 transition-opacity group-hover:opacity-100">
<x-filament::icon
icon="heroicon-m-arrow-right"
class="h-4 w-4 text-gray-400 dark:text-gray-500"
/>
</div>
</button>
@endforeach @endforeach
</div> </div>
@endif
{{-- Footer links --}}
<div class="mt-6 flex items-center justify-center gap-6">
<a href="{{ route('admin.onboarding') }}"
class="inline-flex items-center gap-1.5 text-sm text-gray-500 transition-colors hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200">
<x-filament::icon icon="heroicon-m-plus" class="h-4 w-4" />
Add tenant
</a>
<a href="{{ route('filament.admin.pages.choose-workspace') }}"
class="inline-flex items-center gap-1.5 text-sm text-gray-500 transition-colors hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200">
<x-filament::icon icon="heroicon-m-arrows-right-left" class="h-4 w-4" />
Switch workspace
</a>
</div> </div>
</x-filament::section> </div>
@endif
</x-filament-panels::page> </x-filament-panels::page>