Skip to content

Commit 95563ef

Browse files
authored
Merge branch 'master' into leaderboard
2 parents b05cc8d + af2cddb commit 95563ef

File tree

18 files changed

+124
-20
lines changed

18 files changed

+124
-20
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
"i18next-browser-languagedetector": "^8.0.0",
5959
"java-slang": "^1.0.13",
6060
"js-cookie": "^3.0.5",
61-
"js-slang": "^1.0.81",
61+
"js-slang": "^1.0.82",
6262
"js-yaml": "^4.1.0",
6363
"konva": "^9.2.0",
6464
"language-directory": "https://github.com/source-academy/language-directory.git",

public/assets/mockChapter0.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ objectives
44
finish
55

66
gameStartActions
7-
// replace 173 with assessment id
8-
show_dialogue(welcome) if userstate.assessments.173
9-
show_dialogue(unwelcome) if !userstate.assessments.173
7+
// replace S0 with assessment number
8+
show_dialogue(welcome) if userstate.assessments.S0
9+
show_dialogue(unwelcome) if !userstate.assessments.S0
1010

1111
checkpointCompleteActions
1212
show_dialogue(done)
@@ -96,8 +96,8 @@ dialogues
9696
1
9797
@scottie, sad
9898
You haven't finished assessment
99-
Finish assessment 173 first and come back?
100-
navigate_to_assessment(173)
99+
Finish assessment S0 first and come back?
100+
navigate_to_assessment(S0)
101101
goto 2
102102
2
103103
@scottie
@@ -113,7 +113,7 @@ dialogues
113113
Hmmm
114114
update_assessment_status*()
115115
Let me check
116-
goto 1 if !userstate.assessments.173 else 3
116+
goto 1 if !userstate.assessments.S0 else 3
117117

118118
what, What should I do now, Scottie?
119119
@you

