From 8e7abcedda6222eea1256532e6681933048726aa Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 31 Oct 2024 16:55:54 +0000 Subject: [PATCH 1/9] Handle updating bard configs when field is from fieldset --- src/Transformers/BardTransformer.php | 73 ++++++++++++++++++++-------- src/WordPress/Gutenberg.php | 43 ++++++++++++++++ 2 files changed, 95 insertions(+), 21 deletions(-) diff --git a/src/Transformers/BardTransformer.php b/src/Transformers/BardTransformer.php index fac7d79..57754bd 100644 --- a/src/Transformers/BardTransformer.php +++ b/src/Transformers/BardTransformer.php @@ -3,6 +3,7 @@ namespace Statamic\Importer\Transformers; use Statamic\Facades\AssetContainer; +use Statamic\Facades\Fieldset; use Statamic\Fields\Field; use Statamic\Fieldtypes\Bard\Augmentor as BardAugmentor; use Statamic\Importer\WordPress\Gutenberg; @@ -56,29 +57,59 @@ public function transform(string $value): array private function enableBardButtons(): void { + $buttons = [ + 'h1', + 'h2', + 'h3', + 'bold', + 'italic', + 'unorderedlist', + 'orderedlist', + 'removeformat', + 'quote', + 'anchor', + 'image', + 'table', + 'horizontalrule', + 'codeblock', + 'underline', + 'superscript', + ]; + + if ($prefix = $this->field->prefix()) { + /** @var \Statamic\Fields\Fieldset $fieldset */ + $fieldset = $this->blueprint->fields()->items() + ->filter(fn (array $field) => isset($field['import'])) + ->map(fn (array $field) => Fieldset::find($field['import'])) + ->filter(function ($fieldset) use ($prefix) { + return collect($fieldset->fields()->items()) + ->where('handle', Str::after($this->field->handle(), $prefix)) + ->isNotEmpty(); + }) + ->first(); + + $fieldset->setContents([ + ...$fieldset->contents(), + 'fields' => collect($fieldset->contents()['fields']) + ->map(function (array $field) use ($buttons, $prefix) { + if ($field['handle'] === Str::after($this->field->handle(), $prefix)) { + return [ + 'handle' => $field['handle'], + 'field' => array_merge($field['field'], ['buttons' => $buttons]), + ]; + } + + return $field; + }) + ->all(), + ])->save(); + + return; + } + $this->blueprint->ensureFieldHasConfig( handle: $this->field->handle(), - config: array_merge($this->field->config(), [ - 'container' => $this->field->get('container') ?? AssetContainer::all()->first()?->handle(), - 'buttons' => [ - 'h1', - 'h2', - 'h3', - 'bold', - 'italic', - 'unorderedlist', - 'orderedlist', - 'removeformat', - 'quote', - 'anchor', - 'image', - 'table', - 'horizontalrule', - 'codeblock', - 'underline', - 'superscript', - ], - ]) + config: array_merge($this->field->config(), ['buttons' => $buttons]) ); $this->blueprint->save(); diff --git a/src/WordPress/Gutenberg.php b/src/WordPress/Gutenberg.php index 386c35a..6e83de7 100644 --- a/src/WordPress/Gutenberg.php +++ b/src/WordPress/Gutenberg.php @@ -4,6 +4,7 @@ use Statamic\Facades\AssetContainer; use Statamic\Facades\Blueprint as BlueprintFacade; +use Statamic\Facades\Fieldset; use Statamic\Fields\Blueprint; use Statamic\Fields\Field; use Statamic\Fieldtypes\Bard\Augmentor as BardAugmentor; @@ -405,6 +406,48 @@ protected static function ensureBardSet(Blueprint $blueprint, Field $field, stri return; } + if ($prefix = $field->prefix()) { + /** @var \Statamic\Fields\Fieldset $fieldset */ + $fieldset = $blueprint->fields()->items() + ->filter(fn (array $field) => isset($field['import'])) + ->map(fn (array $field) => Fieldset::find($field['import'])) + ->filter(function ($fieldset) use ($field, $prefix) { + return collect($fieldset->fields()->items()) + ->where('handle', Str::after($field->handle(), $prefix)) + ->isNotEmpty(); + }) + ->first(); + + $fieldset->setContents([ + ...$fieldset->contents(), + 'fields' => collect($fieldset->contents()['fields']) + ->map(function (array $fieldsetField) use ($field, $handle, $config, $prefix) { + if ($fieldsetField['handle'] === Str::after($field->handle(), $prefix)) { + return [ + 'handle' => $fieldsetField['handle'], + 'field' => array_merge($fieldsetField['field'], [ + ...$field->config(), + 'sets' => array_merge($field->get('sets', []), [ + 'main' => array_merge($field->get('sets.main', []), [ + 'sets' => array_merge($field->get('sets.main.sets', []), [ + $handle => $config, + ]), + ]), + ]), + ]), + ]; + } + + return $fieldsetField; + }) + ->all(), + ])->save(); + + return; + } + + + $blueprint ->ensureFieldHasConfig($field->handle(), [ ...$field->config(), From f7d16ce2dbb8accfad99c42938f27bb150c57662 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 31 Oct 2024 16:56:09 +0000 Subject: [PATCH 2/9] Add tests --- tests/Transformers/BardTransformerTest.php | 75 ++++++++++++++++++++++ tests/WordPress/GutenbergTest.php | 34 ++++++++++ 2 files changed, 109 insertions(+) diff --git a/tests/Transformers/BardTransformerTest.php b/tests/Transformers/BardTransformerTest.php index 303480e..a613ad0 100644 --- a/tests/Transformers/BardTransformerTest.php +++ b/tests/Transformers/BardTransformerTest.php @@ -6,6 +6,7 @@ use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\AssetContainer; use Statamic\Facades\Collection; +use Statamic\Facades\Fieldset; use Statamic\Importer\Tests\TestCase; use Statamic\Importer\Transformers\BardTransformer; use Statamic\Testing\Concerns\PreventsSavingStacheItemsToDisk; @@ -136,4 +137,78 @@ public function it_doesnt_handles_images_without_base_url() ], ], $output); } + + #[Test] + public function is_enables_buttons_on_bard_field() + { + $transformer = new BardTransformer($this->blueprint, $this->field, []); + + $transformer->transform('

