diff --git a/src/constants/durianpy.ts b/src/constants/durianpy.ts index 94371c0..5192bd0 100644 --- a/src/constants/durianpy.ts +++ b/src/constants/durianpy.ts @@ -4,6 +4,7 @@ export const DURIANPY_WEBSITE_GLOBALS = { DURIANPY_WEBSITE_CTA_SECTION: 'durianpy-website-cta-section', DURIANPY_WEBSITE_CAROUSEL: 'durianpy-website-carousel', DURIANPY_WEBSITE_CODE_OF_CONDUCT: 'durianpy-website-code-of-conduct', + DURIANPY_WEBSITE_ORGANIZATION_STATUS: 'durianpy-website-organization-status', } as const export type DurianpyWebsiteGlobalSlug = @@ -15,6 +16,7 @@ export const DURIANPY_WEBSITE_GLOBALS_LABELS: Record }) => { + if (siblingData?.isPSFPartner && !value) { + return 'PSF Partner Logo is required when PSF Partner is enabled.' + } + return true + }, + }, + ], +} diff --git a/src/payload-types.ts b/src/payload-types.ts index 35e4315..55973ee 100644 --- a/src/payload-types.ts +++ b/src/payload-types.ts @@ -118,6 +118,7 @@ export interface Config { 'durianpy-website-statistics-config': DurianpyWebsiteStatisticsConfig; 'durianpy-website-carousel': DurianpyWebsiteCarousel; 'durianpy-website-code-of-conduct': DurianpyWebsiteCodeOfConduct; + 'durianpy-website-organization-status': DurianpyWebsiteOrganizationStatus; }; globalsSelect: { 'durianpy-website-homepage-config': DurianpyWebsiteHomepageConfigSelect | DurianpyWebsiteHomepageConfigSelect; @@ -125,6 +126,7 @@ export interface Config { 'durianpy-website-statistics-config': DurianpyWebsiteStatisticsConfigSelect | DurianpyWebsiteStatisticsConfigSelect; 'durianpy-website-carousel': DurianpyWebsiteCarouselSelect | DurianpyWebsiteCarouselSelect; 'durianpy-website-code-of-conduct': DurianpyWebsiteCodeOfConductSelect | DurianpyWebsiteCodeOfConductSelect; + 'durianpy-website-organization-status': DurianpyWebsiteOrganizationStatusSelect | DurianpyWebsiteOrganizationStatusSelect; }; locale: null; widgets: { @@ -340,6 +342,7 @@ export interface User { | 'durianpy-website-cta-section' | 'durianpy-website-carousel' | 'durianpy-website-code-of-conduct' + | 'durianpy-website-organization-status' | 'categories' | 'media' | 'users' @@ -400,6 +403,7 @@ export interface ServiceAccount { | 'durianpy-website-cta-section' | 'durianpy-website-carousel' | 'durianpy-website-code-of-conduct' + | 'durianpy-website-organization-status' | 'categories' | 'media' | 'users' @@ -1423,6 +1427,21 @@ export interface DurianpyWebsiteCodeOfConduct { updatedAt?: string | null; createdAt?: string | null; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "durianpy-website-organization-status". + */ +export interface DurianpyWebsiteOrganizationStatus { + id: string; + /** + * Toggle visibility of the PSF banner + */ + isPSFPartner?: boolean | null; + psfPartnerLogo?: (string | null) | Media; + _status?: ('draft' | 'published') | null; + updatedAt?: string | null; + createdAt?: string | null; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "durianpy-website-homepage-config_select". @@ -1504,6 +1523,18 @@ export interface DurianpyWebsiteCodeOfConductSelect { createdAt?: T; globalType?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "durianpy-website-organization-status_select". + */ +export interface DurianpyWebsiteOrganizationStatusSelect { + isPSFPartner?: T; + psfPartnerLogo?: T; + _status?: T; + updatedAt?: T; + createdAt?: T; + globalType?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "collections_widget". @@ -1535,7 +1566,7 @@ export interface TaskSchedulePublish { relationTo: 'durianpy-website-sigs'; value: string | DurianpyWebsiteSig; } | null); - global?: string | null; + global?: 'durianpy-website-organization-status' | null; user?: (string | null) | User; }; output?: unknown; diff --git a/src/payload.config.ts b/src/payload.config.ts index e5ae8e2..31aea00 100644 --- a/src/payload.config.ts +++ b/src/payload.config.ts @@ -24,6 +24,7 @@ import { Carousel } from './globals/durianpy-website/Carousel' import { SIGs } from './collections/durianpy-website/SIGs' import { CodeOfConduct } from './globals/durianpy-website/CodeOfConduct' import { durianpyWebsiteTypesEndpoint } from './endpoints/durianpy-website-types' +import { OrganizationStatus } from './globals/durianpy-website/OrganizationStatus' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -105,7 +106,14 @@ export default buildConfig({ }), collections: [Media, Categories, Users, Sample, ServiceAccounts, Events, Sponsors, SIGs], endpoints: [durianpyWebsiteTypesEndpoint], - globals: [HomepageConfig, CTASection, StatisticsConfig, Carousel, CodeOfConduct], + globals: [ + HomepageConfig, + CTASection, + StatisticsConfig, + Carousel, + CodeOfConduct, + OrganizationStatus, + ], cors: [getServerSideOrigin()].filter(Boolean).map((url) => { try { const { origin } = new URL(url!) diff --git a/src/seed/durianpy-website/globals/OrganizationStatus.ts b/src/seed/durianpy-website/globals/OrganizationStatus.ts new file mode 100644 index 0000000..a163cfb --- /dev/null +++ b/src/seed/durianpy-website/globals/OrganizationStatus.ts @@ -0,0 +1,28 @@ +import { Payload, PayloadRequest } from 'payload' +import { GLOBALS } from '@/constants/globals' +import { COLLECTIONS } from '@/constants/collections' + +export async function seedOrganizationStatus({ + payload, + req, +}: { + payload: Payload + req?: PayloadRequest +}) { + const { docs: mediaDocs } = await payload.find({ + collection: COLLECTIONS.MEDIA, + limit: 1, + req, + }) + const mediaId = mediaDocs[0]?.id + + await payload.updateGlobal({ + slug: GLOBALS.DURIANPY_WEBSITE_ORGANIZATION_STATUS, + data: { + isPSFPartner: true, + psfPartnerLogo: mediaId, + _status: 'published', + }, + req, + }) +}