@openedx/frontend-app-instructor-dashboard 1.0.0-alpha.13 → 1.0.0-alpha.14

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.
@@ -1,8 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
2
3
  import { useIntl } from '@openedx/frontend-base';
3
4
  import { Button, Tab, Tabs, useToggle } from '@openedx/paragon';
4
5
  import { Plus } from '@openedx/paragon/icons';
5
6
  import AddTeamMemberModal from '../courseTeam/components/AddTeamMemberModal';
7
+ import EditTeamMemberModal from '../courseTeam/components/EditTeamMemberModal';
6
8
  import MembersContent from '../courseTeam/components/MembersContent';
7
9
  import RolesContent from '../courseTeam/components/RolesContent';
8
10
  import messages from '../courseTeam/messages';
@@ -10,7 +12,13 @@ import { AlertOutlet } from '../providers/AlertProvider';
10
12
  const CourseTeamPage = () => {
11
13
  const intl = useIntl();
12
14
  const [isOpenAddModal, openAddModal, closeAddModal] = useToggle(false);
13
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "d-flex justify-content-between align-items-center mb-3", children: [_jsx("h3", { className: "text-primary-700 mb-0", children: intl.formatMessage(messages.courseTeamTitle) }), _jsx(Button, { iconBefore: Plus, variant: "primary", onClick: openAddModal, children: intl.formatMessage(messages.addTeamMember) })] }), _jsx(AlertOutlet, {}), _jsxs(Tabs, { children: [_jsx(Tab, { eventKey: "members", title: intl.formatMessage(messages.membersTab), children: _jsx(MembersContent, {}) }), _jsx(Tab, { eventKey: "roles", title: intl.formatMessage(messages.rolesTab), children: _jsx(RolesContent, {}) })] }), isOpenAddModal && _jsx(AddTeamMemberModal, { isOpen: isOpenAddModal, onClose: closeAddModal })] }));
15
+ const [isOpenEditModal, openEditModal, closeEditModal] = useToggle(false);
16
+ const [selectedUser, setSelectedUser] = useState(null);
17
+ const handleEdit = (user) => {
18
+ setSelectedUser(user);
19
+ openEditModal();
20
+ };
21
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "d-flex justify-content-between align-items-center mb-3", children: [_jsx("h3", { className: "text-primary-700 mb-0", children: intl.formatMessage(messages.courseTeamTitle) }), _jsx(Button, { iconBefore: Plus, variant: "primary", onClick: openAddModal, children: intl.formatMessage(messages.addTeamMember) })] }), _jsx(AlertOutlet, {}), _jsxs(Tabs, { children: [_jsx(Tab, { eventKey: "members", title: intl.formatMessage(messages.membersTab), children: _jsx(MembersContent, { onEdit: handleEdit }) }), _jsx(Tab, { eventKey: "roles", title: intl.formatMessage(messages.rolesTab), children: _jsx(RolesContent, {}) })] }), isOpenAddModal && _jsx(AddTeamMemberModal, { isOpen: isOpenAddModal, onClose: closeAddModal }), isOpenEditModal && selectedUser && _jsx(EditTeamMemberModal, { isOpen: isOpenEditModal, user: selectedUser, onClose: closeEditModal })] }));
14
22
  };
15
23
  export default CourseTeamPage;
16
24
  //# sourceMappingURL=CourseTeamPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CourseTeamPage.js","sourceRoot":"","sources":["../../src/courseTeam/CourseTeamPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,kBAAkB,MAAM,+CAA+C,CAAC;AAC/E,OAAO,cAAc,MAAM,2CAA2C,CAAC;AACvE,OAAO,YAAY,MAAM,yCAAyC,CAAC;AACnE,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEvE,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,wDAAwD,aACrE,aAAI,SAAS,EAAC,uBAAuB,YAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAM,EACzF,KAAC,MAAM,IAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,YAAY,YAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAU,IACpH,EACN,KAAC,WAAW,KAAG,EACf,MAAC,IAAI,eACH,KAAC,GAAG,IAAC,QAAQ,EAAC,SAAS,EAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,YACpE,KAAC,cAAc,KAAG,GACd,EACN,KAAC,GAAG,IAAC,QAAQ,EAAC,OAAO,EAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAChE,KAAC,YAAY,KAAG,GACZ,IACD,EACN,cAAc,IAAI,KAAC,kBAAkB,IAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAI,IACxF,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport { Button, Tab, Tabs, useToggle } from '@openedx/paragon';\nimport { Plus } from '@openedx/paragon/icons';\nimport AddTeamMemberModal from '@src/courseTeam/components/AddTeamMemberModal';\nimport MembersContent from '@src/courseTeam/components/MembersContent';\nimport RolesContent from '@src/courseTeam/components/RolesContent';\nimport messages from '@src/courseTeam/messages';\nimport { AlertOutlet } from '@src/providers/AlertProvider';\n\nconst CourseTeamPage = () => {\n const intl = useIntl();\n const [isOpenAddModal, openAddModal, closeAddModal] = useToggle(false);\n\n return (\n <>\n <div className=\"d-flex justify-content-between align-items-center mb-3\">\n <h3 className=\"text-primary-700 mb-0\">{intl.formatMessage(messages.courseTeamTitle)}</h3>\n <Button iconBefore={Plus} variant=\"primary\" onClick={openAddModal}>{intl.formatMessage(messages.addTeamMember)}</Button>\n </div>\n <AlertOutlet />\n <Tabs>\n <Tab eventKey=\"members\" title={intl.formatMessage(messages.membersTab)}>\n <MembersContent />\n </Tab>\n <Tab eventKey=\"roles\" title={intl.formatMessage(messages.rolesTab)}>\n <RolesContent />\n </Tab>\n </Tabs>\n {isOpenAddModal && <AddTeamMemberModal isOpen={isOpenAddModal} onClose={closeAddModal} />}\n </>\n );\n};\n\nexport default CourseTeamPage;\n"]}
