From ce94c4efb02c2660c17c326c740b24ad66c82164 Mon Sep 17 00:00:00 2001 From: Ashley Kapaso Date: Mon, 30 Sep 2024 18:56:23 +0200 Subject: [PATCH 01/25] fix grades 500 error --- src/src/routes/(app)/grades/+page.server.ts | 4 +- src/src/routes/(app)/grades/+page.svelte | 52 +++++++++++-------- .../routes/(app)/workspaces/+page.server.ts | 2 + .../[workspace]/grades/+page.server.ts | 8 +-- .../[workspace]/grades/+page.svelte | 41 ++++++++------- src/static/templates/student-welcome.html | 4 +- 6 files changed, 63 insertions(+), 48 deletions(-) diff --git a/src/src/routes/(app)/grades/+page.server.ts b/src/src/routes/(app)/grades/+page.server.ts index 39856f5b..b5881417 100644 --- a/src/src/routes/(app)/grades/+page.server.ts +++ b/src/src/routes/(app)/grades/+page.server.ts @@ -17,7 +17,7 @@ export async function load({ locals }) { acc[workspaceName].push({ average: 0, - score: grade.mark, + score: grade.mark * 10, assessment: grade.quizID.title, quizID: grade.quizID._id.toString(), date: grade.quizID.date.toDateString() @@ -31,7 +31,7 @@ export async function load({ locals }) { const allGrades = await Grades.find({ quizID: assessment.quizID }); const average = allGrades.reduce((sum, g) => sum + g.mark, 0) / allGrades.length; - assessment.average = Math.round(average); + assessment.average = Math.round(average) * 10; } } diff --git a/src/src/routes/(app)/grades/+page.svelte b/src/src/routes/(app)/grades/+page.svelte index 37c0e6de..dfafd52a 100644 --- a/src/src/routes/(app)/grades/+page.svelte +++ b/src/src/routes/(app)/grades/+page.svelte @@ -19,28 +19,36 @@

Student Grades

- {#each workspaces as workspace} - - - - Assessment - Date & Time - Your Score (%) - Class Average (%) - + {#if workspaces.length === 0} +

No grades available

+ {:else} + {#each workspaces as workspace} + + {#if workspace.grades.length === 0} +

No grades available

+ {:else} +
+ + Assessment + Date & Time + Your Score (%) + Class Average (%) + - - {#each workspace.grades as grade} - - {grade.assessment} - {grade.date} - {grade.score} - {grade.average} - - {/each} - -
-
- {/each} + + {#each workspace.grades as grade} + + {grade.assessment} + {grade.date} + {grade.score} + {grade.average} + + {/each} + + + {/if} + + {/each} + {/if}
diff --git a/src/src/routes/(app)/workspaces/+page.server.ts b/src/src/routes/(app)/workspaces/+page.server.ts index 7b586a00..cf4a4718 100644 --- a/src/src/routes/(app)/workspaces/+page.server.ts +++ b/src/src/routes/(app)/workspaces/+page.server.ts @@ -4,6 +4,8 @@ import { fail, error, redirect } from '@sveltejs/kit'; import { upload, deleteFile } from '$lib/server/storage'; import Users from '$db/schemas/User'; +// eslint-disable-next-line +import Grades from '$db/schemas/Grades'; import Workspaces from '$db/schemas/Workspace'; import type { Workspace, User } from '$src/types'; diff --git a/src/src/routes/(app)/workspaces/[workspace]/grades/+page.server.ts b/src/src/routes/(app)/workspaces/[workspace]/grades/+page.server.ts index f01d485a..706b1c52 100644 --- a/src/src/routes/(app)/workspaces/[workspace]/grades/+page.server.ts +++ b/src/src/routes/(app)/workspaces/[workspace]/grades/+page.server.ts @@ -1,5 +1,5 @@ import { error } from '@sveltejs/kit'; -import Grades from '$lib/server/database/schemas/Grades'; +import Grades from '$db/schemas/Grades'; export async function load({ locals, params }) { if (!locals.user || locals.user.role !== 'student') throw error(401, 'Unauthorised'); @@ -13,7 +13,7 @@ export async function load({ locals, params }) { const workspaceGrades = grades.map((grade) => ({ average: 0, - score: grade.mark, + score: grade.mark * 10, assessment: grade.quizID.title, quizID: grade.quizID._id.toString(), date: grade.quizID.date.toDateString() @@ -23,9 +23,11 @@ export async function load({ locals, params }) { const allGrades = await Grades.find({ quizID: assessment.quizID }); const average = allGrades.reduce((sum, g) => sum + g.mark, 0) / allGrades.length; - assessment.average = Math.round(average); + assessment.average = Math.round(average) * 10; } + console.log(workspaceGrades); + return { grades: workspaceGrades }; } catch (e) { console.error('Error fetching grades:', e); diff --git a/src/src/routes/(app)/workspaces/[workspace]/grades/+page.svelte b/src/src/routes/(app)/workspaces/[workspace]/grades/+page.svelte index f35bd1f4..ad1dc557 100644 --- a/src/src/routes/(app)/workspaces/[workspace]/grades/+page.svelte +++ b/src/src/routes/(app)/workspaces/[workspace]/grades/+page.svelte @@ -15,24 +15,27 @@

Grades

+ {#if grades.length === 0} +

No grades available

+ {:else} + + + Assessment + Date & Time + Your Score (%) + Class Average (%) + -
- - Assessment - Date & Time - Your Score (%) - Class Average (%) - - - - {#each grades as grade} - - {grade.assessment} - {grade.date} - {grade.score} - {grade.average} - - {/each} - -
+ + {#each grades as grade} + + {grade.assessment} + {grade.date} + {grade.score} + {grade.average} + + {/each} + + + {/if}
diff --git a/src/static/templates/student-welcome.html b/src/static/templates/student-welcome.html index bf3802b3..1b1e32ba 100644 --- a/src/static/templates/student-welcome.html +++ b/src/static/templates/student-welcome.html @@ -54,8 +54,8 @@

🎓 Welcome to ClassConnect!

Congratulations, {{name}}! 🎉

- Your application to attend {{organisation has been approved! We're thrilled - to welcome you to our learning community on the ClassConnect platform. + Your application to attend {{organisation}} has been approved! We're + thrilled to welcome you to our learning community on the ClassConnect platform.

🔑 Your Account Details

Your generated username is: {{username}}

From 5508d558b47b6817426993ccdd1a924760ac2bf1 Mon Sep 17 00:00:00 2001 From: Ayanda Juqu Date: Mon, 30 Sep 2024 19:03:46 +0200 Subject: [PATCH 02/25] fixed student 3d --- src/src/lib/components/questions/3Dform.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/src/lib/components/questions/3Dform.svelte b/src/src/lib/components/questions/3Dform.svelte index 74996dfc..05165c15 100644 --- a/src/src/lib/components/questions/3Dform.svelte +++ b/src/src/lib/components/questions/3Dform.svelte @@ -10,6 +10,7 @@ let modelPath: string; modelPath = $selectedModel; + console.log('Model Path in close', modelPath); function close() { return async ({ result, update }: any) => { From b4ec3a7aa546d188fdd06c418828b8a096fdfabb Mon Sep 17 00:00:00 2001 From: Ayanda Juqu Date: Mon, 30 Sep 2024 19:14:32 +0200 Subject: [PATCH 03/25] changed mark saving --- .../(app)/workspaces/[workspace]/quizzes/[quiz]/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.svelte b/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.svelte index 73f98a18..b3bc3a90 100644 --- a/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.svelte +++ b/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.svelte @@ -220,7 +220,7 @@ }} class="mt-8 flex justify-center" > - + +
+ + + + + {:else if currItem.type == 'Note'} - +
+
+
+
+

+ {currItem.title} +

+
+
+
+
+
+ +
+
+
+
+
+
+
{:else if currItem.type == 'ThreeDMaterial'} - +
+
+
+
+
+

+ {currItem.title} +

+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
{/if} diff --git a/src/src/lib/components/forms/interactive/viewers/Notes.svelte b/src/src/lib/components/forms/interactive/viewers/Notes.svelte index f5db7914..0108b3e3 100644 --- a/src/src/lib/components/forms/interactive/viewers/Notes.svelte +++ b/src/src/lib/components/forms/interactive/viewers/Notes.svelte @@ -19,6 +19,8 @@ window.removeEventListener('resize', checkIfMobile); }; }); + + $: note = note;
diff --git a/src/src/lib/components/modals/materials/Preview.svelte b/src/src/lib/components/modals/materials/Preview.svelte index 51c95a25..5a4b5667 100644 --- a/src/src/lib/components/modals/materials/Preview.svelte +++ b/src/src/lib/components/modals/materials/Preview.svelte @@ -64,10 +64,10 @@ class="flex h-[500px] w-[500px] flex-col space-y-4 rounded-lg bg-gray-200 p-2 shadow-md ring dark:bg-gray-700" >
- diff --git a/src/src/lib/components/modals/materials/PreviewMaterial.svelte b/src/src/lib/components/modals/materials/PreviewMaterial.svelte index 87c8a323..273e7709 100644 --- a/src/src/lib/components/modals/materials/PreviewMaterial.svelte +++ b/src/src/lib/components/modals/materials/PreviewMaterial.svelte @@ -133,10 +133,10 @@ class="flex h-[500px] w-[500px] flex-col space-y-4 rounded-lg bg-gray-200 p-2 shadow-md ring dark:bg-gray-700" >
- diff --git a/src/src/lib/server/utils/interactive.ts b/src/src/lib/server/utils/interactive.ts index 8be3c439..fdce9635 100644 --- a/src/src/lib/server/utils/interactive.ts +++ b/src/src/lib/server/utils/interactive.ts @@ -15,7 +15,12 @@ async function AddContentToLesson(lesson: any, content: any) { } async function RemoveContentFromLesson(lesson: any, content: any) { - lesson.content = lesson.content.filter((id: any) => id !== content._id.toString()); + const contentArray = lesson.content; + const index = contentArray.indexOf(content._id); + if (index > -1) { + contentArray.splice(index, 1); + } + lesson.content = contentArray; await lesson.save(); } @@ -361,8 +366,11 @@ export async function deleteContent(data: FormData) { if (content.type === 'MCQ') { await MCQs.findByIdAndDelete(id); } + if (content.type === 'ThreeDMaterial') { + await ThreeDMaterial.findByIdAndDelete(id); + } - await RemoveContentFromLesson(lessonData, content); + await RemoveContentFromLesson(lessonData, content.data); } export async function editContent(data: FormData) { diff --git a/src/src/routes/(app)/workspaces/[workspace]/interactive/[interactive]/+page.server.ts b/src/src/routes/(app)/workspaces/[workspace]/interactive/[interactive]/+page.server.ts index c1e80ba7..e2e5dfa3 100644 --- a/src/src/routes/(app)/workspaces/[workspace]/interactive/[interactive]/+page.server.ts +++ b/src/src/routes/(app)/workspaces/[workspace]/interactive/[interactive]/+page.server.ts @@ -128,10 +128,11 @@ export const actions: Actions = { return fail(500, { message: 'Failed to save question' }); } }, - deleteContent: async ({ request, locals }) => { + deleteContent: async ({ request, locals, params }) => { try { validateLecturer(locals); const data = await request.formData(); + data.append('lesson', params.interactive as string); await deleteContent(data); } catch (e) { console.error('Error deleting content:', e); diff --git a/src/src/routes/(app)/workspaces/[workspace]/materials/material/+page.svelte b/src/src/routes/(app)/workspaces/[workspace]/materials/material/+page.svelte index 7354be32..c9f28a94 100644 --- a/src/src/routes/(app)/workspaces/[workspace]/materials/material/+page.svelte +++ b/src/src/routes/(app)/workspaces/[workspace]/materials/material/+page.svelte @@ -7,6 +7,7 @@ } -
- +
+
From 915717e001a5101e7ece7961820d0782887ed114 Mon Sep 17 00:00:00 2001 From: Ayanda Juqu Date: Mon, 30 Sep 2024 22:54:43 +0200 Subject: [PATCH 08/25] fixed linter --- .../lib/components/hotspot/3dhotspot.svelte | 49 +++++++------------ .../quizzes/[quiz]/+page.server.ts | 2 +- 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/src/src/lib/components/hotspot/3dhotspot.svelte b/src/src/lib/components/hotspot/3dhotspot.svelte index 0ab163a2..e2af62dc 100644 --- a/src/src/lib/components/hotspot/3dhotspot.svelte +++ b/src/src/lib/components/hotspot/3dhotspot.svelte @@ -7,8 +7,12 @@ import { TransformControls } from 'three/addons/controls/TransformControls.js'; import Menu from './3dMenu.svelte'; + import { selectedModel, modelSphereData, spherePosition } from '$lib/store/model'; + + + export let data: { role: string; models: { title: string; file_path: string; description: string }[]; @@ -24,9 +28,7 @@ }; let { role, models, questions } = data; - if (role === 'student') { - console.log('Questions', questions); - } + let canvas: HTMLCanvasElement; let camera: THREE.PerspectiveCamera, scene: THREE.Scene, renderer: THREE.WebGLRenderer; @@ -34,9 +36,9 @@ let draggableSphere: THREE.Mesh; let transformControls: TransformControls; - let currentModel: THREE.Object3D | null = null; - let isLoading = false; - console.log(isLoading); + let currentModel: THREE.Object3D | null = null; + + onMount(() => { initScene(); @@ -108,25 +110,22 @@ //sphere transform transformControls.addEventListener('mouseDown', () => { controls.enabled = false; - $spherePosition.copy(draggableSphere.position); - modelSphereData.set({ - file_path: $selectedModel, - position: draggableSphere.position.clone() - }); + }); transformControls.addEventListener('mouseUp', () => { controls.enabled = true; $spherePosition.copy(draggableSphere.position); }); } else if (role === 'student') { - //loadModel + + questions.forEach((question) => { if (question.modelPath) { loadModel(question.modelPath); } }); - // Create and add the new pin + const pinGeometry = new THREE.SphereGeometry(0.05); const pinMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 }); const pin = new THREE.Mesh(pinGeometry, pinMaterial); @@ -160,30 +159,19 @@ window.addEventListener('resize', onWindowResize, false); } - const loadingManager = new THREE.LoadingManager( - () => { - isLoading = false; - }, - (itemUrl, itemsLoaded, itemsTotal) => { - // Update progress - console.log(`Loaded ${itemsLoaded} of ${itemsTotal}`); - }, - (url) => { - // Handle loading error - console.error(`Error loading ${url}`); - } - ); - - const loader = new GLTFLoader(loadingManager); + + function loadModel(file_path: string) { - isLoading = true; + + const loader = new GLTFLoader(); loader.load(file_path, (gltf) => { if (currentModel) { scene.remove(currentModel); } currentModel = gltf.scene; scene.add(currentModel); + }); } @@ -210,10 +198,11 @@

- Note: Use the transform controls on the violet sphere to drag it to your desired point. + Note: Open the menu to select a model, then use the transform controls on the violet sphere to drag it to your desired point.

{/if} + diff --git a/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.server.ts b/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.server.ts index 1576871c..d1fee910 100644 --- a/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.server.ts +++ b/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.server.ts @@ -14,7 +14,7 @@ export const load: PageServerLoad = async ({ params, locals }) => { const workspaceID = params.workspace; const quizId = params.quiz; const questions = await Questions.find({ quiz: quizId }); - const models = await getModels(params.workspace, true); + const models = await getModels(params.workspace, true);6 const quiz = await Quizzes.findById(quizId); if (!quiz) { From c1e3f931364654e12a7426ffb1a8ea94ca9f9a32 Mon Sep 17 00:00:00 2001 From: Ayanda Juqu Date: Mon, 30 Sep 2024 22:56:30 +0200 Subject: [PATCH 09/25] fixed linter --- .../lib/components/hotspot/3dhotspot.svelte | 24 ++++--------------- .../quizzes/[quiz]/+page.server.ts | 3 ++- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/src/lib/components/hotspot/3dhotspot.svelte b/src/src/lib/components/hotspot/3dhotspot.svelte index e2af62dc..9af5357c 100644 --- a/src/src/lib/components/hotspot/3dhotspot.svelte +++ b/src/src/lib/components/hotspot/3dhotspot.svelte @@ -8,10 +8,7 @@ import { TransformControls } from 'three/addons/controls/TransformControls.js'; import Menu from './3dMenu.svelte'; - import { selectedModel, modelSphereData, spherePosition } from '$lib/store/model'; - - - + import { selectedModel, spherePosition } from '$lib/store/model'; export let data: { role: string; @@ -28,7 +25,6 @@ }; let { role, models, questions } = data; - let canvas: HTMLCanvasElement; let camera: THREE.PerspectiveCamera, scene: THREE.Scene, renderer: THREE.WebGLRenderer; @@ -36,9 +32,7 @@ let draggableSphere: THREE.Mesh; let transformControls: TransformControls; - let currentModel: THREE.Object3D | null = null; - - + let currentModel: THREE.Object3D | null = null; onMount(() => { initScene(); @@ -110,22 +104,18 @@ //sphere transform transformControls.addEventListener('mouseDown', () => { controls.enabled = false; - }); transformControls.addEventListener('mouseUp', () => { controls.enabled = true; $spherePosition.copy(draggableSphere.position); }); } else if (role === 'student') { - - questions.forEach((question) => { if (question.modelPath) { loadModel(question.modelPath); } }); - const pinGeometry = new THREE.SphereGeometry(0.05); const pinMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 }); const pin = new THREE.Mesh(pinGeometry, pinMaterial); @@ -159,11 +149,7 @@ window.addEventListener('resize', onWindowResize, false); } - - - function loadModel(file_path: string) { - const loader = new GLTFLoader(); loader.load(file_path, (gltf) => { if (currentModel) { @@ -171,7 +157,6 @@ } currentModel = gltf.scene; scene.add(currentModel); - }); } @@ -198,11 +183,12 @@

- Note: Open the menu to select a model, then use the transform controls on the violet sphere to drag it to your desired point. + Note: Open the menu to select a model, then use the transform controls on the violet sphere + to drag it to your desired point.

{/if} - + diff --git a/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.server.ts b/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.server.ts index d1fee910..ac1e80c9 100644 --- a/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.server.ts +++ b/src/src/routes/(app)/workspaces/[workspace]/quizzes/[quiz]/+page.server.ts @@ -14,7 +14,8 @@ export const load: PageServerLoad = async ({ params, locals }) => { const workspaceID = params.workspace; const quizId = params.quiz; const questions = await Questions.find({ quiz: quizId }); - const models = await getModels(params.workspace, true);6 + const models = await getModels(params.workspace, true); + 6; const quiz = await Quizzes.findById(quizId); if (!quiz) { From d2c155c5a31df5a9eb9918f85a80a0c9d61ed5ea Mon Sep 17 00:00:00 2001 From: bukhosi-eugene-mpande Date: Mon, 30 Sep 2024 23:44:22 +0200 Subject: [PATCH 10/25] updated model selection --- .../lib/components/hotspot/3dhotspot.svelte | 44 ++++++++++++------- .../lib/components/questions/3Dform.svelte | 16 +++++-- .../quizzes/[quiz]/+page.server.ts | 5 ++- .../[workspace]/quizzes/[quiz]/+page.svelte | 8 +++- 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/src/lib/components/hotspot/3dhotspot.svelte b/src/src/lib/components/hotspot/3dhotspot.svelte index 9af5357c..26ebda27 100644 --- a/src/src/lib/components/hotspot/3dhotspot.svelte +++ b/src/src/lib/components/hotspot/3dhotspot.svelte @@ -1,12 +1,12 @@
- {#if role === 'lecturer'} -
- -

- Note: Open the menu to select a model, then use the transform controls on the violet sphere - to drag it to your desired point. -

-
- {/if} -
+{#if role === 'lecturer'} + + +{/if} + diff --git a/src/src/lib/components/questions/3Dform.svelte b/src/src/lib/components/questions/3Dform.svelte index 38882e73..c023a9cb 100644 --- a/src/src/lib/components/questions/3Dform.svelte +++ b/src/src/lib/components/questions/3Dform.svelte @@ -54,30 +54,31 @@ -