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

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 (145) hide show
  1. package/dist/Main.js +3 -6
  2. package/dist/Main.js.map +1 -1
  3. package/dist/app.js +2 -8
  4. package/dist/app.js.map +1 -1
  5. package/dist/app.scss +4 -0
  6. package/dist/cohorts/CohortsPage.js +1 -1
  7. package/dist/cohorts/CohortsPage.js.map +1 -1
  8. package/dist/cohorts/data/queryKeys.d.ts +4 -4
  9. package/dist/components/SpecifyLearnerField.d.ts +4 -2
  10. package/dist/components/SpecifyLearnerField.js +38 -4
  11. package/dist/components/SpecifyLearnerField.js.map +1 -1
  12. package/dist/components/SpecifyProblem.d.ts +2 -0
  13. package/dist/components/SpecifyProblem.js +6 -0
  14. package/dist/components/SpecifyProblem.js.map +1 -0
  15. package/dist/components/UsernameFilter.d.ts +7 -0
  16. package/dist/components/UsernameFilter.js +19 -0
  17. package/dist/components/UsernameFilter.js.map +1 -0
  18. package/dist/components/messages.d.ts +15 -0
  19. package/dist/components/messages.js +15 -0
  20. package/dist/components/messages.js.map +1 -1
  21. package/dist/constants.d.ts +2 -1
  22. package/dist/constants.js +2 -1
  23. package/dist/constants.js.map +1 -1
  24. package/dist/courseInfo/types.d.ts +7 -0
  25. package/dist/courseInfo/types.js.map +1 -1
  26. package/dist/courseTeam/CourseTeamPage.js +9 -2
  27. package/dist/courseTeam/CourseTeamPage.js.map +1 -1
  28. package/dist/courseTeam/components/MembersContent.d.ts +2 -0
  29. package/dist/courseTeam/components/MembersContent.js +60 -0
  30. package/dist/courseTeam/components/MembersContent.js.map +1 -0
  31. package/dist/courseTeam/components/RolesContent.d.ts +3 -0
  32. package/dist/courseTeam/components/RolesContent.js +25 -0
  33. package/dist/courseTeam/components/RolesContent.js.map +1 -0
  34. package/dist/courseTeam/data/api.d.ts +4 -0
  35. package/dist/courseTeam/data/api.js +30 -0
  36. package/dist/courseTeam/data/api.js.map +1 -0
  37. package/dist/courseTeam/data/apiHook.d.ts +3 -0
  38. package/dist/courseTeam/data/apiHook.js +14 -0
  39. package/dist/courseTeam/data/apiHook.js.map +1 -0
  40. package/dist/courseTeam/data/queryKeys.d.ts +7 -0
  41. package/dist/courseTeam/data/queryKeys.js +14 -0
  42. package/dist/courseTeam/data/queryKeys.js.map +1 -0
  43. package/dist/courseTeam/messages.d.ts +158 -0
  44. package/dist/courseTeam/messages.js +160 -0
  45. package/dist/courseTeam/messages.js.map +1 -0
  46. package/dist/courseTeam/types.d.ts +15 -0
  47. package/dist/courseTeam/types.js +2 -0
  48. package/dist/courseTeam/types.js.map +1 -0
  49. package/dist/data/api.d.ts +9 -1
  50. package/dist/data/api.js +13 -3
  51. package/dist/data/api.js.map +1 -1
  52. package/dist/data/apiHook.d.ts +1 -0
  53. package/dist/data/apiHook.js +10 -2
  54. package/dist/data/apiHook.js.map +1 -1
  55. package/dist/data/queryKeys.d.ts +8 -4
  56. package/dist/data/queryKeys.js +4 -0
  57. package/dist/data/queryKeys.js.map +1 -1
  58. package/dist/dataDownloads/data/queryKeys.d.ts +3 -3
  59. package/dist/dateExtensions/components/AddExtensionModal.d.ts +2 -6
  60. package/dist/dateExtensions/components/AddExtensionModal.js +22 -8
  61. package/dist/dateExtensions/components/AddExtensionModal.js.map +1 -1
  62. package/dist/dateExtensions/components/DateExtensionsList.js +2 -13
  63. package/dist/dateExtensions/components/DateExtensionsList.js.map +1 -1
  64. package/dist/dateExtensions/data/queryKeys.d.ts +5 -5
  65. package/dist/dateExtensions/messages.d.ts +0 -5
  66. package/dist/dateExtensions/messages.js +0 -5
  67. package/dist/dateExtensions/messages.js.map +1 -1
  68. package/dist/dateExtensions/types.d.ts +6 -2
  69. package/dist/dateExtensions/types.js.map +1 -1
  70. package/dist/enrollments/EnrollmentsPage.js +13 -5
  71. package/dist/enrollments/EnrollmentsPage.js.map +1 -1
  72. package/dist/enrollments/components/EnrollLearnersModal.d.ts +7 -0
  73. package/dist/enrollments/components/EnrollLearnersModal.js +44 -0
  74. package/dist/enrollments/components/EnrollLearnersModal.js.map +1 -0
  75. package/dist/enrollments/components/EnrollmentStatusModal.js +3 -3
  76. package/dist/enrollments/components/EnrollmentStatusModal.js.map +1 -1
  77. package/dist/enrollments/components/EnrollmentsList.d.ts +2 -2
  78. package/dist/enrollments/components/EnrollmentsList.js +5 -5
  79. package/dist/enrollments/components/EnrollmentsList.js.map +1 -1
  80. package/dist/enrollments/components/UnenrollModal.d.ts +4 -3
  81. package/dist/enrollments/components/UnenrollModal.js +31 -4
  82. package/dist/enrollments/components/UnenrollModal.js.map +1 -1
  83. package/dist/enrollments/data/api.d.ts +3 -2
  84. package/dist/enrollments/data/api.js +5 -1
  85. package/dist/enrollments/data/api.js.map +1 -1
  86. package/dist/enrollments/data/apiHook.d.ts +4 -3
  87. package/dist/enrollments/data/apiHook.js +12 -3
  88. package/dist/enrollments/data/apiHook.js.map +1 -1
  89. package/dist/enrollments/data/queryKeys.d.ts +5 -5
  90. package/dist/enrollments/data/queryKeys.js.map +1 -1
  91. package/dist/enrollments/messages.d.ts +66 -1
  92. package/dist/enrollments/messages.js +71 -6
  93. package/dist/enrollments/messages.js.map +1 -1
  94. package/dist/enrollments/types.d.ts +8 -5
  95. package/dist/enrollments/types.js.map +1 -1
  96. package/dist/grading/GradingPage.js +11 -2
  97. package/dist/grading/GradingPage.js.map +1 -1
  98. package/dist/grading/components/GradingActionRow.d.ts +2 -0
  99. package/dist/grading/components/GradingActionRow.js +28 -0
  100. package/dist/grading/components/GradingActionRow.js.map +1 -0
  101. package/dist/grading/components/GradingConfigurationModal.d.ts +6 -0
  102. package/dist/grading/components/GradingConfigurationModal.js +14 -0
  103. package/dist/grading/components/GradingConfigurationModal.js.map +1 -0
  104. package/dist/grading/components/GradingLearnerContent.d.ts +6 -0
  105. package/dist/grading/components/GradingLearnerContent.js +12 -0
  106. package/dist/grading/components/GradingLearnerContent.js.map +1 -0
  107. package/dist/grading/data/api.d.ts +1 -0
  108. package/dist/grading/data/api.js +17 -0
  109. package/dist/grading/data/api.js.map +1 -0
  110. package/dist/grading/data/apiHook.d.ts +1 -0
  111. package/dist/grading/data/apiHook.js +9 -0
  112. package/dist/grading/data/apiHook.js.map +1 -0
  113. package/dist/grading/data/queryKeys.d.ts +5 -0
  114. package/dist/grading/data/queryKeys.js +7 -0
  115. package/dist/grading/data/queryKeys.js.map +1 -0
  116. package/dist/grading/messages.d.ts +63 -0
  117. package/dist/grading/messages.js +65 -0
  118. package/dist/grading/messages.js.map +1 -0
  119. package/dist/grading/types.d.ts +1 -0
  120. package/dist/grading/types.js +2 -0
  121. package/dist/grading/types.js.map +1 -0
  122. package/dist/i18n/index.d.ts +1 -25
  123. package/dist/i18n/index.js +1 -25
  124. package/dist/i18n/index.js.map +1 -1
  125. package/dist/index.d.ts +2 -3
  126. package/dist/index.js +2 -3
  127. package/dist/index.js.map +1 -1
  128. package/dist/instructorNav/InstructorNav.js +1 -1
  129. package/dist/instructorNav/InstructorNav.js.map +1 -1
  130. package/dist/provides.d.ts +4 -0
  131. package/dist/provides.js +7 -0
  132. package/dist/provides.js.map +1 -0
  133. package/dist/routes.d.ts +1 -1
  134. package/dist/routes.js +4 -3
  135. package/dist/routes.js.map +1 -1
  136. package/dist/types/index.d.ts +8 -0
  137. package/dist/types/index.js +1 -0
  138. package/dist/types/index.js.map +1 -1
  139. package/package.json +8 -2
  140. package/dist/providers/QueryProvider.d.ts +0 -6
  141. package/dist/providers/QueryProvider.js +0 -16
  142. package/dist/providers/QueryProvider.js.map +0 -1
  143. package/dist/providers.d.ts +0 -3
  144. package/dist/providers.js +0 -8
  145. package/dist/providers.js.map +0 -1