1
+ {"version":3,"file":"CourseTeamPage.js","sourceRoot":"","sources":["../../src/courseTeam/CourseTeamPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,kBAAkB,MAAM,+CAA+C,CAAC;AAC/E,OAAO,mBAAmB,MAAM,gDAAgD,CAAC;AACjF,OAAO,cAAc,MAAM,2CAA2C,CAAC;AACvE,OAAO,YAAY,MAAM,yCAAyC,CAAC;AACnE,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAG3D,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,cAAc,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAA0B,IAAI,CAAC,CAAC;IAEhF,MAAM,UAAU,GAAG,CAAC,IAAsB,EAAE,EAAE;QAC5C,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,wDAAwD,aACrE,aAAI,SAAS,EAAC,uBAAuB,YAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAM,EACzF,KAAC,MAAM,IAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,YAAY,YAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAU,IACpH,EACN,KAAC,WAAW,KAAG,EACf,MAAC,IAAI,eACH,KAAC,GAAG,IAAC,QAAQ,EAAC,SAAS,EAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,YACpE,KAAC,cAAc,IAAC,MAAM,EAAE,UAAU,GAAI,GAClC,EACN,KAAC,GAAG,IAAC,QAAQ,EAAC,OAAO,EAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAChE,KAAC,YAAY,KAAG,GACZ,IACD,EACN,cAAc,IAAI,KAAC,kBAAkB,IAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAI,EACxF,eAAe,IAAI,YAAY,IAAI,KAAC,mBAAmB,IAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,GAAI,IAChI,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC","sourcesContent":["import { useState } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Button, Tab, Tabs, useToggle } from '@openedx/paragon';\nimport { Plus } from '@openedx/paragon/icons';\nimport AddTeamMemberModal from '@src/courseTeam/components/AddTeamMemberModal';\nimport EditTeamMemberModal from '@src/courseTeam/components/EditTeamMemberModal';\nimport MembersContent from '@src/courseTeam/components/MembersContent';\nimport RolesContent from '@src/courseTeam/components/RolesContent';\nimport messages from '@src/courseTeam/messages';\nimport { AlertOutlet } from '@src/providers/AlertProvider';\nimport { CourseTeamMember } from '@src/courseTeam/types';\n\nconst CourseTeamPage = () => {\n const intl = useIntl();\n const [isOpenAddModal, openAddModal, closeAddModal] = useToggle(false);\n const [isOpenEditModal, openEditModal, closeEditModal] = useToggle(false);\n const [selectedUser, setSelectedUser] = useState<CourseTeamMember | null>(null);\n\n const handleEdit = (user: CourseTeamMember) => {\n setSelectedUser(user);\n openEditModal();\n };\n\n return (\n <>\n <div className=\"d-flex justify-content-between align-items-center mb-3\">\n <h3 className=\"text-primary-700 mb-0\">{intl.formatMessage(messages.courseTeamTitle)}</h3>\n <Button iconBefore={Plus} variant=\"primary\" onClick={openAddModal}>{intl.formatMessage(messages.addTeamMember)}</Button>\n </div>\n <AlertOutlet />\n <Tabs>\n <Tab eventKey=\"members\" title={intl.formatMessage(messages.membersTab)}>\n <MembersContent onEdit={handleEdit} />\n </Tab>\n <Tab eventKey=\"roles\" title={intl.formatMessage(messages.rolesTab)}>\n <RolesContent />\n </Tab>\n </Tabs>\n {isOpenAddModal && <AddTeamMemberModal isOpen={isOpenAddModal} onClose={closeAddModal} />}\n {isOpenEditModal && selectedUser && <EditTeamMemberModal isOpen={isOpenEditModal} user={selectedUser} onClose={closeEditModal} />}\n </>\n );\n};\n\nexport default CourseTeamPage;\n"]}
@@ -54,7 +54,7 @@ const AddTeamMemberModal = ({ isOpen, onClose, }) => {
54
54
  }
55
55
  });
