Skip to content

Commit eb8e70f

Browse files
simonhampclaude
andauthored
Fix admin plugin list to show drafts when filtering by Draft status (#363)
The base query in ListPlugins unconditionally excluded drafts, so selecting "Draft" in the status filter produced conflicting WHERE clauses and returned no results. Moved the draft exclusion logic into the SelectFilter's custom query callback so drafts are hidden by default but visible when explicitly filtered. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 51d08cb commit eb8e70f

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
lines changed

app/Filament/Resources/PluginResource.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use Filament\Schemas\Schema;
2424
use Filament\Tables;
2525
use Filament\Tables\Table;
26+
use Illuminate\Database\Eloquent\Builder;
2627
use Illuminate\Support\HtmlString;
2728

2829
class PluginResource extends Resource
@@ -333,7 +334,11 @@ public static function table(Table $table): Table
333334
])
334335
->filters([
335336
Tables\Filters\SelectFilter::make('status')
336-
->options(PluginStatus::class),
337+
->options(PluginStatus::class)
338+
->query(fn (Builder $query, array $data): Builder => filled($data['value'])
339+
? $query->where('status', $data['value'])
340+
: $query->where('status', '!=', PluginStatus::Draft)
341+
),
337342
Tables\Filters\SelectFilter::make('type')
338343
->options(PluginType::class),
339344
Tables\Filters\TernaryFilter::make('is_official')

app/Filament/Resources/PluginResource/Pages/ListPlugins.php

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22

33
namespace App\Filament\Resources\PluginResource\Pages;
44

5-
use App\Enums\PluginStatus;
65
use App\Filament\Resources\PluginResource;
76
use Filament\Actions;
87
use Filament\Resources\Pages\ListRecords;
9-
use Illuminate\Database\Eloquent\Builder;
108

119
class ListPlugins extends ListRecords
1210
{
@@ -18,10 +16,4 @@ protected function getHeaderActions(): array
1816
Actions\CreateAction::make(),
1917
];
2018
}
21-
22-
protected function getTableQuery(): ?Builder
23-
{
24-
return parent::getTableQuery()
25-
->where('status', '!=', PluginStatus::Draft);
26-
}
2719
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace Tests\Feature\Filament;
4+
5+
use App\Enums\PluginStatus;
6+
use App\Filament\Resources\PluginResource\Pages\ListPlugins;
7+
use App\Models\Plugin;
8+
use App\Models\User;
9+
use Illuminate\Foundation\Testing\RefreshDatabase;
10+
use Livewire\Livewire;
11+
use Tests\TestCase;
12+
13+
class PluginListDraftFilterTest extends TestCase
14+
{
15+
use RefreshDatabase;
16+
17+
private User $admin;
18+
19+
protected function setUp(): void
20+
{
21+
parent::setUp();
22+
23+
$this->admin = User::factory()->create(['email' => 'admin@test.com']);
24+
config(['filament.users' => ['admin@test.com']]);
25+
}
26+
27+
public function test_draft_plugins_are_hidden_by_default(): void
28+
{
29+
$draft = Plugin::factory()->draft()->create();
30+
$approved = Plugin::factory()->approved()->create();
31+
32+
Livewire::actingAs($this->admin)
33+
->test(ListPlugins::class)
34+
->assertCanNotSeeTableRecords([$draft])
35+
->assertCanSeeTableRecords([$approved]);
36+
}
37+
38+
public function test_draft_plugins_are_visible_when_filtering_by_draft_status(): void
39+
{
40+
$draft = Plugin::factory()->draft()->create();
41+
$approved = Plugin::factory()->approved()->create();
42+
43+
Livewire::actingAs($this->admin)
44+
->test(ListPlugins::class)
45+
->filterTable('status', PluginStatus::Draft->value)
46+
->assertCanSeeTableRecords([$draft])
47+
->assertCanNotSeeTableRecords([$approved]);
48+
}
49+
}

0 commit comments

Comments
 (0)