@openedx/frontend-app-admin-console 1.0.0-alpha.5 → 1.0.0-alpha.6
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/dist/Main.js +1 -2
- package/dist/Main.js.map +1 -1
- package/dist/authz-module/audit-user/index.js +5 -9
- package/dist/authz-module/audit-user/index.js.map +1 -1
- package/dist/authz-module/authz-home/index.js +1 -1
- package/dist/authz-module/authz-home/index.js.map +1 -1
- package/dist/authz-module/components/AuthZLayout.d.ts +7 -6
- package/dist/authz-module/components/AuthZLayout.js +9 -3
- package/dist/authz-module/components/AuthZLayout.js.map +1 -1
- package/dist/authz-module/components/AuthZTitle.d.ts +1 -1
- package/dist/authz-module/components/AuthZTitle.js +5 -5
- package/dist/authz-module/components/AuthZTitle.js.map +1 -1
- package/dist/authz-module/components/PermissionTable.js +5 -1
- package/dist/authz-module/components/PermissionTable.js.map +1 -1
- package/dist/authz-module/index.scss +13 -9
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.js +1 -1
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.js.map +1 -1
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.js +1 -1
- package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.js.map +1 -1
- package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.js +1 -1
- package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.js.map +1 -1
- package/dist/authz-module/roles-permissions/RolesPermissions.js +2 -2
- package/dist/authz-module/roles-permissions/RolesPermissions.js.map +1 -1
- package/dist/authz-module/team-members/TeamMembersTable.js +51 -51
- package/dist/authz-module/team-members/TeamMembersTable.js.map +1 -1
- package/dist/style.scss +19 -2
- package/package.json +1 -1
package/dist/Main.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { CurrentAppProvider, PageWrap, getSiteConfig, useIntl } from '@openedx/frontend-base';
|
|
3
|
-
import { Container } from '@openedx/paragon';
|
|
4
3
|
import { Helmet } from 'react-helmet';
|
|
5
4
|
import { appId } from './constants';
|
|
6
5
|
import messages from './messages';
|
|
@@ -10,7 +9,7 @@ const Main = () => {
|
|
|
10
9
|
const { formatMessage } = useIntl();
|
|
11
10
|
return (_jsxs(CurrentAppProvider, { appId: appId, children: [_jsx(Helmet, { children: _jsx("title", { children: formatMessage(messages['admin.console.page.title'], {
|
|
12
11
|
siteName: getSiteConfig().siteName,
|
|
13
|
-
}) }) }), _jsx(PageWrap, { children: _jsx(
|
|
12
|
+
}) }) }), _jsx(PageWrap, { children: _jsx(AuthZModule, {}) })] }));
|
|
14
13
|
};
|
|
15
14
|
export default Main;
|
|
16
15
|
//# sourceMappingURL=Main.js.map
|
package/dist/Main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Main.js","sourceRoot":"","sources":["../src/Main.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Main.js","sourceRoot":"","sources":["../src/Main.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,cAAc,CAAC;AAEtB,MAAM,IAAI,GAAG,GAAG,EAAE;IAChB,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,OAAO,CACL,MAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,aAC9B,KAAC,MAAM,cACL,0BACG,aAAa,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE;wBACnD,QAAQ,EAAE,aAAa,EAAE,CAAC,QAAQ;qBACnC,CAAC,GACI,GACD,EACT,KAAC,QAAQ,cACP,KAAC,WAAW,KAAG,GACN,IACQ,CACtB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC","sourcesContent":["import { CurrentAppProvider, PageWrap, getSiteConfig, useIntl } from '@openedx/frontend-base';\nimport { Helmet } from 'react-helmet';\n\nimport { appId } from './constants';\nimport messages from './messages';\nimport AuthZModule from './authz-module';\nimport './style.scss';\n\nconst Main = () => {\n const { formatMessage } = useIntl();\n\n return (\n <CurrentAppProvider appId={appId}>\n <Helmet>\n <title>\n {formatMessage(messages['admin.console.page.title'], {\n siteName: getSiteConfig().siteName,\n })}\n </title>\n </Helmet>\n <PageWrap>\n <AuthZModule />\n </PageWrap>\n </CurrentAppProvider>\n );\n};\n\nexport default Main;\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback, useContext, useEffect, useMemo, useState, } from 'react';
|
|
3
3
|
import { SiteContext, useIntl } from '@openedx/frontend-base';
|
|
4
|
-
import {
|
|
4
|
+
import { DataTable } from '@openedx/paragon';
|
|
5
5
|
import TableFooter from '../components/TableFooter/TableFooter';
|
|
6
6
|
import { AUTHZ_HOME_PATH, TABLE_DEFAULT_PAGE_SIZE, } from '../constants';
|
|
7
7
|
import AuthZLayout from '../components/AuthZLayout';
|
|
@@ -173,19 +173,15 @@ const AuditUserPage = () => {
|
|
|
173
173
|
};
|
|
174
174
|
runRevokeRole({ data });
|
|
175
175
|
};
|
|
176
|
-
return (_jsxs(
|
|
176
|
+
return (_jsxs(_Fragment, { children: [_jsx(ConfirmDeletionModal, { isOpen: showConfirmDeletionModal, close: handleCloseConfirmDeletionModal, onSave: handleRevokeUserRole, isDeleting: isRevokingUserRolePending, context: {
|
|
177
177
|
userName: (user === null || user === void 0 ? void 0 : user.username) || '',
|
|
178
178
|
scope: (roleToDelete === null || roleToDelete === void 0 ? void 0 : roleToDelete.scope) || '',
|
|
179
179
|
role: (roleToDelete === null || roleToDelete === void 0 ? void 0 : roleToDelete.role) || '',
|
|
180
180
|
name: (roleToDelete === null || roleToDelete === void 0 ? void 0 : roleToDelete.name) || '',
|
|
181
181
|
rolesCount: count || 0,
|
|
182
|
-
} }), _jsx(AuthZLayout, {
|
|
183
|
-
id: '',
|
|
184
|
-
org: '',
|
|
185
|
-
title: '',
|
|
186
|
-
}, navLinks: navLinks, activeLabel: (user === null || user === void 0 ? void 0 : user.username) || '', pageTitle: (user === null || user === void 0 ? void 0 : user.username) || '', pageSubtitle: (user === null || user === void 0 ? void 0 : user.email) || '', actions: [
|
|
182
|
+
} }), _jsx(AuthZLayout, { navLinks: navLinks, activeLabel: (user === null || user === void 0 ? void 0 : user.username) || '', pageTitle: (user === null || user === void 0 ? void 0 : user.username) || '', pageSubtitle: (user === null || user === void 0 ? void 0 : user.email) || '', actions: [
|
|
187
183
|
_jsx(AddRoleButton, { presetUsername: user === null || user === void 0 ? void 0 : user.username }, "add-role-button"),
|
|
188
|
-
], children: _jsx(
|
|
184
|
+
], children: _jsx("div", { className: "page-band py-5", children: _jsxs(DataTable, { isPaginated: true, isFilterable: true, isSortable: true, manualPagination: true, data: rowsWithPermissions, manualFilters: true, manualSortBy: true, fetchData: fetchData, itemCount: count, pageCount: pageCount, initialState: { pageSize: TABLE_DEFAULT_PAGE_SIZE }, additionalColumns: additionalColumns, columns: columns, isLoading: isLoadingUserAssignments, isExpandable: true, renderRowSubComponent: ({ row }) => (_jsx(UserPermissions, { row: row })), children: [_jsx(TableControlBar, { onFilterChange: setColumnsWithFiltersApplied }), _jsx(DataTable.Table, {}), _jsx(TableFooter, {})] }) }) })] }));
|
|
189
185
|
};
|
|
190
186
|
export default AuditUserPage;
|
|
191
187
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/authz-module/audit-user/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useCallback,\n useContext, useEffect, useMemo, useState,\n} from 'react';\nimport { SiteContext, useIntl } from '@openedx/frontend-base';\nimport {\n Container, DataTable,\n} from '@openedx/paragon';\nimport TableFooter from '@src/authz-module/components/TableFooter/TableFooter';\nimport {\n AUTHZ_HOME_PATH, TABLE_DEFAULT_PAGE_SIZE,\n} from '@src/authz-module/constants';\nimport AuthZLayout from '@src/authz-module/components/AuthZLayout';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useUserAccount, useValidateUserPermissionsNonSuspense } from '@src/data/hooks';\nimport { LIBRARY_ROLE_KEYS } from '@src/authz-module/roles-permissions';\nimport { useViewTeamPermissions } from '@src/authz-module/hooks/useViewTeamPermissions';\nimport { getHttpErrorStatus } from '@src/data/utils';\nimport baseMessages from '@src/authz-module/messages';\nimport AddRoleButton from '@src/authz-module/components/AddRoleButton';\nimport {\n OrgCell, RoleCell, ScopeCell, PermissionsCell, ViewAllPermissionsCell,\n createActionsCell,\n} from '@src/authz-module/components/TableCells';\nimport { useQuerySettings } from '@src/authz-module/hooks/useQuerySettings';\nimport { useCourseAuthoringFlag } from '@src/authz-module/hooks/useCourseAuthoringFlag';\nimport { useRevokeUserRoles, useUserAssignedRoles } from '@src/authz-module/data/hooks';\nimport type { RevokeUserRolesRequest } from '@src/authz-module/data/api';\nimport { RoleToDelete } from '@src/types';\nimport { useToastManager } from '@src/components/ToastManager/ToastManagerContext';\nimport UserPermissions from '@src/authz-module/components/UserPermissions';\nimport OrgFilter from '@src/authz-module/components/TableControlBar/OrgFilter';\nimport RolesFilter from '@src/authz-module/components/TableControlBar/RolesFilter';\nimport TableControlBar from '@src/authz-module/components/TableControlBar/TableControlBar';\nimport messages from './messages';\nimport ConfirmDeletionModal from '@src/authz-module/components/ConfirmDeletionModal';\nimport { getCellHeader, getScopeManageActionPermission } from '@src/authz-module/utils';\n\nconst AuditUserPage = () => {\n const { formatMessage } = useIntl();\n const [columnsWithFiltersApplied, setColumnsWithFiltersApplied] = useState<string[]>([]);\n const { username } = useParams();\n const { authenticatedUser } = useContext(SiteContext);\n const navigate = useNavigate();\n const {\n isLoading: isLoadingUser, data: user, isError: isErrorUser, error: errorUser,\n } = useUserAccount(username);\n const { querySettings, handleTableFetch } = useQuerySettings();\n\n const { isCourseViewAllowed } = useViewTeamPermissions();\n const { isCourseEnabled } = useCourseAuthoringFlag();\n\n const effectiveQuerySettings = useMemo(() => {\n if (isCourseViewAllowed || querySettings.roles) return querySettings;\n return { ...querySettings, roles: LIBRARY_ROLE_KEYS };\n }, [isCourseViewAllowed, querySettings]);\n\n const {\n isLoading: isLoadingUserAssignments, data: { results: userAssignments, count } = { results: [], count: 0 },\n } = useUserAssignedRoles(username, effectiveQuerySettings);\n const [roleToDelete, setRoleToDelete] = useState<RoleToDelete | null>(null);\n const [showConfirmDeletionModal, setShowConfirmDeletionModal] = useState(false);\n const {\n showToast, showErrorToast, Bold, Br,\n } = useToastManager();\n const { mutate: revokeUserRoles, isPending: isRevokingUserRolePending } = useRevokeUserRoles();\n\n const deletePermissions = useMemo(() => {\n const uniqueScopes = [...new Set(userAssignments.map(assignment => assignment.scope))];\n return uniqueScopes.map(scope => getScopeManageActionPermission(scope));\n }, [userAssignments]);\n\n const {\n data: permissionsToManageScope,\n } = useValidateUserPermissionsNonSuspense(deletePermissions);\n\n const rowsWithPermissions = useMemo(() => {\n if (!permissionsToManageScope) return userAssignments;\n\n return userAssignments.map(assignment => {\n const canManageScope = permissionsToManageScope.some(\n permission => permission.scope === assignment.scope && permission.allowed,\n );\n return {\n ...assignment,\n canManageScope,\n };\n });\n }, [userAssignments, permissionsToManageScope]);\n\n const fetchData = useMemo(() => handleTableFetch, [handleTableFetch]);\n\n useEffect(() => {\n if (!user && !isLoadingUser) {\n if (!isErrorUser || getHttpErrorStatus(errorUser) === 404) {\n navigate(AUTHZ_HOME_PATH);\n }\n }\n }, [user, isLoadingUser, navigate, isErrorUser, errorUser]);\n\n const handleShowConfirmDeletionModal = useCallback((role: RoleToDelete) => {\n if (isRevokingUserRolePending) return;\n\n setRoleToDelete(role);\n setShowConfirmDeletionModal(true);\n }, [isRevokingUserRolePending]);\n\n const navLinks = useMemo(() => [\n {\n label: formatMessage(baseMessages['authz.management.home.nav.link']),\n to: AUTHZ_HOME_PATH,\n },\n ], [formatMessage]);\n\n const additionalColumns = useMemo(() => [\n {\n id: 'view_permissions',\n Header: '',\n Cell: ViewAllPermissionsCell,\n },\n {\n id: 'action',\n Header: formatMessage(messages['authz.user.table.action.column.header']),\n Cell: createActionsCell({\n onClickDeleteButton: handleShowConfirmDeletionModal,\n isUserAuthenticatedPage: username === authenticatedUser?.username,\n isCourseEnabled,\n }),\n },\n ], [authenticatedUser?.username, formatMessage, handleShowConfirmDeletionModal, username, isCourseEnabled]);\n\n const columns = useMemo(() => [\n {\n Header: getCellHeader('role', formatMessage(messages['authz.user.table.role.column.header']), columnsWithFiltersApplied),\n accessor: 'role',\n Cell: RoleCell,\n filter: 'includesValue',\n Filter: RolesFilter,\n filterButtonText: formatMessage(messages['authz.user.table.role.column.header']),\n filterOrder: 2,\n },\n {\n Header: getCellHeader('org', formatMessage(messages['authz.user.table.organization.column.header']), columnsWithFiltersApplied),\n accessor: 'org',\n Cell: OrgCell,\n filter: 'includesValue',\n Filter: OrgFilter,\n filterButtonText: formatMessage(messages['authz.user.table.organization.column.header']),\n filterOrder: 1,\n },\n {\n Header: getCellHeader('scope', formatMessage(messages['authz.user.table.scope.column.header']), columnsWithFiltersApplied),\n accessor: 'scope',\n Cell: ScopeCell,\n disableFilters: true,\n\n },\n {\n Header: formatMessage(messages['authz.user.table.permissions.column.header']),\n Cell: PermissionsCell,\n disableFilters: true,\n disableSortBy: true,\n },\n ], [formatMessage, columnsWithFiltersApplied]);\n\n const pageCount = Math.ceil(count / TABLE_DEFAULT_PAGE_SIZE);\n\n const handleCloseConfirmDeletionModal = () => {\n setRoleToDelete(null);\n setShowConfirmDeletionModal(false);\n };\n\n const handleRevokeUserRole = () => {\n if (!user || !roleToDelete) return;\n\n const data = {\n users: user.username,\n role: roleToDelete.role,\n scope: roleToDelete.scope,\n };\n\n const runRevokeRole = (variables: { data: RevokeUserRolesRequest }) => {\n const variablesData = {\n data: {\n ...variables.data,\n querySettings,\n },\n\n };\n revokeUserRoles(variablesData, {\n onSuccess: (response) => {\n const { errors } = response;\n\n if (errors.length) {\n showToast({\n type: 'error',\n message: formatMessage(\n baseMessages['authz.team.toast.default.error.message'],\n { Bold, Br },\n ),\n });\n return;\n }\n\n const remainingRolesCount = count ? count - 1 : 0;\n showToast({\n message: formatMessage(\n baseMessages['authz.team.remove.user.toast.success.description'],\n {\n role: roleToDelete.name ?? roleToDelete.role,\n rolesCount: remainingRolesCount,\n },\n ),\n type: 'success',\n });\n handleCloseConfirmDeletionModal();\n if (remainingRolesCount === 0) {\n navigate(AUTHZ_HOME_PATH);\n }\n },\n onError: (error, retryVariables) => {\n showErrorToast(error, () => runRevokeRole(retryVariables));\n },\n });\n };\n\n runRevokeRole({ data });\n };\n\n return (\n <div className=\"authz-module\">\n <ConfirmDeletionModal\n isOpen={showConfirmDeletionModal}\n close={handleCloseConfirmDeletionModal}\n onSave={handleRevokeUserRole}\n isDeleting={isRevokingUserRolePending}\n context={{\n userName: user?.username || '',\n scope: roleToDelete?.scope || '',\n role: roleToDelete?.role || '',\n name: roleToDelete?.name || '',\n rolesCount: count || 0,\n }}\n />\n <AuthZLayout\n context={{\n id: '',\n org: '',\n title: '',\n }}\n navLinks={navLinks}\n activeLabel={user?.username || ''}\n pageTitle={user?.username || ''}\n pageSubtitle={user?.email || ''}\n actions={\n [\n <AddRoleButton presetUsername={user?.username} key=\"add-role-button\" />,\n ]\n }\n >\n <Container className=\"bg-light-200 p-5\">\n <DataTable\n isPaginated\n isFilterable\n isSortable\n manualPagination\n data={rowsWithPermissions}\n manualFilters\n manualSortBy\n fetchData={fetchData}\n itemCount={count}\n pageCount={pageCount}\n initialState={{ pageSize: TABLE_DEFAULT_PAGE_SIZE }}\n additionalColumns={additionalColumns}\n columns={columns}\n isLoading={isLoadingUserAssignments}\n isExpandable\n renderRowSubComponent={({ row }) => (\n <UserPermissions row={row} />\n )}\n >\n <TableControlBar onFilterChange={setColumnsWithFiltersApplied} />\n <DataTable.Table />\n <TableFooter />\n </DataTable>\n\n </Container>\n </AuthZLayout>\n </div>\n );\n};\n\nexport default AuditUserPage;\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/authz-module/audit-user/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useCallback,\n useContext, useEffect, useMemo, useState,\n} from 'react';\nimport { SiteContext, useIntl } from '@openedx/frontend-base';\nimport { DataTable } from '@openedx/paragon';\nimport TableFooter from '@src/authz-module/components/TableFooter/TableFooter';\nimport {\n AUTHZ_HOME_PATH, TABLE_DEFAULT_PAGE_SIZE,\n} from '@src/authz-module/constants';\nimport AuthZLayout from '@src/authz-module/components/AuthZLayout';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useUserAccount, useValidateUserPermissionsNonSuspense } from '@src/data/hooks';\nimport { LIBRARY_ROLE_KEYS } from '@src/authz-module/roles-permissions';\nimport { useViewTeamPermissions } from '@src/authz-module/hooks/useViewTeamPermissions';\nimport { getHttpErrorStatus } from '@src/data/utils';\nimport baseMessages from '@src/authz-module/messages';\nimport AddRoleButton from '@src/authz-module/components/AddRoleButton';\nimport {\n OrgCell, RoleCell, ScopeCell, PermissionsCell, ViewAllPermissionsCell,\n createActionsCell,\n} from '@src/authz-module/components/TableCells';\nimport { useQuerySettings } from '@src/authz-module/hooks/useQuerySettings';\nimport { useCourseAuthoringFlag } from '@src/authz-module/hooks/useCourseAuthoringFlag';\nimport { useRevokeUserRoles, useUserAssignedRoles } from '@src/authz-module/data/hooks';\nimport type { RevokeUserRolesRequest } from '@src/authz-module/data/api';\nimport { RoleToDelete } from '@src/types';\nimport { useToastManager } from '@src/components/ToastManager/ToastManagerContext';\nimport UserPermissions from '@src/authz-module/components/UserPermissions';\nimport OrgFilter from '@src/authz-module/components/TableControlBar/OrgFilter';\nimport RolesFilter from '@src/authz-module/components/TableControlBar/RolesFilter';\nimport TableControlBar from '@src/authz-module/components/TableControlBar/TableControlBar';\nimport messages from './messages';\nimport ConfirmDeletionModal from '@src/authz-module/components/ConfirmDeletionModal';\nimport { getCellHeader, getScopeManageActionPermission } from '@src/authz-module/utils';\n\nconst AuditUserPage = () => {\n const { formatMessage } = useIntl();\n const [columnsWithFiltersApplied, setColumnsWithFiltersApplied] = useState<string[]>([]);\n const { username } = useParams();\n const { authenticatedUser } = useContext(SiteContext);\n const navigate = useNavigate();\n const {\n isLoading: isLoadingUser, data: user, isError: isErrorUser, error: errorUser,\n } = useUserAccount(username);\n const { querySettings, handleTableFetch } = useQuerySettings();\n\n const { isCourseViewAllowed } = useViewTeamPermissions();\n const { isCourseEnabled } = useCourseAuthoringFlag();\n\n const effectiveQuerySettings = useMemo(() => {\n if (isCourseViewAllowed || querySettings.roles) return querySettings;\n return { ...querySettings, roles: LIBRARY_ROLE_KEYS };\n }, [isCourseViewAllowed, querySettings]);\n\n const {\n isLoading: isLoadingUserAssignments, data: { results: userAssignments, count } = { results: [], count: 0 },\n } = useUserAssignedRoles(username, effectiveQuerySettings);\n const [roleToDelete, setRoleToDelete] = useState<RoleToDelete | null>(null);\n const [showConfirmDeletionModal, setShowConfirmDeletionModal] = useState(false);\n const {\n showToast, showErrorToast, Bold, Br,\n } = useToastManager();\n const { mutate: revokeUserRoles, isPending: isRevokingUserRolePending } = useRevokeUserRoles();\n\n const deletePermissions = useMemo(() => {\n const uniqueScopes = [...new Set(userAssignments.map(assignment => assignment.scope))];\n return uniqueScopes.map(scope => getScopeManageActionPermission(scope));\n }, [userAssignments]);\n\n const {\n data: permissionsToManageScope,\n } = useValidateUserPermissionsNonSuspense(deletePermissions);\n\n const rowsWithPermissions = useMemo(() => {\n if (!permissionsToManageScope) return userAssignments;\n\n return userAssignments.map(assignment => {\n const canManageScope = permissionsToManageScope.some(\n permission => permission.scope === assignment.scope && permission.allowed,\n );\n return {\n ...assignment,\n canManageScope,\n };\n });\n }, [userAssignments, permissionsToManageScope]);\n\n const fetchData = useMemo(() => handleTableFetch, [handleTableFetch]);\n\n useEffect(() => {\n if (!user && !isLoadingUser) {\n if (!isErrorUser || getHttpErrorStatus(errorUser) === 404) {\n navigate(AUTHZ_HOME_PATH);\n }\n }\n }, [user, isLoadingUser, navigate, isErrorUser, errorUser]);\n\n const handleShowConfirmDeletionModal = useCallback((role: RoleToDelete) => {\n if (isRevokingUserRolePending) return;\n\n setRoleToDelete(role);\n setShowConfirmDeletionModal(true);\n }, [isRevokingUserRolePending]);\n\n const navLinks = useMemo(() => [\n {\n label: formatMessage(baseMessages['authz.management.home.nav.link']),\n to: AUTHZ_HOME_PATH,\n },\n ], [formatMessage]);\n\n const additionalColumns = useMemo(() => [\n {\n id: 'view_permissions',\n Header: '',\n Cell: ViewAllPermissionsCell,\n },\n {\n id: 'action',\n Header: formatMessage(messages['authz.user.table.action.column.header']),\n Cell: createActionsCell({\n onClickDeleteButton: handleShowConfirmDeletionModal,\n isUserAuthenticatedPage: username === authenticatedUser?.username,\n isCourseEnabled,\n }),\n },\n ], [authenticatedUser?.username, formatMessage, handleShowConfirmDeletionModal, username, isCourseEnabled]);\n\n const columns = useMemo(() => [\n {\n Header: getCellHeader('role', formatMessage(messages['authz.user.table.role.column.header']), columnsWithFiltersApplied),\n accessor: 'role',\n Cell: RoleCell,\n filter: 'includesValue',\n Filter: RolesFilter,\n filterButtonText: formatMessage(messages['authz.user.table.role.column.header']),\n filterOrder: 2,\n },\n {\n Header: getCellHeader('org', formatMessage(messages['authz.user.table.organization.column.header']), columnsWithFiltersApplied),\n accessor: 'org',\n Cell: OrgCell,\n filter: 'includesValue',\n Filter: OrgFilter,\n filterButtonText: formatMessage(messages['authz.user.table.organization.column.header']),\n filterOrder: 1,\n },\n {\n Header: getCellHeader('scope', formatMessage(messages['authz.user.table.scope.column.header']), columnsWithFiltersApplied),\n accessor: 'scope',\n Cell: ScopeCell,\n disableFilters: true,\n\n },\n {\n Header: formatMessage(messages['authz.user.table.permissions.column.header']),\n Cell: PermissionsCell,\n disableFilters: true,\n disableSortBy: true,\n },\n ], [formatMessage, columnsWithFiltersApplied]);\n\n const pageCount = Math.ceil(count / TABLE_DEFAULT_PAGE_SIZE);\n\n const handleCloseConfirmDeletionModal = () => {\n setRoleToDelete(null);\n setShowConfirmDeletionModal(false);\n };\n\n const handleRevokeUserRole = () => {\n if (!user || !roleToDelete) return;\n\n const data = {\n users: user.username,\n role: roleToDelete.role,\n scope: roleToDelete.scope,\n };\n\n const runRevokeRole = (variables: { data: RevokeUserRolesRequest }) => {\n const variablesData = {\n data: {\n ...variables.data,\n querySettings,\n },\n\n };\n revokeUserRoles(variablesData, {\n onSuccess: (response) => {\n const { errors } = response;\n\n if (errors.length) {\n showToast({\n type: 'error',\n message: formatMessage(\n baseMessages['authz.team.toast.default.error.message'],\n { Bold, Br },\n ),\n });\n return;\n }\n\n const remainingRolesCount = count ? count - 1 : 0;\n showToast({\n message: formatMessage(\n baseMessages['authz.team.remove.user.toast.success.description'],\n {\n role: roleToDelete.name ?? roleToDelete.role,\n rolesCount: remainingRolesCount,\n },\n ),\n type: 'success',\n });\n handleCloseConfirmDeletionModal();\n if (remainingRolesCount === 0) {\n navigate(AUTHZ_HOME_PATH);\n }\n },\n onError: (error, retryVariables) => {\n showErrorToast(error, () => runRevokeRole(retryVariables));\n },\n });\n };\n\n runRevokeRole({ data });\n };\n\n return (\n <>\n <ConfirmDeletionModal\n isOpen={showConfirmDeletionModal}\n close={handleCloseConfirmDeletionModal}\n onSave={handleRevokeUserRole}\n isDeleting={isRevokingUserRolePending}\n context={{\n userName: user?.username || '',\n scope: roleToDelete?.scope || '',\n role: roleToDelete?.role || '',\n name: roleToDelete?.name || '',\n rolesCount: count || 0,\n }}\n />\n <AuthZLayout\n navLinks={navLinks}\n activeLabel={user?.username || ''}\n pageTitle={user?.username || ''}\n pageSubtitle={user?.email || ''}\n actions={\n [\n <AddRoleButton presetUsername={user?.username} key=\"add-role-button\" />,\n ]\n }\n >\n <div className=\"page-band py-5\">\n <DataTable\n isPaginated\n isFilterable\n isSortable\n manualPagination\n data={rowsWithPermissions}\n manualFilters\n manualSortBy\n fetchData={fetchData}\n itemCount={count}\n pageCount={pageCount}\n initialState={{ pageSize: TABLE_DEFAULT_PAGE_SIZE }}\n additionalColumns={additionalColumns}\n columns={columns}\n isLoading={isLoadingUserAssignments}\n isExpandable\n renderRowSubComponent={({ row }) => (\n <UserPermissions row={row} />\n )}\n >\n <TableControlBar onFilterChange={setColumnsWithFiltersApplied} />\n <DataTable.Table />\n <TableFooter />\n </DataTable>\n </div>\n </AuthZLayout>\n </>\n );\n};\n\nexport default AuditUserPage;\n"]}
|
|
@@ -17,7 +17,7 @@ const AuthzHome = () => {
|
|
|
17
17
|
*/
|
|
18
18
|
const presetScope = ((_a = searchParams.get('scope')) === null || _a === void 0 ? void 0 : _a.replace(/\s/g, '+')) || undefined;
|
|
19
19
|
const pageTitle = intl.formatMessage(messages['authz.manage.page.title']);
|
|
20
|
-
return (_jsx(
|
|
20
|
+
return (_jsx(AuthZLayout, { pageTitle: pageTitle, actions: [_jsx(AddRoleButton, {}, "add-role-button")], children: _jsxs(Tabs, { variant: "tabs", defaultActiveKey: hash ? 'permissionsRoles' : 'team', className: "page-band bg-light-100", children: [_jsx(Tab, { eventKey: "team", title: intl.formatMessage(messages['authz.tabs.team']), className: "page-band py-5", children: _jsx(TeamMembersTable, { presetScope: presetScope }) }), _jsx(Tab, { id: "libraries-permissions-roles-tab", eventKey: "permissionsRoles", title: intl.formatMessage(messages['authz.tabs.permissionsRoles']), className: "page-band py-5", children: _jsx(RolesPermissions, {}) })] }) }));
|
|
21
21
|
};
|
|
22
22
|
export default AuthzHome;
|
|
23
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/authz-module/authz-home/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,gBAAgB,MAAM,iDAAiD,CAAC;AAC/E,OAAO,aAAa,MAAM,4CAA4C,CAAC;AACvE,OAAO,gBAAgB,MAAM,sDAAsD,CAAC;AACpF,OAAO,WAAW,MAAM,0CAA0C,CAAC;AAEnE,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,SAAS,GAAG,GAAG,EAAE;;IACrB,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,YAAY,CAAC,GAAG,eAAe,EAAE,CAAC;IAEzC;;MAEE;IACF,MAAM,WAAW,GAAG,CAAA,MAAA,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,0CAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAI,SAAS,CAAC;IAEhF,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAE1E,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/authz-module/authz-home/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,gBAAgB,MAAM,iDAAiD,CAAC;AAC/E,OAAO,aAAa,MAAM,4CAA4C,CAAC;AACvE,OAAO,gBAAgB,MAAM,sDAAsD,CAAC;AACpF,OAAO,WAAW,MAAM,0CAA0C,CAAC;AAEnE,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,SAAS,GAAG,GAAG,EAAE;;IACrB,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,YAAY,CAAC,GAAG,eAAe,EAAE,CAAC;IAEzC;;MAEE;IACF,MAAM,WAAW,GAAG,CAAA,MAAA,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,0CAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAI,SAAS,CAAC;IAEhF,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAE1E,OAAO,CACL,KAAC,WAAW,IACV,SAAS,EAAE,SAAS,EACpB,OAAO,EACL,CAAC,KAAC,aAAa,MAAK,iBAAiB,CAAG,CAAC,YAG3C,MAAC,IAAI,IACH,OAAO,EAAC,MAAM,EACd,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,EACpD,SAAS,EAAC,wBAAwB,aAElC,KAAC,GAAG,IAAC,QAAQ,EAAC,MAAM,EAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAC,gBAAgB,YACrG,KAAC,gBAAgB,IAAC,WAAW,EAAE,WAAW,GAAI,GAC1C,EACN,KAAC,GAAG,IAAC,EAAE,EAAC,iCAAiC,EAAC,QAAQ,EAAC,kBAAkB,EAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC,EAAE,SAAS,EAAC,gBAAgB,YAClK,KAAC,gBAAgB,KAAG,GAChB,IACD,GACK,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport { Tab, Tabs } from '@openedx/paragon';\nimport { useLocation, useSearchParams } from 'react-router-dom';\nimport TeamMembersTable from '@src/authz-module/team-members/TeamMembersTable';\nimport AddRoleButton from '@src/authz-module/components/AddRoleButton';\nimport RolesPermissions from '@src/authz-module/roles-permissions/RolesPermissions';\nimport AuthZLayout from '@src/authz-module/components/AuthZLayout';\n\nimport messages from './messages';\n\nconst AuthzHome = () => {\n const { hash } = useLocation();\n const intl = useIntl();\n const [searchParams] = useSearchParams();\n\n /* In the authoring repository the scope is encoded but this is to Replace spaces with '+'\n to match URL encoding format in case the 'scope' parameter is provided with spaces instead of '+'\n */\n const presetScope = searchParams.get('scope')?.replace(/\\s/g, '+') || undefined;\n\n const pageTitle = intl.formatMessage(messages['authz.manage.page.title']);\n\n return (\n <AuthZLayout\n pageTitle={pageTitle}\n actions={\n [<AddRoleButton key=\"add-role-button\" />]\n }\n >\n <Tabs\n variant=\"tabs\"\n defaultActiveKey={hash ? 'permissionsRoles' : 'team'}\n className=\"page-band bg-light-100\"\n >\n <Tab eventKey=\"team\" title={intl.formatMessage(messages['authz.tabs.team'])} className=\"page-band py-5\">\n <TeamMembersTable presetScope={presetScope} />\n </Tab>\n <Tab id=\"libraries-permissions-roles-tab\" eventKey=\"permissionsRoles\" title={intl.formatMessage(messages['authz.tabs.permissionsRoles'])} className=\"page-band py-5\">\n <RolesPermissions />\n </Tab>\n </Tabs>\n </AuthZLayout>\n );\n};\n\nexport default AuthzHome;\n"]}
|
|
@@ -2,11 +2,12 @@ import { ReactNode } from 'react';
|
|
|
2
2
|
import { AuthZTitleProps } from './AuthZTitle';
|
|
3
3
|
interface AuthZLayoutProps extends AuthZTitleProps {
|
|
4
4
|
children: ReactNode;
|
|
5
|
-
context: {
|
|
6
|
-
id: string;
|
|
7
|
-
org: string;
|
|
8
|
-
title: string;
|
|
9
|
-
};
|
|
10
5
|
}
|
|
11
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Page chrome for the authz module: the title band, then the body below it.
|
|
8
|
+
* The body only paints its colour, edge to edge. Each page marks the parts of its
|
|
9
|
+
* content that should line up with the header using `page-band`, so anything meant
|
|
10
|
+
* to bleed across the full width -- a stepper header, a toolbar -- simply omits it.
|
|
11
|
+
*/
|
|
12
|
+
declare const AuthZLayout: ({ children, ...titleProps }: AuthZLayoutProps) => import("react").JSX.Element;
|
|
12
13
|
export default AuthZLayout;
|
|
@@ -9,11 +9,17 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
9
9
|
}
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
|
-
import { jsx as _jsx,
|
|
12
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
13
|
import AuthZTitle from './AuthZTitle';
|
|
14
|
+
/**
|
|
15
|
+
* Page chrome for the authz module: the title band, then the body below it.
|
|
16
|
+
* The body only paints its colour, edge to edge. Each page marks the parts of its
|
|
17
|
+
* content that should line up with the header using `page-band`, so anything meant
|
|
18
|
+
* to bleed across the full width -- a stepper header, a toolbar -- simply omits it.
|
|
19
|
+
*/
|
|
14
20
|
const AuthZLayout = (_a) => {
|
|
15
|
-
var { children } = _a,
|
|
16
|
-
return (_jsxs(
|
|
21
|
+
var { children } = _a, titleProps = __rest(_a, ["children"]);
|
|
22
|
+
return (_jsxs("div", { className: "authz-module", children: [_jsx(AuthZTitle, Object.assign({}, titleProps)), _jsx("div", { className: "bg-light-200", children: children })] }));
|
|
17
23
|
};
|
|
18
24
|
export default AuthZLayout;
|
|
19
25
|
//# sourceMappingURL=AuthZLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthZLayout.js","sourceRoot":"","sources":["../../../src/authz-module/components/AuthZLayout.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,UAA+B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthZLayout.js","sourceRoot":"","sources":["../../../src/authz-module/components/AuthZLayout.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,UAA+B,MAAM,cAAc,CAAC;AAM3D;;;;;GAKG;AACH,MAAM,WAAW,GAAG,CAAC,EAA6C,EAAE,EAAE;QAAjD,EAAE,QAAQ,OAAmC,EAA9B,UAAU,cAAzB,YAA2B,CAAF;IAAyB,OAAA,CACrE,eAAK,SAAS,EAAC,cAAc,aAC3B,KAAC,UAAU,oBAAK,UAAU,EAAI,EAC9B,cAAK,SAAS,EAAC,cAAc,YAC1B,QAAQ,GACL,IACF,CACP,CAAA;CAAA,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import { ReactNode } from 'react';\nimport AuthZTitle, { AuthZTitleProps } from './AuthZTitle';\n\ninterface AuthZLayoutProps extends AuthZTitleProps {\n children: ReactNode;\n}\n\n/**\n * Page chrome for the authz module: the title band, then the body below it.\n * The body only paints its colour, edge to edge. Each page marks the parts of its\n * content that should line up with the header using `page-band`, so anything meant\n * to bleed across the full width -- a stepper header, a toolbar -- simply omits it.\n */\nconst AuthZLayout = ({ children, ...titleProps }: AuthZLayoutProps) => (\n <div className=\"authz-module\">\n <AuthZTitle {...titleProps} />\n <div className=\"bg-light-200\">\n {children}\n </div>\n </div>\n);\n\nexport default AuthZLayout;\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { isValidElement, Fragment, } from 'react';
|
|
3
3
|
import { Link } from 'react-router-dom';
|
|
4
|
-
import { Breadcrumb, Col,
|
|
4
|
+
import { Breadcrumb, Col, Row, Button, Stack, useMediaQuery, breakpoints, } from '@openedx/paragon';
|
|
5
5
|
export const ActionButton = ({ label, icon, onClick }) => (_jsx(Button, { iconBefore: icon, onClick: onClick, children: label }));
|
|
6
6
|
const AuthZTitle = ({ activeLabel, navLinks = [], pageTitle, pageSubtitle, actions = [], }) => {
|
|
7
7
|
const isDesktop = useMediaQuery({ minWidth: breakpoints.large.minWidth });
|
|
8
|
-
return (_jsxs(
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
return (_jsxs("div", { className: "page-band py-5 bg-light-100", children: [_jsx(Breadcrumb, { linkAs: Link, links: navLinks, activeLabel: activeLabel }), _jsxs(Row, { className: "mt-4", children: [_jsx(Col, { xs: 12, md: 7, className: "mb-4", children: _jsxs("div", { className: "d-flex align-items-center flex-column-sm", children: [_jsx("h2", { className: "text-primary mb-0", children: pageTitle }), pageSubtitle && (_jsxs(_Fragment, { children: [_jsx("hr", { className: "authz-action-divider mx-lg-3" }), typeof pageSubtitle === 'string'
|
|
9
|
+
? _jsx("h3", { className: "mb-0 py-2 font-weight-light text-gray-700", children: pageSubtitle })
|
|
10
|
+
: _jsx("div", { className: "mb-0", children: pageSubtitle })] }))] }) }), _jsx(Col, { xs: 12, md: 5, children: _jsx(Stack, { className: "justify-content-end", direction: isDesktop ? 'horizontal' : 'vertical', children: actions.map((action, index) => {
|
|
11
11
|
const content = isValidElement(action)
|
|
12
12
|
? action
|
|
13
13
|
: _jsx(ActionButton, Object.assign({}, action));
|
|
@@ -15,7 +15,7 @@ const AuthZTitle = ({ activeLabel, navLinks = [], pageTitle, pageSubtitle, actio
|
|
|
15
15
|
? action.key
|
|
16
16
|
: action.label;
|
|
17
17
|
return (_jsxs(Fragment, { children: [content, (index === actions.length - 1) ? null
|
|
18
|
-
: (_jsx("hr", { className: "mx-lg-5" }))] }, `authz-header-action-${key}`));
|
|
18
|
+
: (_jsx("hr", { className: "authz-action-divider mx-lg-5" }))] }, `authz-header-action-${key}`));
|
|
19
19
|
}) }) })] })] }));
|
|
20
20
|
};
|
|
21
21
|
export default AuthZTitle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthZTitle.js","sourceRoot":"","sources":["../../../src/authz-module/components/AuthZTitle.tsx"],"names":[],"mappings":";AAAA,OAAO,EACU,cAAc,EAAa,QAAQ,GACnD,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EACL,UAAU,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"AuthZTitle.js","sourceRoot":"","sources":["../../../src/authz-module/components/AuthZTitle.tsx"],"names":[],"mappings":";AAAA,OAAO,EACU,cAAc,EAAa,QAAQ,GACnD,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EACL,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAC5B,KAAK,EACL,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAqB1B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAU,EAAE,EAAE,CAAC,CAChE,KAAC,MAAM,IACL,UAAU,EAAE,IAAI,EAChB,OAAO,EAAE,OAAO,YAEf,KAAK,GACC,CACV,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,EAClB,WAAW,EAAE,QAAQ,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,GAAG,EAAE,GACjD,EAAE,EAAE;IACpB,MAAM,SAAS,GAAG,aAAa,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1E,OAAO,CACL,eAAK,SAAS,EAAC,6BAA6B,aAC1C,KAAC,UAAU,IACT,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,WAAW,GACxB,EACF,MAAC,GAAG,IAAC,SAAS,EAAC,MAAM,aACnB,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAC,MAAM,YAClC,eAAK,SAAS,EAAC,0CAA0C,aACvD,aAAI,SAAS,EAAC,mBAAmB,YAAE,SAAS,GAAM,EACjD,YAAY,IAAI,CACf,8BACE,aAAI,SAAS,EAAC,8BAA8B,GAAG,EAC9C,OAAO,YAAY,KAAK,QAAQ;4CAC/B,CAAC,CAAC,aAAI,SAAS,EAAC,2CAA2C,YAAE,YAAY,GAAM;4CAC/E,CAAC,CAAC,cAAK,SAAS,EAAC,MAAM,YAAE,YAAY,GAAO,IAC7C,CACJ,IAEG,GACF,EACN,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,YAChB,KAAC,KAAK,IAAC,SAAS,EAAC,qBAAqB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,YAEnF,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gCAC5B,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC;oCACpC,CAAC,CAAC,MAAM;oCACR,CAAC,CAAC,KAAC,YAAY,oBAAK,MAAgB,EAAI,CAAC;gCAC3C,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC;oCAChC,CAAC,CAAC,MAAM,CAAC,GAAG;oCACZ,CAAC,CAAE,MAAiB,CAAC,KAAK,CAAC;gCAC7B,OAAO,CACL,MAAC,QAAQ,eACN,OAAO,EACP,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;4CACpC,CAAC,CAAC,CAAC,aAAI,SAAS,EAAC,8BAA8B,GAAG,CAAC,KAHxC,uBAAuB,GAAG,EAAE,CAIhC,CACZ,CAAC;4BACJ,CAAC,CAAC,GAEE,GACJ,IACF,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import {\n ComponentType, isValidElement, ReactNode, Fragment,\n} from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n Breadcrumb, Col, Row, Button,\n Stack,\n useMediaQuery,\n breakpoints,\n} from '@openedx/paragon';\n\ninterface BreadcrumbLink {\n label: string;\n to?: string;\n}\n\ninterface Action {\n label: string;\n icon?: ComponentType;\n onClick: () => void;\n}\n\nexport interface AuthZTitleProps {\n activeLabel?: string;\n pageTitle: string;\n pageSubtitle?: string | ReactNode;\n navLinks?: BreadcrumbLink[];\n actions?: (Action | ReactNode)[];\n}\n\nexport const ActionButton = ({ label, icon, onClick }: Action) => (\n <Button\n iconBefore={icon}\n onClick={onClick}\n >\n {label}\n </Button>\n);\n\nconst AuthZTitle = ({\n activeLabel, navLinks = [], pageTitle, pageSubtitle, actions = [],\n}: AuthZTitleProps) => {\n const isDesktop = useMediaQuery({ minWidth: breakpoints.large.minWidth });\n return (\n <div className=\"page-band py-5 bg-light-100\">\n <Breadcrumb\n linkAs={Link}\n links={navLinks}\n activeLabel={activeLabel}\n />\n <Row className=\"mt-4\">\n <Col xs={12} md={7} className=\"mb-4\">\n <div className=\"d-flex align-items-center flex-column-sm\">\n <h2 className=\"text-primary mb-0\">{pageTitle}</h2>\n {pageSubtitle && (\n <>\n <hr className=\"authz-action-divider mx-lg-3\" />\n {typeof pageSubtitle === 'string'\n ? <h3 className=\"mb-0 py-2 font-weight-light text-gray-700\">{pageSubtitle}</h3>\n : <div className=\"mb-0\">{pageSubtitle}</div>}\n </>\n )}\n\n </div>\n </Col>\n <Col xs={12} md={5}>\n <Stack className=\"justify-content-end\" direction={isDesktop ? 'horizontal' : 'vertical'}>\n {\n actions.map((action, index) => {\n const content = isValidElement(action)\n ? action\n : <ActionButton {...action as Action} />;\n const key = isValidElement(action)\n ? action.key\n : (action as Action).label;\n return (\n <Fragment key={`authz-header-action-${key}`}>\n {content}\n {(index === actions.length - 1) ? null\n : (<hr className=\"authz-action-divider mx-lg-5\" />)}\n </Fragment>\n );\n })\n }\n </Stack>\n </Col>\n </Row>\n </div>\n );\n};\n\nexport default AuthZTitle;\n"]}
|
|
@@ -8,7 +8,11 @@ import ResourceTooltip from './ResourceTooltip';
|
|
|
8
8
|
import messages from './messages';
|
|
9
9
|
const PermissionTable = ({ permissionsTable, roles, title }) => {
|
|
10
10
|
const { formatMessage } = useIntl();
|
|
11
|
-
return (
|
|
11
|
+
return (
|
|
12
|
+
// Only the narrowest viewports are too small for the matrix, so the card scrolls there
|
|
13
|
+
// (see `.permission-table-scroll`). Above that it is not a scroll container, which is
|
|
14
|
+
// what lets the header row stick to the viewport as the page scrolls.
|
|
15
|
+
_jsx(Card, { className: "permission-table-scroll", children: _jsxs("table", { className: "permission-table w-100", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { className: "sticky-top bg-white px-4 py-3", children: title }), roles.map(role => (_jsx("th", { className: `text-center py-3 sticky-top bg-white ${role.disabled ? 'text-gray-200' : ''}`, children: role.disabled ? (_jsx(OverlayTrigger, { placement: "top", overlay: (_jsx(Tooltip, { id: `tooltip-${role.name}`, variant: "light", children: formatMessage(messages['authz.role.card.permission.for.role.status.disabled']) })), children: _jsx("span", { style: { cursor: 'help' }, children: role.name }) })) : (role.name) }, role.name)))] }) }), _jsx("tbody", { children: permissionsTable.map(resourceGroup => (_jsxs(React.Fragment, { children: [_jsx("tr", { className: "bg-info-100 text-primary", children: _jsx("td", { colSpan: roles.length + 1, className: "text-start py-3 px-4", children: _jsxs("div", { className: "d-flex align-items-center", children: [resourceGroup.icon && _jsx(Icon, { className: "d-inline-block mr-2", size: "xs", src: resourceGroup.icon }), _jsx("strong", { children: resourceGroup.label }), _jsx(ResourceTooltip, { resourceGroup: resourceGroup })] }) }) }), resourceGroup.permissions.map(permission => (_jsxs("tr", { className: "border-top", children: [_jsxs("td", { className: "text-start d-flex align-items-center small px-4 py-3", children: [_jsx(Icon, { className: "d-inline-block mr-2", size: "sm", src: actionsDictionary[permission.actionKey] }), permission.label] }), roles.map(role => (_jsx("td", { className: `text-center ${role.disabled ? 'text-gray-200' : ''}`, children: permission.roles[role.name]
|
|
12
16
|
? (_jsx(Icon, { className: `d-inline-block ${role.disabled ? 'text-gray-200' : 'text-success'}`, src: Check, "aria-label": formatMessage(messages['authz.role.card.permission.for.role.status.granted'], {
|
|
13
17
|
roleName: role.name,
|
|
14
18
|
}), screenReaderText: formatMessage(messages['authz.role.card.permission.for.role.status.granted'], {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionTable.js","sourceRoot":"","sources":["../../../src/authz-module/components/PermissionTable.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACL,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,GACpC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAQlC,MAAM,eAAe,GAAG,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAwB,EAAE,EAAE;IACnF,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"PermissionTable.js","sourceRoot":"","sources":["../../../src/authz-module/components/PermissionTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport { Check, Close } from '@openedx/paragon/icons';\nimport {\n Card, Icon, OverlayTrigger, Tooltip,\n} from '@openedx/paragon';\nimport { PermissionsResourceGrouped, Role } from '@src/types';\nimport { actionsDictionary } from './RoleCard/constants';\nimport ResourceTooltip from './ResourceTooltip';\nimport messages from './messages';\n\ninterface PermissionTableProps {\n roles: Role[];\n permissionsTable: PermissionsResourceGrouped[];\n title?: string;\n}\n\nconst PermissionTable = ({ permissionsTable, roles, title }: PermissionTableProps) => {\n const { formatMessage } = useIntl();\n return (\n // Only the narrowest viewports are too small for the matrix, so the card scrolls there\n // (see `.permission-table-scroll`). Above that it is not a scroll container, which is\n // what lets the header row stick to the viewport as the page scrolls.\n <Card className=\"permission-table-scroll\">\n <table className=\"permission-table w-100\">\n <thead>\n <tr>\n <th className=\"sticky-top bg-white px-4 py-3\">\n {title}\n </th>\n {roles.map(role => (\n <th\n key={role.name}\n className={`text-center py-3 sticky-top bg-white ${role.disabled ? 'text-gray-200' : ''}`}\n >\n {role.disabled ? (\n <OverlayTrigger\n placement=\"top\"\n overlay={(\n <Tooltip\n id={`tooltip-${role.name}`}\n variant=\"light\"\n >\n {formatMessage(messages['authz.role.card.permission.for.role.status.disabled'])}\n </Tooltip>\n )}\n >\n <span style={{ cursor: 'help' }}>{role.name}</span>\n </OverlayTrigger>\n ) : (\n role.name\n )}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {permissionsTable.map(resourceGroup => (\n <React.Fragment key={resourceGroup.key}>\n <tr className=\"bg-info-100 text-primary\">\n <td colSpan={roles.length + 1} className=\"text-start py-3 px-4\">\n <div className=\"d-flex align-items-center\">\n {resourceGroup.icon && <Icon className=\"d-inline-block mr-2\" size=\"xs\" src={resourceGroup.icon} />}\n <strong>{resourceGroup.label}</strong>\n <ResourceTooltip resourceGroup={resourceGroup} />\n </div>\n </td>\n </tr>\n {resourceGroup.permissions.map(permission => (\n <tr key={permission.key} className=\"border-top\">\n <td className=\"text-start d-flex align-items-center small px-4 py-3\">\n <Icon className=\"d-inline-block mr-2\" size=\"sm\" src={actionsDictionary[permission.actionKey]} />\n {permission.label}\n </td>\n {roles.map(role => (\n <td key={role.name} className={`text-center ${role.disabled ? 'text-gray-200' : ''}`}>\n {\n permission.roles[role.name]\n ? (\n <Icon\n className={`d-inline-block ${role.disabled ? 'text-gray-200' : 'text-success'}`}\n src={Check}\n aria-label={formatMessage(messages['authz.role.card.permission.for.role.status.granted'], {\n roleName: role.name,\n })}\n screenReaderText={formatMessage(messages['authz.role.card.permission.for.role.status.granted'], {\n roleName: role.name,\n })}\n />\n )\n : (\n <Icon\n className={`d-inline-block ${role.disabled ? 'text-gray-200' : 'text-danger'}`}\n src={Close}\n aria-label={formatMessage(messages['authz.role.card.permission.for.role.status.not.granted'], {\n roleName: role.name,\n })}\n screenReaderText={formatMessage(messages['authz.role.card.permission.for.role.status.not.granted'], {\n roleName: role.name,\n })}\n />\n )\n }\n </td>\n ))}\n </tr>\n ))}\n </React.Fragment>\n ))}\n </tbody>\n </table>\n </Card>\n );\n};\n\nexport default PermissionTable;\n"]}
|
|
@@ -24,16 +24,12 @@
|
|
|
24
24
|
min-height: 700px;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
.authz-action-divider {
|
|
28
28
|
border-right: var(--pgn-size-border-width) solid var(--pgn-color-border);
|
|
29
29
|
height: var(--height-action-divider);
|
|
30
30
|
width: 0;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
.tab-content {
|
|
34
|
-
background-color: var(--pgn-color-light-200);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
33
|
.collapsible-card {
|
|
38
34
|
border: none;
|
|
39
35
|
|
|
@@ -66,12 +62,23 @@
|
|
|
66
62
|
line-height: 24px;
|
|
67
63
|
}
|
|
68
64
|
}
|
|
65
|
+
|
|
66
|
+
// Paragon's `.overflow-auto` lives in the `paragon` cascade layer, where its `!important`
|
|
67
|
+
// outranks anything this layer can say, so the card carries its own class instead. The
|
|
68
|
+
// matrix is 432px at min-content: only the narrowest screens need the card to scroll, and
|
|
69
|
+
// the cap is what gives the sticky header something to stick to while it is the scroller.
|
|
70
|
+
@media (--pgn-size-breakpoint-max-width-xs) {
|
|
71
|
+
.permission-table-scroll {
|
|
72
|
+
overflow: auto;
|
|
73
|
+
max-height: 80vh;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
69
76
|
|
|
70
77
|
@media(--pgn-size-breakpoint-max-width-sm){
|
|
71
78
|
.flex-column-sm {
|
|
72
79
|
flex-direction: column;
|
|
73
80
|
}
|
|
74
|
-
|
|
81
|
+
.authz-action-divider {
|
|
75
82
|
border-top: var(--pgn-size-border-width) solid var(--pgn-color-border);
|
|
76
83
|
border-right: none;
|
|
77
84
|
width: 100%;
|
|
@@ -126,6 +133,3 @@
|
|
|
126
133
|
max-height: 500px;
|
|
127
134
|
}
|
|
128
135
|
|
|
129
|
-
.scope-search-input {
|
|
130
|
-
width: 18.75rem; // 300px
|
|
131
|
-
}
|
|
@@ -138,7 +138,7 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = [], }) => {
|
|
|
138
138
|
const parsedUsers = parseUsers(users);
|
|
139
139
|
const canProceed = parsedUsers.length > 0 && !!selectedRole;
|
|
140
140
|
const canSave = selectedScopes.size > 0;
|
|
141
|
-
return (_jsxs(Stepper, { activeKey: activeStep, children: [_jsx(Stepper.Header, { className: "bg-info-100" }), _jsxs("div", { className: "
|
|
141
|
+
return (_jsxs(Stepper, { activeKey: activeStep, children: [_jsx(Stepper.Header, { className: "bg-info-100" }), _jsxs("div", { className: "page-band py-5", children: [_jsx(Stepper.Step, { eventKey: STEPS.SELECT_USERS_AND_ROLE, title: intl.formatMessage(messages['wizard.step.selectUsersAndRole.title']), hasError: invalidUsers.length > 0, description: invalidUsers.length > 0 ? intl.formatMessage(messages['wizard.step.selectUsersAndRole.error']) : '', index: 0, children: _jsx(SelectUsersAndRoleStep, { users: users, setUsers: handleUsersChange, selectedRole: selectedRole, setSelectedRole: setSelectedRole, roles: roles, invalidUsers: invalidUsers, inputRef: usersInputRef }) }), _jsx(Stepper.Step, { eventKey: STEPS.DEFINE_APPLICATION_SCOPE, title: intl.formatMessage(messages['wizard.step.defineScope.title']), index: 1, children: _jsx(DefineApplicationScopeStep, { selectedRole: selectedRole, selectedScopes: selectedScopes, onScopeToggle: handleScopeToggle, assignmentErrors: assignmentErrors }) })] }), _jsxs("div", { className: "page-band py-5", children: [_jsxs(Stepper.ActionRow, { eventKey: STEPS.SELECT_USERS_AND_ROLE, children: [_jsx(Button, { variant: "outline-primary", onClick: handleClose, children: intl.formatMessage(messages['wizard.button.cancel']) }), _jsx(Stepper.ActionRow.Spacer, {}), _jsx(StatefulButton, { labels: {
|
|
142
142
|
default: intl.formatMessage(messages['wizard.button.next']),
|
|
143
143
|
pending: intl.formatMessage(messages['wizard.button.next.pending']),
|
|
144
144
|
}, icons: { pending: _jsx(Icon, { src: SpinnerSimple }) }, variant: invalidUsers.length ? 'danger' : 'primary', state: validateUsersMutation.isPending ? 'pending' : 'default', onClick: validateUsersAndProceed, disabled: !canProceed || validateUsersMutation.isPending })] }), _jsxs(Stepper.ActionRow, { eventKey: STEPS.DEFINE_APPLICATION_SCOPE, children: [_jsx(Button, { variant: "outline-primary", onClick: handleClose, children: intl.formatMessage(messages['wizard.button.cancel']) }), _jsx(Button, { variant: "tertiary", onClick: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssignRoleWizard.js","sourceRoot":"","sources":["../../../src/authz-module/role-assignation-wizard/AssignRoleWizard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useState, useCallback, useRef, useEffect,\n} from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport {\n Stepper, Button, StatefulButton, Icon,\n} from '@openedx/paragon';\nimport { SpinnerSimple } from '@openedx/paragon/icons';\nimport { RoleMetadata } from '@src/types';\nimport { useToastManager } from '@src/components/ToastManager/ToastManagerContext';\nimport SelectUsersAndRoleStep from './components/SelectUsersAndRoleStep';\nimport DefineApplicationScopeStep from './components/DefineApplicationScopeStep';\nimport { useValidateUsers, useAssignTeamMembersRole } from '@src/authz-module/data/hooks';\nimport messages from './messages';\nimport { formatRoleAssignmentError } from './utils';\n\nconst STEPS = {\n SELECT_USERS_AND_ROLE: 'select-users-and-role',\n DEFINE_APPLICATION_SCOPE: 'define-application-scope',\n} as const;\n\ntype StepKey = typeof STEPS[keyof typeof STEPS];\n\ninterface AssignRoleWizardProps {\n onClose: () => void;\n initialUsers?: string;\n roles?: RoleMetadata[];\n}\n\nconst parseUsers = (input: string): string[] => input\n .split(',')\n .map((u) => u.trim())\n .filter(Boolean);\n\nconst getInitialState = (initialUsers: string) => ({\n activeStep: STEPS.SELECT_USERS_AND_ROLE as StepKey,\n users: initialUsers,\n selectedRole: null as string | null,\n selectedScopes: new Set<string>(),\n invalidUsers: [] as string[],\n validatedUsers: [] as string[],\n});\n\nconst AssignRoleWizard = ({\n onClose, initialUsers = '', roles = [],\n}: AssignRoleWizardProps) => {\n const intl = useIntl();\n const { showToast, showErrorToast } = useToastManager();\n const [activeStep, setActiveStep] = useState<StepKey>(STEPS.SELECT_USERS_AND_ROLE);\n const [users, setUsers] = useState(initialUsers);\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n const [selectedScopes, setSelectedScopes] = useState<Set<string>>(new Set());\n\n const [invalidUsers, setInvalidUsers] = useState<string[]>([]);\n const [validatedUsers, setValidatedUsers] = useState<string[]>([]);\n const [assignmentErrors, setAssignmentErrors] = useState<string[]>([]);\n\n const usersInputRef = useRef<HTMLTextAreaElement>(null);\n\n const validateUsersMutation = useValidateUsers();\n const assignRoleMutation = useAssignTeamMembersRole();\n\n const handleUsersChange = useCallback((value: string) => {\n setInvalidUsers((prev) => (prev.length > 0 ? [] : prev));\n setUsers(value);\n }, []);\n\n const resetState = () => {\n const initialState = getInitialState(initialUsers);\n setActiveStep(initialState.activeStep);\n setUsers(initialState.users);\n setSelectedRole(initialState.selectedRole);\n setSelectedScopes(initialState.selectedScopes);\n setInvalidUsers(initialState.invalidUsers);\n setValidatedUsers(initialState.validatedUsers);\n setAssignmentErrors([]);\n };\n\n const handleClose = () => {\n resetState();\n onClose();\n };\n\n const validateUsersAndProceed = async () => {\n if (validateUsersMutation.isPending) return;\n const usersList = parseUsers(users);\n if (usersList.length === 0 || !selectedRole) return;\n\n setInvalidUsers([]);\n\n try {\n const result = await validateUsersMutation.mutateAsync({ data: { users: usersList } });\n if (result.invalidUsers?.length > 0) {\n setInvalidUsers(result.invalidUsers);\n } else {\n setValidatedUsers(usersList);\n setActiveStep(STEPS.DEFINE_APPLICATION_SCOPE);\n }\n } catch (error) {\n showErrorToast(error, validateUsersAndProceed);\n }\n };\n\n const handleScopeToggle = useCallback((scopeId: string) => {\n setSelectedScopes((prev) => {\n const next = new Set(prev);\n if (next.has(scopeId))\n next.delete(scopeId);\n else\n next.add(scopeId);\n return next;\n });\n }, []);\n\n const handleSave = async () => {\n if (!selectedRole || selectedScopes.size === 0 || validatedUsers.length === 0) return;\n setAssignmentErrors([]);\n\n try {\n const result = await assignRoleMutation.mutateAsync({\n data: {\n users: validatedUsers,\n role: selectedRole,\n scopes: Array.from(selectedScopes),\n },\n });\n\n if (result.errors?.length > 0) {\n setAssignmentErrors(result.errors.map((e) => formatRoleAssignmentError(intl, e)));\n showToast({\n message: intl.formatMessage(messages['wizard.save.errors.summary']),\n type: 'error',\n });\n } else {\n showToast({\n message: intl.formatMessage(messages['wizard.save.success']),\n type: 'success',\n });\n resetState();\n onClose();\n }\n } catch (error) {\n showErrorToast(error, handleSave);\n }\n };\n\n useEffect(() => {\n if (invalidUsers.length && usersInputRef.current) {\n usersInputRef.current.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, [invalidUsers]);\n\n const parsedUsers = parseUsers(users);\n const canProceed = parsedUsers.length > 0 && !!selectedRole;\n const canSave = selectedScopes.size > 0;\n\n return (\n <Stepper activeKey={activeStep}>\n <Stepper.Header className=\"bg-info-100\" />\n\n <div className=\"bg-light-200 p-5\">\n <Stepper.Step\n eventKey={STEPS.SELECT_USERS_AND_ROLE}\n title={intl.formatMessage(messages['wizard.step.selectUsersAndRole.title'])}\n hasError={invalidUsers.length > 0}\n description={invalidUsers.length > 0 ? intl.formatMessage(messages['wizard.step.selectUsersAndRole.error']) : ''}\n index={0}\n >\n <SelectUsersAndRoleStep\n users={users}\n setUsers={handleUsersChange}\n selectedRole={selectedRole}\n setSelectedRole={setSelectedRole}\n roles={roles}\n invalidUsers={invalidUsers}\n inputRef={usersInputRef}\n />\n </Stepper.Step>\n\n <Stepper.Step\n eventKey={STEPS.DEFINE_APPLICATION_SCOPE}\n title={intl.formatMessage(messages['wizard.step.defineScope.title'])}\n index={1}\n >\n <DefineApplicationScopeStep\n selectedRole={selectedRole}\n selectedScopes={selectedScopes}\n onScopeToggle={handleScopeToggle}\n assignmentErrors={assignmentErrors}\n />\n </Stepper.Step>\n </div>\n\n <div className=\"p-5\">\n <Stepper.ActionRow eventKey={STEPS.SELECT_USERS_AND_ROLE}>\n <Button variant=\"outline-primary\" onClick={handleClose}>\n {intl.formatMessage(messages['wizard.button.cancel'])}\n </Button>\n <Stepper.ActionRow.Spacer />\n <StatefulButton\n labels={{\n default: intl.formatMessage(messages['wizard.button.next']),\n pending: intl.formatMessage(messages['wizard.button.next.pending']),\n }}\n icons={{ pending: <Icon src={SpinnerSimple} /> }}\n variant={invalidUsers.length ? 'danger' : 'primary'}\n state={validateUsersMutation.isPending ? 'pending' : 'default'}\n onClick={validateUsersAndProceed}\n disabled={!canProceed || validateUsersMutation.isPending}\n />\n </Stepper.ActionRow>\n\n <Stepper.ActionRow eventKey={STEPS.DEFINE_APPLICATION_SCOPE}>\n <Button variant=\"outline-primary\" onClick={handleClose}>\n {intl.formatMessage(messages['wizard.button.cancel'])}\n </Button>\n <Button\n variant=\"tertiary\"\n onClick={() => {\n setSelectedScopes(new Set());\n setAssignmentErrors([]);\n setActiveStep(STEPS.SELECT_USERS_AND_ROLE);\n }}\n >\n {intl.formatMessage(messages['wizard.button.back'])}\n </Button>\n <Stepper.ActionRow.Spacer />\n <StatefulButton\n labels={{\n default: intl.formatMessage(messages['wizard.button.save']),\n pending: intl.formatMessage(messages['wizard.button.save.pending']),\n }}\n icons={{ pending: <Icon src={SpinnerSimple} /> }}\n state={assignRoleMutation.isPending ? 'pending' : 'default'}\n onClick={handleSave}\n disabled={!canSave || assignRoleMutation.isPending}\n />\n </Stepper.ActionRow>\n </div>\n </Stepper>\n );\n};\n\nexport default AssignRoleWizard;\n"]}
|
|
1
|
+
{"version":3,"file":"AssignRoleWizard.js","sourceRoot":"","sources":["../../../src/authz-module/role-assignation-wizard/AssignRoleWizard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useState, useCallback, useRef, useEffect,\n} from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport {\n Stepper, Button, StatefulButton, Icon,\n} from '@openedx/paragon';\nimport { SpinnerSimple } from '@openedx/paragon/icons';\nimport { RoleMetadata } from '@src/types';\nimport { useToastManager } from '@src/components/ToastManager/ToastManagerContext';\nimport SelectUsersAndRoleStep from './components/SelectUsersAndRoleStep';\nimport DefineApplicationScopeStep from './components/DefineApplicationScopeStep';\nimport { useValidateUsers, useAssignTeamMembersRole } from '@src/authz-module/data/hooks';\nimport messages from './messages';\nimport { formatRoleAssignmentError } from './utils';\n\nconst STEPS = {\n SELECT_USERS_AND_ROLE: 'select-users-and-role',\n DEFINE_APPLICATION_SCOPE: 'define-application-scope',\n} as const;\n\ntype StepKey = typeof STEPS[keyof typeof STEPS];\n\ninterface AssignRoleWizardProps {\n onClose: () => void;\n initialUsers?: string;\n roles?: RoleMetadata[];\n}\n\nconst parseUsers = (input: string): string[] => input\n .split(',')\n .map((u) => u.trim())\n .filter(Boolean);\n\nconst getInitialState = (initialUsers: string) => ({\n activeStep: STEPS.SELECT_USERS_AND_ROLE as StepKey,\n users: initialUsers,\n selectedRole: null as string | null,\n selectedScopes: new Set<string>(),\n invalidUsers: [] as string[],\n validatedUsers: [] as string[],\n});\n\nconst AssignRoleWizard = ({\n onClose, initialUsers = '', roles = [],\n}: AssignRoleWizardProps) => {\n const intl = useIntl();\n const { showToast, showErrorToast } = useToastManager();\n const [activeStep, setActiveStep] = useState<StepKey>(STEPS.SELECT_USERS_AND_ROLE);\n const [users, setUsers] = useState(initialUsers);\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n const [selectedScopes, setSelectedScopes] = useState<Set<string>>(new Set());\n\n const [invalidUsers, setInvalidUsers] = useState<string[]>([]);\n const [validatedUsers, setValidatedUsers] = useState<string[]>([]);\n const [assignmentErrors, setAssignmentErrors] = useState<string[]>([]);\n\n const usersInputRef = useRef<HTMLTextAreaElement>(null);\n\n const validateUsersMutation = useValidateUsers();\n const assignRoleMutation = useAssignTeamMembersRole();\n\n const handleUsersChange = useCallback((value: string) => {\n setInvalidUsers((prev) => (prev.length > 0 ? [] : prev));\n setUsers(value);\n }, []);\n\n const resetState = () => {\n const initialState = getInitialState(initialUsers);\n setActiveStep(initialState.activeStep);\n setUsers(initialState.users);\n setSelectedRole(initialState.selectedRole);\n setSelectedScopes(initialState.selectedScopes);\n setInvalidUsers(initialState.invalidUsers);\n setValidatedUsers(initialState.validatedUsers);\n setAssignmentErrors([]);\n };\n\n const handleClose = () => {\n resetState();\n onClose();\n };\n\n const validateUsersAndProceed = async () => {\n if (validateUsersMutation.isPending) return;\n const usersList = parseUsers(users);\n if (usersList.length === 0 || !selectedRole) return;\n\n setInvalidUsers([]);\n\n try {\n const result = await validateUsersMutation.mutateAsync({ data: { users: usersList } });\n if (result.invalidUsers?.length > 0) {\n setInvalidUsers(result.invalidUsers);\n } else {\n setValidatedUsers(usersList);\n setActiveStep(STEPS.DEFINE_APPLICATION_SCOPE);\n }\n } catch (error) {\n showErrorToast(error, validateUsersAndProceed);\n }\n };\n\n const handleScopeToggle = useCallback((scopeId: string) => {\n setSelectedScopes((prev) => {\n const next = new Set(prev);\n if (next.has(scopeId))\n next.delete(scopeId);\n else\n next.add(scopeId);\n return next;\n });\n }, []);\n\n const handleSave = async () => {\n if (!selectedRole || selectedScopes.size === 0 || validatedUsers.length === 0) return;\n setAssignmentErrors([]);\n\n try {\n const result = await assignRoleMutation.mutateAsync({\n data: {\n users: validatedUsers,\n role: selectedRole,\n scopes: Array.from(selectedScopes),\n },\n });\n\n if (result.errors?.length > 0) {\n setAssignmentErrors(result.errors.map((e) => formatRoleAssignmentError(intl, e)));\n showToast({\n message: intl.formatMessage(messages['wizard.save.errors.summary']),\n type: 'error',\n });\n } else {\n showToast({\n message: intl.formatMessage(messages['wizard.save.success']),\n type: 'success',\n });\n resetState();\n onClose();\n }\n } catch (error) {\n showErrorToast(error, handleSave);\n }\n };\n\n useEffect(() => {\n if (invalidUsers.length && usersInputRef.current) {\n usersInputRef.current.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, [invalidUsers]);\n\n const parsedUsers = parseUsers(users);\n const canProceed = parsedUsers.length > 0 && !!selectedRole;\n const canSave = selectedScopes.size > 0;\n\n return (\n <Stepper activeKey={activeStep}>\n <Stepper.Header className=\"bg-info-100\" />\n\n <div className=\"page-band py-5\">\n <Stepper.Step\n eventKey={STEPS.SELECT_USERS_AND_ROLE}\n title={intl.formatMessage(messages['wizard.step.selectUsersAndRole.title'])}\n hasError={invalidUsers.length > 0}\n description={invalidUsers.length > 0 ? intl.formatMessage(messages['wizard.step.selectUsersAndRole.error']) : ''}\n index={0}\n >\n <SelectUsersAndRoleStep\n users={users}\n setUsers={handleUsersChange}\n selectedRole={selectedRole}\n setSelectedRole={setSelectedRole}\n roles={roles}\n invalidUsers={invalidUsers}\n inputRef={usersInputRef}\n />\n </Stepper.Step>\n\n <Stepper.Step\n eventKey={STEPS.DEFINE_APPLICATION_SCOPE}\n title={intl.formatMessage(messages['wizard.step.defineScope.title'])}\n index={1}\n >\n <DefineApplicationScopeStep\n selectedRole={selectedRole}\n selectedScopes={selectedScopes}\n onScopeToggle={handleScopeToggle}\n assignmentErrors={assignmentErrors}\n />\n </Stepper.Step>\n </div>\n\n <div className=\"page-band py-5\">\n <Stepper.ActionRow eventKey={STEPS.SELECT_USERS_AND_ROLE}>\n <Button variant=\"outline-primary\" onClick={handleClose}>\n {intl.formatMessage(messages['wizard.button.cancel'])}\n </Button>\n <Stepper.ActionRow.Spacer />\n <StatefulButton\n labels={{\n default: intl.formatMessage(messages['wizard.button.next']),\n pending: intl.formatMessage(messages['wizard.button.next.pending']),\n }}\n icons={{ pending: <Icon src={SpinnerSimple} /> }}\n variant={invalidUsers.length ? 'danger' : 'primary'}\n state={validateUsersMutation.isPending ? 'pending' : 'default'}\n onClick={validateUsersAndProceed}\n disabled={!canProceed || validateUsersMutation.isPending}\n />\n </Stepper.ActionRow>\n\n <Stepper.ActionRow eventKey={STEPS.DEFINE_APPLICATION_SCOPE}>\n <Button variant=\"outline-primary\" onClick={handleClose}>\n {intl.formatMessage(messages['wizard.button.cancel'])}\n </Button>\n <Button\n variant=\"tertiary\"\n onClick={() => {\n setSelectedScopes(new Set());\n setAssignmentErrors([]);\n setActiveStep(STEPS.SELECT_USERS_AND_ROLE);\n }}\n >\n {intl.formatMessage(messages['wizard.button.back'])}\n </Button>\n <Stepper.ActionRow.Spacer />\n <StatefulButton\n labels={{\n default: intl.formatMessage(messages['wizard.button.save']),\n pending: intl.formatMessage(messages['wizard.button.save.pending']),\n }}\n icons={{ pending: <Icon src={SpinnerSimple} /> }}\n state={assignRoleMutation.isPending ? 'pending' : 'default'}\n onClick={handleSave}\n disabled={!canSave || assignRoleMutation.isPending}\n />\n </Stepper.ActionRow>\n </div>\n </Stepper>\n );\n};\n\nexport default AssignRoleWizard;\n"]}
|
|
@@ -33,7 +33,7 @@ const AssignRoleWizardPage = () => {
|
|
|
33
33
|
}
|
|
34
34
|
return [];
|
|
35
35
|
});
|
|
36
|
-
return (_jsx(AuthZLayout, {
|
|
36
|
+
return (_jsx(AuthZLayout, { navLinks: [{ label: intl.formatMessage(messages['wizard.page.breadcrumb']), to: returnTo }], activeLabel: intl.formatMessage(messages['wizard.page.title']), pageTitle: intl.formatMessage(messages['wizard.page.title']), actions: [], children: _jsx(AssignRoleWizard, { onClose: () => navigate(destination), initialUsers: initialUsers, roles: rolesAssignable }) }));
|
|
37
37
|
};
|
|
38
38
|
export default AssignRoleWizardPage;
|
|
39
39
|
//# sourceMappingURL=AssignRoleWizardPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssignRoleWizardPage.js","sourceRoot":"","sources":["../../../src/authz-module/role-assignation-wizard/AssignRoleWizardPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,qCAAqC,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,WAAW,MAAM,0CAA0C,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,EACL,0BAA0B,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,oBAAoB,EAClG,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAExF,MAAM,oBAAoB,GAAG,GAAG,EAAE;;IAChC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,CAAC,YAAY,CAAC,GAAG,eAAe,EAAE,CAAC;IACzC,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,MAAA,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,mCAAI,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;IAExF,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC;QAChC,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,qCAAqC,CAAC,uBAAuB,CAAC,CAAC;IACnG,MAAM,EAAE,wBAAwB,EAAE,GAAG,sBAAsB,EAAE,CAAC;IAE9D,MAAM,eAAe,GAAG,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACvD,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,MAAM,KAAK,2BAA2B,CAAC,mBAAmB;YAAE,OAAO,oBAAoB,CAAC;QAC9F,IAAI,CAAC,CAAC,MAAM,KAAK,0BAA0B,CAAC,kBAAkB,EAAE,CAAC;YAC/D,0FAA0F;YAC1F,OAAO,wBAAwB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,WAAW,IACV,
|
|
1
|
+
{"version":3,"file":"AssignRoleWizardPage.js","sourceRoot":"","sources":["../../../src/authz-module/role-assignation-wizard/AssignRoleWizardPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useNavigate, useSearchParams } from 'react-router-dom';\nimport { useIntl } from '@openedx/frontend-base';\nimport { useValidateUserPermissionsNonSuspense } from '@src/data/hooks';\nimport AssignRoleWizard from './AssignRoleWizard';\nimport AuthZLayout from '@src/authz-module/components/AuthZLayout';\nimport { AUTHZ_HOME_PATH, buildAuditUserPath } from '@src/authz-module/constants';\nimport messages from './messages';\nimport {\n CONTENT_COURSE_PERMISSIONS, CONTENT_LIBRARY_PERMISSIONS, courseRolesMetadata, libraryRolesMetadata,\n MANAGE_TEAM_PERMISSIONS,\n} from '@src/authz-module/roles-permissions';\nimport { useCourseAuthoringFlag } from '@src/authz-module/hooks/useCourseAuthoringFlag';\n\nconst AssignRoleWizardPage = () => {\n const intl = useIntl();\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const initialUsers = searchParams.get('users') || '';\n const raw = searchParams.get('from') ?? '';\n const returnTo = (raw.startsWith('/') && !raw.startsWith('//')) ? raw : AUTHZ_HOME_PATH;\n\n const presetUser = initialUsers.trim();\n const destination = (presetUser && !presetUser.includes(','))\n ? buildAuditUserPath(presetUser)\n : returnTo;\n\n const { data: managePermissions } = useValidateUserPermissionsNonSuspense(MANAGE_TEAM_PERMISSIONS);\n const { isCourseAuthoringEnabled } = useCourseAuthoringFlag();\n\n const rolesAssignable = managePermissions?.flatMap((p) => {\n if (!p.allowed) return [];\n if (p.action === CONTENT_LIBRARY_PERMISSIONS.MANAGE_LIBRARY_TEAM) return libraryRolesMetadata;\n if (p.action === CONTENT_COURSE_PERMISSIONS.MANAGE_COURSE_TEAM) {\n // Course (authoring) roles are only assignable when the course-authoring flag is enabled.\n return isCourseAuthoringEnabled ? courseRolesMetadata : [];\n }\n return [];\n });\n\n return (\n <AuthZLayout\n navLinks={[{ label: intl.formatMessage(messages['wizard.page.breadcrumb']), to: returnTo }]}\n activeLabel={intl.formatMessage(messages['wizard.page.title'])}\n pageTitle={intl.formatMessage(messages['wizard.page.title'])}\n actions={[]}\n >\n <AssignRoleWizard\n onClose={() => navigate(destination)}\n initialUsers={initialUsers}\n roles={rolesAssignable}\n />\n </AuthZLayout>\n );\n};\n\nexport default AssignRoleWizardPage;\n"]}
|
|
@@ -6,7 +6,7 @@ import OrgFilter from '../../components/TableControlBar/OrgFilter';
|
|
|
6
6
|
import messages from '../messages';
|
|
7
7
|
const ScopeFilterBar = ({ search, onSearchChange, selectedOrgs, onOrgsChange, contextType, contextLabel, allScopesCount, totalCount, }) => {
|
|
8
8
|
const intl = useIntl();
|
|
9
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "d-flex align-items-center justify-content-between gap-3 mb-2 flex-wrap", children: [_jsxs("div", { className: "d-flex align-items-center gap-3
|
|
9
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "d-flex align-items-center justify-content-between gap-3 mb-2 flex-wrap", children: [_jsxs("div", { className: "d-flex align-items-center gap-3 flex-wrap", children: [_jsx(Form.Group, { controlId: "scope-search", className: "mb-0", children: _jsx(Form.Control, { type: "text", value: search, onChange: (e) => onSearchChange(e.target.value), placeholder: intl.formatMessage(messages['wizard.step2.search.placeholder']), trailingElement: _jsx(Icon, { src: Search }) }) }), _jsx(OrgFilter, { filterButtonText: intl.formatMessage(messages['wizard.step2.filter.org.label']), filterValue: selectedOrgs, setFilter: onOrgsChange })] }), _jsx("span", { className: "text-muted small text-nowrap", children: intl.formatMessage(messages['wizard.step2.count'], { shown: allScopesCount, total: totalCount }) })] }), contextType && (_jsxs(Stack, { direction: "horizontal", gap: 2, className: "align-items-center mt-3", children: [_jsx("span", { className: "text-muted small", children: intl.formatMessage(messages['wizard.step2.filter.applied']) }), _jsx(Badge, { className: "py-1 px-2", variant: "light", children: contextLabel })] }))] }));
|
|
10
10
|
};
|
|
11
11
|
export default ScopeFilterBar;
|
|
12
12
|
//# sourceMappingURL=ScopeFilterBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScopeFilterBar.js","sourceRoot":"","sources":["../../../../src/authz-module/role-assignation-wizard/components/ScopeFilterBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,SAAS,MAAM,wDAAwD,CAAC;AAE/E,OAAO,QAAQ,MAAM,oDAAoD,CAAC;AAa1E,MAAM,cAAc,GAAG,CAAC,EACtB,MAAM,EACN,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,UAAU,GACU,EAAE,EAAE;IACxB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,wEAAwE,aACrF,eAAK,SAAS,EAAC,
|
|
1
|
+
{"version":3,"file":"ScopeFilterBar.js","sourceRoot":"","sources":["../../../../src/authz-module/role-assignation-wizard/components/ScopeFilterBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,SAAS,MAAM,wDAAwD,CAAC;AAE/E,OAAO,QAAQ,MAAM,oDAAoD,CAAC;AAa1E,MAAM,cAAc,GAAG,CAAC,EACtB,MAAM,EACN,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,UAAU,GACU,EAAE,EAAE;IACxB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,wEAAwE,aACrF,eAAK,SAAS,EAAC,2CAA2C,aACxD,KAAC,IAAI,CAAC,KAAK,IAAC,SAAS,EAAC,cAAc,EAAC,SAAS,EAAC,MAAM,YACnD,KAAC,IAAI,CAAC,OAAO,IACX,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAgC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9E,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC,EAC5E,eAAe,EAAE,KAAC,IAAI,IAAC,GAAG,EAAE,MAAM,GAAI,GACtC,GACS,EAEb,KAAC,SAAS,IACR,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,EAC/E,WAAW,EAAE,YAAY,EACzB,SAAS,EAAE,YAAY,GACvB,IACE,EAEN,eAAM,SAAS,EAAC,8BAA8B,YAC3C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,GAC5F,IACH,EAEL,WAAW,IAAI,CACd,MAAC,KAAK,IAAC,SAAS,EAAC,YAAY,EAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,yBAAyB,aACvE,eAAM,SAAS,EAAC,kBAAkB,YAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC,GAAQ,EACvG,KAAC,KAAK,IAAC,SAAS,EAAC,WAAW,EAAC,OAAO,EAAC,OAAO,YACzC,YAAY,GACP,IACF,CACT,IACA,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport {\n Form, Icon, Badge, Stack,\n} from '@openedx/paragon';\nimport { Search } from '@openedx/paragon/icons';\nimport OrgFilter from '@src/authz-module/components/TableControlBar/OrgFilter';\nimport { ChangeEvent } from 'react';\nimport messages from '@src/authz-module/role-assignation-wizard/messages';\n\ninterface ScopeFilterBarProps {\n search: string;\n onSearchChange: (value: string) => void;\n selectedOrgs: string[];\n onOrgsChange: (value: string[]) => void;\n contextType: string | undefined;\n contextLabel: string;\n allScopesCount: number;\n totalCount: number;\n}\n\nconst ScopeFilterBar = ({\n search,\n onSearchChange,\n selectedOrgs,\n onOrgsChange,\n contextType,\n contextLabel,\n allScopesCount,\n totalCount,\n}: ScopeFilterBarProps) => {\n const intl = useIntl();\n\n return (\n <>\n <div className=\"d-flex align-items-center justify-content-between gap-3 mb-2 flex-wrap\">\n <div className=\"d-flex align-items-center gap-3 flex-wrap\">\n <Form.Group controlId=\"scope-search\" className=\"mb-0\">\n <Form.Control\n type=\"text\"\n value={search}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onSearchChange(e.target.value)}\n placeholder={intl.formatMessage(messages['wizard.step2.search.placeholder'])}\n trailingElement={<Icon src={Search} />}\n />\n </Form.Group>\n\n <OrgFilter\n filterButtonText={intl.formatMessage(messages['wizard.step2.filter.org.label'])}\n filterValue={selectedOrgs}\n setFilter={onOrgsChange}\n />\n </div>\n\n <span className=\"text-muted small text-nowrap\">\n {intl.formatMessage(messages['wizard.step2.count'], { shown: allScopesCount, total: totalCount })}\n </span>\n </div>\n\n {contextType && (\n <Stack direction=\"horizontal\" gap={2} className=\"align-items-center mt-3\">\n <span className=\"text-muted small\">{intl.formatMessage(messages['wizard.step2.filter.applied'])}</span>\n <Badge className=\"py-1 px-2\" variant=\"light\">\n {contextLabel}\n </Badge>\n </Stack>\n )}\n </>\n );\n};\n\nexport default ScopeFilterBar;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo, useState } from 'react';
|
|
3
3
|
import { useIntl } from '@openedx/frontend-base';
|
|
4
4
|
import { Alert, Button, ButtonGroup, Container, Hyperlink, } from '@openedx/paragon';
|
|
@@ -29,7 +29,7 @@ const RolesPermissions = () => {
|
|
|
29
29
|
});
|
|
30
30
|
return permissionsByResource;
|
|
31
31
|
}, [intl]);
|
|
32
|
-
return (_jsxs(
|
|
32
|
+
return (_jsxs(_Fragment, { children: [_jsx(Container, { className: "pb-5", children: _jsxs(ButtonGroup, { size: "lg", className: "mb-2", children: [_jsx(Button, { onClick: () => setActive('courses'), variant: `${active === 'courses' ? 'primary' : 'outline-primary'}`, children: intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.tab']) }), _jsx(Button, { onClick: () => setActive('libraries'), variant: `${active === 'libraries' ? 'primary' : 'outline-primary'}`, children: intl.formatMessage(messages['authz.tabs.permissionsRoles.libraries.tab']) })] }) }), active === 'courses' && (_jsxs("div", { className: "position-relative", children: [_jsx(PermissionTable, { permissionsTable: coursePermissionsByResource, roles: courseRolesWithPermissions, title: intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.tab.title']) }), _jsx(Alert, { variant: "info", className: "mt-5", children: _jsxs("div", { className: "row align-items-center", children: [_jsxs("div", { className: "col-12 col-md-7", children: [_jsx("p", { className: "text-primary font-weight-bold h4", children: intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.alert.title']) }), _jsxs("span", { children: [_jsx("span", { className: "font-weight-bold", children: intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.alert.note']) }), intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.alert.description'])] })] }), _jsx("div", { className: "col-12 col-md-5 mt-3 mt-md-0", children: _jsx(Hyperlink, { className: "d-block text-right h5 font-weight-normal", destination: "https://docs.openedx.org/en/latest/educators/references/course_development/course_team_roles.html", target: "_blank", showLaunchIcon: false, isInline: true, children: intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.alert.link']) }) })] }) })] })), active === 'libraries' && (_jsx(PermissionTable, { permissionsTable: libraryPermissionsByResource, roles: libraryRolesWithPermissions, title: intl.formatMessage(messages['authz.tabs.permissionsRoles.libraries.tab.title']) })), _jsx(AnchorButton, {})] }));
|
|
33
33
|
};
|
|
34
34
|
export default RolesPermissions;
|
|
35
35
|
//# sourceMappingURL=RolesPermissions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RolesPermissions.js","sourceRoot":"","sources":["../../../src/authz-module/roles-permissions/RolesPermissions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,KAAK,EACL,MAAM,EACN,WAAW,EACX,SAAS,EAAE,SAAS,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,YAAY,MAAM,2CAA2C,CAAC;AACrE,OAAO,eAAe,MAAM,8CAA8C,CAAC;AAE3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,gBAAgB,GAAG,GAAG,EAAE;IAC5B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEhD,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,EAAE;QAChD,MAAM,qBAAqB,GAAG,+BAA+B,CAAC;YAC5D,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE,kBAAkB;YAC/B,SAAS,EAAE,oBAAoB;YAC/B,IAAI;SACL,CAAC,CAAC;QAEH,OAAO,qBAAqB,CAAC;IAC/B,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,2BAA2B,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/C,MAAM,qBAAqB,GAAG,+BAA+B,CAAC;YAC5D,KAAK,EAAE,0BAA0B;YACjC,WAAW,EAAE,iBAAiB;YAC9B,SAAS,EAAE,mBAAmB;YAC9B,IAAI;SACL,CAAC,CAAC;QAEH,OAAO,qBAAqB,CAAC;IAC/B,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"RolesPermissions.js","sourceRoot":"","sources":["../../../src/authz-module/roles-permissions/RolesPermissions.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport {\n Alert,\n Button,\n ButtonGroup,\n Container, Hyperlink,\n} from '@openedx/paragon';\n\nimport {\n coursePermissions,\n courseResourceTypes,\n courseRolesWithPermissions,\n} from './course/constants';\nimport {\n libraryRolesWithPermissions,\n libraryPermissions,\n libraryResourceTypes,\n} from './library/constants';\nimport AnchorButton from '@src/authz-module/components/AnchorButton';\nimport PermissionTable from '@src/authz-module/components/PermissionTable';\n\nimport { buildPermissionMatrixByResource } from './utils';\n\nimport messages from './messages';\n\nconst RolesPermissions = () => {\n const intl = useIntl();\n const [active, setActive] = useState('courses');\n\n const libraryPermissionsByResource = useMemo(() => {\n const permissionsByResource = buildPermissionMatrixByResource({\n roles: libraryRolesWithPermissions,\n permissions: libraryPermissions,\n resources: libraryResourceTypes,\n intl,\n });\n\n return permissionsByResource;\n }, [intl]);\n\n const coursePermissionsByResource = useMemo(() => {\n const permissionsByResource = buildPermissionMatrixByResource({\n roles: courseRolesWithPermissions,\n permissions: coursePermissions,\n resources: courseResourceTypes,\n intl,\n });\n\n return permissionsByResource;\n }, [intl]);\n\n return (\n <>\n <Container className=\"pb-5\">\n <ButtonGroup size=\"lg\" className=\"mb-2\">\n <Button\n onClick={() => setActive('courses')}\n variant={`${active === 'courses' ? 'primary' : 'outline-primary'}`}\n >\n {intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.tab']) }\n </Button>\n <Button\n onClick={() => setActive('libraries')}\n variant={`${active === 'libraries' ? 'primary' : 'outline-primary'}`}\n >\n {intl.formatMessage(messages['authz.tabs.permissionsRoles.libraries.tab']) }\n </Button>\n </ButtonGroup>\n </Container>\n {/* Courses */}\n { active === 'courses' && (\n <div className=\"position-relative\">\n <PermissionTable\n permissionsTable={coursePermissionsByResource}\n roles={courseRolesWithPermissions}\n title={intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.tab.title'])}\n />\n <Alert\n variant=\"info\"\n className=\"mt-5\"\n >\n <div className=\"row align-items-center\">\n <div className=\"col-12 col-md-7\">\n <p className=\"text-primary font-weight-bold h4\">{intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.alert.title'])}</p>\n <span>\n <span className=\"font-weight-bold\">{intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.alert.note'])}</span>\n {intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.alert.description'])}\n </span>\n </div>\n <div className=\"col-12 col-md-5 mt-3 mt-md-0\">\n <Hyperlink className=\"d-block text-right h5 font-weight-normal\" destination=\"https://docs.openedx.org/en/latest/educators/references/course_development/course_team_roles.html\" target=\"_blank\" showLaunchIcon={false} isInline>\n {intl.formatMessage(messages['authz.tabs.permissionsRoles.courses.alert.link'])}\n </Hyperlink>\n </div>\n </div>\n </Alert>\n </div>\n )}\n {/* Libraries */}\n { active === 'libraries' && (\n <PermissionTable\n permissionsTable={libraryPermissionsByResource}\n roles={libraryRolesWithPermissions}\n title={intl.formatMessage(messages['authz.tabs.permissionsRoles.libraries.tab.title'])}\n />\n )}\n <AnchorButton />\n </>\n );\n};\n\nexport default RolesPermissions;\n"]}
|
|
@@ -51,57 +51,57 @@ const TeamMembersTable = ({ presetScope }) => {
|
|
|
51
51
|
const pageCount = Math.ceil(count / TABLE_DEFAULT_PAGE_SIZE);
|
|
52
52
|
const fetchData = useMemo(() => debounce(handleTableFetch, 500), [handleTableFetch]);
|
|
53
53
|
useEffect(() => () => fetchData.cancel(), [fetchData]);
|
|
54
|
-
return (
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
54
|
+
return (_jsxs(DataTable, { isFilterable: true, isPaginated: true, isSortable: true, manualFilters: true, manualPagination: true, manualSortBy: true, numBreakoutFilters: 4, fetchData: fetchData, data: roleAssignments, itemCount: count, pageCount: pageCount, initialState: { pageSize: TABLE_DEFAULT_PAGE_SIZE, filters: initialFilters }, isLoading: isLoadingAllRoleAssignments, additionalColumns: [
|
|
55
|
+
{
|
|
56
|
+
id: 'action',
|
|
57
|
+
Header: intl.formatMessage(messages['authz.team.members.table.column.actions.title']),
|
|
58
|
+
Cell: viewActionCell,
|
|
59
|
+
},
|
|
60
|
+
], columns: [
|
|
61
|
+
{
|
|
62
|
+
id: 'username',
|
|
63
|
+
Header: intl.formatMessage(messages['authz.team.members.table.column.name.title']),
|
|
64
|
+
accessor: 'username',
|
|
65
|
+
Cell: NameCell,
|
|
66
|
+
filter: 'text',
|
|
67
|
+
Filter: TextFilter,
|
|
68
|
+
filterOrder: 1,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
Header: intl.formatMessage(messages['authz.team.members.table.column.email.title']),
|
|
72
|
+
accessor: 'email',
|
|
73
|
+
disableFilters: true,
|
|
74
|
+
filter: 'text',
|
|
75
|
+
Filter: TextFilter,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
Header: getCellHeader('org', intl.formatMessage(messages['authz.team.members.table.column.organization.title']), columnsWithFiltersApplied),
|
|
79
|
+
accessor: 'org',
|
|
80
|
+
Cell: OrgCell,
|
|
81
|
+
filter: 'includesValue',
|
|
82
|
+
Filter: OrgFilter,
|
|
83
|
+
filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.organization.title']),
|
|
84
|
+
filterOrder: 2,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
Header: getCellHeader('scope', intl.formatMessage(messages['authz.team.members.table.column.scope.title']), columnsWithFiltersApplied),
|
|
88
|
+
accessor: 'scope',
|
|
89
|
+
Cell: ScopeCell,
|
|
90
|
+
filter: 'includesValue',
|
|
91
|
+
Filter: ScopesFilter,
|
|
92
|
+
filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.scope.title']),
|
|
93
|
+
filterOrder: 4,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
Header: getCellHeader('role', intl.formatMessage(messages['authz.team.members.table.column.role.title']), columnsWithFiltersApplied),
|
|
97
|
+
accessor: 'role',
|
|
98
|
+
filter: 'includesValue',
|
|
99
|
+
Cell: RoleCell,
|
|
100
|
+
Filter: RolesFilter,
|
|
101
|
+
filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.role.title']),
|
|
102
|
+
filterOrder: 3,
|
|
103
|
+
},
|
|
104
|
+
], children: [_jsx(TableControlBar, { onFilterChange: setColumnsWithFiltersApplied }), _jsx(DataTable.Table, {}), _jsx(TableFooter, {})] }));
|
|
105
105
|
};
|
|
106
106
|
export default TeamMembersTable;
|
|
107
107
|
//# sourceMappingURL=TeamMembersTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamMembersTable.js","sourceRoot":"","sources":["../../../src/authz-module/team-members/TeamMembersTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport { useIntl } from '@openedx/frontend-base';\nimport {\n DataTable,\n TextFilter,\n} from '@openedx/paragon';\n\nimport { useToastManager } from '@src/components/ToastManager/ToastManagerContext';\nimport { LIBRARY_ROLE_KEYS } from '@src/authz-module/roles-permissions';\nimport { useViewTeamPermissions } from '@src/authz-module/hooks/useViewTeamPermissions';\nimport { useCourseAuthoringFlag } from '@src/authz-module/hooks/useCourseAuthoringFlag';\nimport { useQuerySettings } from '@src/authz-module/hooks/useQuerySettings';\nimport OrgFilter from '@src/authz-module/components/TableControlBar/OrgFilter';\nimport RolesFilter from '@src/authz-module/components/TableControlBar/RolesFilter';\nimport ScopesFilter from '@src/authz-module/components/TableControlBar/ScopesFilter';\nimport TableControlBar from '@src/authz-module/components/TableControlBar/TableControlBar';\nimport { getCellHeader } from '@src/authz-module/utils';\nimport {\n createViewActionCell, NameCell, OrgCell, RoleCell, ScopeCell,\n} from '@src/authz-module/components/TableCells';\nimport { useAllRoleAssignments } from '@src/authz-module/data/hooks';\nimport { TABLE_DEFAULT_PAGE_SIZE } from '@src/authz-module/constants';\nimport messages from './messages';\nimport TableFooter from '@src/authz-module/components/TableFooter/TableFooter';\n\ninterface TeamMembersTableProps {\n presetScope?: string;\n}\n\nconst TeamMembersTable = ({ presetScope }: TeamMembersTableProps) => {\n const intl = useIntl();\n const { showErrorToast } = useToastManager();\n const [columnsWithFiltersApplied, setColumnsWithFiltersApplied] = useState<string[]>([]);\n\n const initialQuerySettings = presetScope ? {\n scopes: presetScope,\n pageSize: TABLE_DEFAULT_PAGE_SIZE,\n pageIndex: 0,\n roles: null,\n organizations: null,\n search: null,\n order: null,\n sortBy: null,\n } : undefined;\n\n const { querySettings, handleTableFetch } = useQuerySettings(initialQuerySettings);\n\n const { isCourseViewAllowed } = useViewTeamPermissions();\n const { isCourseEnabled } = useCourseAuthoringFlag();\n\n const effectiveQuerySettings = useMemo(() => {\n if (isCourseViewAllowed || querySettings.roles) return querySettings;\n return { ...querySettings, roles: LIBRARY_ROLE_KEYS };\n }, [isCourseViewAllowed, querySettings]);\n\n const {\n data: { results: roleAssignments, count } = { results: [], count: 0 },\n isLoading: isLoadingAllRoleAssignments,\n error,\n refetch,\n } = useAllRoleAssignments(effectiveQuerySettings);\n\n const viewActionCell = useMemo(() => createViewActionCell({ isCourseEnabled }), [isCourseEnabled]);\n\n const initialFilters = presetScope ? [{ id: 'scope', value: [presetScope] }] : [];\n\n useEffect(() => {\n if (error) {\n showErrorToast(error, refetch);\n }\n }, [error, showErrorToast, refetch]);\n\n const pageCount = Math.ceil(count / TABLE_DEFAULT_PAGE_SIZE);\n\n const fetchData = useMemo(() => debounce(handleTableFetch, 500), [handleTableFetch]);\n\n useEffect(() => () => fetchData.cancel(), [fetchData]);\n\n return (\n <div className=\"authz-module\">\n <DataTable\n isFilterable\n isPaginated\n isSortable\n manualFilters\n manualPagination\n manualSortBy\n numBreakoutFilters={4}\n fetchData={fetchData}\n data={roleAssignments}\n itemCount={count}\n pageCount={pageCount}\n initialState={{ pageSize: TABLE_DEFAULT_PAGE_SIZE, filters: initialFilters }}\n isLoading={isLoadingAllRoleAssignments}\n additionalColumns={[\n {\n id: 'action',\n Header: intl.formatMessage(messages['authz.team.members.table.column.actions.title']),\n Cell: viewActionCell,\n },\n ]}\n columns={\n [\n {\n id: 'username',\n Header: intl.formatMessage(messages['authz.team.members.table.column.name.title']),\n accessor: 'username',\n Cell: NameCell,\n filter: 'text',\n Filter: TextFilter,\n filterOrder: 1,\n },\n {\n Header: intl.formatMessage(messages['authz.team.members.table.column.email.title']),\n accessor: 'email',\n disableFilters: true,\n filter: 'text',\n Filter: TextFilter,\n },\n {\n Header: getCellHeader('org', intl.formatMessage(messages['authz.team.members.table.column.organization.title']), columnsWithFiltersApplied),\n accessor: 'org',\n Cell: OrgCell,\n filter: 'includesValue',\n Filter: OrgFilter,\n filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.organization.title']),\n filterOrder: 2,\n },\n {\n Header: getCellHeader('scope', intl.formatMessage(messages['authz.team.members.table.column.scope.title']), columnsWithFiltersApplied),\n accessor: 'scope',\n Cell: ScopeCell,\n filter: 'includesValue',\n Filter: ScopesFilter,\n filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.scope.title']),\n filterOrder: 4,\n },\n {\n Header: getCellHeader('role', intl.formatMessage(messages['authz.team.members.table.column.role.title']), columnsWithFiltersApplied),\n accessor: 'role',\n filter: 'includesValue',\n Cell: RoleCell,\n Filter: RolesFilter,\n filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.role.title']),\n filterOrder: 3,\n },\n ]\n }\n >\n <TableControlBar onFilterChange={setColumnsWithFiltersApplied} />\n <DataTable.Table />\n <TableFooter />\n </DataTable>\n </div>\n );\n};\n\nexport default TeamMembersTable;\n"]}
|
|
1
|
+
{"version":3,"file":"TeamMembersTable.js","sourceRoot":"","sources":["../../../src/authz-module/team-members/TeamMembersTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport { useIntl } from '@openedx/frontend-base';\nimport {\n DataTable,\n TextFilter,\n} from '@openedx/paragon';\n\nimport { useToastManager } from '@src/components/ToastManager/ToastManagerContext';\nimport { LIBRARY_ROLE_KEYS } from '@src/authz-module/roles-permissions';\nimport { useViewTeamPermissions } from '@src/authz-module/hooks/useViewTeamPermissions';\nimport { useCourseAuthoringFlag } from '@src/authz-module/hooks/useCourseAuthoringFlag';\nimport { useQuerySettings } from '@src/authz-module/hooks/useQuerySettings';\nimport OrgFilter from '@src/authz-module/components/TableControlBar/OrgFilter';\nimport RolesFilter from '@src/authz-module/components/TableControlBar/RolesFilter';\nimport ScopesFilter from '@src/authz-module/components/TableControlBar/ScopesFilter';\nimport TableControlBar from '@src/authz-module/components/TableControlBar/TableControlBar';\nimport { getCellHeader } from '@src/authz-module/utils';\nimport {\n createViewActionCell, NameCell, OrgCell, RoleCell, ScopeCell,\n} from '@src/authz-module/components/TableCells';\nimport { useAllRoleAssignments } from '@src/authz-module/data/hooks';\nimport { TABLE_DEFAULT_PAGE_SIZE } from '@src/authz-module/constants';\nimport messages from './messages';\nimport TableFooter from '@src/authz-module/components/TableFooter/TableFooter';\n\ninterface TeamMembersTableProps {\n presetScope?: string;\n}\n\nconst TeamMembersTable = ({ presetScope }: TeamMembersTableProps) => {\n const intl = useIntl();\n const { showErrorToast } = useToastManager();\n const [columnsWithFiltersApplied, setColumnsWithFiltersApplied] = useState<string[]>([]);\n\n const initialQuerySettings = presetScope ? {\n scopes: presetScope,\n pageSize: TABLE_DEFAULT_PAGE_SIZE,\n pageIndex: 0,\n roles: null,\n organizations: null,\n search: null,\n order: null,\n sortBy: null,\n } : undefined;\n\n const { querySettings, handleTableFetch } = useQuerySettings(initialQuerySettings);\n\n const { isCourseViewAllowed } = useViewTeamPermissions();\n const { isCourseEnabled } = useCourseAuthoringFlag();\n\n const effectiveQuerySettings = useMemo(() => {\n if (isCourseViewAllowed || querySettings.roles) return querySettings;\n return { ...querySettings, roles: LIBRARY_ROLE_KEYS };\n }, [isCourseViewAllowed, querySettings]);\n\n const {\n data: { results: roleAssignments, count } = { results: [], count: 0 },\n isLoading: isLoadingAllRoleAssignments,\n error,\n refetch,\n } = useAllRoleAssignments(effectiveQuerySettings);\n\n const viewActionCell = useMemo(() => createViewActionCell({ isCourseEnabled }), [isCourseEnabled]);\n\n const initialFilters = presetScope ? [{ id: 'scope', value: [presetScope] }] : [];\n\n useEffect(() => {\n if (error) {\n showErrorToast(error, refetch);\n }\n }, [error, showErrorToast, refetch]);\n\n const pageCount = Math.ceil(count / TABLE_DEFAULT_PAGE_SIZE);\n\n const fetchData = useMemo(() => debounce(handleTableFetch, 500), [handleTableFetch]);\n\n useEffect(() => () => fetchData.cancel(), [fetchData]);\n\n return (\n <DataTable\n isFilterable\n isPaginated\n isSortable\n manualFilters\n manualPagination\n manualSortBy\n numBreakoutFilters={4}\n fetchData={fetchData}\n data={roleAssignments}\n itemCount={count}\n pageCount={pageCount}\n initialState={{ pageSize: TABLE_DEFAULT_PAGE_SIZE, filters: initialFilters }}\n isLoading={isLoadingAllRoleAssignments}\n additionalColumns={[\n {\n id: 'action',\n Header: intl.formatMessage(messages['authz.team.members.table.column.actions.title']),\n Cell: viewActionCell,\n },\n ]}\n columns={\n [\n {\n id: 'username',\n Header: intl.formatMessage(messages['authz.team.members.table.column.name.title']),\n accessor: 'username',\n Cell: NameCell,\n filter: 'text',\n Filter: TextFilter,\n filterOrder: 1,\n },\n {\n Header: intl.formatMessage(messages['authz.team.members.table.column.email.title']),\n accessor: 'email',\n disableFilters: true,\n filter: 'text',\n Filter: TextFilter,\n },\n {\n Header: getCellHeader('org', intl.formatMessage(messages['authz.team.members.table.column.organization.title']), columnsWithFiltersApplied),\n accessor: 'org',\n Cell: OrgCell,\n filter: 'includesValue',\n Filter: OrgFilter,\n filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.organization.title']),\n filterOrder: 2,\n },\n {\n Header: getCellHeader('scope', intl.formatMessage(messages['authz.team.members.table.column.scope.title']), columnsWithFiltersApplied),\n accessor: 'scope',\n Cell: ScopeCell,\n filter: 'includesValue',\n Filter: ScopesFilter,\n filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.scope.title']),\n filterOrder: 4,\n },\n {\n Header: getCellHeader('role', intl.formatMessage(messages['authz.team.members.table.column.role.title']), columnsWithFiltersApplied),\n accessor: 'role',\n filter: 'includesValue',\n Cell: RoleCell,\n Filter: RolesFilter,\n filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.role.title']),\n filterOrder: 3,\n },\n ]\n }\n >\n <TableControlBar onFilterChange={setColumnsWithFiltersApplied} />\n <DataTable.Table />\n <TableFooter />\n </DataTable>\n );\n};\n\nexport default TeamMembersTable;\n"]}
|
package/dist/style.scss
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
|
-
// App-scoped
|
|
2
|
-
//
|
|
1
|
+
// App-scoped global styles. Global selectors, so they must not live under any
|
|
2
|
+
// component's scoped stylesheet.
|
|
3
|
+
|
|
4
|
+
// Lines content up with the site header (`Container fluid size="xl"`) while the element
|
|
5
|
+
// itself stays full width, so a background it carries still bleeds to the edges.
|
|
6
|
+
// The overhang is measured from the element's own width, so it has to span the viewport:
|
|
7
|
+
// inside a constrained box it collapses to zero. Use `py-*` for vertical padding; `p-*`
|
|
8
|
+
// sets the `padding` shorthand `!important`, which wipes out the horizontal inset.
|
|
9
|
+
.page-band {
|
|
10
|
+
--page-band-overhang: max(
|
|
11
|
+
0px,
|
|
12
|
+
(100% - var(--pgn-size-container-max-width-xl) - var(--pgn-spacing-grid-gutter-width)) / 2
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
padding-left: calc(var(--page-band-overhang) + var(--pgn-spacing-spacer-5));
|
|
16
|
+
padding-right: calc(var(--page-band-overhang) + var(--pgn-spacing-spacer-5));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Runtime styles for the toast manager.
|
|
3
20
|
.toast-container {
|
|
4
21
|
// Ensure toast appears above modal
|
|
5
22
|
z-index: 1000;
|