Commit 187b5745 authored by Kantz's avatar Kantz
Browse files

nur noch aufgabe anzeigen die ein Thema haben

parent 3310d9fa
...@@ -22,6 +22,7 @@ class TaskFile(BaseModel): ...@@ -22,6 +22,7 @@ class TaskFile(BaseModel):
title: str title: str
intro: str intro: str
tasks: List[TaskItem] tasks: List[TaskItem]
subsections: List[str] = Field(default_factory=list)
class TasksResponse(BaseModel): class TasksResponse(BaseModel):
......
...@@ -259,6 +259,7 @@ def build_task_catalog(task_files: list[dict[str, Any]] | None = None) -> list[d ...@@ -259,6 +259,7 @@ def build_task_catalog(task_files: list[dict[str, Any]] | None = None) -> list[d
file_id = str(task_file.get("_file_id", "")) file_id = str(task_file.get("_file_id", ""))
title = str(task_file.get("title", "")).strip() title = str(task_file.get("title", "")).strip()
intro = str(task_file.get("intro", "")).strip() intro = str(task_file.get("intro", "")).strip()
subsections = task_file.get("subsections", [])
tasks: list[dict[str, str]] = [] tasks: list[dict[str, str]] = []
for item in task_file.get("tasks", []): for item in task_file.get("tasks", []):
if not isinstance(item, dict): if not isinstance(item, dict):
...@@ -280,6 +281,7 @@ def build_task_catalog(task_files: list[dict[str, Any]] | None = None) -> list[d ...@@ -280,6 +281,7 @@ def build_task_catalog(task_files: list[dict[str, Any]] | None = None) -> list[d
"title": title, "title": title,
"intro": intro, "intro": intro,
"tasks": tasks, "tasks": tasks,
"subsections": subsections,
} }
) )
return response return response
...@@ -9,6 +9,7 @@ export type TaskFile = { ...@@ -9,6 +9,7 @@ export type TaskFile = {
title: string; title: string;
intro: string; intro: string;
tasks: TaskItem[]; tasks: TaskItem[];
subsections?: string[];
}; };
export type TasksResponse = { export type TasksResponse = {
......
...@@ -42,6 +42,16 @@ export default function TaskSelectionPage() { ...@@ -42,6 +42,16 @@ export default function TaskSelectionPage() {
unlockTask(); unlockTask();
}, [isTaskModeEnabled, isTasksInitialized, navigate, unlockTask]); }, [isTaskModeEnabled, isTasksInitialized, navigate, unlockTask]);
useEffect(() => {
if (!taskFileOptions.length) {
return;
}
if (selectedTaskRef && taskFileOptions.some((option) => option.value === selectedTaskRef.fileId)) {
return;
}
setTaskFile(taskFileOptions[0].value);
}, [isTasksInitialized, selectedTaskRef, setTaskFile, taskFileOptions]);
useEffect(() => { useEffect(() => {
if (!selectedTask?.fullText || !taskDisplayRef.current) { if (!selectedTask?.fullText || !taskDisplayRef.current) {
return; return;
......
...@@ -65,6 +65,9 @@ export const createSessionId = () => ...@@ -65,6 +65,9 @@ export const createSessionId = () =>
export const getDefaultTaskId = (tasks: Array<{ task_id: string }>): string => export const getDefaultTaskId = (tasks: Array<{ task_id: string }>): string =>
tasks.find((task) => task.task_id === "01")?.task_id || tasks[0]?.task_id || ""; tasks.find((task) => task.task_id === "01")?.task_id || tasks[0]?.task_id || "";
const isSelectableTaskFile = (file: TaskFile): boolean =>
Array.isArray(file.subsections) && file.subsections.length > 0;
export function TutorSessionProvider({ children }: PropsWithChildren) { export function TutorSessionProvider({ children }: PropsWithChildren) {
const [chatSessionId, setChatSessionId] = useState<string>(() => createSessionId()); const [chatSessionId, setChatSessionId] = useState<string>(() => createSessionId());
const [selectedOrchestrator, setSelectedOrchestratorState] = const [selectedOrchestrator, setSelectedOrchestratorState] =
...@@ -107,13 +110,18 @@ export function TutorSessionProvider({ children }: PropsWithChildren) { ...@@ -107,13 +110,18 @@ export function TutorSessionProvider({ children }: PropsWithChildren) {
[selectedTaskRef?.fileId, taskFiles] [selectedTaskRef?.fileId, taskFiles]
); );
const selectableTaskFiles = useMemo(
() => taskFiles.filter((file) => isSelectableTaskFile(file)),
[taskFiles]
);
const taskFileOptions = useMemo( const taskFileOptions = useMemo(
() => () =>
taskFiles.map((file) => ({ selectableTaskFiles.map((file) => ({
value: file.file_id, value: file.file_id,
label: file.title || file.file_id, label: file.title || file.file_id,
})), })),
[taskFiles] [selectableTaskFiles]
); );
const taskOptions = useMemo( const taskOptions = useMemo(
...@@ -149,17 +157,18 @@ export function TutorSessionProvider({ children }: PropsWithChildren) { ...@@ -149,17 +157,18 @@ export function TutorSessionProvider({ children }: PropsWithChildren) {
try { try {
const payload = await fetchTasks(); const payload = await fetchTasks();
const files = payload.task_files || []; const files = payload.task_files || [];
const selectableFiles = files.filter((file) => isSelectableTaskFile(file));
setTaskFiles(files); setTaskFiles(files);
setSelectedTaskRef((prev) => { setSelectedTaskRef((prev) => {
if (prev) { if (prev) {
const file = files.find((item) => item.file_id === prev.fileId); const file = selectableFiles.find((item) => item.file_id === prev.fileId);
if (file && file.tasks.some((task) => task.task_id === prev.taskId)) { if (file && file.tasks.some((task) => task.task_id === prev.taskId)) {
return prev; return prev;
} }
} }
const firstFile = files[0]; const firstFile = selectableFiles[0];
if (!firstFile) { if (!firstFile) {
return null; return null;
} }
...@@ -188,7 +197,7 @@ export function TutorSessionProvider({ children }: PropsWithChildren) { ...@@ -188,7 +197,7 @@ export function TutorSessionProvider({ children }: PropsWithChildren) {
if (!fileId) { if (!fileId) {
return; return;
} }
const file = taskFiles.find((item) => item.file_id === fileId); const file = taskFiles.find((item) => item.file_id === fileId && isSelectableTaskFile(item));
if (!file) { if (!file) {
return; return;
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment