Skip to content

fix(ui): strip row components from serializable form state#17371

Open
rasitakyol wants to merge 1 commit into
payloadcms:mainfrom
rasitakyol:codex/fix-serializable-form-rows
Open

fix(ui): strip row components from serializable form state#17371
rasitakyol wants to merge 1 commit into
payloadcms:mainfrom
rasitakyol:codex/fix-serializable-form-rows

Conversation

@rasitakyol

Copy link
Copy Markdown
Contributor

What?

Remove row-level custom components when reducing admin form state to serializable fields.

Why?

Array and blocks rows can contain a React RowLabel component. That value may include circular references, so preview and SEO fields can fail while serializing form state even though top-level custom components are already removed.

How?

Clone and sanitize each row without mutating the original form state, while preserving row metadata such as IDs, block types, and collapsed state. A focused unit test covers circular row labels, top-level non-serializable values, preserved metadata, and input immutability.

Validation:

  • pnpm test:unit packages/ui/src/forms/Form/reduceToSerializableFields.spec.ts
  • pnpm eslint --max-warnings=0 packages/ui/src/forms/Form/reduceToSerializableFields.ts
  • pnpm prettier --check packages/ui/src/forms/Form/reduceToSerializableFields.ts packages/ui/src/forms/Form/reduceToSerializableFields.spec.ts
  • pnpm build:ui

Fixes #16786

@rasitakyol
rasitakyol marked this pull request as ready for review July 16, 2026 21:01
@rasitakyol
rasitakyol force-pushed the codex/fix-serializable-form-rows branch from db69fb0 to 2bcf735 Compare July 19, 2026 07:58
@rasitakyol

Copy link
Copy Markdown
Contributor Author

CI note after rebasing onto current main to trigger the previously approval-blocked full workflow: build, lint, and all completed non-Lexical checks are passing.

The failing LexicalHeadingFeature job failed during Payload initialization with the same transient MongoDB catalog-change error (payload._array-fields_versions, payloadInitError: true). The editor was then absent on every retry, before the suite logic could exercise this serializable-form-state patch. The same initialization signature is occurring concurrently across #17354, #17355, #17371, and #17372, whose diffs are unrelated.

No patch change is indicated by these logs. Some long-running Lexical jobs are still in progress; once they finish, a maintainer rerun of the failed E2E jobs would be appreciated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

plugin-seo & ui: PreviewField throws "circular structure to JSON"

1 participant