Skip to content

Commit a647a15

Browse files
committed
merge origin/master into master
2 parents d1ae389 + 7cf1c0e commit a647a15

File tree

140 files changed

+7426
-6008
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

+7426
-6008
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
/**
@@ -223,6 +225,16 @@ export const pyLanguages: SALanguage[] = pySubLanguages.map(sublang => {
223225
return { ...sublang, mainLanguage: SupportedLanguage.PYTHON, supports: { repl: true } };
224226
});
225227

228+
export const cLanguages: SALanguage[] = [
229+
{
230+
chapter: Chapter.FULL_C,
231+
variant: Variant.DEFAULT,
232+
displayName: 'C',
233+
mainLanguage: SupportedLanguage.C,
234+
supports: {}
235+
}
236+
];
237+
226238
export const styliseSublanguage = (chapter: Chapter, variant: Variant = Variant.DEFAULT) => {
227239
return getLanguageConfig(chapter, variant).displayName;
228240
};
@@ -291,7 +303,8 @@ export const ALL_LANGUAGES: readonly SALanguage[] = [
291303
fullTSLanguage,
292304
htmlLanguage,
293305
...schemeLanguages,
294-
...pyLanguages
306+
...pyLanguages,
307+
...cLanguages
295308
];
296309
// TODO: Remove this function once logic has been fully migrated
297310
export const getLanguageConfig = (
@@ -372,6 +385,7 @@ export const createDefaultWorkspace = (workspaceLocation: WorkspaceLocation): Wo
372385
programPrependValue: '',
373386
programPostpendValue: '',
374387
editorSessionId: '',
388+
sessionDetails: null,
375389
isEditorReadonly: false,
376390
editorTestcases: [],
377391
externalLibrary: ExternalLibraryName.NONE,
@@ -394,10 +408,8 @@ export const createDefaultWorkspace = (workspaceLocation: WorkspaceLocation): Wo
394408
isDebugging: false,
395409
enableDebugging: true,
396410
debuggerContext: {} as DebuggerContext,
397-
sideContent: {
398-
alerts: [],
399-
dynamicTabs: []
400-
}
411+
lastDebuggerResult: undefined,
412+
lastNonDetResult: null
401413
});
402414

403415
const defaultFileName = 'program.js';
@@ -428,6 +440,7 @@ export const defaultWorkspaceManager: WorkspaceManagerState = {
428440
currentStep: -1,
429441
stepsTotal: 0,
430442
breakpointSteps: [],
443+
changepointSteps: [],
431444
activeEditorTabIndex: 0,
432445
editorTabs: [
433446
{
@@ -481,6 +494,7 @@ export const defaultWorkspaceManager: WorkspaceManagerState = {
481494
currentStep: -1,
482495
stepsTotal: 0,
483496
breakpointSteps: [],
497+
changepointSteps: [],
484498
activeEditorTabIndex: 0,
485499
editorTabs: [
486500
{
@@ -515,6 +529,8 @@ export const defaultSession: SessionState = {
515529
sessionId: Date.now(),
516530
githubOctokitObject: { octokit: undefined },
517531
gradingOverviews: undefined,
532+
students: undefined,
533+
teamFormationOverviews: undefined,
518534
gradings: new Map<number, GradingQuery>(),
519535
notifications: []
520536
};
@@ -538,11 +554,7 @@ export const createDefaultStoriesEnv = (
538554
stepLimit: 1000,
539555
globals: [],
540556
usingSubst: false,
541-
debuggerContext: {} as DebuggerContext,
542-
sideContent: {
543-
dynamicTabs: [],
544-
alerts: []
545-
}
557+
debuggerContext: {} as DebuggerContext
546558
});
547559

548560
export const defaultFileSystem: FileSystemState = {

0 commit comments

Comments
 (0)