@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.
- package/LICENSE +661 -0
- package/README.rst +164 -0
- package/dist/Main.d.ts +3 -0
- package/dist/Main.js +15 -0
- package/dist/Main.js.map +1 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.js +10 -0
- package/dist/app.js.map +1 -0
- package/dist/authz-module/audit-user/index.d.ts +2 -0
- package/dist/authz-module/audit-user/index.js +191 -0
- package/dist/authz-module/audit-user/index.js.map +1 -0
- package/dist/authz-module/audit-user/messages.d.ts +58 -0
- package/dist/authz-module/audit-user/messages.js +60 -0
- package/dist/authz-module/audit-user/messages.js.map +1 -0
- package/dist/authz-module/authz-home/index.d.ts +2 -0
- package/dist/authz-module/authz-home/index.js +23 -0
- package/dist/authz-module/authz-home/index.js.map +1 -0
- package/dist/authz-module/authz-home/messages.d.ts +23 -0
- package/dist/authz-module/authz-home/messages.js +25 -0
- package/dist/authz-module/authz-home/messages.js.map +1 -0
- package/dist/authz-module/components/AddRoleButton.d.ts +6 -0
- package/dist/authz-module/components/AddRoleButton.js +22 -0
- package/dist/authz-module/components/AddRoleButton.js.map +1 -0
- package/dist/authz-module/components/AnchorButton.d.ts +2 -0
- package/dist/authz-module/components/AnchorButton.js +35 -0
- package/dist/authz-module/components/AnchorButton.js.map +1 -0
- package/dist/authz-module/components/AuthZLayout.d.ts +12 -0
- package/dist/authz-module/components/AuthZLayout.js +19 -0
- package/dist/authz-module/components/AuthZLayout.js.map +1 -0
- package/dist/authz-module/components/AuthZTitle.d.ts +20 -0
- package/dist/authz-module/components/AuthZTitle.js +22 -0
- package/dist/authz-module/components/AuthZTitle.js.map +1 -0
- package/dist/authz-module/components/ConfirmDeletionModal.d.ts +15 -0
- package/dist/authz-module/components/ConfirmDeletionModal.js +21 -0
- package/dist/authz-module/components/ConfirmDeletionModal.js.map +1 -0
- package/dist/authz-module/components/ErrorPage/index.d.ts +3 -0
- package/dist/authz-module/components/ErrorPage/index.js +59 -0
- package/dist/authz-module/components/ErrorPage/index.js.map +1 -0
- package/dist/authz-module/components/ErrorPage/messages.d.ts +53 -0
- package/dist/authz-module/components/ErrorPage/messages.js +55 -0
- package/dist/authz-module/components/ErrorPage/messages.js.map +1 -0
- package/dist/authz-module/components/PermissionTable.d.ts +9 -0
- package/dist/authz-module/components/PermissionTable.js +24 -0
- package/dist/authz-module/components/PermissionTable.js.map +1 -0
- package/dist/authz-module/components/RenderAdminRole.d.ts +5 -0
- package/dist/authz-module/components/RenderAdminRole.js +13 -0
- package/dist/authz-module/components/RenderAdminRole.js.map +1 -0
- package/dist/authz-module/components/RenderPermissionColumn.d.ts +6 -0
- package/dist/authz-module/components/RenderPermissionColumn.js +8 -0
- package/dist/authz-module/components/RenderPermissionColumn.js.map +1 -0
- package/dist/authz-module/components/RenderPermissionInLine.d.ts +6 -0
- package/dist/authz-module/components/RenderPermissionInLine.js +8 -0
- package/dist/authz-module/components/RenderPermissionInLine.js.map +1 -0
- package/dist/authz-module/components/ResourceTooltip.d.ts +11 -0
- package/dist/authz-module/components/ResourceTooltip.js +9 -0
- package/dist/authz-module/components/ResourceTooltip.js.map +1 -0
- package/dist/authz-module/components/RoleCard/constants.d.ts +14 -0
- package/dist/authz-module/components/RoleCard/constants.js +15 -0
- package/dist/authz-module/components/RoleCard/constants.js.map +1 -0
- package/dist/authz-module/components/RoleCard/messages.d.ts +73 -0
- package/dist/authz-module/components/RoleCard/messages.js +75 -0
- package/dist/authz-module/components/RoleCard/messages.js.map +1 -0
- package/dist/authz-module/components/TableCells.d.ts +29 -0
- package/dist/authz-module/components/TableCells.js +137 -0
- package/dist/authz-module/components/TableCells.js.map +1 -0
- package/dist/authz-module/components/TableControlBar/MultipleChoiceFilter.d.ts +3 -0
- package/dist/authz-module/components/TableControlBar/MultipleChoiceFilter.js +47 -0
- package/dist/authz-module/components/TableControlBar/MultipleChoiceFilter.js.map +1 -0
- package/dist/authz-module/components/TableControlBar/OrgFilter.d.ts +5 -0
- package/dist/authz-module/components/TableControlBar/OrgFilter.js +36 -0
- package/dist/authz-module/components/TableControlBar/OrgFilter.js.map +1 -0
- package/dist/authz-module/components/TableControlBar/RolesFilter.d.ts +4 -0
- package/dist/authz-module/components/TableControlBar/RolesFilter.js +29 -0
- package/dist/authz-module/components/TableControlBar/RolesFilter.js.map +1 -0
- package/dist/authz-module/components/TableControlBar/ScopesFilter.d.ts +4 -0
- package/dist/authz-module/components/TableControlBar/ScopesFilter.js +45 -0
- package/dist/authz-module/components/TableControlBar/ScopesFilter.js.map +1 -0
- package/dist/authz-module/components/TableControlBar/SearchFilter.d.ts +7 -0
- package/dist/authz-module/components/TableControlBar/SearchFilter.js +8 -0
- package/dist/authz-module/components/TableControlBar/SearchFilter.js.map +1 -0
- package/dist/authz-module/components/TableControlBar/TableControlBar.d.ts +5 -0
- package/dist/authz-module/components/TableControlBar/TableControlBar.js +99 -0
- package/dist/authz-module/components/TableControlBar/TableControlBar.js.map +1 -0
- package/dist/authz-module/components/TableControlBar/types.d.ts +18 -0
- package/dist/authz-module/components/TableControlBar/types.js +2 -0
- package/dist/authz-module/components/TableControlBar/types.js.map +1 -0
- package/dist/authz-module/components/TableFooter/TableFooter.d.ts +2 -0
- package/dist/authz-module/components/TableFooter/TableFooter.js +15 -0
- package/dist/authz-module/components/TableFooter/TableFooter.js.map +1 -0
- package/dist/authz-module/components/UserPermissions.d.ts +9 -0
- package/dist/authz-module/components/UserPermissions.js +56 -0
- package/dist/authz-module/components/UserPermissions.js.map +1 -0
- package/dist/authz-module/components/ViewMoreLink.d.ts +8 -0
- package/dist/authz-module/components/ViewMoreLink.js +8 -0
- package/dist/authz-module/components/ViewMoreLink.js.map +1 -0
- package/dist/authz-module/components/constants.d.ts +13 -0
- package/dist/authz-module/components/constants.js +80 -0
- package/dist/authz-module/components/constants.js.map +1 -0
- package/dist/authz-module/components/messages.d.ts +183 -0
- package/dist/authz-module/components/messages.js +185 -0
- package/dist/authz-module/components/messages.js.map +1 -0
- package/dist/authz-module/constants.d.ts +38 -0
- package/dist/authz-module/constants.js +77 -0
- package/dist/authz-module/constants.js.map +1 -0
- package/dist/authz-module/data/api.d.ts +109 -0
- package/dist/authz-module/data/api.js +107 -0
- package/dist/authz-module/data/api.js.map +1 -0
- package/dist/authz-module/data/hooks.d.ts +94 -0
- package/dist/authz-module/data/hooks.js +191 -0
- package/dist/authz-module/data/hooks.js.map +1 -0
- package/dist/authz-module/hooks/useCourseAuthoringFlag.d.ts +26 -0
- package/dist/authz-module/hooks/useCourseAuthoringFlag.js +86 -0
- package/dist/authz-module/hooks/useCourseAuthoringFlag.js.map +1 -0
- package/dist/authz-module/hooks/useQuerySettings.d.ts +27 -0
- package/dist/authz-module/hooks/useQuerySettings.js +72 -0
- package/dist/authz-module/hooks/useQuerySettings.js.map +1 -0
- package/dist/authz-module/hooks/useViewTeamPermissions.d.ts +5 -0
- package/dist/authz-module/hooks/useViewTeamPermissions.js +13 -0
- package/dist/authz-module/hooks/useViewTeamPermissions.js.map +1 -0
- package/dist/authz-module/index.d.ts +3 -0
- package/dist/authz-module/index.js +20 -0
- package/dist/authz-module/index.js.map +1 -0
- package/dist/authz-module/index.scss +131 -0
- package/dist/authz-module/messages.d.ts +48 -0
- package/dist/authz-module/messages.js +50 -0
- package/dist/authz-module/messages.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.d.ts +8 -0
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.js +154 -0
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.d.ts +2 -0
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.js +39 -0
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/components/DefineApplicationScopeStep.d.ts +8 -0
- package/dist/authz-module/role-assignation-wizard/components/DefineApplicationScopeStep.js +39 -0
- package/dist/authz-module/role-assignation-wizard/components/DefineApplicationScopeStep.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/components/HighlightedUsersInput.d.ts +11 -0
- package/dist/authz-module/role-assignation-wizard/components/HighlightedUsersInput.js +36 -0
- package/dist/authz-module/role-assignation-wizard/components/HighlightedUsersInput.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/components/OrgSection.d.ts +10 -0
- package/dist/authz-module/role-assignation-wizard/components/OrgSection.js +14 -0
- package/dist/authz-module/role-assignation-wizard/components/OrgSection.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/components/ScopeCheckboxItem.d.ts +8 -0
- package/dist/authz-module/role-assignation-wizard/components/ScopeCheckboxItem.js +5 -0
- package/dist/authz-module/role-assignation-wizard/components/ScopeCheckboxItem.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.d.ts +12 -0
- package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.js +12 -0
- package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/components/ScopeList.d.ts +20 -0
- package/dist/authz-module/role-assignation-wizard/components/ScopeList.js +30 -0
- package/dist/authz-module/role-assignation-wizard/components/ScopeList.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/components/SelectUsersAndRoleStep.d.ts +12 -0
- package/dist/authz-module/role-assignation-wizard/components/SelectUsersAndRoleStep.js +34 -0
- package/dist/authz-module/role-assignation-wizard/components/SelectUsersAndRoleStep.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/constants.d.ts +5 -0
- package/dist/authz-module/role-assignation-wizard/constants.js +6 -0
- package/dist/authz-module/role-assignation-wizard/constants.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/hooks/useScopeListData.d.ts +23 -0
- package/dist/authz-module/role-assignation-wizard/hooks/useScopeListData.js +112 -0
- package/dist/authz-module/role-assignation-wizard/hooks/useScopeListData.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/hooks/useScopePermissions.d.ts +10 -0
- package/dist/authz-module/role-assignation-wizard/hooks/useScopePermissions.js +54 -0
- package/dist/authz-module/role-assignation-wizard/hooks/useScopePermissions.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/messages.d.ts +243 -0
- package/dist/authz-module/role-assignation-wizard/messages.js +258 -0
- package/dist/authz-module/role-assignation-wizard/messages.js.map +1 -0
- package/dist/authz-module/role-assignation-wizard/utils.d.ts +5 -0
- package/dist/authz-module/role-assignation-wizard/utils.js +16 -0
- package/dist/authz-module/role-assignation-wizard/utils.js.map +1 -0
- package/dist/authz-module/roles-permissions/RolesPermissions.d.ts +2 -0
- package/dist/authz-module/roles-permissions/RolesPermissions.js +35 -0
- package/dist/authz-module/roles-permissions/RolesPermissions.js.map +1 -0
- package/dist/authz-module/roles-permissions/course/constants.d.ts +39 -0
- package/dist/authz-module/roles-permissions/course/constants.js +474 -0
- package/dist/authz-module/roles-permissions/course/constants.js.map +1 -0
- package/dist/authz-module/roles-permissions/index.d.ts +10 -0
- package/dist/authz-module/roles-permissions/index.js +15 -0
- package/dist/authz-module/roles-permissions/index.js.map +1 -0
- package/dist/authz-module/roles-permissions/library/constants.d.ts +18 -0
- package/dist/authz-module/roles-permissions/library/constants.js +193 -0
- package/dist/authz-module/roles-permissions/library/constants.js.map +1 -0
- package/dist/authz-module/roles-permissions/messages.d.ts +63 -0
- package/dist/authz-module/roles-permissions/messages.js +65 -0
- package/dist/authz-module/roles-permissions/messages.js.map +1 -0
- package/dist/authz-module/roles-permissions/utils.d.ts +41 -0
- package/dist/authz-module/roles-permissions/utils.js +70 -0
- package/dist/authz-module/roles-permissions/utils.js.map +1 -0
- package/dist/authz-module/team-members/TeamMembersTable.d.ts +5 -0
- package/dist/authz-module/team-members/TeamMembersTable.js +107 -0
- package/dist/authz-module/team-members/TeamMembersTable.js.map +1 -0
- package/dist/authz-module/team-members/messages.d.ts +33 -0
- package/dist/authz-module/team-members/messages.js +35 -0
- package/dist/authz-module/team-members/messages.js.map +1 -0
- package/dist/authz-module/utils.d.ts +24 -0
- package/dist/authz-module/utils.js +45 -0
- package/dist/authz-module/utils.js.map +1 -0
- package/dist/components/LoadingPage.d.ts +2 -0
- package/dist/components/LoadingPage.js +5 -0
- package/dist/components/LoadingPage.js.map +1 -0
- package/dist/components/ToastManager/ToastManagerContext.d.ts +24 -0
- package/dist/components/ToastManager/ToastManagerContext.js +91 -0
- package/dist/components/ToastManager/ToastManagerContext.js.map +1 -0
- package/dist/constants.d.ts +11 -0
- package/dist/constants.js +15 -0
- package/dist/constants.js.map +1 -0
- package/dist/data/api.d.ts +4 -0
- package/dist/data/api.js +21 -0
- package/dist/data/api.js.map +1 -0
- package/dist/data/hooks.d.ts +38 -0
- package/dist/data/hooks.js +69 -0
- package/dist/data/hooks.js.map +1 -0
- package/dist/data/types.d.ts +38 -0
- package/dist/data/types.js +2 -0
- package/dist/data/types.js.map +1 -0
- package/dist/data/utils.d.ts +6 -0
- package/dist/data/utils.js +11 -0
- package/dist/data/utils.js.map +1 -0
- package/dist/i18n/index.d.ts +1 -0
- package/dist/i18n/index.js +2 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/messages.d.ts +8 -0
- package/dist/messages.js +10 -0
- package/dist/messages.js.map +1 -0
- package/dist/providers.d.ts +3 -0
- package/dist/providers.js +4 -0
- package/dist/providers.js.map +1 -0
- package/dist/routes.d.ts +11 -0
- package/dist/routes.js +16 -0
- package/dist/routes.js.map +1 -0
- package/dist/style.scss +15 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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 {};
|