diff --git a/packages/panels/routes/web.php b/packages/panels/routes/web.php index 0252ac197a..ec385a6f2f 100644 --- a/packages/panels/routes/web.php +++ b/packages/panels/routes/web.php @@ -175,7 +175,7 @@ Route::name('filament.') Filament::setCurrentResourceConfigurationKey(null); } - $rootUri = trim(Route::getLastGroupPrefix(), '/') ?: '/'; + $rootUri = preg_replace('/\{(\w+):\w+\}/', '{$1}', trim(Route::getLastGroupPrefix(), '/')) ?: '/'; $groupStack = Route::getGroupStack(); $rootKey = (end($groupStack)['domain'] ?? '') . $rootUri; diff --git a/tests/.pest/snapshots/src/Panels/Commands/Legacy/LegacyMakePageCommandTest/it_can_generate_a_manage_related_records_page_class_in_a_resource_with_a_generated_form_schema_and_table_columns.snap b/tests/.pest/snapshots/src/Panels/Commands/Legacy/LegacyMakePageCommandTest/it_can_generate_a_manage_related_records_page_class_in_a_resource_with_a_generated_form_schema_and_table_columns.snap index e38f475ed1..d2295e358c 100644 --- a/tests/.pest/snapshots/src/Panels/Commands/Legacy/LegacyMakePageCommandTest/it_can_generate_a_manage_related_records_page_class_in_a_resource_with_a_generated_form_schema_and_table_columns.snap +++ b/tests/.pest/snapshots/src/Panels/Commands/Legacy/LegacyMakePageCommandTest/it_can_generate_a_manage_related_records_page_class_in_a_resource_with_a_generated_form_schema_and_table_columns.snap @@ -26,6 +26,7 @@ class ManageUserTeams extends ManageRelatedRecords ->components([ Forms\Components\TextInput::make('name') ->required(), + Forms\Components\TextInput::make('slug'), Forms\Components\Textarea::make('description') ->columnSpanFull(), Forms\Components\TextInput::make('budget') @@ -44,6 +45,8 @@ class ManageUserTeams extends ManageRelatedRecords ->columns([ Tables\Columns\TextColumn::make('name') ->searchable(), + Tables\Columns\TextColumn::make('slug') + ->searchable(), Tables\Columns\TextColumn::make('budget') ->numeric() ->sortable(), diff --git a/tests/.pest/snapshots/src/Panels/Commands/Legacy/LegacyMakeRelationManagerCommandTest/it_can_generate_a_relation_manager_with_a_generated_form_schema_and_table_columns.snap b/tests/.pest/snapshots/src/Panels/Commands/Legacy/LegacyMakeRelationManagerCommandTest/it_can_generate_a_relation_manager_with_a_generated_form_schema_and_table_columns.snap index 2f45f893e0..a29a0c7330 100644 --- a/tests/.pest/snapshots/src/Panels/Commands/Legacy/LegacyMakeRelationManagerCommandTest/it_can_generate_a_relation_manager_with_a_generated_form_schema_and_table_columns.snap +++ b/tests/.pest/snapshots/src/Panels/Commands/Legacy/LegacyMakeRelationManagerCommandTest/it_can_generate_a_relation_manager_with_a_generated_form_schema_and_table_columns.snap @@ -19,6 +19,7 @@ class TeamsRelationManager extends RelationManager ->components([ Forms\Components\TextInput::make('name') ->required(), + Forms\Components\TextInput::make('slug'), Forms\Components\Textarea::make('description') ->columnSpanFull(), Forms\Components\TextInput::make('budget') @@ -37,6 +38,8 @@ class TeamsRelationManager extends RelationManager ->columns([ Tables\Columns\TextColumn::make('name') ->searchable(), + Tables\Columns\TextColumn::make('slug') + ->searchable(), Tables\Columns\TextColumn::make('budget') ->numeric() ->sortable(), diff --git a/tests/.pest/snapshots/src/Panels/Commands/MakePageCommandTest/it_can_generate_a_manage_related_records_page_class_in_a_resource_with_a_generated_form_schema_and_table_columns.snap b/tests/.pest/snapshots/src/Panels/Commands/MakePageCommandTest/it_can_generate_a_manage_related_records_page_class_in_a_resource_with_a_generated_form_schema_and_table_columns.snap index f0437bd63b..de32be6649 100644 --- a/tests/.pest/snapshots/src/Panels/Commands/MakePageCommandTest/it_can_generate_a_manage_related_records_page_class_in_a_resource_with_a_generated_form_schema_and_table_columns.snap +++ b/tests/.pest/snapshots/src/Panels/Commands/MakePageCommandTest/it_can_generate_a_manage_related_records_page_class_in_a_resource_with_a_generated_form_schema_and_table_columns.snap @@ -35,6 +35,7 @@ class ManageUserTeams extends ManageRelatedRecords ->components([ TextInput::make('name') ->required(), + TextInput::make('slug'), Textarea::make('description') ->columnSpanFull(), TextInput::make('budget') @@ -53,6 +54,8 @@ class ManageUserTeams extends ManageRelatedRecords ->columns([ TextColumn::make('name') ->searchable(), + TextColumn::make('slug') + ->searchable(), TextColumn::make('budget') ->numeric() ->sortable(), diff --git a/tests/.pest/snapshots/src/Panels/Commands/MakeRelationManagerCommandTest/it_can_generate_a_relation_manager_with_a_generated_form_schema_and_table_columns.snap b/tests/.pest/snapshots/src/Panels/Commands/MakeRelationManagerCommandTest/it_can_generate_a_relation_manager_with_a_generated_form_schema_and_table_columns.snap index 6001a9b25a..3a74547eb8 100644 --- a/tests/.pest/snapshots/src/Panels/Commands/MakeRelationManagerCommandTest/it_can_generate_a_relation_manager_with_a_generated_form_schema_and_table_columns.snap +++ b/tests/.pest/snapshots/src/Panels/Commands/MakeRelationManagerCommandTest/it_can_generate_a_relation_manager_with_a_generated_form_schema_and_table_columns.snap @@ -28,6 +28,7 @@ class TeamsRelationManager extends RelationManager ->components([ TextInput::make('name') ->required(), + TextInput::make('slug'), Textarea::make('description') ->columnSpanFull(), TextInput::make('budget') @@ -46,6 +47,8 @@ class TeamsRelationManager extends RelationManager ->columns([ TextColumn::make('name') ->searchable(), + TextColumn::make('slug') + ->searchable(), TextColumn::make('budget') ->numeric() ->sortable(), diff --git a/tests/database/factories/TeamFactory.php b/tests/database/factories/TeamFactory.php index cdecd93929..ee86b6a7c6 100644 --- a/tests/database/factories/TeamFactory.php +++ b/tests/database/factories/TeamFactory.php @@ -13,6 +13,7 @@ class TeamFactory extends Factory { return [ 'name' => $this->faker->company(), + 'slug' => $this->faker->unique()->slug(), 'description' => $this->faker->sentence(), ]; } diff --git a/tests/database/migrations/0001_create_teams_table.php b/tests/database/migrations/0001_create_teams_table.php index 05d54ffc18..781c4e9be6 100644 --- a/tests/database/migrations/0001_create_teams_table.php +++ b/tests/database/migrations/0001_create_teams_table.php @@ -11,6 +11,7 @@ return new class extends Migration Schema::create('teams', function (Blueprint $table): void { $table->id(); $table->string('name'); + $table->string('slug')->unique()->nullable(); $table->text('description')->nullable(); $table->decimal('budget', 10, 2)->default(0); $table->foreignId('company_id')->nullable(); diff --git a/tests/src/Fixtures/Providers/SlugTenancyPanelProvider.php b/tests/src/Fixtures/Providers/SlugTenancyPanelProvider.php new file mode 100644 index 0000000000..d0d4a8e937 --- /dev/null +++ b/tests/src/Fixtures/Providers/SlugTenancyPanelProvider.php @@ -0,0 +1,50 @@ +id('slug-tenancy') + ->path('slug-tenancy') + ->tenant(Team::class, 'slug') + ->login() + ->pages([ + Pages\Dashboard::class, + ]) + ->middleware([ + EncryptCookies::class, + AddQueuedCookiesToResponse::class, + StartSession::class, + AuthenticateSession::class, + ShareErrorsFromSession::class, + class_exists(PreventRequestForgery::class) ? PreventRequestForgery::class : VerifyCsrfToken::class, + SubstituteBindings::class, + DisableBladeIconComponents::class, + DispatchServingFilamentEvent::class, + IdentifyTenant::class, + ]) + ->authMiddleware([ + Authenticate::class, + ]); + } +} diff --git a/tests/src/Panels/Routes/TenantSlugAttributeTest.php b/tests/src/Panels/Routes/TenantSlugAttributeTest.php new file mode 100644 index 0000000000..8ceb04675d --- /dev/null +++ b/tests/src/Panels/Routes/TenantSlugAttributeTest.php @@ -0,0 +1,17 @@ +getByName('filament.slug-tenancy.pages.dashboard'); + + expect($route)->not->toBeNull() + ->and($route->uri())->toBe('slug-tenancy/{tenant}'); +}); + +it('does not register the home redirect when the dashboard occupies the root path with a tenant slug attribute', function (): void { + expect(Route::getRoutes()->getByName('filament.slug-tenancy.home'))->toBeNull(); +}); diff --git a/tests/src/TestCase.php b/tests/src/TestCase.php index d1b6f52a5a..7bc6f2c4c4 100644 --- a/tests/src/TestCase.php +++ b/tests/src/TestCase.php @@ -29,6 +29,7 @@ use Filament\Tests\Fixtures\Providers\Fixtures\Providers\SingleDomainPanel; use Filament\Tests\Fixtures\Providers\MultiDomainPanel; use Filament\Tests\Fixtures\Providers\RequiredMultiFactorAuthenticationPanelProvider; use Filament\Tests\Fixtures\Providers\SlugsPanelProvider; +use Filament\Tests\Fixtures\Providers\SlugTenancyPanelProvider; use Filament\Tests\Fixtures\Providers\TenancyPanelProvider; use Filament\Widgets\WidgetsServiceProvider; use Illuminate\Foundation\Testing\RefreshDatabase; @@ -72,6 +73,7 @@ abstract class TestCase extends BaseTestCase MultiDomainPanel::class, SingleDomainPanel::class, SlugsPanelProvider::class, + SlugTenancyPanelProvider::class, TenancyPanelProvider::class, PowerJoinsServiceProvider::class, ];