Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/payload/src/collections/endpoints/duplicate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ export const duplicateHandler: PayloadHandler = async (req) => {
const depth = searchParams.get('depth')
// draft defaults to true, unless explicitly set requested as false to prevent the newly duplicated document from being published
const draft = searchParams.get('draft') !== 'false'
const selectedLocales = (searchParams.get('selectedLocales') || '')
.replace(/^\[|\]$/g, '')
.split(',')
.map((s) => s.trim())

const doc = await duplicateOperation({
id,
Expand All @@ -26,6 +30,7 @@ export const duplicateHandler: PayloadHandler = async (req) => {
populate: sanitizePopulateParam(req.query.populate),
req,
select: sanitizeSelectParam(req.query.select),
selectedLocales,
})

const message = req.t('general:successfullyDuplicated', {
Expand Down
3 changes: 3 additions & 0 deletions packages/payload/src/collections/operations/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export type Arguments<TSlug extends CollectionSlug> = {
publishSpecificLocale?: string
req: PayloadRequest
select?: SelectType
selectedLocales?: string[]
showHiddenFields?: boolean
}

Expand Down Expand Up @@ -113,6 +114,7 @@ export const createOperation = async <
},
req,
select: incomingSelect,
selectedLocales,
showHiddenFields,
} = args

Expand All @@ -130,6 +132,7 @@ export const createOperation = async <
draftArg: shouldSaveDraft,
overrideAccess,
req,
selectedLocales,
shouldSaveDraft,
})

Expand Down
2 changes: 2 additions & 0 deletions packages/payload/src/collections/operations/duplicate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { type Arguments as CreateArguments, createOperation } from './create.js'
export type Arguments<TSlug extends CollectionSlug> = {
data?: DeepPartial<RequiredDataFromCollectionSlug<TSlug>>
id: number | string
selectedLocales?: string[]
} & Omit<CreateArguments<TSlug>, 'data' | 'duplicateFromID'>

export const duplicateOperation = async <
Expand All @@ -22,5 +23,6 @@ export const duplicateOperation = async <
...args,
data: incomingArgs?.data || {},
duplicateFromID: id,
selectedLocales: incomingArgs.selectedLocales,
})
}
8 changes: 8 additions & 0 deletions packages/payload/src/duplicateDocument/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { NotFound } from '../errors/NotFound.js'
import { afterRead } from '../fields/hooks/afterRead/index.js'
import { beforeDuplicate } from '../fields/hooks/beforeDuplicate/index.js'
import { deepCopyObjectSimple } from '../utilities/deepCopyObject.js'
import { filterLocales } from '../utilities/filterLocalizedData.js'
import { getLatestCollectionVersion } from '../versions/getLatestCollectionVersion.js'

