Skip to content

Commit

Permalink
Merge pull request #21 from CoopBelvedere/dev_1.1.0
Browse files Browse the repository at this point in the history
Dev 1.1.0
  • Loading branch information
pascalboucher authored Oct 7, 2019
2 parents 46aac48 + a7f8f33 commit 3c89ef1
Show file tree
Hide file tree
Showing 19 changed files with 214 additions and 163 deletions.
8 changes: 8 additions & 0 deletions src/Contracts/Models/Nodes/NodeContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,12 @@ interface NodeContract extends ModelContract
* @return \Illuminate\Database\Eloquent\Relations\MorphTo
*/
public function parent();

/**
* Set the node parent relation.
*
* @param mixed $parent
* @return void
*/
public function setParentRelation($parent): void;
}
18 changes: 4 additions & 14 deletions src/Contracts/Repositories/NodeRepositoryContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,6 @@ interface NodeRepositoryContract
*/
public function all(Model $parent, ?string $type = null): LazyCollection;

/**
* Add a node to the parent model.
*
* @param \Belvedere\FormMaker\Models\Model $parent
* @param string $type
* @param array $attributes
* @return \Belvedere\FormMaker\Models\Nodes\Node
*/
public function create(Model $parent, string $type, array $attributes = []): Node;

/**
* Delete all nodes of the parent model.
*
Expand All @@ -46,11 +36,11 @@ public function delete(Model $parent);
public function find(Model $parent, $nodeKey, array $columns): ?Node;

/**
* Get the first node in list.
* Get a new instance of a node model.
*
* @param \Belvedere\FormMaker\Models\Model $parent
* @param string|null $type
* @return \Belvedere\FormMaker\Models\Nodes\Node|null
* @param string $type
* @return \Belvedere\FormMaker\Models\Nodes\Node
*/
public function first(Model $parent, ?string $type = null): ?Node;
public function getInstanceOf(Model $parent, string $type): Node;
}
7 changes: 4 additions & 3 deletions src/Contracts/Traits/Nodes/HasLabelContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Belvedere\FormMaker\Contracts\Traits\Nodes;

use Illuminate\Database\Eloquent\Relations\MorphOne;
use Belvedere\FormMaker\Contracts\Traits\Rankings\HasRankingsContract;
use Belvedere\FormMaker\Contracts\Models\Nodes\Siblings\Label\LabelerContract;

Expand All @@ -16,9 +17,9 @@ interface HasLabelContract extends HasRankingsContract
public function addLabel(string $text): LabelerContract;

/**
* Get the node label.
* Get the label.
*
* @return \Belvedere\FormMaker\Contracts\Models\Nodes\Siblings\Label\LabelerContract|null
* @return \Illuminate\Database\Eloquent\Relations\MorphOne
*/
public function label(): ?LabelerContract;
public function label(): MorphOne;
}
7 changes: 3 additions & 4 deletions src/Contracts/Traits/Nodes/HasOptionsContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,14 @@
interface HasOptionsContract extends HasRankingsContract
{
/**
* Add an option for the input.
* Add an option input to the parent model.
*
* @param array $attributes
* @return \Belvedere\FormMaker\Contracts\Models\Nodes\Inputs\Option\OptionerContract
*/
public function addOption(array $attributes): OptionerContract;
public function addOption(): OptionerContract;

/**
* Add options for the input.
* Add options to the parent model.
*
* @param array ...$options
* @return array
Expand Down
10 changes: 10 additions & 0 deletions src/Contracts/Traits/Rankings/HasRankingsContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,20 @@

namespace Belvedere\FormMaker\Contracts\Traits\Rankings;

use Belvedere\FormMaker\Models\Nodes\Node;
use Illuminate\Database\Eloquent\Relations\MorphOne;

interface HasRankingsContract
{
/**
* Add a node in the ranking.
*
* @param \Belvedere\FormMaker\Models\Nodes\Node $node
* @return void
* @throws \Exception
*/
public function addInRanking(Node $node): void;

/**
* Get the model rankings.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,10 @@ public function toArray($request): array
*/
protected function getLabelResource(string $inputId): ?LabelResourcerContract
{
$label = $this->label();

if ($label) {
return $label->withHtmlAttributes(['for' => $inputId])->toApi();
if ($this->label) {
return $this->label->withHtmlAttributes(['for' => $inputId])->toApi();
}

return $label;
return $this->label;
}
}
8 changes: 4 additions & 4 deletions src/Http/Resources/Nodes/Inputs/InputResourcer.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,12 @@ public function toArray($request): array
*/
protected function getLabelResource(): ?LabelResourcerContract
{
$label = $this->label();
if ($this->label) {
$this->label->setParentRelation($this->resource);

if ($label) {
return $label->toApi();
return $this->label->toApi();
}

return $label;
return $this->label;
}
}
43 changes: 43 additions & 0 deletions src/Listeners/AddNodeInRanking.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace Belvedere\FormMaker\Listeners;

use Belvedere\FormMaker\Models\Nodes\Node;
use Belvedere\FormMaker\Contracts\Models\Nodes\Inputs\InputContract;

class AddNodeInRanking
{
/**
* The node to be added in ranking.
*
* @var \Belvedere\FormMaker\Models\Nodes\Node
*/
protected $node;

/**
* Create the event listener.
*
* @param \Belvedere\FormMaker\Models\Nodes\Node $node
* @return void
*/
public function __construct(Node $node)
{
$this->node = $node;

$this->handle();
}

/**
* Handle the event.
*
* @return void
*/
protected function handle(): void
{
if ($this->node->type === 'label' && $this->node->getRelation('parent') instanceof InputContract) {
return;
}

$this->node->getRelation('parent')->addInRanking($this->node);
}
}
13 changes: 13 additions & 0 deletions src/Models/Nodes/Node.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Belvedere\FormMaker\Models\Nodes;

use Belvedere\FormMaker\Models\Model;
use Belvedere\FormMaker\Listeners\AddNodeInRanking;
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Belvedere\FormMaker\Listeners\RemoveFromRanking;
use Belvedere\FormMaker\Contracts\Models\Nodes\NodeContract;
Expand All @@ -15,6 +16,7 @@ class Node extends Model implements NodeContract
* @var array
*/
protected $dispatchesEvents = [
'created' => AddNodeInRanking::class,
'deleted' => RemoveFromRanking::class,
];

Expand All @@ -30,6 +32,17 @@ public function __construct(array $attributes = [])
$this->table = config('form-maker.database.form_nodes_table', 'form_nodes');
}

