Hidden the level score when not released

This commit is contained in:
Tiago Ribeiro
2024-09-03 17:43:33 +01:00
parent 67929655f4
commit fa53382c08
9 changed files with 52 additions and 30 deletions

View File

@@ -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<React.SetStateAction<string[]>>;
@@ -97,6 +98,7 @@ const StatsGridItem: React.FC<StatsGridItemProps> = ({
users,
training,
selectedTrainingExams,
gradingSystem,
setSelectedTrainingExams,
setExams,
setShowSolutions,
@@ -214,10 +216,14 @@ const StatsGridItem: React.FC<StatsGridItemProps> = ({
</div>
<div className="flex flex-col gap-2">
<div className="flex flex-row gap-2">
{!!assignment && (assignment.released || assignment.released === undefined) && (
<span className={textColor}>
Level{" "}
{(aggregatedLevels.reduce((accumulator, current) => accumulator + current.level, 0) / aggregatedLevels.length).toFixed(1)}
{(
aggregatedLevels.reduce((accumulator, current) => accumulator + current.level, 0) / aggregatedLevels.length
).toFixed(1)}
</span>
)}
{shouldRenderPDFIcon() && renderPdfIcon(session, textColor, textColor)}
</div>
{examNumber === undefined ? (
@@ -242,9 +248,9 @@ const StatsGridItem: React.FC<StatsGridItemProps> = ({
<div className="w-full flex flex-col gap-1">
<div className={clsx("grid grid-cols-4 gap-2 place-items-start w-full -md:mt-2", examNumber !== undefined && "pr-10")}>
{aggregatedLevels.map(({module, level}) => (
<ModuleBadge key={module} module={module} level={level} />
))}
{!!assignment &&
(assignment.released || assignment.released === undefined) &&
aggregatedLevels.map(({module, level}) => <ModuleBadge key={module} module={module} level={level} />)}
</div>
{assignment && (

View File

@@ -1,7 +1,9 @@
import {Step} from "@/interfaces";
import {getGradingLabel, getLevelLabel} from "@/utils/score";
import clsx from "clsx";
import {BsBook, BsClipboard, BsHeadphones, BsMegaphone, BsPen} from "react-icons/bs";
const ModuleBadge: React.FC<{ module: string; level?: number }> = ({ module, level }) => (
const ModuleBadge: React.FC<{module: string; level?: number; gradingSystem?: Step[]}> = ({module, level, gradingSystem}) => (
<div
className={clsx(
"flex gap-2 items-center w-fit text-white -md:px-4 xl:px-4 md:px-2 py-2 rounded-xl",
@@ -17,7 +19,9 @@ const ModuleBadge: React.FC<{ module: string; level?: number }> = ({ module, lev
{module === "speaking" && <BsMegaphone className="w-4 h-4" />}
{module === "level" && <BsClipboard className="w-4 h-4" />}
{/* do not switch to level && it will convert the 0.0 to 0*/}
{level !== undefined && (<span className="text-sm">{level.toFixed(1)}</span>)}
{level !== undefined && (
<span className="text-sm">{module === "level" && gradingSystem ? getGradingLabel(level, gradingSystem) : level.toFixed(1)}</span>
)}
</div>
);

View File

@@ -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<Module[]>(assignment?.exams.map((e) => e.module) || []);
const [assignees, setAssignees] = useState<string[]>(assignment?.assignees || []);
const [teachers, setTeachers] = useState<string[]>(!!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,

View File

@@ -524,6 +524,7 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) {
{router.asPath === "/#assignments" && (
<AssignmentsPage
assignments={assignments}
user={user}
groups={assignmentsGroups}
users={assignmentsUsers}
reloadAssignments={reloadAssignments}

View File

@@ -713,6 +713,7 @@ export default function MasterCorporateDashboard({user}: Props) {
assignments={assignments}
corporateAssignments={corporateAssignments}
groups={assignmentsGroups}
user={user}
users={assignmentsUsers}
reloadAssignments={reloadAssignments}
isLoading={isAssignmentsLoading}

View File

@@ -301,6 +301,7 @@ export default function TeacherDashboard({user, linkedCorporate}: Props) {
assignments={assignments}
groups={assignmentsGroups}
users={assignmentsUsers}
user={user}
reloadAssignments={reloadAssignments}
isLoading={isAssignmentsLoading}
onBack={() => router.push("/")}

View File

@@ -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<Assignment>();
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);

View File

@@ -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

View File

@@ -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<Filter>();
const {data: stats, isLoading: isStatsLoading} = useFilterRecordsByUser<Stat[]>(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}