56
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) })] }) })] }));
57
+ return (_jsxs(ModalDialog, { isOpen: isOpen, onClose: onClose, title: intl.formatMessage(messages.addNewTeamMember), isOverflowVisible: false, size: "lg", children: [_jsx(ModalDialog.Header, { className: "border-light-700 border-bottom", children: _jsx("h3", { className: "text-primary-500", children: intl.formatMessage(messages.addNewTeamMember) }) }), _jsxs(ModalDialog.Body, { className: "position-relative overflow-auto", 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, { className: "border-light-700 border-top", 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
58
  };
59
59
  export default AddTeamMemberModal;
60
60
  //# sourceMappingURL=AddTeamMemberModal.js.map
@@ -1 +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
+ {"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 className=\"border-light-700 border-bottom\">\n <h3 className=\"text-primary-500\">{intl.formatMessage(messages.addNewTeamMember)}</h3>\n </ModalDialog.Header>\n <ModalDialog.Body className=\"position-relative overflow-auto\">\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 className=\"border-light-700 border-top\">\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"]}
@@ -0,0 +1,8 @@
1
+ import { CourseTeamMember } from '../../courseTeam/types';
2
+ interface EditTeamMemberModalProps {
3
+ isOpen: boolean;
4
+ user: CourseTeamMember;
5
+ onClose: () => void;
6
+ }
7
+ declare const EditTeamMemberModal: ({ isOpen, user, onClose }: EditTeamMemberModalProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default EditTeamMemberModal;
@@ -0,0 +1,90 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { useParams } from 'react-router-dom';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import { ActionRow, Button, Form, FormControl, FormLabel, ModalDialog } from '@openedx/paragon';
6
+ import { useAddTeamMember, useRemoveTeamMember, useRoles } from '../../courseTeam/data/apiHook';
7
+ import messages from '../../courseTeam/messages';
8
+ import { useAlert } from '../../providers/AlertProvider';
9
+ const EditTeamMemberModal = ({ isOpen, user, onClose }) => {
10
+ const intl = useIntl();
11
+ const { courseId = '' } = useParams();
12
+ const [selectedRole, setSelectedRole] = useState('');
13
+ const [keepRoles, setKeepRoles] = useState([]);
14
+ const { mutate: addTeamMember, isPending: isAdding } = useAddTeamMember(courseId);
15
+ const { mutate: removeTeamMember, isPending: isRemoving } = useRemoveTeamMember(courseId);
16
+ const { showModal } = useAlert();
17
+ const { data: { results } = { results: [] } } = useRoles(courseId);
18
+ useEffect(() => {
19
+ if (isOpen) {
20
+ setKeepRoles(user.roles.map(role => role.role));
21
+ setSelectedRole('');
22
+ }
23
+ }, [isOpen, user]);
24
+ const filteredRoles = (results === null || results === void 0 ? void 0 : results.filter(role => !user.roles.some(userRole => userRole.role === role.role))) || [];
25
+ const roles = [{ role: '', displayName: intl.formatMessage(messages.rolePlaceholder) }, ...filteredRoles];
26
+ const handleToggleRole = (roleName) => {
27
+ if (keepRoles.includes(roleName)) {
28
+ setKeepRoles(keepRoles.filter(role => role !== roleName));
29
+ }
30
+ else {
31
+ setKeepRoles([...keepRoles, roleName]);
32
+ }
33
+ };
34
+ const handleSave = () => {
35
+ const rolesToRemove = user.roles.filter(role => !keepRoles.includes(role.role)).map(role => role.role);
36
+ const hasRolesToAdd = selectedRole;
37
+ const hasRolesToRemove = rolesToRemove.length > 0;
38
+ // Sequential approach: remove roles first, then add new role
39
+ if (hasRolesToRemove) {
40
+ removeTeamMember({ identifier: user.username, roles: rolesToRemove }, {
41
+ onSuccess: () => {
42
+ // After successful removal, add new role if needed
43
+ if (hasRolesToAdd) {
44
+ addTeamMember({ identifiers: [user.username], role: selectedRole }, {
45
+ onSuccess: () => {
46
+ onClose();
47
+ },
48
+ onError: () => {
49
+ showModal({
50
+ message: intl.formatMessage(messages.addRoleError),
51
+ variant: 'danger',
52
+ confirmText: intl.formatMessage(messages.closeButton),
53
+ });
54
+ }
55
+ });
56
+ }
57
+ else {
58
+ onClose();
59
+ }
60
+ },
61
+ onError: () => {
62
+ showModal({
63
+ message: intl.formatMessage(messages.removeTeamMemberError, { username: user.username }),
64
+ variant: 'danger',
65
+ confirmText: intl.formatMessage(messages.closeButton),
66
+ });
67
+ }
68
+ });
69
+ }
70
+ else if (hasRolesToAdd) {
71
+ // Only add operation needed
72
+ addTeamMember({ identifiers: [user.username], role: selectedRole }, {
73
+ onSuccess: () => {
74
+ onClose();
75
+ },
76
+ onError: () => {
77
+ showModal({
78
+ message: intl.formatMessage(messages.addRoleError),
79
+ variant: 'danger',
80
+ confirmText: intl.formatMessage(messages.closeButton),
81
+ });
82
+ }
83
+ });
84
+ }
85
+ };
86
+ return (_jsxs(ModalDialog, { isOpen: isOpen, title: intl.formatMessage(messages.editTeamTitle, { username: user.username }), onClose: onClose, isOverflowVisible: false, children: [_jsx(ModalDialog.Header, { className: "border-light-700 border-bottom", children: _jsx("h3", { className: "text-primary-500", children: intl.formatMessage(messages.editTeamTitle, { username: user.username }) }) }), _jsxs(ModalDialog.Body, { className: "position-relative overflow-auto", children: [_jsx("p", { children: intl.formatMessage(messages.editInstructions, { username: user.username }) }), _jsx(Form.CheckboxSet, { onChange: (e) => handleToggleRole(e.target.value), value: keepRoles, name: "keepRoles", children: (user.roles || [])
87
+ .map((role) => (_jsx(Form.Checkbox, { className: "mt-2", value: role.role, children: role.displayName }, role.role))) }), _jsx(FormLabel, { className: "mt-4", children: intl.formatMessage(messages.addRole) }), _jsx(FormControl, { as: "select", disabled: roles.length === 1, onChange: (e) => setSelectedRole(e.target.value), value: selectedRole, children: roles.map((role) => (_jsx("option", { value: role.role, children: role.displayName }, role.role))) })] }), _jsx(ModalDialog.Footer, { className: "border-light-700 border-top", children: _jsxs(ActionRow, { children: [_jsx(Button, { variant: "tertiary", onClick: onClose, children: intl.formatMessage(messages.cancelButton) }), _jsx(Button, { variant: "primary", onClick: handleSave, disabled: isAdding || isRemoving || (keepRoles.length === user.roles.length && !selectedRole), children: intl.formatMessage(messages.saveButton) })] }) })] }));
88
+ };
89
+ export default EditTeamMemberModal;
90
+ //# sourceMappingURL=EditTeamMemberModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditTeamMemberModal.js","sourceRoot":"","sources":["../../../src/courseTeam/components/EditTeamMemberModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { ActionRow, Button, Form, FormControl, FormLabel, ModalDialog } from '@openedx/paragon';\nimport { useAddTeamMember, useRemoveTeamMember, useRoles } from '@src/courseTeam/data/apiHook';\nimport messages from '@src/courseTeam/messages';\nimport { CourseTeamMember, Role } from '@src/courseTeam/types';\nimport { useAlert } from '@src/providers/AlertProvider';\n\ninterface EditTeamMemberModalProps {\n isOpen: boolean,\n user: CourseTeamMember,\n onClose: () => void,\n}\n\nconst EditTeamMemberModal = ({ isOpen, user, onClose }: EditTeamMemberModalProps) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const [selectedRole, setSelectedRole] = useState('');\n const [keepRoles, setKeepRoles] = useState<string[]>([]);\n const { mutate: addTeamMember, isPending: isAdding } = useAddTeamMember(courseId);\n const { mutate: removeTeamMember, isPending: isRemoving } = useRemoveTeamMember(courseId);\n const { showModal } = useAlert();\n\n const { data: { results } = { results: [] } } = useRoles(courseId);\n\n useEffect(() => {\n if (isOpen) {\n setKeepRoles(user.roles.map(role => role.role));\n setSelectedRole('');\n }\n }, [isOpen, user]);\n\n const filteredRoles = results?.filter(role => !user.roles.some(userRole => userRole.role === role.role)) || [];\n\n const roles = [{ role: '', displayName: intl.formatMessage(messages.rolePlaceholder) }, ...filteredRoles];\n\n const handleToggleRole = (roleName: string) => {\n if (keepRoles.includes(roleName)) {\n setKeepRoles(keepRoles.filter(role => role !== roleName));\n } else {\n setKeepRoles([...keepRoles, roleName]);\n }\n };\n\n const handleSave = () => {\n const rolesToRemove = user.roles.filter(role => !keepRoles.includes(role.role)).map(role => role.role);\n const hasRolesToAdd = selectedRole;\n const hasRolesToRemove = rolesToRemove.length > 0;\n\n // Sequential approach: remove roles first, then add new role\n if (hasRolesToRemove) {\n removeTeamMember({ identifier: user.username, roles: rolesToRemove }, {\n onSuccess: () => {\n // After successful removal, add new role if needed\n if (hasRolesToAdd) {\n addTeamMember({ identifiers: [user.username], role: selectedRole }, {\n onSuccess: () => {\n onClose();\n },\n onError: () => {\n showModal({\n message: intl.formatMessage(messages.addRoleError),\n variant: 'danger',\n confirmText: intl.formatMessage(messages.closeButton),\n });\n }\n });\n } else {\n onClose();\n }\n },\n onError: () => {\n showModal({\n message: intl.formatMessage(messages.removeTeamMemberError, { username: user.username }),\n variant: 'danger',\n confirmText: intl.formatMessage(messages.closeButton),\n });\n }\n });\n } else if (hasRolesToAdd) {\n // Only add operation needed\n addTeamMember({ identifiers: [user.username], role: selectedRole }, {\n onSuccess: () => {\n onClose();\n },\n onError: () => {\n showModal({\n message: intl.formatMessage(messages.addRoleError),\n variant: 'danger',\n confirmText: intl.formatMessage(messages.closeButton),\n });\n }\n });\n }\n };\n\n return (\n <ModalDialog\n isOpen={isOpen}\n title={intl.formatMessage(messages.editTeamTitle, { username: user.username })}\n onClose={onClose}\n isOverflowVisible={false}\n >\n <ModalDialog.Header className=\"border-light-700 border-bottom\">\n <h3 className=\"text-primary-500\">{intl.formatMessage(messages.editTeamTitle, { username: user.username })}</h3>\n </ModalDialog.Header>\n <ModalDialog.Body className=\"position-relative overflow-auto\">\n <p>{intl.formatMessage(messages.editInstructions, { username: user.username })}</p>\n <Form.CheckboxSet onChange={(e: React.ChangeEvent<HTMLInputElement>) => handleToggleRole(e.target.value)} value={keepRoles} name=\"keepRoles\">\n {\n (user.roles || [])\n .map((role: Role) => (\n <Form.Checkbox className=\"mt-2\" key={role.role} value={role.role}>\n {role.displayName}\n </Form.Checkbox>\n ))\n }\n </Form.CheckboxSet>\n <FormLabel className=\"mt-4\">{intl.formatMessage(messages.addRole)}</FormLabel>\n <FormControl\n as=\"select\"\n disabled={roles.length === 1}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => setSelectedRole(e.target.value)}\n value={selectedRole}\n >\n {\n roles.map((role) => (\n <option key={role.role} value={role.role}>\n {role.displayName}\n </option>\n ))\n }\n </FormControl>\n </ModalDialog.Body>\n <ModalDialog.Footer className=\"border-light-700 border-top\">\n <ActionRow>\n <Button variant=\"tertiary\" onClick={onClose}>{intl.formatMessage(messages.cancelButton)}</Button>\n <Button variant=\"primary\" onClick={handleSave} disabled={isAdding || isRemoving || (keepRoles.length === user.roles.length && !selectedRole)}>\n {intl.formatMessage(messages.saveButton)}\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nexport default EditTeamMemberModal;\n"]}
@@ -1,2 +1,6 @@
1
- declare const MembersContent: () => import("react/jsx-runtime").JSX.Element;
1
+ import { CourseTeamMember } from '../../courseTeam/types';
2
+ interface MembersContentProps {
3
+ onEdit: (user: CourseTeamMember) => void;
4
+ }
5
+ declare const MembersContent: ({ onEdit }: MembersContentProps) => import("react/jsx-runtime").JSX.Element;
2
6
  export default MembersContent;
@@ -2,25 +2,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState, useMemo } from 'react';
3
3
  import { useParams } from 'react-router-dom';
4
4
  import { useIntl } from '@openedx/frontend-base';
5
- import { Button, DataTable, FormControl, Icon } from '@openedx/paragon';
6
- import { FilterList } from '@openedx/paragon/icons';
5
+ import { Button, DataTable } from '@openedx/paragon';
7
6
  import UsernameFilter from '../../components/UsernameFilter';
8
- import { useRoles, useTeamMembers } from '../../courseTeam/data/apiHook';
7
+ import RoleFilter from '../../courseTeam/components/RoleFilter';
8
+ import { useTeamMembers } from '../../courseTeam/data/apiHook';
9
9
  import messages from '../../courseTeam/messages';
10
10
  const TEAM_MEMBERS_PAGE_SIZE = 25;
11
- const RoleFilter = ({ column: { filterValue, setFilter } }) => {
12
- const intl = useIntl();
13
- const { courseId = '' } = useParams();
14
- const { data } = useRoles(courseId);
15
- const handleSelectChange = (e) => {
16
- setFilter(e.target.value);
17
- };
18
- const roles = useMemo(() => {
19
- return [{ value: '', label: intl.formatMessage(messages.allRoles) }, ...((data === null || data === void 0 ? void 0 : data.results) || []).map((role) => ({ value: role.role, label: role.displayName }))];
20
- }, [data, intl]);
21
- return (_jsx(FormControl, { as: "select", className: "mb-0", disabled: !data, name: "role", size: "md", value: filterValue, onChange: handleSelectChange, leadingElement: _jsx(Icon, { src: FilterList }), children: roles.map(role => (_jsx("option", { value: role.value, children: role.label }, role.value))) }));
22
- };
23
- const MembersContent = () => {
11
+ const MembersContent = ({ onEdit }) => {
24
12
  const intl = useIntl();
25
13
  const { courseId = '' } = useParams();
26
14
  const [filters, setFilters] = useState({ page: 0, emailOrUsername: '', role: '' });
@@ -28,18 +16,18 @@ const MembersContent = () => {
28
16
  const tableColumns = useMemo(() => [
29
17
  { accessor: 'username', Header: intl.formatMessage(messages.username), Filter: UsernameFilter },
30
18
  { accessor: 'email', Header: intl.formatMessage(messages.email), disableFilters: true },
31
- { accessor: 'role', Header: intl.formatMessage(messages.role), Filter: RoleFilter },
19
+ { accessor: 'roles', Header: intl.formatMessage(messages.role), Cell: ({ cell: { value } }) => value.map(role => role.displayName).join(', '), Filter: RoleFilter },
32
20
  ], [intl]);
33
21
  const additionalColumns = useMemo(() => [{
34
22
  id: 'actions',
35
23
  Header: intl.formatMessage(messages.actions),
36
- Cell: () => (_jsx(Button, { variant: "link", size: "inline", children: intl.formatMessage(messages.edit) }))
37
- }], [intl]);
24
+ Cell: ({ row }) => (_jsx(Button, { variant: "link", size: "inline", onClick: () => onEdit(row.original), children: intl.formatMessage(messages.edit) }))
25
+ }], [intl, onEdit]);
38
26
  const handleFetchData = (data) => {
39
27
  var _a, _b;
40
28
  const usernameFilter = (_a = data.filters) === null || _a === void 0 ? void 0 : _a.find((f) => f.id === 'username');
41
29
  const newEmailOrUsername = usernameFilter ? usernameFilter.value : '';
42
- const rolesFilter = (_b = data.filters) === null || _b === void 0 ? void 0 : _b.find((f) => f.id === 'role');
30
+ const rolesFilter = (_b = data.filters) === null || _b === void 0 ? void 0 : _b.find((f) => f.id === 'roles');
43
31
  const newRole = rolesFilter ? rolesFilter.value : '';
44
32
  const filtersChanged = (newEmailOrUsername !== filters.emailOrUsername) || (newRole !== filters.role);
45
33
  if (filtersChanged) {
@@ -1 +1 @@
1
- {"version":3,"file":"MembersContent.js","sourceRoot":"","sources":["../../../src/courseTeam/components/MembersContent.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Button, DataTable, FormControl, Icon } from '@openedx/paragon';\nimport { FilterList } from '@openedx/paragon/icons';\nimport UsernameFilter from '@src/components/UsernameFilter';\nimport { useRoles, useTeamMembers } from '@src/courseTeam/data/apiHook';\nimport messages from '@src/courseTeam/messages';\nimport { Role } from '@src/courseTeam/types';\nimport { DataTableFetchDataProps } from '@src/types';\n\nconst TEAM_MEMBERS_PAGE_SIZE = 25;\n\nconst RoleFilter = ({ column: { filterValue, setFilter } }: { column: { filterValue: string, setFilter: (value: string) => void } }) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const { data } = useRoles(courseId);\n\n const handleSelectChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n setFilter(e.target.value);\n };\n\n const roles = useMemo(() => {\n return [{ value: '', label: intl.formatMessage(messages.allRoles) }, ...(data?.results || []).map((role: Role) => ({ value: role.role, label: role.displayName }))];\n }, [data, intl]);\n\n return (\n <FormControl\n as=\"select\"\n className=\"mb-0\"\n disabled={!data}\n name=\"role\"\n size=\"md\"\n value={filterValue}\n onChange={handleSelectChange}\n leadingElement={<Icon src={FilterList} />}\n >\n {roles.map(role => (\n <option key={role.value} value={role.value}>\n {role.label}\n </option>\n ))}\n </FormControl>\n );\n};\n\nconst MembersContent = () => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const [filters, setFilters] = useState({ page: 0, emailOrUsername: '', role: '' });\n const { data: { results: teamMembers = [], numPages = 1, count = 0 } = {}, isLoading = false } = useTeamMembers(courseId, { ...filters, pageSize: TEAM_MEMBERS_PAGE_SIZE });\n\n const tableColumns = useMemo(() => [\n { accessor: 'username', Header: intl.formatMessage(messages.username), Filter: UsernameFilter },\n { accessor: 'email', Header: intl.formatMessage(messages.email), disableFilters: true },\n { accessor: 'role', Header: intl.formatMessage(messages.role), Filter: RoleFilter },\n ], [intl]);\n\n const additionalColumns = useMemo(() => [{\n id: 'actions',\n Header: intl.formatMessage(messages.actions),\n Cell: () => (\n <Button variant=\"link\" size=\"inline\">\n {intl.formatMessage(messages.edit)}\n </Button>\n )\n }], [intl]);\n\n const handleFetchData = (data: DataTableFetchDataProps) => {\n const usernameFilter = data.filters?.find((f) => f.id === 'username');\n const newEmailOrUsername = usernameFilter ? usernameFilter.value : '';\n const rolesFilter = data.filters?.find((f) => f.id === 'role');\n const newRole = rolesFilter ? rolesFilter.value : '';\n const filtersChanged = (newEmailOrUsername !== filters.emailOrUsername) || (newRole !== filters.role);\n\n if (filtersChanged) {\n setFilters((prevFilters) => ({\n ...prevFilters,\n emailOrUsername: newEmailOrUsername,\n role: newRole,\n page: 0,\n }));\n return;\n }\n\n if (data.pageIndex !== filters.page) {\n setFilters((prevFilters) => ({ ...prevFilters, page: data.pageIndex }));\n }\n };\n\n const tableState = useMemo(() => ({\n pageIndex: filters.page,\n pageSize: TEAM_MEMBERS_PAGE_SIZE,\n }), [filters.page]);\n\n return (\n <DataTable\n additionalColumns={additionalColumns}\n columns={tableColumns}\n data={teamMembers}\n fetchData={handleFetchData}\n state={tableState}\n isFilterable\n isLoading={isLoading}\n isPaginated\n itemCount={count}\n manualFilters\n manualPagination\n numBreakoutFilters={2}\n pageSize={TEAM_MEMBERS_PAGE_SIZE}\n pageCount={numPages}\n RowStatusComponent={() => null}\n >\n <DataTable.TableControlBar />\n <DataTable.Table />\n <DataTable.EmptyTable content={intl.formatMessage(messages.noTeamMembers)} />\n <DataTable.TableFooter />\n </DataTable>\n );\n};\n\nexport default MembersContent;\n"]}
1
+ {"version":3,"file":"MembersContent.js","sourceRoot":"","sources":["../../../src/courseTeam/components/MembersContent.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Button, DataTable } from '@openedx/paragon';\nimport UsernameFilter from '@src/components/UsernameFilter';\nimport RoleFilter from '@src/courseTeam/components/RoleFilter';\nimport { useTeamMembers } from '@src/courseTeam/data/apiHook';\nimport messages from '@src/courseTeam/messages';\nimport { CourseTeamMember, Role } from '@src/courseTeam/types';\nimport { DataTableFetchDataProps } from '@src/types';\n\nconst TEAM_MEMBERS_PAGE_SIZE = 25;\n\ninterface MembersContentProps {\n onEdit: (user: CourseTeamMember) => void,\n}\n\nconst MembersContent = ({ onEdit }: MembersContentProps) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const [filters, setFilters] = useState({ page: 0, emailOrUsername: '', role: '' });\n const { data: { results: teamMembers = [], numPages = 1, count = 0 } = {}, isLoading = false } = useTeamMembers(courseId, { ...filters, pageSize: TEAM_MEMBERS_PAGE_SIZE });\n\n const tableColumns = useMemo(() => [\n { accessor: 'username', Header: intl.formatMessage(messages.username), Filter: UsernameFilter },\n { accessor: 'email', Header: intl.formatMessage(messages.email), disableFilters: true },\n { accessor: 'roles', Header: intl.formatMessage(messages.role), Cell: ({ cell: { value } }: { cell: { value: Role[] } }) => value.map(role => role.displayName).join(', '), Filter: RoleFilter },\n ], [intl]);\n\n const additionalColumns = useMemo(() => [{\n id: 'actions',\n Header: intl.formatMessage(messages.actions),\n Cell: ({ row }: { row: { original: any } }) => (\n <Button variant=\"link\" size=\"inline\" onClick={() => onEdit(row.original)}>\n {intl.formatMessage(messages.edit)}\n </Button>\n )\n }], [intl, onEdit]);\n\n const handleFetchData = (data: DataTableFetchDataProps) => {\n const usernameFilter = data.filters?.find((f) => f.id === 'username');\n const newEmailOrUsername = usernameFilter ? usernameFilter.value : '';\n const rolesFilter = data.filters?.find((f) => f.id === 'roles');\n const newRole = rolesFilter ? rolesFilter.value : '';\n const filtersChanged = (newEmailOrUsername !== filters.emailOrUsername) || (newRole !== filters.role);\n\n if (filtersChanged) {\n setFilters((prevFilters) => ({\n ...prevFilters,\n emailOrUsername: newEmailOrUsername,\n role: newRole,\n page: 0,\n }));\n return;\n }\n\n if (data.pageIndex !== filters.page) {\n setFilters((prevFilters) => ({ ...prevFilters, page: data.pageIndex }));\n }\n };\n\n const tableState = useMemo(() => ({\n pageIndex: filters.page,\n pageSize: TEAM_MEMBERS_PAGE_SIZE,\n }), [filters.page]);\n\n return (\n <DataTable\n additionalColumns={additionalColumns}\n columns={tableColumns}\n data={teamMembers}\n fetchData={handleFetchData}\n state={tableState}\n isFilterable\n isLoading={isLoading}\n isPaginated\n itemCount={count}\n manualFilters\n manualPagination\n numBreakoutFilters={2}\n pageSize={TEAM_MEMBERS_PAGE_SIZE}\n pageCount={numPages}\n RowStatusComponent={() => null}\n >\n <DataTable.TableControlBar />\n <DataTable.Table />\n <DataTable.EmptyTable content={intl.formatMessage(messages.noTeamMembers)} />\n <DataTable.TableFooter />\n </DataTable>\n );\n};\n\nexport default MembersContent;\n"]}
@@ -0,0 +1,7 @@
1
+ declare const RoleFilter: ({ column: { filterValue, setFilter } }: {
2
+ column: {
3
+ filterValue: string;
4
+ setFilter: (value: string) => void;
5
+ };
6
+ }) => import("react/jsx-runtime").JSX.Element;
7
+ export default RoleFilter;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { useParams } from 'react-router-dom';
4
+ import { useIntl } from '@openedx/frontend-base';
5
+ import { FormControl, Icon } from '@openedx/paragon';
6
+ import { FilterList } from '@openedx/paragon/icons';
7
+ import { useRoles } from '../../courseTeam/data/apiHook';
8
+ import messages from '../../courseTeam/messages';
9
+ const RoleFilter = ({ column: { filterValue, setFilter } }) => {
10
+ const intl = useIntl();
11
+ const { courseId = '' } = useParams();
12
+ const { data } = useRoles(courseId);
13
+ const handleSelectChange = (e) => {
14
+ setFilter(e.target.value);
15
+ };
16
+ const roles = useMemo(() => {
17
+ return [{ value: '', label: intl.formatMessage(messages.allRoles) }, ...((data === null || data === void 0 ? void 0 : data.results) || []).map((role) => ({ value: role.role, label: role.displayName }))];
18
+ }, [data, intl]);
19
+ return (_jsx(FormControl, { as: "select", className: "mb-0", disabled: !data, name: "role", size: "md", value: filterValue, onChange: handleSelectChange, leadingElement: _jsx(Icon, { src: FilterList }), children: roles.map(role => (_jsx("option", { value: role.value, children: role.label }, role.value))) }));
20
+ };
21
+ export default RoleFilter;
22
+ //# sourceMappingURL=RoleFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleFilter.js","sourceRoot":"","sources":["../../../src/courseTeam/components/RoleFilter.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAA2E,EAAE,EAAE;IACrI,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,SAAS,EAAwB,CAAC;IAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,kBAAkB,GAAG,CAAC,CAAuC,EAAE,EAAE;QACrE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,KAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACtK,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAEjB,OAAO,CACL,KAAC,WAAW,IACV,EAAE,EAAC,QAAQ,EACX,SAAS,EAAC,MAAM,EAChB,QAAQ,EAAE,CAAC,IAAI,EACf,IAAI,EAAC,MAAM,EACX,IAAI,EAAC,IAAI,EACT,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,cAAc,EAAE,KAAC,IAAI,IAAC,GAAG,EAAE,UAAU,GAAI,YAExC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACjB,iBAAyB,KAAK,EAAE,IAAI,CAAC,KAAK,YACvC,IAAI,CAAC,KAAK,IADA,IAAI,CAAC,KAAK,CAEd,CACV,CAAC,GACU,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { FormControl, Icon } from '@openedx/paragon';\nimport { FilterList } from '@openedx/paragon/icons';\nimport { useRoles } from '@src/courseTeam/data/apiHook';\nimport messages from '@src/courseTeam/messages';\nimport { Role } from '@src/courseTeam/types';\n\nconst RoleFilter = ({ column: { filterValue, setFilter } }: { column: { filterValue: string, setFilter: (value: string) => void } }) => {\n const intl = useIntl();\n const { courseId = '' } = useParams<{ courseId: string }>();\n const { data } = useRoles(courseId);\n\n const handleSelectChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n setFilter(e.target.value);\n };\n\n const roles = useMemo(() => {\n return [{ value: '', label: intl.formatMessage(messages.allRoles) }, ...(data?.results || []).map((role: Role) => ({ value: role.role, label: role.displayName }))];\n }, [data, intl]);\n\n return (\n <FormControl\n as=\"select\"\n className=\"mb-0\"\n disabled={!data}\n name=\"role\"\n size=\"md\"\n value={filterValue}\n onChange={handleSelectChange}\n leadingElement={<Icon src={FilterList} />}\n >\n {roles.map(role => (\n <option key={role.value} value={role.value}>\n {role.label}\n </option>\n ))}\n </FormControl>\n );\n};\n\nexport default RoleFilter;\n"]}
@@ -1,5 +1,6 @@
1
1
  import { DataList } from '../../types';
2
- import { AddTeamMembersResponse, CourseTeamMember, CourseTeamMemberQueryParams, Role } from '../../courseTeam/types';
2
+ import { TeamMembersResponse, 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>;
5
+ export declare const addTeamMember: (courseId: string, identifiers: string[], role: string) => Promise<TeamMembersResponse>;
6
+ export declare const removeTeamMember: (courseId: string, identifier: string, roles: string[]) => Promise<TeamMembersResponse>;
@@ -31,4 +31,8 @@ export const addTeamMember = (courseId, identifiers, role) => __awaiter(void 0,
31
31
  const { data } = yield getAuthenticatedHttpClient().post(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team`, { identifiers, role });
32
32
  return camelCaseObject(data);
33
33
  });
34
+ export const removeTeamMember = (courseId, identifier, roles) => __awaiter(void 0, void 0, void 0, function* () {
35
+ const { data } = yield getAuthenticatedHttpClient().delete(`${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team/${identifier}`, { data: { roles } });
36
+ return camelCaseObject(data);
37
+ });
34
38
  //# 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;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
+ {"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,EAAgC,EAAE;IACzH,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;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAO,QAAgB,EAAE,UAAkB,EAAE,KAAe,EAAgC,EAAE;IAC5H,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,MAAM,CACxD,GAAG,aAAa,EAAE,8BAA8B,QAAQ,SAAS,UAAU,EAAE,EAC7E,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CACpB,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 { TeamMembersResponse, 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<TeamMembersResponse> => {\n const { data } = await getAuthenticatedHttpClient().post(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team`,\n { identifiers, role }\n );\n return camelCaseObject(data);\n};\n\nexport const removeTeamMember = async (courseId: string, identifier: string, roles: string[]): Promise<TeamMembersResponse> => {\n const { data } = await getAuthenticatedHttpClient().delete(\n `${getApiBaseUrl()}/api/instructor/v2/courses/${courseId}/team/${identifier}`,\n { data: { roles } }\n );\n return camelCaseObject(data);\n};\n"]}
@@ -1,7 +1,11 @@
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, {
4
+ export declare const useAddTeamMember: (courseId: string) => import("@tanstack/react-query").UseMutationResult<import("../../courseTeam/types").TeamMembersResponse, Error, {
5
5
  identifiers: string[];
6
6
  role: string;
7
7
  }, unknown>;
8
+ export declare const useRemoveTeamMember: (courseId: string) => import("@tanstack/react-query").UseMutationResult<import("../../courseTeam/types").TeamMembersResponse, Error, {
9
+ identifier: string;
10
+ roles: string[];
11
+ }, unknown>;
@@ -1,5 +1,5 @@
1
1
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
2
- import { addTeamMember, getRoles, getTeamMembers } from '../../courseTeam/data/api';
2
+ import { addTeamMember, getRoles, getTeamMembers, removeTeamMember } 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),
@@ -20,4 +20,13 @@ export const useAddTeamMember = (courseId) => {
20
20
  }
21
21
  }));
22
22
  };
23
+ export const useRemoveTeamMember = (courseId) => {
24
+ const queryClient = useQueryClient();
25
+ return (useMutation({
26
+ mutationFn: ({ identifier, roles }) => removeTeamMember(courseId, identifier, roles),
27
+ onSuccess: () => {
28
+ queryClient.invalidateQueries({ queryKey: courseTeamQueryKeys.byCourse(courseId) });
29
+ }
30
+ }));
31
+ };
23
32
  //# sourceMappingURL=apiHook.js.map
@@ -1 +1 @@
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"]}
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,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACrG,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;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAgB,EAAE,EAAE;IACtD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,CAAC,WAAW,CAAC;QAClB,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAA2C,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAC7H,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, removeTeamMember } 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\nexport const useRemoveTeamMember = (courseId: string) => {\n const queryClient = useQueryClient();\n return (useMutation({\n mutationFn: ({ identifier, roles }: { identifier: string, roles: string[] }) => removeTeamMember(courseId, identifier, roles),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: courseTeamQueryKeys.byCourse(courseId) });\n }\n })\n );\n};\n"]}
@@ -214,5 +214,30 @@ declare const messages: {
214
214
  defaultMessage: string;
215
215
  description: string;
216
216
  };
217
+ editTeamTitle: {
218
+ id: string;
219
+ defaultMessage: string;
220
+ description: string;
221
+ };
222
+ editInstructions: {
223
+ id: string;
224
+ defaultMessage: string;
225
+ description: string;
226
+ };
227
+ addRole: {
228
+ id: string;
229
+ defaultMessage: string;
230
+ description: string;
231
+ };
232
+ removeTeamMemberError: {
233
+ id: string;
234
+ defaultMessage: string;
235
+ description: string;
236
+ };
237
+ addRoleError: {
238
+ id: string;
239
+ defaultMessage: string;
240
+ description: string;
241
+ };
217
242
  };
