@openedx/frontend-app-instructor-dashboard 1.0.0-alpha.3 → 1.0.0-alpha.30

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 (270) 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 +0 -6
  5. package/dist/app.js.map +1 -1
  6. package/dist/certificates/CertificatesPage.d.ts +1 -0
  7. package/dist/certificates/CertificatesPage.js +214 -2
  8. package/dist/certificates/CertificatesPage.js.map +1 -1
  9. package/dist/certificates/CertificatesPage.scss +90 -0
  10. package/dist/certificates/components/CertificateTable.d.ts +14 -0
  11. package/dist/certificates/components/CertificateTable.js +88 -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 +11 -0
  17. package/dist/certificates/components/CertificatesToolbar.js +32 -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 +25 -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 +27 -0
  39. package/dist/certificates/components/LearnerActionModal.js.map +1 -0
  40. package/dist/certificates/components/RemoveExceptionModal.d.ts +9 -0
  41. package/dist/certificates/components/RemoveExceptionModal.js +10 -0
  42. package/dist/certificates/components/RemoveExceptionModal.js.map +1 -0
  43. package/dist/certificates/components/RemoveInvalidationModal.d.ts +9 -0
  44. package/dist/certificates/components/RemoveInvalidationModal.js +10 -0
  45. package/dist/certificates/components/RemoveInvalidationModal.js.map +1 -0
  46. package/dist/certificates/constants.d.ts +15 -0
  47. package/dist/certificates/constants.js +16 -0
  48. package/dist/certificates/constants.js.map +1 -0
  49. package/dist/certificates/data/api.d.ts +23 -0
  50. package/dist/certificates/data/api.js +115 -0
  51. package/dist/certificates/data/api.js.map +1 -0
  52. package/dist/certificates/data/apiHook.d.ts +50 -0
  53. package/dist/certificates/data/apiHook.js +118 -0
  54. package/dist/certificates/data/apiHook.js.map +1 -0
  55. package/dist/certificates/data/queryKeys.d.ts +9 -0
  56. package/dist/certificates/data/queryKeys.js +9 -0
  57. package/dist/certificates/data/queryKeys.js.map +1 -0
  58. package/dist/certificates/messages.d.ts +343 -0
  59. package/dist/certificates/messages.js +345 -0
  60. package/dist/certificates/messages.js.map +1 -0
  61. package/dist/certificates/types.d.ts +66 -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/components/ActionCard.d.ts +2 -2
  74. package/dist/components/ActionCard.js +1 -1
  75. package/dist/components/ActionCard.js.map +1 -1
  76. package/dist/components/CodeEditor.d.ts +5 -0
  77. package/dist/components/CodeEditor.js +34 -0
  78. package/dist/components/CodeEditor.js.map +1 -0
  79. package/dist/components/PendingTasks.d.ts +3 -1
  80. package/dist/components/PendingTasks.js +3 -2
  81. package/dist/components/PendingTasks.js.map +1 -1
  82. package/dist/components/SpecifyLearnerField.d.ts +4 -1
  83. package/dist/components/SpecifyLearnerField.js +33 -13
  84. package/dist/components/SpecifyLearnerField.js.map +1 -1
  85. package/dist/components/SpecifyProblemField.d.ts +13 -0
  86. package/dist/components/SpecifyProblemField.js +52 -0
  87. package/dist/components/SpecifyProblemField.js.map +1 -0
  88. package/dist/components/UsernameFilter.d.ts +7 -0
  89. package/dist/components/UsernameFilter.js +19 -0
  90. package/dist/components/UsernameFilter.js.map +1 -0
  91. package/dist/components/messages.d.ts +40 -0
  92. package/dist/components/messages.js +40 -0
  93. package/dist/components/messages.js.map +1 -1
  94. package/dist/courseInfo/types.d.ts +4 -0
  95. package/dist/courseInfo/types.js.map +1 -1
  96. package/dist/courseTeam/CourseTeamPage.js +25 -2
  97. package/dist/courseTeam/CourseTeamPage.js.map +1 -1
  98. package/dist/courseTeam/components/AddTeamMemberModal.d.ts +6 -0
  99. package/dist/courseTeam/components/AddTeamMemberModal.js +61 -0
  100. package/dist/courseTeam/components/AddTeamMemberModal.js.map +1 -0
  101. package/dist/courseTeam/components/EditTeamMemberModal.d.ts +8 -0
  102. package/dist/courseTeam/components/EditTeamMemberModal.js +91 -0
  103. package/dist/courseTeam/components/EditTeamMemberModal.js.map +1 -0
  104. package/dist/courseTeam/components/MembersContent.d.ts +6 -0
  105. package/dist/courseTeam/components/MembersContent.js +48 -0
  106. package/dist/courseTeam/components/MembersContent.js.map +1 -0
  107. package/dist/courseTeam/components/RoleFilter.d.ts +7 -0
  108. package/dist/courseTeam/components/RoleFilter.js +22 -0
  109. package/dist/courseTeam/components/RoleFilter.js.map +1 -0
  110. package/dist/courseTeam/components/RolesContent.d.ts +3 -0
  111. package/dist/courseTeam/components/RolesContent.js +25 -0
  112. package/dist/courseTeam/components/RolesContent.js.map +1 -0
  113. package/dist/courseTeam/constants.d.ts +3 -0
  114. package/dist/courseTeam/constants.js +4 -0
  115. package/dist/courseTeam/constants.js.map +1 -0
  116. package/dist/courseTeam/data/api.d.ts +6 -0
  117. package/dist/courseTeam/data/api.js +38 -0
  118. package/dist/courseTeam/data/api.js.map +1 -0
  119. package/dist/courseTeam/data/apiHook.d.ts +8 -0
  120. package/dist/courseTeam/data/apiHook.js +32 -0
  121. package/dist/courseTeam/data/apiHook.js.map +1 -0
  122. package/dist/courseTeam/data/queryKeys.d.ts +7 -0
  123. package/dist/courseTeam/data/queryKeys.js +14 -0
  124. package/dist/courseTeam/data/queryKeys.js.map +1 -0
  125. package/dist/courseTeam/messages.d.ts +248 -0
  126. package/dist/courseTeam/messages.js +250 -0
  127. package/dist/courseTeam/messages.js.map +1 -0
  128. package/dist/courseTeam/types.d.ts +29 -0
  129. package/dist/courseTeam/types.js +3 -0
  130. package/dist/courseTeam/types.js.map +1 -0
  131. package/dist/data/api.d.ts +2 -1
  132. package/dist/data/api.js +9 -3
  133. package/dist/data/api.js.map +1 -1
  134. package/dist/data/apiHook.d.ts +1 -0
  135. package/dist/data/apiHook.js +10 -2
  136. package/dist/data/apiHook.js.map +1 -1
  137. package/dist/data/queryKeys.d.ts +4 -0
  138. package/dist/data/queryKeys.js +4 -0
  139. package/dist/data/queryKeys.js.map +1 -1
  140. package/dist/dateExtensions/components/AddExtensionModal.d.ts +1 -1
  141. package/dist/dateExtensions/components/AddExtensionModal.js +6 -7
  142. package/dist/dateExtensions/components/AddExtensionModal.js.map +1 -1
  143. package/dist/dateExtensions/components/DateExtensionsList.js +3 -14
  144. package/dist/dateExtensions/components/DateExtensionsList.js.map +1 -1
  145. package/dist/dateExtensions/data/apiHook.d.ts +2 -2
  146. package/dist/dateExtensions/data/apiHook.js +4 -4
  147. package/dist/dateExtensions/data/apiHook.js.map +1 -1
  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 +1 -1
  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 +15 -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/instructorNav/InstructorNav.js +6 -1
  213. package/dist/instructorNav/InstructorNav.js.map +1 -1
  214. package/dist/routes.d.ts +1 -1
  215. package/dist/routes.js +2 -2
  216. package/dist/routes.js.map +1 -1
  217. package/dist/specialExams/SpecialExamsPage.js +14 -2
  218. package/dist/specialExams/SpecialExamsPage.js.map +1 -1
  219. package/dist/specialExams/components/AddAllowanceModal.d.ts +6 -0
  220. package/dist/specialExams/components/AddAllowanceModal.js +84 -0
  221. package/dist/specialExams/components/AddAllowanceModal.js.map +1 -0
  222. package/dist/specialExams/components/Allowances.d.ts +2 -0
  223. package/dist/specialExams/components/Allowances.js +32 -0
  224. package/dist/specialExams/components/Allowances.js.map +1 -0
  225. package/dist/specialExams/components/AllowancesList.d.ts +8 -0
  226. package/dist/specialExams/components/AllowancesList.js +58 -0
  227. package/dist/specialExams/components/AllowancesList.js.map +1 -0
  228. package/dist/specialExams/components/AttemptsList.d.ts +3 -0
  229. package/dist/specialExams/components/AttemptsList.js +45 -0
  230. package/dist/specialExams/components/AttemptsList.js.map +1 -0
  231. package/dist/specialExams/components/DeleteAllowanceModal.d.ts +8 -0
  232. package/dist/specialExams/components/DeleteAllowanceModal.js +29 -0
  233. package/dist/specialExams/components/DeleteAllowanceModal.js.map +1 -0
  234. package/dist/specialExams/components/EditAllowanceModal.d.ts +8 -0
  235. package/dist/specialExams/components/EditAllowanceModal.js +62 -0
  236. package/dist/specialExams/components/EditAllowanceModal.js.map +1 -0
  237. package/dist/specialExams/constants.d.ts +43 -0
  238. package/dist/specialExams/constants.js +19 -0
  239. package/dist/specialExams/constants.js.map +1 -0
  240. package/dist/specialExams/data/api.d.ts +7 -0
  241. package/dist/specialExams/data/api.js +49 -0
  242. package/dist/specialExams/data/api.js.map +1 -0
  243. package/dist/specialExams/data/apiHook.d.ts +6 -0
  244. package/dist/specialExams/data/apiHook.js +37 -0
  245. package/dist/specialExams/data/apiHook.js.map +1 -0
  246. package/dist/specialExams/data/queryKeys.d.ts +8 -0
  247. package/dist/specialExams/data/queryKeys.js +9 -0
  248. package/dist/specialExams/data/queryKeys.js.map +1 -0
  249. package/dist/specialExams/messages.d.ts +223 -0
  250. package/dist/specialExams/messages.js +225 -0
  251. package/dist/specialExams/messages.js.map +1 -0
  252. package/dist/specialExams/types.d.ts +64 -0
  253. package/dist/specialExams/types.js +2 -0
  254. package/dist/specialExams/types.js.map +1 -0
  255. package/dist/style.scss +16 -0
  256. package/dist/testUtils.js +1 -1
  257. package/dist/testUtils.js.map +1 -1
  258. package/dist/types/index.d.ts +1 -0
  259. package/dist/types/index.js.map +1 -1
  260. package/dist/utils/formatters.d.ts +5 -0
  261. package/dist/utils/formatters.js +10 -0
  262. package/dist/utils/formatters.js.map +1 -1
  263. package/package.json +4 -5
  264. package/dist/app.scss +0 -10
  265. package/dist/providers/QueryProvider.d.ts +0 -6
  266. package/dist/providers/QueryProvider.js +0 -16
  267. package/dist/providers/QueryProvider.js.map +0 -1
  268. package/dist/providers.d.ts +0 -3
  269. package/dist/providers.js +0 -8
  270. package/dist/providers.js.map +0 -1
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, SearchField } from '@openedx/paragon';
3
+ import { SpinnerIcon } from '@openedx/paragon/icons';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import FilterDropdown from '../../certificates/components/FilterDropdown';
6
+ import { CertificateFilter } from '../../certificates/types';
7
+ import messages from '../../certificates/messages';
8
+ import '../CertificatesPage.scss';
9
+ const getFilterLabel = (filter, intl) => {
10
+ const filterMessages = {
11
+ [CertificateFilter.ALL_LEARNERS]: messages.filterAllLearners,
12
+ [CertificateFilter.RECEIVED]: messages.filterReceived,
13
+ [CertificateFilter.NOT_RECEIVED]: messages.filterNotReceived,
14
+ [CertificateFilter.AUDIT_PASSING]: messages.filterAuditPassing,
15
+ [CertificateFilter.AUDIT_NOT_PASSING]: messages.filterAuditNotPassing,
16
+ [CertificateFilter.ERROR_STATE]: messages.filterErrorState,
17
+ [CertificateFilter.GRANTED_EXCEPTIONS]: messages.filterGrantedExceptions,
18
+ [CertificateFilter.INVALIDATED]: messages.filterInvalidated,
19
+ };
20
+ return intl.formatMessage(filterMessages[filter]);
21
+ };
22
+ const CertificatesToolbar = ({ search, onSearchChange, filter, onFilterChange, onRegenerateCertificates, }) => {
23
+ const intl = useIntl();
24
+ const buttonText = filter === CertificateFilter.ALL_LEARNERS
25
+ ? intl.formatMessage(messages.regenerateCertificatesButton)
26
+ : intl.formatMessage(messages.regenerateCertificatesButtonWithFilter, {
27
+ filter: getFilterLabel(filter, intl),
28
+ });
29
+ return (_jsxs("div", { className: "d-flex flex-wrap align-items-center justify-content-between mb-4 mx-4 mt-3 gap-3", children: [_jsxs("div", { className: "d-flex align-items-center gap-3 flex-shrink-1 certificates-toolbar-wrapper", children: [_jsx(SearchField, { onSubmit: onSearchChange, onChange: onSearchChange, placeholder: intl.formatMessage(messages.searchPlaceholder), value: search, className: "flex-shrink-1 certificates-search-field" }), _jsx(FilterDropdown, { value: filter, onChange: onFilterChange, className: "flex-shrink-0" })] }), _jsx(Button, { variant: "outline-primary", iconBefore: SpinnerIcon, onClick: onRegenerateCertificates, className: "text-nowrap flex-shrink-0", children: buttonText })] }));
30
+ };
31
+ export default CertificatesToolbar;
32
+ //# sourceMappingURL=CertificatesToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CertificatesToolbar.js","sourceRoot":"","sources":["../../../src/certificates/components/CertificatesToolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,cAAc,MAAM,6CAA6C,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAClD,OAAO,0BAA0B,CAAC;AAUlC,MAAM,cAAc,GAAG,CAAC,MAAyB,EAAE,IAAS,EAAE,EAAE;IAC9D,MAAM,cAAc,GAAmC;QACrD,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,iBAAiB;QAC5D,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc;QACrD,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,iBAAiB;QAC5D,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,kBAAkB;QAC9D,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,qBAAqB;QACrE,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,gBAAgB;QAC1D,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,uBAAuB;QACxE,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,iBAAiB;KAC5D,CAAC;IACF,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,EAC3B,MAAM,EACN,cAAc,EACd,MAAM,EACN,cAAc,EACd,wBAAwB,GACC,EAAE,EAAE;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,UAAU,GAAG,MAAM,KAAK,iBAAiB,CAAC,YAAY;QAC1D,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAC3D,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,sCAAsC,EAAE;YAClE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;SACrC,CAAC,CAAC;IAEP,OAAO,CACL,eAAK,SAAS,EAAC,kFAAkF,aAC/F,eAAK,SAAS,EAAC,4EAA4E,aACzF,KAAC,WAAW,IACV,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAC3D,KAAK,EAAE,MAAM,EACb,SAAS,EAAC,yCAAyC,GACnD,EACF,KAAC,cAAc,IACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAC,eAAe,GACzB,IACE,EACN,KAAC,MAAM,IACL,OAAO,EAAC,iBAAiB,EACzB,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,wBAAwB,EACjC,SAAS,EAAC,2BAA2B,YAEpC,UAAU,GACJ,IACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC","sourcesContent":["import { Button, SearchField } from '@openedx/paragon';\nimport { SpinnerIcon } from '@openedx/paragon/icons';\nimport { useIntl } from '@openedx/frontend-base';\nimport FilterDropdown from '@src/certificates/components/FilterDropdown';\nimport { CertificateFilter } from '@src/certificates/types';\nimport messages from '@src/certificates/messages';\nimport '../CertificatesPage.scss';\n\ninterface CertificatesToolbarProps {\n search: string,\n onSearchChange: (value: string) => void,\n filter: CertificateFilter,\n onFilterChange: (value: CertificateFilter) => void,\n onRegenerateCertificates: () => void,\n}\n\nconst getFilterLabel = (filter: CertificateFilter, intl: any) => {\n const filterMessages: Record<CertificateFilter, any> = {\n [CertificateFilter.ALL_LEARNERS]: messages.filterAllLearners,\n [CertificateFilter.RECEIVED]: messages.filterReceived,\n [CertificateFilter.NOT_RECEIVED]: messages.filterNotReceived,\n [CertificateFilter.AUDIT_PASSING]: messages.filterAuditPassing,\n [CertificateFilter.AUDIT_NOT_PASSING]: messages.filterAuditNotPassing,\n [CertificateFilter.ERROR_STATE]: messages.filterErrorState,\n [CertificateFilter.GRANTED_EXCEPTIONS]: messages.filterGrantedExceptions,\n [CertificateFilter.INVALIDATED]: messages.filterInvalidated,\n };\n return intl.formatMessage(filterMessages[filter]);\n};\n\nconst CertificatesToolbar = ({\n search,\n onSearchChange,\n filter,\n onFilterChange,\n onRegenerateCertificates,\n}: CertificatesToolbarProps) => {\n const intl = useIntl();\n\n const buttonText = filter === CertificateFilter.ALL_LEARNERS\n ? intl.formatMessage(messages.regenerateCertificatesButton)\n : intl.formatMessage(messages.regenerateCertificatesButtonWithFilter, {\n filter: getFilterLabel(filter, intl),\n });\n\n return (\n <div className=\"d-flex flex-wrap align-items-center justify-content-between mb-4 mx-4 mt-3 gap-3\">\n <div className=\"d-flex align-items-center gap-3 flex-shrink-1 certificates-toolbar-wrapper\">\n <SearchField\n onSubmit={onSearchChange}\n onChange={onSearchChange}\n placeholder={intl.formatMessage(messages.searchPlaceholder)}\n value={search}\n className=\"flex-shrink-1 certificates-search-field\"\n />\n <FilterDropdown\n value={filter}\n onChange={onFilterChange}\n className=\"flex-shrink-0\"\n />\n </div>\n <Button\n variant=\"outline-primary\"\n iconBefore={SpinnerIcon}\n onClick={onRegenerateCertificates}\n className=\"text-nowrap flex-shrink-0\"\n >\n {buttonText}\n </Button>\n </div>\n );\n};\n\nexport default CertificatesToolbar;\n"]}
@@ -0,0 +1,9 @@
1
+ interface DisableCertificatesModalProps {
2
+ isOpen: boolean;
3
+ isEnabled: boolean;
4
+ onClose: () => void;
5
+ onConfirm: () => void;
6
+ isSubmitting: boolean;
7
+ }
8
+ declare const DisableCertificatesModal: ({ isOpen, isEnabled, onClose, onConfirm, isSubmitting, }: DisableCertificatesModalProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default DisableCertificatesModal;
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ActionRow, Button, ModalDialog } from '@openedx/paragon';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import messages from '../../certificates/messages';
5
+ const DisableCertificatesModal = ({ isOpen, isEnabled, onClose, onConfirm, isSubmitting, }) => {
6
+ const intl = useIntl();
7
+ const title = isEnabled
8
+ ? intl.formatMessage(messages.disableCertificatesModalTitle)
9
+ : intl.formatMessage(messages.enableCertificatesModalTitle);
10
+ const message = isEnabled
11
+ ? intl.formatMessage(messages.disableCertificatesModalMessage)
12
+ : intl.formatMessage(messages.enableCertificatesModalMessage);
13
+ return (_jsxs(ModalDialog, { title: title, onClose: onClose, isOpen: isOpen, size: "sm", hasCloseButton: false, isOverflowVisible: false, children: [_jsx("div", { className: "mx-4 mt-4 mb-2.5", children: _jsx("p", { children: message }) }), _jsx(ModalDialog.Footer, { children: _jsxs(ActionRow, { children: [_jsx(Button, { variant: "tertiary", onClick: onClose, disabled: isSubmitting, children: intl.formatMessage(messages.cancel) }), _jsx(Button, { variant: "primary", onClick: onConfirm, disabled: isSubmitting, children: intl.formatMessage(messages.confirm) })] }) })] }));
14
+ };
15
+ export default DisableCertificatesModal;
16
+ //# sourceMappingURL=DisableCertificatesModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisableCertificatesModal.js","sourceRoot":"","sources":["../../../src/certificates/components/DisableCertificatesModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAUlD,MAAM,wBAAwB,GAAG,CAAC,EAChC,MAAM,EACN,SAAS,EACT,OAAO,EACP,SAAS,EACT,YAAY,GACkB,EAAE,EAAE;IAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,KAAK,GAAG,SAAS;QACrB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC5D,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,SAAS;QACvB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;IAEhE,OAAO,CACL,MAAC,WAAW,IACV,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAC,IAAI,EACT,cAAc,EAAE,KAAK,EACrB,iBAAiB,EAAE,KAAK,aAExB,cAAK,SAAS,EAAC,kBAAkB,YAC/B,sBAAI,OAAO,GAAK,GACZ,EACN,KAAC,WAAW,CAAC,MAAM,cACjB,MAAC,SAAS,eACR,KAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,YAChE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAC7B,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,YACjE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,GAC9B,IACC,GACO,IACT,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,wBAAwB,CAAC","sourcesContent":["import { ActionRow, Button, ModalDialog } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from '@src/certificates/messages';\n\ninterface DisableCertificatesModalProps {\n isOpen: boolean,\n isEnabled: boolean,\n onClose: () => void,\n onConfirm: () => void,\n isSubmitting: boolean,\n}\n\nconst DisableCertificatesModal = ({\n isOpen,\n isEnabled,\n onClose,\n onConfirm,\n isSubmitting,\n}: DisableCertificatesModalProps) => {\n const intl = useIntl();\n\n const title = isEnabled\n ? intl.formatMessage(messages.disableCertificatesModalTitle)\n : intl.formatMessage(messages.enableCertificatesModalTitle);\n\n const message = isEnabled\n ? intl.formatMessage(messages.disableCertificatesModalMessage)\n : intl.formatMessage(messages.enableCertificatesModalMessage);\n\n return (\n <ModalDialog\n title={title}\n onClose={onClose}\n isOpen={isOpen}\n size=\"sm\"\n hasCloseButton={false}\n isOverflowVisible={false}\n >\n <div className=\"mx-4 mt-4 mb-2.5\">\n <p>{message}</p>\n </div>\n <ModalDialog.Footer>\n <ActionRow>\n <Button variant=\"tertiary\" onClick={onClose} disabled={isSubmitting}>\n {intl.formatMessage(messages.cancel)}\n </Button>\n <Button variant=\"primary\" onClick={onConfirm} disabled={isSubmitting}>\n {intl.formatMessage(messages.confirm)}\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default DisableCertificatesModal;\n"]}
@@ -0,0 +1,8 @@
1
+ import { CertificateFilter } from '../../certificates/types';
2
+ interface FilterDropdownProps {
3
+ value: CertificateFilter;
4
+ onChange: (value: CertificateFilter) => void;
5
+ className?: string;
6
+ }
7
+ declare const FilterDropdown: ({ value, onChange, className }: FilterDropdownProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default FilterDropdown;
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Dropdown } from '@openedx/paragon';
3
+ import { FilterList } from '@openedx/paragon/icons';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import { CertificateFilter } from '../../certificates/types';
6
+ import messages from '../../certificates/messages';
7
+ const FILTER_OPTIONS = [
8
+ {
9
+ value: CertificateFilter.ALL_LEARNERS,
10
+ messageKey: 'filterAllLearners',
11
+ },
12
+ {
13
+ value: CertificateFilter.RECEIVED,
14
+ messageKey: 'filterReceived',
15
+ },
16
+ {
17
+ value: CertificateFilter.NOT_RECEIVED,
18
+ messageKey: 'filterNotReceived',
19
+ },
20
+ {
21
+ value: CertificateFilter.AUDIT_PASSING,
22
+ messageKey: 'filterAuditPassing',
23
+ },
24
+ {
25
+ value: CertificateFilter.AUDIT_NOT_PASSING,
26
+ messageKey: 'filterAuditNotPassing',
27
+ },
28
+ {
29
+ value: CertificateFilter.ERROR_STATE,
30
+ messageKey: 'filterErrorState',
31
+ },
32
+ {
33
+ value: CertificateFilter.GRANTED_EXCEPTIONS,
34
+ messageKey: 'filterGrantedExceptions',
35
+ },
36
+ {
37
+ value: CertificateFilter.INVALIDATED,
38
+ messageKey: 'filterInvalidated',
39
+ },
40
+ ];
41
+ const FilterDropdown = ({ value, onChange, className }) => {
42
+ const intl = useIntl();
43
+ const selectedOption = FILTER_OPTIONS.find((option) => option.value === value);
44
+ const selectedLabel = selectedOption
45
+ ? intl.formatMessage(messages[selectedOption.messageKey])
46
+ : intl.formatMessage(messages.filterAllLearners);
47
+ return (_jsxs(Dropdown, { className: `certificates-filter-dropdown ${className || ''}`, children: [_jsx(Dropdown.Toggle, { id: "filter-dropdown", variant: "outline-primary", className: "d-flex align-items-center justify-content-between w-100", children: _jsxs("span", { className: "d-flex align-items-center", children: [_jsx(FilterList, { className: "mr-2" }), selectedLabel] }) }), _jsx(Dropdown.Menu, { children: FILTER_OPTIONS.map((option) => (_jsx(Dropdown.Item, { active: option.value === value, onClick: () => onChange(option.value), className: "filter-dropdown-item", children: intl.formatMessage(messages[option.messageKey]) }, option.value))) })] }));
48
+ };
49
+ export default FilterDropdown;
50
+ //# sourceMappingURL=FilterDropdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterDropdown.js","sourceRoot":"","sources":["../../../src/certificates/components/FilterDropdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAQlD,MAAM,cAAc,GAAG;IACrB;QACE,KAAK,EAAE,iBAAiB,CAAC,YAAY;QACrC,UAAU,EAAE,mBAAmB;KAChC;IACD;QACE,KAAK,EAAE,iBAAiB,CAAC,QAAQ;QACjC,UAAU,EAAE,gBAAgB;KAC7B;IACD;QACE,KAAK,EAAE,iBAAiB,CAAC,YAAY;QACrC,UAAU,EAAE,mBAAmB;KAChC;IACD;QACE,KAAK,EAAE,iBAAiB,CAAC,aAAa;QACtC,UAAU,EAAE,oBAAoB;KACjC;IACD;QACE,KAAK,EAAE,iBAAiB,CAAC,iBAAiB;QAC1C,UAAU,EAAE,uBAAuB;KACpC;IACD;QACE,KAAK,EAAE,iBAAiB,CAAC,WAAW;QACpC,UAAU,EAAE,kBAAkB;KAC/B;IACD;QACE,KAAK,EAAE,iBAAiB,CAAC,kBAAkB;QAC3C,UAAU,EAAE,yBAAyB;KACtC;IACD;QACE,KAAK,EAAE,iBAAiB,CAAC,WAAW;QACpC,UAAU,EAAE,mBAAmB;KAChC;CACO,CAAC;AAEX,MAAM,cAAc,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAuB,EAAE,EAAE;IAC7E,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC/E,MAAM,aAAa,GAAG,cAAc;QAClC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAEnD,OAAO,CACL,MAAC,QAAQ,IAAC,SAAS,EAAE,gCAAgC,SAAS,IAAI,EAAE,EAAE,aACpE,KAAC,QAAQ,CAAC,MAAM,IACd,EAAE,EAAC,iBAAiB,EACpB,OAAO,EAAC,iBAAiB,EACzB,SAAS,EAAC,yDAAyD,YAEnE,gBAAM,SAAS,EAAC,2BAA2B,aACzC,KAAC,UAAU,IAAC,SAAS,EAAC,MAAM,GAAG,EAC9B,aAAa,IACT,GACS,EAClB,KAAC,QAAQ,CAAC,IAAI,cACX,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC9B,KAAC,QAAQ,CAAC,IAAI,IAEZ,MAAM,EAAE,MAAM,CAAC,KAAK,KAAK,KAAK,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EACrC,SAAS,EAAC,sBAAsB,YAE/B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAL3C,MAAM,CAAC,KAAK,CAMH,CACjB,CAAC,GACY,IACP,CACZ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC","sourcesContent":["import { Dropdown } from '@openedx/paragon';\nimport { FilterList } from '@openedx/paragon/icons';\nimport { useIntl } from '@openedx/frontend-base';\nimport { CertificateFilter } from '@src/certificates/types';\nimport messages from '@src/certificates/messages';\n\ninterface FilterDropdownProps {\n value: CertificateFilter,\n onChange: (value: CertificateFilter) => void,\n className?: string,\n}\n\nconst FILTER_OPTIONS = [\n {\n value: CertificateFilter.ALL_LEARNERS,\n messageKey: 'filterAllLearners',\n },\n {\n value: CertificateFilter.RECEIVED,\n messageKey: 'filterReceived',\n },\n {\n value: CertificateFilter.NOT_RECEIVED,\n messageKey: 'filterNotReceived',\n },\n {\n value: CertificateFilter.AUDIT_PASSING,\n messageKey: 'filterAuditPassing',\n },\n {\n value: CertificateFilter.AUDIT_NOT_PASSING,\n messageKey: 'filterAuditNotPassing',\n },\n {\n value: CertificateFilter.ERROR_STATE,\n messageKey: 'filterErrorState',\n },\n {\n value: CertificateFilter.GRANTED_EXCEPTIONS,\n messageKey: 'filterGrantedExceptions',\n },\n {\n value: CertificateFilter.INVALIDATED,\n messageKey: 'filterInvalidated',\n },\n] as const;\n\nconst FilterDropdown = ({ value, onChange, className }: FilterDropdownProps) => {\n const intl = useIntl();\n\n const selectedOption = FILTER_OPTIONS.find((option) => option.value === value);\n const selectedLabel = selectedOption\n ? intl.formatMessage(messages[selectedOption.messageKey])\n : intl.formatMessage(messages.filterAllLearners);\n\n return (\n <Dropdown className={`certificates-filter-dropdown ${className || ''}`}>\n <Dropdown.Toggle\n id=\"filter-dropdown\"\n variant=\"outline-primary\"\n className=\"d-flex align-items-center justify-content-between w-100\"\n >\n <span className=\"d-flex align-items-center\">\n <FilterList className=\"mr-2\" />\n {selectedLabel}\n </span>\n </Dropdown.Toggle>\n <Dropdown.Menu>\n {FILTER_OPTIONS.map((option) => (\n <Dropdown.Item\n key={option.value}\n active={option.value === value}\n onClick={() => onChange(option.value)}\n className=\"filter-dropdown-item\"\n >\n {intl.formatMessage(messages[option.messageKey])}\n </Dropdown.Item>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n );\n};\n\nexport default FilterDropdown;\n"]}
@@ -0,0 +1,11 @@
1
+ import type { CertificateGenerationHistory } from '../../certificates/types';
2
+ interface GenerationHistoryTableProps {
3
+ data: CertificateGenerationHistory[];
4
+ isLoading: boolean;
5
+ itemCount: number;
6
+ pageCount: number;
7
+ currentPage: number;
8
+ onPageChange: (pageIndex: number) => void;
9
+ }
10
+ declare const GenerationHistoryTable: ({ data, isLoading, itemCount, pageCount, currentPage, onPageChange, }: GenerationHistoryTableProps) => import("react/jsx-runtime").JSX.Element;
11
+ export default GenerationHistoryTable;
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { DataTable } from '@openedx/paragon';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import messages from '../../certificates/messages';
6
+ const GenerationHistoryTable = ({ data, isLoading, itemCount, pageCount, currentPage, onPageChange, }) => {
7
+ const intl = useIntl();
8
+ const columns = useMemo(() => [
9
+ {
10
+ Header: intl.formatMessage(messages.columnTaskName),
11
+ accessor: 'taskName',
12
+ },
13
+ {
14
+ Header: intl.formatMessage(messages.columnDate),
15
+ accessor: 'date',
16
+ },
17
+ {
18
+ Header: intl.formatMessage(messages.columnDetails),
19
+ accessor: 'details',
20
+ },
21
+ ], [intl]);
22
+ return (_jsxs(DataTable, { columns: columns, data: data, isLoading: isLoading, isPaginated: true, itemCount: itemCount, pageCount: pageCount, manualPagination: true, fetchData: ({ pageIndex }) => onPageChange(pageIndex), initialState: { pageIndex: currentPage, pageSize: 25 }, children: [_jsx(DataTable.Table, {}), _jsx(DataTable.EmptyTable, { content: intl.formatMessage(messages.noTasksMessage) }), itemCount > 0 && (_jsxs(DataTable.TableFooter, { children: [_jsx(DataTable.RowStatus, {}), _jsx(DataTable.TablePagination, {})] }))] }));
23
+ };
24
+ export default GenerationHistoryTable;
25
+ //# sourceMappingURL=GenerationHistoryTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerationHistoryTable.js","sourceRoot":"","sources":["../../../src/certificates/components/GenerationHistoryTable.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAWlD,MAAM,sBAAsB,GAAG,CAAC,EAC9B,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,GACgB,EAAE,EAAE;IAChC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC;QACJ;YACE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC;YACnD,QAAQ,EAAE,UAAU;SACrB;QACD;YACE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC/C,QAAQ,EAAE,MAAM;SACjB;QACD;YACE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC;YAClD,QAAQ,EAAE,SAAS;SACpB;KACF,EACD,CAAC,IAAI,CAAC,CACP,CAAC;IAEF,OAAO,CACL,MAAC,SAAS,IACR,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,WAAW,QACX,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,gBAAgB,QAChB,SAAS,EAAE,CAAC,EAAE,SAAS,EAAyB,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAC5E,YAAY,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,aAEtD,KAAC,SAAS,CAAC,KAAK,KAAG,EACnB,KAAC,SAAS,CAAC,UAAU,IAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAI,EAC7E,SAAS,GAAG,CAAC,IAAI,CAChB,MAAC,SAAS,CAAC,WAAW,eACpB,KAAC,SAAS,CAAC,SAAS,KAAG,EACvB,KAAC,SAAS,CAAC,eAAe,KAAG,IACP,CACzB,IACS,CACb,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,sBAAsB,CAAC","sourcesContent":["import { useMemo } from 'react';\nimport { DataTable } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport type { CertificateGenerationHistory } from '@src/certificates/types';\nimport messages from '@src/certificates/messages';\n\ninterface GenerationHistoryTableProps {\n data: CertificateGenerationHistory[],\n isLoading: boolean,\n itemCount: number,\n pageCount: number,\n currentPage: number,\n onPageChange: (pageIndex: number) => void,\n}\n\nconst GenerationHistoryTable = ({\n data,\n isLoading,\n itemCount,\n pageCount,\n currentPage,\n onPageChange,\n}: GenerationHistoryTableProps) => {\n const intl = useIntl();\n\n const columns = useMemo(\n () => [\n {\n Header: intl.formatMessage(messages.columnTaskName),\n accessor: 'taskName',\n },\n {\n Header: intl.formatMessage(messages.columnDate),\n accessor: 'date',\n },\n {\n Header: intl.formatMessage(messages.columnDetails),\n accessor: 'details',\n },\n ],\n [intl],\n );\n\n return (\n <DataTable\n columns={columns}\n data={data}\n isLoading={isLoading}\n isPaginated\n itemCount={itemCount}\n pageCount={pageCount}\n manualPagination\n fetchData={({ pageIndex }: { pageIndex: number }) => onPageChange(pageIndex)}\n initialState={{ pageIndex: currentPage, pageSize: 25 }}\n >\n <DataTable.Table />\n <DataTable.EmptyTable content={intl.formatMessage(messages.noTasksMessage)} />\n {itemCount > 0 && (\n <DataTable.TableFooter>\n <DataTable.RowStatus />\n <DataTable.TablePagination />\n </DataTable.TableFooter>\n )}\n </DataTable>\n );\n};\n\nexport default GenerationHistoryTable;\n"]}
@@ -0,0 +1,8 @@
1
+ interface GrantExceptionsModalProps {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ onSubmit: (learners: string[], notes: string) => void;
5
+ isSubmitting: boolean;
6
+ }
7
+ declare const GrantExceptionsModal: ({ isOpen, onClose, onSubmit, isSubmitting, }: GrantExceptionsModalProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default GrantExceptionsModal;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useIntl } from '@openedx/frontend-base';
3
+ import LearnerActionModal from '../../certificates/components/LearnerActionModal';
4
+ import messages from '../../certificates/messages';
5
+ const GrantExceptionsModal = ({ isOpen, onClose, onSubmit, isSubmitting, }) => {
6
+ const intl = useIntl();
7
+ return (_jsx(LearnerActionModal, { isOpen: isOpen, onClose: onClose, onSubmit: onSubmit, isSubmitting: isSubmitting, title: intl.formatMessage(messages.grantExceptionsModalTitle), description: intl.formatMessage(messages.grantExceptionsModalDescription), learnersLabel: intl.formatMessage(messages.learnersLabel), learnersPlaceholder: intl.formatMessage(messages.learnersPlaceholder), notesLabel: intl.formatMessage(messages.notesLabel), notesPlaceholder: intl.formatMessage(messages.notesPlaceholder), submitLabel: intl.formatMessage(messages.submit), cancelLabel: intl.formatMessage(messages.cancel) }));
8
+ };
9
+ export default GrantExceptionsModal;
10
+ //# sourceMappingURL=GrantExceptionsModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrantExceptionsModal.js","sourceRoot":"","sources":["../../../src/certificates/components/GrantExceptionsModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,kBAAkB,MAAM,iDAAiD,CAAC;AACjF,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AASlD,MAAM,oBAAoB,GAAG,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,YAAY,GACc,EAAE,EAAE;IAC9B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,CACL,KAAC,kBAAkB,IACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAC7D,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EACzE,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EACzD,mBAAmB,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACrE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EACnD,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAC/D,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAChD,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAChD,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,oBAAoB,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport LearnerActionModal from '@src/certificates/components/LearnerActionModal';\nimport messages from '@src/certificates/messages';\n\ninterface GrantExceptionsModalProps {\n isOpen: boolean,\n onClose: () => void,\n onSubmit: (learners: string[], notes: string) => void,\n isSubmitting: boolean,\n}\n\nconst GrantExceptionsModal = ({\n isOpen,\n onClose,\n onSubmit,\n isSubmitting,\n}: GrantExceptionsModalProps) => {\n const intl = useIntl();\n\n return (\n <LearnerActionModal\n isOpen={isOpen}\n onClose={onClose}\n onSubmit={onSubmit}\n isSubmitting={isSubmitting}\n title={intl.formatMessage(messages.grantExceptionsModalTitle)}\n description={intl.formatMessage(messages.grantExceptionsModalDescription)}\n learnersLabel={intl.formatMessage(messages.learnersLabel)}\n learnersPlaceholder={intl.formatMessage(messages.learnersPlaceholder)}\n notesLabel={intl.formatMessage(messages.notesLabel)}\n notesPlaceholder={intl.formatMessage(messages.notesPlaceholder)}\n submitLabel={intl.formatMessage(messages.submit)}\n cancelLabel={intl.formatMessage(messages.cancel)}\n />\n );\n};\n\nexport default GrantExceptionsModal;\n"]}
@@ -0,0 +1,8 @@
1
+ interface InvalidateCertificateModalProps {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ onSubmit: (learners: string[], notes: string) => void;
5
+ isSubmitting: boolean;
6
+ }
7
+ declare const InvalidateCertificateModal: ({ isOpen, onClose, onSubmit, isSubmitting, }: InvalidateCertificateModalProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default InvalidateCertificateModal;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useIntl } from '@openedx/frontend-base';
3
+ import LearnerActionModal from '../../certificates/components/LearnerActionModal';
4
+ import messages from '../../certificates/messages';
5
+ const InvalidateCertificateModal = ({ isOpen, onClose, onSubmit, isSubmitting, }) => {
6
+ const intl = useIntl();
7
+ return (_jsx(LearnerActionModal, { isOpen: isOpen, onClose: onClose, onSubmit: onSubmit, isSubmitting: isSubmitting, title: intl.formatMessage(messages.invalidateCertificateModalTitle), description: intl.formatMessage(messages.invalidateCertificateModalDescription), learnersLabel: intl.formatMessage(messages.learnersLabel), learnersPlaceholder: intl.formatMessage(messages.learnersPlaceholder), notesLabel: intl.formatMessage(messages.notesLabel), notesPlaceholder: intl.formatMessage(messages.notesPlaceholder), submitLabel: intl.formatMessage(messages.submit), cancelLabel: intl.formatMessage(messages.cancel) }));
8
+ };
9
+ export default InvalidateCertificateModal;
10
+ //# sourceMappingURL=InvalidateCertificateModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvalidateCertificateModal.js","sourceRoot":"","sources":["../../../src/certificates/components/InvalidateCertificateModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,kBAAkB,MAAM,iDAAiD,CAAC;AACjF,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AASlD,MAAM,0BAA0B,GAAG,CAAC,EAClC,MAAM,EACN,OAAO,EACP,QAAQ,EACR,YAAY,GACoB,EAAE,EAAE;IACpC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,CACL,KAAC,kBAAkB,IACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EACnE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAC/E,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EACzD,mBAAmB,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACrE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EACnD,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAC/D,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAChD,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAChD,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,0BAA0B,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport LearnerActionModal from '@src/certificates/components/LearnerActionModal';\nimport messages from '@src/certificates/messages';\n\ninterface InvalidateCertificateModalProps {\n isOpen: boolean,\n onClose: () => void,\n onSubmit: (learners: string[], notes: string) => void,\n isSubmitting: boolean,\n}\n\nconst InvalidateCertificateModal = ({\n isOpen,\n onClose,\n onSubmit,\n isSubmitting,\n}: InvalidateCertificateModalProps) => {\n const intl = useIntl();\n\n return (\n <LearnerActionModal\n isOpen={isOpen}\n onClose={onClose}\n onSubmit={onSubmit}\n isSubmitting={isSubmitting}\n title={intl.formatMessage(messages.invalidateCertificateModalTitle)}\n description={intl.formatMessage(messages.invalidateCertificateModalDescription)}\n learnersLabel={intl.formatMessage(messages.learnersLabel)}\n learnersPlaceholder={intl.formatMessage(messages.learnersPlaceholder)}\n notesLabel={intl.formatMessage(messages.notesLabel)}\n notesPlaceholder={intl.formatMessage(messages.notesPlaceholder)}\n submitLabel={intl.formatMessage(messages.submit)}\n cancelLabel={intl.formatMessage(messages.cancel)}\n />\n );\n};\n\nexport default InvalidateCertificateModal;\n"]}
@@ -0,0 +1,18 @@
1
+ import { CertificateData, CertificateFilter } from '../../certificates/types';
2
+ interface IssuedCertificatesTabProps {
3
+ data: CertificateData[];
4
+ isLoading: boolean;
5
+ itemCount: number;
6
+ pageCount: number;
7
+ search: string;
8
+ onSearchChange: (value: string) => void;
9
+ filter: CertificateFilter;
10
+ onFilterChange: (value: CertificateFilter) => void;
11
+ currentPage: number;
12
+ onPageChange: (page: number) => void;
13
+ onRemoveException: (username: string, email: string) => void;
14
+ onRemoveInvalidation: (username: string, email: string) => void;
15
+ onRegenerateCertificates: () => void;
16
+ }
17
+ declare const IssuedCertificatesTab: ({ data, isLoading, itemCount, pageCount, search, onSearchChange, filter, onFilterChange, currentPage, onPageChange, onRemoveException, onRemoveInvalidation, onRegenerateCertificates, }: IssuedCertificatesTabProps) => import("react/jsx-runtime").JSX.Element;
18
+ export default IssuedCertificatesTab;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import CertificateTable from '../../certificates/components/CertificateTable';
3
+ import CertificatesToolbar from '../../certificates/components/CertificatesToolbar';
4
+ const IssuedCertificatesTab = ({ data, isLoading, itemCount, pageCount, search, onSearchChange, filter, onFilterChange, currentPage, onPageChange, onRemoveException, onRemoveInvalidation, onRegenerateCertificates, }) => (_jsxs("div", { className: "d-flex flex-column certificates-tab-container", children: [_jsx(CertificatesToolbar, { search: search, onSearchChange: onSearchChange, filter: filter, onFilterChange: onFilterChange, onRegenerateCertificates: onRegenerateCertificates }), _jsx("div", { className: "certificates-table-wrapper", children: _jsx(CertificateTable, { data: data, isLoading: isLoading, itemCount: itemCount, pageCount: pageCount, currentPage: currentPage, filter: filter, onPageChange: onPageChange, onRemoveException: onRemoveException, onRemoveInvalidation: onRemoveInvalidation }) })] }));
5
+ export default IssuedCertificatesTab;
6
+ //# sourceMappingURL=IssuedCertificatesTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IssuedCertificatesTab.js","sourceRoot":"","sources":["../../../src/certificates/components/IssuedCertificatesTab.tsx"],"names":[],"mappings":";AAAA,OAAO,gBAAgB,MAAM,+CAA+C,CAAC;AAC7E,OAAO,mBAAmB,MAAM,kDAAkD,CAAC;AAmBnF,MAAM,qBAAqB,GAAG,CAAC,EAC7B,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,EACT,MAAM,EACN,cAAc,EACd,MAAM,EACN,cAAc,EACd,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,GACG,EAAE,EAAE,CAAC,CAChC,eAAK,SAAS,EAAC,+CAA+C,aAC5D,KAAC,mBAAmB,IAClB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,cAAc,EAC9B,wBAAwB,EAAE,wBAAwB,GAClD,EACF,cAAK,SAAS,EAAC,4BAA4B,YACzC,KAAC,gBAAgB,IACf,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,oBAAoB,EAAE,oBAAoB,GAC1C,GACE,IACF,CACP,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["import CertificateTable from '@src/certificates/components/CertificateTable';\nimport CertificatesToolbar from '@src/certificates/components/CertificatesToolbar';\nimport { CertificateData, CertificateFilter } from '@src/certificates/types';\n\ninterface IssuedCertificatesTabProps {\n data: CertificateData[],\n isLoading: boolean,\n itemCount: number,\n pageCount: number,\n search: string,\n onSearchChange: (value: string) => void,\n filter: CertificateFilter,\n onFilterChange: (value: CertificateFilter) => void,\n currentPage: number,\n onPageChange: (page: number) => void,\n onRemoveException: (username: string, email: string) => void,\n onRemoveInvalidation: (username: string, email: string) => void,\n onRegenerateCertificates: () => void,\n}\n\nconst IssuedCertificatesTab = ({\n data,\n isLoading,\n itemCount,\n pageCount,\n search,\n onSearchChange,\n filter,\n onFilterChange,\n currentPage,\n onPageChange,\n onRemoveException,\n onRemoveInvalidation,\n onRegenerateCertificates,\n}: IssuedCertificatesTabProps) => (\n <div className=\"d-flex flex-column certificates-tab-container\">\n <CertificatesToolbar\n search={search}\n onSearchChange={onSearchChange}\n filter={filter}\n onFilterChange={onFilterChange}\n onRegenerateCertificates={onRegenerateCertificates}\n />\n <div className=\"certificates-table-wrapper\">\n <CertificateTable\n data={data}\n isLoading={isLoading}\n itemCount={itemCount}\n pageCount={pageCount}\n currentPage={currentPage}\n filter={filter}\n onPageChange={onPageChange}\n onRemoveException={onRemoveException}\n onRemoveInvalidation={onRemoveInvalidation}\n />\n </div>\n </div>\n);\n\nexport default IssuedCertificatesTab;\n"]}
@@ -0,0 +1,16 @@
1
+ interface LearnerActionModalProps {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ onSubmit: (learners: string[], notes: string) => void;
5
+ isSubmitting: boolean;
6
+ title: string;
7
+ description: string;
8
+ notesLabel: string;
9
+ notesPlaceholder: string;
10
+ submitLabel: string;
11
+ cancelLabel: string;
12
+ learnersLabel: string;
13
+ learnersPlaceholder: string;
14
+ }
15
+ declare const LearnerActionModal: ({ isOpen, onClose, onSubmit, isSubmitting, title, description, notesLabel, notesPlaceholder, submitLabel, cancelLabel, learnersLabel, learnersPlaceholder, }: LearnerActionModalProps) => import("react/jsx-runtime").JSX.Element;
16
+ export default LearnerActionModal;
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { ActionRow, Button, Form, ModalDialog } from '@openedx/paragon';
4
+ const LearnerActionModal = ({ isOpen, onClose, onSubmit, isSubmitting, title, description, notesLabel, notesPlaceholder, submitLabel, cancelLabel, learnersLabel, learnersPlaceholder, }) => {
5
+ const [learners, setLearners] = useState('');
6
+ const [notes, setNotes] = useState('');
7
+ const handleSubmit = () => {
8
+ // Parse comma-separated learners and filter out empty strings
9
+ const learnersArray = learners
10
+ .split(',')
11
+ .map((learner) => learner.trim())
12
+ .filter((learner) => learner.length > 0);
13
+ if (learnersArray.length > 0) {
14
+ onSubmit(learnersArray, notes);
15
+ setLearners('');
16
+ setNotes('');
17
+ }
18
+ };
19
+ const handleClose = () => {
20
+ setLearners('');
21
+ setNotes('');
22
+ onClose();
23
+ };
24
+ return (_jsxs(ModalDialog, { isOpen: isOpen, onClose: handleClose, hasCloseButton: true, title: title, className: "p-4", isOverflowVisible: false, children: [_jsx(ModalDialog.Header, { children: _jsx(ModalDialog.Title, { children: title }) }), _jsxs(ModalDialog.Body, { children: [_jsx("p", { className: "mb-3", children: description }), _jsxs(Form.Group, { className: "mb-3", children: [_jsx(Form.Label, { children: learnersLabel }), _jsx(Form.Control, { as: "textarea", rows: 4, placeholder: learnersPlaceholder, value: learners, onChange: (e) => setLearners(e.target.value) })] }), _jsxs(Form.Group, { className: "mt-3", children: [_jsx(Form.Label, { children: notesLabel }), _jsx(Form.Control, { as: "textarea", rows: 3, placeholder: notesPlaceholder, value: notes, onChange: (e) => setNotes(e.target.value) })] })] }), _jsx(ModalDialog.Footer, { children: _jsxs(ActionRow, { children: [_jsx(Button, { variant: "tertiary", onClick: handleClose, disabled: isSubmitting, children: cancelLabel }), _jsx(Button, { variant: "primary", onClick: handleSubmit, disabled: isSubmitting || !learners.trim(), children: submitLabel })] }) })] }));
25
+ };
26
+ export default LearnerActionModal;
27
+ //# sourceMappingURL=LearnerActionModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LearnerActionModal.js","sourceRoot":"","sources":["../../../src/certificates/components/LearnerActionModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAiBxE,MAAM,kBAAkB,GAAG,CAAC,EAC1B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,aAAa,EACb,mBAAmB,GACK,EAAE,EAAE;IAC5B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,8DAA8D;QAC9D,MAAM,aAAa,GAAG,QAAQ;aAC3B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;aAChC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE3C,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAC/B,WAAW,CAAC,EAAE,CAAC,CAAC;YAChB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,WAAW,IACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,cAAc,QACd,KAAK,EAAE,KAAK,EACZ,SAAS,EAAC,KAAK,EACf,iBAAiB,EAAE,KAAK,aAExB,KAAC,WAAW,CAAC,MAAM,cACjB,KAAC,WAAW,CAAC,KAAK,cAAE,KAAK,GAAqB,GAC3B,EACrB,MAAC,WAAW,CAAC,IAAI,eACf,YAAG,SAAS,EAAC,MAAM,YAAE,WAAW,GAAK,EACrC,MAAC,IAAI,CAAC,KAAK,IAAC,SAAS,EAAC,MAAM,aAC1B,KAAC,IAAI,CAAC,KAAK,cAAE,aAAa,GAAc,EACxC,KAAC,IAAI,CAAC,OAAO,IACX,EAAE,EAAC,UAAU,EACb,IAAI,EAAE,CAAC,EACP,WAAW,EAAE,mBAAmB,EAChC,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC5C,IACS,EACb,MAAC,IAAI,CAAC,KAAK,IAAC,SAAS,EAAC,MAAM,aAC1B,KAAC,IAAI,CAAC,KAAK,cAAE,UAAU,GAAc,EACrC,KAAC,IAAI,CAAC,OAAO,IACX,EAAE,EAAC,UAAU,EACb,IAAI,EAAE,CAAC,EACP,WAAW,EAAE,gBAAgB,EAC7B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GACzC,IACS,IACI,EACnB,KAAC,WAAW,CAAC,MAAM,cACjB,MAAC,SAAS,eACR,KAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,YACpE,WAAW,GACL,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,YACxF,WAAW,GACL,IACC,GACO,IACT,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import { useState } from 'react';\nimport { ActionRow, Button, Form, ModalDialog } from '@openedx/paragon';\n\ninterface LearnerActionModalProps {\n isOpen: boolean,\n onClose: () => void,\n onSubmit: (learners: string[], notes: string) => void,\n isSubmitting: boolean,\n title: string,\n description: string,\n notesLabel: string,\n notesPlaceholder: string,\n submitLabel: string,\n cancelLabel: string,\n learnersLabel: string,\n learnersPlaceholder: string,\n}\n\nconst LearnerActionModal = ({\n isOpen,\n onClose,\n onSubmit,\n isSubmitting,\n title,\n description,\n notesLabel,\n notesPlaceholder,\n submitLabel,\n cancelLabel,\n learnersLabel,\n learnersPlaceholder,\n}: LearnerActionModalProps) => {\n const [learners, setLearners] = useState('');\n const [notes, setNotes] = useState('');\n\n const handleSubmit = () => {\n // Parse comma-separated learners and filter out empty strings\n const learnersArray = learners\n .split(',')\n .map((learner) => learner.trim())\n .filter((learner) => learner.length > 0);\n\n if (learnersArray.length > 0) {\n onSubmit(learnersArray, notes);\n setLearners('');\n setNotes('');\n }\n };\n\n const handleClose = () => {\n setLearners('');\n setNotes('');\n onClose();\n };\n\n return (\n <ModalDialog\n isOpen={isOpen}\n onClose={handleClose}\n hasCloseButton\n title={title}\n className=\"p-4\"\n isOverflowVisible={false}\n >\n <ModalDialog.Header>\n <ModalDialog.Title>{title}</ModalDialog.Title>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <p className=\"mb-3\">{description}</p>\n <Form.Group className=\"mb-3\">\n <Form.Label>{learnersLabel}</Form.Label>\n <Form.Control\n as=\"textarea\"\n rows={4}\n placeholder={learnersPlaceholder}\n value={learners}\n onChange={(e) => setLearners(e.target.value)}\n />\n </Form.Group>\n <Form.Group className=\"mt-3\">\n <Form.Label>{notesLabel}</Form.Label>\n <Form.Control\n as=\"textarea\"\n rows={3}\n placeholder={notesPlaceholder}\n value={notes}\n onChange={(e) => setNotes(e.target.value)}\n />\n </Form.Group>\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <ActionRow>\n <Button variant=\"tertiary\" onClick={handleClose} disabled={isSubmitting}>\n {cancelLabel}\n </Button>\n <Button variant=\"primary\" onClick={handleSubmit} disabled={isSubmitting || !learners.trim()}>\n {submitLabel}\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default LearnerActionModal;\n"]}
@@ -0,0 +1,9 @@
1
+ interface RemoveExceptionModalProps {
2
+ isOpen: boolean;
3
+ email: string;
4
+ onClose: () => void;
5
+ onConfirm: () => void;
6
+ isSubmitting: boolean;
7
+ }
8
+ declare const RemoveExceptionModal: ({ isOpen, email, onClose, onConfirm, isSubmitting, }: RemoveExceptionModalProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default RemoveExceptionModal;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ActionRow, Button, ModalDialog } from '@openedx/paragon';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import messages from '../../certificates/messages';
5
+ const RemoveExceptionModal = ({ isOpen, email, onClose, onConfirm, isSubmitting, }) => {
6
+ const intl = useIntl();
7
+ return (_jsxs(ModalDialog, { isOpen: isOpen, onClose: onClose, hasCloseButton: false, title: intl.formatMessage(messages.removeExceptionModalTitle), className: "p-4", isOverflowVisible: false, children: [_jsx(ModalDialog.Header, { children: _jsx(ModalDialog.Title, { children: intl.formatMessage(messages.removeExceptionModalTitle) }) }), _jsx(ModalDialog.Body, { children: _jsx("p", { className: "mb-2.5", children: intl.formatMessage(messages.removeExceptionModalMessage, { email }) }) }), _jsx(ModalDialog.Footer, { children: _jsxs(ActionRow, { children: [_jsx(Button, { variant: "tertiary", onClick: onClose, disabled: isSubmitting, children: intl.formatMessage(messages.cancel) }), _jsx(Button, { variant: "primary", onClick: onConfirm, disabled: isSubmitting, children: intl.formatMessage(messages.removeExceptionAction) })] }) })] }));
8
+ };
9
+ export default RemoveExceptionModal;
10
+ //# sourceMappingURL=RemoveExceptionModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoveExceptionModal.js","sourceRoot":"","sources":["../../../src/certificates/components/RemoveExceptionModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAUlD,MAAM,oBAAoB,GAAG,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,YAAY,GACc,EAAE,EAAE;IAC9B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,CACL,MAAC,WAAW,IACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,KAAK,EACrB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAC7D,SAAS,EAAC,KAAK,EACf,iBAAiB,EAAE,KAAK,aAExB,KAAC,WAAW,CAAC,MAAM,cACjB,KAAC,WAAW,CAAC,KAAK,cACf,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,GACrC,GACD,EACrB,KAAC,WAAW,CAAC,IAAI,cACf,YAAG,SAAS,EAAC,QAAQ,YAClB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,GAClE,GACa,EACnB,KAAC,WAAW,CAAC,MAAM,cACjB,MAAC,SAAS,eACR,KAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,YAChE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAC7B,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,YACjE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,qBAAqB,CAAC,GAC5C,IACC,GACO,IACT,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,oBAAoB,CAAC","sourcesContent":["import { ActionRow, Button, ModalDialog } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from '@src/certificates/messages';\n\ninterface RemoveExceptionModalProps {\n isOpen: boolean,\n email: string,\n onClose: () => void,\n onConfirm: () => void,\n isSubmitting: boolean,\n}\n\nconst RemoveExceptionModal = ({\n isOpen,\n email,\n onClose,\n onConfirm,\n isSubmitting,\n}: RemoveExceptionModalProps) => {\n const intl = useIntl();\n\n return (\n <ModalDialog\n isOpen={isOpen}\n onClose={onClose}\n hasCloseButton={false}\n title={intl.formatMessage(messages.removeExceptionModalTitle)}\n className=\"p-4\"\n isOverflowVisible={false}\n >\n <ModalDialog.Header>\n <ModalDialog.Title>\n {intl.formatMessage(messages.removeExceptionModalTitle)}\n </ModalDialog.Title>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <p className=\"mb-2.5\">\n {intl.formatMessage(messages.removeExceptionModalMessage, { email })}\n </p>\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <ActionRow>\n <Button variant=\"tertiary\" onClick={onClose} disabled={isSubmitting}>\n {intl.formatMessage(messages.cancel)}\n </Button>\n <Button variant=\"primary\" onClick={onConfirm} disabled={isSubmitting}>\n {intl.formatMessage(messages.removeExceptionAction)}\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default RemoveExceptionModal;\n"]}
@@ -0,0 +1,9 @@
1
+ interface RemoveInvalidationModalProps {
2
+ isOpen: boolean;
3
+ email: string;
4
+ onClose: () => void;
5
+ onConfirm: () => void;
6
+ isSubmitting: boolean;
7
+ }
8
+ declare const RemoveInvalidationModal: ({ isOpen, email, onClose, onConfirm, isSubmitting, }: RemoveInvalidationModalProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default RemoveInvalidationModal;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ActionRow, Button, ModalDialog } from '@openedx/paragon';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import messages from '../../certificates/messages';
5
+ const RemoveInvalidationModal = ({ isOpen, email, onClose, onConfirm, isSubmitting, }) => {
6
+ const intl = useIntl();
7
+ return (_jsxs(ModalDialog, { isOpen: isOpen, onClose: onClose, hasCloseButton: false, title: intl.formatMessage(messages.removeInvalidationModalTitle), className: "p-4", isOverflowVisible: false, children: [_jsx(ModalDialog.Header, { children: _jsx(ModalDialog.Title, { children: intl.formatMessage(messages.removeInvalidationModalTitle) }) }), _jsx(ModalDialog.Body, { children: _jsx("p", { className: "mb-2.5", children: intl.formatMessage(messages.removeInvalidationModalMessage, { email }) }) }), _jsx(ModalDialog.Footer, { children: _jsxs(ActionRow, { children: [_jsx(Button, { variant: "tertiary", onClick: onClose, disabled: isSubmitting, children: intl.formatMessage(messages.cancel) }), _jsx(Button, { variant: "primary", onClick: onConfirm, disabled: isSubmitting, children: intl.formatMessage(messages.removeInvalidationAction) })] }) })] }));
8
+ };
9
+ export default RemoveInvalidationModal;
10
+ //# sourceMappingURL=RemoveInvalidationModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoveInvalidationModal.js","sourceRoot":"","sources":["../../../src/certificates/components/RemoveInvalidationModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAUlD,MAAM,uBAAuB,GAAG,CAAC,EAC/B,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,YAAY,GACiB,EAAE,EAAE;IACjC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,CACL,MAAC,WAAW,IACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,KAAK,EACrB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAChE,SAAS,EAAC,KAAK,EACf,iBAAiB,EAAE,KAAK,aAExB,KAAC,WAAW,CAAC,MAAM,cACjB,KAAC,WAAW,CAAC,KAAK,cACf,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,CAAC,GACxC,GACD,EACrB,KAAC,WAAW,CAAC,IAAI,cACf,YAAG,SAAS,EAAC,QAAQ,YAClB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,CAAC,GACrE,GACa,EACnB,KAAC,WAAW,CAAC,MAAM,cACjB,MAAC,SAAS,eACR,KAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,YAChE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAC7B,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,YACjE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAC/C,IACC,GACO,IACT,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,uBAAuB,CAAC","sourcesContent":["import { ActionRow, Button, ModalDialog } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from '@src/certificates/messages';\n\ninterface RemoveInvalidationModalProps {\n isOpen: boolean,\n email: string,\n onClose: () => void,\n onConfirm: () => void,\n isSubmitting: boolean,\n}\n\nconst RemoveInvalidationModal = ({\n isOpen,\n email,\n onClose,\n onConfirm,\n isSubmitting,\n}: RemoveInvalidationModalProps) => {\n const intl = useIntl();\n\n return (\n <ModalDialog\n isOpen={isOpen}\n onClose={onClose}\n hasCloseButton={false}\n title={intl.formatMessage(messages.removeInvalidationModalTitle)}\n className=\"p-4\"\n isOverflowVisible={false}\n >\n <ModalDialog.Header>\n <ModalDialog.Title>\n {intl.formatMessage(messages.removeInvalidationModalTitle)}\n </ModalDialog.Title>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <p className=\"mb-2.5\">\n {intl.formatMessage(messages.removeInvalidationModalMessage, { email })}\n </p>\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <ActionRow>\n <Button variant=\"tertiary\" onClick={onClose} disabled={isSubmitting}>\n {intl.formatMessage(messages.cancel)}\n </Button>\n <Button variant=\"primary\" onClick={onConfirm} disabled={isSubmitting}>\n {intl.formatMessage(messages.removeInvalidationAction)}\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default RemoveInvalidationModal;\n"]}
@@ -0,0 +1,15 @@
1
+ export declare const CERTIFICATES_PAGE_SIZE = 25;
2
+ export declare const CERTIFICATES_TABLE_PAGE_SIZE = 10;
3
+ export declare const TAB_KEYS: {
4
+ readonly ISSUED: "issued";
5
+ readonly HISTORY: "history";
6
+ };
7
+ export declare const ALERT_VARIANTS: {
8
+ readonly SUCCESS: "success";
9
+ readonly DANGER: "danger";
10
+ readonly WARNING: "warning";
11
+ readonly INFO: "info";
12
+ };
13
+ export declare const MODAL_TITLES: {
14
+ readonly ERROR: "Error";
15
+ };
@@ -0,0 +1,16 @@
1
+ export const CERTIFICATES_PAGE_SIZE = 25;
2
+ export const CERTIFICATES_TABLE_PAGE_SIZE = 10;
3
+ export const TAB_KEYS = {
4
+ ISSUED: 'issued',
5
+ HISTORY: 'history',
6
+ };
7
+ export const ALERT_VARIANTS = {
8
+ SUCCESS: 'success',
9
+ DANGER: 'danger',
10
+ WARNING: 'warning',
11
+ INFO: 'info',
12
+ };
13
+ export const MODAL_TITLES = {
14
+ ERROR: 'Error',
15
+ };
16
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/certificates/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,KAAK,EAAE,OAAO;CACN,CAAC","sourcesContent":["export const CERTIFICATES_PAGE_SIZE = 25;\nexport const CERTIFICATES_TABLE_PAGE_SIZE = 10;\n\nexport const TAB_KEYS = {\n ISSUED: 'issued',\n HISTORY: 'history',\n} as const;\n\nexport const ALERT_VARIANTS = {\n SUCCESS: 'success',\n DANGER: 'danger',\n WARNING: 'warning',\n INFO: 'info',\n} as const;\n\nexport const MODAL_TITLES = {\n ERROR: 'Error',\n} as const;\n"]}
@@ -0,0 +1,23 @@
1
+ import type { DataList, PaginationParams } from '../../types';
2
+ import type { CertificateData, CertificateGenerationHistory, CertificateQueryParams, GrantExceptionRequest, InstructorTask, InvalidateCertificateRequest, RemoveExceptionRequest, RemoveInvalidationRequest } from '../../certificates/types';
3
+ export declare const getIssuedCertificates: (courseId: string, params: CertificateQueryParams) => Promise<DataList<CertificateData>>;
4
+ export declare const getInstructorTasks: (courseId: string, params: PaginationParams) => Promise<DataList<InstructorTask>>;
5
+ export declare const grantBulkExceptions: (courseId: string, request: GrantExceptionRequest) => Promise<{
6
+ success: string[];
7
+ errors: {
8
+ learner: string;
9
+ message: string;
10
+ }[];
11
+ }>;
12
+ export declare const invalidateCertificate: (courseId: string, request: InvalidateCertificateRequest) => Promise<{
13
+ success: string[];
14
+ errors: {
15
+ learner: string;
16
+ message: string;
17
+ }[];
18
+ }>;
19
+ export declare const removeException: (courseId: string, request: RemoveExceptionRequest) => Promise<void>;
20
+ export declare const removeInvalidation: (courseId: string, request: RemoveInvalidationRequest) => Promise<void>;
21
+ export declare const toggleCertificateGeneration: (courseId: string, enable: boolean) => Promise<void>;
22
+ export declare const regenerateCertificates: (courseId: string, filter: string) => Promise<void>;
23
+ export declare const getCertificateGenerationHistory: (courseId: string, params: PaginationParams) => Promise<DataList<CertificateGenerationHistory>>;