Skip to content

Commit 3bc0da4

Browse files
committed
Streamline and simplify
1 parent 2bcab06 commit 3bc0da4

File tree

4 files changed

+84
-33
lines changed

4 files changed

+84
-33
lines changed

src/Fields/Fieldset.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,25 @@ public function initialPath($path = null)
6363
return $this;
6464
}
6565

66+
/**
67+
* Canonical storage: either top-level `fields` (flat) or non-empty `sections`, never both.
68+
* Hand-edited YAML or mixed input is normalized on save.
69+
*/
6670
public function setContents(array $contents)
6771
{
68-
$contents['fields'] = $this->normalizeFields(Arr::get($contents, 'fields', []));
69-
7072
if (array_key_exists('sections', $contents)) {
7173
$contents['sections'] = $this->normalizeSections(Arr::get($contents, 'sections', []));
7274
}
7375

76+
$usesSections = array_key_exists('sections', $contents) && ! empty($contents['sections']);
77+
78+
if ($usesSections) {
79+
unset($contents['fields']);
80+
} else {
81+
unset($contents['sections']);
82+
$contents['fields'] = $this->normalizeFields(Arr::get($contents, 'fields', []));
83+
}
84+
7485
$this->contents = $contents;
7586

7687
return $this;

src/Http/Controllers/CP/Fields/FieldsetController.php

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -132,38 +132,27 @@ public function update(Request $request, $fieldset)
132132
'fields' => 'array',
133133
]);
134134

135-
$contents = array_merge($fieldset->contents(), [
136-
'title' => $request->title,
137-
]);
135+
$base = array_merge(
136+
Arr::except($fieldset->contents(), ['fields', 'sections']),
137+
['title' => $request->title],
138+
);
138139

139140
if ($request->has('sections')) {
140-
$sections = collect($request->sections)->map(function ($section) {
141-
return Arr::removeNullValues([
142-
'display' => Arr::get($section, 'display'),
143-
'instructions' => Arr::get($section, 'instructions'),
144-
'collapsible' => ($collapsible = Arr::get($section, 'collapsible')) ?: null,
145-
'collapsed' => ($collapsible && Arr::get($section, 'collapsed')) ?: null,
146-
'fields' => collect(Arr::get($section, 'fields', []))->map(function ($field) {
147-
return FieldTransformer::fromVue($field);
148-
})->all(),
149-
]);
150-
})->all();
151-
152-
if ($this->shouldStoreAsFlatFields($sections)) {
153-
$contents['fields'] = Arr::get($sections, '0.fields', []);
154-
unset($contents['sections']);
155-
} else {
156-
$contents['sections'] = $sections;
157-
}
141+
$sections = $this->sectionsFromVueRequest($request->sections);
142+
143+
$fieldset->setContents(
144+
$this->shouldStoreAsFlatFields($sections)
145+
? $base + ['fields' => Arr::get($sections, '0.fields', [])]
146+
: $base + ['sections' => $sections]
147+
);
158148
} else {
159-
$contents['fields'] = collect($request->fields)->map(function ($field) {
160-
return FieldTransformer::fromVue($field);
161-
})->all();
162-
unset($contents['sections']);
149+
$fieldset->setContents($base + [
150+
'fields' => collect($request->fields)
151+
->map(fn ($field) => FieldTransformer::fromVue($field))
152+
->all(),
153+
]);
163154
}
164155

165-
$fieldset->setContents($contents);
166-
167156
$fieldset->validateRecursion();
168157

169158
$fieldset->save();
@@ -242,6 +231,21 @@ private function groupKey(Fieldset $fieldset): string
242231
return __('My Fieldsets');
243232
}
244233

234+
private function sectionsFromVueRequest(array $sections): array
235+
{
236+
return collect($sections)->map(function ($section) {
237+
return Arr::removeNullValues([
238+
'display' => Arr::get($section, 'display'),
239+
'instructions' => Arr::get($section, 'instructions'),
240+
'collapsible' => ($collapsible = Arr::get($section, 'collapsible')) ?: null,
241+
'collapsed' => ($collapsible && Arr::get($section, 'collapsed')) ?: null,
242+
'fields' => collect(Arr::get($section, 'fields', []))
243+
->map(fn ($field) => FieldTransformer::fromVue($field))
244+
->all(),
245+
]);
246+
})->all();
247+
}
248+
245249
private function sectionsToVue(Fieldset $fieldset): array
246250
{
247251
$sections = $fieldset->hasSections()

tests/Feature/Fieldsets/UpdateFieldsetTest.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,6 @@ public function fieldset_gets_saved_with_sections()
160160
$this->assertEquals([
161161
'title' => 'Updated title',
162162
'foo' => 'bar',
163-
'fields' => [
164-
['handle' => 'legacy', 'field' => ['type' => 'text']],
165-
],
166163
'sections' => [
167164
[
168165
'display' => 'SEO',
@@ -273,7 +270,6 @@ public function import_section_behavior_is_saved_when_flattening_sections()
273270

274271
$this->assertEquals([
275272
'title' => 'Updated',
276-
'fields' => [],
277273
'sections' => [
278274
[
279275
'display' => 'Main',

tests/Fields/FieldsetTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,46 @@ public function it_gets_fields_from_sections()
155155
$this->assertEquals(['text', 'textarea'], $fields->map->type()->values()->all());
156156
}
157157

158+
#[Test]
159+
public function it_drops_empty_sections_when_storing_flat_fields()
160+
{
161+
$fieldset = new Fieldset;
162+
163+
$fieldset->setContents([
164+
'title' => 'Test',
165+
'sections' => [],
166+
'fields' => [
167+
['handle' => 'one', 'field' => ['type' => 'text']],
168+
],
169+
]);
170+
171+
$this->assertArrayNotHasKey('sections', $fieldset->contents());
172+
$this->assertEquals('one', $fieldset->fields()->all()->first()->handle());
173+
}
174+
175+
#[Test]
176+
public function it_drops_top_level_fields_when_storing_sections()
177+
{
178+
$fieldset = new Fieldset;
179+
180+
$fieldset->setContents([
181+
'sections' => [
182+
[
183+
'display' => 'A',
184+
'fields' => [
185+
['handle' => 'one', 'field' => ['type' => 'text']],
186+
],
187+
],
188+
],
189+
'fields' => [
190+
['handle' => 'stale', 'field' => ['type' => 'text']],
191+
],
192+
]);
193+
194+
$this->assertArrayNotHasKey('fields', $fieldset->contents());
195+
$this->assertEquals(['one'], $fieldset->fields()->all()->keys()->all());
196+
}
197+
158198
#[Test]
159199
public function it_normalizes_legacy_section_fields_syntax()
160200
{

0 commit comments

Comments
 (0)