From 0161fa5f1c4198d1b1f2d313266939cb654980ee Mon Sep 17 00:00:00 2001 From: Noah Streller Date: Thu, 23 May 2024 17:09:04 +0200 Subject: [PATCH] feat: added simulated weight feature --- components/cards/required-grades.tsx | 72 ++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/components/cards/required-grades.tsx b/components/cards/required-grades.tsx index 11a5e0a..9c7cb1a 100644 --- a/components/cards/required-grades.tsx +++ b/components/cards/required-grades.tsx @@ -1,9 +1,13 @@ "use client"; import { usePreferences } from "@/components/preferences-provider"; import { SubjectGradeBadge } from "@/components/subject-grade-badge"; +import { Button } from "@/components/ui/button"; +import { Highlight } from "@/components/ui/card-stack"; +import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { MediaQueries, useMediaQuery } from "@/lib/hooks/useMediaQuery"; +import { doesGradePass } from "@/lib/services/notAsyncLogic"; import { round, truncateText } from "@/lib/utils"; import { AverageWithSubject } from "@/types/types"; import { Bird } from "lucide-react"; @@ -22,9 +26,11 @@ import { CardBoard } from "../ui/cardboard"; function RequiredGradesBody({ averageData, showPassing, + simulatedWeight, }: { averageData: AverageWithSubject[]; showPassing: boolean; + simulatedWeight: number; }) { const { t } = useTranslation("common"); const preferences = usePreferences().preferences; @@ -37,11 +43,12 @@ function RequiredGradesBody({ average: AverageWithSubject ): { result: number; overflowCounts: number } => { let sum = average.average?.gradeWeightedSum!; - let count = average.average?.gradeWeightedAmount! + 1; + let weight = simulatedWeight; + let count = average.average?.gradeWeightedAmount! + weight; let passing = preferences?.passingGrade!; let max = preferences?.maximumGrade!; let min = preferences?.minimumGrade!; - let result = passing * count - sum; + let result = (passing * count - sum) / weight; let overflowCounts = 0; while (result > max || result < min) { count++; @@ -52,7 +59,7 @@ function RequiredGradesBody({ sum += min; overflowCounts--; } - result = passing * count - sum; + result = (passing * count - sum) / weight; } return { result, overflowCounts }; }; @@ -95,15 +102,23 @@ function RequiredGradesBody({ const shouldBeShown = (average: AverageWithSubject) => { return ( - (average.average?.passing === false || showPassing) && average.average + (doesGradePass(average.average?.gradeAverage!, preferences!) === + false || + showPassing) && + average.average ); }; setChunkPairs([...chunkIntoPieces(averageData, isMobile ? 1 : 2)]); - }, [averageData, showPassing]); + }, [averageData, isMobile, showPassing, preferences]); return ( +

+ If your next exam is weighted{" "} + {simulatedWeight}, you will + need: +

{chunkPairs.length === 0 ? ( @@ -123,7 +138,11 @@ function RequiredGradesBody({

- {average.subject && average.average?.passing ? ( + {average.subject && + doesGradePass( + average.average?.gradeAverage!, + preferences! + ) ? ( {truncateForPage(average.subject.name)} @@ -149,7 +168,7 @@ function RequiredGradesBody({ ) : null}
- {average.average?.passing + {doesGradePass(average.average?.gradeAverage!, preferences!) ? t("required-grades.passed") : t("required-grades.required")}

@@ -170,6 +189,13 @@ export function RequiredGrades({ }) { const { t } = useTranslation("common"); const [showPassing, setShowPassing] = useState(false); + const [simulatedWeight, setSimulatedWeight] = useState(); + + const getSimulatedWeight = () => { + if (!simulatedWeight || simulatedWeight <= 0) + return { simulatedWeight: 1, valid: false }; + return { simulatedWeight, valid: true }; + }; return ( @@ -185,11 +211,41 @@ export function RequiredGrades({
- + + + If you know the weight of the next exam, you can apply that weight to + the required grades. + +
+ { + console.log("changed"); + setSimulatedWeight(e.target.valueAsNumber); + }} + placeholder="Simulated weight" + className="w-[250px]" + /> + +
+ {!getSimulatedWeight().valid && ( + + Weight must be a positive number + + )}
);