Skip to content

Commit

Permalink
Add resource auto detection for relation manager
Browse files Browse the repository at this point in the history
  • Loading branch information
miguilimzero committed Sep 23, 2023
1 parent b13ec30 commit 97d6f04
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 53 deletions.
77 changes: 44 additions & 33 deletions src/AutoRelationManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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);
}
})
];
}
}
13 changes: 13 additions & 0 deletions src/Generators/AbstractGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 = [];
Expand Down
13 changes: 3 additions & 10 deletions src/Generators/InfolistGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()]);
});
}

Expand Down
13 changes: 3 additions & 10 deletions src/Generators/TableGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()]);
});
}

Expand Down

0 comments on commit 97d6f04

Please sign in to comment.