From 7d3721c8f88cde4a25f3a6fcf3dc445cbfa7601b Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Sun, 14 Sep 2025 12:11:05 +0100 Subject: [PATCH] Use "state snapshot" for repeaters and builders --- packages/forms/src/Components/Builder.php | 2 +- packages/forms/src/Components/Repeater.php | 4 +-- packages/schemas/src/Concerns/HasState.php | 28 +++++++++++++++++++ .../Forms/Components/RuleBuilder.php | 2 +- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/forms/src/Components/Builder.php b/packages/forms/src/Components/Builder.php index f805cb413e..b14d39c733 100644 --- a/packages/forms/src/Components/Builder.php +++ b/packages/forms/src/Components/Builder.php @@ -1135,7 +1135,7 @@ class Builder extends Field implements CanConcealComponents, HasExtraItemActions */ public function getRawItemState(string $key): array { - return $this->getChildSchema($key)->getRawState(); + return $this->getChildSchema($key)->getStateSnapshot(); } public function getHeadingsCount(): int diff --git a/packages/forms/src/Components/Repeater.php b/packages/forms/src/Components/Repeater.php index cccebd8137..2269695bc2 100644 --- a/packages/forms/src/Components/Repeater.php +++ b/packages/forms/src/Components/Repeater.php @@ -1163,7 +1163,7 @@ class Repeater extends Field implements CanConcealComponents, HasExtraItemAction 'item' => $container, 'key' => $key, 'schema' => $container, - 'state' => $container->getRawState(), + 'state' => $container->getStateSnapshot(), 'uuid' => $key, ]); } @@ -1350,7 +1350,7 @@ class Repeater extends Field implements CanConcealComponents, HasExtraItemAction */ public function getRawItemState(string $key): array { - return $this->getChildSchema($key)->getRawState(); + return $this->getChildSchema($key)->getStateSnapshot(); } public function getHeadingsCount(): int diff --git a/packages/schemas/src/Concerns/HasState.php b/packages/schemas/src/Concerns/HasState.php index fe24969a57..dd1e86271a 100644 --- a/packages/schemas/src/Concerns/HasState.php +++ b/packages/schemas/src/Concerns/HasState.php @@ -448,6 +448,34 @@ trait HasState }); } + /** + * @internal Do not use this method outside the internals of Filament. It is subject to breaking changes in minor and patch releases. + * + * @return array + */ + public function getStateSnapshot(): array + { + return Component::withVisibilityCache(function (): array { + $statePath = $this->getStatePath(); + + if (filled($statePath)) { + $state = []; + data_set($state, $statePath, $this->getRawState()); + } else { + $state = $this->getRawState(); + } + + $this->dehydrateState($state); + $this->mutateDehydratedState($state); + + if ($statePath) { + $state = data_get($state, $statePath) ?? []; + } + + return $state; + }); + } + /** * @return array | Arrayable */ diff --git a/packages/tables/src/Filters/QueryBuilder/Forms/Components/RuleBuilder.php b/packages/tables/src/Filters/QueryBuilder/Forms/Components/RuleBuilder.php index 290210fbef..576f78debc 100644 --- a/packages/tables/src/Filters/QueryBuilder/Forms/Components/RuleBuilder.php +++ b/packages/tables/src/Filters/QueryBuilder/Forms/Components/RuleBuilder.php @@ -90,7 +90,7 @@ class RuleBuilder extends Builder throw new LogicException('No block component found.'); } - return $block->getLabel($schema->getRawState(), $blockUuid); + return $block->getLabel($schema->getStateSnapshot(), $blockUuid); }); if ($blockLabels->isEmpty()) {