@@ -1,8 +1,9 @@
1
- import { Learner } from '../types';
1
+ import { EnrolledLearner } from '../../enrollments/types';
2
2
  interface UnenrollModalProps {
3
- learner: Learner;
3
+ learner: EnrolledLearner;
4
4
  isOpen: boolean;
5
5
  onClose: () => void;
6
+ onSuccess: () => void;
6
7
  }
7
- declare const UnenrollModal: ({ learner, isOpen, onClose }: UnenrollModalProps) => import("react/jsx-runtime").JSX.Element;
8
+ declare const UnenrollModal: ({ learner, isOpen, onClose, onSuccess }: UnenrollModalProps) => import("react/jsx-runtime").JSX.Element;
8
9
  export default UnenrollModal;
@@ -1,7 +1,34 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- const UnenrollModal = ({ learner, isOpen, onClose }) => {
3
- console.log(learner, isOpen, onClose);
4
- return _jsx("div", { children: "Unenroll Modal" });
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useParams } from 'react-router-dom';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import { Button, ModalDialog } from '@openedx/paragon';
5
+ import { useAlert } from '../../providers/AlertProvider';
6
+ import { useUpdateEnrollments } from '../../enrollments/data/apiHook';
7
+ import messages from '../../enrollments/messages';
8
+ const UnenrollModal = ({ learner, isOpen, onClose, onSuccess }) => {
9
+ const intl = useIntl();
10
+ const { courseId = '' } = useParams();
11
+ const { mutate: unenrollLearners, isPending } = useUpdateEnrollments(courseId);
12
+ const { showModal } = useAlert();
13
+ const handleUnenroll = () => {
14
+ unenrollLearners({
15
+ identifier: [learner.username],
16
+ action: 'unenroll',
17
+ }, {
18
+ onSuccess: () => {
19
+ onSuccess();
20
+ onClose();
21
+ },
22
+ onError: (error) => {
23
+ showModal({
24
+ message: error.message || intl.formatMessage(messages.unenrollLearnerError),
25
+ variant: 'danger',
26
+ confirmText: intl.formatMessage(messages.closeButton),
27
+ });
28
+ }
29
+ });
30
+ };
31
+ return (_jsxs(ModalDialog, { isOpen: isOpen, onClose: onClose, title: intl.formatMessage(messages.unenrollLearners), isOverflowVisible: false, children: [_jsx(ModalDialog.Header, { children: _jsx("h3", { className: "text-primary-500", children: intl.formatMessage(messages.unenrollLearnerTitle) }) }), _jsx(ModalDialog.Body, { className: "py-4", children: _jsx("p", { children: intl.formatMessage(messages.unenrollLearnersConfirmation, { name: learner.fullName }) }) }), _jsxs(ModalDialog.Footer, { children: [_jsx(Button, { variant: "tertiary", onClick: onClose, children: intl.formatMessage(messages.cancelButton) }), _jsx(Button, { className: "ml-2", onClick: handleUnenroll, disabled: isPending, children: intl.formatMessage(messages.unenrollButton) })] })] }));
5
32
  };
6
33
  export default UnenrollModal;
7
34
  //# sourceMappingURL=UnenrollModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UnenrollModal.js","sourceRoot":"","sources":["../../../src/enrollments/components/UnenrollModal.tsx"],"names":[],"mappings":";AAOA,MAAM,aAAa,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAsB,EAAE,EAAE;IACzE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEtC,OAAO,2CAAyB,CAAC;AACnC,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { Learner } from '../types';\ninterface UnenrollModalProps {\n learner: Learner,\n isOpen: boolean,\n onClose: () => void,\n}\n\nconst UnenrollModal = ({ learner, isOpen, onClose }: UnenrollModalProps) => {\n console.log(learner, isOpen, onClose);\n\n return <div>Unenroll Modal</div>;\n};\n\nexport default UnenrollModal;\n"]}
1
+ {"version":3,"file":"UnenrollModal.js","sourceRoot":"","sources":["../../../src/enrollments/components/UnenrollModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AAUjD,MAAM,aAAa,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAsB,EAAE,EAAE;IACpF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,SAAS,EAAwB,CAAC;IAC5D,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/E,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEjC,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,gBAAgB,CAAC;YACf,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC9B,MAAM,EAAE,UAAU;SACnB,EAAE;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,SAAS,CAAC;oBACR,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC;oBAC3E,OAAO,EAAE,QAAQ;oBACjB,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC;iBACtD,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,WAAW,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,KAAK,aAC3H,KAAC,WAAW,CAAC,MAAM,cACjB,aAAI,SAAS,EAAC,kBAAkB,YAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,GAAM,GACtE,EACrB,KAAC,WAAW,CAAC,IAAI,IAAC,SAAS,EAAC,MAAM,YAChC,sBAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAK,GAC7E,EACnB,MAAC,WAAW,CAAC,MAAM,eACjB,KAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAE,OAAO,YAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAU,EACjG,KAAC,MAAM,IACL,SAAS,EAAC,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,YAElB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,GACrC,IACU,IACT,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Button, ModalDialog } from '@openedx/paragon';\nimport { useAlert } from '@src/providers/AlertProvider';\nimport { useUpdateEnrollments } from '@src/enrollments/data/apiHook';\nimport messages from '@src/enrollments/messages';\nimport { EnrolledLearner } from '@src/enrollments/types';\n\ninterface UnenrollModalProps {\n learner: EnrolledLearner,\n isOpen: boolean,\n onClose: () => void,\n onSuccess: () => void,\n}\n\nconst UnenrollModal = ({ learner, isOpen, onClose, onSuccess }: UnenrollModalProps) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const { mutate: unenrollLearners, isPending } = useUpdateEnrollments(courseId);\n const { showModal } = useAlert();\n\n const handleUnenroll = () => {\n unenrollLearners({\n identifier: [learner.username],\n action: 'unenroll',\n }, {\n onSuccess: () => {\n onSuccess();\n onClose();\n },\n onError: (error) => {\n showModal({\n message: error.message || intl.formatMessage(messages.unenrollLearnerError),\n variant: 'danger',\n confirmText: intl.formatMessage(messages.closeButton),\n });\n }\n });\n };\n\n return (\n <ModalDialog isOpen={isOpen} onClose={onClose} title={intl.formatMessage(messages.unenrollLearners)} isOverflowVisible={false}>\n <ModalDialog.Header>\n <h3 className=\"text-primary-500\">{intl.formatMessage(messages.unenrollLearnerTitle)}</h3>\n </ModalDialog.Header>\n <ModalDialog.Body className=\"py-4\">\n <p>{intl.formatMessage(messages.unenrollLearnersConfirmation, { name: learner.fullName })}</p>\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <Button variant=\"tertiary\" onClick={onClose}>{intl.formatMessage(messages.cancelButton)}</Button>\n <Button\n className=\"ml-2\"\n onClick={handleUnenroll}\n disabled={isPending}\n >\n {intl.formatMessage(messages.unenrollButton)}\n </Button>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default UnenrollModal;\n"]}
@@ -1,4 +1,5 @@
1
- import { EnrollmentsParams, EnrollmentStatusResponse, Learner } from '../types';
1
+ import { EnrollmentsParams, EnrollmentStatusResponse, EnrolledLearner, UpdateEnrollmentsParams } from '../../enrollments/types';
2
2
  import { DataList } from '../../types';
3
- export declare const getEnrollments: (courseId: string, params: EnrollmentsParams) => Promise<DataList<Learner>>;
3
+ export declare const getEnrollments: (courseId: string, params: EnrollmentsParams) => Promise<DataList<EnrolledLearner>>;
4
4
  export declare const getEnrollmentStatus: (courseId: string, userIdentifier: string) => Promise<EnrollmentStatusResponse>;
5
+ export declare const updateEnrollments: (courseId: string, params: UpdateEnrollmentsParams) => Promise<void>;
@@ -7,7 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';
10
+ import { camelCaseObject, getAuthenticatedHttpClient, snakeCaseObject } from '@openedx/frontend-base';
11
11
  import { getApiBaseUrl } from '../../data/api';
