diff --git a/src/Concerns/CanMapDynamicFields.php b/src/Concerns/CanMapDynamicFields.php index 637a93c..cf6eb8e 100644 --- a/src/Concerns/CanMapDynamicFields.php +++ b/src/Concerns/CanMapDynamicFields.php @@ -112,6 +112,7 @@ protected function mutateBeforeSave(array $data): array } $builderBlocks = $this->extractBuilderBlocks($values); + $allFields = $this->getAllFieldsIncludingBuilderFields($builderBlocks); return $this->mutateFormData($data, $allFields, function ($field, $fieldConfig, $fieldInstance, $data) use ($builderBlocks) { @@ -487,6 +488,8 @@ private function determineFieldLocation(Model $field, array $builderBlocks): arr return [ 'isInBuilder' => true, 'builderData' => $block['data'], + 'builderUlid' => $builderUlid, + 'blockIndex' => array_search($block, $builderBlocks), ]; } } @@ -496,6 +499,8 @@ private function determineFieldLocation(Model $field, array $builderBlocks): arr return [ 'isInBuilder' => false, 'builderData' => null, + 'builderUlid' => null, + 'blockIndex' => null, ]; } @@ -514,17 +519,25 @@ private function determineFieldLocation(Model $field, array $builderBlocks): arr */ private function processBuilderFieldMutation(Model $field, object $fieldInstance, array $data, array $builderData, array $builderBlocks): array { - // Create a mock record with the builder data for the callback - $mockRecord = $this->createMockRecordForBuilder($builderData); + foreach ($builderBlocks as $builderUlid => &$blocks) { + if (is_array($blocks)) { + foreach ($blocks as &$block) { + if (isset($block['data']) && is_array($block['data']) && isset($block['data'][$field->ulid])) { + // Create a mock record with the block data for the callback + $mockRecord = $this->createMockRecordForBuilder($block['data']); - // Create a temporary data structure for the callback - $tempData = [$this->record->valueColumn => $builderData]; - $tempData = $fieldInstance->mutateBeforeSaveCallback($mockRecord, $field, $tempData); + // Create a temporary data structure for the callback + $tempData = [$this->record->valueColumn => $block['data']]; + $tempData = $fieldInstance->mutateBeforeSaveCallback($mockRecord, $field, $tempData); - // Update the original data structure with the mutated values - $this->updateBuilderBlocksWithMutatedData($builderBlocks, $field, $tempData); + if (isset($tempData[$this->record->valueColumn][$field->ulid])) { + $block['data'][$field->ulid] = $tempData[$this->record->valueColumn][$field->ulid]; + } + } + } + } + } - // Update the main data structure $data[$this->record->valueColumn] = array_merge($data[$this->record->valueColumn], $builderBlocks); return $data;