From 97d6f04da14f7d5d2abf97f772a78fd95cce1b78 Mon Sep 17 00:00:00 2001 From: miguilim <35383529+srdante@users.noreply.github.com> Date: Fri, 22 Sep 2023 23:19:06 -0300 Subject: [PATCH] Add resource auto detection for relation manager --- src/AutoRelationManager.php | 77 ++++++++++++++++------------ src/Generators/AbstractGenerator.php | 13 +++++ src/Generators/InfolistGenerator.php | 13 ++--- src/Generators/TableGenerator.php | 13 ++--- 4 files changed, 63 insertions(+), 53 deletions(-) diff --git a/src/AutoRelationManager.php b/src/AutoRelationManager.php index d6f05c2..467fdb3 100644 --- a/src/AutoRelationManager.php +++ b/src/AutoRelationManager.php @@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\SoftDeletingScope; @@ -86,7 +87,7 @@ public function table(Table $table): Table $defaultFilters = [...$this->getFilters()]; $defaultHeaderActions = [$this->makeCreateAction()]; - $defaultActions = [...$this->getTableActions(), Tables\Actions\ViewAction::make(), $this->makeEditAction()]; + $defaultActions = [...$this->getTableActions(), ...$this->makeViewAndEditActions()]; $defaultBulkActions = [...$this->getBulkActions(), Tables\Actions\DeleteBulkAction::make()]; // Associate action @@ -161,11 +162,11 @@ protected function getExceptRelationshipColumns() { $relationship = $this->getRelationship(); - if ($relationship instanceof BelongsToMany) { - return []; + if ($relationship instanceof HasOne || $relationship instanceof HasMany) { + return [$relationship->getForeignKeyName()]; } - return [$relationship->getForeignKeyName()]; + return []; } protected function getColumnsOverwriteMapped(string $type): array @@ -180,38 +181,48 @@ protected function makeCreateAction() return Tables\Actions\CreateAction::make(); // TODO: Add support for intrusive mode } - protected function makeEditAction() + protected function makeViewAndEditActions(): array { - return Tables\Actions\EditAction::make() - ->fillForm(function (Model $record): array { - if (static::getIntrusive()) { - return $record->setHidden([])->attributesToArray(); - } else { - return $record->attributesToArray(); - } - })->using(function (array $data, Model $record, Table $table) { - $relationship = $table->getRelationship(); - - if ($relationship instanceof BelongsToMany) { - $pivotColumns = $relationship->getPivotColumns(); - $pivotData = Arr::only($data, $pivotColumns); - - if (count($pivotColumns)) { - if (static::getIntrusive()) { - $record->{$relationship->getPivotAccessor()}->forceFill($pivotData)->save(); - } else { - $record->{$relationship->getPivotAccessor()}->update($pivotData); - } + if ($relatedResource = TableGenerator::tryToGuessRelatedResource($this->getRelationship()->getModel())) { + return [ + Tables\Actions\ViewAction::make()->url(fn ($record) => $relatedResource::getUrl('view', ['record' => $record])), + ]; + } + + return [ + Tables\Actions\ViewAction::make(), + + Tables\Actions\EditAction::make() + ->fillForm(function (Model $record): array { + if (static::getIntrusive()) { + return $record->setHidden([])->attributesToArray(); + } else { + return $record->attributesToArray(); } + })->using(function (array $data, Model $record, Table $table) { + $relationship = $table->getRelationship(); + + if ($relationship instanceof BelongsToMany) { + $pivotColumns = $relationship->getPivotColumns(); + $pivotData = Arr::only($data, $pivotColumns); + + if (count($pivotColumns)) { + if (static::getIntrusive()) { + $record->{$relationship->getPivotAccessor()}->forceFill($pivotData)->save(); + } else { + $record->{$relationship->getPivotAccessor()}->update($pivotData); + } + } - $data = Arr::except($data, $pivotColumns); - } + $data = Arr::except($data, $pivotColumns); + } - if (static::getIntrusive()) { - $record->forceFill($data)->save(); - } else { - $record->update($data); - } - }); + if (static::getIntrusive()) { + $record->forceFill($data)->save(); + } else { + $record->update($data); + } + }) + ]; } } diff --git a/src/Generators/AbstractGenerator.php b/src/Generators/AbstractGenerator.php index ffbdab1..1919aff 100644 --- a/src/Generators/AbstractGenerator.php +++ b/src/Generators/AbstractGenerator.php @@ -3,6 +3,8 @@ namespace Miguilim\FilamentAutoPanel\Generators; use Doctrine\DBAL\Schema\Column; +use Filament\Facades\Filament; +use Filament\Resources\Resource; use Filament\Support\Commands\Concerns\CanReadModelSchemas; use Filament\Support\Components\ViewComponent; use Illuminate\Support\Str; @@ -36,6 +38,17 @@ abstract protected function handleDefaultColumn(Column $column): ViewComponent; abstract protected function generateSchema(array $exceptColumns, array $overwriteColumns, array $enumDictionary): array; + public static function tryToGuessRelatedResource(Model $relatedRecord): Resource + { + foreach (Filament::getResources() as $resource) { + if ($relatedRecord instanceof ($resource::getModel())) { + return $resource; + } + } + + return null; + } + protected function getResourceColumns(array $exceptColumn, array $overwriteColumns, array $enumDictionary): array { $columns = []; diff --git a/src/Generators/InfolistGenerator.php b/src/Generators/InfolistGenerator.php index ec3e799..794e3cf 100644 --- a/src/Generators/InfolistGenerator.php +++ b/src/Generators/InfolistGenerator.php @@ -33,26 +33,19 @@ protected function handleRelationshipColumn(Column $column, string $relationship return null; } - $selectedResource = null; - $relatedRecord = $record->{$relationshipName}; + $relatedRecord = $record->{$relationshipName}; if ($relatedRecord === null) { return null; } - foreach (Filament::getResources() as $resource) { - if ($relatedRecord instanceof ($resource::getModel())) { - $selectedResource = $resource; - - break; - } - } + $selectedResource = static::tryToGuessRelatedResource($relatedRecord); if ($selectedResource === null) { return null; } - return $selectedResource::getUrl('view', [$relatedRecord->getKey()]); + return $selectedResource::getUrl('view', [$record->{$relationshipName}->getKey()]); }); } diff --git a/src/Generators/TableGenerator.php b/src/Generators/TableGenerator.php index a6c7e8d..59ef67d 100644 --- a/src/Generators/TableGenerator.php +++ b/src/Generators/TableGenerator.php @@ -60,26 +60,19 @@ protected function handleRelationshipColumn(Column $column, string $relationship return null; } - $selectedResource = null; - $relatedRecord = $record->{$relationshipName}; + $relatedRecord = $record->{$relationshipName}; if ($relatedRecord === null) { return null; } - foreach (Filament::getResources() as $resource) { - if ($relatedRecord instanceof ($resource::getModel())) { - $selectedResource = $resource; - - break; - } - } + $selectedResource = static::tryToGuessRelatedResource($relatedRecord); if ($selectedResource === null) { return null; } - return $selectedResource::getUrl('view', [$relatedRecord->getKey()]); + return $selectedResource::getUrl('view', [$record->{$relationshipName}->getKey()]); }); }