Hello world!

'); + + $blueprint = $this->collection->entryBlueprint(); + + $this->assertEquals([ + 'h1', + 'h2', + 'h3', + 'bold', + 'italic', + 'unorderedlist', + 'orderedlist', + 'removeformat', + 'quote', + 'anchor', + 'image', + 'table', + 'horizontalrule', + 'codeblock', + 'underline', + 'superscript', + ], $blueprint->field('content')->get('buttons')); + } + + #[Test] + public function is_enables_buttons_on_bard_field_in_fieldset() + { + Fieldset::make('content_stuff')->setContents(['fields' => [ + ['handle' => 'bard_basic', 'field' => ['type' => 'bard']], + ]])->save(); + + $blueprint = $this->collection->entryBlueprint(); + + $this->blueprint->setContents([ + 'sections' => [ + 'main' => [ + 'fields' => [ + ['import' => 'content_stuff', 'prefix' => 'resources_'], + ], + ], + ], + ])->save(); + + $transformer = new BardTransformer($blueprint, $blueprint->field('resources_bard_basic'), []); + + $transformer->transform('

Hello world!

'); + + $fieldset = Fieldset::find('content_stuff'); + + $this->assertEquals([ + 'h1', + 'h2', + 'h3', + 'bold', + 'italic', + 'unorderedlist', + 'orderedlist', + 'removeformat', + 'quote', + 'anchor', + 'image', + 'table', + 'horizontalrule', + 'codeblock', + 'underline', + 'superscript', + ], $fieldset->field('bard_basic')->get('buttons')); + } } diff --git a/tests/WordPress/GutenbergTest.php b/tests/WordPress/GutenbergTest.php index 5667c5c..8afa50a 100644 --- a/tests/WordPress/GutenbergTest.php +++ b/tests/WordPress/GutenbergTest.php @@ -10,6 +10,7 @@ use Statamic\Facades\AssetContainer; use Statamic\Facades\Blueprint; use Statamic\Facades\Collection; +use Statamic\Facades\Fieldset; use Statamic\Importer\Tests\TestCase; use Statamic\Importer\WordPress\Gutenberg; use Statamic\Testing\Concerns\PreventsSavingStacheItemsToDisk; @@ -767,6 +768,39 @@ public function it_transforms_spacer_blocks() ], $output); } + #[Test] + public function it_append_sets_to_bard_field_in_fieldset() + { + Fieldset::make('content_stuff')->setContents(['fields' => [ + ['handle' => 'bard_basic', 'field' => ['type' => 'bard']], + ]])->save(); + + $this->blueprint->setContents([ + 'sections' => [ + 'main' => [ + 'fields' => [ + ['import' => 'content_stuff', 'prefix' => 'resources_'], + ], + ], + ], + ])->save(); + + Gutenberg::toBard( + config: [], + blueprint: $this->blueprint, + field: $this->blueprint->field('resources_bard_basic'), + value: <<<'HTML' + + + +HTML + ); + + $fieldset = Fieldset::find('content_stuff'); + + $this->assertSetExists('spacer', $fieldset->field('bard_basic')); + } + #[Test] public function it_returns_hook_output() { From 6403f8c0c27c483597507ea1d406a21f89450d9c Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 31 Oct 2024 17:43:05 +0000 Subject: [PATCH 3/9] Handle case where only a single field is being imported --- src/Transformers/BardTransformer.php | 29 +++++++++++++++++++++ src/WordPress/Gutenberg.php | 38 ++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/src/Transformers/BardTransformer.php b/src/Transformers/BardTransformer.php index 57754bd..e32e21d 100644 --- a/src/Transformers/BardTransformer.php +++ b/src/Transformers/BardTransformer.php @@ -76,6 +76,35 @@ private function enableBardButtons(): void 'superscript', ]; + $importedField = $this->blueprint->fields()->items() + ->where('handle', $this->field->handle()) + ->filter(fn (array $field) => isset($field['field']) && is_string($field['field'])) + ->first(); + + if ($importedField) { + /** @var \Statamic\Fields\Fieldset $fieldset */ + $fieldHandle = Str::after($importedField['field'], '.'); + $fieldset = Fieldset::find(Str::before($importedField['field'], '.')); + + $fieldset->setContents([ + ...$fieldset->contents(), + 'fields' => collect($fieldset->contents()['fields']) + ->map(function (array $field) use ($buttons, $fieldHandle) { + if ($field['handle'] === $fieldHandle) { + return [ + 'handle' => $field['handle'], + 'field' => array_merge($field['field'], ['buttons' => $buttons]), + ]; + } + + return $field; + }) + ->all(), + ])->save(); + + return; + } + if ($prefix = $this->field->prefix()) { /** @var \Statamic\Fields\Fieldset $fieldset */ $fieldset = $this->blueprint->fields()->items() diff --git a/src/WordPress/Gutenberg.php b/src/WordPress/Gutenberg.php index 6e83de7..386eb96 100644 --- a/src/WordPress/Gutenberg.php +++ b/src/WordPress/Gutenberg.php @@ -406,6 +406,44 @@ protected static function ensureBardSet(Blueprint $blueprint, Field $field, stri return; } + $importedField = $blueprint->fields()->items() + ->where('handle', $field->handle()) + ->filter(fn (array $field) => isset($field['field']) && is_string($field['field'])) + ->first(); + + if ($importedField) { + /** @var \Statamic\Fields\Fieldset $fieldset */ + $fieldHandle = Str::after($importedField['field'], '.'); + $fieldset = Fieldset::find(Str::before($importedField['field'], '.')); + + $fieldset->setContents([ + ...$fieldset->contents(), + 'fields' => collect($fieldset->contents()['fields']) + ->map(function (array $fieldsetField) use ($field, $handle, $config, $fieldHandle) { + if ($fieldsetField['handle'] === $fieldHandle) { + return [ + 'handle' => $fieldsetField['handle'], + 'field' => array_merge($fieldsetField['field'], [ + ...$field->config(), + 'sets' => array_merge($field->get('sets', []), [ + 'main' => array_merge($field->get('sets.main', []), [ + 'sets' => array_merge($field->get('sets.main.sets', []), [ + $handle => $config, + ]), + ]), + ]), + ]), + ]; + } + + return $field; + }) + ->all(), + ])->save(); + + return; + } + if ($prefix = $field->prefix()) { /** @var \Statamic\Fields\Fieldset $fieldset */ $fieldset = $blueprint->fields()->items() From 7b3725917ad718c3a19912833bcbd6f91b1ada3c Mon Sep 17 00:00:00 2001 From: duncanmcclean Date: Thu, 31 Oct 2024 17:44:07 +0000 Subject: [PATCH 4/9] Fix styling --- src/WordPress/Gutenberg.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/WordPress/Gutenberg.php b/src/WordPress/Gutenberg.php index 386eb96..902cbda 100644 --- a/src/WordPress/Gutenberg.php +++ b/src/WordPress/Gutenberg.php @@ -484,8 +484,6 @@ protected static function ensureBardSet(Blueprint $blueprint, Field $field, stri return; } - - $blueprint ->ensureFieldHasConfig($field->handle(), [ ...$field->config(), From a41f757091120dae893cec7327621edfbbfb2591 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Tue, 12 Nov 2024 12:31:00 +0000 Subject: [PATCH 5/9] Update tests. --- tests/Transformers/BardTransformerTest.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/Transformers/BardTransformerTest.php b/tests/Transformers/BardTransformerTest.php index a1b7533..ebc061a 100644 --- a/tests/Transformers/BardTransformerTest.php +++ b/tests/Transformers/BardTransformerTest.php @@ -160,7 +160,12 @@ public function it_doesnt_handles_images_without_base_url() #[Test] public function is_enables_buttons_on_bard_field() { - $transformer = new BardTransformer($this->blueprint, $this->field, []); + $transformer = new BardTransformer( + import: $this->import, + blueprint: $this->blueprint, + field: $this->field, + config: [] + ); $transformer->transform('

