88 lines
1.8 KiB
TypeScript
88 lines
1.8 KiB
TypeScript
import {defineArrayMember, defineField, defineType} from 'sanity'
|
|
import {DocumentTextIcon} from '@sanity/icons'
|
|
import {WorkSlugInput} from '../components/WorkSlugInput'
|
|
|
|
export const workType = defineType({
|
|
name: 'work',
|
|
title: 'Work',
|
|
type: 'document',
|
|
icon: DocumentTextIcon,
|
|
|
|
fields: [
|
|
defineField({
|
|
name: 'title',
|
|
title: 'Title',
|
|
type: 'string',
|
|
validation: (Rule) => Rule.required(),
|
|
}),
|
|
|
|
defineField({
|
|
name: 'composer',
|
|
title: 'Composer',
|
|
type: 'reference',
|
|
to: [{type: 'composer'}],
|
|
validation: (Rule) => Rule.required(),
|
|
}),
|
|
|
|
defineField({
|
|
name: 'arranger',
|
|
title: 'Arranger',
|
|
type: 'reference',
|
|
to: [{type: 'composer'}],
|
|
}),
|
|
|
|
defineField({
|
|
name: 'slug',
|
|
title: 'Slug',
|
|
type: 'slug',
|
|
components: {
|
|
input: WorkSlugInput,
|
|
},
|
|
validation: (Rule) => Rule.required(),
|
|
}),
|
|
|
|
defineField({
|
|
name: 'description',
|
|
title: 'Description',
|
|
type: 'array',
|
|
of: [defineArrayMember({type: 'block'})],
|
|
}),
|
|
],
|
|
|
|
orderings: [
|
|
{
|
|
title: 'Title (A → Z)',
|
|
name: 'titleAsc',
|
|
by: [{field: 'title', direction: 'asc'}],
|
|
},
|
|
{
|
|
title: 'Title (Z → A)',
|
|
name: 'titleDesc',
|
|
by: [{field: 'title', direction: 'desc'}],
|
|
},
|
|
],
|
|
|
|
preview: {
|
|
select: {
|
|
title: 'title',
|
|
composer: 'composer.name',
|
|
arranger: 'arranger.name',
|
|
},
|
|
prepare({title, composer, arranger}) {
|
|
let subtitle = ''
|
|
|
|
if (composer && arranger) {
|
|
subtitle = `${composer} (arr. ${arranger})`
|
|
} else if (composer) {
|
|
subtitle = composer
|
|
} else if (arranger) {
|
|
subtitle = `arr. ${arranger}`
|
|
}
|
|
|
|
return {
|
|
title,
|
|
subtitle,
|
|
}
|
|
},
|
|
},
|
|
})
|