feature: Better relation manager tab customization

This commit is contained in:
Dan Harrin
2024-12-02 14:34:33 +00:00
parent c97df8d61c
commit 2ea9de5ff2
3 changed files with 45 additions and 15 deletions
@@ -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,
@@ -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<class-string<RelationManager> | 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<class-string<RelationManager> | 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;
}
}
@@ -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;