Hello world!

'); @@ -205,7 +210,12 @@ public function is_enables_buttons_on_bard_field_in_fieldset() ], ])->save(); - $transformer = new BardTransformer($blueprint, $blueprint->field('resources_bard_basic'), []); + $transformer = new BardTransformer( + import: $this->import, + blueprint: $blueprint, + field: $blueprint->field('resources_bard_basic'), + config: [] + ); $transformer->transform('

Hello world!

'); From 24f962ef3ad30b10006ea865c92b2606fdc1d4d7 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Tue, 12 Nov 2024 12:51:00 +0000 Subject: [PATCH 6/9] Add tests to cover importing single fields. --- tests/Transformers/BardTransformerTest.php | 60 ++++++++++++++++++++-- tests/WordPress/GutenbergTest.php | 41 +++++++++++++-- 2 files changed, 92 insertions(+), 9 deletions(-) diff --git a/tests/Transformers/BardTransformerTest.php b/tests/Transformers/BardTransformerTest.php index ebc061a..03f6b05 100644 --- a/tests/Transformers/BardTransformerTest.php +++ b/tests/Transformers/BardTransformerTest.php @@ -158,7 +158,7 @@ public function it_doesnt_handles_images_without_base_url() } #[Test] - public function is_enables_buttons_on_bard_field() + public function it_enables_buttons_on_bard_field() { $transformer = new BardTransformer( import: $this->import, @@ -192,10 +192,60 @@ public function is_enables_buttons_on_bard_field() } #[Test] - public function is_enables_buttons_on_bard_field_in_fieldset() + public function it_enables_buttons_on_imported_bard_field() { Fieldset::make('content_stuff')->setContents(['fields' => [ - ['handle' => 'bard_basic', 'field' => ['type' => 'bard']], + ['handle' => 'bard_field', 'field' => ['type' => 'bard']], + ]])->save(); + + $blueprint = $this->collection->entryBlueprint(); + + $this->blueprint->setContents([ + 'sections' => [ + 'main' => [ + 'fields' => [ + ['handle' => 'bard_field', 'field' => 'content_stuff.bard_field'], + ], + ], + ], + ])->save(); + + $transformer = new BardTransformer( + import: $this->import, + blueprint: $blueprint, + field: $blueprint->field('bard_field'), + config: [] + ); + + $transformer->transform('

