@openedx/frontend-app-instructor-dashboard 1.0.0-alpha.4 → 1.0.0-alpha.41
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.
- package/dist/Main.d.ts +1 -1
- package/dist/Main.js +11 -18
- package/dist/Main.js.map +1 -1
- package/dist/app.js +0 -6
- package/dist/app.js.map +1 -1
- package/dist/certificates/CertificatesPage.d.ts +1 -0
- package/dist/certificates/CertificatesPage.js +315 -2
- package/dist/certificates/CertificatesPage.js.map +1 -1
- package/dist/certificates/CertificatesPage.scss +90 -0
- package/dist/certificates/components/CertificateTable.d.ts +14 -0
- package/dist/certificates/components/CertificateTable.js +88 -0
- package/dist/certificates/components/CertificateTable.js.map +1 -0
- package/dist/certificates/components/CertificatesPageHeader.d.ts +7 -0
- package/dist/certificates/components/CertificatesPageHeader.js +11 -0
- package/dist/certificates/components/CertificatesPageHeader.js.map +1 -0
- package/dist/certificates/components/CertificatesToolbar.d.ts +11 -0
- package/dist/certificates/components/CertificatesToolbar.js +33 -0
- package/dist/certificates/components/CertificatesToolbar.js.map +1 -0
- package/dist/certificates/components/DisableCertificatesModal.d.ts +9 -0
- package/dist/certificates/components/DisableCertificatesModal.js +24 -0
- package/dist/certificates/components/DisableCertificatesModal.js.map +1 -0
- package/dist/certificates/components/FilterDropdown.d.ts +8 -0
- package/dist/certificates/components/FilterDropdown.js +50 -0
- package/dist/certificates/components/FilterDropdown.js.map +1 -0
- package/dist/certificates/components/GenerateCertificatesModal.d.ts +9 -0
- package/dist/certificates/components/GenerateCertificatesModal.js +19 -0
- package/dist/certificates/components/GenerateCertificatesModal.js.map +1 -0
- package/dist/certificates/components/GenerationHistoryTable.d.ts +11 -0
- package/dist/certificates/components/GenerationHistoryTable.js +25 -0
- package/dist/certificates/components/GenerationHistoryTable.js.map +1 -0
- package/dist/certificates/components/GrantExceptionsModal.d.ts +9 -0
- package/dist/certificates/components/GrantExceptionsModal.js +55 -0
- package/dist/certificates/components/GrantExceptionsModal.js.map +1 -0
- package/dist/certificates/components/InvalidateCertificateModal.d.ts +8 -0
- package/dist/certificates/components/InvalidateCertificateModal.js +26 -0
- package/dist/certificates/components/InvalidateCertificateModal.js.map +1 -0
- package/dist/certificates/components/IssuedCertificatesTab.d.ts +18 -0
- package/dist/certificates/components/IssuedCertificatesTab.js +6 -0
- package/dist/certificates/components/IssuedCertificatesTab.js.map +1 -0
- package/dist/certificates/components/LearnerActionModal.d.ts +16 -0
- package/dist/certificates/components/LearnerActionModal.js +27 -0
- package/dist/certificates/components/LearnerActionModal.js.map +1 -0
- package/dist/certificates/components/RegenerateCertificatesModal.d.ts +11 -0
- package/dist/certificates/components/RegenerateCertificatesModal.js +46 -0
- package/dist/certificates/components/RegenerateCertificatesModal.js.map +1 -0
- package/dist/certificates/components/RemoveExceptionModal.d.ts +9 -0
- package/dist/certificates/components/RemoveExceptionModal.js +10 -0
- package/dist/certificates/components/RemoveExceptionModal.js.map +1 -0
- package/dist/certificates/components/RemoveInvalidationModal.d.ts +9 -0
- package/dist/certificates/components/RemoveInvalidationModal.js +10 -0
- package/dist/certificates/components/RemoveInvalidationModal.js.map +1 -0
- package/dist/certificates/constants.d.ts +15 -0
- package/dist/certificates/constants.js +16 -0
- package/dist/certificates/constants.js.map +1 -0
- package/dist/certificates/data/api.d.ts +30 -0
- package/dist/certificates/data/api.js +126 -0
- package/dist/certificates/data/api.js.map +1 -0
- package/dist/certificates/data/apiHook.d.ts +63 -0
- package/dist/certificates/data/apiHook.js +133 -0
- package/dist/certificates/data/apiHook.js.map +1 -0
- package/dist/certificates/data/queryKeys.d.ts +9 -0
- package/dist/certificates/data/queryKeys.js +9 -0
- package/dist/certificates/data/queryKeys.js.map +1 -0
- package/dist/certificates/messages.d.ts +548 -0
- package/dist/certificates/messages.js +550 -0
- package/dist/certificates/messages.js.map +1 -0
- package/dist/certificates/types.d.ts +66 -0
- package/dist/certificates/types.js +26 -0
- package/dist/certificates/types.js.map +1 -0
- package/dist/certificates/utils/errorHandling.d.ts +12 -0
- package/dist/certificates/utils/errorHandling.js +24 -0
- package/dist/certificates/utils/errorHandling.js.map +1 -0
- package/dist/certificates/utils/filterUtils.d.ts +4 -0
- package/dist/certificates/utils/filterUtils.js +31 -0
- package/dist/certificates/utils/filterUtils.js.map +1 -0
- package/dist/certificates/utils/index.d.ts +2 -0
- package/dist/certificates/utils/index.js +2 -0
- package/dist/certificates/utils/index.js.map +1 -0
- package/dist/components/ActionCard.d.ts +2 -2
- package/dist/components/ActionCard.js +1 -1
- package/dist/components/ActionCard.js.map +1 -1
- package/dist/components/CodeEditor.d.ts +5 -0
- package/dist/components/CodeEditor.js +34 -0
- package/dist/components/CodeEditor.js.map +1 -0
- package/dist/components/PendingTasks.d.ts +3 -1
- package/dist/components/PendingTasks.js +3 -2
- package/dist/components/PendingTasks.js.map +1 -1
- package/dist/components/SpecifyLearnerField.d.ts +4 -1
- package/dist/components/SpecifyLearnerField.js +55 -15
- package/dist/components/SpecifyLearnerField.js.map +1 -1
- package/dist/components/SpecifyProblemField.d.ts +13 -0
- package/dist/components/SpecifyProblemField.js +52 -0
- package/dist/components/SpecifyProblemField.js.map +1 -0
- package/dist/components/UsernameFilter.d.ts +7 -0
- package/dist/components/UsernameFilter.js +19 -0
- package/dist/components/UsernameFilter.js.map +1 -0
- package/dist/components/messages.d.ts +45 -0
- package/dist/components/messages.js +45 -0
- package/dist/components/messages.js.map +1 -1
- package/dist/courseInfo/types.d.ts +5 -0
- package/dist/courseInfo/types.js.map +1 -1
- package/dist/courseTeam/CourseTeamPage.js +25 -2
- package/dist/courseTeam/CourseTeamPage.js.map +1 -1
- package/dist/courseTeam/components/AddTeamMemberModal.d.ts +6 -0
- package/dist/courseTeam/components/AddTeamMemberModal.js +61 -0
- package/dist/courseTeam/components/AddTeamMemberModal.js.map +1 -0
- package/dist/courseTeam/components/EditTeamMemberModal.d.ts +8 -0
- package/dist/courseTeam/components/EditTeamMemberModal.js +102 -0
- package/dist/courseTeam/components/EditTeamMemberModal.js.map +1 -0
- package/dist/courseTeam/components/MembersContent.d.ts +6 -0
- package/dist/courseTeam/components/MembersContent.js +48 -0
- package/dist/courseTeam/components/MembersContent.js.map +1 -0
- package/dist/courseTeam/components/RoleFilter.d.ts +7 -0
- package/dist/courseTeam/components/RoleFilter.js +22 -0
- package/dist/courseTeam/components/RoleFilter.js.map +1 -0
- package/dist/courseTeam/components/RolesContent.d.ts +3 -0
- package/dist/courseTeam/components/RolesContent.js +25 -0
- package/dist/courseTeam/components/RolesContent.js.map +1 -0
- package/dist/courseTeam/constants.d.ts +3 -0
- package/dist/courseTeam/constants.js +4 -0
- package/dist/courseTeam/constants.js.map +1 -0
- package/dist/courseTeam/data/api.d.ts +6 -0
- package/dist/courseTeam/data/api.js +38 -0
- package/dist/courseTeam/data/api.js.map +1 -0
- package/dist/courseTeam/data/apiHook.d.ts +8 -0
- package/dist/courseTeam/data/apiHook.js +32 -0
- package/dist/courseTeam/data/apiHook.js.map +1 -0
- package/dist/courseTeam/data/queryKeys.d.ts +7 -0
- package/dist/courseTeam/data/queryKeys.js +14 -0
- package/dist/courseTeam/data/queryKeys.js.map +1 -0
- package/dist/courseTeam/messages.d.ts +258 -0
- package/dist/courseTeam/messages.js +260 -0
- package/dist/courseTeam/messages.js.map +1 -0
- package/dist/courseTeam/types.d.ts +29 -0
- package/dist/courseTeam/types.js +3 -0
- package/dist/courseTeam/types.js.map +1 -0
- package/dist/data/api.d.ts +2 -1
- package/dist/data/api.js +9 -3
- package/dist/data/api.js.map +1 -1
- package/dist/data/apiHook.d.ts +1 -0
- package/dist/data/apiHook.js +11 -2
- package/dist/data/apiHook.js.map +1 -1
- package/dist/data/queryKeys.d.ts +4 -0
- package/dist/data/queryKeys.js +4 -0
- package/dist/data/queryKeys.js.map +1 -1
- package/dist/data/utils.d.ts +2 -0
- package/dist/data/utils.js +9 -0
- package/dist/data/utils.js.map +1 -0
- package/dist/dateExtensions/components/AddExtensionModal.d.ts +1 -1
- package/dist/dateExtensions/components/AddExtensionModal.js +6 -7
- package/dist/dateExtensions/components/AddExtensionModal.js.map +1 -1
- package/dist/dateExtensions/components/DateExtensionsList.js +3 -14
- package/dist/dateExtensions/components/DateExtensionsList.js.map +1 -1
- package/dist/dateExtensions/data/apiHook.d.ts +2 -2
- package/dist/dateExtensions/data/apiHook.js +4 -4
- package/dist/dateExtensions/data/apiHook.js.map +1 -1
- package/dist/dateExtensions/messages.d.ts +0 -5
- package/dist/dateExtensions/messages.js +1 -6
- package/dist/dateExtensions/messages.js.map +1 -1
- package/dist/enrollments/EnrollmentsPage.js +34 -7
- package/dist/enrollments/EnrollmentsPage.js.map +1 -1
- package/dist/enrollments/components/AddBetaTestersModal.d.ts +6 -0
- package/dist/enrollments/components/AddBetaTestersModal.js +69 -0
- package/dist/enrollments/components/AddBetaTestersModal.js.map +1 -0
- package/dist/enrollments/components/EnrollLearnersModal.d.ts +6 -0
- package/dist/enrollments/components/EnrollLearnersModal.js +53 -0
- package/dist/enrollments/components/EnrollLearnersModal.js.map +1 -0
- package/dist/enrollments/components/EnrollmentStatusModal.js +3 -3
- package/dist/enrollments/components/EnrollmentStatusModal.js.map +1 -1
- package/dist/enrollments/components/EnrollmentsList.d.ts +3 -2
- package/dist/enrollments/components/EnrollmentsList.js +13 -14
- package/dist/enrollments/components/EnrollmentsList.js.map +1 -1
- package/dist/enrollments/components/UnenrollModal.d.ts +1 -1
- package/dist/enrollments/components/UnenrollModal.js +29 -3
- package/dist/enrollments/components/UnenrollModal.js.map +1 -1
- package/dist/enrollments/components/UpdateBetaTesterModal.d.ts +8 -0
- package/dist/enrollments/components/UpdateBetaTesterModal.js +72 -0
- package/dist/enrollments/components/UpdateBetaTesterModal.js.map +1 -0
- package/dist/enrollments/data/api.d.ts +3 -1
- package/dist/enrollments/data/api.js +11 -1
- package/dist/enrollments/data/api.js.map +1 -1
- package/dist/enrollments/data/apiHook.d.ts +5 -3
- package/dist/enrollments/data/apiHook.js +21 -3
- package/dist/enrollments/data/apiHook.js.map +1 -1
- package/dist/enrollments/data/queryKeys.d.ts +1 -1
- package/dist/enrollments/data/queryKeys.js.map +1 -1
- package/dist/enrollments/messages.d.ts +131 -1
- package/dist/enrollments/messages.js +136 -6
- package/dist/enrollments/messages.js.map +1 -1
- package/dist/enrollments/types.d.ts +25 -0
- package/dist/enrollments/types.js.map +1 -1
- package/dist/grading/GradingPage.js +15 -2
- package/dist/grading/GradingPage.js.map +1 -1
- package/dist/grading/components/GradingActionRow.d.ts +2 -0
- package/dist/grading/components/GradingActionRow.js +20 -0
- package/dist/grading/components/GradingActionRow.js.map +1 -0
- package/dist/grading/components/GradingConfigurationModal.d.ts +6 -0
- package/dist/grading/components/GradingConfigurationModal.js +15 -0
- package/dist/grading/components/GradingConfigurationModal.js.map +1 -0
- package/dist/grading/components/GradingLearnerContent.d.ts +7 -0
- package/dist/grading/components/GradingLearnerContent.js +199 -0
- package/dist/grading/components/GradingLearnerContent.js.map +1 -0
- package/dist/grading/data/api.d.ts +6 -0
- package/dist/grading/data/api.js +59 -0
- package/dist/grading/data/api.js.map +1 -0
- package/dist/grading/data/apiHook.d.ts +6 -0
- package/dist/grading/data/apiHook.js +29 -0
- package/dist/grading/data/apiHook.js.map +1 -0
- package/dist/grading/data/queryKeys.d.ts +9 -0
- package/dist/grading/data/queryKeys.js +8 -0
- package/dist/grading/data/queryKeys.js.map +1 -0
- package/dist/grading/messages.d.ts +248 -0
- package/dist/grading/messages.js +250 -0
- package/dist/grading/messages.js.map +1 -0
- package/dist/grading/types.d.ts +11 -0
- package/dist/grading/types.js +2 -0
- package/dist/grading/types.js.map +1 -0
- package/dist/hooks/useDebouncedFilter.d.ts +1 -0
- package/dist/hooks/useDebouncedFilter.js +5 -0
- package/dist/hooks/useDebouncedFilter.js.map +1 -1
- package/dist/instructorNav/InstructorNav.js +16 -4
- package/dist/instructorNav/InstructorNav.js.map +1 -1
- package/dist/messages.d.ts +8 -0
- package/dist/messages.js +10 -0
- package/dist/messages.js.map +1 -0
- package/dist/pageWrapper/PageWrapper.js +3 -1
- package/dist/pageWrapper/PageWrapper.js.map +1 -1
- package/dist/providers/AccessErrorObserver.d.ts +9 -0
- package/dist/providers/AccessErrorObserver.js +35 -0
- package/dist/providers/AccessErrorObserver.js.map +1 -0
- package/dist/providers/AccessErrorProvider.d.ts +19 -0
- package/dist/providers/AccessErrorProvider.js +51 -0
- package/dist/providers/AccessErrorProvider.js.map +1 -0
- package/dist/providers/AlertProvider.js +1 -1
- package/dist/providers/AlertProvider.js.map +1 -1
- package/dist/providers/messages.d.ts +33 -0
- package/dist/providers/messages.js +35 -0
- package/dist/providers/messages.js.map +1 -0
- package/dist/provides.d.ts +2 -1
- package/dist/provides.js +3 -2
- package/dist/provides.js.map +1 -1
- package/dist/routes.d.ts +1 -1
- package/dist/routes.js +2 -2
- package/dist/routes.js.map +1 -1
- package/dist/slots/CourseInfoSlot/CourseInfoSlot.d.ts +2 -0
- package/dist/slots/CourseInfoSlot/CourseInfoSlot.js +14 -0
- package/dist/slots/CourseInfoSlot/CourseInfoSlot.js.map +1 -0
- package/dist/slots.js +13 -1
- package/dist/slots.js.map +1 -1
- package/dist/specialExams/SpecialExamsPage.js +14 -2
- package/dist/specialExams/SpecialExamsPage.js.map +1 -1
- package/dist/specialExams/components/AddAllowanceModal.d.ts +6 -0
- package/dist/specialExams/components/AddAllowanceModal.js +84 -0
- package/dist/specialExams/components/AddAllowanceModal.js.map +1 -0
- package/dist/specialExams/components/Allowances.d.ts +2 -0
- package/dist/specialExams/components/Allowances.js +89 -0
- package/dist/specialExams/components/Allowances.js.map +1 -0
- package/dist/specialExams/components/AllowancesList.d.ts +8 -0
- package/dist/specialExams/components/AllowancesList.js +63 -0
- package/dist/specialExams/components/AllowancesList.js.map +1 -0
- package/dist/specialExams/components/AttemptsList.d.ts +3 -0
- package/dist/specialExams/components/AttemptsList.js +50 -0
- package/dist/specialExams/components/AttemptsList.js.map +1 -0
- package/dist/specialExams/components/DeleteAllowanceModal.d.ts +8 -0
- package/dist/specialExams/components/DeleteAllowanceModal.js +29 -0
- package/dist/specialExams/components/DeleteAllowanceModal.js.map +1 -0
- package/dist/specialExams/components/EditAllowanceModal.d.ts +8 -0
- package/dist/specialExams/components/EditAllowanceModal.js +62 -0
- package/dist/specialExams/components/EditAllowanceModal.js.map +1 -0
- package/dist/specialExams/constants.d.ts +43 -0
- package/dist/specialExams/constants.js +19 -0
- package/dist/specialExams/constants.js.map +1 -0
- package/dist/specialExams/data/api.d.ts +7 -0
- package/dist/specialExams/data/api.js +55 -0
- package/dist/specialExams/data/api.js.map +1 -0
- package/dist/specialExams/data/apiHook.d.ts +6 -0
- package/dist/specialExams/data/apiHook.js +37 -0
- package/dist/specialExams/data/apiHook.js.map +1 -0
- package/dist/specialExams/data/queryKeys.d.ts +8 -0
- package/dist/specialExams/data/queryKeys.js +9 -0
- package/dist/specialExams/data/queryKeys.js.map +1 -0
- package/dist/specialExams/messages.d.ts +228 -0
- package/dist/specialExams/messages.js +230 -0
- package/dist/specialExams/messages.js.map +1 -0
- package/dist/specialExams/types.d.ts +65 -0
- package/dist/specialExams/types.js +2 -0
- package/dist/specialExams/types.js.map +1 -0
- package/dist/style.scss +16 -0
- package/dist/testUtils.js +2 -2
- package/dist/testUtils.js.map +1 -1
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/formatters.d.ts +5 -0
- package/dist/utils/formatters.js +10 -0
- package/dist/utils/formatters.js.map +1 -1
- package/package.json +6 -6
- package/dist/app.scss +0 -10
- package/dist/providers/QueryProvider.d.ts +0 -6
- package/dist/providers/QueryProvider.js +0 -16
- package/dist/providers/QueryProvider.js.map +0 -1
- package/dist/providers.d.ts +0 -3
- package/dist/providers.js +0 -8
- package/dist/providers.js.map +0 -1
|
@@ -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":"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","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,11 @@
|
|
|
1
|
+
import { CertificateFilter } from '../../certificates/types';
|
|
2
|
+
interface RegenerateCertificatesModalProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onConfirm: () => void;
|
|
6
|
+
isSubmitting: boolean;
|
|
7
|
+
filter: CertificateFilter;
|
|
8
|
+
learnerCount: number;
|
|
9
|
+
}
|
|
10
|
+
declare const RegenerateCertificatesModal: ({ isOpen, onClose, onConfirm, isSubmitting, filter, learnerCount, }: RegenerateCertificatesModalProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export default RegenerateCertificatesModal;
|
|
@@ -0,0 +1,46 @@
|
|
|
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 { useMemo } from 'react';
|
|
5
|
+
import { CertificateFilter } from '../../certificates/types';
|
|
6
|
+
import messages from '../../certificates/messages';
|
|
7
|
+
const RegenerateCertificatesModal = ({ isOpen, onClose, onConfirm, isSubmitting, filter, learnerCount, }) => {
|
|
8
|
+
const intl = useIntl();
|
|
9
|
+
const { title, message } = useMemo(() => {
|
|
10
|
+
switch (filter) {
|
|
11
|
+
case CertificateFilter.RECEIVED:
|
|
12
|
+
return {
|
|
13
|
+
title: intl.formatMessage(messages.regenerateModalTitleReceived),
|
|
14
|
+
message: intl.formatMessage(messages.regenerateModalMessageReceived, { number: learnerCount }),
|
|
15
|
+
};
|
|
16
|
+
case CertificateFilter.NOT_RECEIVED:
|
|
17
|
+
return {
|
|
18
|
+
title: intl.formatMessage(messages.regenerateModalTitleNotReceived),
|
|
19
|
+
message: intl.formatMessage(messages.regenerateModalMessageNotReceived, { number: learnerCount }),
|
|
20
|
+
};
|
|
21
|
+
case CertificateFilter.AUDIT_PASSING:
|
|
22
|
+
return {
|
|
23
|
+
title: intl.formatMessage(messages.regenerateModalTitleAuditPassing),
|
|
24
|
+
message: intl.formatMessage(messages.regenerateModalMessageAuditPassing, { number: learnerCount }),
|
|
25
|
+
};
|
|
26
|
+
case CertificateFilter.AUDIT_NOT_PASSING:
|
|
27
|
+
return {
|
|
28
|
+
title: intl.formatMessage(messages.regenerateModalTitleAuditNotPassing),
|
|
29
|
+
message: intl.formatMessage(messages.regenerateModalMessageAuditNotPassing, { number: learnerCount }),
|
|
30
|
+
};
|
|
31
|
+
case CertificateFilter.ERROR_STATE:
|
|
32
|
+
return {
|
|
33
|
+
title: intl.formatMessage(messages.regenerateModalTitleErrorState),
|
|
34
|
+
message: intl.formatMessage(messages.regenerateModalMessageErrorState, { number: learnerCount }),
|
|
35
|
+
};
|
|
36
|
+
default:
|
|
37
|
+
return {
|
|
38
|
+
title: intl.formatMessage(messages.regenerateModalTitleDefault),
|
|
39
|
+
message: intl.formatMessage(messages.regenerateModalMessageDefault, { number: learnerCount }),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}, [filter, learnerCount, intl]);
|
|
43
|
+
return (_jsxs(ModalDialog, { title: title, onClose: onClose, isOpen: isOpen, size: "md", hasCloseButton: false, isOverflowVisible: false, children: [_jsx(ModalDialog.Body, { 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.regenerate) })] }) })] }));
|
|
44
|
+
};
|
|
45
|
+
export default RegenerateCertificatesModal;
|
|
46
|
+
//# sourceMappingURL=RegenerateCertificatesModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegenerateCertificatesModal.js","sourceRoot":"","sources":["../../../src/certificates/components/RegenerateCertificatesModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ActionRow, Button, ModalDialog } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport { useMemo } from 'react';\nimport { CertificateFilter } from '@src/certificates/types';\nimport messages from '@src/certificates/messages';\n\ninterface RegenerateCertificatesModalProps {\n isOpen: boolean,\n onClose: () => void,\n onConfirm: () => void,\n isSubmitting: boolean,\n filter: CertificateFilter,\n learnerCount: number,\n}\n\nconst RegenerateCertificatesModal = ({\n isOpen,\n onClose,\n onConfirm,\n isSubmitting,\n filter,\n learnerCount,\n}: RegenerateCertificatesModalProps) => {\n const intl = useIntl();\n\n const { title, message } = useMemo(() => {\n switch (filter) {\n case CertificateFilter.RECEIVED:\n return {\n title: intl.formatMessage(messages.regenerateModalTitleReceived),\n message: intl.formatMessage(messages.regenerateModalMessageReceived, { number: learnerCount }),\n };\n case CertificateFilter.NOT_RECEIVED:\n return {\n title: intl.formatMessage(messages.regenerateModalTitleNotReceived),\n message: intl.formatMessage(messages.regenerateModalMessageNotReceived, { number: learnerCount }),\n };\n case CertificateFilter.AUDIT_PASSING:\n return {\n title: intl.formatMessage(messages.regenerateModalTitleAuditPassing),\n message: intl.formatMessage(messages.regenerateModalMessageAuditPassing, { number: learnerCount }),\n };\n case CertificateFilter.AUDIT_NOT_PASSING:\n return {\n title: intl.formatMessage(messages.regenerateModalTitleAuditNotPassing),\n message: intl.formatMessage(messages.regenerateModalMessageAuditNotPassing, { number: learnerCount }),\n };\n case CertificateFilter.ERROR_STATE:\n return {\n title: intl.formatMessage(messages.regenerateModalTitleErrorState),\n message: intl.formatMessage(messages.regenerateModalMessageErrorState, { number: learnerCount }),\n };\n default:\n return {\n title: intl.formatMessage(messages.regenerateModalTitleDefault),\n message: intl.formatMessage(messages.regenerateModalMessageDefault, { number: learnerCount }),\n };\n }\n }, [filter, learnerCount, intl]);\n\n return (\n <ModalDialog\n title={title}\n onClose={onClose}\n isOpen={isOpen}\n size=\"md\"\n hasCloseButton={false}\n isOverflowVisible={false}\n >\n <ModalDialog.Body>\n <p>{message}</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.regenerate)}\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default RegenerateCertificatesModal;\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,30 @@
|
|
|
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 uploadBulkExceptionsCsv: (courseId: string, file: File) => Promise<{
|
|
13
|
+
success: string[];
|
|
14
|
+
errors: {
|
|
15
|
+
learner: string;
|
|
16
|
+
message: string;
|
|
17
|
+
}[];
|
|
18
|
+
}>;
|
|
19
|
+
export declare const invalidateCertificate: (courseId: string, request: InvalidateCertificateRequest) => Promise<{
|
|
20
|
+
success: string[];
|
|
21
|
+
errors: {
|
|
22
|
+
learner: string;
|
|
23
|
+
message: string;
|
|
24
|
+
}[];
|
|
25
|
+
}>;
|
|
26
|
+
export declare const removeException: (courseId: string, request: RemoveExceptionRequest) => Promise<void>;
|
|
27
|
+
export declare const removeInvalidation: (courseId: string, request: RemoveInvalidationRequest) => Promise<void>;
|
|
28
|
+
export declare const toggleCertificateGeneration: (courseId: string, enable: boolean) => Promise<void>;
|
|
29
|
+
export declare const regenerateCertificates: (courseId: string, filter: string, onlyWithoutCertificate?: boolean) => Promise<void>;
|
|
30
|
+
export declare const getCertificateGenerationHistory: (courseId: string, params: PaginationParams) => Promise<DataList<CertificateGenerationHistory>>;
|
|
@@ -0,0 +1,126 @@
|
|
|
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 { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';
|
|
11
|
+
import { getApiBaseUrl } from '../../data/api';
|
|
12
|
+
export const getIssuedCertificates = (courseId, params) => __awaiter(void 0, void 0, void 0, function* () {
|
|
13
|
+
const { data } = yield getAuthenticatedHttpClient().get(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/issued`, {
|
|
14
|
+
params: {
|
|
15
|
+
page: params.page + 1,
|
|
16
|
+
page_size: params.pageSize,
|
|
17
|
+
filter: params.filter,
|
|
18
|
+
search: params.search,
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
return camelCaseObject(data);
|
|
22
|
+
});
|
|
23
|
+
export const getInstructorTasks = (courseId, params) => __awaiter(void 0, void 0, void 0, function* () {
|
|
24
|
+
const { data } = yield getAuthenticatedHttpClient().get(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/instructor_tasks`, {
|
|
25
|
+
params: {
|
|
26
|
+
page: params.page + 1,
|
|
27
|
+
page_size: params.pageSize,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
return camelCaseObject(data);
|
|
31
|
+
});
|
|
32
|
+
export const grantBulkExceptions = (courseId, request) => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
|
+
const { data } = yield getAuthenticatedHttpClient().post(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/exceptions`, {
|
|
34
|
+
learners: request.learners,
|
|
35
|
+
notes: request.notes,
|
|
36
|
+
});
|
|
37
|
+
return camelCaseObject(data);
|
|
38
|
+
});
|
|
39
|
+
export const uploadBulkExceptionsCsv = (courseId, file) => __awaiter(void 0, void 0, void 0, function* () {
|
|
40
|
+
const formData = new FormData();
|
|
41
|
+
formData.append('file', file);
|
|
42
|
+
const { data } = yield getAuthenticatedHttpClient().post(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/exceptions/bulk`, formData, {
|
|
43
|
+
headers: {
|
|
44
|
+
'Content-Type': 'multipart/form-data',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
return camelCaseObject(data);
|
|
48
|
+
});
|
|
49
|
+
export const invalidateCertificate = (courseId, request) => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
|
+
const { data } = yield getAuthenticatedHttpClient().post(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/invalidations`, {
|
|
51
|
+
learners: request.learners,
|
|
52
|
+
notes: request.notes,
|
|
53
|
+
});
|
|
54
|
+
return camelCaseObject(data);
|
|
55
|
+
});
|
|
56
|
+
export const removeException = (courseId, request) => __awaiter(void 0, void 0, void 0, function* () {
|
|
57
|
+
yield getAuthenticatedHttpClient().delete(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/exceptions`, {
|
|
58
|
+
data: {
|
|
59
|
+
username: request.username,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
export const removeInvalidation = (courseId, request) => __awaiter(void 0, void 0, void 0, function* () {
|
|
64
|
+
const httpClient = getAuthenticatedHttpClient();
|
|
65
|
+
const url = `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/invalidations`;
|
|
66
|
+
const payload = {
|
|
67
|
+
username: request.username,
|
|
68
|
+
};
|
|
69
|
+
yield httpClient.delete(url, {
|
|
70
|
+
data: payload,
|
|
71
|
+
headers: {
|
|
72
|
+
'Content-Type': 'application/json',
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
export const toggleCertificateGeneration = (courseId, enable) => __awaiter(void 0, void 0, void 0, function* () {
|
|
77
|
+
yield getAuthenticatedHttpClient().post(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/toggle_generation`, {
|
|
78
|
+
enabled: enable,
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
export const regenerateCertificates = (courseId, filter, onlyWithoutCertificate) => __awaiter(void 0, void 0, void 0, function* () {
|
|
82
|
+
const body = {};
|
|
83
|
+
// Map filter to backend parameters (must match backend filter logic)
|
|
84
|
+
switch (filter) {
|
|
85
|
+
case 'all':
|
|
86
|
+
body.student_set = 'all';
|
|
87
|
+
break;
|
|
88
|
+
case 'received':
|
|
89
|
+
body.statuses = ['downloadable'];
|
|
90
|
+
break;
|
|
91
|
+
case 'not_received':
|
|
92
|
+
// Match backend filter: notpassing or unavailable
|
|
93
|
+
body.statuses = ['notpassing', 'unavailable'];
|
|
94
|
+
break;
|
|
95
|
+
case 'audit_passing':
|
|
96
|
+
body.statuses = ['audit_passing'];
|
|
97
|
+
break;
|
|
98
|
+
case 'audit_not_passing':
|
|
99
|
+
body.statuses = ['audit_notpassing'];
|
|
100
|
+
break;
|
|
101
|
+
case 'error':
|
|
102
|
+
body.statuses = ['error'];
|
|
103
|
+
break;
|
|
104
|
+
case 'granted_exceptions':
|
|
105
|
+
// For granted exceptions, use different student_set based on option
|
|
106
|
+
body.student_set = onlyWithoutCertificate ? 'allowlisted_not_generated' : 'allowlisted';
|
|
107
|
+
break;
|
|
108
|
+
case 'invalidated':
|
|
109
|
+
// Invalidated certificates have unavailable status
|
|
110
|
+
body.statuses = ['unavailable'];
|
|
111
|
+
break;
|
|
112
|
+
default:
|
|
113
|
+
body.student_set = 'all';
|
|
114
|
+
}
|
|
115
|
+
yield getAuthenticatedHttpClient().post(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/regenerate`, body);
|
|
116
|
+
});
|
|
117
|
+
export const getCertificateGenerationHistory = (courseId, params) => __awaiter(void 0, void 0, void 0, function* () {
|
|
118
|
+
const { data } = yield getAuthenticatedHttpClient().get(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/generation_history`, {
|
|
119
|
+
params: {
|
|
120
|
+
page: params.page + 1,
|
|
121
|
+
page_size: params.pageSize,
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
return camelCaseObject(data);
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/certificates/data/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { getApiBaseUrl } from '@src/data/api';\nimport type { DataList, PaginationParams } from '@src/types';\nimport type {\n CertificateData,\n CertificateGenerationHistory,\n CertificateQueryParams,\n GrantExceptionRequest,\n InstructorTask,\n InvalidateCertificateRequest,\n RemoveExceptionRequest,\n RemoveInvalidationRequest,\n} from '@src/certificates/types';\n\nexport const getIssuedCertificates = async (\n courseId: string,\n params: CertificateQueryParams,\n): Promise<DataList<CertificateData>> => {\n const { data } = await getAuthenticatedHttpClient().get(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/issued`,\n {\n params: {\n page: params.page + 1,\n page_size: params.pageSize,\n filter: params.filter,\n search: params.search,\n },\n },\n );\n return camelCaseObject(data);\n};\n\nexport const getInstructorTasks = async (\n courseId: string,\n params: PaginationParams,\n): Promise<DataList<InstructorTask>> => {\n const { data } = await getAuthenticatedHttpClient().get(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/instructor_tasks`,\n {\n params: {\n page: params.page + 1,\n page_size: params.pageSize,\n },\n },\n );\n return camelCaseObject(data);\n};\n\nexport const grantBulkExceptions = async (\n courseId: string,\n request: GrantExceptionRequest,\n): Promise<{ success: string[], errors: { learner: string, message: string }[] }> => {\n const { data } = await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/exceptions`,\n {\n learners: request.learners,\n notes: request.notes,\n },\n );\n return camelCaseObject(data);\n};\n\nexport const uploadBulkExceptionsCsv = async (\n courseId: string,\n file: File,\n): Promise<{ success: string[], errors: { learner: string, message: string }[] }> => {\n const formData = new FormData();\n formData.append('file', file);\n\n const { data } = await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/exceptions/bulk`,\n formData,\n {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n },\n );\n return camelCaseObject(data);\n};\n\nexport const invalidateCertificate = async (\n courseId: string,\n request: InvalidateCertificateRequest,\n): Promise<{ success: string[], errors: { learner: string, message: string }[] }> => {\n const { data } = await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/invalidations`,\n {\n learners: request.learners,\n notes: request.notes,\n },\n );\n return camelCaseObject(data);\n};\n\nexport const removeException = async (\n courseId: string,\n request: RemoveExceptionRequest,\n): Promise<void> => {\n await getAuthenticatedHttpClient().delete(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/exceptions`,\n {\n data: {\n username: request.username,\n },\n },\n );\n};\n\nexport const removeInvalidation = async (\n courseId: string,\n request: RemoveInvalidationRequest,\n): Promise<void> => {\n const httpClient = getAuthenticatedHttpClient();\n const url = `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/invalidations`;\n const payload = {\n username: request.username,\n };\n\n await httpClient.delete(url, {\n data: payload,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n};\n\nexport const toggleCertificateGeneration = async (\n courseId: string,\n enable: boolean,\n): Promise<void> => {\n await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/toggle_generation`,\n {\n enabled: enable,\n },\n );\n};\n\nexport const regenerateCertificates = async (\n courseId: string,\n filter: string,\n onlyWithoutCertificate?: boolean,\n): Promise<void> => {\n const body: { statuses?: string[], student_set?: string } = {};\n\n // Map filter to backend parameters (must match backend filter logic)\n switch (filter) {\n case 'all':\n body.student_set = 'all';\n break;\n case 'received':\n body.statuses = ['downloadable'];\n break;\n case 'not_received':\n // Match backend filter: notpassing or unavailable\n body.statuses = ['notpassing', 'unavailable'];\n break;\n case 'audit_passing':\n body.statuses = ['audit_passing'];\n break;\n case 'audit_not_passing':\n body.statuses = ['audit_notpassing'];\n break;\n case 'error':\n body.statuses = ['error'];\n break;\n case 'granted_exceptions':\n // For granted exceptions, use different student_set based on option\n body.student_set = onlyWithoutCertificate ? 'allowlisted_not_generated' : 'allowlisted';\n break;\n case 'invalidated':\n // Invalidated certificates have unavailable status\n body.statuses = ['unavailable'];\n break;\n default:\n body.student_set = 'all';\n }\n\n await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/regenerate`,\n body,\n );\n};\n\nexport const getCertificateGenerationHistory = async (\n courseId: string,\n params: PaginationParams,\n): Promise<DataList<CertificateGenerationHistory>> => {\n const { data } = await getAuthenticatedHttpClient().get(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/certificates/generation_history`,\n {\n params: {\n page: params.page + 1,\n page_size: params.pageSize,\n },\n },\n );\n return camelCaseObject(data);\n};\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { PaginationParams } from '../../types';
|
|
2
|
+
import type { CertificateQueryParams, GrantExceptionRequest, InvalidateCertificateRequest, RemoveExceptionRequest, RemoveInvalidationRequest } from '../../certificates/types';
|
|
3
|
+
/**
|
|
4
|
+
* Hook to fetch issued certificates
|
|
5
|
+
*/
|
|
6
|
+
export declare const useIssuedCertificates: (courseId: string, params: CertificateQueryParams) => import("@tanstack/react-query").UseQueryResult<import("../../types").DataList<import("../../certificates/types").CertificateData>, Error>;
|
|
7
|
+
/**
|
|
8
|
+
* Hook to fetch instructor tasks
|
|
9
|
+
*/
|
|
10
|
+
export declare const useInstructorTasks: (courseId: string, params: PaginationParams) => import("@tanstack/react-query").UseQueryResult<import("../../types").DataList<import("../../certificates/types").InstructorTask>, Error>;
|
|
11
|
+
/**
|
|
12
|
+
* Hook to fetch certificate generation history
|
|
13
|
+
*/
|
|
14
|
+
export declare const useCertificateGenerationHistory: (courseId: string, params: PaginationParams) => import("@tanstack/react-query").UseQueryResult<import("../../types").DataList<import("../../certificates/types").CertificateGenerationHistory>, Error>;
|
|
15
|
+
/**
|
|
16
|
+
* Hook to grant bulk certificate exceptions
|
|
17
|
+
*/
|
|
18
|
+
export declare const useGrantBulkExceptions: (courseId: string) => import("@tanstack/react-query").UseMutationResult<{
|
|
19
|
+
success: string[];
|
|
20
|
+
errors: {
|
|
21
|
+
learner: string;
|
|
22
|
+
message: string;
|
|
23
|
+
}[];
|
|
24
|
+
}, Error, GrantExceptionRequest, unknown>;
|
|
25
|
+
/**
|
|
26
|
+
* Hook to upload bulk certificate exceptions via CSV
|
|
27
|
+
*/
|
|
28
|
+
export declare const useUploadBulkExceptionsCsv: (courseId: string) => import("@tanstack/react-query").UseMutationResult<{
|
|
29
|
+
success: string[];
|
|
30
|
+
errors: {
|
|
31
|
+
learner: string;
|
|
32
|
+
message: string;
|
|
33
|
+
}[];
|
|
34
|
+
}, Error, File, unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* Hook to invalidate certificate
|
|
37
|
+
*/
|
|
38
|
+
export declare const useInvalidateCertificate: (courseId: string) => import("@tanstack/react-query").UseMutationResult<{
|
|
39
|
+
success: string[];
|
|
40
|
+
errors: {
|
|
41
|
+
learner: string;
|
|
42
|
+
message: string;
|
|
43
|
+
}[];
|
|
44
|
+
}, Error, InvalidateCertificateRequest, unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* Hook to remove certificate exception
|
|
47
|
+
*/
|
|
48
|
+
export declare const useRemoveException: (courseId: string) => import("@tanstack/react-query").UseMutationResult<void, Error, RemoveExceptionRequest, unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* Hook to remove certificate invalidation
|
|
51
|
+
*/
|
|
52
|
+
export declare const useRemoveInvalidation: (courseId: string) => import("@tanstack/react-query").UseMutationResult<void, Error, RemoveInvalidationRequest, unknown>;
|
|
53
|
+
/**
|
|
54
|
+
* Hook to toggle certificate generation
|
|
55
|
+
*/
|
|
56
|
+
export declare const useToggleCertificateGeneration: (courseId: string) => import("@tanstack/react-query").UseMutationResult<void, Error, boolean, unknown>;
|
|
57
|
+
/**
|
|
58
|
+
* Hook to regenerate certificates
|
|
59
|
+
*/
|
|
60
|
+
export declare const useRegenerateCertificates: (courseId: string) => import("@tanstack/react-query").UseMutationResult<void, Error, {
|
|
61
|
+
filter: string;
|
|
62
|
+
onlyWithoutCertificate?: boolean;
|
|
63
|
+
}, unknown>;
|