@nualang/nualang-ui-components 0.1.1243 → 0.1.1245

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.
Files changed (64) hide show
  1. package/dist/Assignments/AssignmentBotSelection/AssignmentBotSelection.js +2 -1
  2. package/dist/Assignments/AssignmentCard/AssignmentCard.js +10 -12
  3. package/dist/Assignments/AssignmentCardsList/AssignmentCardsList.js +1 -2
  4. package/dist/Assignments/AssignmentCourseSelection/AssignmentCourseSelection.js +9 -2
  5. package/dist/Assignments/AssignmentExerciseSelection/AssignmentExerciseSelection.js +25 -17
  6. package/dist/Assignments/AssignmentRoleplaySelection/AssignmentRoleplaySelection.js +12 -15
  7. package/dist/Assignments/CreateAssignmentDialog/CreateAssignmentDialog.js +107 -39
  8. package/dist/Cards/SubscriptionPlan/SubscriptionPlan.js +1 -2
  9. package/dist/Chat/Messages/Messages.js +151 -153
  10. package/dist/Dialogs/AvatarDialog/AvatarDialog.js +1 -2
  11. package/dist/Dialogs/CreateQuestion/CreateQuestion.js +82 -79
  12. package/dist/Dialogs/UploadPhrases/UploadPhrases.js +6 -3
  13. package/dist/Editors/Bot/Bot.js +1 -2
  14. package/dist/Editors/Bot/Editor/BotFlow/BotFlow.js +1 -2
  15. package/dist/Editors/Roleplay/Roleplay.js +1 -2
  16. package/dist/Exercises/Bot/Bot.js +1 -2
  17. package/dist/Exercises/Listener/Listener.js +265 -254
  18. package/dist/Exercises/Pronouncer/Pronouncer.js +1 -2
  19. package/dist/Exercises/Roleplay/OriginalRoleplay.js +1 -2
  20. package/dist/Exercises/Roleplay/Roleplay.js +1 -2
  21. package/dist/Exercises/Translator/Translator.js +262 -253
  22. package/dist/Forms/CreateBot/Steps/BotInformation/BotInformation.js +1 -2
  23. package/dist/Forms/CreateBot/Steps/BotSettings/BotSettings.js +1 -2
  24. package/dist/Forms/CreateClassroom/Steps/ClassroomInformation/ClassroomInformation.js +1 -2
  25. package/dist/Forms/CreateClassroom/Steps/ClassroomSettings/ClassroomSettings.js +1 -2
  26. package/dist/Forms/CreateClassroom/Steps/Customization/Customization.js +1 -2
  27. package/dist/Forms/CreateCourse/Steps/CourseInformation/CourseInformation.js +1 -2
  28. package/dist/Forms/CreateCourse/Steps/CourseSettings/CourseSettings.js +1 -2
  29. package/dist/Forms/CreateCourse/Steps/Customization/Customization.js +1 -2
  30. package/dist/Forms/CreateGroup/Steps/GroupInformation/GroupInformation.js +1 -2
  31. package/dist/Forms/CreateGroup/Steps/GroupSettings/GroupSettings.js +1 -2
  32. package/dist/Forms/CreateRoleplay/Steps/RoleplayInformation/RoleplayInformation.js +1 -2
  33. package/dist/Forms/CreateRoleplay/Steps/RoleplaySettings/RoleplaySettings.js +1 -2
  34. package/dist/Forms/CreateRoleplayHook/Steps/RoleplayInformation/RoleplayInformation.js +1 -2
  35. package/dist/Forms/CreateRoleplayHook/Steps/RoleplaySettings/RoleplaySettings.js +1 -2
  36. package/dist/Forms/CreateTopic/Steps/Customization/Customization.js +1 -2
  37. package/dist/Forms/CreateTopic/Steps/TopicInformation/TopicInformation.js +1 -2
  38. package/dist/Forms/CreateTopic/Steps/TopicSettings/TopicSettings.js +1 -2
  39. package/dist/Forms/FeedbackForm/FeedbackForm.js +1 -2
  40. package/dist/Forms/MultiStepForm/MultiStepForm.js +2 -2
  41. package/dist/Forms/MultiStepFormHook/MultiStepFormHook.js +1 -2
  42. package/dist/Forms/Settings/Tabs/General/General.js +1 -2
  43. package/dist/Lists/Bots/Bots.js +6 -18
  44. package/dist/Lists/Classrooms/Classrooms.js +5 -15
  45. package/dist/Lists/Courses/Courses.js +6 -18
  46. package/dist/Lists/Phrases/Phrases.js +85 -90
  47. package/dist/Lists/Roleplays/Roleplays.js +6 -18
  48. package/dist/Lists/Sections/Sections.js +2 -6
  49. package/dist/Lists/Topics/Topics.js +4 -12
  50. package/dist/Live/Game/Game.js +1 -2
  51. package/dist/Live/LiveListener/LiveListener.js +366 -373
  52. package/dist/Live/LiveTranslator/LiveTranslator.js +423 -438
  53. package/dist/Misc/Notes/Notes.js +1 -2
  54. package/dist/Navigation/ResponsiveTabs/ResponsiveTabs.js +1 -2
  55. package/dist/Screens/Classrooms/ViewClassroom/ViewClassroom.js +15 -19
  56. package/dist/Screens/Courses/ViewCourse/ViewTopic/ViewTopic.js +0 -3
  57. package/dist/Screens/Dashboard/Dashboard.js +1 -2
  58. package/dist/Screens/GenerateAudio/GenerateAudio.js +1 -2
  59. package/dist/Tables/MeetingPrompstList/MeetingPromptsList.js +148 -71
  60. package/dist/Tables/Progress/Progress.js +13 -8
  61. package/dist/Tables/Progress/ProgressTable.js +37 -19
  62. package/dist/utils/dragAndDrop/dragAndDrop.js +226 -0
  63. package/dist/utils/index.js +23 -11
  64. package/package.json +5 -2
