words_pictures M2M-Relationen werden idempotent beim POST eingerichtet –
kein manueller Setup-Call nötig.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Einmaliger Setup-Endpoint: setzt special=m2m auf Alias-Felder,
erstellt Relations für words_pictures Junction in Directus.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_find_or_create_word gibt is_new zurück; bei is_new=False wird das Level
via PATCH aktualisiert. _ensure_link läuft immer → Picture-Junction wird
auch für bereits existierende Wörter angelegt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rechte Sidebar in zwei Frames aufgeteilt: Objects (bisherig) + Words (neu)
- Words-Frame: Wörter + Level (1–100) per Bild anlegen, dedupliziert via words_pictures Junction
- Pending-Words in Primary-Farbe mit inline Level-Edit, gespeicherte Words in neutralem Grau
- Save-Button speichert alle pending Words nach Directus (status=draft, title_de, level, picture-Link)
- Automatisches Laden der Bild-Words bei Bildwechsel
- Backend: GET/POST /api/directus/pictures/<pic_id>/words (words_pictures Junction, _find_or_create_word)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Purge lief parallel zum Reload – Fragen wurden vor der Bereinigung geladen.
Globaler Bereinigen-Button lädt jetzt auch direkt neu.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Backend: DELETE question/word räumt alle Junction-Zeilen mit auf
- Backend: /purge-orphans bereinigt verwaiste Junctions per Objekt
- Frontend: reloadQW ruft purgeOrphans vor dem Neu-Laden auf
- Frontend: ↺-Button in Wörter- und Fragen-Sidebar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Neue Endpoints: GET /api/object/<id>/questions+words, DELETE /api/question/<id>, DELETE /api/word/<id>
- GenerateIt: Wörter-Sidebar mit ×-Chips, Fragen-Sidebar mit Level-Badge und ×
- Laden beim Objekt-Wechsel und nach Generate it
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Cache all words globally across levels (avoids 500+ Directus calls)
- Add Procfile with --timeout 300 to prevent gunicorn killing long requests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Canvas-Struktur identisch zu DrawIt (canvas-area > canvas-frame > DrawCanvas)
→ kein Schrumpfen beim Bild-Wechsel mehr
- Prompt-Editor als absolute Leiste am unteren Rand des Canvas-Bereichs
- Eingeklappt: zeigt Titel + Layout-Name + Aktionen
- Ausgeklappt: Textarea + Speichern-Dialog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Objekte per DrawCanvas (readOnly) mit Markierung des gewählten Objekts
- Neues GenerateObjectsList: user_notes als Titel, Kinder eingerückt mit ↳
- Keine Hierarchy-/Parent-Dropdowns mehr auf der Generieren-Seite
- DrawCanvas: readOnly-Prop zum Deaktivieren von Maus-Events
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Details-Panel unter dem Bild entfernt
- Prompt-Editor unter dem Bild mit Layout-Speicherung (localStorage)
- Standard-Layout mit verbessertem Sprachlern-Prompt (10 Niveaus + Wortliste)
- Neue Wörter-Spalte (links neben Sätze) extrahiert Tokens aus Sätzen
- Sidebar --words CSS-Klasse ergänzt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- DrawIt: Button "Fertigstellen" unter Objektliste setzt Picture-Status auf drawing_created
- Bild verschwindet danach aus der Annotieren-Ansicht
- GenerateIt: lädt jetzt Directus-Bilder mit status=drawing_created
- GenerateIt: zeigt Bild-Vorschau + Directus-Objekte
- app.py: PATCH-Endpunkt für Pictures + Status-Parameter im GET
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- bbox und polygon Felder in Directus versteckt (Daten bleiben)
- Alle Auswahlen laufen nur noch über das selections-Feld
- CanvasObject, DirectusObject, API und Zeichenlogik umgestellt
- Objekte mit mehreren Auswahlen werden korrekt auf Canvas gezeichnet
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Neues JSON-Feld 'selections' in Directus objects-Collection
- Alle Auswahlen (bbox/polygon) landen in einem einzigen Objekt
- Erste Auswahl bleibt weiterhin in bbox/polygon für Kompatibilität
- GET-Proxy liefert selections-Feld mit aus
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Polygon ist jetzt der Standard-Modus beim Öffnen
- Neuer Button "Polygon schließen" erscheint im Polygon-Modus
- Button aktiviert sich nach dem 2. gesetzten Punkt
- Klick schließt das Polygon automatisch (kein Doppelklick mehr nötig)
- Auswahl hinzufügen schließt offenes Polygon ebenfalls automatisch
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Polygon kann nun mit ≥2 Punkten über den Button geschlossen werden
- Button zeigt "Polygon schließen & hinzufügen" solange Polygon offen ist
- Automatisches Schließen (Verbindung zum Startpunkt) beim Klick
- Einmalige Setup-Route /api/directus/setup-m2m entfernt (nicht mehr benötigt)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Bilder werden im Speicher gecacht (kein erneutes Laden beim Zurücknavigieren)
- Größenberechnung nutzt canvas-area statt canvas-frame als Referenz
→ Bilder werden nicht mehr bei jedem Bildwechsel kleiner
- Bild füllt den verfügbaren Bereich so groß wie möglich aus
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Login und Bildliste laufen jetzt über /api/directus/* statt direkt
zu db.hejyou.com – kein CORS-Problem mehr im Browser.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>