church-website/src/collections/Worship.ts
2026-07-21 11:19:52 +02:00

159 lines
3.4 KiB
TypeScript

import { CollectionConfig } from 'payload'
import { revalidateTagHook } from '@/utils/revalidate'
import {
canCreateAssignedWorship,
canMutateAssignedWorship,
filterWorshipToAssigned,
hideUnlessAssigned,
resolveAssignedChurchIds,
} from '@/collections/access/assigned'
export const Worship: CollectionConfig = {
slug: 'worship',
labels: {
singular: {
de: 'Gottesdienst',
},
plural: {
de: 'Gottesdienst',
},
},
fields: [
{
name: 'date',
label: {
de: 'Datum',
},
type: 'date',
required: true,
admin: {
date: {
pickerAppearance: 'dayAndTime',
timeIntervals: 15,
timeFormat: 'HH:mm'
},
},
},
{
name: 'location',
label: {
de: 'Location',
},
type: 'relationship',
relationTo: 'church',
required: true,
// The update access Where only constrains which docs may be targeted;
// this keeps a Gläubiger from moving a worship doc to a foreign church.
validate: async (value: unknown, options: any) => {
const user = options.req?.user
if (!user || user.roles !== 'user') return true
const churchIds = await resolveAssignedChurchIds(options.req, user)
if (!value || !churchIds.includes(String(value))) {
return 'Sie sind nur berechtigt, Gottesdienste für Kirchen Ihrer zugewiesenen Gemeinden zu verwalten.'
}
return true
},
},
{
name: 'type',
label: {
de: 'Categorie',
},
type: 'radio',
options: [
{
label: 'Eucharistiefeier',
value: 'MASS',
},
{
label: 'Familien Messe',
value: 'FAMILY',
},
{
label: 'Wort-Gottes-Feier',
value: 'WORD',
},
{
label: 'Fremdsprache',
value: 'LANGUAGE',
},
{
label: 'Andere',
value: 'OTHER',
},
],
required: true,
},
{
name: 'title',
type: 'text',
required: false,
label: {
de: 'Titel'
}
},
{
name: 'cancelled',
type: 'checkbox',
required: true,
defaultValue: false,
label: {
de: 'Abgesagt',
},
admin: {
position: 'sidebar',
},
},
{
name: 'liturgicalDay',
type: 'text',
required: false,
label: {
de: 'Liturgischer Tag',
},
},
{
name: 'celebrant',
type: 'text',
required: false,
label: {
de: 'Zelebrant'
}
},
{
name: 'description',
type: 'textarea',
label: {
de: 'Hinweise',
},
},
{
name: 'generated',
type: 'checkbox',
defaultValue: false,
label: {
de: 'Automatisch erzeugt',
},
admin: {
readOnly: true,
position: 'sidebar',
},
},
],
admin: {
defaultColumns: ["date", 'location', 'type', 'celebrant'],
listSearchableFields: ['date', 'location'],
hidden: hideUnlessAssigned('parishes'),
baseFilter: filterWorshipToAssigned(),
},
access: {
read: () => true,
create: canCreateAssignedWorship(),
update: canMutateAssignedWorship(),
delete: canMutateAssignedWorship(),
},
hooks: {
afterChange: [revalidateTagHook('worship')],
afterDelete: [revalidateTagHook('worship')],
},
}