From 50170b0fb055a2cfc294f4eb1402e0a20efb6dc1 Mon Sep 17 00:00:00 2001 From: Rajib Gupta Date: Sat, 16 May 2026 02:52:56 +0530 Subject: [PATCH] fix(payload): preserve published main document when saving draft --- .../operations/utilities/update.ts | 11 +++-- .../payload/src/globals/operations/update.ts | 5 +-- test/versions/int.spec.ts | 40 +++++++++++++++++++ 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/packages/payload/src/collections/operations/utilities/update.ts b/packages/payload/src/collections/operations/utilities/update.ts index deeaaee0bd2..64b66408a01 100644 --- a/packages/payload/src/collections/operations/utilities/update.ts +++ b/packages/payload/src/collections/operations/utilities/update.ts @@ -110,9 +110,7 @@ export const updateDocument = async < ? unpublishAllLocalesArg === 'true' : !!unpublishAllLocalesArg const isSavingDraft = - Boolean(draftArg && hasDraftsEnabled(collectionConfig)) && - data._status !== 'published' && - !publishAllLocales + Boolean(draftArg && hasDraftsEnabled(collectionConfig)) && !publishAllLocales const shouldSavePassword = Boolean( password && collectionConfig.auth && @@ -124,6 +122,13 @@ export const updateDocument = async < if (isSavingDraft) { data._status = 'draft' + + if (!req.context) { + req.context = {} + } + + // Used by storage plugins to persist adapter metadata without updating the published document + req.context.internalSavingDraft = true } // ///////////////////////////////////// diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index e46c354e8d3..60e17bd0fec 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -113,10 +113,7 @@ export const updateOperation = async < typeof unpublishAllLocalesArg === 'string' ? unpublishAllLocalesArg === 'true' : !!unpublishAllLocalesArg - const isSavingDraft = - Boolean(draftArg && hasDraftsEnabled(globalConfig)) && - data._status !== 'published' && - !publishAllLocales + const isSavingDraft = Boolean(draftArg && hasDraftsEnabled(globalConfig)) && !publishAllLocales if (isSavingDraft) { data._status = 'draft' diff --git a/test/versions/int.spec.ts b/test/versions/int.spec.ts index e0ac68888e0..b99a84e0121 100644 --- a/test/versions/int.spec.ts +++ b/test/versions/int.spec.ts @@ -2571,6 +2571,46 @@ describe('Versions', () => { expect(jsonByID.parent).toBe(autosavePost.id) }) + it('should preserve published main document when saving a draft with _status published', async () => { + const initialDoc = await payload.create({ + collection: draftCollectionSlug, + data: { + title: 'Published title', + description: 'Published description', + _status: 'published', + }, + }) + + await payload.update({ + id: initialDoc.id, + collection: draftCollectionSlug, + data: { + title: 'Draft title', + _status: 'published', + }, + draft: true, + }) + + const mainDoc = await payload.findByID({ + collection: draftCollectionSlug, + id: initialDoc.id, + }) + + expect(mainDoc.title).toBe('Published title') + expect(mainDoc._status).toBe('published') + + const versions = await payload.findVersions({ + collection: draftCollectionSlug, + where: { + parent: { + equals: initialDoc.id, + }, + }, + }) + + expect(versions.docs.some((doc) => doc.version.title === 'Draft title')).toBe(true) + }) + it('should allow query by latest', async () => { async function createVersion({ title }: { title: string }) { return payload.create({