# Feature Plan: Image Description (Bildbeschreibung) **Branch:** `feature/ImageDescription` **Datum:** 7. November 2025 **Status:** ✅ Implementiert (bereit für Testing) --- ## 📋 Übersicht Implementierung einer individuellen Bildbeschreibung für jedes hochgeladene Bild. Benutzer können optional einen kurzen Text (max. 200 Zeichen) für jedes Bild hinzufügen, der dann in der Slideshow und in der GroupsOverviewPage angezeigt wird. ### Hauptänderungen 1. **Button-Änderung:** "Sort" Button wird durch "Edit" Button ersetzt in `ImageGalleryCard.js` 2. **Edit-Modus:** Aktiviert Textfelder unter jedem Bild zur Eingabe von Bildbeschreibungen 3. **Datenbank-Erweiterung:** Neues Feld `image_description` in der `images` Tabelle 4. **Backend-API:** Neue Endpoints zum Speichern und Abrufen von Bildbeschreibungen 5. **Frontend-Integration:** Edit-Modus in `MultiUploadPage.js` und `ModerationGroupImagesPage.js` 6. **Slideshow-Integration:** Anzeige der Bildbeschreibungen während der Slideshow 7. **Groups-Overview:** Anzeige von Bildbeschreibungen in der öffentlichen Übersicht --- ## 🎯 Anforderungen ### Funktionale Anforderungen - ✅ Benutzer können für jedes Bild eine optionale Beschreibung eingeben - ✅ Maximale Länge: 200 Zeichen - ✅ Edit-Button ersetzt Sort-Button in Preview-Modus - ✅ Edit-Modus zeigt Textfelder unter allen Bildern gleichzeitig - ✅ Vorbefüllung mit Original-Dateinamen als Platzhalter - ✅ Funktioniert in `MultiUploadPage.js` und `ModerationGroupImagesPage.js` - ✅ NICHT in `GroupsOverviewPage.js` (nur Anzeige, kein Edit) - ✅ Bildbeschreibungen werden in Slideshow angezeigt - ✅ Bildbeschreibungen werden in GroupsOverviewPage angezeigt - ✅ Speicherung in Datenbank (persistente Speicherung) ### Nicht-Funktionale Anforderungen - ✅ Performance: Keine merkbare Verzögerung beim Laden von Bildern - ✅ UX: Intuitive Bedienung des Edit-Modus - ✅ Mobile-Optimierung: Touch-freundliche Textfelder - ✅ Validierung: Client- und Server-seitige Längenbegrenzung - ✅ Backward-Kompatibilität: Bestehende Bilder ohne Beschreibung funktionieren weiterhin --- ## 🗄️ Datenbank-Schema Änderungen ### Migration: `004_add_image_description.sql` ```sql -- Add image_description column to images table ALTER TABLE images ADD COLUMN image_description TEXT; -- Create index for better performance when filtering/searching CREATE INDEX IF NOT EXISTS idx_images_description ON images(image_description); ``` ### Aktualisiertes Schema (`images` Tabelle) ```sql CREATE TABLE images ( id INTEGER PRIMARY KEY AUTOINCREMENT, group_id TEXT NOT NULL, file_name TEXT NOT NULL, original_name TEXT NOT NULL, file_path TEXT NOT NULL, upload_order INTEGER NOT NULL, file_size INTEGER, mime_type TEXT, preview_path TEXT, image_description TEXT, -- ← NEU: Optional, max 200 Zeichen created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (group_id) REFERENCES groups(group_id) ON DELETE CASCADE ); ``` --- ## 🔧 Backend-Änderungen ### 1. Datenbank-Migration **Datei:** `backend/src/database/migrations/004_add_image_description.sql` - Fügt `image_description` Spalte zur `images` Tabelle hinzu - Erstellt Index für Performance-Optimierung ### 2. API-Erweiterungen #### A) Bestehende Endpoints erweitern **`POST /api/upload/batch`** - Akzeptiert `imageDescriptions` Array im Request Body - Format: `[{ fileName: string, description: string }, ...]` - Speichert Beschreibungen beim Upload **`GET /api/groups/:groupId`** - Gibt `image_description` für jedes Bild zurück - Backward-kompatibel (null/leer für alte Bilder) **`GET /moderation/groups/:groupId`** - Gibt `image_description` für jedes Bild zurück #### B) Neue Endpoints **`PATCH /groups/:groupId/images/:imageId`** - Aktualisiert `image_description` für einzelnes Bild - Payload: `{ image_description: string }` - Validierung: Max 200 Zeichen **`PATCH /groups/:groupId/images/batch-description`** - Aktualisiert mehrere Bildbeschreibungen auf einmal - Payload: `{ descriptions: [{ imageId: number, description: string }, ...] }` - Effizienter als einzelne Requests ### 3. Repository & Service Layer **`GroupRepository.js`** - Neue Methoden: ```javascript async updateImageDescription(imageId, description) async updateBatchImageDescriptions(groupId, descriptions) async getImagesByGroupId(groupId) // Erweitert um image_description ``` **`DatabaseManager.js`** - Query-Erweiterungen: - `SELECT` Queries inkludieren `image_description` - `INSERT` Queries akzeptieren `image_description` - `UPDATE` Queries für Beschreibungs-Updates --- ## 🎨 Frontend-Änderungen ### 1. ImageGalleryCard.js **Änderung:** Button "Sort" → "Edit" ```javascript // ALT (Zeile 174-179): // NEU: ``` **Neue Props:** - `onEditMode`: Callback-Funktion zum Aktivieren des Edit-Modus - `isEditMode`: Boolean für aktuellen Edit-Status - `imageDescription`: String mit Bildbeschreibung - `onDescriptionChange`: Callback für Beschreibungsänderungen **Edit-Modus UI:** ```jsx {isEditMode && mode === 'preview' && (