type GetDuplicateDocumentArgs = {
Expand All @@ -18,6 +19,7 @@ type GetDuplicateDocumentArgs = {
id: number | string
overrideAccess?: boolean
req: PayloadRequest
selectedLocales?: string[]
shouldSaveDraft?: boolean
}
export const getDuplicateDocumentData = async ({
Expand All @@ -26,6 +28,7 @@ export const getDuplicateDocumentData = async ({
draftArg,
overrideAccess,
req,
selectedLocales,
shouldSaveDraft,
}: GetDuplicateDocumentArgs): Promise<{
duplicatedFromDoc: JsonObject
Expand Down Expand Up @@ -59,6 +62,11 @@ export const getDuplicateDocumentData = async ({
req,
})

if (selectedLocales && selectedLocales.length > 0 && duplicatedFromDocWithLocales) {
const filteredDoc = filterLocales(duplicatedFromDocWithLocales, selectedLocales)
duplicatedFromDocWithLocales = filteredDoc as typeof duplicatedFromDocWithLocales
}

if (!duplicatedFromDocWithLocales && !hasWherePolicy) {
throw new NotFound(req.t)
}
Expand Down
46 changes: 46 additions & 0 deletions packages/payload/src/utilities/filterLocalizedData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
export function filterLocales(
obj: any,
selectedLocales: string[],
keepEmptyObjects = false,
): unknown {
if (Array.isArray(obj)) {
return obj.map((item) => filterLocales(item, selectedLocales, keepEmptyObjects))
}

if (obj && typeof obj === 'object') {
const result: Record<string, unknown> = {}

for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {
if (value && typeof value === 'object' && !Array.isArray(value)) {
const valueKeys = Object.keys(value)

const allKeysLookLikeLocales =
valueKeys.length >= 2 &&
valueKeys.length <= 5 &&
valueKeys.every(
(k) => typeof k === 'string' && /^[a-z]{2}(?:[-_][A-Za-z0-9]+)?$/.test(k),
) &&
valueKeys.some((k) => selectedLocales.includes(k))

if (allKeysLookLikeLocales) {
const filtered = Object.fromEntries(
Object.entries(value).filter(([locale]) => selectedLocales.includes(locale)),
)

if (Object.keys(filtered).length > 0 || keepEmptyObjects) {
result[key] = filtered
} else {
// return empty object
}

continue
}
}

result[key] = filterLocales(value, selectedLocales, keepEmptyObjects)
}

return result
}
return obj
}
2 changes: 2 additions & 0 deletions packages/translations/src/clientKeys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,9 @@ export const clientTranslationKeys = createClientTranslationKeys([
'localization:localeToPublish',
'localization:copyToLocale',
'localization:copyFromTo',
'localization:selectedLocales',
'localization:selectLocaleToCopy',
'localization:selectLocaleToDuplicate',
'localization:cannotCopySameLocale',
'localization:copyFrom',
'localization:copyTo',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,9 @@ export const arTranslations: DefaultTranslationsObject = {
copyTo: 'انسخ إلى',
copyToLocale: 'نسخ إلى الموقع المحلي',
localeToPublish: 'الموقع للنشر',
selectedLocales: 'المواقع المختارة',
selectLocaleToCopy: 'حدد الموقع المحلي للنسخ',
selectLocaleToDuplicate: 'اختر المواقع للتكرار',
},
operators: {
contains: 'يحتوي',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/az.ts
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,9 @@ export const azTranslations: DefaultTranslationsObject = {
copyTo: 'Köçür',
copyToLocale: 'Yerliyə köçürün',
localeToPublish: 'Yayımlamaq üçün yerləşdirin',
selectedLocales: 'Seçilmiş Dillər',
selectLocaleToCopy: 'Köçürmək üçün yerli seçin',
selectLocaleToDuplicate: 'Dublikat üçün məkanları seçin',
},
operators: {
contains: 'daxilində',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/bg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,9 @@ export const bgTranslations: DefaultTranslationsObject = {
copyTo: 'Копирай в',
copyToLocale: 'Копирайте в местното',
localeToPublish: 'Местоположение за публикуване',
selectedLocales: 'Избрани локали',
selectLocaleToCopy: 'Изберете място за копиране',
selectLocaleToDuplicate: 'Изберете локации за дублиране',
},
operators: {
contains: 'съдържа',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/bnBd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,9 @@ export const bnBdTranslations: DefaultTranslationsObject = {
copyTo: 'কপি করুন',
copyToLocale: 'লোকেলে কপি করুন',
localeToPublish: 'প্রকাশ করার লোকেল',
selectedLocales: 'নির্বাচিত ভাষা অথবা এলাকা',
selectLocaleToCopy: 'কপি করার জন্য লোকেল নির্বাচন করুন',
selectLocaleToDuplicate: 'নির্বাচনকৃত লোকেলগুলি প্রতিলিপি করুন',
},
operators: {
contains: 'ধারণ করে',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/bnIn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,9 @@ export const bnInTranslations: DefaultTranslationsObject = {
copyTo: 'কপি করুন',
copyToLocale: 'লোকেলে কপি করুন',
localeToPublish: 'প্রকাশ করার লোকেল',
selectedLocales: 'নির্বাচিত ভাষা বা অঞ্চল',
selectLocaleToCopy: 'কপি করার জন্য লোকেল নির্বাচন করুন',
selectLocaleToDuplicate: 'নকল করার জন্য লোকেলস নির্বাচন করুন',
},
operators: {
contains: 'ধারণ করে',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/ca.ts
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,9 @@ export const caTranslations: DefaultTranslationsObject = {
copyTo: 'Copiar a',
copyToLocale: 'Copiar a idioma',
localeToPublish: 'Idioma per publicar',
selectedLocales: 'Idiomes seleccionats',
selectLocaleToCopy: "Selecciona l'idioma per copiar",
selectLocaleToDuplicate: 'Selecciona les configuracions regionals per duplicar',
},
operators: {
contains: 'conté',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/cs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,9 @@ export const csTranslations: DefaultTranslationsObject = {
copyTo: 'Kopírovat do',
copyToLocale: 'Kopírovat do lokalizace',
localeToPublish: 'Místo k publikování',
selectedLocales: 'Vybrané jazykové verze',
selectLocaleToCopy: 'Vyberte lokalitu ke kopírování',
selectLocaleToDuplicate: 'Vyberte národní prostředí k duplikaci',
},
operators: {
contains: 'obsahuje',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/da.ts
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,9 @@ export const daTranslations: DefaultTranslationsObject = {
copyTo: 'Kopier til',
copyToLocale: 'Kopier til lokal',
localeToPublish: 'Offentliggør på lokalitet',
selectedLocales: 'Valgte sprogområder',
selectLocaleToCopy: 'Vælg lokalitet til kopiering',
selectLocaleToDuplicate: 'Vælg lokaliteter til at duplikere',
},
operators: {
contains: 'Indeholder',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,9 @@ export const deTranslations: DefaultTranslationsObject = {
copyTo: 'Kopieren nach',
copyToLocale: 'Erstelle Kopie für Sprach-Variante',
localeToPublish: 'Zu veröffentlichende Sprache',
selectedLocales: 'Ausgewählte Gebietsschemata',
selectLocaleToCopy: 'Wähle den Ort zum Kopieren aus',
selectLocaleToDuplicate: 'Wählen Sie die Gebietsschemata zum Duplizieren aus',
},
operators: {
contains: 'enthält',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,9 @@ export const enTranslations = {
copyTo: 'Copy to',
copyToLocale: 'Copy to locale',
localeToPublish: 'Locale to publish',
selectedLocales: 'Selected Locales',
selectLocaleToCopy: 'Select locale to copy',
selectLocaleToDuplicate: 'Select locales to duplicate',
},
operators: {
contains: 'contains',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,9 @@ export const esTranslations: DefaultTranslationsObject = {
copyTo: 'Copiar a',
copyToLocale: 'Copiar a idioma',
localeToPublish: 'Idioma para publicar',
selectedLocales: 'Idiomas seleccionados',
selectLocaleToCopy: 'Selecciona el idioma a copiar',
selectLocaleToDuplicate: 'Seleccione los idiomas para duplicar',
},
operators: {
contains: 'contiene',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/et.ts
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,9 @@ export const etTranslations: DefaultTranslationsObject = {
copyTo: 'Kopeeri keelde',
copyToLocale: 'Kopeeri keelde',
localeToPublish: 'Lokaal avaldamiseks',
selectedLocales: 'Valitud lokaadid',
selectLocaleToCopy: 'Vali keel kopeerimiseks',
selectLocaleToDuplicate: 'Valige kohad, mida dubleerida',
},
operators: {
contains: 'sisaldab',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/fa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,9 @@ export const faTranslations: DefaultTranslationsObject = {
copyTo: 'کپی کنید به',
copyToLocale: 'کپی به محلی',
localeToPublish: 'محل انتشار',
selectedLocales: 'انتخاب مناطق',
selectLocaleToCopy: 'انتخاب مکان برای کپی کردن',
selectLocaleToDuplicate: 'انتخاب مکان‌ها برای تکثیر',
},
operators: {
contains: 'شامل',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,9 @@ export const frTranslations: DefaultTranslationsObject = {
copyTo: 'Copier à',
copyToLocale: 'Copier vers le lieu',
localeToPublish: 'Locale à publier',
selectedLocales: 'Langues sélectionnées',
selectLocaleToCopy: 'Sélectionnez la locale à copier',
selectLocaleToDuplicate: 'Sélectionnez les paramètres régionaux à dupliquer',
},
operators: {
contains: 'contient',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/he.ts
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,9 @@ export const heTranslations: DefaultTranslationsObject = {
copyTo: 'העתק אל',
copyToLocale: 'העתק למקום',
localeToPublish: 'מיקום לפרסום',
selectedLocales: 'אזורים נבחרים',
selectLocaleToCopy: 'בחר מיקום להעתקה',
selectLocaleToDuplicate: 'בחר שפות לשכפול',
},
operators: {
contains: 'מכיל',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/hr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,9 @@ export const hrTranslations: DefaultTranslationsObject = {
copyTo: 'Kopiraj na',
copyToLocale: 'Kopiraj na lokaciju',
localeToPublish: 'Lokacija za objavu',
selectedLocales: 'Odabrane lokalizacije',
selectLocaleToCopy: 'Odaberite mjesto za kopiranje',
selectLocaleToDuplicate: 'Odaberite lokacije za duplikaciju',
},
operators: {
contains: 'sadrži',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/hu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,9 @@ export const huTranslations: DefaultTranslationsObject = {
copyTo: 'Másolja ide',
copyToLocale: 'Másolás a helyi verzióba',
localeToPublish: 'Közzététel helye',
selectedLocales: 'Kiválasztott helyi beállítások',
selectLocaleToCopy: 'Válassza ki a másolni kívánt területet.',
selectLocaleToDuplicate: 'Válassza ki a másolandó helyszínekent.',
},
operators: {
contains: 'tartalmaz',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/hy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,9 @@ export const hyTranslations: DefaultTranslationsObject = {
copyTo: 'Պատճենել դեպի',
copyToLocale: 'Պատճենել լոկալին',
localeToPublish: 'Հրապարակման լոկալ',
selectedLocales: 'Ընտրված տեղադրություններ',
selectLocaleToCopy: 'Ընտրեք լոկալ՝ պատճենելու համար',
selectLocaleToDuplicate: 'Ընտրեք տեղայնացվածությունները կրկնօրինակելու համար',
},
operators: {
contains: 'պարունակում է',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/id.ts
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,9 @@ export const idTranslations: DefaultTranslationsObject = {
copyTo: 'Salin ke',
copyToLocale: 'Salin ke lokal',
localeToPublish: 'Lokal untuk dipublikasikan',
selectedLocales: 'Lokasi yang Dipilih',
selectLocaleToCopy: 'Pilih lokal untuk disalin',
selectLocaleToDuplicate: 'Pilih bahasa lokal untuk duplikat',
},
operators: {
contains: 'mengandung',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/is.ts
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,9 @@ export const isTranslations: DefaultTranslationsObject = {
copyTo: 'Afrita til',
copyToLocale: 'Afrita í staðfærslu',
localeToPublish: 'Staðfærsla til að gefa út',
selectedLocales: 'Valdar svæði',
selectLocaleToCopy: 'Veldu staðfærslu til að afrita',
selectLocaleToDuplicate: 'Veldu staðföng til að afrita',
},
operators: {
contains: 'inniheldur',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,9 @@ export const itTranslations: DefaultTranslationsObject = {
copyTo: 'Copia per',
copyToLocale: 'Copia in locale',
localeToPublish: 'Località da pubblicare',
selectedLocales: 'Località Selezionate',
selectLocaleToCopy: 'Seleziona la località da copiare',
selectLocaleToDuplicate: 'Seleziona le località da duplicare',
},
operators: {
contains: 'contiene',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,9 @@ export const jaTranslations: DefaultTranslationsObject = {
copyTo: 'コピー先',
copyToLocale: 'ロケールにコピー',
localeToPublish: '公開する場所',
selectedLocales: '選択されたロケール',
selectLocaleToCopy: 'コピーするロケールを選択してください',
selectLocaleToDuplicate: '重複するロケールを選択してください',
},
operators: {
contains: '含む',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,9 @@ export const koTranslations: DefaultTranslationsObject = {
copyTo: '복사하기',
copyToLocale: '로케일로 복사',
localeToPublish: '발행할 장소',
selectedLocales: '선택된 로케일들',
selectLocaleToCopy: '복사할 지역을 선택하십시오.',
selectLocaleToDuplicate: '로케일을 복제할 선택하세요',
},
operators: {
contains: '포함',
Expand Down
2 changes: 2 additions & 0 deletions packages/translations/src/languages/lt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,9 @@ export const ltTranslations: DefaultTranslationsObject = {
copyTo: 'Kopijuoti į',
copyToLocale: 'Kopijuoti į vietovę',
localeToPublish: 'Publikuoti lokacijoje',
selectedLocales: 'Pasirinktos lokalės',
selectLocaleToCopy: 'Pasirinkite lokalės kopijavimui',
selectLocaleToDuplicate: 'Pasirinkite vietoves, kurias norite dubliuoti',
},
operators: {
contains: 'yra',
Expand Down
Loading
Loading