249 lines
6.2 KiB
TypeScript
249 lines
6.2 KiB
TypeScript
import {defineField, defineType} from 'sanity'
|
|
|
|
export const releaseType = defineType({
|
|
name: 'release',
|
|
title: 'Release',
|
|
type: 'document',
|
|
|
|
groups: [
|
|
{name: 'main', title: 'Main', default: true},
|
|
{name: 'media', title: 'Media'},
|
|
{name: 'text', title: 'Text'},
|
|
{name: 'links', title: 'Streaming Links'},
|
|
{name: 'references', title: 'Artists / Composers'},
|
|
],
|
|
|
|
fieldsets: [
|
|
{name: 'albuminfo', title: 'Album'},
|
|
{name: 'main', title: 'Release Information', options: {columns: 2}},
|
|
{name: 'media', title: 'Media'},
|
|
{name: 'text', title: 'Descriptions'},
|
|
{name: 'links', title: 'Streaming Links', options: {columns: 2}},
|
|
{name: 'references', title: 'Artists / Composers'},
|
|
],
|
|
|
|
fields: [
|
|
defineField({
|
|
name: 'name',
|
|
title: 'Title',
|
|
type: 'string',
|
|
group: 'main',
|
|
fieldset: 'albuminfo',
|
|
}),
|
|
defineField({name: 'albumArtist', type: 'string', group: 'main', fieldset: 'albuminfo'}),
|
|
defineField({
|
|
name: 'catalogNo',
|
|
title: 'Catalog #',
|
|
type: 'string',
|
|
group: 'main',
|
|
fieldset: 'main',
|
|
}),
|
|
defineField({
|
|
name: 'slug',
|
|
title: 'Slug',
|
|
type: 'slug',
|
|
options: {source: 'catalogNo', maxLength: 10},
|
|
validation: (Rule) => Rule.required(),
|
|
group: 'main',
|
|
fieldset: 'main',
|
|
}),
|
|
defineField({
|
|
name: 'label',
|
|
title: 'Label',
|
|
type: 'string',
|
|
group: 'main',
|
|
fieldset: 'main',
|
|
options: {
|
|
list: [
|
|
{title: 'TRPTK', value: 'trptk'},
|
|
{title: 'Other', value: 'other'},
|
|
],
|
|
},
|
|
}),
|
|
defineField({name: 'upc', title: 'UPC/EAN', type: 'string', group: 'main', fieldset: 'main'}),
|
|
defineField({
|
|
name: 'releaseDate',
|
|
title: 'Release Date',
|
|
type: 'date',
|
|
group: 'main',
|
|
fieldset: 'main',
|
|
options: {hotspot: true},
|
|
}),
|
|
defineField({name: 'albumCover', type: 'image', group: 'media', fieldset: 'media'}),
|
|
defineField({
|
|
name: 'bookletPdf',
|
|
title: 'Booklet PDF',
|
|
type: 'file',
|
|
options: {accept: 'application/pdf'},
|
|
group: 'media',
|
|
fieldset: 'media',
|
|
}),
|
|
defineField({
|
|
name: 'tracks',
|
|
title: 'Track previews',
|
|
group: 'media',
|
|
fieldset: 'media',
|
|
type: 'array',
|
|
of: [
|
|
defineField({
|
|
name: 'track',
|
|
title: 'Track',
|
|
type: 'object',
|
|
fields: [
|
|
defineField({
|
|
name: 'title',
|
|
title: 'Title',
|
|
type: 'string',
|
|
validation: (Rule) => Rule.required(),
|
|
}),
|
|
defineField({
|
|
name: 'artistText',
|
|
title: 'Artist / Composer',
|
|
type: 'string',
|
|
}),
|
|
defineField({
|
|
name: 'duration',
|
|
title: 'Duration',
|
|
type: 'string',
|
|
}),
|
|
defineField({
|
|
name: 'previewMp3',
|
|
title: '30s preview (MP3)',
|
|
type: 'file',
|
|
options: {accept: 'audio/mpeg'},
|
|
}),
|
|
],
|
|
preview: {
|
|
select: {
|
|
title: 'title',
|
|
trackNo: 'trackNo',
|
|
artistText: 'artistText',
|
|
duration: 'duration',
|
|
},
|
|
prepare({title, trackNo, artistText, duration}) {
|
|
const subtitleParts = [artistText, duration && `⏱ ${duration}`].filter(Boolean)
|
|
|
|
return {
|
|
title: `${trackNo ? `${trackNo}. ` : ''}${title || '(Untitled track)'}`,
|
|
subtitle: subtitleParts.join(' · '),
|
|
}
|
|
},
|
|
},
|
|
}),
|
|
],
|
|
}),
|
|
|
|
defineField({
|
|
name: 'shortDescription',
|
|
title: 'Short Description',
|
|
type: 'text',
|
|
rows: 2,
|
|
group: 'text',
|
|
fieldset: 'text',
|
|
}),
|
|
defineField({
|
|
name: 'description',
|
|
title: 'Description',
|
|
type: 'array',
|
|
of: [{type: 'block'}],
|
|
group: 'text',
|
|
fieldset: 'text',
|
|
}),
|
|
defineField({
|
|
name: 'officialUrl',
|
|
title: 'Official Link',
|
|
type: 'url',
|
|
group: 'links',
|
|
fieldset: 'links',
|
|
}),
|
|
defineField({
|
|
name: 'spotifyUrl',
|
|
title: 'Spotify',
|
|
type: 'url',
|
|
group: 'links',
|
|
fieldset: 'links',
|
|
}),
|
|
defineField({
|
|
name: 'appleMusicUrl',
|
|
title: 'Apple Music',
|
|
type: 'url',
|
|
group: 'links',
|
|
fieldset: 'links',
|
|
}),
|
|
defineField({
|
|
name: 'deezerUrl',
|
|
title: 'Deezer',
|
|
type: 'url',
|
|
group: 'links',
|
|
fieldset: 'links',
|
|
}),
|
|
defineField({
|
|
name: 'amazonMusicUrl',
|
|
title: 'Amazon Music',
|
|
type: 'url',
|
|
group: 'links',
|
|
fieldset: 'links',
|
|
}),
|
|
defineField({name: 'tidalUrl', title: 'Tidal', type: 'url', group: 'links', fieldset: 'links'}),
|
|
defineField({name: 'qobuzUrl', title: 'Qobuz', type: 'url', group: 'links', fieldset: 'links'}),
|
|
defineField({
|
|
name: 'nativeDsdUrl',
|
|
title: 'NativeDSD',
|
|
type: 'url',
|
|
group: 'links',
|
|
fieldset: 'links',
|
|
}),
|
|
defineField({
|
|
name: 'artists',
|
|
title: 'Artists',
|
|
group: 'references',
|
|
fieldset: 'references',
|
|
type: 'array',
|
|
of: [
|
|
{
|
|
type: 'reference',
|
|
to: [{type: 'artist'}],
|
|
},
|
|
],
|
|
}),
|
|
],
|
|
|
|
orderings: [
|
|
{
|
|
title: 'Release Date (latest first)',
|
|
name: 'releaseDateDesc',
|
|
by: [{field: 'releaseDate', direction: 'desc'}],
|
|
},
|
|
{
|
|
title: 'Release Date (oldest first)',
|
|
name: 'releaseDateAsc',
|
|
by: [{field: 'releaseDate', direction: 'asc'}],
|
|
},
|
|
{
|
|
title: 'Catalog # (Asc.)',
|
|
name: 'catalogNoAsc',
|
|
by: [{field: 'catalogNo', direction: 'asc'}],
|
|
},
|
|
{
|
|
title: 'Catalog # (Desc.)',
|
|
name: 'catalogNoDesc',
|
|
by: [{field: 'catalogNo', direction: 'desc'}],
|
|
},
|
|
],
|
|
|
|
preview: {
|
|
select: {
|
|
title: 'name',
|
|
artist: 'albumArtist',
|
|
catNo: 'catalogNo',
|
|
media: 'albumCover',
|
|
},
|
|
prepare({title, artist, catNo, media}) {
|
|
return {
|
|
title: `${title} • ${catNo}` || '(Untitled release)',
|
|
subtitle: artist ? artist : '',
|
|
media,
|
|
}
|
|
},
|
|
},
|
|
})
|