Hello world!

'); + + $fieldset = Fieldset::find('content_stuff'); + + $this->assertEquals([ + 'h1', + 'h2', + 'h3', + 'bold', + 'italic', + 'unorderedlist', + 'orderedlist', + 'removeformat', + 'quote', + 'anchor', + 'image', + 'table', + 'horizontalrule', + 'codeblock', + 'underline', + 'superscript', + ], $fieldset->field('bard_field')->get('buttons')); + } + + #[Test] + public function it_enables_buttons_on_imported_bard_field_with_prefix() + { + Fieldset::make('content_stuff')->setContents(['fields' => [ + ['handle' => 'bard_field', 'field' => ['type' => 'bard']], ]])->save(); $blueprint = $this->collection->entryBlueprint(); @@ -213,7 +263,7 @@ public function is_enables_buttons_on_bard_field_in_fieldset() $transformer = new BardTransformer( import: $this->import, blueprint: $blueprint, - field: $blueprint->field('resources_bard_basic'), + field: $blueprint->field('resources_bard_field'), config: [] ); @@ -238,6 +288,6 @@ public function is_enables_buttons_on_bard_field_in_fieldset() 'codeblock', 'underline', 'superscript', - ], $fieldset->field('bard_basic')->get('buttons')); + ], $fieldset->field('bard_field')->get('buttons')); } } diff --git a/tests/WordPress/GutenbergTest.php b/tests/WordPress/GutenbergTest.php index 8afa50a..129c122 100644 --- a/tests/WordPress/GutenbergTest.php +++ b/tests/WordPress/GutenbergTest.php @@ -769,10 +769,43 @@ public function it_transforms_spacer_blocks() } #[Test] - public function it_append_sets_to_bard_field_in_fieldset() + public function it_append_sets_to_imported_bard_field() { Fieldset::make('content_stuff')->setContents(['fields' => [ - ['handle' => 'bard_basic', 'field' => ['type' => 'bard']], + ['handle' => 'bard_field', 'field' => ['type' => 'bard']], + ]])->save(); + + $this->blueprint->setContents([ + 'sections' => [ + 'main' => [ + 'fields' => [ + ['handle' => 'bard_field', 'field' => 'content_stuff.bard_field'], + ], + ], + ], + ])->save(); + + Gutenberg::toBard( + config: [], + blueprint: $this->blueprint, + field: $this->blueprint->field('bard_field'), + value: <<<'HTML' + + + +HTML + ); + + $fieldset = Fieldset::find('content_stuff'); + + $this->assertSetExists('spacer', $fieldset->field('bard_field')); + } + + #[Test] + public function it_append_sets_to_imported_bard_field_with_prefix() + { + Fieldset::make('content_stuff')->setContents(['fields' => [ + ['handle' => 'bard_field', 'field' => ['type' => 'bard']], ]])->save(); $this->blueprint->setContents([ @@ -788,7 +821,7 @@ public function it_append_sets_to_bard_field_in_fieldset() Gutenberg::toBard( config: [], blueprint: $this->blueprint, - field: $this->blueprint->field('resources_bard_basic'), + field: $this->blueprint->field('resources_bard_field'), value: <<<'HTML' @@ -798,7 +831,7 @@ public function it_append_sets_to_bard_field_in_fieldset() $fieldset = Fieldset::find('content_stuff'); - $this->assertSetExists('spacer', $fieldset->field('bard_basic')); + $this->assertSetExists('spacer', $fieldset->field('bard_field')); } #[Test] From fc06a037841fbd9ab3bf7aecc635394a270a21fb Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Tue, 12 Nov 2024 15:37:14 +0000 Subject: [PATCH 7/9] Extract field update logic into a class. --- src/Support/FieldUpdater.php | 138 +++++++++++++++++++++++++++ src/Transformers/BardTransformer.php | 70 +------------- src/WordPress/Gutenberg.php | 90 ++--------------- 3 files changed, 149 insertions(+), 149 deletions(-) create mode 100644 src/Support/FieldUpdater.php diff --git a/src/Support/FieldUpdater.php b/src/Support/FieldUpdater.php new file mode 100644 index 0000000..79c4185 --- /dev/null +++ b/src/Support/FieldUpdater.php @@ -0,0 +1,138 @@ +field = $field; + + return $this; + } + + public function blueprint(Blueprint $blueprint): self + { + $this->blueprint = $blueprint; + + return $this; + } + + public function updateFieldConfig(array $config): void + { + if ($prefix = $this->field->prefix()) { + $this->updatePrefixedField($prefix, $config); + return; + } + + if ($importedField = $this->getImportedField()) { + $this->updateImportedField($importedField, $config); + return; + } + + $this->blueprint->ensureFieldHasConfig( + handle: $this->field->handle(), + config: $config + ); + + $this->blueprint->save(); + } + + private function getImportedField(): ?array + { + return $this->blueprint->fields()->items() + ->where('handle', $this->field->handle()) + ->filter(fn (array $field) => isset($field['field']) && is_string($field['field'])) + ->first(); + } + + /** + * This method handles updating imported fields from fieldsets. + * + * - + * handle: foo + * field: fieldset.foo + */ + private function updateImportedField(array $importedField, array $config): void + { + /** @var \Statamic\Fields\Fieldset $fieldset */ + $fieldHandle = Str::after($importedField['field'], '.'); + $fieldset = Fieldset::find(Str::before($importedField['field'], '.')); + + $fieldset->setContents([ + ...$fieldset->contents(), + 'fields' => collect($fieldset->contents()['fields']) + ->map(function (array $field) use ($config, $fieldHandle) { + if ($field['handle'] === $fieldHandle) { + return [ + 'handle' => $field['handle'], + 'field' => $config, + ]; + } + + return $field; + }) + ->all(), + ]); + + $fieldset->save(); + + $this->clearBlinkCaches(); + } + + /** + * This method handles updating imported fields from fieldsets, which use a prefix. + * + * - + * import: fieldset + * prefix: foo_ + */ + private function updatePrefixedField(string $prefix, array $config): void + { + /** @var \Statamic\Fields\Fieldset $fieldset */ + $fieldset = $this->blueprint->fields()->items() + ->filter(fn (array $field) => isset($field['import'])) + ->map(fn (array $field) => Fieldset::find($field['import'])) + ->filter(function ($fieldset) use ($prefix) { + return collect($fieldset->fields()->items()) + ->where('handle', Str::after($this->field->handle(), $prefix)) + ->isNotEmpty(); + }) + ->first(); + + $fieldset->setContents([ + ...$fieldset->contents(), + 'fields' => collect($fieldset->contents()['fields']) + ->map(function (array $field) use ($config, $prefix) { + if ($field['handle'] === Str::after($this->field->handle(), $prefix)) { + return [ + 'handle' => $field['handle'], + 'field' => $config, + ]; + } + + return $field; + }) + ->all(), + ]); + + $fieldset->save(); + + $this->clearBlinkCaches(); + } + + private function clearBlinkCaches(): void + { + Blink::store('blueprints.found')->flush(); + Blink::store('blueprints.from-file')->flush(); + } +} diff --git a/src/Transformers/BardTransformer.php b/src/Transformers/BardTransformer.php index e32e21d..5ef790d 100644 --- a/src/Transformers/BardTransformer.php +++ b/src/Transformers/BardTransformer.php @@ -6,6 +6,7 @@ use Statamic\Facades\Fieldset; use Statamic\Fields\Field; use Statamic\Fieldtypes\Bard\Augmentor as BardAugmentor; +use Facades\Statamic\Importer\Support\FieldUpdater; use Statamic\Importer\WordPress\Gutenberg; use Statamic\Support\Str; @@ -76,72 +77,9 @@ private function enableBardButtons(): void 'superscript', ]; - $importedField = $this->blueprint->fields()->items() - ->where('handle', $this->field->handle()) - ->filter(fn (array $field) => isset($field['field']) && is_string($field['field'])) - ->first(); - - if ($importedField) { - /** @var \Statamic\Fields\Fieldset $fieldset */ - $fieldHandle = Str::after($importedField['field'], '.'); - $fieldset = Fieldset::find(Str::before($importedField['field'], '.')); - - $fieldset->setContents([ - ...$fieldset->contents(), - 'fields' => collect($fieldset->contents()['fields']) - ->map(function (array $field) use ($buttons, $fieldHandle) { - if ($field['handle'] === $fieldHandle) { - return [ - 'handle' => $field['handle'], - 'field' => array_merge($field['field'], ['buttons' => $buttons]), - ]; - } - - return $field; - }) - ->all(), - ])->save(); - - return; - } - - if ($prefix = $this->field->prefix()) { - /** @var \Statamic\Fields\Fieldset $fieldset */ - $fieldset = $this->blueprint->fields()->items() - ->filter(fn (array $field) => isset($field['import'])) - ->map(fn (array $field) => Fieldset::find($field['import'])) - ->filter(function ($fieldset) use ($prefix) { - return collect($fieldset->fields()->items()) - ->where('handle', Str::after($this->field->handle(), $prefix)) - ->isNotEmpty(); - }) - ->first(); - - $fieldset->setContents([ - ...$fieldset->contents(), - 'fields' => collect($fieldset->contents()['fields']) - ->map(function (array $field) use ($buttons, $prefix) { - if ($field['handle'] === Str::after($this->field->handle(), $prefix)) { - return [ - 'handle' => $field['handle'], - 'field' => array_merge($field['field'], ['buttons' => $buttons]), - ]; - } - - return $field; - }) - ->all(), - ])->save(); - - return; - } - - $this->blueprint->ensureFieldHasConfig( - handle: $this->field->handle(), - config: array_merge($this->field->config(), ['buttons' => $buttons]) - ); - - $this->blueprint->save(); + FieldUpdater::field($this->field) + ->blueprint($this->blueprint) + ->updateFieldConfig(array_merge($this->field->config(), ['buttons' => $buttons])); } private function isGutenbergValue(string $value): bool diff --git a/src/WordPress/Gutenberg.php b/src/WordPress/Gutenberg.php index ea4bd71..322791a 100644 --- a/src/WordPress/Gutenberg.php +++ b/src/WordPress/Gutenberg.php @@ -2,7 +2,9 @@ namespace Statamic\Importer\WordPress; +use Facades\Statamic\Importer\Support\FieldUpdater; use Statamic\Facades\AssetContainer; +use Statamic\Facades\Blink; use Statamic\Facades\Blueprint as BlueprintFacade; use Statamic\Facades\Fieldset; use Statamic\Fields\Blueprint; @@ -399,7 +401,7 @@ protected static function renderHtmlToProsemirror(Field $field, string $html) protected static function ensureBardSet(Blueprint $blueprint, Field $field, string $handle, array $config): void { - $blueprint = BlueprintFacade::find("{$blueprint->namespace()}.{$blueprint->handle()}"); + $blueprint = BlueprintFacade::find($blueprint->fullyQualifiedHandle()); $field = $blueprint->field($field->handle()); $setExists = collect($field->get('sets', []))->contains( @@ -410,86 +412,9 @@ protected static function ensureBardSet(Blueprint $blueprint, Field $field, stri return; } - $importedField = $blueprint->fields()->items() - ->where('handle', $field->handle()) - ->filter(fn (array $field) => isset($field['field']) && is_string($field['field'])) - ->first(); - - if ($importedField) { - /** @var \Statamic\Fields\Fieldset $fieldset */ - $fieldHandle = Str::after($importedField['field'], '.'); - $fieldset = Fieldset::find(Str::before($importedField['field'], '.')); - - $fieldset->setContents([ - ...$fieldset->contents(), - 'fields' => collect($fieldset->contents()['fields']) - ->map(function (array $fieldsetField) use ($field, $handle, $config, $fieldHandle) { - if ($fieldsetField['handle'] === $fieldHandle) { - return [ - 'handle' => $fieldsetField['handle'], - 'field' => array_merge($fieldsetField['field'], [ - ...$field->config(), - 'sets' => array_merge($field->get('sets', []), [ - 'main' => array_merge($field->get('sets.main', []), [ - 'sets' => array_merge($field->get('sets.main.sets', []), [ - $handle => $config, - ]), - ]), - ]), - ]), - ]; - } - - return $field; - }) - ->all(), - ])->save(); - - return; - } - - if ($prefix = $field->prefix()) { - /** @var \Statamic\Fields\Fieldset $fieldset */ - $fieldset = $blueprint->fields()->items() - ->filter(fn (array $field) => isset($field['import'])) - ->map(fn (array $field) => Fieldset::find($field['import'])) - ->filter(function ($fieldset) use ($field, $prefix) { - return collect($fieldset->fields()->items()) - ->where('handle', Str::after($field->handle(), $prefix)) - ->isNotEmpty(); - }) - ->first(); - - $fieldset->setContents([ - ...$fieldset->contents(), - 'fields' => collect($fieldset->contents()['fields']) - ->map(function (array $fieldsetField) use ($field, $handle, $config, $prefix) { - if ($fieldsetField['handle'] === Str::after($field->handle(), $prefix)) { - return [ - 'handle' => $fieldsetField['handle'], - 'field' => array_merge($fieldsetField['field'], [ - ...$field->config(), - 'sets' => array_merge($field->get('sets', []), [ - 'main' => array_merge($field->get('sets.main', []), [ - 'sets' => array_merge($field->get('sets.main.sets', []), [ - $handle => $config, - ]), - ]), - ]), - ]), - ]; - } - - return $fieldsetField; - }) - ->all(), - ])->save(); - - return; - } - - $blueprint - ->ensureFieldHasConfig($field->handle(), [ + FieldUpdater::field($field) + ->blueprint($blueprint) + ->updateFieldConfig([ ...$field->config(), 'sets' => array_merge($field->get('sets', []), [ 'main' => array_merge($field->get('sets.main', []), [ @@ -498,7 +423,6 @@ protected static function ensureBardSet(Blueprint $blueprint, Field $field, stri ]), ]), ]), - ]) - ->save(); + ]); } } From 1af9ac9004fcc6bc7ce5955063268f2fee04fab6 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Tue, 12 Nov 2024 15:43:38 +0000 Subject: [PATCH 8/9] Add comment for future me. --- src/Support/FieldUpdater.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Support/FieldUpdater.php b/src/Support/FieldUpdater.php index 79c4185..41b9f96 100644 --- a/src/Support/FieldUpdater.php +++ b/src/Support/FieldUpdater.php @@ -130,6 +130,10 @@ private function updatePrefixedField(string $prefix, array $config): void $this->clearBlinkCaches(); } + /** + * When fieldsets are updated, we need to clear the Blueprint Blink caches, so + * Blueprint::find() returns the updated field config. + */ private function clearBlinkCaches(): void { Blink::store('blueprints.found')->flush(); From e7025ca3442d840f826bc847fb7addbcaba58707 Mon Sep 17 00:00:00 2001 From: duncanmcclean Date: Fri, 29 Nov 2024 10:50:43 +0000 Subject: [PATCH 9/9] Fix styling --- src/Support/FieldUpdater.php | 2 ++ src/Transformers/BardTransformer.php | 3 +-- src/WordPress/Gutenberg.php | 2 -- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Support/FieldUpdater.php b/src/Support/FieldUpdater.php index 41b9f96..98dab03 100644 --- a/src/Support/FieldUpdater.php +++ b/src/Support/FieldUpdater.php @@ -31,11 +31,13 @@ public function updateFieldConfig(array $config): void { if ($prefix = $this->field->prefix()) { $this->updatePrefixedField($prefix, $config); + return; } if ($importedField = $this->getImportedField()) { $this->updateImportedField($importedField, $config); + return; } diff --git a/src/Transformers/BardTransformer.php b/src/Transformers/BardTransformer.php index f37a943..b4a9fc5 100644 --- a/src/Transformers/BardTransformer.php +++ b/src/Transformers/BardTransformer.php @@ -2,11 +2,10 @@ namespace Statamic\Importer\Transformers; +use Facades\Statamic\Importer\Support\FieldUpdater; use Statamic\Facades\AssetContainer; -use Statamic\Facades\Fieldset; use Statamic\Fields\Field; use Statamic\Fieldtypes\Bard\Augmentor as BardAugmentor; -use Facades\Statamic\Importer\Support\FieldUpdater; use Statamic\Importer\WordPress\Gutenberg; use Statamic\Support\Str; diff --git a/src/WordPress/Gutenberg.php b/src/WordPress/Gutenberg.php index 10d724a..787737a 100644 --- a/src/WordPress/Gutenberg.php +++ b/src/WordPress/Gutenberg.php @@ -4,9 +4,7 @@ use Facades\Statamic\Importer\Support\FieldUpdater; use Statamic\Facades\AssetContainer; -use Statamic\Facades\Blink; use Statamic\Facades\Blueprint as BlueprintFacade; -use Statamic\Facades\Fieldset; use Statamic\Fields\Blueprint; use Statamic\Fields\Field; use Statamic\Fieldtypes\Bard\Augmentor as BardAugmentor;