@openedx/frontend-app-instructor-dashboard 1.0.0-alpha.0

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 (299) hide show
  1. package/LICENSE +661 -0
  2. package/README.rst +235 -0
  3. package/dist/Main.d.ts +3 -0
  4. package/dist/Main.js +13 -0
  5. package/dist/Main.js.map +1 -0
  6. package/dist/app.d.ts +3 -0
  7. package/dist/app.js +18 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/app.scss +10 -0
  10. package/dist/certificates/CertificatesPage.d.ts +2 -0
  11. package/dist/certificates/CertificatesPage.js +6 -0
  12. package/dist/certificates/CertificatesPage.js.map +1 -0
  13. package/dist/cohorts/CohortsPage.d.ts +3 -0
  14. package/dist/cohorts/CohortsPage.js +41 -0
  15. package/dist/cohorts/CohortsPage.js.map +1 -0
  16. package/dist/cohorts/CohortsPage.scss +14 -0
  17. package/dist/cohorts/components/CohortCard.d.ts +6 -0
  18. package/dist/cohorts/components/CohortCard.js +53 -0
  19. package/dist/cohorts/components/CohortCard.js.map +1 -0
  20. package/dist/cohorts/components/CohortContext.d.ts +14 -0
  21. package/dist/cohorts/components/CohortContext.js +46 -0
  22. package/dist/cohorts/components/CohortContext.js.map +1 -0
  23. package/dist/cohorts/components/CohortsForm.d.ts +11 -0
  24. package/dist/cohorts/components/CohortsForm.js +58 -0
  25. package/dist/cohorts/components/CohortsForm.js.map +1 -0
  26. package/dist/cohorts/components/DisableCohortsModal.d.ts +7 -0
  27. package/dist/cohorts/components/DisableCohortsModal.js +10 -0
  28. package/dist/cohorts/components/DisableCohortsModal.js.map +1 -0
  29. package/dist/cohorts/components/DisabledCohortsView.d.ts +5 -0
  30. package/dist/cohorts/components/DisabledCohortsView.js +10 -0
  31. package/dist/cohorts/components/DisabledCohortsView.js.map +1 -0
  32. package/dist/cohorts/components/EnabledCohortsView.d.ts +2 -0
  33. package/dist/cohorts/components/EnabledCohortsView.js +96 -0
  34. package/dist/cohorts/components/EnabledCohortsView.js.map +1 -0
  35. package/dist/cohorts/components/ManageLearners.d.ts +2 -0
  36. package/dist/cohorts/components/ManageLearners.js +64 -0
  37. package/dist/cohorts/components/ManageLearners.js.map +1 -0
  38. package/dist/cohorts/components/SelectedCohortInfo.d.ts +2 -0
  39. package/dist/cohorts/components/SelectedCohortInfo.js +43 -0
  40. package/dist/cohorts/components/SelectedCohortInfo.js.map +1 -0
  41. package/dist/cohorts/constants.d.ts +4 -0
  42. package/dist/cohorts/constants.js +5 -0
  43. package/dist/cohorts/constants.js.map +1 -0
  44. package/dist/cohorts/data/api.d.ts +9 -0
  45. package/dist/cohorts/data/api.js +54 -0
  46. package/dist/cohorts/data/api.js.map +1 -0
  47. package/dist/cohorts/data/apiHook.d.ts +14 -0
  48. package/dist/cohorts/data/apiHook.js +64 -0
  49. package/dist/cohorts/data/apiHook.js.map +1 -0
  50. package/dist/cohorts/data/queryKeys.d.ts +7 -0
  51. package/dist/cohorts/data/queryKeys.js +9 -0
  52. package/dist/cohorts/data/queryKeys.js.map +1 -0
  53. package/dist/cohorts/messages.d.ts +233 -0
  54. package/dist/cohorts/messages.js +235 -0
  55. package/dist/cohorts/messages.js.map +1 -0
  56. package/dist/cohorts/types.d.ts +15 -0
  57. package/dist/cohorts/types.js +2 -0
  58. package/dist/cohorts/types.js.map +1 -0
  59. package/dist/components/ActionCard.d.ts +11 -0
  60. package/dist/components/ActionCard.js +7 -0
  61. package/dist/components/ActionCard.js.map +1 -0
  62. package/dist/components/CSVComponent.d.ts +10 -0
  63. package/dist/components/CSVComponent.js +21 -0
  64. package/dist/components/CSVComponent.js.map +1 -0
  65. package/dist/components/ObjectCell.d.ts +5 -0
  66. package/dist/components/ObjectCell.js +7 -0
  67. package/dist/components/ObjectCell.js.map +1 -0
  68. package/dist/components/PageNotFound.d.ts +2 -0
  69. package/dist/components/PageNotFound.js +12 -0
  70. package/dist/components/PageNotFound.js.map +1 -0
  71. package/dist/components/PendingTasks.d.ts +5 -0
  72. package/dist/components/PendingTasks.js +38 -0
  73. package/dist/components/PendingTasks.js.map +1 -0
  74. package/dist/components/SpecifyLearnerField.d.ts +5 -0
  75. package/dist/components/SpecifyLearnerField.js +10 -0
  76. package/dist/components/SpecifyLearnerField.js.map +1 -0
  77. package/dist/components/messages.d.ts +108 -0
  78. package/dist/components/messages.js +110 -0
  79. package/dist/components/messages.js.map +1 -0
  80. package/dist/constants.d.ts +1 -0
  81. package/dist/constants.js +2 -0
  82. package/dist/constants.js.map +1 -0
  83. package/dist/courseInfo/CourseInfoPage.d.ts +2 -0
  84. package/dist/courseInfo/CourseInfoPage.js +7 -0
  85. package/dist/courseInfo/CourseInfoPage.js.map +1 -0
  86. package/dist/courseInfo/components/EnrollmentSummary/EnrollmentCounter.d.ts +8 -0
  87. package/dist/courseInfo/components/EnrollmentSummary/EnrollmentCounter.js +13 -0
  88. package/dist/courseInfo/components/EnrollmentSummary/EnrollmentCounter.js.map +1 -0
  89. package/dist/courseInfo/components/EnrollmentSummary/EnrollmentSummary.d.ts +2 -0
  90. package/dist/courseInfo/components/EnrollmentSummary/EnrollmentSummary.js +24 -0
  91. package/dist/courseInfo/components/EnrollmentSummary/EnrollmentSummary.js.map +1 -0
  92. package/dist/courseInfo/components/EnrollmentSummary/index.d.ts +2 -0
  93. package/dist/courseInfo/components/EnrollmentSummary/index.js +3 -0
  94. package/dist/courseInfo/components/EnrollmentSummary/index.js.map +1 -0
  95. package/dist/courseInfo/components/EnrollmentSummary/messages.d.ts +83 -0
  96. package/dist/courseInfo/components/EnrollmentSummary/messages.js +85 -0
  97. package/dist/courseInfo/components/EnrollmentSummary/messages.js.map +1 -0
  98. package/dist/courseInfo/components/EnrollmentSummary/utils.d.ts +1 -0
  99. package/dist/courseInfo/components/EnrollmentSummary/utils.js +9 -0
  100. package/dist/courseInfo/components/EnrollmentSummary/utils.js.map +1 -0
  101. package/dist/courseInfo/components/generalCourseInfo/GeneralCourseInfo.d.ts +2 -0
  102. package/dist/courseInfo/components/generalCourseInfo/GeneralCourseInfo.js +46 -0
  103. package/dist/courseInfo/components/generalCourseInfo/GeneralCourseInfo.js.map +1 -0
  104. package/dist/courseInfo/components/generalCourseInfo/StatusBadge.d.ts +5 -0
  105. package/dist/courseInfo/components/generalCourseInfo/StatusBadge.js +15 -0
  106. package/dist/courseInfo/components/generalCourseInfo/StatusBadge.js.map +1 -0
  107. package/dist/courseInfo/components/generalCourseInfo/index.d.ts +1 -0
  108. package/dist/courseInfo/components/generalCourseInfo/index.js +2 -0
  109. package/dist/courseInfo/components/generalCourseInfo/index.js.map +1 -0
  110. package/dist/courseInfo/components/generalCourseInfo/messages.d.ts +8 -0
  111. package/dist/courseInfo/components/generalCourseInfo/messages.js +10 -0
  112. package/dist/courseInfo/components/generalCourseInfo/messages.js.map +1 -0
  113. package/dist/courseInfo/messages.d.ts +8 -0
  114. package/dist/courseInfo/messages.js +10 -0
  115. package/dist/courseInfo/messages.js.map +1 -0
  116. package/dist/courseInfo/types.d.ts +27 -0
  117. package/dist/courseInfo/types.js +2 -0
  118. package/dist/courseInfo/types.js.map +1 -0
  119. package/dist/courseTeam/CourseTeamPage.d.ts +2 -0
  120. package/dist/courseTeam/CourseTeamPage.js +6 -0
  121. package/dist/courseTeam/CourseTeamPage.js.map +1 -0
  122. package/dist/data/api.d.ts +14 -0
  123. package/dist/data/api.js +33 -0
  124. package/dist/data/api.js.map +1 -0
  125. package/dist/data/apiHook.d.ts +4 -0
  126. package/dist/data/apiHook.js +28 -0
  127. package/dist/data/apiHook.js.map +1 -0
  128. package/dist/data/queryKeys.d.ts +8 -0
  129. package/dist/data/queryKeys.js +10 -0
  130. package/dist/data/queryKeys.js.map +1 -0
  131. package/dist/dataDownloads/DataDownloadsPage.d.ts +2 -0
  132. package/dist/dataDownloads/DataDownloadsPage.js +162 -0
  133. package/dist/dataDownloads/DataDownloadsPage.js.map +1 -0
  134. package/dist/dataDownloads/components/DataDownloadTable.d.ts +8 -0
  135. package/dist/dataDownloads/components/DataDownloadTable.js +42 -0
  136. package/dist/dataDownloads/components/DataDownloadTable.js.map +1 -0
  137. package/dist/dataDownloads/components/DownloadLinkCell.d.ts +6 -0
  138. package/dist/dataDownloads/components/DownloadLinkCell.js +13 -0
  139. package/dist/dataDownloads/components/DownloadLinkCell.js.map +1 -0
  140. package/dist/dataDownloads/components/GenerateReports.d.ts +8 -0
  141. package/dist/dataDownloads/components/GenerateReports.js +20 -0
  142. package/dist/dataDownloads/components/GenerateReports.js.map +1 -0
  143. package/dist/dataDownloads/components/ReportNameCell.d.ts +3 -0
  144. package/dist/dataDownloads/components/ReportNameCell.js +6 -0
  145. package/dist/dataDownloads/components/ReportNameCell.js.map +1 -0
  146. package/dist/dataDownloads/data/api.d.ts +2 -0
  147. package/dist/dataDownloads/data/api.js +23 -0
  148. package/dist/dataDownloads/data/api.js.map +1 -0
  149. package/dist/dataDownloads/data/apiHook.d.ts +7 -0
  150. package/dist/dataDownloads/data/apiHook.js +22 -0
  151. package/dist/dataDownloads/data/apiHook.js.map +1 -0
  152. package/dist/dataDownloads/data/queryKeys.d.ts +5 -0
  153. package/dist/dataDownloads/data/queryKeys.js +7 -0
  154. package/dist/dataDownloads/data/queryKeys.js.map +1 -0
  155. package/dist/dataDownloads/messages.d.ts +338 -0
  156. package/dist/dataDownloads/messages.js +341 -0
  157. package/dist/dataDownloads/messages.js.map +1 -0
  158. package/dist/dataDownloads/types.d.ts +8 -0
  159. package/dist/dataDownloads/types.js +2 -0
  160. package/dist/dataDownloads/types.js.map +1 -0
  161. package/dist/dataDownloads/utils.d.ts +26 -0
  162. package/dist/dataDownloads/utils.js +49 -0
  163. package/dist/dataDownloads/utils.js.map +1 -0
  164. package/dist/dateExtensions/DateExtensionsPage.d.ts +2 -0
  165. package/dist/dateExtensions/DateExtensionsPage.js +87 -0
  166. package/dist/dateExtensions/DateExtensionsPage.js.map +1 -0
  167. package/dist/dateExtensions/components/AddExtensionModal.d.ts +13 -0
  168. package/dist/dateExtensions/components/AddExtensionModal.js +34 -0
  169. package/dist/dateExtensions/components/AddExtensionModal.js.map +1 -0
  170. package/dist/dateExtensions/components/DateExtensionsList.d.ts +7 -0
  171. package/dist/dateExtensions/components/DateExtensionsList.js +103 -0
  172. package/dist/dateExtensions/components/DateExtensionsList.js.map +1 -0
  173. package/dist/dateExtensions/components/ResetExtensionsModal.d.ts +10 -0
  174. package/dist/dateExtensions/components/ResetExtensionsModal.js +10 -0
  175. package/dist/dateExtensions/components/ResetExtensionsModal.js.map +1 -0
  176. package/dist/dateExtensions/components/SelectGradedSubsection.d.ts +8 -0
  177. package/dist/dateExtensions/components/SelectGradedSubsection.js +15 -0
  178. package/dist/dateExtensions/components/SelectGradedSubsection.js.map +1 -0
  179. package/dist/dateExtensions/data/api.d.ts +6 -0
  180. package/dist/dateExtensions/data/api.js +40 -0
  181. package/dist/dateExtensions/data/api.js.map +1 -0
  182. package/dist/dateExtensions/data/apiHook.d.ts +11 -0
  183. package/dist/dateExtensions/data/apiHook.js +31 -0
  184. package/dist/dateExtensions/data/apiHook.js.map +1 -0
  185. package/dist/dateExtensions/data/queryKeys.d.ts +10 -0
  186. package/dist/dateExtensions/data/queryKeys.js +17 -0
  187. package/dist/dateExtensions/data/queryKeys.js.map +1 -0
  188. package/dist/dateExtensions/messages.d.ts +128 -0
  189. package/dist/dateExtensions/messages.js +130 -0
  190. package/dist/dateExtensions/messages.js.map +1 -0
  191. package/dist/dateExtensions/types.d.ts +24 -0
  192. package/dist/dateExtensions/types.js +2 -0
  193. package/dist/dateExtensions/types.js.map +1 -0
  194. package/dist/enrollments/EnrollmentsPage.d.ts +2 -0
  195. package/dist/enrollments/EnrollmentsPage.js +32 -0
  196. package/dist/enrollments/EnrollmentsPage.js.map +1 -0
  197. package/dist/enrollments/components/EnrollmentStatusModal.d.ts +6 -0
  198. package/dist/enrollments/components/EnrollmentStatusModal.js +23 -0
  199. package/dist/enrollments/components/EnrollmentStatusModal.js.map +1 -0
  200. package/dist/enrollments/components/EnrollmentsList.d.ts +6 -0
  201. package/dist/enrollments/components/EnrollmentsList.js +99 -0
  202. package/dist/enrollments/components/EnrollmentsList.js.map +1 -0
  203. package/dist/enrollments/components/UnenrollModal.d.ts +8 -0
  204. package/dist/enrollments/components/UnenrollModal.js +7 -0
  205. package/dist/enrollments/components/UnenrollModal.js.map +1 -0
  206. package/dist/enrollments/data/api.d.ts +4 -0
  207. package/dist/enrollments/data/api.js +32 -0
  208. package/dist/enrollments/data/api.js.map +1 -0
  209. package/dist/enrollments/data/apiHook.d.ts +3 -0
  210. package/dist/enrollments/data/apiHook.js +14 -0
  211. package/dist/enrollments/data/apiHook.js.map +1 -0
  212. package/dist/enrollments/data/queryKeys.d.ts +7 -0
  213. package/dist/enrollments/data/queryKeys.js +8 -0
  214. package/dist/enrollments/data/queryKeys.js.map +1 -0
  215. package/dist/enrollments/messages.d.ts +108 -0
  216. package/dist/enrollments/messages.js +110 -0
  217. package/dist/enrollments/messages.js.map +1 -0
  218. package/dist/enrollments/types.d.ts +15 -0
  219. package/dist/enrollments/types.js +2 -0
  220. package/dist/enrollments/types.js.map +1 -0
  221. package/dist/grading/GradingPage.d.ts +2 -0
  222. package/dist/grading/GradingPage.js +6 -0
  223. package/dist/grading/GradingPage.js.map +1 -0
  224. package/dist/hooks/useDebouncedFilter.d.ts +16 -0
  225. package/dist/hooks/useDebouncedFilter.js +27 -0
  226. package/dist/hooks/useDebouncedFilter.js.map +1 -0
  227. package/dist/i18n/index.d.ts +25 -0
  228. package/dist/i18n/index.js +26 -0
  229. package/dist/i18n/index.js.map +1 -0
  230. package/dist/index.d.ts +3 -0
  231. package/dist/index.js +4 -0
  232. package/dist/index.js.map +1 -0
  233. package/dist/instructorNav/InstructorNav.d.ts +8 -0
  234. package/dist/instructorNav/InstructorNav.js +42 -0
  235. package/dist/instructorNav/InstructorNav.js.map +1 -0
  236. package/dist/openResponses/OpenResponsesPage.d.ts +2 -0
  237. package/dist/openResponses/OpenResponsesPage.js +8 -0
  238. package/dist/openResponses/OpenResponsesPage.js.map +1 -0
  239. package/dist/openResponses/components/DetailAssessmentsList.d.ts +2 -0
  240. package/dist/openResponses/components/DetailAssessmentsList.js +44 -0
  241. package/dist/openResponses/components/DetailAssessmentsList.js.map +1 -0
  242. package/dist/openResponses/components/OpenResponsesSummary.d.ts +2 -0
  243. package/dist/openResponses/components/OpenResponsesSummary.js +30 -0
  244. package/dist/openResponses/components/OpenResponsesSummary.js.map +1 -0
  245. package/dist/openResponses/data/api.d.ts +4 -0
  246. package/dist/openResponses/data/api.js +23 -0
  247. package/dist/openResponses/data/api.js.map +1 -0
  248. package/dist/openResponses/data/apiHook.d.ts +2 -0
  249. package/dist/openResponses/data/apiHook.js +14 -0
  250. package/dist/openResponses/data/apiHook.js.map +1 -0
  251. package/dist/openResponses/data/queryKeys.d.ts +6 -0
  252. package/dist/openResponses/data/queryKeys.js +8 -0
  253. package/dist/openResponses/data/queryKeys.js.map +1 -0
  254. package/dist/openResponses/messages.d.ts +83 -0
  255. package/dist/openResponses/messages.js +85 -0
  256. package/dist/openResponses/messages.js.map +1 -0
  257. package/dist/openResponses/types.d.ts +12 -0
  258. package/dist/openResponses/types.js +2 -0
  259. package/dist/openResponses/types.js.map +1 -0
  260. package/dist/pageWrapper/PageWrapper.d.ts +4 -0
  261. package/dist/pageWrapper/PageWrapper.js +11 -0
  262. package/dist/pageWrapper/PageWrapper.js.map +1 -0
  263. package/dist/pageWrapper/messages.d.ts +8 -0
  264. package/dist/pageWrapper/messages.js +10 -0
  265. package/dist/pageWrapper/messages.js.map +1 -0
  266. package/dist/providers/AlertProvider.d.ts +41 -0
  267. package/dist/providers/AlertProvider.js +117 -0
  268. package/dist/providers/AlertProvider.js.map +1 -0
  269. package/dist/providers/QueryProvider.d.ts +6 -0
  270. package/dist/providers/QueryProvider.js +16 -0
  271. package/dist/providers/QueryProvider.js.map +1 -0
  272. package/dist/providers.d.ts +3 -0
  273. package/dist/providers.js +8 -0
  274. package/dist/providers.js.map +1 -0
  275. package/dist/routes.d.ts +20 -0
  276. package/dist/routes.js +72 -0
  277. package/dist/routes.js.map +1 -0
  278. package/dist/slots/PlaceholderSlot/PlaceholderSlot.d.ts +1 -0
  279. package/dist/slots/PlaceholderSlot/PlaceholderSlot.js +6 -0
  280. package/dist/slots/PlaceholderSlot/PlaceholderSlot.js.map +1 -0
  281. package/dist/slots/SlotUtils.d.ts +3 -0
  282. package/dist/slots/SlotUtils.js +17 -0
  283. package/dist/slots/SlotUtils.js.map +1 -0
  284. package/dist/slots.d.ts +3 -0
  285. package/dist/slots.js +3 -0
  286. package/dist/slots.js.map +1 -0
  287. package/dist/specialExams/SpecialExamsPage.d.ts +2 -0
  288. package/dist/specialExams/SpecialExamsPage.js +6 -0
  289. package/dist/specialExams/SpecialExamsPage.js.map +1 -0
  290. package/dist/testUtils.d.ts +4 -0
  291. package/dist/testUtils.js +24 -0
  292. package/dist/testUtils.js.map +1 -0
  293. package/dist/types/index.d.ts +40 -0
  294. package/dist/types/index.js +4 -0
  295. package/dist/types/index.js.map +1 -0
  296. package/dist/utils/formatters.d.ts +1 -0
  297. package/dist/utils/formatters.js +12 -0
  298. package/dist/utils/formatters.js.map +1 -0
  299. package/package.json +79 -0
