Skip to content
This repository was archived by the owner on Feb 14, 2026. It is now read-only.

Commit 1c7351f

Browse files
Merge pull request #312 from CodeWithDennis/add-sortable-test
Add sortable test
2 parents ffef754 + 6414ab8 commit 1c7351f

File tree

8 files changed

+75
-15
lines changed

8 files changed

+75
-15
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
it('can sort `:dataset` column', function (string $column): void {
2+
$records = {{ $getResourceModel() }}::factory(3)->create();
3+
4+
livewire({{ $getPageClass('index') }}::class)
5+
@if($isResourceTableLoadingGloballyDeferred())->loadTable()@endif
6+
->sortTable($column)
7+
->assertCanSeeTableRecords($records->sortBy($column), inOrder: true)
8+
->sortTable($column, 'desc')
9+
->assertCanSeeTableRecords($records->sortByDesc($column), inOrder: true);
10+
})->with([@foreach ($getResourceTableSortableColumnKeys() as $column)'{{ $column }}',@endforeach]);

resources/views/table-column-sorting.blade.php

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/Commands/FilamentTestsCommand.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,22 @@
1111
use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\CanNotRenderColumnTest;
1212
use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\CanRenderColumnTest;
1313
use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\CanRenderIndexPageTest;
14+
use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\CanSortColumnTest;
1415
use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\HasColumnTest;
1516
use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\HidesColumnTest;
1617
use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\ShowsColumnTest;
1718
use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\View\CanRenderViewPageTest;
1819
use Illuminate\Console\Command;
20+
use Illuminate\Support\Collection;
1921

2022
class FilamentTestsCommand extends Command
2123
{
24+
protected Collection $panels;
25+
26+
protected Collection $resources;
27+
28+
protected bool $tableLoadingGloballyDeferred = false;
29+
2230
use InteractsWithFilesystem;
2331
use InteractsWithUserInput;
2432

@@ -32,6 +40,7 @@ public function handle(): void
3240
{
3341
$this->panels = $this->askUserToSelectPanels();
3442
$this->resources = $this->askUserToSelectResourcesFromTheSelectedPanels();
43+
$this->tableLoadingGloballyDeferred = $this->askUserIfTableLoadingIsGloballyDeferred();
3544

3645
$this->generateTests();
3746
$this->showGenerationSummary();
@@ -54,6 +63,7 @@ protected function getRenderers(): array
5463
HasColumnTest::class,
5564
ShowsColumnTest::class,
5665
HidesColumnTest::class,
66+
CanSortColumnTest::class,
5767
];
5868
}
5969
}

src/Concerns/Commands/InteractsWithFilesystem.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ protected function renderTestsForResource(string $resource): array
8484
$output = $renderers
8585
->map(fn (string $renderer) =>
8686
/** @var BaseTest $renderer */
87-
$renderer::build($resource)->render())
87+
$renderer::build($resource)->tableLoadingGloballyDeferred($this->tableLoadingGloballyDeferred)->render())
8888
->prepend('<?php')
8989
->implode("\n\n");
9090

src/Concerns/Commands/InteractsWithUserInput.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@
77
use Illuminate\Support\Collection;
88

99
use function Laravel\Prompts\multiselect;
10+
use function Laravel\Prompts\select;
1011

1112
trait InteractsWithUserInput
1213
{
13-
protected Collection $panels;
14-
15-
protected Collection $resources;
16-
1714
protected function getSelectedPanels(): Collection
1815
{
1916
return $this->panels ??= collect();
@@ -68,4 +65,17 @@ protected function askUserToSelectResourcesFromTheSelectedPanels(): Collection
6865

6966
return $selectedResources;
7067
}
68+
69+
protected function askUserIfTableLoadingIsGloballyDeferred(): bool
70+
{
71+
return (bool) select(
72+
label: 'Do you globally defer table loading in your Filament app?',
73+
options: [
74+
1 => 'Yes',
75+
0 => 'No',
76+
],
77+
hint: 'If you set `deferLoading` individually on your resource tables, you can select "No" here.',
78+
required: true,
79+
);
80+
}
7181
}

src/Concerns/Resources/InteractsWithTables.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ public function getResourceTableSortableColumns(): Collection
8686
->filter(fn (Column $column): bool => $column->isSortable());
8787
}
8888

89+
public function getResourceTableSortableColumnKeys(): array
90+
{
91+
return $this->getResourceTableColumnKeysFrom($this->getResourceTableSortableColumns());
92+
}
93+
8994
public function getResourceTableActions(): array
9095
{
9196
return $this->getResourceTable()->getRecordActions();
@@ -95,4 +100,9 @@ public function getResourceTableVisibleActions(): array
95100
{
96101
return array_filter($this->getResourceTableActions(), fn (Action $action): bool => ! $this->getPrivateProperty($action, 'isHidden'));
97102
}
103+
104+
public function isResourceTableLoadingGloballyDeferred(): bool
105+
{
106+
return $this->isTableLoadingGlobalyDeferred() ?: $this->getResourceTable()->isLoadingDeferred();
107+
}
98108
}

src/TestRenderers/BaseTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,29 @@ abstract class BaseTest implements HasFilamentResources
1414
use ExposesPublicMethodsToViews;
1515
use InteractsWithResources;
1616

17+
public bool $tableLoadingGloballyDeferred = false;
18+
1719
public function __construct(
1820
public ?string $resourceClass = null,
1921
) {}
2022

23+
public function tableLoadingGloballyDeferred(bool $tableLoadingGloballyDeferred): static
24+
{
25+
$this->tableLoadingGloballyDeferred = $tableLoadingGloballyDeferred;
26+
27+
return $this;
28+
}
29+
2130
public static function build(string $resourceClass): static
2231
{
2332
return new static($resourceClass);
2433
}
2534

35+
public function isTableLoadingGlobalyDeferred(): bool
36+
{
37+
return $this->tableLoadingGloballyDeferred;
38+
}
39+
2640
public function getResourceClass(): ?string
2741
{
2842
return $this->resourceClass;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index;
4+
5+
use CodeWithDennis\FilamentTests\TestRenderers\BaseTest;
6+
7+
class CanSortColumnTest extends BaseTest
8+
{
9+
public ?string $view = 'filament-tests::resources.pages.index.can-sort-column';
10+
11+
public function getShouldRender(): bool
12+
{
13+
return $this->hasPage('index')
14+
&& $this->getResourceTableSortableColumns()->isNotEmpty();
15+
}
16+
}

0 commit comments

Comments
 (0)