diff --git a/packages/keystatic/src/app/create-item.tsx b/packages/keystatic/src/app/create-item.tsx index 6f8d2417e..f27a5d0d8 100644 --- a/packages/keystatic/src/app/create-item.tsx +++ b/packages/keystatic/src/app/create-item.tsx @@ -41,6 +41,7 @@ import { getCollectionFormat, getCollectionItemPath, getSlugFromState, + getSlugForNewItem, isGitHubConfig, useShowRestoredDraftMessage, } from './utils'; @@ -275,7 +276,7 @@ function CreateItemLocal(props: { useShowRestoredDraftMessage(props.draft, state, undefined); - const slug = getSlugFromState(collectionConfig, state); + const slug = getSlugForNewItem(collectionConfig, state); const formatInfo = getCollectionFormat(props.config, props.collection); @@ -368,7 +369,7 @@ function CreateItemCollab(props: { const state = useYJsValue(schema, props.map) as Record; const previewProps = usePreviewPropsFromY(schema, props.map, state); - const slug = getSlugFromState(collectionConfig, state); + const slug = getSlugForNewItem(collectionConfig, state); const formatInfo = getCollectionFormat(props.config, props.collection); @@ -455,7 +456,7 @@ function CreateItemInner(props: { return; } if (await props.createItem()) { - const slug = getSlugFromState(collectionConfig, props.state); + const slug = getSlugForNewItem(collectionConfig, props.state); router.push(`${collectionPath}/item/${encodeURIComponent(slug)}`); toastQueue.positive('Entry created', { timeout: 5000 }); // TODO: l10n } @@ -464,14 +465,14 @@ function CreateItemInner(props: { const onCopy = () => { copyEntryToClipboard(props.state, formatInfo, collectionConfig.schema, { field: collectionConfig.slugField, - value: getSlugFromState(collectionConfig, props.state), + value: getSlugForNewItem(collectionConfig, props.state), }); }; const onPaste = async () => { const entry = await getPastedEntry(formatInfo, collectionConfig.schema, { field: collectionConfig.slugField, - slug: getSlugFromState(collectionConfig, props.state), + slug: getSlugForNewItem(collectionConfig, props.state), }); if (entry) { setValueToPreviewProps(entry, props.previewProps); @@ -603,7 +604,7 @@ function CreateItemInner(props: { if ( await props.createItem({ branch: newBranch, sha: baseCommit }) ) { - const slug = getSlugFromState(collectionConfig, props.state); + const slug = getSlugForNewItem(collectionConfig, props.state); router.push( `/keystatic/branch/${encodeURIComponent( @@ -630,7 +631,7 @@ function CreateItemInner(props: { { if (await props.createItem()) { - const slug = getSlugFromState(collectionConfig, props.state); + const slug = getSlugForNewItem(collectionConfig, props.state); router.push( `${collectionPath}/item/${encodeURIComponent(slug)}` ); diff --git a/packages/keystatic/src/app/utils.ts b/packages/keystatic/src/app/utils.ts index fd2a11e15..fdc722004 100644 --- a/packages/keystatic/src/app/utils.ts +++ b/packages/keystatic/src/app/utils.ts @@ -243,3 +243,16 @@ export function useShowRestoredDraftMessage( } }, [draft, show]); } + +export function getSlugForNewItem( + collectionConfig: Collection, string> & { + computeSlug?: (args: { slug: string; value: Record }) => string; + }, + state: Record +): string { + const rawSlug = getSlugFromState(collectionConfig, state); + if (typeof collectionConfig.computeSlug === 'function') { + return collectionConfig.computeSlug({ slug: rawSlug, value: state }); + } + return rawSlug; +}