feature: deployment, deps update & more
This commit is contained in:
parent
f645c01ac0
commit
0c7c64f7fc
24 changed files with 1722 additions and 2298 deletions
1
.dockerignore
Normal file
1
.dockerignore
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/node_modules
|
||||||
925
.yarn/releases/yarn-4.4.0.cjs
vendored
925
.yarn/releases/yarn-4.4.0.cjs
vendored
File diff suppressed because one or more lines are too long
6
.yarnrc
6
.yarnrc
|
|
@ -1,6 +0,0 @@
|
||||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
||||||
# yarn lockfile v1
|
|
||||||
|
|
||||||
|
|
||||||
"--install.ignore-engines" true
|
|
||||||
yarn-path ".yarn/releases/yarn-1.22.22.cjs"
|
|
||||||
|
|
@ -1,3 +1 @@
|
||||||
nodeLinker: node-modules
|
nodeLinker: node-modules
|
||||||
|
|
||||||
yarnPath: .yarn/releases/yarn-4.4.0.cjs
|
|
||||||
|
|
|
||||||
69
Dockerfile
69
Dockerfile
|
|
@ -1,69 +1,8 @@
|
||||||
# From https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile
|
FROM node:21-alpine
|
||||||
|
|
||||||
FROM node:18-alpine AS base
|
|
||||||
|
|
||||||
# Install dependencies only when needed
|
|
||||||
FROM base AS deps
|
|
||||||
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
|
||||||
RUN apk add --no-cache libc6-compat
|
RUN apk add --no-cache libc6-compat
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Install dependencies based on the preferred package manager
|
|
||||||
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
|
|
||||||
RUN \
|
|
||||||
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
|
|
||||||
elif [ -f package-lock.json ]; then npm ci; \
|
|
||||||
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
|
|
||||||
else echo "Lockfile not found." && exit 1; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Rebuild the source code only when needed
|
|
||||||
FROM base AS builder
|
|
||||||
WORKDIR /app
|
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
RUN yarn set version stable
|
||||||
# Next.js collects completely anonymous telemetry data about general usage.
|
RUN yarn install --frozen-lockfile
|
||||||
# Learn more here: https://nextjs.org/telemetry
|
|
||||||
# Uncomment the following line in case you want to disable telemetry during the build.
|
|
||||||
# ENV NEXT_TELEMETRY_DISABLED 1
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
if [ -f yarn.lock ]; then yarn run build; \
|
|
||||||
elif [ -f package-lock.json ]; then npm run build; \
|
|
||||||
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \
|
|
||||||
else echo "Lockfile not found." && exit 1; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Production image, copy all the files and run next
|
|
||||||
FROM base AS runner
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
ENV NODE_ENV production
|
|
||||||
# Uncomment the following line in case you want to disable telemetry during runtime.
|
|
||||||
# ENV NEXT_TELEMETRY_DISABLED 1
|
|
||||||
|
|
||||||
RUN addgroup --system --gid 1001 nodejs
|
|
||||||
RUN adduser --system --uid 1001 nextjs
|
|
||||||
|
|
||||||
COPY --from=builder /app/public ./public
|
|
||||||
|
|
||||||
# Set the correct permission for prerender cache
|
|
||||||
RUN mkdir .next
|
|
||||||
RUN chown nextjs:nodejs .next
|
|
||||||
|
|
||||||
# Automatically leverage output traces to reduce image size
|
|
||||||
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
||||||
|
|
||||||
USER nextjs
|
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
CMD yarn dev
|
||||||
ENV PORT 3000
|
|
||||||
|
|
||||||
# server.js is created by next build from the standalone output
|
|
||||||
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
|
|
||||||
CMD HOSTNAME="0.0.0.0" node server.js
|
|
||||||
70
Dockerfile-old
Normal file
70
Dockerfile-old
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
# From https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile
|
||||||
|
|
||||||
|
FROM node:21-alpine AS base
|
||||||
|
|
||||||
|
# Install dependencies only when needed
|
||||||
|
FROM base AS deps
|
||||||
|
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
||||||
|
RUN apk add --no-cache libc6-compat
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install dependencies based on the preferred package manager
|
||||||
|
COPY package.json .yarnrc.yml yarn.lock* package-lock.json* pnpm-lock.yaml* ./
|
||||||
|
RUN yarn set version stable
|
||||||
|
RUN \
|
||||||
|
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
|
||||||
|
elif [ -f package-lock.json ]; then npm ci; \
|
||||||
|
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
|
||||||
|
else echo "Lockfile not found." && exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Rebuild the source code only when needed
|
||||||
|
FROM base AS builder
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=deps /app/node_modules ./node_modules
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Next.js collects completely anonymous telemetry data about general usage.
|
||||||
|
# Learn more here: https://nextjs.org/telemetry
|
||||||
|
# Uncomment the following line in case you want to disable telemetry during the build.
|
||||||
|
# ENV NEXT_TELEMETRY_DISABLED 1
|
||||||
|
|
||||||
|
RUN \
|
||||||
|
if [ -f yarn.lock ]; then yarn run build; \
|
||||||
|
elif [ -f package-lock.json ]; then npm run build; \
|
||||||
|
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \
|
||||||
|
else echo "Lockfile not found." && exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Production image, copy all the files and run next
|
||||||
|
FROM base AS runner
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ENV NODE_ENV production
|
||||||
|
# Uncomment the following line in case you want to disable telemetry during runtime.
|
||||||
|
# ENV NEXT_TELEMETRY_DISABLED 1
|
||||||
|
|
||||||
|
RUN addgroup --system --gid 1001 nodejs
|
||||||
|
RUN adduser --system --uid 1001 nextjs
|
||||||
|
|
||||||
|
COPY --from=builder /app/public ./public
|
||||||
|
|
||||||
|
# Set the correct permission for prerender cache
|
||||||
|
RUN mkdir .next
|
||||||
|
RUN chown nextjs:nodejs .next
|
||||||
|
|
||||||
|
# Automatically leverage output traces to reduce image size
|
||||||
|
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
||||||
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||||
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||||
|
|
||||||
|
USER nextjs
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
ENV PORT 3000
|
||||||
|
|
||||||
|
# server.js is created by next build from the standalone output
|
||||||
|
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
|
||||||
|
CMD HOSTNAME="0.0.0.0" node server.js
|
||||||
|
|
@ -3,6 +3,11 @@ import { withPayload } from '@payloadcms/next/withPayload'
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
// Your Next.js config here
|
// Your Next.js config here
|
||||||
|
eslint: {
|
||||||
|
// Warning: This allows production builds to successfully complete even if
|
||||||
|
// your project has ESLint errors.
|
||||||
|
ignoreDuringBuilds: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export default withPayload(nextConfig)
|
export default withPayload(nextConfig)
|
||||||
|
|
|
||||||
16
package.json
16
package.json
|
|
@ -16,18 +16,18 @@
|
||||||
"build-storybook": "storybook build"
|
"build-storybook": "storybook build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@payloadcms/db-mongodb": "beta",
|
"@payloadcms/db-mongodb": "3.0.0-beta.99",
|
||||||
"@payloadcms/next": "beta",
|
"@payloadcms/next": "3.0.0-beta.99",
|
||||||
"@payloadcms/plugin-cloud": "beta",
|
"@payloadcms/plugin-cloud": "3.0.0-beta.99",
|
||||||
"@payloadcms/richtext-lexical": "beta",
|
"@payloadcms/richtext-lexical": "3.0.0-beta.99",
|
||||||
"classnames": "^2.5.1",
|
"classnames": "^2.5.1",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"graphql": "^16.8.1",
|
"graphql": "^16.8.1",
|
||||||
"mapbox-gl": "^3.5.2",
|
"mapbox-gl": "^3.5.2",
|
||||||
"next": "15.0.0-canary.123",
|
"next": "15.0.0-canary.123",
|
||||||
"payload": "beta",
|
"payload": "3.0.0-beta.99",
|
||||||
"react": "^19.0.0-rc-6230622a1a-20240610",
|
"react": "19.0.0-rc-f65ac7bd-20240826",
|
||||||
"react-dom": "^19.0.0-rc-6230622a1a-20240610",
|
"react-dom": "19.0.0-rc-f65ac7bd-20240826",
|
||||||
"sharp": "0.32.6"
|
"sharp": "0.32.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
@ -65,5 +65,5 @@
|
||||||
"@types/react": "npm:types-react@19.0.0-rc.0",
|
"@types/react": "npm:types-react@19.0.0-rc.0",
|
||||||
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.0"
|
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.0"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.0"
|
"packageManager": "yarn@4.4.1"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import type { Metadata } from 'next'
|
||||||
import config from '@payload-config'
|
import config from '@payload-config'
|
||||||
/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */
|
/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */
|
||||||
import { NotFoundPage, generatePageMetadata } from '@payloadcms/next/views'
|
import { NotFoundPage, generatePageMetadata } from '@payloadcms/next/views'
|
||||||
|
import { importMap } from '../importMap'
|
||||||
|
|
||||||
type Args = {
|
type Args = {
|
||||||
params: {
|
params: {
|
||||||
|
|
@ -14,13 +15,10 @@ type Args = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const generateMetadata = ({
|
export const generateMetadata = ({ params, searchParams }: Args): Promise<Metadata> =>
|
||||||
params,
|
|
||||||
searchParams,
|
|
||||||
}: Args): Promise<Metadata> =>
|
|
||||||
generatePageMetadata({ config, params, searchParams })
|
generatePageMetadata({ config, params, searchParams })
|
||||||
|
|
||||||
const NotFound = ({ params, searchParams }: Args) =>
|
const NotFound = ({ params, searchParams }: Args) =>
|
||||||
NotFoundPage({ config, params, searchParams })
|
NotFoundPage({ config, params, searchParams, importMap })
|
||||||
|
|
||||||
export default NotFound
|
export default NotFound
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import type { Metadata } from 'next'
|
||||||
import config from '@payload-config'
|
import config from '@payload-config'
|
||||||
/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */
|
/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */
|
||||||
import { RootPage, generatePageMetadata } from '@payloadcms/next/views'
|
import { RootPage, generatePageMetadata } from '@payloadcms/next/views'
|
||||||
|
import { importMap } from '../importMap'
|
||||||
|
|
||||||
type Args = {
|
type Args = {
|
||||||
params: {
|
params: {
|
||||||
|
|
@ -14,13 +15,10 @@ type Args = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const generateMetadata = ({
|
export const generateMetadata = ({ params, searchParams }: Args): Promise<Metadata> =>
|
||||||
params,
|
|
||||||
searchParams,
|
|
||||||
}: Args): Promise<Metadata> =>
|
|
||||||
generatePageMetadata({ config, params, searchParams })
|
generatePageMetadata({ config, params, searchParams })
|
||||||
|
|
||||||
const Page = ({ params, searchParams }: Args) =>
|
const Page = ({ params, searchParams }: Args) =>
|
||||||
RootPage({ config, params, searchParams })
|
RootPage({ config, params, searchParams, importMap })
|
||||||
|
|
||||||
export default Page
|
export default Page
|
||||||
|
|
|
||||||
1
src/app/(payload)/admin/importMap.js
Normal file
1
src/app/(payload)/admin/importMap.js
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
export const importMap = {}
|
||||||
|
|
@ -1,13 +1,7 @@
|
||||||
/* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */
|
/* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */
|
||||||
/* DO NOT MODIFY it because it could be re-written at any time. */
|
/* DO NOT MODIFY it because it could be re-written at any time. */
|
||||||
import config from '@payload-config'
|
import config from '@payload-config'
|
||||||
import {
|
import { REST_DELETE, REST_GET, REST_OPTIONS, REST_PATCH, REST_POST } from '@payloadcms/next/routes'
|
||||||
REST_DELETE,
|
|
||||||
REST_GET,
|
|
||||||
REST_OPTIONS,
|
|
||||||
REST_PATCH,
|
|
||||||
REST_POST,
|
|
||||||
} from '@payloadcms/next/routes'
|
|
||||||
|
|
||||||
export const GET = REST_GET(config)
|
export const GET = REST_GET(config)
|
||||||
export const POST = REST_POST(config)
|
export const POST = REST_POST(config)
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,16 @@ import { RootLayout } from '@payloadcms/next/layouts'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
import './custom.scss'
|
import './custom.scss'
|
||||||
|
import { importMap } from './admin/importMap'
|
||||||
|
|
||||||
type Args = {
|
type Args = {
|
||||||
children: React.ReactNode
|
children: React.ReactNode
|
||||||
}
|
}
|
||||||
|
|
||||||
const Layout = ({ children }: Args) => (
|
const Layout = ({ children }: Args) => (
|
||||||
<RootLayout config={configPromise}>{children}</RootLayout>
|
<RootLayout importMap={importMap} config={configPromise}>
|
||||||
|
{children}
|
||||||
|
</RootLayout>
|
||||||
)
|
)
|
||||||
|
|
||||||
export default Layout
|
export default Layout
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ export default async function Home() {
|
||||||
and: [
|
and: [
|
||||||
{
|
{
|
||||||
date: {
|
date: {
|
||||||
greater_than_equal: today.toISOString().substring(0, 10),
|
greater_than_equal: today.toISOString(),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -71,7 +71,7 @@ export default async function Home() {
|
||||||
<>
|
<>
|
||||||
<BannerWithMenu nextMass={nextMass.docs[0]} />
|
<BannerWithMenu nextMass={nextMass.docs[0]} />
|
||||||
<div className={styles.mass}>
|
<div className={styles.mass}>
|
||||||
<h2>Kommen Sie vorbei, in unsere Heilige Messe!</h2>
|
<h2>Kommen Sie zu unserer Heiligen Messe vorbei!</h2>
|
||||||
|
|
||||||
<div className={styles.table}>
|
<div className={styles.table}>
|
||||||
{worshipByDate.map(([date, worships]) => (
|
{worshipByDate.map(([date, worships]) => (
|
||||||
|
|
|
||||||
43
src/collections/Announcements.ts
Normal file
43
src/collections/Announcements.ts
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
import { CollectionConfig } from 'payload'
|
||||||
|
import { isAdminOrEmployee } from '@/collections/access/admin'
|
||||||
|
|
||||||
|
export const Announcements: CollectionConfig = {
|
||||||
|
slug: 'vermeldungen',
|
||||||
|
labels: {
|
||||||
|
singular: {
|
||||||
|
de: 'Vermeldung'
|
||||||
|
},
|
||||||
|
plural: {
|
||||||
|
de: 'Vermeldungen'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'date',
|
||||||
|
type: 'date',
|
||||||
|
required: true,
|
||||||
|
label: {
|
||||||
|
de: 'Datum'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'parish',
|
||||||
|
type: "relationship",
|
||||||
|
relationTo: 'parish',
|
||||||
|
required: true,
|
||||||
|
hasMany: true,
|
||||||
|
label: {
|
||||||
|
de: "Gemeinde"
|
||||||
|
},
|
||||||
|
admin: {
|
||||||
|
allowCreate: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
|
access: {
|
||||||
|
read: () => true,
|
||||||
|
create: isAdminOrEmployee(),
|
||||||
|
update: isAdminOrEmployee(),
|
||||||
|
delete: isAdminOrEmployee(),
|
||||||
|
}
|
||||||
|
}
|
||||||
64
src/collections/Blog.ts
Normal file
64
src/collections/Blog.ts
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
import { CollectionConfig } from 'payload'
|
||||||
|
import { isAdminOrEmployee } from '@/collections/access/admin'
|
||||||
|
|
||||||
|
export const Blog: CollectionConfig = {
|
||||||
|
slug: 'blog',
|
||||||
|
labels: {
|
||||||
|
singular: {
|
||||||
|
de: 'Blogpost'
|
||||||
|
},
|
||||||
|
plural: {
|
||||||
|
de: 'Blog'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'photo',
|
||||||
|
type: 'upload',
|
||||||
|
relationTo: 'media',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'title',
|
||||||
|
type: 'text',
|
||||||
|
required: true,
|
||||||
|
label: {
|
||||||
|
de: "Titel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'parish',
|
||||||
|
type: 'relationship',
|
||||||
|
relationTo: 'parish',
|
||||||
|
hasMany: true,
|
||||||
|
label: {
|
||||||
|
de: "Gemeinde"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'isHighlight',
|
||||||
|
type: 'checkbox',
|
||||||
|
required: true,
|
||||||
|
label: {
|
||||||
|
de: "Highlight"
|
||||||
|
},
|
||||||
|
defaultValue: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'text',
|
||||||
|
type: 'richText',
|
||||||
|
required: true,
|
||||||
|
label: {
|
||||||
|
de: "Post"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
admin: {
|
||||||
|
useAsTitle: 'title'
|
||||||
|
},
|
||||||
|
access: {
|
||||||
|
read: () => true,
|
||||||
|
create: isAdminOrEmployee(),
|
||||||
|
update: isAdminOrEmployee(),
|
||||||
|
delete: isAdminOrEmployee(),
|
||||||
|
}
|
||||||
|
}
|
||||||
93
src/collections/Pages.ts
Normal file
93
src/collections/Pages.ts
Normal file
|
|
@ -0,0 +1,93 @@
|
||||||
|
import { Block, CollectionConfig } from 'payload'
|
||||||
|
import { isAdmin, isAdminOrEmployee } from '@/collections/access/admin'
|
||||||
|
|
||||||
|
const Content: Block = {
|
||||||
|
slug: 'content',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'content',
|
||||||
|
type: 'richText',
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const Title: Block = {
|
||||||
|
slug: 'title',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'title',
|
||||||
|
type: 'text',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const Testimony: Block = {
|
||||||
|
slug: 'testimony',
|
||||||
|
labels: {
|
||||||
|
singular: {
|
||||||
|
de: 'Zeugnis'
|
||||||
|
},
|
||||||
|
plural: {
|
||||||
|
de: 'Zeugnisse'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'testimony',
|
||||||
|
type: 'relationship',
|
||||||
|
relationTo: 'testimony',
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Pages: CollectionConfig = {
|
||||||
|
slug: 'page',
|
||||||
|
labels: {
|
||||||
|
singular: {
|
||||||
|
de: 'Seite'
|
||||||
|
},
|
||||||
|
plural: {
|
||||||
|
de: "Seiten"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: "title",
|
||||||
|
type: "text",
|
||||||
|
required: true,
|
||||||
|
label: {
|
||||||
|
de: "Titel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'slug',
|
||||||
|
type: 'text',
|
||||||
|
required: true,
|
||||||
|
label: {
|
||||||
|
de: "Slug"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'content',
|
||||||
|
type: 'blocks',
|
||||||
|
required: true,
|
||||||
|
blocks: [
|
||||||
|
Content,
|
||||||
|
Title,
|
||||||
|
Testimony
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
admin: {
|
||||||
|
useAsTitle: "title"
|
||||||
|
},
|
||||||
|
access: {
|
||||||
|
read: () => true,
|
||||||
|
create: isAdminOrEmployee(),
|
||||||
|
update: isAdminOrEmployee(),
|
||||||
|
delete: isAdmin(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -20,6 +20,14 @@ export const Parish: CollectionConfig = {
|
||||||
type: 'text',
|
type: 'text',
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'slug',
|
||||||
|
label: {
|
||||||
|
de: 'URL slug',
|
||||||
|
},
|
||||||
|
type: 'text',
|
||||||
|
required: true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'churches',
|
name: 'churches',
|
||||||
label: {
|
label: {
|
||||||
|
|
@ -41,7 +49,6 @@ export const Parish: CollectionConfig = {
|
||||||
type: 'relationship',
|
type: 'relationship',
|
||||||
relationTo: 'employees',
|
relationTo: 'employees',
|
||||||
hasMany: true,
|
hasMany: true,
|
||||||
required: true,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'contact',
|
name: 'contact',
|
||||||
|
|
|
||||||
39
src/collections/Tweets.ts
Normal file
39
src/collections/Tweets.ts
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
import { CollectionConfig } from 'payload'
|
||||||
|
import { isAdminOrEmployee } from '@/collections/access/admin'
|
||||||
|
|
||||||
|
export const Tweets: CollectionConfig = {
|
||||||
|
slug: 'tweet',
|
||||||
|
labels: {
|
||||||
|
singular: {
|
||||||
|
de: "Kurznachricht"
|
||||||
|
},
|
||||||
|
plural: {
|
||||||
|
de: "Kurznachrichten"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'parish',
|
||||||
|
type: 'relationship',
|
||||||
|
relationTo: 'parish',
|
||||||
|
hasMany: true,
|
||||||
|
label: {
|
||||||
|
de: "Gemeinde"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'text',
|
||||||
|
type: 'textarea',
|
||||||
|
required: true,
|
||||||
|
label: {
|
||||||
|
de: "Nachricht"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
access: {
|
||||||
|
read: () => true,
|
||||||
|
create: isAdminOrEmployee(),
|
||||||
|
update: isAdminOrEmployee(),
|
||||||
|
delete: isAdminOrEmployee(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,6 +4,7 @@ import MenuIcon from './menu.svg'
|
||||||
import Image from 'next/image'
|
import Image from 'next/image'
|
||||||
import { Worship } from '@/payload-types'
|
import { Worship } from '@/payload-types'
|
||||||
import { MenuBaseLayer } from '@/components/MenuBaseLayer/MenuBaseLayer'
|
import { MenuBaseLayer } from '@/components/MenuBaseLayer/MenuBaseLayer'
|
||||||
|
import classNames from 'classnames'
|
||||||
|
|
||||||
type MenuProps = {
|
type MenuProps = {
|
||||||
starClick?: () => void
|
starClick?: () => void
|
||||||
|
|
@ -12,7 +13,7 @@ type MenuProps = {
|
||||||
|
|
||||||
export const Menu = (props: MenuProps) => {
|
export const Menu = (props: MenuProps) => {
|
||||||
return (
|
return (
|
||||||
<nav className={styles.nav}>
|
<nav className={classNames(styles.nav, {[styles.white]: typeof props.starClick !== 'undefined'})}>
|
||||||
<MenuBaseLayer />
|
<MenuBaseLayer />
|
||||||
<div className={styles.navMobile}>
|
<div className={styles.navMobile}>
|
||||||
<Image src={MenuIcon} width={25} height={25} alt={'Menu'} />
|
<Image src={MenuIcon} width={25} height={25} alt={'Menu'} />
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,10 @@
|
||||||
margin-bottom: 2.5em;
|
margin-bottom: 2.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.white {
|
||||||
|
color: #eeeeee;
|
||||||
|
}
|
||||||
|
|
||||||
.navMobile {
|
.navMobile {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,241 +8,342 @@
|
||||||
|
|
||||||
export interface Config {
|
export interface Config {
|
||||||
auth: {
|
auth: {
|
||||||
users: UserAuthOperations
|
users: UserAuthOperations;
|
||||||
}
|
};
|
||||||
collections: {
|
collections: {
|
||||||
parish: Parish
|
parish: Parish;
|
||||||
church: Church
|
church: Church;
|
||||||
worship: Worship
|
worship: Worship;
|
||||||
event: Event
|
vermeldungen: Vermeldungen;
|
||||||
group: Group
|
blog: Blog;
|
||||||
employees: Employee
|
tweet: Tweet;
|
||||||
testimony: Testimony
|
event: Event;
|
||||||
users: User
|
group: Group;
|
||||||
media: Media
|
employees: Employee;
|
||||||
'payload-preferences': PayloadPreference
|
testimony: Testimony;
|
||||||
'payload-migrations': PayloadMigration
|
page: Page;
|
||||||
}
|
users: User;
|
||||||
|
media: Media;
|
||||||
|
'payload-preferences': PayloadPreference;
|
||||||
|
'payload-migrations': PayloadMigration;
|
||||||
|
};
|
||||||
db: {
|
db: {
|
||||||
defaultIDType: string
|
defaultIDType: string;
|
||||||
}
|
};
|
||||||
globals: {}
|
globals: {};
|
||||||
locale: null
|
locale: null;
|
||||||
user: User & {
|
user: User & {
|
||||||
collection: 'users'
|
collection: 'users';
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
export interface UserAuthOperations {
|
export interface UserAuthOperations {
|
||||||
forgotPassword: {
|
forgotPassword: {
|
||||||
email: string
|
email: string;
|
||||||
password: string
|
password: string;
|
||||||
}
|
};
|
||||||
login: {
|
login: {
|
||||||
email: string
|
email: string;
|
||||||
password: string
|
password: string;
|
||||||
}
|
};
|
||||||
registerFirstUser: {
|
registerFirstUser: {
|
||||||
email: string
|
email: string;
|
||||||
password: string
|
password: string;
|
||||||
}
|
};
|
||||||
unlock: {
|
unlock: {
|
||||||
email: string
|
email: string;
|
||||||
password: string
|
password: string;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "parish".
|
* via the `definition` "parish".
|
||||||
*/
|
*/
|
||||||
export interface Parish {
|
export interface Parish {
|
||||||
id: string
|
id: string;
|
||||||
name: string
|
name: string;
|
||||||
churches: (string | Church)[]
|
slug: string;
|
||||||
employees: (string | Employee)[]
|
churches: (string | Church)[];
|
||||||
contact: string
|
employees?: (string | Employee)[] | null;
|
||||||
title: string
|
contact: string;
|
||||||
description: string
|
title: string;
|
||||||
photo?: string | Media | null
|
description: string;
|
||||||
updatedAt: string
|
photo?: (string | null) | Media;
|
||||||
createdAt: string
|
updatedAt: string;
|
||||||
|
createdAt: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "church".
|
* via the `definition` "church".
|
||||||
*/
|
*/
|
||||||
export interface Church {
|
export interface Church {
|
||||||
id: string
|
id: string;
|
||||||
name: string
|
name: string;
|
||||||
address: string
|
address: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "employees".
|
* via the `definition` "employees".
|
||||||
*/
|
*/
|
||||||
export interface Employee {
|
export interface Employee {
|
||||||
id: string
|
id: string;
|
||||||
photo?: string | Media | null
|
photo?: (string | null) | Media;
|
||||||
name: string
|
name: string;
|
||||||
occupation: string
|
occupation: string;
|
||||||
email?: string | null
|
email?: string | null;
|
||||||
telephone?: string | null
|
telephone?: string | null;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "media".
|
* via the `definition` "media".
|
||||||
*/
|
*/
|
||||||
export interface Media {
|
export interface Media {
|
||||||
id: string
|
id: string;
|
||||||
alt: string
|
alt: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
url?: string | null
|
url?: string | null;
|
||||||
thumbnailURL?: string | null
|
thumbnailURL?: string | null;
|
||||||
filename?: string | null
|
filename?: string | null;
|
||||||
mimeType?: string | null
|
mimeType?: string | null;
|
||||||
filesize?: number | null
|
filesize?: number | null;
|
||||||
width?: number | null
|
width?: number | null;
|
||||||
height?: number | null
|
height?: number | null;
|
||||||
focalX?: number | null
|
focalX?: number | null;
|
||||||
focalY?: number | null
|
focalY?: number | null;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "worship".
|
* via the `definition` "worship".
|
||||||
*/
|
*/
|
||||||
export interface Worship {
|
export interface Worship {
|
||||||
id: string
|
id: string;
|
||||||
date: string
|
date: string;
|
||||||
location: string | Church
|
location: string | Church;
|
||||||
type: 'MASS' | 'FAMILY' | 'WORD'
|
type: 'MASS' | 'FAMILY' | 'WORD';
|
||||||
cancelled: boolean
|
cancelled: boolean;
|
||||||
title?: string | null
|
title?: string | null;
|
||||||
description?: string | null
|
description?: string | null;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
|
* via the `definition` "vermeldungen".
|
||||||
|
*/
|
||||||
|
export interface Vermeldungen {
|
||||||
|
id: string;
|
||||||
|
date: string;
|
||||||
|
parish: (string | Parish)[];
|
||||||
|
updatedAt: string;
|
||||||
|
createdAt: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
|
* via the `definition` "blog".
|
||||||
|
*/
|
||||||
|
export interface Blog {
|
||||||
|
id: string;
|
||||||
|
photo?: (string | null) | Media;
|
||||||
|
title: string;
|
||||||
|
parish?: (string | Parish)[] | null;
|
||||||
|
isHighlight: boolean;
|
||||||
|
text: {
|
||||||
|
root: {
|
||||||
|
type: string;
|
||||||
|
children: {
|
||||||
|
type: string;
|
||||||
|
version: number;
|
||||||
|
[k: string]: unknown;
|
||||||
|
}[];
|
||||||
|
direction: ('ltr' | 'rtl') | null;
|
||||||
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
||||||
|
indent: number;
|
||||||
|
version: number;
|
||||||
|
};
|
||||||
|
[k: string]: unknown;
|
||||||
|
};
|
||||||
|
updatedAt: string;
|
||||||
|
createdAt: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
|
* via the `definition` "tweet".
|
||||||
|
*/
|
||||||
|
export interface Tweet {
|
||||||
|
id: string;
|
||||||
|
parish?: (string | Parish)[] | null;
|
||||||
|
text: string;
|
||||||
|
updatedAt: string;
|
||||||
|
createdAt: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "event".
|
* via the `definition` "event".
|
||||||
*/
|
*/
|
||||||
export interface Event {
|
export interface Event {
|
||||||
id: string
|
id: string;
|
||||||
photo?: string | Media | null
|
photo?: (string | null) | Media;
|
||||||
title: string
|
title: string;
|
||||||
datum: string
|
datum: string;
|
||||||
parish?: (string | Parish)[] | null
|
parish?: (string | Parish)[] | null;
|
||||||
group?: (string | null) | Group
|
group?: (string | null) | Group;
|
||||||
shortDescription: string
|
shortDescription: string;
|
||||||
description: {
|
description: {
|
||||||
root: {
|
root: {
|
||||||
type: string
|
type: string;
|
||||||
children: {
|
children: {
|
||||||
type: string
|
type: string;
|
||||||
version: number
|
version: number;
|
||||||
[k: string]: unknown
|
[k: string]: unknown;
|
||||||
}[]
|
}[];
|
||||||
direction: ('ltr' | 'rtl') | null
|
direction: ('ltr' | 'rtl') | null;
|
||||||
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
||||||
indent: number
|
indent: number;
|
||||||
version: number
|
version: number;
|
||||||
}
|
};
|
||||||
[k: string]: unknown
|
[k: string]: unknown;
|
||||||
}
|
};
|
||||||
cancelled: boolean
|
cancelled: boolean;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "group".
|
* via the `definition` "group".
|
||||||
*/
|
*/
|
||||||
export interface Group {
|
export interface Group {
|
||||||
id: string
|
id: string;
|
||||||
photo?: string | Media | null
|
photo?: (string | null) | Media;
|
||||||
name: string
|
name: string;
|
||||||
description: string
|
description: string;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "testimony".
|
* via the `definition` "testimony".
|
||||||
*/
|
*/
|
||||||
export interface Testimony {
|
export interface Testimony {
|
||||||
id: string
|
id: string;
|
||||||
testimony: string
|
testimony: string;
|
||||||
name: string
|
name: string;
|
||||||
occupation?: string | null
|
occupation?: string | null;
|
||||||
category: 'EUCHARIST'
|
category: 'EUCHARIST';
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
|
* via the `definition` "page".
|
||||||
|
*/
|
||||||
|
export interface Page {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
slug: string;
|
||||||
|
content: (
|
||||||
|
| {
|
||||||
|
content: {
|
||||||
|
root: {
|
||||||
|
type: string;
|
||||||
|
children: {
|
||||||
|
type: string;
|
||||||
|
version: number;
|
||||||
|
[k: string]: unknown;
|
||||||
|
}[];
|
||||||
|
direction: ('ltr' | 'rtl') | null;
|
||||||
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
||||||
|
indent: number;
|
||||||
|
version: number;
|
||||||
|
};
|
||||||
|
[k: string]: unknown;
|
||||||
|
};
|
||||||
|
id?: string | null;
|
||||||
|
blockName?: string | null;
|
||||||
|
blockType: 'content';
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
title: string;
|
||||||
|
id?: string | null;
|
||||||
|
blockName?: string | null;
|
||||||
|
blockType: 'title';
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
testimony: string | Testimony;
|
||||||
|
id?: string | null;
|
||||||
|
blockName?: string | null;
|
||||||
|
blockType: 'testimony';
|
||||||
|
}
|
||||||
|
)[];
|
||||||
|
updatedAt: string;
|
||||||
|
createdAt: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "users".
|
* via the `definition` "users".
|
||||||
*/
|
*/
|
||||||
export interface User {
|
export interface User {
|
||||||
id: string
|
id: string;
|
||||||
name: string
|
name: string;
|
||||||
roles: 'user' | 'employee' | 'admin'
|
roles: 'user' | 'employee' | 'admin';
|
||||||
groups?: (string | Group)[] | null
|
groups?: (string | Group)[] | null;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
email: string
|
email: string;
|
||||||
resetPasswordToken?: string | null
|
resetPasswordToken?: string | null;
|
||||||
resetPasswordExpiration?: string | null
|
resetPasswordExpiration?: string | null;
|
||||||
salt?: string | null
|
salt?: string | null;
|
||||||
hash?: string | null
|
hash?: string | null;
|
||||||
loginAttempts?: number | null
|
loginAttempts?: number | null;
|
||||||
lockUntil?: string | null
|
lockUntil?: string | null;
|
||||||
password?: string | null
|
password?: string | null;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "payload-preferences".
|
* via the `definition` "payload-preferences".
|
||||||
*/
|
*/
|
||||||
export interface PayloadPreference {
|
export interface PayloadPreference {
|
||||||
id: string
|
id: string;
|
||||||
user: {
|
user: {
|
||||||
relationTo: 'users'
|
relationTo: 'users';
|
||||||
value: string | User
|
value: string | User;
|
||||||
}
|
};
|
||||||
key?: string | null
|
key?: string | null;
|
||||||
value?:
|
value?:
|
||||||
| {
|
| {
|
||||||
[k: string]: unknown
|
[k: string]: unknown;
|
||||||
}
|
}
|
||||||
| unknown[]
|
| unknown[]
|
||||||
| string
|
| string
|
||||||
| number
|
| number
|
||||||
| boolean
|
| boolean
|
||||||
| null
|
| null;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "payload-migrations".
|
* via the `definition` "payload-migrations".
|
||||||
*/
|
*/
|
||||||
export interface PayloadMigration {
|
export interface PayloadMigration {
|
||||||
id: string
|
id: string;
|
||||||
name?: string | null
|
name?: string | null;
|
||||||
batch?: number | null
|
batch?: number | null;
|
||||||
updatedAt: string
|
updatedAt: string;
|
||||||
createdAt: string
|
createdAt: string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* This interface was referenced by `Config`'s JSON-Schema
|
||||||
* via the `definition` "auth".
|
* via the `definition` "auth".
|
||||||
*/
|
*/
|
||||||
export interface Auth {
|
export interface Auth {
|
||||||
[k: string]: unknown
|
[k: string]: unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
declare module 'payload' {
|
declare module 'payload' {
|
||||||
export interface GeneratedTypes extends Config {}
|
export interface GeneratedTypes extends Config {}
|
||||||
}
|
}
|
||||||
|
|
@ -16,6 +16,10 @@ import { Parish } from '@/collections/Parish'
|
||||||
import { Employees } from '@/collections/Employees'
|
import { Employees } from '@/collections/Employees'
|
||||||
import { Groups } from '@/collections/Groups'
|
import { Groups } from '@/collections/Groups'
|
||||||
import { Events } from '@/collections/Events'
|
import { Events } from '@/collections/Events'
|
||||||
|
import { Announcements } from '@/collections/Announcements'
|
||||||
|
import { Blog } from '@/collections/Blog'
|
||||||
|
import { Tweets } from '@/collections/Tweets'
|
||||||
|
import { Pages } from '@/collections/Pages'
|
||||||
|
|
||||||
const filename = fileURLToPath(import.meta.url)
|
const filename = fileURLToPath(import.meta.url)
|
||||||
const dirname = path.dirname(filename)
|
const dirname = path.dirname(filename)
|
||||||
|
|
@ -28,10 +32,14 @@ export default buildConfig({
|
||||||
Parish,
|
Parish,
|
||||||
Churches,
|
Churches,
|
||||||
Worship,
|
Worship,
|
||||||
|
Announcements,
|
||||||
|
Blog,
|
||||||
|
Tweets,
|
||||||
Events,
|
Events,
|
||||||
Groups,
|
Groups,
|
||||||
Employees,
|
Employees,
|
||||||
Testimony,
|
Testimony,
|
||||||
|
Pages,
|
||||||
Users,
|
Users,
|
||||||
Media,
|
Media,
|
||||||
],
|
],
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue