Skip to content

Commit 7cf1c0e

Browse files
authored
Merge branch 'source-academy:master' into master
2 parents c7611a5 + 7ef667a commit 7cf1c0e

File tree

140 files changed

+9070
-4399
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

140 files changed

+9070
-4399
lines changed

craco.config.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const cracoConfig = (module.exports = {
1818
plugin => plugin.constructor.name === 'InjectManifest'
1919
);
2020
if (injectManifestPlugin) {
21-
injectManifestPlugin.config.maximumFileSizeToCacheInBytes = 15 * 1024 * 1024;
21+
injectManifestPlugin.config.maximumFileSizeToCacheInBytes = 17 * 1024 * 1024;
2222
}
2323

2424
// add rules to pack WASM (for Sourceror)
@@ -131,7 +131,8 @@ const cracoConfig = (module.exports = {
131131
'query-string',
132132
'decode-uri-component',
133133
'split-on-first',
134-
'filter-obj'
134+
'filter-obj',
135+
'@sourceacademy/c-slang',
135136
),
136137
'^.+\\.module\\.(css|sass|scss)$'
137138
];

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"@octokit/rest": "^20.0.0",
3535
"@reduxjs/toolkit": "^1.9.7",
3636
"@sentry/browser": "^7.57.0",
37+
"@sourceacademy/c-slang": "^1.0.18",
3738
"@sourceacademy/sharedb-ace": "^2.0.2",
3839
"@sourceacademy/sling-client": "^0.1.0",
3940
"@szhsin/react-menu": "^4.0.0",
@@ -49,7 +50,7 @@
4950
"flexboxgrid": "^6.3.1",
5051
"flexboxgrid-helpers": "^1.1.3",
5152
"hastscript": "^9.0.0",
52-
"js-slang": "^1.0.48",
53+
"js-slang": "^1.0.60",
5354
"js-yaml": "^4.1.0",
5455
"konva": "^9.2.0",
5556
"lodash": "^4.17.21",
@@ -66,6 +67,7 @@
6667
"react-copy-to-clipboard": "^5.1.0",
6768
"react-debounce-render": "^8.0.2",
6869
"react-dom": "^18.2.0",
70+
"react-drag-drop-files": "^2.3.10",
6971
"react-draggable": "^4.4.5",
7072
"react-dropzone": "^14.2.3",
7173
"react-hotkeys": "^2.0.0",
@@ -77,6 +79,7 @@
7779
"react-redux": "^8.1.1",
7880
"react-responsive": "^10.0.0",
7981
"react-router-dom": "^6.14.1",
82+
"react-select": "^5.7.3",
8083
"react-simple-keyboard": "^3.6.27",
8184
"react-sortable-hoc": "^2.0.0",
8285
"react-syntax-highlighter": "^15.5.0",
@@ -90,6 +93,7 @@
9093
"typesafe-actions": "^5.1.0",
9194
"unified": "^11.0.0",
9295
"uuid": "^9.0.0",
96+
"xlsx": "0.18.5",
9397
"xml2js": "^0.6.0",
9498
"yareco": "^0.1.5"
9599
},

src/commons/XMLParser/XMLParserHelper.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ const makeAssessmentOverview = (result: any, maxXpVal: number): AssessmentOvervi
7676
coverImage: rawOverview.coverimage,
7777
id: EDITING_ID,
7878
maxXp: maxXpVal,
79+
earlySubmissionXp: 0,
7980
number: rawOverview.number || '',
8081
openAt: rawOverview.startdate,
8182
title: rawOverview.title,
@@ -84,7 +85,9 @@ const makeAssessmentOverview = (result: any, maxXpVal: number): AssessmentOvervi
8485
status: AssessmentStatuses.attempting,
8586
story: rawOverview.story,
8687
xp: 0,
87-
gradingStatus: 'none' as GradingStatuses
88+
gradingStatus: 'none' as GradingStatuses,
89+
maxTeamSize: 1,
90+
hasVotingFeatures: false
8891
};
8992
};
9093

