@openedx/frontend-app-instructor-dashboard 1.0.0-alpha.2 → 1.0.0-alpha.21

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 (261) hide show
  1. package/dist/Main.d.ts +1 -1
  2. package/dist/Main.js +4 -13
  3. package/dist/Main.js.map +1 -1
  4. package/dist/app.js +2 -11
  5. package/dist/app.js.map +1 -1
  6. package/dist/certificates/CertificatesPage.d.ts +1 -0
  7. package/dist/certificates/CertificatesPage.js +162 -2
  8. package/dist/certificates/CertificatesPage.js.map +1 -1
  9. package/dist/certificates/CertificatesPage.scss +81 -0
  10. package/dist/certificates/components/CertificateTable.d.ts +14 -0
  11. package/dist/certificates/components/CertificateTable.js +85 -0
  12. package/dist/certificates/components/CertificateTable.js.map +1 -0
  13. package/dist/certificates/components/CertificatesPageHeader.d.ts +7 -0
  14. package/dist/certificates/components/CertificatesPageHeader.js +11 -0
  15. package/dist/certificates/components/CertificatesPageHeader.js.map +1 -0
  16. package/dist/certificates/components/CertificatesToolbar.d.ts +10 -0
  17. package/dist/certificates/components/CertificatesToolbar.js +12 -0
  18. package/dist/certificates/components/CertificatesToolbar.js.map +1 -0
  19. package/dist/certificates/components/DisableCertificatesModal.d.ts +9 -0
  20. package/dist/certificates/components/DisableCertificatesModal.js +16 -0
  21. package/dist/certificates/components/DisableCertificatesModal.js.map +1 -0
  22. package/dist/certificates/components/FilterDropdown.d.ts +8 -0
  23. package/dist/certificates/components/FilterDropdown.js +50 -0
  24. package/dist/certificates/components/FilterDropdown.js.map +1 -0
  25. package/dist/certificates/components/GenerationHistoryTable.d.ts +11 -0
  26. package/dist/certificates/components/GenerationHistoryTable.js +40 -0
  27. package/dist/certificates/components/GenerationHistoryTable.js.map +1 -0
  28. package/dist/certificates/components/GrantExceptionsModal.d.ts +8 -0
  29. package/dist/certificates/components/GrantExceptionsModal.js +10 -0
  30. package/dist/certificates/components/GrantExceptionsModal.js.map +1 -0
  31. package/dist/certificates/components/InvalidateCertificateModal.d.ts +8 -0
  32. package/dist/certificates/components/InvalidateCertificateModal.js +10 -0
  33. package/dist/certificates/components/InvalidateCertificateModal.js.map +1 -0
  34. package/dist/certificates/components/IssuedCertificatesTab.d.ts +18 -0
  35. package/dist/certificates/components/IssuedCertificatesTab.js +6 -0
  36. package/dist/certificates/components/IssuedCertificatesTab.js.map +1 -0
  37. package/dist/certificates/components/LearnerActionModal.d.ts +16 -0
  38. package/dist/certificates/components/LearnerActionModal.js +22 -0
  39. package/dist/certificates/components/LearnerActionModal.js.map +1 -0
  40. package/dist/certificates/components/RemoveInvalidationModal.d.ts +9 -0
  41. package/dist/certificates/components/RemoveInvalidationModal.js +10 -0
  42. package/dist/certificates/components/RemoveInvalidationModal.js.map +1 -0
  43. package/dist/certificates/constants.d.ts +15 -0
  44. package/dist/certificates/constants.js +16 -0
  45. package/dist/certificates/constants.js.map +1 -0
  46. package/dist/certificates/data/api.d.ts +9 -0
  47. package/dist/certificates/data/api.js +63 -0
  48. package/dist/certificates/data/api.js.map +1 -0
  49. package/dist/certificates/data/apiHook.d.ts +30 -0
  50. package/dist/certificates/data/apiHook.js +90 -0
  51. package/dist/certificates/data/apiHook.js.map +1 -0
  52. package/dist/certificates/data/dummyData.d.ts +2 -0
  53. package/dist/certificates/data/dummyData.js +234 -0
  54. package/dist/certificates/data/dummyData.js.map +1 -0
  55. package/dist/certificates/data/queryKeys.d.ts +8 -0
  56. package/dist/certificates/data/queryKeys.js +8 -0
  57. package/dist/certificates/data/queryKeys.js.map +1 -0
  58. package/dist/certificates/messages.d.ts +313 -0
  59. package/dist/certificates/messages.js +315 -0
  60. package/dist/certificates/messages.js.map +1 -0
  61. package/dist/certificates/types.d.ts +61 -0
  62. package/dist/certificates/types.js +26 -0
  63. package/dist/certificates/types.js.map +1 -0
  64. package/dist/certificates/utils/errorHandling.d.ts +10 -0
  65. package/dist/certificates/utils/errorHandling.js +3 -0
  66. package/dist/certificates/utils/errorHandling.js.map +1 -0
  67. package/dist/certificates/utils/filterUtils.d.ts +4 -0
  68. package/dist/certificates/utils/filterUtils.js +31 -0
  69. package/dist/certificates/utils/filterUtils.js.map +1 -0
  70. package/dist/certificates/utils/index.d.ts +2 -0
  71. package/dist/certificates/utils/index.js +2 -0
  72. package/dist/certificates/utils/index.js.map +1 -0
  73. package/dist/cohorts/data/queryKeys.d.ts +4 -4
  74. package/dist/components/ActionCard.d.ts +2 -2
  75. package/dist/components/ActionCard.js +1 -1
  76. package/dist/components/ActionCard.js.map +1 -1
  77. package/dist/components/PendingTasks.d.ts +3 -1
  78. package/dist/components/PendingTasks.js +3 -2
  79. package/dist/components/PendingTasks.js.map +1 -1
  80. package/dist/components/SpecifyLearnerField.d.ts +4 -1
  81. package/dist/components/SpecifyLearnerField.js +24 -10
  82. package/dist/components/SpecifyLearnerField.js.map +1 -1
  83. package/dist/components/SpecifyProblemField.d.ts +13 -0
  84. package/dist/components/SpecifyProblemField.js +46 -0
  85. package/dist/components/SpecifyProblemField.js.map +1 -0
  86. package/dist/components/UsernameFilter.d.ts +7 -0
  87. package/dist/components/UsernameFilter.js +19 -0
  88. package/dist/components/UsernameFilter.js.map +1 -0
  89. package/dist/components/messages.d.ts +30 -0
  90. package/dist/components/messages.js +30 -0
  91. package/dist/components/messages.js.map +1 -1
  92. package/dist/constants.d.ts +2 -1
  93. package/dist/constants.js +2 -1
  94. package/dist/constants.js.map +1 -1
  95. package/dist/courseInfo/types.d.ts +2 -0
  96. package/dist/courseInfo/types.js.map +1 -1
  97. package/dist/courseTeam/CourseTeamPage.js +20 -2
  98. package/dist/courseTeam/CourseTeamPage.js.map +1 -1
  99. package/dist/courseTeam/components/AddTeamMemberModal.d.ts +6 -0
  100. package/dist/courseTeam/components/AddTeamMemberModal.js +60 -0
  101. package/dist/courseTeam/components/AddTeamMemberModal.js.map +1 -0
  102. package/dist/courseTeam/components/EditTeamMemberModal.d.ts +8 -0
  103. package/dist/courseTeam/components/EditTeamMemberModal.js +90 -0
  104. package/dist/courseTeam/components/EditTeamMemberModal.js.map +1 -0
  105. package/dist/courseTeam/components/MembersContent.d.ts +6 -0
  106. package/dist/courseTeam/components/MembersContent.js +48 -0
  107. package/dist/courseTeam/components/MembersContent.js.map +1 -0
  108. package/dist/courseTeam/components/RoleFilter.d.ts +7 -0
  109. package/dist/courseTeam/components/RoleFilter.js +22 -0
  110. package/dist/courseTeam/components/RoleFilter.js.map +1 -0
  111. package/dist/courseTeam/components/RolesContent.d.ts +3 -0
  112. package/dist/courseTeam/components/RolesContent.js +25 -0
  113. package/dist/courseTeam/components/RolesContent.js.map +1 -0
  114. package/dist/courseTeam/data/api.d.ts +6 -0
  115. package/dist/courseTeam/data/api.js +38 -0
  116. package/dist/courseTeam/data/api.js.map +1 -0
  117. package/dist/courseTeam/data/apiHook.d.ts +11 -0
  118. package/dist/courseTeam/data/apiHook.js +32 -0
  119. package/dist/courseTeam/data/apiHook.js.map +1 -0
  120. package/dist/courseTeam/data/queryKeys.d.ts +7 -0
  121. package/dist/courseTeam/data/queryKeys.js +14 -0
  122. package/dist/courseTeam/data/queryKeys.js.map +1 -0
  123. package/dist/courseTeam/messages.d.ts +243 -0
  124. package/dist/courseTeam/messages.js +245 -0
  125. package/dist/courseTeam/messages.js.map +1 -0
  126. package/dist/courseTeam/types.d.ts +22 -0
  127. package/dist/courseTeam/types.js +3 -0
  128. package/dist/courseTeam/types.js.map +1 -0
  129. package/dist/data/api.d.ts +2 -1
  130. package/dist/data/api.js +9 -3
  131. package/dist/data/api.js.map +1 -1
  132. package/dist/data/apiHook.d.ts +1 -0
  133. package/dist/data/apiHook.js +10 -2
  134. package/dist/data/apiHook.js.map +1 -1
  135. package/dist/data/queryKeys.d.ts +10 -6
  136. package/dist/data/queryKeys.js +4 -0
  137. package/dist/data/queryKeys.js.map +1 -1
  138. package/dist/dataDownloads/data/queryKeys.d.ts +3 -3
  139. package/dist/dateExtensions/components/AddExtensionModal.d.ts +1 -1
  140. package/dist/dateExtensions/components/AddExtensionModal.js +5 -6
  141. package/dist/dateExtensions/components/AddExtensionModal.js.map +1 -1
  142. package/dist/dateExtensions/components/DateExtensionsList.js +2 -13
  143. package/dist/dateExtensions/components/DateExtensionsList.js.map +1 -1
  144. package/dist/dateExtensions/data/apiHook.d.ts +2 -2
  145. package/dist/dateExtensions/data/apiHook.js +4 -4
  146. package/dist/dateExtensions/data/apiHook.js.map +1 -1
  147. package/dist/dateExtensions/data/queryKeys.d.ts +5 -5
  148. package/dist/dateExtensions/messages.d.ts +0 -5
  149. package/dist/dateExtensions/messages.js +1 -6
  150. package/dist/dateExtensions/messages.js.map +1 -1
  151. package/dist/enrollments/EnrollmentsPage.js +41 -7
  152. package/dist/enrollments/EnrollmentsPage.js.map +1 -1
  153. package/dist/enrollments/components/AddBetaTestersModal.d.ts +6 -0
  154. package/dist/enrollments/components/AddBetaTestersModal.js +61 -0
  155. package/dist/enrollments/components/AddBetaTestersModal.js.map +1 -0
  156. package/dist/enrollments/components/EnrollLearnersModal.d.ts +6 -0
  157. package/dist/enrollments/components/EnrollLearnersModal.js +53 -0
  158. package/dist/enrollments/components/EnrollLearnersModal.js.map +1 -0
  159. package/dist/enrollments/components/EnrollmentStatusModal.js +3 -3
  160. package/dist/enrollments/components/EnrollmentStatusModal.js.map +1 -1
  161. package/dist/enrollments/components/EnrollmentsList.d.ts +3 -2
  162. package/dist/enrollments/components/EnrollmentsList.js +13 -14
  163. package/dist/enrollments/components/EnrollmentsList.js.map +1 -1
  164. package/dist/enrollments/components/UnenrollModal.d.ts +1 -1
  165. package/dist/enrollments/components/UnenrollModal.js +29 -3
  166. package/dist/enrollments/components/UnenrollModal.js.map +1 -1
  167. package/dist/enrollments/components/UpdateBetaTesterModal.d.ts +8 -0
  168. package/dist/enrollments/components/UpdateBetaTesterModal.js +52 -0
  169. package/dist/enrollments/components/UpdateBetaTesterModal.js.map +1 -0
  170. package/dist/enrollments/data/api.d.ts +3 -1
  171. package/dist/enrollments/data/api.js +11 -1
  172. package/dist/enrollments/data/api.js.map +1 -1
  173. package/dist/enrollments/data/apiHook.d.ts +5 -3
  174. package/dist/enrollments/data/apiHook.js +21 -3
  175. package/dist/enrollments/data/apiHook.js.map +1 -1
  176. package/dist/enrollments/data/queryKeys.d.ts +5 -5
  177. package/dist/enrollments/data/queryKeys.js.map +1 -1
  178. package/dist/enrollments/messages.d.ts +121 -1
  179. package/dist/enrollments/messages.js +126 -6
  180. package/dist/enrollments/messages.js.map +1 -1
  181. package/dist/enrollments/types.d.ts +24 -0
  182. package/dist/enrollments/types.js.map +1 -1
  183. package/dist/grading/GradingPage.js +15 -2
  184. package/dist/grading/GradingPage.js.map +1 -1
  185. package/dist/grading/components/GradingActionRow.d.ts +2 -0
  186. package/dist/grading/components/GradingActionRow.js +28 -0
  187. package/dist/grading/components/GradingActionRow.js.map +1 -0
  188. package/dist/grading/components/GradingConfigurationModal.d.ts +6 -0
  189. package/dist/grading/components/GradingConfigurationModal.js +14 -0
  190. package/dist/grading/components/GradingConfigurationModal.js.map +1 -0
  191. package/dist/grading/components/GradingLearnerContent.d.ts +7 -0
  192. package/dist/grading/components/GradingLearnerContent.js +114 -0
  193. package/dist/grading/components/GradingLearnerContent.js.map +1 -0
  194. package/dist/grading/data/api.d.ts +6 -0
  195. package/dist/grading/data/api.js +59 -0
  196. package/dist/grading/data/api.js.map +1 -0
  197. package/dist/grading/data/apiHook.d.ts +6 -0
  198. package/dist/grading/data/apiHook.js +29 -0
  199. package/dist/grading/data/apiHook.js.map +1 -0
  200. package/dist/grading/data/queryKeys.d.ts +9 -0
  201. package/dist/grading/data/queryKeys.js +8 -0
  202. package/dist/grading/data/queryKeys.js.map +1 -0
  203. package/dist/grading/messages.d.ts +173 -0
  204. package/dist/grading/messages.js +175 -0
  205. package/dist/grading/messages.js.map +1 -0
  206. package/dist/grading/types.d.ts +11 -0
  207. package/dist/grading/types.js +2 -0
  208. package/dist/grading/types.js.map +1 -0
  209. package/dist/hooks/useDebouncedFilter.d.ts +1 -0
  210. package/dist/hooks/useDebouncedFilter.js +5 -0
  211. package/dist/hooks/useDebouncedFilter.js.map +1 -1
  212. package/dist/index.d.ts +2 -3
  213. package/dist/index.js +2 -3
  214. package/dist/index.js.map +1 -1
  215. package/dist/instructorNav/InstructorNav.js +1 -1
  216. package/dist/instructorNav/InstructorNav.js.map +1 -1
  217. package/dist/provides.d.ts +4 -0
  218. package/dist/provides.js +7 -0
  219. package/dist/provides.js.map +1 -0
  220. package/dist/routes.d.ts +1 -1
  221. package/dist/routes.js +5 -4
  222. package/dist/routes.js.map +1 -1
  223. package/dist/specialExams/SpecialExamsPage.js +10 -2
  224. package/dist/specialExams/SpecialExamsPage.js.map +1 -1
  225. package/dist/specialExams/components/Allowances.d.ts +2 -0
  226. package/dist/specialExams/components/Allowances.js +6 -0
  227. package/dist/specialExams/components/Allowances.js.map +1 -0
  228. package/dist/specialExams/components/AttemptsList.d.ts +3 -0
  229. package/dist/specialExams/components/AttemptsList.js +44 -0
  230. package/dist/specialExams/components/AttemptsList.js.map +1 -0
  231. package/dist/specialExams/data/api.d.ts +3 -0
  232. package/dist/specialExams/data/api.js +23 -0
  233. package/dist/specialExams/data/api.js.map +1 -0
  234. package/dist/specialExams/data/apiHook.d.ts +2 -0
  235. package/dist/specialExams/data/apiHook.js +9 -0
  236. package/dist/specialExams/data/apiHook.js.map +1 -0
  237. package/dist/specialExams/data/queryKeys.d.ts +5 -0
  238. package/dist/specialExams/data/queryKeys.js +6 -0
  239. package/dist/specialExams/data/queryKeys.js.map +1 -0
  240. package/dist/specialExams/messages.d.ts +58 -0
  241. package/dist/specialExams/messages.js +60 -0
  242. package/dist/specialExams/messages.js.map +1 -0
  243. package/dist/specialExams/types.d.ts +13 -0
  244. package/dist/specialExams/types.js +2 -0
  245. package/dist/specialExams/types.js.map +1 -0
  246. package/dist/style.scss +16 -0
  247. package/dist/testUtils.js +1 -1
  248. package/dist/testUtils.js.map +1 -1
  249. package/dist/types/index.d.ts +1 -0
  250. package/dist/types/index.js.map +1 -1
  251. package/dist/utils/formatters.d.ts +5 -0
  252. package/dist/utils/formatters.js +10 -0
  253. package/dist/utils/formatters.js.map +1 -1
  254. package/package.json +2 -5
  255. package/dist/app.scss +0 -10
  256. package/dist/providers/QueryProvider.d.ts +0 -6
  257. package/dist/providers/QueryProvider.js +0 -16
  258. package/dist/providers/QueryProvider.js.map +0 -1
  259. package/dist/providers.d.ts +0 -3
  260. package/dist/providers.js +0 -8
  261. package/dist/providers.js.map +0 -1