218
243
  export default messages;
@@ -215,6 +215,31 @@ const messages = defineMessages({
215
215
  defaultMessage: 'Unknown learner: {learner}',
216
216
  description: 'Displayed when a learner does not have a full name or username available',
217
217
  },
218
+ editTeamTitle: {
219
+ id: 'instruct.courseTeam.editTeamTitle',
220
+ defaultMessage: 'Edit {username} Roles',
221
+ description: 'Title for edit team member modal',
222
+ },
223
+ editInstructions: {
224
+ id: 'instruct.courseTeam.editInstructions',
225
+ defaultMessage: 'Uncheck to remove role from {username}',
226
+ description: 'Instructions for editing a team member',
227
+ },
228
+ addRole: {
229
+ id: 'instruct.courseTeam.addRole',
230
+ defaultMessage: 'Add role',
231
+ description: 'Label for adding a role to a team member',
232
+ },
233
+ removeTeamMemberError: {
234
+ id: 'instruct.courseTeam.removeTeamMemberError',
235
+ defaultMessage: 'Failed to remove one or more roles from {username}.',
236
+ description: 'Error message displayed when removing a team member fails',
237
+ },
238
+ addRoleError: {
239
+ id: 'instruct.courseTeam.addRoleError',
240
+ defaultMessage: 'Failed to add role to {username}.',
241
+ description: 'Error message displayed when adding a role to a team member fails',
242
+ }
218
243
  });
