From 167c9ec044c491505142b10dc61f560cb0a075c3 Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Tue, 12 Nov 2019 16:37:15 +0000 Subject: [PATCH 01/11] =?UTF-8?q?Fix=20bug=20where=20files=20aren=E2=80=99?= =?UTF-8?q?t=20correctly=20deleted?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Collections/FieldCollection.php | 71 +++++++++++++++++++++++++++++ src/Flexible.php | 20 ++++++++ src/Helper.php | 36 +++++++++++++++ src/Layouts/Layout.php | 10 ++++ src/Traits/AvailableFields.php | 21 +++++++++ 5 files changed, 158 insertions(+) create mode 100644 src/Collections/FieldCollection.php create mode 100644 src/Helper.php create mode 100644 src/Traits/AvailableFields.php diff --git a/src/Collections/FieldCollection.php b/src/Collections/FieldCollection.php new file mode 100644 index 00000000..1e704921 --- /dev/null +++ b/src/Collections/FieldCollection.php @@ -0,0 +1,71 @@ +findResourceOrFail(); + $fields = $resource->updateFields($request); + + $attribute_parts = explode('__', $attribute, 2); + + $groups = []; + foreach ($fields as $field) { + if ($field instanceof Flexible) { + $groups = array_merge($groups, $this->flattenGroups($field)); + } + } + + foreach ($groups as $group) { + if ($group->inUseKey() !== $attribute_parts[0]) { + continue; + } + + return $group->collectionFields()->first(function ($field) use ($attribute_parts, $group) { + $field->group = $group; + + return isset($field->attribute) && + $field->attribute == $attribute_parts[1]; + }, $default); + } + } + + return $this->first(function ($field) use ($attribute) { + return isset($field->attribute) && + $field->attribute == $attribute; + }, $default); + } + + private function flattenGroups(Field $field, $parentGroup = null) + { + $flattened = []; + foreach ($field->groups() as $i => $group) { + $group->originalField = ($parentGroup ? $group->originalField . '.attributes.' : '') . $field->attribute; + + foreach ($group->fields() as $groupField) { + if ($groupField instanceof Flexible) { + $flattened = array_merge($flattened, $this->flattenGroups($groupField, $group)); + } + } + + $flattened[] = $group; + } + return $flattened; + } +} diff --git a/src/Flexible.php b/src/Flexible.php index 317522a7..8b8fc26c 100644 --- a/src/Flexible.php +++ b/src/Flexible.php @@ -74,6 +74,26 @@ public function __construct($name, $attribute = null, $resolveCallback = null) $this->hideFromIndex(); } + /** + * Get the field layouts + * + * @return Collection + */ + public function layouts() + { + return $this->layouts; + } + + /** + * Get the field groups + * + * @return Collection + */ + public function groups() + { + return $this->groups; + } + /** * Set the button's label * diff --git a/src/Helper.php b/src/Helper.php new file mode 100644 index 00000000..7bc02562 --- /dev/null +++ b/src/Helper.php @@ -0,0 +1,36 @@ +group->originalField); + $path[] = 'attributes'; + $path[] = $this->attribute; + $mainField = array_shift($path); + $data = $model->{$mainField}; + + foreach ($data as $i => $group) { + if ($this->group->inUseKey() !== $group['key']) { + continue; + } + + Arr::set($group, implode('.', $path), ''); + + $data[$i] = $group; + $model->{$mainField} = $data; + } + + $model->save(); + return true; +} \ No newline at end of file diff --git a/src/Layouts/Layout.php b/src/Layouts/Layout.php index 39a440ff..6b493319 100644 --- a/src/Layouts/Layout.php +++ b/src/Layouts/Layout.php @@ -114,6 +114,16 @@ public function fields() return $this->fields ? $this->fields->all() : []; } + /** + * Retrieve the layout's fields as a collection + * + * @return \Illuminate\Support\Collection + */ + public function collectionFields() + { + return $this->fields; + } + /** * Retrieve the layout's unique key * diff --git a/src/Traits/AvailableFields.php b/src/Traits/AvailableFields.php new file mode 100644 index 00000000..72fdcb0e --- /dev/null +++ b/src/Traits/AvailableFields.php @@ -0,0 +1,21 @@ +filter($this->fields($request)))); + } +} From 10aad1850fc598dea6d9f15f490398f7979f08e2 Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Tue, 12 Nov 2019 16:43:17 +0000 Subject: [PATCH 02/11] Add helper to composer --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index cc038e4a..8d69614c 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,10 @@ "autoload": { "psr-4": { "Whitecube\\NovaFlexibleContent\\": "src/" - } + }, + "files": [ + "src/Helper.php" + ] }, "extra": { "laravel": { From 22b3efdc00e111d12329d762882fa36cc0ef9f28 Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Tue, 12 Nov 2019 17:25:56 +0000 Subject: [PATCH 03/11] Fix bug with delete file helper --- src/Helper.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Helper.php b/src/Helper.php index 7bc02562..7c1885dc 100644 --- a/src/Helper.php +++ b/src/Helper.php @@ -12,16 +12,16 @@ * @param $model * @return boolean */ -function deleteFile(NovaRequest $request, $model) +function deleteFile(NovaRequest $request, $model, $field) { - $path = explode('.', $this->group->originalField); + $path = explode('.', $field->group->originalField); $path[] = 'attributes'; - $path[] = $this->attribute; + $path[] = $field->attribute; $mainField = array_shift($path); $data = $model->{$mainField}; foreach ($data as $i => $group) { - if ($this->group->inUseKey() !== $group['key']) { + if ($field->group->inUseKey() !== $group['key']) { continue; } @@ -33,4 +33,4 @@ function deleteFile(NovaRequest $request, $model) $model->save(); return true; -} \ No newline at end of file +} From b5035c7a126744c969ef364d640ea0f39821cd3a Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Tue, 12 Nov 2019 19:25:13 +0000 Subject: [PATCH 04/11] Add additional fields with delete logic built in --- src/Fields/File.php | 19 +++++++++++++++++++ src/Fields/Image.php | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/Fields/File.php create mode 100644 src/Fields/Image.php diff --git a/src/Fields/File.php b/src/Fields/File.php new file mode 100644 index 00000000..925bf981 --- /dev/null +++ b/src/Fields/File.php @@ -0,0 +1,19 @@ +delete(function(NovaRequest $request, $model) { + return \Whitecube\NovaFlexibleContent\deleteFile($request, $model, $this); + }); + + } +} \ No newline at end of file diff --git a/src/Fields/Image.php b/src/Fields/Image.php new file mode 100644 index 00000000..eddb9c3b --- /dev/null +++ b/src/Fields/Image.php @@ -0,0 +1,19 @@ +delete(function(NovaRequest $request, $model) { + return \Whitecube\NovaFlexibleContent\deleteFile($request, $model, $this); + }); + + } +} \ No newline at end of file From 19b3bb381d240f231fe9501600d64651de8543c3 Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Wed, 13 Nov 2019 12:25:57 +0000 Subject: [PATCH 05/11] Remove helper files Add delete callback logic to collection --- src/Collections/FieldCollection.php | 43 ++++++++++++++++++++++++++++- src/Fields/File.php | 19 ------------- src/Fields/Image.php | 19 ------------- 3 files changed, 42 insertions(+), 39 deletions(-) delete mode 100644 src/Fields/File.php delete mode 100644 src/Fields/Image.php diff --git a/src/Collections/FieldCollection.php b/src/Collections/FieldCollection.php index 1e704921..83a27fed 100644 --- a/src/Collections/FieldCollection.php +++ b/src/Collections/FieldCollection.php @@ -37,12 +37,14 @@ public function findFieldByAttribute($attribute, $default = null) continue; } - return $group->collectionFields()->first(function ($field) use ($attribute_parts, $group) { + $field = $group->collectionFields()->first(function ($field) use ($attribute_parts, $group) { $field->group = $group; return isset($field->attribute) && $field->attribute == $attribute_parts[1]; }, $default); + + return $this->addDeleteCallback($field); } } @@ -52,6 +54,13 @@ public function findFieldByAttribute($attribute, $default = null) }, $default); } + /** + * Flatten all groups into a single array + * + * @param Field $field + * @param $parentGroup + * @return array + */ private function flattenGroups(Field $field, $parentGroup = null) { $flattened = []; @@ -68,4 +77,36 @@ private function flattenGroups(Field $field, $parentGroup = null) } return $flattened; } + + /** + * Add the delete callback helper + * + * @param Field|null $field + * @return Field + */ + private function addDeleteCallback(?Field $field) + { + if (!$field) { + return $field; + } + + if (!isset($field->deleteCallback)) { + return $field; + } + + $callback = false; + if (is_callable($field->deleteCallback)) { + $callback = $field->deleteCallback; + } + + $field->delete(function(NovaRequest $request, $model) use ($callback) { + if ($callback && $callback() === true) { + return; + } + + return \Whitecube\NovaFlexibleContent\deleteFile($request, $model, $this); + }); + + return $field; + } } diff --git a/src/Fields/File.php b/src/Fields/File.php deleted file mode 100644 index 925bf981..00000000 --- a/src/Fields/File.php +++ /dev/null @@ -1,19 +0,0 @@ -delete(function(NovaRequest $request, $model) { - return \Whitecube\NovaFlexibleContent\deleteFile($request, $model, $this); - }); - - } -} \ No newline at end of file diff --git a/src/Fields/Image.php b/src/Fields/Image.php deleted file mode 100644 index eddb9c3b..00000000 --- a/src/Fields/Image.php +++ /dev/null @@ -1,19 +0,0 @@ -delete(function(NovaRequest $request, $model) { - return \Whitecube\NovaFlexibleContent\deleteFile($request, $model, $this); - }); - - } -} \ No newline at end of file From 289e110ed6afe4cf76d40afd41403e4024af1617 Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Wed, 13 Nov 2019 12:52:50 +0000 Subject: [PATCH 06/11] Fix issue with callback context --- src/Collections/FieldCollection.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Collections/FieldCollection.php b/src/Collections/FieldCollection.php index 83a27fed..0f32242c 100644 --- a/src/Collections/FieldCollection.php +++ b/src/Collections/FieldCollection.php @@ -86,11 +86,7 @@ private function flattenGroups(Field $field, $parentGroup = null) */ private function addDeleteCallback(?Field $field) { - if (!$field) { - return $field; - } - - if (!isset($field->deleteCallback)) { + if (!$field || !isset($field->deleteCallback)) { return $field; } @@ -100,8 +96,8 @@ private function addDeleteCallback(?Field $field) } $field->delete(function(NovaRequest $request, $model) use ($callback) { - if ($callback && $callback() === true) { - return; + if ($callback && $callback->call($this, ...func_get_args())) { + return true; } return \Whitecube\NovaFlexibleContent\deleteFile($request, $model, $this); From 34d2df67a8c7c4e1c61aba6357c8fba88f5589ef Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Fri, 15 Nov 2019 12:12:06 +0000 Subject: [PATCH 07/11] Fix bug with the delete callback --- src/Collections/FieldCollection.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Collections/FieldCollection.php b/src/Collections/FieldCollection.php index 0f32242c..94ce6130 100644 --- a/src/Collections/FieldCollection.php +++ b/src/Collections/FieldCollection.php @@ -95,12 +95,12 @@ private function addDeleteCallback(?Field $field) $callback = $field->deleteCallback; } - $field->delete(function(NovaRequest $request, $model) use ($callback) { - if ($callback && $callback->call($this, ...func_get_args())) { + $field->delete(function(NovaRequest $request, $model) use ($callback, $field) { + if ($callback && $callback->call($field, ...func_get_args())) { return true; } - return \Whitecube\NovaFlexibleContent\deleteFile($request, $model, $this); + return \Whitecube\NovaFlexibleContent\deleteFile($request, $model, $field); }); return $field; From 176d2de4bee0575174ee56c4c1ff3a3c0ba6eb83 Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Mon, 18 Nov 2019 08:42:08 +0000 Subject: [PATCH 08/11] Fix issue with original delete callback return --- src/Collections/FieldCollection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Collections/FieldCollection.php b/src/Collections/FieldCollection.php index 94ce6130..a2bc39e2 100644 --- a/src/Collections/FieldCollection.php +++ b/src/Collections/FieldCollection.php @@ -96,7 +96,7 @@ private function addDeleteCallback(?Field $field) } $field->delete(function(NovaRequest $request, $model) use ($callback, $field) { - if ($callback && $callback->call($field, ...func_get_args())) { + if ($callback && $callback->call($field, ...func_get_args()) === true) { return true; } From c317530548795b306e1888310a943b36d3db2e38 Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Mon, 18 Nov 2019 08:53:51 +0000 Subject: [PATCH 09/11] Update docblock return type --- src/Collections/FieldCollection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Collections/FieldCollection.php b/src/Collections/FieldCollection.php index a2bc39e2..76f3aaf8 100644 --- a/src/Collections/FieldCollection.php +++ b/src/Collections/FieldCollection.php @@ -82,7 +82,7 @@ private function flattenGroups(Field $field, $parentGroup = null) * Add the delete callback helper * * @param Field|null $field - * @return Field + * @return Field|null */ private function addDeleteCallback(?Field $field) { From 8c4754c35b777ed32f0a6f4eb201f28b31a13e55 Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Wed, 27 Nov 2019 18:46:03 +0000 Subject: [PATCH 10/11] Fix bug where groups can be null --- src/Collections/FieldCollection.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Collections/FieldCollection.php b/src/Collections/FieldCollection.php index 76f3aaf8..78fc6263 100644 --- a/src/Collections/FieldCollection.php +++ b/src/Collections/FieldCollection.php @@ -63,6 +63,10 @@ public function findFieldByAttribute($attribute, $default = null) */ private function flattenGroups(Field $field, $parentGroup = null) { + if (!$field->groups()) { + return []; + } + $flattened = []; foreach ($field->groups() as $i => $group) { $group->originalField = ($parentGroup ? $group->originalField . '.attributes.' : '') . $field->attribute; From 2635f72638281615f4923495538e9c335fb41d2f Mon Sep 17 00:00:00 2001 From: Chris Neal Date: Tue, 3 Dec 2019 18:42:03 +0000 Subject: [PATCH 11/11] Fix bug deleting nested flexible field asset --- src/Collections/FieldCollection.php | 10 ++++++---- src/Helper.php | 13 +++---------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/Collections/FieldCollection.php b/src/Collections/FieldCollection.php index 78fc6263..f20990b9 100644 --- a/src/Collections/FieldCollection.php +++ b/src/Collections/FieldCollection.php @@ -26,8 +26,9 @@ public function findFieldByAttribute($attribute, $default = null) $attribute_parts = explode('__', $attribute, 2); $groups = []; - foreach ($fields as $field) { + foreach ($fields as $i => $field) { if ($field instanceof Flexible) { + $field->index = $i; $groups = array_merge($groups, $this->flattenGroups($field)); } } @@ -68,10 +69,11 @@ private function flattenGroups(Field $field, $parentGroup = null) } $flattened = []; - foreach ($field->groups() as $i => $group) { - $group->originalField = ($parentGroup ? $group->originalField . '.attributes.' : '') . $field->attribute; - foreach ($group->fields() as $groupField) { + foreach ($field->groups() as $groupIndex => $group) { + $group->originalField = ($parentGroup ? $parentGroup->originalField . (isset($field->index) ? '.' . $field->index : '') . '.attributes.' : '') . $field->attribute . '.' . $groupIndex; + + foreach ($group->collectionFields() as $groupField) { if ($groupField instanceof Flexible) { $flattened = array_merge($flattened, $this->flattenGroups($groupField, $group)); } diff --git a/src/Helper.php b/src/Helper.php index 7c1885dc..33c72b1d 100644 --- a/src/Helper.php +++ b/src/Helper.php @@ -17,20 +17,13 @@ function deleteFile(NovaRequest $request, $model, $field) $path = explode('.', $field->group->originalField); $path[] = 'attributes'; $path[] = $field->attribute; + $mainField = array_shift($path); $data = $model->{$mainField}; - foreach ($data as $i => $group) { - if ($field->group->inUseKey() !== $group['key']) { - continue; - } - - Arr::set($group, implode('.', $path), ''); - - $data[$i] = $group; - $model->{$mainField} = $data; - } + Arr::set($data, implode('.', $path), ''); + $model->{$mainField} = $data; $model->save(); return true; }