diff --git a/src/lib/components/courses/courseInfo.svelte b/src/lib/components/courses/courseInfo.svelte index 5caec873..e724940e 100644 --- a/src/lib/components/courses/courseInfo.svelte +++ b/src/lib/components/courses/courseInfo.svelte @@ -2,10 +2,11 @@ import { afterUpdate, onMount } from 'svelte'; import Chart from 'chart.js/auto'; import { t } from "$lib/i18n"; + import DOMPurify from 'dompurify'; /** - * @type {{ title: any; code: any; courseType: any; teacher: string; ects: any; semester: any; season: any; weeklyHours: any; period: any; }} + * @type {{ title: any; code: any; courseType: any; teacher: string; syllabus: string; eudoxus: string; ects: any; semester: any; season: any; weeklyHours: any; period: any; }} */ export let course; /** @@ -66,8 +67,14 @@ maximum = Math.max(...gradeData); // Create a bar chart using Chart.js - const ctx = document.getElementById('statChart').getContext('2d'); + /** + @type {HTMLCanvasElement | null} + */ + const statChart = /** @type {HTMLCanvasElement | null} */ (document.getElementById('statChart')); + if (!statChart) return; + const ctx = statChart.getContext('2d'); const colors = grades.map((grade) => (grade < 5 ? '#515151' : primaryColor)); + if (!ctx) return; chart = new Chart(ctx, { type: 'bar', data: { @@ -120,6 +127,9 @@ } }); + // Sanitized HTML content + $: sanitizedSyllabus = course.syllabus ? DOMPurify.sanitize(course.syllabus, { SANITIZE_NAMED_PROPS: true }) : ''; + $: sanitizedEudoxus = course.eudoxus ? DOMPurify.sanitize(course.eudoxus, { SANITIZE_NAMED_PROPS: true }) : ''; @@ -156,14 +166,20 @@ {$t("course.semester")} {#if course.semester <= 24} - {course.semester}ο + {course.semester} {:else} {course.season} {/if} {$t("course.period")} - {course.season} + + {#if course.season == "ΧΕΙΜ"} + {$t("course.winter_period")} + {:else if course.season == "ΕΑΡ"} + {$t("course.summer_period")} + {/if} + {$t("course.weekly_hours")} @@ -172,7 +188,7 @@ - + {$t("course.professors")} {#each course.teacher.split(', ') as teacher} @@ -180,6 +196,27 @@ {/each} + {#if course.syllabus} + + + + {$t("course.syllabus")} + +

{@html sanitizedSyllabus}

