@nualang/nualang-ui-components 0.1.1219 → 0.1.1221

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.
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = require("react");
8
+ var _material = require("@mui/material");
9
+ var _PlayCircleOutline = _interopRequireDefault(require("@mui/icons-material/PlayCircleOutline"));
10
+ var _Message = _interopRequireDefault(require("@mui/icons-material/Message"));
11
+ var _RateReview = _interopRequireDefault(require("@mui/icons-material/RateReview"));
12
+ var _ExpandMore = _interopRequireDefault(require("@mui/icons-material/ExpandMore"));
13
+ var _ExpandLess = _interopRequireDefault(require("@mui/icons-material/ExpandLess"));
14
+ var _AutoStories = _interopRequireDefault(require("@mui/icons-material/AutoStories"));
15
+ var _jsxRuntime = require("react/jsx-runtime");
16
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
+ function Roleplay({
18
+ roleplay,
19
+ handleCreateGame,
20
+ courseSectionTopicId,
21
+ isRoleplaySelected,
22
+ setIsRoleplaySelected,
23
+ t,
24
+ isExerciseSelected,
25
+ handleSelectExercise = null,
26
+ selectedExercises,
27
+ useCase
28
+ }) {
29
+ const [open, setOpen] = (0, _react.useState)(false);
30
+ const games = ["roleplay-story", "roleplay-fill-in-the-blanks", "roleplay-act-it-out", "roleplay-act-it-out-listening", "roleplay-act-it-out-speaking", "roleplay-act-it-out-listening-speaking"];
31
+ const [isSelectAllChecked, setIsSelectAllChecked] = (0, _react.useState)(false);
32
+ (0, _react.useEffect)(() => {
33
+ const count = selectedExercises.filter(exercise => exercise.roleplayId === roleplay.roleplayId).length;
34
+ setIsSelectAllChecked(count === games.length);
35
+ }, [selectedExercises, roleplay.roleplayId, games.length]);
36
+ const handleSelectAll = () => {
37
+ if (isSelectAllChecked) {
38
+ const removeExercises = games.map(game => ({
39
+ roleplayId: roleplay.roleplayId,
40
+ game
41
+ }));
42
+ handleSelectExercise(removeExercises);
43
+ } else {
44
+ let gamesToAdd = [];
45
+ games.forEach(game => {
46
+ if (!selectedExercises.some(e => e.roleplayId === roleplay.roleplayId && e.game === game)) {
47
+ gamesToAdd = [...gamesToAdd, {
48
+ roleplayId: roleplay.roleplayId,
49
+ game
50
+ }];
51
+ }
52
+ });
53
+ handleSelectExercise(gamesToAdd);
54
+ }
55
+ };
56
+ const handleRoleplaySelected = exerciseName => () => {
57
+ setIsRoleplaySelected(true);
58
+ handleCreateGame({
59
+ courseSectionTopicId: courseSectionTopicId,
60
+ exercise: exerciseName,
61
+ timer: 30,
62
+ answerOption: 0,
63
+ roleplayId: roleplay.roleplayId
64
+ });
65
+ };
66
+ const isRoleplayEmpty = roleplay?.script?.length === 0 || !roleplay?.script?.some(line => line.text !== undefined);
67
+ const numberOfRoleplayQuestions = roleplay?.script?.filter(item => Object.hasOwn(item, "question")).length;
68
+ const numberOfRoleplayInteractions = roleplay?.script?.length - numberOfRoleplayQuestions;
69
+ const roleplayHasInteractions = numberOfRoleplayInteractions > 0;
70
+ const roleplayHasQuestions = numberOfRoleplayQuestions > 0;
71
+ const isRoleplayValid = roleplayHasInteractions && roleplayHasQuestions;
72
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
73
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
74
+ title: roleplay?.script?.length === 0 ? t("roleplay_no_interactions") : !isRoleplayValid ? t("roleplay_not_valid") : "",
75
+ placement: "left",
76
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
77
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.ListItemButton, {
78
+ onClick: () => setOpen(!open),
79
+ disabled: isRoleplaySelected || isRoleplayEmpty || isExerciseSelected || !isRoleplayValid,
80
+ sx: {
81
+ display: "flex",
82
+ alignItems: "center",
83
+ justifyContent: "space-between",
84
+ flexDirection: {
85
+ xs: "column",
86
+ sm: "row"
87
+ }
88
+ },
89
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
90
+ display: "flex",
91
+ alignItems: "center",
92
+ width: {
93
+ xs: "100%",
94
+ sm: "85%"
95
+ },
96
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Avatar, {
97
+ src: roleplay.picture
98
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
99
+ primary: roleplay.roleplayName,
100
+ secondary: roleplay.description,
101
+ sx: {
102
+ marginLeft: 2
103
+ }
104
+ })]
105
+ }), roleplayHasInteractions && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
106
+ display: "flex",
107
+ alignItems: "center",
108
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
109
+ secondary: numberOfRoleplayInteractions,
110
+ sx: {
111
+ marginRight: 0.5
112
+ }
113
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
114
+ sx: {
115
+ marginRight: {
116
+ xs: 0,
117
+ sm: -3
118
+ }
119
+ },
120
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
121
+ title: t("number_of_interactions"),
122
+ placement: "top",
123
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Message.default, {
124
+ sx: {
125
+ width: 18
126
+ }
127
+ })
128
+ })
129
+ })]
130
+ }), roleplayHasQuestions && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
131
+ display: "flex",
132
+ alignItems: "center",
133
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
134
+ secondary: numberOfRoleplayQuestions,
135
+ sx: {
136
+ marginRight: 0.5
137
+ }
138
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
139
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
140
+ title: t("number_of_questions"),
141
+ placement: "top",
142
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_RateReview.default, {
143
+ sx: {
144
+ width: 18
145
+ }
146
+ })
147
+ })
148
+ })]
149
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
150
+ onClick: () => setOpen(!open),
151
+ children: open ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_ExpandLess.default, {
152
+ sx: {
153
+ color: "#757575"
154
+ }
155
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ExpandMore.default, {
156
+ sx: {
157
+ color: "#757575"
158
+ }
159
+ })
160
+ }), useCase === "assignment" && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
161
+ title: t("select_all"),
162
+ placement: "top",
163
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
164
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Checkbox, {
165
+ checked: isSelectAllChecked,
166
+ onChange: handleSelectAll,
167
+ onClick: event => {
168
+ event.stopPropagation();
169
+ }
170
+ })
171
+ })
172
+ })]
173
+ })
174
+ })
175
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Collapse, {
176
+ in: open,
177
+ timeout: "auto",
178
+ unmountOnExit: true,
179
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
180
+ ml: 3.5,
181
+ children: useCase === "assignment" ? games.map(game => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.ListItemButton, {
182
+ onClick: isRoleplayValid ? () => handleSelectExercise([{
183
+ roleplayId: roleplay.roleplayId,
184
+ game
185
+ }]) : null,
186
+ disabled: !isRoleplayValid,
187
+ sx: {
188
+ display: "flex",
189
+ alignItems: "center",
190
+ justifyContent: "space-between",
191
+ flexDirection: {
192
+ xs: "column",
193
+ sm: "row"
194
+ }
195
+ },
196
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
197
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_AutoStories.default, {})
198
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
199
+ primary: t(game),
200
+ secondary: t("story_description")
201
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
202
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Checkbox, {
203
+ checked: selectedExercises.some(e => e.roleplayId === roleplay.roleplayId && e.game === game)
204
+ })
205
+ })]
206
+ })) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.ListItemButton, {
207
+ onClick: handleRoleplaySelected("roleplay-story"),
208
+ disabled: isRoleplaySelected || isExerciseSelected || !isRoleplayValid,
209
+ sx: {
210
+ display: "flex",
211
+ alignItems: "center",
212
+ justifyContent: "space-between",
213
+ flexDirection: {
214
+ xs: "column",
215
+ sm: "row"
216
+ }
217
+ },
218
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
219
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_AutoStories.default, {})
220
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
221
+ primary: t("roleplay-story"),
222
+ secondary: t("story_description")
223
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
224
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlayCircleOutline.default, {
225
+ color: "primary"
226
+ })
227
+ })]
228
+ })
229
+ })
230
+ })]
231
+ });
232
+ }
233
+ function AssignmentRoleplaySelection({
234
+ roleplays = [],
235
+ handleCreateGame,
236
+ courseSectionTopicId,
237
+ t,
238
+ isExerciseSelected,
239
+ handleSelectExercise,
240
+ selectedExercises,
241
+ useCase
242
+ }) {
243
+ const [isRoleplaySelected, setIsRoleplaySelected] = (0, _react.useState)(false);
244
+ return roleplays.map((roleplay, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(Roleplay, {
245
+ roleplay: roleplay,
246
+ handleCreateGame: handleCreateGame,
247
+ isRoleplaySelected: isRoleplaySelected,
248
+ setIsRoleplaySelected: setIsRoleplaySelected,
249
+ courseSectionTopicId: courseSectionTopicId,
250
+ t: t,
251
+ isExerciseSelected: isExerciseSelected,
252
+ handleSelectExercise: handleSelectExercise,
253
+ selectedExercises: selectedExercises,
254
+ useCase: useCase
255
+ }, index));
256
+ }
257
+ var _default = exports.default = AssignmentRoleplaySelection;
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "AssignmentRoleplaySelection",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "main": "./AssignmentRoleplaySelection.js"
6
+ }
7
+
@@ -0,0 +1,418 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = CreateAssignmentDialog;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _material = require("@mui/material");
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _Add = _interopRequireDefault(require("@mui/icons-material/Add"));
11
+ var _Close = _interopRequireDefault(require("@mui/icons-material/Close"));
12
+ var _AdapterDayjs = require("@mui/x-date-pickers/AdapterDayjs");
13
+ var _LocalizationProvider = require("@mui/x-date-pickers/LocalizationProvider");
14
+ var _DatePicker = require("@mui/x-date-pickers/DatePicker");
15
+ var _mui = require("tss-react/mui");
16
+ var _ArrowDropDown = _interopRequireDefault(require("@mui/icons-material/ArrowDropDown"));
17
+ var _ArrowDropUp = _interopRequireDefault(require("@mui/icons-material/ArrowDropUp"));
18
+ var _dayjs = _interopRequireDefault(require("dayjs"));
19
+ var _SelectExercise = _interopRequireDefault(require("../../Dialogs/SelectExercise"));
20
+ var _Queries = require("@nualang/nualang-api-and-queries/Queries");
21
+ var _jsxRuntime = require("react/jsx-runtime");
22
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
24
+ 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; }
25
+ const useStyles = (0, _mui.makeStyles)()(theme => ({
26
+ appBar: {
27
+ position: "relative"
28
+ },
29
+ dialogContent: {
30
+ display: "flex",
31
+ gap: theme.spacing(2),
32
+ padding: theme.spacing(3)
33
+ }
34
+ }));
35
+ function Transition(props) {
36
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Slide, {
37
+ direction: "up",
38
+ ...props
39
+ });
40
+ }
41
+ function CreateAssignmentDialog({
42
+ t,
43
+ classrooms = [],
44
+ classroom,
45
+ getClassroomMembers,
46
+ open,
47
+ handleClose,
48
+ getCourseSections,
49
+ getRoleplays,
50
+ createAssignment,
51
+ username,
52
+ getMemberDetails,
53
+ getClassroom,
54
+ getCourses
55
+ }) {
56
+ const {
57
+ classes
58
+ } = useStyles();
59
+ const [selectedExercises, setSelectedExercises] = (0, _react.useState)([]);
60
+ const [members, setMembers] = (0, _react.useState)([]);
61
+ const [assignment, setAssignment] = (0, _react.useState)({
62
+ classroomId: "",
63
+ assignedStudents: members?.map(member => member.memberId),
64
+ title: "",
65
+ instructions: "",
66
+ type: "assignment",
67
+ scheduleDate: (0, _dayjs.default)(),
68
+ dueDate: (0, _dayjs.default)().add(1, "day"),
69
+ exercises: selectedExercises
70
+ });
71
+ const classroomQuery = _Queries.classrooms.useClassroom(async classroomId => {
72
+ const response = await getClassroom(classroomId);
73
+ return response;
74
+ }, {
75
+ classroomId: assignment.classroomId
76
+ }, {
77
+ enabled: !!assignment.classroomId
78
+ });
79
+ const selectedClassroom = (0, _react.useMemo)(() => classroomQuery.isSuccess && classroomQuery.data.Item ? classroomQuery.data.Item : {}, [classroomQuery.data, classroomQuery.isSuccess]);
80
+ const coursesQuery = _Queries.courses.useCourses(async filters => {
81
+ const response = await getCourses(filters);
82
+ return response;
83
+ }, {
84
+ filters: {
85
+ courseIds: selectedClassroom?.courses?.toString()
86
+ }
87
+ }, {
88
+ enabled: !!assignment.classroomId
89
+ });
90
+ const membersQuery = _Queries.classrooms.useClassroomMembers(async (classroomId, username) => {
91
+ const response = await getClassroomMembers(classroomId, username);
92
+ return response;
93
+ }, {
94
+ classroomId: assignment.classroomId,
95
+ username: username
96
+ }, {
97
+ enabled: !!assignment.classroomId
98
+ });
99
+ const selectedCourses = (0, _react.useMemo)(() => coursesQuery.isSuccess && Array.isArray(coursesQuery.data.Items) && coursesQuery.data.Items.length ? coursesQuery.data.Items : [], [coursesQuery.data, coursesQuery.isSuccess]);
100
+ const selectedMembers = (0, _react.useMemo)(() => membersQuery.isSuccess && Array.isArray(membersQuery.data.Items) && membersQuery.data.Items.length ? membersQuery.data.Items : [], [membersQuery.data, membersQuery.isSuccess]);
101
+ const classroomMembers = async selectedMembers => {
102
+ const formattedMembers = await getMemberDetails(selectedMembers);
103
+ setMembers(formattedMembers);
104
+ };
105
+ (0, _react.useEffect)(() => {
106
+ classroomMembers(selectedMembers);
107
+ }, [selectedMembers]);
108
+ (0, _react.useEffect)(() => {
109
+ setAssignment(prev => ({
110
+ ...prev,
111
+ exercises: selectedExercises
112
+ }));
113
+ }, [selectedExercises]);
114
+ (0, _react.useEffect)(() => {
115
+ setAssignment(prev => ({
116
+ ...prev,
117
+ assignedStudents: members?.map(member => member.memberId)
118
+ }));
119
+ }, [members]);
120
+ (0, _react.useEffect)(() => {
121
+ setAssignment(prev => ({
122
+ ...prev,
123
+ classroomId: classroom
124
+ }));
125
+ }, [classroom]);
126
+ const [isSelectExerciseOpen, setIsSelectExerciseOpen] = (0, _react.useState)(false);
127
+ const handleCloseSelectExercise = () => {
128
+ setIsSelectExerciseOpen(false);
129
+ };
130
+ const [anchorEl, setAnchorEl] = (0, _react.useState)(null);
131
+ const handleMenuOpen = event => {
132
+ setAnchorEl(event.currentTarget);
133
+ };
134
+ const handleMenuClose = () => {
135
+ setAnchorEl(null);
136
+ };
137
+ const handleChange = field => event => {
138
+ let value = event?.target?.value ?? event;
139
+ setAssignment(prev => {
140
+ if (field === "assignedStudents") {
141
+ return {
142
+ ...prev,
143
+ assignedStudents: typeof value === "string" ? value.split(",") : value
144
+ };
145
+ }
146
+ if (field === "classroom") {
147
+ return {
148
+ ...prev,
149
+ classroomId: value,
150
+ assignedStudents: []
151
+ };
152
+ }
153
+ return {
154
+ ...prev,
155
+ [field]: value
156
+ };
157
+ });
158
+ };
159
+ const handleCreateAssignment = () => {
160
+ createAssignment(assignment);
161
+ handleClose();
162
+ };
163
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Dialog, {
164
+ fullScreen: true,
165
+ open: open,
166
+ onClose: handleClose,
167
+ TransitionComponent: Transition,
168
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.AppBar, {
169
+ className: classes.appBar,
170
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Toolbar, {
171
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.IconButton, {
172
+ edge: "start",
173
+ color: "inherit",
174
+ onClick: handleClose,
175
+ "aria-label": "Close",
176
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Close.default, {})
177
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
178
+ variant: "h5",
179
+ fontWeight: "bold",
180
+ textAlign: "center",
181
+ children: t("create_assignment")
182
+ })]
183
+ })
184
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
185
+ component: "main",
186
+ className: classes.dialogContent,
187
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Card, {
188
+ sx: {
189
+ display: "flex",
190
+ flexDirection: "column",
191
+ padding: 1,
192
+ boxShadow: 3,
193
+ width: "50%"
194
+ },
195
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.CardContent, {
196
+ sx: {
197
+ flexGrow: 1,
198
+ display: "flex",
199
+ flexDirection: "column",
200
+ gap: 2
201
+ },
202
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.FormControl, {
203
+ fullWidth: true,
204
+ variant: "outlined",
205
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.InputLabel, {
206
+ id: "classroom-label",
207
+ required: true,
208
+ children: t("select_classroom")
209
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Select, {
210
+ labelId: "classroom-label",
211
+ id: "classroom",
212
+ value: assignment.classroomId,
213
+ label: t("select_classroom"),
214
+ onChange: handleChange("classroomId"),
215
+ required: true,
216
+ disabled: classroom,
217
+ children: classrooms.map(classroom => /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.MenuItem, {
218
+ value: classroom.classroomId,
219
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
220
+ sx: {
221
+ display: "flex",
222
+ alignItems: "center",
223
+ gap: 0.5
224
+ },
225
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemAvatar, {
226
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Avatar, {
227
+ src: classroom.picture
228
+ })
229
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
230
+ primary: classroom.classroomName
231
+ })]
232
+ })
233
+ }, classroom.classroomId))
234
+ })]
235
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.TextField, {
236
+ label: t("assignment_title"),
237
+ fullWidth: true,
238
+ value: assignment.title,
239
+ onChange: handleChange("title"),
240
+ required: true
241
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.TextField, {
242
+ label: t("assignment_description"),
243
+ fullWidth: true,
244
+ multiline: true,
245
+ rows: 3,
246
+ value: assignment.instructions,
247
+ onChange: handleChange("instructions")
248
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Button, {
249
+ variant: "outlined",
250
+ color: "primary",
251
+ sx: {
252
+ width: "fit-content"
253
+ },
254
+ startIcon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Add.default, {}),
255
+ onClick: () => setIsSelectExerciseOpen(true),
256
+ children: t("add_exercise")
257
+ })]
258
+ })
259
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Card, {
260
+ sx: {
261
+ display: "flex",
262
+ flexDirection: "column",
263
+ padding: 1,
264
+ boxShadow: 3,
265
+ width: "50%"
266
+ },
267
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.CardContent, {
268
+ sx: {
269
+ flexGrow: 1,
270
+ display: "flex",
271
+ flexDirection: "column",
272
+ gap: 2
273
+ },
274
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.FormControl, {
275
+ fullWidth: true,
276
+ disabled: !assignment.classroomId,
277
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.InputLabel, {
278
+ id: "members-label",
279
+ required: true,
280
+ children: t("select_members")
281
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Select, {
282
+ labelId: "members-label",
283
+ id: "assignedStudents",
284
+ label: t("select_members"),
285
+ multiple: true,
286
+ required: true,
287
+ value: assignment.assignedStudents,
288
+ onChange: handleChange("assignedStudents"),
289
+ renderValue: selected => selected.map(memberId => members?.find(member => member.memberId === memberId)).map(member => member?.username).join(", "),
290
+ children: members?.map(member => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, {
291
+ value: member.memberId,
292
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Avatar, {
293
+ src: member.userImage,
294
+ sx: {
295
+ mr: 2
296
+ }
297
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
298
+ primary: member.username
299
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Checkbox, {
300
+ checked: assignment.assignedStudents?.includes(member.memberId)
301
+ })]
302
+ }, member.memberId))
303
+ })]
304
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_LocalizationProvider.LocalizationProvider, {
305
+ dateAdapter: _AdapterDayjs.AdapterDayjs,
306
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_DatePicker.DatePicker, {
307
+ label: t("due_date"),
308
+ value: assignment.dueDate,
309
+ onChange: date => setAssignment(prev => ({
310
+ ...prev,
311
+ dueDate: date
312
+ }))
313
+ })
314
+ })]
315
+ })
316
+ })]
317
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
318
+ sx: {
319
+ position: "fixed",
320
+ bottom: 0,
321
+ width: "100%",
322
+ backgroundColor: "white",
323
+ boxShadow: "0 -2px 5px rgba(0,0,0,0.1)",
324
+ p: 2,
325
+ textAlign: "center",
326
+ display: "flex",
327
+ justifyContent: "flex-end"
328
+ },
329
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Button, {
330
+ color: "primary",
331
+ sx: {
332
+ marginRight: 2
333
+ },
334
+ onClick: handleClose,
335
+ children: t("cancel")
336
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.ButtonGroup, {
337
+ variant: "contained",
338
+ color: "primary",
339
+ sx: {
340
+ borderRadius: 10
341
+ },
342
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Button, {
343
+ disabled: !assignment.assignedStudents?.length || !assignment.scheduleDate || !assignment.dueDate || !assignment.title || !assignment.classroomId || !assignment.exercises?.length,
344
+ onClick: handleCreateAssignment,
345
+ children: t("assign")
346
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Button, {
347
+ color: "primary",
348
+ onClick: handleMenuOpen,
349
+ sx: {
350
+ minWidth: "40px",
351
+ padding: "6px"
352
+ },
353
+ disabled: !assignment.assignedStudents?.length || !assignment.scheduleDate || !assignment.dueDate || !assignment.title || !assignment.classroomId || !assignment.exercises?.length,
354
+ children: anchorEl ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_ArrowDropUp.default, {}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ArrowDropDown.default, {})
355
+ })]
356
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Popover, {
357
+ anchorEl: anchorEl,
358
+ open: Boolean(anchorEl),
359
+ onClose: handleMenuClose,
360
+ anchorOrigin: {
361
+ vertical: "top",
362
+ horizontal: "left"
363
+ },
364
+ transformOrigin: {
365
+ vertical: "bottom",
366
+ horizontal: "left"
367
+ },
368
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
369
+ display: "flex",
370
+ flexDirection: "column",
371
+ width: "100%",
372
+ gap: 1,
373
+ padding: 2,
374
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_LocalizationProvider.LocalizationProvider, {
375
+ dateAdapter: _AdapterDayjs.AdapterDayjs,
376
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_DatePicker.DatePicker, {
377
+ label: t("assign_date"),
378
+ value: assignment.scheduleDate,
379
+ onChange: date => setAssignment(prev => ({
380
+ ...prev,
381
+ scheduleDate: date
382
+ }))
383
+ })
384
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Button, {
385
+ variant: "outlined",
386
+ color: "primary",
387
+ fullWidth: true,
388
+ onClick: () => {
389
+ handleCreateAssignment;
390
+ handleMenuClose();
391
+ },
392
+ children: t("schedule_assignment")
393
+ })]
394
+ })
395
+ })]
396
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_SelectExercise.default, {
397
+ t: t,
398
+ open: isSelectExerciseOpen,
399
+ handleClose: handleCloseSelectExercise,
400
+ courses: selectedCourses,
401
+ getCourseSections: getCourseSections,
402
+ getRoleplays: getRoleplays,
403
+ username: username,
404
+ useCase: "assignment",
405
+ selectedExercises: selectedExercises,
406
+ setSelectedExercises: setSelectedExercises,
407
+ isAssignment: true
408
+ }), selectedExercises?.map(exercise => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Typography, {
409
+ children: [exercise.name ? exercise.name : exercise.game, " | ", exercise.courseSectionTopicId ? exercise.courseSectionTopicId : exercise.roleplayId]
410
+ }))]
411
+ });
412
+ }
413
+ CreateAssignmentDialog.propTypes = {
414
+ t: _propTypes.default.func.isRequired,
415
+ classrooms: _propTypes.default.array.isRequired,
416
+ open: _propTypes.default.bool.isRequired,
417
+ handleClose: _propTypes.default.func.isRequired
418
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "CreateAssignmentDialog",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "main": "./CreateAssignmentDialog.js"
6
+ }
7
+