Skip to content
Draft
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
24 changes: 19 additions & 5 deletions packages/payload/src/collections/config/sanitize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,14 +166,17 @@ export const sanitizeCollection = async (
}

if (sanitized.versions) {
if (sanitized.versions === true) {
sanitized.versions = { drafts: false, maxPerDoc: 100 }
}

if (sanitized.timestamps === false) {
throw new TimestampsRequired(collection)
}

if (sanitized.versions === true) {
sanitized.versions = {
drafts: false,
maxPerDoc: 100,
}
}

sanitized.versions.maxPerDoc =
typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100

Expand All @@ -185,6 +188,12 @@ export const sanitizeCollection = async (
}
}

if (!config.localization) {
sanitized.versions.drafts.localizeStatus = false
} else {
sanitized.versions.drafts.localizeStatus ??= Boolean(config.experimental?.localizeStatus)
}

if (sanitized.versions.drafts.autosave === true) {
sanitized.versions.drafts.autosave = {
interval: versionDefaults.autosaveInterval,
Expand All @@ -195,7 +204,12 @@ export const sanitizeCollection = async (
sanitized.versions.drafts.validate = false
}

sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields)
sanitized.fields = mergeBaseFields(
sanitized.fields,
baseVersionFields({
localized: sanitized.versions.drafts.localizeStatus,
}),
)
}
}

