@openedx/frontend-app-instructor-dashboard 1.0.0-alpha.11 → 1.0.0-alpha.12

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 (89) hide show
  1. package/dist/certificates/CertificatesPage.d.ts +1 -0
  2. package/dist/certificates/CertificatesPage.js +162 -2
  3. package/dist/certificates/CertificatesPage.js.map +1 -1
  4. package/dist/certificates/CertificatesPage.scss +81 -0
  5. package/dist/certificates/components/CertificateTable.d.ts +14 -0
  6. package/dist/certificates/components/CertificateTable.js +85 -0
  7. package/dist/certificates/components/CertificateTable.js.map +1 -0
  8. package/dist/certificates/components/CertificatesPageHeader.d.ts +7 -0
  9. package/dist/certificates/components/CertificatesPageHeader.js +11 -0
  10. package/dist/certificates/components/CertificatesPageHeader.js.map +1 -0
  11. package/dist/certificates/components/CertificatesToolbar.d.ts +10 -0
  12. package/dist/certificates/components/CertificatesToolbar.js +12 -0
  13. package/dist/certificates/components/CertificatesToolbar.js.map +1 -0
  14. package/dist/certificates/components/DisableCertificatesModal.d.ts +9 -0
  15. package/dist/certificates/components/DisableCertificatesModal.js +16 -0
  16. package/dist/certificates/components/DisableCertificatesModal.js.map +1 -0
  17. package/dist/certificates/components/FilterDropdown.d.ts +8 -0
  18. package/dist/certificates/components/FilterDropdown.js +50 -0
  19. package/dist/certificates/components/FilterDropdown.js.map +1 -0
  20. package/dist/certificates/components/GenerationHistoryTable.d.ts +11 -0
  21. package/dist/certificates/components/GenerationHistoryTable.js +40 -0
  22. package/dist/certificates/components/GenerationHistoryTable.js.map +1 -0
  23. package/dist/certificates/components/GrantExceptionsModal.d.ts +8 -0
  24. package/dist/certificates/components/GrantExceptionsModal.js +10 -0
  25. package/dist/certificates/components/GrantExceptionsModal.js.map +1 -0
  26. package/dist/certificates/components/InvalidateCertificateModal.d.ts +8 -0
  27. package/dist/certificates/components/InvalidateCertificateModal.js +10 -0
  28. package/dist/certificates/components/InvalidateCertificateModal.js.map +1 -0
  29. package/dist/certificates/components/IssuedCertificatesTab.d.ts +18 -0
  30. package/dist/certificates/components/IssuedCertificatesTab.js +6 -0
  31. package/dist/certificates/components/IssuedCertificatesTab.js.map +1 -0
  32. package/dist/certificates/components/LearnerActionModal.d.ts +16 -0
  33. package/dist/certificates/components/LearnerActionModal.js +22 -0
  34. package/dist/certificates/components/LearnerActionModal.js.map +1 -0
  35. package/dist/certificates/components/RemoveInvalidationModal.d.ts +9 -0
  36. package/dist/certificates/components/RemoveInvalidationModal.js +10 -0
  37. package/dist/certificates/components/RemoveInvalidationModal.js.map +1 -0
  38. package/dist/certificates/constants.d.ts +15 -0
  39. package/dist/certificates/constants.js +16 -0
  40. package/dist/certificates/constants.js.map +1 -0
  41. package/dist/certificates/data/api.d.ts +9 -0
  42. package/dist/certificates/data/api.js +63 -0
  43. package/dist/certificates/data/api.js.map +1 -0
  44. package/dist/certificates/data/apiHook.d.ts +30 -0
  45. package/dist/certificates/data/apiHook.js +90 -0
  46. package/dist/certificates/data/apiHook.js.map +1 -0
  47. package/dist/certificates/data/dummyData.d.ts +2 -0
  48. package/dist/certificates/data/dummyData.js +234 -0
  49. package/dist/certificates/data/dummyData.js.map +1 -0
  50. package/dist/certificates/data/queryKeys.d.ts +8 -0
  51. package/dist/certificates/data/queryKeys.js +8 -0
  52. package/dist/certificates/data/queryKeys.js.map +1 -0
  53. package/dist/certificates/messages.d.ts +313 -0
  54. package/dist/certificates/messages.js +315 -0
  55. package/dist/certificates/messages.js.map +1 -0
  56. package/dist/certificates/types.d.ts +61 -0
  57. package/dist/certificates/types.js +26 -0
  58. package/dist/certificates/types.js.map +1 -0
  59. package/dist/certificates/utils/errorHandling.d.ts +10 -0
  60. package/dist/certificates/utils/errorHandling.js +3 -0
  61. package/dist/certificates/utils/errorHandling.js.map +1 -0
  62. package/dist/certificates/utils/filterUtils.d.ts +4 -0
  63. package/dist/certificates/utils/filterUtils.js +31 -0
  64. package/dist/certificates/utils/filterUtils.js.map +1 -0
  65. package/dist/certificates/utils/index.d.ts +2 -0
  66. package/dist/certificates/utils/index.js +2 -0
  67. package/dist/certificates/utils/index.js.map +1 -0
  68. package/dist/courseTeam/CourseTeamPage.js +5 -2
  69. package/dist/courseTeam/CourseTeamPage.js.map +1 -1
  70. package/dist/courseTeam/components/AddTeamMemberModal.d.ts +6 -0
  71. package/dist/courseTeam/components/AddTeamMemberModal.js +60 -0
  72. package/dist/courseTeam/components/AddTeamMemberModal.js.map +1 -0
  73. package/dist/courseTeam/data/api.d.ts +2 -1
  74. package/dist/courseTeam/data/api.js +4 -0
  75. package/dist/courseTeam/data/api.js.map +1 -1
  76. package/dist/courseTeam/data/apiHook.d.ts +4 -0
  77. package/dist/courseTeam/data/apiHook.js +11 -2
  78. package/dist/courseTeam/data/apiHook.js.map +1 -1
  79. package/dist/courseTeam/messages.d.ts +60 -0
  80. package/dist/courseTeam/messages.js +61 -1
  81. package/dist/courseTeam/messages.js.map +1 -1
  82. package/dist/courseTeam/types.d.ts +6 -0
  83. package/dist/courseTeam/types.js.map +1 -1
  84. package/dist/testUtils.js +1 -1
  85. package/dist/testUtils.js.map +1 -1
  86. package/dist/utils/formatters.d.ts +5 -0
  87. package/dist/utils/formatters.js +10 -0
  88. package/dist/utils/formatters.js.map +1 -1
  89. package/package.json +1 -1
