*/ protected function getHeaderActions(): array { return [ Action::make('createWorkspace') ->label('Create workspace') ->modalHeading('Create workspace') ->form([ TextInput::make('name') ->required() ->maxLength(255), TextInput::make('slug') ->helperText('Optional. Used in URLs if set.') ->maxLength(255) ->rules(['nullable', 'string', 'max:255', 'alpha_dash', 'unique:workspaces,slug']) ->dehydrateStateUsing(fn ($state) => filled($state) ? $state : null) ->dehydrated(fn ($state) => filled($state)), ]) ->action(fn (array $data) => $this->createWorkspace($data)), ]; } /** * @return Collection */ public function getWorkspaces(): Collection { $user = auth()->user(); if (! $user instanceof User) { return Workspace::query()->whereRaw('1 = 0')->get(); } return Workspace::query() ->whereIn('id', function ($query) use ($user): void { $query->from('workspace_memberships') ->select('workspace_id') ->where('user_id', $user->getKey()); }) ->whereNull('archived_at') ->orderBy('name') ->get(); } public function selectWorkspace(int $workspaceId): void { $user = auth()->user(); if (! $user instanceof User) { abort(403); } $workspace = Workspace::query()->whereKey($workspaceId)->first(); if (! $workspace instanceof Workspace) { abort(404); } if (! empty($workspace->archived_at)) { abort(404); } $context = app(WorkspaceContext::class); if (! $context->isMember($user, $workspace)) { abort(404); } $context->setCurrentWorkspace($workspace, $user, request()); $this->redirect($this->redirectAfterWorkspaceSelected($user)); } /** * @param array{name: string, slug?: string|null} $data */ public function createWorkspace(array $data): void { $user = auth()->user(); if (! $user instanceof User) { abort(403); } $workspace = Workspace::query()->create([ 'name' => $data['name'], 'slug' => $data['slug'] ?? null, ]); WorkspaceMembership::query()->create([ 'workspace_id' => $workspace->getKey(), 'user_id' => $user->getKey(), 'role' => 'owner', ]); app(WorkspaceContext::class)->setCurrentWorkspace($workspace, $user, request()); Notification::make() ->title('Workspace created') ->success() ->send(); $this->redirect($this->redirectAfterWorkspaceSelected($user)); } private function redirectAfterWorkspaceSelected(User $user): string { $workspaceId = app(WorkspaceContext::class)->currentWorkspaceId(); if ($workspaceId === null) { return self::getUrl(); } $workspace = Workspace::query()->whereKey($workspaceId)->first(); if (! $workspace instanceof Workspace) { return self::getUrl(); } $tenantsQuery = $user->tenants() ->where('workspace_id', $workspace->getKey()) ->where('status', 'active'); $tenantCount = (int) $tenantsQuery->count(); if ($tenantCount === 0) { return route('admin.workspace.managed-tenants.index', ['workspace' => $workspace->slug ?? $workspace->getKey()]); } if ($tenantCount === 1) { $tenant = $tenantsQuery->first(); if ($tenant !== null) { return TenantDashboard::getUrl(tenant: $tenant); } } return ChooseTenant::getUrl(); } }