From fa53382c08061788bff182395da08e6bd34b73cf Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Tue, 3 Sep 2024 17:43:33 +0100 Subject: [PATCH] Hidden the level score when not released --- src/components/Medium/StatGridItem.tsx | 22 +++++++----- src/components/ModuleBadge.tsx | 44 +++++++++++++----------- src/dashboards/AssignmentCreator.tsx | 5 ++- src/dashboards/Corporate.tsx | 1 + src/dashboards/MasterCorporate.tsx | 1 + src/dashboards/Teacher.tsx | 1 + src/dashboards/views/AssignmentsPage.tsx | 4 ++- src/interfaces/results.ts | 1 + src/pages/record.tsx | 3 ++ 9 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/components/Medium/StatGridItem.tsx b/src/components/Medium/StatGridItem.tsx index 3470b20c..b0c3622b 100644 --- a/src/components/Medium/StatGridItem.tsx +++ b/src/components/Medium/StatGridItem.tsx @@ -2,7 +2,7 @@ import React from "react"; import {BsClock, BsXCircle} from "react-icons/bs"; import clsx from "clsx"; import {Stat, User} from "@/interfaces/user"; -import {Module} from "@/interfaces"; +import {Module, Step} from "@/interfaces"; import ai_usage from "@/utils/ai.detection"; import {calculateBandScore} from "@/utils/score"; import moment from "moment"; @@ -77,6 +77,7 @@ interface StatsGridItemProps { assignments: Assignment[]; users: User[]; training?: boolean; + gradingSystem?: Step[]; selectedTrainingExams?: string[]; maxTrainingExams?: number; setSelectedTrainingExams?: React.Dispatch>; @@ -97,6 +98,7 @@ const StatsGridItem: React.FC = ({ users, training, selectedTrainingExams, + gradingSystem, setSelectedTrainingExams, setExams, setShowSolutions, @@ -214,10 +216,14 @@ const StatsGridItem: React.FC = ({
- - Level{" "} - {(aggregatedLevels.reduce((accumulator, current) => accumulator + current.level, 0) / aggregatedLevels.length).toFixed(1)} - + {!!assignment && (assignment.released || assignment.released === undefined) && ( + + Level{" "} + {( + aggregatedLevels.reduce((accumulator, current) => accumulator + current.level, 0) / aggregatedLevels.length + ).toFixed(1)} + + )} {shouldRenderPDFIcon() && renderPdfIcon(session, textColor, textColor)}
{examNumber === undefined ? ( @@ -242,9 +248,9 @@ const StatsGridItem: React.FC = ({
- {aggregatedLevels.map(({module, level}) => ( - - ))} + {!!assignment && + (assignment.released || assignment.released === undefined) && + aggregatedLevels.map(({module, level}) => )}
{assignment && ( diff --git a/src/components/ModuleBadge.tsx b/src/components/ModuleBadge.tsx index fc763487..0a791bd6 100644 --- a/src/components/ModuleBadge.tsx +++ b/src/components/ModuleBadge.tsx @@ -1,24 +1,28 @@ +import {Step} from "@/interfaces"; +import {getGradingLabel, getLevelLabel} from "@/utils/score"; import clsx from "clsx"; -import { BsBook, BsClipboard, BsHeadphones, BsMegaphone, BsPen } from "react-icons/bs"; +import {BsBook, BsClipboard, BsHeadphones, BsMegaphone, BsPen} from "react-icons/bs"; -const ModuleBadge: React.FC<{ module: string; level?: number }> = ({ module, level }) => ( -
- {module === "reading" && } - {module === "listening" && } - {module === "writing" && } - {module === "speaking" && } - {module === "level" && } - {/* do not switch to level && it will convert the 0.0 to 0*/} - {level !== undefined && ({level.toFixed(1)})} -
+const ModuleBadge: React.FC<{module: string; level?: number; gradingSystem?: Step[]}> = ({module, level, gradingSystem}) => ( +
+ {module === "reading" && } + {module === "listening" && } + {module === "writing" && } + {module === "speaking" && } + {module === "level" && } + {/* do not switch to level && it will convert the 0.0 to 0*/} + {level !== undefined && ( + {module === "level" && gradingSystem ? getGradingLabel(level, gradingSystem) : level.toFixed(1)} + )} +
); -export default ModuleBadge; \ No newline at end of file +export default ModuleBadge; diff --git a/src/dashboards/AssignmentCreator.tsx b/src/dashboards/AssignmentCreator.tsx index 713a791e..4952e14e 100644 --- a/src/dashboards/AssignmentCreator.tsx +++ b/src/dashboards/AssignmentCreator.tsx @@ -25,14 +25,16 @@ import useExams from "@/hooks/useExams"; interface Props { isCreating: boolean; users: User[]; + user: User; groups: Group[]; assignment?: Assignment; cancelCreation: () => void; } -export default function AssignmentCreator({isCreating, assignment, groups, users, cancelCreation}: Props) { +export default function AssignmentCreator({isCreating, assignment, user, groups, users, cancelCreation}: Props) { const [selectedModules, setSelectedModules] = useState(assignment?.exams.map((e) => e.module) || []); const [assignees, setAssignees] = useState(assignment?.assignees || []); + const [teachers, setTeachers] = useState(!!assignment ? assignment.teachers || [] : [...(user.type === "teacher" ? [user.id] : [])]); const [name, setName] = useState( assignment?.name || generate({ @@ -84,6 +86,7 @@ export default function AssignmentCreator({isCreating, assignment, groups, users endDate, selectedModules, generateMultiple, + teachers, variant, instructorGender, released, diff --git a/src/dashboards/Corporate.tsx b/src/dashboards/Corporate.tsx index 7a70fbe3..3e74ba42 100644 --- a/src/dashboards/Corporate.tsx +++ b/src/dashboards/Corporate.tsx @@ -524,6 +524,7 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) { {router.asPath === "/#assignments" && ( router.push("/")} diff --git a/src/dashboards/views/AssignmentsPage.tsx b/src/dashboards/views/AssignmentsPage.tsx index f8bad06b..7786f48a 100644 --- a/src/dashboards/views/AssignmentsPage.tsx +++ b/src/dashboards/views/AssignmentsPage.tsx @@ -16,11 +16,12 @@ interface Props { groups: Group[]; users: User[]; isLoading: boolean; + user: User; onBack: () => void; reloadAssignments: () => void; } -export default function AssignmentsPage({assignments, corporateAssignments, groups, users, isLoading, onBack, reloadAssignments}: Props) { +export default function AssignmentsPage({assignments, corporateAssignments, user, groups, users, isLoading, onBack, reloadAssignments}: Props) { const [selectedAssignment, setSelectedAssignment] = useState(); const [isCreatingAssignment, setIsCreatingAssignment] = useState(false); @@ -39,6 +40,7 @@ export default function AssignmentsPage({assignments, corporateAssignments, grou assignment={selectedAssignment} groups={groups} users={users} + user={user} isCreating={isCreatingAssignment} cancelCreation={() => { setIsCreatingAssignment(false); diff --git a/src/interfaces/results.ts b/src/interfaces/results.ts index f14c0481..63aee893 100644 --- a/src/interfaces/results.ts +++ b/src/interfaces/results.ts @@ -26,6 +26,7 @@ export interface Assignment { instructorGender?: InstructorGender; startDate: Date; endDate: Date; + teachers?: string[]; archived?: boolean; released?: boolean; // unless start is active, the assignment is not visible to the assignees diff --git a/src/pages/record.tsx b/src/pages/record.tsx index 43d41d12..3500fe70 100644 --- a/src/pages/record.tsx +++ b/src/pages/record.tsx @@ -24,6 +24,7 @@ import useTrainingContentStore from "@/stores/trainingContentStore"; import {Assignment} from "@/interfaces/results"; import {getUsers} from "@/utils/users.be"; import {getAssignments, getAssignmentsByAssigner} from "@/utils/assignments.be"; +import useGradingSystem from "@/hooks/useGrading"; export const getServerSideProps = withIronSessionSsr(async ({req, res}) => { const user = req.session.user; @@ -76,6 +77,7 @@ export default function History({user, users, assignments}: Props) { const [filter, setFilter] = useState(); const {data: stats, isLoading: isStatsLoading} = useFilterRecordsByUser(statsUserId || user?.id); + const {gradingSystem} = useGradingSystem(); const setExams = useExamStore((state) => state.setExams); const setShowSolutions = useExamStore((state) => state.setShowSolutions); @@ -185,6 +187,7 @@ export default function History({user, users, assignments}: Props) { setSelectedTrainingExams={setSelectedTrainingExams} maxTrainingExams={MAX_TRAINING_EXAMS} setExams={setExams} + gradingSystem={gradingSystem?.steps} setShowSolutions={setShowSolutions} setUserSolutions={setUserSolutions} setSelectedModules={setSelectedModules}