## Summary - retire the tenant panel runtime and converge operator routing on the workspace-first admin shell - update tenant, operations, and required-permissions navigation helpers to use canonical workspace-scoped URLs - repair the focused feature coverage, add the Spec 280 browser smoke, and record the implementation close-out in the requirements checklist ## Validation - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/WorkspaceFoundation tests/Feature/Workspaces tests/Feature/ManagedEnvironment tests/Feature/RequiredPermissions tests/Feature/Operations tests/Feature/MonitoringOperationsTest.php` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Browser/Spec280WorkspaceTenancyEnvironmentRoutingSmokeTest.php` - `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` ## Note - `origin/platform` is not present on the remote; `platform-dev` is the clean base branch that limits this PR to the Spec 280 prep commit plus the implementation commit. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #340
84 lines
2.3 KiB
PHP
84 lines
2.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Filament\Concerns;
|
|
|
|
use App\Models\ManagedEnvironment;
|
|
use App\Support\OperateHub\OperateHubShell;
|
|
use Filament\Facades\Filament;
|
|
use RuntimeException;
|
|
|
|
trait ResolvesPanelTenantContext
|
|
{
|
|
protected static function resolveTenantContextForCurrentPanel(): ?ManagedEnvironment
|
|
{
|
|
$request = request();
|
|
|
|
if (static::currentPanelId($request) === 'admin') {
|
|
$tenant = app(OperateHubShell::class)->tenantOwnedPanelContext(request());
|
|
|
|
return $tenant instanceof ManagedEnvironment ? $tenant : null;
|
|
}
|
|
|
|
$tenant = ManagedEnvironment::current();
|
|
|
|
return $tenant instanceof ManagedEnvironment ? $tenant : null;
|
|
}
|
|
|
|
public static function panelTenantContext(): ?ManagedEnvironment
|
|
{
|
|
return static::resolveTenantContextForCurrentPanel();
|
|
}
|
|
|
|
public static function trustedPanelTenantContext(): ?ManagedEnvironment
|
|
{
|
|
return static::panelTenantContext();
|
|
}
|
|
|
|
protected static function resolveTenantContextForCurrentPanelOrFail(): ManagedEnvironment
|
|
{
|
|
$tenant = static::resolveTenantContextForCurrentPanel();
|
|
|
|
if (! $tenant instanceof ManagedEnvironment) {
|
|
throw new RuntimeException('No tenant context selected.');
|
|
}
|
|
|
|
return $tenant;
|
|
}
|
|
|
|
protected static function resolveTrustedPanelTenantContextOrFail(): ManagedEnvironment
|
|
{
|
|
return static::resolveTenantContextForCurrentPanelOrFail();
|
|
}
|
|
|
|
private static function currentPanelId(mixed $request): ?string
|
|
{
|
|
$panelId = Filament::getCurrentPanel()?->getId();
|
|
|
|
if (is_string($panelId) && $panelId !== '') {
|
|
return $panelId;
|
|
}
|
|
|
|
$routeName = is_object($request) && method_exists($request, 'route')
|
|
? $request->route()?->getName()
|
|
: null;
|
|
|
|
if (is_string($routeName) && $routeName !== '') {
|
|
if (str_contains($routeName, '.admin.')) {
|
|
return 'admin';
|
|
}
|
|
}
|
|
|
|
$path = is_object($request) && method_exists($request, 'path')
|
|
? '/'.ltrim((string) $request->path(), '/')
|
|
: null;
|
|
|
|
if (is_string($path) && str_starts_with($path, '/admin/')) {
|
|
return 'admin';
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|