diff --git a/packages/sanity/src/core/index.ts b/packages/sanity/src/core/index.ts
index 9bd8039b01c..a48fe6d1ae1 100644
--- a/packages/sanity/src/core/index.ts
+++ b/packages/sanity/src/core/index.ts
@@ -34,11 +34,13 @@ export {
isReleasePerspective,
isReleaseScheduledOrScheduling,
LATEST,
+ PUBLISHED,
type ReleaseDocument,
RELEASES_INTENT,
RELEASES_STUDIO_CLIENT_OPTIONS,
useActiveReleases,
useArchivedReleases,
+ useDocumentVersionList,
useDocumentVersions,
useIsReleaseActive,
useReleasesIds,
diff --git a/packages/sanity/src/core/releases/components/VersionInlineBadge.tsx b/packages/sanity/src/core/releases/components/VersionInlineBadge.tsx
index c6490855c0a..fcf8d60ba2a 100644
--- a/packages/sanity/src/core/releases/components/VersionInlineBadge.tsx
+++ b/packages/sanity/src/core/releases/components/VersionInlineBadge.tsx
@@ -12,8 +12,8 @@ const StyledVersionInlineBadge = styled.span<{$tone?: BadgeTone}>((props) => {
color: var(--card-badge-${$tone ?? 'default'}-fg-color);
background-color: var(--card-badge-${$tone ?? 'default'}-bg-color);
border-radius: 3px;
- text-decoration: none;
padding: 0px 2px;
+ text-decoration: none;
font-weight: 500;
`
})
diff --git a/packages/sanity/src/core/releases/hooks/index.ts b/packages/sanity/src/core/releases/hooks/index.ts
index 9fd6022cbc8..fb790020e32 100644
--- a/packages/sanity/src/core/releases/hooks/index.ts
+++ b/packages/sanity/src/core/releases/hooks/index.ts
@@ -1,3 +1,4 @@
+export * from './useDocumentVersionList'
export * from './useDocumentVersions'
export * from './useIsReleaseActive'
export * from './useVersionOperations'
diff --git a/packages/sanity/src/core/releases/hooks/useDocumentVersionList.ts b/packages/sanity/src/core/releases/hooks/useDocumentVersionList.ts
new file mode 100644
index 00000000000..b6ce485dd5b
--- /dev/null
+++ b/packages/sanity/src/core/releases/hooks/useDocumentVersionList.ts
@@ -0,0 +1,58 @@
+import {useMemo} from 'react'
+
+import {getVersionFromId, isVersionId} from '../../util/draftUtils'
+import {type ReleaseDocument, type ReleaseType} from '../store/types'
+import {useActiveReleases} from '../store/useActiveReleases'
+import {getReleaseIdFromReleaseDocumentId} from '../util/getReleaseIdFromReleaseDocumentId'
+import {useDocumentVersions} from './useDocumentVersions'
+
+const orderedReleaseTypes: ReleaseType[] = ['asap', 'scheduled', 'undecided']
+
+interface useDocumentVersionListState {
+ sortedDocumentList: ReleaseDocument[]
+ onlyHasVersions: boolean
+}
+
+/**
+ * Fetches the document versions for a given document and sorts them by release type
+ * Returns a boolean if the document has only versions
+ *
+ * @param documentId - document id related to the document version list
+ * @returns object with sortedDocumentList and if the document has only versions
+ *
+ * @beta
+ */
+export const useDocumentVersionList = ({
+ documentId,
+}: {
+ documentId: string
+}): useDocumentVersionListState => {
+ const {data: releases} = useActiveReleases()
+ const {data: documentVersions} = useDocumentVersions({documentId})
+
+ const sortedDocumentList = releases
+ .filter(({_id}) => {
+ return documentVersions.some(
+ (id) => getVersionFromId(id) === getReleaseIdFromReleaseDocumentId(_id),
+ )
+ })
+ .sort((a, b) => {
+ return (
+ orderedReleaseTypes.indexOf(a.metadata.releaseType) -
+ orderedReleaseTypes.indexOf(b.metadata.releaseType)
+ )
+ })
+
+ const onlyHasVersions =
+ documentVersions &&
+ documentVersions.length > 0 &&
+ !documentVersions.some((version) => !isVersionId(version))
+
+ return useMemo(
+ () => ({
+ sortedDocumentList: sortedDocumentList,
+ onlyHasVersions,
+ }),
+ [sortedDocumentList, onlyHasVersions],
+ )
+}
diff --git a/packages/sanity/src/structure/i18n/resources.ts b/packages/sanity/src/structure/i18n/resources.ts
index c507db49a95..8355b123970 100644
--- a/packages/sanity/src/structure/i18n/resources.ts
+++ b/packages/sanity/src/structure/i18n/resources.ts
@@ -136,6 +136,14 @@ const structureLocaleStrings = defineLocalesResources('structure', {
'This reference has been removed since you opened it.',
/** The text that appears for the action button to add the current document to the global release */
'banners.release.action.add-to-release': 'Add to release',
+ /** The text that appears for the action button to add the current document to the global release */
+ 'banners.release.action.open-to-edit': 'Open release to edit',
+ /** The text for the banner that appears when a document only has versions but is in a draft or published pinned release */
+ 'banners.release.navigate-to-edit-description': 'The document only exists in the',
+ /** The text for the banner that appears when a document only has versions but is in a draft or published pinned release */
+ 'banners.release.navigate-to-edit-description-end_one': 'release',
+ /** The text for the banner that appears when a document only has versions but is in a draft or published pinned release */
+ 'banners.release.navigate-to-edit-description-end_other': 'releases',
/** The text for the banner that appears when a document is not in the current global release */
'banners.release.not-in-release': 'Not in the {{title}} release.',
diff --git a/packages/sanity/src/structure/panes/document/DocumentPaneProvider.tsx b/packages/sanity/src/structure/panes/document/DocumentPaneProvider.tsx
index 9a7e5004285..a457ba74d8f 100644
--- a/packages/sanity/src/structure/panes/document/DocumentPaneProvider.tsx
+++ b/packages/sanity/src/structure/panes/document/DocumentPaneProvider.tsx
@@ -22,6 +22,7 @@ import {
getDraftId,
getExpandOperations,
getPublishedId,
+ getReleaseIdFromReleaseDocumentId,
getVersionFromId,
isGoingToUnpublish,
isPublishedPerspective,
@@ -39,6 +40,8 @@ import {
useCopyPaste,
useDocumentOperation,
useDocumentValuePermissions,
+ useDocumentVersionList,
+ useDocumentVersions,
useEditState,
useFormState,
useInitialValue,
@@ -126,6 +129,7 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => {
const params = useUnique(paneRouter.params) || EMPTY_PARAMS
const perspective = usePerspective()
+ const {data: documentVersions} = useDocumentVersions({documentId})
const {isReleaseLocked, selectedReleaseId, selectedPerspectiveName} = useMemo(() => {
// TODO: COREL - Remove this after updating sanity-assist to use
@@ -169,9 +173,34 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => {
const initialValue = useUnique(initialValueRaw)
const isInitialValueLoading = initialValue.loading
+ // if it only has versions then we need to make sure that whatever the first document that is allowed
+ // is a version document, but also that it has the right order
+ // this will make sure that then the right document appears and so does the right chip within the document header
+ const {sortedDocumentList, onlyHasVersions} = useDocumentVersionList({documentId})
+ const firstVersion =
+ sortedDocumentList.length > 0
+ ? documentVersions.find(
+ (id) =>
+ getVersionFromId(id) === getReleaseIdFromReleaseDocumentId(sortedDocumentList[0]._id),
+ )
+ : undefined
+
const {patch} = useDocumentOperation(documentId, documentType, selectedReleaseId)
const schemaType = schema.get(documentType) as ObjectSchemaType | undefined
- const editState = useEditState(documentId, documentType, 'default', selectedReleaseId)
+ const id = useMemo(() => {
+ if (selectedReleaseId) {
+ return selectedReleaseId
+ }
+ // check if the selected version is the only version, if it isn't and it doesn't exist in hte release
+ // then it needs to use the documentVersions
+ if (!documentVersions || !onlyHasVersions) {
+ return selectedReleaseId
+ }
+ return getVersionFromId(firstVersion ?? '')
+ }, [documentVersions, onlyHasVersions, selectedReleaseId, firstVersion])
+
+ const editState = useEditState(documentId, documentType, 'default', id)
+
const {validation: validationRaw} = useValidationStatus(
documentId,
documentType,
@@ -190,6 +219,10 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => {
(liveEdit ? initialValue.value : {_id: documentId, _type: documentType})
)
}
+ // if no version is selected, but there is only version, it should default to the version version it finds
+ if (!selectedPerspectiveName && onlyHasVersions) {
+ return editState.version || editState.draft || editState.published || initialValue.value
+ }
return editState.draft || editState.published || initialValue.value
}, [
documentId,
@@ -199,6 +232,7 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => {
editState.version,
initialValue.value,
liveEdit,
+ onlyHasVersions,
selectedPerspectiveName,
selectedReleaseId,
])
@@ -607,6 +641,10 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => {
return true
}
+ if (!selectedPerspectiveName && onlyHasVersions) {
+ return true
+ }
+
return (
willBeUnpublished ||
!ready ||
@@ -633,6 +671,7 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => {
selectedPerspectiveName,
selectedReleaseId,
value._id,
+ onlyHasVersions,
willBeUnpublished,
ready,
revisionId,
diff --git a/packages/sanity/src/structure/panes/document/documentPanel/DocumentPanel.tsx b/packages/sanity/src/structure/panes/document/documentPanel/DocumentPanel.tsx
index 95f1cfa0e7b..fbddc5eebb4 100644
--- a/packages/sanity/src/structure/panes/document/documentPanel/DocumentPanel.tsx
+++ b/packages/sanity/src/structure/panes/document/documentPanel/DocumentPanel.tsx
@@ -6,6 +6,7 @@ import {
isReleaseScheduledOrScheduling,
type ReleaseDocument,
ScrollContainer,
+ useDocumentVersionList,
usePerspective,
VirtualizerScrollInstanceProvider,
} from 'sanity'
@@ -26,6 +27,7 @@ import {
import {AddToReleaseBanner} from './banners/AddToReleaseBanner'
import {ArchivedReleaseDocumentBanner} from './banners/ArchivedReleaseDocumentBanner'
import {DraftLiveEditBanner} from './banners/DraftLiveEditBanner'
+import {OpenReleaseToEditBanner} from './banners/OpenReleaseToEditBanner'
import {ScheduledReleaseBanner} from './banners/ScheduledReleaseBanner'
import {UnpublishedDocumentBanner} from './banners/UnpublishedDocumentBanner'
import {FormView} from './documentViews'
@@ -80,6 +82,7 @@ export const DocumentPanel = function DocumentPanel(props: DocumentPanelProps) {
const [_portalElement, setPortalElement] = useState(null)
const [documentScrollElement, setDocumentScrollElement] = useState(null)
const formContainerElement = useRef(null)
+ const {onlyHasVersions} = useDocumentVersionList({documentId})
const requiredPermission = value._createdAt ? 'update' : 'create'
@@ -150,18 +153,23 @@ export const DocumentPanel = function DocumentPanel(props: DocumentPanelProps) {
if (params?.historyVersion) {
return
}
- const isCreatingDocument = displayed && !displayed._createdAt
const isScheduledRelease =
isReleaseDocument(selectedPerspective) && isReleaseScheduledOrScheduling(selectedPerspective)
-
if (isScheduledRelease) {
return
}
+ const isDraftOrPublish: boolean =
+ selectedPerspective === 'drafts' || selectedPerspective === 'published'
+
+ if (isDraftOrPublish && onlyHasVersions) {
+ return
+ }
+
if (
displayed?._id &&
getVersionFromId(displayed._id) !== selectedReleaseId &&
ready &&
- !isCreatingDocument
+ !isDraftOrPublish
) {
return (
activeReleases.find((version) => version._id.includes(releaseId)),
+ [activeReleases, releaseId],
+ )
+ const {data: documentVersions} = useDocumentVersions({documentId})
+
+ const documentVersionsTitleList = useMemo(
+ () =>
+ activeReleases
+ .filter((version) => {
+ return documentVersions.find((release) => {
+ const r = getVersionFromId(release) ?? ''
+ return version._id.includes(r)
+ })
+ })
+ .map((version) => version.metadata.title),
+ [activeReleases, documentVersions],
+ )
+ const tone = currentVersion && getReleaseTone(currentVersion)
+ const {t} = useTranslation(structureLocaleNamespace)
+
+ const handleGoToEdit = useCallback(async () => {
+ setPerspective(releaseId as ReleaseId)
+ }, [releaseId, setPerspective])
+
+ if (isDraftId(documentId) || isPublishedId(documentId)) {
+ return null
+ }
+
+ return (
+
+
+
+ {t('banners.release.navigate-to-edit-description')}
+ {documentVersionsTitleList.map((title) => (
+ {title}
+ ))}
+ {t('banners.release.navigate-to-edit-description-end', {
+ count: documentVersionsTitleList.length,
+ })}
+
+
+
+
+
+ }
+ />
+ )
+}
diff --git a/packages/sanity/src/structure/panes/document/documentPanel/banners/__tests__/OpenReleaseToEditBanner.test.tsx b/packages/sanity/src/structure/panes/document/documentPanel/banners/__tests__/OpenReleaseToEditBanner.test.tsx
new file mode 100644
index 00000000000..98ea6fd69c1
--- /dev/null
+++ b/packages/sanity/src/structure/panes/document/documentPanel/banners/__tests__/OpenReleaseToEditBanner.test.tsx
@@ -0,0 +1,204 @@
+import {cleanup, render, screen} from '@testing-library/react'
+import {
+ getReleaseIdFromReleaseDocumentId,
+ LATEST,
+ PUBLISHED,
+ type ReleaseDocument,
+ useActiveReleases,
+ useDocumentVersions,
+ usePerspective,
+ useReleasesIds,
+} from 'sanity'
+import {useDocumentPane} from 'sanity/structure'
+import {afterEach, beforeEach, describe, expect, it, type Mock, vi} from 'vitest'
+
+import {createTestProvider} from '../../../../../../../test/testUtils/TestProvider'
+import {structureUsEnglishLocaleBundle} from '../../../../../i18n'
+import {OpenReleaseToEditBanner} from '../OpenReleaseToEditBanner'
+
+vi.mock('../../../useDocumentPane', () => ({
+ useDocumentPane: vi.fn(),
+}))
+
+vi.mock('sanity', async () => {
+ const sanity = await vi.importActual('sanity')
+ return {
+ ...sanity,
+ useReleasesIds: vi.fn(),
+ useActiveReleases: vi.fn(),
+ usePerspective: vi.fn(),
+ useArchivedReleases: vi.fn(),
+ useDocumentVersions: vi.fn(),
+ }
+})
+
+const mockUseDocumentPane = useDocumentPane as Mock
+const mockUseReleasesIds = useReleasesIds as Mock
+const mockUseActiveReleases = useActiveReleases as Mock
+const mockUsePerspective = usePerspective as Mock
+const mockUseDocumentVersions = useDocumentVersions as Mock
+
+const release1: ReleaseDocument = {
+ _rev: 'activeRev',
+ _id: '_.releases.rActive',
+ _type: 'system.release',
+ _createdAt: '2023-10-10T08:00:00Z',
+ _updatedAt: '2023-10-10T09:00:00Z',
+ state: 'active',
+ metadata: {
+ title: 'active Release',
+ releaseType: 'scheduled',
+ intendedPublishAt: '2023-10-10T10:00:00.000Z',
+ description: 'active Release description',
+ },
+}
+
+const release2: ReleaseDocument = {
+ _rev: 'activeRev',
+ _id: '_.releases.rActive2',
+ _type: 'system.release',
+ _createdAt: '2023-10-10T08:00:00Z',
+ _updatedAt: '2023-10-10T09:00:00Z',
+ state: 'active',
+ metadata: {
+ title: 'active Release 2 electric boogaloo',
+ releaseType: 'scheduled',
+ intendedPublishAt: '2023-10-10T10:00:00.000Z',
+ description: 'active Release description',
+ },
+}
+
+describe('OpenReleaseToEditbanner', () => {
+ beforeEach(() => {
+ mockUseDocumentPane.mockClear()
+ mockUseReleasesIds.mockClear()
+ mockUseActiveReleases.mockClear()
+ mockUsePerspective.mockClear()
+ mockUseDocumentVersions.mockClear()
+ vi.clearAllMocks()
+ })
+
+ afterEach(() => {
+ cleanup()
+ })
+
+ it('does not show when is draft', async () => {
+ mockUsePerspective.mockReturnValue({
+ selectedPerspective: LATEST,
+ } as unknown as ReturnType)
+
+ mockUseActiveReleases.mockReturnValue({
+ data: [],
+ dispatch: vi.fn(),
+ loading: false,
+ })
+ mockUseReleasesIds.mockReturnValue({
+ releasesIds: [],
+ })
+ mockUseDocumentPane.mockReturnValue({
+ isDeleted: false,
+ isDeleting: false,
+ documentId: 'drafts.test',
+ } as ReturnType)
+ mockUseDocumentVersions.mockReturnValue({
+ data: [],
+ loading: false,
+ })
+
+ const wrapper = await createTestProvider({resources: [structureUsEnglishLocaleBundle]})
+
+ render(, {wrapper})
+
+ expect(screen.queryByTestId('open-release-to-edit-banner')).toBeNull()
+ })
+
+ it('does not show when is published', async () => {
+ mockUsePerspective.mockReturnValue({
+ selectedPerspective: PUBLISHED,
+ } as unknown as ReturnType)
+
+ mockUseActiveReleases.mockReturnValue({
+ data: [],
+ dispatch: vi.fn(),
+ loading: false,
+ })
+ mockUseReleasesIds.mockReturnValue({
+ releasesIds: [],
+ })
+ mockUseDocumentPane.mockReturnValue({
+ isDeleted: false,
+ isDeleting: false,
+ documentId: 'test',
+ } as ReturnType)
+ mockUseDocumentVersions.mockReturnValue({
+ data: [],
+ loading: false,
+ })
+
+ const wrapper = await createTestProvider({resources: [structureUsEnglishLocaleBundle]})
+ render(, {wrapper})
+
+ expect(screen.queryByTestId('open-release-to-edit-banner')).toBeNull()
+ })
+
+ // @jordan, here's the trouble child (the latest)
+ it('does not show if it only has versions, no draft or publish but is showing a version', async () => {
+ const testId = `versions.${getReleaseIdFromReleaseDocumentId(release1._id)}.test`
+
+ mockUsePerspective.mockReturnValue({
+ selectedPerspective: release1,
+ } as unknown as ReturnType)
+
+ mockUseActiveReleases.mockReturnValue({
+ data: [release1],
+ dispatch: vi.fn(),
+ loading: false,
+ })
+ mockUseReleasesIds.mockReturnValue({
+ releasesIds: [],
+ })
+ mockUseDocumentPane.mockReturnValue({
+ isDeleted: false,
+ isDeleting: false,
+ documentId: testId,
+ } as ReturnType)
+ mockUseDocumentVersions.mockReturnValue({
+ data: [testId],
+ loading: false,
+ })
+
+ const wrapper = await createTestProvider({resources: [structureUsEnglishLocaleBundle]})
+ render(, {
+ wrapper,
+ })
+
+ expect(screen.queryByTestId('open-release-to-edit-banner')).toBeNull()
+ })
+
+ it.skip('shows the banner because it is not a draft or publish and its showing version that is not the pinned one', async () => {
+ const testId = `versions.${getReleaseIdFromReleaseDocumentId(release2._id)}.test`
+
+ mockUsePerspective.mockReturnValue({
+ selectedPerspective: release1,
+ } as unknown as ReturnType)
+
+ mockUseDocumentPane.mockReturnValue({
+ isDeleted: false,
+ isDeleting: false,
+ documentId: testId,
+ } as ReturnType)
+
+ mockUseActiveReleases.mockReturnValue({
+ data: [release1, release2],
+ loading: false,
+ dispatch: vi.fn(),
+ })
+
+ const wrapper = await createTestProvider({resources: [structureUsEnglishLocaleBundle]})
+ render(, {
+ wrapper,
+ })
+
+ expect(screen.queryByTestId('open-release-to-edit-banner')).not.toBeNull()
+ })
+})
diff --git a/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/DocumentPerspectiveList.tsx b/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/DocumentPerspectiveList.tsx
index 88e342d2196..079c30b4be3 100644
--- a/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/DocumentPerspectiveList.tsx
+++ b/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/DocumentPerspectiveList.tsx
@@ -91,6 +91,7 @@ export const DocumentPerspectiveList = memo(function DocumentPerspectiveList() {
const {editState, displayed, documentType, documentId} = useDocumentPane()
const {data: documentVersions} = useDocumentVersions({documentId})
const isCreatingDocument = displayed && !displayed._createdAt
+ const onlyHasVersions = !editState?.published && !editState?.draft && documentVersions?.length > 0
const filteredReleases: FilterReleases = useMemo(() => {
if (!documentVersions) return {notCurrentReleases: [], currentReleases: [], inCreation: null}
@@ -230,14 +231,21 @@ export const DocumentPerspectiveList = memo(function DocumentPerspectiveList() {
])
const isDraftDisabled: boolean = useMemo(() => {
+ // Draft is disabled when the document has no published or draft but has versions
+ if (onlyHasVersions || (isCreatingDocument && selectedReleaseId)) {
+ return true
+ }
+
// Draft is disabled when we are creating a new document inside a release
// or when the document is live edit and there is no draft
- if (editState?.draft) return false
+ if (!editState?.draft && !isLiveEdit) {
+ return false
+ }
if (isCreatingDocument && selectedReleaseId) return true
if (isLiveEdit) return true
return false
- }, [editState?.draft, isCreatingDocument, isLiveEdit, selectedReleaseId])
+ }, [editState?.draft, isCreatingDocument, isLiveEdit, onlyHasVersions, selectedReleaseId])
return (
<>
diff --git a/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/__tests__/DocumentPerspectiveList.test.tsx b/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/__tests__/DocumentPerspectiveList.test.tsx
index a53dbd53467..3ac8df5e348 100644
--- a/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/__tests__/DocumentPerspectiveList.test.tsx
+++ b/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/__tests__/DocumentPerspectiveList.test.tsx
@@ -100,21 +100,21 @@ const getTestProvider = async ({liveEdit}: {liveEdit?: boolean} = {}) => {
const usePerspectiveMockValue: Mocked> = {
selectedPerspectiveName: undefined,
selectedReleaseId: undefined,
- setPerspective: vi.fn(),
selectedPerspective: 'drafts',
- toggleExcludedPerspective: vi.fn(),
- isPerspectiveExcluded: vi.fn(),
perspectiveStack: [],
+ excludedPerspectives: [],
} as const
const getPaneMock = ({
isCreatingDocument,
displayedVersion = 'draft',
editStateDocuments,
+ displayed,
}: {
isCreatingDocument?: boolean
displayedVersion?: ReleaseId | 'published' | 'draft'
editStateDocuments?: Array<'draft' | 'published' | 'version'>
+ displayed?: Record
} = {}) => {
const publishedId = 'foo'
const editStateDocument = {
@@ -142,17 +142,19 @@ const getPaneMock = ({
liveEditSchemaType: false,
release: displayedVersion.startsWith('r') ? displayedVersion : undefined,
},
- displayed: {
- _id:
- // eslint-disable-next-line no-nested-ternary
- displayedVersion === 'published'
- ? publishedId
- : displayedVersion === 'draft'
- ? getDraftId(publishedId)
- : getVersionId(publishedId, displayedVersion),
- _type: 'testAuthor',
- _createdAt: isCreatingDocument ? undefined : '2023-01-01T00:00:00Z',
- },
+ displayed: displayed
+ ? displayed
+ : {
+ _id:
+ // eslint-disable-next-line no-nested-ternary
+ displayedVersion === 'published'
+ ? publishedId
+ : displayedVersion === 'draft'
+ ? getDraftId(publishedId)
+ : getVersionId(publishedId, displayedVersion),
+ _type: 'testAuthor',
+ _createdAt: isCreatingDocument ? undefined : '2023-01-01T00:00:00Z',
+ },
}
}
@@ -213,6 +215,14 @@ describe('DocumentPerspectiveList', () => {
})
describe('disabled chips', () => {
+ beforeEach(() => {
+ mockUseDocumentVersions.mockReturnValue({
+ data: [],
+ loading: false,
+ error: null,
+ })
+ })
+
it('should disable the "Published" chip when there is no published document and not live edit, draft should be enabled', async () => {
mockUseDocumentPane.mockReturnValue(getPaneMock())
@@ -249,6 +259,27 @@ describe('DocumentPerspectiveList', () => {
expect(screen.getByRole('button', {name: 'Published'})).toBeEnabled()
})
+
+ it('should disable the "Draft" chip when the document only has one version, no pinned version', async () => {
+ mockUseDocumentPane.mockReturnValue(
+ getPaneMock({
+ editStateDocuments: [],
+ displayedVersion: 'rSpringDrop',
+ isCreatingDocument: true,
+ }),
+ )
+
+ mockUsePerspective.mockReturnValue({
+ ...usePerspectiveMockValue,
+ selectedPerspectiveName: undefined,
+ })
+ mockUseDocumentVersions.mockReturnValue({data: ['rSpringDrop'], loading: false, error: null})
+
+ const wrapper = await getTestProvider({liveEdit: false})
+ render(, {wrapper})
+
+ expect(screen.getByRole('button', {name: 'Draft'})).toBeDisabled()
+ })
})
describe('selected chips', () => {
@@ -438,8 +469,8 @@ describe('DocumentPerspectiveList', () => {
mockUseDocumentPane.mockReturnValue(
getPaneMock({
editStateDocuments: ['draft'],
- displayedVersion: 'rSpringDrop',
- isCreatingDocument: true,
+ displayedVersion: 'draft',
+ isCreatingDocument: false,
}),
)
mockUsePerspective.mockReturnValue({
@@ -452,7 +483,6 @@ describe('DocumentPerspectiveList', () => {
render(, {wrapper})
expect(screen.getByRole('button', {name: 'Draft'})).toBeEnabled()
expect(screen.getByRole('button', {name: 'Published'})).not.toBeEnabled()
- expect(screen.getByRole('button', {name: 'Spring Drop'})).toHaveAttribute('data-selected')
})
it('no draft, published and no version - perspective is version', async () => {
mockUseDocumentPane.mockReturnValue(