@@ -0,0 +1,108 @@
1
+ declare const messages: {
2
+ enrollmentsPageTitle: {
3
+ id: string;
4
+ defaultMessage: string;
5
+ description: string;
6
+ };
7
+ addBetaTesters: {
8
+ id: string;
9
+ defaultMessage: string;
10
+ description: string;
11
+ };
12
+ enrollLearners: {
13
+ id: string;
14
+ defaultMessage: string;
15
+ description: string;
16
+ };
17
+ checkEnrollmentStatus: {
18
+ id: string;
19
+ defaultMessage: string;
20
+ description: string;
21
+ };
22
+ username: {
23
+ id: string;
24
+ defaultMessage: string;
25
+ description: string;
26
+ };
27
+ fullName: {
28
+ id: string;
29
+ defaultMessage: string;
30
+ description: string;
31
+ };
32
+ email: {
33
+ id: string;
34
+ defaultMessage: string;
35
+ description: string;
36
+ };
37
+ track: {
38
+ id: string;
39
+ defaultMessage: string;
40
+ description: string;
41
+ };
42
+ betaTester: {
43
+ id: string;
44
+ defaultMessage: string;
45
+ description: string;
46
+ };
47
+ actions: {
48
+ id: string;
49
+ defaultMessage: string;
50
+ description: string;
51
+ };
52
+ unenrollButton: {
53
+ id: string;
54
+ defaultMessage: string;
55
+ description: string;
56
+ };
57
+ trueLabel: {
58
+ id: string;
59
+ defaultMessage: string;
60
+ description: string;
61
+ };
62
+ addLearnerInstructions: {
63
+ id: string;
64
+ defaultMessage: string;
65
+ description: string;
66
+ };
67
+ enrollLearnersPlaceholder: {
68
+ id: string;
69
+ defaultMessage: string;
70
+ description: string;
71
+ };
72
+ closeButton: {
73
+ id: string;
74
+ defaultMessage: string;
75
+ description: string;
76
+ };
77
+ searchPlaceholder: {
78
+ id: string;
79
+ defaultMessage: string;
80
+ description: string;
81
+ };
82
+ noEnrollments: {
83
+ id: string;
84
+ defaultMessage: string;
85
+ description: string;
86
+ };
87
+ changeBetaTesterStatus: {
88
+ id: string;
89
+ defaultMessage: string;
90
+ description: string;
91
+ };
92
+ allEnrollees: {
93
+ id: string;
94
+ defaultMessage: string;
95
+ description: string;
96
+ };
97
+ betaTesters: {
98
+ id: string;
99
+ defaultMessage: string;
100
+ description: string;
101
+ };
102
+ nonBetaTesters: {
103
+ id: string;
104
+ defaultMessage: string;
105
+ description: string;
106
+ };
107
+ };
108
+ export default messages;
@@ -0,0 +1,110 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+ const messages = defineMessages({
3
+ enrollmentsPageTitle: {
4
+ id: 'instruct.enrollments.page.title',
5
+ defaultMessage: 'Enrollment Management',
6
+ description: 'Title for the enrollments page',
7
+ },
8
+ addBetaTesters: {
9
+ id: 'instruct.enrollments.addBetaTesters',
10
+ defaultMessage: 'Add Beta Testers',
11
+ description: 'Button label for adding beta testers',
12
+ },
13
+ enrollLearners: {
14
+ id: 'instruct.enrollments.enrollLearners',
15
+ defaultMessage: 'Enroll Learners',
16
+ description: 'Button label for enrolling learners',
17
+ },
18
+ checkEnrollmentStatus: {
19
+ id: 'instruct.enrollments.checkEnrollmentStatus',
20
+ defaultMessage: 'Check Enrollment Status',
21
+ description: 'Check enrollment status modal title and alt for icon button',
22
+ },
23
+ username: {
24
+ id: 'instruct.enrollments.username',
25
+ defaultMessage: 'Username',
26
+ description: 'Column header for username in enrollments list',
27
+ },
28
+ fullName: {
29
+ id: 'instruct.enrollments.fullName',
30
+ defaultMessage: 'Name',
31
+ description: 'Column header for full name in enrollments list',
32
+ },
33
+ email: {
34
+ id: 'instruct.enrollments.email',
35
+ defaultMessage: 'Email',
36
+ description: 'Column header for email in enrollments list',
37
+ },
38
+ track: {
39
+ id: 'instruct.enrollments.track',
40
+ defaultMessage: 'Track',
41
+ description: 'Column header for track in enrollments list',
42
+ },
43
+ betaTester: {
44
+ id: 'instruct.enrollments.betaTester',
45
+ defaultMessage: 'Beta Tester',
46
+ description: 'Column header for beta tester status in enrollments list',
47
+ },
48
+ actions: {
49
+ id: 'instruct.enrollments.actions',
50
+ defaultMessage: 'Actions',
51
+ description: 'Column header for actions in enrollments list',
52
+ },
53
+ unenrollButton: {
54
+ id: 'instruct.enrollments.unenrollButton',
55
+ defaultMessage: 'Unenroll',
56
+ description: 'Button label for unenrolling a learner',
57
+ },
58
+ trueLabel: {
59
+ id: 'instruct.enrollments.trueLabel',
60
+ defaultMessage: 'True',
61
+ description: 'Label for true boolean value',
62
+ },
63
+ addLearnerInstructions: {
64
+ id: 'instruct.enrollments.checkEnrollmentStatusModal.addLearnerInstructions',
65
+ defaultMessage: 'Learner’s My Open edX email address or username',
66
+ description: 'Instructions for enroll learners to the course',
67
+ },
68
+ enrollLearnersPlaceholder: {
69
+ id: 'instruct.enrollments.checkEnrollmentStatusModal.enrollLearnersPlaceholder',
70
+ defaultMessage: 'Learner email address or username',
71
+ description: 'Placeholder text for enrolling learners textarea',
72
+ },
73
+ closeButton: {
74
+ id: 'instruct.enrollments.checkEnrollmentStatusModal.closeButton',
75
+ defaultMessage: 'Close',
76
+ description: 'Label for close button in modals',
77
+ },
78
+ searchPlaceholder: {
79
+ id: 'instruct.enrollments.searchPlaceholder',
80
+ defaultMessage: 'Search enrollments',
81
+ description: 'Placeholder for the search input in enrollments list',
82
+ },
83
+ noEnrollments: {
84
+ id: 'instruct.enrollments.noEnrollments',
85
+ defaultMessage: 'No enrollments found',
86
+ description: 'Message displayed when there are no enrollments to show',
87
+ },
88
+ changeBetaTesterStatus: {
89
+ id: 'instruct.enrollments.changeBetaTesterStatus',
90
+ defaultMessage: 'Change Beta Tester Status',
91
+ description: 'Alt text for change beta tester status icon button',
92
+ },
93
+ allEnrollees: {
94
+ id: 'instruct.enrollments.allEnrollees',
95
+ defaultMessage: 'All Enrollees',
96
+ description: 'Option for showing all enrollees in beta tester filter',
97
+ },
98
+ betaTesters: {
99
+ id: 'instruct.enrollments.betaTesters',
100
+ defaultMessage: 'Beta Testers',
101
+ description: 'Option for showing only beta testers in beta tester filter',
102
+ },
103
+ nonBetaTesters: {
104
+ id: 'instruct.enrollments.nonBetaTesters',
105
+ defaultMessage: 'Non-Beta Testers',
106
+ description: 'Option for showing only non-beta testers in beta tester filter',
107
+ },
108
+ });
109
+ export default messages;
110
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,15 @@
1
+ import { PaginationParams } from '../types';
2
+ export interface EnrollmentStatusResponse {
3
+ enrollmentStatus: string;
4
+ }
5
+ export interface Learner {
6
+ username: string;
7
+ fullName: string;
8
+ email: string;
9
+ mode: string;
10
+ isBetaTester: boolean;
11
+ }
12
+ export interface EnrollmentsParams extends PaginationParams {
13
+ emailOrUsername: string;
14
+ isBetaTester: string;
15
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/enrollments/types.ts"],"names":[],"mappings":"","sourcesContent":["import { PaginationParams } from '@src/types';\n\nexport interface EnrollmentStatusResponse {\n enrollmentStatus: string,\n}\n\nexport interface Learner {\n username: string,\n fullName: string,\n email: string,\n mode: string,\n isBetaTester: boolean,\n}\n\nexport interface EnrollmentsParams extends PaginationParams {\n emailOrUsername: string,\n isBetaTester: string,\n}\n"]}
@@ -0,0 +1,2 @@
1
+ declare const GradingPage: () => import("react/jsx-runtime").JSX.Element;
2
+ export default GradingPage;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const GradingPage = () => {
3
+ return (_jsx("div", { children: _jsx("h3", { children: "Grading" }) }));
4
+ };
5
+ export default GradingPage;
6
+ //# sourceMappingURL=GradingPage.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,16 @@
1
+ interface UseDebouncedFilterProps {
2
+ filterValue: string;
3
+ setFilter: (value: string) => void;
4
+ delay?: number;
5
+ }
6
+ /**
7
+ * Hook for handling debounced filter input with automatic synchronization
8
+ * @param filterValue - Current filter value from parent component
9
+ * @param setFilter - Function to update the filter in parent component
10
+ * @param delay - Debounce delay in milliseconds (default: 600ms)
11
+ */
12
+ export declare const useDebouncedFilter: ({ filterValue, setFilter, delay }: UseDebouncedFilterProps) => {
13
+ inputValue: string;
14
+ handleChange: (value: string) => void;
15
+ };
16
+ export {};
@@ -0,0 +1,27 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { debounce } from 'lodash';
3
+ /**
4
+ * Hook for handling debounced filter input with automatic synchronization
5
+ * @param filterValue - Current filter value from parent component
6
+ * @param setFilter - Function to update the filter in parent component
7
+ * @param delay - Debounce delay in milliseconds (default: 600ms)
8
+ */
9
+ export const useDebouncedFilter = ({ filterValue, setFilter, delay = 600 }) => {
10
+ const [inputValue, setInputValue] = useState(filterValue || '');
11
+ // Debounced function to update the filter
12
+ // Added 600ms delay after testing on 3G network - good balance between responsiveness and reducing API calls
13
+ // eslint-disable-next-line react-hooks/exhaustive-deps
14
+ const debouncedSetFilter = useCallback(debounce((value) => setFilter(value), delay), [setFilter, delay]);
15
+ useEffect(() => {
16
+ setInputValue(filterValue || '');
17
+ }, [filterValue]);
18
+ const handleChange = (value) => {
19
+ setInputValue(value);
20
+ debouncedSetFilter(value);
21
+ };
22
+ return {
23
+ inputValue,
24
+ handleChange,
25
+ };
26
+ };
27
+ //# sourceMappingURL=useDebouncedFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDebouncedFilter.js","sourceRoot":"","sources":["../../src/hooks/useDebouncedFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAQlC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,WAAW,EACX,SAAS,EACT,KAAK,GAAG,GAAG,EACa,EAAE,EAAE;IAC5B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAEhE,0CAA0C;IAC1C,6GAA6G;IAC7G,uDAAuD;IACvD,MAAM,kBAAkB,GAAG,WAAW,CACpC,QAAQ,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EACpD,CAAC,SAAS,EAAE,KAAK,CAAC,CACnB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;QACrC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO;QACL,UAAU;QACV,YAAY;KACb,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { debounce } from 'lodash';\n\ninterface UseDebouncedFilterProps {\n filterValue: string,\n setFilter: (value: string) => void,\n delay?: number,\n}\n\n/**\n * Hook for handling debounced filter input with automatic synchronization\n * @param filterValue - Current filter value from parent component\n * @param setFilter - Function to update the filter in parent component\n * @param delay - Debounce delay in milliseconds (default: 600ms)\n */\nexport const useDebouncedFilter = ({\n filterValue,\n setFilter,\n delay = 600\n}: UseDebouncedFilterProps) => {\n const [inputValue, setInputValue] = useState(filterValue || '');\n\n // Debounced function to update the filter\n // Added 600ms delay after testing on 3G network - good balance between responsiveness and reducing API calls\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const debouncedSetFilter = useCallback(\n debounce((value: string) => setFilter(value), delay),\n [setFilter, delay]\n );\n\n useEffect(() => {\n setInputValue(filterValue || '');\n }, [filterValue]);\n\n const handleChange = (value: string) => {\n setInputValue(value);\n debouncedSetFilter(value);\n };\n\n return {\n inputValue,\n handleChange,\n };\n};\n"]}
@@ -0,0 +1,25 @@
1
+ declare const _default: {
2
+ ar: {};
3
+ 'zh-hk': {};
4
+ 'zh-cn': {};
5
+ uk: {};
6
+ 'tr-tr': {};
7
+ th: {};
8
+ te: {};
9
+ ru: {};
10
+ 'pt-pt': {};
11
+ 'pt-br': {};
12
+ 'it-it': {};
13
+ id: {};
14
+ hi: {};
15
+ he: {};
16
+ 'fr-ca': {};
17
+ fa: {};
18
+ 'es-es': {};
19
+ 'es-419': {};
20
+ el: {};
21
+ 'de-de': {};
22
+ da: {};
23
+ bo: {};
24
+ };
25
+ export default _default;
@@ -0,0 +1,26 @@
1
+ // Placeholder be overridden by `make pull_translations`
2
+ export default {
3
+ ar: {},
4
+ 'zh-hk': {},
5
+ 'zh-cn': {},
6
+ uk: {},
7
+ 'tr-tr': {},
8
+ th: {},
9
+ te: {},
10
+ ru: {},
11
+ 'pt-pt': {},
12
+ 'pt-br': {},
13
+ 'it-it': {},
14
+ id: {},
15
+ hi: {},
16
+ he: {},
17
+ 'fr-ca': {},
18
+ fa: {},
19
+ 'es-es': {},
20
+ 'es-419': {},
21
+ el: {},
22
+ 'de-de': {},
23
+ da: {},
24
+ bo: {},
25
+ };
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.js"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,eAAe;IACb,EAAE,EAAE,EAAE;IACN,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,EAAE,EAAE,EAAE;IACN,OAAO,EAAE,EAAE;IACX,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,OAAO,EAAE,EAAE;IACX,EAAE,EAAE,EAAE;IACN,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,EAAE,EAAE,EAAE;IACN,OAAO,EAAE,EAAE;IACX,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;CACP,CAAC","sourcesContent":["// Placeholder be overridden by `make pull_translations`\nexport default {\n ar: {},\n 'zh-hk': {},\n 'zh-cn': {},\n uk: {},\n 'tr-tr': {},\n th: {},\n te: {},\n ru: {},\n 'pt-pt': {},\n 'pt-br': {},\n 'it-it': {},\n id: {},\n hi: {},\n he: {},\n 'fr-ca': {},\n fa: {},\n 'es-es': {},\n 'es-419': {},\n el: {},\n 'de-de': {},\n da: {},\n bo: {},\n};\n"]}
@@ -0,0 +1,3 @@
1
+ export { default as instructApp } from './app';
2
+ export { default as instructRoutes } from './routes';
3
+ export { default as instructMessages } from './i18n';
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { default as instructApp } from './app';
2
+ export { default as instructRoutes } from './routes';
3
+ export { default as instructMessages } from './i18n';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,QAAQ,CAAC","sourcesContent":["export { default as instructApp } from './app';\nexport { default as instructRoutes } from './routes';\nexport { default as instructMessages } from './i18n';\n"]}
@@ -0,0 +1,8 @@
1
+ export interface TabProps {
2
+ tabId: string;
3
+ url: string;
4
+ title: string;
5
+ sortOrder: number;
6
+ }
7
+ declare const InstructorNav: () => import("react/jsx-runtime").JSX.Element | null;
8
+ export default InstructorNav;
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { useParams, Link } from 'react-router-dom';
4
+ import { Nav, Navbar, Skeleton } from '@openedx/paragon';
5
+ import { useCourseInfo } from '../data/apiHook';
6
+ import { useAlert } from '../providers/AlertProvider';
7
+ import { useWidgetProps } from '../slots/SlotUtils';
8
+ const InstructorNav = () => {
9
+ const { courseId = '', tabId = '' } = useParams();
10
+ const { data: courseInfo, isLoading } = useCourseInfo(courseId);
11
+ const widgetPropsArray = useWidgetProps('org.openedx.frontend.slot.instructor.tabs.v1');
12
+ const { clearAlerts } = useAlert();
13
+ const sortedTabs = useMemo(() => {
14
+ var _a;
15
+ if (isLoading)
16
+ return [];
17
+ const apiTabs = (_a = courseInfo === null || courseInfo === void 0 ? void 0 : courseInfo.tabs) !== null && _a !== void 0 ? _a : [];
18
+ const tabMap = new Map();
19
+ // Adding tabs from API and from slot into a map to avoid duplicates
20
+ apiTabs.forEach(tab => {
21
+ tabMap.set(tab.tabId, tab);
22
+ });
23
+ widgetPropsArray.forEach(slotTab => {
24
+ // If the slotTab doesn't have a tabId or title, we can't render it properly, so we skip it.
25
+ if (!slotTab.tabId || !slotTab.title) {
26
+ return;
27
+ }
28
+ tabMap.set(slotTab.tabId, slotTab);
29
+ });
30
+ const allTabs = Array.from(tabMap.values());
31
+ // Tabs are sorted by sortOrder, with a fallback to 1000 to be placed at the end for tabs that don't have sortOrder defined (to avoid NaN issues)
32
+ return allTabs.sort((a, b) => { var _a, _b; return ((_a = a.sortOrder) !== null && _a !== void 0 ? _a : 1000) - ((_b = b.sortOrder) !== null && _b !== void 0 ? _b : 1000); });
33
+ }, [courseInfo === null || courseInfo === void 0 ? void 0 : courseInfo.tabs, isLoading, widgetPropsArray]);
34
+ if (isLoading) {
35
+ return _jsx(Skeleton, { className: "lead" });
36
+ }
37
+ if (sortedTabs.length === 0)
38
+ return null;
39
+ return (_jsx(Navbar, { expand: "md", className: "py-0", children: _jsxs(Nav, { variant: "tabs", activeKey: tabId, children: [_jsx(Navbar.Toggle, { "aria-controls": "instructor-nav" }), _jsx(Navbar.Collapse, { id: "instructor-nav", children: sortedTabs.map((tab) => (_jsx(Nav.Item, { children: _jsx(Nav.Link, { as: Link, to: tab.url, active: tab.tabId === tabId, onClick: () => clearAlerts(), children: tab.title }) }, tab.tabId))) })] }) }));
40
+ };
41
+ export default InstructorNav;
42
+ //# sourceMappingURL=InstructorNav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstructorNav.js","sourceRoot":"","sources":["../../src/instructorNav/InstructorNav.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react';\nimport { useParams, Link } from 'react-router-dom';\nimport { Nav, Navbar, Skeleton } from '@openedx/paragon';\nimport { useCourseInfo } from '@src/data/apiHook';\nimport { useAlert } from '@src/providers/AlertProvider';\nimport { useWidgetProps } from '../slots/SlotUtils';\n\nexport interface TabProps {\n tabId: string,\n url: string,\n title: string,\n sortOrder: number,\n}\n\nconst InstructorNav = () => {\n const { courseId = '', tabId = '' } = useParams<{ courseId: string, tabId?: string }>();\n const { data: courseInfo, isLoading } = useCourseInfo(courseId);\n const widgetPropsArray = useWidgetProps('org.openedx.frontend.slot.instructor.tabs.v1') as TabProps[];\n const { clearAlerts } = useAlert();\n\n const sortedTabs = useMemo(() => {\n if (isLoading) return [];\n const apiTabs: TabProps[] = courseInfo?.tabs ?? [];\n const tabMap = new Map<string, TabProps>();\n\n // Adding tabs from API and from slot into a map to avoid duplicates\n apiTabs.forEach(tab => {\n tabMap.set(tab.tabId, tab);\n });\n\n widgetPropsArray.forEach(slotTab => {\n // If the slotTab doesn't have a tabId or title, we can't render it properly, so we skip it.\n if (!slotTab.tabId || !slotTab.title) {\n return;\n }\n\n tabMap.set(slotTab.tabId, slotTab);\n });\n\n const allTabs = Array.from(tabMap.values());\n\n // Tabs are sorted by sortOrder, with a fallback to 1000 to be placed at the end for tabs that don't have sortOrder defined (to avoid NaN issues)\n return allTabs.sort((a, b) => (a.sortOrder ?? 1000) - (b.sortOrder ?? 1000));\n }, [courseInfo?.tabs, isLoading, widgetPropsArray]);\n\n if (isLoading) {\n return <Skeleton className=\"lead\" />;\n }\n\n if (sortedTabs.length === 0) return null;\n\n return (\n <Navbar expand=\"md\" className=\"py-0\">\n <Nav\n variant=\"tabs\"\n activeKey={tabId}\n >\n <Navbar.Toggle aria-controls=\"instructor-nav\" />\n <Navbar.Collapse id=\"instructor-nav\">\n {\n sortedTabs.map((tab) => (\n <Nav.Item key={tab.tabId}>\n <Nav.Link\n as={Link}\n to={tab.url}\n active={tab.tabId === tabId}\n onClick={() => clearAlerts()}\n >\n {tab.title}\n </Nav.Link>\n </Nav.Item>\n ))\n }\n </Navbar.Collapse>\n </Nav>\n </Navbar>\n );\n};\n\nexport default InstructorNav;\n"]}
@@ -0,0 +1,2 @@
1
+ declare const OpenResponsesPage: () => import("react/jsx-runtime").JSX.Element;
2
+ export default OpenResponsesPage;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import OpenResponsesSummary from '../openResponses/components/OpenResponsesSummary';
3
+ import DetailAssessmentsList from '../openResponses/components/DetailAssessmentsList';
4
+ const OpenResponsesPage = () => {
5
+ return (_jsxs(_Fragment, { children: [_jsx(OpenResponsesSummary, {}), _jsx(DetailAssessmentsList, {})] }));
6
+ };
7
+ export default OpenResponsesPage;
8
+ //# sourceMappingURL=OpenResponsesPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenResponsesPage.js","sourceRoot":"","sources":["../../src/openResponses/OpenResponsesPage.tsx"],"names":[],"mappings":";AAAA,OAAO,oBAAoB,MAAM,oDAAoD,CAAC;AACtF,OAAO,qBAAqB,MAAM,qDAAqD,CAAC;AAExF,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAC7B,OAAO,CACL,8BACE,KAAC,oBAAoB,KAAG,EACxB,KAAC,qBAAqB,KAAG,IACxB,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC","sourcesContent":["import OpenResponsesSummary from '@src/openResponses/components/OpenResponsesSummary';\nimport DetailAssessmentsList from '@src/openResponses/components/DetailAssessmentsList';\n\nconst OpenResponsesPage = () => {\n return (\n <>\n <OpenResponsesSummary />\n <DetailAssessmentsList />\n </>\n );\n};\n\nexport default OpenResponsesPage;\n"]}
@@ -0,0 +1,2 @@
1
+ declare const DetailAssessmentsList: () => import("react/jsx-runtime").JSX.Element;
2
+ export default DetailAssessmentsList;
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } 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 { Button, DataTable } from '@openedx/paragon';
6
+ import messages from '../messages';
7
+ import { useDetailAssessmentsData } from '../data/apiHook';
8
+ const DETAILS_PAGE_SIZE = 25;
9
+ const DetailAssessmentsList = () => {
10
+ const intl = useIntl();
11
+ const { courseId } = useParams();
12
+ const [page, setPage] = useState(0);
13
+ const { data = { count: 0, results: [], numPages: 1 }, isLoading } = useDetailAssessmentsData(courseId !== null && courseId !== void 0 ? courseId : '', {
14
+ page,
15
+ pageSize: DETAILS_PAGE_SIZE
16
+ });
17
+ const tableColumns = [
18
+ { accessor: 'unitName', Header: intl.formatMessage(messages.unitName) },
19
+ { accessor: 'displayName', Header: intl.formatMessage(messages.assessment) },
20
+ { accessor: 'totalResponses', Header: intl.formatMessage(messages.totalResponses) },
21
+ { accessor: 'training', Header: intl.formatMessage(messages.training) },
22
+ { accessor: 'peer', Header: intl.formatMessage(messages.peer) },
23
+ { accessor: 'self', Header: intl.formatMessage(messages.self) },
24
+ { accessor: 'waiting', Header: intl.formatMessage(messages.waiting) },
25
+ { accessor: 'staff', Header: intl.formatMessage(messages.staff) },
26
+ { accessor: 'finalGradeReceived', Header: intl.formatMessage(messages.finalGradeReceived) },
27
+ ];
28
+ const additionalColumns = [
29
+ {
30
+ id: 'staffOraGradingUrl',
31
+ Header: intl.formatMessage(messages.staffGrader),
32
+ Cell: ({ row }) => row.original.staffOraGradingUrl && _jsx(Button, { variant: "link", size: "inline", href: row.original.staffOraGradingUrl, children: intl.formatMessage(messages.viewAndGradeResponses) }),
33
+ }
34
+ ];
35
+ const handleFetchData = (data) => {
36
+ setPage(data.pageIndex);
37
+ };
38
+ return (_jsxs("div", { className: "mt-4.5", children: [_jsx("h3", { className: "text-primary-700 mb-3", children: intl.formatMessage(messages.details) }), _jsxs(DataTable, { columns: tableColumns, additionalColumns: additionalColumns, data: data.results, fetchData: handleFetchData, initialState: {
39
+ pageIndex: page,
40
+ pageSize: DETAILS_PAGE_SIZE
41
+ }, isLoading: isLoading, isPaginated: true, itemCount: data.count, manualFilters: true, manualPagination: true, pageCount: data.numPages, pageSize: DETAILS_PAGE_SIZE, children: [_jsx(DataTable.Table, {}), _jsx(DataTable.EmptyTable, { content: intl.formatMessage(messages.noAssessmentsFoundMessage) }), _jsx(DataTable.TableFooter, {})] })] }));
42
+ };
43
+ export default DetailAssessmentsList;
44
+ //# sourceMappingURL=DetailAssessmentsList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailAssessmentsList.js","sourceRoot":"","sources":["../../../src/openResponses/components/DetailAssessmentsList.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Button, DataTable } from '@openedx/paragon';\nimport messages from '../messages';\nimport { useDetailAssessmentsData } from '../data/apiHook';\nimport { ORARecord } from '../types';\n\nconst DETAILS_PAGE_SIZE = 25;\n\ninterface DataTableFetchDataProps {\n pageIndex: number,\n}\n\nconst DetailAssessmentsList = () => {\n const intl = useIntl();\n const { courseId } = useParams();\n const [page, setPage] = useState(0);\n const { data = { count: 0, results: [], numPages: 1 }, isLoading } = useDetailAssessmentsData(courseId ?? '', {\n page,\n pageSize: DETAILS_PAGE_SIZE\n });\n\n const tableColumns = [\n { accessor: 'unitName', Header: intl.formatMessage(messages.unitName) },\n { accessor: 'displayName', Header: intl.formatMessage(messages.assessment) },\n { accessor: 'totalResponses', Header: intl.formatMessage(messages.totalResponses) },\n { accessor: 'training', Header: intl.formatMessage(messages.training) },\n { accessor: 'peer', Header: intl.formatMessage(messages.peer) },\n { accessor: 'self', Header: intl.formatMessage(messages.self) },\n { accessor: 'waiting', Header: intl.formatMessage(messages.waiting) },\n { accessor: 'staff', Header: intl.formatMessage(messages.staff) },\n { accessor: 'finalGradeReceived', Header: intl.formatMessage(messages.finalGradeReceived) },\n ];\n\n const additionalColumns = [\n {\n id: 'staffOraGradingUrl',\n Header: intl.formatMessage(messages.staffGrader),\n Cell: ({ row }: { row: { original: ORARecord } }) => row.original.staffOraGradingUrl && <Button variant=\"link\" size=\"inline\" href={row.original.staffOraGradingUrl}>{intl.formatMessage(messages.viewAndGradeResponses)}</Button>,\n }\n ];\n\n const handleFetchData = (data: DataTableFetchDataProps) => {\n setPage(data.pageIndex);\n };\n\n return (\n <div className=\"mt-4.5\">\n <h3 className=\"text-primary-700 mb-3\">{intl.formatMessage(messages.details)}</h3>\n <DataTable\n columns={tableColumns}\n additionalColumns={additionalColumns}\n data={data.results}\n fetchData={handleFetchData}\n initialState={{\n pageIndex: page,\n pageSize: DETAILS_PAGE_SIZE\n }}\n isLoading={isLoading}\n isPaginated\n itemCount={data.count}\n manualFilters\n manualPagination\n pageCount={data.numPages}\n pageSize={DETAILS_PAGE_SIZE}\n >\n <DataTable.Table />\n <DataTable.EmptyTable content={intl.formatMessage(messages.noAssessmentsFoundMessage)} />\n <DataTable.TableFooter />\n </DataTable>\n </div>\n );\n};\n\nexport default DetailAssessmentsList;\n"]}
@@ -0,0 +1,2 @@
1
+ declare const OpenResponsesSummary: () => import("react/jsx-runtime").JSX.Element;
2
+ export default OpenResponsesSummary;
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useParams } from 'react-router-dom';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import { Alert, Icon, Skeleton, Stack } from '@openedx/paragon';
5
+ import { EditNote, ViewDay } from '@openedx/paragon/icons';
6
+ import { useOpenResponsesData } from '../../openResponses/data/apiHook';
7
+ import messages from '../../openResponses/messages';
8
+ const summaryOrder = [
9
+ 'totalResponses',
10
+ 'training',
11
+ 'peer',
12
+ 'self',
13
+ 'waiting',
14
+ 'staff',
15
+ 'finalGradeReceived',
16
+ ];
17
+ const OpenResponsesSummary = () => {
18
+ const intl = useIntl();
19
+ const { courseId = '' } = useParams();
20
+ const { data = {}, isLoading, isError, error } = useOpenResponsesData(courseId);
21
+ const { totalUnits = 0, totalAssessments = 0, } = data;
22
+ return (_jsxs(_Fragment, { children: [_jsx(Alert, { variant: "danger", show: isError, className: "my-3", dismissible: true, children: error instanceof Object && 'message' in error ? String(error.message) : String(error) }), _jsx("h3", { className: "text-primary-700 mb-3", children: intl.formatMessage(messages.summaryTitle) }), _jsxs(Stack, { direction: "horizontal", gap: 3, children: [_jsxs("div", { children: [_jsx("div", { className: "x-small text-gray-500", children: _jsx("p", { className: "mb-0", children: intl.formatMessage(messages.totalUnits) }) }), isLoading ? _jsx(Skeleton, { className: "lead" })
23
+ : (_jsxs("div", { className: "d-flex align-items-center lead", children: [_jsx(Icon, { src: ViewDay, "aria-hidden": "true" }), _jsx("p", { className: "ml-2 mb-0 text-primary-500", children: totalUnits })] }))] }), _jsxs("div", { children: [_jsx("div", { className: "x-small text-gray-500", children: _jsx("p", { className: "mb-0", children: intl.formatMessage(messages.totalAssessments) }) }), isLoading ? _jsx(Skeleton, { className: "lead" })
24
+ : (_jsxs("div", { className: "d-flex align-items-center lead", children: [_jsx(Icon, { src: EditNote, size: "lg", "aria-hidden": "true" }), _jsx("p", { className: "ml-2 mb-0 text-primary-500", children: totalAssessments })] }))] })] }), _jsx("div", { className: "mt-3 row w-md-75 w-lg-50 align-items-end", children: summaryOrder.map((key) => {
25
+ var _a;
26
+ return (_jsxs("div", { className: "col", children: [_jsx("div", { className: "x-small text-gray-500", children: _jsx("p", { className: "mb-0", children: intl.formatMessage(messages[key]) }) }), _jsx("div", { className: "lead text-primary-500", children: isLoading ? (_jsx(Skeleton, {})) : (_jsx("p", { children: (_a = data[key]) !== null && _a !== void 0 ? _a : 0 })) })] }, key));
27
+ }) })] }));
28
+ };
29
+ export default OpenResponsesSummary;
30
+ //# sourceMappingURL=OpenResponsesSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenResponsesSummary.js","sourceRoot":"","sources":["../../../src/openResponses/components/OpenResponsesSummary.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Alert, Icon, Skeleton, Stack } from '@openedx/paragon';\nimport { EditNote, ViewDay } from '@openedx/paragon/icons';\nimport { useOpenResponsesData } from '@src/openResponses/data/apiHook';\nimport messages from '@src/openResponses/messages';\n\nconst summaryOrder = [\n 'totalResponses',\n 'training',\n 'peer',\n 'self',\n 'waiting',\n 'staff',\n 'finalGradeReceived',\n];\n\nconst OpenResponsesSummary = () => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const { data = {}, isLoading, isError, error } = useOpenResponsesData(courseId);\n const {\n totalUnits = 0,\n totalAssessments = 0,\n } = data;\n\n return (\n <>\n <Alert variant=\"danger\" show={isError} className=\"my-3\" dismissible>\n {error instanceof Object && 'message' in error ? String(error.message) : String(error)}\n </Alert>\n <h3 className=\"text-primary-700 mb-3\">{intl.formatMessage(messages.summaryTitle)}</h3>\n <Stack direction=\"horizontal\" gap={3}>\n <div>\n <div className=\"x-small text-gray-500\">\n <p className=\"mb-0\">{intl.formatMessage(messages.totalUnits)}</p>\n </div>\n {isLoading ? <Skeleton className=\"lead\" />\n : (\n <div className=\"d-flex align-items-center lead\">\n <Icon src={ViewDay} aria-hidden=\"true\" />\n <p className=\"ml-2 mb-0 text-primary-500\">{totalUnits}</p>\n </div>\n )}\n </div>\n <div>\n <div className=\"x-small text-gray-500\">\n <p className=\"mb-0\">{intl.formatMessage(messages.totalAssessments)}</p>\n </div>\n {isLoading ? <Skeleton className=\"lead\" />\n : (\n <div className=\"d-flex align-items-center lead\">\n <Icon src={EditNote} size=\"lg\" aria-hidden=\"true\" />\n <p className=\"ml-2 mb-0 text-primary-500\">{totalAssessments}</p>\n </div>\n )}\n </div>\n </Stack>\n <div className=\"mt-3 row w-md-75 w-lg-50 align-items-end\">\n {\n summaryOrder.map((key) => (\n <div className=\"col\" key={key}>\n <div className=\"x-small text-gray-500\">\n <p className=\"mb-0\">{intl.formatMessage(messages[key as keyof typeof messages])}</p>\n </div>\n <div className=\"lead text-primary-500\">\n {isLoading ? (\n <Skeleton />\n ) : (\n <p>\n {data[key as keyof typeof data] ?? 0}\n </p>\n )}\n </div>\n </div>\n ))\n }\n </div>\n </>\n );\n};\n\nexport default OpenResponsesSummary;\n"]}
@@ -0,0 +1,4 @@
1
+ import { ORARecord } from '../types';
2
+ import { DataList } from '../../types';
3
+ export declare const getOpenResponsesData: (courseId: string) => Promise<any>;
4
+ export declare const getDetailAssessmentsData: (courseId: string, params?: Record<string, string | number | boolean>) => Promise<DataList<ORARecord>>;
@@ -0,0 +1,23 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { getAuthenticatedHttpClient, camelCaseObject, snakeCaseObject } from '@openedx/frontend-base';
11
+ import { getApiBaseUrl } from '../../data/api';
12
+ export const getOpenResponsesData = (courseId) => __awaiter(void 0, void 0, void 0, function* () {
13
+ const url = `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/ora_summary`;
14
+ const { data } = yield getAuthenticatedHttpClient().get(url);
15
+ return camelCaseObject(data);
16
+ });
17
+ export const getDetailAssessmentsData = (courseId_1, ...args_1) => __awaiter(void 0, [courseId_1, ...args_1], void 0, function* (courseId, params = {}) {
18
+ const url = `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/ora`;
19
+ const snakeCaseParams = snakeCaseObject(params);
20
+ const { data } = yield getAuthenticatedHttpClient().get(url, { params: Object.assign(Object.assign({}, snakeCaseParams), { page: params.page + 1 }) });
21
+ return camelCaseObject(data);
22
+ });
23
+ //# sourceMappingURL=api.js.map