Skip to content

Commit 8271a3b

Browse files
authoredMar 17, 2025··
fix(structure): update archived and published docs in release links (#8925)
1 parent dd55c89 commit 8271a3b

File tree

8 files changed

+80
-30
lines changed

8 files changed

+80
-30
lines changed
 

‎packages/sanity/src/core/i18n/bundles/studio.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1200,6 +1200,8 @@ export const studioLocaleStrings = defineLocalesResources('studio', {
12001200
'release.chip.global.drafts': 'Drafts',
12011201
/** Label for Published chip in document header */
12021202
'release.chip.published': 'Published',
1203+
/** Label for tooltip in chip when document is in an archived release */
1204+
'release.chip.tooltip.archived': 'This release is archived and cannot be edited.',
12031205
/** Label for tooltip in chip with the created date */
12041206
'release.chip.tooltip.created-date': 'Created {{date}}',
12051207
/** Label for tooltip in draft chip when it's a live edit document */

‎packages/sanity/src/core/releases/tool/components/ReleaseDocumentPreview.tsx

+35-18
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ interface ReleaseDocumentPreviewProps {
2323
layout?: PreviewLayoutKey
2424
}
2525

26+
const isArchivedRelease = (releaseState: ReleaseState | undefined) =>
27+
releaseState === 'archived' || releaseState === 'archiving' || releaseState === 'unarchiving'
28+
2629
export function ReleaseDocumentPreview({
2730
documentId,
2831
documentTypeName,
@@ -36,17 +39,27 @@ export function ReleaseDocumentPreview({
3639
const documentPresence = useDocumentPresence(documentId)
3740

3841
const intentParams = useMemo(() => {
39-
if (releaseState !== 'published' && releaseState !== 'archived') return {}
40-
41-
const rev = releaseState === 'archived' ? '@lastEdited' : '@lastPublished'
42+
if (releaseState === 'published') {
43+
// We are inspecting this document through the published view of the doc.
44+
return {
45+
rev: `@release:${getReleaseIdFromReleaseDocumentId(releaseId)}`,
46+
inspect: 'sanity/structure/history',
47+
}
48+
}
4249

43-
return {
44-
rev,
45-
inspect: 'sanity/structure/history',
46-
historyEvent: documentRevision,
47-
historyVersion: getReleaseIdFromReleaseDocumentId(releaseId),
50+
if (releaseState === 'archived') {
51+
// We are "faking" the release as if it is still valid only to render the document
52+
return {
53+
rev: '@lastEdited',
54+
inspect: 'sanity/structure/history',
55+
historyEvent: documentRevision,
56+
historyVersion: getReleaseIdFromReleaseDocumentId(releaseId),
57+
archivedRelease: 'true',
58+
}
4859
}
49-
}, [documentRevision, releaseId, releaseState])
60+
61+
return {}
62+
}, [releaseState, releaseId, documentRevision])
5063

5164
const LinkComponent = useMemo(
5265
() =>
@@ -61,19 +74,23 @@ export function ReleaseDocumentPreview({
6174
type: documentTypeName,
6275
...intentParams,
6376
}}
64-
searchParams={[
65-
[
66-
'perspective',
67-
releaseState === 'published'
68-
? 'published'
69-
: getReleaseIdFromReleaseDocumentId(releaseId),
70-
],
71-
]}
77+
searchParams={
78+
isArchivedRelease(releaseState)
79+
? undefined
80+
: [
81+
[
82+
'perspective',
83+
releaseState === 'published'
84+
? 'published'
85+
: getReleaseIdFromReleaseDocumentId(releaseId),
86+
],
87+
]
88+
}
7289
ref={ref}
7390
/>
7491
)
7592
}),
76-
[documentId, documentTypeName, intentParams, releaseId, releaseState],
93+
[documentId, documentTypeName, intentParams, releaseState, releaseId],
7794
)
7895

7996
const previewPresence = useMemo(

‎packages/sanity/src/core/releases/tool/components/__tests__/ReleaseDocumentPreview.test.tsx

+15
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,19 @@ describe('ReleaseDocumentPreview', () => {
123123
const searchParams = JSON.parse(link.getAttribute('data-search-params'))
124124
expect(searchParams).toContainEqual(['perspective', 'rActive'])
125125
})
126+
127+
it('creates link with release ID perspective when release state is not published', async () => {
128+
const {container} = await renderTest({
129+
documentId: 'doc123',
130+
documentTypeName: 'post',
131+
releaseId: activeScheduledRelease._id,
132+
previewValues: mockPreviewValues,
133+
isLoading: false,
134+
releaseState: 'archived',
135+
})
136+
137+
const link = container.querySelector('a')
138+
const searchParams = JSON.parse(link.getAttribute('data-search-params'))
139+
expect(searchParams).toBeNull()
140+
})
126141
})

‎packages/sanity/src/core/store/events/useEventsStore.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,19 @@ export function useEventsStore({
8989
return publishEvent?.id || null
9090
}
9191
if (rev === '@lastEdited') {
92-
const editEvent = events.find((event) => isEditDocumentVersionEvent(event))
92+
const editEvent = events.find(isEditDocumentVersionEvent)
9393
if (editEvent) return editEvent.revisionId
9494
}
95+
if (rev?.startsWith('@release:')) {
96+
const releaseId = rev.split(':')[1]
97+
const releaseEvent = events.find(
98+
(event) => isPublishDocumentVersionEvent(event) && event.releaseId === releaseId,
99+
)
100+
if (releaseEvent) return releaseEvent.id
101+
if (events.length > 0 && !loading) eventsStore.loadMoreEvents()
102+
}
95103
return rev
96-
}, [events, rev])
104+
}, [events, rev, eventsStore, loading])
97105