@@ -0,0 +1,60 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } 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 { ActionRow, Button, Form, ModalDialog } from '@openedx/paragon';
6
+ import { useAddTeamMember, useRoles } from '../../courseTeam/data/apiHook';
7
+ import messages from '../../courseTeam/messages';
8
+ import { useCourseInfo } from '../../data/apiHook';
9
+ import { useDebouncedFilter } from '../../hooks/useDebouncedFilter';
10
+ import { useAlert } from '../../providers/AlertProvider';
11
+ const AddTeamMemberModal = ({ isOpen, onClose, }) => {
12
+ const intl = useIntl();
13
+ const { courseId = '' } = useParams();
14
+ const { data: { displayName } = { displayName: '' } } = useCourseInfo(courseId);
15
+ const { data: { results } = { results: [] } } = useRoles(courseId);
16
+ const [users, setUsers] = useState('');
17
+ const [selectedRole, setSelectedRole] = useState('');
18
+ const { inputValue, handleChange } = useDebouncedFilter({
19
+ filterValue: users,
20
+ setFilter: setUsers,
21
+ });
22
+ const { mutate: addTeamMember } = useAddTeamMember(courseId);
23
+ const { addAlert, showModal } = useAlert();
24
+ const roles = [{ role: '', displayName: intl.formatMessage(messages.rolePlaceholder) }, ...(results || [])];
25
+ const handleInputChange = (e) => {
26
+ handleChange(e.target.value);
27
+ };
28
+ const handleSelectChange = (e) => {
29
+ setSelectedRole(e.target.value);
30
+ };
31
+ const handleSave = () => {
32
+ const identifiers = inputValue.split(',').map(user => user.trim()).filter(user => user);
33
+ addTeamMember({ identifiers, role: selectedRole }, {
34
+ onSuccess: (data) => {
35
+ var _a;
36
+ const failedUsernames = ((_a = data.results) === null || _a === void 0 ? void 0 : _a.filter(user => user.userDoesNotExist).map(user => user.identifier)) || [];
37
+ if (failedUsernames.length > 0) {
38
+ addAlert({
39
+ type: 'danger',
40
+ message: intl.formatMessage(messages.failedToAddTeamMembers),
41
+ extraContent: (failedUsernames.map((learner) => (_jsxs("p", { className: "mb-0", children: ["\u2022 ", intl.formatMessage(messages.unknownLearner, { learner })] }, learner))))
42
+ });
43
+ }
44
+ setUsers('');
45
+ setSelectedRole('');
46
+ onClose();
47
+ },
48
+ onError: () => {
49
+ showModal({
50
+ message: intl.formatMessage(messages.addTeamMemberError),
51
+ variant: 'danger',
52
+ confirmText: intl.formatMessage(messages.closeButton),
53
+ });
54
+ }
55
+ });
56
+ };
57
+ return (_jsxs(ModalDialog, { isOpen: isOpen, onClose: onClose, title: intl.formatMessage(messages.addNewTeamMember), isOverflowVisible: false, size: "lg", children: [_jsx(ModalDialog.Header, { children: _jsx("h3", { className: "text-primary-500", children: intl.formatMessage(messages.addNewTeamMember) }) }), _jsxs(ModalDialog.Body, { children: [_jsx("p", { children: intl.formatMessage(messages.addNewTeamMemberDescription, { courseName: displayName }) }), _jsxs(Form.Group, { children: [_jsx(Form.Label, { children: intl.formatMessage(messages.addUsersLabel) }), _jsx(Form.Control, { as: "textarea", rows: 3, placeholder: intl.formatMessage(messages.usersPlaceholder), value: inputValue, onChange: handleInputChange })] }), _jsxs(Form.Group, { children: [_jsx(Form.Label, { children: intl.formatMessage(messages.roleLabel) }), _jsx(Form.Control, { as: "select", defaultValue: "", disabled: roles.length === 1, onChange: handleSelectChange, children: roles.map((role) => (_jsx("option", { value: role.role, children: role.displayName }, role.role))) })] })] }), _jsx(ModalDialog.Footer, { children: _jsxs(ActionRow, { children: [_jsx(Button, { variant: "tertiary", onClick: onClose, children: intl.formatMessage(messages.cancelButton) }), _jsx(Button, { variant: "primary", onClick: handleSave, disabled: !selectedRole || !inputValue, children: intl.formatMessage(messages.saveButton) })] }) })] }));
58
+ };
59
+ export default AddTeamMemberModal;
60
+ //# sourceMappingURL=AddTeamMemberModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddTeamMemberModal.js","sourceRoot":"","sources":["../../../src/courseTeam/components/AddTeamMemberModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { ActionRow, Button, Form, ModalDialog } from '@openedx/paragon';\nimport { useAddTeamMember, useRoles } from '@src/courseTeam/data/apiHook';\nimport messages from '@src/courseTeam/messages';\nimport { useCourseInfo } from '@src/data/apiHook';\nimport { useDebouncedFilter } from '@src/hooks/useDebouncedFilter';\nimport { useAlert } from '@src/providers/AlertProvider';\n\ninterface AddTeamMemberModalProps {\n isOpen: boolean,\n onClose: () => void,\n}\n\nconst AddTeamMemberModal = ({\n isOpen,\n onClose,\n}: AddTeamMemberModalProps) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const { data: { displayName } = { displayName: '' } } = useCourseInfo(courseId);\n const { data: { results } = { results: [] } } = useRoles(courseId);\n const [users, setUsers] = useState('');\n const [selectedRole, setSelectedRole] = useState('');\n const { inputValue, handleChange } = useDebouncedFilter({\n filterValue: users,\n setFilter: setUsers,\n });\n const { mutate: addTeamMember } = useAddTeamMember(courseId);\n const { addAlert, showModal } = useAlert();\n\n const roles = [{ role: '', displayName: intl.formatMessage(messages.rolePlaceholder) }, ...(results || [])];\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n handleChange(e.target.value);\n };\n\n const handleSelectChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n setSelectedRole(e.target.value);\n };\n\n const handleSave = () => {\n const identifiers = inputValue.split(',').map(user => user.trim()).filter(user => user);\n addTeamMember({ identifiers, role: selectedRole }, {\n onSuccess: (data) => {\n const failedUsernames = data.results?.filter(user => user.userDoesNotExist).map(user => user.identifier) || [];\n if (failedUsernames.length > 0) {\n addAlert({\n type: 'danger',\n message: intl.formatMessage(messages.failedToAddTeamMembers),\n extraContent: (\n failedUsernames.map((learner: string) => (\n <p key={learner} className=\"mb-0\">• {intl.formatMessage(messages.unknownLearner, { learner })}</p>\n ))\n )\n });\n }\n setUsers('');\n setSelectedRole('');\n onClose();\n },\n onError: () => {\n showModal({\n message: intl.formatMessage(messages.addTeamMemberError),\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.addNewTeamMember)} isOverflowVisible={false} size=\"lg\">\n <ModalDialog.Header>\n <h3 className=\"text-primary-500\">{intl.formatMessage(messages.addNewTeamMember)}</h3>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <p>{intl.formatMessage(messages.addNewTeamMemberDescription, { courseName: displayName })}</p>\n <Form.Group>\n <Form.Label>{intl.formatMessage(messages.addUsersLabel)}</Form.Label>\n <Form.Control as=\"textarea\" rows={3} placeholder={intl.formatMessage(messages.usersPlaceholder)} value={inputValue} onChange={handleInputChange} />\n </Form.Group>\n <Form.Group>\n <Form.Label>{intl.formatMessage(messages.roleLabel)}</Form.Label>\n <Form.Control as=\"select\" defaultValue=\"\" disabled={roles.length === 1} onChange={handleSelectChange}>\n {\n roles.map((role) => (\n <option key={role.role} value={role.role}>\n {role.displayName}\n </option>\n ))\n }\n </Form.Control>\n </Form.Group>\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <ActionRow>\n <Button variant=\"tertiary\" onClick={onClose}>{intl.formatMessage(messages.cancelButton)}</Button>\n <Button variant=\"primary\" onClick={handleSave} disabled={!selectedRole || !inputValue}>{intl.formatMessage(messages.saveButton)}</Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default AddTeamMemberModal;\n"]}
@@ -1,4 +1,5 @@
1
1
  import { DataList } from '../../types';
