diff --git a/deskStructure.js b/deskStructure.js index 2d6d6f8..cd72fa3 100644 --- a/deskStructure.js +++ b/deskStructure.js @@ -271,6 +271,14 @@ export default S => .title('Project') .schemaType('project') .child(S.documentTypeList('project').title('Project')), + S.listItem() + .title('Credit Class Prefinance Timeline Status') + .schemaType('classPrefinanceTimelineStatus') + .child(S.documentTypeList('classPrefinanceTimelineStatus').title('Credit Class Prefinance Timeline Status')), + S.listItem() + .title('Project Class Prefinance Timeline Status') + .schemaType('projectPrefinanceTimelineStatus') + .child(S.documentTypeList('projectPrefinanceTimelineStatus').title('Project Class Prefinance Timeline Status')), S.listItem() .title('Featured Project Card') .schemaType('featuredProjectCard') diff --git a/sanity.cli.js b/sanity.cli.js index bcc83c5..0eb362a 100644 --- a/sanity.cli.js +++ b/sanity.cli.js @@ -5,4 +5,10 @@ export default defineCliConfig({ projectId: process.env.SANITY_STUDIO_PROJECT_ID, dataset: process.env.SANITY_STUDIO_DATASET, }, + graphql: [ + { + id: "default", + workspace: "default-workspace", + }, + ], }); diff --git a/schemas/documents/registry/projectsPage.js b/schemas/documents/registry/projectsPage.js index ad729f0..5b9f638 100644 --- a/schemas/documents/registry/projectsPage.js +++ b/schemas/documents/registry/projectsPage.js @@ -10,5 +10,11 @@ export default { title: 'Resources for Getting Started Section', validation: Rule => Rule.required(), }, + { + name: 'prefinanceProjects', + type: 'prefinanceProjects', + title: 'Prefinance Projects', + description: 'This will appear under the Prefinance projects tab', + }, ], }; diff --git a/schemas/documents/shared/classPrefinanceTimelineStatus.js b/schemas/documents/shared/classPrefinanceTimelineStatus.js new file mode 100644 index 0000000..8a8d293 --- /dev/null +++ b/schemas/documents/shared/classPrefinanceTimelineStatus.js @@ -0,0 +1,19 @@ +export default { + name: 'classPrefinanceTimelineStatus', + title: 'Credit Class Prefinance Timeline Status', + type: 'document', + fields: [ + { + title: 'Description', + name: 'description', + type: 'string', + validation: Rule => Rule.required(), + }, + { + title: 'Icon', + name: 'icon', + type: 'customImage', + validation: Rule => Rule.required(), + }, + ], +}; diff --git a/schemas/documents/shared/project.js b/schemas/documents/shared/project.js index 73463df..5078573 100644 --- a/schemas/documents/shared/project.js +++ b/schemas/documents/shared/project.js @@ -4,16 +4,31 @@ export default { type: 'document', fields: [ { - title: 'Project name', - name: 'projectName', + title: 'Project id, uuid or slug', + name: 'projectId', type: 'string', + description: 'on-chain project id, off-chain uuid or slug', validation: Rule => Rule.required(), }, { - title: 'Project id, uuid or slug', - name: 'projectId', + title: 'Project Pre-Financing', + name: 'projectPrefinancing', + type: 'projectPrefinancing', + }, + { + title: 'Credibility Cards', + name: 'credibilityCards', + type: 'array', + of: [ + { + type: 'detailsCard', + }, + ], + }, + { + title: 'Project name', + name: 'projectName', type: 'string', - description: 'on-chain project id, off-chain uuid or slug', validation: Rule => Rule.required(), }, { @@ -39,15 +54,5 @@ export default { list: ['hectares', 'acres'], }, }, - { - title: 'Credibility Cards', - name: 'credibilityCards', - type: 'array', - of: [ - { - type: 'detailsCard', - }, - ], - }, ], }; diff --git a/schemas/documents/shared/projectPrefinanceTimelineStatus.js b/schemas/documents/shared/projectPrefinanceTimelineStatus.js new file mode 100644 index 0000000..fe4c8fa --- /dev/null +++ b/schemas/documents/shared/projectPrefinanceTimelineStatus.js @@ -0,0 +1,19 @@ +export default { + name: 'projectPrefinanceTimelineStatus', + title: 'Project Prefinance Timeline Status', + type: 'document', + fields: [ + { + title: 'Description', + name: 'description', + type: 'string', + validation: Rule => Rule.required(), + }, + { + title: 'Icon', + name: 'icon', + type: 'customImage', + validation: Rule => Rule.required(), + }, + ], +}; diff --git a/schemas/objects/classPrefinanceTimelineItem.js b/schemas/objects/classPrefinanceTimelineItem.js new file mode 100644 index 0000000..cf319da --- /dev/null +++ b/schemas/objects/classPrefinanceTimelineItem.js @@ -0,0 +1,24 @@ +import { prefinanceTimelineItemPreview } from './projectPrefinanceTimelineItem'; + +export default { + title: 'Class Prefinance Timeline Item', + name: 'classPrefinanceTimelineItem', + type: 'object', + fields: [ + { + title: 'Status', + name: 'status', + type: 'reference', + to: [{ type: 'classPrefinanceTimelineStatus' }], + validate: Rule => Rule.required(), + }, + { + title: 'Date(s) and current status', + name: 'prefinanceTimelineItem', + type: 'prefinanceTimelineItem', + validate: Rule => Rule.required(), + }, + ], + preview: prefinanceTimelineItemPreview, +}; + diff --git a/schemas/objects/prefinanceProjects.js b/schemas/objects/prefinanceProjects.js new file mode 100644 index 0000000..ac1b904 --- /dev/null +++ b/schemas/objects/prefinanceProjects.js @@ -0,0 +1,18 @@ +export default { + title: 'Prefinance Projects', + name: 'prefinanceProjects', + type: 'object', + fields: [ + { + title: 'Description', + name: 'description', + type: 'customPortableText', + validation: Rule => Rule.required(), + }, + { + title: 'Learn more link', + name: 'learnMore', + type: 'url', + }, + ], +}; diff --git a/schemas/objects/prefinanceTimelineItem.js b/schemas/objects/prefinanceTimelineItem.js new file mode 100644 index 0000000..c626f39 --- /dev/null +++ b/schemas/objects/prefinanceTimelineItem.js @@ -0,0 +1,34 @@ +export default { + title: 'Prefinance Timeline Item', + name: 'prefinanceTimelineItem', + type: 'object', + fields: [ + { + title: 'Single date or start date', + name: 'date', + type: 'date', + description: 'optional', + }, + { + title: 'End date', + name: 'endDate', + type: 'date', + description: 'optional if single date', + }, + { + title: 'Current status', + name: 'currentStatus', + type: 'string', + options: { + list: [ + { title: "Projected", value: "projected" }, + { title: "Done", value: "done" } + ], + layout: "radio", + }, + validate: Rule => Rule.required(), + description: 'Timeline items that are done will be written in black text on the timeline while projected items are greyed out. The most recent done item will show up as the current status on the project page.' + }, + ], +}; + diff --git a/schemas/objects/projectPrefinanceTimelineItem.js b/schemas/objects/projectPrefinanceTimelineItem.js new file mode 100644 index 0000000..5e046d3 --- /dev/null +++ b/schemas/objects/projectPrefinanceTimelineItem.js @@ -0,0 +1,39 @@ +export const prefinanceTimelineItemPreview = { + select: { + description: 'status.description', + date: 'prefinanceTimelineItem.date', + endDate: 'prefinanceTimelineItem.endDate', + currentStatus: 'prefinanceTimelineItem.currentStatus', + }, + prepare(selection) { + const { description, date, endDate, currentStatus } = selection; + return { + title: description, + subtitle: `${currentStatus} ${date || ''} ${endDate ? ` - ${endDate}` : ''}`, + }; + }, +}; + +export default { + title: 'Project Prefinance Timeline Item', + name: 'projectPrefinanceTimelineItem', + type: 'object', + fields: [ + { + title: 'Status', + name: 'status', + type: 'reference', + to: [{ type: 'projectPrefinanceTimelineStatus' }], + validate: Rule => Rule.required(), + }, + { + title: 'Date(s) and current status', + name: 'prefinanceTimelineItem', + type: 'prefinanceTimelineItem', + validate: Rule => Rule.required(), + }, + ], + preview: prefinanceTimelineItemPreview, +}; + + diff --git a/schemas/objects/projectPrefinancing.js b/schemas/objects/projectPrefinancing.js new file mode 100644 index 0000000..973cada --- /dev/null +++ b/schemas/objects/projectPrefinancing.js @@ -0,0 +1,91 @@ +export default { + title: 'Project Prefinancing', + name: 'projectPrefinancing', + type: 'object', + fields: [ + { + title: 'Is a prefinance project', + name: 'isPrefinanceProject', + type: 'boolean', + }, + { + title: 'Price', + name: 'price', + type: 'number', + description: 'in USD', + validation: (Rule) => validation(Rule).positive(), + }, + { + title: 'Estimated Issuance', + name: 'estimatedIssuance', + type: 'number', + description: 'estimated number of credits that will be issued', + validation: (Rule) => validation(Rule).positive(), + }, + { + title: 'Stripe payment link', + name: 'stripePaymentLink', + type: 'url', + validation, + }, + { + title: 'Project prefinance terms', + name: 'prefinanceTerms', + type: 'customPortableText', + validation, + }, + { + title: 'Link to purchase agreement', + name: 'purchaseAgreementLink', + type: 'url', + validation, + }, + { + title: 'Projected credit delivery date', + name: 'projectedCreditDeliveryDate', + type: 'date', + validation, + }, + { + title: 'Project timeline', + name: 'projectTimeline', + type: 'array', + of: [ + { + type: 'projectPrefinanceTimelineItem', + }, + ], + }, + { + title: 'Credit class timeline', + name: 'classTimeline', + type: 'array', + of: [ + { + type: 'classPrefinanceTimelineItem', + }, + ], + }, + { + title: 'What supporting this project enables', + name: 'supportEnables', + type: 'array', + of: [ + { + type: 'text', + }, + ], + validation, + }, + ], +}; + +function validation(Rule) { + return Rule.custom((value, context) => { + if (context.parent.isPrefinanceProject && !value) { + return 'Required for pre-finance projects'; + } + return true; + }); +} + diff --git a/schemas/schema.js b/schemas/schema.js index b59042e..6bc4608 100644 --- a/schemas/schema.js +++ b/schemas/schema.js @@ -46,6 +46,8 @@ import claim from './documents/shared/claim'; import credibilityCard from './documents/shared/credibilityCard'; import person from './documents/shared/person'; import program from './documents/shared/program'; +import classPrefinanceTimelineStatus from './documents/shared/classPrefinanceTimelineStatus'; +import projectPrefinanceTimelineStatus from './documents/shared/projectPrefinanceTimelineStatus'; // Object types import heroSection from './objects/sections/heroSection'; @@ -143,6 +145,7 @@ import titleImageLink from './objects/templates/titleImageLink'; import presskitTimelineItem from './objects/presskitTimelineItem'; import presskitTimelineSection from './objects/sections/presskit/presskitTimelineSection'; import presskitTeamSection from './objects/sections/presskit/presskitTeamSection'; +import projectPrefinancing from './objects/projectPrefinancing'; import nameTitleImage from './objects/templates/nameTitleImage'; import presskitLogosSection from './objects/sections/presskit/presskitLogosSection'; import presskitPhotosSection from './objects/sections/presskit/presskitPhotosSection'; @@ -189,6 +192,10 @@ import homeWebPartnersSection from './objects/sections/homePageWeb/partnersSecti import homeWebEcologicalCreditCardsSection from './objects/sections/homePageWeb/ecologicalCreditCardsSection'; import homeWebStatsSection from './objects/sections/homePageWeb/statsSection'; import homePageProjectsSection from './objects/sections/homePage/homePageProjectsSection'; +import projectPrefinanceTimelineItem from './objects/projectPrefinanceTimelineItem'; +import classPrefinanceTimelineItem from './objects/classPrefinanceTimelineItem'; +import prefinanceTimelineItem from './objects/prefinanceTimelineItem'; +import prefinanceProjects from './objects/prefinanceProjects'; export default [ actionCard, @@ -226,6 +233,8 @@ export default [ caseStudyFundingSection, caseStudyPage, claim, + classPrefinanceTimelineItem, + classPrefinanceTimelineStatus, climateSection, credibilityCard, communityCollaborateSection, @@ -315,6 +324,8 @@ export default [ person, program, practicesOutcomesSection, + prefinanceProjects, + prefinanceTimelineItem, presskitAwardsSection, presskitFeaturedSection, presskitLogosSection, @@ -326,6 +337,9 @@ export default [ project, projectActivity, projectEcosystem, + projectPrefinancing, + projectPrefinanceTimelineItem, + projectPrefinanceTimelineStatus, detailsSection, detailsCard, projectPage,