@openedx/frontend-app-admin-console 1.0.0-alpha.0

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 (236) hide show
  1. package/LICENSE +661 -0
  2. package/README.rst +164 -0
  3. package/dist/Main.d.ts +3 -0
  4. package/dist/Main.js +15 -0
  5. package/dist/Main.js.map +1 -0
  6. package/dist/app.d.ts +3 -0
  7. package/dist/app.js +10 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/authz-module/audit-user/index.d.ts +2 -0
  10. package/dist/authz-module/audit-user/index.js +191 -0
  11. package/dist/authz-module/audit-user/index.js.map +1 -0
  12. package/dist/authz-module/audit-user/messages.d.ts +58 -0
  13. package/dist/authz-module/audit-user/messages.js +60 -0
  14. package/dist/authz-module/audit-user/messages.js.map +1 -0
  15. package/dist/authz-module/authz-home/index.d.ts +2 -0
  16. package/dist/authz-module/authz-home/index.js +23 -0
  17. package/dist/authz-module/authz-home/index.js.map +1 -0
  18. package/dist/authz-module/authz-home/messages.d.ts +23 -0
  19. package/dist/authz-module/authz-home/messages.js +25 -0
  20. package/dist/authz-module/authz-home/messages.js.map +1 -0
  21. package/dist/authz-module/components/AddRoleButton.d.ts +6 -0
  22. package/dist/authz-module/components/AddRoleButton.js +22 -0
  23. package/dist/authz-module/components/AddRoleButton.js.map +1 -0
  24. package/dist/authz-module/components/AnchorButton.d.ts +2 -0
  25. package/dist/authz-module/components/AnchorButton.js +35 -0
  26. package/dist/authz-module/components/AnchorButton.js.map +1 -0
  27. package/dist/authz-module/components/AuthZLayout.d.ts +12 -0
  28. package/dist/authz-module/components/AuthZLayout.js +19 -0
  29. package/dist/authz-module/components/AuthZLayout.js.map +1 -0
  30. package/dist/authz-module/components/AuthZTitle.d.ts +20 -0
  31. package/dist/authz-module/components/AuthZTitle.js +22 -0
  32. package/dist/authz-module/components/AuthZTitle.js.map +1 -0
  33. package/dist/authz-module/components/ConfirmDeletionModal.d.ts +15 -0
  34. package/dist/authz-module/components/ConfirmDeletionModal.js +21 -0
  35. package/dist/authz-module/components/ConfirmDeletionModal.js.map +1 -0
  36. package/dist/authz-module/components/ErrorPage/index.d.ts +3 -0
  37. package/dist/authz-module/components/ErrorPage/index.js +59 -0
  38. package/dist/authz-module/components/ErrorPage/index.js.map +1 -0
  39. package/dist/authz-module/components/ErrorPage/messages.d.ts +53 -0
  40. package/dist/authz-module/components/ErrorPage/messages.js +55 -0
  41. package/dist/authz-module/components/ErrorPage/messages.js.map +1 -0
  42. package/dist/authz-module/components/PermissionTable.d.ts +9 -0
  43. package/dist/authz-module/components/PermissionTable.js +24 -0
  44. package/dist/authz-module/components/PermissionTable.js.map +1 -0
  45. package/dist/authz-module/components/RenderAdminRole.d.ts +5 -0
  46. package/dist/authz-module/components/RenderAdminRole.js +13 -0
  47. package/dist/authz-module/components/RenderAdminRole.js.map +1 -0
  48. package/dist/authz-module/components/RenderPermissionColumn.d.ts +6 -0
  49. package/dist/authz-module/components/RenderPermissionColumn.js +8 -0
  50. package/dist/authz-module/components/RenderPermissionColumn.js.map +1 -0
  51. package/dist/authz-module/components/RenderPermissionInLine.d.ts +6 -0
  52. package/dist/authz-module/components/RenderPermissionInLine.js +8 -0
  53. package/dist/authz-module/components/RenderPermissionInLine.js.map +1 -0
  54. package/dist/authz-module/components/ResourceTooltip.d.ts +11 -0
  55. package/dist/authz-module/components/ResourceTooltip.js +9 -0
  56. package/dist/authz-module/components/ResourceTooltip.js.map +1 -0
  57. package/dist/authz-module/components/RoleCard/constants.d.ts +14 -0
  58. package/dist/authz-module/components/RoleCard/constants.js +15 -0
  59. package/dist/authz-module/components/RoleCard/constants.js.map +1 -0
  60. package/dist/authz-module/components/RoleCard/messages.d.ts +73 -0
  61. package/dist/authz-module/components/RoleCard/messages.js +75 -0
  62. package/dist/authz-module/components/RoleCard/messages.js.map +1 -0
  63. package/dist/authz-module/components/TableCells.d.ts +29 -0
  64. package/dist/authz-module/components/TableCells.js +137 -0
  65. package/dist/authz-module/components/TableCells.js.map +1 -0
  66. package/dist/authz-module/components/TableControlBar/MultipleChoiceFilter.d.ts +3 -0
  67. package/dist/authz-module/components/TableControlBar/MultipleChoiceFilter.js +47 -0
  68. package/dist/authz-module/components/TableControlBar/MultipleChoiceFilter.js.map +1 -0
  69. package/dist/authz-module/components/TableControlBar/OrgFilter.d.ts +5 -0
  70. package/dist/authz-module/components/TableControlBar/OrgFilter.js +36 -0
  71. package/dist/authz-module/components/TableControlBar/OrgFilter.js.map +1 -0
  72. package/dist/authz-module/components/TableControlBar/RolesFilter.d.ts +4 -0
  73. package/dist/authz-module/components/TableControlBar/RolesFilter.js +29 -0
  74. package/dist/authz-module/components/TableControlBar/RolesFilter.js.map +1 -0
  75. package/dist/authz-module/components/TableControlBar/ScopesFilter.d.ts +4 -0
  76. package/dist/authz-module/components/TableControlBar/ScopesFilter.js +45 -0
  77. package/dist/authz-module/components/TableControlBar/ScopesFilter.js.map +1 -0
  78. package/dist/authz-module/components/TableControlBar/SearchFilter.d.ts +7 -0
  79. package/dist/authz-module/components/TableControlBar/SearchFilter.js +8 -0
  80. package/dist/authz-module/components/TableControlBar/SearchFilter.js.map +1 -0
  81. package/dist/authz-module/components/TableControlBar/TableControlBar.d.ts +5 -0
  82. package/dist/authz-module/components/TableControlBar/TableControlBar.js +99 -0
  83. package/dist/authz-module/components/TableControlBar/TableControlBar.js.map +1 -0
  84. package/dist/authz-module/components/TableControlBar/types.d.ts +18 -0
  85. package/dist/authz-module/components/TableControlBar/types.js +2 -0
  86. package/dist/authz-module/components/TableControlBar/types.js.map +1 -0
  87. package/dist/authz-module/components/TableFooter/TableFooter.d.ts +2 -0
  88. package/dist/authz-module/components/TableFooter/TableFooter.js +15 -0
  89. package/dist/authz-module/components/TableFooter/TableFooter.js.map +1 -0
  90. package/dist/authz-module/components/UserPermissions.d.ts +9 -0
  91. package/dist/authz-module/components/UserPermissions.js +56 -0
  92. package/dist/authz-module/components/UserPermissions.js.map +1 -0
  93. package/dist/authz-module/components/ViewMoreLink.d.ts +8 -0
  94. package/dist/authz-module/components/ViewMoreLink.js +8 -0
  95. package/dist/authz-module/components/ViewMoreLink.js.map +1 -0
  96. package/dist/authz-module/components/constants.d.ts +13 -0
  97. package/dist/authz-module/components/constants.js +80 -0
  98. package/dist/authz-module/components/constants.js.map +1 -0
  99. package/dist/authz-module/components/messages.d.ts +183 -0
  100. package/dist/authz-module/components/messages.js +185 -0
  101. package/dist/authz-module/components/messages.js.map +1 -0
  102. package/dist/authz-module/constants.d.ts +38 -0
  103. package/dist/authz-module/constants.js +77 -0
  104. package/dist/authz-module/constants.js.map +1 -0
  105. package/dist/authz-module/data/api.d.ts +109 -0
  106. package/dist/authz-module/data/api.js +107 -0
  107. package/dist/authz-module/data/api.js.map +1 -0
  108. package/dist/authz-module/data/hooks.d.ts +94 -0
  109. package/dist/authz-module/data/hooks.js +191 -0
  110. package/dist/authz-module/data/hooks.js.map +1 -0
  111. package/dist/authz-module/hooks/useCourseAuthoringFlag.d.ts +26 -0
  112. package/dist/authz-module/hooks/useCourseAuthoringFlag.js +86 -0
  113. package/dist/authz-module/hooks/useCourseAuthoringFlag.js.map +1 -0
  114. package/dist/authz-module/hooks/useQuerySettings.d.ts +27 -0
  115. package/dist/authz-module/hooks/useQuerySettings.js +72 -0
  116. package/dist/authz-module/hooks/useQuerySettings.js.map +1 -0
  117. package/dist/authz-module/hooks/useViewTeamPermissions.d.ts +5 -0
  118. package/dist/authz-module/hooks/useViewTeamPermissions.js +13 -0
  119. package/dist/authz-module/hooks/useViewTeamPermissions.js.map +1 -0
  120. package/dist/authz-module/index.d.ts +3 -0
  121. package/dist/authz-module/index.js +20 -0
  122. package/dist/authz-module/index.js.map +1 -0
  123. package/dist/authz-module/index.scss +131 -0
  124. package/dist/authz-module/messages.d.ts +48 -0
  125. package/dist/authz-module/messages.js +50 -0
  126. package/dist/authz-module/messages.js.map +1 -0
  127. package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.d.ts +8 -0
  128. package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.js +154 -0
  129. package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.js.map +1 -0
  130. package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.d.ts +2 -0
  131. package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.js +39 -0
  132. package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.js.map +1 -0
  133. package/dist/authz-module/role-assignation-wizard/components/DefineApplicationScopeStep.d.ts +8 -0
  134. package/dist/authz-module/role-assignation-wizard/components/DefineApplicationScopeStep.js +39 -0
  135. package/dist/authz-module/role-assignation-wizard/components/DefineApplicationScopeStep.js.map +1 -0
  136. package/dist/authz-module/role-assignation-wizard/components/HighlightedUsersInput.d.ts +11 -0
  137. package/dist/authz-module/role-assignation-wizard/components/HighlightedUsersInput.js +36 -0
  138. package/dist/authz-module/role-assignation-wizard/components/HighlightedUsersInput.js.map +1 -0
  139. package/dist/authz-module/role-assignation-wizard/components/OrgSection.d.ts +10 -0
  140. package/dist/authz-module/role-assignation-wizard/components/OrgSection.js +14 -0
  141. package/dist/authz-module/role-assignation-wizard/components/OrgSection.js.map +1 -0
  142. package/dist/authz-module/role-assignation-wizard/components/ScopeCheckboxItem.d.ts +8 -0
  143. package/dist/authz-module/role-assignation-wizard/components/ScopeCheckboxItem.js +5 -0
  144. package/dist/authz-module/role-assignation-wizard/components/ScopeCheckboxItem.js.map +1 -0
  145. package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.d.ts +12 -0
  146. package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.js +12 -0
  147. package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.js.map +1 -0
  148. package/dist/authz-module/role-assignation-wizard/components/ScopeList.d.ts +20 -0
  149. package/dist/authz-module/role-assignation-wizard/components/ScopeList.js +30 -0
  150. package/dist/authz-module/role-assignation-wizard/components/ScopeList.js.map +1 -0
  151. package/dist/authz-module/role-assignation-wizard/components/SelectUsersAndRoleStep.d.ts +12 -0
  152. package/dist/authz-module/role-assignation-wizard/components/SelectUsersAndRoleStep.js +34 -0
  153. package/dist/authz-module/role-assignation-wizard/components/SelectUsersAndRoleStep.js.map +1 -0
  154. package/dist/authz-module/role-assignation-wizard/constants.d.ts +5 -0
  155. package/dist/authz-module/role-assignation-wizard/constants.js +6 -0
  156. package/dist/authz-module/role-assignation-wizard/constants.js.map +1 -0
  157. package/dist/authz-module/role-assignation-wizard/hooks/useScopeListData.d.ts +23 -0
  158. package/dist/authz-module/role-assignation-wizard/hooks/useScopeListData.js +112 -0
  159. package/dist/authz-module/role-assignation-wizard/hooks/useScopeListData.js.map +1 -0
  160. package/dist/authz-module/role-assignation-wizard/hooks/useScopePermissions.d.ts +10 -0
  161. package/dist/authz-module/role-assignation-wizard/hooks/useScopePermissions.js +54 -0
  162. package/dist/authz-module/role-assignation-wizard/hooks/useScopePermissions.js.map +1 -0
  163. package/dist/authz-module/role-assignation-wizard/messages.d.ts +243 -0
  164. package/dist/authz-module/role-assignation-wizard/messages.js +258 -0
  165. package/dist/authz-module/role-assignation-wizard/messages.js.map +1 -0
  166. package/dist/authz-module/role-assignation-wizard/utils.d.ts +5 -0
  167. package/dist/authz-module/role-assignation-wizard/utils.js +16 -0
  168. package/dist/authz-module/role-assignation-wizard/utils.js.map +1 -0
  169. package/dist/authz-module/roles-permissions/RolesPermissions.d.ts +2 -0
  170. package/dist/authz-module/roles-permissions/RolesPermissions.js +35 -0
  171. package/dist/authz-module/roles-permissions/RolesPermissions.js.map +1 -0
  172. package/dist/authz-module/roles-permissions/course/constants.d.ts +39 -0
  173. package/dist/authz-module/roles-permissions/course/constants.js +474 -0
  174. package/dist/authz-module/roles-permissions/course/constants.js.map +1 -0
  175. package/dist/authz-module/roles-permissions/index.d.ts +10 -0
  176. package/dist/authz-module/roles-permissions/index.js +15 -0
  177. package/dist/authz-module/roles-permissions/index.js.map +1 -0
  178. package/dist/authz-module/roles-permissions/library/constants.d.ts +18 -0
  179. package/dist/authz-module/roles-permissions/library/constants.js +193 -0
  180. package/dist/authz-module/roles-permissions/library/constants.js.map +1 -0
  181. package/dist/authz-module/roles-permissions/messages.d.ts +63 -0
  182. package/dist/authz-module/roles-permissions/messages.js +65 -0
  183. package/dist/authz-module/roles-permissions/messages.js.map +1 -0
  184. package/dist/authz-module/roles-permissions/utils.d.ts +41 -0
  185. package/dist/authz-module/roles-permissions/utils.js +70 -0
  186. package/dist/authz-module/roles-permissions/utils.js.map +1 -0
  187. package/dist/authz-module/team-members/TeamMembersTable.d.ts +5 -0
  188. package/dist/authz-module/team-members/TeamMembersTable.js +107 -0
  189. package/dist/authz-module/team-members/TeamMembersTable.js.map +1 -0
  190. package/dist/authz-module/team-members/messages.d.ts +33 -0
  191. package/dist/authz-module/team-members/messages.js +35 -0
  192. package/dist/authz-module/team-members/messages.js.map +1 -0
  193. package/dist/authz-module/utils.d.ts +24 -0
  194. package/dist/authz-module/utils.js +45 -0
  195. package/dist/authz-module/utils.js.map +1 -0
  196. package/dist/components/LoadingPage.d.ts +2 -0
  197. package/dist/components/LoadingPage.js +5 -0
  198. package/dist/components/LoadingPage.js.map +1 -0
  199. package/dist/components/ToastManager/ToastManagerContext.d.ts +24 -0
  200. package/dist/components/ToastManager/ToastManagerContext.js +91 -0
  201. package/dist/components/ToastManager/ToastManagerContext.js.map +1 -0
  202. package/dist/constants.d.ts +11 -0
  203. package/dist/constants.js +15 -0
  204. package/dist/constants.js.map +1 -0
  205. package/dist/data/api.d.ts +4 -0
  206. package/dist/data/api.js +21 -0
  207. package/dist/data/api.js.map +1 -0
  208. package/dist/data/hooks.d.ts +38 -0
  209. package/dist/data/hooks.js +69 -0
  210. package/dist/data/hooks.js.map +1 -0
  211. package/dist/data/types.d.ts +38 -0
  212. package/dist/data/types.js +2 -0
  213. package/dist/data/types.js.map +1 -0
  214. package/dist/data/utils.d.ts +6 -0
  215. package/dist/data/utils.js +11 -0
  216. package/dist/data/utils.js.map +1 -0
  217. package/dist/i18n/index.d.ts +1 -0
  218. package/dist/i18n/index.js +2 -0
  219. package/dist/i18n/index.js.map +1 -0
  220. package/dist/index.d.ts +3 -0
  221. package/dist/index.js +4 -0
  222. package/dist/index.js.map +1 -0
  223. package/dist/messages.d.ts +8 -0
  224. package/dist/messages.js +10 -0
  225. package/dist/messages.js.map +1 -0
  226. package/dist/providers.d.ts +3 -0
  227. package/dist/providers.js +4 -0
  228. package/dist/providers.js.map +1 -0
  229. package/dist/routes.d.ts +11 -0
  230. package/dist/routes.js +16 -0
  231. package/dist/routes.js.map +1 -0
  232. package/dist/style.scss +15 -0
  233. package/dist/types.d.ts +93 -0
  234. package/dist/types.js +2 -0
  235. package/dist/types.js.map +1 -0
  236. package/package.json +88 -0
