diff --git a/docs/anleitungen/UNIVERSAL_FEATURES.md b/docs/anleitungen/UNIVERSAL_FEATURES.md index 2d00da4..90e8b18 100644 --- a/docs/anleitungen/UNIVERSAL_FEATURES.md +++ b/docs/anleitungen/UNIVERSAL_FEATURES.md @@ -1,8 +1,59 @@ # Universal Features - Dokumentation +*Letzte Aktualisierung: 18. Dezember 2025* + ## Übersicht -Die Universal Features erweitern das Payload CMS um wiederverwendbare Collections und Blocks für Blog, News, Testimonials, Newsletter und Prozess-Darstellungen. Alle Features sind Multi-Tenant-fähig. +Die Universal Features erweitern das Payload CMS um wiederverwendbare Collections und Blocks für Blog, News, Testimonials, Newsletter, FAQ, Team und Prozess-Darstellungen. Alle Features sind Multi-Tenant-fähig. + +**Wichtig:** Frontends verwenden die **Production-API** (cms.c2sgmbh.de). + +--- + +## API-Endpoints für Frontend + +### Collections + +| Collection | Endpoint | Beschreibung | +|------------|----------|--------------| +| Posts | `GET /api/posts` | Blog, News, Presse | +| Testimonials | `GET /api/testimonials` | Kundenbewertungen | +| FAQs | `GET /api/faqs` | FAQ-Einträge | +| Team | `GET /api/team` | Team-Mitglieder | +| Services | `GET /api/services` | Leistungen | +| Timelines | `GET /api/timelines` | Chronologische Events | +| Workflows | `GET /api/workflows` | Prozess-Darstellungen | + +### Beispiel: Posts laden + +```typescript +// Featured Blog-Posts für Tenant C2S laden +const posts = await fetch( + 'https://cms.c2sgmbh.de/api/posts?where[tenant][equals]=4&where[type][equals]=blog&where[isFeatured][equals]=true&locale=de&limit=6' +).then(r => r.json()) +``` + +### Newsletter API + +| Endpoint | Methode | Beschreibung | +|----------|---------|--------------| +| `/api/newsletter/subscribe` | POST | Newsletter-Anmeldung | +| `/api/newsletter/confirm` | GET/POST | Double Opt-In Bestätigung | +| `/api/newsletter/unsubscribe` | GET/POST | Abmeldung | + +```typescript +// Newsletter-Anmeldung +const response = await fetch('https://cms.c2sgmbh.de/api/newsletter/subscribe', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + email: 'user@example.com', + firstName: 'Max', + tenantId: 4, + source: 'footer' + }) +}) +``` --- @@ -31,7 +82,7 @@ Die Posts Collection dient zur Verwaltung von Blog-Artikeln, News, Pressemitteil | `author` | Text | Autorname | Nein | | `status` | Select | draft/published/archived | Nein | | `publishedAt` | Date | Veröffentlichungsdatum | Nein | -| `seo` | Group | SEO-Einstellungen | Nein | +| `meta` | Group | SEO-Einstellungen | Nein | #### Post-Typen @@ -40,11 +91,6 @@ Die Posts Collection dient zur Verwaltung von Blog-Artikeln, News, Pressemitteil - `press` - Pressemitteilung - `announcement` - Ankündigung -#### Access Control - -- **Read:** Öffentlich für veröffentlichte Beiträge des eigenen Tenants -- **Create/Update/Delete:** Nur authentifizierte Benutzer - --- ### 2. Testimonials Collection @@ -71,11 +117,6 @@ Kundenstimmen und Bewertungen für Referenz-Seiten. | `isActive` | Checkbox | Sichtbarkeit | Nein | | `order` | Number | Sortierung | Nein | -#### Access Control - -- **Read:** Öffentlich für aktive Testimonials des eigenen Tenants -- **Create/Update/Delete:** Nur authentifizierte Benutzer - --- ### 3. Newsletter Subscribers Collection @@ -84,7 +125,7 @@ Kundenstimmen und Bewertungen für Referenz-Seiten. **Slug:** `newsletter-subscribers` **Admin-Gruppe:** Marketing -DSGVO-konforme Speicherung von Newsletter-Anmeldungen mit Double Opt-In Support. +DSGVO-konforme Speicherung von Newsletter-Anmeldungen mit Double Opt-In. #### Felder @@ -103,6 +144,14 @@ DSGVO-konforme Speicherung von Newsletter-Anmeldungen mit Double Opt-In Support. | `ipAddress` | Text | IP-Adresse (DSGVO) | Nein | | `userAgent` | Text | Browser-Info | Nein | +#### Double Opt-In Flow + +1. User meldet sich an → Status: `pending`, Token generiert +2. E-Mail mit Bestätigungs-Link wird automatisch gesendet +3. User klickt Link → Status: `confirmed` +4. Willkommens-E-Mail wird gesendet +5. Abmeldung jederzeit über Link möglich + #### Status-Werte - `pending` - Ausstehend (Double Opt-In) @@ -110,29 +159,124 @@ DSGVO-konforme Speicherung von Newsletter-Anmeldungen mit Double Opt-In Support. - `unsubscribed` - Abgemeldet - `bounced` - E-Mail nicht zustellbar -#### Interessen-Optionen +--- -- `general` - Allgemeine Updates -- `blog` - Blog-Artikel -- `products` - Produkt-News -- `offers` - Angebote & Aktionen -- `events` - Events +### 4. FAQs Collection -#### Access Control +**Pfad:** `src/collections/FAQs.ts` +**Slug:** `faqs` +**Admin-Gruppe:** Content -- **Read:** Nur authentifizierte Benutzer (Datenschutz!) -- **Create:** Öffentlich (für Anmeldungen) -- **Update/Delete:** Nur authentifizierte Benutzer +Häufig gestellte Fragen mit Kategorisierung. -#### Automatische Hooks +#### Felder -Bei der Erstellung wird automatisch: -- `subscribedAt` auf aktuelles Datum gesetzt -- `confirmationToken` generiert (UUID) +| Feld | Typ | Beschreibung | Pflicht | +|------|-----|--------------|---------| +| `question` | Text | Frage | Ja | +| `answer` | RichText | Antwort | Ja | +| `category` | Text | Kategorie | Nein | +| `order` | Number | Sortierung | Nein | +| `isActive` | Checkbox | Sichtbarkeit | Nein | -Bei Status-Änderungen: -- `confirmedAt` wird gesetzt bei Wechsel zu "confirmed" -- `unsubscribedAt` wird gesetzt bei Wechsel zu "unsubscribed" +--- + +### 5. Team Collection + +**Pfad:** `src/collections/Team.ts` +**Slug:** `team` +**Admin-Gruppe:** Content + +Team-Mitglieder und Mitarbeiter. + +#### Felder + +| Feld | Typ | Beschreibung | Pflicht | +|------|-----|--------------|---------| +| `name` | Text | Name | Ja | +| `role` | Text | Position/Rolle | Nein | +| `image` | Upload | Portrait-Foto | Nein | +| `bio` | Textarea | Kurzbiografie | Nein | +| `email` | Email | E-Mail-Adresse | Nein | +| `phone` | Text | Telefon | Nein | +| `socialLinks` | Array | Social Media Links | Nein | +| `order` | Number | Sortierung | Nein | +| `isActive` | Checkbox | Sichtbarkeit | Nein | + +--- + +### 6. Services Collection + +**Pfad:** `src/collections/Services.ts` +**Slug:** `services` +**Admin-Gruppe:** Content + +Leistungen und Dienstleistungen. + +#### Felder + +| Feld | Typ | Beschreibung | Pflicht | +|------|-----|--------------|---------| +| `title` | Text | Leistungsname | Ja | +| `slug` | Text | URL-Pfad | Ja | +| `excerpt` | Textarea | Kurzbeschreibung | Nein | +| `content` | RichText | Detailbeschreibung | Nein | +| `icon` | Text | Icon-Name | Nein | +| `image` | Upload | Bild | Nein | +| `category` | Relationship | Service-Kategorie | Nein | +| `order` | Number | Sortierung | Nein | + +--- + +### 7. Timelines Collection + +**Pfad:** `src/collections/Timelines.ts` +**Slug:** `timelines` +**Admin-Gruppe:** Content + +Chronologische Events für Geschichte, Meilensteine, Releases. + +#### API + +```typescript +// Timeline laden +fetch('https://cms.c2sgmbh.de/api/timelines?tenant=4&slug=company-history&locale=de') +``` + +#### Timeline-Typen + +- `history` - Unternehmensgeschichte +- `milestones` - Projektmeilensteine +- `releases` - Produkt-Releases +- `career` - Karriere/Lebenslauf +- `events` - Ereignisse +- `process` - Prozess/Ablauf + +--- + +### 8. Workflows Collection + +**Pfad:** `src/collections/Workflows.ts` +**Slug:** `workflows` +**Admin-Gruppe:** Content + +Komplexe Prozesse mit Phasen, Abhängigkeiten und Status-Tracking. + +#### API + +```typescript +// Workflow laden +fetch('https://cms.c2sgmbh.de/api/workflows?tenant=4&type=project&locale=de') +``` + +#### Workflow-Typen + +- `project` - Projektabläufe +- `business` - Geschäftsprozesse +- `approval` - Genehmigungs-Workflows +- `onboarding` - Mitarbeiter-/Kundeneinführung +- `support` - Support/Service-Prozesse +- `development` - Entwicklungsprozesse --- @@ -140,6 +284,19 @@ Bei Status-Änderungen: Alle Blocks können in der Pages Collection verwendet werden. +### Block-Übersicht + +| Block | Slug | Beschreibung | +|-------|------|--------------| +| Posts List | `posts-list-block` | Blog/News-Liste | +| Testimonials | `testimonials-block` | Kundenstimmen | +| Newsletter | `newsletter-block` | Anmeldeformular | +| Process Steps | `process-steps-block` | Prozess-Schritte | +| Timeline | `timeline-block` | Chronologie | +| FAQ | `faq-block` | FAQ-Akkordeon | +| Team | `team-block` | Team-Mitglieder | +| Services | `services-block` | Leistungen | + ### 1. Posts List Block **Slug:** `posts-list-block` @@ -164,8 +321,6 @@ Zeigt eine Liste von Blog-Artikeln, News oder anderen Post-Typen an. | `showCategory` | Checkbox | true | Kategorie anzeigen | | `showPagination` | Checkbox | false | Pagination | | `showReadMore` | Checkbox | true | "Alle anzeigen" Link | -| `readMoreLabel` | Text | "Alle Beiträge anzeigen" | Link-Text | -| `readMoreLink` | Text | /blog | Ziel-URL | | `backgroundColor` | Select | white | Hintergrundfarbe | #### Layout-Optionen @@ -184,25 +339,6 @@ Zeigt eine Liste von Blog-Artikeln, News oder anderen Post-Typen an. Zeigt Kundenstimmen aus der Testimonials Collection. -#### Konfigurationsoptionen - -| Option | Typ | Standard | Beschreibung | -|--------|-----|----------|--------------| -| `title` | Text | "Das sagen unsere Kunden" | Überschrift | -| `subtitle` | Text | - | Untertitel | -| `layout` | Select | slider | Darstellung | -| `columns` | Select | 3 | Spalten (bei Grid) | -| `displayMode` | Select | all | Auswahl-Modus | -| `selectedTestimonials` | Relationship | - | Handverlesene Auswahl | -| `limit` | Number | 6 | Max. Anzahl | -| `showRating` | Checkbox | true | Sterne anzeigen | -| `showImage` | Checkbox | true | Foto anzeigen | -| `showCompany` | Checkbox | true | Unternehmen anzeigen | -| `showSource` | Checkbox | false | Quelle anzeigen | -| `autoplay` | Checkbox | true | Auto-Wechsel (Slider) | -| `autoplaySpeed` | Number | 5000 | Wechselintervall (ms) | -| `backgroundColor` | Select | light | Hintergrundfarbe | - #### Layout-Optionen - `slider` - Karussell @@ -219,27 +355,6 @@ Zeigt Kundenstimmen aus der Testimonials Collection. Anmeldeformular für Newsletter mit DSGVO-Hinweis. -#### Konfigurationsoptionen - -| Option | Typ | Standard | Beschreibung | -|--------|-----|----------|--------------| -| `title` | Text | "Newsletter abonnieren" | Überschrift | -| `subtitle` | Textarea | Standard-Text | Beschreibung | -| `layout` | Select | inline | Formular-Layout | -| `image` | Upload | - | Bild (bei with-image) | -| `imagePosition` | Select | left | Bildposition | -| `collectName` | Checkbox | false | Name abfragen | -| `showInterests` | Checkbox | false | Interessen anzeigen | -| `availableInterests` | Select (hasMany) | - | Verfügbare Interessen | -| `buttonText` | Text | "Anmelden" | Button-Text | -| `placeholderEmail` | Text | "Ihre E-Mail-Adresse" | Placeholder | -| `successMessage` | Textarea | Standard-Text | Erfolgsmeldung | -| `errorMessage` | Text | Standard-Text | Fehlermeldung | -| `privacyText` | Textarea | Standard-Text | Datenschutz-Hinweis | -| `privacyLink` | Text | /datenschutz | Link zur DSE | -| `source` | Text | website | Tracking-Quelle | -| `backgroundColor` | Select | accent | Hintergrundfarbe | - #### Layout-Optionen - `inline` - Eingabe + Button nebeneinander @@ -250,85 +365,54 @@ Anmeldeformular für Newsletter mit DSGVO-Hinweis. --- -### 4. Process Steps Block +### 4. FAQ Block -**Slug:** `process-steps-block` +**Slug:** `faq-block` -Zeigt Prozess-Schritte / "So funktioniert es" Darstellungen. +FAQ-Akkordeon mit Schema.org Markup. #### Konfigurationsoptionen -| Option | Typ | Standard | Beschreibung | -|--------|-----|----------|--------------| -| `title` | Text | "So funktioniert es" | Überschrift | -| `subtitle` | Text | - | Untertitel | -| `layout` | Select | horizontal | Darstellung | -| `showNumbers` | Checkbox | true | Schritt-Nummern | -| `showIcons` | Checkbox | true | Icons anzeigen | -| `steps` | Array | - | Schritte (2-10) | -| `cta.show` | Checkbox | false | CTA anzeigen | -| `cta.label` | Text | "Jetzt starten" | Button-Text | -| `cta.href` | Text | - | Button-Link | -| `cta.variant` | Select | default | Button-Stil | -| `backgroundColor` | Select | white | Hintergrundfarbe | - -#### Schritte-Felder - -- `title` - Schritt-Titel (Pflicht) -- `description` - Beschreibung -- `icon` - Emoji oder Icon-Name -- `image` - Optionales Bild - -#### Layout-Optionen - -- `horizontal` - Nebeneinander -- `vertical` - Untereinander -- `alternating` - Zickzack -- `connected` - Mit Verbindungslinien -- `timeline` - Timeline-Stil +| Option | Typ | Beschreibung | +|--------|-----|--------------| +| `title` | Text | Überschrift | +| `subtitle` | Text | Untertitel | +| `displayMode` | Select | all / selected / byCategory | +| `selectedFaqs` | Relationship | Handverlesene FAQs | +| `filterCategory` | Text | Kategorie-Filter | +| `layout` | Select | accordion / list / grid | +| `expandFirst` | Checkbox | Erste FAQ offen | +| `showSchema` | Checkbox | JSON-LD generieren | --- -### 5. Timeline Block +### 5. Team Block -**Slug:** `timeline-block` +**Slug:** `team-block` -Chronologische Darstellung von Ereignissen (z.B. Firmengeschichte). - -#### Konfigurationsoptionen - -| Option | Typ | Standard | Beschreibung | -|--------|-----|----------|--------------| -| `title` | Text | - | Überschrift | -| `subtitle` | Text | - | Untertitel | -| `layout` | Select | vertical | Darstellung | -| `showConnector` | Checkbox | true | Verbindungslinie | -| `markerStyle` | Select | dot | Marker-Stil | -| `items` | Array | - | Einträge | -| `backgroundColor` | Select | white | Hintergrundfarbe | - -#### Einträge-Felder - -- `year` - Jahr/Datum -- `title` - Titel (Pflicht) -- `description` - Beschreibung -- `icon` - Emoji oder Icon -- `image` - Optionales Bild -- `link.label` - Link-Text -- `link.href` - Link-URL +Team-Mitglieder aus der Team Collection. #### Layout-Optionen -- `vertical` - Standard vertikal -- `alternating` - Links/Rechts wechselnd -- `horizontal` - Horizontale Zeitleiste +- `grid` - Karten im Grid +- `list` - Listenansicht +- `carousel` - Karussell +- `compact` - Kompakt -#### Marker-Stile +--- -- `dot` - Punkt -- `number` - Nummer -- `icon` - Icon -- `date` - Jahr/Datum +### 6. Services Block + +**Slug:** `services-block` + +Leistungen aus der Services Collection. + +#### Layout-Optionen + +- `grid` - Karten im Grid +- `list` - Listenansicht mit Details +- `icons` - Icon-Grid +- `tabs` - Tab-Navigation --- @@ -344,6 +428,11 @@ multiTenantPlugin({ posts: {}, testimonials: {}, 'newsletter-subscribers': {}, + faqs: {}, + team: {}, + services: {}, + timelines: {}, + workflows: {}, // ... weitere Collections }, }) @@ -351,10 +440,18 @@ multiTenantPlugin({ ### Tenant-Zuordnung -Jedes Dokument enthält ein `tenant`-Feld, das auf die Tenants-Collection verweist. Die Access-Control-Funktionen in `src/lib/tenantAccess.ts` sorgen für die Isolation: +Jedes Dokument enthält ein `tenant`-Feld. Die Access-Control sorgt für Isolation: - **Authentifizierte Admins:** Sehen alle Dokumente -- **Anonyme Requests:** Nur Dokumente des Tenants, der zur Domain passt +- **Anonyme Requests:** Nur Dokumente des passenden Tenants + +### Tenant-IDs + +| ID | Name | Slug | +|----|------|------| +| 1 | porwoll.de | porwoll | +| 4 | Complex Care Solutions GmbH | c2s | +| 5 | Gunshin | gunshin | --- @@ -363,38 +460,83 @@ Jedes Dokument enthält ein `tenant`-Feld, das auf die Tenants-Collection verwei ``` src/ ├── collections/ -│ ├── Posts.ts # Blog/News Collection -│ ├── Testimonials.ts # Kundenstimmen -│ └── NewsletterSubscribers.ts # Newsletter-Anmeldungen +│ ├── Posts.ts +│ ├── Categories.ts +│ ├── Testimonials.ts +│ ├── NewsletterSubscribers.ts +│ ├── FAQs.ts +│ ├── Team.ts +│ ├── Services.ts +│ ├── ServiceCategories.ts +│ ├── Timelines.ts +│ └── Workflows.ts ├── blocks/ -│ ├── PostsListBlock.ts # Blog/News-Liste -│ ├── TestimonialsBlock.ts # Testimonials-Anzeige -│ ├── NewsletterBlock.ts # Newsletter-Formular -│ ├── ProcessStepsBlock.ts # Prozess-Schritte -│ ├── TimelineBlock.ts # Timeline -│ └── index.ts # Block-Exports +│ ├── PostsListBlock.ts +│ ├── TestimonialsBlock.ts +│ ├── NewsletterBlock.ts +│ ├── ProcessStepsBlock.ts +│ ├── TimelineBlock.ts +│ ├── FAQBlock.ts +│ ├── TeamBlock.ts +│ ├── ServicesBlock.ts +│ └── index.ts ├── lib/ -│ └── tenantAccess.ts # Access-Control-Funktionen -└── payload.config.ts # Haupt-Konfiguration +│ ├── tenantAccess.ts +│ └── email/ +│ ├── newsletter-service.ts +│ └── newsletter-templates.ts +├── hooks/ +│ └── sendNewsletterConfirmation.ts +└── app/(payload)/api/newsletter/ + ├── subscribe/route.ts + ├── confirm/route.ts + └── unsubscribe/route.ts ``` --- -## Datenbank-Tabellen +## URLs -| Tabelle | Beschreibung | -|---------|--------------| -| `posts` | Blog/News-Beiträge | -| `posts_rels` | Kategorien-Beziehungen | -| `testimonials` | Kundenstimmen | -| `newsletter_subscribers` | Newsletter-Anmeldungen | -| `newsletter_subscribers_interests` | Interessen (hasMany) | -| `pages_rels` | Block-Relationships | +### Production (für Frontends) + +| Resource | URL | +|----------|-----| +| Posts API | https://cms.c2sgmbh.de/api/posts | +| Testimonials API | https://cms.c2sgmbh.de/api/testimonials | +| FAQs API | https://cms.c2sgmbh.de/api/faqs | +| Team API | https://cms.c2sgmbh.de/api/team | +| Services API | https://cms.c2sgmbh.de/api/services | +| Timelines API | https://cms.c2sgmbh.de/api/timelines | +| Workflows API | https://cms.c2sgmbh.de/api/workflows | +| Newsletter Subscribe | https://cms.c2sgmbh.de/api/newsletter/subscribe | + +### Development + +| Resource | URL | +|----------|-----| +| API Base | https://pl.porwoll.tech/api | +| Admin Panel | https://pl.porwoll.tech/admin | --- ## Changelog +### Version 1.2 (18.12.2025) + +- Dokumentation auf Production-URLs aktualisiert +- API-Endpoints für Frontend hinzugefügt +- Newsletter Double Opt-In Flow dokumentiert +- Timelines und Workflows Collections hinzugefügt +- FAQ, Team, Services Blocks dokumentiert + +### Version 1.1 (14.12.2025) + +- Timelines Collection für chronologische Darstellungen +- Workflows Collection für Prozesse +- FAQs Collection mit Kategorisierung +- Team Collection mit Social Links +- Services Collection mit Kategorien + ### Version 1.0 (30.11.2025) - Posts Collection um `type`, `isFeatured`, `excerpt` erweitert @@ -402,4 +544,7 @@ src/ - NewsletterSubscribers Collection erstellt (DSGVO-konform) - 5 neue Blocks für Pages implementiert - Multi-Tenant Integration für alle Collections -- Migration `20251130_135459` erstellt und angewendet + +--- + +*Letzte Aktualisierung: 18. Dezember 2025*