From 2eef1d8350ea1d022a5fc3bee0636bbaae943572 Mon Sep 17 00:00:00 2001 From: syntaxbullet Date: Mon, 22 Jun 2026 12:45:47 +0200 Subject: [PATCH] feat: manage event detail fallback copy via payload --- src/collections/Events.ts | 15 +++++++++++++++ src/payload-types.ts | 22 ++++++++++++++++++++++ src/spa/eventDetailContent.ts | 10 ++++++++++ src/spa/pages/EventDetail.tsx | 18 ++++++++++-------- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/collections/Events.ts b/src/collections/Events.ts index 1ef17c2..b4b4a29 100644 --- a/src/collections/Events.ts +++ b/src/collections/Events.ts @@ -184,6 +184,21 @@ export const Events: CollectionConfig = { { name: 'url', type: 'text', defaultValue: eventDetailContent.heroBackLink.url }, ], }, + { + name: 'fallbackEvent', + label: 'Missing event field fallbacks', + type: 'group', + fields: [ + { name: 'title', type: 'text', defaultValue: eventDetailContent.fallbackEvent.title }, + { name: 'date', type: 'text', defaultValue: eventDetailContent.fallbackEvent.date }, + { name: 'time', type: 'text', defaultValue: eventDetailContent.fallbackEvent.time }, + { name: 'location', type: 'text', defaultValue: eventDetailContent.fallbackEvent.location }, + { name: 'venue', type: 'text', defaultValue: eventDetailContent.fallbackEvent.venue }, + { name: 'category', type: 'text', defaultValue: eventDetailContent.fallbackEvent.category }, + { name: 'status', type: 'text', defaultValue: eventDetailContent.fallbackEvent.status }, + { name: 'longDescription', type: 'textarea', defaultValue: eventDetailContent.fallbackEvent.longDescription }, + ], + }, { name: 'sections', label: 'Section labels and CTAs', diff --git a/src/payload-types.ts b/src/payload-types.ts index cd9a86a..73cea34 100644 --- a/src/payload-types.ts +++ b/src/payload-types.ts @@ -2913,6 +2913,16 @@ export interface Event { label?: string | null; url?: string | null; }; + fallbackEvent?: { + title?: string | null; + date?: string | null; + time?: string | null; + location?: string | null; + venue?: string | null; + category?: string | null; + status?: string | null; + longDescription?: string | null; + }; sections?: { aboutEyebrow?: string | null; factsEyebrow?: string | null; @@ -5150,6 +5160,18 @@ export interface EventsSelect { label?: T; url?: T; }; + fallbackEvent?: + | T + | { + title?: T; + date?: T; + time?: T; + location?: T; + venue?: T; + category?: T; + status?: T; + longDescription?: T; + }; sections?: | T | { diff --git a/src/spa/eventDetailContent.ts b/src/spa/eventDetailContent.ts index 8e00002..7f357ce 100644 --- a/src/spa/eventDetailContent.ts +++ b/src/spa/eventDetailContent.ts @@ -27,6 +27,16 @@ export const eventDetailContent = { label: 'Alle Events', url: '/presse', }, + fallbackEvent: { + title: 'Event', + date: 'Termin folgt', + time: 'Uhrzeit folgt', + location: 'Bayern', + venue: 'Ort folgt', + category: 'Event', + status: 'geplant', + longDescription: 'Dieses Event wird aus Payload CMS geladen.', + }, sections: { aboutEyebrow: 'Über die Veranstaltung', factsEyebrow: 'Eckdaten', diff --git a/src/spa/pages/EventDetail.tsx b/src/spa/pages/EventDetail.tsx index 9b522e2..ecb314d 100644 --- a/src/spa/pages/EventDetail.tsx +++ b/src/spa/pages/EventDetail.tsx @@ -48,6 +48,7 @@ const getDetailPage = (value: unknown): EventDetailCms => { updateStyles: asStyleMap(detail.updateStyles, eventDetailContent.updateStyles), statusStyles: asStyleMap(detail.statusStyles, eventDetailContent.statusStyles), heroBackLink: { ...eventDetailContent.heroBackLink, ...detail.heroBackLink }, + fallbackEvent: { ...eventDetailContent.fallbackEvent, ...detail.fallbackEvent }, sections: { ...eventDetailContent.sections, ...detail.sections }, updatesCopy: { ...eventDetailContent.updates, ...(detail.updatesCopy || detail.updates) }, bottomCta: { ...eventDetailContent.bottomCta, ...detail.bottomCta }, @@ -98,20 +99,21 @@ export default function EventDetail() { const route = useCmsRoute() const cmsEvent = route?.collection === 'events' ? route.doc : undefined const cmsDetail = getDetailPage(cmsEvent?.detailPage) + const fallbackEvent = cmsDetail.fallbackEvent || eventDetailContent.fallbackEvent const eventFallbackImage = mediaUrl(cmsDetail.fallbackImage, `/images/${eventDetailContent.fallbackImageFilename}`) const event = getEventBySlug(slug ?? '') || (cmsEvent ? { slug: String(cmsEvent.slug || slug), - title: String(cmsEvent.title || 'Event'), + title: String(cmsEvent.title || fallbackEvent.title || eventDetailContent.fallbackEvent.title), subtitle: String(cmsEvent.subtitle || cmsEvent.description || cmsEvent.meta?.description || ''), - date: String(cmsEvent.date || 'Termin folgt'), - time: String(cmsEvent.time || 'Uhrzeit folgt'), - location: String(cmsEvent.location || 'Bayern'), - venue: String(cmsEvent.venue || 'Ort folgt'), - category: String(cmsEvent.category || 'Event'), - status: (cmsEvent.status as BmpEvent['status']) || 'geplant', + date: String(cmsEvent.date || fallbackEvent.date || eventDetailContent.fallbackEvent.date), + time: String(cmsEvent.time || fallbackEvent.time || eventDetailContent.fallbackEvent.time), + location: String(cmsEvent.location || fallbackEvent.location || eventDetailContent.fallbackEvent.location), + venue: String(cmsEvent.venue || fallbackEvent.venue || eventDetailContent.fallbackEvent.venue), + category: String(cmsEvent.category || fallbackEvent.category || eventDetailContent.fallbackEvent.category), + status: ((cmsEvent.status || fallbackEvent.status || eventDetailContent.fallbackEvent.status) as BmpEvent['status']), img: docImageUrl(cmsEvent, eventFallbackImage), description: String(cmsEvent.description || cmsEvent.meta?.description || ''), - longDescription: String(cmsEvent.longDescription || cmsEvent.description || cmsEvent.meta?.description || 'Dieses Event wird aus Payload CMS geladen.'), + longDescription: String(cmsEvent.longDescription || cmsEvent.description || cmsEvent.meta?.description || fallbackEvent.longDescription || eventDetailContent.fallbackEvent.longDescription), eckdaten: Array.isArray(cmsEvent.eckdaten) ? cmsEvent.eckdaten as EventEckdaten[] : [], updates: Array.isArray(cmsEvent.updates) ? cmsEvent.updates as EventUpdate[] : [], detailPage: cmsEvent.detailPage,