Skip to content

Commit

Permalink
outsource relationship identifier build
Browse files Browse the repository at this point in the history
  • Loading branch information
Naoray committed Apr 19, 2020
1 parent 995df57 commit f53dbce
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 20 deletions.
33 changes: 13 additions & 20 deletions src/Tasks/AddIdentifierField.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

namespace Naoray\BlueprintNovaAddon\Tasks;

use Blueprint\Models\Column;
use Blueprint\Models\Model;
use Closure;
use Blueprint\Models\Model;
use Illuminate\Support\Arr;
use Blueprint\Models\Column;

class AddIdentifierField
{
use InteractWithRelationships;

const INDENT = ' ';

/** @var Model */
Expand All @@ -21,32 +23,23 @@ public function __construct(Model $model)

public function handle($data, Closure $next): array
{
$column = $this->getIdentifierColumn(
$this->model->columns(),
$this->model->relationships()
);
$column = $this->identifierColumn();

$identifierName = $column->name() === 'id' ? '' : "'".$column->name()."'";
$data['fields'] .= 'ID::make('.$identifierName.')->sortable(),'.PHP_EOL.PHP_EOL;
$identifierName = $column->name() === 'id' ? '' : "'" . $column->name() . "'";
$data['fields'] .= 'ID::make(' . $identifierName . ')->sortable(),' . PHP_EOL . PHP_EOL;
$data['imports'][] = 'ID';

return $next($data);
}

private function getIdentifierColumn(array $columns, array $relations): Column
private function identifierColumn(): Column
{
$name = collect($columns)
->filter(function (Column $column) {
return $column->dataType() === 'id';
})
->map(function (Column $column) {
return empty($column->attributes())
? $column->name()
: implode(':', $column->attributes()).":{$column->name()}";
})->values()
->diff(Arr::get($relations, 'belongsTo', []))
$name = $this->relationshipIdentifiers($this->model->columns())
->values()
// filter out all relationships
->diff(Arr::get($this->model->relationships(), 'belongsTo', []))
->first();

return $columns[$name];
return $this->model->columns()[$name];
}
}
23 changes: 23 additions & 0 deletions src/Tasks/InteractWithRelationships.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace Naoray\BlueprintNovaAddon\Tasks;

use Blueprint\Models\Column;
use Illuminate\Support\Collection;

trait InteractWithRelationships
{
private function relationshipIdentifiers(array $columns): Collection
{
return collect($columns)
->filter(function (Column $column) {
return $column->dataType() === 'id';
})
// map id columns to match related relationships
->map(function (Column $column) {
return empty($column->attributes())
? $column->name()
: implode(':', $column->attributes()) . ":{$column->name()}";
});
}
}

0 comments on commit f53dbce

Please sign in to comment.