From bcc5a3ae794b7a92829983838b7ddce93250d733 Mon Sep 17 00:00:00 2001 From: paulhennell Date: Wed, 8 Apr 2026 18:44:08 +0100 Subject: [PATCH] Adding filament style hidden option to columns --- src/Column.php | 2 ++ src/Concerns/CanBeHidden.php | 42 ++++++++++++++++++++++++ src/Concerns/HasBoardColumns.php | 2 +- tests/Feature/LivewireBoardTest.php | 11 ++++++- tests/Fixtures/TestBoard.php | 3 ++ tests/Fixtures/TestStandaloneBoard.php | 3 ++ tests/Standalone/StandaloneBoardTest.php | 11 ++++++- 7 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 src/Concerns/CanBeHidden.php diff --git a/src/Column.php b/src/Column.php index 2b2b82c35..88328c178 100644 --- a/src/Column.php +++ b/src/Column.php @@ -13,10 +13,12 @@ use Filament\Support\Concerns\HasIconPosition; use Illuminate\Contracts\Support\Htmlable; use Relaticle\Flowforge\Concerns\BelongsToBoard; +use Relaticle\Flowforge\Concerns\CanBeHidden; class Column extends ViewComponent { use BelongsToBoard; + use CanBeHidden; use HasColor; use HasIcon; use HasIconColor; diff --git a/src/Concerns/CanBeHidden.php b/src/Concerns/CanBeHidden.php new file mode 100644 index 000000000..e2dc8ace9 --- /dev/null +++ b/src/Concerns/CanBeHidden.php @@ -0,0 +1,42 @@ +isHidden = $condition; + + return $this; + } + + public function visible(bool | Closure $condition = true): static + { + $this->isVisible = $condition; + + return $this; + } + + public function isHidden(): bool + { + if ($this->evaluate($this->isHidden)) { + return true; + } + + return ! $this->evaluate($this->isVisible); + } + + public function isVisible(): bool + { + return ! $this->isHidden(); + } +} diff --git a/src/Concerns/HasBoardColumns.php b/src/Concerns/HasBoardColumns.php index d9ff4cd6c..f6cc3ad2f 100644 --- a/src/Concerns/HasBoardColumns.php +++ b/src/Concerns/HasBoardColumns.php @@ -38,7 +38,7 @@ public function columns(array | Closure $columns): static */ public function getColumns(): array { - return $this->columns; + return array_filter($this->columns, fn (Column $column) => $column->isVisible()); } /** diff --git a/tests/Feature/LivewireBoardTest.php b/tests/Feature/LivewireBoardTest.php index 9b1df2ac0..0040310ac 100644 --- a/tests/Feature/LivewireBoardTest.php +++ b/tests/Feature/LivewireBoardTest.php @@ -13,7 +13,16 @@ ->assertStatus(200) ->assertSee('To Do') ->assertSee('In Progress') - ->assertSee('Completed'); + ->assertSee('Completed') + ->assertDontSee('Hidden Column'); + }); + + test('renders board with unhidden column', function () { + Livewire::test(TestBoard::class) + ->assertStatus(200) + ->assertDontSee('Hidden Column') + ->set('showAllColumns', true) + ->assertSee('Hidden Column'); }); test('displays cards in correct columns', function () { diff --git a/tests/Fixtures/TestBoard.php b/tests/Fixtures/TestBoard.php index c5fcead83..bac5a0ac0 100644 --- a/tests/Fixtures/TestBoard.php +++ b/tests/Fixtures/TestBoard.php @@ -11,6 +11,8 @@ class TestBoard extends BoardPage { + public bool $showAllColumns = false; + public function getEloquentQuery(): Builder { return Task::query(); @@ -25,6 +27,7 @@ public function board(Board $board): Board ->positionIdentifier('order_position') ->columns([ Column::make('todo')->label('To Do')->color('gray'), + Column::make('hidden_column')->visible(fn () => $this->showAllColumns)->label('Hidden Column'), Column::make('in_progress')->label('In Progress')->color('blue'), Column::make('completed')->label('Completed')->color('green'), ]); diff --git a/tests/Fixtures/TestStandaloneBoard.php b/tests/Fixtures/TestStandaloneBoard.php index a182ab790..8bd2da6fd 100644 --- a/tests/Fixtures/TestStandaloneBoard.php +++ b/tests/Fixtures/TestStandaloneBoard.php @@ -25,6 +25,8 @@ class TestStandaloneBoard extends Component implements HasActions, HasBoard, Has } use InteractsWithForms; + public bool $showAllColumns = false; + public function board(Board $board): Board { return $board @@ -34,6 +36,7 @@ public function board(Board $board): Board ->positionIdentifier('order_position') ->columns([ Column::make('todo')->label('To Do')->color('gray'), + Column::make('hidden_column')->visible(fn () => $this->showAllColumns)->label('Hidden Column'), Column::make('in_progress')->label('In Progress')->color('blue'), Column::make('completed')->label('Completed')->color('green'), ]); diff --git a/tests/Standalone/StandaloneBoardTest.php b/tests/Standalone/StandaloneBoardTest.php index efb544e6f..409301903 100644 --- a/tests/Standalone/StandaloneBoardTest.php +++ b/tests/Standalone/StandaloneBoardTest.php @@ -16,7 +16,16 @@ ->assertStatus(200) ->assertSee('To Do') ->assertSee('In Progress') - ->assertSee('Completed'); + ->assertSee('Completed') + ->assertDontSee('Hidden Column'); + }); + + test('renders board with unhidden column', function () { + Livewire::test(TestStandaloneBoard::class) + ->assertStatus(200) + ->assertDontSee('Hidden Column') + ->set('showAllColumns', true) + ->assertSee('Hidden Column'); }); test('displays cards in correct columns', function () {