From 18c84b5a2683017216789b0753f6d6b896a64aa4 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Sun, 17 Mar 2024 20:45:09 +0000 Subject: [PATCH] fix: Actions inheriting props from groups --- packages/actions/src/ActionGroup.php | 35 +++++++++++++------ .../actions/src/Concerns/BelongsToGroup.php | 22 ++++++++++++ .../src/Concerns/BelongsToLivewire.php | 14 +++++++- packages/actions/src/Concerns/CanBeHidden.php | 9 +++++ .../src/Concerns/InteractsWithRecord.php | 15 +++++++- .../actions/src/Contracts/HasLivewire.php | 2 ++ packages/actions/src/StaticAction.php | 1 + packages/tables/src/Actions/ActionGroup.php | 34 ++++++++---------- .../src/Actions/Concerns/BelongsToTable.php | 14 +++++++- .../tables/src/Actions/Contracts/HasTable.php | 2 ++ 10 files changed, 115 insertions(+), 33 deletions(-) create mode 100644 packages/actions/src/Concerns/BelongsToGroup.php diff --git a/packages/actions/src/ActionGroup.php b/packages/actions/src/ActionGroup.php index b9cb2de4e9..055a0ab06c 100644 --- a/packages/actions/src/ActionGroup.php +++ b/packages/actions/src/ActionGroup.php @@ -2,6 +2,7 @@ namespace Filament\Actions; +use Exception; use Filament\Actions\Contracts\HasLivewire; use Filament\Support\Components\ViewComponent; use Filament\Support\Concerns\HasBadge; @@ -13,6 +14,7 @@ use Livewire\Component; class ActionGroup extends ViewComponent implements HasLivewire { + use Concerns\BelongsToGroup; use Concerns\CanBeHidden { isHidden as baseIsHidden; } @@ -50,6 +52,8 @@ class ActionGroup extends ViewComponent implements HasLivewire */ protected array $flatActions; + protected Component $livewire; + protected string $evaluationIdentifier = 'group'; protected string $viewIdentifier = 'group'; @@ -89,6 +93,8 @@ class ActionGroup extends ViewComponent implements HasLivewire $this->flatActions = []; foreach ($actions as $action) { + $action->group($this); + if ($action instanceof ActionGroup) { $action->dropdownPlacement('right-top'); @@ -148,17 +154,26 @@ class ActionGroup extends ViewComponent implements HasLivewire public function livewire(Component $livewire): static { - foreach ($this->actions as $action) { - if (! $action instanceof HasLivewire) { - continue; - } - - $action->livewire($livewire); - } + $this->livewire = $livewire; return $this; } + public function getLivewire(): object + { + if (isset($this->livewire)) { + return $this->livewire; + } + + $group = $this->getGroup(); + + if (! ($group instanceof HasLivewire)) { + throw new Exception('This action group does not belong to a Livewire component.'); + } + + return $group->getLivewire(); + } + public function getLabel(): string { $label = $this->evaluate($this->label) ?? __('filament-actions::group.trigger.label'); @@ -192,14 +207,12 @@ class ActionGroup extends ViewComponent implements HasLivewire public function isHidden(): bool { - $condition = $this->baseIsHidden(); - - if ($condition) { + if ($this->baseIsHidden()) { return true; } foreach ($this->getActions() as $action) { - if ($action->isHidden()) { + if ($action->isHiddenInGroup()) { continue; } diff --git a/packages/actions/src/Concerns/BelongsToGroup.php b/packages/actions/src/Concerns/BelongsToGroup.php new file mode 100644 index 0000000000..55ad0c033c --- /dev/null +++ b/packages/actions/src/Concerns/BelongsToGroup.php @@ -0,0 +1,22 @@ +group = $group; + + return $this; + } + + public function getGroup(): ?ActionGroup + { + return $this->group; + } +} diff --git a/packages/actions/src/Concerns/BelongsToLivewire.php b/packages/actions/src/Concerns/BelongsToLivewire.php index ecd188a3df..8aac00fa32 100644 --- a/packages/actions/src/Concerns/BelongsToLivewire.php +++ b/packages/actions/src/Concerns/BelongsToLivewire.php @@ -2,6 +2,8 @@ namespace Filament\Actions\Concerns; +use Exception; +use Filament\Actions\Contracts\HasLivewire; use Livewire\Component; trait BelongsToLivewire @@ -17,6 +19,16 @@ trait BelongsToLivewire public function getLivewire(): object { - return $this->livewire; + if (isset($this->livewire)) { + return $this->livewire; + } + + $group = $this->getGroup(); + + if (! ($group instanceof HasLivewire)) { + throw new Exception('This action does not belong to a Livewire component.'); + } + + return $group->getLivewire(); } } diff --git a/packages/actions/src/Concerns/CanBeHidden.php b/packages/actions/src/Concerns/CanBeHidden.php index 73e70e92d8..e8c16365ff 100644 --- a/packages/actions/src/Concerns/CanBeHidden.php +++ b/packages/actions/src/Concerns/CanBeHidden.php @@ -93,6 +93,15 @@ trait CanBeHidden } public function isHidden(): bool + { + if ($this->getGroup()?->isHidden()) { + return true; + } + + return $this->isHiddenInGroup(); + } + + public function isHiddenInGroup(): bool { if ($this->evaluate($this->isHidden)) { return true; diff --git a/packages/actions/src/Concerns/InteractsWithRecord.php b/packages/actions/src/Concerns/InteractsWithRecord.php index d589808811..9822815418 100644 --- a/packages/actions/src/Concerns/InteractsWithRecord.php +++ b/packages/actions/src/Concerns/InteractsWithRecord.php @@ -3,6 +3,7 @@ namespace Filament\Actions\Concerns; use Closure; +use Filament\Actions\Contracts\HasRecord; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; @@ -67,7 +68,19 @@ trait InteractsWithRecord public function getRecord(): ?Model { - return $this->evaluate($this->record); + $record = $this->evaluate($this->record); + + if ($record) { + return $record; + } + + $group = $this->getGroup(); + + if (! ($group instanceof HasRecord)) { + return null; + } + + return $group->getRecord(); } public function getRecordTitle(?Model $record = null): ?string diff --git a/packages/actions/src/Contracts/HasLivewire.php b/packages/actions/src/Contracts/HasLivewire.php index eb87fafc20..6c5e720e74 100644 --- a/packages/actions/src/Contracts/HasLivewire.php +++ b/packages/actions/src/Contracts/HasLivewire.php @@ -7,4 +7,6 @@ use Livewire\Component; interface HasLivewire { public function livewire(Component $livewire): static; + + public function getLivewire(): object; } diff --git a/packages/actions/src/StaticAction.php b/packages/actions/src/StaticAction.php index c3a04988b7..dbeb031f44 100644 --- a/packages/actions/src/StaticAction.php +++ b/packages/actions/src/StaticAction.php @@ -13,6 +13,7 @@ use Illuminate\Support\Traits\Conditionable; class StaticAction extends ViewComponent { + use Concerns\BelongsToGroup; use Concerns\CanBeDisabled; use Concerns\CanBeHidden; use Concerns\CanBeLabeledFrom; diff --git a/packages/tables/src/Actions/ActionGroup.php b/packages/tables/src/Actions/ActionGroup.php index 12cbeb2e3d..540d2361f3 100644 --- a/packages/tables/src/Actions/ActionGroup.php +++ b/packages/tables/src/Actions/ActionGroup.php @@ -2,7 +2,7 @@ namespace Filament\Tables\Actions; -use Closure; +use Exception; use Filament\Actions\ActionGroup as BaseActionGroup; use Filament\Actions\Concerns\InteractsWithRecord; use Filament\Actions\Contracts\HasRecord; @@ -17,32 +17,28 @@ class ActionGroup extends BaseActionGroup implements HasRecord, HasTable { use InteractsWithRecord; - public function record(Model | Closure | null $record): static + protected Table $table; + + public function table(Table $table): static { - $this->record = $record; - - foreach ($this->actions as $action) { - if (! $action instanceof HasRecord) { - continue; - } - - $action->record($record); - } + $this->table = $table; return $this; } - public function table(Table $table): static + public function getTable(): Table { - foreach ($this->actions as $action) { - if (! $action instanceof HasTable) { - continue; - } - - $action->table($table); + if (isset($this->table)) { + return $this->table; } - return $this; + $group = $this->getGroup(); + + if (! ($group instanceof HasTable)) { + throw new Exception('This action does not belong to a table.'); + } + + return $group->getTable(); } /** diff --git a/packages/tables/src/Actions/Concerns/BelongsToTable.php b/packages/tables/src/Actions/Concerns/BelongsToTable.php index bb97c8ee14..7547ba088c 100644 --- a/packages/tables/src/Actions/Concerns/BelongsToTable.php +++ b/packages/tables/src/Actions/Concerns/BelongsToTable.php @@ -2,6 +2,8 @@ namespace Filament\Tables\Actions\Concerns; +use Exception; +use Filament\Tables\Actions\Contracts\HasTable as ActionHasTable; use Filament\Tables\Contracts\HasTable; use Filament\Tables\Table; @@ -18,7 +20,17 @@ trait BelongsToTable public function getTable(): Table { - return $this->table; + if (isset($this->table)) { + return $this->table; + } + + $group = $this->getGroup(); + + if (! ($group instanceof ActionHasTable)) { + throw new Exception('This action does not belong to a table.'); + } + + return $group->getTable(); } public function getLivewire(): HasTable diff --git a/packages/tables/src/Actions/Contracts/HasTable.php b/packages/tables/src/Actions/Contracts/HasTable.php index fe682af4f3..709d83d747 100644 --- a/packages/tables/src/Actions/Contracts/HasTable.php +++ b/packages/tables/src/Actions/Contracts/HasTable.php @@ -7,4 +7,6 @@ use Filament\Tables\Table; interface HasTable { public function table(Table $table): static; + + public function getTable(): Table; }