diff --git a/packages/ui/src/utilities/copyDataFromLocale.ts b/packages/ui/src/utilities/copyDataFromLocale.ts index c934b7f0c1..5bf9711c38 100644 --- a/packages/ui/src/utilities/copyDataFromLocale.ts +++ b/packages/ui/src/utilities/copyDataFromLocale.ts @@ -183,6 +183,17 @@ function mergeData( return toLocaleData } +function removeIds(data: Data): Data { + if (Array.isArray(data)) { + return data.map(removeIds) + } + if (typeof data === 'object' && data !== null) { + const { id: _id, ...rest } = data + return Object.fromEntries(Object.entries(rest).map(([key, value]) => [key, removeIds(value)])) + } + return data +} + export const copyDataFromLocaleHandler = async (args: CopyDataFromLocaleArgs) => { const { req } = args @@ -288,7 +299,8 @@ export const copyDataFromLocale = async (args: CopyDataFromLocaleArgs) => { throw new Error(`Error fetching data from locale "${toLocale}"`) } - const { id, ...fromLocaleDataWithoutID } = fromLocaleData.value + const fromLocaleDataWithoutID = removeIds(fromLocaleData.value) + const toLocaleDataWithoutID = removeIds(toLocaleData.value) return globalSlug ? await payload.updateGlobal({ @@ -296,8 +308,8 @@ export const copyDataFromLocale = async (args: CopyDataFromLocaleArgs) => { data: overrideData ? fromLocaleDataWithoutID : mergeData( - fromLocaleData.value, - toLocaleData.value, + fromLocaleDataWithoutID, + toLocaleDataWithoutID, globals[globalSlug].config.fields, req, false, @@ -313,8 +325,8 @@ export const copyDataFromLocale = async (args: CopyDataFromLocaleArgs) => { data: overrideData ? fromLocaleDataWithoutID : mergeData( - fromLocaleData.value, - toLocaleData.value, + fromLocaleDataWithoutID, + toLocaleDataWithoutID, collections[collectionSlug].config.fields, req, false, diff --git a/test/localization/e2e.spec.ts b/test/localization/e2e.spec.ts index 1916677181..b1f1884301 100644 --- a/test/localization/e2e.spec.ts +++ b/test/localization/e2e.spec.ts @@ -26,6 +26,7 @@ import { import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' import { POLL_TOPASS_TIMEOUT, TEST_TIMEOUT_LONG } from '../playwright.config.js' +import { blocksCollectionSlug } from './collections/Blocks/index.js' import { nestedToArrayAndBlockCollectionSlug } from './collections/NestedToArrayAndBlock/index.js' import { richTextSlug } from './collections/RichText/index.js' import { @@ -427,6 +428,30 @@ describe('Localization', () => { await expect(arrayField).toHaveValue(sampleText) }) + test('should copy block to locale', async () => { + const sampleText = 'Copy this text' + const blocksCollection = new AdminUrlUtil(serverURL, blocksCollectionSlug) + await page.goto(blocksCollection.create) + await changeLocale(page, 'pt') + const addBlock = page.locator('.blocks-field__drawer-toggler') + await addBlock.click() + const selectBlock = page.locator('.blocks-drawer__block button') + await selectBlock.click() + const addContentButton = page.locator('#field-content__0__content button') + await addContentButton.click() + await selectBlock.click() + const textField = page.locator('#field-content__0__content__0__text') + await expect(textField).toBeVisible() + await textField.fill(sampleText) + await saveDocAndAssert(page) + + await openCopyToLocaleDrawer(page) + await setToLocale(page, 'English') + await runCopy(page) + + await expect(textField).toHaveValue(sampleText) + }) + test('should default source locale to current locale', async () => { await changeLocale(page, spanishLocale) await createAndSaveDoc(page, url, { title })