diff --git a/src/Column.php b/src/Column.php index 2b2b82c3..88328c17 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 00000000..e2dc8ace --- /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 d9ff4cd6..f6cc3ad2 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 9b1df2ac..0040310a 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 c5fcead8..bac5a0ac 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 a182ab79..8bd2da6f 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 efb544e6..40930190 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 () {