# Custom Fields Implementation ## Überblick Das Custom Fields System wurde als erste Phase der flexiblen Mechaniken-Erweiterung für Worldream implementiert. Es ermöglicht Nutzern, eigene strukturierte Datenfelder zu beliebigen Content Nodes (Charaktere, Objekte, Orte, Geschichten) hinzuzufügen. ## Architektur ### Datenbankstruktur Die Implementierung nutzt PostgreSQL's JSONB-Felder für maximale Flexibilität: ```sql -- In content_nodes Tabelle custom_schema JSONB -- Feld-Definitionen custom_data JSONB -- Tatsächliche Werte schema_version INTEGER -- Versionierung für Migrationen -- Separate Tabelle für Templates custom_field_templates -- Wiederverwendbare Feld-Konfigurationen ``` **Designentscheidung**: JSONB wurde gewählt, da es: - Flexible Schema-Evolution ohne Migrationen ermöglicht - Effiziente Queries und Indexierung unterstützt - Type-Safety auf Anwendungsebene erlaubt - Einfaches Backup und Export ermöglicht ### Type System Das TypeScript Type System (`/src/lib/types/customFields.ts`) definiert 11 Feldtypen: 1. **text** - Ein- oder mehrzeiliger Text mit optionaler Längen-Validierung 2. **number** - Numerische Werte mit Min/Max und Einheiten 3. **range** - Slider für Werte in einem bestimmten Bereich 4. **select** - Dropdown mit vordefinierten Optionen 5. **multiselect** - Mehrfachauswahl aus Optionen 6. **boolean** - Ja/Nein Checkbox 7. **date** - Datumseingabe 8. **formula** - Berechnete Felder basierend auf anderen Feldern 9. **reference** - Verweise auf andere Nodes (@slug) 10. **list** - Dynamische Listen von Elementen 11. **json** - Strukturierte JSON-Daten für komplexe Konfigurationen ### Komponenten-Architektur ``` CustomFieldsManager.svelte (Haupt-Container) ├── Tab: Daten │ └── CustomDataForm.svelte (Formular-Rendering) ├── Tab: Schema │ └── FieldDefinitionEditor.svelte (Feld-Editor) └── Tab: Templates └── Template-Auswahl und -Anwendung CustomFieldsDisplay.svelte (Read-Only Anzeige) └── Kategorisierte Feld-Darstellung mit speziellen Visualisierungen ``` ## Implementierungsdetails ### 1. Schema-Definition Jedes Feld wird durch eine `CustomFieldDefinition` beschrieben: ```typescript interface CustomFieldDefinition { id: string; // Eindeutige ID key: string; // Technischer Schlüssel (z.B. "health_points") label: string; // Anzeigename (z.B. "Lebenspunkte") type: FieldType; // Feldtyp description?: string; // Hilfetext category?: string; // Gruppierung (z.B. "Kampfwerte") required?: boolean; // Pflichtfeld config: FieldConfig; // Typ-spezifische Konfiguration } ``` ### 2. Dynamisches Form-Rendering `CustomDataForm.svelte` generiert zur Laufzeit Formulare basierend auf dem Schema: ```typescript // Für jedes Feld im Schema for (const field of schema.fields) { // Rendere passendes Input-Element basierend auf field.type switch(field.type) { case 'text': renderTextField(field, value); case 'number': renderNumberField(field, value); // ... weitere Typen } } ``` **Besonderheiten**: - Echtzeit-Validierung basierend auf Feld-Konfiguration - Abhängigkeits-Tracking für Formula-Felder - Kategorisierte Darstellung für bessere UX ### 3. Template-System Templates lösen das "Cold Start" Problem: ```typescript interface CustomFieldTemplate { id: string; name: string; description: string; applicable_to: string[]; // ['character', 'object', etc.] fields: CustomFieldDefinition[]; tags: string[]; is_public: boolean; usage_count: number; } ``` **Mitgelieferte Templates**: - **Basic Stats**: Grundlegende Attribute (Stärke, Geschicklichkeit, etc.) - **Inventory**: Item-Verwaltung mit Gewicht und Anzahl - **Relationships**: Beziehungs-Tracking mit Vertrauen und Notizen ### 4. API-Endpoints ``` PUT /api/nodes/[slug]/schema - Speichert/Aktualisiert Schema - Validiert Feld-Definitionen - Erhöht Schema-Version PUT /api/nodes/[slug]/custom-data - Speichert Feld-Daten - Validiert gegen Schema - Berechnet Formula-Felder GET /api/templates - Listet verfügbare Templates - Filtert nach applicable_to ``` ### 5. Sicherheit - **Row-Level Security (RLS)**: Nur Besitzer können Schema/Daten ändern - **Validierungsfunktionen**: PostgreSQL-seitige Schema-Validierung - **Permission Checks**: API prüft Besitz vor Änderungen ## Verwendung ### Als Nutzer 1. **Felder hinzufügen**: - Navigiere zu einem Node (z.B. Charakter) - Klicke auf "Bearbeiten" - Wechsle zum Tab "Benutzerdefinierte Felder" - Tab "Felder verwalten" → "Neues Feld" 2. **Template anwenden**: - Tab "Vorlagen" - Wähle passendes Template - Klicke "Anwenden" 3. **Daten eingeben**: - Tab "Daten" - Fülle Felder aus - Speichern ### Als Entwickler ```typescript // Schema abrufen const response = await fetch(`/api/nodes/${slug}/schema`); const { schema } = await response.json(); // Daten speichern await fetch(`/api/nodes/${slug}/custom-data`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ data: { health_points: 100, strength: 15 } }) }); ``` ## Technische Entscheidungen ### Warum JSONB statt separate Tabellen? **Vorteile**: - Keine Schema-Migrationen bei neuen Feldtypen - Einfacher Import/Export - Flexible Struktur-Evolution - Atomare Updates **Nachteile** (und Lösungen): - Keine SQL-Constraints → Anwendungs-Validierung - Komplexere Queries → PostgreSQL JSON-Funktionen - Type-Safety → TypeScript + Validierung ### Warum Svelte 5 Runes? ```svelte ``` **Vorteile**: - Bessere TypeScript-Integration - Klarere Reaktivitäts-Semantik - Zukunftssicher für Svelte 5+ ### Warum keine Formula-Evaluation im Frontend? **Sicherheit**: Formula-Evaluation erfolgt später serverseitig **Performance**: Verhindert DoS durch komplexe Formeln **Konsistenz**: Zentrale Berechnung vermeidet Inkonsistenzen ## Performance-Optimierungen 1. **Lazy Loading**: Templates werden nur bei Bedarf geladen 2. **Debounced Saves**: Auto-Save mit 500ms Verzögerung 3. **Field Grouping**: Kategorien reduzieren visuelle Komplexität 4. **Selective Rendering**: Nur sichtbare Tabs werden gerendert ## Erweiterungsmöglichkeiten ### Kurzfristig (Phase 2) - Formula-Evaluation implementieren - Erweiterte Validierungs-Regeln - Bulk-Operations für mehrere Nodes - Import/Export von Schemas ### Mittelfristig (Phase 3-4) - Visuelle Schema-Designer - Abhängige Felder (Conditional Logic) - Berechnete Aggregationen - Schema-Vererbung ### Langfristig - KI-generierte Schemas basierend auf Beschreibungen - Cross-Node Formeln - Versionierte Daten-Historie - GraphQL-API für Custom Fields ## Bekannte Einschränkungen 1. **Formula-Felder**: Noch nicht funktional (Platzhalter) 2. **Reference-Felder**: Einfache Text-Eingabe statt Node-Picker 3. **Schema-Migration**: Manuelle Daten-Anpassung bei Schema-Änderungen 4. **Performance**: Bei >100 Feldern merkbare Verzögerung 5. **Mobile UX**: Tabs nicht optimal auf kleinen Bildschirmen ## Testing ### Unit Tests (geplant) ```typescript // Validierung expect(validateFieldKey('health_points')).toBe(true); expect(validateFieldKey('Health Points')).toBe(false); // Schema-Erstellung const schema = createEmptySchema(); expect(schema.fields).toHaveLength(0); expect(schema.version).toBe(1); ``` ### Integration Tests (geplant) - Schema-Speicherung und -Abruf - Daten-Validierung gegen Schema - Template-Anwendung - Permission-Checks ## Migration von Legacy-Daten Falls zukünftig Daten aus anderen Systemen importiert werden: ```typescript // Migration Helper (Beispiel) function migrateToCustomFields(legacyData: any): CustomFieldData { return { // Map alte Felder zu neuen Keys health_points: legacyData.hp || 100, strength: legacyData.str || 10, // ... }; } ``` ## Troubleshooting ### "Cannot apply unknown utility class" **Problem**: Tailwind-Theme-Klassen nicht gefunden **Lösung**: Verwende korrekte Theme-Präfixe (`bg-theme-bg-surface` statt `bg-theme-surface`) ### Schema wird nicht gespeichert **Mögliche Ursachen**: 1. Fehlende Authentifizierung 2. RLS-Policy blockiert 3. Ungültiges Schema-Format **Debug**: ```typescript // Prüfe Response const response = await fetch(...); if (!response.ok) { const error = await response.json(); console.error('Schema save failed:', error); } ``` ### Felder werden nicht angezeigt **Checkliste**: 1. Schema erfolgreich geladen? 2. Daten vorhanden? 3. Kategorien korrekt zugeordnet? 4. Komponente korrekt importiert? ## Zusammenfassung Das Custom Fields System bietet eine solide Grundlage für flexible, nutzerdefinierte Mechaniken in Worldream. Die JSONB-basierte Architektur ermöglicht schnelle Iteration und Erweiterung ohne Datenbankmigrationen. Mit 11 Feldtypen und einem Template-System können Nutzer sofort produktiv werden. Die nächsten Schritte fokussieren sich auf: 1. Formula-Evaluation 2. Verbesserte Reference-Felder 3. Mobile Optimierung 4. Performance bei großen Schemas Das System ist bewusst einfach gehalten, um schnelles Feedback zu ermöglichen und die Richtung basierend auf Nutzer-Bedürfnissen anzupassen.