@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,107 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';
11
+ import { getApiUrl } from '../../data/utils';
12
+ export const assignTeamMembersRole = (data) => __awaiter(void 0, void 0, void 0, function* () {
13
+ const res = yield getAuthenticatedHttpClient().put(getApiUrl('/api/authz/v1/roles/users/'), data);
14
+ return camelCaseObject(res.data);
15
+ });
16
+ export const validateUsers = (data) => __awaiter(void 0, void 0, void 0, function* () {
17
+ const res = yield getAuthenticatedHttpClient().post(getApiUrl('/api/authz/v1/users/validate/'), data);
18
+ return camelCaseObject(res.data);
19
+ });
20
+ export const revokeUserRoles = (data) => __awaiter(void 0, void 0, void 0, function* () {
21
+ const url = new URL(getApiUrl('/api/authz/v1/roles/users/'));
22
+ url.searchParams.append('users', data.users);
23
+ url.searchParams.append('role', data.role);
24
+ url.searchParams.append('scope', data.scope);
25
+ // If this is not transformed to string, it shows a 404 with the token CSRF acquisition request
26
+ const res = yield getAuthenticatedHttpClient().delete(url.toString());
27
+ return camelCaseObject(res.data);
28
+ });
29
+ export const getAllRoleAssignments = (querySettings) => __awaiter(void 0, void 0, void 0, function* () {
30
+ const url = new URL(getApiUrl('/api/authz/v1/assignments/'));
31
+ if (querySettings.roles) {
32
+ url.searchParams.set('roles', querySettings.roles);
33
+ }
34
+ if (querySettings.scopes) {
35
+ url.searchParams.set('scopes', querySettings.scopes);
36
+ }
37
+ if (querySettings.organizations) {
38
+ url.searchParams.set('orgs', querySettings.organizations);
39
+ }
40
+ if (querySettings.search) {
41
+ url.searchParams.set('search', querySettings.search);
42
+ }
43
+ if (querySettings.sortBy && querySettings.order) {
44
+ url.searchParams.set('sort_by', querySettings.sortBy);
45
+ url.searchParams.set('order', querySettings.order);
46
+ }
47
+ url.searchParams.set('page_size', querySettings.pageSize.toString());
48
+ url.searchParams.set('page', (querySettings.pageIndex + 1).toString());
49
+ const { data } = yield getAuthenticatedHttpClient().get(url);
50
+ return camelCaseObject(data);
51
+ });
52
+ export const getOrgs = (search, page, pageSize) => __awaiter(void 0, void 0, void 0, function* () {
53
+ const url = new URL(getApiUrl('/api/authz/v1/orgs/'));
54
+ if (search !== undefined) {
55
+ url.searchParams.set('search', search);
56
+ }
57
+ if (page !== undefined) {
58
+ url.searchParams.set('page', page.toString());
59
+ }
60
+ if (pageSize !== undefined) {
61
+ url.searchParams.set('page_size', pageSize.toString());
62
+ }
63
+ const { data } = yield getAuthenticatedHttpClient().get(url);
64
+ return camelCaseObject(data);
65
+ });
66
+ export const getScopes = (params) => __awaiter(void 0, void 0, void 0, function* () {
67
+ var _a, _b, _c;
68
+ const url = new URL(getApiUrl('/api/authz/v1/scopes/'));
69
+ if (params.search)
70
+ url.searchParams.set('search', params.search);
71
+ if (params.scopeType)
72
+ url.searchParams.set('scope_type', params.scopeType);
73
+ if ((_a = params.orgs) === null || _a === void 0 ? void 0 : _a.length)
74
+ url.searchParams.set('orgs', params.orgs.join(','));
75
+ if (params.managementPermissionOnly)
76
+ url.searchParams.set('management_permission_only', 'true');
77
+ url.searchParams.set('page', ((_b = params.page) !== null && _b !== void 0 ? _b : 1).toString());
78
+ url.searchParams.set('page_size', ((_c = params.pageSize) !== null && _c !== void 0 ? _c : 10).toString());
79
+ const { data } = yield getAuthenticatedHttpClient().get(url);
80
+ return camelCaseObject(data);
81
+ });
82
+ export const getCourseAuthoringFlagStates = () => __awaiter(void 0, void 0, void 0, function* () {
83
+ const { data } = yield getAuthenticatedHttpClient().get(getApiUrl('/api/authz/v1/waffle-flag-states/'));
84
+ return camelCaseObject(data);
85
+ });
86
+ export const getUserAssignedRoles = (username, querySettings) => __awaiter(void 0, void 0, void 0, function* () {
87
+ var _a, _b;
88
+ const url = new URL(getApiUrl(`/api/authz/v1/users/${username}/assignments/`));
89
+ if (querySettings === null || querySettings === void 0 ? void 0 : querySettings.roles) {
90
+ url.searchParams.set('roles', querySettings.roles);
91
+ }
92
+ if (querySettings === null || querySettings === void 0 ? void 0 : querySettings.organizations) {
93
+ url.searchParams.set('orgs', querySettings.organizations);
94
+ }
95
+ if (querySettings === null || querySettings === void 0 ? void 0 : querySettings.search) {
96
+ url.searchParams.set('search', querySettings.search);
97
+ }
98
+ if ((querySettings === null || querySettings === void 0 ? void 0 : querySettings.sortBy) && (querySettings === null || querySettings === void 0 ? void 0 : querySettings.order)) {
99
+ url.searchParams.set('sort_by', querySettings.sortBy);
100
+ url.searchParams.set('order', (querySettings === null || querySettings === void 0 ? void 0 : querySettings.order) || '');
101
+ }
102
+ url.searchParams.set('page_size', ((_a = querySettings === null || querySettings === void 0 ? void 0 : querySettings.pageSize) === null || _a === void 0 ? void 0 : _a.toString()) || '');
103
+ url.searchParams.set('page', (((_b = querySettings === null || querySettings === void 0 ? void 0 : querySettings.pageIndex) !== null && _b !== void 0 ? _b : 0) + 1).toString());
104
+ const { data } = yield getAuthenticatedHttpClient().get(url);
105
+ return camelCaseObject(data);
106
+ });
107
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/authz-module/data/api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Org, Scope,\n UserRole,\n} from '@src/types';\nimport { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { getApiUrl } from '@src/data/utils';\n\nexport interface QuerySettings {\n roles: string | null;\n scopes: string | null;\n organizations: string | null;\n search: string | null;\n order: string | null;\n sortBy: string | null;\n pageSize: number;\n pageIndex: number;\n}\n\nexport interface GetUserAssignmentsResponse {\n results: UserRole[];\n count: number;\n next: string | null;\n previous: string | null;\n}\n\nexport interface RevokeUserRolesRequest {\n users: string;\n role: string;\n scope: string;\n querySettings?: QuerySettings;\n}\n\nexport interface DeleteRevokeUserRolesResponse {\n completed: {\n userIdentifiers: string;\n status: string;\n }[];\n errors: {\n userIdentifiers: string;\n error: string;\n }[];\n}\n\nexport interface PutAssignTeamMembersRoleResponse {\n completed: { userIdentifier: string; status: string }[];\n errors: { userIdentifier: string; scope: string; error: string }[];\n}\n\nexport interface AssignTeamMembersRoleRequest {\n users: string[];\n role: string;\n scopes: string[];\n}\n\nexport interface GetAllRoleAssignmentsResponse {\n results: UserRole[];\n count: number;\n next: string | null;\n previous: string | null;\n}\n\nexport interface GetOrgsResponse {\n count: number;\n next: string | null;\n previous: string | null;\n results: Org[];\n}\n\nexport interface GetScopesResponse {\n count: number;\n next: string | null;\n previous: string | null;\n results: Scope[];\n}\nexport interface ValidateUsersRequest {\n users: string[];\n}\n\nexport interface ValidateUsersResponse {\n validUsers: string[];\n invalidUsers: string[];\n summary: {\n total: number;\n validCount: number;\n invalidCount: number;\n };\n}\n\nexport interface GetScopesParams {\n scopeType?: string;\n search?: string;\n orgs?: string[];\n page?: number;\n pageSize?: number;\n managementPermissionOnly?: boolean;\n}\n\nexport interface WaffleFlagOverrides {\n on: string[];\n off: string[];\n}\n\n/**\n * Enablement state of the course-authoring waffle flag across scopes.\n * `orgOverrides`/`courseOverrides` list the org short names / course ids whose\n * override differs from `global` (explicitly forced `on` or `off`).\n */\nexport interface CourseAuthoringFlagStates {\n global: boolean;\n orgOverrides: WaffleFlagOverrides;\n courseOverrides: WaffleFlagOverrides;\n}\n\nexport const assignTeamMembersRole = async (\n data: AssignTeamMembersRoleRequest,\n): Promise<PutAssignTeamMembersRoleResponse> => {\n const res = await getAuthenticatedHttpClient().put(getApiUrl('/api/authz/v1/roles/users/'), data);\n return camelCaseObject(res.data);\n};\n\nexport const validateUsers = async (\n data: ValidateUsersRequest,\n): Promise<ValidateUsersResponse> => {\n const res = await getAuthenticatedHttpClient().post(\n getApiUrl('/api/authz/v1/users/validate/'),\n data,\n );\n return camelCaseObject(res.data);\n};\n\nexport const revokeUserRoles = async (\n data: RevokeUserRolesRequest,\n): Promise<DeleteRevokeUserRolesResponse> => {\n const url = new URL(getApiUrl('/api/authz/v1/roles/users/'));\n url.searchParams.append('users', data.users);\n url.searchParams.append('role', data.role);\n url.searchParams.append('scope', data.scope);\n\n // If this is not transformed to string, it shows a 404 with the token CSRF acquisition request\n const res = await getAuthenticatedHttpClient().delete(url.toString());\n return camelCaseObject(res.data);\n};\n\nexport const getAllRoleAssignments = async (querySettings: QuerySettings): Promise<GetAllRoleAssignmentsResponse> => {\n const url = new URL(getApiUrl('/api/authz/v1/assignments/'));\n\n if (querySettings.roles) {\n url.searchParams.set('roles', querySettings.roles);\n }\n if (querySettings.scopes) {\n url.searchParams.set('scopes', querySettings.scopes);\n }\n if (querySettings.organizations) {\n url.searchParams.set('orgs', querySettings.organizations);\n }\n if (querySettings.search) {\n url.searchParams.set('search', querySettings.search);\n }\n if (querySettings.sortBy && querySettings.order) {\n url.searchParams.set('sort_by', querySettings.sortBy);\n url.searchParams.set('order', querySettings.order);\n }\n url.searchParams.set('page_size', querySettings.pageSize.toString());\n url.searchParams.set('page', (querySettings.pageIndex + 1).toString());\n\n const { data } = await getAuthenticatedHttpClient().get(url);\n return camelCaseObject(data);\n};\n\nexport const getOrgs = async (search?: string, page?: number, pageSize?: number): Promise<GetOrgsResponse> => {\n const url = new URL(getApiUrl('/api/authz/v1/orgs/'));\n if (search !== undefined) {\n url.searchParams.set('search', search);\n }\n if (page !== undefined) {\n url.searchParams.set('page', page.toString());\n }\n if (pageSize !== undefined) {\n url.searchParams.set('page_size', pageSize.toString());\n }\n const { data } = await getAuthenticatedHttpClient().get(url);\n return camelCaseObject(data);\n};\n\nexport const getScopes = async (params: GetScopesParams): Promise<GetScopesResponse> => {\n const url = new URL(getApiUrl('/api/authz/v1/scopes/'));\n if (params.search) url.searchParams.set('search', params.search);\n if (params.scopeType) url.searchParams.set('scope_type', params.scopeType);\n if (params.orgs?.length) url.searchParams.set('orgs', params.orgs.join(','));\n if (params.managementPermissionOnly) url.searchParams.set('management_permission_only', 'true');\n url.searchParams.set('page', (params.page ?? 1).toString());\n url.searchParams.set('page_size', (params.pageSize ?? 10).toString());\n const { data } = await getAuthenticatedHttpClient().get(url);\n return camelCaseObject(data);\n};\n\nexport const getCourseAuthoringFlagStates = async (): Promise<CourseAuthoringFlagStates> => {\n const { data } = await getAuthenticatedHttpClient().get(getApiUrl('/api/authz/v1/waffle-flag-states/'));\n return camelCaseObject(data);\n};\n\nexport const getUserAssignedRoles = async (username?: string, querySettings?: QuerySettings): Promise<GetUserAssignmentsResponse> => {\n const url = new URL(getApiUrl(`/api/authz/v1/users/${username}/assignments/`));\n\n if (querySettings?.roles) {\n url.searchParams.set('roles', querySettings.roles);\n }\n if (querySettings?.organizations) {\n url.searchParams.set('orgs', querySettings.organizations);\n }\n if (querySettings?.search) {\n url.searchParams.set('search', querySettings.search);\n }\n if (querySettings?.sortBy && querySettings?.order) {\n url.searchParams.set('sort_by', querySettings.sortBy);\n url.searchParams.set('order', querySettings?.order || '');\n }\n url.searchParams.set('page_size', querySettings?.pageSize?.toString() || '');\n url.searchParams.set('page', ((querySettings?.pageIndex ?? 0) + 1).toString());\n\n const { data } = await getAuthenticatedHttpClient().get(url);\n return camelCaseObject(data);\n};\n"]}
@@ -0,0 +1,94 @@
1
+ import { AssignTeamMembersRoleRequest, GetAllRoleAssignmentsResponse, GetOrgsResponse, GetScopesResponse, QuerySettings, RevokeUserRolesRequest, GetUserAssignmentsResponse, ValidateUsersRequest, GetScopesParams, CourseAuthoringFlagStates } from './api';
2
+ /**
3
+ * React Query hook to add new team members to a specific scope or manage the corresponding roles.
4
+ * It provides a mutation function to add users with specified roles to the team or assign new roles.
5
+ *
6
+ * @example
7
+ * const { mutate: assignTeamMembersRole } = useAssignTeamMembersRole();
8
+ * assignTeamMembersRole({ data: { libraryId: 'lib:123', users: ['jdoe'], role: 'editor' } });
9
+ */
10
+ export declare const useAssignTeamMembersRole: () => import("@tanstack/react-query").UseMutationResult<import("./api").PutAssignTeamMembersRoleResponse, Error, {
11
+ data: AssignTeamMembersRoleRequest;
12
+ }, unknown>;
13
+ /**
14
+ * React Query hook to validate users exist without assigning roles.
15
+ * It checks if the provided usernames/email addresses are valid.
16
+ *
17
+ * @example
18
+ * const { mutate: validateUsers } = useValidateUsers();
19
+ * validateUsers({ data: { users: ['jdoe', 'jane@example.com'] } });
20
+ */
21
+ export declare const useValidateUsers: () => import("@tanstack/react-query").UseMutationResult<import("./api").ValidateUsersResponse, Error, {
22
+ data: ValidateUsersRequest;
23
+ }, unknown>;
24
+ /**
25
+ * React Query hook to remove roles for a specific team member within a scope.
26
+ *
27
+ * @example
28
+ * const { mutate: revokeUserRoles } = useRevokeUserRoles();
29
+ * revokeUserRoles({ data: { libraryId: 'lib:123', users: ['jdoe'], role: 'editor' } });
30
+ */
31
+ export declare const useRevokeUserRoles: () => import("@tanstack/react-query").UseMutationResult<import("./api").DeleteRevokeUserRolesResponse, Error, {
32
+ data: RevokeUserRolesRequest;
33
+ }, unknown>;
34
+ /**
35
+ * React Query hook to fetch all role assignments across scopes and roles,
36
+ * with support for filtering, sorting, and pagination.
37
+ * It retrieves a comprehensive list of user-role assignments based
38
+ * on the provided query settings.
39
+ *
40
+ * @param querySettings - Optional parameters for filtering by roles, scopes,
41
+ * organizations, search term, sorting, and pagination.
42
+ *
43
+ * @example
44
+ * const { data: roleAssignments } = useAllRoleAssignments({ roles: 'editor', pageSize: 20 });
45
+ */
46
+ export declare const useAllRoleAssignments: (querySettings: QuerySettings) => import("@tanstack/react-query").UseQueryResult<GetAllRoleAssignmentsResponse, Error>;
47
+ /**
48
+ * React Query hook to fetch a paginated, searchable list of organizations.
49
+ * Results are cached for 30 minutes — suitable for both filter dropdowns and full listings.
50
+ *
51
+ * @param search - Optional text filter applied to organization names.
52
+ * @param page - 1-based page number; defaults to the first page when omitted.
53
+ * @param pageSize - Items per page; defaults to the API default when omitted.
54
+ * @returns A `QueryResult<GetOrgsResponse>` with `results`, `count`, `next`, and `previous`.
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * const { data } = useOrgs('edX');
59
+ * const orgs = data?.results ?? [];
60
+ * ```
61
+ */
62
+ export declare const useOrgs: (search?: string, page?: number, pageSize?: number) => import("@tanstack/react-query").UseQueryResult<GetOrgsResponse, Error>;
63
+ /**
64
+ * React Query hook to fetch a paginated, filterable list of scopes (courses or libraries).
65
+ * Uses infinite query to support infinite scroll — call `fetchNextPage` to load more results.
66
+ *
67
+ * @param params - Filter parameters (all optional):
68
+ * - `search` — text filter applied to scope names
69
+ * - `scopeType` — filter by scope type (e.g. course, library)
70
+ * - `org` — filter by organization
71
+ * - `pageSize` — number of items per page
72
+ * - `managementPermissionOnly` — when true, returns only scopes the requester can manage
73
+ * @returns An `InfiniteQueryResult` whose `data.pages` contains the accumulated `GetScopesResponse` pages.
74
+ *
75
+ * @example
76
+ * ```tsx
77
+ * const { data, fetchNextPage, hasNextPage } = useScopes({ search: 'intro', orgs: ['edX'] });
78
+ * const scopes = data?.pages.flatMap((p) => p.results) ?? [];
79
+ * ```
80
+ */
81
+ export declare const useScopes: (params?: Omit<GetScopesParams, "page">) => import("@tanstack/react-query").UseInfiniteQueryResult<import("@tanstack/query-core").InfiniteData<GetScopesResponse, unknown>, Error>;
82
+ export declare const useUserAssignedRoles: (username?: string, querySettings?: QuerySettings) => import("@tanstack/react-query").UseQueryResult<GetUserAssignmentsResponse, Error>;
83
+ /**
84
+ * React Query hook to fetch the enablement state of the course-authoring waffle flag
85
+ * across scopes (global, org overrides, course overrides).
86
+ *
87
+ * Follows the same caching rules as the permission-validation hooks.
88
+ *
89
+ * @example
90
+ * ```tsx
91
+ * const { data } = useCourseAuthoringFlagStates();
92
+ * ```
93
+ */
94
+ export declare const useCourseAuthoringFlagStates: () => import("@tanstack/react-query").UseQueryResult<CourseAuthoringFlagStates, Error>;
@@ -0,0 +1,191 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { useInfiniteQuery, useMutation, useQuery, useQueryClient, } from '@tanstack/react-query';
11
+ import { appId } from '../../constants';
12
+ import { assignTeamMembersRole, getAllRoleAssignments, getOrgs, getScopes, revokeUserRoles, getUserAssignedRoles, validateUsers, getCourseAuthoringFlagStates, } from './api';
13
+ const authzQueryKeys = {
14
+ all: [appId, 'authz'],
15
+ allRoleAssignments: (querySettings) => [...authzQueryKeys.all, 'allRoleAssignments', querySettings],
16
+ orgs: (search, page, pageSize) => [...authzQueryKeys.all, 'organizations', search, page, pageSize],
17
+ scopes: (params) => [...authzQueryKeys.all, 'scopes', params],
18
+ userRoles: (username, querySettings) => [...authzQueryKeys.all, 'userRoles', username, querySettings],
19
+ courseAuthoringFlagStates: () => [...authzQueryKeys.all, 'courseAuthoringFlagStates'],
20
+ };
21
+ /**
22
+ * React Query hook to add new team members to a specific scope or manage the corresponding roles.
23
+ * It provides a mutation function to add users with specified roles to the team or assign new roles.
24
+ *
25
+ * @example
26
+ * const { mutate: assignTeamMembersRole } = useAssignTeamMembersRole();
27
+ * assignTeamMembersRole({ data: { libraryId: 'lib:123', users: ['jdoe'], role: 'editor' } });
28
+ */
29
+ export const useAssignTeamMembersRole = () => {
30
+ const queryClient = useQueryClient();
31
+ return useMutation({
32
+ mutationFn: (_a) => __awaiter(void 0, [_a], void 0, function* ({ data }) { return assignTeamMembersRole(data); }),
33
+ onSettled: (_data, error) => {
34
+ if (!error) {
35
+ queryClient.invalidateQueries({ queryKey: [...authzQueryKeys.all, 'userRoles'] });
36
+ queryClient.invalidateQueries({
37
+ predicate: (query) => query.queryKey.includes('allRoleAssignments'),
38
+ });
39
+ }
40
+ },
41
+ });
42
+ };
43
+ /**
44
+ * React Query hook to validate users exist without assigning roles.
45
+ * It checks if the provided usernames/email addresses are valid.
46
+ *
47
+ * @example
48
+ * const { mutate: validateUsers } = useValidateUsers();
49
+ * validateUsers({ data: { users: ['jdoe', 'jane@example.com'] } });
50
+ */
51
+ export const useValidateUsers = () => useMutation({
52
+ mutationFn: (_a) => __awaiter(void 0, [_a], void 0, function* ({ data }) { return validateUsers(data); }),
53
+ });
54
+ /**
55
+ * React Query hook to remove roles for a specific team member within a scope.
56
+ *
57
+ * @example
58
+ * const { mutate: revokeUserRoles } = useRevokeUserRoles();
59
+ * revokeUserRoles({ data: { libraryId: 'lib:123', users: ['jdoe'], role: 'editor' } });
60
+ */
61
+ export const useRevokeUserRoles = () => {
62
+ const queryClient = useQueryClient();
63
+ return useMutation({
64
+ mutationFn: (_a) => __awaiter(void 0, [_a], void 0, function* ({ data }) { return revokeUserRoles(data); }),
65
+ onSettled: () => {
66
+ queryClient.invalidateQueries({
67
+ predicate: (query) => query.queryKey.includes('userRoles'),
68
+ });
69
+ queryClient.invalidateQueries({
70
+ predicate: (query) => query.queryKey.includes('allRoleAssignments'),
71
+ });
72
+ },
73
+ });
74
+ };
75
+ /**
76
+ * React Query hook to fetch all role assignments across scopes and roles,
77
+ * with support for filtering, sorting, and pagination.
78
+ * It retrieves a comprehensive list of user-role assignments based
79
+ * on the provided query settings.
80
+ *
81
+ * @param querySettings - Optional parameters for filtering by roles, scopes,
82
+ * organizations, search term, sorting, and pagination.
83
+ *
84
+ * @example
85
+ * const { data: roleAssignments } = useAllRoleAssignments({ roles: 'editor', pageSize: 20 });
86
+ */
87
+ export const useAllRoleAssignments = (querySettings) => {
88
+ const result = useQuery({
89
+ queryKey: authzQueryKeys.allRoleAssignments(querySettings),
90
+ queryFn: () => getAllRoleAssignments(querySettings),
91
+ staleTime: 1000 * 60 * 30, // refetch after 30 minutes
92
+ retry: false,
93
+ refetchOnWindowFocus: false,
94
+ });
95
+ return result;
96
+ };
97
+ /**
98
+ * React Query hook to fetch a paginated, searchable list of organizations.
99
+ * Results are cached for 30 minutes — suitable for both filter dropdowns and full listings.
100
+ *
101
+ * @param search - Optional text filter applied to organization names.
102
+ * @param page - 1-based page number; defaults to the first page when omitted.
103
+ * @param pageSize - Items per page; defaults to the API default when omitted.
104
+ * @returns A `QueryResult<GetOrgsResponse>` with `results`, `count`, `next`, and `previous`.
105
+ *
106
+ * @example
107
+ * ```tsx
108
+ * const { data } = useOrgs('edX');
109
+ * const orgs = data?.results ?? [];
110
+ * ```
111
+ */
112
+ export const useOrgs = (search, page, pageSize) => useQuery({
113
+ queryKey: authzQueryKeys.orgs(search, page, pageSize),
114
+ queryFn: () => getOrgs(search, page, pageSize),
115
+ staleTime: 1000 * 60 * 30,
116
+ refetchOnWindowFocus: false,
117
+ });
118
+ /**
119
+ * React Query hook to fetch a paginated, filterable list of scopes (courses or libraries).
120
+ * Uses infinite query to support infinite scroll — call `fetchNextPage` to load more results.
121
+ *
122
+ * @param params - Filter parameters (all optional):
123
+ * - `search` — text filter applied to scope names
124
+ * - `scopeType` — filter by scope type (e.g. course, library)
125
+ * - `org` — filter by organization
126
+ * - `pageSize` — number of items per page
127
+ * - `managementPermissionOnly` — when true, returns only scopes the requester can manage
128
+ * @returns An `InfiniteQueryResult` whose `data.pages` contains the accumulated `GetScopesResponse` pages.
129
+ *
130
+ * @example
131
+ * ```tsx
132
+ * const { data, fetchNextPage, hasNextPage } = useScopes({ search: 'intro', orgs: ['edX'] });
133
+ * const scopes = data?.pages.flatMap((p) => p.results) ?? [];
134
+ * ```
135
+ */
136
+ export const useScopes = (params = {}) => useInfiniteQuery({
137
+ queryKey: authzQueryKeys.scopes(params),
138
+ queryFn: ({ pageParam }) => getScopes(Object.assign(Object.assign({}, params), { page: pageParam })),
139
+ getNextPageParam: (lastPage) => {
140
+ if (!lastPage.next)
141
+ return undefined;
142
+ try {
143
+ const nextUrl = new URL(lastPage.next);
144
+ const page = nextUrl.searchParams.get('page');
145
+ return page ? parseInt(page, 10) : undefined;
146
+ }
147
+ catch (_a) {
148
+ return undefined;
149
+ }
150
+ },
151
+ initialPageParam: 1,
152
+ staleTime: 1000 * 60 * 5,
153
+ refetchOnWindowFocus: false,
154
+ });
155
+ /*
156
+ * React Query hook to fetch all the roles assigned to a specific user.
157
+ * It retrieves the full list of roles with the corresponding permissions.
158
+ * @param username - The username of the user
159
+ * @param querySettings - Optional query parameters for filtering, sorting, and pagination
160
+ *
161
+ * @example
162
+ * ```tsx
163
+ * const { data: userRoles } = useUserAssignedRoles('jdoe', querySettings);
164
+ * ```
165
+ */
166
+ export const useUserAssignedRoles = (username, querySettings) => useQuery({
167
+ queryKey: authzQueryKeys.userRoles(username, querySettings),
168
+ queryFn: () => getUserAssignedRoles(username, querySettings),
169
+ staleTime: 1000 * 60 * 30, // refetch after 30 minutes
170
+ enabled: !!username,
171
+ refetchOnWindowFocus: false,
172
+ });
173
+ /**
174
+ * React Query hook to fetch the enablement state of the course-authoring waffle flag
175
+ * across scopes (global, org overrides, course overrides).
176
+ *
177
+ * Follows the same caching rules as the permission-validation hooks.
178
+ *
179
+ * @example
180
+ * ```tsx
181
+ * const { data } = useCourseAuthoringFlagStates();
182
+ * ```
183
+ */
184
+ export const useCourseAuthoringFlagStates = () => useQuery({
185
+ queryKey: authzQueryKeys.courseAuthoringFlagStates(),
186
+ queryFn: () => getCourseAuthoringFlagStates(),
187
+ staleTime: 1000 * 60 * 30,
188
+ refetchOnWindowFocus: false,
189
+ retry: false,
190
+ });
191
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/authz-module/data/hooks.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n useInfiniteQuery, useMutation, useQuery, useQueryClient,\n} from '@tanstack/react-query';\nimport { appId } from '@src/constants';\nimport {\n assignTeamMembersRole, AssignTeamMembersRoleRequest, getAllRoleAssignments,\n GetAllRoleAssignmentsResponse, getOrgs, GetOrgsResponse,\n getScopes, GetScopesResponse, QuerySettings, revokeUserRoles,\n RevokeUserRolesRequest, getUserAssignedRoles, GetUserAssignmentsResponse,\n validateUsers, ValidateUsersRequest, GetScopesParams,\n getCourseAuthoringFlagStates, CourseAuthoringFlagStates,\n} from './api';\n\nconst authzQueryKeys = {\n all: [appId, 'authz'] as const,\n allRoleAssignments: (querySettings?: QuerySettings) => [...authzQueryKeys.all, 'allRoleAssignments', querySettings] as const,\n orgs: (search?: string, page?: number, pageSize?: number) => [...authzQueryKeys.all, 'organizations', search, page, pageSize] as const,\n scopes: (params?: Omit<GetScopesParams, 'page'>) => [...authzQueryKeys.all, 'scopes', params] as const,\n userRoles: (username?: string, querySettings?: QuerySettings) => [...authzQueryKeys.all, 'userRoles', username, querySettings] as const,\n courseAuthoringFlagStates: () => [...authzQueryKeys.all, 'courseAuthoringFlagStates'] as const,\n};\n\n/**\n * React Query hook to add new team members to a specific scope or manage the corresponding roles.\n * It provides a mutation function to add users with specified roles to the team or assign new roles.\n *\n * @example\n * const { mutate: assignTeamMembersRole } = useAssignTeamMembersRole();\n * assignTeamMembersRole({ data: { libraryId: 'lib:123', users: ['jdoe'], role: 'editor' } });\n */\nexport const useAssignTeamMembersRole = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async ({ data }: {\n data: AssignTeamMembersRoleRequest;\n }) => assignTeamMembersRole(data),\n onSettled: (_data, error) => {\n if (!error) {\n queryClient.invalidateQueries({ queryKey: [...authzQueryKeys.all, 'userRoles'] });\n queryClient.invalidateQueries({\n predicate: (query) => query.queryKey.includes('allRoleAssignments'),\n });\n }\n },\n });\n};\n\n/**\n * React Query hook to validate users exist without assigning roles.\n * It checks if the provided usernames/email addresses are valid.\n *\n * @example\n * const { mutate: validateUsers } = useValidateUsers();\n * validateUsers({ data: { users: ['jdoe', 'jane@example.com'] } });\n */\nexport const useValidateUsers = () => useMutation({\n mutationFn: async ({ data }: {\n data: ValidateUsersRequest;\n }) => validateUsers(data),\n});\n\n/**\n * React Query hook to remove roles for a specific team member within a scope.\n *\n * @example\n * const { mutate: revokeUserRoles } = useRevokeUserRoles();\n * revokeUserRoles({ data: { libraryId: 'lib:123', users: ['jdoe'], role: 'editor' } });\n */\nexport const useRevokeUserRoles = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async ({ data }: {\n data: RevokeUserRolesRequest;\n }) => revokeUserRoles(data),\n onSettled: () => {\n queryClient.invalidateQueries({\n predicate: (query) => query.queryKey.includes('userRoles'),\n });\n queryClient.invalidateQueries({\n predicate: (query) => query.queryKey.includes('allRoleAssignments'),\n });\n },\n });\n};\n\n/**\n * React Query hook to fetch all role assignments across scopes and roles,\n * with support for filtering, sorting, and pagination.\n * It retrieves a comprehensive list of user-role assignments based\n * on the provided query settings.\n *\n * @param querySettings - Optional parameters for filtering by roles, scopes,\n * organizations, search term, sorting, and pagination.\n *\n * @example\n * const { data: roleAssignments } = useAllRoleAssignments({ roles: 'editor', pageSize: 20 });\n */\nexport const useAllRoleAssignments = (querySettings: QuerySettings) => {\n const result = useQuery<GetAllRoleAssignmentsResponse, Error>({\n queryKey: authzQueryKeys.allRoleAssignments(querySettings),\n queryFn: () => getAllRoleAssignments(querySettings),\n staleTime: 1000 * 60 * 30, // refetch after 30 minutes\n retry: false,\n refetchOnWindowFocus: false,\n });\n return result;\n};\n\n/**\n * React Query hook to fetch a paginated, searchable list of organizations.\n * Results are cached for 30 minutes — suitable for both filter dropdowns and full listings.\n *\n * @param search - Optional text filter applied to organization names.\n * @param page - 1-based page number; defaults to the first page when omitted.\n * @param pageSize - Items per page; defaults to the API default when omitted.\n * @returns A `QueryResult<GetOrgsResponse>` with `results`, `count`, `next`, and `previous`.\n *\n * @example\n * ```tsx\n * const { data } = useOrgs('edX');\n * const orgs = data?.results ?? [];\n * ```\n */\nexport const useOrgs = (search?: string, page?: number, pageSize?: number) => useQuery<GetOrgsResponse, Error>({\n queryKey: authzQueryKeys.orgs(search, page, pageSize),\n queryFn: () => getOrgs(search, page, pageSize),\n staleTime: 1000 * 60 * 30,\n refetchOnWindowFocus: false,\n});\n\n/**\n * React Query hook to fetch a paginated, filterable list of scopes (courses or libraries).\n * Uses infinite query to support infinite scroll — call `fetchNextPage` to load more results.\n *\n * @param params - Filter parameters (all optional):\n * - `search` — text filter applied to scope names\n * - `scopeType` — filter by scope type (e.g. course, library)\n * - `org` — filter by organization\n * - `pageSize` — number of items per page\n * - `managementPermissionOnly` — when true, returns only scopes the requester can manage\n * @returns An `InfiniteQueryResult` whose `data.pages` contains the accumulated `GetScopesResponse` pages.\n *\n * @example\n * ```tsx\n * const { data, fetchNextPage, hasNextPage } = useScopes({ search: 'intro', orgs: ['edX'] });\n * const scopes = data?.pages.flatMap((p) => p.results) ?? [];\n * ```\n */\nexport const useScopes = (params: Omit<GetScopesParams, 'page'> = {}) => useInfiniteQuery<GetScopesResponse, Error>({\n queryKey: authzQueryKeys.scopes(params),\n queryFn: ({ pageParam }) => getScopes({ ...params, page: pageParam as number }),\n getNextPageParam: (lastPage) => {\n if (!lastPage.next) return undefined;\n try {\n const nextUrl = new URL(lastPage.next);\n const page = nextUrl.searchParams.get('page');\n return page ? parseInt(page, 10) : undefined;\n } catch {\n return undefined;\n }\n },\n initialPageParam: 1,\n staleTime: 1000 * 60 * 5,\n refetchOnWindowFocus: false,\n});\n\n/*\n * React Query hook to fetch all the roles assigned to a specific user.\n * It retrieves the full list of roles with the corresponding permissions.\n * @param username - The username of the user\n * @param querySettings - Optional query parameters for filtering, sorting, and pagination\n *\n * @example\n * ```tsx\n * const { data: userRoles } = useUserAssignedRoles('jdoe', querySettings);\n * ```\n*/\nexport const useUserAssignedRoles = (\n username?: string,\n querySettings?: QuerySettings,\n) => useQuery<GetUserAssignmentsResponse, Error>({\n queryKey: authzQueryKeys.userRoles(username, querySettings),\n queryFn: () => getUserAssignedRoles(username, querySettings),\n staleTime: 1000 * 60 * 30, // refetch after 30 minutes\n enabled: !!username,\n refetchOnWindowFocus: false,\n});\n\n/**\n * React Query hook to fetch the enablement state of the course-authoring waffle flag\n * across scopes (global, org overrides, course overrides).\n *\n * Follows the same caching rules as the permission-validation hooks.\n *\n * @example\n * ```tsx\n * const { data } = useCourseAuthoringFlagStates();\n * ```\n */\nexport const useCourseAuthoringFlagStates = () => useQuery<CourseAuthoringFlagStates, Error>({\n queryKey: authzQueryKeys.courseAuthoringFlagStates(),\n queryFn: () => getCourseAuthoringFlagStates(),\n staleTime: 1000 * 60 * 30,\n refetchOnWindowFocus: false,\n retry: false,\n});\n"]}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Resolve the course-authoring waffle flag state, both at the coarse domain level and
3
+ * per individual course scope.
4
+ *
5
+ * `isCourseAuthoringEnabled` is the domain-level gate (enabled anywhere) used to decide
6
+ * whether the authoring category should appear in controls like the roles filter.
7
+ *
8
+ * `isCourseEnabled(courseId)` resolves a single course against the overrides, applying
9
+ * the precedence course override -> org override -> global. Overrides only appear when
10
+ * they differ from `global`, so membership in the `on`/`off` lists is authoritative.
11
+ *
12
+ * `isOrgAuthoringEnabled(org)` resolves whether authoring is enabled for at least one
13
+ * course within an org: the org override forces it on, some course in the org is forced
14
+ * on, or (absent an off override) the global flag is on.
15
+ *
16
+ * While the flag states are loading, everything resolves to `false` so authoring scopes
17
+ * and roles stay hidden until enablement is known. If the fetch fails, a generic error
18
+ * toast (with retry) is surfaced and everything keeps resolving to `false`.
19
+ */
20
+ export declare const useCourseAuthoringFlag: () => {
21
+ isCourseAuthoringEnabled: boolean;
22
+ isCourseEnabled: (courseId: string) => boolean;
23
+ isOrgAuthoringEnabled: (org: string) => boolean;
24
+ isLoading: boolean;
25
+ isError: boolean;
26
+ };
@@ -0,0 +1,86 @@
1
+ import { useEffect, useMemo } from 'react';
2
+ import { useCourseAuthoringFlagStates } from '../data/hooks';
3
+ import { useToastManager } from '../../components/ToastManager/ToastManagerContext';
4
+ /**
5
+ * Extract the org short name from a course external key.
6
+ * e.g. `course-v1:testing+CT01+CT01-2024` -> `testing`
7
+ */
8
+ const orgOf = (courseId) => { var _a; return (_a = courseId.split(':')[1]) === null || _a === void 0 ? void 0 : _a.split('+')[0]; };
9
+ // Several components on the same page consume this hook and share the underlying query,
10
+ // so they all observe the same error instance; track toasted errors to show one toast
11
+ // per failure instead of one per consumer.
12
+ const toastedErrors = new WeakSet();
13
+ /**
14
+ * Resolve the course-authoring waffle flag state, both at the coarse domain level and
15
+ * per individual course scope.
16
+ *
17
+ * `isCourseAuthoringEnabled` is the domain-level gate (enabled anywhere) used to decide
18
+ * whether the authoring category should appear in controls like the roles filter.
19
+ *
20
+ * `isCourseEnabled(courseId)` resolves a single course against the overrides, applying
21
+ * the precedence course override -> org override -> global. Overrides only appear when
22
+ * they differ from `global`, so membership in the `on`/`off` lists is authoritative.
23
+ *
24
+ * `isOrgAuthoringEnabled(org)` resolves whether authoring is enabled for at least one
25
+ * course within an org: the org override forces it on, some course in the org is forced
26
+ * on, or (absent an off override) the global flag is on.
27
+ *
28
+ * While the flag states are loading, everything resolves to `false` so authoring scopes
29
+ * and roles stay hidden until enablement is known. If the fetch fails, a generic error
30
+ * toast (with retry) is surfaced and everything keeps resolving to `false`.
31
+ */
32
+ export const useCourseAuthoringFlag = () => {
33
+ const { data: flagStates, isLoading, isError, error, refetch, } = useCourseAuthoringFlagStates();
34
+ const { showErrorToast } = useToastManager();
35
+ useEffect(() => {
36
+ if (error && !toastedErrors.has(error)) {
37
+ toastedErrors.add(error);
38
+ showErrorToast(error, refetch);
39
+ }
40
+ }, [error, refetch, showErrorToast]);
41
+ const isCourseAuthoringEnabled = flagStates
42
+ ? flagStates.global
43
+ || flagStates.orgOverrides.on.length > 0
44
+ || flagStates.courseOverrides.on.length > 0
45
+ : false;
46
+ const { isCourseEnabled, isOrgAuthoringEnabled } = useMemo(() => {
47
+ var _a, _b, _c, _d, _e;
48
+ const courseOn = new Set((_a = flagStates === null || flagStates === void 0 ? void 0 : flagStates.courseOverrides.on) !== null && _a !== void 0 ? _a : []);
49
+ const courseOff = new Set((_b = flagStates === null || flagStates === void 0 ? void 0 : flagStates.courseOverrides.off) !== null && _b !== void 0 ? _b : []);
50
+ const orgOn = new Set((_c = flagStates === null || flagStates === void 0 ? void 0 : flagStates.orgOverrides.on) !== null && _c !== void 0 ? _c : []);
51
+ const orgOff = new Set((_d = flagStates === null || flagStates === void 0 ? void 0 : flagStates.orgOverrides.off) !== null && _d !== void 0 ? _d : []);
52
+ const global = (_e = flagStates === null || flagStates === void 0 ? void 0 : flagStates.global) !== null && _e !== void 0 ? _e : false;
53
+ const courseEnabled = (courseId) => {
54
+ const courseFlagOverrideEnabled = courseOn.has(courseId);
55
+ const courseFlagOverrideDisabled = courseOff.has(courseId);
56
+ if (courseFlagOverrideEnabled)
57
+ return true;
58
+ if (courseFlagOverrideDisabled)
59
+ return false;
60
+ const org = orgOf(courseId);
61
+ const orgFlagOverrideEnabled = !!org && orgOn.has(org);
62
+ const orgFlagOverrideDisabled = !!org && orgOff.has(org);
63
+ if (orgFlagOverrideEnabled)
64
+ return true;
65
+ if (orgFlagOverrideDisabled)
66
+ return false;
67
+ return global;
68
+ };
69
+ const orgsWithForcedOnCourse = new Set([...courseOn].map(orgOf));
70
+ const orgAuthoringEnabled = (org) => {
71
+ const orgFlagOverrideEnabled = orgOn.has(org);
72
+ if (orgFlagOverrideEnabled)
73
+ return true;
74
+ if (orgsWithForcedOnCourse.has(org))
75
+ return true;
76
+ if (orgOff.has(org))
77
+ return false;
78
+ return global;
79
+ };
80
+ return { isCourseEnabled: courseEnabled, isOrgAuthoringEnabled: orgAuthoringEnabled };
81
+ }, [flagStates]);
82
+ return {
83
+ isCourseAuthoringEnabled, isCourseEnabled, isOrgAuthoringEnabled, isLoading, isError,
84
+ };
85
+ };
86
+ //# sourceMappingURL=useCourseAuthoringFlag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCourseAuthoringFlag.js","sourceRoot":"","sources":["../../../src/authz-module/hooks/useCourseAuthoringFlag.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo } from 'react';\nimport { useCourseAuthoringFlagStates } from '@src/authz-module/data/hooks';\nimport { useToastManager } from '@src/components/ToastManager/ToastManagerContext';\n\n/**\n * Extract the org short name from a course external key.\n * e.g. `course-v1:testing+CT01+CT01-2024` -> `testing`\n */\nconst orgOf = (courseId: string): string | undefined => courseId.split(':')[1]?.split('+')[0];\n\n// Several components on the same page consume this hook and share the underlying query,\n// so they all observe the same error instance; track toasted errors to show one toast\n// per failure instead of one per consumer.\nconst toastedErrors = new WeakSet<Error>();\n\n/**\n * Resolve the course-authoring waffle flag state, both at the coarse domain level and\n * per individual course scope.\n *\n * `isCourseAuthoringEnabled` is the domain-level gate (enabled anywhere) used to decide\n * whether the authoring category should appear in controls like the roles filter.\n *\n * `isCourseEnabled(courseId)` resolves a single course against the overrides, applying\n * the precedence course override -> org override -> global. Overrides only appear when\n * they differ from `global`, so membership in the `on`/`off` lists is authoritative.\n *\n * `isOrgAuthoringEnabled(org)` resolves whether authoring is enabled for at least one\n * course within an org: the org override forces it on, some course in the org is forced\n * on, or (absent an off override) the global flag is on.\n *\n * While the flag states are loading, everything resolves to `false` so authoring scopes\n * and roles stay hidden until enablement is known. If the fetch fails, a generic error\n * toast (with retry) is surfaced and everything keeps resolving to `false`.\n */\nexport const useCourseAuthoringFlag = () => {\n const {\n data: flagStates, isLoading, isError, error, refetch,\n } = useCourseAuthoringFlagStates();\n const { showErrorToast } = useToastManager();\n\n useEffect(() => {\n if (error && !toastedErrors.has(error)) {\n toastedErrors.add(error);\n showErrorToast(error, refetch);\n }\n }, [error, refetch, showErrorToast]);\n\n const isCourseAuthoringEnabled = flagStates\n ? flagStates.global\n || flagStates.orgOverrides.on.length > 0\n || flagStates.courseOverrides.on.length > 0\n : false;\n\n const { isCourseEnabled, isOrgAuthoringEnabled } = useMemo(() => {\n const courseOn = new Set(flagStates?.courseOverrides.on ?? []);\n const courseOff = new Set(flagStates?.courseOverrides.off ?? []);\n const orgOn = new Set(flagStates?.orgOverrides.on ?? []);\n const orgOff = new Set(flagStates?.orgOverrides.off ?? []);\n const global = flagStates?.global ?? false;\n\n const courseEnabled = (courseId: string): boolean => {\n const courseFlagOverrideEnabled = courseOn.has(courseId);\n const courseFlagOverrideDisabled = courseOff.has(courseId);\n if (courseFlagOverrideEnabled) return true;\n if (courseFlagOverrideDisabled) return false;\n const org = orgOf(courseId);\n const orgFlagOverrideEnabled = !!org && orgOn.has(org);\n const orgFlagOverrideDisabled = !!org && orgOff.has(org);\n if (orgFlagOverrideEnabled) return true;\n if (orgFlagOverrideDisabled) return false;\n return global;\n };\n\n const orgsWithForcedOnCourse = new Set([...courseOn].map(orgOf));\n\n const orgAuthoringEnabled = (org: string): boolean => {\n const orgFlagOverrideEnabled = orgOn.has(org);\n if (orgFlagOverrideEnabled) return true;\n if (orgsWithForcedOnCourse.has(org)) return true;\n if (orgOff.has(org)) return false;\n return global;\n };\n\n return { isCourseEnabled: courseEnabled, isOrgAuthoringEnabled: orgAuthoringEnabled };\n }, [flagStates]);\n\n return {\n isCourseAuthoringEnabled, isCourseEnabled, isOrgAuthoringEnabled, isLoading, isError,\n };\n};\n"]}
@@ -0,0 +1,27 @@
1
+ import { QuerySettings } from '../data/api';
2
+ interface DataTableFilters {
3
+ pageSize: number;
4
+ pageIndex: number;
5
+ sortBy: {
6
+ id: string;
7
+ desc: boolean;
8
+ }[];
9
+ filters: {
10
+ id: string;
11
+ value: any;
12
+ }[];
13
+ }
14
+ interface UseQuerySettingsReturn {
15
+ querySettings: QuerySettings;
16
+ handleTableFetch: (tableFilters: DataTableFilters) => void;
17
+ }
18
+ /**
19
+ * Custom hook to manage query settings for table data fetching
20
+ * Converts DataTable filter/sort/pagination settings to API query parameters
21
+ * and manages URL synchronization
22
+ *
23
+ * @param initialQuerySettings - Initial query settings
24
+ * @returns Object containing querySettings and handleTableFetch function
25
+ */
26
+ export declare const useQuerySettings: (initialQuerySettings?: QuerySettings) => UseQuerySettingsReturn;
27
+ export {};