98106
const revision$ = useMemo(
99107
() =>

‎packages/sanity/src/structure/i18n/resources.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ const structureLocaleStrings = defineLocalesResources('structure', {
9292
'This document has live edit enabled and cannot be unpublished',
9393
/** Description for the archived release banner, rendered when viewing the history of a version document from the publihed view */
9494
'banners.archived-release.description':
95-
"You are viewing a read-only document that was archived as part of <VersionBadge>{{title}}</VersionBadge>. It can't be edited",
95+
'This document version belongs to the archived <VersionBadge>{{title}}</VersionBadge> release',
9696
/** The text for the restore button on the deleted document banner */
9797
'banners.deleted-document-banner.restore-button.text': 'Restore most recent revision',
9898
/** The text content for the deleted document banner */

‎packages/sanity/src/structure/panes/document/documentPanel/banners/ArchivedReleaseDocumentBanner.tsx

+8-4
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,14 @@ export function ArchivedReleaseDocumentBanner(): React.JSX.Element {
5959
</Text>
6060
</Flex>
6161
}
62-
action={{
63-
text: 'Go back to published version',
64-
onClick: handleGoBack,
65-
}}
62+
action={
63+
params?.archivedRelease
64+
? undefined
65+
: {
66+
text: 'Go back to published version',
67+
onClick: handleGoBack,
68+
}
69+
}
6670
/>
6771
)
6872
}

‎packages/sanity/src/structure/panes/document/documentPanel/header/perspective/DocumentPerspectiveList.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ import {useDocumentPane} from '../../../useDocumentPane'
3131
const TooltipContent = ({release}: {release: ReleaseDocument}) => {
3232
const {t} = useTranslation()
3333

34+
if (release.state === 'archived') {
35+
return <Text size={1}>{t('release.chip.tooltip.archived')}</Text>
36+
}
3437
if (release.metadata.releaseType === 'asap') {
3538
return <Text size={1}>{t('release.type.asap')}</Text>
3639
}

‎packages/sanity/src/structure/panes/document/timeline/events/PublishedEventMenu.tsx

+6-5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
import {useCallback} from 'react'
1010
import {
1111
ContextMenuButton,
12+
getReleaseIdFromReleaseDocumentId,
1213
getReleaseTone,
1314
getVersionFromId,
1415
type PublishDocumentVersionEvent,
@@ -77,15 +78,15 @@ export function PublishedEventMenu({event}: {event: PublishDocumentVersionEvent}
7778
<>
7879
<IntentLink
7980
intent={RELEASES_INTENT}
80-
params={{id: event.release?.name}}
81+
params={{id: getReleaseIdFromReleaseDocumentId(event.release._id)}}
8182
style={{textDecoration: 'none'}}
8283
>
8384
<MenuItem padding={3}>
84-
<Flex align={'center'}>
85+
<Flex align={'center'} justify="flex-start">
8586
<Text size={1} style={{textDecoration: 'none'}}>
8687
<Translate
8788
components={{
88-
VersionBadge: ({children}) => <VersionBadge>{children} </VersionBadge>,
89+
VersionBadge: ({children}) => <VersionBadge>{children}</VersionBadge>,
8990
}}
9091
i18nKey="events.open.release"
9192
values={{
@@ -100,11 +101,11 @@ export function PublishedEventMenu({event}: {event: PublishDocumentVersionEvent}
100101
</MenuItem>
101102
</IntentLink>
102103
<MenuItem onClick={handleOpenReleaseDocument}>
103-
<Flex align={'center'}>
104+
<Flex align={'center'} justify="flex-start">
104105
<Text size={1}>
105106
<Translate
106107
components={{
107-
VersionBadge: ({children}) => <VersionBadge>{children} </VersionBadge>,
108+
VersionBadge: ({children}) => <VersionBadge>{children}</VersionBadge>,
108109
}}
109110
i18nKey="events.inspect.release"
110111
values={{

0 commit comments

Comments
 (0)
Please sign in to comment.