/**
* Set the node parent relation.
*
* @param mixed $parent
* @return void
*/
public function setParentRelation($parent): void
{
$this->setRelation('parent', $parent);
}

// ELOQUENT RELATIONSHIPS
// ==============================================================

Expand Down
74 changes: 33 additions & 41 deletions src/Repositories/NodeRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Belvedere\FormMaker\Repositories;

use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Belvedere\FormMaker\Models\Model;
use Illuminate\Support\LazyCollection;
Expand Down Expand Up @@ -64,33 +65,10 @@ public function all(Model $parent, ?string $type = null): LazyCollection
}

return $query->cursor()->groupBy('type')->map(function ($nodes, $key) {
return $this->resolve($nodes[0]->type)::hydrate($nodes->toArray());
return $this->hydrate($nodes->toArray());
})->flatten(1);
}

/**
* Add a node to the parent model.
*
* @param \Belvedere\FormMaker\Models\Model $parent
* @param string $type
* @param array $attributes
* @return \Belvedere\FormMaker\Models\Nodes\Node
*/
public function create(Model $parent, string $type, array $attributes = []): Node
{
$node = $this->resolve($type);

$node->type = $type;

if (count($attributes) > 0) {
$node->withHtmlAttributes($attributes);
}

$parent->morphMany($node, 'nodable')->save($node);

return $node;
}

/**
* Delete all nodes of the parent model.
*
Expand Down Expand Up @@ -133,43 +111,57 @@ public function find(Model $parent, $nodeKey, array $columns): ?Node

$node = $query->first();

return (is_null($node)) ? $node : $this->resolve($node->type)::hydrate([$node])[0];
return (is_null($node)) ? $node : $this->hydrate([$node])[0];
}

/**
* Get the first node in list.
* Get a new instance of a node model.
*
* @param \Belvedere\FormMaker\Models\Model $parent
* @param string|null $type
* @return \Belvedere\FormMaker\Models\Nodes\Node|null
* @param string $type
* @return \Belvedere\FormMaker\Models\Nodes\Node
*/
public function first(Model $parent, ?string $type = null): ?Node
public function getInstanceOf(Model $parent, string $type): Node
{
$query = DB::table(config('form-maker.database.form_nodes_table', 'form_nodes'))
->where('nodable_type', $parent->getMorphClass())
->where('nodable_id', $parent->getKey());
$node = $this->resolve($type);

if (is_string($type)) {
$query->where('type', $type);
$node->type = $type;
$node->nodable_type = $parent->getMorphClass();
$node->nodable_id = $parent->getKey();
$node->setParentRelation($parent);

return $node;
}

/**
* Create a collection of nodes from plain arrays.
*
* @param array $nodes
* @return \Illuminate\Support\Collection
*/
protected function hydrate(array $nodes): Collection
{
if (count($nodes) === 0 || is_null($nodes[0]->type)) {
return collect([]);
}

$node = $query->first();
$type = $nodes[0]->type;

return (is_null($node)) ? $node : $this->resolve($node->type)::hydrate([$node])[0];
return $this->resolve($type)::hydrate($nodes);
}

/**
* Resolve the node out of the service container.
*
* @param string $node
* @param string $type
* @return \Belvedere\FormMaker\Models\Nodes\Node
*/
protected function resolve(string $node): Node
protected function resolve(string $type): Node
{
if (array_key_exists($node, self::NODES)) {
return resolve(self::NODES[$node]);
if (array_key_exists($type, self::NODES)) {
return resolve(self::NODES[$type]);
}

return resolve(sprintf('form-maker.%s', $node));
return resolve(sprintf('form-maker.%s', $type));
}
}
15 changes: 6 additions & 9 deletions src/Traits/Nodes/HasLabel.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Belvedere\FormMaker\Traits\Nodes;

use Illuminate\Database\Eloquent\Relations\MorphOne;
use Belvedere\FormMaker\Contracts\Repositories\NodeRepositoryContract;
use Belvedere\FormMaker\Contracts\Models\Nodes\Siblings\Label\LabelerContract;

Expand All @@ -17,24 +18,20 @@ public function addLabel(string $text): LabelerContract
{
$nodeRepository = resolve(NodeRepositoryContract::class);

$label = $nodeRepository->create($this, 'label');
$label = $nodeRepository->getInstanceOf($this, 'label');

$label->withText($text)->save();

return $label;
}

/**
* Get the node label.
* Get the label.
*
* @return \Belvedere\FormMaker\Contracts\Models\Nodes\Siblings\Label\LabelerContract|null
* @return \Illuminate\Database\Eloquent\Relations\MorphOne
*/
public function label(): ?LabelerContract
public function label(): MorphOne
{
$nodeRepository = resolve(NodeRepositoryContract::class);

$label = $nodeRepository->first($this, 'label');

return is_null($label) ? null : $label;
return $this->morphOne(resolve(LabelerContract::class), 'nodable');
}
}
Loading

0 comments on commit 3c89ef1

Please sign in to comment.