diff --git a/frontend/src/components/ExercisePickerModal.jsx b/frontend/src/components/ExercisePickerModal.jsx
index 9661100..0cda9dd 100644
--- a/frontend/src/components/ExercisePickerModal.jsx
+++ b/frontend/src/components/ExercisePickerModal.jsx
@@ -75,10 +75,13 @@ export default function ExercisePickerModal({
const usePlanningSearch = Boolean(planningContext?.unitId && Number(planningContext.unitId) > 0)
- const effectivePickerQuery = useMemo(
- () => [debouncedSearch, debouncedAi].filter(Boolean).join(' ').trim(),
- [debouncedSearch, debouncedAi]
- )
+ /** Gemeinsamer Suchtext — in Planung nur ein Feld; in Bibliothek beide Felder kombiniert. */
+ const effectivePickerQuery = useMemo(() => {
+ if (usePlanningSearch) {
+ return (debouncedSearch || debouncedAi).trim()
+ }
+ return [debouncedSearch, debouncedAi].filter(Boolean).join(' ').trim()
+ }, [usePlanningSearch, debouncedSearch, debouncedAi])
const {
title: quickTitle,
@@ -249,9 +252,7 @@ export default function ExercisePickerModal({
if (filters.skill_max_level) q.skill_max_level = n(filters.skill_max_level)
if (filters.exclude_without_focus) q.exclude_without_focus = true
if (filters.include_archived) q.include_archived = true
- if (debouncedSearch) q.search = debouncedSearch
- if (debouncedAi) q.ai_search = debouncedAi
- if (!debouncedSearch && debouncedAi) q.search = debouncedAi
+ if (effectivePickerQuery) q.search = effectivePickerQuery
if (
Array.isArray(exerciseKindAny) &&
exerciseKindAny.length > 0
@@ -259,7 +260,7 @@ export default function ExercisePickerModal({
q.exercise_kind_any = exerciseKindAny
}
return q
- }, [filters, debouncedSearch, debouncedAi, exerciseKindAny])
+ }, [filters, effectivePickerQuery, exerciseKindAny])
const reload = useCallback(async () => {
if (!open || !catalogsReady) return
@@ -345,8 +346,6 @@ export default function ExercisePickerModal({
usePlanningSearch,
planningContext,
effectivePickerQuery,
- debouncedSearch,
- debouncedAi,
exerciseKindAny,
])
@@ -496,7 +495,13 @@ export default function ExercisePickerModal({
>
- {multiSelect ? 'Übungen auswählen' : 'Übung auswählen'}
+ {usePlanningSearch
+ ? multiSelect
+ ? 'Planungs-KI: Übungen vorschlagen'
+ : 'Planungs-KI: Übung vorschlagen'
+ : multiSelect
+ ? 'Übungen auswählen'
+ : 'Übung auswählen'}
Schließen
@@ -575,51 +580,72 @@ export default function ExercisePickerModal({
) : null}
) : null}
+ {!usePlanningSearch ? (
+
+ Bibliothekssuche (Volltext) — Planungs-KI mit
+ Kontext (Einheit, Plan, Anker) gibt es in der{' '}
+ Trainingseinheit bearbeiten , nach dem Speichern der Einheit.
+
+ ) : null}
-
-
- {usePlanningSearch ? 'Planungs-Anfrage' : 'Volltextsuche'}
-
- setSearchInput(e.target.value)}
- autoComplete="off"
- />
-
-
-
- {usePlanningSearch ? 'Planungs-Anfrage (Zusatz, optional)' : 'Semantisch / '}
- {!usePlanningSearch ? (
-
- KI-Feld
-
- ) : null}
-
-
setAiSearchInput(e.target.value)}
- autoComplete="off"
- />
- {usePlanningSearch ? (
+ {usePlanningSearch ? (
+
+
Planungs-Anfrage (KI)
+
{
+ const v = e.target.value
+ setSearchInput(v)
+ setAiSearchInput(v)
+ }}
+ autoComplete="off"
+ />
- Beide Felder bilden eine gemeinsame Planungs-Anfrage.
+ Leer lassen = nächste Übung aus Planungskontext. Mit Text = KI-Intent + Profil + Ranking.
- ) : null}
-
+
+ ) : (
+ <>
+
+ Volltextsuche
+ setSearchInput(e.target.value)}
+ autoComplete="off"
+ />
+
+
+
+ Ergänzung /{' '}
+ zweites Suchfeld
+
+ setAiSearchInput(e.target.value)}
+ autoComplete="off"
+ />
+
+ >
+ )}
setFilterOpen(!filterOpen)}>
{filterOpen ? 'Filter ausblenden' : 'Erweiterte Filter'}
diff --git a/frontend/src/pages/TrainingUnitEditPage.jsx b/frontend/src/pages/TrainingUnitEditPage.jsx
index dc62558..611e287 100644
--- a/frontend/src/pages/TrainingUnitEditPage.jsx
+++ b/frontend/src/pages/TrainingUnitEditPage.jsx
@@ -124,7 +124,9 @@ export default function TrainingUnitEditPage() {
const [saveModuleOpen, setSaveModuleOpen] = useState(false)
const exercisePickerPlanningContext = useMemo(() => {
- if (!editingUnit?.id) return null
+ const resolvedUnitId =
+ editingUnit?.id ?? (Number.isFinite(unitId) && unitId > 0 ? unitId : null)
+ if (!resolvedUnitId) return null
const target = exercisePickerTarget
const secs = formData.sections || []
const sIdx = target?.sIdx ?? 0
@@ -164,13 +166,13 @@ export default function TrainingUnitEditPage() {
}
}
return {
- unitId: Number(editingUnit.id),
+ unitId: Number(resolvedUnitId),
sectionOrderIndex: sIdx,
anchorExerciseId: Number.isFinite(anchorExerciseId) && anchorExerciseId > 0 ? anchorExerciseId : null,
progressionGraphId: null,
plannedExerciseIds,
}
- }, [editingUnit?.id, exercisePickerTarget, formData.sections])
+ }, [editingUnit?.id, unitId, exercisePickerTarget, formData.sections])
const goBack = useCallback(() => {
goNavReturn(navigate, location, {