+
+
+ {/if} + {#if course.eudoxus} + + + + {$t("course.eudoxus")} + +

{@html sanitizedEudoxus}

+
+
+ {/if} + diff --git a/src/lib/components/courses/coursePage.svelte b/src/lib/components/courses/coursePage.svelte index 7a494dfc..9f0f62e0 100644 --- a/src/lib/components/courses/coursePage.svelte +++ b/src/lib/components/courses/coursePage.svelte @@ -5,6 +5,7 @@ import CoursesSkeleton from "$lib/components/courses/coursesSkeleton.svelte"; import SubPageHeader from '$shared/subPageHeader.svelte'; import { t } from "$lib/i18n"; + //import { course } from '$types/courseType'; // Initiniatize variables @@ -13,6 +14,8 @@ code: '', ects: 0, teacher: '', + syllabus: '', + eudoxus: '', grade: '', semester: '', weeklyHours: 0, @@ -36,7 +39,7 @@ }; export let id; - let result; + let result: any; // Extract courseCode from the URL // const courseCode = $page.params.courseId; @@ -50,7 +53,7 @@ // Assign values from the result to course course.title = result.courseTitle; - course.code = courseCode; + course.code = result.code; course.ects = result.ects; // Get teacher name for each teacher @@ -64,7 +67,12 @@ course.weeklyHours = result.weeklyHours; course.courseType = result.courseType; course.season = result.season; - + if(result.syllabus){ + course.syllabus = result.syllabus; + } + if(result.eudoxus) { + course.eudoxus = result.eudoxus + } if (result.period) { course.period = result.period; } @@ -74,18 +82,18 @@ // Fetch statistics result = await statistics(courseCode); if (result) { - stats.grade = result.myGrade; - stats.studentsLikeMe = result.studentsLikeMe; - stats.studentsBetterThanMe = result.studentsBetterThanMe; - stats.studentsWorseThanMe = result.studentsWorseThanMe; - stats.passedCount = result.studentsPassed; - stats.failedCount = result.studentsFailed; - stats.totalStudents = result.totalStudents; - // fix to 2 digits after decimal point - stats.averageGradePassed = result.averagePassed.toFixed(1); - stats.averageGrade = result.average.toFixed(1); - stats.gradesCount = result.gradesCount; - stats.top10Percent = result.topPercent; + stats.grade = result.myGrade; + stats.studentsLikeMe = result.studentsLikeMe; + stats.studentsBetterThanMe = result.studentsBetterThanMe; + stats.studentsWorseThanMe = result.studentsWorseThanMe; + stats.passedCount = result.studentsPassed; + stats.failedCount = result.studentsFailed; + stats.totalStudents = result.totalStudents; + // fix to 2 digits after decimal point + stats.averageGradePassed = Number((result.averagePassed as number).toFixed(1)); + stats.averageGrade = result.average.toFixed(1); + stats.gradesCount = result.gradesCount; + stats.top10Percent = result.topPercent; } diff --git a/src/lib/components/degreeCalculator/card.svelte b/src/lib/components/degreeCalculator/card.svelte index e498143f..5b334d8f 100644 --- a/src/lib/components/degreeCalculator/card.svelte +++ b/src/lib/components/degreeCalculator/card.svelte @@ -15,16 +15,19 @@ import { fade } from 'svelte/transition'; import { courseAdded, customCourses } from './courseStore.ts'; import { get } from 'svelte/store'; + import { localize } from '$src/lib/translations/localize.js'; + import {locale} from "$lib/i18n.js" export let flip; let unpassed_courses: { - title: string; + name: string; id: string; semester_id: number; semester_name: string; grade: number; input_grade: string; coefficient: number; + locale: any; }[] = []; // Define the degree_grade object to store the average grades for the custom courses @@ -96,7 +99,7 @@ {#each unpassed_courses as course}
diff --git a/src/lib/components/degreeCalculator/course.svelte b/src/lib/components/degreeCalculator/course.svelte index 8b4d67da..6d4a4672 100644 --- a/src/lib/components/degreeCalculator/course.svelte +++ b/src/lib/components/degreeCalculator/course.svelte @@ -1,4 +1,7 @@ - diff --git a/src/lib/components/grades/statsCard.svelte b/src/lib/components/grades/statsCard.svelte index 7e27906e..de8fd76d 100644 --- a/src/lib/components/grades/statsCard.svelte +++ b/src/lib/components/grades/statsCard.svelte @@ -22,12 +22,12 @@ export let flip; /** - * @type {null | undefined} + * @type {number | null | undefined} */ export let subjectsJSON; /** - * @type {Chart<"line", number[], string>} + * @type {Chart<"line", number[], string> | string} */ let primaryColor; @@ -67,6 +67,9 @@ */ async function processAverages(subjectsJSON) { try { + /** + * @type {any} + */ const result = await averages(subjectsJSON); gradesObject.average = result.avg; gradesObject.weightedAverage = result.weighted_avg; @@ -82,6 +85,9 @@ */ async function processAveragesPerSemester(subjectsJSON) { try { + /** + * @type {any} + */ const result = await averagesPerSemester(subjectsJSON); gradesObject.averagesPerSemester = result; @@ -107,47 +113,50 @@ chart.destroy(); } if (!searchQuery.length) { - chart = new Chart(document.getElementById('gradeChart'), { - type: 'line', - data: { - labels: gradesObject.semester, - datasets: [ - { - data: gradesObject.averagesPerSemester, - fill: { - target: 'origin', - above: gradeFill - }, - tension: 0.4, - borderColor: primaryColor, // Set the color here - backgroundColor: 'primaryColor' // Optionally set the fill color - } - ] - }, - options: { - responsive: true, - scales: { - y: { - beginAtZero: false, - grid: { - display: false + const chartElement = document.getElementById('gradeChart'); + if (chartElement) { + chart = new Chart(/** @type {HTMLCanvasElement} */ (chartElement), { + type: 'line', + data: { + labels: gradesObject.semester, + datasets: [ + { + data: gradesObject.averagesPerSemester, + fill: { + target: 'origin', + above: gradeFill + }, + tension: 0.4, + borderColor: primaryColor, // Set the color here + backgroundColor: 'primaryColor' // Optionally set the fill color } - } + ] }, - plugins: { - legend: { - display: false + options: { + responsive: true, + scales: { + y: { + beginAtZero: false, + grid: { + display: false + } + } }, - title: { - display: true, - text: $t('progress.average_evolution'), - font: { - size: 15 + plugins: { + legend: { + display: false + }, + title: { + display: true, + text: $t('progress.average_evolution'), + font: { + size: 15 + } } } } - } - }); + }); + } } }); diff --git a/src/lib/components/language/Modal.svelte b/src/lib/components/language/Modal.svelte index f7118e3a..b8da8533 100644 --- a/src/lib/components/language/Modal.svelte +++ b/src/lib/components/language/Modal.svelte @@ -1,5 +1,5 @@