Skip to content

Commit e11f1e4

Browse files
committed
Handle fields that might be builders for the future
1 parent 887affa commit e11f1e4

File tree

1 file changed

+34
-4
lines changed

1 file changed

+34
-4
lines changed

src/Concerns/CanMapDynamicFields.php

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Backstage\Fields\Fields\Textarea;
2020
use Backstage\Fields\Fields\Toggle;
2121
use Backstage\Fields\Models\Field as Model;
22+
use Backstage\Fields\Models\Field as ModelsField;
2223
use Illuminate\Support\Collection;
2324
use Livewire\Attributes\On;
2425

@@ -59,7 +60,9 @@ protected function mutateBeforeFill(array $data): array
5960
return $data;
6061
}
6162

62-
return $this->mutateFormData($data, function ($field, $fieldConfig, $fieldInstance, $data) {
63+
$fields = $this->record->fields;
64+
65+
return $this->mutateFormData($data, $fields, function ($field, $fieldConfig, $fieldInstance, $data) {
6366
if (! empty($fieldConfig['methods']['mutateFormDataCallback'])) {
6467
return $fieldInstance->mutateFormDataCallback($this->record, $field, $data);
6568
}
@@ -76,7 +79,18 @@ protected function mutateBeforeSave(array $data): array
7679
return $data;
7780
}
7881

79-
return $this->mutateFormData($data, function ($field, $fieldConfig, $fieldInstance, $data) {
82+
$values = $data[$this->record?->valueColumn];
83+
84+
$fieldsFromValues = array_keys($values);
85+
86+
$blocks = ModelsField::whereIn('ulid', $fieldsFromValues)->where('field_type', 'builder')->pluck('ulid')->toArray();
87+
$blocks = collect($values)->filter(fn ($value, $key) => in_array($key, $blocks))->toArray();
88+
89+
$fields = $this->record->fields->merge(
90+
$this->getFieldsFromBlocks($blocks)
91+
);
92+
93+
return $this->mutateFormData($data, $fields, function ($field, $fieldConfig, $fieldInstance, $data) {
8094
if (! empty($fieldConfig['methods']['mutateBeforeSaveCallback'])) {
8195
return $fieldInstance->mutateBeforeSaveCallback($this->record, $field, $data);
8296
}
@@ -99,9 +113,25 @@ private function resolveFieldConfigAndInstance(Model $field): array
99113
];
100114
}
101115

102-
protected function mutateFormData(array $data, callable $mutationStrategy): array
116+
protected function getFieldsFromBlocks(array $blocks): Collection
117+
{
118+
$processedFields = collect();
119+
120+
collect($blocks)->map(function ($block) use (&$processedFields) {
121+
foreach ($block as $key => $values) {
122+
$fields = $values['data'];
123+
$fields = ModelsField::whereIn('ulid', array_keys($fields))->get();
124+
125+
$processedFields = $processedFields->merge($fields);
126+
}
127+
});
128+
129+
return $processedFields;
130+
}
131+
132+
protected function mutateFormData(array $data, Collection $fields, callable $mutationStrategy): array
103133
{
104-
foreach ($this->record->fields as $field) {
134+
foreach ($fields as $field) {
105135
$field->load('children');
106136

107137
['config' => $fieldConfig, 'instance' => $fieldInstance] = $this->resolveFieldConfigAndInstance($field);

0 commit comments

Comments
 (0)