mirror of
https://gitlab.dit.htwk-leipzig.de/htwk-software/htwkalender.git
synced 2026-01-17 20:12:26 +01:00
feat: add professor dashboard to view and select modules for calendar creation
This commit is contained in:
40
frontend/src/api/fetchProfessorModules.ts
Normal file
40
frontend/src/api/fetchProfessorModules.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
export interface ApiModule {
|
||||||
|
uuid: string;
|
||||||
|
name: string;
|
||||||
|
course: string;
|
||||||
|
eventType?: string;
|
||||||
|
prof: string;
|
||||||
|
semester: string;
|
||||||
|
confidenceScore?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function fetchProfessorModules(): Promise<ApiModule[]> {
|
||||||
|
if (import.meta.env.SSR) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const { pb } = await import("../service/pocketbase");
|
||||||
|
|
||||||
|
if (!pb.authStore.isValid || !pb.authStore.token) {
|
||||||
|
return Promise.reject(new Error("User is not authenticated"));
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await fetch("/api/professor/modules", {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Authorization": pb.authStore.token,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const error = new Error(`HTTP error! status: ${response.status}`);
|
||||||
|
Object.assign(error, { status: response.status });
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await response.json();
|
||||||
|
} catch (error) {
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,6 +13,9 @@ import { useRouter } from "vue-router";
|
|||||||
|
|
||||||
const { t } = useI18n({ useScope: "global" });
|
const { t } = useI18n({ useScope: "global" });
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
import { fetchProfessorModules, type ApiModule } from "../../api/fetchProfessorModules";
|
||||||
|
|
||||||
|
type ModuleWithScore = Module & { confidenceScore: number };
|
||||||
|
|
||||||
const modules = ref<Module[]>(new Array(10));
|
const modules = ref<Module[]>(new Array(10));
|
||||||
const selectedModules = ref<Module[]>([]);
|
const selectedModules = ref<Module[]>([]);
|
||||||
@@ -38,25 +41,10 @@ onMounted(async () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("Auth token:", pb.authStore.token); // Debug
|
const result = await fetchProfessorModules();
|
||||||
|
|
||||||
// Make request with explicit Authorization header
|
|
||||||
const response = await fetch("/api/professor/modules", {
|
|
||||||
method: "GET",
|
|
||||||
headers: {
|
|
||||||
"Authorization": pb.authStore.token,
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(`HTTP error! status: ${response.status}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const result = await response.json();
|
|
||||||
|
|
||||||
// Convert API response to Module instances with all required fields
|
// Convert API response to Module instances with all required fields
|
||||||
const moduleObjects = result.map((apiModule: any) => new Module(
|
const moduleObjects = result.map((apiModule: ApiModule) => new Module(
|
||||||
apiModule.uuid,
|
apiModule.uuid,
|
||||||
apiModule.name,
|
apiModule.name,
|
||||||
apiModule.course,
|
apiModule.course,
|
||||||
@@ -76,20 +64,21 @@ onMounted(async () => {
|
|||||||
...module,
|
...module,
|
||||||
confidenceScore: originalData.confidenceScore || 0
|
confidenceScore: originalData.confidenceScore || 0
|
||||||
};
|
};
|
||||||
}).sort((a: any, b: any) => {
|
}).sort((a: ModuleWithScore, b: ModuleWithScore) => {
|
||||||
return (b.confidenceScore || 0) - (a.confidenceScore || 0); // Descending order
|
return (b.confidenceScore || 0) - (a.confidenceScore || 0); // Descending order
|
||||||
});
|
});
|
||||||
|
|
||||||
modules.value = sortedModules;
|
modules.value = sortedModules;
|
||||||
|
|
||||||
// Pre-select modules with confidence score >= 0.7 (good match or better)
|
// Pre-select modules with confidence score >= 0.7 (good match or better)
|
||||||
selectedModules.value = sortedModules.filter((m: any) => (m.confidenceScore || 0) >= 0.7);
|
selectedModules.value = sortedModules.filter((m: ModuleWithScore) => (m.confidenceScore || 0) >= 0.7);
|
||||||
|
|
||||||
console.log("Modules loaded:", modules.value.length, "Pre-selected:", selectedModules.value.length);
|
console.log("Modules loaded:", modules.value.length, "Pre-selected:", selectedModules.value.length);
|
||||||
} catch (error: any) {
|
} catch (error: unknown) {
|
||||||
console.error("Failed to fetch modules", error);
|
console.error("Failed to fetch modules", error);
|
||||||
|
const err = error as { status?: number; message?: string };
|
||||||
// If unauthorized, redirect to home
|
// If unauthorized, redirect to home
|
||||||
if (error.status === 401 || error.message?.includes("401")) {
|
if (err.status === 401 || err.message?.includes("401")) {
|
||||||
pb.authStore.clear();
|
pb.authStore.clear();
|
||||||
router.push("/");
|
router.push("/");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user