From 4e5b50488cb912af70e400e5fa3f6e48b88d0640 Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 15:51:19 +0000 Subject: [PATCH 01/14] test with a new hydrate method --- src/Repositories/NodeRepository.php | 26 +++++++++++++++++++++----- src/Traits/Nodes/HasNodes.php | 2 -- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/Repositories/NodeRepository.php b/src/Repositories/NodeRepository.php index 3a98922..b2aa6ae 100644 --- a/src/Repositories/NodeRepository.php +++ b/src/Repositories/NodeRepository.php @@ -80,6 +80,8 @@ public function create(Model $parent, string $type, array $attributes = []): Nod { $node = $this->resolve($type); + $this->hydrate([$node]); + $node->type = $type; if (count($attributes) > 0) { @@ -158,18 +160,32 @@ public function first(Model $parent, ?string $type = null): ?Node return (is_null($node)) ? $node : $this->resolve($node->type)::hydrate([$node])[0]; } + protected function hydrate(array $nodes) + { + dd($nodes[0]->type); + if (count($nodes) === 0) { + return null; + } + + $type = $nodes[0]->type; + // $this->resolve($nodes[0]->type)::hydrate($nodes->toArray()) + // $this->resolve($node->type)::hydrate([$node])[0] + // $this->resolve($node->type)::hydrate([$node])[0] + return true; + } + /** * 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)); } } diff --git a/src/Traits/Nodes/HasNodes.php b/src/Traits/Nodes/HasNodes.php index d95a0f0..b263a3f 100644 --- a/src/Traits/Nodes/HasNodes.php +++ b/src/Traits/Nodes/HasNodes.php @@ -21,8 +21,6 @@ public function add(string $type): Node $node = $nodeRepository->create($this, $type); - $this->addInRanking($node); - return $node; } From 9ba9e4916c7b041f5dad15f0c2de0d3fc29e3030 Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 16:20:03 +0000 Subject: [PATCH 02/14] New test with the hydrate method and added getInstanceOf method in node repository --- src/Repositories/NodeRepository.php | 39 ++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/Repositories/NodeRepository.php b/src/Repositories/NodeRepository.php index b2aa6ae..a4fbd68 100644 --- a/src/Repositories/NodeRepository.php +++ b/src/Repositories/NodeRepository.php @@ -64,7 +64,7 @@ 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); } @@ -135,7 +135,7 @@ 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]; } /** @@ -157,21 +157,42 @@ public function first(Model $parent, ?string $type = null): ?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 a new instance of a node model. + * + * @param \Belvedere\FormMaker\Models\Model $parent + * @param string $type + * @return \Belvedere\FormMaker\Models\Nodes\Node + */ + public function getInstanceOf(Model $parent, string $type): Node + { + $node = $this->resolve($type); + + $node->type = $type; + $node->nodable_type = $parent->getMorphClass(); + $node->nodable_id = $parent->getKey(); + + return $node; + } + + /** + * + * + * @param array $nodes + * @return |null + */ protected function hydrate(array $nodes) { - dd($nodes[0]->type); - if (count($nodes) === 0) { + if (count($nodes) === 0 || is_null($nodes[0]->type)) { return null; } $type = $nodes[0]->type; - // $this->resolve($nodes[0]->type)::hydrate($nodes->toArray()) - // $this->resolve($node->type)::hydrate([$node])[0] - // $this->resolve($node->type)::hydrate([$node])[0] - return true; + + dd($this->resolve($type)::hydrate($nodes)); } /** From 65dc6397e1c9b89e360e5f0097b2481b9a666c83 Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 16:30:59 +0000 Subject: [PATCH 03/14] Added new hydrate method in node repository --- src/Repositories/NodeRepository.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Repositories/NodeRepository.php b/src/Repositories/NodeRepository.php index a4fbd68..196eeaa 100644 --- a/src/Repositories/NodeRepository.php +++ b/src/Repositories/NodeRepository.php @@ -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; @@ -179,20 +180,20 @@ public function getInstanceOf(Model $parent, string $type): Node } /** - * + * Create a collection of nodes from plain arrays. * * @param array $nodes - * @return |null + * @return \Illuminate\Support\Collection */ - protected function hydrate(array $nodes) + protected function hydrate(array $nodes): Collection { if (count($nodes) === 0 || is_null($nodes[0]->type)) { - return null; + return collect([]); } $type = $nodes[0]->type; - dd($this->resolve($type)::hydrate($nodes)); + return $this->resolve($type)::hydrate($nodes); } /** From 3047b2eefd58860fd3043ba4cab0d21d96a75245 Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 17:07:04 +0000 Subject: [PATCH 04/14] refactored the traits to match new specifications, removed create method in node repository for getInstanceOf --- .../Repositories/NodeRepositoryContract.php | 19 +++++----- .../Traits/Nodes/HasLabelContract.php | 2 +- .../Traits/Nodes/HasOptionsContract.php | 7 ++-- src/Repositories/NodeRepository.php | 25 ------------- src/Traits/Nodes/HasLabel.php | 4 +-- src/Traits/Nodes/HasNodes.php | 16 ++++----- src/Traits/Nodes/HasOptions.php | 36 +++++++++---------- 7 files changed, 39 insertions(+), 70 deletions(-) diff --git a/src/Contracts/Repositories/NodeRepositoryContract.php b/src/Contracts/Repositories/NodeRepositoryContract.php index 5311fe2..c9cd4bd 100644 --- a/src/Contracts/Repositories/NodeRepositoryContract.php +++ b/src/Contracts/Repositories/NodeRepositoryContract.php @@ -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. * @@ -53,4 +43,13 @@ public function find(Model $parent, $nodeKey, array $columns): ?Node; * @return \Belvedere\FormMaker\Models\Nodes\Node|null */ public function first(Model $parent, ?string $type = null): ?Node; + + /** + * Get a new instance of a node model. + * + * @param \Belvedere\FormMaker\Models\Model $parent + * @param string $type + * @return \Belvedere\FormMaker\Models\Nodes\Node + */ + public function getInstanceOf(Model $parent, string $type): Node; } diff --git a/src/Contracts/Traits/Nodes/HasLabelContract.php b/src/Contracts/Traits/Nodes/HasLabelContract.php index 8b41396..909e822 100644 --- a/src/Contracts/Traits/Nodes/HasLabelContract.php +++ b/src/Contracts/Traits/Nodes/HasLabelContract.php @@ -16,7 +16,7 @@ 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 */ diff --git a/src/Contracts/Traits/Nodes/HasOptionsContract.php b/src/Contracts/Traits/Nodes/HasOptionsContract.php index 90dde54..4e4c91d 100644 --- a/src/Contracts/Traits/Nodes/HasOptionsContract.php +++ b/src/Contracts/Traits/Nodes/HasOptionsContract.php @@ -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 diff --git a/src/Repositories/NodeRepository.php b/src/Repositories/NodeRepository.php index 196eeaa..c96d8f1 100644 --- a/src/Repositories/NodeRepository.php +++ b/src/Repositories/NodeRepository.php @@ -69,31 +69,6 @@ public function all(Model $parent, ?string $type = null): LazyCollection })->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); - - $this->hydrate([$node]); - - $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. * diff --git a/src/Traits/Nodes/HasLabel.php b/src/Traits/Nodes/HasLabel.php index a3a3015..999d998 100644 --- a/src/Traits/Nodes/HasLabel.php +++ b/src/Traits/Nodes/HasLabel.php @@ -17,7 +17,7 @@ public function addLabel(string $text): LabelerContract { $nodeRepository = resolve(NodeRepositoryContract::class); - $label = $nodeRepository->create($this, 'label'); + $label = $nodeRepository->getInstanceOf($this, 'label'); $label->withText($text)->save(); @@ -25,7 +25,7 @@ public function addLabel(string $text): LabelerContract } /** - * Get the node label. + * Get the label. * * @return \Belvedere\FormMaker\Contracts\Models\Nodes\Siblings\Label\LabelerContract|null */ diff --git a/src/Traits/Nodes/HasNodes.php b/src/Traits/Nodes/HasNodes.php index b263a3f..4d97785 100644 --- a/src/Traits/Nodes/HasNodes.php +++ b/src/Traits/Nodes/HasNodes.php @@ -19,7 +19,7 @@ public function add(string $type): Node { $nodeRepository = resolve(NodeRepositoryContract::class); - $node = $nodeRepository->create($this, $type); + $node = $nodeRepository->getInstanceOf($this, $type); return $node; } @@ -36,11 +36,9 @@ public function addAfter($afterNodeKey, string $type): Node { $node = $this->add($type); - $afterNode = $this->node($afterNodeKey); + $node->save(); - if ($afterNode) { - $this->ranking->move($node)->after($afterNode); - } + $this->ranking->move($node)->after($afterNodeKey); return $node; } @@ -57,6 +55,8 @@ public function addAtRank(int $rank, string $type): Node { $node = $this->add($type); + $node->save(); + $this->ranking->move($node)->toRank($rank); return $node; @@ -74,11 +74,9 @@ public function addBefore($beforeNodeKey, string $type): Node { $node = $this->add($type); - $beforeNode = $this->node($beforeNodeKey); + $node->save(); - if ($beforeNode) { - $this->ranking->move($node)->before($beforeNode); - } + $this->ranking->move($node)->before($beforeNodeKey); return $node; } diff --git a/src/Traits/Nodes/HasOptions.php b/src/Traits/Nodes/HasOptions.php index 5afae89..c1bdc9b 100644 --- a/src/Traits/Nodes/HasOptions.php +++ b/src/Traits/Nodes/HasOptions.php @@ -9,41 +9,39 @@ trait HasOptions { /** - * Add a node to the parent model. + * 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 { $nodeRepository = resolve(NodeRepositoryContract::class); - $option = $nodeRepository->create($this, 'option', $attributes); + $option = $nodeRepository->getInstanceOf($this, 'option'); - if (array_key_exists('text', $attributes)) { - $option->withText($attributes['text']); - } - - $this->addInRanking($option); - - return $option->saveAndFirst(); + return $option; } /** - * Add options for the input. + * Add options to the parent model. * * @param array ...$options * @return array */ public function addOptions(array ...$options): array { - $nodes = []; - - foreach ($options as $optionAttributes) { - $nodes[] = $this->addOption($optionAttributes); - } - - return $nodes; + return array_map(function ($attributes) { + $option = $this->addOption(); + + if (count($attributes) > 0) { + $option->withHtmlAttributes($attributes); + if (array_key_exists('text', $attributes)) { + $option->withText($attributes['text']); + } + } + + return $option->saveAndFirst(); + }, $options); } /** From 5ff73c1a99f495fe3dc89464762b33e45e04da33 Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 17:33:47 +0000 Subject: [PATCH 05/14] Move the addInRanking method to a listener --- src/Listeners/AddNodeInRanking.php | 38 ++++++++++++++++++++++++++++++ src/Models/Nodes/Inputs/Input.php | 23 ++++++++++++++---- src/Models/Nodes/Node.php | 2 ++ 3 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/Listeners/AddNodeInRanking.php diff --git a/src/Listeners/AddNodeInRanking.php b/src/Listeners/AddNodeInRanking.php new file mode 100644 index 0000000..cb8df89 --- /dev/null +++ b/src/Listeners/AddNodeInRanking.php @@ -0,0 +1,38 @@ +node = $node; + + $this->handle(); + } + + /** + * Handle the event. + * + * @return void + */ + protected function handle(): void + { + $this->node->parent->addInRanking($this->node); + } +} diff --git a/src/Models/Nodes/Inputs/Input.php b/src/Models/Nodes/Inputs/Input.php index 07a76c9..86223ae 100644 --- a/src/Models/Nodes/Inputs/Input.php +++ b/src/Models/Nodes/Inputs/Input.php @@ -36,6 +36,24 @@ class Input extends Node implements InputContract 'rules' => 'array', ]; + /** + * Add the custom eloquent events listeners. + * + * @return void + */ + protected static function boot() + { + parent::boot(); + + static::creating(function ($input) { + new AssignAttributes($input); + }); + + static::deleting(function ($input) { + new CascadeDelete($input); + }); + } + /** * Input constructor. * @@ -45,11 +63,6 @@ public function __construct(array $attributes = []) { parent::__construct($attributes); - $this->dispatchesEvents = array_merge($this->dispatchesEvents, [ - 'creating' => AssignAttributes::class, - 'deleting' => CascadeDelete::class, - ]); - $this->addAvailableAttributes([ 'autocomplete', 'autofocus', diff --git a/src/Models/Nodes/Node.php b/src/Models/Nodes/Node.php index 1d5e61b..b7b5d52 100644 --- a/src/Models/Nodes/Node.php +++ b/src/Models/Nodes/Node.php @@ -2,6 +2,7 @@ namespace Belvedere\FormMaker\Models\Nodes; +use Belvedere\FormMaker\Listeners\AddNodeInRanking; use Belvedere\FormMaker\Models\Model; use Illuminate\Database\Eloquent\Relations\MorphTo; use Belvedere\FormMaker\Listeners\RemoveFromRanking; @@ -15,6 +16,7 @@ class Node extends Model implements NodeContract * @var array */ protected $dispatchesEvents = [ + 'creating' => AddNodeInRanking::class, 'deleted' => RemoveFromRanking::class, ]; From 6abb7ffe22fd9ff40c3d01412f0d00b02167eccf Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 17:43:41 +0000 Subject: [PATCH 06/14] updated the eloquent event listened to from creating to created and change visibility of addInRanking method --- .../Traits/Rankings/HasRankingsContract.php | 10 ++++++++ src/Models/Nodes/Inputs/Input.php | 23 ++++--------------- src/Models/Nodes/Node.php | 2 +- src/Traits/Rankings/HasRankings.php | 2 +- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/Contracts/Traits/Rankings/HasRankingsContract.php b/src/Contracts/Traits/Rankings/HasRankingsContract.php index 3a21496..aa93a69 100644 --- a/src/Contracts/Traits/Rankings/HasRankingsContract.php +++ b/src/Contracts/Traits/Rankings/HasRankingsContract.php @@ -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. * diff --git a/src/Models/Nodes/Inputs/Input.php b/src/Models/Nodes/Inputs/Input.php index 86223ae..07a76c9 100644 --- a/src/Models/Nodes/Inputs/Input.php +++ b/src/Models/Nodes/Inputs/Input.php @@ -36,24 +36,6 @@ class Input extends Node implements InputContract 'rules' => 'array', ]; - /** - * Add the custom eloquent events listeners. - * - * @return void - */ - protected static function boot() - { - parent::boot(); - - static::creating(function ($input) { - new AssignAttributes($input); - }); - - static::deleting(function ($input) { - new CascadeDelete($input); - }); - } - /** * Input constructor. * @@ -63,6 +45,11 @@ public function __construct(array $attributes = []) { parent::__construct($attributes); + $this->dispatchesEvents = array_merge($this->dispatchesEvents, [ + 'creating' => AssignAttributes::class, + 'deleting' => CascadeDelete::class, + ]); + $this->addAvailableAttributes([ 'autocomplete', 'autofocus', diff --git a/src/Models/Nodes/Node.php b/src/Models/Nodes/Node.php index b7b5d52..e479dea 100644 --- a/src/Models/Nodes/Node.php +++ b/src/Models/Nodes/Node.php @@ -16,7 +16,7 @@ class Node extends Model implements NodeContract * @var array */ protected $dispatchesEvents = [ - 'creating' => AddNodeInRanking::class, + 'created' => AddNodeInRanking::class, 'deleted' => RemoveFromRanking::class, ]; diff --git a/src/Traits/Rankings/HasRankings.php b/src/Traits/Rankings/HasRankings.php index d8c1a94..779047d 100644 --- a/src/Traits/Rankings/HasRankings.php +++ b/src/Traits/Rankings/HasRankings.php @@ -22,7 +22,7 @@ trait HasRankings * @return void * @throws \Exception */ - protected function addInRanking(Node $node): void + public function addInRanking(Node $node): void { if (is_null($this->ranking)) { $this->ranking()->save(resolve(RankerContract::class)); From 5d6cfd033a5d767dfaf7fc4a167a83b1f4a7a5c8 Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 17:53:58 +0000 Subject: [PATCH 07/14] Prevent ranking creation for input label --- src/Listeners/AddNodeInRanking.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Listeners/AddNodeInRanking.php b/src/Listeners/AddNodeInRanking.php index cb8df89..c1708bc 100644 --- a/src/Listeners/AddNodeInRanking.php +++ b/src/Listeners/AddNodeInRanking.php @@ -2,6 +2,7 @@ namespace Belvedere\FormMaker\Listeners; +use Belvedere\FormMaker\Contracts\Models\Nodes\Inputs\InputContract; use Belvedere\FormMaker\Models\Nodes\Node; class AddNodeInRanking @@ -33,6 +34,10 @@ public function __construct(Node $node) */ protected function handle(): void { + if ($this->node->type === 'label' && $this->node->parent instanceof InputContract) { + return; + } + $this->node->parent->addInRanking($this->node); } } From 1485454dcbdd84d762e393ea2232f9706aa7c93a Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 18:32:46 +0000 Subject: [PATCH 08/14] eager load parent on node creation --- src/Listeners/AddNodeInRanking.php | 4 ++-- src/Repositories/NodeRepository.php | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Listeners/AddNodeInRanking.php b/src/Listeners/AddNodeInRanking.php index c1708bc..3388f10 100644 --- a/src/Listeners/AddNodeInRanking.php +++ b/src/Listeners/AddNodeInRanking.php @@ -34,10 +34,10 @@ public function __construct(Node $node) */ protected function handle(): void { - if ($this->node->type === 'label' && $this->node->parent instanceof InputContract) { + if ($this->node->type === 'label' && $this->node->getRelation('parent') instanceof InputContract) { return; } - $this->node->parent->addInRanking($this->node); + $this->node->getRelation('parent')->addInRanking($this->node); } } diff --git a/src/Repositories/NodeRepository.php b/src/Repositories/NodeRepository.php index c96d8f1..a720188 100644 --- a/src/Repositories/NodeRepository.php +++ b/src/Repositories/NodeRepository.php @@ -150,6 +150,7 @@ public function getInstanceOf(Model $parent, string $type): Node $node->type = $type; $node->nodable_type = $parent->getMorphClass(); $node->nodable_id = $parent->getKey(); + $node->setRelation('parent', $parent); return $node; } From deeb7202cc9265a4730e2912d9f3d0ee01da3976 Mon Sep 17 00:00:00 2001 From: Pascal Boucher Date: Mon, 7 Oct 2019 14:45:39 -0400 Subject: [PATCH 09/14] Apply fixes from StyleCI (#17) --- src/Listeners/AddNodeInRanking.php | 4 ++-- src/Models/Nodes/Node.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Listeners/AddNodeInRanking.php b/src/Listeners/AddNodeInRanking.php index 3388f10..fe2f464 100644 --- a/src/Listeners/AddNodeInRanking.php +++ b/src/Listeners/AddNodeInRanking.php @@ -2,13 +2,13 @@ namespace Belvedere\FormMaker\Listeners; -use Belvedere\FormMaker\Contracts\Models\Nodes\Inputs\InputContract; use Belvedere\FormMaker\Models\Nodes\Node; +use Belvedere\FormMaker\Contracts\Models\Nodes\Inputs\InputContract; class AddNodeInRanking { /** - * The node to be added in ranking + * The node to be added in ranking. * * @var \Belvedere\FormMaker\Models\Nodes\Node */ diff --git a/src/Models/Nodes/Node.php b/src/Models/Nodes/Node.php index e479dea..147a111 100644 --- a/src/Models/Nodes/Node.php +++ b/src/Models/Nodes/Node.php @@ -2,8 +2,8 @@ namespace Belvedere\FormMaker\Models\Nodes; -use Belvedere\FormMaker\Listeners\AddNodeInRanking; 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; From 6ddfddd582fb8c48bb7361cfe095ac0fadb8bd66 Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 19:23:29 +0000 Subject: [PATCH 10/14] Refactored the label method to an eloquent relationship --- .../Repositories/NodeRepositoryContract.php | 9 ------- .../Traits/Nodes/HasLabelContract.php | 5 ++-- .../Inputs/Datalist/DatalistResourcer.php | 8 +++---- .../Resources/Nodes/Inputs/InputResourcer.php | 9 ++++--- src/Repositories/NodeRepository.php | 24 +------------------ src/Traits/Nodes/HasLabel.php | 11 ++++----- 6 files changed, 15 insertions(+), 51 deletions(-) diff --git a/src/Contracts/Repositories/NodeRepositoryContract.php b/src/Contracts/Repositories/NodeRepositoryContract.php index c9cd4bd..910ec15 100644 --- a/src/Contracts/Repositories/NodeRepositoryContract.php +++ b/src/Contracts/Repositories/NodeRepositoryContract.php @@ -35,15 +35,6 @@ public function delete(Model $parent); */ public function find(Model $parent, $nodeKey, array $columns): ?Node; - /** - * Get the first node in list. - * - * @param \Belvedere\FormMaker\Models\Model $parent - * @param string|null $type - * @return \Belvedere\FormMaker\Models\Nodes\Node|null - */ - public function first(Model $parent, ?string $type = null): ?Node; - /** * Get a new instance of a node model. * diff --git a/src/Contracts/Traits/Nodes/HasLabelContract.php b/src/Contracts/Traits/Nodes/HasLabelContract.php index 909e822..ef68e66 100644 --- a/src/Contracts/Traits/Nodes/HasLabelContract.php +++ b/src/Contracts/Traits/Nodes/HasLabelContract.php @@ -4,6 +4,7 @@ use Belvedere\FormMaker\Contracts\Traits\Rankings\HasRankingsContract; use Belvedere\FormMaker\Contracts\Models\Nodes\Siblings\Label\LabelerContract; +use Illuminate\Database\Eloquent\Relations\MorphOne; interface HasLabelContract extends HasRankingsContract { @@ -18,7 +19,7 @@ public function addLabel(string $text): LabelerContract; /** * 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; } diff --git a/src/Http/Resources/Nodes/Inputs/Datalist/DatalistResourcer.php b/src/Http/Resources/Nodes/Inputs/Datalist/DatalistResourcer.php index f24961b..5b7602d 100644 --- a/src/Http/Resources/Nodes/Inputs/Datalist/DatalistResourcer.php +++ b/src/Http/Resources/Nodes/Inputs/Datalist/DatalistResourcer.php @@ -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; } } diff --git a/src/Http/Resources/Nodes/Inputs/InputResourcer.php b/src/Http/Resources/Nodes/Inputs/InputResourcer.php index 962e736..7cea3af 100644 --- a/src/Http/Resources/Nodes/Inputs/InputResourcer.php +++ b/src/Http/Resources/Nodes/Inputs/InputResourcer.php @@ -50,12 +50,11 @@ public function toArray($request): array */ protected function getLabelResource(): ?LabelResourcerContract { - $label = $this->label(); - - if ($label) { - return $label->toApi(); + if ($this->label) { + $this->label->setRelation('parent', $this->resource); + return $this->label->toApi(); } - return $label; + return $this->label; } } diff --git a/src/Repositories/NodeRepository.php b/src/Repositories/NodeRepository.php index a720188..fafeba8 100644 --- a/src/Repositories/NodeRepository.php +++ b/src/Repositories/NodeRepository.php @@ -113,29 +113,7 @@ public function find(Model $parent, $nodeKey, array $columns): ?Node return (is_null($node)) ? $node : $this->hydrate([$node])[0]; } - - /** - * Get the first node in list. - * - * @param \Belvedere\FormMaker\Models\Model $parent - * @param string|null $type - * @return \Belvedere\FormMaker\Models\Nodes\Node|null - */ - public function first(Model $parent, ?string $type = null): ?Node - { - $query = DB::table(config('form-maker.database.form_nodes_table', 'form_nodes')) - ->where('nodable_type', $parent->getMorphClass()) - ->where('nodable_id', $parent->getKey()); - - if (is_string($type)) { - $query->where('type', $type); - } - - $node = $query->first(); - - return (is_null($node)) ? $node : $this->hydrate([$node])[0]; - } - + /** * Get a new instance of a node model. * diff --git a/src/Traits/Nodes/HasLabel.php b/src/Traits/Nodes/HasLabel.php index 999d998..f345075 100644 --- a/src/Traits/Nodes/HasLabel.php +++ b/src/Traits/Nodes/HasLabel.php @@ -4,6 +4,7 @@ use Belvedere\FormMaker\Contracts\Repositories\NodeRepositoryContract; use Belvedere\FormMaker\Contracts\Models\Nodes\Siblings\Label\LabelerContract; +use Illuminate\Database\Eloquent\Relations\MorphOne; trait HasLabel { @@ -27,14 +28,10 @@ public function addLabel(string $text): LabelerContract /** * 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'); } } From f423317d7eefe1aa1b07a2b19bb2e4663c5bc686 Mon Sep 17 00:00:00 2001 From: Pascal Boucher Date: Mon, 7 Oct 2019 15:31:27 -0400 Subject: [PATCH 11/14] Apply fixes from StyleCI (#18) --- src/Contracts/Traits/Nodes/HasLabelContract.php | 2 +- src/Http/Resources/Nodes/Inputs/InputResourcer.php | 1 + src/Listeners/AddNodeInRanking.php | 4 ++-- src/Models/Nodes/Node.php | 2 +- src/Repositories/NodeRepository.php | 2 +- src/Traits/Nodes/HasLabel.php | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Contracts/Traits/Nodes/HasLabelContract.php b/src/Contracts/Traits/Nodes/HasLabelContract.php index ef68e66..53bc3e1 100644 --- a/src/Contracts/Traits/Nodes/HasLabelContract.php +++ b/src/Contracts/Traits/Nodes/HasLabelContract.php @@ -2,9 +2,9 @@ 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; -use Illuminate\Database\Eloquent\Relations\MorphOne; interface HasLabelContract extends HasRankingsContract { diff --git a/src/Http/Resources/Nodes/Inputs/InputResourcer.php b/src/Http/Resources/Nodes/Inputs/InputResourcer.php index 7cea3af..97421f8 100644 --- a/src/Http/Resources/Nodes/Inputs/InputResourcer.php +++ b/src/Http/Resources/Nodes/Inputs/InputResourcer.php @@ -52,6 +52,7 @@ protected function getLabelResource(): ?LabelResourcerContract { if ($this->label) { $this->label->setRelation('parent', $this->resource); + return $this->label->toApi(); } diff --git a/src/Listeners/AddNodeInRanking.php b/src/Listeners/AddNodeInRanking.php index 3388f10..fe2f464 100644 --- a/src/Listeners/AddNodeInRanking.php +++ b/src/Listeners/AddNodeInRanking.php @@ -2,13 +2,13 @@ namespace Belvedere\FormMaker\Listeners; -use Belvedere\FormMaker\Contracts\Models\Nodes\Inputs\InputContract; use Belvedere\FormMaker\Models\Nodes\Node; +use Belvedere\FormMaker\Contracts\Models\Nodes\Inputs\InputContract; class AddNodeInRanking { /** - * The node to be added in ranking + * The node to be added in ranking. * * @var \Belvedere\FormMaker\Models\Nodes\Node */ diff --git a/src/Models/Nodes/Node.php b/src/Models/Nodes/Node.php index e479dea..147a111 100644 --- a/src/Models/Nodes/Node.php +++ b/src/Models/Nodes/Node.php @@ -2,8 +2,8 @@ namespace Belvedere\FormMaker\Models\Nodes; -use Belvedere\FormMaker\Listeners\AddNodeInRanking; 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; diff --git a/src/Repositories/NodeRepository.php b/src/Repositories/NodeRepository.php index fafeba8..2a42abf 100644 --- a/src/Repositories/NodeRepository.php +++ b/src/Repositories/NodeRepository.php @@ -113,7 +113,7 @@ public function find(Model $parent, $nodeKey, array $columns): ?Node return (is_null($node)) ? $node : $this->hydrate([$node])[0]; } - + /** * Get a new instance of a node model. * diff --git a/src/Traits/Nodes/HasLabel.php b/src/Traits/Nodes/HasLabel.php index f345075..3c6c0b8 100644 --- a/src/Traits/Nodes/HasLabel.php +++ b/src/Traits/Nodes/HasLabel.php @@ -2,9 +2,9 @@ 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; -use Illuminate\Database\Eloquent\Relations\MorphOne; trait HasLabel { From a748d08b4dfd01f969730afe4e31eed677db9526 Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 19:51:52 +0000 Subject: [PATCH 12/14] Use laravel eloquent relationships instead of node repository in options method --- src/Traits/Nodes/HasOptions.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Traits/Nodes/HasOptions.php b/src/Traits/Nodes/HasOptions.php index c1bdc9b..3e06ff5 100644 --- a/src/Traits/Nodes/HasOptions.php +++ b/src/Traits/Nodes/HasOptions.php @@ -66,9 +66,7 @@ public function option($key): ?OptionerContract */ public function options(): LazyCollection { - $nodeRepository = resolve(NodeRepositoryContract::class); - - $options = $nodeRepository->all($this, 'option'); + $options = $this->morphMany(resolve(OptionerContract::class), 'nodable')->cursor(); if ($options->isEmpty()) { return $options; From 2407fde1b10c0b98566690e85e45205e341b8d9a Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 20:48:43 +0000 Subject: [PATCH 13/14] Updated the unit tests to reflect changes, bugfix in addBefore and addAfter --- src/Traits/Nodes/HasNodes.php | 14 +++++--- tests/Unit/Models/FormTest.php | 30 ++++++++-------- tests/Unit/Models/InputTest.php | 4 +-- tests/Unit/Traits/HasLabelTest.php | 15 ++++---- tests/Unit/Traits/HasNodesTest.php | 52 +++++++++++++++------------- tests/Unit/Traits/HasOptionsTest.php | 15 ++++---- 6 files changed, 69 insertions(+), 61 deletions(-) diff --git a/src/Traits/Nodes/HasNodes.php b/src/Traits/Nodes/HasNodes.php index 4d97785..72587aa 100644 --- a/src/Traits/Nodes/HasNodes.php +++ b/src/Traits/Nodes/HasNodes.php @@ -36,9 +36,12 @@ public function addAfter($afterNodeKey, string $type): Node { $node = $this->add($type); - $node->save(); + $afterNode = $this->node($afterNodeKey); - $this->ranking->move($node)->after($afterNodeKey); + if ($afterNode) { + $node->save(); + $this->ranking->move($node)->after($afterNode); + } return $node; } @@ -74,9 +77,12 @@ public function addBefore($beforeNodeKey, string $type): Node { $node = $this->add($type); - $node->save(); + $beforeNode = $this->node($beforeNodeKey); - $this->ranking->move($node)->before($beforeNodeKey); + if ($beforeNode) { + $node->save(); + $this->ranking->move($node)->before($beforeNode); + } return $node; } diff --git a/tests/Unit/Models/FormTest.php b/tests/Unit/Models/FormTest.php index b41ee9c..0e4e824 100644 --- a/tests/Unit/Models/FormTest.php +++ b/tests/Unit/Models/FormTest.php @@ -69,9 +69,9 @@ public function api_response_with_html_attributes_and_no_nodes() /** @test */ public function api_response_with_no_html_attributes_and_nodes() { - $this->form->add('text'); - $this->form->add('text'); - $this->form->add('text'); + $this->form->add('text')->save(); + $this->form->add('text')->save(); + $this->form->add('text')->save(); $apiResponse = $this->form->toApi()->toArray(null); $this->assertIsArray($apiResponse); @@ -94,9 +94,9 @@ public function api_response_with_no_html_attributes_and_nodes() public function api_response_with_html_attributes_and_nodes() { $this->form->withHtmlAttributes(['accept-charset' => ['utf8'], 'role' => 'form', 'id' => 'test'])->save(); - $this->form->add('text'); - $this->form->add('text'); - $this->form->add('text'); + $this->form->add('text')->save(); + $this->form->add('text')->save(); + $this->form->add('text')->save(); $apiResponse = $this->form->toApi()->toArray(null); $this->assertIsArray($apiResponse); @@ -122,9 +122,9 @@ public function api_response_with_html_attributes_and_nodes() /** @test */ public function disable_all_inputs() { - $this->form->add('text'); - $this->form->add('text'); - $this->form->add('text'); + $this->form->add('text')->save(); + $this->form->add('text')->save(); + $this->form->add('text')->save(); $this->form->disabled(); foreach ($this->form->nodes('inputs') as $input) { @@ -136,9 +136,9 @@ public function disable_all_inputs() /** @test */ public function enable_all_inputs() { - $this->form->add('text'); - $this->form->add('text'); - $this->form->add('text'); + $this->form->add('text')->save(); + $this->form->add('text')->save(); + $this->form->add('text')->save(); $this->form->enabled(); foreach ($this->form->nodes('inputs') as $input) { @@ -149,9 +149,9 @@ public function enable_all_inputs() /** @test */ public function enable_all_inputs_after_they_have_been_disabled() { - $this->form->add('text'); - $this->form->add('text'); - $this->form->add('text'); + $this->form->add('text')->save(); + $this->form->add('text')->save(); + $this->form->add('text')->save(); $this->form->disabled(); foreach ($this->form->nodes('inputs') as $input) { diff --git a/tests/Unit/Models/InputTest.php b/tests/Unit/Models/InputTest.php index 2ebcb7d..86fa84a 100644 --- a/tests/Unit/Models/InputTest.php +++ b/tests/Unit/Models/InputTest.php @@ -33,7 +33,7 @@ public function add_input_to_form() { Event::fake(); - $this->form->add('text'); + $this->form->add('text')->save(); Event::assertDispatched(AssignAttributes::class); } @@ -43,7 +43,7 @@ public function remove_input_from_form() { Event::fake(); - $input = $this->form->add('text'); + $input = $this->form->add('text')->saveAndFirst(); $input->delete(); diff --git a/tests/Unit/Traits/HasLabelTest.php b/tests/Unit/Traits/HasLabelTest.php index f1832e5..23dd5c3 100644 --- a/tests/Unit/Traits/HasLabelTest.php +++ b/tests/Unit/Traits/HasLabelTest.php @@ -2,7 +2,7 @@ namespace Belvedere\FormMaker\Tests\Unit\Traits; -use Belvedere\FormMaker\Models\Nodes\Inputs\Text\Texter; +use Belvedere\FormMaker\Models\Form\Form; use Belvedere\FormMaker\Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; @@ -16,11 +16,10 @@ public function setUp(): void { parent::setUp(); - $this->input = Texter::forceCreate([ - 'nodable_type' => 'test', - 'nodable_id' => 1, - 'type' => 'text' - ]); + $form = new Form(); + $form->fill(['name' => 'test'])->save(); + + $this->input = $form->add('text')->saveAndFirst(); } /** @test */ @@ -36,7 +35,7 @@ public function add_label_sibling_to_a_parent_model() public function get_label_sibling_from_a_parent_model() { $this->input->addLabel('Label'); - $label = $this->input->label(); + $label = $this->input->label; $this->assertEquals('label', $label->type); $this->assertEquals('Label', $label->text); @@ -45,7 +44,7 @@ public function get_label_sibling_from_a_parent_model() /** @test */ public function get_label_sibling_from_a_parent_model_when_label_doesnt_exist() { - $label = $this->input->label(); + $label = $this->input->label; $this->assertNull($label); } diff --git a/tests/Unit/Traits/HasNodesTest.php b/tests/Unit/Traits/HasNodesTest.php index e06295c..c7c1f64 100644 --- a/tests/Unit/Traits/HasNodesTest.php +++ b/tests/Unit/Traits/HasNodesTest.php @@ -10,6 +10,8 @@ class HasNodesTest extends TestCase { use RefreshDatabase; + protected $form; + public function setUp(): void { parent::setUp(); @@ -23,7 +25,7 @@ public function setUp(): void /** @test */ public function add_node_to_a_parent_model_when_node_is_input() { - $input = $this->form->add('text'); + $input = $this->form->add('text')->saveAndFirst(); $this->assertEquals(true, $this->form->ranking->inRanking($input)); $this->assertEquals('text', $input->type); @@ -44,9 +46,9 @@ public function add_node_to_a_parent_model_when_node_is_sibling() /** @test */ public function add_node_to_a_parent_model_after_an_existing_node() { - $afterInput = $this->form->add('text'); - $this->form->add('text'); - $this->form->add('text'); + $afterInput = $this->form->add('text')->saveAndFirst(); + $this->form->add('text')->save(); + $this->form->add('text')->save(); $afterInputRank = $this->form->ranking->rank($afterInput); $input = $this->form->addAfter($afterInput->html_attributes['id'], 'text'); $inputRank = $this->form->ranking->rank($input); @@ -60,9 +62,9 @@ public function add_node_to_a_parent_model_after_an_existing_node() /** @test */ public function add_node_to_a_parent_model_before_an_existing_node() { - $beforeInput = $this->form->add('text'); - $this->form->add('text'); - $this->form->add('text'); + $beforeInput = $this->form->add('text')->saveAndFirst(); + $this->form->add('text')->save(); + $this->form->add('text')->save(); $beforeInputRank = $this->form->ranking->rank($beforeInput); $input = $this->form->addBefore($beforeInput->html_attributes['id'], 'text'); $inputRank = $this->form->ranking->rank($input); @@ -76,9 +78,9 @@ public function add_node_to_a_parent_model_before_an_existing_node() /** @test */ public function add_node_to_a_parent_model_at_specific_rank() { - $this->form->add('text'); - $this->form->add('text'); - $this->form->add('text'); + $this->form->add('text')->save(); + $this->form->add('text')->save(); + $this->form->add('text')->save(); $input = $this->form->addAtRank(2, 'text'); $inputRank = $this->form->ranking->rank($input); @@ -91,9 +93,9 @@ public function add_node_to_a_parent_model_at_specific_rank() /** @test */ public function get_node_by_html_attribute_id() { - $this->form->add('text'); + $this->form->add('text')->save(); $this->form->add('text')->withHtmlAttributes(['id' => 'test'])->save(); - $this->form->add('paragraph'); + $this->form->add('paragraph')->save(); $node = $this->form->node('test'); $this->assertEquals('text', $node->type); @@ -105,9 +107,9 @@ public function get_node_by_html_attribute_id() /** @test */ public function get_node_by_html_attribute_name() { - $this->form->add('text'); + $this->form->add('text')->save(); $this->form->add('text')->withHtmlAttributes(['name' => 'test'])->save(); - $this->form->add('paragraph'); + $this->form->add('paragraph')->save(); $node = $this->form->node('test'); $this->assertEquals('text', $node->type); @@ -119,9 +121,9 @@ public function get_node_by_html_attribute_name() /** @test */ public function get_node_by_html_attribute_value() { - $this->form->add('text'); + $this->form->add('text')->save(); $this->form->add('text')->withHtmlAttributes(['value' => 'test'])->save(); - $this->form->add('paragraph'); + $this->form->add('paragraph')->save(); $node = $this->form->node('test'); $this->assertEquals('text', $node->type); @@ -134,9 +136,9 @@ public function get_node_by_html_attribute_value() /** @test */ public function get_node_when_doesnt_exist() { - $this->form->add('text'); - $this->form->add('text'); - $this->form->add('paragraph'); + $this->form->add('text')->save(); + $this->form->add('text')->save(); + $this->form->add('paragraph')->save(); $node = $this->form->node('test'); $this->assertNull($node); @@ -145,9 +147,9 @@ public function get_node_when_doesnt_exist() /** @test */ public function get_all_nodes_from_parent_model() { - $this->form->add('text'); - $this->form->add('text'); - $this->form->add('paragraph'); + $this->form->add('text')->save(); + $this->form->add('text')->save(); + $this->form->add('paragraph')->save(); $nodes = $this->form->nodes(); $this->assertEquals(3, $nodes->count()); @@ -166,9 +168,9 @@ public function get_all_nodes_from_parent_model() /** @test */ public function get_all_nodes_from_parent_model_filtered_by_type() { - $this->form->add('text'); - $this->form->add('text'); - $this->form->add('paragraph'); + $this->form->add('text')->save(); + $this->form->add('text')->save(); + $this->form->add('paragraph')->save(); $nodes = $this->form->nodes('text'); $this->assertEquals(2, $nodes->count()); diff --git a/tests/Unit/Traits/HasOptionsTest.php b/tests/Unit/Traits/HasOptionsTest.php index 349de76..4944054 100644 --- a/tests/Unit/Traits/HasOptionsTest.php +++ b/tests/Unit/Traits/HasOptionsTest.php @@ -2,7 +2,7 @@ namespace Belvedere\FormMaker\Tests\Unit\Traits; -use Belvedere\FormMaker\Models\Nodes\Inputs\Select\Selecter; +use Belvedere\FormMaker\Models\Form\Form; use Belvedere\FormMaker\Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; @@ -16,17 +16,18 @@ public function setUp(): void { parent::setUp(); - $this->select = Selecter::forceCreate([ - 'nodable_type' => 'test', - 'nodable_id' => 1, - 'type' => 'select' - ]); + $form = new Form(); + $form->fill(['name' => 'test'])->save(); + $this->select = $form->add('select')->saveAndFirst(); } /** @test */ public function add_option_input_to_a_parent_model() { - $option = $this->select->addOption(['title' => 'Cat', 'value' => 'cat', 'text' => 'Cat!']); + $option = $this->select->addOption() + ->withHtmlAttributes(['title' => 'Cat', 'value' => 'cat']) + ->withText('Cat!') + ->saveAndFirst(); $this->assertEquals(true, $this->select->ranking->inRanking($option)); $this->assertEquals('option', $option->type); From a7f8f3325fae2bbfb9750dcd80da43bdacf891f8 Mon Sep 17 00:00:00 2001 From: pascalboucher Date: Mon, 7 Oct 2019 20:53:57 +0000 Subject: [PATCH 14/14] Added a setParentRelation wrapper --- src/Contracts/Models/Nodes/NodeContract.php | 8 ++++++++ src/Http/Resources/Nodes/Inputs/InputResourcer.php | 2 +- src/Models/Nodes/Node.php | 11 +++++++++++ src/Repositories/NodeRepository.php | 2 +- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Contracts/Models/Nodes/NodeContract.php b/src/Contracts/Models/Nodes/NodeContract.php index 207edb8..38c2c05 100644 --- a/src/Contracts/Models/Nodes/NodeContract.php +++ b/src/Contracts/Models/Nodes/NodeContract.php @@ -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; } diff --git a/src/Http/Resources/Nodes/Inputs/InputResourcer.php b/src/Http/Resources/Nodes/Inputs/InputResourcer.php index 97421f8..b1a1c2b 100644 --- a/src/Http/Resources/Nodes/Inputs/InputResourcer.php +++ b/src/Http/Resources/Nodes/Inputs/InputResourcer.php @@ -51,7 +51,7 @@ public function toArray($request): array protected function getLabelResource(): ?LabelResourcerContract { if ($this->label) { - $this->label->setRelation('parent', $this->resource); + $this->label->setParentRelation($this->resource); return $this->label->toApi(); } diff --git a/src/Models/Nodes/Node.php b/src/Models/Nodes/Node.php index 147a111..20e12f2 100644 --- a/src/Models/Nodes/Node.php +++ b/src/Models/Nodes/Node.php @@ -32,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 // ============================================================== diff --git a/src/Repositories/NodeRepository.php b/src/Repositories/NodeRepository.php index 2a42abf..3403814 100644 --- a/src/Repositories/NodeRepository.php +++ b/src/Repositories/NodeRepository.php @@ -128,7 +128,7 @@ public function getInstanceOf(Model $parent, string $type): Node $node->type = $type; $node->nodable_type = $parent->getMorphClass(); $node->nodable_id = $parent->getKey(); - $node->setRelation('parent', $parent); + $node->setParentRelation($parent); return $node; }