Skip to content

Commit ec20de7

Browse files
authoredMar 10, 2025··
chore(core): add fallback title to untitled releases (#8865)
1 parent 392c81f commit ec20de7

File tree

15 files changed

+81
-37
lines changed

15 files changed

+81
-37
lines changed
 

Diff for: ‎packages/sanity/src/core/components/documentStatus/DocumentStatus.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export function DocumentStatus({draft, published, versions, singleLine}: Documen
6868
<VersionStatus
6969
key={versionName}
7070
mode={snapshot?._updatedAt === snapshot?._createdAt ? 'created' : 'edited'}
71-
title={release?.metadata.title}
71+
title={release?.metadata.title || t('release.placeholder-untitled-release')}
7272
timestamp={snapshot?._updatedAt}
7373
tone={release ? getReleaseTone(release) : 'default'}
7474
/>

Diff for: ‎packages/sanity/src/core/field/diff/components/Event.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ export function Event({event, showChangesBy = 'tooltip'}: TimelineItemProps) {
163163
{' '}
164164
{event.release ? (
165165
<VersionInlineBadge $tone={getReleaseTone(event.release)}>
166-
{event.release.metadata.title}
166+
{event.release.metadata.title || t('release.placeholder-untitled-release')}
167167
</VersionInlineBadge>
168168
) : (
169169
<VersionInlineBadge $tone="caution">

Diff for: ‎packages/sanity/src/core/releases/components/dialog/UnpublishVersionDialog.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ export function UnpublishVersionDialog(props: {
3333
const {data} = useActiveReleases()
3434
const {data: archivedReleases} = useArchivedReleases()
3535

36-
const releaseInDetail = data
36+
const release = data
3737
.concat(archivedReleases)
3838
.find(
3939
(candidate) =>
4040
getReleaseIdFromReleaseDocumentId(candidate._id) === getVersionFromId(documentVersionId),
4141
)
4242

43-
const tone = getReleaseTone(releaseInDetail as ReleaseDocument)
43+
const tone = getReleaseTone(release as ReleaseDocument)
4444
const schemaType = schema.get(documentType)
4545

4646
const preview = useValuePreview({schemaType, value: {_id: documentVersionId}})
@@ -99,7 +99,7 @@ export function UnpublishVersionDialog(props: {
9999
t={t}
100100
i18nKey="unpublish-dialog.description.to-draft"
101101
values={{
102-
title: releaseInDetail?.metadata.title,
102+
title: release?.metadata.title || coreT('release.placeholder-untitled-release'),
103103
}}
104104
components={{
105105
Label: ({children}) => {

Diff for: ‎packages/sanity/src/core/releases/tool/components/ReleaseMenuButton/ReleasePreviewCard.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import {Card, Flex, Stack, Text} from '@sanity/ui'
22

3+
import {useTranslation} from '../../../../i18n/hooks/useTranslation'
34
import {ReleaseAvatar} from '../../../components'
45
import {type ReleaseDocument} from '../../../store/types'
56
import {getReleaseTone} from '../../../util/getReleaseTone'
67
import {ReleaseTime} from '../ReleaseTime'
78

89
export function ReleasePreviewCard({release}: {release: ReleaseDocument}) {
10+
const {t} = useTranslation()
911
return (
1012
<Card border padding={1} radius={2}>
1113
<Flex gap={3} padding={3}>
1214
<ReleaseAvatar tone={getReleaseTone(release)} padding={0} />
1315
<Stack space={2}>
1416
<Text weight="medium" size={1}>
15-
{release.metadata.title}
17+
{release.metadata.title || t('release.placeholder-untitled-release')}
1618
</Text>
1719
<Text muted size={1}>
1820
<ReleaseTime release={release} />

Diff for: ‎packages/sanity/src/core/releases/tool/components/releaseCTAButtons/ReleasePublishAllButton.tsx

+10-4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export const ReleasePublishAllButton = ({
3030
const {publishRelease} = useReleaseOperations()
3131
const {checkWithPermissionGuard} = useReleasePermissions()
3232
const {t} = useTranslation(releasesLocaleNamespace)
33+
const {t: tCore} = useTranslation()
3334
const perspective = usePerspective()
3435
const setPerspective = useSetPerspective()
3536
const telemetry = useTelemetry()
@@ -74,7 +75,9 @@ export const ReleasePublishAllButton = ({
7475
<Translate
7576
t={t}
7677
i18nKey="toast.publish.success"
77-
values={{title: release.metadata.title}}
78+
values={{
79+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
80+
}}
7881
/>
7982
</Text>
8083
),
@@ -93,7 +96,9 @@ export const ReleasePublishAllButton = ({
9396
<Translate
9497
t={t}
9598
i18nKey="toast.publish.error"
96-
values={{title: release.metadata.title}}
99+
values={{
100+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
101+
}}
97102
/>
98103
</Text>
99104
),
@@ -108,6 +113,7 @@ export const ReleasePublishAllButton = ({
108113
telemetry,
109114
toast,
110115
t,
116+
tCore,
111117
perspective.selectedPerspective,
112118
setPerspective,
113119
])
@@ -136,7 +142,7 @@ export const ReleasePublishAllButton = ({
136142
t={t}
137143
i18nKey="publish-dialog.confirm-publish-description"
138144
values={{
139-
title: release.metadata.title,
145+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
140146
releaseDocumentsLength: documents.length,
141147
count: documents.length,
142148
}}
@@ -145,7 +151,7 @@ export const ReleasePublishAllButton = ({
145151
</Text>
146152
</Dialog>
147153
)
148-
}, [publishBundleStatus, t, handleConfirmPublishAll, release, documents.length])
154+
}, [publishBundleStatus, t, tCore, handleConfirmPublishAll, release, documents.length])
149155

150156
const publishTooltipContent = useMemo(() => {
151157
if (!hasDocumentValidationErrors && !isValidatingDocuments && publishPermission) return null

Diff for: ‎packages/sanity/src/core/releases/tool/components/releaseCTAButtons/ReleaseRevertButton/ReleaseRevertButton.tsx

+17-5
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const ConfirmReleaseDialog = ({
4242
release: ReleaseDocument
4343
}) => {
4444
const {t} = useTranslation(releasesLocaleNamespace)
45+
const {t: tCore} = useTranslation()
4546
const hasPostPublishTransactions = usePostPublishTransactions(documents)
4647
const getDocumentRevertStates = useDocumentRevertStates(documents)
4748
const [stageNewRevertRelease, setStageNewRevertRelease] = useState(true)
@@ -71,8 +72,12 @@ const ConfirmReleaseDialog = ({
7172
revertReleaseId,
7273
documentRevertStates,
7374
{
74-
title: t('revert-release.title', {title: release.metadata.title}),
75-
description: t('revert-release.description', {title: release.metadata.title}),
75+
title: t('revert-release.title', {
76+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
77+
}),
78+
description: t('revert-release.description', {
79+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
80+
}),
7681
releaseType: 'asap',
7782
},
7883
stageNewRevertRelease ? 'staged' : 'immediate',
@@ -105,7 +110,9 @@ const ConfirmReleaseDialog = ({
105110
}}
106111
t={t}
107112
i18nKey="toast.revert-stage.success"
108-
values={{title: release.metadata.title}}
113+
values={{
114+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
115+
}}
109116
/>
110117
</Text>
111118
),
@@ -121,7 +128,9 @@ const ConfirmReleaseDialog = ({
121128
<Translate
122129
t={t}
123130
i18nKey="toast.immediate-revert.success"
124-
values={{title: release.metadata.title}}
131+
values={{
132+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
133+
}}
125134
/>
126135
</Text>
127136
),
@@ -147,6 +156,7 @@ const ConfirmReleaseDialog = ({
147156
getDocumentRevertStates,
148157
revertRelease,
149158
t,
159+
tCore,
150160
release.metadata.title,
151161
stageNewRevertRelease,
152162
telemetry,
@@ -162,7 +172,9 @@ const ConfirmReleaseDialog = ({
162172
return (
163173
<Dialog
164174
id="confirm-revert-dialog"
165-
header={t('revert-dialog.confirm-revert.title', {title: release.metadata.title})}
175+
header={t('revert-dialog.confirm-revert.title', {
176+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
177+
})}
166178
onClose={() => setRevertReleaseStatus('idle')}
167179
footer={{
168180
confirmButton: {

Diff for: ‎packages/sanity/src/core/releases/tool/components/releaseCTAButtons/ReleaseScheduleButton.tsx

+12-5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export const ReleaseScheduleButton = ({
3737
const [schedulePermission, setSchedulePermission] = useState<boolean>(false)
3838

3939
const {t} = useTranslation(releasesLocaleNamespace)
40+
const {t: tCore} = useTranslation()
4041
const telemetry = useTelemetry()
4142
const {utcToCurrentZoneDate, zoneDateToUtc} = useTimeZone()
4243
const [status, setStatus] = useState<'idle' | 'confirm' | 'scheduling'>('idle')
@@ -94,7 +95,9 @@ export const ReleaseScheduleButton = ({
9495
<Translate
9596
t={t}
9697
i18nKey="toast.schedule.success"
97-
values={{title: release.metadata.title}}
98+
values={{
99+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
100+
}}
98101
/>
99102
</Text>
100103
),
@@ -107,7 +110,10 @@ export const ReleaseScheduleButton = ({
107110
<Translate
108111
t={t}
109112
i18nKey="toast.schedule.error"
110-
values={{title: release.metadata.title, error: schedulingError.message}}
113+
values={{
114+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
115+
error: schedulingError.message,
116+
}}
111117
/>
112118
</Text>
113119
),
@@ -125,10 +131,10 @@ export const ReleaseScheduleButton = ({
125131
telemetry,
126132
toast,
127133
t,
134+
tCore,
128135
])
129136

130-
const {t: coreT} = useTranslation()
131-
const calendarLabels: CalendarLabels = useMemo(() => getCalendarLabels(coreT), [coreT])
137+
const calendarLabels: CalendarLabels = useMemo(() => getCalendarLabels(tCore), [tCore])
132138

133139
const handleBundlePublishAtCalendarChange = useCallback(
134140
(date: Date | null) => {
@@ -214,7 +220,7 @@ export const ReleaseScheduleButton = ({
214220
t={t}
215221
i18nKey="schedule-dialog.confirm-description"
216222
values={{
217-
title: release.metadata.title,
223+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
218224
count: documents.length,
219225
}}
220226
/>
@@ -227,6 +233,7 @@ export const ReleaseScheduleButton = ({
227233
isScheduledDateInPast,
228234
rerenderDialog,
229235
t,
236+
tCore,
230237
documents.length,
231238
handleConfirmSchedule,
232239
handleBundlePublishAtCalendarChange,

Diff for: ‎packages/sanity/src/core/releases/tool/components/releaseCTAButtons/ReleaseUnscheduleButton.tsx

+11-5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export const ReleaseUnscheduleButton = ({
2525
const toast = useToast()
2626
const {unschedule} = useReleaseOperations()
2727
const {t} = useTranslation(releasesLocaleNamespace)
28+
const {t: tCore} = useTranslation()
2829
const telemetry = useTelemetry()
2930
const [status, setStatus] = useState<'idle' | 'confirm' | 'unscheduling'>('idle')
3031

@@ -41,7 +42,9 @@ export const ReleaseUnscheduleButton = ({
4142
<Translate
4243
t={t}
4344
i18nKey="toast.unschedule.success"
44-
values={{title: release.metadata.title}}
45+
values={{
46+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
47+
}}
4548
/>
4649
</Text>
4750
),
@@ -54,7 +57,10 @@ export const ReleaseUnscheduleButton = ({
5457
<Translate
5558
t={t}
5659
i18nKey="toast.unschedule.error"
57-
values={{title: release.metadata.title, error: schedulingError.message}}
60+
values={{
61+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
62+
error: schedulingError.message,
63+
}}
5864
/>
5965
</Text>
6066
),
@@ -63,7 +69,7 @@ export const ReleaseUnscheduleButton = ({
6369
} finally {
6470
setStatus('idle')
6571
}
66-
}, [unschedule, release._id, release.metadata.title, telemetry, toast, t])
72+
}, [unschedule, release._id, release.metadata.title, telemetry, toast, t, tCore])
6773

6874
const confirmScheduleDialog = useMemo(() => {
6975
if (status === 'idle') return null
@@ -92,7 +98,7 @@ export const ReleaseUnscheduleButton = ({
9298
t={t}
9399
i18nKey="unschedule-dialog.confirm-description"
94100
values={{
95-
title: release.metadata.title,
101+
title: release.metadata.title || tCore('release.placeholder-untitled-release'),
96102
documentsLength: documents.length,
97103
count: documents.length,
98104
}}
@@ -101,7 +107,7 @@ export const ReleaseUnscheduleButton = ({
101107
</Text>
102108
</Dialog>
103109
)
104-
}, [release.metadata.title, documents.length, handleConfirmSchedule, status, t])
110+
}, [release.metadata.title, documents.length, handleConfirmSchedule, status, t, tCore])
105111

106112
return (
107113
<>

Diff for: ‎packages/sanity/src/core/releases/tool/detail/ReleaseDashboardActivityPanel.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {Resizable} from '../../../components/resizer/Resizable'
1010
import {useTranslation} from '../../../i18n'
1111
import {releasesLocaleNamespace} from '../../i18n'
1212
import {type ReleaseDocument} from '../../store/types'
13-
import {getReleaseIdFromReleaseDocumentId} from '../../util/getReleaseIdFromReleaseDocumentId'
1413
import {type ReleaseEvents} from './events/useReleaseEvents'
1514
import {ReleaseActivityList} from './ReleaseActivityList'
1615

@@ -32,6 +31,7 @@ export function ReleaseDashboardActivityPanel({
3231
show,
3332
}: ReleaseDashboardActivityPanelProps) {
3433
const {t} = useTranslation(releasesLocaleNamespace)
34+
const {t: tCore} = useTranslation()
3535
return (
3636
<AnimatePresence>
3737
{show && (
@@ -68,7 +68,7 @@ export function ReleaseDashboardActivityPanel({
6868
)}
6969
<ReleaseActivityList
7070
releaseTitle={
71-
release.metadata.title || getReleaseIdFromReleaseDocumentId(release._id)
71+
release.metadata.title || tCore('release.placeholder-untitled-release')
7272
}
7373
releaseId={release._id}
7474
events={events.events}

Diff for: ‎packages/sanity/src/core/releases/tool/detail/ReleaseDashboardHeader.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ export function ReleaseDashboardHeader(props: {
2222
setInspector: Dispatch<SetStateAction<ReleaseInspector | undefined>>
2323
}) {
2424
const {inspector, release, setInspector} = props
25-
const title = release.metadata.title
2625
const {t} = useTranslation(releasesLocaleNamespace)
2726
const {t: tCore} = useTranslation()
27+
const title = release.metadata.title || tCore('release.placeholder-untitled-release')
2828
const router = useRouter()
2929

3030
const handleNavigateToReleasesList = useCallback(() => {

Diff for: ‎packages/sanity/src/core/releases/tool/detail/ReleaseSummary.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export function ReleaseSummary(props: ReleaseSummaryProps) {
5555
const [pendingAddedDocument, setPendingAddedDocument] = useState<BundleDocumentRow[]>([])
5656

5757
const {t} = useTranslation(releasesLocaleNamespace)
58+
const {t: tCore} = useTranslation()
5859

5960
const releaseId = getReleaseIdFromReleaseDocumentId(release._id)
6061

@@ -73,9 +74,14 @@ export function ReleaseSummary(props: ReleaseSummaryProps) {
7374
if (!isBundleDocumentRow(rowProps.datum)) return null
7475
if (rowProps.datum.isPending) return null
7576

76-
return <DocumentActions document={rowProps.datum} releaseTitle={release.metadata.title} />
77+
return (
78+
<DocumentActions
79+
document={rowProps.datum}
80+
releaseTitle={release.metadata.title || tCore('release.placeholder-untitled-release')}
81+
/>
82+
)
7783
},
78-
[release.metadata.title, release.state],
84+
[release.metadata.title, release.state, tCore],
7985
)
8086

8187
const documentTableColumnDefs = useMemo(

Diff for: ‎packages/sanity/src/structure/diffView/versionMode/components/VersionModeHeader.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ const VersionMenuItem: ComponentType<VersionMenuItemProps> = ({
289289
<ReleaseAvatar padding={2} tone={tone} />
290290
<Stack flex={1} paddingY={2} paddingRight={2} space={2}>
291291
<Text size={1} weight="medium">
292-
{release.metadata.title}
292+
{release.metadata.title || tCore('release.placeholder-untitled-release')}
293293
</Text>
294294
{['asap', 'undecided'].includes(release.metadata.releaseType) && (
295295
<Text muted size={1}>
@@ -337,7 +337,7 @@ function getMenuButtonProps({
337337
const tone: ButtonTone = selected ? getReleaseTone(selected) : 'neutral'
338338

339339
return {
340-
text: selected?.metadata.title,
340+
text: selected?.metadata.title || tCore('release.placeholder-untitled-release'),
341341
icon: <ReleaseAvatar padding={1} tone={tone} />,
342342
iconRight: selected && isReleaseScheduledOrScheduling(selected) ? <LockIcon /> : undefined,
343343
tone,

Diff for: ‎packages/sanity/src/structure/panes/document/documentPanel/banners/DeletedDocumentBanners.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ const ArchivedReleaseBanner = ({release}: {release: ReleaseDocument}) => {
7676
<Translate
7777
t={t}
7878
i18nKey="banners.deleted-release-banner.text"
79-
values={{title: release.metadata?.title}}
79+
values={{title: release.metadata?.title || t('release.placeholder-untitled-release')}}
8080
/>
8181
</Text>
8282
}

Diff for: ‎packages/sanity/src/structure/panes/document/documentPanel/banners/OpenReleaseToEditBanner.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ export function OpenReleaseToEditBannerInner({
5656
() => activeReleases.find((version) => version._id.includes(releaseId)),
5757
[activeReleases, releaseId],
5858
)
59+
const {t: tCore} = useTranslation()
60+
5961
const {data: documentVersions} = useDocumentVersions({documentId})
6062

6163
const documentVersionsTitleList = useMemo(
@@ -67,8 +69,8 @@ export function OpenReleaseToEditBannerInner({
6769
return getReleaseIdFromReleaseDocumentId(version._id) === r
6870
})
6971
})
70-
.map((version) => version.metadata.title),
71-
[activeReleases, documentVersions],
72+
.map((version) => version.metadata.title || tCore('release.placeholder-untitled-release')),
73+
[activeReleases, documentVersions, tCore],
7274
)
7375
const tone = currentVersion && getReleaseTone(currentVersion)
7476
const {t} = useTranslation(structureLocaleNamespace)

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

+5-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ export function PublishedEventMenu({event}: {event: PublishDocumentVersionEvent}
8989
}}
9090
i18nKey="events.open.release"
9191
values={{
92-
releaseTitle: event.release.metadata.title,
92+
releaseTitle:
93+
event.release.metadata.title ||
94+
t('release.placeholder-untitled-release'),
9395
}}
9496
t={t}
9597
/>
@@ -106,7 +108,8 @@ export function PublishedEventMenu({event}: {event: PublishDocumentVersionEvent}
106108
}}
107109
i18nKey="events.inspect.release"
108110
values={{
109-
releaseTitle: event.release.metadata.title,
111+
releaseTitle:
112+
event.release.metadata.title || t('release.placeholder-untitled-release'),
110113
}}
111114
t={t}
112115
/>

0 commit comments

Comments
 (0)
Please sign in to comment.