@@ -64,7 +64,7 @@ declare const messages: {
64
64
  defaultMessage: string;
65
65
  description: string;
66
66
  };
67
- enrollLearnersPlaceholder: {
67
+ enrollmentStatusPlaceholder: {
68
68
  id: string;
69
69
  defaultMessage: string;
70
70
  description: string;
@@ -89,6 +89,16 @@ declare const messages: {
89
89
  defaultMessage: string;
90
90
  description: string;
91
91
  };
92
+ grantBetaTester: {
93
+ id: string;
94
+ defaultMessage: string;
95
+ description: string;
96
+ };
97
+ revokeBetaTester: {
98
+ id: string;
99
+ defaultMessage: string;
100
+ description: string;
101
+ };
92
102
  allEnrollees: {
93
103
  id: string;
94
104
  defaultMessage: string;
@@ -104,5 +114,115 @@ declare const messages: {
104
114
  defaultMessage: string;
105
115
  description: string;
106
116
  };
117
+ statusResponseMessage: {
118
+ id: string;
119
+ defaultMessage: string;
120
+ description: string;
121
+ };
122
+ userIdentifierPlaceholder: {
123
+ id: string;
124
+ defaultMessage: string;
125
+ description: string;
126
+ };
127
+ enrollLearnerInstructions: {
128
+ id: string;
129
+ defaultMessage: string;
130
+ description: string;
131
+ };
132
+ unenrollLearners: {
133
+ id: string;
134
+ defaultMessage: string;
135
+ description: string;
136
+ };
137
+ unenrollLearnersConfirmation: {
138
+ id: string;
139
+ defaultMessage: string;
140
+ description: string;
141
+ };
142
+ unenrollLearnerTitle: {
143
+ id: string;
144
+ defaultMessage: string;
145
+ description: string;
146
+ };
147
+ saveButton: {
148
+ id: string;
149
+ defaultMessage: string;
150
+ description: string;
151
+ };
152
+ cancelButton: {
153
+ id: string;
154
+ defaultMessage: string;
155
+ description: string;
156
+ };
157
+ autoEnrollCheckbox: {
158
+ id: string;
159
+ defaultMessage: string;
160
+ description: string;
161
+ };
162
+ notifyUsersCheckbox: {
163
+ id: string;
164
+ defaultMessage: string;
165
+ description: string;
166
+ };
167
+ enrollLearnerError: {
168
+ id: string;
169
+ defaultMessage: string;
170
+ description: string;
171
+ };
172
+ unenrollLearnerError: {
173
+ id: string;
174
+ defaultMessage: string;
175
+ description: string;
176
+ };
177
+ enrollLearnerNotFoundError: {
178
+ id: string;
179
+ defaultMessage: string;
180
+ description: string;
181
+ };
182
+ addBetaTestersInstructions: {
183
+ id: string;
184
+ defaultMessage: string;
185
+ description: string;
186
+ };
187
+ failedEnrollLearners: {
188
+ id: string;
189
+ defaultMessage: string;
190
+ description: string;
191
+ };
192
+ unknownLearner: {
193
+ id: string;
194
+ defaultMessage: string;
195
+ description: string;
196
+ };
197
+ removeBetaTesterError: {
198
+ id: string;
199
+ defaultMessage: string;
200
+ description: string;
201
+ };
202
+ failedBetaTesters: {
203
+ id: string;
204
+ defaultMessage: string;
205
+ description: string;
206
+ };
207
+ addBetaTesterError: {
208
+ id: string;
209
+ defaultMessage: string;
210
+ description: string;
211
+ };
212
+ removeBetaTesterTitle: {
213
+ id: string;
214
+ defaultMessage: string;
215
+ description: string;
216
+ };
217
+ removeBetaTesterDescription: {
218
+ id: string;
219
+ defaultMessage: string;
220
+ description: string;
221
+ };
222
+ revoke: {
223
+ id: string;
224
+ defaultMessage: string;
225
+ description: string;
226
+ };
107
227
  };
108
228
  export default messages;
@@ -13,7 +13,7 @@ const messages = defineMessages({
13
13
  enrollLearners: {
14
14
  id: 'instruct.enrollments.enrollLearners',
15
15
  defaultMessage: 'Enroll Learners',
16
- description: 'Button label for enrolling learners',
16
+ description: 'Button label and modal title for enrolling learners',
17
17
  },
18
18
  checkEnrollmentStatus: {
19
19
  id: 'instruct.enrollments.checkEnrollmentStatus',
@@ -61,17 +61,17 @@ const messages = defineMessages({
61
61
  description: 'Label for true boolean value',
62
62
  },
63
63
  addLearnerInstructions: {
64
- id: 'instruct.enrollments.checkEnrollmentStatusModal.addLearnerInstructions',
65
- defaultMessage: 'Learner’s My Open edX email address or username',
64
+ id: 'instruct.enrollments.modals.checkEnrollmentStatus.addLearnerInstructions',
65
+ defaultMessage: 'Enter email addresses and/or usernames separated by new lines or commas. You will not get notification for emails that bounce, so please double-check spelling.',
66
66
  description: 'Instructions for enroll learners to the course',
67
67
  },
68
- enrollLearnersPlaceholder: {
69
- id: 'instruct.enrollments.checkEnrollmentStatusModal.enrollLearnersPlaceholder',
68
+ enrollmentStatusPlaceholder: {
69
+ id: 'instruct.enrollments.modals.checkEnrollmentStatus.enrollmentStatusPlaceholder',
70
70
  defaultMessage: 'Learner email address or username',
71
71
  description: 'Placeholder text for enrolling learners textarea',
72
72
  },
73
73
  closeButton: {
74
- id: 'instruct.enrollments.checkEnrollmentStatusModal.closeButton',
74
+ id: 'instruct.enrollments.modals.closeButton',
75
75
  defaultMessage: 'Close',
76
76
  description: 'Label for close button in modals',
77
77
  },
@@ -90,6 +90,16 @@ const messages = defineMessages({
90
90
  defaultMessage: 'Change Beta Tester Status',
91
91
  description: 'Alt text for change beta tester status icon button',
92
92
  },
93
+ grantBetaTester: {
94
+ id: 'instruct.enrollments.grantBetaTester',
95
+ defaultMessage: 'Grant Beta Tester Role',
96
+ description: 'Menu option to grant beta tester status',
97
+ },
98
+ revokeBetaTester: {
99
+ id: 'instruct.enrollments.revokeBetaTester',
100
+ defaultMessage: 'Remove Beta Tester Role',
101
+ description: 'Menu option to revoke beta tester status',
102
+ },
93
103
  allEnrollees: {
94
104
  id: 'instruct.enrollments.allEnrollees',
95
105
  defaultMessage: 'All Enrollees',
@@ -105,6 +115,116 @@ const messages = defineMessages({
105
115
  defaultMessage: 'Non-Beta Testers',
106
116
  description: 'Option for showing only non-beta testers in beta tester filter',
107
117
  },
118
+ statusResponseMessage: {
119
+ id: 'instruct.enrollments.modals.checkEnrollmentStatus.statusResponseMessage',
120
+ defaultMessage: 'Enrollment status for {learnerIdentifier}: {status}',
121
+ description: 'Message displaying the enrollment status for a learner',
122
+ },
123
+ userIdentifierPlaceholder: {
124
+ id: 'instruct.enrollments.modals.enrollLearners.userIdentifierPlaceholder',
125
+ defaultMessage: 'Email addresses / Usernames',
126
+ description: 'Placeholder text for enrolling learners textarea',
127
+ },
128
+ enrollLearnerInstructions: {
129
+ id: 'instruct.enrollments.modals.enrollLearners.enrollLearnerInstructions',
130
+ defaultMessage: 'Enter email addresses and/or usernames separated by new lines or commas. You will not get notification for emails that bounce, so please double-check spelling.',
131
+ description: 'Instructions for enrolling learners to the course',
132
+ },
133
+ unenrollLearners: {
134
+ id: 'instruct.enrollments.modals.unenrollLearners',
135
+ defaultMessage: 'Unenroll Learners',
136
+ description: 'Title for unenroll learners modal',
137
+ },
138
+ unenrollLearnersConfirmation: {
139
+ id: 'instruct.enrollments.modals.unenrollLearnersConfirmation',
140
+ defaultMessage: 'Unenroll {name} from course?',
141
+ description: 'Confirmation message for unenrolling learners',
142
+ },
143
+ unenrollLearnerTitle: {
144
+ id: 'instruct.enrollments.modals.unenrollLearnerTitle',
145
+ defaultMessage: 'Unenroll Learner?',
146
+ description: 'Title for unenroll learner modal',
147
+ },
148
+ saveButton: {
149
+ id: 'instruct.enrollments.modals.saveButton',
150
+ defaultMessage: 'Save',
151
+ description: 'Label for save button in modals',
152
+ },
153
+ cancelButton: {
154
+ id: 'instruct.enrollments.modals.cancelButton',
155
+ defaultMessage: 'Cancel',
156
+ description: 'Label for cancel button in modals',
157
+ },
158
+ autoEnrollCheckbox: {
159
+ id: 'instruct.enrollments.modals.autoEnrollCheckbox',
160
+ defaultMessage: 'Auto Enroll',
161
+ description: 'Label for auto enroll checkbox in enroll learners modal',
162
+ },
163
+ notifyUsersCheckbox: {
164
+ id: 'instruct.enrollments.modals.notifyUsersCheckbox',
165
+ defaultMessage: 'Notify Users by Email',
166
+ description: 'Label for notify users by email checkbox in enroll learners modal',
167
+ },
168
+ enrollLearnerError: {
169
+ id: 'instruct.enrollments.modals.enrollLearnerError',
170
+ defaultMessage: 'An error occurred while enrolling learners. Please try again.',
171
+ description: 'Error message displayed when enrolling learners fails',
172
+ },
173
+ unenrollLearnerError: {
174
+ id: 'instruct.enrollments.modals.unenrollLearnerError',
175
+ defaultMessage: 'An error occurred while unenrolling learner. Please try again.',
176
+ description: 'Error message displayed when unenrolling learner fails',
177
+ },
178
+ enrollLearnerNotFoundError: {
179
+ id: 'instruct.enrollments.modals.enrollLearnerNotFoundError',
180
+ defaultMessage: 'One or more learners were not found. Please check the email addresses or usernames and try again.',
181
+ description: 'Error message displayed when enrolling learners fails due to learner not found',
182
+ },
183
+ addBetaTestersInstructions: {
184
+ id: 'instruct.enrollments.modals.addBetaTesters.addBetaTestersInstructions',
185
+ defaultMessage: 'Enter email addresses and/or usernames separated by new lines or commas. Note: Users must have an activated My Open edX account before they can be enrolled as beta testers.',
186
+ description: 'Instructions for adding beta testers to the course',
187
+ },
188
+ failedEnrollLearners: {
189
+ id: 'instruct.enrollments.modals.enrollLearners.failedEnrollLearners',
190
+ defaultMessage: 'The following usernames and/or email addresses are invalid. All other learners have been enrolled.',
191
+ description: 'Message displaying the learners that could not be enrolled',
192
+ },
193
+ unknownLearner: {
194
+ id: 'instruct.enrollments.unknownLearner',
195
+ defaultMessage: 'Unknown learner: {learner}',
196
+ description: 'Displayed when a learner does not have a full name or username available',
197
+ },
198
+ removeBetaTesterError: {
199
+ id: 'instruct.enrollments.modals.removeBetaTesters.removeBetaTesterError',
200
+ defaultMessage: 'Error removing user as beta tester.',
201
+ description: 'Error message displayed when removing beta testers fails',
202
+ },
203
+ failedBetaTesters: {
204
+ id: 'instruct.enrollments.modals.addBetaTesters.failedBetaTesters',
205
+ defaultMessage: 'The following usernames and/or email addresses are invalid. All other beta testers have been added.',
206
+ description: 'Message displaying the learners that could not be added as beta testers',
207
+ },
208
+ addBetaTesterError: {
209
+ id: 'instruct.enrollments.modals.addBetaTesters.addBetaTesterError',
210
+ defaultMessage: 'Error adding users as beta testers.',
211
+ description: 'Error message displayed when adding beta testers fails',
212
+ },
213
+ removeBetaTesterTitle: {
214
+ id: 'instruct.enrollments.modals.removeBetaTester',
215
+ defaultMessage: 'Revoke access?',
216
+ description: 'Title for remove beta tester modal',
217
+ },
218
+ removeBetaTesterDescription: {
219
+ id: 'instruct.enrollments.modals.removeBetaTesterDescription',
220
+ defaultMessage: 'Revoke Beta Tester access?',
221
+ description: 'Description for remove beta tester modal',
222
+ },
223
+ revoke: {
224
+ id: 'instruct.enrollments.revoke',
225
+ defaultMessage: 'Revoke',
226
+ description: 'Button label for revoking access',
227
+ }
108
228
  });
109
229
  export default messages;
110
230
  //# sourceMappingURL=messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/enrollments/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,oBAAoB,EAAE;QACpB,EAAE,EAAE,iCAAiC;QACrC,cAAc,EAAE,uBAAuB;QACvC,WAAW,EAAE,gCAAgC;KAC9C;IACD,cAAc,EAAE;QACd,EAAE,EAAE,qCAAqC;QACzC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,sCAAsC;KACpD;IACD,cAAc,EAAE;QACd,EAAE,EAAE,qCAAqC;QACzC,cAAc,EAAE,iBAAiB;QACjC,WAAW,EAAE,qCAAqC;KACnD;IACD,qBAAqB,EAAE;QACrB,EAAE,EAAE,4CAA4C;QAChD,cAAc,EAAE,yBAAyB;QACzC,WAAW,EAAE,6DAA6D;KAC3E;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,+BAA+B;QACnC,cAAc,EAAE,UAAU;QAC1B,WAAW,EAAE,gDAAgD;KAC9D;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,+BAA+B;QACnC,cAAc,EAAE,MAAM;QACtB,WAAW,EAAE,iDAAiD;KAC/D;IACD,KAAK,EAAE;QACL,EAAE,EAAE,4BAA4B;QAChC,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,6CAA6C;KAC3D;IACD,KAAK,EAAE;QACL,EAAE,EAAE,4BAA4B;QAChC,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,6CAA6C;KAC3D;IACD,UAAU,EAAE;QACV,EAAE,EAAE,iCAAiC;QACrC,cAAc,EAAE,aAAa;QAC7B,WAAW,EAAE,0DAA0D;KACxE;IACD,OAAO,EAAE;QACP,EAAE,EAAE,8BAA8B;QAClC,cAAc,EAAE,SAAS;QACzB,WAAW,EAAE,+CAA+C;KAC7D;IACD,cAAc,EAAE;QACd,EAAE,EAAE,qCAAqC;QACzC,cAAc,EAAE,UAAU;QAC1B,WAAW,EAAE,wCAAwC;KACtD;IACD,SAAS,EAAE;QACT,EAAE,EAAE,gCAAgC;QACpC,cAAc,EAAE,MAAM;QACtB,WAAW,EAAE,8BAA8B;KAC5C;IACD,sBAAsB,EAAE;QACtB,EAAE,EAAE,wEAAwE;QAC5E,cAAc,EAAE,iDAAiD;QACjE,WAAW,EAAE,gDAAgD;KAC9D;IACD,yBAAyB,EAAE;QACzB,EAAE,EAAE,2EAA2E;QAC/E,cAAc,EAAE,mCAAmC;QACnD,WAAW,EAAE,kDAAkD;KAChE;IACD,WAAW,EAAE;QACX,EAAE,EAAE,6DAA6D;QACjE,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,kCAAkC;KAChD;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,wCAAwC;QAC5C,cAAc,EAAE,oBAAoB;QACpC,WAAW,EAAE,sDAAsD;KACpE;IACD,aAAa,EAAE;QACb,EAAE,EAAE,oCAAoC;QACxC,cAAc,EAAE,sBAAsB;QACtC,WAAW,EAAE,yDAAyD;KACvE;IACD,sBAAsB,EAAE;QACtB,EAAE,EAAE,6CAA6C;QACjD,cAAc,EAAE,2BAA2B;QAC3C,WAAW,EAAE,oDAAoD;KAClE;IACD,YAAY,EAAE;QACZ,EAAE,EAAE,mCAAmC;QACvC,cAAc,EAAE,eAAe;QAC/B,WAAW,EAAE,wDAAwD;KACtE;IACD,WAAW,EAAE;QACX,EAAE,EAAE,kCAAkC;QACtC,cAAc,EAAE,cAAc;QAC9B,WAAW,EAAE,4DAA4D;KAC1E;IACD,cAAc,EAAE;QACd,EAAE,EAAE,qCAAqC;QACzC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,gEAAgE;KAC9E;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n enrollmentsPageTitle: {\n id: 'instruct.enrollments.page.title',\n defaultMessage: 'Enrollment Management',\n description: 'Title for the enrollments page',\n },\n addBetaTesters: {\n id: 'instruct.enrollments.addBetaTesters',\n defaultMessage: 'Add Beta Testers',\n description: 'Button label for adding beta testers',\n },\n enrollLearners: {\n id: 'instruct.enrollments.enrollLearners',\n defaultMessage: 'Enroll Learners',\n description: 'Button label for enrolling learners',\n },\n checkEnrollmentStatus: {\n id: 'instruct.enrollments.checkEnrollmentStatus',\n defaultMessage: 'Check Enrollment Status',\n description: 'Check enrollment status modal title and alt for icon button',\n },\n username: {\n id: 'instruct.enrollments.username',\n defaultMessage: 'Username',\n description: 'Column header for username in enrollments list',\n },\n fullName: {\n id: 'instruct.enrollments.fullName',\n defaultMessage: 'Name',\n description: 'Column header for full name in enrollments list',\n },\n email: {\n id: 'instruct.enrollments.email',\n defaultMessage: 'Email',\n description: 'Column header for email in enrollments list',\n },\n track: {\n id: 'instruct.enrollments.track',\n defaultMessage: 'Track',\n description: 'Column header for track in enrollments list',\n },\n betaTester: {\n id: 'instruct.enrollments.betaTester',\n defaultMessage: 'Beta Tester',\n description: 'Column header for beta tester status in enrollments list',\n },\n actions: {\n id: 'instruct.enrollments.actions',\n defaultMessage: 'Actions',\n description: 'Column header for actions in enrollments list',\n },\n unenrollButton: {\n id: 'instruct.enrollments.unenrollButton',\n defaultMessage: 'Unenroll',\n description: 'Button label for unenrolling a learner',\n },\n trueLabel: {\n id: 'instruct.enrollments.trueLabel',\n defaultMessage: 'True',\n description: 'Label for true boolean value',\n },\n addLearnerInstructions: {\n id: 'instruct.enrollments.checkEnrollmentStatusModal.addLearnerInstructions',\n defaultMessage: 'Learner’s My Open edX email address or username',\n description: 'Instructions for enroll learners to the course',\n },\n enrollLearnersPlaceholder: {\n id: 'instruct.enrollments.checkEnrollmentStatusModal.enrollLearnersPlaceholder',\n defaultMessage: 'Learner email address or username',\n description: 'Placeholder text for enrolling learners textarea',\n },\n closeButton: {\n id: 'instruct.enrollments.checkEnrollmentStatusModal.closeButton',\n defaultMessage: 'Close',\n description: 'Label for close button in modals',\n },\n searchPlaceholder: {\n id: 'instruct.enrollments.searchPlaceholder',\n defaultMessage: 'Search enrollments',\n description: 'Placeholder for the search input in enrollments list',\n },\n noEnrollments: {\n id: 'instruct.enrollments.noEnrollments',\n defaultMessage: 'No enrollments found',\n description: 'Message displayed when there are no enrollments to show',\n },\n changeBetaTesterStatus: {\n id: 'instruct.enrollments.changeBetaTesterStatus',\n defaultMessage: 'Change Beta Tester Status',\n description: 'Alt text for change beta tester status icon button',\n },\n allEnrollees: {\n id: 'instruct.enrollments.allEnrollees',\n defaultMessage: 'All Enrollees',\n description: 'Option for showing all enrollees in beta tester filter',\n },\n betaTesters: {\n id: 'instruct.enrollments.betaTesters',\n defaultMessage: 'Beta Testers',\n description: 'Option for showing only beta testers in beta tester filter',\n },\n nonBetaTesters: {\n id: 'instruct.enrollments.nonBetaTesters',\n defaultMessage: 'Non-Beta Testers',\n description: 'Option for showing only non-beta testers in beta tester filter',\n },\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/enrollments/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n enrollmentsPageTitle: {\n id: 'instruct.enrollments.page.title',\n defaultMessage: 'Enrollment Management',\n description: 'Title for the enrollments page',\n },\n addBetaTesters: {\n id: 'instruct.enrollments.addBetaTesters',\n defaultMessage: 'Add Beta Testers',\n description: 'Button label for adding beta testers',\n },\n enrollLearners: {\n id: 'instruct.enrollments.enrollLearners',\n defaultMessage: 'Enroll Learners',\n description: 'Button label and modal title for enrolling learners',\n },\n checkEnrollmentStatus: {\n id: 'instruct.enrollments.checkEnrollmentStatus',\n defaultMessage: 'Check Enrollment Status',\n description: 'Check enrollment status modal title and alt for icon button',\n },\n username: {\n id: 'instruct.enrollments.username',\n defaultMessage: 'Username',\n description: 'Column header for username in enrollments list',\n },\n fullName: {\n id: 'instruct.enrollments.fullName',\n defaultMessage: 'Name',\n description: 'Column header for full name in enrollments list',\n },\n email: {\n id: 'instruct.enrollments.email',\n defaultMessage: 'Email',\n description: 'Column header for email in enrollments list',\n },\n track: {\n id: 'instruct.enrollments.track',\n defaultMessage: 'Track',\n description: 'Column header for track in enrollments list',\n },\n betaTester: {\n id: 'instruct.enrollments.betaTester',\n defaultMessage: 'Beta Tester',\n description: 'Column header for beta tester status in enrollments list',\n },\n actions: {\n id: 'instruct.enrollments.actions',\n defaultMessage: 'Actions',\n description: 'Column header for actions in enrollments list',\n },\n unenrollButton: {\n id: 'instruct.enrollments.unenrollButton',\n defaultMessage: 'Unenroll',\n description: 'Button label for unenrolling a learner',\n },\n trueLabel: {\n id: 'instruct.enrollments.trueLabel',\n defaultMessage: 'True',\n description: 'Label for true boolean value',\n },\n addLearnerInstructions: {\n id: 'instruct.enrollments.modals.checkEnrollmentStatus.addLearnerInstructions',\n defaultMessage: 'Enter email addresses and/or usernames separated by new lines or commas. You will not get notification for emails that bounce, so please double-check spelling.',\n description: 'Instructions for enroll learners to the course',\n },\n enrollmentStatusPlaceholder: {\n id: 'instruct.enrollments.modals.checkEnrollmentStatus.enrollmentStatusPlaceholder',\n defaultMessage: 'Learner email address or username',\n description: 'Placeholder text for enrolling learners textarea',\n },\n closeButton: {\n id: 'instruct.enrollments.modals.closeButton',\n defaultMessage: 'Close',\n description: 'Label for close button in modals',\n },\n searchPlaceholder: {\n id: 'instruct.enrollments.searchPlaceholder',\n defaultMessage: 'Search enrollments',\n description: 'Placeholder for the search input in enrollments list',\n },\n noEnrollments: {\n id: 'instruct.enrollments.noEnrollments',\n defaultMessage: 'No enrollments found',\n description: 'Message displayed when there are no enrollments to show',\n },\n changeBetaTesterStatus: {\n id: 'instruct.enrollments.changeBetaTesterStatus',\n defaultMessage: 'Change Beta Tester Status',\n description: 'Alt text for change beta tester status icon button',\n },\n grantBetaTester: {\n id: 'instruct.enrollments.grantBetaTester',\n defaultMessage: 'Grant Beta Tester Role',\n description: 'Menu option to grant beta tester status',\n },\n revokeBetaTester: {\n id: 'instruct.enrollments.revokeBetaTester',\n defaultMessage: 'Remove Beta Tester Role',\n description: 'Menu option to revoke beta tester status',\n },\n allEnrollees: {\n id: 'instruct.enrollments.allEnrollees',\n defaultMessage: 'All Enrollees',\n description: 'Option for showing all enrollees in beta tester filter',\n },\n betaTesters: {\n id: 'instruct.enrollments.betaTesters',\n defaultMessage: 'Beta Testers',\n description: 'Option for showing only beta testers in beta tester filter',\n },\n nonBetaTesters: {\n id: 'instruct.enrollments.nonBetaTesters',\n defaultMessage: 'Non-Beta Testers',\n description: 'Option for showing only non-beta testers in beta tester filter',\n },\n statusResponseMessage: {\n id: 'instruct.enrollments.modals.checkEnrollmentStatus.statusResponseMessage',\n defaultMessage: 'Enrollment status for {learnerIdentifier}: {status}',\n description: 'Message displaying the enrollment status for a learner',\n },\n userIdentifierPlaceholder: {\n id: 'instruct.enrollments.modals.enrollLearners.userIdentifierPlaceholder',\n defaultMessage: 'Email addresses / Usernames',\n description: 'Placeholder text for enrolling learners textarea',\n },\n enrollLearnerInstructions: {\n id: 'instruct.enrollments.modals.enrollLearners.enrollLearnerInstructions',\n defaultMessage: 'Enter email addresses and/or usernames separated by new lines or commas. You will not get notification for emails that bounce, so please double-check spelling.',\n description: 'Instructions for enrolling learners to the course',\n },\n unenrollLearners: {\n id: 'instruct.enrollments.modals.unenrollLearners',\n defaultMessage: 'Unenroll Learners',\n description: 'Title for unenroll learners modal',\n },\n unenrollLearnersConfirmation: {\n id: 'instruct.enrollments.modals.unenrollLearnersConfirmation',\n defaultMessage: 'Unenroll {name} from course?',\n description: 'Confirmation message for unenrolling learners',\n },\n unenrollLearnerTitle: {\n id: 'instruct.enrollments.modals.unenrollLearnerTitle',\n defaultMessage: 'Unenroll Learner?',\n description: 'Title for unenroll learner modal',\n },\n saveButton: {\n id: 'instruct.enrollments.modals.saveButton',\n defaultMessage: 'Save',\n description: 'Label for save button in modals',\n },\n cancelButton: {\n id: 'instruct.enrollments.modals.cancelButton',\n defaultMessage: 'Cancel',\n description: 'Label for cancel button in modals',\n },\n autoEnrollCheckbox: {\n id: 'instruct.enrollments.modals.autoEnrollCheckbox',\n defaultMessage: 'Auto Enroll',\n description: 'Label for auto enroll checkbox in enroll learners modal',\n },\n notifyUsersCheckbox: {\n id: 'instruct.enrollments.modals.notifyUsersCheckbox',\n defaultMessage: 'Notify Users by Email',\n description: 'Label for notify users by email checkbox in enroll learners modal',\n },\n enrollLearnerError: {\n id: 'instruct.enrollments.modals.enrollLearnerError',\n defaultMessage: 'An error occurred while enrolling learners. Please try again.',\n description: 'Error message displayed when enrolling learners fails',\n },\n unenrollLearnerError: {\n id: 'instruct.enrollments.modals.unenrollLearnerError',\n defaultMessage: 'An error occurred while unenrolling learner. Please try again.',\n description: 'Error message displayed when unenrolling learner fails',\n },\n enrollLearnerNotFoundError: {\n id: 'instruct.enrollments.modals.enrollLearnerNotFoundError',\n defaultMessage: 'One or more learners were not found. Please check the email addresses or usernames and try again.',\n description: 'Error message displayed when enrolling learners fails due to learner not found',\n },\n addBetaTestersInstructions: {\n id: 'instruct.enrollments.modals.addBetaTesters.addBetaTestersInstructions',\n defaultMessage: 'Enter email addresses and/or usernames separated by new lines or commas. Note: Users must have an activated My Open edX account before they can be enrolled as beta testers.',\n description: 'Instructions for adding beta testers to the course',\n },\n failedEnrollLearners: {\n id: 'instruct.enrollments.modals.enrollLearners.failedEnrollLearners',\n defaultMessage: 'The following usernames and/or email addresses are invalid. All other learners have been enrolled.',\n description: 'Message displaying the learners that could not be enrolled',\n },\n unknownLearner: {\n id: 'instruct.enrollments.unknownLearner',\n defaultMessage: 'Unknown learner: {learner}',\n description: 'Displayed when a learner does not have a full name or username available',\n },\n removeBetaTesterError: {\n id: 'instruct.enrollments.modals.removeBetaTesters.removeBetaTesterError',\n defaultMessage: 'Error removing user as beta tester.',\n description: 'Error message displayed when removing beta testers fails',\n },\n failedBetaTesters: {\n id: 'instruct.enrollments.modals.addBetaTesters.failedBetaTesters',\n defaultMessage: 'The following usernames and/or email addresses are invalid. All other beta testers have been added.',\n description: 'Message displaying the learners that could not be added as beta testers',\n },\n addBetaTesterError: {\n id: 'instruct.enrollments.modals.addBetaTesters.addBetaTesterError',\n defaultMessage: 'Error adding users as beta testers.',\n description: 'Error message displayed when adding beta testers fails',\n },\n removeBetaTesterTitle: {\n id: 'instruct.enrollments.modals.removeBetaTester',\n defaultMessage: 'Revoke access?',\n description: 'Title for remove beta tester modal',\n },\n removeBetaTesterDescription: {\n id: 'instruct.enrollments.modals.removeBetaTesterDescription',\n defaultMessage: 'Revoke Beta Tester access?',\n description: 'Description for remove beta tester modal',\n },\n revoke: {\n id: 'instruct.enrollments.revoke',\n defaultMessage: 'Revoke',\n description: 'Button label for revoking access',\n }\n});\n\nexport default messages;\n"]}
@@ -10,3 +10,27 @@ export interface EnrollmentsParams extends PaginationParams {
10
10
  emailOrUsername: string;
11
11
  isBetaTester: string;
12
12
  }
13
+ export interface UpdateEnrollmentsParams {
14
+ identifier: string[];
15
+ action: 'enroll' | 'unenroll';
16
+ autoEnroll?: boolean;
17
+ emailStudents?: boolean;
18
+ }
19
+ export interface UpdateBetaTestersParams {
20
+ identifier: string[];
21
+ action: 'add' | 'remove';
22
+ autoEnroll?: boolean;
23
+ emailStudents?: boolean;
24
+ }
25
+ export interface UpdateEnrollmentsResponse {
26
+ results: {
27
+ identifier: string;
28
+ invalidIdentifier: boolean;
29
+ }[];
30
+ }
31
+ export interface UpdateBetaTestersResponse {
32
+ results: {
33
+ identifier: string;
34
+ userDoesNotExist: boolean;
35
+ }[];
36
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/enrollments/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Learner, PaginationParams } from '@src/types';\n\nexport interface EnrollmentStatusResponse {\n enrollmentStatus: string,\n}\n\nexport interface EnrolledLearner extends Learner {\n mode: string,\n isBetaTester: boolean,\n}\n\nexport interface EnrollmentsParams extends PaginationParams {\n emailOrUsername: string,\n isBetaTester: string,\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/enrollments/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Learner, PaginationParams } from '@src/types';\n\nexport interface EnrollmentStatusResponse {\n enrollmentStatus: string,\n}\n\nexport interface EnrolledLearner extends Learner {\n mode: string,\n isBetaTester: boolean,\n}\n\nexport interface EnrollmentsParams extends PaginationParams {\n emailOrUsername: string,\n isBetaTester: string,\n}\n\nexport interface UpdateEnrollmentsParams {\n identifier: string[],\n action: 'enroll' | 'unenroll',\n autoEnroll?: boolean,\n emailStudents?: boolean,\n}\n\nexport interface UpdateBetaTestersParams {\n identifier: string[],\n action: 'add' | 'remove',\n autoEnroll?: boolean,\n emailStudents?: boolean,\n}\n\nexport interface UpdateEnrollmentsResponse {\n results: {\n identifier: string,\n invalidIdentifier: boolean,\n }[],\n}\n\nexport interface UpdateBetaTestersResponse {\n results: {\n identifier: string,\n userDoesNotExist: boolean,\n }[],\n}\n"]}
@@ -1,6 +1,19 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import { Button, ButtonGroup, Card } from '@openedx/paragon';
5
+ import { PendingTasks } from '../components/PendingTasks';
6
+ import GradingActionRow from '../grading/components/GradingActionRow';
7
+ import GradingLearnerContent from '../grading/components/GradingLearnerContent';
8
+ import messages from '../grading/messages';
2
9
  const GradingPage = () => {
3
- return (_jsx("div", { children: _jsx("h3", { children: "Grading" }) }));
10
+ const intl = useIntl();
11
+ const [selectedTools, setSelectedTools] = useState('single');
12
+ const [isPendingTasksOpen, setIsPendingTasksOpen] = useState(false);
13
+ const handleOpenPendingTasks = () => {
14
+ setIsPendingTasksOpen(true);
15
+ };
16
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "d-flex justify-content-between align-items-center", children: [_jsx("h3", { className: "text-primary-700 mb-0", children: intl.formatMessage(messages.pageTitle) }), _jsx(GradingActionRow, {})] }), _jsxs(Card, { className: "bg-light-200 p-4 mt-4.5", children: [_jsxs(ButtonGroup, { className: "d-block", children: [_jsx(Button, { onClick: () => setSelectedTools('single'), variant: selectedTools === 'single' ? 'primary' : 'outline-primary', children: intl.formatMessage(messages.singleLearner) }), _jsx(Button, { onClick: () => setSelectedTools('all'), variant: selectedTools === 'all' ? 'primary' : 'outline-primary', children: intl.formatMessage(messages.allLearners) })] }), _jsx(GradingLearnerContent, { toolType: selectedTools, onShowTasks: handleOpenPendingTasks })] }), _jsx(PendingTasks, { isOpen: isPendingTasksOpen, onToggle: () => setIsPendingTasksOpen(prev => !prev) })] }));
4
17
  };
5
18
  export default GradingPage;
6
19
  //# sourceMappingURL=GradingPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GradingPage.js","sourceRoot":"","sources":["../../src/grading/GradingPage.tsx"],"names":[],"mappings":";AAAA,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,OAAO,CACL,wBACE,mCAAgB,GACZ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["const GradingPage = () => {\n return (\n <div>\n <h3>Grading</h3>\n </div>\n );\n};\n\nexport default GradingPage;\n"]}
1
+ {"version":3,"file":"GradingPage.js","sourceRoot":"","sources":["../../src/grading/GradingPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,gBAAgB,MAAM,0CAA0C,CAAC;AACxE,OAAO,qBAAqB,MAAM,+CAA+C,CAAC;AAClF,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAG7C,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAmB,QAAQ,CAAC,CAAC;IAC/E,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpE,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAClC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,mDAAmD,aAChE,aAAI,SAAS,EAAC,uBAAuB,YAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAM,EACnF,KAAC,gBAAgB,KAAG,IAChB,EACN,MAAC,IAAI,IAAC,SAAS,EAAC,yBAAyB,aACvC,MAAC,WAAW,IAAC,SAAS,EAAC,SAAS,aAC9B,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EACzC,OAAO,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,YAElE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GACpC,EACT,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EACtC,OAAO,EAAE,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,YAE/D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,GAClC,IACG,EACd,KAAC,qBAAqB,IAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,GAAI,IAClF,EACP,KAAC,YAAY,IAAC,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAI,IACjG,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import { useState } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Button, ButtonGroup, Card } from '@openedx/paragon';\nimport { PendingTasks } from '@src/components/PendingTasks';\nimport GradingActionRow from '@src/grading/components/GradingActionRow';\nimport GradingLearnerContent from '@src/grading/components/GradingLearnerContent';\nimport messages from '@src/grading/messages';\nimport { GradingToolsType } from '@src/grading/types';\n\nconst GradingPage = () => {\n const intl = useIntl();\n const [selectedTools, setSelectedTools] = useState<GradingToolsType>('single');\n const [isPendingTasksOpen, setIsPendingTasksOpen] = useState(false);\n\n const handleOpenPendingTasks = () => {\n setIsPendingTasksOpen(true);\n };\n\n return (\n <>\n <div className=\"d-flex justify-content-between align-items-center\">\n <h3 className=\"text-primary-700 mb-0\">{intl.formatMessage(messages.pageTitle)}</h3>\n <GradingActionRow />\n </div>\n <Card className=\"bg-light-200 p-4 mt-4.5\">\n <ButtonGroup className=\"d-block\">\n <Button\n onClick={() => setSelectedTools('single')}\n variant={selectedTools === 'single' ? 'primary' : 'outline-primary'}\n >\n {intl.formatMessage(messages.singleLearner)}\n </Button>\n <Button\n onClick={() => setSelectedTools('all')}\n variant={selectedTools === 'all' ? 'primary' : 'outline-primary'}\n >\n {intl.formatMessage(messages.allLearners)}\n </Button>\n </ButtonGroup>\n <GradingLearnerContent toolType={selectedTools} onShowTasks={handleOpenPendingTasks} />\n </Card>\n <PendingTasks isOpen={isPendingTasksOpen} onToggle={() => setIsPendingTasksOpen(prev => !prev)} />\n </>\n );\n};\n\nexport default GradingPage;\n"]}
@@ -0,0 +1,2 @@
1
+ declare const GradingActionRow: () => import("react/jsx-runtime").JSX.Element;
2
+ export default GradingActionRow;
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useParams } from 'react-router-dom';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import { useToggle, ActionRow, Button, IconButton, ModalPopup, Menu, MenuItem } from '@openedx/paragon';
6
+ import { TrendingUp, MoreVert, OpenInNew } from '@openedx/paragon/icons';
7
+ import { useCourseInfo } from '../../data/apiHook';
8
+ import GradingConfigurationModal from '../../grading/components/GradingConfigurationModal';
9
+ import messages from '../../grading/messages';
10
+ const GradingActionRow = () => {
11
+ const { courseId = '' } = useParams();
12
+ const intl = useIntl();
13
+ const { data = { gradebookUrl: '', studioGradingUrl: '' } } = useCourseInfo(courseId);
14
+ const [configurationMenuTarget, setConfigurationMenuTarget] = useState(null);
15
+ const [isOpenMenu, openMenu, closeMenu] = useToggle(false);
16
+ const [isOpenConfigModal, openConfigModal, closeConfigModal] = useToggle(false);
17
+ const handleConfigurationMenuClick = (event) => {
18
+ setConfigurationMenuTarget(event === null || event === void 0 ? void 0 : event.currentTarget);
19
+ openMenu();
20
+ };
21
+ const handleConfigModalOpen = () => {
22
+ openConfigModal();
23
+ closeMenu();
24
+ };
25
+ return (_jsxs(_Fragment, { children: [_jsxs(ActionRow, { children: [_jsx(Button, { as: "a", href: data.gradebookUrl, iconBefore: TrendingUp, variant: "outline-primary", children: intl.formatMessage(messages.viewGradebook) }), _jsx(IconButton, { alt: intl.formatMessage(messages.configurationAlt), className: "lead", iconAs: MoreVert, onClick: handleConfigurationMenuClick })] }), _jsx(ModalPopup, { positionRef: configurationMenuTarget, onClose: closeMenu, isOpen: isOpenMenu, children: _jsxs(Menu, { children: [_jsx(MenuItem, { onClick: handleConfigModalOpen, children: intl.formatMessage(messages.viewGradingConfiguration) }), _jsx(MenuItem, { iconAfter: OpenInNew, as: "a", href: data.studioGradingUrl, target: "_blank", children: intl.formatMessage(messages.viewCourseGradingSettings) })] }) }), _jsx(GradingConfigurationModal, { isOpen: isOpenConfigModal, onClose: closeConfigModal })] }));
26
+ };
27
+ export default GradingActionRow;
28
+ //# sourceMappingURL=GradingActionRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GradingActionRow.js","sourceRoot":"","sources":["../../../src/grading/components/GradingActionRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,yBAAyB,MAAM,mDAAmD,CAAC;AAC1F,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAE7C,MAAM,gBAAgB,GAAG,GAAG,EAAE;IAC5B,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,SAAS,EAAwB,CAAC;IAC5D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtF,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CAA2B,IAAI,CAAC,CAAC;IACvG,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,CAAC,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEhF,MAAM,4BAA4B,GAAG,CAAC,KAA0C,EAAE,EAAE;QAClF,0BAA0B,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,CAAC,CAAC;QACjD,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,MAAC,SAAS,eACR,KAAC,MAAM,IAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAC,iBAAiB,YAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAU,EAC/I,KAAC,UAAU,IACT,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAClD,SAAS,EAAC,MAAM,EAChB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,4BAA4B,GACrC,IACQ,EACZ,KAAC,UAAU,IAAC,WAAW,EAAE,uBAAuB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,YACtF,MAAC,IAAI,eACH,KAAC,QAAQ,IAAC,OAAO,EAAE,qBAAqB,YACrC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAC7C,EACX,KAAC,QAAQ,IAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAC,QAAQ,YAChF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,GAC9C,IACN,GACI,EACb,KAAC,yBAAyB,IAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,GAAI,IAClF,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { useToggle, ActionRow, Button, IconButton, ModalPopup, Menu, MenuItem } from '@openedx/paragon';\nimport { TrendingUp, MoreVert, OpenInNew } from '@openedx/paragon/icons';\nimport { useCourseInfo } from '@src/data/apiHook';\nimport GradingConfigurationModal from '@src/grading/components/GradingConfigurationModal';\nimport messages from '@src/grading/messages';\n\nconst GradingActionRow = () => {\n const { courseId = '' } = useParams<{ courseId: string }>();\n const intl = useIntl();\n const { data = { gradebookUrl: '', studioGradingUrl: '' } } = useCourseInfo(courseId);\n const [configurationMenuTarget, setConfigurationMenuTarget] = useState<HTMLButtonElement | null>(null);\n const [isOpenMenu, openMenu, closeMenu] = useToggle(false);\n const [isOpenConfigModal, openConfigModal, closeConfigModal] = useToggle(false);\n\n const handleConfigurationMenuClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setConfigurationMenuTarget(event?.currentTarget);\n openMenu();\n };\n\n const handleConfigModalOpen = () => {\n openConfigModal();\n closeMenu();\n };\n\n return (\n <>\n <ActionRow>\n <Button as=\"a\" href={data.gradebookUrl} iconBefore={TrendingUp} variant=\"outline-primary\">{intl.formatMessage(messages.viewGradebook)}</Button>\n <IconButton\n alt={intl.formatMessage(messages.configurationAlt)}\n className=\"lead\"\n iconAs={MoreVert}\n onClick={handleConfigurationMenuClick}\n />\n </ActionRow>\n <ModalPopup positionRef={configurationMenuTarget} onClose={closeMenu} isOpen={isOpenMenu}>\n <Menu>\n <MenuItem onClick={handleConfigModalOpen}>\n {intl.formatMessage(messages.viewGradingConfiguration)}\n </MenuItem>\n <MenuItem iconAfter={OpenInNew} as=\"a\" href={data.studioGradingUrl} target=\"_blank\">\n {intl.formatMessage(messages.viewCourseGradingSettings)}\n </MenuItem>\n </Menu>\n </ModalPopup>\n <GradingConfigurationModal isOpen={isOpenConfigModal} onClose={closeConfigModal} />\n </>\n );\n};\n\nexport default GradingActionRow;\n"]}
@@ -0,0 +1,6 @@
1
+ interface GradingConfigurationModalProps {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ }
5
+ declare const GradingConfigurationModal: ({ isOpen, onClose }: GradingConfigurationModalProps) => import("react/jsx-runtime").JSX.Element;
6
+ export default GradingConfigurationModal;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useParams } from 'react-router-dom';
3
+ import { Button, ModalDialog } from '@openedx/paragon';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import messages from '../../grading/messages';
6
+ import { useGradingConfiguration } from '../../grading/data/apiHook';
7
+ const GradingConfigurationModal = ({ isOpen, onClose }) => {
8
+ const intl = useIntl();
9
+ const { courseId = '' } = useParams();
10
+ const { data = null } = useGradingConfiguration(courseId);
11
+ return (_jsxs(ModalDialog, { title: intl.formatMessage(messages.gradingConfiguration), isOpen: isOpen, onClose: onClose, isOverflowVisible: false, children: [_jsx(ModalDialog.Header, { children: _jsx("h3", { children: intl.formatMessage(messages.gradingConfiguration) }) }), _jsx(ModalDialog.Body, { children: _jsx("p", { children: data !== null && data !== void 0 ? data : intl.formatMessage(messages.noGradingConfiguration) }) }), _jsx(ModalDialog.Footer, { children: _jsx(Button, { onClick: onClose, children: intl.formatMessage(messages.close) }) })] }));
12
+ };
13
+ export default GradingConfigurationModal;
14
+ //# sourceMappingURL=GradingConfigurationModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GradingConfigurationModal.js","sourceRoot":"","sources":["../../../src/grading/components/GradingConfigurationModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAOpE,MAAM,yBAAyB,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAkC,EAAE,EAAE;IACxF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,SAAS,EAAwB,CAAC;IAC5D,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAE1D,OAAO,CACL,MAAC,WAAW,IAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAC/H,KAAC,WAAW,CAAC,MAAM,cACjB,uBAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,GAAM,GACzC,EACrB,KAAC,WAAW,CAAC,IAAI,cACf,sBAAI,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,GAAK,GACnD,EACnB,KAAC,WAAW,CAAC,MAAM,cACjB,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,YAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAU,GACpD,IACT,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,yBAAyB,CAAC","sourcesContent":["import { useParams } from 'react-router-dom';\nimport { Button, ModalDialog } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from '@src/grading/messages';\nimport { useGradingConfiguration } from '@src/grading/data/apiHook';\n\ninterface GradingConfigurationModalProps {\n isOpen: boolean,\n onClose: () => void,\n}\n\nconst GradingConfigurationModal = ({ isOpen, onClose }: GradingConfigurationModalProps) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const { data = null } = useGradingConfiguration(courseId);\n\n return (\n <ModalDialog title={intl.formatMessage(messages.gradingConfiguration)} isOpen={isOpen} onClose={onClose} isOverflowVisible={false}>\n <ModalDialog.Header>\n <h3>{intl.formatMessage(messages.gradingConfiguration)}</h3>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <p>{data ?? intl.formatMessage(messages.noGradingConfiguration)}</p>\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <Button onClick={onClose}>{intl.formatMessage(messages.close)}</Button>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default GradingConfigurationModal;\n"]}
@@ -0,0 +1,7 @@
1
+ import { GradingToolsType } from '../../grading/types';
2
+ interface GradingLearnerContentProps {
3
+ toolType: GradingToolsType;
4
+ onShowTasks: () => void;
5
+ }
6
+ declare const GradingLearnerContent: ({ toolType, onShowTasks }: GradingLearnerContentProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default GradingLearnerContent;
@@ -0,0 +1,114 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useParams } from 'react-router-dom';
3
+ import { useEffect, useState, useRef } from 'react';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import { Button, FormControl } from '@openedx/paragon';
6
+ import ActionCard from '../../components/ActionCard';
7
+ import SpecifyLearnerField from '../../components/SpecifyLearnerField';
8
+ import SpecifyProblemField from '../../components/SpecifyProblemField';
9
+ import { useChangeScore, useDeleteHistory, useRescoreSubmission, useResetAttempts } from '../../grading/data/apiHook';
10
+ import messages from '../../grading/messages';
11
+ import { usePendingTasks } from '../../data/apiHook';
12
+ const GradingLearnerContent = ({ toolType, onShowTasks }) => {
13
+ const intl = useIntl();
14
+ const { courseId = '' } = useParams();
15
+ const [usernameOrEmail, setUsernameOrEmail] = useState('');
16
+ const [blockId, setBlockId] = useState('');
17
+ const [score, setScore] = useState('');
18
+ const learnerFieldRef = useRef(null);
19
+ const problemFieldRef = useRef(null);
20
+ const { mutate: resetAttempts } = useResetAttempts(courseId);
21
+ const { mutate: deleteHistory } = useDeleteHistory(courseId);
22
+ const { mutate: changeScore } = useChangeScore(courseId);
23
+ const { mutate: rescoreSubmission } = useRescoreSubmission(courseId);
24
+ const { refetch: refetchTasks } = usePendingTasks(courseId);
25
+ const handleResetAttempts = () => {
26
+ resetAttempts({ learner: usernameOrEmail, problem: blockId });
27
+ };
28
+ const handleRescoreSubmission = (onlyIfHigher = false) => {
29
+ rescoreSubmission({ learner: usernameOrEmail, problem: blockId, onlyIfHigher });
30
+ };
31
+ const handleDeleteHistory = () => {
32
+ deleteHistory({ learner: usernameOrEmail, problem: blockId });
33
+ };
34
+ const handleOverrideScore = () => {
35
+ changeScore({ learner: usernameOrEmail, problem: blockId, newScore: Number(score) });
36
+ };
37
+ const handleScoreChange = (e) => {
38
+ const value = e.target.value;
39
+ const numericRegex = /^-?\d*\.?\d*$/;
40
+ if (numericRegex.test(value) || value === '') {
41
+ setScore(value);
42
+ }
43
+ };
44
+ const handleTaskStatusClick = () => {
45
+ refetchTasks();
46
+ onShowTasks();
47
+ };
48
+ useEffect(() => {
49
+ var _a, _b;
50
+ setUsernameOrEmail('');
51
+ setBlockId('');
52
+ setScore('');
53
+ (_a = learnerFieldRef.current) === null || _a === void 0 ? void 0 : _a.reset();
54
+ (_b = problemFieldRef.current) === null || _b === void 0 ? void 0 : _b.reset();
55
+ }, [toolType]);
56
+ const singleLearnerActionRows = [
57
+ {
58
+ title: intl.formatMessage(messages.resetAttempts),
59
+ description: intl.formatMessage(messages.resetAttemptsDescription),
60
+ customAction: (_jsx(Button, { disabled: !usernameOrEmail || !blockId, onClick: handleResetAttempts, children: intl.formatMessage(messages.resetAttemptsButtonLabel) }))
61
+ },
62
+ {
63
+ title: intl.formatMessage(messages.rescoreSubmission),
64
+ description: intl.formatMessage(messages.rescoreSubmissionDescription),
65
+ customAction: (_jsxs("div", { className: "d-flex flex-column gap-3", children: [_jsx(Button, { disabled: !usernameOrEmail || !blockId, onClick: () => handleRescoreSubmission(), children: intl.formatMessage(messages.rescoreSubmissionButtonLabel) }), _jsx(Button, { disabled: !usernameOrEmail || !blockId, onClick: () => handleRescoreSubmission(true), children: intl.formatMessage(messages.rescoreIfImprovesScoreButtonLabel) })] })),
66
+ },
67
+ {
68
+ title: intl.formatMessage(messages.overrideScore),
69
+ description: intl.formatMessage(messages.overrideScoreDescription),
70
+ buttonLabel: intl.formatMessage(messages.overrideScoreButtonLabel),
71
+ customAction: (_jsxs("div", { className: "d-flex align-items-center gap-2", children: [_jsx(FormControl, { name: intl.formatMessage(messages.overrideScorePlaceholder), type: "number", placeholder: intl.formatMessage(messages.overrideScorePlaceholder), value: score, onChange: handleScoreChange }), _jsx(Button, { disabled: !usernameOrEmail || !blockId || !score, onClick: handleOverrideScore, children: intl.formatMessage(messages.overrideScoreButtonLabel) })] }))
72
+ },
73
+ {
74
+ title: intl.formatMessage(messages.deleteHistory),
75
+ description: intl.formatMessage(messages.deleteHistoryDescription),
76
+ customAction: (_jsxs("div", { className: "d-flex flex-column gap-3", children: [_jsx(Button, { disabled: !usernameOrEmail || !blockId, onClick: handleResetAttempts, children: intl.formatMessage(messages.resetAttemptsButtonLabel) }), _jsx(Button, { disabled: !usernameOrEmail || !blockId, onClick: handleDeleteHistory, children: intl.formatMessage(messages.deleteHistoryButtonLabel) })] })),
77
+ },
78
+ {
79
+ title: intl.formatMessage(messages.taskStatus),
80
+ description: intl.formatMessage(messages.taskStatusDescription),
81
+ customAction: (_jsx(Button, { disabled: !usernameOrEmail || !blockId, onClick: handleTaskStatusClick, children: intl.formatMessage(messages.taskStatusButtonLabel) }))
82
+ }
83
+ ];
84
+ const allLearnersActionRows = [
85
+ {
86
+ title: intl.formatMessage(messages.resetAttempts),
87
+ description: intl.formatMessage(messages.resetAllLearnersAttemptsDescription),
88
+ buttonLabel: intl.formatMessage(messages.resetAttemptsButtonLabel),
89
+ customAction: (_jsx(Button, { disabled: !blockId, onClick: handleResetAttempts, children: intl.formatMessage(messages.resetAttemptsButtonLabel) }))
90
+ },
91
+ {
92
+ title: intl.formatMessage(messages.rescoreSubmission),
93
+ description: intl.formatMessage(messages.rescoreSubmissionAllLearnersDescription),
94
+ customAction: (_jsxs("div", { className: "d-flex flex-column gap-3", children: [_jsx(Button, { disabled: !blockId, onClick: () => handleRescoreSubmission(), children: intl.formatMessage(messages.rescoreAllSubmissionButtonLabel) }), _jsx(Button, { disabled: !blockId, onClick: () => handleRescoreSubmission(true), children: intl.formatMessage(messages.rescoreIfImprovesScoreButtonLabel) })] })),
95
+ },
96
+ {
97
+ title: intl.formatMessage(messages.taskStatus),
98
+ description: intl.formatMessage(messages.taskStatusDescription),
99
+ customAction: (_jsx(Button, { onClick: handleTaskStatusClick, children: intl.formatMessage(messages.taskStatusButtonLabel) }))
100
+ }
101
+ ];
102
+ const rows = toolType === 'single' ? singleLearnerActionRows : allLearnersActionRows;
103
+ const handleProblemChange = (location) => {
104
+ setBlockId(location);
105
+ };
106
+ const handleLearnerChange = (usernameOrEmail) => {
107
+ setUsernameOrEmail(usernameOrEmail);
108
+ };
109
+ return (_jsxs(_Fragment, { children: [_jsx("p", { className: "x-small text-primary mt-3", children: toolType === 'single'
110
+ ? intl.formatMessage(messages.descriptionSingleLearner)
111
+ : intl.formatMessage(messages.descriptionAllLearners) }), _jsxs("div", { className: "d-flex justify-content-between gap-4", children: [toolType === 'single' && (_jsx("div", { className: "w-50", children: _jsx(SpecifyLearnerField, { ref: learnerFieldRef, onClickSelect: handleLearnerChange }) })), _jsx("div", { className: "w-50", children: _jsx(SpecifyProblemField, { ref: problemFieldRef, fieldLabel: intl.formatMessage(messages.specifyProblem), buttonLabel: intl.formatMessage(messages.select), disabled: !usernameOrEmail && toolType === 'single', usernameOrEmail: usernameOrEmail, onClickSelect: handleProblemChange }) })] }), rows.map(({ title, description, buttonLabel, customAction, onButtonClick }, index) => (_jsx(ActionCard, { buttonLabel: buttonLabel, description: description, title: title, hasBorderBottom: index !== rows.length - 1, customAction: customAction, onButtonClick: onButtonClick }, title)))] }));
112
+ };
113
+ export default GradingLearnerContent;
114
+ //# sourceMappingURL=GradingLearnerContent.js.map