@@ -112,7 +112,8 @@ function Bot({
112
112
  flexDirection: {
113
113
  xs: "column",
114
114
  sm: "row"
115
- }
115
+ },
116
+ marginLeft: "60px"
116
117
  },
117
118
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
118
119
  display: "flex",
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = AssignmentCard;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
9
9
  var _material = require("@mui/material");
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
@@ -14,8 +14,6 @@ var _useConfirm = _interopRequireDefault(require("../../hooks/useConfirm"));
14
14
  var _iconsMaterial = require("@mui/icons-material");
15
15
  var _jsxRuntime = require("react/jsx-runtime");
16
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
- 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); }
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
17
  function AssignmentCard({
20
18
  t = text => text,
21
19
  index = 0,
@@ -36,6 +34,7 @@ function AssignmentCard({
36
34
  handleViewProgress,
37
35
  lastAssignmentFetch
38
36
  }) {
37
+ console.log(assignment);
39
38
  const [confirm] = (0, _useConfirm.default)(t);
40
39
  const {
41
40
  useQuery
@@ -46,7 +45,7 @@ function AssignmentCard({
46
45
  await deleteAssignment(classroomId, assignmentId);
47
46
  }
48
47
  };
49
- const calculateDaysUntilDue = (dueDate, scheduledDate) => {
48
+ const calculateDaysUntilDue = (dueDate, scheduledDate, t) => {
50
49
  const now = new Date();
51
50
  const due = new Date(dueDate);
52
51
  const scheduled = new Date(scheduledDate);
@@ -130,8 +129,7 @@ function AssignmentCard({
130
129
  spacing: 2,
131
130
  alignItems: "center",
132
131
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Grid, {
133
- item: true,
134
- xs: true,
132
+ size: "grow",
135
133
  flexDirection: "column",
136
134
  display: "flex",
137
135
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
@@ -157,10 +155,9 @@ function AssignmentCard({
157
155
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
158
156
  variant: "button",
159
157
  color: "text.secondary",
160
- children: calculateDaysUntilDue(assignment.dueDate, assignment.scheduleDate)
158
+ children: calculateDaysUntilDue(assignment.dueDate, assignment.scheduleDate, t)
161
159
  })
162
160
  }), isCreator && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Grid, {
163
- item: true,
164
161
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
165
162
  title: t("edit"),
166
163
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.IconButton, {
@@ -190,7 +187,7 @@ function AssignmentCard({
190
187
  spacing: 2,
191
188
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Grid, {
192
189
  size: {
193
- md: 6,
190
+ md: 10,
194
191
  xs: 12
195
192
  },
196
193
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
@@ -216,9 +213,10 @@ function AssignmentCard({
216
213
  })
217
214
  })]
218
215
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Grid, {
219
- item: true,
220
- xs: 3,
221
- md: 2,
216
+ size: {
217
+ xs: 3,
218
+ md: 2
219
+ },
222
220
  children: isCreator && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
223
221
  display: "flex",
224
222
  flexDirection: "column",
@@ -13,8 +13,7 @@ var _teacherCreate = _interopRequireDefault(require("../../img/teacher-create-2.
13
13
  var _Add = _interopRequireDefault(require("@mui/icons-material/Add"));
14
14
  var _jsxRuntime = require("react/jsx-runtime");
15
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
- 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); }
17
- 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; }
16
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
18
17
  const AssignmentCardsList = ({
19
18
  t = text => text,
20
19
  assignments = [],
@@ -78,8 +78,15 @@ function Course({
78
78
  }
79
79
  }, [courseSections, selectedSectionIds, viewOnly]);
80
80
  (0, _react.useEffect)(() => {
81
+ const assignedSectionIds = new Set();
82
+ assignment?.exercises?.forEach(exercise => {
83
+ if (exercise.courseSectionTopicId) {
84
+ const sectionId = exercise.courseSectionTopicId.split("|")[1];
85
+ assignedSectionIds.add(sectionId);
86
+ }
87
+ });
81
88
  if (courseSections && memberCourseCompletions && selectedExercises) {
82
- const sectionsWithProgress = (0, _utils.calcCompletions)(courseSections, memberCourseCompletions, selectedExercises);
89
+ const sectionsWithProgress = (0, _utils.calcCompletions)(courseSections.filter(section => assignedSectionIds.has(section.sectionId)), memberCourseCompletions, selectedExercises);
83
90
  const percentCompletion = (0, _utils.calcPercentageCompletion)(sectionsWithProgress);
84
91
  setCourseSectionCompletion(percentCompletion);
85
92
  }
@@ -240,7 +247,7 @@ function AssignmentCourseSelection({
240
247
  memberCourseCompletions: memberCourseCompletions,
241
248
  progressHelpers: progressHelpers,
242
249
  lastClickedExerciseId: lastClickedExerciseId
243
- }))
250
+ }, course.courseId || index))
244
251
  });
245
252
  }
246
253
  var _default = exports.default = AssignmentCourseSelection;
@@ -146,7 +146,7 @@ function Exercise({
146
146
  return null;
147
147
  }
148
148
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Tooltip, {
149
- title: name === "roleplays" && noRoleplays ? t("topic_no_roleplays") : !isValidExercise ? t("minimum_two_phrases") : "",
149
+ title: isCreator ? name === "roleplays" && noRoleplays ? t("topic_no_roleplays") : !isValidExercise ? t("minimum_two_phrases") : "" : null,
150
150
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.ListItemButton, {
151
151
  onClick: () => {
152
152
  if (name.toLowerCase() === "roleplays") {
@@ -168,7 +168,7 @@ function Exercise({
168
168
  disabled: isExerciseSelected || !isValidExercise || noRoleplays || noBots,
169
169
  sx: theme => ({
170
170
  [theme.breakpoints.up("sm")]: {
171
- ml: 3.5
171
+ ml: "60px"
172
172
  }
173
173
  }),
174
174
  children: [name.toLowerCase() === "listening" && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
@@ -451,42 +451,50 @@ function Topic({
451
451
  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"];
452
452
  }
453
453
  (0, _react.useEffect)(() => {
454
- const exerciseCount = selectedExercises?.filter(exercise => !exercise.roleplayId && exercise.courseSectionTopicId === `${courseId}|${sectionId}|${topicId}`).length;
455
- const roleplayCount = selectedExercises?.filter(exercise => exercise.roleplayId && roleplays?.some(roleplay => roleplay.roleplayId === exercise.roleplayId)).length;
456
- const botCount = selectedExercises?.filter(exercise => exercise.botId && bots?.some(bot => bot.botId === exercise.botId)).length;
457
- const total = roleplays.length * 6 + 3;
458
- if (exerciseCount + roleplayCount + botCount === total) {
459
- setIsWholeTopicSelected(true);
460
- } else {
461
- setIsWholeTopicSelected(false);
462
- }
463
- }, [selectedExercises]);
454
+ const expectedRegularCount = exercises?.filter(e => e.name !== "roleplays" && !selectedExercises?.some(sel => sel.name === e.name && sel.courseSectionTopicId === `${courseId}|${sectionId}|${topicId}`)).length || 0;
455
+ const expectedRoleplayCount = roleplays?.length * games?.length || 0;
456
+ const expectedBotCount = bots?.length || 0;
457
+ const totalExpected = (exercises?.filter(e => e.name !== "roleplays").length || 0) + expectedRoleplayCount + expectedBotCount;
458
+ const selectedRegular = selectedExercises?.filter(exercise => !exercise.roleplayId && !exercise.botId && exercise.courseSectionTopicId === `${courseId}|${sectionId}|${topicId}`).length || 0;
459
+ const selectedRoleplays = selectedExercises?.filter(exercise => exercise.roleplayId && roleplays?.some(roleplay => roleplay.roleplayId === exercise.roleplayId)).length || 0;
460
+ const selectedBots = selectedExercises?.filter(exercise => exercise.botId && bots?.some(bot => bot.botId === exercise.botId)).length || 0;
461
+ const totalSelected = selectedRegular + selectedRoleplays + selectedBots;
462
+ setIsWholeTopicSelected(totalSelected === totalExpected);
463
+ }, [selectedExercises, exercises, roleplays, bots, courseId, sectionId, topicId, games]);
464
464
  const handleSelectAll = () => {
465
465
  if (isWholeTopicSelected) {
466
- const removeExercises = selectedExercises?.filter(exercise => exercise.courseSectionTopicId === `${courseId}|${sectionId}|${topicId}` || exercise.roleplayId && roleplays?.some(roleplay => roleplay.roleplayId === exercise.roleplayId));
466
+ const removeExercises = selectedExercises?.filter(exercise => exercise.courseSectionTopicId === `${courseId}|${sectionId}|${topicId}` || exercise.roleplayId && roleplays?.some(roleplay => roleplay.roleplayId === exercise.roleplayId) || exercise.botId && bots?.some(bot => bot.botId === exercise.botId));
467
467
  handleSelectExercise(removeExercises);
468
468
  } else {
469
469
  let exercisesToAdd = [];
470
470
  exercises?.filter(e => e.name !== "roleplays").forEach(exercise => {
471
471
  if (!selectedExercises?.some(e => e.courseSectionTopicId === `${courseId}|${sectionId}|${topicId}` && e.name === exercise.name)) {
472
- exercisesToAdd = [...exercisesToAdd, {
472
+ exercisesToAdd.push({
473
473
  courseSectionTopicId: `${courseId}|${sectionId}|${topicId}`,
474
474
  name: exercise.name
475
- }];
475
+ });
476
476
  }
477
477
  });
478
478
  roleplays.forEach(roleplay => {
479
479
  games.forEach(name => {
480
480
  if (!selectedExercises?.some(e => e.roleplayId === roleplay.roleplayId && e.name === name)) {
481
- exercisesToAdd = [...exercisesToAdd, {
481
+ exercisesToAdd.push({
482
482
  roleplayId: roleplay.roleplayId,
483
483
  name: name,
484
484
  courseSectionTopicId: `${courseId}|${sectionId}|${topicId}`,
485
485
  roleplayName: roleplay.roleplayName
486
- }];
486
+ });
487
487
  }
488
488
  });
489
489
  });
490
+ bots?.forEach(bot => {
491
+ if (!selectedExercises?.some(e => e.botId === bot.botId)) {
492
+ exercisesToAdd.push({
493
+ botId: bot.botId,
494
+ courseSectionTopicId: `${courseId}|${sectionId}|${topicId}`
495
+ });
496
+ }
497
+ });
490
498
  handleSelectExercise(exercisesToAdd);
491
499
  }
492
500
  };
@@ -30,14 +30,7 @@ function ProgressBadge({
30
30
  t,
31
31
  gameName
32
32
  }) {
33
- let completionCounter = 0;
34
- if (completions && completions.length > 0) {
35
- for (let i = 0; i < completions.length; i++) {
36
- if (completions[i].exercise === gameName) {
37
- completionCounter += 1;
38
- }
39
- }
40
- }
33
+ const completionCounter = completions?.filter(completion => completion.exercise === gameName).length || 0;
41
34
  return completionCounter > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Badge, {
42
35
  sx: sxGreenColor,
43
36
  badgeContent: completionCounter,
@@ -129,7 +122,7 @@ function Roleplay({
129
122
  setIsSelectAllChecked(count === games.length);
130
123
  const roleplayNames = selectedExercises?.filter(ex => ex.roleplayId === roleplay.roleplayId).map(ex => ex.name);
131
124
  setSelectedGames(roleplayNames);
132
- }, [selectedExercises, roleplay.roleplayId, games.length]);
125
+ }, [selectedExercises, roleplay.roleplayId]);
133
126
  const handleSelectAll = () => {
134
127
  if (isSelectAllChecked) {
135
128
  const removeExercises = games.map(name => ({
@@ -198,7 +191,8 @@ function Roleplay({
198
191
  flexDirection: {
199
192
  xs: "column",
200
193
  sm: "row"
201
- }
194
+ },
195
+ marginLeft: "60px"
202
196
  },
203
197
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
204
198
  display: "flex",
@@ -305,7 +299,8 @@ function Roleplay({
305
299
  flexDirection: {
306
300
  xs: "column",
307
301
  sm: "row"
308
- }
302
+ },
303
+ marginLeft: "95px"
309
304
  },
310
305
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
311
306
  children: getIconAndStatusForGame(name)[0]
@@ -331,7 +326,8 @@ function Roleplay({
331
326
  flexDirection: {
332
327
  xs: "column",
333
328
  sm: "row"
334
- }
329
+ },
330
+ marginLeft: "95px"
335
331
  },
336
332
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
337
333
  children: getIconAndStatusForGame(name)[0]
@@ -370,7 +366,8 @@ function AssignmentRoleplaySelection({
370
366
  lastClickedExerciseId
371
367
  }) {
372
368
  const [isRoleplaySelected, setIsRoleplaySelected] = (0, _react.useState)(false);
373
- return roleplays.map((roleplay, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(Roleplay, {
369
+ const filteredCompletions = memberCourseCompletions.filter(completion => completion.courseSectionTopicId === courseSectionTopicId);
370
+ return roleplays.map(roleplay => /*#__PURE__*/(0, _jsxRuntime.jsx)(Roleplay, {
374
371
  roleplay: roleplay,
375
372
  isRoleplaySelected: isRoleplaySelected,
376
373
  setIsRoleplaySelected: setIsRoleplaySelected,
@@ -381,11 +378,11 @@ function AssignmentRoleplaySelection({
381
378
  selectedExercises: selectedExercises,
382
379
  useCase: useCase,
383
380
  assignment: assignment,
384
- memberCourseCompletions: memberCourseCompletions,
381
+ memberCourseCompletions: filteredCompletions,
385
382
  topicProgress: topicProgress,
386
383
  topics: topics,
387
384
  isCreator: isCreator,
388
385
  lastClickedExerciseId: lastClickedExerciseId
389
- }, index));
386
+ }, roleplay.roleplayId));
390
387
  }
391
388
  var _default = exports.default = AssignmentRoleplaySelection;
@@ -21,8 +21,7 @@ var _Queries = require("@nualang/nualang-api-and-queries/Queries");
21
21
  var _AssignmentExerciseSelector = _interopRequireDefault(require("../AssignmentExerciseSelector/AssignmentExerciseSelector"));
22
22
  var _jsxRuntime = require("react/jsx-runtime");
23
23
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
- 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); }
25
- 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; }
24
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
26
25
  const useStyles = (0, _mui.makeStyles)()(theme => ({
27
26
  appBar: {
28
27
  position: "relative"
@@ -56,7 +55,8 @@ function CreateAssignmentDialog({
56
55
  getClassroom,
57
56
  getCourses,
58
57
  initialData = {},
59
- dialogTitle
58
+ dialogTitle,
59
+ userEmail = ''
60
60
  }) {
61
61
  const {
62
62
  classes
@@ -65,7 +65,7 @@ function CreateAssignmentDialog({
65
65
  const [submittedExercises, setSubmittedExercises] = (0, _react.useState)(initialData.exercises ? initialData.exercises : []);
66
66
  const [members, setMembers] = (0, _react.useState)([]);
67
67
  const [assignment, setAssignment] = (0, _react.useState)({
68
- classroomId: "",
68
+ classroomId: classroom?.length > 0 ? [classroom] : [],
69
69
  assignedStudents: members?.map(member => member.memberId),
70
70
  title: "",
71
71
  instructions: "",
@@ -76,34 +76,67 @@ function CreateAssignmentDialog({
76
76
  ...initialData
77
77
  });
78
78
  const classroomQuery = _Queries.classrooms.useClassroom(async classroomId => {
79
- const response = await getClassroom(classroomId);
80
- return response;
79
+ const allClassroomsCourses = [];
80
+ await Promise.all(classroomId.map(async cId => {
81
+ if (!cId) return;
82
+ const response = await getClassroom(cId);
83
+ allClassroomsCourses.push(response?.Item?.courses || []);
84
+ }));
85
+ const flatClassrooms = allClassroomsCourses.flat();
86
+ const seen = new Set();
87
+ const uniqueClassroomsCourses = flatClassrooms.filter(classR => {
88
+ if (seen.has(classR)) return false;
89
+ seen.add(classR);
90
+ return true;
91
+ });
92
+ return uniqueClassroomsCourses;
81
93
  }, {
82
- classroomId: assignment.classroomId
94
+ classroomId: assignment?.classroomId
83
95
  }, {
84
- enabled: !!assignment.classroomId
96
+ enabled: !!(assignment.classroomId.length > 0)
85
97
  });
86
- const selectedClassroom = (0, _react.useMemo)(() => classroomQuery.isSuccess && classroomQuery.data.Item ? classroomQuery.data.Item : {}, [classroomQuery.data, classroomQuery.isSuccess]);
98
+ const selectedClassroom = (0, _react.useMemo)(() => classroomQuery.isSuccess && classroomQuery.data ? classroomQuery.data : {}, [classroomQuery.data, classroomQuery.isSuccess]);
87
99
  const coursesQuery = _Queries.courses.useCourses(async filters => {
88
100
  const response = await getCourses(filters);
89
101
  return response;
90
102
  }, {
91
103
  filters: {
92
- courseIds: selectedClassroom?.courses?.toString()
104
+ courseIds: selectedClassroom?.toString()
93
105
  }
94
106
  }, {
95
107
  enabled: !!assignment.classroomId
96
108
  });
97
109
  const membersQuery = _Queries.classrooms.useClassroomMembers(async (classroomId, username) => {
98
- const response = await getClassroomMembers(classroomId, username);
99
- return response;
110
+ const allMembers = [];
111
+ await Promise.all(classroomId.map(async cId => {
112
+ const response = await getClassroomMembers(cId, username);
113
+ allMembers.push(response?.Items || []);
114
+ }));
115
+ const flatMembers = allMembers.flat();
116
+ const seen = new Set();
117
+ const uniqueMembers = flatMembers.filter(member => {
118
+ if (seen.has(member.memberId)) return false;
119
+ seen.add(member.memberId);
120
+ return true;
121
+ });
122
+ return uniqueMembers;
100
123
  }, {
101
- classroomId: assignment.classroomId,
124
+ classroomId: assignment?.classroomId,
102
125
  username: username
103
126
  }, {
104
- enabled: !!assignment.classroomId
127
+ enabled: !!(assignment.classroomId.length > 0)
105
128
  });
106
- const selectedCourses = (0, _react.useMemo)(() => coursesQuery.isSuccess && Array.isArray(coursesQuery.data.Items) && coursesQuery.data.Items.length ? coursesQuery.data.Items : [], [coursesQuery.data, coursesQuery.isSuccess]);
129
+ const selectedCourses = (0, _react.useMemo)(() => {
130
+ if (!coursesQuery.isSuccess || !Array.isArray(coursesQuery.data.Items)) {
131
+ return [];
132
+ }
133
+ const rawCourses = coursesQuery.data.Items;
134
+ const allowedCourses = (classrooms || []).filter(c => assignment.classroomId.includes(c.classroomId)).map(c => c.courses || []).filter(arr => Array.isArray(arr)); // Ensure valid arrays
135
+
136
+ const commonCourses = allowedCourses.length === 0 ? [] : allowedCourses.reduce((acc, arr) => acc.filter(str => arr.includes(str)));
137
+ const filtered = rawCourses.filter(course => (commonCourses || []).includes(course?.courseId));
138
+ return filtered;
139
+ }, [coursesQuery.data, coursesQuery.isSuccess, classrooms, assignment.classroomId]);
107
140
  (0, _react.useEffect)(() => {
108
141
  let filteredCourses = selectedCourses.filter(course => submittedExercises.some(exercise => exercise.courseSectionTopicId?.split("|")[0] === course.courseId));
109
142
  setAssignment({
@@ -111,7 +144,7 @@ function CreateAssignmentDialog({
111
144
  courses: filteredCourses
112
145
  });
113
146
  }, [selectedCourses, submittedExercises]);
114
- const selectedMembers = (0, _react.useMemo)(() => membersQuery.isSuccess && Array.isArray(membersQuery.data.Items) && membersQuery.data.Items.length ? membersQuery.data.Items : [], [membersQuery.data, membersQuery.isSuccess]);
147
+ const selectedMembers = (0, _react.useMemo)(() => membersQuery.isSuccess && Array.isArray(membersQuery.data) && membersQuery.data.length ? membersQuery.data : [], [membersQuery.data, membersQuery.isSuccess]);
115
148
  const classroomMembers = async selectedMembers => {
116
149
  const formattedMembers = await getMemberDetails(selectedMembers);
117
150
  setMembers(formattedMembers);
@@ -134,7 +167,7 @@ function CreateAssignmentDialog({
134
167
  (0, _react.useEffect)(() => {
135
168
  setAssignment(prev => ({
136
169
  ...prev,
137
- classroomId: classroom
170
+ classroomId: [classroom]
138
171
  }));
139
172
  }, [classroom]);
140
173
  const [isSelectExerciseOpen, setIsSelectExerciseOpen] = (0, _react.useState)(false);
@@ -157,6 +190,12 @@ function CreateAssignmentDialog({
157
190
  assignedStudents: typeof value === "string" ? value.split(",") : value
158
191
  };
159
192
  }
193
+ if (field === "classroomId") {
194
+ return {
195
+ ...prev,
196
+ classroomId: typeof value === "string" ? value.split(",") : value
197
+ };
198
+ }
160
199
  if (field === "classroom") {
161
200
  return {
162
201
  ...prev,
@@ -170,9 +209,21 @@ function CreateAssignmentDialog({
170
209
  };
171
210
  });
172
211
  };
173
- const handleCreateAssignment = () => {
174
- createAssignment(assignment);
175
- handleClose();
212
+ const handleCreateAssignment = async () => {
213
+ try {
214
+ await Promise.all(assignment.classroomId.map(async cId => {
215
+ const selectedClassroomMembers = selectedMembers.filter(member => member.classroomId === cId).map(student => student.memberId).filter(studentId => assignment?.assignedStudents.includes(studentId));
216
+ const formattedAssignment = {
217
+ ...assignment,
218
+ classroomId: cId,
219
+ assignedStudents: selectedClassroomMembers
220
+ };
221
+ return createAssignment(formattedAssignment);
222
+ }));
223
+ handleClose();
224
+ } catch (error) {
225
+ console.error("Error creating assignments:", error);
226
+ }
176
227
  };
177
228
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Dialog, {
178
229
  fullScreen: true,
@@ -223,14 +274,16 @@ function CreateAssignmentDialog({
223
274
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Select, {
224
275
  labelId: "classroom-label",
225
276
  id: "classroom",
277
+ multiple: true,
226
278
  "data-cy": "select-classroom-dropdown",
227
279
  value: assignment.classroomId,
228
280
  label: t("select_classroom"),
229
281
  onChange: handleChange("classroomId"),
230
282
  required: true,
231
- disabled: classroom,
232
- children: classrooms?.map(classroom => /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.MenuItem, {
233
- value: classroom.classroomId,
283
+ renderValue: selected => selected?.map(classroomId => classrooms?.find(c => c.classroomId === classroomId))?.map(c => c?.classroomName)?.filter(n => n).join(", "),
284
+ children: classrooms.filter(c => c.createdBy === username || c.collaborators.includes(userEmail)).map(c => /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.MenuItem, {
285
+ value: c.classroomId,
286
+ disabled: c.classroomId === classroom,
234
287
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
235
288
  sx: {
236
289
  display: "flex",
@@ -239,13 +292,16 @@ function CreateAssignmentDialog({
239
292
  },
240
293
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemAvatar, {
241
294
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Avatar, {
242
- src: classroom.picture
295
+ src: c.picture
243
296
  })
244
297
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
245
- primary: classroom.classroomName
298
+ primary: c.classroomName
299
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Checkbox, {
300
+ disabled: c.classroomId === classroom,
301
+ checked: assignment.classroomId?.includes(c.classroomId) || c.classroomId === classroom
246
302
  })]
247
303
  })
248
- }, classroom.classroomId))
304
+ }, c.classroomId))
249
305
  })]
250
306
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.TextField, {
251
307
  "data-cy": "assignment-title-input",
@@ -262,16 +318,28 @@ function CreateAssignmentDialog({
262
318
  rows: 3,
263
319
  value: assignment.instructions,
264
320
  onChange: handleChange("instructions")
265
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Button, {
266
- "data-cy": "assignment-exercise-selector-button",
267
- variant: "outlined",
268
- color: "primary",
269
- sx: {
270
- width: "fit-content"
271
- },
272
- startIcon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Add.default, {}),
273
- onClick: () => setIsSelectExerciseOpen(true),
274
- children: t("add_exercise")
321
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
322
+ disableHoverListener: selectedCourses?.length > 0,
323
+ disableFocusListener: selectedCourses?.length > 0,
324
+ disableTouchListener: selectedCourses?.length > 0,
325
+ title: t("no_shared_courses"),
326
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
327
+ style: {
328
+ display: 'inline-block'
329
+ },
330
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Button, {
331
+ "data-cy": "assignment-exercise-selector-button",
332
+ variant: "outlined",
333
+ color: "primary",
334
+ disabled: selectedCourses?.length === 0,
335
+ sx: {
336
+ width: "fit-content"
337
+ },
338
+ startIcon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Add.default, {}),
339
+ onClick: () => setIsSelectExerciseOpen(true),
340
+ children: t("add_exercise")
341
+ })
342
+ })
275
343
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_AssignmentExerciseSelector.default, {
276
344
  selectedExercises: submittedExercises,
277
345
  t: t,
@@ -371,7 +439,7 @@ function CreateAssignmentDialog({
371
439
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Button, {
372
440
  "data-cy": "assignment-assign-button",
373
441
  disabled: !assignment.assignedStudents?.length || !assignment.scheduleDate || !assignment.dueDate || !assignment.title || !assignment.classroomId || !assignment.exercises?.length,
374
- onClick: handleCreateAssignment,
442
+ onClick: async () => await handleCreateAssignment(),
375
443
  children: t("assign")
376
444
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Button, {
377
445
  color: "primary",
@@ -416,8 +484,8 @@ function CreateAssignmentDialog({
416
484
  color: "primary",
417
485
  fullWidth: true,
418
486
  "data-cy": "assignment-schedule-button",
419
- onClick: () => {
420
- handleCreateAssignment();
487
+ onClick: async () => {
488
+ await handleCreateAssignment();
421
489
  handleMenuClose();
422
490
  },
423
491
  children: t("schedule_assignment")
@@ -18,8 +18,7 @@ var _plus = _interopRequireDefault(require("./plus.svg"));
18
18
  var _nuala = _interopRequireDefault(require("./nuala.svg"));
19
19
  var _index = require("../../utils/index");
20
20
  var _jsxRuntime = require("react/jsx-runtime");
21
- 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); }
22
- 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; }
21
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
23
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
23
  const PREFIX = "SubscriptionPlan";
25
24
  const classes = {