From 01e9d9b7df395cc85db16e33ae40e7182c147fde Mon Sep 17 00:00:00 2001 From: karthikeya-io Date: Thu, 23 Apr 2026 17:23:57 +0530 Subject: [PATCH 1/2] Core Data: Replace mutated edits with original record to fix dirty state --- packages/core-data/src/actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-data/src/actions.js b/packages/core-data/src/actions.js index 47e12f46e7bd92..53f3ee87fd36e6 100644 --- a/packages/core-data/src/actions.js +++ b/packages/core-data/src/actions.js @@ -790,7 +790,7 @@ export const saveEntityRecord = updatedRecord, undefined, true, - edits + record ); if ( entityConfig.syncConfig ) { // Use an untracked origin so that the save From 88b40f326f0ef45990639535bbe5480a797b6f1f Mon Sep 17 00:00:00 2001 From: karthikeya-io <82776409+karthikeya-io@users.noreply.github.com> Date: Thu, 30 Apr 2026 02:08:31 +0530 Subject: [PATCH 2/2] Fix: Move _crdt_document meta include from __unstablePrePersist to saveEntityRecord --- packages/core-data/src/actions.js | 27 +++++++++++++++++++-- packages/core-data/src/entities.js | 18 -------------- packages/core-data/src/test/entities.js | 31 +------------------------ 3 files changed, 26 insertions(+), 50 deletions(-) diff --git a/packages/core-data/src/actions.js b/packages/core-data/src/actions.js index 53f3ee87fd36e6..e3c92cb0d5b2b9 100644 --- a/packages/core-data/src/actions.js +++ b/packages/core-data/src/actions.js @@ -25,6 +25,7 @@ import { getSyncManager, } from './sync'; import logEntityDeprecation from './utils/log-entity-deprecation'; +import { POST_META_KEY_FOR_CRDT_DOC_PERSISTENCE } from './utils/crdt'; function addTitleToAutoDraft( record ) { return record.status === 'auto-draft' ? { ...record, title: '' } : record; @@ -779,10 +780,32 @@ export const saveEntityRecord = ) ), }; } + + let fetchPayload = edits; + + if ( persistedRecord ) { + const objectType = `${ kind }/${ name }`; + const serializedDoc = + await getSyncManager()?.createPersistedCRDTDoc( + objectType, + persistedRecord[ entityIdKey ] + ); + + if ( serializedDoc ) { + fetchPayload = { + ...fetchPayload, + meta: { + ...fetchPayload.meta, + [ POST_META_KEY_FOR_CRDT_DOC_PERSISTENCE ]: + serializedDoc, + }, + }; + } + } updatedRecord = await __unstableFetch( { path, method: recordId ? 'PUT' : 'POST', - data: edits, + data: fetchPayload, } ); dispatch.receiveEntityRecords( kind, @@ -790,7 +813,7 @@ export const saveEntityRecord = updatedRecord, undefined, true, - record + edits ); if ( entityConfig.syncConfig ) { // Use an untracked origin so that the save diff --git a/packages/core-data/src/entities.js b/packages/core-data/src/entities.js index 83e1ccd1c79e5f..eefddd4360cea9 100644 --- a/packages/core-data/src/entities.js +++ b/packages/core-data/src/entities.js @@ -14,7 +14,6 @@ import { __ } from '@wordpress/i18n'; * Internal dependencies */ import { PostEditorAwareness } from './awareness/post-editor-awareness'; -import { getSyncManager } from './sync'; import { applyPostChangesToCRDTDoc, defaultCollectionSyncConfig, @@ -306,23 +305,6 @@ export const prePersistPostType = async ( } } - // Add meta for persisted CRDT document. - if ( persistedRecord ) { - const objectType = `postType/${ name }`; - const objectId = persistedRecord.id; - const serializedDoc = await getSyncManager()?.createPersistedCRDTDoc( - objectType, - objectId - ); - - if ( serializedDoc ) { - newEdits.meta = { - ...edits.meta, - [ POST_META_KEY_FOR_CRDT_DOC_PERSISTENCE ]: serializedDoc, - }; - } - } - return newEdits; }; diff --git a/packages/core-data/src/test/entities.js b/packages/core-data/src/test/entities.js index 5f45462655f5eb..59485181dd4c48 100644 --- a/packages/core-data/src/test/entities.js +++ b/packages/core-data/src/test/entities.js @@ -22,11 +22,7 @@ import { prePersistPostType, additionalEntityConfigLoaders, } from '../entities'; -import { getSyncManager } from '../sync'; -import { - applyPostChangesToCRDTDoc, - POST_META_KEY_FOR_CRDT_DOC_PERSISTENCE, -} from '../utils/crdt'; +import { applyPostChangesToCRDTDoc } from '../utils/crdt'; describe( 'getMethodName', () => { it( 'should return the right method name for an entity with the root kind', () => { @@ -107,31 +103,6 @@ describe( 'prePersistPostType', () => { await prePersistPostType( record, edits, 'post', true ) ).toEqual( {} ); } ); - - it( 'adds meta with serialized CRDT doc when createPersistedCRDTDoc returns a value', async () => { - const mockSerializedDoc = 'serialized-crdt-doc-data'; - getSyncManager.mockReturnValue( { - createPersistedCRDTDoc: jest - .fn() - .mockReturnValue( mockSerializedDoc ), - } ); - - const record = { id: 123, status: 'publish' }; - const edits = {}; - const result = await prePersistPostType( record, edits, 'post', false ); - - expect( result.meta ).toEqual( { - [ POST_META_KEY_FOR_CRDT_DOC_PERSISTENCE ]: mockSerializedDoc, - } ); - - expect( getSyncManager ).toHaveBeenCalled(); - expect( getSyncManager().createPersistedCRDTDoc ).toHaveBeenCalledWith( - 'postType/post', - 123 - ); - - getSyncManager.mockReset(); - } ); } ); describe( 'loadPostTypeEntities', () => {