- Incremented application version to 0.7.9 and updated database schema version to 20260427030. - Revised project status documentation to reflect recent milestones and changes, including detailed logs of implemented features and next steps. - Enhanced API specifications for exercises, including support for exercise variants and improved query parameters. - Updated frontend routing to streamline exercise variant management within the ExerciseFormPage. - Implemented role-based media upload limits and refined search/filter specifications for better user experience.
118 lines
5.1 KiB
Markdown
118 lines
5.1 KiB
Markdown
# Gelieferte Features & technische Basis (April 2026)
|
||
|
||
**Stand:** 2026-04-27
|
||
**Referenz:** `backend/version.py` — **APP_VERSION 0.7.9**, **DB_SCHEMA_VERSION 20260427030**
|
||
|
||
Dieses Dokument bündelt die in der Entwicklungsphase erreichten **lieferbaren** Funktionen und die zugehörigen **technischen Artefakte**. Detail-Spezifikationen bleiben in den verlinkten Pfaden unter `.claude/docs/technical/` und `.claude/docs/functional/`.
|
||
|
||
---
|
||
|
||
## 1. Datenbank-Migrationen (Auswahl)
|
||
|
||
| Migration | Inhalt |
|
||
|-----------|--------|
|
||
| **028** | `exercise_media` erweitert (Embed/Metadaten), `exercise_skills` Level-Felder (VARCHAR); Medien-API |
|
||
| **029** | Kanonische Fähigkeitsstufen (basis–optimierung), `model_levels`-Namen |
|
||
| **030** | `training_unit_exercises.exercise_variant_id` → FK `exercise_variants(id)` ON DELETE SET NULL |
|
||
|
||
---
|
||
|
||
## 2. Backend – Übungen (`routers/exercises.py`)
|
||
|
||
### 2.1 Liste & Suche
|
||
|
||
- `GET /api/exercises` mit Filtern u. a.: Fokus, Stilrichtung, Trainingsstil, Zielgruppe, Fähigkeiten, **Skill-Stufe min/max**, `visibility_any`, `status_any`, `search`, **`ai_search`** (Platzhalter, derzeit gleiche Volltextlogik wie `search`).
|
||
- Optional: **`include_variants=true`** — liefert pro Übung ein kompaktes **`variants`**-JSON (id, variant_name, sequence_order) für Planung/UI.
|
||
|
||
### 2.2 Übungsvarianten (CRUD)
|
||
|
||
Implementiert gemäß **`EXERCISES_API_SPEC.md`** (Varianten-Abschnitt):
|
||
|
||
- `POST /api/exercises/{id}/variants`
|
||
- `PUT /api/exercises/{id}/variants/{variant_id}`
|
||
- `DELETE /api/exercises/{id}/variants/{variant_id}` (409, wenn andere Varianten diese als Voraussetzung nutzen)
|
||
- `PUT /api/exercises/{id}/variants/reorder` — `sequence_order` 1…n
|
||
|
||
Sortierung der Varianten im Detail: **`sequence_order`**, dann **`progression_level`**, dann **`id`**.
|
||
|
||
### 2.3 Medien-Upload – Größenlimits
|
||
|
||
- Standard: **50 MB** pro Datei (`EXERCISE_MEDIA_MAX_UPLOAD_MB`, Default 50).
|
||
- **`admin`** / **`superadmin`**: **1024 MB** Default (`EXERCISE_MEDIA_ADMIN_MAX_UPLOAD_MB`), nie unter dem Nutzer-Limit (in MB verglichen).
|
||
|
||
Logik: `_upload_limit_bytes(session)` vor `read()`-Prüfung.
|
||
|
||
---
|
||
|
||
## 3. Backend – Trainingsplanung (`routers/training_planning.py`)
|
||
|
||
- `training_unit_exercises`: Schreiben/Lesen von **`exercise_variant_id`**.
|
||
- Validierung: Variante muss zur gewählten **`exercise_id`** gehören.
|
||
- JOIN liefert u. a. **`exercise_variant_name`** beim Lesen einer Einheit.
|
||
|
||
---
|
||
|
||
## 4. Frontend – Übungsliste (`ExercisesListPage.jsx`)
|
||
|
||
- **Filter-Modal** (Fokus, Stilrichtung, Trainingsstil, Zielgruppe, Fähigkeit + Stufen von/bis, Sichtbarkeit, Status).
|
||
- **Filter-Chips** unter der Suchleiste; Klick entfernt einen Filter; Badge am Filter-Button = Anzahl Chips.
|
||
- **Kein Vollbild-Spinner** bei jeder Suche: nur noch **`listFetching`** — Suchfelder bleiben im DOM (**Fokus/Cursor** bleiben erhalten); Liste zeigt optional „Aktualisiere Treffer…“.
|
||
- **`<datalist>`** mit Titeln der aktuellen Treffer; **`autoComplete="on"`** für Browser-Vorschläge.
|
||
- **`api.listExercises`**: Booleans (z. B. `include_variants`) werden als Query übergeben.
|
||
|
||
---
|
||
|
||
## 5. Frontend – Übung bearbeiten (`ExerciseFormPage.jsx`)
|
||
|
||
- **Varianten-Editor**: eingeklappter Bereich (`<details>`), **eine Variante zur Zeit** über Dropdown oder „Neue Variante“; Felder über **`ExerciseVariantFields`**; Reihenfolge Nach oben/unten; Speichern/Löschen pro Variante.
|
||
- **Medien** wie zuvor (Formularteil).
|
||
|
||
Hinweis: Es gibt **keine** separaten Routen `/exercises/:id/variants/...` — Bearbeitung erfolgt unter **`/exercises/:id/edit`** (Routing-Doku ggf. anpassen).
|
||
|
||
---
|
||
|
||
## 6. Frontend – Übung Detail (`ExerciseDetailPage.jsx`)
|
||
|
||
- Varianten-Abschnitt mit **Meta** (Dauer, Schwierigkeit, Material, Progressionsstufe) wo vorhanden.
|
||
|
||
---
|
||
|
||
## 7. Frontend – Trainingsplanung (`TrainingPlanningPage.jsx`)
|
||
|
||
- `listExercises({ include_variants: true })`.
|
||
- Pro Zeile: Übung + **Variante** (optional), Dauer, Reihenfolge.
|
||
|
||
---
|
||
|
||
## 8. Rich-Text (`RichTextEditor.jsx` + CSS)
|
||
|
||
- **Selection Save/Restore** vor Toolbar-Klicks (`insertUnorderedList` / `insertOrderedList` zuverlässiger bei Mehrzeilen-Markierung).
|
||
- **`styleWithCSS` false** vor Formatbefehlen.
|
||
- **Listen-Styling** für `.rich-text-editor ul/ol/li` (Einzüge sichtbar).
|
||
|
||
---
|
||
|
||
## 9. Admin – Matrix / Reifegrad (Kontext)
|
||
|
||
- Bereits dokumentiert in **`CHANGELOG`** / Module **`maturity_models`**: Matrix-Stack-Bundle Export/Import, Kontext-Bindings — siehe `version.py` und Admin-UI-Pfade.
|
||
|
||
---
|
||
|
||
## 10. Nächste sinnvolle Schritte (nicht Lieferstand)
|
||
|
||
- Progressions-Serien als **Blöcke** (angekündigt; Voraussetzung: `prerequisite_variant_id` / `progression_level` vorhanden).
|
||
- Serverseitige **Suchvorschläge** (Autocomplete-Endpoint), falls datalist nicht reicht.
|
||
- Optional: Streaming/chunked Upload für sehr große Videos (RAM-Thema).
|
||
|
||
---
|
||
|
||
## 11. Verweise
|
||
|
||
| Thema | Dokument |
|
||
|--------|----------|
|
||
| API Übungen | `technical/EXERCISES_API_SPEC.md` |
|
||
| Domänenmodell | `functional/DOMAIN_MODEL.md` |
|
||
| Datenbank Überblick | `technical/DATABASE_SCHEMA.md` |
|
||
| Upload formal | `technical/MEDIA_UPLOAD_SPEC.md` |
|
||
| Projektstatus-Kachel | `../PROJECT_STATUS.md` |
|