Expand Down
3 changes: 2 additions & 1 deletion packages/payload/src/collections/endpoints/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { createOperation } from '../operations/create.js'
export const createHandler: PayloadHandler = async (req) => {
const collection = getRequestCollection(req)

const { autosave, depth, draft, populate, select } = parseParams(req.query)
const { autosave, depth, draft, populate, publishAllLocales, select } = parseParams(req.query)

const publishSpecificLocale = req.query.publishSpecificLocale as string | undefined

Expand All @@ -22,6 +22,7 @@ export const createHandler: PayloadHandler = async (req) => {
depth,
draft,
populate,
publishAllLocales,
publishSpecificLocale,
req,
select,
Expand Down
18 changes: 15 additions & 3 deletions packages/payload/src/collections/endpoints/update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,19 @@ import { updateOperation } from '../operations/update.js'
export const updateHandler: PayloadHandler = async (req) => {
const collection = getRequestCollection(req)

const { depth, draft, limit, overrideLock, populate, select, sort, trash, where } = parseParams(
req.query,
)
const {
depth,
draft,
limit,
overrideLock,
populate,
publishAllLocales,
select,
sort,
trash,
unpublishAllLocales,
where,
} = parseParams(req.query)

const result = await updateOperation({
collection,
Expand All @@ -23,10 +33,12 @@ export const updateHandler: PayloadHandler = async (req) => {
limit,
overrideLock: overrideLock ?? false,
populate,
publishAllLocales,
req,
select,
sort,
trash,
unpublishAllLocales,
where: where!,
})

Expand Down
16 changes: 14 additions & 2 deletions packages/payload/src/collections/endpoints/updateByID.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,18 @@ import { updateByIDOperation } from '../operations/updateByID.js'
export const updateByIDHandler: PayloadHandler = async (req) => {
const { id, collection } = getRequestCollectionWithID(req)

const { autosave, depth, draft, overrideLock, populate, publishSpecificLocale, select, trash } =
parseParams(req.query)
const {
autosave,
depth,
draft,
overrideLock,
populate,
publishAllLocales,
publishSpecificLocale,
select,
trash,
unpublishAllLocales,
} = parseParams(req.query)

const doc = await updateByIDOperation({
id,
Expand All @@ -22,10 +32,12 @@ export const updateByIDHandler: PayloadHandler = async (req) => {
draft,
overrideLock: overrideLock ?? false,
populate,
publishAllLocales,
publishSpecificLocale,
req,
select,
trash,
unpublishAllLocales,
})

let message = req.t('general:updatedSuccessfully')
Expand Down
42 changes: 41 additions & 1 deletion packages/payload/src/collections/operations/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export type Arguments<TSlug extends CollectionSlug> = {
overrideAccess?: boolean
overwriteExistingFiles?: boolean
populate?: PopulateType
publishAllLocales?: boolean
publishSpecificLocale?: string
req: PayloadRequest
select?: SelectType
Expand Down Expand Up @@ -105,6 +106,7 @@ export const createOperation = async <
overrideAccess,
overwriteExistingFiles = false,
populate,
publishAllLocales: publishAllLocalesArg,
publishSpecificLocale,
req: {
fallbackLocale,
Expand All @@ -120,7 +122,17 @@ export const createOperation = async <

let { data } = args

const isSavingDraft = Boolean(draft && collectionConfig.versions.drafts)
const publishAllLocales =
!draft &&
(publishAllLocalesArg ??
(collectionConfig.versions.drafts && collectionConfig.versions.drafts.localizeStatus
? false
: true))
const isSavingDraft = Boolean(draft && collectionConfig.versions.drafts && !publishAllLocales)

if (isSavingDraft) {
data._status = 'draft'
}

let duplicatedFromDocWithLocales: JsonObject = {}
let duplicatedFromDoc: JsonObject = {}
Expand Down Expand Up @@ -237,6 +249,34 @@ export const createOperation = async <
!collectionConfig.versions.drafts.validate,
})

if (
config.localization &&
collectionConfig.versions &&
collectionConfig.versions.drafts &&
collectionConfig.versions.drafts.localizeStatus &&
publishAllLocales
) {
let accessibleLocaleCodes = config.localization.localeCodes

if (config.localization.filterAvailableLocales) {
const filteredLocales = await config.localization.filterAvailableLocales({
locales: config.localization.locales,
req,
})
accessibleLocaleCodes = filteredLocales.map((locale) =>
typeof locale === 'string' ? locale : locale.code,
)
}

if (typeof resultWithLocales._status !== 'object' || resultWithLocales._status === null) {
resultWithLocales._status = {}
}

for (const localeCode of accessibleLocaleCodes) {
resultWithLocales._status[localeCode] = 'published'
}
}

// /////////////////////////////////////
// Write files to local storage
// /////////////////////////////////////
Expand Down
6 changes: 6 additions & 0 deletions packages/payload/src/collections/operations/local/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ type BaseOptions<TSlug extends CollectionSlug, TSelect extends SelectType> = {
* Specify [populate](https://payloadcms.com/docs/queries/select#populate) to control which fields to include to the result from populated documents.
*/
populate?: PopulateType
/**
* Publish to all locales
*/
publishAllLocales?: boolean
/**
* The `PayloadRequest` object. You can pass it to thread the current [transaction](https://payloadcms.com/docs/database/transactions), user and locale to the operation.
* Recommended to pass when using the Local API from hooks, as usually you want to execute the operation within the current transaction.
Expand Down Expand Up @@ -151,6 +155,7 @@ export async function createLocal<
overrideAccess = true,
overwriteExistingFiles = false,
populate,
publishAllLocales,
select,
showHiddenFields,
} = options
Expand Down Expand Up @@ -178,6 +183,7 @@ export async function createLocal<
overrideAccess,
overwriteExistingFiles,
populate,
publishAllLocales,
req,
select,
showHiddenFields,
Expand Down
16 changes: 16 additions & 0 deletions packages/payload/src/collections/operations/local/update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,16 @@ export type BaseOptions<TSlug extends CollectionSlug, TSelect extends SelectType
* Specify [populate](https://payloadcms.com/docs/queries/select#populate) to control which fields to include to the result from populated documents.
*/
populate?: PopulateType
/**
* Publish the document / documents in all locales. Requires `versions.drafts.localizeStatus` to be enabled.
*
* @default undefined
*/
publishAllLocales?: boolean
/**
* Publish the document / documents with a specific locale.
*
* @default undefined
*/
publishSpecificLocale?: string
/**
Expand All @@ -120,6 +128,10 @@ export type BaseOptions<TSlug extends CollectionSlug, TSelect extends SelectType
* @default false
*/
trash?: boolean
/**
* Unpublish the document / documents in all locales. Requires `versions.drafts.localizeStatus` to be enabled.
*/
unpublishAllLocales?: boolean
/**
* If you set `overrideAccess` to `false`, you can pass a user to use against the access control checks.
*/
Expand Down Expand Up @@ -222,11 +234,13 @@ async function updateLocal<
overrideLock,
overwriteExistingFiles = false,
populate,
publishAllLocales,
publishSpecificLocale,
select,
showHiddenFields,
sort,
trash = false,
unpublishAllLocales,
where,
} = options

Expand Down Expand Up @@ -255,12 +269,14 @@ async function updateLocal<
overwriteExistingFiles,
payload,
populate,
publishAllLocales,
publishSpecificLocale,
req,
select,
showHiddenFields,
sort,
trash,
unpublishAllLocales,
where,
}

Expand Down
7 changes: 6 additions & 1 deletion packages/payload/src/collections/operations/update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export type Arguments<TSlug extends CollectionSlug> = {
overrideLock?: boolean
overwriteExistingFiles?: boolean
populate?: PopulateType
publishAllLocales?: boolean
publishSpecificLocale?: string
req: PayloadRequest
select?: SelectType
Expand All @@ -57,6 +58,7 @@ export type Arguments<TSlug extends CollectionSlug> = {
*/
sort?: Sort
trash?: boolean
unpublishAllLocales?: boolean
where: Where
}

Expand Down Expand Up @@ -103,6 +105,7 @@ export const updateOperation = async <
overrideLock,
overwriteExistingFiles = false,
populate,
publishAllLocales,
publishSpecificLocale,
req: {
fallbackLocale,
Expand All @@ -115,6 +118,7 @@ export const updateOperation = async <
showHiddenFields,
sort: incomingSort,
trash = false,
unpublishAllLocales,
where,
} = args

Expand Down Expand Up @@ -243,7 +247,6 @@ export const updateOperation = async <
// ///////////////////////////////////////////////
const updatedDoc = await updateDocument({
id,
accessResults: accessResult,
autosave,
collectionConfig,
config,
Expand All @@ -258,10 +261,12 @@ export const updateOperation = async <
overrideLock: overrideLock!,
payload,
populate,
publishAllLocales,
publishSpecificLocale,
req,
select: select!,
showHiddenFields: showHiddenFields!,
unpublishAllLocales,
})

return updatedDoc
Expand Down
7 changes: 6 additions & 1 deletion packages/payload/src/collections/operations/updateByID.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,13 @@ export type Arguments<TSlug extends CollectionSlug> = {
overrideLock?: boolean
overwriteExistingFiles?: boolean
populate?: PopulateType
publishAllLocales?: boolean
publishSpecificLocale?: string
req: PayloadRequest
select?: SelectType
showHiddenFields?: boolean
trash?: boolean
unpublishAllLocales?: boolean
}

export const updateByIDOperation = async <
Expand Down Expand Up @@ -95,6 +97,7 @@ export const updateByIDOperation = async <
overrideLock,
overwriteExistingFiles = false,
populate,
publishAllLocales,
publishSpecificLocale,
req: {
fallbackLocale,
Expand All @@ -106,6 +109,7 @@ export const updateByIDOperation = async <
select: incomingSelect,
showHiddenFields,
trash = false,
unpublishAllLocales,
} = args

if (!id) {
Expand Down Expand Up @@ -203,7 +207,6 @@ export const updateByIDOperation = async <

let result = await updateDocument<TSlug, TSelect>({
id,
accessResults,
autosave,
collectionConfig,
config,
Expand All @@ -218,10 +221,12 @@ export const updateByIDOperation = async <
overrideLock: overrideLock!,
payload,
populate,
publishAllLocales,
publishSpecificLocale,
req,
select: select!,
showHiddenFields: showHiddenFields!,
unpublishAllLocales,
})

await unlinkTempFiles({
Expand Down
Loading
Loading