Files
anouma/collections/Conversations.ts
T

89 lines
2.2 KiB
TypeScript

import { randomUUID } from "node:crypto";
import type { CollectionConfig } from "payload";
import { isAdmin, isAdminFieldLevel } from "@/access";
export const Conversations: CollectionConfig = {
slug: "conversations",
labels: {
singular: "Anfrage",
plural: "Anfragen",
},
admin: {
useAsTitle: "subject",
defaultColumns: ["subject", "name", "email", "status", "lastMessageAt"],
group: "Kommunikation",
description: "Kontakt- und Terminanfragen als durchsuchbare Konversationen.",
},
access: {
read: isAdmin,
create: () => false,
update: isAdmin,
delete: isAdmin,
},
timestamps: true,
fields: [
{
name: "subject",
type: "text",
label: "Betreff",
required: true,
},
{
type: "row",
fields: [
{ name: "name", type: "text", label: "Name", required: true, admin: { width: "50%" } },
{ name: "email", type: "email", label: "E-Mail", required: true, admin: { width: "50%" } },
],
},
{
name: "type",
type: "select",
label: "Art",
required: true,
defaultValue: "contact",
options: [
{ label: "Kontakt", value: "contact" },
{ label: "Terminanfrage", value: "appointment" },
{ label: "Gruppenangebot", value: "group" },
],
},
{
name: "status",
type: "select",
label: "Status",
required: true,
defaultValue: "open",
options: [
{ label: "Offen", value: "open" },
{ label: "Wartet auf Antwort", value: "waiting" },
{ label: "Erledigt", value: "closed" },
],
},
{
name: "customer",
type: "relationship",
relationTo: "customers",
label: "Kundenkonto",
admin: { position: "sidebar", readOnly: true },
},
{
name: "threadKey",
type: "text",
label: "E-Mail-Thread-Schlüssel",
required: true,
unique: true,
index: true,
defaultValue: () => randomUUID(),
access: { read: isAdminFieldLevel, update: () => false },
admin: { position: "sidebar", readOnly: true },
},
{
name: "lastMessageAt",
type: "date",
label: "Letzte Nachricht",
index: true,
admin: { position: "sidebar", readOnly: true },
},
],
};