Skip to content

Commit b991d9b

Browse files
committed
[schema] Guess preview config based on raw schema def instead of parsed (#132)
1 parent c385c1c commit b991d9b

File tree

9 files changed

+27
-37
lines changed

9 files changed

+27
-37
lines changed

packages/@sanity/schema/src/preview/createPreviewGetter.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ function parsePreview(preview) {
2929
}
3030
}
3131

32-
export default function createPreviewGetter(typeDef, parsed) {
32+
export default function createPreviewGetter(objectTypeDef) {
3333
return function previewGetter() {
34-
warnIfPreviewOnOptions(typeDef)
35-
warnIfPreviewHasFields(typeDef)
36-
const preview = parsePreview(typeDef.preview || (typeDef.options || {}).preview)
37-
return preview || guessPreviewConfig(parsed.fields)
34+
warnIfPreviewOnOptions(objectTypeDef)
35+
warnIfPreviewHasFields(objectTypeDef)
36+
const preview = parsePreview(objectTypeDef.preview || (objectTypeDef.options || {}).preview)
37+
return preview || guessPreviewConfig(objectTypeDef)
3838
}
3939
}

packages/@sanity/schema/src/preview/guessPreviewConfig.js

+16-10
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
import {omitBy, isUndefined} from 'lodash'
2+
import arrify from 'arrify'
23

34
const TITLE_CANDIDATES = ['title', 'name', 'label', 'heading', 'header', 'caption']
45
const DESCRIPTION_CANDIDATES = ['description', ...TITLE_CANDIDATES]
56

6-
function isImageField(field) {
7-
return field.type.name === 'image'
7+
function isImageField(fieldDef) {
8+
return fieldDef.type === 'image'
89
}
910

10-
function resolveImageAssetPath(fields) {
11-
const found = fields.find(field => isImageField(field))
12-
return found && `${found.name}.url`
11+
function isImageAssetField(fieldDef) {
12+
return fieldDef.type === 'reference'
13+
&& arrify(fieldDef.to).some(memberTypeDef => memberTypeDef.type === 'imageAsset')
1314
}
1415

15-
export default function guessPreviewFields(fields) {
16+
function resolveImageAssetPath(fieldDefs) {
17+
const found = fieldDefs.find(field => isImageAssetField(field) || isImageField(field))
18+
return found && (isImageField(found) ? `${found.name}.asset.url` : `${found.name}.url`)
19+
}
20+
21+
export default function guessPreviewFields(objectTypeDef) {
1622

17-
const stringFieldNames = fields
18-
.filter(field => field.type.name === 'string')
23+
const stringFieldNames = objectTypeDef.fields
24+
.filter(field => field.type === 'string')
1925
.map(field => field.name)
2026

2127
// Check if we have fields with names that is listed in candidate fields
@@ -32,11 +38,11 @@ export default function guessPreviewFields(fields) {
3238
descField = stringFieldNames[1]
3339
}
3440

35-
const imageAssetPath = resolveImageAssetPath(fields)
41+
const imageAssetPath = resolveImageAssetPath(objectTypeDef.fields)
3642

3743
if (!titleField && !imageAssetPath) {
3844
// last resort, pick all fields and concat them
39-
const fieldNames = fields.map(field => field.name)
45+
const fieldNames = objectTypeDef.fields.map(field => field.name)
4046
const fieldMapping = fieldNames.reduce((acc, fieldName) => {
4147
acc[fieldName] = fieldName
4248
return acc

packages/@sanity/schema/src/types/blocks/block.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export const BlockType = {
6464
})
6565
})
6666

67-
lazyGetter(parsed, 'preview', createPreviewGetter(subTypeDef, parsed))
67+
lazyGetter(parsed, 'preview', createPreviewGetter(subTypeDef))
6868

6969
return subtype(parsed)
7070

packages/@sanity/schema/src/types/blocks/span.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const SpanType = {
4444
})
4545
})
4646

47-
lazyGetter(parsed, 'preview', createPreviewGetter(subTypeDef, parsed))
47+
lazyGetter(parsed, 'preview', createPreviewGetter(subTypeDef))
4848

4949
return subtype(parsed)
5050

packages/@sanity/schema/src/types/file.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {pick} from 'lodash'
22
import {lazyGetter} from './utils'
3-
import guessPreviewConfig from '../preview/guessPreviewConfig'
43
import createPreviewGetter from '../preview/createPreviewGetter'
54

65
export const ASSET_FIELD = {
@@ -54,7 +53,7 @@ export const FileType = {
5453
})
5554
})
5655

57-
lazyGetter(parsed, 'preview', createPreviewGetter(subTypeDef, parsed))
56+
lazyGetter(parsed, 'preview', createPreviewGetter(subTypeDef))
5857

5958
return subtype(parsed)
6059

packages/@sanity/schema/src/types/image.js

+1-8
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,6 @@ const IMAGE_CORE = {
2020
}
2121

2222
const DEFAULT_OPTIONS = {}
23-
const DEFAULT_PREVIEW = {
24-
select: {
25-
imageUrl: 'asset.url'
26-
}
27-
}
2823

2924
export const ImageType = {
3025
get() {
@@ -56,9 +51,7 @@ export const ImageType = {
5651
})
5752
})
5853

59-
lazyGetter(parsed, 'preview', createPreviewGetter(
60-
Object.assign({}, {preview: DEFAULT_PREVIEW}, subTypeDef), parsed)
61-
)
54+
lazyGetter(parsed, 'preview', createPreviewGetter(Object.assign({}, subTypeDef, {fields})))
6255

6356
return subtype(parsed)
6457

packages/@sanity/schema/src/types/image/fieldDefs.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export const ASSET_FIELD = {
22
name: 'asset',
33
type: 'reference',
4-
to: {type: 'imageAsset'}
4+
to: [{type: 'imageAsset'}]
55
}
66

77
export const HOTSPOT_FIELD = {

packages/@sanity/schema/src/types/object.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export const ObjectType = {
4141
return createFieldsets(subTypeDef, parsed.fields)
4242
})
4343

44-
lazyGetter(parsed, 'preview', createPreviewGetter(subTypeDef, parsed))
44+
lazyGetter(parsed, 'preview', createPreviewGetter(subTypeDef))
4545

4646
return subtype(parsed)
4747

packages/example-studio/schemas/myImage.js

-8
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,6 @@ export default {
22
name: 'myImage',
33
title: 'Some image type',
44
type: 'image',
5-
options: {
6-
preview: {
7-
select: {
8-
imageUrl: 'asset.url',
9-
title: 'caption'
10-
}
11-
}
12-
},
135
fields: [
146
{
157
name: 'caption',

0 commit comments

Comments
 (0)