feat: add professor dashboard to view and select modules for calendar creation

This commit is contained in:
Elmar Kresse
2025-11-22 21:38:30 +01:00
parent ac6e1fe0dd
commit 5f383f5638
2 changed files with 50 additions and 21 deletions

View 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);
}
}

View File

@@ -13,6 +13,9 @@ import { useRouter } from "vue-router";
const { t } = useI18n({ useScope: "global" });
const router = useRouter();
import { fetchProfessorModules, type ApiModule } from "../../api/fetchProfessorModules";
type ModuleWithScore = Module & { confidenceScore: number };
const modules = ref<Module[]>(new Array(10));
const selectedModules = ref<Module[]>([]);
@@ -38,25 +41,10 @@ onMounted(async () => {
return;
}
console.log("Auth token:", pb.authStore.token); // Debug
// 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();
const result = await fetchProfessorModules();
// 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.name,
apiModule.course,
@@ -76,20 +64,21 @@ onMounted(async () => {
...module,
confidenceScore: originalData.confidenceScore || 0
};
}).sort((a: any, b: any) => {
}).sort((a: ModuleWithScore, b: ModuleWithScore) => {
return (b.confidenceScore || 0) - (a.confidenceScore || 0); // Descending order
});
modules.value = sortedModules;
// 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);
} catch (error: any) {
} catch (error: unknown) {
console.error("Failed to fetch modules", error);
const err = error as { status?: number; message?: string };
// If unauthorized, redirect to home
if (error.status === 401 || error.message?.includes("401")) {
if (err.status === 401 || err.message?.includes("401")) {
pb.authStore.clear();
router.push("/");
}