import type { CollectionConfig } from "payload"; import { isAdmin, publishedOrAdmin } from "@/access"; import { slugField } from "@/fields/slug"; import { seoFields } from "@/fields/seo"; // Groups the 7 individual offers for the mega menu and the /angebote // overview page (Kindergruppen bundles Erdenkinder + Mädchenkreis, Singkreise // bundles the three singing circles — matching the site's navigation). export const OFFER_CATEGORIES = [ { label: "Prozessbegleitung", value: "prozessbegleitung" }, { label: "Doula-Begleitung", value: "doula-begleitung" }, { label: "Kindergruppen", value: "kindergruppen" }, { label: "Singkreise", value: "singkreise" }, ] as const; export const Offers: CollectionConfig = { slug: "offers", labels: { singular: "Angebot", plural: "Angebote", }, admin: { useAsTitle: "title", defaultColumns: ["title", "category", "order", "_status"], group: "Inhalte", description: "Die Angebote von Anouma — erscheinen im Menü und auf /angebote.", }, defaultSort: "order", versions: { drafts: true, }, access: { read: publishedOrAdmin, create: isAdmin, update: isAdmin, delete: isAdmin, }, fields: [ { name: "title", type: "text", label: "Titel", required: true, }, slugField(), { name: "shortDescription", type: "textarea", label: "Kurzbeschreibung", required: true, admin: { description: "Kurzer Satz für Karten, Menü und Übersicht.", }, }, { name: "description", type: "richText", label: "Beschreibung", required: true, }, { name: "image", type: "upload", relationTo: "media", label: "Bild", }, { name: "category", type: "select", label: "Kategorie", required: true, options: [...OFFER_CATEGORIES], }, { name: "order", type: "number", label: "Reihenfolge", defaultValue: 0, admin: { position: "sidebar", description: "Kleinere Zahl erscheint zuerst.", }, }, { name: "visibility", type: "select", label: "Sichtbarkeit", required: true, defaultValue: "public", options: [ { label: "Öffentlich (Menü, Übersicht)", value: "public" }, { label: "Privat (nur über direkten Link/Buchung)", value: "private" }, ], admin: { position: "sidebar", description: "Private Angebote wie „Einzelbegleitung“ erscheinen nicht im Menü oder auf /angebote.", }, }, { name: "bookable", type: "checkbox", label: "Buchbar", defaultValue: false, admin: { position: "sidebar", description: "Aktiviert die Terminbuchung mit Kalenderauswahl auf der Angebotsseite.", }, }, { name: "bookingMode", type: "select", label: "Buchungsart", required: true, defaultValue: "individual", options: [ { label: "Einzeltermin mit Kalender", value: "individual" }, { label: "Gruppenangebot / Anmeldung", value: "group" }, ], admin: { position: "sidebar", description: "Gruppenangebote werden über Anmeldung, feste Wiederholung oder Bewerbungsfrist organisiert.", }, }, { name: "groupRegistrationMode", type: "select", label: "Gruppenmodus", defaultValue: "fixed", options: [ { label: "Fester Termin (wöchentlich/monatlich)", value: "fixed" }, { label: "Plätze mit Bewerbungsfrist", value: "capacity" }, { label: "Unverbindliche Anmeldung", value: "request" }, ], admin: { condition: (data) => data?.bookingMode === "group" }, }, { name: "groupSchedule", type: "group", label: "Wiederkehrender Termin", admin: { condition: (data) => data?.bookingMode === "group" && data?.groupRegistrationMode === "fixed" }, fields: [ { name: "recurrence", type: "select", label: "Rhythmus", defaultValue: "weekly", options: [ { label: "Jede Woche", value: "weekly" }, { label: "Jeden Monat", value: "monthly" }, ], }, { name: "weekday", type: "select", label: "Wochentag", options: [ { label: "Montag", value: "monday" }, { label: "Dienstag", value: "tuesday" }, { label: "Mittwoch", value: "wednesday" }, { label: "Donnerstag", value: "thursday" }, { label: "Freitag", value: "friday" }, { label: "Samstag", value: "saturday" }, { label: "Sonntag", value: "sunday" }, ] }, { name: "monthDay", type: "number", label: "Tag im Monat", min: 1, max: 31, admin: { condition: (data) => data?.recurrence === "monthly" } }, { name: "startTime", type: "text", label: "Beginn", admin: { description: "z. B. 18:00 Uhr" } }, { name: "endTime", type: "text", label: "Ende", admin: { description: "z. B. 20:00 Uhr" } }, ], }, { type: "row", admin: { condition: (data) => data?.bookingMode === "group" }, fields: [ { name: "groupCapacity", type: "number", label: "Plätze", min: 1, admin: { width: "50%" } }, { name: "registrationDeadline", type: "date", label: "Anmelde-/Bewerbungsfrist", admin: { width: "50%", date: { pickerAppearance: "dayOnly", displayFormat: "dd.MM.yyyy" } } }, ], }, { name: "groupInfo", type: "textarea", label: "Hinweis zum Gruppenangebot", admin: { condition: (data) => data?.bookingMode === "group", description: "Wird auf der Angebotsseite oberhalb des Anmeldeformulars angezeigt." }, }, { type: "row", fields: [ { name: "price", type: "text", label: "Preis bzw. Preistext", admin: { width: "50%", description: "z. B. „80 €“ oder „auf Anfrage“." }, }, { name: "durationMinutes", type: "number", label: "Dauer (Minuten)", min: 5, admin: { width: "50%", condition: (data) => Boolean(data?.bookable) }, }, ], }, seoFields(), ], };