2
- import { CourseTeamMember, CourseTeamMemberQueryParams, Role } from '../../courseTeam/types';
2
+ import { AddTeamMembersResponse, CourseTeamMember, CourseTeamMemberQueryParams, Role } from '../../courseTeam/types';
3
3
  export declare const getTeamMembers: (courseId: string, params: CourseTeamMemberQueryParams) => Promise<DataList<CourseTeamMember>>;
4
4
  export declare const getRoles: (courseId: string) => Promise<Omit<DataList<Role>, "numPages" | "count">>;
5
+ export declare const addTeamMember: (courseId: string, identifiers: string[], role: string) => Promise<AddTeamMembersResponse>;
@@ -27,4 +27,8 @@ export const getRoles = (courseId) => __awaiter(void 0, void 0, void 0, function
27
27
  const { data } = yield getAuthenticatedHttpClient().get(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team/roles`);
28
28
  return camelCaseObject(data);
29
29
  });
30
+ export const addTeamMember = (courseId, identifiers, role) => __awaiter(void 0, void 0, void 0, function* () {
31
+ const { data } = yield getAuthenticatedHttpClient().post(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team`, { identifiers, role });
32
+ return camelCaseObject(data);
33
+ });
30
34
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/courseTeam/data/api.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAAgB,EAChB,MAAmC,EACE,EAAE;IACvC,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,mBAAmB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,GAAG,CACrD,GAAG,aAAa,EAAE,8BAA8B,QAAQ,SAAS,WAAW,CAAC,QAAQ,EAAE,EAAE,CAC1F,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAO,QAAgB,EAAuD,EAAE;IACtG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,GAAG,CACrD,GAAG,aAAa,EAAE,8BAA8B,QAAQ,aAAa,CACtE,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC","sourcesContent":["import { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { getApiBaseUrl } from '@src/data/api';\nimport { DataList } from '@src/types';\nimport { CourseTeamMember, CourseTeamMemberQueryParams, Role } from '@src/courseTeam/types';\n\nexport const getTeamMembers = async (\n courseId: string,\n params: CourseTeamMemberQueryParams\n): Promise<DataList<CourseTeamMember>> => {\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('email_or_username', params.emailOrUsername);\n }\n\n if (params.role) {\n queryParams.append('role', params.role);\n }\n\n const { data } = await getAuthenticatedHttpClient().get(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team?${queryParams.toString()}`\n );\n return camelCaseObject(data);\n};\n\nexport const getRoles = async (courseId: string): Promise<Omit<DataList<Role>, 'numPages' | 'count'>> => {\n const { data } = await getAuthenticatedHttpClient().get(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team/roles`\n );\n return camelCaseObject(data);\n};\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/courseTeam/data/api.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAAgB,EAChB,MAAmC,EACE,EAAE;IACvC,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,mBAAmB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,GAAG,CACrD,GAAG,aAAa,EAAE,8BAA8B,QAAQ,SAAS,WAAW,CAAC,QAAQ,EAAE,EAAE,CAC1F,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAO,QAAgB,EAAuD,EAAE;IACtG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,GAAG,CACrD,GAAG,aAAa,EAAE,8BAA8B,QAAQ,aAAa,CACtE,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAO,QAAgB,EAAE,WAAqB,EAAE,IAAY,EAAmC,EAAE;IAC5H,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,IAAI,CACtD,GAAG,aAAa,EAAE,8BAA8B,QAAQ,OAAO,EAC/D,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC","sourcesContent":["import { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { getApiBaseUrl } from '@src/data/api';\nimport { DataList } from '@src/types';\nimport { AddTeamMembersResponse, CourseTeamMember, CourseTeamMemberQueryParams, Role } from '@src/courseTeam/types';\n\nexport const getTeamMembers = async (\n courseId: string,\n params: CourseTeamMemberQueryParams\n): Promise<DataList<CourseTeamMember>> => {\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('email_or_username', params.emailOrUsername);\n }\n\n if (params.role) {\n queryParams.append('role', params.role);\n }\n\n const { data } = await getAuthenticatedHttpClient().get(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team?${queryParams.toString()}`\n );\n return camelCaseObject(data);\n};\n\nexport const getRoles = async (courseId: string): Promise<Omit<DataList<Role>, 'numPages' | 'count'>> => {\n const { data } = await getAuthenticatedHttpClient().get(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team/roles`\n );\n return camelCaseObject(data);\n};\n\nexport const addTeamMember = async (courseId: string, identifiers: string[], role: string): Promise<AddTeamMembersResponse> => {\n const { data } = await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team`,\n { identifiers, role }\n );\n return camelCaseObject(data);\n};\n"]}
@@ -1,3 +1,7 @@
1
1
  import { CourseTeamMemberQueryParams } from '../../courseTeam/types';
2
2
  export declare const useTeamMembers: (courseId: string, params: CourseTeamMemberQueryParams) => import("@tanstack/react-query").UseQueryResult<import("../../types").DataList<import("../../courseTeam/types").CourseTeamMember>, Error>;
3
3
  export declare const useRoles: (courseId: string) => import("@tanstack/react-query").UseQueryResult<Omit<import("../../types").DataList<import("../../courseTeam/types").Role>, "count" | "numPages">, Error>;
4
+ export declare const useAddTeamMember: (courseId: string) => import("@tanstack/react-query").UseMutationResult<import("../../courseTeam/types").AddTeamMembersResponse, Error, {
5
+ identifiers: string[];
6
+ role: string;
7
+ }, unknown>;
@@ -1,5 +1,5 @@
1
- import { useQuery } from '@tanstack/react-query';
2
- import { getRoles, getTeamMembers } from '../../courseTeam/data/api';
1
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
2
+ import { addTeamMember, getRoles, getTeamMembers } from '../../courseTeam/data/api';
3
3
  import { courseTeamQueryKeys } from '../../courseTeam/data/queryKeys';
4
4
  export const useTeamMembers = (courseId, params) => (useQuery({
5
5
  queryKey: courseTeamQueryKeys.byCoursePaginated(courseId, params),
@@ -11,4 +11,13 @@ export const useRoles = (courseId) => (useQuery({
11
11
  queryFn: () => getRoles(courseId),
12
12
  enabled: !!courseId,
13
13
  }));
14
+ export const useAddTeamMember = (courseId) => {
15
+ const queryClient = useQueryClient();
16
+ return (useMutation({
17
+ mutationFn: ({ identifiers, role }) => addTeamMember(courseId, identifiers, role),
18
+ onSuccess: () => {
19
+ queryClient.invalidateQueries({ queryKey: courseTeamQueryKeys.byCourse(courseId) });
20
+ }
21
+ }));
22
+ };
14
23
  //# sourceMappingURL=apiHook.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"apiHook.js","sourceRoot":"","sources":["../../../src/courseTeam/data/apiHook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,MAAmC,EAAE,EAAE,CAAC,CACvF,QAAQ,CAAC;IACP,QAAQ,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACjE,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,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAC5C,QAAQ,CAAC;IACP,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7C,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,QAAQ;CACpB,CAAC,CACH,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { getRoles, getTeamMembers } from '@src/courseTeam/data/api';\nimport { courseTeamQueryKeys } from '@src/courseTeam/data/queryKeys';\nimport { CourseTeamMemberQueryParams } from '@src/courseTeam/types';\n\nexport const useTeamMembers = (courseId: string, params: CourseTeamMemberQueryParams) => (\n useQuery({\n queryKey: courseTeamQueryKeys.byCoursePaginated(courseId, params),\n queryFn: () => getTeamMembers(courseId, params),\n enabled: !!courseId,\n })\n);\n\nexport const useRoles = (courseId: string) => (\n useQuery({\n queryKey: courseTeamQueryKeys.roles(courseId),\n queryFn: () => getRoles(courseId),\n enabled: !!courseId,\n })\n);\n"]}
1
+ {"version":3,"file":"apiHook.js","sourceRoot":"","sources":["../../../src/courseTeam/data/apiHook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,MAAmC,EAAE,EAAE,CAAC,CACvF,QAAQ,CAAC;IACP,QAAQ,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACjE,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,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAC5C,QAAQ,CAAC;IACP,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7C,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,QAAQ;CACpB,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,EAAE;IACnD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,CAAC,WAAW,CAAC;QAClB,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAA2C,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC;QAC1H,SAAS,EAAE,GAAG,EAAE;YACd,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC;KACF,CAAC,CACD,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { addTeamMember, getRoles, getTeamMembers } from '@src/courseTeam/data/api';\nimport { courseTeamQueryKeys } from '@src/courseTeam/data/queryKeys';\nimport { CourseTeamMemberQueryParams } from '@src/courseTeam/types';\n\nexport const useTeamMembers = (courseId: string, params: CourseTeamMemberQueryParams) => (\n useQuery({\n queryKey: courseTeamQueryKeys.byCoursePaginated(courseId, params),\n queryFn: () => getTeamMembers(courseId, params),\n enabled: !!courseId,\n })\n);\n\nexport const useRoles = (courseId: string) => (\n useQuery({\n queryKey: courseTeamQueryKeys.roles(courseId),\n queryFn: () => getRoles(courseId),\n enabled: !!courseId,\n })\n);\n\nexport const useAddTeamMember = (courseId: string) => {\n const queryClient = useQueryClient();\n return (useMutation({\n mutationFn: ({ identifiers, role }: { identifiers: string[], role: string }) => addTeamMember(courseId, identifiers, role),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: courseTeamQueryKeys.byCourse(courseId) });\n }\n })\n );\n};\n"]}
@@ -154,5 +154,65 @@ declare const messages: {
154
154
  defaultMessage: string;
155
155
  description: string;
156
156
  };
157
+ addNewTeamMember: {
158
+ id: string;
159
+ defaultMessage: string;
160
+ description: string;
161
+ };
162
+ addNewTeamMemberDescription: {
163
+ id: string;
164
+ defaultMessage: string;
165
+ description: string;
166
+ };
167
+ addUsersLabel: {
168
+ id: string;
169
+ defaultMessage: string;
170
+ description: string;
171
+ };
172
+ usersPlaceholder: {
173
+ id: string;
174
+ defaultMessage: string;
175
+ description: string;
176
+ };
177
+ roleLabel: {
178
+ id: string;
179
+ defaultMessage: string;
180
+ description: string;
181
+ };
182
+ rolePlaceholder: {
183
+ id: string;
184
+ defaultMessage: string;
185
+ description: string;
186
+ };
187
+ cancelButton: {
188
+ id: string;
189
+ defaultMessage: string;
190
+ description: string;
191
+ };
192
+ saveButton: {
193
+ id: string;
194
+ defaultMessage: string;
195
+ description: string;
196
+ };
197
+ addTeamMemberError: {
198
+ id: string;
199
+ defaultMessage: string;
200
+ description: string;
201
+ };
202
+ closeButton: {
203
+ id: string;
204
+ defaultMessage: string;
205
+ description: string;
206
+ };
207
+ failedToAddTeamMembers: {
208
+ id: string;
209
+ defaultMessage: string;
210
+ description: string;
211
+ };
212
+ unknownLearner: {
213
+ id: string;
214
+ defaultMessage: string;
215
+ description: string;
216
+ };
157
217
  };
158
218
  export default messages;
@@ -154,7 +154,67 @@ const messages = defineMessages({
154
154
  id: 'instruct.courseTeam.roles.ccxCoachDescription',
155
155
  defaultMessage: 'CCX Coaches are able to create their own Custom Courses based on this course, which they can use to provide personalized instruction to their own students based in this course material.',
156
156
  description: 'Description for CCX coach role',
157
- }
157
+ },
158
+ addNewTeamMember: {
159
+ id: 'instruct.courseTeam.addNewTeamMember',
160
+ defaultMessage: 'Add New Team Member',
161
+ description: 'Title for add new team member form',
162
+ },
163
+ addNewTeamMemberDescription: {
164
+ id: 'instruct.courseTeam.addNewTeamMemberDescription',
165
+ defaultMessage: 'Add new members to {courseName}’s Course team and assign them a role to define their permissions.',
166
+ description: 'Description for add new team member form',
167
+ },
168
+ addUsersLabel: {
169
+ id: 'instruct.courseTeam.addUsersLabel',
170
+ defaultMessage: 'Add users by username or email',
171
+ description: 'Label for input to add users to course team',
172
+ },
173
+ usersPlaceholder: {
174
+ id: 'instruct.courseTeam.usersPlaceholder',
175
+ defaultMessage: 'Enter one or more email addresses or usernames',
176
+ description: 'Placeholder for input to add users to course team',
177
+ },
178
+ roleLabel: {
179
+ id: 'instruct.courseTeam.roleLabel',
180
+ defaultMessage: 'Role',
181
+ description: 'Label for role selection when adding users to course team',
182
+ },
183
+ rolePlaceholder: {
184
+ id: 'instruct.courseTeam.rolePlaceholder',
185
+ defaultMessage: 'Select Role',
186
+ description: 'Placeholder for role selection when adding users to course team',
187
+ },
188
+ cancelButton: {
189
+ id: 'instruct.courseTeam.cancelButton',
190
+ defaultMessage: 'Cancel',
191
+ description: 'Label for cancel button when adding users to course team',
192
+ },
193
+ saveButton: {
194
+ id: 'instruct.courseTeam.saveButton',
195
+ defaultMessage: 'Save',
196
+ description: 'Label for save button when adding users to course team',
197
+ },
198
+ addTeamMemberError: {
199
+ id: 'instruct.courseTeam.addTeamMemberError',
200
+ defaultMessage: 'Could not find a user with username or email address “{username}”',
201
+ description: 'Error message displayed when adding a team member fails',
202
+ },
203
+ closeButton: {
204
+ id: 'instruct.courseTeam.closeButton',
205
+ defaultMessage: 'Close',
206
+ description: 'Label for close button in error modal when adding a team member fails',
207
+ },
208
+ failedToAddTeamMembers: {
209
+ id: 'instruct.courseTeam.failedToAddTeamMembers',
210
+ defaultMessage: 'The following usernames and/or email addresses are invalid. All other roles have been added to the team members.',
211
+ description: 'Error message displayed when some team members could not be added',
212
+ },
213
+ unknownLearner: {
214
+ id: 'instruct.courseTeam.unknownLearner',
215
+ defaultMessage: 'Unknown learner: {learner}',
216
+ description: 'Displayed when a learner does not have a full name or username available',
217
+ },
158
218
  });
159
219
  export default messages;
160
220
  //# sourceMappingURL=messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/courseTeam/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n courseTeamTitle: {\n id: 'instruct.courseTeam.page.title',\n defaultMessage: 'Course Team Management',\n description: 'Title for the course team page',\n },\n addTeamMember: {\n id: 'instruct.courseTeam.addTeamMember',\n defaultMessage: 'Add Team Member',\n description: 'Button label for adding a team member',\n },\n membersTab: {\n id: 'instruct.courseTeam.membersTab',\n defaultMessage: 'Members',\n description: 'Tab title for course team members',\n },\n rolesTab: {\n id: 'instruct.courseTeam.rolesTab',\n defaultMessage: 'Roles',\n description: 'Tab title for course team roles',\n },\n username: {\n id: 'instruct.courseTeam.username',\n defaultMessage: 'Username',\n description: 'Column header for team member username',\n },\n email: {\n id: 'instruct.courseTeam.email',\n defaultMessage: 'Email',\n description: 'Column header for team member email',\n },\n role: {\n id: 'instruct.courseTeam.role',\n defaultMessage: 'Role',\n description: 'Column header for team member role',\n },\n actions: {\n id: 'instruct.courseTeam.actions',\n defaultMessage: 'Actions',\n description: 'Column header for team member actions',\n },\n edit: {\n id: 'instruct.courseTeam.edit',\n defaultMessage: 'Edit',\n description: 'Button label for editing a team member',\n },\n noTeamMembers: {\n id: 'instruct.courseTeam.noTeamMembers',\n defaultMessage: 'No team members found.',\n description: 'Message displayed when there are no team members',\n },\n allRoles: {\n id: 'instruct.courseTeam.allRoles',\n defaultMessage: 'All Roles',\n description: 'Option label for filtering by all roles',\n },\n staff: {\n id: 'instruct.courseTeam.roles.staff',\n defaultMessage: 'Staff',\n description: 'Role name for staff members',\n },\n staffDescription: {\n id: 'instruct.courseTeam.roles.staffDescription',\n defaultMessage: 'Course team members with the Staff role help you manage your course. Staff can enroll and unenroll learners, as well as modify their grades and access all course data. Staff also have access to your course in Studio and Insights. Any users not yet enrolled in the course will be automatically enrolled when added as Staff.',\n description: 'Description for staff role',\n },\n limitedStaff: {\n id: 'instruct.courseTeam.roles.limitedStaff',\n defaultMessage: 'Limited Staff',\n description: 'Role name for limited staff members',\n },\n limitedStaffDescription: {\n id: 'instruct.courseTeam.roles.limitedStaffDescription',\n defaultMessage: 'Course team members with the Limited Staff role help you manage your course. Limited Staff can enroll and unenroll learners, as well as modify their grades and access all course data. Limited Staff don\\'t have access to your course in Studio. Any users not yet enrolled in the course will be automatically enrolled when added as Limited Staff.',\n description: 'Description for limited staff role',\n },\n admin: {\n id: 'instruct.courseTeam.roles.admin',\n defaultMessage: 'Admin',\n description: 'Role name for admin members',\n },\n adminDescription: {\n id: 'instruct.courseTeam.roles.adminDescription',\n defaultMessage: 'Course team members with the Admin role help you manage your course. They can do all of the tasks that Staff can do, and can also add and remove the Staff and Admin roles, discussion moderation roles, and the beta tester role to manage course team membership. Any users not yet enrolled in the course will be automatically enrolled when added as Admin.',\n description: 'Description for admin role',\n },\n beta: {\n id: 'instruct.courseTeam.roles.beta',\n defaultMessage: 'Beta Testers',\n description: 'Role name for beta tester members',\n },\n betaDescription: {\n id: 'instruct.courseTeam.roles.betaDescription',\n defaultMessage: 'Beta Testers can see course content before other learners. They can make sure that the content works, but have no additional privileges. Any users not yet enrolled in the course will be automatically enrolled when added as Beta Tester.',\n description: 'Description for beta tester role',\n },\n courseDataResearchers: {\n id: 'instruct.courseTeam.roles.courseDataResearchers',\n defaultMessage: 'Course Data Researchers',\n description: 'Role name for course data researcher members',\n },\n courseDataResearchersDescription: {\n id: 'instruct.courseTeam.roles.courseDataResearchersDescription',\n defaultMessage: 'Course Data Researchers can access the data download tab. Any users not yet enrolled in the course will be automatically enrolled when added as Course Data Researcher.',\n description: 'Description for course data researcher role',\n },\n discussionAdmin: {\n id: 'instruct.courseTeam.roles.discussionAdmin',\n defaultMessage: 'Discussion Admin',\n description: 'Role name for discussion admin members',\n },\n discussionAdminDescription: {\n id: 'instruct.courseTeam.roles.discussionAdminDescription',\n defaultMessage: 'Discussion Admins can edit or delete any post, clear misuse flags, close and re-open threads, endorse responses, and see posts from all groups. Their posts are marked as \\'staff\\'. They can also add and remove the discussion moderation roles to manage course team membership. Any users not yet enrolled in the course will be automatically enrolled when added as Discussion Admin.',\n description: 'Description for discussion admin role',\n },\n discussionModerator: {\n id: 'instruct.courseTeam.roles.discussionModerator',\n defaultMessage: 'Discussion Moderator',\n description: 'Role name for discussion moderator members',\n },\n discussionModeratorDescription: {\n id: 'instruct.courseTeam.roles.discussionModeratorDescription',\n defaultMessage: 'Discussion Moderators can edit or delete any post, clear misuse flags, close and re-open threads, endorse responses, and see posts from all groups. Their posts are marked as \\'staff\\'. They cannot manage course team membership by adding or removing discussion moderation roles. Any users not yet enrolled in the course will be automatically enrolled when added as Discussion Moderator.',\n description: 'Description for discussion moderator role',\n },\n groupCommunityTA: {\n id: 'instruct.courseTeam.roles.groupCommunityTA',\n defaultMessage: 'Group Community TA',\n description: 'Role name for group community TA members',\n },\n groupCommunityTADescription: {\n id: 'instruct.courseTeam.roles.groupCommunityTADescription',\n defaultMessage: 'Group Community TAs are members of the community who help course teams moderate discussions. Group Community TAs see only posts by learners in their assigned group. They can edit or delete posts, clear flags, close and re-open threads, and endorse responses, but only for posts by learners in their group. Their posts are marked as \\'Community TA\\'. Any users not yet enrolled in the course will be automatically enrolled when added as Group Community TA.',\n description: 'Description for group community TA role',\n },\n communityTA: {\n id: 'instruct.courseTeam.roles.communityTA',\n defaultMessage: 'Community TA',\n description: 'Role name for community TA members',\n },\n communityTADescription: {\n id: 'instruct.courseTeam.roles.communityTADescription',\n defaultMessage: 'Community TAs are members of the community who help course teams moderate discussions. They can see posts by learners in their assigned cohort or enrollment track, and can edit or delete posts, clear flags, close or re-open threads, and endorse responses. Their posts are marked as \\'Community TA\\'. Any users not yet enrolled in the course will be automatically enrolled when added as Community TA.',\n description: 'Description for community TA role',\n },\n ccxCoach: {\n id: 'instruct.courseTeam.roles.ccxCoach',\n defaultMessage: 'CCX Coach',\n description: 'Role name for CCX coach members',\n },\n ccxCoachDescription: {\n id: 'instruct.courseTeam.roles.ccxCoachDescription',\n defaultMessage: 'CCX Coaches are able to create their own Custom Courses based on this course, which they can use to provide personalized instruction to their own students based in this course material.',\n description: 'Description for CCX coach role',\n }\n});\n\nexport default messages;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/courseTeam/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n courseTeamTitle: {\n id: 'instruct.courseTeam.page.title',\n defaultMessage: 'Course Team Management',\n description: 'Title for the course team page',\n },\n addTeamMember: {\n id: 'instruct.courseTeam.addTeamMember',\n defaultMessage: 'Add Team Member',\n description: 'Button label for adding a team member',\n },\n membersTab: {\n id: 'instruct.courseTeam.membersTab',\n defaultMessage: 'Members',\n description: 'Tab title for course team members',\n },\n rolesTab: {\n id: 'instruct.courseTeam.rolesTab',\n defaultMessage: 'Roles',\n description: 'Tab title for course team roles',\n },\n username: {\n id: 'instruct.courseTeam.username',\n defaultMessage: 'Username',\n description: 'Column header for team member username',\n },\n email: {\n id: 'instruct.courseTeam.email',\n defaultMessage: 'Email',\n description: 'Column header for team member email',\n },\n role: {\n id: 'instruct.courseTeam.role',\n defaultMessage: 'Role',\n description: 'Column header for team member role',\n },\n actions: {\n id: 'instruct.courseTeam.actions',\n defaultMessage: 'Actions',\n description: 'Column header for team member actions',\n },\n edit: {\n id: 'instruct.courseTeam.edit',\n defaultMessage: 'Edit',\n description: 'Button label for editing a team member',\n },\n noTeamMembers: {\n id: 'instruct.courseTeam.noTeamMembers',\n defaultMessage: 'No team members found.',\n description: 'Message displayed when there are no team members',\n },\n allRoles: {\n id: 'instruct.courseTeam.allRoles',\n defaultMessage: 'All Roles',\n description: 'Option label for filtering by all roles',\n },\n staff: {\n id: 'instruct.courseTeam.roles.staff',\n defaultMessage: 'Staff',\n description: 'Role name for staff members',\n },\n staffDescription: {\n id: 'instruct.courseTeam.roles.staffDescription',\n defaultMessage: 'Course team members with the Staff role help you manage your course. Staff can enroll and unenroll learners, as well as modify their grades and access all course data. Staff also have access to your course in Studio and Insights. Any users not yet enrolled in the course will be automatically enrolled when added as Staff.',\n description: 'Description for staff role',\n },\n limitedStaff: {\n id: 'instruct.courseTeam.roles.limitedStaff',\n defaultMessage: 'Limited Staff',\n description: 'Role name for limited staff members',\n },\n limitedStaffDescription: {\n id: 'instruct.courseTeam.roles.limitedStaffDescription',\n defaultMessage: 'Course team members with the Limited Staff role help you manage your course. Limited Staff can enroll and unenroll learners, as well as modify their grades and access all course data. Limited Staff don\\'t have access to your course in Studio. Any users not yet enrolled in the course will be automatically enrolled when added as Limited Staff.',\n description: 'Description for limited staff role',\n },\n admin: {\n id: 'instruct.courseTeam.roles.admin',\n defaultMessage: 'Admin',\n description: 'Role name for admin members',\n },\n adminDescription: {\n id: 'instruct.courseTeam.roles.adminDescription',\n defaultMessage: 'Course team members with the Admin role help you manage your course. They can do all of the tasks that Staff can do, and can also add and remove the Staff and Admin roles, discussion moderation roles, and the beta tester role to manage course team membership. Any users not yet enrolled in the course will be automatically enrolled when added as Admin.',\n description: 'Description for admin role',\n },\n beta: {\n id: 'instruct.courseTeam.roles.beta',\n defaultMessage: 'Beta Testers',\n description: 'Role name for beta tester members',\n },\n betaDescription: {\n id: 'instruct.courseTeam.roles.betaDescription',\n defaultMessage: 'Beta Testers can see course content before other learners. They can make sure that the content works, but have no additional privileges. Any users not yet enrolled in the course will be automatically enrolled when added as Beta Tester.',\n description: 'Description for beta tester role',\n },\n courseDataResearchers: {\n id: 'instruct.courseTeam.roles.courseDataResearchers',\n defaultMessage: 'Course Data Researchers',\n description: 'Role name for course data researcher members',\n },\n courseDataResearchersDescription: {\n id: 'instruct.courseTeam.roles.courseDataResearchersDescription',\n defaultMessage: 'Course Data Researchers can access the data download tab. Any users not yet enrolled in the course will be automatically enrolled when added as Course Data Researcher.',\n description: 'Description for course data researcher role',\n },\n discussionAdmin: {\n id: 'instruct.courseTeam.roles.discussionAdmin',\n defaultMessage: 'Discussion Admin',\n description: 'Role name for discussion admin members',\n },\n discussionAdminDescription: {\n id: 'instruct.courseTeam.roles.discussionAdminDescription',\n defaultMessage: 'Discussion Admins can edit or delete any post, clear misuse flags, close and re-open threads, endorse responses, and see posts from all groups. Their posts are marked as \\'staff\\'. They can also add and remove the discussion moderation roles to manage course team membership. Any users not yet enrolled in the course will be automatically enrolled when added as Discussion Admin.',\n description: 'Description for discussion admin role',\n },\n discussionModerator: {\n id: 'instruct.courseTeam.roles.discussionModerator',\n defaultMessage: 'Discussion Moderator',\n description: 'Role name for discussion moderator members',\n },\n discussionModeratorDescription: {\n id: 'instruct.courseTeam.roles.discussionModeratorDescription',\n defaultMessage: 'Discussion Moderators can edit or delete any post, clear misuse flags, close and re-open threads, endorse responses, and see posts from all groups. Their posts are marked as \\'staff\\'. They cannot manage course team membership by adding or removing discussion moderation roles. Any users not yet enrolled in the course will be automatically enrolled when added as Discussion Moderator.',\n description: 'Description for discussion moderator role',\n },\n groupCommunityTA: {\n id: 'instruct.courseTeam.roles.groupCommunityTA',\n defaultMessage: 'Group Community TA',\n description: 'Role name for group community TA members',\n },\n groupCommunityTADescription: {\n id: 'instruct.courseTeam.roles.groupCommunityTADescription',\n defaultMessage: 'Group Community TAs are members of the community who help course teams moderate discussions. Group Community TAs see only posts by learners in their assigned group. They can edit or delete posts, clear flags, close and re-open threads, and endorse responses, but only for posts by learners in their group. Their posts are marked as \\'Community TA\\'. Any users not yet enrolled in the course will be automatically enrolled when added as Group Community TA.',\n description: 'Description for group community TA role',\n },\n communityTA: {\n id: 'instruct.courseTeam.roles.communityTA',\n defaultMessage: 'Community TA',\n description: 'Role name for community TA members',\n },\n communityTADescription: {\n id: 'instruct.courseTeam.roles.communityTADescription',\n defaultMessage: 'Community TAs are members of the community who help course teams moderate discussions. They can see posts by learners in their assigned cohort or enrollment track, and can edit or delete posts, clear flags, close or re-open threads, and endorse responses. Their posts are marked as \\'Community TA\\'. Any users not yet enrolled in the course will be automatically enrolled when added as Community TA.',\n description: 'Description for community TA role',\n },\n ccxCoach: {\n id: 'instruct.courseTeam.roles.ccxCoach',\n defaultMessage: 'CCX Coach',\n description: 'Role name for CCX coach members',\n },\n ccxCoachDescription: {\n id: 'instruct.courseTeam.roles.ccxCoachDescription',\n defaultMessage: 'CCX Coaches are able to create their own Custom Courses based on this course, which they can use to provide personalized instruction to their own students based in this course material.',\n description: 'Description for CCX coach role',\n },\n addNewTeamMember: {\n id: 'instruct.courseTeam.addNewTeamMember',\n defaultMessage: 'Add New Team Member',\n description: 'Title for add new team member form',\n },\n addNewTeamMemberDescription: {\n id: 'instruct.courseTeam.addNewTeamMemberDescription',\n defaultMessage: 'Add new members to {courseName}’s Course team and assign them a role to define their permissions.',\n description: 'Description for add new team member form',\n },\n addUsersLabel: {\n id: 'instruct.courseTeam.addUsersLabel',\n defaultMessage: 'Add users by username or email',\n description: 'Label for input to add users to course team',\n },\n usersPlaceholder: {\n id: 'instruct.courseTeam.usersPlaceholder',\n defaultMessage: 'Enter one or more email addresses or usernames',\n description: 'Placeholder for input to add users to course team',\n },\n roleLabel: {\n id: 'instruct.courseTeam.roleLabel',\n defaultMessage: 'Role',\n description: 'Label for role selection when adding users to course team',\n },\n rolePlaceholder: {\n id: 'instruct.courseTeam.rolePlaceholder',\n defaultMessage: 'Select Role',\n description: 'Placeholder for role selection when adding users to course team',\n },\n cancelButton: {\n id: 'instruct.courseTeam.cancelButton',\n defaultMessage: 'Cancel',\n description: 'Label for cancel button when adding users to course team',\n },\n saveButton: {\n id: 'instruct.courseTeam.saveButton',\n defaultMessage: 'Save',\n description: 'Label for save button when adding users to course team',\n },\n addTeamMemberError: {\n id: 'instruct.courseTeam.addTeamMemberError',\n defaultMessage: 'Could not find a user with username or email address “{username}”',\n description: 'Error message displayed when adding a team member fails',\n },\n closeButton: {\n id: 'instruct.courseTeam.closeButton',\n defaultMessage: 'Close',\n description: 'Label for close button in error modal when adding a team member fails',\n },\n failedToAddTeamMembers: {\n id: 'instruct.courseTeam.failedToAddTeamMembers',\n defaultMessage: 'The following usernames and/or email addresses are invalid. All other roles have been added to the team members.',\n description: 'Error message displayed when some team members could not be added',\n },\n unknownLearner: {\n id: 'instruct.courseTeam.unknownLearner',\n defaultMessage: 'Unknown learner: {learner}',\n description: 'Displayed when a learner does not have a full name or username available',\n },\n});\n\nexport default messages;\n"]}
@@ -13,3 +13,9 @@ export interface Role {
13
13
  role: string;
14
14
  displayName: string;
15
15
  }
16
+ export interface AddTeamMembersResponse {
17
+ results: {
18
+ identifier: string;
19
+ userDoesNotExist: boolean;
20
+ }[];
21
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/courseTeam/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface CourseTeamMember {\n username: string,\n email: string,\n role: string,\n}\n\nexport interface CourseTeamMemberQueryParams {\n page: number,\n pageSize: number,\n emailOrUsername?: string,\n role?: string,\n}\n\nexport interface Role {\n role: string,\n displayName: string,\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/courseTeam/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface CourseTeamMember {\n username: string,\n email: string,\n role: string,\n}\n\nexport interface CourseTeamMemberQueryParams {\n page: number,\n pageSize: number,\n emailOrUsername?: string,\n role?: string,\n}\n\nexport interface Role {\n role: string,\n displayName: string,\n}\n\nexport interface AddTeamMembersResponse {\n results: {\n identifier: string,\n userDoesNotExist: boolean,\n }[],\n}\n"]}
package/dist/testUtils.js CHANGED
@@ -9,7 +9,7 @@ export const renderWithIntl = (component) => {
9
9
  return render(_jsx(IntlProvider, { locale: "en", messages: {}, children: component }));
10
10
  };
11
11
  export const renderWithAlertAndIntl = (component) => {
12
- return render(_jsx(AlertProvider, { children: _jsx(IntlProvider, { locale: "en", messages: {}, children: component }) }));
12
+ return render(_jsx(IntlProvider, { locale: "en", messages: {}, children: _jsx(AlertProvider, { children: component }) }));
13
13
  };
14
14
  export const createQueryMock = (data = undefined, isLoading = false) => ({
15
15
  data,
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../src/testUtils.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAsB,EAAE,EAAE,CAC9D,cAAc,CACZ,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YACrC,EAAE,GACiB,CACvB,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,EAAE;IAC1C,OAAO,MAAM,CAAC,KAAC,YAAY,IAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAE,EAAE,YAAI,SAAS,GAAiB,CAAC,CAAC;AACtF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,EAAE;IAClD,OAAO,MAAM,CACX,KAAC,aAAa,cACZ,KAAC,YAAY,IAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAE,EAAE,YACnC,SAAS,GACG,GACD,CACjB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAY,SAAS,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5E,IAAI;IACJ,SAAS;IACT,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,CAAC,SAAS,IAAI,IAAI,KAAK,SAAS;IAC3C,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;IACzD,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;IAC5C,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;CACX,CAAA,CAAC","sourcesContent":["import { render } from '@testing-library/react';\nimport { IntlProvider } from '@openedx/frontend-base';\nimport { AlertProvider } from './providers/AlertProvider';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nconst queryClient = new QueryClient();\n\nexport const renderWithQueryClient = (ui: React.ReactElement) =>\n renderWithIntl(\n <QueryClientProvider client={queryClient}>\n {ui}\n </QueryClientProvider>\n );\n\nexport const renderWithIntl = (component) => {\n return render(<IntlProvider locale=\"en\" messages={{}}>{ component }</IntlProvider>);\n};\n\nexport const renderWithAlertAndIntl = (component) => {\n return render(\n <AlertProvider>\n <IntlProvider locale=\"en\" messages={{}}>\n {component}\n </IntlProvider>\n </AlertProvider>\n );\n};\n\nexport const createQueryMock = (data: any = undefined, isLoading = false) => ({\n data,\n isLoading,\n error: null,\n isError: false,\n isSuccess: !isLoading && data !== undefined,\n status: isLoading ? 'loading' : data ? 'success' : 'idle',\n fetchStatus: isLoading ? 'fetching' : 'idle',\n refetch: jest.fn(),\n} as any);\n"]}
1
+ {"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../src/testUtils.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAsB,EAAE,EAAE,CAC9D,cAAc,CACZ,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YACrC,EAAE,GACiB,CACvB,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,EAAE;IAC1C,OAAO,MAAM,CAAC,KAAC,YAAY,IAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAE,EAAE,YAAI,SAAS,GAAiB,CAAC,CAAC;AACtF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,EAAE;IAClD,OAAO,MAAM,CACX,KAAC,YAAY,IAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAE,EAAE,YACpC,KAAC,aAAa,cACX,SAAS,GACI,GACH,CAChB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAY,SAAS,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5E,IAAI;IACJ,SAAS;IACT,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,CAAC,SAAS,IAAI,IAAI,KAAK,SAAS;IAC3C,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;IACzD,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;IAC5C,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;CACX,CAAA,CAAC","sourcesContent":["import { render } from '@testing-library/react';\nimport { IntlProvider } from '@openedx/frontend-base';\nimport { AlertProvider } from './providers/AlertProvider';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nconst queryClient = new QueryClient();\n\nexport const renderWithQueryClient = (ui: React.ReactElement) =>\n renderWithIntl(\n <QueryClientProvider client={queryClient}>\n {ui}\n </QueryClientProvider>\n );\n\nexport const renderWithIntl = (component) => {\n return render(<IntlProvider locale=\"en\" messages={{}}>{ component }</IntlProvider>);\n};\n\nexport const renderWithAlertAndIntl = (component) => {\n return render(\n <IntlProvider locale=\"en\" messages={{}}>\n <AlertProvider>\n {component}\n </AlertProvider>\n </IntlProvider>\n );\n};\n\nexport const createQueryMock = (data: any = undefined, isLoading = false) => ({\n data,\n isLoading,\n error: null,\n isError: false,\n isSuccess: !isLoading && data !== undefined,\n status: isLoading ? 'loading' : data ? 'success' : 'idle',\n fetchStatus: isLoading ? 'fetching' : 'idle',\n refetch: jest.fn(),\n} as any);\n"]}
@@ -1 +1,6 @@
1
1
  export declare const parseObject: (input: any) => string;
2
+ export declare const parseLearnersCount: (learners: string) => number;
3
+ export declare const filterCertificates: <T extends {
4
+ username: string;
5
+ email: string;
6
+ }>(data: T[], filterFn: (item: T) => boolean, search: string) => T[];
@@ -9,4 +9,14 @@ export const parseObject = (input) => {
9
9
  return String(input);
10
10
  }
11
11
  };
12
+ export const parseLearnersCount = (learners) => learners.split(/[\n,]/).filter((l) => l.trim()).length;
13
+ export const filterCertificates = (data, filterFn, search) => {
14
+ const searchLower = search.toLowerCase();
15
+ return data.filter((item) => {
16
+ const matchesSearch = !search
17
+ || item.username.toLowerCase().includes(searchLower)
18
+ || item.email.toLowerCase().includes(searchLower);
19
+ return filterFn(item) && matchesSearch;
20
+ });
21
+ };
12
22
  //# sourceMappingURL=formatters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAU,EAAU,EAAE;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC","sourcesContent":["export const parseObject = (input: any): string => {\n if (typeof input === 'string') {\n return input;\n }\n try {\n return JSON.stringify(input, null, 2);\n } catch {\n return String(input);\n }\n};\n"]}
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAU,EAAU,EAAE;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAgB,EAAU,EAAE,CAC7D,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,IAAS,EACT,QAA8B,EAC9B,MAAc,EACT,EAAE;IACP,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,aAAa,GAAG,CAAC,MAAM;eACxB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;eACjD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["export const parseObject = (input: any): string => {\n if (typeof input === 'string') {\n return input;\n }\n try {\n return JSON.stringify(input, null, 2);\n } catch {\n return String(input);\n }\n};\n\nexport const parseLearnersCount = (learners: string): number =>\n learners.split(/[\\n,]/).filter((l) => l.trim()).length;\n\nexport const filterCertificates = <T extends { username: string, email: string }>(\n data: T[],\n filterFn: (item: T) => boolean,\n search: string,\n): T[] => {\n const searchLower = search.toLowerCase();\n return data.filter((item) => {\n const matchesSearch = !search\n || item.username.toLowerCase().includes(searchLower)\n || item.email.toLowerCase().includes(searchLower);\n return filterFn(item) && matchesSearch;\n });\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openedx/frontend-app-instructor-dashboard",
3
- "version": "1.0.0-alpha.11",
3
+ "version": "1.0.0-alpha.12",
4
4
  "description": "The Open edX Instructor Dashboard",
5
5
  "repository": {
6
6
  "type": "git",