src/commons/application/actions/__tests__/SessionActions.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ test('setAssessmentConfigurations generates correct action object', () => {
264264
isManuallyGraded: true,
265265
isGradingAutoPublished: false,
266266
displayInDashboard: true,
267+
isMinigame: false,
267268
hasTokenCounter: false,
268269
hasVotingFeatures: false,
269270
hoursBeforeEarlyXpDecay: 48,
@@ -275,6 +276,7 @@ test('setAssessmentConfigurations generates correct action object', () => {
275276
isManuallyGraded: true,
276277
isGradingAutoPublished: false,
277278
displayInDashboard: true,
279+
isMinigame: false,
278280
hasTokenCounter: false,
279281
hasVotingFeatures: false,
280282
hoursBeforeEarlyXpDecay: 48,
@@ -286,6 +288,7 @@ test('setAssessmentConfigurations generates correct action object', () => {
286288
isManuallyGraded: true,
287289
isGradingAutoPublished: false,
288290
displayInDashboard: true,
291+
isMinigame: false,
289292
hasTokenCounter: false,
290293
hasVotingFeatures: false,
291294
hoursBeforeEarlyXpDecay: 48,
@@ -714,6 +717,7 @@ test('updateAssessmentTypes generates correct action object', () => {
714717
isManuallyGraded: true,
715718
isGradingAutoPublished: false,
716719
displayInDashboard: true,
720+
isMinigame: false,
717721
hasTokenCounter: false,
718722
hasVotingFeatures: false,
719723
hoursBeforeEarlyXpDecay: 48,
@@ -725,6 +729,7 @@ test('updateAssessmentTypes generates correct action object', () => {
725729
isManuallyGraded: true,
726730
isGradingAutoPublished: false,
727731
displayInDashboard: true,
732+
isMinigame: false,
728733
hasTokenCounter: false,
729734
hasVotingFeatures: false,
730735
hoursBeforeEarlyXpDecay: 48,
@@ -736,6 +741,7 @@ test('updateAssessmentTypes generates correct action object', () => {
736741
isManuallyGraded: false,
737742
isGradingAutoPublished: true,
738743
displayInDashboard: true,
744+
isMinigame: false,
739745
hasTokenCounter: false,
740746
hasVotingFeatures: false,
741747
hoursBeforeEarlyXpDecay: 48,
@@ -747,6 +753,7 @@ test('updateAssessmentTypes generates correct action object', () => {
747753
isManuallyGraded: true,
748754
isGradingAutoPublished: false,
749755
displayInDashboard: true,
756+
isMinigame: false,
750757
hasTokenCounter: false,
751758
hasVotingFeatures: false,
752759
hoursBeforeEarlyXpDecay: 48,
@@ -758,6 +765,7 @@ test('updateAssessmentTypes generates correct action object', () => {
758765
isManuallyGraded: false,
759766
isGradingAutoPublished: false,
760767
displayInDashboard: true,
768+
isMinigame: false,
761769
hasTokenCounter: false,
762770
hasVotingFeatures: false,
763771
hoursBeforeEarlyXpDecay: 0,
@@ -769,6 +777,7 @@ test('updateAssessmentTypes generates correct action object', () => {
769777
isManuallyGraded: true,
770778
isGradingAutoPublished: false,
771779
displayInDashboard: true,
780+
isMinigame: false,
772781
hasTokenCounter: false,
773782
hasVotingFeatures: false,
774783
hoursBeforeEarlyXpDecay: 48,
@@ -789,6 +798,7 @@ test('deleteAssessmentConfig generates correct action object', () => {
789798
isManuallyGraded: true,
790799
isGradingAutoPublished: false,
791800
displayInDashboard: true,
801+
isMinigame: false,
792802
hasTokenCounter: false,
793803
hasVotingFeatures: false,
794804
hoursBeforeEarlyXpDecay: 48,

src/commons/application/reducers/__tests__/SessionReducer.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ test('SET_ASSESSMENT_CONFIGURATIONS works correctly', () => {
147147
isManuallyGraded: false,
148148
isGradingAutoPublished: false,
149149
displayInDashboard: true,
150+
isMinigame: false,
150151
hasTokenCounter: false,
151152
hasVotingFeatures: false
152153
},
@@ -161,6 +162,7 @@ test('SET_ASSESSMENT_CONFIGURATIONS works correctly', () => {
161162
isManuallyGraded: false,
162163
isGradingAutoPublished: false,
163164
displayInDashboard: true,
165+
isMinigame: false,
164166
hasTokenCounter: false,
165167
hasVotingFeatures: false
166168
},
@@ -175,6 +177,7 @@ test('SET_ASSESSMENT_CONFIGURATIONS works correctly', () => {
175177
isManuallyGraded: false,
176178
isGradingAutoPublished: false,
177179
displayInDashboard: true,
180+
isMinigame: false,
178181
hasTokenCounter: false,
179182
hasVotingFeatures: false
180183
}

src/commons/assessment/AssessmentTypes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export type Assessment = {
9292
globalDeployment?: Library; // For mission control
9393
graderDeployment?: Library; // For mission control
9494
hasTokenCounter?: boolean;
95+
isMinigame?: boolean;
9596
id: number;
9697
longSummary: string;
9798
missionPDF: string;
@@ -105,6 +106,7 @@ export type AssessmentConfiguration = {
105106
isManuallyGraded: boolean;
106107
isGradingAutoPublished: boolean;
107108
displayInDashboard: boolean;
109+
isMinigame: boolean;
108110
hoursBeforeEarlyXpDecay: number;
109111
earlySubmissionXp: number;
110112
hasTokenCounter: boolean;

src/commons/assessment/__tests__/Assessment.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const mockAssessmentConfig: AssessmentConfiguration = {
1717
isManuallyGraded: true,
1818
isGradingAutoPublished: false,
1919
displayInDashboard: true,
20+
isMinigame: false,
2021
hasTokenCounter: false,
2122
hasVotingFeatures: false,
2223
hoursBeforeEarlyXpDecay: 48,

src/commons/assessmentWorkspace/AssessmentWorkspace.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ const AssessmentWorkspace: React.FC<AssessmentWorkspaceProps> = props => {
9595
const [isSaving, setIsSaving] = useState(false);
9696
const [showResetTemplateOverlay, setShowResetTemplateOverlay] = useState(false);
9797
const [sessionId, setSessionId] = useState('');
98+
const [isSubmitted, setIsSubmitted] = useState(false);
9899
const { isMobileBreakpoint } = useResponsive();
99100

100101
const assessment = useTypedSelector(state => state.session.assessments[props.assessmentId]);
@@ -643,6 +644,10 @@ const AssessmentWorkspace: React.FC<AssessmentWorkspaceProps> = props => {
643644
setSelectedTab(SideContentType.questionOverview);
644645
};
645646
const onClickReturn = () => navigate(listingPath);
647+
const onClickSubmit = () => {
648+
dispatch(SessionActions.submitAssessment(assessment.id));
649+
setIsSubmitted(true);
650+
};
646651

647652
const onClickSave = () => {
648653
if (isSaving) return;
@@ -707,8 +712,14 @@ const AssessmentWorkspace: React.FC<AssessmentWorkspaceProps> = props => {
707712
? onClickProgress(onClickReturn, question, editorTestcases, isBlocked)
708713
: onClickReturn
709714
}
715+
onClickSubmit={
716+
question.blocking
717+
? onClickProgress(onClickSubmit, question, editorTestcases, isBlocked)
718+
: onClickSubmit
719+
}
710720
questionProgress={questionProgress}
711721
key="next_question"
722+
submitOnFinish={assessment.isMinigame}
712723
/>
713724
);
714725

@@ -877,6 +888,18 @@ const AssessmentWorkspace: React.FC<AssessmentWorkspaceProps> = props => {
877888
</Dialog>
878889
);
879890

891+
const submissionOverlay = (
892+
<Dialog className="assessment-briefing" isOpen={isSubmitted}>
893+
<Card>
894+
<Markdown
895+
content={`## ${assessment.type.substring(0, assessment.type.length - 1)} complete!
896+
You've successfully submitted this ${assessment.type.substring(0, assessment.type.length - 1)}!
897+
It is safe to close this window.`}
898+
/>
899+
</Card>
900+
</Dialog>
901+
);
902+
880903
const closeOverlay = () => setShowResetTemplateOverlay(false);
881904
const resetTemplateOverlay = (
882905
<Dialog
@@ -985,6 +1008,7 @@ const AssessmentWorkspace: React.FC<AssessmentWorkspaceProps> = props => {
9851008
};
9861009
return (
9871010
<div className={classNames('WorkspaceParent', Classes.DARK)}>
1011+
{submissionOverlay}
9881012
{overlay}
9891013
{resetTemplateOverlay}
9901014
{!isMobileBreakpoint ? (

src/commons/assessmentWorkspace/__tests__/AssessmentWorkspace.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const defaultProps = assertType<AssessmentWorkspaceProps>()({
2121
isManuallyGraded: true,
2222
isGradingAutoPublished: false,
2323
displayInDashboard: true,
24+
isMinigame: false,
2425
hasTokenCounter: false,
2526
hasVotingFeatures: false,
2627
hoursBeforeEarlyXpDecay: 48,

src/commons/controlBar/ControlBarNextButton.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,29 @@ import React from 'react';
33

44
import ControlButton from '../ControlButton';
55
import { ControlBarReturnToAcademyButton } from './ControlBarReturnToAcademyButton';
6+
import { ControlBarSubmit } from './ControlBarSubmit';
67

78
type ControlBarNextButtonProps = DispatchProps & StateProps;
89

910
type DispatchProps = {
1011
onClickNext?(): any;
1112
onClickReturn?(): any;
13+
onClickSubmit?(): any;
1214
};
1315

1416
type StateProps = {
1517
key: string;
1618
questionProgress: [number, number] | null;
19+
submitOnFinish?: boolean;
1720
};
1821

1922
export const ControlBarNextButton: React.FC<ControlBarNextButtonProps> = props => {
2023
return props.questionProgress![0] === props.questionProgress![1] ? (
21-
<ControlBarReturnToAcademyButton onClick={props.onClickReturn} key="return_to_academy" />
24+
props.submitOnFinish ? (
25+
<ControlBarSubmit onClick={props.onClickSubmit} />
26+
) : (
27+
<ControlBarReturnToAcademyButton onClick={props.onClickReturn} key="return_to_academy" />
28+
)
2229
) : (
2330
<ControlButton
2431
label="Next"
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { IconNames } from '@blueprintjs/icons';
2+
import React from 'react';
3+
4+
import ControlButton from '../ControlButton';
5+
6+
type Props = {
7+
onClick?(): any;
8+
};
9+
10+
export const ControlBarSubmit: React.FC<Props> = ({ onClick }) => {
11+
return (
12+
<ControlButton
13+
label="Submit"
14+
icon={IconNames.ARROW_RIGHT}
15+
onClick={onClick}
16+
options={{ iconOnRight: true }}
17+
/>
18+
);
19+
};

0 commit comments

Comments
 (0)