From 3ffba9ef4f21cd6deef802cf76e16f079f2d1e86 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 26 Feb 2026 15:20:57 +0100 Subject: [PATCH] Fix Academy new course: use training module selector instead of topic input The "generate course" feature now shows a list of available training modules to select from, instead of a free-text topic field. This correctly sends the module_id to the backend GenerateCourseFromTraining handler. Co-Authored-By: Claude Opus 4.6 --- .../app/(sdk)/sdk/academy/new/page.tsx | 172 +++++++++--------- 1 file changed, 85 insertions(+), 87 deletions(-) diff --git a/admin-compliance/app/(sdk)/sdk/academy/new/page.tsx b/admin-compliance/app/(sdk)/sdk/academy/new/page.tsx index c76fee7..9dd03bb 100644 --- a/admin-compliance/app/(sdk)/sdk/academy/new/page.tsx +++ b/admin-compliance/app/(sdk)/sdk/academy/new/page.tsx @@ -1,6 +1,6 @@ 'use client' -import React, { useState } from 'react' +import React, { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import Link from 'next/link' import { useSDK } from '@/lib/sdk' @@ -11,6 +11,8 @@ import { GenerateCourseRequest } from '@/lib/sdk/academy/types' import { createCourse, generateCourse } from '@/lib/sdk/academy/api' +import { getModules } from '@/lib/sdk/training/api' +import type { TrainingModule } from '@/lib/sdk/training/types' type CreationMode = 'manual' | 'ai' @@ -27,10 +29,34 @@ export default function NewCoursePage() { const [duration, setDuration] = useState(60) const [passingScore, setPassingScore] = useState(70) - // AI generation state - const [topic, setTopic] = useState('') - const [targetGroup, setTargetGroup] = useState('Alle Mitarbeiter') - const [useRag, setUseRag] = useState(true) + // AI generation state - module selection + const [trainingModules, setTrainingModules] = useState([]) + const [selectedModuleId, setSelectedModuleId] = useState('') + const [modulesLoading, setModulesLoading] = useState(false) + + // Load training modules on mount + useEffect(() => { + async function loadModules() { + setModulesLoading(true) + try { + const res = await getModules() + // Filter out modules that already have an academy_course_id + const available = (res.modules || []).filter(m => !m.academy_course_id) + setTrainingModules(available) + } catch { + // If loading fails, show all modules + try { + const res = await getModules() + setTrainingModules(res.modules || []) + } catch { + setError('Training-Module konnten nicht geladen werden.') + } + } finally { + setModulesLoading(false) + } + } + loadModules() + }, []) const handleManualCreate = async () => { if (!title.trim()) { @@ -69,25 +95,16 @@ export default function NewCoursePage() { } const handleAIGenerate = async () => { - if (!topic.trim()) { - setError('Bitte geben Sie ein Thema fuer den Kurs ein.') + if (!selectedModuleId) { + setError('Bitte waehlen Sie ein Training-Modul aus.') return } setIsLoading(true) setError(null) try { - const tenantId = typeof window !== 'undefined' - ? localStorage.getItem('bp_tenant_id') || 'default-tenant' - : 'default-tenant' - const result = await generateCourse({ - tenantId, - topic: topic.trim(), - category, - targetGroup: targetGroup.trim(), - language: 'de', - useRag + moduleId: selectedModuleId, }) if (result && result.course && result.course.id) { @@ -174,82 +191,63 @@ export default function NewCoursePage() {
-

KI-generierter Kurs

+

Kurs aus Training-Modul generieren

- Die KI erstellt automatisch Lektionen, Inhalte und Quizfragen basierend auf dem gewaehlten Thema. - Optionaler RAG-Kontext aus relevanten Gesetzestexten wird einbezogen. + Waehlen Sie ein bestehendes Training-Modul aus. Der Academy-Kurs wird automatisch mit den generierten Inhalten und Quizfragen erstellt.

- {/* Topic */} -
- - setTopic(e.target.value)} - placeholder="z.B. DSGVO-Grundlagen fuer neue Mitarbeiter" - className="w-full px-4 py-3 border border-gray-300 rounded-xl focus:ring-2 focus:ring-purple-500 focus:border-purple-500 text-base" - /> -
- - {/* Category */} -
- -
- {Object.entries(COURSE_CATEGORY_INFO).map(([cat, info]) => ( - - ))} + {/* Module Selection */} + {modulesLoading ? ( +
+ + + + + Training-Module werden geladen...
-
- - {/* Target Group */} -
- - setTargetGroup(e.target.value)} - placeholder="z.B. Alle Mitarbeiter, IT-Abteilung, Fuehrungskraefte" - className="w-full px-4 py-3 border border-gray-300 rounded-xl focus:ring-2 focus:ring-purple-500 focus:border-purple-500" - /> -
- - {/* RAG Toggle */} -
- + ) : trainingModules.length === 0 ? ( +
+

Keine verfuegbaren Training-Module gefunden.

+

Alle Module haben bereits einen Academy-Kurs oder es existieren noch keine Module.

+
+ ) : (
- RAG-Kontext verwenden -

Relevante Gesetzestexte (DSGVO, AI Act, NIS2) einbeziehen

+ +
+ {trainingModules.map((mod) => ( + + ))} +
-
+ )} {/* Submit */}
@@ -261,7 +259,7 @@ export default function NewCoursePage() {