cms.c2sgmbh/src/blocks/DownloadsBlock.ts
Martin Porwoll 9e5c741941 feat: add priority collections and advanced content blocks
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>
2025-12-14 00:58:30 +00:00

457 lines
12 KiB
TypeScript

import type { Block } from 'payload'
/**
* DownloadsBlock
*
* Zeigt Downloads mit Filter- und Suchfunktion.
* Unterstützt verschiedene Layouts und Kategoriefilter.
*/
export const DownloadsBlock: Block = {
slug: 'downloads-block',
labels: {
singular: 'Downloads',
plural: 'Downloads',
},
imageURL: '/assets/blocks/downloads.png',
fields: [
{
name: 'title',
type: 'text',
label: 'Überschrift',
localized: true,
defaultValue: 'Downloads',
},
{
name: 'subtitle',
type: 'textarea',
label: 'Untertitel',
localized: true,
},
{
name: 'introduction',
type: 'richText',
label: 'Einleitungstext',
localized: true,
},
// Datenquelle
{
name: 'source',
type: 'select',
defaultValue: 'all',
label: 'Downloads',
options: [
{ label: 'Alle aktiven', value: 'all' },
{ label: 'Nach Kategorie', value: 'category' },
{ label: 'Nach Tags', value: 'tags' },
{ label: 'Nur hervorgehobene', value: 'featured' },
{ label: 'Zugehörig zu Service', value: 'service' },
{ label: 'Zugehörig zu Produkt', value: 'product' },
{ label: 'Manuell auswählen', value: 'manual' },
],
},
{
name: 'category',
type: 'select',
label: 'Kategorie',
options: [
{ label: 'Broschüre', value: 'brochure' },
{ label: 'Flyer', value: 'flyer' },
{ label: 'Katalog', value: 'catalog' },
{ label: 'Preisliste', value: 'pricelist' },
{ label: 'Formular', value: 'form' },
{ label: 'Anleitung', value: 'manual' },
{ label: 'Datenblatt', value: 'datasheet' },
{ label: 'Zertifikat', value: 'certificate' },
{ label: 'Pressematerial', value: 'press' },
{ label: 'Whitepaper', value: 'whitepaper' },
{ label: 'Präsentation', value: 'presentation' },
{ label: 'Vertrag/AGB', value: 'legal' },
],
admin: {
condition: (_, siblingData) => siblingData?.source === 'category',
},
},
{
name: 'filterTags',
type: 'text',
label: 'Tags (kommagetrennt)',
admin: {
condition: (_, siblingData) => siblingData?.source === 'tags',
description: 'z.B. "produktinfo, 2024, neu"',
},
},
{
name: 'relatedService',
type: 'relationship',
relationTo: 'services',
label: 'Zugehöriger Service',
admin: {
condition: (_, siblingData) => siblingData?.source === 'service',
},
},
{
name: 'relatedProduct',
type: 'relationship',
relationTo: 'products',
label: 'Zugehöriges Produkt',
admin: {
condition: (_, siblingData) => siblingData?.source === 'product',
},
},
{
name: 'selectedDownloads',
type: 'relationship',
relationTo: 'downloads',
hasMany: true,
label: 'Downloads auswählen',
admin: {
condition: (_, siblingData) => siblingData?.source === 'manual',
},
},
{
name: 'limit',
type: 'number',
defaultValue: 20,
min: 1,
max: 100,
label: 'Maximale Anzahl',
},
// Filter-UI
{
name: 'filters',
type: 'group',
label: 'Filter-Optionen',
fields: [
{
name: 'showSearch',
type: 'checkbox',
defaultValue: true,
label: 'Suchfeld',
},
{
name: 'showCategoryFilter',
type: 'checkbox',
defaultValue: true,
label: 'Kategorie-Filter',
},
{
name: 'showFileTypeFilter',
type: 'checkbox',
defaultValue: false,
label: 'Dateityp-Filter',
},
{
name: 'filterLayout',
type: 'select',
defaultValue: 'horizontal',
label: 'Filter-Layout',
options: [
{ label: 'Horizontal', value: 'horizontal' },
{ label: 'Sidebar', value: 'sidebar' },
{ label: 'Dropdown', value: 'dropdown' },
],
},
],
},
// Layout
{
name: 'layout',
type: 'select',
defaultValue: 'list',
label: 'Layout',
options: [
{ label: 'Liste', value: 'list' },
{ label: 'Karten', value: 'cards' },
{ label: 'Kompakt', value: 'compact' },
{ label: 'Tabelle', value: 'table' },
{ label: 'Akkordeon (nach Kategorie)', value: 'accordion' },
],
},
{
name: 'columns',
type: 'select',
defaultValue: '1',
label: 'Spalten',
options: [
{ label: '1 Spalte', value: '1' },
{ label: '2 Spalten', value: '2' },
{ label: '3 Spalten', value: '3' },
{ label: '4 Spalten', value: '4' },
],
admin: {
condition: (_, siblingData) =>
siblingData?.layout === 'cards' || siblingData?.layout === 'list',
},
},
// Anzuzeigende Informationen
{
name: 'show',
type: 'group',
label: 'Anzeigen',
fields: [
{
name: 'thumbnail',
type: 'checkbox',
defaultValue: true,
label: 'Vorschaubild/Icon',
},
{
name: 'description',
type: 'checkbox',
defaultValue: true,
label: 'Beschreibung',
},
{
name: 'fileSize',
type: 'checkbox',
defaultValue: true,
label: 'Dateigröße',
},
{
name: 'fileType',
type: 'checkbox',
defaultValue: true,
label: 'Dateityp',
},
{
name: 'category',
type: 'checkbox',
defaultValue: true,
label: 'Kategorie',
},
{
name: 'downloadCount',
type: 'checkbox',
defaultValue: false,
label: 'Download-Zähler',
},
{
name: 'version',
type: 'checkbox',
defaultValue: false,
label: 'Version',
},
{
name: 'lastUpdated',
type: 'checkbox',
defaultValue: false,
label: 'Letztes Update',
},
],
},
// Download-Verhalten
{
name: 'downloadBehavior',
type: 'group',
label: 'Download-Verhalten',
fields: [
{
name: 'directDownload',
type: 'checkbox',
defaultValue: true,
label: 'Direkter Download',
admin: {
description: 'Datei direkt herunterladen vs. Vorschau öffnen',
},
},
{
name: 'trackDownloads',
type: 'checkbox',
defaultValue: true,
label: 'Downloads zählen',
},
{
name: 'openInNewTab',
type: 'checkbox',
defaultValue: false,
label: 'In neuem Tab öffnen',
},
],
},
// File-Type Icons
{
name: 'fileIcons',
type: 'group',
label: 'Datei-Icons',
fields: [
{
name: 'showFileTypeIcon',
type: 'checkbox',
defaultValue: true,
label: 'Dateityp-Icon anzeigen',
},
{
name: 'iconStyle',
type: 'select',
defaultValue: 'colored',
label: 'Icon-Stil',
options: [
{ label: 'Farbig', value: 'colored' },
{ label: 'Monochrom', value: 'mono' },
{ label: 'Outline', value: 'outline' },
],
admin: {
condition: (_, siblingData) => siblingData?.showFileTypeIcon,
},
},
],
},
// Sortierung
{
name: 'sortBy',
type: 'select',
defaultValue: 'order',
label: 'Sortierung',
options: [
{ label: 'Manuelle Reihenfolge', value: 'order' },
{ label: 'Titel (A-Z)', value: 'title_asc' },
{ label: 'Titel (Z-A)', value: 'title_desc' },
{ label: 'Neueste zuerst', value: 'date_desc' },
{ label: 'Älteste zuerst', value: 'date_asc' },
{ label: 'Beliebteste', value: 'downloads_desc' },
{ label: 'Dateigröße', value: 'size' },
],
},
// Gruppierung
{
name: 'groupBy',
type: 'select',
defaultValue: 'none',
label: 'Gruppieren nach',
options: [
{ label: 'Keine Gruppierung', value: 'none' },
{ label: 'Kategorie', value: 'category' },
{ label: 'Dateityp', value: 'fileType' },
],
},
// Pagination
{
name: 'pagination',
type: 'group',
label: 'Pagination',
fields: [
{
name: 'type',
type: 'select',
defaultValue: 'none',
label: 'Typ',
options: [
{ label: 'Alle anzeigen', value: 'none' },
{ label: '"Mehr laden" Button', value: 'button' },
{ label: 'Pagination', value: 'pagination' },
],
},
{
name: 'perPage',
type: 'number',
defaultValue: 10,
label: 'Pro Seite',
admin: {
condition: (_, siblingData) =>
siblingData?.type === 'pagination' || siblingData?.type === 'button',
},
},
],
},
// Styling
{
name: 'style',
type: 'group',
label: 'Darstellung',
fields: [
{
name: 'bg',
type: 'select',
defaultValue: 'none',
label: 'Hintergrund',
options: [
{ label: 'Keiner', value: 'none' },
{ label: 'Hell', value: 'light' },
{ label: 'Dunkel', value: 'dark' },
],
},
{
name: 'cardStyle',
type: 'select',
defaultValue: 'bordered',
label: 'Karten-Stil',
options: [
{ label: 'Einfach', value: 'simple' },
{ label: 'Mit Rahmen', value: 'bordered' },
{ label: 'Mit Schatten', value: 'shadow' },
],
},
{
name: 'hoverEffect',
type: 'select',
defaultValue: 'highlight',
label: 'Hover-Effekt',
options: [
{ label: 'Keiner', value: 'none' },
{ label: 'Hervorheben', value: 'highlight' },
{ label: 'Anheben', value: 'lift' },
],
},
{
name: 'gap',
type: 'select',
defaultValue: '16',
label: 'Abstand',
options: [
{ label: 'Klein (8px)', value: '8' },
{ label: 'Normal (16px)', value: '16' },
{ label: 'Groß (24px)', value: '24' },
],
},
],
},
// Empty State
{
name: 'emptyState',
type: 'group',
label: 'Keine Downloads',
fields: [
{
name: 'title',
type: 'text',
label: 'Überschrift',
localized: true,
defaultValue: 'Keine Downloads verfügbar',
},
{
name: 'message',
type: 'textarea',
label: 'Nachricht',
localized: true,
defaultValue: 'Aktuell sind keine Downloads in dieser Kategorie verfügbar.',
},
],
},
// CTA
{
name: 'showAllDownloadsLink',
type: 'checkbox',
defaultValue: false,
label: '"Alle Downloads" Link',
},
{
name: 'allDownloadsText',
type: 'text',
label: 'Link-Text',
localized: true,
defaultValue: 'Alle Downloads ansehen',
admin: {
condition: (_, siblingData) => siblingData?.showAllDownloadsLink,
},
},
{
name: 'allDownloadsUrl',
type: 'text',
label: 'Link-URL',
defaultValue: '/downloads',
admin: {
condition: (_, siblingData) => siblingData?.showAllDownloadsLink,
},
},
],
}