mirror of
https://github.com/complexcaresolutions/cms.c2sgmbh.git
synced 2026-03-18 00:24:10 +00:00
New Collections: - Events: Veranstaltungen mit Datum, Ort, Registrierung - Jobs: Stellenangebote mit Standort und Bewerbungsfrist - Locations: Standorte mit Adresse, Kontakt, Öffnungszeiten - Partners: Partner/Kunden mit Logo und Beschreibung - Downloads: Dateien mit Kategorisierung und Tracking New Blocks: - EventsBlock: Veranstaltungslisten mit Kalender-Ansicht - JobsBlock: Stellenanzeigen mit Filterfunktion - LocationsBlock: Standort-Karten und Listen - PricingBlock: Preistabellen mit Feature-Vergleich - TabsBlock: Tabbed Content mit verschiedenen Stilen - AccordionBlock: FAQ/Accordion mit Animationen - ComparisonBlock: Vergleichstabellen (Tabelle, Karten, Pro/Contra) - StatsBlock: Statistiken mit Counter-Animation - LogoGridBlock: Logo-Wolken und Partner-Galerien - MapBlock: Interaktive Karten mit Markern - DownloadsBlock: Download-Listen mit Kategorien All collections support multi-tenant isolation and localization. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
598 lines
15 KiB
TypeScript
598 lines
15 KiB
TypeScript
import type { Block } from 'payload'
|
|
|
|
/**
|
|
* Comparison Block
|
|
*
|
|
* Vergleichstabellen für Produkte, Dienstleistungen, Pläne etc.
|
|
* Unterstützt verschiedene Layouts und Darstellungsformen.
|
|
*/
|
|
export const ComparisonBlock: Block = {
|
|
slug: 'comparison',
|
|
labels: {
|
|
singular: 'Vergleich',
|
|
plural: 'Vergleiche',
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
label: 'Überschrift',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'subtitle',
|
|
type: 'text',
|
|
label: 'Untertitel',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'description',
|
|
type: 'textarea',
|
|
label: 'Beschreibung',
|
|
localized: true,
|
|
},
|
|
// Vergleichstyp
|
|
{
|
|
name: 'comparisonType',
|
|
type: 'select',
|
|
defaultValue: 'table',
|
|
label: 'Vergleichs-Typ',
|
|
options: [
|
|
{ label: 'Tabelle', value: 'table' },
|
|
{ label: 'Karten nebeneinander', value: 'cards' },
|
|
{ label: 'Vorher/Nachher', value: 'before-after' },
|
|
{ label: 'Pro/Contra', value: 'pros-cons' },
|
|
{ label: 'Feature-Matrix', value: 'feature-matrix' },
|
|
],
|
|
},
|
|
// Tabellen-Vergleich
|
|
{
|
|
name: 'tbl',
|
|
type: 'group',
|
|
label: 'Tabellen-Vergleich',
|
|
admin: {
|
|
condition: (data, siblingData) =>
|
|
siblingData?.comparisonType === 'table' ||
|
|
siblingData?.comparisonType === 'feature-matrix',
|
|
},
|
|
fields: [
|
|
// Spalten (Produkte/Optionen)
|
|
{
|
|
name: 'columns',
|
|
type: 'array',
|
|
label: 'Spalten (Optionen)',
|
|
minRows: 2,
|
|
maxRows: 6,
|
|
fields: [
|
|
{
|
|
name: 'name',
|
|
type: 'text',
|
|
required: true,
|
|
label: 'Name',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'subtitle',
|
|
type: 'text',
|
|
label: 'Untertitel',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'image',
|
|
type: 'upload',
|
|
relationTo: 'media',
|
|
label: 'Bild/Logo',
|
|
},
|
|
{
|
|
name: 'price',
|
|
type: 'text',
|
|
label: 'Preis',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'isHighlighted',
|
|
type: 'checkbox',
|
|
defaultValue: false,
|
|
label: 'Hervorheben',
|
|
},
|
|
{
|
|
name: 'highlightLabel',
|
|
type: 'text',
|
|
label: 'Highlight-Label',
|
|
localized: true,
|
|
admin: {
|
|
condition: (data, siblingData) => siblingData?.isHighlighted,
|
|
description: 'z.B. "Empfohlen", "Bestseller"',
|
|
},
|
|
},
|
|
{
|
|
name: 'ctaText',
|
|
type: 'text',
|
|
label: 'Button-Text',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'ctaLink',
|
|
type: 'text',
|
|
label: 'Button-Link',
|
|
},
|
|
],
|
|
},
|
|
// Zeilen (Features)
|
|
{
|
|
name: 'rows',
|
|
type: 'array',
|
|
label: 'Zeilen (Features)',
|
|
fields: [
|
|
{
|
|
name: 'feature',
|
|
type: 'text',
|
|
required: true,
|
|
label: 'Feature',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'category',
|
|
type: 'text',
|
|
label: 'Kategorie',
|
|
admin: {
|
|
description: 'Für Gruppierung',
|
|
},
|
|
},
|
|
{
|
|
name: 'tooltip',
|
|
type: 'text',
|
|
label: 'Tooltip',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'values',
|
|
type: 'array',
|
|
label: 'Werte',
|
|
fields: [
|
|
{
|
|
name: 'columnIndex',
|
|
type: 'number',
|
|
label: 'Spalten-Index',
|
|
admin: {
|
|
description: '0 = erste Spalte',
|
|
},
|
|
},
|
|
{
|
|
name: 'valueType',
|
|
type: 'select',
|
|
defaultValue: 'text',
|
|
label: 'Wert-Typ',
|
|
options: [
|
|
{ label: 'Text', value: 'text' },
|
|
{ label: 'Ja/Nein', value: 'boolean' },
|
|
{ label: 'Teilweise', value: 'partial' },
|
|
{ label: 'Nicht verfügbar', value: 'na' },
|
|
],
|
|
},
|
|
{
|
|
name: 'textValue',
|
|
type: 'text',
|
|
label: 'Text-Wert',
|
|
localized: true,
|
|
admin: {
|
|
condition: (data, siblingData) => siblingData?.valueType === 'text',
|
|
},
|
|
},
|
|
{
|
|
name: 'booleanValue',
|
|
type: 'checkbox',
|
|
label: 'Ja/Nein',
|
|
admin: {
|
|
condition: (data, siblingData) => siblingData?.valueType === 'boolean',
|
|
},
|
|
},
|
|
{
|
|
name: 'partialNote',
|
|
type: 'text',
|
|
label: 'Hinweis',
|
|
localized: true,
|
|
admin: {
|
|
condition: (data, siblingData) => siblingData?.valueType === 'partial',
|
|
description: 'z.B. "Eingeschränkt", "Mit Aufpreis"',
|
|
},
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
// Karten-Vergleich
|
|
{
|
|
name: 'crd',
|
|
type: 'group',
|
|
label: 'Karten-Vergleich',
|
|
admin: {
|
|
condition: (data, siblingData) => siblingData?.comparisonType === 'cards',
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'items',
|
|
type: 'array',
|
|
label: 'Karten',
|
|
minRows: 2,
|
|
maxRows: 4,
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
required: true,
|
|
label: 'Titel',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'subtitle',
|
|
type: 'text',
|
|
label: 'Untertitel',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'image',
|
|
type: 'upload',
|
|
relationTo: 'media',
|
|
label: 'Bild',
|
|
},
|
|
{
|
|
name: 'description',
|
|
type: 'richText',
|
|
label: 'Beschreibung',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'features',
|
|
type: 'array',
|
|
label: 'Features',
|
|
fields: [
|
|
{
|
|
name: 'text',
|
|
type: 'text',
|
|
required: true,
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'included',
|
|
type: 'checkbox',
|
|
defaultValue: true,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'price',
|
|
type: 'text',
|
|
label: 'Preis',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'ctaText',
|
|
type: 'text',
|
|
label: 'Button-Text',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'ctaLink',
|
|
type: 'text',
|
|
label: 'Button-Link',
|
|
},
|
|
{
|
|
name: 'isHighlighted',
|
|
type: 'checkbox',
|
|
defaultValue: false,
|
|
label: 'Hervorheben',
|
|
},
|
|
{
|
|
name: 'accentColor',
|
|
type: 'select',
|
|
label: 'Akzentfarbe',
|
|
options: [
|
|
{ label: 'Standard', value: 'default' },
|
|
{ label: 'Primär', value: 'primary' },
|
|
{ label: 'Sekundär', value: 'secondary' },
|
|
{ label: 'Grün', value: 'green' },
|
|
{ label: 'Blau', value: 'blue' },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
// Vorher/Nachher
|
|
{
|
|
name: 'beforeAfter',
|
|
type: 'group',
|
|
label: 'Vorher/Nachher',
|
|
admin: {
|
|
condition: (data, siblingData) => siblingData?.comparisonType === 'before-after',
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'beforeLabel',
|
|
type: 'text',
|
|
defaultValue: 'Vorher',
|
|
label: 'Vorher-Label',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'afterLabel',
|
|
type: 'text',
|
|
defaultValue: 'Nachher',
|
|
label: 'Nachher-Label',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'items',
|
|
type: 'array',
|
|
label: 'Vergleiche',
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
label: 'Titel',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'beforeImage',
|
|
type: 'upload',
|
|
relationTo: 'media',
|
|
label: 'Vorher-Bild',
|
|
},
|
|
{
|
|
name: 'afterImage',
|
|
type: 'upload',
|
|
relationTo: 'media',
|
|
label: 'Nachher-Bild',
|
|
},
|
|
{
|
|
name: 'beforeText',
|
|
type: 'textarea',
|
|
label: 'Vorher-Text',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'afterText',
|
|
type: 'textarea',
|
|
label: 'Nachher-Text',
|
|
localized: true,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'displayStyle',
|
|
type: 'select',
|
|
defaultValue: 'slider',
|
|
label: 'Darstellung',
|
|
options: [
|
|
{ label: 'Slider (Schieberegler)', value: 'slider' },
|
|
{ label: 'Nebeneinander', value: 'side-by-side' },
|
|
{ label: 'Übereinander', value: 'stacked' },
|
|
{ label: 'Flip', value: 'flip' },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
// Pro/Contra
|
|
{
|
|
name: 'prosCons',
|
|
type: 'group',
|
|
label: 'Pro/Contra',
|
|
admin: {
|
|
condition: (data, siblingData) => siblingData?.comparisonType === 'pros-cons',
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'prosLabel',
|
|
type: 'text',
|
|
defaultValue: 'Vorteile',
|
|
label: 'Vorteile-Label',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'consLabel',
|
|
type: 'text',
|
|
defaultValue: 'Nachteile',
|
|
label: 'Nachteile-Label',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'items',
|
|
type: 'array',
|
|
label: 'Einträge',
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
label: 'Titel',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'image',
|
|
type: 'upload',
|
|
relationTo: 'media',
|
|
label: 'Bild',
|
|
},
|
|
{
|
|
name: 'pros',
|
|
type: 'array',
|
|
label: 'Vorteile',
|
|
fields: [
|
|
{
|
|
name: 'text',
|
|
type: 'text',
|
|
required: true,
|
|
localized: true,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'cons',
|
|
type: 'array',
|
|
label: 'Nachteile',
|
|
fields: [
|
|
{
|
|
name: 'text',
|
|
type: 'text',
|
|
required: true,
|
|
localized: true,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'verdict',
|
|
type: 'textarea',
|
|
label: 'Fazit',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'rating',
|
|
type: 'number',
|
|
min: 0,
|
|
max: 5,
|
|
label: 'Bewertung (0-5)',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
// Layout-Optionen
|
|
{
|
|
name: 'stickyHeader',
|
|
type: 'checkbox',
|
|
defaultValue: true,
|
|
label: 'Sticky Header',
|
|
admin: {
|
|
condition: (data, siblingData) =>
|
|
siblingData?.comparisonType === 'table' ||
|
|
siblingData?.comparisonType === 'feature-matrix',
|
|
},
|
|
},
|
|
{
|
|
name: 'showCategories',
|
|
type: 'checkbox',
|
|
defaultValue: true,
|
|
label: 'Kategorien anzeigen',
|
|
admin: {
|
|
condition: (data, siblingData) =>
|
|
siblingData?.comparisonType === 'table' ||
|
|
siblingData?.comparisonType === 'feature-matrix',
|
|
},
|
|
},
|
|
{
|
|
name: 'collapsibleCategories',
|
|
type: 'checkbox',
|
|
defaultValue: false,
|
|
label: 'Kategorien einklappbar',
|
|
admin: {
|
|
condition: (data, siblingData) =>
|
|
siblingData?.comparisonType === 'table' ||
|
|
siblingData?.comparisonType === 'feature-matrix',
|
|
},
|
|
},
|
|
{
|
|
name: 'showRowDividers',
|
|
type: 'checkbox',
|
|
defaultValue: true,
|
|
label: 'Zeilen-Trennlinien',
|
|
},
|
|
{
|
|
name: 'highlightDifferences',
|
|
type: 'checkbox',
|
|
defaultValue: false,
|
|
label: 'Unterschiede hervorheben',
|
|
},
|
|
// Mobile
|
|
{
|
|
name: 'mobileView',
|
|
type: 'select',
|
|
defaultValue: 'scroll',
|
|
label: 'Mobile-Ansicht',
|
|
options: [
|
|
{ label: 'Horizontal scrollen', value: 'scroll' },
|
|
{ label: 'Karten gestapelt', value: 'stacked' },
|
|
{ label: 'Accordion', value: 'accordion' },
|
|
{ label: 'Dropdown-Auswahl', value: 'dropdown' },
|
|
],
|
|
},
|
|
// Symbole
|
|
{
|
|
name: 'symbols',
|
|
type: 'group',
|
|
label: 'Symbole',
|
|
fields: [
|
|
{
|
|
name: 'checkSymbol',
|
|
type: 'text',
|
|
defaultValue: '✓',
|
|
label: 'Häkchen-Symbol',
|
|
},
|
|
{
|
|
name: 'crossSymbol',
|
|
type: 'text',
|
|
defaultValue: '✗',
|
|
label: 'X-Symbol',
|
|
},
|
|
{
|
|
name: 'partialSymbol',
|
|
type: 'text',
|
|
defaultValue: '○',
|
|
label: 'Teilweise-Symbol',
|
|
},
|
|
],
|
|
},
|
|
// Styling
|
|
{
|
|
name: 'backgroundColor',
|
|
type: 'select',
|
|
defaultValue: 'white',
|
|
label: 'Hintergrund',
|
|
options: [
|
|
{ label: 'Weiß', value: 'white' },
|
|
{ label: 'Hell (Grau)', value: 'light' },
|
|
{ label: 'Dunkel', value: 'dark' },
|
|
],
|
|
},
|
|
{
|
|
name: 'tableStyle',
|
|
type: 'select',
|
|
defaultValue: 'bordered',
|
|
label: 'Tabellen-Stil',
|
|
options: [
|
|
{ label: 'Umrandet', value: 'bordered' },
|
|
{ label: 'Striped', value: 'striped' },
|
|
{ label: 'Minimalistisch', value: 'minimal' },
|
|
{ label: 'Karten', value: 'cards' },
|
|
],
|
|
admin: {
|
|
condition: (data, siblingData) =>
|
|
siblingData?.comparisonType === 'table' ||
|
|
siblingData?.comparisonType === 'feature-matrix',
|
|
},
|
|
},
|
|
{
|
|
name: 'checkColor',
|
|
type: 'select',
|
|
defaultValue: 'green',
|
|
label: 'Häkchen-Farbe',
|
|
options: [
|
|
{ label: 'Grün', value: 'green' },
|
|
{ label: 'Primär', value: 'primary' },
|
|
{ label: 'Blau', value: 'blue' },
|
|
],
|
|
},
|
|
{
|
|
name: 'crossColor',
|
|
type: 'select',
|
|
defaultValue: 'red',
|
|
label: 'X-Farbe',
|
|
options: [
|
|
{ label: 'Rot', value: 'red' },
|
|
{ label: 'Grau', value: 'gray' },
|
|
{ label: 'Transparent', value: 'transparent' },
|
|
],
|
|
},
|
|
],
|
|
}
|