From 2ea9de5ff269bb506af67a38bfd997ddd971df23 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 2 Dec 2024 14:34:33 +0000 Subject: [PATCH] feature: Better relation manager tab customization --- .../Pages/Concerns/HasRelationManagers.php | 25 ++++++++----------- .../RelationManagers/RelationGroup.php | 24 ++++++++++++++++++ .../RelationManagers/RelationManager.php | 11 ++++++++ 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/packages/panels/src/Resources/Pages/Concerns/HasRelationManagers.php b/packages/panels/src/Resources/Pages/Concerns/HasRelationManagers.php index dec78b8700..a7d31cb697 100644 --- a/packages/panels/src/Resources/Pages/Concerns/HasRelationManagers.php +++ b/packages/panels/src/Resources/Pages/Concerns/HasRelationManagers.php @@ -71,6 +71,13 @@ trait HasRelationManagers return false; } + public function getContentTabComponent(): Tab + { + return Tab::make($this->getContentTabLabel()) + ->icon($this->getContentTabIcon()) + ->schema($this->getContentComponents()); + } + public function getContentTabLabel(): ?string { return null; @@ -121,21 +128,14 @@ trait HasRelationManagers $tabKey = strval($tabKey); if (blank($tabKey) && $hasCombinedRelationManagerTabsWithContent) { - return Tab::make($this->getContentTabLabel()) - ->icon($this->getContentTabIcon()) - ->schema($this->getContentComponents()); + return $this->getContentTabComponent(); } if ($manager instanceof RelationGroup) { $manager->ownerRecord($ownerRecord); $manager->pageClass(static::class); - return Tab::make($manager->getLabel()) - ->badge($manager->getBadge()) - ->badgeColor($manager->getBadgeColor()) - ->badgeTooltip($manager->getBadgeTooltip()) - ->icon($manager->getIcon()) - ->iconPosition($manager->getIconPosition()) + return $manager->getTabComponent() ->schema(fn (): array => collect($manager->getManagers()) ->map(fn ($groupedManager, $groupedManagerKey): Livewire => Livewire::make( $normalizedGroupedManagerClass = $this->normalizeRelationManagerClass($groupedManager), @@ -146,12 +146,7 @@ trait HasRelationManagers $normalizedManagerClass = $this->normalizeRelationManagerClass($manager); - return Tab::make($normalizedManagerClass::getTitle($ownerRecord, static::class)) - ->badge($normalizedManagerClass::getBadge($ownerRecord, static::class)) - ->badgeColor($normalizedManagerClass::getBadgeColor($ownerRecord, static::class)) - ->badgeTooltip($normalizedManagerClass::getBadgeTooltip($ownerRecord, static::class)) - ->icon($normalizedManagerClass::getIcon($ownerRecord, static::class)) - ->iconPosition($normalizedManagerClass::getIconPosition($ownerRecord, static::class)) + return $normalizedManagerClass::getTabComponent($ownerRecord, static::class) ->schema(fn (): array => [ Livewire::make( $normalizedManagerClass, diff --git a/packages/panels/src/Resources/RelationManagers/RelationGroup.php b/packages/panels/src/Resources/RelationManagers/RelationGroup.php index 33618e5727..ac87500d6a 100644 --- a/packages/panels/src/Resources/RelationManagers/RelationGroup.php +++ b/packages/panels/src/Resources/RelationManagers/RelationGroup.php @@ -3,6 +3,7 @@ namespace Filament\Resources\RelationManagers; use Closure; +use Filament\Schemas\Components\Tabs\Tab; use Filament\Support\Components\Component; use Filament\Support\Concerns\HasIcon; use Illuminate\Database\Eloquent\Model; @@ -21,6 +22,8 @@ class RelationGroup extends Component protected ?string $pageClass = null; + protected ?Closure $modifyTabUsing = null; + /** * @param array | RelationManagerConfiguration> $managers */ @@ -80,6 +83,13 @@ class RelationGroup extends Component return $this->evaluate($this->label); } + public function tab(?Closure $callback): static + { + $this->modifyTabUsing = $callback; + + return $this; + } + /** * @return array | RelationManagerConfiguration> */ @@ -164,4 +174,18 @@ class RelationGroup extends Component default => parent::resolveDefaultClosureDependencyForEvaluationByType($parameterType), }; } + + public function getTabComponent(): Tab + { + $tab = Tab::make($this->getLabel()) + ->badge($this->getBadge()) + ->badgeColor($this->getBadgeColor()) + ->badgeTooltip($this->getBadgeTooltip()) + ->icon($this->getIcon()) + ->iconPosition($this->getIconPosition()); + + return $this->evaluate($this->modifyTabUsing, [ + 'tab' => $tab, + ]) ?? $tab; + } } diff --git a/packages/panels/src/Resources/RelationManagers/RelationManager.php b/packages/panels/src/Resources/RelationManagers/RelationManager.php index 18ba579549..62b3544760 100644 --- a/packages/panels/src/Resources/RelationManagers/RelationManager.php +++ b/packages/panels/src/Resources/RelationManagers/RelationManager.php @@ -13,6 +13,7 @@ use Filament\Resources\Concerns\InteractsWithRelationshipTable; use Filament\Resources\Pages\ViewRecord; use Filament\Schemas\Components\RenderHook; use Filament\Schemas\Components\TableBuilder; +use Filament\Schemas\Components\Tabs\Tab; use Filament\Schemas\Schema; use Filament\Support\Concerns\CanBeLazy; use Filament\Support\Enums\IconPosition; @@ -136,6 +137,16 @@ class RelationManager extends Component implements Actions\Contracts\HasActions, return []; } + public static function getTabComponent(Model $ownerRecord, string $pageClass): Tab + { + return Tab::make(static::class::getTitle($ownerRecord, $pageClass)) + ->badge(static::class::getBadge($ownerRecord, $pageClass)) + ->badgeColor(static::class::getBadgeColor($ownerRecord, $pageClass)) + ->badgeTooltip(static::class::getBadgeTooltip($ownerRecord, $pageClass)) + ->icon(static::class::getIcon($ownerRecord, $pageClass)) + ->iconPosition(static::class::getIconPosition($ownerRecord, $pageClass)); + } + public static function getIcon(Model $ownerRecord, string $pageClass): ?string { return static::$icon;