fix: beforeDuplicate localized blocks and arrays (#8144)

fixes #7988
This commit is contained in:
Dan Ribbens
2024-09-09 17:02:56 -04:00
committed by GitHub
parent fa38dfc16c
commit d267cad482
4 changed files with 93 additions and 3 deletions

View File

@@ -0,0 +1,18 @@
import ObjectIdImport from 'bson-objectid'
import type { FieldHook } from '../config/types.js'
const ObjectId = (ObjectIdImport.default ||
ObjectIdImport) as unknown as typeof ObjectIdImport.default
/**
* Arrays and Blocks need to clear ids beforeDuplicate
*/
export const baseBeforeDuplicateArrays: FieldHook = ({ value }) => {
if (value) {
value = value.map((item) => {
item.id = new ObjectId().toHexString()
return item
})
return value
}
}

View File

@@ -12,6 +12,7 @@ import {
} from '../../errors/index.js' } from '../../errors/index.js'
import { MissingEditorProp } from '../../errors/MissingEditorProp.js' import { MissingEditorProp } from '../../errors/MissingEditorProp.js'
import { formatLabels, toWords } from '../../utilities/formatLabels.js' import { formatLabels, toWords } from '../../utilities/formatLabels.js'
import { baseBeforeDuplicateArrays } from '../baseFields/baseBeforeDuplicateArrays.js'
import { baseBlockFields } from '../baseFields/baseBlockFields.js' import { baseBlockFields } from '../baseFields/baseBlockFields.js'
import { baseIDField } from '../baseFields/baseIDField.js' import { baseIDField } from '../baseFields/baseIDField.js'
import { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js' import { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'
@@ -130,6 +131,15 @@ export const sanitizeFields = async ({
if (field.type === 'array' && field.fields) { if (field.type === 'array' && field.fields) {
field.fields.push(baseIDField) field.fields.push(baseIDField)
if (field.localized) {
if (!field.hooks) {
field.hooks = {}
}
if (!field.hooks.beforeDuplicate) {
field.hooks.beforeDuplicate = []
}
field.hooks.beforeDuplicate.push(baseBeforeDuplicateArrays)
}
} }
if ((field.type === 'blocks' || field.type === 'array') && field.label) { if ((field.type === 'blocks' || field.type === 'array') && field.label) {
@@ -210,6 +220,15 @@ export const sanitizeFields = async ({
} }
if (field.type === 'blocks' && field.blocks) { if (field.type === 'blocks' && field.blocks) {
if (field.localized) {
if (!field.hooks) {
field.hooks = {}
}
if (!field.hooks.beforeDuplicate) {
field.hooks.beforeDuplicate = []
}
field.hooks.beforeDuplicate.push(baseBeforeDuplicateArrays)
}
for (const block of field.blocks) { for (const block of field.blocks) {
if (block._sanitized === true) { if (block._sanitized === true) {
continue continue

View File

@@ -24,9 +24,9 @@ import {
portugueseLocale, portugueseLocale,
relationEnglishTitle, relationEnglishTitle,
relationEnglishTitle2, relationEnglishTitle2,
relationshipLocalizedSlug,
relationSpanishTitle, relationSpanishTitle,
relationSpanishTitle2, relationSpanishTitle2,
relationshipLocalizedSlug,
spanishLocale, spanishLocale,
spanishTitle, spanishTitle,
withLocalizedRelSlug, withLocalizedRelSlug,
@@ -348,7 +348,9 @@ export default buildConfigWithDefaults({
if (payload.db.name === 'mongoose') { if (payload.db.name === 'mongoose') {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
payload.db?.collections[localizedPostsSlug]?.ensureIndexes(function (err) { payload.db?.collections[localizedPostsSlug]?.ensureIndexes(function (err) {
if (err) reject(err) if (err) {
reject(err)
}
resolve(true) resolve(true)
}) })
}) })

View File

@@ -22,9 +22,9 @@ import {
portugueseLocale, portugueseLocale,
relationEnglishTitle, relationEnglishTitle,
relationEnglishTitle2, relationEnglishTitle2,
relationshipLocalizedSlug,
relationSpanishTitle, relationSpanishTitle,
relationSpanishTitle2, relationSpanishTitle2,
relationshipLocalizedSlug,
spanishLocale, spanishLocale,
spanishTitle, spanishTitle,
withLocalizedRelSlug, withLocalizedRelSlug,
@@ -1118,6 +1118,57 @@ describe('Localization', () => {
expect(allLocales.localizedCheckbox.en).toBeTruthy() expect(allLocales.localizedCheckbox.en).toBeTruthy()
expect(allLocales.localizedCheckbox.es).toBeFalsy() expect(allLocales.localizedCheckbox.es).toBeFalsy()
}) })
it('should duplicate with localized blocks', async () => {
const englishText = 'english'
const spanishText = 'spanish'
const doc = await payload.create({
collection: withRequiredLocalizedFields,
data: {
layout: [
{
blockType: 'text',
text: englishText,
},
],
title: 'hello',
},
locale: defaultLocale,
})
await payload.update({
id: doc.id,
collection: withRequiredLocalizedFields,
data: {
layout: [
{
blockType: 'text',
text: spanishText,
},
],
title: 'hello',
},
locale: spanishLocale,
})
const result = await payload.duplicate({
id: doc.id,
collection: withRequiredLocalizedFields,
locale: defaultLocale,
})
const allLocales = await payload.findByID({
id: result.id,
collection: withRequiredLocalizedFields,
locale: 'all',
})
// check fields
expect(result.layout[0].text).toStrictEqual(englishText)
expect(allLocales.layout.en[0].text).toStrictEqual(englishText)
expect(allLocales.layout.es[0].text).toStrictEqual(spanishText)
})
}) })
describe('Localized group and tabs', () => { describe('Localized group and tabs', () => {