From ef26c62199603fcd5c2beefd50e468ad5d47cc98 Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Thu, 7 Dec 2023 11:51:24 +0000 Subject: [PATCH] feat: publish single locale functionality --- .../components/elements/Publish/index.tsx | 53 +++++++++---------- .../src/collections/operations/updateByID.ts | 2 + .../versions/getLatestCollectionVersion.ts | 8 ++- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/packages/payload/src/admin/components/elements/Publish/index.tsx b/packages/payload/src/admin/components/elements/Publish/index.tsx index 1e5eaf34fb..725a2e6b0e 100644 --- a/packages/payload/src/admin/components/elements/Publish/index.tsx +++ b/packages/payload/src/admin/components/elements/Publish/index.tsx @@ -18,27 +18,20 @@ export type DefaultPublishButtonProps = { disabled: boolean id?: string label: string - params: any publish: () => void - setParams: (params: any) => void + publishSpecificLocale: () => void } const DefaultPublishButton: React.FC = ({ id, canPublish, disabled, label, - params, publish, - setParams, + publishSpecificLocale, }) => { - const { code, label: localeLabel } = useLocale() + const { label: localeLabel } = useLocale() if (!canPublish) return null - const publishSpecificLocale = () => { - setParams({ ...params, publishSpecificLocale: code }) - publish() - } - return ( = ({ label: `Publish ${localeLabel} only`, onClick: publishSpecificLocale, }, - // { - // label: `Publish es only`, - // onClick: publishSpecificLocale, - // }, ]} size="small" type="button" @@ -70,7 +59,6 @@ export const Publish: React.FC = ({ CustomComponent }) => { const { code } = useLocale() const { id, collection, global, publishedDoc, unpublishedVersions } = useDocumentInfo() const [hasPublishPermission, setHasPublishPermission] = React.useState(false) - const [params, setParams] = React.useState({ locale: code || undefined }) const { getData, submit } = useForm() const modified = useFormModified() const { @@ -81,29 +69,41 @@ export const Publish: React.FC = ({ CustomComponent }) => { const hasNewerVersions = unpublishedVersions?.totalDocs > 0 const canPublish = modified || hasNewerVersions || !publishedDoc - - const publish = useCallback(() => { - let action - if (collection) { - action = `${serverURL}${api}/${collection.slug}/${id}?${qs.stringify(params)}` + const publishSpecificLocale = useCallback(() => { + const params = { + locale: code, + publishSpecificLocale: code, } - if (global) { - action = `${serverURL}${api}/globals/${global.slug}?${qs.stringify(params)}` - } + const action = `${serverURL}${api}${ + global ? `/globals/${global.slug}` : `/${collection.slug}/${id ? id : ''}` + }?${qs.stringify(params)}` + void submit({ action, overrides: { _status: 'published', }, }) - }, [submit, collection, global, serverURL, api, id, params]) + }, [submit]) + + const publish = useCallback(() => { + void submit({ + overrides: { + _status: 'published', + }, + }) + }, [submit]) React.useEffect(() => { const fetchPublishAccess = async () => { let docAccessURL: string let operation = 'update' + const params = { + locale: code || undefined, + } + if (global) { docAccessURL = `/globals/${global.slug}/access` } else if (collection) { @@ -134,7 +134,7 @@ export const Publish: React.FC = ({ CustomComponent }) => { } void fetchPublishAccess() - }, [api, code, collection, getData, global, id, serverURL, params]) + }, [api, code, collection, getData, global, id, serverURL]) return ( = ({ CustomComponent }) => { canPublish: hasPublishPermission, disabled: !canPublish, label: t('publishChanges'), - params, publish, - setParams, + publishSpecificLocale, }} /> ) diff --git a/packages/payload/src/collections/operations/updateByID.ts b/packages/payload/src/collections/operations/updateByID.ts index b93a6a7e65..cf504d99ec 100644 --- a/packages/payload/src/collections/operations/updateByID.ts +++ b/packages/payload/src/collections/operations/updateByID.ts @@ -92,6 +92,7 @@ async function updateByID( const { password } = data const shouldSaveDraft = Boolean(draftArg && collectionConfig.versions.drafts) const shouldSavePassword = Boolean(password && collectionConfig.auth && !shouldSaveDraft) + const publishSpecificLocale = req.query?.publishSpecificLocale // ///////////////////////////////////// // Access @@ -117,6 +118,7 @@ async function updateByID( id, config: collectionConfig, payload, + published: publishSpecificLocale !== undefined ? true : false, query: findOneArgs, req, }) diff --git a/packages/payload/src/versions/getLatestCollectionVersion.ts b/packages/payload/src/versions/getLatestCollectionVersion.ts index 6eca21157c..3c8cc6f933 100644 --- a/packages/payload/src/versions/getLatestCollectionVersion.ts +++ b/packages/payload/src/versions/getLatestCollectionVersion.ts @@ -10,6 +10,7 @@ type Args = { config: SanitizedCollectionConfig id: number | string payload: Payload + published?: boolean query: FindOneArgs req?: PayloadRequest } @@ -18,17 +19,22 @@ export const getLatestCollectionVersion = async ({ id, config, payload, + published, query, req, }: Args): Promise => { let latestVersion: TypeWithVersion + const whereQuery = published + ? { and: [{ parent: { equals: id } }, { 'version._status': { equals: 'published' } }] } + : { parent: { equals: id } } + if (config.versions?.drafts) { const { docs } = await payload.db.findVersions({ collection: config.slug, req, sort: '-updatedAt', - where: { parent: { equals: id } }, + where: whereQuery, }) ;[latestVersion] = docs }