219
244
  export default messages;
220
245
  //# 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 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"]}
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 editTeamTitle: {\n id: 'instruct.courseTeam.editTeamTitle',\n defaultMessage: 'Edit {username} Roles',\n description: 'Title for edit team member modal',\n },\n editInstructions: {\n id: 'instruct.courseTeam.editInstructions',\n defaultMessage: 'Uncheck to remove role from {username}',\n description: 'Instructions for editing a team member',\n },\n addRole: {\n id: 'instruct.courseTeam.addRole',\n defaultMessage: 'Add role',\n description: 'Label for adding a role to a team member',\n },\n removeTeamMemberError: {\n id: 'instruct.courseTeam.removeTeamMemberError',\n defaultMessage: 'Failed to remove one or more roles from {username}.',\n description: 'Error message displayed when removing a team member fails',\n },\n addRoleError: {\n id: 'instruct.courseTeam.addRoleError',\n defaultMessage: 'Failed to add role to {username}.',\n description: 'Error message displayed when adding a role to a team member fails',\n }\n});\n\nexport default messages;\n"]}
@@ -1,7 +1,8 @@
1
1
  export interface CourseTeamMember {
2
2
  username: string;
3
+ fullName: string;
3
4
  email: string;
4
- role: string;
5
+ roles: Role[];
5
6
  }
6
7
  export interface CourseTeamMemberQueryParams {
7
8
  page: number;
@@ -13,7 +14,7 @@ export interface Role {
13
14
  role: string;
14
15
  displayName: string;
15
16
  }
16
- export interface AddTeamMembersResponse {
17
+ export interface TeamMembersResponse {
17
18
  results: {
18
19
  identifier: string;
19
20
  userDoesNotExist: boolean;
@@ -1,2 +1,3 @@
1
+ ;
1
2
  export {};
2
3
  //# sourceMappingURL=types.js.map
@@ -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\nexport interface AddTeamMembersResponse {\n results: {\n identifier: string,\n userDoesNotExist: boolean,\n }[],\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/courseTeam/types.ts"],"names":[],"mappings":"AAKC,CAAC","sourcesContent":["export interface CourseTeamMember {\n username: string,\n fullName: string,\n email: string,\n roles: Role[],\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 TeamMembersResponse {\n results: {\n identifier: string,\n userDoesNotExist: boolean,\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.13",
3
+ "version": "1.0.0-alpha.14",
4
4
  "description": "The Open edX Instructor Dashboard",
5
5
  "repository": {
6
6
  "type": "git",