diff --git a/packages/next/src/views/Version/Default/index.tsx b/packages/next/src/views/Version/Default/index.tsx index 0dee2d4ea..e31cc717a 100644 --- a/packages/next/src/views/Version/Default/index.tsx +++ b/packages/next/src/views/Version/Default/index.tsx @@ -238,6 +238,7 @@ export const DefaultVersionView: React.FC = ({ `version-drawer_${depth}_${uuid}` export const VersionDrawerContent: React.FC<{ - collectionSlug: string - docID: number | string + collectionSlug?: string + docID?: number | string drawerSlug: string + globalSlug?: string }> = (props) => { - const { collectionSlug, docID, drawerSlug } = props + const { collectionSlug, docID, drawerSlug, globalSlug } = props const { closeModal } = useModal() const searchParams = useSearchParams() const prevSearchParams = useRef(searchParams) @@ -46,12 +47,20 @@ export const VersionDrawerContent: React.FC<{ setIsLoading(true) try { + const isGlobal = Boolean(globalSlug) + const entitySlug = collectionSlug ?? globalSlug + const result = await renderDocument({ - collectionSlug, + collectionSlug: entitySlug, docID, drawerSlug, paramsOverride: { - segments: ['collections', collectionSlug, String(docID), 'versions'], + segments: [ + isGlobal ? 'globals' : 'collections', + entitySlug, + isGlobal ? undefined : String(docID), + 'versions', + ].filter(Boolean), }, redirectAfterDelete: false, redirectAfterDuplicate: false, @@ -75,7 +84,7 @@ export const VersionDrawerContent: React.FC<{ void fetchDocumentView() }, - [closeModal, collectionSlug, drawerSlug, renderDocument, searchParams, t], + [closeModal, collectionSlug, globalSlug, drawerSlug, renderDocument, searchParams, t], ) useEffect(() => { @@ -93,11 +102,12 @@ export const VersionDrawerContent: React.FC<{ return DocumentView } export const VersionDrawer: React.FC<{ - collectionSlug: string - docID: number | string + collectionSlug?: string + docID?: number | string drawerSlug: string + globalSlug?: string }> = (props) => { - const { collectionSlug, docID, drawerSlug } = props + const { collectionSlug, docID, drawerSlug, globalSlug } = props const { t } = useTranslation() return ( @@ -107,7 +117,12 @@ export const VersionDrawer: React.FC<{ slug={drawerSlug} title={t('version:selectVersionToCompare')} > - + ) } @@ -115,9 +130,11 @@ export const VersionDrawer: React.FC<{ export const useVersionDrawer = ({ collectionSlug, docID, + globalSlug, }: { - collectionSlug: string - docID: number | string + collectionSlug?: string + docID?: number | string + globalSlug?: string }) => { const drawerDepth = useEditDepth() const uuid = useId() @@ -147,9 +164,14 @@ export const useVersionDrawer = ({ const MemoizedDrawer = useMemo(() => { return () => ( - + ) - }, [collectionSlug, docID, drawerSlug]) + }, [collectionSlug, docID, drawerSlug, globalSlug]) return useMemo( () => ({ diff --git a/packages/next/src/views/Version/SelectComparison/index.tsx b/packages/next/src/views/Version/SelectComparison/index.tsx index c3d909183..2f1082ae9 100644 --- a/packages/next/src/views/Version/SelectComparison/index.tsx +++ b/packages/next/src/views/Version/SelectComparison/index.tsx @@ -17,13 +17,14 @@ export const SelectComparison: React.FC = memo((props) => { const { collectionSlug, docID, + globalSlug, onChange: onChangeFromProps, versionFromID, versionFromOptions, } = props const { t } = useTranslation() - const { Drawer, openDrawer } = useVersionDrawer({ collectionSlug, docID }) + const { Drawer, openDrawer } = useVersionDrawer({ collectionSlug, docID, globalSlug }) const options = useMemo(() => { return [ diff --git a/packages/next/src/views/Version/SelectComparison/types.ts b/packages/next/src/views/Version/SelectComparison/types.ts index 11c9808f1..703b73b12 100644 --- a/packages/next/src/views/Version/SelectComparison/types.ts +++ b/packages/next/src/views/Version/SelectComparison/types.ts @@ -3,8 +3,9 @@ import type { PaginatedDocs, SanitizedCollectionConfig } from 'payload' import type { CompareOption } from '../Default/types.js' export type Props = { - collectionSlug: string - docID: number | string + collectionSlug?: string + docID?: number | string + globalSlug?: string onChange: (val: CompareOption) => void versionFromID?: string versionFromOptions: CompareOption[] diff --git a/packages/next/src/views/Version/index.tsx b/packages/next/src/views/Version/index.tsx index 2c2cdebf2..d62343043 100644 --- a/packages/next/src/views/Version/index.tsx +++ b/packages/next/src/views/Version/index.tsx @@ -425,7 +425,7 @@ export async function VersionView(props: DocumentViewServerProps) { VersionToCreatedAtLabel={formatPill({ doc: versionTo, labelStyle: 'pill' })} versionToID={versionTo.id} versionToStatus={versionTo.version?._status} - versionToUseAsTitle={versionTo[collectionConfig.admin?.useAsTitle || 'id']} + versionToUseAsTitle={versionTo[collectionConfig?.admin?.useAsTitle || 'id']} /> ) } diff --git a/test/versions/e2e.spec.ts b/test/versions/e2e.spec.ts index 4243dcde3..3887931fb 100644 --- a/test/versions/e2e.spec.ts +++ b/test/versions/e2e.spec.ts @@ -205,6 +205,7 @@ describe('Versions', () => { const fieldValue = autosaveRelationField.locator('.value-container') await expect(fieldValue).toContainText('test') }) + test('should show collection versions view level action in collection versions view', async () => { await page.goto(url.list) await page.locator('tbody tr .cell-title a').first().click() @@ -839,6 +840,51 @@ describe('Versions', () => { await page.goto(url.global(disablePublishGlobalSlug)) await expect(page.locator('#action-save')).not.toBeAttached() }) + + test('global — should show versions drawer when SelectComparison more option is clicked', async () => { + await payload.updateGlobal({ + slug: draftGlobalSlug, + data: { + title: 'initial title', + }, + }) + await payload.updateGlobal({ + slug: draftGlobalSlug, + data: { + title: 'initial title 2', + }, + }) + + const url = new AdminUrlUtil(serverURL, draftGlobalSlug) + await page.goto(`${url.global(draftGlobalSlug)}/versions`) + + const versionsTable = page.locator('.table table') + await expect(versionsTable).toBeVisible() + + const versionAnchor = versionsTable.locator('tbody tr.row-1 td.cell-updatedAt a') + await expect(versionAnchor).toBeVisible() + await versionAnchor.click() + + const compareFromContainer = page.locator( + '.view-version__version-from .field-type.compare-version', + ) + await expect(compareFromContainer).toBeVisible() + + const fromSelect = compareFromContainer.locator('.react-select .rs__control') + await expect(fromSelect).toBeVisible() + await fromSelect.click() + + const moreVersions = compareFromContainer.locator('.rs__option:has-text("More versions...")') + await expect(moreVersions).toBeVisible() + await moreVersions.click() + + const versionDrawer = page.locator('dialog.version-drawer') + await expect(versionDrawer).toBeVisible() + + const versionsDrawerTableBody = versionDrawer.locator('main.versions table tbody') + await expect(versionsDrawerTableBody).toBeVisible() + await expect(versionsDrawerTableBody.locator('tr')).toHaveCount(2) + }) }) describe('Scheduled publish', () => {