@@ -0,0 +1,23 @@
1
+ declare const messages: {
2
+ 'authz.manage.page.title': {
3
+ id: string;
4
+ defaultMessage: string;
5
+ description: string;
6
+ };
7
+ 'authz.breadcrumb.root': {
8
+ id: string;
9
+ defaultMessage: string;
10
+ description: string;
11
+ };
12
+ 'authz.tabs.team': {
13
+ id: string;
14
+ defaultMessage: string;
15
+ description: string;
16
+ };
17
+ 'authz.tabs.permissionsRoles': {
18
+ id: string;
19
+ defaultMessage: string;
20
+ description: string;
21
+ };
22
+ };
23
+ export default messages;
@@ -0,0 +1,25 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+ const messages = defineMessages({
3
+ 'authz.manage.page.title': {
4
+ id: 'authz.manage.page.title',
5
+ defaultMessage: 'Roles and Permissions Management',
6
+ description: 'AuthZ home page title',
7
+ },
8
+ 'authz.breadcrumb.root': {
9
+ id: 'authz.breadcrumb.root',
10
+ defaultMessage: 'Manage Access',
11
+ description: 'AuthZ root breadcrumb',
12
+ },
13
+ 'authz.tabs.team': {
14
+ id: 'authz.tabs.team',
15
+ defaultMessage: 'Team Members',
16
+ description: 'AuthZ title for the team management tab',
17
+ },
18
+ 'authz.tabs.permissionsRoles': {
19
+ id: 'authz.tabs.permissionsRoles',
20
+ defaultMessage: 'Roles and Permissions',
21
+ description: 'AuthZ title for the roles tab',
22
+ },
23
+ });
24
+ export default messages;
25
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/authz-module/authz-home/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,yBAAyB,EAAE;QACzB,EAAE,EAAE,yBAAyB;QAC7B,cAAc,EAAE,kCAAkC;QAClD,WAAW,EAAE,uBAAuB;KACrC;IACD,uBAAuB,EAAE;QACvB,EAAE,EAAE,uBAAuB;QAC3B,cAAc,EAAE,eAAe;QAC/B,WAAW,EAAE,uBAAuB;KACrC;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,iBAAiB;QACrB,cAAc,EAAE,cAAc;QAC9B,WAAW,EAAE,yCAAyC;KACvD;IACD,6BAA6B,EAAE;QAC7B,EAAE,EAAE,6BAA6B;QACjC,cAAc,EAAE,uBAAuB;QACvC,WAAW,EAAE,+BAA+B;KAC7C;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n 'authz.manage.page.title': {\n id: 'authz.manage.page.title',\n defaultMessage: 'Roles and Permissions Management',\n description: 'AuthZ home page title',\n },\n 'authz.breadcrumb.root': {\n id: 'authz.breadcrumb.root',\n defaultMessage: 'Manage Access',\n description: 'AuthZ root breadcrumb',\n },\n 'authz.tabs.team': {\n id: 'authz.tabs.team',\n defaultMessage: 'Team Members',\n description: 'AuthZ title for the team management tab',\n },\n 'authz.tabs.permissionsRoles': {\n id: 'authz.tabs.permissionsRoles',\n defaultMessage: 'Roles and Permissions',\n description: 'AuthZ title for the roles tab',\n },\n});\n\nexport default messages;\n"]}
@@ -0,0 +1,6 @@
1
+ interface AddRoleButtonProps {
2
+ presetUsername?: string;
3
+ from?: string;
4
+ }
5
+ declare const AddRoleButton: ({ presetUsername, from }: AddRoleButtonProps) => import("react").JSX.Element | null;
6
+ export default AddRoleButton;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useIntl } from '@openedx/frontend-base';
3
+ import { Button } from '@openedx/paragon';
4
+ import { Plus } from '@openedx/paragon/icons';
5
+ import { useNavigate } from 'react-router-dom';
6
+ import baseMessages from '../messages';
7
+ import { buildWizardPath } from '../constants';
8
+ import { useValidateUserPermissionsNonSuspense } from '../../data/hooks';
9
+ import { MANAGE_TEAM_PERMISSIONS } from '../roles-permissions';
10
+ const AddRoleButton = ({ presetUsername, from }) => {
11
+ const intl = useIntl();
12
+ const navigate = useNavigate();
13
+ const { data: permissionValidationResponse } = useValidateUserPermissionsNonSuspense(MANAGE_TEAM_PERMISSIONS);
14
+ const canAssignRole = permissionValidationResponse === null || permissionValidationResponse === void 0 ? void 0 : permissionValidationResponse.some((permission) => permission.allowed);
15
+ const handleClick = () => {
16
+ const path = buildWizardPath({ from, users: presetUsername });
17
+ navigate(path);
18
+ };
19
+ return (canAssignRole ? (_jsx(Button, { iconBefore: Plus, onClick: handleClick, children: intl.formatMessage(baseMessages['authz.management.assign.role.title']) })) : null);
20
+ };
21
+ export default AddRoleButton;
22
+ //# sourceMappingURL=AddRoleButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddRoleButton.js","sourceRoot":"","sources":["../../../src/authz-module/components/AddRoleButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,qCAAqC,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAO9E,MAAM,aAAa,GAAG,CAAC,EAAE,cAAc,EAAE,IAAI,EAAsB,EAAE,EAAE;IACrE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,GAAG,qCAAqC,CAAC,uBAAuB,CAAC,CAAC;IAC9G,MAAM,aAAa,GAAG,4BAA4B,aAA5B,4BAA4B,uBAA5B,4BAA4B,CAAE,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE7F,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAC9D,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO,CACL,aAAa,CAAC,CAAC,CAAC,CACd,KAAC,MAAM,IACL,UAAU,EAAE,IAAI,EAChB,OAAO,EAAE,WAAW,YAEnB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC,GAChE,CACV,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACd,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport { Button } from '@openedx/paragon';\nimport { Plus } from '@openedx/paragon/icons';\nimport { useNavigate } from 'react-router-dom';\n\nimport baseMessages from '@src/authz-module/messages';\nimport { buildWizardPath } from '@src/authz-module/constants';\nimport { useValidateUserPermissionsNonSuspense } from '@src/data/hooks';\nimport { MANAGE_TEAM_PERMISSIONS } from '@src/authz-module/roles-permissions';\n\ninterface AddRoleButtonProps {\n presetUsername?: string;\n from?: string;\n}\n\nconst AddRoleButton = ({ presetUsername, from }: AddRoleButtonProps) => {\n const intl = useIntl();\n const navigate = useNavigate();\n\n const { data: permissionValidationResponse } = useValidateUserPermissionsNonSuspense(MANAGE_TEAM_PERMISSIONS);\n const canAssignRole = permissionValidationResponse?.some((permission) => permission.allowed);\n\n const handleClick = () => {\n const path = buildWizardPath({ from, users: presetUsername });\n navigate(path);\n };\n\n return (\n canAssignRole ? (\n <Button\n iconBefore={Plus}\n onClick={handleClick}\n >\n {intl.formatMessage(baseMessages['authz.management.assign.role.title'])}\n </Button>\n ) : null);\n};\n\nexport default AddRoleButton;\n"]}
@@ -0,0 +1,2 @@
1
+ declare const AnchorButton: () => import("react").JSX.Element | null;
2
+ export default AnchorButton;
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useIntl } from '@openedx/frontend-base';
3
+ import { ArrowUpward } from '@openedx/paragon/icons';
4
+ import { IconButton } from '@openedx/paragon';
5
+ import { useState, useEffect } from 'react';
6
+ import messages from './messages';
7
+ const AnchorButton = () => {
8
+ const [isVisible, setIsVisible] = useState(false);
9
+ const intl = useIntl();
10
+ const scrollToTopButton = () => {
11
+ window.scrollTo({
12
+ top: 0,
13
+ behavior: 'smooth',
14
+ });
15
+ };
16
+ useEffect(() => {
17
+ const handleScroll = () => {
18
+ const scrollTop = window.scrollY;
19
+ setIsVisible(scrollTop > 300);
20
+ };
21
+ window.addEventListener('scroll', handleScroll);
22
+ return () => {
23
+ window.removeEventListener('scroll', handleScroll);
24
+ };
25
+ }, []);
26
+ if (!isVisible) {
27
+ return null;
28
+ }
29
+ return (_jsx(IconButton, { isActive: true, src: ArrowUpward, alt: intl.formatMessage(messages['authz.anchor.button.alt']), onClick: scrollToTopButton, variant: "primary", className: "mr-2 mb-2 fixed-bottom float-right", style: {
30
+ bottom: '20px',
31
+ left: 'calc(100% - 70px)',
32
+ } }));
33
+ };
34
+ export default AnchorButton;
35
+ //# sourceMappingURL=AnchorButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnchorButton.js","sourceRoot":"","sources":["../../../src/authz-module/components/AnchorButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,YAAY,GAAG,GAAG,EAAE;IACxB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,MAAM,CAAC,QAAQ,CAAC;YACd,GAAG,EAAE,CAAC;YACN,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC;YACjC,YAAY,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACrD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,KAAC,UAAU,IACT,QAAQ,QACR,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,EAC5D,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,oCAAoC,EAC9C,KAAK,EAAE;YACL,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,mBAAmB;SAC1B,GACD,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport { ArrowUpward } from '@openedx/paragon/icons';\nimport { IconButton } from '@openedx/paragon';\nimport { useState, useEffect } from 'react';\nimport messages from './messages';\n\nconst AnchorButton = () => {\n const [isVisible, setIsVisible] = useState(false);\n const intl = useIntl();\n const scrollToTopButton = () => {\n window.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n };\n\n useEffect(() => {\n const handleScroll = () => {\n const scrollTop = window.scrollY;\n setIsVisible(scrollTop > 300);\n };\n\n window.addEventListener('scroll', handleScroll);\n return () => {\n window.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n if (!isVisible) {\n return null;\n }\n\n return (\n <IconButton\n isActive\n src={ArrowUpward}\n alt={intl.formatMessage(messages['authz.anchor.button.alt'])}\n onClick={scrollToTopButton}\n variant=\"primary\"\n className=\"mr-2 mb-2 fixed-bottom float-right\"\n style={{\n bottom: '20px',\n left: 'calc(100% - 70px)',\n }}\n />\n );\n};\n\nexport default AnchorButton;\n"]}
@@ -0,0 +1,12 @@
1
+ import { ReactNode } from 'react';
2
+ import { AuthZTitleProps } from './AuthZTitle';
3
+ interface AuthZLayoutProps extends AuthZTitleProps {
4
+ children: ReactNode;
5
+ context: {
6
+ id: string;
7
+ org: string;
8
+ title: string;
9
+ };
10
+ }
11
+ declare const AuthZLayout: ({ children, ...props }: AuthZLayoutProps) => import("react").JSX.Element;
12
+ export default AuthZLayout;
@@ -0,0 +1,19 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import AuthZTitle from './AuthZTitle';
14
+ const AuthZLayout = (_a) => {
15
+ var { children } = _a, props = __rest(_a, ["children"]);
16
+ return (_jsxs(_Fragment, { children: [_jsx(AuthZTitle, Object.assign({}, props)), children] }));
17
+ };
18
+ export default AuthZLayout;
19
+ //# sourceMappingURL=AuthZLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthZLayout.js","sourceRoot":"","sources":["../../../src/authz-module/components/AuthZLayout.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,UAA+B,MAAM,cAAc,CAAC;AAW3D,MAAM,WAAW,GAAG,CAAC,EAAwC,EAAE,EAAE;QAA5C,EAAE,QAAQ,OAA8B,EAAzB,KAAK,cAApB,YAAsB,CAAF;IAAyB,OAAA,CAChE,8BACE,KAAC,UAAU,oBAAK,KAAK,EAAI,EACxB,QAAQ,IACR,CAEJ,CAAA;CAAA,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import { ReactNode } from 'react';\nimport AuthZTitle, { AuthZTitleProps } from './AuthZTitle';\n\ninterface AuthZLayoutProps extends AuthZTitleProps {\n children: ReactNode;\n context: {\n id: string;\n org: string;\n title: string;\n };\n}\n\nconst AuthZLayout = ({ children, ...props }: AuthZLayoutProps) => (\n <>\n <AuthZTitle {...props} />\n {children}\n </>\n\n);\n\nexport default AuthZLayout;\n"]}
@@ -0,0 +1,20 @@
1
+ import { ComponentType, ReactNode } from 'react';
2
+ interface BreadcrumbLink {
3
+ label: string;
4
+ to?: string;
5
+ }
6
+ interface Action {
7
+ label: string;
8
+ icon?: ComponentType;
9
+ onClick: () => void;
10
+ }
11
+ export interface AuthZTitleProps {
12
+ activeLabel?: string;
13
+ pageTitle: string;
14
+ pageSubtitle: string | ReactNode;
15
+ navLinks?: BreadcrumbLink[];
16
+ actions?: (Action | ReactNode)[];
17
+ }
18
+ export declare const ActionButton: ({ label, icon, onClick }: Action) => import("react").JSX.Element;
19
+ declare const AuthZTitle: ({ activeLabel, navLinks, pageTitle, pageSubtitle, actions, }: AuthZTitleProps) => import("react").JSX.Element;
20
+ export default AuthZTitle;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { isValidElement, Fragment, } from 'react';
3
+ import { Link } from 'react-router-dom';
4
+ import { Breadcrumb, Col, Container, Row, Button, Stack, useMediaQuery, breakpoints, } from '@openedx/paragon';
5
+ export const ActionButton = ({ label, icon, onClick }) => (_jsx(Button, { iconBefore: icon, onClick: onClick, children: label }));
6
+ const AuthZTitle = ({ activeLabel, navLinks = [], pageTitle, pageSubtitle, actions = [], }) => {
7
+ const isDesktop = useMediaQuery({ minWidth: breakpoints.large.minWidth });
8
+ return (_jsxs(Container, { className: "p-5 bg-light-100", children: [_jsx(Breadcrumb, { linkAs: Link, links: navLinks, activeLabel: activeLabel }), _jsxs(Row, { className: "mt-4", children: [_jsx(Col, { xs: 12, md: 7, className: "mb-4", children: _jsxs("div", { className: "d-flex align-items-center flex-column-sm", children: [_jsx("h2", { className: "text-primary mb-0", children: pageTitle }), typeof pageSubtitle === 'string'
9
+ ? _jsxs(_Fragment, { children: [" ", pageSubtitle !== '' && _jsx("hr", { className: "mx-lg-3" }), _jsx("h3", { className: "mb-0 py-2 font-weight-light text-gray-700", children: pageSubtitle })] })
10
+ : _jsxs(_Fragment, { children: [pageSubtitle !== '' && _jsx("hr", { className: "mx-lg-3" }), " ", _jsx("div", { className: "mb-0", children: pageSubtitle })] })] }) }), _jsx(Col, { xs: 12, md: 5, children: _jsx(Stack, { className: "justify-content-end", direction: isDesktop ? 'horizontal' : 'vertical', children: actions.map((action, index) => {
11
+ const content = isValidElement(action)
12
+ ? action
13
+ : _jsx(ActionButton, Object.assign({}, action));
14
+ const key = isValidElement(action)
15
+ ? action.key
16
+ : action.label;
17
+ return (_jsxs(Fragment, { children: [content, (index === actions.length - 1) ? null
18
+ : (_jsx("hr", { className: "mx-lg-5" }))] }, `authz-header-action-${key}`));
19
+ }) }) })] })] }));
20
+ };
21
+ export default AuthZTitle;
22
+ //# sourceMappingURL=AuthZTitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthZTitle.js","sourceRoot":"","sources":["../../../src/authz-module/components/AuthZTitle.tsx"],"names":[],"mappings":";AAAA,OAAO,EACU,cAAc,EAAa,QAAQ,GACnD,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EACL,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EACvC,KAAK,EACL,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAqB1B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAU,EAAE,EAAE,CAAC,CAChE,KAAC,MAAM,IACL,UAAU,EAAE,IAAI,EAChB,OAAO,EAAE,OAAO,YAEf,KAAK,GACC,CACV,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,EAClB,WAAW,EAAE,QAAQ,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,GAAG,EAAE,GACjD,EAAE,EAAE;IACpB,MAAM,SAAS,GAAG,aAAa,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1E,OAAO,CACL,MAAC,SAAS,IAAC,SAAS,EAAC,kBAAkB,aACrC,KAAC,UAAU,IACT,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,WAAW,GACxB,EACF,MAAC,GAAG,IAAC,SAAS,EAAC,MAAM,aACnB,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAC,MAAM,YAClC,eAAK,SAAS,EAAC,0CAA0C,aACvD,aAAI,SAAS,EAAC,mBAAmB,YAAE,SAAS,GAAM,EACjD,OAAO,YAAY,KAAK,QAAQ;oCAC/B,CAAC,CAAC,mCAAK,YAAY,KAAK,EAAE,IAAI,aAAI,SAAS,EAAC,SAAS,GAAG,EAAE,aAAI,SAAS,EAAC,2CAA2C,YAAE,YAAY,GAAM,IAAG;oCAC1I,CAAC,CAAC,8BAAI,YAAY,KAAK,EAAE,IAAI,aAAI,SAAS,EAAC,SAAS,GAAG,OAAG,cAAK,SAAS,EAAC,MAAM,YAAE,YAAY,GAAO,IAAG,IAErG,GACF,EACN,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,YAChB,KAAC,KAAK,IAAC,SAAS,EAAC,qBAAqB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,YAEnF,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gCAC5B,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC;oCACpC,CAAC,CAAC,MAAM;oCACR,CAAC,CAAC,KAAC,YAAY,oBAAK,MAAgB,EAAI,CAAC;gCAC3C,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC;oCAChC,CAAC,CAAC,MAAM,CAAC,GAAG;oCACZ,CAAC,CAAE,MAAiB,CAAC,KAAK,CAAC;gCAC7B,OAAO,CACL,MAAC,QAAQ,eACN,OAAO,EACP,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;4CACpC,CAAC,CAAC,CAAC,aAAI,SAAS,EAAC,SAAS,GAAG,CAAC,KAHnB,uBAAuB,GAAG,EAAE,CAIhC,CACZ,CAAC;4BACJ,CAAC,CAAC,GAEE,GACJ,IACF,IACI,CACb,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import {\n ComponentType, isValidElement, ReactNode, Fragment,\n} from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n Breadcrumb, Col, Container, Row, Button,\n Stack,\n useMediaQuery,\n breakpoints,\n} from '@openedx/paragon';\n\ninterface BreadcrumbLink {\n label: string;\n to?: string;\n}\n\ninterface Action {\n label: string;\n icon?: ComponentType;\n onClick: () => void;\n}\n\nexport interface AuthZTitleProps {\n activeLabel?: string;\n pageTitle: string;\n pageSubtitle: string | ReactNode;\n navLinks?: BreadcrumbLink[];\n actions?: (Action | ReactNode)[];\n}\n\nexport const ActionButton = ({ label, icon, onClick }: Action) => (\n <Button\n iconBefore={icon}\n onClick={onClick}\n >\n {label}\n </Button>\n);\n\nconst AuthZTitle = ({\n activeLabel, navLinks = [], pageTitle, pageSubtitle, actions = [],\n}: AuthZTitleProps) => {\n const isDesktop = useMediaQuery({ minWidth: breakpoints.large.minWidth });\n return (\n <Container className=\"p-5 bg-light-100\">\n <Breadcrumb\n linkAs={Link}\n links={navLinks}\n activeLabel={activeLabel}\n />\n <Row className=\"mt-4\">\n <Col xs={12} md={7} className=\"mb-4\">\n <div className=\"d-flex align-items-center flex-column-sm\">\n <h2 className=\"text-primary mb-0\">{pageTitle}</h2>\n {typeof pageSubtitle === 'string'\n ? <> { pageSubtitle !== '' && <hr className=\"mx-lg-3\" /> }<h3 className=\"mb-0 py-2 font-weight-light text-gray-700\">{pageSubtitle}</h3></>\n : <>{ pageSubtitle !== '' && <hr className=\"mx-lg-3\" /> } <div className=\"mb-0\">{pageSubtitle}</div></>}\n\n </div>\n </Col>\n <Col xs={12} md={5}>\n <Stack className=\"justify-content-end\" direction={isDesktop ? 'horizontal' : 'vertical'}>\n {\n actions.map((action, index) => {\n const content = isValidElement(action)\n ? action\n : <ActionButton {...action as Action} />;\n const key = isValidElement(action)\n ? action.key\n : (action as Action).label;\n return (\n <Fragment key={`authz-header-action-${key}`}>\n {content}\n {(index === actions.length - 1) ? null\n : (<hr className=\"mx-lg-5\" />)}\n </Fragment>\n );\n })\n }\n </Stack>\n </Col>\n </Row>\n </Container>\n );\n};\n\nexport default AuthZTitle;\n"]}
@@ -0,0 +1,15 @@
1
+ interface ConfirmDeletionModalProps {
2
+ isOpen: boolean;
3
+ close: () => void;
4
+ onSave: () => void;
5
+ isDeleting?: boolean;
6
+ context: {
7
+ userName: string;
8
+ scope: string;
9
+ role: string;
10
+ name?: string;
11
+ rolesCount: number;
12
+ };
13
+ }
14
+ declare const ConfirmDeletionModal: ({ isOpen, close, onSave, isDeleting, context, }: ConfirmDeletionModalProps) => import("react").JSX.Element;
15
+ export default ConfirmDeletionModal;
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ActionRow, AlertModal, Icon, ModalDialog, Stack, StatefulButton, } from '@openedx/paragon';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import { SpinnerSimple } from '@openedx/paragon/icons';
5
+ import messages from './messages';
6
+ const ConfirmDeletionModal = ({ isOpen, close, onSave, isDeleting, context, }) => {
7
+ var _a;
8
+ const intl = useIntl();
9
+ return (_jsx(AlertModal, { title: intl.formatMessage(messages['authz.team.remove.user.modal.title']), isOpen: isOpen, onClose: close, size: "lg", footerNode: (_jsxs(ActionRow, { children: [_jsx(ModalDialog.CloseButton, { variant: "tertiary", children: intl.formatMessage(messages['authz.manage.cancel.button']) }), _jsx(StatefulButton, { className: "px-4", variant: "danger", labels: {
10
+ default: intl.formatMessage(messages['authz.manage.remove.button']),
11
+ pending: intl.formatMessage(messages['authz.manage.removing.button']),
12
+ }, icons: {
13
+ pending: _jsx(Icon, { src: SpinnerSimple }),
14
+ }, state: isDeleting ? 'pending' : 'default', onClick: () => onSave(), disabledStates: ['pending'] })] })), isOverflowVisible: false, children: _jsxs(Stack, { gap: 3, children: [_jsx("p", { children: intl.formatMessage(messages['authz.team.remove.user.modal.body.1'], {
15
+ userName: context.userName,
16
+ scope: context.scope,
17
+ role: (_a = context.name) !== null && _a !== void 0 ? _a : context.role,
18
+ }) }), context.rolesCount === 1 && (_jsx("p", { children: intl.formatMessage(messages['authz.team.remove.user.modal.body.2']) })), _jsx("p", { children: intl.formatMessage(messages['authz.team.remove.user.modal.body.3']) })] }) }));
19
+ };
20
+ export default ConfirmDeletionModal;
21
+ //# sourceMappingURL=ConfirmDeletionModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDeletionModal.js","sourceRoot":"","sources":["../../../src/authz-module/components/ConfirmDeletionModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAC/C,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAgBlC,MAAM,oBAAoB,GAAG,CAAC,EAC5B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAChB,EAAE,EAAE;;IAC9B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,CACL,KAAC,UAAU,IACT,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC,EACzE,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,KAAK,EACd,IAAI,EAAC,IAAI,EACT,UAAU,EAAE,CACV,MAAC,SAAS,eACR,KAAC,WAAW,CAAC,WAAW,IAAC,OAAO,EAAC,UAAU,YACxC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,GACnC,EAC1B,KAAC,cAAc,IACb,SAAS,EAAC,MAAM,EAChB,OAAO,EAAC,QAAQ,EAChB,MAAM,EAAE;wBACN,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;wBACnE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;qBACtE,EACD,KAAK,EAAE;wBACL,OAAO,EAAE,KAAC,IAAI,IAAC,GAAG,EAAE,aAAa,GAAI;qBACtC,EACD,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACzC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EACvB,cAAc,EAAE,CAAC,SAAS,CAAC,GAC3B,IACQ,CACb,EACD,iBAAiB,EAAE,KAAK,YAExB,MAAC,KAAK,IAAC,GAAG,EAAE,CAAC,aACX,sBAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE;wBACtE,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,IAAI,EAAE,MAAA,OAAO,CAAC,IAAI,mCAAI,OAAO,CAAC,IAAI;qBACnC,CAAC,GACE,EACH,OAAO,CAAC,UAAU,KAAK,CAAC,IAAI,CAC3B,sBAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CAAC,GAAK,CAC7E,EACD,sBAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CAAC,GAAK,IACtE,GAEG,CACd,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,oBAAoB,CAAC","sourcesContent":["import {\n ActionRow, AlertModal, Icon, ModalDialog, Stack,\n StatefulButton,\n} from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport { SpinnerSimple } from '@openedx/paragon/icons';\nimport messages from './messages';\n\ninterface ConfirmDeletionModalProps {\n isOpen: boolean;\n close: () => void;\n onSave: () => void;\n isDeleting?: boolean;\n context: {\n userName: string;\n scope: string;\n role: string;\n name?: string;\n rolesCount: number;\n };\n}\n\nconst ConfirmDeletionModal = ({\n isOpen, close, onSave, isDeleting, context,\n}: ConfirmDeletionModalProps) => {\n const intl = useIntl();\n return (\n <AlertModal\n title={intl.formatMessage(messages['authz.team.remove.user.modal.title'])}\n isOpen={isOpen}\n onClose={close}\n size=\"lg\"\n footerNode={(\n <ActionRow>\n <ModalDialog.CloseButton variant=\"tertiary\">\n {intl.formatMessage(messages['authz.manage.cancel.button'])}\n </ModalDialog.CloseButton>\n <StatefulButton\n className=\"px-4\"\n variant=\"danger\"\n labels={{\n default: intl.formatMessage(messages['authz.manage.remove.button']),\n pending: intl.formatMessage(messages['authz.manage.removing.button']),\n }}\n icons={{\n pending: <Icon src={SpinnerSimple} />,\n }}\n state={isDeleting ? 'pending' : 'default'}\n onClick={() => onSave()}\n disabledStates={['pending']}\n />\n </ActionRow>\n )}\n isOverflowVisible={false}\n >\n <Stack gap={3}>\n <p>{intl.formatMessage(messages['authz.team.remove.user.modal.body.1'], {\n userName: context.userName,\n scope: context.scope,\n role: context.name ?? context.role,\n })}\n </p>\n {context.rolesCount === 1 && (\n <p>{intl.formatMessage(messages['authz.team.remove.user.modal.body.2'])}</p>\n )}\n <p>{intl.formatMessage(messages['authz.team.remove.user.modal.body.3'])}</p>\n </Stack>\n\n </AlertModal>\n );\n};\n\nexport default ConfirmDeletionModal;\n"]}
@@ -0,0 +1,3 @@
1
+ import { FallbackProps } from 'react-error-boundary';
2
+ declare const ErrorFallback: (props: FallbackProps) => import("react").JSX.Element;
3
+ export default ErrorFallback;
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { getUrlByRouteRole, useIntl } from '@openedx/frontend-base';
4
+ import { Button, Container, Hyperlink, Row, } from '@openedx/paragon';
5
+ import { CustomErrors, ERROR_STATUS, STATUS_400, STATUS_404, } from '../../../constants';
6
+ import { getHttpErrorStatus } from '../../../data/utils';
7
+ import messages from './messages';
8
+ const getErrorConfig = ({ errorMessage, errorStatus }) => {
9
+ if (errorMessage === CustomErrors.NO_ACCESS || ERROR_STATUS.NO_ACCESS.includes(errorStatus)) {
10
+ return ({
11
+ title: messages['error.page.title.noAccess'],
12
+ description: messages['error.page.message.noAccess'],
13
+ statusCode: errorStatus || ERROR_STATUS.NO_ACCESS[0],
14
+ showBackButton: true,
15
+ });
16
+ }
17
+ // 400 errors are handled as 404 Not Found to avoid exposing potential sensitive information
18
+ // about the existence of resources and handling malformed library ids in the URL
19
+ if (errorMessage === CustomErrors.NOT_FOUND || ERROR_STATUS.NOT_FOUND.includes(errorStatus)) {
20
+ const statusCode = errorStatus === STATUS_400 ? STATUS_404 : errorStatus;
21
+ return ({
22
+ title: messages['error.page.title.notFound'],
23
+ description: messages['error.page.message.notFound'],
24
+ statusCode: statusCode || STATUS_404,
25
+ showBackButton: true,
26
+ });
27
+ }
28
+ if (errorMessage === CustomErrors.SERVER_ERROR || ERROR_STATUS.SERVER_ERROR.includes(errorStatus)) {
29
+ return ({
30
+ title: messages['error.page.title.server'],
31
+ description: messages['error.page.message.server'],
32
+ statusCode: errorStatus || ERROR_STATUS.SERVER_ERROR[0],
33
+ showBackButton: true,
34
+ showReloadButton: true,
35
+ });
36
+ }
37
+ return ({
38
+ title: messages['error.page.title.generic'],
39
+ description: messages['error.page.message.generic'],
40
+ showBackButton: true,
41
+ showReloadButton: true,
42
+ });
43
+ };
44
+ const ErrorPage = ({ error, resetErrorBoundary }) => {
45
+ var _a;
46
+ const intl = useIntl();
47
+ const [reloading, setReloading] = useState(false);
48
+ const errorStatus = getHttpErrorStatus(error);
49
+ const errorMessage = error === null || error === void 0 ? void 0 : error.message;
50
+ const { title, description, statusCode, showBackButton, showReloadButton, } = getErrorConfig({ errorMessage, errorStatus });
51
+ const handleReload = () => {
52
+ setReloading(true);
53
+ resetErrorBoundary();
54
+ };
55
+ return (_jsxs(Container, { className: "d-flex flex-column align-items-center justify-content-center min-vh-100 bg-light-200", children: [_jsx("h1", { className: "display-4 text-primary-200", children: statusCode }), _jsx("h1", { className: "text-primary", children: intl.formatMessage(title) }), _jsx("p", { children: intl.formatMessage(description) }), _jsxs(Row, { children: [showReloadButton && (_jsx(Button, { className: "m-2", disabled: reloading, onClick: handleReload, children: intl.formatMessage(messages['error.page.action.reload']) })), showBackButton && (_jsx(Button, { as: Hyperlink, destination: (_a = getUrlByRouteRole('org.openedx.frontend.role.courseAuthoring')) !== null && _a !== void 0 ? _a : undefined, className: "m-2", variant: showReloadButton ? 'outline-primary' : 'primary', children: intl.formatMessage(messages['error.page.action.back']) }))] })] }));
56
+ };
57
+ const ErrorFallback = (props) => _jsx(ErrorPage, Object.assign({}, props));
58
+ export default ErrorFallback;
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/authz-module/components/ErrorPage/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from 'react';\nimport { FallbackProps } from 'react-error-boundary';\nimport { getUrlByRouteRole, useIntl } from '@openedx/frontend-base';\nimport {\n Button, Container, Hyperlink, Row,\n} from '@openedx/paragon';\nimport {\n CustomErrors, ERROR_STATUS, STATUS_400, STATUS_404,\n} from '@src/constants';\nimport { getHttpErrorStatus } from '@src/data/utils';\n\nimport messages from './messages';\n\nconst getErrorConfig = ({ errorMessage, errorStatus }) => {\n if (errorMessage === CustomErrors.NO_ACCESS || ERROR_STATUS.NO_ACCESS.includes(errorStatus)) {\n return ({\n title: messages['error.page.title.noAccess'],\n description: messages['error.page.message.noAccess'],\n statusCode: errorStatus || ERROR_STATUS.NO_ACCESS[0],\n showBackButton: true,\n });\n }\n // 400 errors are handled as 404 Not Found to avoid exposing potential sensitive information\n // about the existence of resources and handling malformed library ids in the URL\n if (errorMessage === CustomErrors.NOT_FOUND || ERROR_STATUS.NOT_FOUND.includes(errorStatus)) {\n const statusCode = errorStatus === STATUS_400 ? STATUS_404 : errorStatus;\n return ({\n title: messages['error.page.title.notFound'],\n description: messages['error.page.message.notFound'],\n statusCode: statusCode || STATUS_404,\n showBackButton: true,\n });\n }\n if (errorMessage === CustomErrors.SERVER_ERROR || ERROR_STATUS.SERVER_ERROR.includes(errorStatus)) {\n return ({\n title: messages['error.page.title.server'],\n description: messages['error.page.message.server'],\n statusCode: errorStatus || ERROR_STATUS.SERVER_ERROR[0],\n showBackButton: true,\n showReloadButton: true,\n });\n }\n return ({\n title: messages['error.page.title.generic'],\n description: messages['error.page.message.generic'],\n showBackButton: true,\n showReloadButton: true,\n });\n};\n\nconst ErrorPage = ({ error, resetErrorBoundary }: FallbackProps) => {\n const intl = useIntl();\n const [reloading, setReloading] = useState(false);\n\n const errorStatus = getHttpErrorStatus(error);\n const errorMessage: string = error?.message;\n const {\n title, description, statusCode, showBackButton, showReloadButton,\n } = getErrorConfig({ errorMessage, errorStatus });\n\n const handleReload = () => {\n setReloading(true);\n resetErrorBoundary();\n };\n return (\n <Container className=\"d-flex flex-column align-items-center justify-content-center min-vh-100 bg-light-200\">\n <h1 className=\"display-4 text-primary-200\">{statusCode}</h1>\n <h1 className=\"text-primary\">{intl.formatMessage(title)}</h1>\n <p>{intl.formatMessage(description)}</p>\n <Row>\n {showReloadButton && (\n <Button\n className=\"m-2\"\n disabled={reloading}\n onClick={handleReload}\n >\n {intl.formatMessage(messages['error.page.action.reload'])}\n </Button>\n )}\n {showBackButton && (\n <Button\n as={Hyperlink}\n destination={getUrlByRouteRole('org.openedx.frontend.role.courseAuthoring') ?? undefined}\n className=\"m-2\"\n variant={showReloadButton ? 'outline-primary' : 'primary'}\n >\n {intl.formatMessage(messages['error.page.action.back'])}\n </Button>\n )}\n\n </Row>\n </Container>\n );\n};\n\nconst ErrorFallback = (props: FallbackProps) => <ErrorPage {...props} />;\nexport default ErrorFallback;\n"]}
@@ -0,0 +1,53 @@
1
+ declare const messages: {
2
+ 'error.page.title.noAccess': {
3
+ id: string;
4
+ defaultMessage: string;
5
+ description: string;
6
+ };
7
+ 'error.page.message.noAccess': {
8
+ id: string;
9
+ defaultMessage: string;
10
+ description: string;
11
+ };
12
+ 'error.page.title.notFound': {
13
+ id: string;
14
+ defaultMessage: string;
15
+ description: string;
16
+ };
17
+ 'error.page.message.notFound': {
18
+ id: string;
19
+ defaultMessage: string;
20
+ description: string;
21
+ };
22
+ 'error.page.title.server': {
23
+ id: string;
24
+ defaultMessage: string;
25
+ description: string;
26
+ };
27
+ 'error.page.message.server': {
28
+ id: string;
29
+ defaultMessage: string;
30
+ description: string;
31
+ };
32
+ 'error.page.title.generic': {
33
+ id: string;
34
+ defaultMessage: string;
35
+ description: string;
36
+ };
37
+ 'error.page.message.generic': {
38
+ id: string;
39
+ defaultMessage: string;
40
+ description: string;
41
+ };
42
+ 'error.page.action.reload': {
43
+ id: string;
44
+ defaultMessage: string;
45
+ description: string;
46
+ };
47
+ 'error.page.action.back': {
48
+ id: string;
49
+ defaultMessage: string;
50
+ description: string;
51
+ };
52
+ };
53
+ export default messages;
@@ -0,0 +1,55 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+ const messages = defineMessages({
3
+ 'error.page.title.noAccess': {
4
+ id: 'error.page.tile.noAccess',
5
+ defaultMessage: 'Access Denied',
6
+ description: 'Title error when user does not have access to view',
7
+ },
8
+ 'error.page.message.noAccess': {
9
+ id: 'error.page.message.noAccess',
10
+ defaultMessage: 'You do not have permission to view this page.',
11
+ description: 'Error message when user does not have access to view',
12
+ },
13
+ 'error.page.title.notFound': {
14
+ id: 'error.page.tile.notFound',
15
+ defaultMessage: 'Page Not Found',
16
+ description: 'Error the resource is not found',
17
+ },
18
+ 'error.page.message.notFound': {
19
+ id: 'error.page.message.notFound',
20
+ defaultMessage: 'The resource you are looking for could not be found.',
21
+ description: 'Error message when the resource is not found',
22
+ },
23
+ 'error.page.title.server': {
24
+ id: 'error.page.tile.server',
25
+ defaultMessage: 'Something went wrong',
26
+ description: 'Title for server error',
27
+ },
28
+ 'error.page.message.server': {
29
+ id: 'error.page.message.server.error',
30
+ defaultMessage: 'We\'re experiencing an internal server problem. Please try again later',
31
+ description: 'Server error message for unexpected errors',
32
+ },
33
+ 'error.page.title.generic': {
34
+ id: 'error.page.tile.generic',
35
+ defaultMessage: 'Something went wrong',
36
+ description: 'Title for unexpected error',
37
+ },
38
+ 'error.page.message.generic': {
39
+ id: 'error.page.message.server',
40
+ defaultMessage: 'An unexpected error occurred. Please click the button below to refresh the page.',
41
+ description: 'Error message for unexpected errors',
42
+ },
43
+ 'error.page.action.reload': {
44
+ id: 'error.page.action.reload',
45
+ defaultMessage: 'Reload Page',
46
+ description: 'Label for reload action',
47
+ },
48
+ 'error.page.action.back': {
49
+ id: 'error.page.action.back',
50
+ defaultMessage: 'Back to Studio',
51
+ description: 'Label for return to Studio action',
52
+ },
53
+ });
54
+ export default messages;
55
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/authz-module/components/ErrorPage/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,2BAA2B,EAAE;QAC3B,EAAE,EAAE,0BAA0B;QAC9B,cAAc,EAAE,eAAe;QAC/B,WAAW,EAAE,oDAAoD;KAClE;IACD,6BAA6B,EAAE;QAC7B,EAAE,EAAE,6BAA6B;QACjC,cAAc,EAAE,+CAA+C;QAC/D,WAAW,EAAE,sDAAsD;KACpE;IACD,2BAA2B,EAAE;QAC3B,EAAE,EAAE,0BAA0B;QAC9B,cAAc,EAAE,gBAAgB;QAChC,WAAW,EAAE,iCAAiC;KAC/C;IACD,6BAA6B,EAAE;QAC7B,EAAE,EAAE,6BAA6B;QACjC,cAAc,EAAE,sDAAsD;QACtE,WAAW,EAAE,8CAA8C;KAC5D;IACD,yBAAyB,EAAE;QACzB,EAAE,EAAE,wBAAwB;QAC5B,cAAc,EAAE,sBAAsB;QACtC,WAAW,EAAE,wBAAwB;KACtC;IACD,2BAA2B,EAAE;QAC3B,EAAE,EAAE,iCAAiC;QACrC,cAAc,EAAE,wEAAwE;QACxF,WAAW,EAAE,4CAA4C;KAC1D;IACD,0BAA0B,EAAE;QAC1B,EAAE,EAAE,yBAAyB;QAC7B,cAAc,EAAE,sBAAsB;QACtC,WAAW,EAAE,4BAA4B;KAC1C;IACD,4BAA4B,EAAE;QAC5B,EAAE,EAAE,2BAA2B;QAC/B,cAAc,EAAE,kFAAkF;QAClG,WAAW,EAAE,qCAAqC;KACnD;IACD,0BAA0B,EAAE;QAC1B,EAAE,EAAE,0BAA0B;QAC9B,cAAc,EAAE,aAAa;QAC7B,WAAW,EAAE,yBAAyB;KACvC;IACD,wBAAwB,EAAE;QACxB,EAAE,EAAE,wBAAwB;QAC5B,cAAc,EAAE,gBAAgB;QAChC,WAAW,EAAE,mCAAmC;KACjD;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n 'error.page.title.noAccess': {\n id: 'error.page.tile.noAccess',\n defaultMessage: 'Access Denied',\n description: 'Title error when user does not have access to view',\n },\n 'error.page.message.noAccess': {\n id: 'error.page.message.noAccess',\n defaultMessage: 'You do not have permission to view this page.',\n description: 'Error message when user does not have access to view',\n },\n 'error.page.title.notFound': {\n id: 'error.page.tile.notFound',\n defaultMessage: 'Page Not Found',\n description: 'Error the resource is not found',\n },\n 'error.page.message.notFound': {\n id: 'error.page.message.notFound',\n defaultMessage: 'The resource you are looking for could not be found.',\n description: 'Error message when the resource is not found',\n },\n 'error.page.title.server': {\n id: 'error.page.tile.server',\n defaultMessage: 'Something went wrong',\n description: 'Title for server error',\n },\n 'error.page.message.server': {\n id: 'error.page.message.server.error',\n defaultMessage: 'We\\'re experiencing an internal server problem. Please try again later',\n description: 'Server error message for unexpected errors',\n },\n 'error.page.title.generic': {\n id: 'error.page.tile.generic',\n defaultMessage: 'Something went wrong',\n description: 'Title for unexpected error',\n },\n 'error.page.message.generic': {\n id: 'error.page.message.server',\n defaultMessage: 'An unexpected error occurred. Please click the button below to refresh the page.',\n description: 'Error message for unexpected errors',\n },\n 'error.page.action.reload': {\n id: 'error.page.action.reload',\n defaultMessage: 'Reload Page',\n description: 'Label for reload action',\n },\n 'error.page.action.back': {\n id: 'error.page.action.back',\n defaultMessage: 'Back to Studio',\n description: 'Label for return to Studio action',\n },\n});\n\nexport default messages;\n"]}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { PermissionsResourceGrouped, Role } from '../../types';
3
+ interface PermissionTableProps {
4
+ roles: Role[];
5
+ permissionsTable: PermissionsResourceGrouped[];
6
+ title?: string;
7
+ }
8
+ declare const PermissionTable: ({ permissionsTable, roles, title }: PermissionTableProps) => React.JSX.Element;
9
+ export default PermissionTable;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import { Check, Close } from '@openedx/paragon/icons';
5
+ import { Card, Icon, OverlayTrigger, Tooltip, } from '@openedx/paragon';
6
+ import { actionsDictionary } from './RoleCard/constants';
7
+ import ResourceTooltip from './ResourceTooltip';
8
+ import messages from './messages';
9
+ const PermissionTable = ({ permissionsTable, roles, title }) => {
10
+ const { formatMessage } = useIntl();
11
+ return (_jsx(Card, { children: _jsxs("table", { className: "permission-table w-100", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { className: "sticky-top bg-white px-4 py-3", children: title }), roles.map(role => (_jsx("th", { className: `text-center py-3 sticky-top bg-white ${role.disabled ? 'text-gray-200' : ''}`, children: role.disabled ? (_jsx(OverlayTrigger, { placement: "top", overlay: (_jsx(Tooltip, { id: `tooltip-${role.name}`, variant: "light", children: formatMessage(messages['authz.role.card.permission.for.role.status.disabled']) })), children: _jsx("span", { style: { cursor: 'help' }, children: role.name }) })) : (role.name) }, role.name)))] }) }), _jsx("tbody", { children: permissionsTable.map(resourceGroup => (_jsxs(React.Fragment, { children: [_jsx("tr", { className: "bg-info-100 text-primary", children: _jsx("td", { colSpan: roles.length + 1, className: "text-start py-3 px-4", children: _jsxs("div", { className: "d-flex align-items-center", children: [resourceGroup.icon && _jsx(Icon, { className: "d-inline-block mr-2", size: "xs", src: resourceGroup.icon }), _jsx("strong", { children: resourceGroup.label }), _jsx(ResourceTooltip, { resourceGroup: resourceGroup })] }) }) }), resourceGroup.permissions.map(permission => (_jsxs("tr", { className: "border-top", children: [_jsxs("td", { className: "text-start d-flex align-items-center small px-4 py-3", children: [_jsx(Icon, { className: "d-inline-block mr-2", size: "sm", src: actionsDictionary[permission.actionKey] }), permission.label] }), roles.map(role => (_jsx("td", { className: `text-center ${role.disabled ? 'text-gray-200' : ''}`, children: permission.roles[role.name]
12
+ ? (_jsx(Icon, { className: `d-inline-block ${role.disabled ? 'text-gray-200' : 'text-success'}`, src: Check, "aria-label": formatMessage(messages['authz.role.card.permission.for.role.status.granted'], {
13
+ roleName: role.name,
14
+ }), screenReaderText: formatMessage(messages['authz.role.card.permission.for.role.status.granted'], {
15
+ roleName: role.name,
16
+ }) }))
17
+ : (_jsx(Icon, { className: `d-inline-block ${role.disabled ? 'text-gray-200' : 'text-danger'}`, src: Close, "aria-label": formatMessage(messages['authz.role.card.permission.for.role.status.not.granted'], {
18
+ roleName: role.name,
19
+ }), screenReaderText: formatMessage(messages['authz.role.card.permission.for.role.status.not.granted'], {
20
+ roleName: role.name,
21
+ }) })) }, role.name)))] }, permission.key)))] }, resourceGroup.key))) })] }) }));
22
+ };
23
+ export default PermissionTable;
24
+ //# sourceMappingURL=PermissionTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionTable.js","sourceRoot":"","sources":["../../../src/authz-module/components/PermissionTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Check, Close } from '@openedx/paragon/icons';\nimport {\n Card, Icon, OverlayTrigger, Tooltip,\n} from '@openedx/paragon';\nimport { PermissionsResourceGrouped, Role } from '@src/types';\nimport { actionsDictionary } from './RoleCard/constants';\nimport ResourceTooltip from './ResourceTooltip';\nimport messages from './messages';\n\ninterface PermissionTableProps {\n roles: Role[];\n permissionsTable: PermissionsResourceGrouped[];\n title?: string;\n}\n\nconst PermissionTable = ({ permissionsTable, roles, title }: PermissionTableProps) => {\n const { formatMessage } = useIntl();\n return (\n <Card>\n <table className=\"permission-table w-100\">\n <thead>\n <tr>\n <th className=\"sticky-top bg-white px-4 py-3\">\n {title}\n </th>\n {roles.map(role => (\n <th\n key={role.name}\n className={`text-center py-3 sticky-top bg-white ${role.disabled ? 'text-gray-200' : ''}`}\n >\n {role.disabled ? (\n <OverlayTrigger\n placement=\"top\"\n overlay={(\n <Tooltip\n id={`tooltip-${role.name}`}\n variant=\"light\"\n >\n {formatMessage(messages['authz.role.card.permission.for.role.status.disabled'])}\n </Tooltip>\n )}\n >\n <span style={{ cursor: 'help' }}>{role.name}</span>\n </OverlayTrigger>\n ) : (\n role.name\n )}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {permissionsTable.map(resourceGroup => (\n <React.Fragment key={resourceGroup.key}>\n <tr className=\"bg-info-100 text-primary\">\n <td colSpan={roles.length + 1} className=\"text-start py-3 px-4\">\n <div className=\"d-flex align-items-center\">\n {resourceGroup.icon && <Icon className=\"d-inline-block mr-2\" size=\"xs\" src={resourceGroup.icon} />}\n <strong>{resourceGroup.label}</strong>\n <ResourceTooltip resourceGroup={resourceGroup} />\n </div>\n </td>\n </tr>\n {resourceGroup.permissions.map(permission => (\n <tr key={permission.key} className=\"border-top\">\n <td className=\"text-start d-flex align-items-center small px-4 py-3\">\n <Icon className=\"d-inline-block mr-2\" size=\"sm\" src={actionsDictionary[permission.actionKey]} />\n {permission.label}\n </td>\n {roles.map(role => (\n <td key={role.name} className={`text-center ${role.disabled ? 'text-gray-200' : ''}`}>\n {\n permission.roles[role.name]\n ? (\n <Icon\n className={`d-inline-block ${role.disabled ? 'text-gray-200' : 'text-success'}`}\n src={Check}\n aria-label={formatMessage(messages['authz.role.card.permission.for.role.status.granted'], {\n roleName: role.name,\n })}\n screenReaderText={formatMessage(messages['authz.role.card.permission.for.role.status.granted'], {\n roleName: role.name,\n })}\n />\n )\n : (\n <Icon\n className={`d-inline-block ${role.disabled ? 'text-gray-200' : 'text-danger'}`}\n src={Close}\n aria-label={formatMessage(messages['authz.role.card.permission.for.role.status.not.granted'], {\n roleName: role.name,\n })}\n screenReaderText={formatMessage(messages['authz.role.card.permission.for.role.status.not.granted'], {\n roleName: role.name,\n })}\n />\n )\n }\n </td>\n ))}\n </tr>\n ))}\n </React.Fragment>\n ))}\n </tbody>\n </table>\n </Card>\n );\n};\n\nexport default PermissionTable;\n"]}
@@ -0,0 +1,5 @@
1
+ interface RenderAdminRoleProps {
2
+ role: string;
3
+ }
4
+ declare const RenderAdminRole: ({ role }: RenderAdminRoleProps) => import("react").JSX.Element;
5
+ export default RenderAdminRole;
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useIntl } from '@openedx/frontend-base';
3
+ import messages from '../audit-user/messages';
4
+ const RenderAdminRole = ({ role }) => {
5
+ const intl = useIntl();
6
+ // Determine which message to show based on role
7
+ const messageKey = (role === null || role === void 0 ? void 0 : role.toLowerCase().includes('admin'))
8
+ ? 'authz.user.table.permissions.role.admin'
9
+ : 'authz.user.table.permissions.role.staff';
10
+ return (_jsx("p", { className: "mb-0 text-primary-300 font-weight-light", children: intl.formatMessage(messages[messageKey]) }));
11
+ };
12
+ export default RenderAdminRole;
13
+ //# sourceMappingURL=RenderAdminRole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderAdminRole.js","sourceRoot":"","sources":["../../../src/authz-module/components/RenderAdminRole.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,QAAQ,MAAM,uCAAuC,CAAC;AAM7D,MAAM,eAAe,GAAG,CAAC,EAAE,IAAI,EAAwB,EAAE,EAAE;IACzD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,gDAAgD;IAChD,MAAM,UAAU,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC;QACtD,CAAC,CAAC,yCAAyC;QAC3C,CAAC,CAAC,yCAAyC,CAAC;IAE9C,OAAO,CACL,YAAG,SAAS,EAAC,yCAAyC,YACnD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GACvC,CACL,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport messages from '@src/authz-module/audit-user/messages';\n\ninterface RenderAdminRoleProps {\n role: string;\n}\n\nconst RenderAdminRole = ({ role }: RenderAdminRoleProps) => {\n const intl = useIntl();\n // Determine which message to show based on role\n const messageKey = role?.toLowerCase().includes('admin')\n ? 'authz.user.table.permissions.role.admin'\n : 'authz.user.table.permissions.role.staff';\n\n return (\n <p className=\"mb-0 text-primary-300 font-weight-light\">\n {intl.formatMessage(messages[messageKey])}\n </p>\n );\n};\n\nexport default RenderAdminRole;\n"]}
@@ -0,0 +1,6 @@
1
+ import { PermissionItem } from '../../types';
2
+ interface RenderPermissionColumnProps {
3
+ items: PermissionItem[];
4
+ }
5
+ declare const RenderPermissionColumn: ({ items }: RenderPermissionColumnProps) => import("react").JSX.Element;
6
+ export default RenderPermissionColumn;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Icon } from '@openedx/paragon';
3
+ import ResourceTooltip from './ResourceTooltip';
4
+ const RenderPermissionColumn = ({ items }) => (_jsx(_Fragment, { children: items.map(({ key, icon, label, description, perms, }) => (_jsxs("div", { className: "mb-4 col-12", children: [_jsxs("div", { className: "d-flex align-items-center mb-2", children: [_jsx(Icon, { src: icon, className: "mr-2 text-primary", size: "xs" }), _jsx("h5", { className: "text-primary m-0", children: label }), _jsx(ResourceTooltip, { resourceGroup: {
5
+ key, label, description, permissions: perms,
6
+ } })] }), _jsx("ul", { className: "mb-0 list-unstyled d-flex align-items-center", children: perms.map((perm, index) => (_jsxs("li", { className: `d-flex align-items-center text-primary-400 ${index !== perms.length - 1 ? 'border-right pr-2' : ''} ${index !== 0 ? 'pl-2' : ''}`, children: [_jsx(Icon, { src: perm.icon, className: "mr-2", size: "xs" }), _jsx("span", { className: "text-primary small font-weight-light", children: perm.label })] }, perm.key))) })] }, key))) }));
7
+ export default RenderPermissionColumn;
8
+ //# sourceMappingURL=RenderPermissionColumn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderPermissionColumn.js","sourceRoot":"","sources":["../../../src/authz-module/components/RenderPermissionColumn.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAMhD,MAAM,sBAAsB,GAAG,CAAC,EAAE,KAAK,EAA+B,EAAE,EAAE,CAAC,CACzE,4BACG,KAAK,CAAC,GAAG,CAAC,CAAC,EACV,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,GACrC,EAAE,EAAE,CAAC,CACJ,eAAe,SAAS,EAAC,aAAa,aACpC,eAAK,SAAS,EAAC,gCAAgC,aAC7C,KAAC,IAAI,IAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAC,mBAAmB,EAAC,IAAI,EAAC,IAAI,GAAG,EAC3D,aAAI,SAAS,EAAC,kBAAkB,YAAE,KAAK,GAAM,EAC7C,KAAC,eAAe,IACd,aAAa,EAAE;4BACb,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK;yBAC5C,GACD,IACE,EACN,aAAI,SAAS,EAAC,8CAA8C,YACzD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1B,cAEE,SAAS,EAAE,8CAA8C,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAC5G,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,aAE/B,KAAC,IAAI,IAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,EACnD,eAAM,SAAS,EAAC,sCAAsC,YACnD,IAAI,CAAC,KAAK,GACN,KAPF,IAAI,CAAC,GAAG,CAQV,CACN,CAAC,GACC,KAvBG,GAAG,CAwBP,CACP,CAAC,GACD,CACJ,CAAC;AAEF,eAAe,sBAAsB,CAAC","sourcesContent":["import { Icon } from '@openedx/paragon';\nimport { PermissionItem } from '@src/types';\nimport ResourceTooltip from './ResourceTooltip';\n\ninterface RenderPermissionColumnProps {\n items: PermissionItem[];\n}\n\nconst RenderPermissionColumn = ({ items }: RenderPermissionColumnProps) => (\n <>\n {items.map(({\n key, icon, label, description, perms,\n }) => (\n <div key={key} className=\"mb-4 col-12\">\n <div className=\"d-flex align-items-center mb-2\">\n <Icon src={icon} className=\"mr-2 text-primary\" size=\"xs\" />\n <h5 className=\"text-primary m-0\">{label}</h5>\n <ResourceTooltip\n resourceGroup={{\n key, label, description, permissions: perms,\n }}\n />\n </div>\n <ul className=\"mb-0 list-unstyled d-flex align-items-center\">\n {perms.map((perm, index) => (\n <li\n key={perm.key}\n className={`d-flex align-items-center text-primary-400 ${index !== perms.length - 1 ? 'border-right pr-2' : ''\n } ${index !== 0 ? 'pl-2' : ''}`}\n >\n <Icon src={perm.icon} className=\"mr-2\" size=\"xs\" />\n <span className=\"text-primary small font-weight-light\">\n {perm.label}\n </span>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </>\n);\n\nexport default RenderPermissionColumn;\n"]}