Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/frontend/course/common/course-step-messages.tsx
10799 views
1
/*
2
* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.
3
* License: MS-RSL – see LICENSE.md for details
4
*/
5
6
import type { IntlShape } from "react-intl";
7
8
import { unreachable } from "@cocalc/util/misc";
9
10
import type { AssignmentStep, CopyStep } from "../types";
11
12
export function actionsLegend(intl: IntlShape): string {
13
return intl.formatMessage({
14
id: "course.student-assignment-info-header.actions_legend",
15
defaultMessage: "Actions",
16
description:
17
"Section title in the column info popover for explaining action icons",
18
});
19
}
20
21
export function columnInfoAria(intl: IntlShape, title: string): string {
22
return intl.formatMessage(
23
{
24
id: "course.student-assignment-info-header.column_info.aria_label",
25
defaultMessage: "Column info: {title}",
26
description:
27
"Aria label for the info popover trigger button in a course workflow column header",
28
},
29
{ title },
30
);
31
}
32
33
const runAllDescription =
34
"Legend text in the column info popover: run this workflow step for all eligible students";
35
const runOneDescription =
36
"Legend text in the column info popover: run this workflow step for one student";
37
const redoOneDescription =
38
"Legend text in the column info popover: run this workflow step again for one student";
39
const openOneDescription =
40
"Legend text in the column info popover: open this student's files for this workflow step";
41
const skipInfoDescription =
42
"Legend text in the column info popover: allow skipping this workflow step for run-all flow";
43
const editOneDescription =
44
"Legend text in the column info popover: edit grade and comments for one student";
45
const infoTitleDescription = "Title of a column info popover";
46
47
export function columnLabel(intl: IntlShape, key: AssignmentStep): string {
48
switch (key) {
49
case "assignment":
50
return intl.formatMessage({
51
id: "course.student-assignment-info-header.assign.label",
52
defaultMessage: "Assign",
53
description:
54
"Column title in course workflow table. Use a short verb meaning 'assign to students'. Prefer verb/action wording, not a noun.",
55
});
56
case "distribution":
57
return intl.formatMessage({
58
id: "course.handouts.distribute.label",
59
defaultMessage: "Distribute",
60
description:
61
"Column title in handout workflow table. Use a short verb meaning 'distribute handout to students'. Prefer verb/action wording, not a noun.",
62
});
63
case "collect":
64
return intl.formatMessage({
65
id: "course.student-assignment-info-header.collect.label",
66
defaultMessage: "Collect",
67
description:
68
"Column title in course workflow table. Use a short verb meaning 'collect student work'. Prefer verb/action wording, not a noun.",
69
});
70
case "grade":
71
return intl.formatMessage({
72
id: "course.student-assignment-info-header.grade.label",
73
defaultMessage: "Grade",
74
description:
75
"Column title in course workflow table. Use a short verb meaning 'grade submissions'. Prefer verb/action wording, not a noun.",
76
});
77
case "peer_assignment":
78
return intl.formatMessage({
79
id: "course.student-assignment-info-header.peer_assignment.label",
80
defaultMessage: "Peer Assign",
81
description:
82
"Column title in peer-grading workflow. Use a short verb phrase meaning 'assign for peer grading'. Prefer verb/action wording, not a noun.",
83
});
84
case "peer_collect":
85
return intl.formatMessage({
86
id: "course.student-assignment-info-header.peer_collect.label",
87
defaultMessage: "Peer Collect",
88
description:
89
"Column title in peer-grading workflow. Use a short verb phrase meaning 'collect peer feedback'. Prefer verb/action wording, not a noun.",
90
});
91
case "return_graded":
92
return intl.formatMessage({
93
id: "course.student-assignment-info-header.return.label",
94
defaultMessage: "Return",
95
description:
96
"Column title in course workflow table. Use a short verb meaning 'return graded work to students'. Prefer verb/action wording, not a noun.",
97
});
98
default:
99
unreachable(key);
100
return "";
101
}
102
}
103
104
export function copyStepMsg(intl: IntlShape, key: CopyStep) {
105
switch (key) {
106
case "assignment":
107
return {
108
title: intl.formatMessage({
109
id: "course.student-assignment-info-header.assign.info_title",
110
defaultMessage: "Assign: From Instructor to Students",
111
description: infoTitleDescription,
112
}),
113
tip: intl.formatMessage({
114
id: "course.student-assignment-info-header.assign.tooltip",
115
defaultMessage:
116
"Copy all assignment files from your project to each student's project, creating independent copies.",
117
}),
118
actions: actionsLegend(intl),
119
runAll: intl.formatMessage({
120
id: "course.student-assignment-info-header.assign.run_all",
121
defaultMessage: "Assign to all students",
122
description: runAllDescription,
123
}),
124
skipInfo: intl.formatMessage({
125
id: "course.student-assignment-info-header.assign.skip_info",
126
defaultMessage: "Allow proceeding without assigning",
127
description: skipInfoDescription,
128
}),
129
runOne: intl.formatMessage({
130
id: "course.student-assignment-info-header.assign.run_one",
131
defaultMessage: "Assign to this student",
132
description: runOneDescription,
133
}),
134
redoOne: intl.formatMessage({
135
id: "course.student-assignment-info-header.assign.redo_one",
136
defaultMessage: "Assign again to this student",
137
description: redoOneDescription,
138
}),
139
openOne: intl.formatMessage({
140
id: "course.student-assignment-info-header.assign.open_one",
141
defaultMessage: "Open the student's copy in the student's project",
142
description: openOneDescription,
143
}),
144
};
145
case "distribution":
146
return {
147
title: intl.formatMessage({
148
id: "course.student-assignment-info-header.distribute.info_title",
149
defaultMessage: "Distribute: From Instructor to Students",
150
description: infoTitleDescription,
151
}),
152
tip: intl.formatMessage({
153
id: "course.handouts.distribute.tooltip",
154
defaultMessage:
155
"Copy all handout files from your project to each student's project, creating independent copies.",
156
}),
157
actions: actionsLegend(intl),
158
runAll: intl.formatMessage({
159
id: "course.student-assignment-info-header.distribute.run_all",
160
defaultMessage: "Distribute to all students",
161
description: runAllDescription,
162
}),
163
runOne: intl.formatMessage({
164
id: "course.student-assignment-info-header.distribute.run_one",
165
defaultMessage: "Distribute to this student",
166
description: runOneDescription,
167
}),
168
redoOne: intl.formatMessage({
169
id: "course.student-assignment-info-header.distribute.redo_one",
170
defaultMessage: "Distribute again to this student",
171
description: redoOneDescription,
172
}),
173
openOne: intl.formatMessage({
174
id: "course.student-assignment-info-header.distribute.open_one",
175
defaultMessage:
176
"Open the student's copy of this handout in their project",
177
description: openOneDescription,
178
}),
179
};
180
case "collect":
181
return {
182
title: intl.formatMessage({
183
id: "course.student-assignment-info-header.collect.info_title",
184
defaultMessage: "Collect: From Students to Instructor",
185
description: infoTitleDescription,
186
}),
187
tip: intl.formatMessage({
188
id: "course.student-assignment-info-header.collect.tooltip",
189
defaultMessage:
190
"Copy all assignment files from each student's project to your project, in their current state. Students can keep editing their copies. New changes will appear in your project only if you collect again.",
191
}),
192
actions: actionsLegend(intl),
193
runAll: intl.formatMessage({
194
id: "course.student-assignment-info-header.collect.run_all",
195
defaultMessage: "Collect from all students",
196
description: runAllDescription,
197
}),
198
skipInfo: intl.formatMessage({
199
id: "course.student-assignment-info-header.collect.skip_info",
200
defaultMessage: "Allow proceeding without collecting",
201
description: skipInfoDescription,
202
}),
203
runOne: intl.formatMessage({
204
id: "course.student-assignment-info-header.collect.run_one",
205
defaultMessage: "Collect from this student",
206
description: runOneDescription,
207
}),
208
redoOne: intl.formatMessage({
209
id: "course.student-assignment-info-header.collect.redo_one",
210
defaultMessage: "Collect again from this student",
211
description: redoOneDescription,
212
}),
213
openOne: intl.formatMessage({
214
id: "course.student-assignment-info-header.collect.open_one",
215
defaultMessage: "Open this student's collected work in your project",
216
description: openOneDescription,
217
}),
218
};
219
case "peer_assignment":
220
return {
221
title: intl.formatMessage({
222
id: "course.student-assignment-info-header.peer_assign.info_title",
223
defaultMessage: "Peer Assign: From Instructor to Peer Graders",
224
description: infoTitleDescription,
225
}),
226
tip: intl.formatMessage(
227
{
228
id: "course.student-assignment-info-header.peer_assignment.tooltip",
229
defaultMessage:
230
"Distribute collected submissions for peer grading: each submission is copied to {count} randomly selected peer graders, where {count} is set in Peer Grading. You must complete Collect step for all students first.",
231
description: "Peer Assign tooltip text in column info popover",
232
},
233
{
234
count: "N",
235
},
236
),
237
actions: actionsLegend(intl),
238
runAll: intl.formatMessage({
239
id: "course.student-assignment-info-header.peer_assign.run_all",
240
defaultMessage: "Peer assign for all students",
241
description: runAllDescription,
242
}),
243
runOne: intl.formatMessage({
244
id: "course.student-assignment-info-header.peer_assign.run_one",
245
defaultMessage: "Peer assign for this student",
246
description: runOneDescription,
247
}),
248
redoOne: intl.formatMessage({
249
id: "course.student-assignment-info-header.peer_assign.redo_one",
250
defaultMessage: "Peer assign again for this student",
251
description: redoOneDescription,
252
}),
253
openOne: intl.formatMessage({
254
id: "course.student-assignment-info-header.peer_assign.open_one",
255
defaultMessage:
256
"Open the student's peer-grading copy in their project",
257
description: openOneDescription,
258
}),
259
};
260
case "peer_collect":
261
return {
262
title: intl.formatMessage({
263
id: "course.student-assignment-info-header.peer_collect.info_title",
264
defaultMessage: "Peer Collect: From Peer Graders to Instructor",
265
description: infoTitleDescription,
266
}),
267
tip: intl.formatMessage({
268
id: "course.student-assignment-info-header.peer_collect.tooltip",
269
defaultMessage:
270
"Copy peer-graded submissions with peer feedback from student projects to your project. You must complete Peer Assign step for all students first.",
271
}),
272
actions: actionsLegend(intl),
273
runAll: intl.formatMessage({
274
id: "course.student-assignment-info-header.peer_collect.run_all",
275
defaultMessage: "Peer collect for all students",
276
description: runAllDescription,
277
}),
278
runOne: intl.formatMessage({
279
id: "course.student-assignment-info-header.peer_collect.run_one",
280
defaultMessage: "Peer collect for this student",
281
description: runOneDescription,
282
}),
283
redoOne: intl.formatMessage({
284
id: "course.student-assignment-info-header.peer_collect.redo_one",
285
defaultMessage: "Peer collect again for this student",
286
description: redoOneDescription,
287
}),
288
openOne: intl.formatMessage({
289
id: "course.student-assignment-info-header.peer_collect.open_one",
290
defaultMessage:
291
"Open this student's collected peer grading in your project",
292
description: openOneDescription,
293
}),
294
};
295
case "return_graded":
296
return {
297
title: intl.formatMessage({
298
id: "course.student-assignment-info-header.return.info_title",
299
defaultMessage: "Return: From Instructor to Students",
300
description: infoTitleDescription,
301
}),
302
tip: intl.formatMessage({
303
id: "course.student-assignment-info-header.return.tooltip",
304
defaultMessage:
305
"Copy grades, comments, and assignment files with feedback from your project to student projects.",
306
}),
307
actions: actionsLegend(intl),
308
runAll: intl.formatMessage({
309
id: "course.student-assignment-info-header.return.run_all",
310
defaultMessage: "Return to all students",
311
description: runAllDescription,
312
}),
313
runOne: intl.formatMessage({
314
id: "course.student-assignment-info-header.return.run_one",
315
defaultMessage: "Return to this student",
316
description: runOneDescription,
317
}),
318
redoOne: intl.formatMessage({
319
id: "course.student-assignment-info-header.return.redo_one",
320
defaultMessage: "Return again to this student",
321
description: redoOneDescription,
322
}),
323
openOne: intl.formatMessage({
324
id: "course.student-assignment-info-header.return.open_one",
325
defaultMessage: "Open the returned copy in the student's project",
326
description: openOneDescription,
327
}),
328
};
329
default:
330
unreachable(key);
331
return undefined as never;
332
}
333
}
334
335
export function gradeMsg(intl: IntlShape) {
336
return {
337
title: intl.formatMessage({
338
id: "course.student-assignment-info-header.grade.info_title",
339
defaultMessage: "Grade: Scores & Comments",
340
description: infoTitleDescription,
341
}),
342
tip: intl.formatMessage({
343
id: "course.student-assignment-info-header.grade.tooltip",
344
defaultMessage:
345
"Record the student's grade and comments for this assignment. The grade can be either numeric or text.",
346
}),
347
actions: actionsLegend(intl),
348
runnbgrader: intl.formatMessage(
349
{
350
id: "course.student-assignment-info-header.grade.run_automated_full",
351
defaultMessage:
352
"Run <docLink>automated grading</docLink> for all students (if available)",
353
description: "Grade popover action line with link to nbgrader docs",
354
},
355
{
356
docLink: (chunks) => (
357
<a
358
href="https://doc.cocalc.com/teaching-nbgrader.html"
359
target="_blank"
360
rel="noopener noreferrer"
361
>
362
{chunks}
363
</a>
364
),
365
},
366
),
367
skipInfo: intl.formatMessage({
368
id: "course.student-assignment-info-header.grade.skip_info",
369
defaultMessage: "Allow proceeding without grading",
370
description: skipInfoDescription,
371
}),
372
editOne: intl.formatMessage({
373
id: "course.student-assignment-info-header.grade.edit_one",
374
defaultMessage: "Edit grade and comments for this student",
375
description: editOneDescription,
376
}),
377
};
378
}
379
380