12
12
  export const getEnrollments = (courseId, params) => __awaiter(void 0, void 0, void 0, function* () {
13
13
  const queryParams = new URLSearchParams({
@@ -29,4 +29,8 @@ export const getEnrollmentStatus = (courseId, userIdentifier) => __awaiter(void
29
29
  });
30
30
  return camelCaseObject(data);
31
31
  });
32
+ export const updateEnrollments = (courseId, params) => __awaiter(void 0, void 0, void 0, function* () {
33
+ const snakeCaseParams = snakeCaseObject(params);
34
+ yield getAuthenticatedHttpClient().post(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/enrollments/modify`, snakeCaseParams);
35
+ });
32
36
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/enrollments/data/api.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI/C,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAAgB,EAChB,MAAyB,EACG,EAAE;IAC9B,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACtC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;KACtC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,GAAG,CACrD,GAAG,aAAa,EAAE,8BAA8B,QAAQ,gBAAgB,WAAW,CAAC,QAAQ,EAAE,EAAE,CACjG,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAAgB,EAChB,cAAsB,EACa,EAAE;IACrC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,IAAI,CACtD,GAAG,aAAa,EAAE,YAAY,QAAQ,+CAA+C,EAAE;QACrF,yBAAyB,EAAE,cAAc;KAC1C,CACF,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC","sourcesContent":["import { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { getApiBaseUrl } from '../../data/api';\nimport { EnrollmentsParams, EnrollmentStatusResponse, Learner } from '../types';\nimport { DataList } from '@src/types';\n\nexport const getEnrollments = async (\n courseId: string,\n params: EnrollmentsParams\n): Promise<DataList<Learner>> => {\n const queryParams = new URLSearchParams({\n page: (params.page + 1).toString(),\n page_size: params.pageSize.toString(),\n });\n\n if (params.emailOrUsername) {\n queryParams.append('search', params.emailOrUsername);\n }\n\n if (params.isBetaTester) {\n queryParams.append('is_beta_tester', params.isBetaTester);\n }\n\n const { data } = await getAuthenticatedHttpClient().get(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/enrollments?${queryParams.toString()}`\n );\n return camelCaseObject(data);\n};\n\nexport const getEnrollmentStatus = async (\n courseId: string,\n userIdentifier: string\n): Promise<EnrollmentStatusResponse> => {\n const { data } = await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/courses/${courseId}/instructor/api/get_student_enrollment_status`, {\n unique_student_identifier: userIdentifier,\n }\n );\n return camelCaseObject(data);\n};\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/enrollments/data/api.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAAgB,EAChB,MAAyB,EACW,EAAE;IACtC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACtC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;KACtC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,GAAG,CACrD,GAAG,aAAa,EAAE,8BAA8B,QAAQ,gBAAgB,WAAW,CAAC,QAAQ,EAAE,EAAE,CACjG,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAAgB,EAChB,cAAsB,EACa,EAAE;IACrC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,IAAI,CACtD,GAAG,aAAa,EAAE,YAAY,QAAQ,+CAA+C,EAAE;QACrF,yBAAyB,EAAE,cAAc;KAC1C,CACF,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,QAAgB,EAChB,MAA+B,EAChB,EAAE;IACjB,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,0BAA0B,EAAE,CAAC,IAAI,CACrC,GAAG,aAAa,EAAE,8BAA8B,QAAQ,qBAAqB,EAC7E,eAAe,CAChB,CAAC;AACJ,CAAC,CAAA,CAAC","sourcesContent":["import { camelCaseObject, getAuthenticatedHttpClient, snakeCaseObject } from '@openedx/frontend-base';\nimport { getApiBaseUrl } from '@src/data/api';\nimport { EnrollmentsParams, EnrollmentStatusResponse, EnrolledLearner, UpdateEnrollmentsParams } from '@src/enrollments/types';\nimport { DataList } from '@src/types';\n\nexport const getEnrollments = async (\n courseId: string,\n params: EnrollmentsParams\n): Promise<DataList<EnrolledLearner>> => {\n const queryParams = new URLSearchParams({\n page: (params.page + 1).toString(),\n page_size: params.pageSize.toString(),\n });\n\n if (params.emailOrUsername) {\n queryParams.append('search', params.emailOrUsername);\n }\n\n if (params.isBetaTester) {\n queryParams.append('is_beta_tester', params.isBetaTester);\n }\n\n const { data } = await getAuthenticatedHttpClient().get(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/enrollments?${queryParams.toString()}`\n );\n return camelCaseObject(data);\n};\n\nexport const getEnrollmentStatus = async (\n courseId: string,\n userIdentifier: string\n): Promise<EnrollmentStatusResponse> => {\n const { data } = await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/courses/${courseId}/instructor/api/get_student_enrollment_status`, {\n unique_student_identifier: userIdentifier,\n }\n );\n return camelCaseObject(data);\n};\n\nexport const updateEnrollments = async (\n courseId: string,\n params: UpdateEnrollmentsParams\n): Promise<void> => {\n const snakeCaseParams = snakeCaseObject(params);\n await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/enrollments/modify`,\n snakeCaseParams\n );\n};\n"]}
@@ -1,3 +1,4 @@
1
- import { EnrollmentsParams } from '../types';
2
- export declare const useEnrollments: (courseId: string, params: EnrollmentsParams) => import("@tanstack/react-query").UseQueryResult<import("../../types").DataList<import("../types").Learner>, Error>;
3
- export declare const useEnrollmentByUserId: (courseId: string, userIdentifier: string) => import("@tanstack/react-query").UseQueryResult<import("../types").EnrollmentStatusResponse, Error>;
1
+ import { EnrollmentsParams, UpdateEnrollmentsParams } from '../../enrollments/types';
2
+ export declare const useEnrollments: (courseId: string, params: EnrollmentsParams) => import("@tanstack/react-query").UseQueryResult<import("../../types").DataList<import("../../enrollments/types").EnrolledLearner>, Error>;
3
+ export declare const useEnrollmentByUserId: (courseId: string, userIdentifier: string) => import("@tanstack/react-query").UseQueryResult<import("../../enrollments/types").EnrollmentStatusResponse, Error>;
4
+ export declare const useUpdateEnrollments: (courseId: string) => import("@tanstack/react-query").UseMutationResult<void, Error, UpdateEnrollmentsParams, unknown>;
@@ -1,6 +1,6 @@
1
- import { useQuery } from '@tanstack/react-query';
2
- import { getEnrollments, getEnrollmentStatus } from './api';
3
- import { enrollmentsQueryKeys } from './queryKeys';
1
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
2
+ import { getEnrollments, getEnrollmentStatus, updateEnrollments } from '../../enrollments/data/api';
3
+ import { enrollmentsQueryKeys } from '../../enrollments/data/queryKeys';
4
4
  export const useEnrollments = (courseId, params) => (useQuery({
5
5
  queryKey: enrollmentsQueryKeys.byCoursePaginated(courseId, params),
6
6
  queryFn: () => getEnrollments(courseId, params),
@@ -11,4 +11,13 @@ export const useEnrollmentByUserId = (courseId, userIdentifier) => (useQuery({
11
11
  queryFn: () => getEnrollmentStatus(courseId, userIdentifier),
12
12
  enabled: false,
13
13
  }));
14
+ export const useUpdateEnrollments = (courseId) => {
15
+ const queryClient = useQueryClient();
16
+ return (useMutation({
17
+ mutationFn: (params) => updateEnrollments(courseId, params),
18
+ onSuccess: () => {
19
+ queryClient.invalidateQueries({ queryKey: enrollmentsQueryKeys.byCourse(courseId) });
20
+ },
21
+ }));
22
+ };
14
23
  //# sourceMappingURL=apiHook.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"apiHook.js","sourceRoot":"","sources":["../../../src/enrollments/data/apiHook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,MAAyB,EAAE,EAAE,CAAC,CAC7E,QAAQ,CAAC;IACP,QAAQ,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,QAAQ;CACpB,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAE,cAAsB,EAAE,EAAE,CAAC,CACjF,QAAQ,CAAC;IACP,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IACjE,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC5D,OAAO,EAAE,KAAK;CACf,CAAC,CACH,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { getEnrollments, getEnrollmentStatus } from './api';\nimport { enrollmentsQueryKeys } from './queryKeys';\nimport { EnrollmentsParams } from '../types';\n\nexport const useEnrollments = (courseId: string, params: EnrollmentsParams) => (\n useQuery({\n queryKey: enrollmentsQueryKeys.byCoursePaginated(courseId, params),\n queryFn: () => getEnrollments(courseId, params),\n enabled: !!courseId,\n })\n);\n\nexport const useEnrollmentByUserId = (courseId: string, userIdentifier: string) => (\n useQuery({\n queryKey: enrollmentsQueryKeys.byUserId(courseId, userIdentifier),\n queryFn: () => getEnrollmentStatus(courseId, userIdentifier),\n enabled: false,\n })\n);\n"]}
1
+ {"version":3,"file":"apiHook.js","sourceRoot":"","sources":["../../../src/enrollments/data/apiHook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAGvE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,MAAyB,EAAE,EAAE,CAAC,CAC7E,QAAQ,CAAC;IACP,QAAQ,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,QAAQ;CACpB,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAE,cAAsB,EAAE,EAAE,CAAC,CACjF,QAAQ,CAAC;IACP,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IACjE,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC5D,OAAO,EAAE,KAAK;CACf,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAE,EAAE;IACvD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,CAAC,WAAW,CAAC;QAClB,UAAU,EAAE,CAAC,MAA+B,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC;QACpF,SAAS,EAAE,GAAG,EAAE;YACd,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;KACF,CAAC,CAAC,CAAC;AACN,CAAC,CAAC","sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { getEnrollments, getEnrollmentStatus, updateEnrollments } from '@src/enrollments/data/api';\nimport { enrollmentsQueryKeys } from '@src/enrollments/data/queryKeys';\nimport { EnrollmentsParams, UpdateEnrollmentsParams } from '@src/enrollments/types';\n\nexport const useEnrollments = (courseId: string, params: EnrollmentsParams) => (\n useQuery({\n queryKey: enrollmentsQueryKeys.byCoursePaginated(courseId, params),\n queryFn: () => getEnrollments(courseId, params),\n enabled: !!courseId,\n })\n);\n\nexport const useEnrollmentByUserId = (courseId: string, userIdentifier: string) => (\n useQuery({\n queryKey: enrollmentsQueryKeys.byUserId(courseId, userIdentifier),\n queryFn: () => getEnrollmentStatus(courseId, userIdentifier),\n enabled: false,\n })\n);\n\nexport const useUpdateEnrollments = (courseId: string) => {\n const queryClient = useQueryClient();\n return (useMutation({\n mutationFn: (params: UpdateEnrollmentsParams) => updateEnrollments(courseId, params),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: enrollmentsQueryKeys.byCourse(courseId) });\n },\n }));\n};\n"]}
@@ -1,7 +1,7 @@
1
- import { EnrollmentsParams } from '../types';
1
+ import { EnrollmentsParams } from '../../enrollments/types';
2
2
  export declare const enrollmentsQueryKeys: {
3
- all: readonly ["org.openedx.frontend.app.instructor", "enrollments"];
4
- byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "enrollments", string];
5
- byCoursePaginated: (courseId: string, params: EnrollmentsParams) => readonly ["org.openedx.frontend.app.instructor", "enrollments", string, number, number, string, string];
6
- byUserId: (courseId: string, userIdentifier: string) => readonly ["org.openedx.frontend.app.instructor", "enrollments", string, "enrollment", string];
3
+ all: readonly ["org.openedx.frontend.app.instructorDashboard", "enrollments"];
4
+ byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "enrollments", string];
5
+ byCoursePaginated: (courseId: string, params: EnrollmentsParams) => readonly ["org.openedx.frontend.app.instructorDashboard", "enrollments", string, number, number, string, string];
6
+ byUserId: (courseId: string, userIdentifier: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "enrollments", string, "enrollment", string];
7
7
  };
@@ -1 +1 @@
1
- {"version":3,"file":"queryKeys.js","sourceRoot":"","sources":["../../../src/enrollments/data/queryKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,EAAE,CAAC,KAAK,EAAE,aAAa,CAAU;IACpC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAU;IAChF,iBAAiB,EAAE,CAAC,QAAgB,EAAE,MAAyB,EAAE,EAAE,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAU;IACpM,QAAQ,EAAE,CAAC,QAAgB,EAAE,cAAsB,EAAE,EAAE,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,cAAc,CAAU;CAC5I,CAAC","sourcesContent":["import { appId } from '../../constants';\nimport { EnrollmentsParams } from '../types';\n\nexport const enrollmentsQueryKeys = {\n all: [appId, 'enrollments'] as const,\n byCourse: (courseId: string) => [...enrollmentsQueryKeys.all, courseId] as const,\n byCoursePaginated: (courseId: string, params: EnrollmentsParams) => [...enrollmentsQueryKeys.byCourse(courseId), params.page, params.pageSize, params.emailOrUsername, params.isBetaTester] as const,\n byUserId: (courseId: string, userIdentifier: string) => [...enrollmentsQueryKeys.byCourse(courseId), 'enrollment', userIdentifier] as const,\n};\n"]}
1
+ {"version":3,"file":"queryKeys.js","sourceRoot":"","sources":["../../../src/enrollments/data/queryKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,EAAE,CAAC,KAAK,EAAE,aAAa,CAAU;IACpC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAU;IAChF,iBAAiB,EAAE,CAAC,QAAgB,EAAE,MAAyB,EAAE,EAAE,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAU;IACpM,QAAQ,EAAE,CAAC,QAAgB,EAAE,cAAsB,EAAE,EAAE,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,cAAc,CAAU;CAC5I,CAAC","sourcesContent":["import { appId } from '@src/constants';\nimport { EnrollmentsParams } from '@src/enrollments/types';\n\nexport const enrollmentsQueryKeys = {\n all: [appId, 'enrollments'] as const,\n byCourse: (courseId: string) => [...enrollmentsQueryKeys.all, courseId] as const,\n byCoursePaginated: (courseId: string, params: EnrollmentsParams) => [...enrollmentsQueryKeys.byCourse(courseId), params.page, params.pageSize, params.emailOrUsername, params.isBetaTester] as const,\n byUserId: (courseId: string, userIdentifier: string) => [...enrollmentsQueryKeys.byCourse(courseId), 'enrollment', userIdentifier] as const,\n};\n"]}
@@ -64,7 +64,7 @@ declare const messages: {
64
64
  defaultMessage: string;
65
65
  description: string;
66
66
  };
67
- enrollLearnersPlaceholder: {
67
+ enrollmentStatusPlaceholder: {
68
68
  id: string;
69
69
  defaultMessage: string;
70
70
  description: string;
@@ -104,5 +104,70 @@ declare const messages: {
104
104
  defaultMessage: string;
105
105
  description: string;
106
106
  };
107
+ statusResponseMessage: {
108
+ id: string;
109
+ defaultMessage: string;
110
+ description: string;
111
+ };
112
+ userIdentifierPlaceholder: {
113
+ id: string;
114
+ defaultMessage: string;
115
+ description: string;
116
+ };
117
+ enrollLearnerInstructions: {
118
+ id: string;
119
+ defaultMessage: string;
120
+ description: string;
121
+ };
122
+ unenrollLearners: {
123
+ id: string;
124
+ defaultMessage: string;
125
+ description: string;
126
+ };
127
+ unenrollLearnersConfirmation: {
128
+ id: string;
129
+ defaultMessage: string;
130
+ description: string;
131
+ };
132
+ unenrollLearnerTitle: {
133
+ id: string;
134
+ defaultMessage: string;
135
+ description: string;
136
+ };
137
+ saveButton: {
138
+ id: string;
139
+ defaultMessage: string;
140
+ description: string;
141
+ };
142
+ cancelButton: {
143
+ id: string;
144
+ defaultMessage: string;
145
+ description: string;
146
+ };
147
+ autoEnrollCheckbox: {
148
+ id: string;
149
+ defaultMessage: string;
150
+ description: string;
151
+ };
152
+ notifyUsersCheckbox: {
153
+ id: string;
154
+ defaultMessage: string;
155
+ description: string;
156
+ };
157
+ enrollLearnerError: {
158
+ id: string;
159
+ defaultMessage: string;
160
+ description: string;
161
+ };
162
+ unenrollLearnerError: {
163
+ id: string;
164
+ defaultMessage: string;
165
+ description: string;
166
+ };
167
+ enrollLearnerNotFoundError: {
168
+ id: string;
169
+ defaultMessage: string;
170
+ description: string;
171
+ };
107
172
  };
108
173
  export default messages;
@@ -13,7 +13,7 @@ const messages = defineMessages({
13
13
  enrollLearners: {
14
14
  id: 'instruct.enrollments.enrollLearners',
15
15
  defaultMessage: 'Enroll Learners',
16
- description: 'Button label for enrolling learners',
16
+ description: 'Button label and modal title for enrolling learners',
17
17
  },
18
18
  checkEnrollmentStatus: {
19
19
  id: 'instruct.enrollments.checkEnrollmentStatus',
@@ -61,17 +61,17 @@ const messages = defineMessages({
61
61
  description: 'Label for true boolean value',
62
62
  },
63
63
  addLearnerInstructions: {
64
- id: 'instruct.enrollments.checkEnrollmentStatusModal.addLearnerInstructions',
65
- defaultMessage: 'Learners My Open edX email address or username',
64
+ id: 'instruct.enrollments.modals.checkEnrollmentStatus.addLearnerInstructions',
65
+ defaultMessage: 'Learner\'s My Open edX email address or username',
66
66
  description: 'Instructions for enroll learners to the course',
67
67
  },
68
- enrollLearnersPlaceholder: {
69
- id: 'instruct.enrollments.checkEnrollmentStatusModal.enrollLearnersPlaceholder',
68
+ enrollmentStatusPlaceholder: {
69
+ id: 'instruct.enrollments.modals.checkEnrollmentStatus.enrollmentStatusPlaceholder',
70
70
  defaultMessage: 'Learner email address or username',
71
71
  description: 'Placeholder text for enrolling learners textarea',
72
72
  },
73
73
  closeButton: {
74
- id: 'instruct.enrollments.checkEnrollmentStatusModal.closeButton',
74
+ id: 'instruct.enrollments.modals.closeButton',
75
75
  defaultMessage: 'Close',
76
76
  description: 'Label for close button in modals',
77
77
  },
@@ -105,6 +105,71 @@ const messages = defineMessages({
105
105
  defaultMessage: 'Non-Beta Testers',
106
106
  description: 'Option for showing only non-beta testers in beta tester filter',
107
107
  },
108
+ statusResponseMessage: {
109
+ id: 'instruct.enrollments.modals.checkEnrollmentStatus.statusResponseMessage',
110
+ defaultMessage: 'Enrollment status for {learnerIdentifier}: {status}',
111
+ description: 'Message displaying the enrollment status for a learner',
112
+ },
113
+ userIdentifierPlaceholder: {
114
+ id: 'instruct.enrollments.modals.enrollLearners.userIdentifierPlaceholder',
115
+ defaultMessage: 'Email addresses / Usernames',
116
+ description: 'Placeholder text for enrolling learners textarea',
117
+ },
118
+ enrollLearnerInstructions: {
119
+ id: 'instruct.enrollments.modals.enrollLearners.enrollLearnerInstructions',
120
+ defaultMessage: 'Enter email addresses and/or usernames separated by new lines or commas. You will not get notification for emails that bounce, so please double-check spelling.',
121
+ description: 'Instructions for enrolling learners to the course',
122
+ },
123
+ unenrollLearners: {
124
+ id: 'instruct.enrollments.modals.unenrollLearners',
125
+ defaultMessage: 'Unenroll Learners',
126
+ description: 'Title for unenroll learners modal',
127
+ },
128
+ unenrollLearnersConfirmation: {
129
+ id: 'instruct.enrollments.modals.unenrollLearnersConfirmation',
130
+ defaultMessage: 'Unenroll {name} from course?',
131
+ description: 'Confirmation message for unenrolling learners',
132
+ },
133
+ unenrollLearnerTitle: {
134
+ id: 'instruct.enrollments.modals.unenrollLearnerTitle',
135
+ defaultMessage: 'Unenroll Learner?',
136
+ description: 'Title for unenroll learner modal',
137
+ },
138
+ saveButton: {
139
+ id: 'instruct.enrollments.modals.saveButton',
140
+ defaultMessage: 'Save',
141
+ description: 'Label for save button in modals',
142
+ },
143
+ cancelButton: {
144
+ id: 'instruct.enrollments.modals.cancelButton',
145
+ defaultMessage: 'Cancel',
146
+ description: 'Label for cancel button in modals',
147
+ },
148
+ autoEnrollCheckbox: {
149
+ id: 'instruct.enrollments.modals.autoEnrollCheckbox',
150
+ defaultMessage: 'Auto Enroll',
151
+ description: 'Label for auto enroll checkbox in enroll learners modal',
152
+ },
153
+ notifyUsersCheckbox: {
154
+ id: 'instruct.enrollments.modals.notifyUsersCheckbox',
155
+ defaultMessage: 'Notify Users by Email',
156
+ description: 'Label for notify users by email checkbox in enroll learners modal',
157
+ },
158
+ enrollLearnerError: {
159
+ id: 'instruct.enrollments.modals.enrollLearnerError',
160
+ defaultMessage: 'An error occurred while enrolling learners. Please try again.',
161
+ description: 'Error message displayed when enrolling learners fails',
162
+ },
163
+ unenrollLearnerError: {
164
+ id: 'instruct.enrollments.modals.unenrollLearnerError',
165
+ defaultMessage: 'An error occurred while unenrolling learner. Please try again.',
166
+ description: 'Error message displayed when unenrolling learner fails',
167
+ },
168
+ enrollLearnerNotFoundError: {
169
+ id: 'instruct.enrollments.modals.enrollLearnerNotFoundError',
170
+ defaultMessage: 'One or more learners were not found. Please check the email addresses or usernames and try again.',
171
+ description: 'Error message displayed when enrolling learners fails due to learner not found',
172
+ }
108
173
  });
109
174
  export default messages;
110
175
  //# sourceMappingURL=messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/enrollments/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,oBAAoB,EAAE;QACpB,EAAE,EAAE,iCAAiC;QACrC,cAAc,EAAE,uBAAuB;QACvC,WAAW,EAAE,gCAAgC;KAC9C;IACD,cAAc,EAAE;QACd,EAAE,EAAE,qCAAqC;QACzC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,sCAAsC;KACpD;IACD,cAAc,EAAE;QACd,EAAE,EAAE,qCAAqC;QACzC,cAAc,EAAE,iBAAiB;QACjC,WAAW,EAAE,qCAAqC;KACnD;IACD,qBAAqB,EAAE;QACrB,EAAE,EAAE,4CAA4C;QAChD,cAAc,EAAE,yBAAyB;QACzC,WAAW,EAAE,6DAA6D;KAC3E;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,+BAA+B;QACnC,cAAc,EAAE,UAAU;QAC1B,WAAW,EAAE,gDAAgD;KAC9D;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,+BAA+B;QACnC,cAAc,EAAE,MAAM;QACtB,WAAW,EAAE,iDAAiD;KAC/D;IACD,KAAK,EAAE;QACL,EAAE,EAAE,4BAA4B;QAChC,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,6CAA6C;KAC3D;IACD,KAAK,EAAE;QACL,EAAE,EAAE,4BAA4B;QAChC,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,6CAA6C;KAC3D;IACD,UAAU,EAAE;QACV,EAAE,EAAE,iCAAiC;QACrC,cAAc,EAAE,aAAa;QAC7B,WAAW,EAAE,0DAA0D;KACxE;IACD,OAAO,EAAE;QACP,EAAE,EAAE,8BAA8B;QAClC,cAAc,EAAE,SAAS;QACzB,WAAW,EAAE,+CAA+C;KAC7D;IACD,cAAc,EAAE;QACd,EAAE,EAAE,qCAAqC;QACzC,cAAc,EAAE,UAAU;QAC1B,WAAW,EAAE,wCAAwC;KACtD;IACD,SAAS,EAAE;QACT,EAAE,EAAE,gCAAgC;QACpC,cAAc,EAAE,MAAM;QACtB,WAAW,EAAE,8BAA8B;KAC5C;IACD,sBAAsB,EAAE;QACtB,EAAE,EAAE,wEAAwE;QAC5E,cAAc,EAAE,iDAAiD;QACjE,WAAW,EAAE,gDAAgD;KAC9D;IACD,yBAAyB,EAAE;QACzB,EAAE,EAAE,2EAA2E;QAC/E,cAAc,EAAE,mCAAmC;QACnD,WAAW,EAAE,kDAAkD;KAChE;IACD,WAAW,EAAE;QACX,EAAE,EAAE,6DAA6D;QACjE,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,kCAAkC;KAChD;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,wCAAwC;QAC5C,cAAc,EAAE,oBAAoB;QACpC,WAAW,EAAE,sDAAsD;KACpE;IACD,aAAa,EAAE;QACb,EAAE,EAAE,oCAAoC;QACxC,cAAc,EAAE,sBAAsB;QACtC,WAAW,EAAE,yDAAyD;KACvE;IACD,sBAAsB,EAAE;QACtB,EAAE,EAAE,6CAA6C;QACjD,cAAc,EAAE,2BAA2B;QAC3C,WAAW,EAAE,oDAAoD;KAClE;IACD,YAAY,EAAE;QACZ,EAAE,EAAE,mCAAmC;QACvC,cAAc,EAAE,eAAe;QAC/B,WAAW,EAAE,wDAAwD;KACtE;IACD,WAAW,EAAE;QACX,EAAE,EAAE,kCAAkC;QACtC,cAAc,EAAE,cAAc;QAC9B,WAAW,EAAE,4DAA4D;KAC1E;IACD,cAAc,EAAE;QACd,EAAE,EAAE,qCAAqC;QACzC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,gEAAgE;KAC9E;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n enrollmentsPageTitle: {\n id: 'instruct.enrollments.page.title',\n defaultMessage: 'Enrollment Management',\n description: 'Title for the enrollments page',\n },\n addBetaTesters: {\n id: 'instruct.enrollments.addBetaTesters',\n defaultMessage: 'Add Beta Testers',\n description: 'Button label for adding beta testers',\n },\n enrollLearners: {\n id: 'instruct.enrollments.enrollLearners',\n defaultMessage: 'Enroll Learners',\n description: 'Button label for enrolling learners',\n },\n checkEnrollmentStatus: {\n id: 'instruct.enrollments.checkEnrollmentStatus',\n defaultMessage: 'Check Enrollment Status',\n description: 'Check enrollment status modal title and alt for icon button',\n },\n username: {\n id: 'instruct.enrollments.username',\n defaultMessage: 'Username',\n description: 'Column header for username in enrollments list',\n },\n fullName: {\n id: 'instruct.enrollments.fullName',\n defaultMessage: 'Name',\n description: 'Column header for full name in enrollments list',\n },\n email: {\n id: 'instruct.enrollments.email',\n defaultMessage: 'Email',\n description: 'Column header for email in enrollments list',\n },\n track: {\n id: 'instruct.enrollments.track',\n defaultMessage: 'Track',\n description: 'Column header for track in enrollments list',\n },\n betaTester: {\n id: 'instruct.enrollments.betaTester',\n defaultMessage: 'Beta Tester',\n description: 'Column header for beta tester status in enrollments list',\n },\n actions: {\n id: 'instruct.enrollments.actions',\n defaultMessage: 'Actions',\n description: 'Column header for actions in enrollments list',\n },\n unenrollButton: {\n id: 'instruct.enrollments.unenrollButton',\n defaultMessage: 'Unenroll',\n description: 'Button label for unenrolling a learner',\n },\n trueLabel: {\n id: 'instruct.enrollments.trueLabel',\n defaultMessage: 'True',\n description: 'Label for true boolean value',\n },\n addLearnerInstructions: {\n id: 'instruct.enrollments.checkEnrollmentStatusModal.addLearnerInstructions',\n defaultMessage: 'Learner’s My Open edX email address or username',\n description: 'Instructions for enroll learners to the course',\n },\n enrollLearnersPlaceholder: {\n id: 'instruct.enrollments.checkEnrollmentStatusModal.enrollLearnersPlaceholder',\n defaultMessage: 'Learner email address or username',\n description: 'Placeholder text for enrolling learners textarea',\n },\n closeButton: {\n id: 'instruct.enrollments.checkEnrollmentStatusModal.closeButton',\n defaultMessage: 'Close',\n description: 'Label for close button in modals',\n },\n searchPlaceholder: {\n id: 'instruct.enrollments.searchPlaceholder',\n defaultMessage: 'Search enrollments',\n description: 'Placeholder for the search input in enrollments list',\n },\n noEnrollments: {\n id: 'instruct.enrollments.noEnrollments',\n defaultMessage: 'No enrollments found',\n description: 'Message displayed when there are no enrollments to show',\n },\n changeBetaTesterStatus: {\n id: 'instruct.enrollments.changeBetaTesterStatus',\n defaultMessage: 'Change Beta Tester Status',\n description: 'Alt text for change beta tester status icon button',\n },\n allEnrollees: {\n id: 'instruct.enrollments.allEnrollees',\n defaultMessage: 'All Enrollees',\n description: 'Option for showing all enrollees in beta tester filter',\n },\n betaTesters: {\n id: 'instruct.enrollments.betaTesters',\n defaultMessage: 'Beta Testers',\n description: 'Option for showing only beta testers in beta tester filter',\n },\n nonBetaTesters: {\n id: 'instruct.enrollments.nonBetaTesters',\n defaultMessage: 'Non-Beta Testers',\n description: 'Option for showing only non-beta testers in beta tester filter',\n },\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/enrollments/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n enrollmentsPageTitle: {\n id: 'instruct.enrollments.page.title',\n defaultMessage: 'Enrollment Management',\n description: 'Title for the enrollments page',\n },\n addBetaTesters: {\n id: 'instruct.enrollments.addBetaTesters',\n defaultMessage: 'Add Beta Testers',\n description: 'Button label for adding beta testers',\n },\n enrollLearners: {\n id: 'instruct.enrollments.enrollLearners',\n defaultMessage: 'Enroll Learners',\n description: 'Button label and modal title for enrolling learners',\n },\n checkEnrollmentStatus: {\n id: 'instruct.enrollments.checkEnrollmentStatus',\n defaultMessage: 'Check Enrollment Status',\n description: 'Check enrollment status modal title and alt for icon button',\n },\n username: {\n id: 'instruct.enrollments.username',\n defaultMessage: 'Username',\n description: 'Column header for username in enrollments list',\n },\n fullName: {\n id: 'instruct.enrollments.fullName',\n defaultMessage: 'Name',\n description: 'Column header for full name in enrollments list',\n },\n email: {\n id: 'instruct.enrollments.email',\n defaultMessage: 'Email',\n description: 'Column header for email in enrollments list',\n },\n track: {\n id: 'instruct.enrollments.track',\n defaultMessage: 'Track',\n description: 'Column header for track in enrollments list',\n },\n betaTester: {\n id: 'instruct.enrollments.betaTester',\n defaultMessage: 'Beta Tester',\n description: 'Column header for beta tester status in enrollments list',\n },\n actions: {\n id: 'instruct.enrollments.actions',\n defaultMessage: 'Actions',\n description: 'Column header for actions in enrollments list',\n },\n unenrollButton: {\n id: 'instruct.enrollments.unenrollButton',\n defaultMessage: 'Unenroll',\n description: 'Button label for unenrolling a learner',\n },\n trueLabel: {\n id: 'instruct.enrollments.trueLabel',\n defaultMessage: 'True',\n description: 'Label for true boolean value',\n },\n addLearnerInstructions: {\n id: 'instruct.enrollments.modals.checkEnrollmentStatus.addLearnerInstructions',\n defaultMessage: 'Learner\\'s My Open edX email address or username',\n description: 'Instructions for enroll learners to the course',\n },\n enrollmentStatusPlaceholder: {\n id: 'instruct.enrollments.modals.checkEnrollmentStatus.enrollmentStatusPlaceholder',\n defaultMessage: 'Learner email address or username',\n description: 'Placeholder text for enrolling learners textarea',\n },\n closeButton: {\n id: 'instruct.enrollments.modals.closeButton',\n defaultMessage: 'Close',\n description: 'Label for close button in modals',\n },\n searchPlaceholder: {\n id: 'instruct.enrollments.searchPlaceholder',\n defaultMessage: 'Search enrollments',\n description: 'Placeholder for the search input in enrollments list',\n },\n noEnrollments: {\n id: 'instruct.enrollments.noEnrollments',\n defaultMessage: 'No enrollments found',\n description: 'Message displayed when there are no enrollments to show',\n },\n changeBetaTesterStatus: {\n id: 'instruct.enrollments.changeBetaTesterStatus',\n defaultMessage: 'Change Beta Tester Status',\n description: 'Alt text for change beta tester status icon button',\n },\n allEnrollees: {\n id: 'instruct.enrollments.allEnrollees',\n defaultMessage: 'All Enrollees',\n description: 'Option for showing all enrollees in beta tester filter',\n },\n betaTesters: {\n id: 'instruct.enrollments.betaTesters',\n defaultMessage: 'Beta Testers',\n description: 'Option for showing only beta testers in beta tester filter',\n },\n nonBetaTesters: {\n id: 'instruct.enrollments.nonBetaTesters',\n defaultMessage: 'Non-Beta Testers',\n description: 'Option for showing only non-beta testers in beta tester filter',\n },\n statusResponseMessage: {\n id: 'instruct.enrollments.modals.checkEnrollmentStatus.statusResponseMessage',\n defaultMessage: 'Enrollment status for {learnerIdentifier}: {status}',\n description: 'Message displaying the enrollment status for a learner',\n },\n userIdentifierPlaceholder: {\n id: 'instruct.enrollments.modals.enrollLearners.userIdentifierPlaceholder',\n defaultMessage: 'Email addresses / Usernames',\n description: 'Placeholder text for enrolling learners textarea',\n },\n enrollLearnerInstructions: {\n id: 'instruct.enrollments.modals.enrollLearners.enrollLearnerInstructions',\n defaultMessage: 'Enter email addresses and/or usernames separated by new lines or commas. You will not get notification for emails that bounce, so please double-check spelling.',\n description: 'Instructions for enrolling learners to the course',\n },\n unenrollLearners: {\n id: 'instruct.enrollments.modals.unenrollLearners',\n defaultMessage: 'Unenroll Learners',\n description: 'Title for unenroll learners modal',\n },\n unenrollLearnersConfirmation: {\n id: 'instruct.enrollments.modals.unenrollLearnersConfirmation',\n defaultMessage: 'Unenroll {name} from course?',\n description: 'Confirmation message for unenrolling learners',\n },\n unenrollLearnerTitle: {\n id: 'instruct.enrollments.modals.unenrollLearnerTitle',\n defaultMessage: 'Unenroll Learner?',\n description: 'Title for unenroll learner modal',\n },\n saveButton: {\n id: 'instruct.enrollments.modals.saveButton',\n defaultMessage: 'Save',\n description: 'Label for save button in modals',\n },\n cancelButton: {\n id: 'instruct.enrollments.modals.cancelButton',\n defaultMessage: 'Cancel',\n description: 'Label for cancel button in modals',\n },\n autoEnrollCheckbox: {\n id: 'instruct.enrollments.modals.autoEnrollCheckbox',\n defaultMessage: 'Auto Enroll',\n description: 'Label for auto enroll checkbox in enroll learners modal',\n },\n notifyUsersCheckbox: {\n id: 'instruct.enrollments.modals.notifyUsersCheckbox',\n defaultMessage: 'Notify Users by Email',\n description: 'Label for notify users by email checkbox in enroll learners modal',\n },\n enrollLearnerError: {\n id: 'instruct.enrollments.modals.enrollLearnerError',\n defaultMessage: 'An error occurred while enrolling learners. Please try again.',\n description: 'Error message displayed when enrolling learners fails',\n },\n unenrollLearnerError: {\n id: 'instruct.enrollments.modals.unenrollLearnerError',\n defaultMessage: 'An error occurred while unenrolling learner. Please try again.',\n description: 'Error message displayed when unenrolling learner fails',\n },\n enrollLearnerNotFoundError: {\n id: 'instruct.enrollments.modals.enrollLearnerNotFoundError',\n defaultMessage: 'One or more learners were not found. Please check the email addresses or usernames and try again.',\n description: 'Error message displayed when enrolling learners fails due to learner not found',\n }\n});\n\nexport default messages;\n"]}
@@ -1,11 +1,8 @@
1
- import { PaginationParams } from '../types';
1
+ import { Learner, PaginationParams } from '../types';
2
2
  export interface EnrollmentStatusResponse {
3
3
  enrollmentStatus: string;
4
4
  }
5
- export interface Learner {
6
- username: string;
7
- fullName: string;
8
- email: string;
5
+ export interface EnrolledLearner extends Learner {
9
6
  mode: string;
10
7
  isBetaTester: boolean;
11
8
  }
@@ -13,3 +10,9 @@ export interface EnrollmentsParams extends PaginationParams {
13
10
  emailOrUsername: string;
14
11
  isBetaTester: string;
15
12
  }
13
+ export interface UpdateEnrollmentsParams {
14
+ identifier: string[];
15
+ action: 'enroll' | 'unenroll';
16
+ autoEnroll?: boolean;
17
+ emailStudents?: boolean;
18
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/enrollments/types.ts"],"names":[],"mappings":"","sourcesContent":["import { PaginationParams } from '@src/types';\n\nexport interface EnrollmentStatusResponse {\n enrollmentStatus: string,\n}\n\nexport interface Learner {\n username: string,\n fullName: string,\n email: string,\n mode: string,\n isBetaTester: boolean,\n}\n\nexport interface EnrollmentsParams extends PaginationParams {\n emailOrUsername: string,\n isBetaTester: string,\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/enrollments/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Learner, PaginationParams } from '@src/types';\n\nexport interface EnrollmentStatusResponse {\n enrollmentStatus: string,\n}\n\nexport interface EnrolledLearner extends Learner {\n mode: string,\n isBetaTester: boolean,\n}\n\nexport interface EnrollmentsParams extends PaginationParams {\n emailOrUsername: string,\n isBetaTester: string,\n}\n\nexport interface UpdateEnrollmentsParams {\n identifier: string[],\n action: 'enroll' | 'unenroll',\n autoEnroll?: boolean,\n emailStudents?: boolean,\n}\n"]}
@@ -1,6 +1,15 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import { Button, ButtonGroup, Card } from '@openedx/paragon';
5
+ import { PendingTasks } from '../components/PendingTasks';
6
+ import GradingActionRow from '../grading/components/GradingActionRow';
7
+ import GradingLearnerContent from '../grading/components/GradingLearnerContent';
8
+ import messages from '../grading/messages';
2
9
  const GradingPage = () => {
3
- return (_jsx("div", { children: _jsx("h3", { children: "Grading" }) }));
10
+ const intl = useIntl();
11
+ const [selectedTools, setSelectedTools] = useState('single');
12
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "d-flex justify-content-between align-items-center", children: [_jsx("h3", { className: "text-primary-700 mb-0", children: intl.formatMessage(messages.pageTitle) }), _jsx(GradingActionRow, {})] }), _jsxs(Card, { className: "bg-light-200 p-4 mt-4.5", children: [_jsxs(ButtonGroup, { className: "d-block", children: [_jsx(Button, { onClick: () => setSelectedTools('single'), variant: selectedTools === 'single' ? 'primary' : 'outline-primary', children: intl.formatMessage(messages.singleLearner) }), _jsx(Button, { onClick: () => setSelectedTools('all'), variant: selectedTools === 'all' ? 'primary' : 'outline-primary', children: intl.formatMessage(messages.allLearners) })] }), _jsx(GradingLearnerContent, { toolType: selectedTools })] }), _jsx(PendingTasks, {})] }));
4
13
  };
5
14
  export default GradingPage;
6
15
  //# sourceMappingURL=GradingPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GradingPage.js","sourceRoot":"","sources":["../../src/grading/GradingPage.tsx"],"names":[],"mappings":";AAAA,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,OAAO,CACL,wBACE,mCAAgB,GACZ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["const GradingPage = () => {\n return (\n <div>\n <h3>Grading</h3>\n </div>\n );\n};\n\nexport default GradingPage;\n"]}
1
+ {"version":3,"file":"GradingPage.js","sourceRoot":"","sources":["../../src/grading/GradingPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,gBAAgB,MAAM,0CAA0C,CAAC;AACxE,OAAO,qBAAqB,MAAM,+CAA+C,CAAC;AAClF,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAG7C,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAmB,QAAQ,CAAC,CAAC;IAE/E,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,mDAAmD,aAChE,aAAI,SAAS,EAAC,uBAAuB,YAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAM,EACnF,KAAC,gBAAgB,KAAG,IAChB,EACN,MAAC,IAAI,IAAC,SAAS,EAAC,yBAAyB,aACvC,MAAC,WAAW,IAAC,SAAS,EAAC,SAAS,aAC9B,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EACzC,OAAO,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,YAElE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GACpC,EACT,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EACtC,OAAO,EAAE,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,YAE/D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,GAClC,IACG,EACd,KAAC,qBAAqB,IAAC,QAAQ,EAAE,aAAa,GAAI,IAC7C,EACP,KAAC,YAAY,KAAG,IACf,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import { useState } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Button, ButtonGroup, Card } from '@openedx/paragon';\nimport { PendingTasks } from '@src/components/PendingTasks';\nimport GradingActionRow from '@src/grading/components/GradingActionRow';\nimport GradingLearnerContent from '@src/grading/components/GradingLearnerContent';\nimport messages from '@src/grading/messages';\nimport { GradingToolsType } from '@src/grading/types';\n\nconst GradingPage = () => {\n const intl = useIntl();\n const [selectedTools, setSelectedTools] = useState<GradingToolsType>('single');\n\n return (\n <>\n <div className=\"d-flex justify-content-between align-items-center\">\n <h3 className=\"text-primary-700 mb-0\">{intl.formatMessage(messages.pageTitle)}</h3>\n <GradingActionRow />\n </div>\n <Card className=\"bg-light-200 p-4 mt-4.5\">\n <ButtonGroup className=\"d-block\">\n <Button\n onClick={() => setSelectedTools('single')}\n variant={selectedTools === 'single' ? 'primary' : 'outline-primary'}\n >\n {intl.formatMessage(messages.singleLearner)}\n </Button>\n <Button\n onClick={() => setSelectedTools('all')}\n variant={selectedTools === 'all' ? 'primary' : 'outline-primary'}\n >\n {intl.formatMessage(messages.allLearners)}\n </Button>\n </ButtonGroup>\n <GradingLearnerContent toolType={selectedTools} />\n </Card>\n <PendingTasks />\n </>\n );\n};\n\nexport default GradingPage;\n"]}
@@ -0,0 +1,2 @@
1
+ declare const GradingActionRow: () => import("react/jsx-runtime").JSX.Element;
2
+ export default GradingActionRow;
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useParams } from 'react-router-dom';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import { useToggle, ActionRow, Button, IconButton, ModalPopup, Menu, MenuItem } from '@openedx/paragon';
6
+ import { TrendingUp, MoreVert, OpenInNew } from '@openedx/paragon/icons';
7
+ import { useCourseInfo } from '../../data/apiHook';
8
+ import GradingConfigurationModal from '../../grading/components/GradingConfigurationModal';
9
+ import messages from '../../grading/messages';
10
+ const GradingActionRow = () => {
11
+ const { courseId = '' } = useParams();
12
+ const intl = useIntl();
13
+ const { data = { gradebookUrl: '', studioGradingUrl: '' } } = useCourseInfo(courseId);
14
+ const [configurationMenuTarget, setConfigurationMenuTarget] = useState(null);
15
+ const [isOpenMenu, openMenu, closeMenu] = useToggle(false);
16
+ const [isOpenConfigModal, openConfigModal, closeConfigModal] = useToggle(false);
17
+ const handleConfigurationMenuClick = (event) => {
18
+ setConfigurationMenuTarget(event === null || event === void 0 ? void 0 : event.currentTarget);
19
+ openMenu();
20
+ };
21
+ const handleConfigModalOpen = () => {
22
+ openConfigModal();
23
+ closeMenu();
24
+ };
25
+ return (_jsxs(_Fragment, { children: [_jsxs(ActionRow, { children: [_jsx(Button, { as: "a", href: data.gradebookUrl, iconBefore: TrendingUp, variant: "outline-primary", children: intl.formatMessage(messages.viewGradebook) }), _jsx(IconButton, { alt: intl.formatMessage(messages.configurationAlt), className: "lead", iconAs: MoreVert, onClick: handleConfigurationMenuClick })] }), _jsx(ModalPopup, { positionRef: configurationMenuTarget, onClose: closeMenu, isOpen: isOpenMenu, children: _jsxs(Menu, { children: [_jsx(MenuItem, { onClick: handleConfigModalOpen, children: intl.formatMessage(messages.viewGradingConfiguration) }), _jsx(MenuItem, { iconAfter: OpenInNew, as: "a", href: data.studioGradingUrl, target: "_blank", children: intl.formatMessage(messages.viewCourseGradingSettings) })] }) }), _jsx(GradingConfigurationModal, { isOpen: isOpenConfigModal, onClose: closeConfigModal })] }));
26
+ };
27
+ export default GradingActionRow;
28
+ //# sourceMappingURL=GradingActionRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GradingActionRow.js","sourceRoot":"","sources":["../../../src/grading/components/GradingActionRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,yBAAyB,MAAM,mDAAmD,CAAC;AAC1F,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAE7C,MAAM,gBAAgB,GAAG,GAAG,EAAE;IAC5B,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,SAAS,EAAwB,CAAC;IAC5D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtF,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CAA2B,IAAI,CAAC,CAAC;IACvG,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,CAAC,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEhF,MAAM,4BAA4B,GAAG,CAAC,KAA0C,EAAE,EAAE;QAClF,0BAA0B,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,CAAC,CAAC;QACjD,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,MAAC,SAAS,eACR,KAAC,MAAM,IAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAC,iBAAiB,YAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAU,EAC/I,KAAC,UAAU,IACT,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAClD,SAAS,EAAC,MAAM,EAChB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,4BAA4B,GACrC,IACQ,EACZ,KAAC,UAAU,IAAC,WAAW,EAAE,uBAAuB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,YACtF,MAAC,IAAI,eACH,KAAC,QAAQ,IAAC,OAAO,EAAE,qBAAqB,YACrC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAC7C,EACX,KAAC,QAAQ,IAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAC,QAAQ,YAChF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,GAC9C,IACN,GACI,EACb,KAAC,yBAAyB,IAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,GAAI,IAClF,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { useToggle, ActionRow, Button, IconButton, ModalPopup, Menu, MenuItem } from '@openedx/paragon';\nimport { TrendingUp, MoreVert, OpenInNew } from '@openedx/paragon/icons';\nimport { useCourseInfo } from '@src/data/apiHook';\nimport GradingConfigurationModal from '@src/grading/components/GradingConfigurationModal';\nimport messages from '@src/grading/messages';\n\nconst GradingActionRow = () => {\n const { courseId = '' } = useParams<{ courseId: string }>();\n const intl = useIntl();\n const { data = { gradebookUrl: '', studioGradingUrl: '' } } = useCourseInfo(courseId);\n const [configurationMenuTarget, setConfigurationMenuTarget] = useState<HTMLButtonElement | null>(null);\n const [isOpenMenu, openMenu, closeMenu] = useToggle(false);\n const [isOpenConfigModal, openConfigModal, closeConfigModal] = useToggle(false);\n\n const handleConfigurationMenuClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setConfigurationMenuTarget(event?.currentTarget);\n openMenu();\n };\n\n const handleConfigModalOpen = () => {\n openConfigModal();\n closeMenu();\n };\n\n return (\n <>\n <ActionRow>\n <Button as=\"a\" href={data.gradebookUrl} iconBefore={TrendingUp} variant=\"outline-primary\">{intl.formatMessage(messages.viewGradebook)}</Button>\n <IconButton\n alt={intl.formatMessage(messages.configurationAlt)}\n className=\"lead\"\n iconAs={MoreVert}\n onClick={handleConfigurationMenuClick}\n />\n </ActionRow>\n <ModalPopup positionRef={configurationMenuTarget} onClose={closeMenu} isOpen={isOpenMenu}>\n <Menu>\n <MenuItem onClick={handleConfigModalOpen}>\n {intl.formatMessage(messages.viewGradingConfiguration)}\n </MenuItem>\n <MenuItem iconAfter={OpenInNew} as=\"a\" href={data.studioGradingUrl} target=\"_blank\">\n {intl.formatMessage(messages.viewCourseGradingSettings)}\n </MenuItem>\n </Menu>\n </ModalPopup>\n <GradingConfigurationModal isOpen={isOpenConfigModal} onClose={closeConfigModal} />\n </>\n );\n};\n\nexport default GradingActionRow;\n"]}
@@ -0,0 +1,6 @@
1
+ interface GradingConfigurationModalProps {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ }
5
+ declare const GradingConfigurationModal: ({ isOpen, onClose }: GradingConfigurationModalProps) => import("react/jsx-runtime").JSX.Element;
6
+ export default GradingConfigurationModal;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useParams } from 'react-router-dom';
3
+ import { Button, ModalDialog } from '@openedx/paragon';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import messages from '../../grading/messages';
6
+ import { useGradingConfiguration } from '../../grading/data/apiHook';
7
+ const GradingConfigurationModal = ({ isOpen, onClose }) => {
8
+ const intl = useIntl();
9
+ const { courseId = '' } = useParams();
10
+ const { data = null } = useGradingConfiguration(courseId);
11
+ return (_jsxs(ModalDialog, { title: intl.formatMessage(messages.gradingConfiguration), isOpen: isOpen, onClose: onClose, isOverflowVisible: false, children: [_jsx(ModalDialog.Header, { children: _jsx("h3", { children: intl.formatMessage(messages.gradingConfiguration) }) }), _jsx(ModalDialog.Body, { children: _jsx("p", { children: data !== null && data !== void 0 ? data : intl.formatMessage(messages.noGradingConfiguration) }) }), _jsx(ModalDialog.Footer, { children: _jsx(Button, { onClick: onClose, children: intl.formatMessage(messages.close) }) })] }));
12
+ };
13
+ export default GradingConfigurationModal;
14
+ //# sourceMappingURL=GradingConfigurationModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GradingConfigurationModal.js","sourceRoot":"","sources":["../../../src/grading/components/GradingConfigurationModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAOpE,MAAM,yBAAyB,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAkC,EAAE,EAAE;IACxF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,SAAS,EAAwB,CAAC;IAC5D,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAE1D,OAAO,CACL,MAAC,WAAW,IAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAC/H,KAAC,WAAW,CAAC,MAAM,cACjB,uBAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,GAAM,GACzC,EACrB,KAAC,WAAW,CAAC,IAAI,cACf,sBAAI,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,GAAK,GACnD,EACnB,KAAC,WAAW,CAAC,MAAM,cACjB,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,YAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAU,GACpD,IACT,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,yBAAyB,CAAC","sourcesContent":["import { useParams } from 'react-router-dom';\nimport { Button, ModalDialog } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\nimport messages from '@src/grading/messages';\nimport { useGradingConfiguration } from '@src/grading/data/apiHook';\n\ninterface GradingConfigurationModalProps {\n isOpen: boolean,\n onClose: () => void,\n}\n\nconst GradingConfigurationModal = ({ isOpen, onClose }: GradingConfigurationModalProps) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const { data = null } = useGradingConfiguration(courseId);\n\n return (\n <ModalDialog title={intl.formatMessage(messages.gradingConfiguration)} isOpen={isOpen} onClose={onClose} isOverflowVisible={false}>\n <ModalDialog.Header>\n <h3>{intl.formatMessage(messages.gradingConfiguration)}</h3>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <p>{data ?? intl.formatMessage(messages.noGradingConfiguration)}</p>\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <Button onClick={onClose}>{intl.formatMessage(messages.close)}</Button>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default GradingConfigurationModal;\n"]}
@@ -0,0 +1,6 @@
1
+ import { GradingToolsType } from '../../grading/types';
2
+ interface GradingLearnerContentProps {
3
+ toolType: GradingToolsType;
4
+ }
5
+ declare const GradingLearnerContent: ({ toolType }: GradingLearnerContentProps) => import("react/jsx-runtime").JSX.Element;
6
+ export default GradingLearnerContent;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useIntl } from '@openedx/frontend-base';
3
+ import SpecifyProblem from '../../components/SpecifyProblem';
4
+ import messages from '../../grading/messages';
5
+ const GradingLearnerContent = ({ toolType }) => {
6
+ const intl = useIntl();
7
+ return (_jsxs(_Fragment, { children: [_jsx("p", { className: "x-small text-primary mt-3", children: toolType === 'single'
8
+ ? intl.formatMessage(messages.descriptionSingleLearner)
9
+ : intl.formatMessage(messages.descriptionAllLearners) }), _jsx(SpecifyProblem, {})] }));
10
+ };
11
+ export default GradingLearnerContent;
12
+ //# sourceMappingURL=GradingLearnerContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GradingLearnerContent.js","sourceRoot":"","sources":["../../../src/grading/components/GradingLearnerContent.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,cAAc,MAAM,gCAAgC,CAAC;AAC5D,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAO7C,MAAM,qBAAqB,GAAG,CAAC,EAAE,QAAQ,EAA8B,EAAE,EAAE;IACzE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,CACL,8BACE,YAAG,SAAS,EAAC,2BAA2B,YAEpC,QAAQ,KAAK,QAAQ;oBACnB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC;oBACvD,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,GAEvD,EACJ,KAAC,cAAc,KAAG,IACjB,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport SpecifyProblem from '@src/components/SpecifyProblem';\nimport messages from '@src/grading/messages';\nimport { GradingToolsType } from '@src/grading/types';\n\ninterface GradingLearnerContentProps {\n toolType: GradingToolsType,\n}\n\nconst GradingLearnerContent = ({ toolType }: GradingLearnerContentProps) => {\n const intl = useIntl();\n\n return (\n <>\n <p className=\"x-small text-primary mt-3\">\n {\n toolType === 'single'\n ? intl.formatMessage(messages.descriptionSingleLearner)\n : intl.formatMessage(messages.descriptionAllLearners)\n }\n </p>\n <SpecifyProblem />\n </>\n );\n};\n\nexport default GradingLearnerContent;\n"]}
@@ -0,0 +1 @@
1
+ export declare const getGradingConfiguration: (courseId: string) => Promise<any>;
@@ -0,0 +1,17 @@
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 getGradingConfiguration = (courseId) => __awaiter(void 0, void 0, void 0, function* () {
13
+ const { data } = yield getAuthenticatedHttpClient()
14
+ .get(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/grading-config`);
15
+ return camelCaseObject(data);
16
+ });
17
+ //# sourceMappingURL=api.js.map