@nualang/nualang-ui-components 0.1.1236 → 0.1.1238
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Assignments/AssignmentCard/AssignmentCard.js +25 -26
- package/dist/Assignments/AssignmentCardsList/AssignmentCardsList.js +13 -2
- package/dist/Assignments/AssignmentCourseSelection/AssignmentCourseSelection.js +39 -1
- package/dist/Assignments/AssignmentExerciseSelection/AssignmentExerciseSelection.js +194 -30
- package/dist/Assignments/AssignmentExerciseSelector/AssignmentExerciseSelector.js +6 -0
- package/dist/Assignments/AssignmentRoleplaySelection/AssignmentRoleplaySelection.js +108 -18
- package/dist/Assignments/AssignmentSelectExercise/AssignmentSelectExercise.js +10 -2
- package/dist/Assignments/CreateAssignmentDialog/CreateAssignmentDialog.js +9 -1
- package/dist/Lists/CourseOutline/CourseOutline.js +3 -15
- package/dist/Lists/Exercises/Exercises.js +2 -0
- package/dist/Misc/ColorLinearProgress/ColorLinearProgress.js +35 -0
- package/dist/Misc/ColorLinearProgress/package.json +6 -0
- package/dist/Screens/Classrooms/ViewClassroom/ViewClassroom.js +28 -24
- package/dist/Screens/Courses/ViewCourse/ViewTopic/ViewTopic.js +2 -14
- package/dist/Tables/Progress/Progress.js +18 -37
- package/dist/Tables/Progress/ProgressList.js +4 -4
- package/dist/Tables/Progress/ProgressTable.js +166 -21
- package/dist/Tables/Progress/utils.js +43 -2
- package/dist/utils/index.js +27 -25
- package/package.json +1 -1
|
@@ -18,6 +18,7 @@ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return
|
|
|
18
18
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
19
19
|
function AssignmentCard({
|
|
20
20
|
t = text => text,
|
|
21
|
+
index = 0,
|
|
21
22
|
assignment,
|
|
22
23
|
handleStartExercise,
|
|
23
24
|
username,
|
|
@@ -27,10 +28,17 @@ function AssignmentCard({
|
|
|
27
28
|
getCourses,
|
|
28
29
|
deleteAssignment,
|
|
29
30
|
handleEditAssignment,
|
|
31
|
+
progressHelpers,
|
|
32
|
+
preferred_username,
|
|
33
|
+
memberId,
|
|
34
|
+
fetchMemberCourseCompletions,
|
|
30
35
|
lastClickedExerciseId,
|
|
31
36
|
handleViewProgress
|
|
32
37
|
}) {
|
|
33
38
|
const [confirm] = (0, _useConfirm.default)(t);
|
|
39
|
+
const {
|
|
40
|
+
useQuery
|
|
41
|
+
} = _Queries.ReactQuery;
|
|
34
42
|
const handleDeleteAssignment = async (classroomId, assignmentId) => {
|
|
35
43
|
const confirmed = await confirm(t("delete_assignment"), t("delete_assignment_confirmation"));
|
|
36
44
|
if (confirmed) {
|
|
@@ -95,6 +103,15 @@ function AssignmentCard({
|
|
|
95
103
|
...assignment,
|
|
96
104
|
courses
|
|
97
105
|
};
|
|
106
|
+
const memberCourseCompletionsQuery = useQuery({
|
|
107
|
+
queryKey: ["memberAssignmentCourseProgress", memberId, uniqueCourses],
|
|
108
|
+
queryFn: async () => {
|
|
109
|
+
const memberCourseCompletions = await fetchMemberCourseCompletions(memberId, uniqueCourses);
|
|
110
|
+
return memberCourseCompletions.Items;
|
|
111
|
+
},
|
|
112
|
+
staleTime: 500000
|
|
113
|
+
});
|
|
114
|
+
const memberCourseCompletions = (0, _react.useMemo)(() => memberCourseCompletionsQuery.isSuccess && memberCourseCompletionsQuery.data ? memberCourseCompletionsQuery.data : {}, [memberCourseCompletionsQuery.data, memberCourseCompletionsQuery.isSuccess]);
|
|
98
115
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Card, {
|
|
99
116
|
sx: {
|
|
100
117
|
display: "flex",
|
|
@@ -109,39 +126,16 @@ function AssignmentCard({
|
|
|
109
126
|
container: true,
|
|
110
127
|
spacing: 2,
|
|
111
128
|
alignItems: "center",
|
|
112
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.
|
|
129
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Grid, {
|
|
113
130
|
item: true,
|
|
114
131
|
xs: true,
|
|
115
132
|
flexDirection: "column",
|
|
116
133
|
display: "flex",
|
|
117
|
-
children:
|
|
134
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
|
|
118
135
|
variant: "body1",
|
|
119
136
|
component: "div",
|
|
120
137
|
children: assignment.title
|
|
121
|
-
})
|
|
122
|
-
sx: {
|
|
123
|
-
display: "flex",
|
|
124
|
-
alignItems: "center"
|
|
125
|
-
},
|
|
126
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.LinearProgress, {
|
|
127
|
-
variant: "determinate",
|
|
128
|
-
value: assignment.completed / assignment.assignedStudents.length * 100 //change this to the actual value of student completed
|
|
129
|
-
,
|
|
130
|
-
sx: {
|
|
131
|
-
height: 10,
|
|
132
|
-
borderRadius: 5,
|
|
133
|
-
width: "25%"
|
|
134
|
-
},
|
|
135
|
-
color: "success"
|
|
136
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
|
|
137
|
-
variant: "body2",
|
|
138
|
-
sx: {
|
|
139
|
-
color: "text.secondary",
|
|
140
|
-
marginLeft: 1
|
|
141
|
-
},
|
|
142
|
-
children: `${Math.round(assignment.completed / assignment.assignedStudents.length * 100)}%`
|
|
143
|
-
})]
|
|
144
|
-
})]
|
|
138
|
+
})
|
|
145
139
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Grid, {
|
|
146
140
|
item: true,
|
|
147
141
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
|
|
@@ -154,12 +148,14 @@ function AssignmentCard({
|
|
|
154
148
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
|
|
155
149
|
title: t("edit"),
|
|
156
150
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.IconButton, {
|
|
151
|
+
"data-cy": `edit-assignment-${index}`,
|
|
157
152
|
onClick: () => handleEditAssignment(assignment),
|
|
158
153
|
children: [" ", /*#__PURE__*/(0, _jsxRuntime.jsx)(_iconsMaterial.Edit, {}), " "]
|
|
159
154
|
})
|
|
160
155
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
|
|
161
156
|
title: t("delete"),
|
|
162
157
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.IconButton, {
|
|
158
|
+
"data-cy": `delete-assignment-${index}`,
|
|
163
159
|
onClick: () => {
|
|
164
160
|
handleDeleteAssignment(assignment.classroomId, assignment.assignmentId);
|
|
165
161
|
},
|
|
@@ -196,6 +192,9 @@ function AssignmentCard({
|
|
|
196
192
|
isCreator: isCreator,
|
|
197
193
|
viewOnly: true,
|
|
198
194
|
useCase: isCreator ? "assignment-view" : "assignment-start",
|
|
195
|
+
preferred_username: preferred_username,
|
|
196
|
+
progressHelpers: progressHelpers,
|
|
197
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
199
198
|
lastClickedExerciseId: lastClickedExerciseId
|
|
200
199
|
})
|
|
201
200
|
})]
|
|
@@ -26,6 +26,11 @@ const AssignmentCardsList = ({
|
|
|
26
26
|
deleteAssignment,
|
|
27
27
|
handleEditAssignment,
|
|
28
28
|
refreshAssignments,
|
|
29
|
+
username,
|
|
30
|
+
preferred_username,
|
|
31
|
+
progressHelpers,
|
|
32
|
+
fetchMemberCourseCompletions,
|
|
33
|
+
memberId,
|
|
29
34
|
handleViewProgress
|
|
30
35
|
}) => {
|
|
31
36
|
const [lastClickedExerciseId, setLastClickedExerciseId] = (0, _react.useState)(null);
|
|
@@ -48,7 +53,7 @@ const AssignmentCardsList = ({
|
|
|
48
53
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
|
|
49
54
|
alignItems: "center",
|
|
50
55
|
sx: {
|
|
51
|
-
|
|
56
|
+
my: 2
|
|
52
57
|
},
|
|
53
58
|
display: "flex",
|
|
54
59
|
flexDirection: "column",
|
|
@@ -126,7 +131,8 @@ const AssignmentCardsList = ({
|
|
|
126
131
|
if (isCreator) return true;
|
|
127
132
|
if (!assignment.scheduleDate) return true;
|
|
128
133
|
return new Date(assignment.scheduleDate) <= new Date();
|
|
129
|
-
}).map(assignment => /*#__PURE__*/(0, _jsxRuntime.jsx)(_AssignmentCard.default, {
|
|
134
|
+
}).map((assignment, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_AssignmentCard.default, {
|
|
135
|
+
index: index,
|
|
130
136
|
assignment: assignment,
|
|
131
137
|
t: t,
|
|
132
138
|
isCreator: isCreator,
|
|
@@ -136,6 +142,11 @@ const AssignmentCardsList = ({
|
|
|
136
142
|
deleteAssignment: deleteAssignment,
|
|
137
143
|
handleEditAssignment: handleEditAssignment,
|
|
138
144
|
lastClickedExerciseId: lastClickedExerciseId,
|
|
145
|
+
progressHelpers: progressHelpers,
|
|
146
|
+
fetchMemberCourseCompletions: fetchMemberCourseCompletions,
|
|
147
|
+
username: username,
|
|
148
|
+
preferred_username: preferred_username,
|
|
149
|
+
memberId: memberId,
|
|
139
150
|
handleViewProgress: handleViewProgress
|
|
140
151
|
}, assignment.assignmentId))]
|
|
141
152
|
})
|
|
@@ -6,10 +6,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
8
|
var _material = require("@mui/material");
|
|
9
|
+
var _ColorLinearProgress = _interopRequireDefault(require("../../Misc/ColorLinearProgress/ColorLinearProgress"));
|
|
9
10
|
var _ExpandMore = _interopRequireDefault(require("@mui/icons-material/ExpandMore"));
|
|
10
11
|
var _ExpandLess = _interopRequireDefault(require("@mui/icons-material/ExpandLess"));
|
|
11
12
|
var _AssignmentExerciseSelection = _interopRequireDefault(require("../AssignmentExerciseSelection/AssignmentExerciseSelection"));
|
|
12
13
|
var _Queries = require("@nualang/nualang-api-and-queries/Queries");
|
|
14
|
+
var _utils = require("../../utils");
|
|
13
15
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
14
16
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
17
|
function Course({
|
|
@@ -29,12 +31,16 @@ function Course({
|
|
|
29
31
|
handleStartExercise,
|
|
30
32
|
isCreator,
|
|
31
33
|
viewOnly,
|
|
34
|
+
preferred_username,
|
|
35
|
+
progressHelpers,
|
|
36
|
+
memberCourseCompletions,
|
|
32
37
|
lastClickedExerciseId
|
|
33
38
|
}) {
|
|
34
39
|
const numOfIds = lastClickedExerciseId ? lastClickedExerciseId.split('|') : [];
|
|
35
40
|
const [open, setOpen] = (0, _react.useState)(lastClickedExerciseId && (numOfIds.length === 4 && lastClickedExerciseId.endsWith(`|${assignment.assignmentId}`) || numOfIds.length === 5 && lastClickedExerciseId.split('|')[3] === assignment.assignmentId));
|
|
36
41
|
const [selectedSectionIds, setSelectedSectionIds] = (0, _react.useState)([]);
|
|
37
42
|
const [filteredSections, setFilteredSections] = (0, _react.useState)([]);
|
|
43
|
+
const [courseSectionCompletion, setCourseSectionCompletion] = (0, _react.useState)(null);
|
|
38
44
|
const sectionsQuery = _Queries.courses.useCourseSections(async (courseId, filters) => {
|
|
39
45
|
const response = await getCourseSections(courseId, filters);
|
|
40
46
|
return response;
|
|
@@ -70,6 +76,13 @@ function Course({
|
|
|
70
76
|
setFilteredSections(courseSections.filter(section => selectedSectionIds.includes(section.sectionId)));
|
|
71
77
|
}
|
|
72
78
|
}, [courseSections, selectedSectionIds, viewOnly]);
|
|
79
|
+
(0, _react.useEffect)(() => {
|
|
80
|
+
if (courseSections && memberCourseCompletions && selectedExercises) {
|
|
81
|
+
const sectionsWithProgress = (0, _utils.calcCompletions)(courseSections, memberCourseCompletions, selectedExercises);
|
|
82
|
+
const percentCompletion = (0, _utils.calcPercentageCompletion)(sectionsWithProgress);
|
|
83
|
+
setCourseSectionCompletion(percentCompletion);
|
|
84
|
+
}
|
|
85
|
+
}, [courseSections, memberCourseCompletions, selectedExercises]);
|
|
73
86
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.List, {
|
|
74
87
|
disablePadding: true,
|
|
75
88
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
|
|
@@ -92,7 +105,22 @@ function Course({
|
|
|
92
105
|
alt: ""
|
|
93
106
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
|
|
94
107
|
primary: course.courseName,
|
|
95
|
-
secondary:
|
|
108
|
+
secondary: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
109
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
|
|
110
|
+
variant: "body2",
|
|
111
|
+
color: "textSecondary",
|
|
112
|
+
children: course.description
|
|
113
|
+
}), !isCreator && courseSectionCompletion && courseSectionCompletion !== null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
|
|
114
|
+
mt: 1,
|
|
115
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
|
|
116
|
+
title: `Completed ${courseSectionCompletion.completed} / ${courseSectionCompletion.total} exercises`,
|
|
117
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ColorLinearProgress.default, {
|
|
118
|
+
variant: "determinate",
|
|
119
|
+
value: courseSectionCompletion.percentage
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
})]
|
|
123
|
+
}),
|
|
96
124
|
sx: {
|
|
97
125
|
marginLeft: 2
|
|
98
126
|
}
|
|
@@ -130,6 +158,10 @@ function Course({
|
|
|
130
158
|
handleStartExercise: handleStartExercise,
|
|
131
159
|
isCreator: isCreator,
|
|
132
160
|
viewOnly: viewOnly,
|
|
161
|
+
username: username,
|
|
162
|
+
preferred_username: preferred_username,
|
|
163
|
+
progressHelpers: progressHelpers,
|
|
164
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
133
165
|
lastClickedExerciseId: lastClickedExerciseId
|
|
134
166
|
})
|
|
135
167
|
})
|
|
@@ -151,6 +183,9 @@ function AssignmentCourseSelection({
|
|
|
151
183
|
handleStartExercise,
|
|
152
184
|
isCreator,
|
|
153
185
|
viewOnly,
|
|
186
|
+
preferred_username,
|
|
187
|
+
progressHelpers,
|
|
188
|
+
memberCourseCompletions,
|
|
154
189
|
lastClickedExerciseId,
|
|
155
190
|
...otherProps
|
|
156
191
|
}) {
|
|
@@ -171,6 +206,9 @@ function AssignmentCourseSelection({
|
|
|
171
206
|
handleStartExercise: handleStartExercise,
|
|
172
207
|
isCreator: isCreator,
|
|
173
208
|
viewOnly: viewOnly,
|
|
209
|
+
preferred_username: preferred_username,
|
|
210
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
211
|
+
progressHelpers: progressHelpers,
|
|
174
212
|
lastClickedExerciseId: lastClickedExerciseId
|
|
175
213
|
}))
|
|
176
214
|
});
|
|
@@ -9,7 +9,6 @@ var _material = require("@mui/material");
|
|
|
9
9
|
var _styles = require("@mui/material/styles");
|
|
10
10
|
var _useMediaQuery = _interopRequireDefault(require("@mui/material/useMediaQuery"));
|
|
11
11
|
var _ImageSearch = _interopRequireDefault(require("@mui/icons-material/ImageSearch"));
|
|
12
|
-
var _PlayCircleOutline = _interopRequireDefault(require("@mui/icons-material/PlayCircleOutline"));
|
|
13
12
|
var _Hearing = _interopRequireDefault(require("@mui/icons-material/Hearing"));
|
|
14
13
|
var _SwapHoriz = _interopRequireDefault(require("@mui/icons-material/SwapHoriz"));
|
|
15
14
|
var _ExpandMore = _interopRequireDefault(require("@mui/icons-material/ExpandMore"));
|
|
@@ -19,7 +18,13 @@ var _Forum = _interopRequireDefault(require("@mui/icons-material/Forum"));
|
|
|
19
18
|
var _OndemandVideo = _interopRequireDefault(require("@mui/icons-material/OndemandVideo"));
|
|
20
19
|
var _AssignmentRoleplaySelection = _interopRequireDefault(require("../AssignmentRoleplaySelection/AssignmentRoleplaySelection"));
|
|
21
20
|
var _CardElements = require("../../Cards/CardElements");
|
|
21
|
+
var _Progress = require("@nualang/nualang-api-and-queries/APIs/Progress");
|
|
22
|
+
var _mui = require("tss-react/mui");
|
|
23
|
+
var _Queries = require("@nualang/nualang-api-and-queries/Queries");
|
|
22
24
|
var _reactRouterDom = require("react-router-dom");
|
|
25
|
+
var _Exercises = require("../../Lists/Exercises/Exercises");
|
|
26
|
+
var _ColorLinearProgress = _interopRequireDefault(require("../../Misc/ColorLinearProgress/ColorLinearProgress"));
|
|
27
|
+
var _utils = require("../../utils");
|
|
23
28
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
24
29
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
25
30
|
function Exercise({
|
|
@@ -35,11 +40,69 @@ function Exercise({
|
|
|
35
40
|
selectedExercises,
|
|
36
41
|
useCase,
|
|
37
42
|
assignment,
|
|
43
|
+
progressHelpers,
|
|
44
|
+
username,
|
|
45
|
+
preferred_username,
|
|
46
|
+
isCreator,
|
|
47
|
+
memberCourseCompletions,
|
|
48
|
+
completion,
|
|
38
49
|
lastClickedExerciseId
|
|
39
50
|
}) {
|
|
40
51
|
const [listeningHidden, setListeningHidden] = (0, _react.useState)(false);
|
|
41
52
|
const [translationHidden, setTranslationHidden] = (0, _react.useState)(false);
|
|
42
53
|
const [pronunciationHidden, setPronunciationHidden] = (0, _react.useState)(false);
|
|
54
|
+
|
|
55
|
+
//progress
|
|
56
|
+
const [pronunciationProgress, setPronunciationProgress] = (0, _react.useState)(null);
|
|
57
|
+
const [translationProgress, setTranslationProgress] = (0, _react.useState)(null);
|
|
58
|
+
const [listeningProgress, setListeningProgress] = (0, _react.useState)(null);
|
|
59
|
+
const [courseId, sectionId, topicId] = courseSectionTopicId.split("|");
|
|
60
|
+
const {
|
|
61
|
+
translation,
|
|
62
|
+
listening,
|
|
63
|
+
pronunciation
|
|
64
|
+
} = completion;
|
|
65
|
+
const courseSectionTopicProgressQuery = _Queries.progress.useTopicMemberProgress(async (courseId, sectionId, topicId, memberId, returnvalues) => {
|
|
66
|
+
const memberProgress = await (0, _Progress.getCourseSectionTopicProgress)(courseId, sectionId, topicId, memberId, returnvalues);
|
|
67
|
+
const formattedProgress = await progressHelpers.formatProgress(memberProgress.Items, username, preferred_username);
|
|
68
|
+
return formattedProgress;
|
|
69
|
+
}, {
|
|
70
|
+
courseId: courseId,
|
|
71
|
+
sectionId: sectionId,
|
|
72
|
+
topicId: topicId,
|
|
73
|
+
memberId: username,
|
|
74
|
+
returnvalues: null
|
|
75
|
+
}, {
|
|
76
|
+
enabled: !!username
|
|
77
|
+
});
|
|
78
|
+
const topicProgress = courseSectionTopicProgressQuery.isSuccess && Array.isArray(courseSectionTopicProgressQuery.data) && courseSectionTopicProgressQuery.data.length ? courseSectionTopicProgressQuery.data : [];
|
|
79
|
+
const getExerciseProgress = async exercise => {
|
|
80
|
+
const exerciseIndex = topicProgress.findIndex(p => p.exercise === exercise);
|
|
81
|
+
if (exerciseIndex > -1) {
|
|
82
|
+
return {
|
|
83
|
+
remainingQuestions: topicProgress[exerciseIndex].remainingQuestions,
|
|
84
|
+
existingAnswerAttempts: topicProgress[exerciseIndex].answerAttempts,
|
|
85
|
+
exerciseStartTime: topicProgress[exerciseIndex].exerciseStartTime
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
remainingQuestions: null,
|
|
90
|
+
existingAnswerAttempts: null,
|
|
91
|
+
exerciseStartTime: null
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
(0, _react.useEffect)(() => {
|
|
95
|
+
if (!topicProgress || topicProgress.length === 0 || isCreator) return;
|
|
96
|
+
const fetchProgress = async () => {
|
|
97
|
+
const pronuncialtionResult = await getExerciseProgress("pronunciation");
|
|
98
|
+
setPronunciationProgress(pronuncialtionResult);
|
|
99
|
+
const translationResult = await getExerciseProgress("translation");
|
|
100
|
+
setTranslationProgress(translationResult);
|
|
101
|
+
const listeningProgress = await getExerciseProgress("listening");
|
|
102
|
+
setListeningProgress(listeningProgress);
|
|
103
|
+
};
|
|
104
|
+
fetchProgress();
|
|
105
|
+
}, [topicProgress, isCreator]);
|
|
43
106
|
const isAssignmentExerciseSelected = selectedExercises?.some(e => e.name === name && e.courseSectionTopicId === courseSectionTopicId);
|
|
44
107
|
const noRoleplays = name.toLowerCase() === "roleplays" && roleplays.length === 0;
|
|
45
108
|
const [roleplaysOpen, setRoleplaysOpen] = (0, _react.useState)(noRoleplays ? false : true);
|
|
@@ -48,13 +111,11 @@ function Exercise({
|
|
|
48
111
|
const {
|
|
49
112
|
classroomId
|
|
50
113
|
} = params;
|
|
51
|
-
const [courseId, sectionId, topicId] = courseSectionTopicId.split("|");
|
|
52
114
|
const addSearchParams = () => {
|
|
53
115
|
const lastClickedExercise = {
|
|
54
116
|
courseSectionTopicId: `${courseSectionTopicId}|${assignment.assignmentId}`
|
|
55
117
|
};
|
|
56
118
|
localStorage.setItem("lastClickedExercise", JSON.stringify(lastClickedExercise));
|
|
57
|
-
const assignmentParam = encodeURIComponent(JSON.stringify(assignment));
|
|
58
119
|
navigate(`/classrooms/${classroomId}/${courseId}/${sectionId}/${topicId}?exercise=${name}&assignmentId=${assignment.assignmentId}`);
|
|
59
120
|
};
|
|
60
121
|
const handleToggleRoleplays = () => {
|
|
@@ -124,8 +185,24 @@ function Exercise({
|
|
|
124
185
|
courseSectionTopicId
|
|
125
186
|
}]);
|
|
126
187
|
}
|
|
127
|
-
}), useCase === "assignment-view" && /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {}),
|
|
128
|
-
|
|
188
|
+
}), useCase === "assignment-view" && /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {}), !isCreator && name.toLowerCase() === "pronunciation" && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
189
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Exercises.InProgressBadge, {
|
|
190
|
+
progressCount: pronunciationProgress && pronunciationProgress.remainingQuestions?.length || 0
|
|
191
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Exercises.ProgressBadge, {
|
|
192
|
+
completions: pronunciation && pronunciation.completedCount ? pronunciation.completedCount : 0
|
|
193
|
+
})]
|
|
194
|
+
}), !isCreator && name.toLowerCase() === "translation" && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
195
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Exercises.InProgressBadge, {
|
|
196
|
+
progressCount: translationProgress && translationProgress.remainingQuestions?.length || 0
|
|
197
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Exercises.ProgressBadge, {
|
|
198
|
+
completions: translation && translation.completedCount ? translation.completedCount : 0
|
|
199
|
+
})]
|
|
200
|
+
}), !isCreator && name.toLowerCase() === "listening" && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
201
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Exercises.InProgressBadge, {
|
|
202
|
+
progressCount: listeningProgress && listeningProgress.remainingQuestions?.length || 0
|
|
203
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Exercises.ProgressBadge, {
|
|
204
|
+
completions: listening && listening.completedCount ? listening.completedCount : 0
|
|
205
|
+
})]
|
|
129
206
|
})]
|
|
130
207
|
})]
|
|
131
208
|
}), name.toLowerCase() === "roleplays" && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Collapse, {
|
|
@@ -143,6 +220,9 @@ function Exercise({
|
|
|
143
220
|
selectedExercises: selectedExercises,
|
|
144
221
|
useCase: useCase,
|
|
145
222
|
assignment: assignment,
|
|
223
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
224
|
+
topicProgress: topicProgress,
|
|
225
|
+
isCreator: isCreator,
|
|
146
226
|
lastClickedExerciseId: lastClickedExerciseId
|
|
147
227
|
})
|
|
148
228
|
})
|
|
@@ -167,7 +247,12 @@ function ExerciseList({
|
|
|
167
247
|
assignment,
|
|
168
248
|
handleStartExercise,
|
|
169
249
|
isCreator,
|
|
250
|
+
progressHelpers,
|
|
251
|
+
memberCourseCompletions,
|
|
252
|
+
username,
|
|
253
|
+
preferred_username,
|
|
170
254
|
lastClickedExerciseId,
|
|
255
|
+
completion,
|
|
171
256
|
...otherProps
|
|
172
257
|
}) {
|
|
173
258
|
const courseSectionTopicId = `${courseId}|${sectionId}|${topicId}`;
|
|
@@ -195,7 +280,12 @@ function ExerciseList({
|
|
|
195
280
|
assignment: assignment,
|
|
196
281
|
handleStartExercise: handleStartExercise,
|
|
197
282
|
isCreator: isCreator,
|
|
283
|
+
username: username,
|
|
284
|
+
preferred_username: preferred_username,
|
|
285
|
+
progressHelpers: progressHelpers,
|
|
286
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
198
287
|
lastClickedExerciseId: lastClickedExerciseId,
|
|
288
|
+
completion: completion,
|
|
199
289
|
...otherProps
|
|
200
290
|
}, keyId);
|
|
201
291
|
})
|
|
@@ -211,30 +301,25 @@ function Topic({
|
|
|
211
301
|
description,
|
|
212
302
|
picture,
|
|
213
303
|
roleplays = [],
|
|
214
|
-
bots = [],
|
|
215
|
-
completions = [],
|
|
304
|
+
// bots = [],
|
|
216
305
|
isMember,
|
|
217
|
-
nextTopic,
|
|
218
|
-
prevTopic,
|
|
219
|
-
handleViewCourseTopic,
|
|
220
306
|
isTopicHidden,
|
|
221
|
-
completion = {},
|
|
222
|
-
sectionIndex,
|
|
223
|
-
index,
|
|
224
|
-
moveTopic,
|
|
225
|
-
onDropSection,
|
|
226
307
|
phrases,
|
|
227
308
|
section,
|
|
228
309
|
isExerciseSelected,
|
|
229
310
|
setIsExerciseSelected,
|
|
230
|
-
getRoleplays,
|
|
231
311
|
handleSelectExercise,
|
|
232
312
|
selectedExercises,
|
|
233
313
|
useCase,
|
|
234
314
|
assignment,
|
|
235
315
|
handleStartExercise,
|
|
236
316
|
isCreator,
|
|
317
|
+
username,
|
|
318
|
+
preferred_username,
|
|
319
|
+
progressHelpers,
|
|
320
|
+
memberCourseCompletions,
|
|
237
321
|
lastClickedExerciseId,
|
|
322
|
+
completion,
|
|
238
323
|
...otherProps
|
|
239
324
|
}) {
|
|
240
325
|
const theme = (0, _styles.useTheme)();
|
|
@@ -402,6 +487,35 @@ function Topic({
|
|
|
402
487
|
children: description
|
|
403
488
|
})
|
|
404
489
|
})
|
|
490
|
+
}), !isCreator && completion && completion !== null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
|
|
491
|
+
display: "flex",
|
|
492
|
+
alignItems: "center",
|
|
493
|
+
justifyContent: "space-between",
|
|
494
|
+
mt: 1,
|
|
495
|
+
mb: 1,
|
|
496
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
|
|
497
|
+
display: "inline",
|
|
498
|
+
flexGrow: 1,
|
|
499
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
|
|
500
|
+
title: `Completed ${completion.completed} / ${completion.total} exercises`,
|
|
501
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ColorLinearProgress.default, {
|
|
502
|
+
variant: "determinate",
|
|
503
|
+
value: completion.percentage
|
|
504
|
+
})
|
|
505
|
+
})
|
|
506
|
+
})
|
|
507
|
+
}), isMember && !isCreator && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
|
|
508
|
+
display: "flex",
|
|
509
|
+
alignItems: "center",
|
|
510
|
+
justifyContent: "space-between",
|
|
511
|
+
mt: 1,
|
|
512
|
+
width: isLargeScreen ? "40%" : "100%",
|
|
513
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
|
|
514
|
+
ml: 1,
|
|
515
|
+
fontSize: 14,
|
|
516
|
+
minWidth: 35,
|
|
517
|
+
children: [completion && completion.percentage ? completion.percentage.toFixed(0) : 0, "%"]
|
|
518
|
+
})
|
|
405
519
|
}), videoUrl && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
|
|
406
520
|
display: "flex",
|
|
407
521
|
alignItems: "center",
|
|
@@ -445,7 +559,7 @@ function Topic({
|
|
|
445
559
|
section: section,
|
|
446
560
|
isExerciseSelected: isExerciseSelected,
|
|
447
561
|
setIsExerciseSelected: setIsExerciseSelected,
|
|
448
|
-
roleplays:
|
|
562
|
+
roleplays: roleplays,
|
|
449
563
|
phrases: phrases,
|
|
450
564
|
handleSelectExercise: handleSelectExercise,
|
|
451
565
|
selectedExercises: selectedExercises,
|
|
@@ -453,8 +567,13 @@ function Topic({
|
|
|
453
567
|
assignment: assignment,
|
|
454
568
|
handleStartExercise: handleStartExercise,
|
|
455
569
|
isCreator: isCreator,
|
|
570
|
+
username: username,
|
|
571
|
+
preferred_username: preferred_username,
|
|
572
|
+
progressHelpers: progressHelpers,
|
|
573
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
456
574
|
lastClickedExerciseId: lastClickedExerciseId,
|
|
457
|
-
...otherProps
|
|
575
|
+
...otherProps,
|
|
576
|
+
completion: completion
|
|
458
577
|
})
|
|
459
578
|
})]
|
|
460
579
|
})
|
|
@@ -478,7 +597,12 @@ function Section({
|
|
|
478
597
|
handleStartExercise,
|
|
479
598
|
isCreator,
|
|
480
599
|
viewOnly,
|
|
600
|
+
username,
|
|
601
|
+
preferred_username,
|
|
602
|
+
progressHelpers,
|
|
603
|
+
memberCourseCompletions,
|
|
481
604
|
lastClickedExerciseId,
|
|
605
|
+
completion,
|
|
482
606
|
...otherProps
|
|
483
607
|
}) {
|
|
484
608
|
const root = {
|
|
@@ -509,15 +633,17 @@ function Section({
|
|
|
509
633
|
}, [topics, selectedTopicIds, viewOnly]);
|
|
510
634
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
511
635
|
children: !isHidden && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.List, {
|
|
512
|
-
subheader: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
636
|
+
subheader: /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
637
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListSubheader, {
|
|
638
|
+
disableGutters: true,
|
|
639
|
+
disableSticky: true,
|
|
640
|
+
component: "div",
|
|
641
|
+
id: `${sectionName}-section-list-subheader`,
|
|
642
|
+
sx: {
|
|
643
|
+
fontWeight: !isExerciseSelected ? "bold" : "normal"
|
|
644
|
+
},
|
|
645
|
+
children: sectionName
|
|
646
|
+
})
|
|
521
647
|
}),
|
|
522
648
|
sx: root,
|
|
523
649
|
children: viewOnly ? filteredTopics.map((topic, i) => /*#__PURE__*/(0, _jsxRuntime.jsx)(Topic, {
|
|
@@ -531,6 +657,7 @@ function Section({
|
|
|
531
657
|
t: t,
|
|
532
658
|
...topic,
|
|
533
659
|
...otherProps,
|
|
660
|
+
completion: topic.completion,
|
|
534
661
|
picture: topic.picture,
|
|
535
662
|
isExerciseSelected: isExerciseSelected,
|
|
536
663
|
setIsExerciseSelected: setIsExerciseSelected,
|
|
@@ -541,7 +668,11 @@ function Section({
|
|
|
541
668
|
assignment: assignment,
|
|
542
669
|
handleStartExercise: handleStartExercise,
|
|
543
670
|
isCreator: isCreator,
|
|
544
|
-
lastClickedExerciseId: lastClickedExerciseId
|
|
671
|
+
lastClickedExerciseId: lastClickedExerciseId,
|
|
672
|
+
username: username,
|
|
673
|
+
preferred_username: preferred_username,
|
|
674
|
+
progressHelpers: progressHelpers,
|
|
675
|
+
memberCourseCompletions: memberCourseCompletions
|
|
545
676
|
}, `${sectionId}-${topic.topicId}`)) : topics.map((topic, i) => /*#__PURE__*/(0, _jsxRuntime.jsx)(Topic, {
|
|
546
677
|
index: i,
|
|
547
678
|
topics: topics,
|
|
@@ -553,6 +684,7 @@ function Section({
|
|
|
553
684
|
t: t,
|
|
554
685
|
...topic,
|
|
555
686
|
...otherProps,
|
|
687
|
+
completion: topic.completion,
|
|
556
688
|
picture: topic.picture,
|
|
557
689
|
isExerciseSelected: isExerciseSelected,
|
|
558
690
|
setIsExerciseSelected: setIsExerciseSelected,
|
|
@@ -563,7 +695,11 @@ function Section({
|
|
|
563
695
|
assignment: assignment,
|
|
564
696
|
handleStartExercise: handleStartExercise,
|
|
565
697
|
isCreator: isCreator,
|
|
566
|
-
lastClickedExerciseId: lastClickedExerciseId
|
|
698
|
+
lastClickedExerciseId: lastClickedExerciseId,
|
|
699
|
+
username: username,
|
|
700
|
+
preferred_username: preferred_username,
|
|
701
|
+
progressHelpers: progressHelpers,
|
|
702
|
+
memberCourseCompletions: memberCourseCompletions
|
|
567
703
|
}, `${sectionId}-${topic.topicId}`))
|
|
568
704
|
})
|
|
569
705
|
});
|
|
@@ -584,11 +720,23 @@ function SectionList({
|
|
|
584
720
|
handleStartExercise,
|
|
585
721
|
isCreator,
|
|
586
722
|
viewOnly,
|
|
723
|
+
username,
|
|
724
|
+
preferred_username,
|
|
725
|
+
progressHelpers,
|
|
726
|
+
memberCourseCompletions,
|
|
587
727
|
lastClickedExerciseId,
|
|
588
728
|
...otherProps
|
|
589
729
|
}) {
|
|
730
|
+
const [courseSectionWithProgress, setCourseSectionWithProgress] = (0, _react.useState)([]);
|
|
731
|
+
(0, _react.useEffect)(() => {
|
|
732
|
+
if (sections && memberCourseCompletions && selectedExercises) {
|
|
733
|
+
const sectionsWithProgress = (0, _utils.calcCompletions)(sections, memberCourseCompletions, selectedExercises);
|
|
734
|
+
setCourseSectionWithProgress(sectionsWithProgress);
|
|
735
|
+
}
|
|
736
|
+
}, [sections, memberCourseCompletions, selectedExercises]);
|
|
737
|
+
const courseSections = courseSectionWithProgress && courseSectionWithProgress.length ? courseSectionWithProgress : sections;
|
|
590
738
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
591
|
-
children:
|
|
739
|
+
children: courseSections.length > 0 ? courseSections.map((section, index) => {
|
|
592
740
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(Section, {
|
|
593
741
|
index: index,
|
|
594
742
|
handleFetchTopic: handleFetchTopic,
|
|
@@ -607,6 +755,10 @@ function SectionList({
|
|
|
607
755
|
handleStartExercise: handleStartExercise,
|
|
608
756
|
isCreator: isCreator,
|
|
609
757
|
viewOnly: viewOnly,
|
|
758
|
+
username: username,
|
|
759
|
+
preferred_username: preferred_username,
|
|
760
|
+
progressHelpers: progressHelpers,
|
|
761
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
610
762
|
lastClickedExerciseId: lastClickedExerciseId,
|
|
611
763
|
...otherProps
|
|
612
764
|
}, section.sectionId);
|
|
@@ -635,6 +787,10 @@ function AssignmentExerciseSelection({
|
|
|
635
787
|
assignment,
|
|
636
788
|
handleStartExercise,
|
|
637
789
|
viewOnly,
|
|
790
|
+
username,
|
|
791
|
+
preferred_username,
|
|
792
|
+
progressHelpers,
|
|
793
|
+
memberCourseCompletions,
|
|
638
794
|
lastClickedExerciseId,
|
|
639
795
|
...otherProps
|
|
640
796
|
}) {
|
|
@@ -656,6 +812,10 @@ function AssignmentExerciseSelection({
|
|
|
656
812
|
assignment: assignment,
|
|
657
813
|
handleStartExercise: handleStartExercise,
|
|
658
814
|
viewOnly: viewOnly,
|
|
815
|
+
username: username,
|
|
816
|
+
preferred_username: preferred_username,
|
|
817
|
+
progressHelpers: progressHelpers,
|
|
818
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
659
819
|
lastClickedExerciseId: lastClickedExerciseId,
|
|
660
820
|
...otherProps
|
|
661
821
|
})
|
|
@@ -679,6 +839,10 @@ function AssignmentExerciseSelection({
|
|
|
679
839
|
useCase: useCase,
|
|
680
840
|
assignment: assignment,
|
|
681
841
|
viewOnly: viewOnly,
|
|
842
|
+
username: username,
|
|
843
|
+
preferred_username: preferred_username,
|
|
844
|
+
progressHelpers: progressHelpers,
|
|
845
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
682
846
|
lastClickedExerciseId: lastClickedExerciseId,
|
|
683
847
|
...otherProps
|
|
684
848
|
})
|
|
@@ -20,6 +20,9 @@ function AssignmentExerciseSelector({
|
|
|
20
20
|
selectedExercises,
|
|
21
21
|
viewOnly,
|
|
22
22
|
useCase,
|
|
23
|
+
preferred_username,
|
|
24
|
+
progressHelpers,
|
|
25
|
+
memberCourseCompletions,
|
|
23
26
|
lastClickedExerciseId
|
|
24
27
|
}) {
|
|
25
28
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_system.Box, {
|
|
@@ -35,6 +38,9 @@ function AssignmentExerciseSelector({
|
|
|
35
38
|
selectedExercises: selectedExercises,
|
|
36
39
|
viewOnly: viewOnly,
|
|
37
40
|
useCase: useCase,
|
|
41
|
+
preferred_username: preferred_username,
|
|
42
|
+
progressHelpers: progressHelpers,
|
|
43
|
+
memberCourseCompletions: memberCourseCompletions,
|
|
38
44
|
lastClickedExerciseId: lastClickedExerciseId
|
|
39
45
|
})
|
|
40
46
|
});
|