@@ -202,6 +205,7 @@ const makeProgramming = (
202205
testcases: publicTestcases.map(testcase => makeTestcase(testcase)),
203206
testcasesPrivate: privateTestcases.map(testcase => makeTestcase(testcase)),
204207
answer: solution ? (solution[0] as string).trim() : '',
208+
lastModifiedAt: new Date().toISOString(),
205209
type: 'programming'
206210
};
207211
if (problem.SNIPPET[0].GRADER) {

src/commons/achievement/AchievementManualEditor.tsx

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -95,53 +95,61 @@ const AchievementManualEditor: React.FC<Props> = props => {
9595

9696
return (
9797
<div className="achievement-manual-editor">
98-
<h3>User: </h3>
99-
<UserSelect
100-
filterable={true}
101-
items={users}
102-
itemRenderer={userRenderer}
103-
itemPredicate={userPredicate}
104-
onItemSelect={changeSelectedUser}
105-
noResults={<MenuItem disabled={true} text="No matching user" />}
106-
>
107-
<Button
108-
outlined={true}
109-
text={selectedUser ? selectedUser.name || selectedUser.username : 'No User Selected'}
110-
color="White"
98+
<div className="editor-section">
99+
<h3>User: </h3>
100+
<UserSelect
101+
filterable={true}
102+
items={users}
103+
itemRenderer={userRenderer}
104+
itemPredicate={userPredicate}
105+
onItemSelect={changeSelectedUser}
106+
noResults={<MenuItem disabled={true} text="No matching user" />}
107+
>
108+
<Button
109+
outlined={true}
110+
text={selectedUser ? selectedUser.name || selectedUser.username : 'No User Selected'}
111+
color="White"
112+
/>
113+
</UserSelect>
114+
</div>
115+
116+
<div className="editor-section">
117+
<h3>Goal: </h3>
118+
<GoalSelect
119+
filterable={true}
120+
items={manualAchievements}
121+
itemRenderer={goalRenderer}
122+
itemPredicate={goalPredicate}
123+
onItemSelect={changeGoal}
124+
noResults={<MenuItem disabled={true} text="No matching goal" />}
125+
>
126+
<Button outlined={true} text={goal ? goal.text : 'No Goal Selected'} color="White" />
127+
</GoalSelect>
128+
</div>
129+
130+
<div className="editor-section">
131+
<h3>Count: </h3>
132+
<NumericInput
133+
value={count}
134+
min={0}
135+
allowNumericCharactersOnly={true}
136+
minorStepSize={null}
137+
placeholder="Count"
138+
onValueChange={changeCount}
111139
/>
112-
</UserSelect>
113-
114-
<h3>Goal: </h3>
115-
<GoalSelect
116-
filterable={true}
117-
items={manualAchievements}
118-
itemRenderer={goalRenderer}
119-
itemPredicate={goalPredicate}
120-
onItemSelect={changeGoal}
121-
noResults={<MenuItem disabled={true} text="No matching goal" />}
122-
>
123-
<Button outlined={true} text={goal ? goal.text : 'No Goal Selected'} color="White" />
124-
</GoalSelect>
125-
126-
<h3>Count: </h3>
127-
<NumericInput
128-
value={count}
129-
min={0}
130-
allowNumericCharactersOnly={true}
131-
minorStepSize={null}
132-
placeholder="Count"
133-
onValueChange={changeCount}
134-
/>
135-
136-
<h3> </h3>
137-
<Button outlined={true} text="Update Goal" onClick={updateGoal} intent="primary" />
138-
139-
<h3> </h3>
140-
<Checkbox
141-
checked={viewHidden}
142-
label="View Hidden Achievements"
143-
onChange={() => changeViewHidden(!viewHidden)}
144-
/>
140+
</div>
141+
142+
<div className="editor-section">
143+
<Button outlined={true} text="Update Goal" onClick={updateGoal} intent="primary" />
144+
</div>
145+
146+
<div className="editor-section">
147+
<Checkbox
148+
checked={viewHidden}
149+
label="View Hidden Achievements"
150+
onChange={() => changeViewHidden(!viewHidden)}
151+
/>
152+
</div>
145153
</div>
146154
);
147155
};

src/commons/achievement/utils/AchievementInferencer.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,6 @@ class AchievementInferencer {
288288
// finally, process the nodeList
289289
this.processNodes();
290290
this.normalizePositions(achievement.uuid, achievement.position);
291-
292291
return newUuid;
293292
}
294293

src/commons/application/ApplicationTypes.ts

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,15 @@ export enum StoriesRole {
121121
export enum SupportedLanguage {
122122
JAVASCRIPT = 'JavaScript',
123123
SCHEME = 'Scheme',
124-
PYTHON = 'Python'
124+
PYTHON = 'Python',
125+
C = 'C'
125126
}
126127

127128
export const SUPPORTED_LANGUAGES = [
128129
SupportedLanguage.JAVASCRIPT,
129130
SupportedLanguage.SCHEME,
130-
SupportedLanguage.PYTHON
131+
SupportedLanguage.PYTHON,
132+
SupportedLanguage.C
131133
];
132134

133135
/**
@@ -209,6 +211,16 @@ export const pyLanguages: SALanguage[] = pySubLanguages.map(sublang => {
209211
return { ...sublang, mainLanguage: SupportedLanguage.PYTHON, supports: { repl: true } };
210212
});
211213

214+
export const cLanguages: SALanguage[] = [
215+
{
216+
chapter: Chapter.FULL_C,
217+
variant: Variant.DEFAULT,
218+
displayName: 'C',
219+
mainLanguage: SupportedLanguage.C,
220+
supports: {}
221+
}
222+
];
223+
212224
export const styliseSublanguage = (chapter: Chapter, variant: Variant = Variant.DEFAULT) => {
213225
return getLanguageConfig(chapter, variant).displayName;
214226
};
@@ -277,7 +289,8 @@ export const ALL_LANGUAGES: readonly SALanguage[] = [
277289
fullTSLanguage,
278290
htmlLanguage,
279291
...schemeLanguages,
280-
...pyLanguages
292+
...pyLanguages,
293+
...cLanguages
281294
];
282295
// TODO: Remove this function once logic has been fully migrated
283296
export const getLanguageConfig = (
@@ -358,6 +371,7 @@ export const createDefaultWorkspace = (workspaceLocation: WorkspaceLocation): Wo
358371
programPrependValue: '',
359372
programPostpendValue: '',
360373
editorSessionId: '',
374+
sessionDetails: null,
361375
isEditorReadonly: false,
362376
editorTestcases: [],
363377
externalLibrary: ExternalLibraryName.NONE,
@@ -380,10 +394,8 @@ export const createDefaultWorkspace = (workspaceLocation: WorkspaceLocation): Wo
380394
isDebugging: false,
381395
enableDebugging: true,
382396
debuggerContext: {} as DebuggerContext,
383-
sideContent: {
384-
alerts: [],
385-
dynamicTabs: []
386-
}
397+
lastDebuggerResult: undefined,
398+
lastNonDetResult: null
387399
});
388400

389401
const defaultFileName = 'program.js';
@@ -414,6 +426,7 @@ export const defaultWorkspaceManager: WorkspaceManagerState = {
414426
currentStep: -1,
415427
stepsTotal: 0,
416428
breakpointSteps: [],
429+
changepointSteps: [],
417430
activeEditorTabIndex: 0,
418431
editorTabs: [
419432
{
@@ -467,6 +480,7 @@ export const defaultWorkspaceManager: WorkspaceManagerState = {
467480
currentStep: -1,
468481
stepsTotal: 0,
469482
breakpointSteps: [],
483+
changepointSteps: [],
470484
activeEditorTabIndex: 0,
471485
editorTabs: [
472486
{
@@ -501,6 +515,8 @@ export const defaultSession: SessionState = {
501515
sessionId: Date.now(),
502516
githubOctokitObject: { octokit: undefined },
503517
gradingOverviews: undefined,
518+
students: undefined,
519+
teamFormationOverviews: undefined,
504520
gradings: new Map<number, GradingQuery>(),
505521
notifications: []
506522
};
@@ -524,11 +540,7 @@ export const createDefaultStoriesEnv = (
524540
stepLimit: 1000,
525541
globals: [],
526542
usingSubst: false,
527-
debuggerContext: {} as DebuggerContext,
528-
sideContent: {
529-
dynamicTabs: [],
530-
alerts: []
531-
}
543+
debuggerContext: {} as DebuggerContext
532544
});
533545

534546
export const defaultFileSystem: FileSystemState = {

0 commit comments

Comments
 (0)