From d30e0ecc7f16b7ff040a55410a50a58328a3a85d Mon Sep 17 00:00:00 2001 From: positivelyjon Date: Wed, 14 Feb 2024 00:59:21 +0800 Subject: [PATCH 01/13] Create new tab for popular votes leaderboard --- .../AssessmentWorkspace.tsx | 13 ++++ .../SideContentContestLeaderboard.tsx | 69 +++++++++++++++---- src/commons/sideContent/SideContentTypes.ts | 3 +- 3 files changed, 71 insertions(+), 14 deletions(-) diff --git a/src/commons/assessmentWorkspace/AssessmentWorkspace.tsx b/src/commons/assessmentWorkspace/AssessmentWorkspace.tsx index 7aec87268c..104ccee27a 100644 --- a/src/commons/assessmentWorkspace/AssessmentWorkspace.tsx +++ b/src/commons/assessmentWorkspace/AssessmentWorkspace.tsx @@ -450,9 +450,22 @@ const AssessmentWorkspace: React.FC = props => { ), id: SideContentType.scoreLeaderboard + }, + { + label: 'Popular Votes Leaderboard', + iconName: IconNames.PEOPLE, + body: ( + + ), + id: SideContentType.popularVotesLeaderboard } ); } else { diff --git a/src/commons/sideContent/SideContentContestLeaderboard.tsx b/src/commons/sideContent/SideContentContestLeaderboard.tsx index 3f123cfdce..df659e715d 100644 --- a/src/commons/sideContent/SideContentContestLeaderboard.tsx +++ b/src/commons/sideContent/SideContentContestLeaderboard.tsx @@ -5,6 +5,7 @@ import React, { useMemo, useState } from 'react'; import { ContestEntry } from '../assessment/AssessmentTypes'; import SideContentLeaderboardCard from './SideContentLeaderboardCard'; +import { SideContentType } from './SideContentTypes'; export type SideContentContestLeaderboardProps = DispatchProps & StateProps; @@ -14,6 +15,7 @@ type DispatchProps = { type StateProps = { orderedContestEntries: ContestEntry[]; + leaderboardType: SideContentType; }; /* @@ -26,15 +28,56 @@ const columnHeader = (colClass: string, colTitle: string) => ( ); -const contestEntryHeader = ( -
- {columnHeader('header-entryid', 'Student Name')} - {columnHeader('header-entryrank', 'Rank')} - {columnHeader('header-score', 'Score')} -
-); +const contestEntryHeader = (leaderboardType: SideContentType) => { + let leaderboardMetric = ''; + switch (leaderboardType) { + case SideContentType.scoreLeaderboard: + leaderboardMetric = 'Score'; + break; + case SideContentType.popularVotesLeaderboard: + leaderboardMetric = 'Votes'; + break; + default: + leaderboardMetric = 'Metric'; + } + return ( +
+ {columnHeader('header-entryid', 'Student Name')} + {columnHeader('header-entryrank', 'Rank')} + {columnHeader('header-score', leaderboardMetric)} +
+ ); +}; + +const leaderboardTitle = (leaderboardType: SideContentType) => { + let leaderboardTitle = ''; + switch (leaderboardType) { + case SideContentType.scoreLeaderboard: + leaderboardTitle = 'Score Leaderboard'; + break; + case SideContentType.popularVotesLeaderboard: + leaderboardTitle = 'Popular Votes Leaderboard'; + break; + default: + leaderboardTitle = 'Contest Leaderboard'; + } + return leaderboardTitle; +}; -const contestLeaderboardTooltipContent = 'View the top-rated contest entries!'; +const contestLeaderboardTooltipContent = (leaderboardType: SideContentType) => { + let leaderboardTooltipContent = ''; + switch (leaderboardType) { + case SideContentType.scoreLeaderboard: + leaderboardTooltipContent = 'View the highest scoring contest entries!'; + break; + case SideContentType.popularVotesLeaderboard: + leaderboardTooltipContent = 'View the most popular contest entries!'; + break; + default: + leaderboardTooltipContent = 'View the top-rated contest entries!'; + } + return leaderboardTooltipContent; +}; /** * Renders the contest leaderboard entries as a SideContentTab for Contest Voting questions. @@ -47,13 +90,13 @@ const contestLeaderboardTooltipContent = 'View the top-rated contest entries!'; const SideContentContestLeaderboard: React.FunctionComponent< SideContentContestLeaderboardProps > = props => { - const { orderedContestEntries, handleContestEntryClick } = props; + const { orderedContestEntries, handleContestEntryClick, leaderboardType } = props; const [showLeaderboard, setShowLeaderboard] = useState(true); const contestEntryCards = useMemo( () => (
- {contestEntryHeader} + {contestEntryHeader(leaderboardType)} {orderedContestEntries.length > 0 ? ( orderedContestEntries.map((contestEntry: ContestEntry, index: number) => ( ), - [handleContestEntryClick, orderedContestEntries] + [handleContestEntryClick, orderedContestEntries, leaderboardType] ); return ( @@ -79,8 +122,8 @@ const SideContentContestLeaderboard: React.FunctionComponent< minimal={true} onClick={() => setShowLeaderboard(!showLeaderboard)} > - Score Leaderboard - + {leaderboardTitle(leaderboardType)} + diff --git a/src/commons/sideContent/SideContentTypes.ts b/src/commons/sideContent/SideContentTypes.ts index 16911a57b0..91e0157b0a 100644 --- a/src/commons/sideContent/SideContentTypes.ts +++ b/src/commons/sideContent/SideContentTypes.ts @@ -8,7 +8,6 @@ export enum SideContentType { autograder = 'autograder', briefing = 'briefing', contestVoting = 'contest_voting', - scoreLeaderboard = 'score_leaderboard', dataVisualizer = 'data_visualizer', editorGrading = 'editor_grading', editorAutograder = 'editor_autograder', @@ -25,8 +24,10 @@ export enum SideContentType { grading = 'grading', introduction = 'introduction', module = 'module', + popularVotesLeaderboard = 'popular_votes_leaderboard', questionOverview = 'question_overview', remoteExecution = 'remote_execution', + scoreLeaderboard = 'score_leaderboard', missionMetadata = 'mission_metadata', mobileEditor = 'mobile_editor', mobileEditorRun = 'mobile_editor_run', From 4230612135b8fa5bb9eae9f02680ed49522d06e9 Mon Sep 17 00:00:00 2001 From: positivelyjon Date: Wed, 14 Feb 2024 20:30:13 +0800 Subject: [PATCH 02/13] Rename popular votes to popular vote leaderboard --- src/commons/assessmentWorkspace/AssessmentWorkspace.tsx | 6 +++--- src/commons/sideContent/SideContentContestLeaderboard.tsx | 8 ++++---- src/commons/sideContent/SideContentTypes.ts | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/commons/assessmentWorkspace/AssessmentWorkspace.tsx b/src/commons/assessmentWorkspace/AssessmentWorkspace.tsx index 104ccee27a..90d4e22724 100644 --- a/src/commons/assessmentWorkspace/AssessmentWorkspace.tsx +++ b/src/commons/assessmentWorkspace/AssessmentWorkspace.tsx @@ -456,16 +456,16 @@ const AssessmentWorkspace: React.FC = props => { id: SideContentType.scoreLeaderboard }, { - label: 'Popular Votes Leaderboard', + label: 'Popular Vote Leaderboard', iconName: IconNames.PEOPLE, body: ( ), - id: SideContentType.popularVotesLeaderboard + id: SideContentType.popularVoteLeaderboard } ); } else { diff --git a/src/commons/sideContent/SideContentContestLeaderboard.tsx b/src/commons/sideContent/SideContentContestLeaderboard.tsx index df659e715d..99aaf92a95 100644 --- a/src/commons/sideContent/SideContentContestLeaderboard.tsx +++ b/src/commons/sideContent/SideContentContestLeaderboard.tsx @@ -34,7 +34,7 @@ const contestEntryHeader = (leaderboardType: SideContentType) => { case SideContentType.scoreLeaderboard: leaderboardMetric = 'Score'; break; - case SideContentType.popularVotesLeaderboard: + case SideContentType.popularVoteLeaderboard: leaderboardMetric = 'Votes'; break; default: @@ -55,8 +55,8 @@ const leaderboardTitle = (leaderboardType: SideContentType) => { case SideContentType.scoreLeaderboard: leaderboardTitle = 'Score Leaderboard'; break; - case SideContentType.popularVotesLeaderboard: - leaderboardTitle = 'Popular Votes Leaderboard'; + case SideContentType.popularVoteLeaderboard: + leaderboardTitle = 'Popular Vote Leaderboard'; break; default: leaderboardTitle = 'Contest Leaderboard'; @@ -70,7 +70,7 @@ const contestLeaderboardTooltipContent = (leaderboardType: SideContentType) => { case SideContentType.scoreLeaderboard: leaderboardTooltipContent = 'View the highest scoring contest entries!'; break; - case SideContentType.popularVotesLeaderboard: + case SideContentType.popularVoteLeaderboard: leaderboardTooltipContent = 'View the most popular contest entries!'; break; default: diff --git a/src/commons/sideContent/SideContentTypes.ts b/src/commons/sideContent/SideContentTypes.ts index 91e0157b0a..333ba788c9 100644 --- a/src/commons/sideContent/SideContentTypes.ts +++ b/src/commons/sideContent/SideContentTypes.ts @@ -24,7 +24,7 @@ export enum SideContentType { grading = 'grading', introduction = 'introduction', module = 'module', - popularVotesLeaderboard = 'popular_votes_leaderboard', + popularVoteLeaderboard = 'popular_vote_leaderboard', questionOverview = 'question_overview', remoteExecution = 'remote_execution', scoreLeaderboard = 'score_leaderboard', From d3a29d1ee07c4ce6848c003c0ad93260efd246bb Mon Sep 17 00:00:00 2001 From: positivelyjon Date: Wed, 14 Feb 2024 20:34:59 +0800 Subject: [PATCH 03/13] Edit assessment mocks and assessment types to include popular vote --- src/commons/assessment/AssessmentTypes.ts | 1 + src/commons/mocks/AssessmentMocks.ts | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/commons/assessment/AssessmentTypes.ts b/src/commons/assessment/AssessmentTypes.ts index 6b1144e931..afa2a934c8 100644 --- a/src/commons/assessment/AssessmentTypes.ts +++ b/src/commons/assessment/AssessmentTypes.ts @@ -122,6 +122,7 @@ export interface IContestVotingQuestion extends BaseQuestion { postpend: string; contestEntries: ContestEntry[]; scoreLeaderboard: ContestEntry[]; + popularVoteLeaderboard: ContestEntry[]; type: 'voting'; } diff --git a/src/commons/mocks/AssessmentMocks.ts b/src/commons/mocks/AssessmentMocks.ts index 5f7deaca51..6f908101f0 100644 --- a/src/commons/mocks/AssessmentMocks.ts +++ b/src/commons/mocks/AssessmentMocks.ts @@ -866,12 +866,24 @@ const mockContestEntryQuestion: Array = [ { submission_id: 1, student_name: 'student_1', - answer: { code: "display('leaderboard test')" } + answer: { code: "display('score_leaderboard test')" } }, { submission_id: 2, student_name: 'student_2', - answer: { code: 'function leaderboard_test() { return true; }' } + answer: { code: 'function score_leaderboard_test() { return true; }' } + } + ], + popularVoteLeaderboard: [ + { + submission_id: 1, + student_name: 'student_1', + answer: { code: "display('popular_vote_leaderboard test')" } + }, + { + submission_id: 2, + student_name: 'student_2', + answer: { code: 'function popular_vote_leaderboard_test() { return true; }' } } ], library: mockLibrary, From 43e1e01dd4ef20d8e8a2e84b533b9e96b665926b Mon Sep 17 00:00:00 2001 From: positivelyjon Date: Wed, 14 Feb 2024 20:52:34 +0800 Subject: [PATCH 04/13] Modify tests --- .../sideContent/SideContentContestLeaderboard.tsx | 4 ++-- .../__tests__/SideContentContestLeaderboard.tsx | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/commons/sideContent/SideContentContestLeaderboard.tsx b/src/commons/sideContent/SideContentContestLeaderboard.tsx index 99aaf92a95..1aaa5d9fd8 100644 --- a/src/commons/sideContent/SideContentContestLeaderboard.tsx +++ b/src/commons/sideContent/SideContentContestLeaderboard.tsx @@ -32,10 +32,10 @@ const contestEntryHeader = (leaderboardType: SideContentType) => { let leaderboardMetric = ''; switch (leaderboardType) { case SideContentType.scoreLeaderboard: - leaderboardMetric = 'Score'; + leaderboardMetric = 'Calculated Score'; break; case SideContentType.popularVoteLeaderboard: - leaderboardMetric = 'Votes'; + leaderboardMetric = 'Popularity Score'; break; default: leaderboardMetric = 'Metric'; diff --git a/src/commons/sideContent/__tests__/SideContentContestLeaderboard.tsx b/src/commons/sideContent/__tests__/SideContentContestLeaderboard.tsx index 50ec9f4f76..27777b2e3c 100644 --- a/src/commons/sideContent/__tests__/SideContentContestLeaderboard.tsx +++ b/src/commons/sideContent/__tests__/SideContentContestLeaderboard.tsx @@ -3,6 +3,7 @@ import userEvent from '@testing-library/user-event'; import { shallowRender } from 'src/commons/utils/TestUtils'; import SideContentContestLeaderboard from '../SideContentContestLeaderboard'; +import { SideContentType } from '../SideContentTypes'; const mockLeaderboardEntries = [ { @@ -27,7 +28,8 @@ const mockLeaderboardEntries = [ const mockProps = { handleContestEntryClick: () => {}, - orderedContestEntries: mockLeaderboardEntries + orderedContestEntries: mockLeaderboardEntries, + leaderboardType: SideContentType.scoreLeaderboard }; // Basic snapshot testing to catch unexpected changes @@ -54,13 +56,14 @@ test('SideContentContestLeaderboard orders entry in the same order as orderedCon expect(scores).toEqual(['100', '90', '80']); }); -test('Clicking the contest entry updates the editor for contest leaderboard.', async () => { +test('Clicking the contest entry updates the editor for score leaderboard.', async () => { const user = userEvent.setup(); const mockedHandleContestEntryClick = jest.fn(); const mockProps = { handleContestEntryClick: mockedHandleContestEntryClick, - orderedContestEntries: mockLeaderboardEntries + orderedContestEntries: mockLeaderboardEntries, + leaderboardType: SideContentType.scoreLeaderboard }; const contestVotingContainer = ; From e6b5b089c771cc773b3f355d2fd8e03799102f24 Mon Sep 17 00:00:00 2001 From: positivelyjon Date: Wed, 14 Feb 2024 21:09:17 +0800 Subject: [PATCH 05/13] Rename score property to calculated score and add popularity score --- src/commons/assessment/AssessmentTypes.ts | 6 ++++-- src/commons/sideContent/SideContentContestVoting.tsx | 4 ++-- .../sideContent/SideContentContestVotingContainer.tsx | 2 +- src/commons/sideContent/SideContentLeaderboardCard.tsx | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/commons/assessment/AssessmentTypes.ts b/src/commons/assessment/AssessmentTypes.ts index 778c9966e1..f33372b905 100644 --- a/src/commons/assessment/AssessmentTypes.ts +++ b/src/commons/assessment/AssessmentTypes.ts @@ -176,8 +176,10 @@ export type Testcase = { export type ContestEntry = { submission_id: number; answer: ContestEntryCodeAnswer; //contest entry program to be input into editor - score?: number; - final_score?: number; + calculated_score?: number; + final_calculated_score?: number; + popularity_score?: number; + final_popularity_score?: number; student_name?: string; }; diff --git a/src/commons/sideContent/SideContentContestVoting.tsx b/src/commons/sideContent/SideContentContestVoting.tsx index 55d16ca48e..bcbc140400 100644 --- a/src/commons/sideContent/SideContentContestVoting.tsx +++ b/src/commons/sideContent/SideContentContestVoting.tsx @@ -189,11 +189,11 @@ const SideContentContestVoting: React.FunctionComponent { sortedContestEntries.forEach((entry, index) => { - if (entry.score !== null) { + if (entry.calculated_score !== null) { const savedTierIndex = TIERS.findIndex(tier => // We are using <= instead of === for backwards // compatibiilty with legacy voting submisions. - entry.score ? tier.score <= entry.score : false + entry.calculated_score ? tier.score <= entry.calculated_score : false ); if (savedTierIndex !== -1) { const tierContainer = tierContainerRefs.current[savedTierIndex]; diff --git a/src/commons/sideContent/SideContentContestVotingContainer.tsx b/src/commons/sideContent/SideContentContestVotingContainer.tsx index 90712f83e7..9e38d0426c 100644 --- a/src/commons/sideContent/SideContentContestVotingContainer.tsx +++ b/src/commons/sideContent/SideContentContestVotingContainer.tsx @@ -33,7 +33,7 @@ const SideContentContestVotingContainer: React.FunctionComponent< const submissionHasNoNull = (votingSubmission: ContestEntry[]) => { return votingSubmission.reduce((noNull, vote) => { - return noNull && vote.score !== undefined && vote.score !== null; + return noNull && vote.calculated_score !== undefined && vote.calculated_score !== null; }, true); }; diff --git a/src/commons/sideContent/SideContentLeaderboardCard.tsx b/src/commons/sideContent/SideContentLeaderboardCard.tsx index 23548dbbe0..de95290e53 100644 --- a/src/commons/sideContent/SideContentLeaderboardCard.tsx +++ b/src/commons/sideContent/SideContentLeaderboardCard.tsx @@ -33,7 +33,7 @@ const SideContentLeaderboardCard: React.FunctionComponent<
{contestEntry.student_name}
{rank}
-          {contestEntry.final_score}
+          {contestEntry.final_calculated_score}
         
From 1ac975f76a9a4b2e31bc36f9d188d7c758c2f21d Mon Sep 17 00:00:00 2001 From: positivelyjon Date: Thu, 15 Feb 2024 02:54:10 +0800 Subject: [PATCH 06/13] Conditionally render different kinds of score depending on leaderboardType --- src/commons/assessment/AssessmentTypes.ts | 3 +-- .../SideContentContestLeaderboard.tsx | 1 + .../sideContent/SideContentContestVoting.tsx | 4 ++-- .../SideContentContestVotingContainer.tsx | 2 +- .../sideContent/SideContentLeaderboardCard.tsx | 18 ++++++++++++++++-- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/commons/assessment/AssessmentTypes.ts b/src/commons/assessment/AssessmentTypes.ts index f33372b905..ae5079c50d 100644 --- a/src/commons/assessment/AssessmentTypes.ts +++ b/src/commons/assessment/AssessmentTypes.ts @@ -176,9 +176,8 @@ export type Testcase = { export type ContestEntry = { submission_id: number; answer: ContestEntryCodeAnswer; //contest entry program to be input into editor - calculated_score?: number; + score?: number; final_calculated_score?: number; - popularity_score?: number; final_popularity_score?: number; student_name?: string; }; diff --git a/src/commons/sideContent/SideContentContestLeaderboard.tsx b/src/commons/sideContent/SideContentContestLeaderboard.tsx index 1aaa5d9fd8..853a597e2f 100644 --- a/src/commons/sideContent/SideContentContestLeaderboard.tsx +++ b/src/commons/sideContent/SideContentContestLeaderboard.tsx @@ -104,6 +104,7 @@ const SideContentContestLeaderboard: React.FunctionComponent< handleContestEntryClick={handleContestEntryClick} contestEntry={contestEntry} rank={index + 1} + leaderboardType={leaderboardType} /> )) ) : ( diff --git a/src/commons/sideContent/SideContentContestVoting.tsx b/src/commons/sideContent/SideContentContestVoting.tsx index bcbc140400..55d16ca48e 100644 --- a/src/commons/sideContent/SideContentContestVoting.tsx +++ b/src/commons/sideContent/SideContentContestVoting.tsx @@ -189,11 +189,11 @@ const SideContentContestVoting: React.FunctionComponent { sortedContestEntries.forEach((entry, index) => { - if (entry.calculated_score !== null) { + if (entry.score !== null) { const savedTierIndex = TIERS.findIndex(tier => // We are using <= instead of === for backwards // compatibiilty with legacy voting submisions. - entry.calculated_score ? tier.score <= entry.calculated_score : false + entry.score ? tier.score <= entry.score : false ); if (savedTierIndex !== -1) { const tierContainer = tierContainerRefs.current[savedTierIndex]; diff --git a/src/commons/sideContent/SideContentContestVotingContainer.tsx b/src/commons/sideContent/SideContentContestVotingContainer.tsx index 9e38d0426c..90712f83e7 100644 --- a/src/commons/sideContent/SideContentContestVotingContainer.tsx +++ b/src/commons/sideContent/SideContentContestVotingContainer.tsx @@ -33,7 +33,7 @@ const SideContentContestVotingContainer: React.FunctionComponent< const submissionHasNoNull = (votingSubmission: ContestEntry[]) => { return votingSubmission.reduce((noNull, vote) => { - return noNull && vote.calculated_score !== undefined && vote.calculated_score !== null; + return noNull && vote.score !== undefined && vote.score !== null; }, true); }; diff --git a/src/commons/sideContent/SideContentLeaderboardCard.tsx b/src/commons/sideContent/SideContentLeaderboardCard.tsx index de95290e53..82dd959cd4 100644 --- a/src/commons/sideContent/SideContentLeaderboardCard.tsx +++ b/src/commons/sideContent/SideContentLeaderboardCard.tsx @@ -3,6 +3,7 @@ import classNames from 'classnames'; import React from 'react'; import { ContestEntry } from '../assessment/AssessmentTypes'; +import { SideContentType } from './SideContentTypes'; type SideContentLeaderboardCardProps = DispatchProps & StateProps; @@ -13,12 +14,25 @@ type DispatchProps = { type StateProps = { contestEntry: ContestEntry; rank: number; + leaderboardType: SideContentType; }; const SideContentLeaderboardCard: React.FunctionComponent< SideContentLeaderboardCardProps > = props => { - const { handleContestEntryClick, contestEntry, rank } = props; + const { handleContestEntryClick, contestEntry, rank, leaderboardType } = props; + + let score; + switch (leaderboardType) { + case SideContentType.scoreLeaderboard: + score = contestEntry.final_calculated_score; + break; + case SideContentType.popularVoteLeaderboard: + score = contestEntry.final_popularity_score; + break; + default: + score = 0; + } return (
@@ -33,7 +47,7 @@ const SideContentLeaderboardCard: React.FunctionComponent<
{contestEntry.student_name}
{rank}
-          {contestEntry.final_calculated_score}
+          {score}
         
From ae59bbbe373f04de7b937482fd4f24e038f376a6 Mon Sep 17 00:00:00 2001 From: positivelyjon Date: Thu, 15 Feb 2024 12:38:32 +0800 Subject: [PATCH 07/13] Revert "Conditionally render different kinds of score depending on leaderboardType" This reverts commit 1ac975f76a9a4b2e31bc36f9d188d7c758c2f21d. --- src/commons/assessment/AssessmentTypes.ts | 3 ++- .../SideContentContestLeaderboard.tsx | 1 - .../sideContent/SideContentContestVoting.tsx | 4 ++-- .../SideContentContestVotingContainer.tsx | 2 +- .../sideContent/SideContentLeaderboardCard.tsx | 18 ++---------------- 5 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/commons/assessment/AssessmentTypes.ts b/src/commons/assessment/AssessmentTypes.ts index ae5079c50d..f33372b905 100644 --- a/src/commons/assessment/AssessmentTypes.ts +++ b/src/commons/assessment/AssessmentTypes.ts @@ -176,8 +176,9 @@ export type Testcase = { export type ContestEntry = { submission_id: number; answer: ContestEntryCodeAnswer; //contest entry program to be input into editor - score?: number; + calculated_score?: number; final_calculated_score?: number; + popularity_score?: number; final_popularity_score?: number; student_name?: string; }; diff --git a/src/commons/sideContent/SideContentContestLeaderboard.tsx b/src/commons/sideContent/SideContentContestLeaderboard.tsx index 853a597e2f..1aaa5d9fd8 100644 --- a/src/commons/sideContent/SideContentContestLeaderboard.tsx +++ b/src/commons/sideContent/SideContentContestLeaderboard.tsx @@ -104,7 +104,6 @@ const SideContentContestLeaderboard: React.FunctionComponent< handleContestEntryClick={handleContestEntryClick} contestEntry={contestEntry} rank={index + 1} - leaderboardType={leaderboardType} /> )) ) : ( diff --git a/src/commons/sideContent/SideContentContestVoting.tsx b/src/commons/sideContent/SideContentContestVoting.tsx index 55d16ca48e..bcbc140400 100644 --- a/src/commons/sideContent/SideContentContestVoting.tsx +++ b/src/commons/sideContent/SideContentContestVoting.tsx @@ -189,11 +189,11 @@ const SideContentContestVoting: React.FunctionComponent { sortedContestEntries.forEach((entry, index) => { - if (entry.score !== null) { + if (entry.calculated_score !== null) { const savedTierIndex = TIERS.findIndex(tier => // We are using <= instead of === for backwards // compatibiilty with legacy voting submisions. - entry.score ? tier.score <= entry.score : false + entry.calculated_score ? tier.score <= entry.calculated_score : false ); if (savedTierIndex !== -1) { const tierContainer = tierContainerRefs.current[savedTierIndex]; diff --git a/src/commons/sideContent/SideContentContestVotingContainer.tsx b/src/commons/sideContent/SideContentContestVotingContainer.tsx index 90712f83e7..9e38d0426c 100644 --- a/src/commons/sideContent/SideContentContestVotingContainer.tsx +++ b/src/commons/sideContent/SideContentContestVotingContainer.tsx @@ -33,7 +33,7 @@ const SideContentContestVotingContainer: React.FunctionComponent< const submissionHasNoNull = (votingSubmission: ContestEntry[]) => { return votingSubmission.reduce((noNull, vote) => { - return noNull && vote.score !== undefined && vote.score !== null; + return noNull && vote.calculated_score !== undefined && vote.calculated_score !== null; }, true); }; diff --git a/src/commons/sideContent/SideContentLeaderboardCard.tsx b/src/commons/sideContent/SideContentLeaderboardCard.tsx index 82dd959cd4..de95290e53 100644 --- a/src/commons/sideContent/SideContentLeaderboardCard.tsx +++ b/src/commons/sideContent/SideContentLeaderboardCard.tsx @@ -3,7 +3,6 @@ import classNames from 'classnames'; import React from 'react'; import { ContestEntry } from '../assessment/AssessmentTypes'; -import { SideContentType } from './SideContentTypes'; type SideContentLeaderboardCardProps = DispatchProps & StateProps; @@ -14,25 +13,12 @@ type DispatchProps = { type StateProps = { contestEntry: ContestEntry; rank: number; - leaderboardType: SideContentType; }; const SideContentLeaderboardCard: React.FunctionComponent< SideContentLeaderboardCardProps > = props => { - const { handleContestEntryClick, contestEntry, rank, leaderboardType } = props; - - let score; - switch (leaderboardType) { - case SideContentType.scoreLeaderboard: - score = contestEntry.final_calculated_score; - break; - case SideContentType.popularVoteLeaderboard: - score = contestEntry.final_popularity_score; - break; - default: - score = 0; - } + const { handleContestEntryClick, contestEntry, rank } = props; return (
@@ -47,7 +33,7 @@ const SideContentLeaderboardCard: React.FunctionComponent<
{contestEntry.student_name}
{rank}
-          {score}
+          {contestEntry.final_calculated_score}
         
From 53b9e744cd3210d23d8da181f8beec4ac659b858 Mon Sep 17 00:00:00 2001 From: positivelyjon Date: Thu, 15 Feb 2024 12:38:49 +0800 Subject: [PATCH 08/13] Revert "Rename score property to calculated score and add popularity score" This reverts commit e6b5b089c771cc773b3f355d2fd8e03799102f24. --- src/commons/assessment/AssessmentTypes.ts | 6 ++---- src/commons/sideContent/SideContentContestVoting.tsx | 4 ++-- .../sideContent/SideContentContestVotingContainer.tsx | 2 +- src/commons/sideContent/SideContentLeaderboardCard.tsx | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/commons/assessment/AssessmentTypes.ts b/src/commons/assessment/AssessmentTypes.ts index f33372b905..778c9966e1 100644 --- a/src/commons/assessment/AssessmentTypes.ts +++ b/src/commons/assessment/AssessmentTypes.ts @@ -176,10 +176,8 @@ export type Testcase = { export type ContestEntry = { submission_id: number; answer: ContestEntryCodeAnswer; //contest entry program to be input into editor - calculated_score?: number; - final_calculated_score?: number; - popularity_score?: number; - final_popularity_score?: number; + score?: number; + final_score?: number; student_name?: string; }; diff --git a/src/commons/sideContent/SideContentContestVoting.tsx b/src/commons/sideContent/SideContentContestVoting.tsx index bcbc140400..55d16ca48e 100644 --- a/src/commons/sideContent/SideContentContestVoting.tsx +++ b/src/commons/sideContent/SideContentContestVoting.tsx @@ -189,11 +189,11 @@ const SideContentContestVoting: React.FunctionComponent { sortedContestEntries.forEach((entry, index) => { - if (entry.calculated_score !== null) { + if (entry.score !== null) { const savedTierIndex = TIERS.findIndex(tier => // We are using <= instead of === for backwards // compatibiilty with legacy voting submisions. - entry.calculated_score ? tier.score <= entry.calculated_score : false + entry.score ? tier.score <= entry.score : false ); if (savedTierIndex !== -1) { const tierContainer = tierContainerRefs.current[savedTierIndex]; diff --git a/src/commons/sideContent/SideContentContestVotingContainer.tsx b/src/commons/sideContent/SideContentContestVotingContainer.tsx index 9e38d0426c..90712f83e7 100644 --- a/src/commons/sideContent/SideContentContestVotingContainer.tsx +++ b/src/commons/sideContent/SideContentContestVotingContainer.tsx @@ -33,7 +33,7 @@ const SideContentContestVotingContainer: React.FunctionComponent< const submissionHasNoNull = (votingSubmission: ContestEntry[]) => { return votingSubmission.reduce((noNull, vote) => { - return noNull && vote.calculated_score !== undefined && vote.calculated_score !== null; + return noNull && vote.score !== undefined && vote.score !== null; }, true); }; diff --git a/src/commons/sideContent/SideContentLeaderboardCard.tsx b/src/commons/sideContent/SideContentLeaderboardCard.tsx index de95290e53..23548dbbe0 100644 --- a/src/commons/sideContent/SideContentLeaderboardCard.tsx +++ b/src/commons/sideContent/SideContentLeaderboardCard.tsx @@ -33,7 +33,7 @@ const SideContentLeaderboardCard: React.FunctionComponent<
{contestEntry.student_name}
{rank}
-          {contestEntry.final_calculated_score}
+          {contestEntry.final_score}
         
From 4908f07b55fa5d09478659e7db6a12ce0ec41df6 Mon Sep 17 00:00:00 2001 From: positivelyjon Date: Thu, 15 Feb 2024 12:56:19 +0800 Subject: [PATCH 09/13] Edit snapshots --- .../AssessmentWorkspace.tsx.snap | 227 +++++++++++++++++- .../SideContentContestLeaderboard.tsx.snap | 4 +- 2 files changed, 228 insertions(+), 3 deletions(-) diff --git a/src/commons/assessmentWorkspace/__tests__/__snapshots__/AssessmentWorkspace.tsx.snap b/src/commons/assessmentWorkspace/__tests__/__snapshots__/AssessmentWorkspace.tsx.snap index c936aa38ae..43d3829faf 100644 --- a/src/commons/assessmentWorkspace/__tests__/__snapshots__/AssessmentWorkspace.tsx.snap +++ b/src/commons/assessmentWorkspace/__tests__/__snapshots__/AssessmentWorkspace.tsx.snap @@ -497,6 +497,34 @@ exports[`AssessmentWorkspace AssessmentWorkspace page with ContestVoting questio +
- Score + Calculated Score + +
+ +
+
+
+                                        student_1
+                                      
+
+                                        1
+                                      
+
+                                    
+
+
+
+
+                                        student_2
+                                      
+
+                                        2
+                                      
+
+                                    
+
+ + + + + + +