@strapi/plugin-users-permissions 4.25.1 → 4.25.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +18 -3
- package/admin/src/pages/Providers/index.jsx +1 -1
- package/dist/_chunks/{index-Ui9eAdhc.js → index-3qMQ60EZ.js} +9 -9
- package/dist/_chunks/{index-Ui9eAdhc.js.map → index-3qMQ60EZ.js.map} +1 -1
- package/dist/_chunks/{index-N9SAOEu3.mjs → index-UPEoy-4Z.mjs} +2 -2
- package/dist/_chunks/{index-N9SAOEu3.mjs.map → index-UPEoy-4Z.mjs.map} +1 -1
- package/dist/_chunks/{index-vfN0vtMh.mjs → index-Uw3UTtOL.mjs} +2 -2
- package/dist/_chunks/{index-vfN0vtMh.mjs.map → index-Uw3UTtOL.mjs.map} +1 -1
- package/dist/_chunks/{index-Gs8cfEz2.mjs → index-Wx0Ad5g7.mjs} +9 -9
- package/dist/_chunks/{index-Gs8cfEz2.mjs.map → index-Wx0Ad5g7.mjs.map} +1 -1
- package/dist/_chunks/{index-qWOzhCLN.js → index-YIcUm6pD.js} +2 -2
- package/dist/_chunks/{index-qWOzhCLN.js.map → index-YIcUm6pD.js.map} +1 -1
- package/dist/_chunks/{index-rda5pCgy.mjs → index-ik-kmtjL.mjs} +2 -2
- package/dist/_chunks/{index-rda5pCgy.mjs.map → index-ik-kmtjL.mjs.map} +1 -1
- package/dist/_chunks/{index-9bI1EXHo.js → index-ju1F8Gk-.js} +3 -3
- package/dist/_chunks/index-ju1F8Gk-.js.map +1 -0
- package/dist/_chunks/{index-SHBT-HN0.js → index-oI1NGNVT.js} +2 -2
- package/dist/_chunks/{index-SHBT-HN0.js.map → index-oI1NGNVT.js.map} +1 -1
- package/dist/_chunks/{index-akz9Qe5b.js → index-xnpJKDGB.js} +2 -2
- package/dist/_chunks/{index-akz9Qe5b.js.map → index-xnpJKDGB.js.map} +1 -1
- package/dist/_chunks/{index-nKtSbTE3.mjs → index-yJDHVaI8.mjs} +3 -3
- package/dist/_chunks/index-yJDHVaI8.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/package.json +5 -5
- package/server/services/providers-registry.js +1 -0
- package/dist/_chunks/index-9bI1EXHo.js.map +0 -1
- package/dist/_chunks/index-nKtSbTE3.mjs.map +0 -1
package/LICENSE
CHANGED
|
@@ -2,7 +2,21 @@ Copyright (c) 2015-present Strapi Solutions SAS
|
|
|
2
2
|
|
|
3
3
|
Portions of the Strapi software are licensed as follows:
|
|
4
4
|
|
|
5
|
-
* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined
|
|
5
|
+
* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined below.
|
|
6
|
+
|
|
7
|
+
Enterprise License
|
|
8
|
+
|
|
9
|
+
If you or the company you represent has entered into a written agreement referencing the Enterprise Edition of the Strapi source code available at
|
|
10
|
+
https://github.com/strapi/strapi, then such agreement applies to your use of the Enterprise Edition of the Strapi Software. If you or the company you
|
|
11
|
+
represent is using the Enterprise Edition of the Strapi Software in connection with a subscription to our cloud offering, then the agreement you have
|
|
12
|
+
agreed to with respect to our cloud offering and the licenses included in such agreement apply to your use of the Enterprise Edition of the Strapi Software.
|
|
13
|
+
Otherwise, the Strapi Enterprise Software License Agreement (found here https://strapi.io/enterprise-terms) applies to your use of the Enterprise Edition of the Strapi Software.
|
|
14
|
+
|
|
15
|
+
BY ACCESSING OR USING THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE RELEVANT REFERENCED AGREEMENT.
|
|
16
|
+
IF YOU ARE NOT AUTHORIZED TO ACCEPT THESE TERMS ON BEHALF OF THE COMPANY YOU REPRESENT OR IF YOU DO NOT AGREE TO ALL OF THE RELEVANT TERMS AND CONDITIONS REFERENCED AND YOU
|
|
17
|
+
HAVE NOT OTHERWISE EXECUTED A WRITTEN AGREEMENT WITH STRAPI, YOU ARE NOT AUTHORIZED TO ACCESS OR USE OR ALLOW ANY USER TO ACCESS OR USE ANY PART OF
|
|
18
|
+
THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE. YOUR ACCESS RIGHTS ARE CONDITIONAL ON YOUR CONSENT TO THE RELEVANT REFERENCED TERMS TO THE EXCLUSION OF ALL OTHER TERMS;
|
|
19
|
+
IF THE RELEVANT REFERENCED TERMS ARE CONSIDERED AN OFFER BY YOU, ACCEPTANCE IS EXPRESSLY LIMITED TO THE RELEVANT REFERENCED TERMS.
|
|
6
20
|
|
|
7
21
|
* All software outside of the above-mentioned directories or restrictions above is available under the "MIT Expat" license as set forth below.
|
|
8
22
|
|
|
@@ -18,5 +32,6 @@ furnished to do so, subject to the following conditions:
|
|
|
18
32
|
The above copyright notice and this permission notice shall be included in all
|
|
19
33
|
copies or substantial portions of the Software.
|
|
20
34
|
|
|
21
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
-
|
|
35
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
36
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
37
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -76,7 +76,7 @@ export const ProvidersPage = () => {
|
|
|
76
76
|
|
|
77
77
|
const submitMutation = useMutation((body) => put('/users-permissions/providers', body), {
|
|
78
78
|
async onSuccess() {
|
|
79
|
-
await queryClient.invalidateQueries(['users-permissions', 'providers']);
|
|
79
|
+
await queryClient.invalidateQueries(['users-permissions', 'get-providers']);
|
|
80
80
|
|
|
81
81
|
toggleNotification({
|
|
82
82
|
type: 'success',
|
|
@@ -10,7 +10,7 @@ const __variableDynamicImportRuntimeHelper = (glob, path) => {
|
|
|
10
10
|
});
|
|
11
11
|
};
|
|
12
12
|
const name$1 = "@strapi/plugin-users-permissions";
|
|
13
|
-
const version = "4.25.
|
|
13
|
+
const version = "4.25.2";
|
|
14
14
|
const description = "Protect your API with a full-authentication process based on JWT";
|
|
15
15
|
const repository = {
|
|
16
16
|
type: "git",
|
|
@@ -57,9 +57,9 @@ const scripts = {
|
|
|
57
57
|
};
|
|
58
58
|
const dependencies = {
|
|
59
59
|
"@strapi/design-system": "1.19.0",
|
|
60
|
-
"@strapi/helper-plugin": "4.25.
|
|
60
|
+
"@strapi/helper-plugin": "4.25.2",
|
|
61
61
|
"@strapi/icons": "1.19.0",
|
|
62
|
-
"@strapi/utils": "4.25.
|
|
62
|
+
"@strapi/utils": "4.25.2",
|
|
63
63
|
bcryptjs: "2.4.3",
|
|
64
64
|
formik: "2.4.0",
|
|
65
65
|
"grant-koa": "5.4.8",
|
|
@@ -79,7 +79,7 @@ const dependencies = {
|
|
|
79
79
|
};
|
|
80
80
|
const devDependencies = {
|
|
81
81
|
"@strapi/pack-up": "4.23.0",
|
|
82
|
-
"@strapi/strapi": "4.25.
|
|
82
|
+
"@strapi/strapi": "4.25.2",
|
|
83
83
|
"@testing-library/dom": "9.2.0",
|
|
84
84
|
"@testing-library/react": "14.0.0",
|
|
85
85
|
"@testing-library/user-event": "14.4.3",
|
|
@@ -171,7 +171,7 @@ const index = {
|
|
|
171
171
|
id: "roles",
|
|
172
172
|
to: `/settings/users-permissions/roles`,
|
|
173
173
|
async Component() {
|
|
174
|
-
const component = await Promise.resolve().then(() => require("./index-
|
|
174
|
+
const component = await Promise.resolve().then(() => require("./index-YIcUm6pD.js"));
|
|
175
175
|
return component;
|
|
176
176
|
},
|
|
177
177
|
permissions: PERMISSIONS.accessRoles
|
|
@@ -184,7 +184,7 @@ const index = {
|
|
|
184
184
|
id: "providers",
|
|
185
185
|
to: `/settings/users-permissions/providers`,
|
|
186
186
|
async Component() {
|
|
187
|
-
const component = await Promise.resolve().then(() => require("./index-
|
|
187
|
+
const component = await Promise.resolve().then(() => require("./index-ju1F8Gk-.js"));
|
|
188
188
|
return component;
|
|
189
189
|
},
|
|
190
190
|
permissions: PERMISSIONS.readProviders
|
|
@@ -197,7 +197,7 @@ const index = {
|
|
|
197
197
|
id: "email-templates",
|
|
198
198
|
to: `/settings/users-permissions/email-templates`,
|
|
199
199
|
async Component() {
|
|
200
|
-
const component = await Promise.resolve().then(() => require("./index-
|
|
200
|
+
const component = await Promise.resolve().then(() => require("./index-xnpJKDGB.js"));
|
|
201
201
|
return component;
|
|
202
202
|
},
|
|
203
203
|
permissions: PERMISSIONS.readEmailTemplates
|
|
@@ -210,7 +210,7 @@ const index = {
|
|
|
210
210
|
id: "advanced-settings",
|
|
211
211
|
to: `/settings/users-permissions/advanced-settings`,
|
|
212
212
|
async Component() {
|
|
213
|
-
const component = await Promise.resolve().then(() => require("./index-
|
|
213
|
+
const component = await Promise.resolve().then(() => require("./index-oI1NGNVT.js"));
|
|
214
214
|
return component;
|
|
215
215
|
},
|
|
216
216
|
permissions: PERMISSIONS.readAdvancedSettings
|
|
@@ -246,4 +246,4 @@ const index = {
|
|
|
246
246
|
exports.PERMISSIONS = PERMISSIONS;
|
|
247
247
|
exports.getTrad = getTrad;
|
|
248
248
|
exports.index = index;
|
|
249
|
-
//# sourceMappingURL=index-
|
|
249
|
+
//# sourceMappingURL=index-3qMQ60EZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-3qMQ60EZ.js","sources":["../../admin/src/constants.js","../../admin/src/pluginId.js","../../admin/src/utils/getTrad.js","../../admin/src/index.js"],"sourcesContent":["export const PERMISSIONS = {\n // Roles\n accessRoles: [\n { action: 'plugin::users-permissions.roles.create', subject: null },\n { action: 'plugin::users-permissions.roles.read', subject: null },\n ],\n createRole: [{ action: 'plugin::users-permissions.roles.create', subject: null }],\n deleteRole: [{ action: 'plugin::users-permissions.roles.delete', subject: null }],\n readRoles: [{ action: 'plugin::users-permissions.roles.read', subject: null }],\n updateRole: [{ action: 'plugin::users-permissions.roles.update', subject: null }],\n\n // AdvancedSettings\n readAdvancedSettings: [\n { action: 'plugin::users-permissions.advanced-settings.read', subject: null },\n ],\n updateAdvancedSettings: [\n { action: 'plugin::users-permissions.advanced-settings.update', subject: null },\n ],\n\n // Emails\n readEmailTemplates: [{ action: 'plugin::users-permissions.email-templates.read', subject: null }],\n updateEmailTemplates: [\n { action: 'plugin::users-permissions.email-templates.update', subject: null },\n ],\n\n // Providers\n readProviders: [{ action: 'plugin::users-permissions.providers.read', subject: null }],\n updateProviders: [{ action: 'plugin::users-permissions.providers.update', subject: null }],\n};\n","import pluginPkg from '../../package.json';\n\nconst pluginId = pluginPkg.name.replace(/^@strapi\\/plugin-/i, '');\n\nexport default pluginId;\n","import pluginId from '../pluginId';\n\nconst getTrad = (id) => `${pluginId}.${id}`;\n\nexport default getTrad;\n","// NOTE TO PLUGINS DEVELOPERS:\n// If you modify this file by adding new options to the plugin entry point\n// Here's the file: strapi/docs/3.0.0-beta.x/plugin-development/frontend-field-api.md\n// Here's the file: strapi/docs/3.0.0-beta.x/guides/registering-a-field-in-admin.md\n// Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated\n// IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED\nimport { prefixPluginTranslations } from '@strapi/helper-plugin';\n\nimport pluginPkg from '../../package.json';\n\nimport { PERMISSIONS } from './constants';\nimport getTrad from './utils/getTrad';\n\nconst name = pluginPkg.strapi.name;\n\nexport default {\n register(app) {\n // Create the plugin's settings section\n app.createSettingSection(\n {\n id: 'users-permissions',\n intlLabel: {\n id: getTrad('Settings.section-label'),\n defaultMessage: 'Users & Permissions plugin',\n },\n },\n [\n {\n intlLabel: {\n id: 'global.roles',\n defaultMessage: 'Roles',\n },\n id: 'roles',\n to: `/settings/users-permissions/roles`,\n async Component() {\n const component = await import('./pages/Roles');\n\n return component;\n },\n permissions: PERMISSIONS.accessRoles,\n },\n {\n intlLabel: {\n id: getTrad('HeaderNav.link.providers'),\n defaultMessage: 'Providers',\n },\n id: 'providers',\n to: `/settings/users-permissions/providers`,\n async Component() {\n const component = await import('./pages/Providers');\n\n return component;\n },\n permissions: PERMISSIONS.readProviders,\n },\n {\n intlLabel: {\n id: getTrad('HeaderNav.link.emailTemplates'),\n defaultMessage: 'Email templates',\n },\n id: 'email-templates',\n to: `/settings/users-permissions/email-templates`,\n async Component() {\n const component = await import('./pages/EmailTemplates');\n\n return component;\n },\n permissions: PERMISSIONS.readEmailTemplates,\n },\n {\n intlLabel: {\n id: getTrad('HeaderNav.link.advancedSettings'),\n defaultMessage: 'Advanced Settings',\n },\n id: 'advanced-settings',\n to: `/settings/users-permissions/advanced-settings`,\n async Component() {\n const component = await import('./pages/AdvancedSettings');\n\n return component;\n },\n permissions: PERMISSIONS.readAdvancedSettings,\n },\n ]\n );\n\n app.registerPlugin({\n id: 'users-permissions',\n name,\n });\n },\n bootstrap() {},\n async registerTrads({ locales }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, 'users-permissions'),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["prefixPluginTranslations"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import * as React from "react";
|
|
|
3
3
|
import { createContext, useContext, useMemo, useCallback, useReducer, forwardRef, useImperativeHandle, memo, useEffect, useState } from "react";
|
|
4
4
|
import { translatedErrors, useNotification, useFetchClient, useAPIErrorHandler, CheckPagePermissions, useOverlayBlocker, useTracking, SettingsPageTitle, Form, LoadingIndicatorPage, Link, pxToRem, onRowClick, stopPropagation, CheckPermissions, getFetchClient, useQueryParams, useFocusWhenNavigate, useRBAC, useFilter, useCollator, LinkButton, SearchURLQuery, NoPermissions, EmptyStateLayout, ConfirmDialog, AnErrorOccurred } from "@strapi/helper-plugin";
|
|
5
5
|
import { useHistory, useRouteMatch, Switch, Route } from "react-router-dom";
|
|
6
|
-
import { g as getTrad, P as PERMISSIONS } from "./index-
|
|
6
|
+
import { g as getTrad, P as PERMISSIONS } from "./index-Wx0Ad5g7.mjs";
|
|
7
7
|
import { Box, Flex, Typography, Checkbox, Grid, GridItem, VisuallyHidden, Accordion, AccordionToggle, AccordionContent, Main, HeaderLayout, Button, ContentLayout, TextInput, Textarea, Link as Link$1, Tbody, Tr, Td, IconButton, useNotifyAT, Layout, ActionLayout, Table, Thead, Th } from "@strapi/design-system";
|
|
8
8
|
import { Cog, Check, ArrowLeft, Pencil, Trash, Plus } from "@strapi/icons";
|
|
9
9
|
import { Formik } from "formik";
|
|
@@ -1156,4 +1156,4 @@ const Roles = () => {
|
|
|
1156
1156
|
export {
|
|
1157
1157
|
Roles as default
|
|
1158
1158
|
};
|
|
1159
|
-
//# sourceMappingURL=index-
|
|
1159
|
+
//# sourceMappingURL=index-UPEoy-4Z.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-N9SAOEu3.mjs","sources":["../../admin/src/contexts/UsersPermissionsContext/index.jsx","../../admin/src/utils/formatPluginName.js","../../admin/src/components/Permissions/init.js","../../admin/src/components/Permissions/PermissionRow/CheckboxWrapper.jsx","../../admin/src/components/Permissions/PermissionRow/SubCategory.jsx","../../admin/src/components/Permissions/PermissionRow/index.jsx","../../admin/src/components/Permissions/reducer.js","../../admin/src/components/Permissions/index.jsx","../../admin/src/components/BoundRoute/getMethodColor.js","../../admin/src/components/BoundRoute/index.jsx","../../admin/src/components/Policies/index.jsx","../../admin/src/components/UsersPermissions/init.js","../../admin/src/components/UsersPermissions/reducer.js","../../admin/src/components/UsersPermissions/index.jsx","../../admin/src/pages/Roles/constants.js","../../admin/src/utils/cleanPermissions.js","../../admin/src/pages/Roles/hooks/usePlugins.js","../../admin/src/pages/Roles/pages/CreatePage.jsx","../../admin/src/pages/Roles/pages/EditPage.jsx","../../admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx","../../admin/src/pages/Roles/pages/ListPage/utils/api.js","../../admin/src/pages/Roles/pages/ListPage/index.jsx","../../admin/src/pages/Roles/index.jsx"],"sourcesContent":["import React, { createContext, useContext } from 'react';\n\nimport PropTypes from 'prop-types';\n\nconst UsersPermissions = createContext({});\n\nconst UsersPermissionsProvider = ({ children, value }) => {\n return <UsersPermissions.Provider value={value}>{children}</UsersPermissions.Provider>;\n};\n\nconst useUsersPermissions = () => useContext(UsersPermissions);\n\nUsersPermissionsProvider.propTypes = {\n children: PropTypes.node.isRequired,\n value: PropTypes.object.isRequired,\n};\n\nexport { UsersPermissions, UsersPermissionsProvider, useUsersPermissions };\n","import upperFirst from 'lodash/upperFirst';\n\nfunction formatPluginName(pluginSlug) {\n switch (pluginSlug) {\n case 'application':\n return 'Application';\n case 'plugin::content-manager':\n return 'Content manager';\n case 'plugin::content-type-builder':\n return 'Content types builder';\n case 'plugin::documentation':\n return 'Documentation';\n case 'plugin::email':\n return 'Email';\n case 'plugin::i18n':\n return 'i18n';\n case 'plugin::upload':\n return 'Upload';\n case 'plugin::users-permissions':\n return 'Users-permissions';\n default:\n return upperFirst(pluginSlug.replace('api::', '').replace('plugin::', ''));\n }\n}\n\nexport default formatPluginName;\n","const init = (initialState, permissions) => {\n const collapses = Object.keys(permissions)\n .sort()\n .map((name) => ({ name, isOpen: false }));\n\n return { ...initialState, collapses };\n};\n\nexport default init;\n","import { Box } from '@strapi/design-system';\nimport styled, { css } from 'styled-components';\n\nconst activeCheckboxWrapperStyles = css`\n background: ${(props) => props.theme.colors.primary100};\n svg {\n opacity: 1;\n }\n`;\n\nconst CheckboxWrapper = styled(Box)`\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n svg {\n opacity: 0;\n path {\n fill: ${(props) => props.theme.colors.primary600};\n }\n }\n\n /* Show active style both on hover and when the action is selected */\n ${(props) => props.isActive && activeCheckboxWrapperStyles}\n &:hover {\n ${activeCheckboxWrapperStyles}\n }\n`;\n\nexport default CheckboxWrapper;\n","import React, { useCallback, useMemo } from 'react';\n\nimport {\n Box,\n Checkbox,\n Flex,\n Typography,\n Grid,\n GridItem,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Cog as CogIcon } from '@strapi/icons';\nimport get from 'lodash/get';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { useUsersPermissions } from '../../../contexts/UsersPermissionsContext';\n\nimport CheckboxWrapper from './CheckboxWrapper';\n\nconst Border = styled.div`\n flex: 1;\n align-self: center;\n border-top: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SubCategory = ({ subCategory }) => {\n const { formatMessage } = useIntl();\n const { onChange, onChangeSelectAll, onSelectedAction, selectedAction, modifiedData } =\n useUsersPermissions();\n\n const currentScopedModifiedData = useMemo(() => {\n return get(modifiedData, subCategory.name, {});\n }, [modifiedData, subCategory]);\n\n const hasAllActionsSelected = useMemo(() => {\n return Object.values(currentScopedModifiedData).every((action) => action.enabled === true);\n }, [currentScopedModifiedData]);\n\n const hasSomeActionsSelected = useMemo(() => {\n return (\n Object.values(currentScopedModifiedData).some((action) => action.enabled === true) &&\n !hasAllActionsSelected\n );\n }, [currentScopedModifiedData, hasAllActionsSelected]);\n\n const handleChangeSelectAll = useCallback(\n ({ target: { name } }) => {\n onChangeSelectAll({ target: { name, value: !hasAllActionsSelected } });\n },\n [hasAllActionsSelected, onChangeSelectAll]\n );\n\n const isActionSelected = useCallback(\n (actionName) => {\n return selectedAction === actionName;\n },\n [selectedAction]\n );\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Box paddingRight={4}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {subCategory.label}\n </Typography>\n </Box>\n <Border />\n <Box paddingLeft={4}>\n <Checkbox\n name={subCategory.name}\n value={hasAllActionsSelected}\n onValueChange={(value) =>\n handleChangeSelectAll({ target: { name: subCategory.name, value } })\n }\n indeterminate={hasSomeActionsSelected}\n >\n {formatMessage({ id: 'app.utils.select-all', defaultMessage: 'Select all' })}\n </Checkbox>\n </Box>\n </Flex>\n <Flex paddingTop={6} paddingBottom={6}>\n <Grid gap={2} style={{ flex: 1 }}>\n {subCategory.actions.map((action) => {\n const name = `${action.name}.enabled`;\n\n return (\n <GridItem col={6} key={action.name}>\n <CheckboxWrapper isActive={isActionSelected(action.name)} padding={2} hasRadius>\n <Checkbox\n value={get(modifiedData, name, false)}\n name={name}\n onValueChange={(value) => onChange({ target: { name, value } })}\n >\n {action.label}\n </Checkbox>\n <button\n type=\"button\"\n onClick={() => onSelectedAction(action.name)}\n style={{ display: 'inline-flex', alignItems: 'center' }}\n >\n <VisuallyHidden as=\"span\">\n {formatMessage(\n {\n id: 'app.utils.show-bound-route',\n defaultMessage: 'Show bound route for {route}',\n },\n {\n route: action.name,\n }\n )}\n </VisuallyHidden>\n <CogIcon />\n </button>\n </CheckboxWrapper>\n </GridItem>\n );\n })}\n </Grid>\n </Flex>\n </Box>\n );\n};\n\nSubCategory.propTypes = {\n subCategory: PropTypes.object.isRequired,\n};\n\nexport default SubCategory;\n","import React, { useMemo } from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport sortBy from 'lodash/sortBy';\nimport PropTypes from 'prop-types';\n\nimport SubCategory from './SubCategory';\n\nconst PermissionRow = ({ name, permissions }) => {\n const subCategories = useMemo(() => {\n return sortBy(\n Object.values(permissions.controllers).reduce((acc, curr, index) => {\n const currentName = `${name}.controllers.${Object.keys(permissions.controllers)[index]}`;\n const actions = sortBy(\n Object.keys(curr).reduce((acc, current) => {\n return [\n ...acc,\n {\n ...curr[current],\n label: current,\n name: `${currentName}.${current}`,\n },\n ];\n }, []),\n 'label'\n );\n\n return [\n ...acc,\n {\n actions,\n label: Object.keys(permissions.controllers)[index],\n name: currentName,\n },\n ];\n }, []),\n 'label'\n );\n }, [name, permissions]);\n\n return (\n <Box padding={6}>\n {subCategories.map((subCategory) => (\n <SubCategory key={subCategory.name} subCategory={subCategory} />\n ))}\n </Box>\n );\n};\n\nPermissionRow.propTypes = {\n name: PropTypes.string.isRequired,\n permissions: PropTypes.object.isRequired,\n};\n\nexport default PermissionRow;\n","import produce from 'immer';\n\nconst initialState = {\n collapses: [],\n};\n\nconst reducer = (state, action) =>\n // eslint-disable-next-line consistent-return\n produce(state, (draftState) => {\n switch (action.type) {\n case 'TOGGLE_COLLAPSE': {\n draftState.collapses = state.collapses.map((collapse, index) => {\n if (index === action.index) {\n return { ...collapse, isOpen: !collapse.isOpen };\n }\n\n return { ...collapse, isOpen: false };\n });\n\n break;\n }\n default:\n return draftState;\n }\n });\n\nexport { initialState, reducer };\n","import React, { useReducer } from 'react';\n\nimport { Accordion, AccordionContent, AccordionToggle, Flex } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useUsersPermissions } from '../../contexts/UsersPermissionsContext';\nimport formatPluginName from '../../utils/formatPluginName';\n\nimport init from './init';\nimport PermissionRow from './PermissionRow';\nimport { initialState, reducer } from './reducer';\n\nconst Permissions = () => {\n const { modifiedData } = useUsersPermissions();\n const { formatMessage } = useIntl();\n const [{ collapses }, dispatch] = useReducer(reducer, initialState, (state) =>\n init(state, modifiedData)\n );\n\n const handleToggle = (index) =>\n dispatch({\n type: 'TOGGLE_COLLAPSE',\n index,\n });\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n {collapses.map((collapse, index) => (\n <Accordion\n expanded={collapse.isOpen}\n onToggle={() => handleToggle(index)}\n key={collapse.name}\n variant={index % 2 === 0 ? 'secondary' : undefined}\n >\n <AccordionToggle\n title={formatPluginName(collapse.name)}\n description={formatMessage(\n {\n id: 'users-permissions.Plugin.permissions.plugins.description',\n defaultMessage: 'Define all allowed actions for the {name} plugin.',\n },\n { name: collapse.name }\n )}\n variant={index % 2 ? 'primary' : 'secondary'}\n />\n <AccordionContent>\n <PermissionRow permissions={modifiedData[collapse.name]} name={collapse.name} />\n </AccordionContent>\n </Accordion>\n ))}\n </Flex>\n );\n};\n\nexport default Permissions;\n","const getMethodColor = (verb) => {\n switch (verb) {\n case 'POST': {\n return {\n text: 'success600',\n border: 'success200',\n background: 'success100',\n };\n }\n case 'GET': {\n return {\n text: 'secondary600',\n border: 'secondary200',\n background: 'secondary100',\n };\n }\n case 'PUT': {\n return {\n text: 'warning600',\n border: 'warning200',\n background: 'warning100',\n };\n }\n case 'DELETE': {\n return {\n text: 'danger600',\n border: 'danger200',\n background: 'danger100',\n };\n }\n default: {\n return {\n text: 'neutral600',\n border: 'neutral200',\n background: 'neutral100',\n };\n }\n }\n};\n\nexport default getMethodColor;\n","import React from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport map from 'lodash/map';\nimport tail from 'lodash/tail';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport getMethodColor from './getMethodColor';\n\nconst MethodBox = styled(Box)`\n margin: -1px;\n border-radius: ${({ theme }) => theme.spaces[1]} 0 0 ${({ theme }) => theme.spaces[1]};\n`;\n\nfunction BoundRoute({ route }) {\n const { formatMessage } = useIntl();\n\n const { method, handler: title, path } = route;\n const formattedRoute = path ? tail(path.split('/')) : [];\n const [controller = '', action = ''] = title ? title.split('.') : [];\n const colors = getMethodColor(route.method);\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"delta\" as=\"h3\">\n {formatMessage({\n id: 'users-permissions.BoundRoute.title',\n defaultMessage: 'Bound route to',\n })}\n \n <span>{controller}</span>\n <Typography variant=\"delta\" textColor=\"primary600\">\n .{action}\n </Typography>\n </Typography>\n <Flex hasRadius background=\"neutral0\" borderColor=\"neutral200\" gap={0}>\n <MethodBox background={colors.background} borderColor={colors.border} padding={2}>\n <Typography fontWeight=\"bold\" textColor={colors.text}>\n {method}\n </Typography>\n </MethodBox>\n <Box paddingLeft={2} paddingRight={2}>\n {map(formattedRoute, (value) => (\n <Typography key={value} textColor={value.includes(':') ? 'neutral600' : 'neutral900'}>\n /{value}\n </Typography>\n ))}\n </Box>\n </Flex>\n </Flex>\n );\n}\n\nBoundRoute.defaultProps = {\n route: {\n handler: 'Nocontroller.error',\n method: 'GET',\n path: '/there-is-no-path',\n },\n};\n\nBoundRoute.propTypes = {\n route: PropTypes.shape({\n handler: PropTypes.string,\n method: PropTypes.string,\n path: PropTypes.string,\n }),\n};\n\nexport default BoundRoute;\n","import React from 'react';\n\nimport { Flex, GridItem, Typography } from '@strapi/design-system';\nimport get from 'lodash/get';\nimport isEmpty from 'lodash/isEmpty';\nimport without from 'lodash/without';\nimport { useIntl } from 'react-intl';\n\nimport { useUsersPermissions } from '../../contexts/UsersPermissionsContext';\nimport BoundRoute from '../BoundRoute';\n\nconst Policies = () => {\n const { formatMessage } = useIntl();\n const { selectedAction, routes } = useUsersPermissions();\n\n const path = without(selectedAction.split('.'), 'controllers');\n const controllerRoutes = get(routes, path[0]);\n const pathResolved = path.slice(1).join('.');\n\n const displayedRoutes = isEmpty(controllerRoutes)\n ? []\n : controllerRoutes.filter((o) => o.handler.endsWith(pathResolved));\n\n return (\n <GridItem\n col={5}\n background=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n style={{ minHeight: '100%' }}\n >\n {selectedAction ? (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {displayedRoutes.map((route, key) => (\n // eslint-disable-next-line react/no-array-index-key\n <BoundRoute key={key} route={route} />\n ))}\n </Flex>\n ) : (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"delta\" as=\"h3\">\n {formatMessage({\n id: 'users-permissions.Policies.header.title',\n defaultMessage: 'Advanced settings',\n })}\n </Typography>\n <Typography as=\"p\" textColor=\"neutral600\">\n {formatMessage({\n id: 'users-permissions.Policies.header.hint',\n defaultMessage:\n \"Select the application's actions or the plugin's actions and click on the cog icon to display the bound route\",\n })}\n </Typography>\n </Flex>\n )}\n </GridItem>\n );\n};\n\nexport default Policies;\n","const init = (state, permissions, routes) => {\n return {\n ...state,\n initialData: permissions,\n modifiedData: permissions,\n routes,\n };\n};\n\nexport default init;\n","/* eslint-disable consistent-return */\nimport produce from 'immer';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\nimport take from 'lodash/take';\n\nexport const initialState = {\n initialData: {},\n modifiedData: {},\n routes: {},\n selectedAction: '',\n policies: [],\n};\n\nconst reducer = (state, action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'ON_CHANGE': {\n const keysLength = action.keys.length;\n const isChangingCheckbox = action.keys[keysLength - 1] === 'enabled';\n\n if (action.value && isChangingCheckbox) {\n const selectedAction = take(action.keys, keysLength - 1).join('.');\n draftState.selectedAction = selectedAction;\n }\n\n set(draftState, ['modifiedData', ...action.keys], action.value);\n break;\n }\n case 'ON_CHANGE_SELECT_ALL': {\n const pathToValue = ['modifiedData', ...action.keys];\n const oldValues = get(state, pathToValue, {});\n const updatedValues = Object.keys(oldValues).reduce((acc, current) => {\n acc[current] = { ...oldValues[current], enabled: action.value };\n\n return acc;\n }, {});\n\n set(draftState, pathToValue, updatedValues);\n\n break;\n }\n case 'ON_RESET': {\n draftState.modifiedData = state.initialData;\n break;\n }\n case 'ON_SUBMIT_SUCCEEDED': {\n draftState.initialData = state.modifiedData;\n break;\n }\n\n case 'SELECT_ACTION': {\n const { actionToSelect } = action;\n draftState.selectedAction = actionToSelect === state.selectedAction ? '' : actionToSelect;\n break;\n }\n default:\n return draftState;\n }\n });\n\nexport default reducer;\n","import React, { forwardRef, memo, useImperativeHandle, useReducer } from 'react';\n\nimport { Flex, Grid, GridItem, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { UsersPermissionsProvider } from '../../contexts/UsersPermissionsContext';\nimport getTrad from '../../utils/getTrad';\nimport Permissions from '../Permissions';\nimport Policies from '../Policies';\n\nimport init from './init';\nimport reducer, { initialState } from './reducer';\n\nconst UsersPermissions = forwardRef(({ permissions, routes }, ref) => {\n const { formatMessage } = useIntl();\n const [state, dispatch] = useReducer(reducer, initialState, (state) =>\n init(state, permissions, routes)\n );\n\n useImperativeHandle(ref, () => ({\n getPermissions() {\n return {\n permissions: state.modifiedData,\n };\n },\n resetForm() {\n dispatch({ type: 'ON_RESET' });\n },\n setFormAfterSubmit() {\n dispatch({ type: 'ON_SUBMIT_SUCCEEDED' });\n },\n }));\n\n const handleChange = ({ target: { name, value } }) =>\n dispatch({\n type: 'ON_CHANGE',\n keys: name.split('.'),\n value: value === 'empty__string_value' ? '' : value,\n });\n\n const handleChangeSelectAll = ({ target: { name, value } }) =>\n dispatch({\n type: 'ON_CHANGE_SELECT_ALL',\n keys: name.split('.'),\n value,\n });\n\n const handleSelectedAction = (actionToSelect) =>\n dispatch({\n type: 'SELECT_ACTION',\n actionToSelect,\n });\n\n const providerValue = {\n ...state,\n onChange: handleChange,\n onChangeSelectAll: handleChangeSelectAll,\n onSelectedAction: handleSelectedAction,\n };\n\n return (\n <UsersPermissionsProvider value={providerValue}>\n <Grid gap={0} shadow=\"filterShadow\" hasRadius background=\"neutral0\">\n <GridItem col={7} paddingTop={6} paddingBottom={6} paddingLeft={7} paddingRight={7}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: getTrad('Plugins.header.title'),\n defaultMessage: 'Permissions',\n })}\n </Typography>\n <Typography as=\"p\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('Plugins.header.description'),\n defaultMessage: 'Only actions bound by a route are listed below.',\n })}\n </Typography>\n </Flex>\n <Permissions />\n </Flex>\n </GridItem>\n <Policies />\n </Grid>\n </UsersPermissionsProvider>\n );\n});\n\nUsersPermissions.propTypes = {\n permissions: PropTypes.object.isRequired,\n routes: PropTypes.object.isRequired,\n};\n\nexport default memo(UsersPermissions);\n","import { translatedErrors } from '@strapi/helper-plugin';\nimport * as yup from 'yup';\n\nexport const createRoleSchema = yup.object().shape({\n name: yup.string().required(translatedErrors.required),\n description: yup.string().required(translatedErrors.required),\n});\n","import isEmpty from 'lodash/isEmpty';\n\nconst cleanPermissions = (permissions) =>\n Object.keys(permissions).reduce((acc, current) => {\n const currentPermission = permissions[current].controllers;\n const cleanedControllers = Object.keys(currentPermission).reduce((acc2, curr) => {\n if (isEmpty(currentPermission[curr])) {\n return acc2;\n }\n\n acc2[curr] = currentPermission[curr];\n\n return acc2;\n }, {});\n\n if (isEmpty(cleanedControllers)) {\n return acc;\n }\n\n acc[current] = { controllers: cleanedControllers };\n\n return acc;\n }, {});\n\nexport default cleanPermissions;\n","import { useEffect } from 'react';\n\nimport { useNotification, useFetchClient, useAPIErrorHandler } from '@strapi/helper-plugin';\nimport { useQueries } from 'react-query';\n\nimport { cleanPermissions, getTrad } from '../../../utils';\n\nexport const usePlugins = () => {\n const toggleNotification = useNotification();\n const { get } = useFetchClient();\n const { formatAPIError } = useAPIErrorHandler(getTrad);\n\n const [\n {\n data: permissions,\n isLoading: isLoadingPermissions,\n error: permissionsError,\n refetch: refetchPermissions,\n },\n { data: routes, isLoading: isLoadingRoutes, error: routesError, refetch: refetchRoutes },\n ] = useQueries([\n {\n queryKey: ['users-permissions', 'permissions'],\n async queryFn() {\n const {\n data: { permissions },\n } = await get(`/users-permissions/permissions`);\n\n return permissions;\n },\n },\n {\n queryKey: ['users-permissions', 'routes'],\n async queryFn() {\n const {\n data: { routes },\n } = await get(`/users-permissions/routes`);\n\n return routes;\n },\n },\n ]);\n\n const refetchQueries = async () => {\n await Promise.all([refetchPermissions(), refetchRoutes()]);\n };\n\n useEffect(() => {\n if (permissionsError) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(permissionsError),\n });\n }\n }, [toggleNotification, permissionsError, formatAPIError]);\n\n useEffect(() => {\n if (routesError) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(routesError),\n });\n }\n }, [toggleNotification, routesError, formatAPIError]);\n\n const isLoading = isLoadingPermissions || isLoadingRoutes;\n\n return {\n // TODO: these return values need to be memoized, otherwise\n // they will create infinite rendering loops when used as\n // effect dependencies\n permissions: permissions ? cleanPermissions(permissions) : {},\n routes: routes ?? {},\n\n getData: refetchQueries,\n isLoading,\n };\n};\n","import * as React from 'react';\n\nimport {\n Button,\n ContentLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Main,\n Textarea,\n TextInput,\n Typography,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n Form,\n SettingsPageTitle,\n useFetchClient,\n useNotification,\n useOverlayBlocker,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Check } from '@strapi/icons';\nimport { Formik } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useMutation } from 'react-query';\nimport { useHistory } from 'react-router-dom';\n\nimport UsersPermissions from '../../../components/UsersPermissions';\nimport { PERMISSIONS } from '../../../constants';\nimport getTrad from '../../../utils/getTrad';\nimport { createRoleSchema } from '../constants';\nimport { usePlugins } from '../hooks/usePlugins';\n\nexport const CreatePage = () => {\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const { goBack } = useHistory();\n const { lockApp, unlockApp } = useOverlayBlocker();\n const { isLoading: isLoadingPlugins, permissions, routes } = usePlugins();\n const { trackUsage } = useTracking();\n const permissionsRef = React.useRef();\n const { post } = useFetchClient();\n const mutation = useMutation((body) => post(`/users-permissions/roles`, body), {\n onError() {\n toggleNotification({\n type: 'warning',\n message: {\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n },\n });\n },\n\n onSuccess() {\n trackUsage('didCreateRole');\n\n toggleNotification({\n type: 'success',\n message: {\n id: getTrad('Settings.roles.created'),\n defaultMessage: 'Role created',\n },\n });\n\n // Forcing redirecting since we don't have the id in the response\n goBack();\n },\n });\n\n const handleCreateRoleSubmit = async (data) => {\n lockApp();\n\n // TODO: refactor. Child -> parent component communication is evil;\n // We should either move the provider one level up or move the state\n // straight into redux.\n const permissions = permissionsRef.current.getPermissions();\n\n await mutation.mutate({ ...data, ...permissions, users: [] });\n\n unlockApp();\n };\n\n return (\n <Main>\n {/* TODO: This needs to be translated */}\n <SettingsPageTitle name=\"Roles\" />\n <Formik\n enableReinitialize\n initialValues={{ name: '', description: '' }}\n onSubmit={handleCreateRoleSubmit}\n validationSchema={createRoleSchema}\n >\n {({ handleSubmit, values, handleChange, errors }) => (\n <Form noValidate onSubmit={handleSubmit}>\n <HeaderLayout\n primaryAction={\n !isLoadingPlugins && (\n <Button type=\"submit\" loading={mutation.isLoading} startIcon={<Check />}>\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n )\n }\n title={formatMessage({\n id: 'Settings.roles.create.title',\n defaultMessage: 'Create a role',\n })}\n subtitle={formatMessage({\n id: 'Settings.roles.create.description',\n defaultMessage: 'Define the rights given to the role',\n })}\n />\n <ContentLayout>\n <Flex\n background=\"neutral0\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={7}\n hasRadius\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n shadow=\"filterShadow\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\">\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: getTrad('EditPage.form.roles'),\n defaultMessage: 'Role details',\n })}\n </Typography>\n\n <Grid gap={4}>\n <GridItem col={6}>\n <TextInput\n name=\"name\"\n value={values.name || ''}\n onChange={handleChange}\n label={formatMessage({\n id: 'global.name',\n defaultMessage: 'Name',\n })}\n error={\n errors?.name\n ? formatMessage({ id: errors.name, defaultMessage: 'Name is required' })\n : false\n }\n required\n />\n </GridItem>\n <GridItem col={6}>\n <Textarea\n id=\"description\"\n value={values.description || ''}\n onChange={handleChange}\n label={formatMessage({\n id: 'global.description',\n defaultMessage: 'Description',\n })}\n error={\n errors?.description\n ? formatMessage({\n id: errors.description,\n defaultMessage: 'Description is required',\n })\n : false\n }\n required\n />\n </GridItem>\n </Grid>\n </Flex>\n\n {!isLoadingPlugins && (\n <UsersPermissions\n ref={permissionsRef}\n permissions={permissions}\n routes={routes}\n />\n )}\n </Flex>\n </ContentLayout>\n </Form>\n )}\n </Formik>\n </Main>\n );\n};\n\nexport const ProtectedRolesCreatePage = () => (\n <CheckPagePermissions permissions={PERMISSIONS.createRole}>\n <CreatePage />\n </CheckPagePermissions>\n);\n","import * as React from 'react';\n\nimport {\n ContentLayout,\n HeaderLayout,\n Main,\n Button,\n Flex,\n TextInput,\n Textarea,\n Typography,\n GridItem,\n Grid,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n useOverlayBlocker,\n SettingsPageTitle,\n LoadingIndicatorPage,\n Form,\n useAPIErrorHandler,\n useFetchClient,\n useNotification,\n Link,\n} from '@strapi/helper-plugin';\nimport { ArrowLeft, Check } from '@strapi/icons';\nimport { Formik } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useMutation } from 'react-query';\nimport { useRouteMatch } from 'react-router-dom';\n\nimport UsersPermissions from '../../../components/UsersPermissions';\nimport { PERMISSIONS } from '../../../constants';\nimport getTrad from '../../../utils/getTrad';\nimport { createRoleSchema } from '../constants';\nimport { usePlugins } from '../hooks/usePlugins';\n\nexport const EditPage = () => {\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const { lockApp, unlockApp } = useOverlayBlocker();\n const {\n params: { id },\n } = useRouteMatch(`/settings/users-permissions/roles/:id`);\n const { get } = useFetchClient();\n const { isLoading: isLoadingPlugins, routes } = usePlugins();\n const {\n data: role,\n isLoading: isLoadingRole,\n refetch: refetchRole,\n } = useQuery(['users-permissions', 'role', id], async () => {\n // TODO: why doesn't this endpoint follow the admin API conventions?\n const {\n data: { role },\n } = await get(`/users-permissions/roles/${id}`);\n\n return role;\n });\n\n const permissionsRef = React.useRef();\n const { put } = useFetchClient();\n const { formatAPIError } = useAPIErrorHandler();\n const mutation = useMutation((body) => put(`/users-permissions/roles/${id}`, body), {\n onError(error) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(error),\n });\n },\n\n async onSuccess() {\n toggleNotification({\n type: 'success',\n message: {\n id: getTrad('Settings.roles.created'),\n defaultMessage: 'Role edited',\n },\n });\n\n await refetchRole();\n },\n });\n\n const handleEditRoleSubmit = async (data) => {\n // Set loading state\n lockApp();\n\n const permissions = permissionsRef.current.getPermissions();\n\n await mutation.mutate({ ...data, ...permissions, users: [] });\n\n unlockApp();\n };\n\n if (isLoadingRole) {\n return <LoadingIndicatorPage />;\n }\n\n return (\n <Main>\n {/* TODO: this needs to be translated */}\n <SettingsPageTitle name=\"Roles\" />\n <Formik\n enableReinitialize\n initialValues={{ name: role.name, description: role.description }}\n onSubmit={handleEditRoleSubmit}\n validationSchema={createRoleSchema}\n >\n {({ handleSubmit, values, handleChange, errors }) => (\n <Form noValidate onSubmit={handleSubmit}>\n <HeaderLayout\n primaryAction={\n !isLoadingPlugins && (\n <Button\n disabled={role.code === 'strapi-super-admin'}\n type=\"submit\"\n loading={mutation.isLoading}\n startIcon={<Check />}\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n )\n }\n title={role.name}\n subtitle={role.description}\n navigationAction={\n <Link startIcon={<ArrowLeft />} to=\"/settings/users-permissions/roles\">\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n />\n <ContentLayout>\n <Flex\n background=\"neutral0\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={7}\n hasRadius\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n shadow=\"filterShadow\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: getTrad('EditPage.form.roles'),\n defaultMessage: 'Role details',\n })}\n </Typography>\n\n <Grid gap={4}>\n <GridItem col={6}>\n <TextInput\n name=\"name\"\n value={values.name || ''}\n onChange={handleChange}\n label={formatMessage({\n id: 'global.name',\n defaultMessage: 'Name',\n })}\n error={\n errors?.name\n ? formatMessage({ id: errors.name, defaultMessage: 'Name is required' })\n : false\n }\n required\n />\n </GridItem>\n <GridItem col={6}>\n <Textarea\n id=\"description\"\n value={values.description || ''}\n onChange={handleChange}\n label={formatMessage({\n id: 'global.description',\n defaultMessage: 'Description',\n })}\n error={\n errors?.description\n ? formatMessage({\n id: errors.description,\n defaultMessage: 'Description is required',\n })\n : false\n }\n required\n />\n </GridItem>\n </Grid>\n </Flex>\n\n {!isLoadingPlugins && (\n <UsersPermissions\n ref={permissionsRef}\n permissions={role.permissions}\n routes={routes}\n />\n )}\n </Flex>\n </ContentLayout>\n </Form>\n )}\n </Formik>\n </Main>\n );\n};\n\nexport const ProtectedRolesEditPage = () => (\n <CheckPagePermissions permissions={PERMISSIONS.updateRole}>\n <EditPage />\n </CheckPagePermissions>\n);\n","import React from 'react';\n\nimport { Flex, IconButton, Link, Tbody, Td, Tr, Typography } from '@strapi/design-system';\nimport { CheckPermissions, onRowClick, pxToRem, stopPropagation } from '@strapi/helper-plugin';\nimport { Pencil, Trash } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { useHistory } from 'react-router-dom';\nimport styled from 'styled-components';\n\nconst EditLink = styled(Link)`\n align-items: center;\n height: ${pxToRem(32)};\n display: flex;\n justify-content: center;\n padding: ${({ theme }) => `${theme.spaces[2]}}`};\n width: ${pxToRem(32)};\n\n svg {\n height: ${pxToRem(12)};\n width: ${pxToRem(12)};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n\n &:hover,\n &:focus {\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral800};\n }\n }\n }\n`;\n\nconst TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDelete }) => {\n const { formatMessage } = useIntl();\n const { push } = useHistory();\n const [showConfirmDelete, setShowConfirmDelete] = onDelete;\n\n const checkCanDeleteRole = (role) =>\n canDelete && !['public', 'authenticated'].includes(role.type);\n\n const handleClickDelete = (id) => {\n setRoleToDelete(id);\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleClickEdit = (id) => {\n push(`/settings/users-permissions/roles/${id}`);\n };\n\n return (\n <Tbody>\n {sortedRoles?.map((role) => (\n <Tr key={role.name} {...onRowClick({ fn: () => handleClickEdit(role.id) })}>\n <Td width=\"20%\">\n <Typography>{role.name}</Typography>\n </Td>\n <Td width=\"50%\">\n <Typography>{role.description}</Typography>\n </Td>\n <Td width=\"30%\">\n <Typography>\n {formatMessage(\n {\n id: 'Roles.RoleRow.user-count',\n defaultMessage: '{number, plural, =0 {# user} one {# user} other {# users}}',\n },\n { number: role.nb_users }\n )}\n </Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" {...stopPropagation}>\n <CheckPermissions permissions={permissions.updateRole}>\n <EditLink\n to={`/settings/users-permissions/roles/${role.id}`}\n aria-label={formatMessage(\n { id: 'app.component.table.edit', defaultMessage: 'Edit {target}' },\n { target: `${role.name}` }\n )}\n >\n <Pencil />\n </EditLink>\n </CheckPermissions>\n\n {checkCanDeleteRole(role) && (\n <CheckPermissions permissions={permissions.deleteRole}>\n <IconButton\n onClick={() => handleClickDelete(role.id)}\n noBorder\n icon={<Trash />}\n label={formatMessage(\n { id: 'global.delete-target', defaultMessage: 'Delete {target}' },\n { target: `${role.name}` }\n )}\n />\n </CheckPermissions>\n )}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n );\n};\n\nexport default TableBody;\n\nTableBody.defaultProps = {\n canDelete: false,\n};\n\nTableBody.propTypes = {\n onDelete: PropTypes.array.isRequired,\n permissions: PropTypes.object.isRequired,\n setRoleToDelete: PropTypes.func.isRequired,\n sortedRoles: PropTypes.array.isRequired,\n canDelete: PropTypes.bool,\n};\n","import { getFetchClient } from '@strapi/helper-plugin';\n\nexport const fetchData = async (toggleNotification, notifyStatus) => {\n try {\n const { get } = getFetchClient();\n const { data } = await get('/users-permissions/roles');\n notifyStatus('The roles have loaded successfully');\n\n return data;\n } catch (err) {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error' },\n });\n\n throw new Error(err);\n }\n};\n\nexport const deleteData = async (id, toggleNotification) => {\n try {\n const { del } = getFetchClient();\n await del(`/users-permissions/roles/${id}`);\n } catch (error) {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n }\n};\n","import React, { useState } from 'react';\n\nimport {\n ActionLayout,\n ContentLayout,\n HeaderLayout,\n Layout,\n Main,\n Table,\n Th,\n Thead,\n Tr,\n Typography,\n useNotifyAT,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n CheckPermissions,\n ConfirmDialog,\n EmptyStateLayout,\n LinkButton,\n LoadingIndicatorPage,\n NoPermissions,\n SearchURLQuery,\n SettingsPageTitle,\n useCollator,\n useFilter,\n useFocusWhenNavigate,\n useNotification,\n useQueryParams,\n useRBAC,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\n\nimport { PERMISSIONS } from '../../../../constants';\nimport { getTrad } from '../../../../utils';\n\nimport TableBody from './components/TableBody';\nimport { deleteData, fetchData } from './utils/api';\n\nexport const RolesListPage = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const toggleNotification = useNotification();\n const { notifyStatus } = useNotifyAT();\n const [{ query }] = useQueryParams();\n const _q = query?._q || '';\n const [showConfirmDelete, setShowConfirmDelete] = useState(false);\n const [isConfirmButtonLoading, setIsConfirmButtonLoading] = useState(false);\n const [roleToDelete, setRoleToDelete] = useState();\n useFocusWhenNavigate();\n\n const {\n isLoading: isLoadingForPermissions,\n allowedActions: { canRead, canDelete },\n } = useRBAC({\n create: PERMISSIONS.createRole,\n read: PERMISSIONS.readRoles,\n update: PERMISSIONS.updateRole,\n delete: PERMISSIONS.deleteRole,\n });\n\n const {\n isLoading: isLoadingForData,\n data: { roles },\n isFetching,\n refetch,\n } = useQuery('get-roles', () => fetchData(toggleNotification, notifyStatus), {\n initialData: {},\n enabled: canRead,\n });\n\n const { includes } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n /**\n * @type {Intl.Collator}\n */\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const isLoading = isLoadingForData || isFetching;\n\n const handleShowConfirmDelete = () => {\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const emptyLayout = {\n roles: {\n id: getTrad('Roles.empty'),\n defaultMessage: \"You don't have any roles yet.\",\n },\n search: {\n id: getTrad('Roles.empty.search'),\n defaultMessage: 'No roles match the search.',\n },\n };\n\n const pageTitle = formatMessage({\n id: 'global.roles',\n defaultMessage: 'Roles',\n });\n\n const deleteMutation = useMutation((id) => deleteData(id, toggleNotification), {\n async onSuccess() {\n await refetch();\n },\n });\n\n const handleConfirmDelete = async () => {\n setIsConfirmButtonLoading(true);\n await deleteMutation.mutateAsync(roleToDelete);\n setShowConfirmDelete(!showConfirmDelete);\n setIsConfirmButtonLoading(false);\n };\n\n const sortedRoles = (roles || [])\n .filter((role) => includes(role.name, _q) || includes(role.description, _q))\n .sort(\n (a, b) => formatter.compare(a.name, b.name) || formatter.compare(a.description, b.description)\n );\n\n const emptyContent = _q && !sortedRoles.length ? 'search' : 'roles';\n\n const colCount = 4;\n const rowCount = (roles?.length || 0) + 1;\n\n return (\n <Layout>\n <SettingsPageTitle name={pageTitle} />\n <Main aria-busy={isLoading}>\n <HeaderLayout\n title={formatMessage({\n id: 'global.roles',\n defaultMessage: 'Roles',\n })}\n subtitle={formatMessage({\n id: 'Settings.roles.list.description',\n defaultMessage: 'List of roles',\n })}\n primaryAction={\n <CheckPermissions permissions={PERMISSIONS.createRole}>\n <LinkButton\n to=\"/settings/users-permissions/roles/new\"\n onClick={() => trackUsage('willCreateRole')}\n startIcon={<Plus />}\n size=\"S\"\n >\n {formatMessage({\n id: getTrad('List.button.roles'),\n defaultMessage: 'Add new role',\n })}\n </LinkButton>\n </CheckPermissions>\n }\n />\n\n <ActionLayout\n startActions={\n <SearchURLQuery\n label={formatMessage({\n id: 'app.component.search.label',\n defaultMessage: 'Search',\n })}\n />\n }\n />\n\n <ContentLayout>\n {!canRead && <NoPermissions />}\n {(isLoading || isLoadingForPermissions) && <LoadingIndicatorPage />}\n {canRead && sortedRoles && sortedRoles?.length ? (\n <Table colCount={colCount} rowCount={rowCount}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({ id: 'global.name', defaultMessage: 'Name' })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'global.description',\n defaultMessage: 'Description',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'global.users',\n defaultMessage: 'Users',\n })}\n </Typography>\n </Th>\n <Th>\n <VisuallyHidden>\n {formatMessage({\n id: 'global.actions',\n defaultMessage: 'Actions',\n })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <TableBody\n sortedRoles={sortedRoles}\n canDelete={canDelete}\n permissions={PERMISSIONS}\n setRoleToDelete={setRoleToDelete}\n onDelete={[showConfirmDelete, setShowConfirmDelete]}\n />\n </Table>\n ) : (\n <EmptyStateLayout content={emptyLayout[emptyContent]} />\n )}\n </ContentLayout>\n <ConfirmDialog\n isConfirmButtonLoading={isConfirmButtonLoading}\n onConfirm={handleConfirmDelete}\n onToggleDialog={handleShowConfirmDelete}\n isOpen={showConfirmDelete}\n />\n </Main>\n </Layout>\n );\n};\n\nexport const ProtectedRolesListPage = () => {\n return (\n <CheckPagePermissions permissions={PERMISSIONS.accessRoles}>\n <RolesListPage />\n </CheckPagePermissions>\n );\n};\n","import React from 'react';\n\nimport { AnErrorOccurred, CheckPagePermissions } from '@strapi/helper-plugin';\nimport { Route, Switch } from 'react-router-dom';\n\nimport { PERMISSIONS } from '../../constants';\n\nimport { ProtectedRolesCreatePage } from './pages/CreatePage';\nimport { ProtectedRolesEditPage } from './pages/EditPage';\nimport { ProtectedRolesListPage } from './pages/ListPage';\n\nconst Roles = () => {\n return (\n <CheckPagePermissions permissions={PERMISSIONS.accessRoles}>\n <Switch>\n <Route\n path=\"/settings/users-permissions/roles/new\"\n component={ProtectedRolesCreatePage}\n exact\n />\n <Route\n path=\"/settings/users-permissions/roles/:id\"\n component={ProtectedRolesEditPage}\n exact\n />\n <Route path=\"/settings/users-permissions/roles\" component={ProtectedRolesListPage} exact />\n <Route path=\"\" component={AnErrorOccurred} />\n </Switch>\n </CheckPagePermissions>\n );\n};\n\nexport default Roles;\n"],"names":["UsersPermissions","init","initialState","CogIcon","acc","reducer","state","get","permissions","routes","role","Link"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-UPEoy-4Z.mjs","sources":["../../admin/src/contexts/UsersPermissionsContext/index.jsx","../../admin/src/utils/formatPluginName.js","../../admin/src/components/Permissions/init.js","../../admin/src/components/Permissions/PermissionRow/CheckboxWrapper.jsx","../../admin/src/components/Permissions/PermissionRow/SubCategory.jsx","../../admin/src/components/Permissions/PermissionRow/index.jsx","../../admin/src/components/Permissions/reducer.js","../../admin/src/components/Permissions/index.jsx","../../admin/src/components/BoundRoute/getMethodColor.js","../../admin/src/components/BoundRoute/index.jsx","../../admin/src/components/Policies/index.jsx","../../admin/src/components/UsersPermissions/init.js","../../admin/src/components/UsersPermissions/reducer.js","../../admin/src/components/UsersPermissions/index.jsx","../../admin/src/pages/Roles/constants.js","../../admin/src/utils/cleanPermissions.js","../../admin/src/pages/Roles/hooks/usePlugins.js","../../admin/src/pages/Roles/pages/CreatePage.jsx","../../admin/src/pages/Roles/pages/EditPage.jsx","../../admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx","../../admin/src/pages/Roles/pages/ListPage/utils/api.js","../../admin/src/pages/Roles/pages/ListPage/index.jsx","../../admin/src/pages/Roles/index.jsx"],"sourcesContent":["import React, { createContext, useContext } from 'react';\n\nimport PropTypes from 'prop-types';\n\nconst UsersPermissions = createContext({});\n\nconst UsersPermissionsProvider = ({ children, value }) => {\n return <UsersPermissions.Provider value={value}>{children}</UsersPermissions.Provider>;\n};\n\nconst useUsersPermissions = () => useContext(UsersPermissions);\n\nUsersPermissionsProvider.propTypes = {\n children: PropTypes.node.isRequired,\n value: PropTypes.object.isRequired,\n};\n\nexport { UsersPermissions, UsersPermissionsProvider, useUsersPermissions };\n","import upperFirst from 'lodash/upperFirst';\n\nfunction formatPluginName(pluginSlug) {\n switch (pluginSlug) {\n case 'application':\n return 'Application';\n case 'plugin::content-manager':\n return 'Content manager';\n case 'plugin::content-type-builder':\n return 'Content types builder';\n case 'plugin::documentation':\n return 'Documentation';\n case 'plugin::email':\n return 'Email';\n case 'plugin::i18n':\n return 'i18n';\n case 'plugin::upload':\n return 'Upload';\n case 'plugin::users-permissions':\n return 'Users-permissions';\n default:\n return upperFirst(pluginSlug.replace('api::', '').replace('plugin::', ''));\n }\n}\n\nexport default formatPluginName;\n","const init = (initialState, permissions) => {\n const collapses = Object.keys(permissions)\n .sort()\n .map((name) => ({ name, isOpen: false }));\n\n return { ...initialState, collapses };\n};\n\nexport default init;\n","import { Box } from '@strapi/design-system';\nimport styled, { css } from 'styled-components';\n\nconst activeCheckboxWrapperStyles = css`\n background: ${(props) => props.theme.colors.primary100};\n svg {\n opacity: 1;\n }\n`;\n\nconst CheckboxWrapper = styled(Box)`\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n svg {\n opacity: 0;\n path {\n fill: ${(props) => props.theme.colors.primary600};\n }\n }\n\n /* Show active style both on hover and when the action is selected */\n ${(props) => props.isActive && activeCheckboxWrapperStyles}\n &:hover {\n ${activeCheckboxWrapperStyles}\n }\n`;\n\nexport default CheckboxWrapper;\n","import React, { useCallback, useMemo } from 'react';\n\nimport {\n Box,\n Checkbox,\n Flex,\n Typography,\n Grid,\n GridItem,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Cog as CogIcon } from '@strapi/icons';\nimport get from 'lodash/get';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { useUsersPermissions } from '../../../contexts/UsersPermissionsContext';\n\nimport CheckboxWrapper from './CheckboxWrapper';\n\nconst Border = styled.div`\n flex: 1;\n align-self: center;\n border-top: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SubCategory = ({ subCategory }) => {\n const { formatMessage } = useIntl();\n const { onChange, onChangeSelectAll, onSelectedAction, selectedAction, modifiedData } =\n useUsersPermissions();\n\n const currentScopedModifiedData = useMemo(() => {\n return get(modifiedData, subCategory.name, {});\n }, [modifiedData, subCategory]);\n\n const hasAllActionsSelected = useMemo(() => {\n return Object.values(currentScopedModifiedData).every((action) => action.enabled === true);\n }, [currentScopedModifiedData]);\n\n const hasSomeActionsSelected = useMemo(() => {\n return (\n Object.values(currentScopedModifiedData).some((action) => action.enabled === true) &&\n !hasAllActionsSelected\n );\n }, [currentScopedModifiedData, hasAllActionsSelected]);\n\n const handleChangeSelectAll = useCallback(\n ({ target: { name } }) => {\n onChangeSelectAll({ target: { name, value: !hasAllActionsSelected } });\n },\n [hasAllActionsSelected, onChangeSelectAll]\n );\n\n const isActionSelected = useCallback(\n (actionName) => {\n return selectedAction === actionName;\n },\n [selectedAction]\n );\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Box paddingRight={4}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {subCategory.label}\n </Typography>\n </Box>\n <Border />\n <Box paddingLeft={4}>\n <Checkbox\n name={subCategory.name}\n value={hasAllActionsSelected}\n onValueChange={(value) =>\n handleChangeSelectAll({ target: { name: subCategory.name, value } })\n }\n indeterminate={hasSomeActionsSelected}\n >\n {formatMessage({ id: 'app.utils.select-all', defaultMessage: 'Select all' })}\n </Checkbox>\n </Box>\n </Flex>\n <Flex paddingTop={6} paddingBottom={6}>\n <Grid gap={2} style={{ flex: 1 }}>\n {subCategory.actions.map((action) => {\n const name = `${action.name}.enabled`;\n\n return (\n <GridItem col={6} key={action.name}>\n <CheckboxWrapper isActive={isActionSelected(action.name)} padding={2} hasRadius>\n <Checkbox\n value={get(modifiedData, name, false)}\n name={name}\n onValueChange={(value) => onChange({ target: { name, value } })}\n >\n {action.label}\n </Checkbox>\n <button\n type=\"button\"\n onClick={() => onSelectedAction(action.name)}\n style={{ display: 'inline-flex', alignItems: 'center' }}\n >\n <VisuallyHidden as=\"span\">\n {formatMessage(\n {\n id: 'app.utils.show-bound-route',\n defaultMessage: 'Show bound route for {route}',\n },\n {\n route: action.name,\n }\n )}\n </VisuallyHidden>\n <CogIcon />\n </button>\n </CheckboxWrapper>\n </GridItem>\n );\n })}\n </Grid>\n </Flex>\n </Box>\n );\n};\n\nSubCategory.propTypes = {\n subCategory: PropTypes.object.isRequired,\n};\n\nexport default SubCategory;\n","import React, { useMemo } from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport sortBy from 'lodash/sortBy';\nimport PropTypes from 'prop-types';\n\nimport SubCategory from './SubCategory';\n\nconst PermissionRow = ({ name, permissions }) => {\n const subCategories = useMemo(() => {\n return sortBy(\n Object.values(permissions.controllers).reduce((acc, curr, index) => {\n const currentName = `${name}.controllers.${Object.keys(permissions.controllers)[index]}`;\n const actions = sortBy(\n Object.keys(curr).reduce((acc, current) => {\n return [\n ...acc,\n {\n ...curr[current],\n label: current,\n name: `${currentName}.${current}`,\n },\n ];\n }, []),\n 'label'\n );\n\n return [\n ...acc,\n {\n actions,\n label: Object.keys(permissions.controllers)[index],\n name: currentName,\n },\n ];\n }, []),\n 'label'\n );\n }, [name, permissions]);\n\n return (\n <Box padding={6}>\n {subCategories.map((subCategory) => (\n <SubCategory key={subCategory.name} subCategory={subCategory} />\n ))}\n </Box>\n );\n};\n\nPermissionRow.propTypes = {\n name: PropTypes.string.isRequired,\n permissions: PropTypes.object.isRequired,\n};\n\nexport default PermissionRow;\n","import produce from 'immer';\n\nconst initialState = {\n collapses: [],\n};\n\nconst reducer = (state, action) =>\n // eslint-disable-next-line consistent-return\n produce(state, (draftState) => {\n switch (action.type) {\n case 'TOGGLE_COLLAPSE': {\n draftState.collapses = state.collapses.map((collapse, index) => {\n if (index === action.index) {\n return { ...collapse, isOpen: !collapse.isOpen };\n }\n\n return { ...collapse, isOpen: false };\n });\n\n break;\n }\n default:\n return draftState;\n }\n });\n\nexport { initialState, reducer };\n","import React, { useReducer } from 'react';\n\nimport { Accordion, AccordionContent, AccordionToggle, Flex } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useUsersPermissions } from '../../contexts/UsersPermissionsContext';\nimport formatPluginName from '../../utils/formatPluginName';\n\nimport init from './init';\nimport PermissionRow from './PermissionRow';\nimport { initialState, reducer } from './reducer';\n\nconst Permissions = () => {\n const { modifiedData } = useUsersPermissions();\n const { formatMessage } = useIntl();\n const [{ collapses }, dispatch] = useReducer(reducer, initialState, (state) =>\n init(state, modifiedData)\n );\n\n const handleToggle = (index) =>\n dispatch({\n type: 'TOGGLE_COLLAPSE',\n index,\n });\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n {collapses.map((collapse, index) => (\n <Accordion\n expanded={collapse.isOpen}\n onToggle={() => handleToggle(index)}\n key={collapse.name}\n variant={index % 2 === 0 ? 'secondary' : undefined}\n >\n <AccordionToggle\n title={formatPluginName(collapse.name)}\n description={formatMessage(\n {\n id: 'users-permissions.Plugin.permissions.plugins.description',\n defaultMessage: 'Define all allowed actions for the {name} plugin.',\n },\n { name: collapse.name }\n )}\n variant={index % 2 ? 'primary' : 'secondary'}\n />\n <AccordionContent>\n <PermissionRow permissions={modifiedData[collapse.name]} name={collapse.name} />\n </AccordionContent>\n </Accordion>\n ))}\n </Flex>\n );\n};\n\nexport default Permissions;\n","const getMethodColor = (verb) => {\n switch (verb) {\n case 'POST': {\n return {\n text: 'success600',\n border: 'success200',\n background: 'success100',\n };\n }\n case 'GET': {\n return {\n text: 'secondary600',\n border: 'secondary200',\n background: 'secondary100',\n };\n }\n case 'PUT': {\n return {\n text: 'warning600',\n border: 'warning200',\n background: 'warning100',\n };\n }\n case 'DELETE': {\n return {\n text: 'danger600',\n border: 'danger200',\n background: 'danger100',\n };\n }\n default: {\n return {\n text: 'neutral600',\n border: 'neutral200',\n background: 'neutral100',\n };\n }\n }\n};\n\nexport default getMethodColor;\n","import React from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport map from 'lodash/map';\nimport tail from 'lodash/tail';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport getMethodColor from './getMethodColor';\n\nconst MethodBox = styled(Box)`\n margin: -1px;\n border-radius: ${({ theme }) => theme.spaces[1]} 0 0 ${({ theme }) => theme.spaces[1]};\n`;\n\nfunction BoundRoute({ route }) {\n const { formatMessage } = useIntl();\n\n const { method, handler: title, path } = route;\n const formattedRoute = path ? tail(path.split('/')) : [];\n const [controller = '', action = ''] = title ? title.split('.') : [];\n const colors = getMethodColor(route.method);\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"delta\" as=\"h3\">\n {formatMessage({\n id: 'users-permissions.BoundRoute.title',\n defaultMessage: 'Bound route to',\n })}\n \n <span>{controller}</span>\n <Typography variant=\"delta\" textColor=\"primary600\">\n .{action}\n </Typography>\n </Typography>\n <Flex hasRadius background=\"neutral0\" borderColor=\"neutral200\" gap={0}>\n <MethodBox background={colors.background} borderColor={colors.border} padding={2}>\n <Typography fontWeight=\"bold\" textColor={colors.text}>\n {method}\n </Typography>\n </MethodBox>\n <Box paddingLeft={2} paddingRight={2}>\n {map(formattedRoute, (value) => (\n <Typography key={value} textColor={value.includes(':') ? 'neutral600' : 'neutral900'}>\n /{value}\n </Typography>\n ))}\n </Box>\n </Flex>\n </Flex>\n );\n}\n\nBoundRoute.defaultProps = {\n route: {\n handler: 'Nocontroller.error',\n method: 'GET',\n path: '/there-is-no-path',\n },\n};\n\nBoundRoute.propTypes = {\n route: PropTypes.shape({\n handler: PropTypes.string,\n method: PropTypes.string,\n path: PropTypes.string,\n }),\n};\n\nexport default BoundRoute;\n","import React from 'react';\n\nimport { Flex, GridItem, Typography } from '@strapi/design-system';\nimport get from 'lodash/get';\nimport isEmpty from 'lodash/isEmpty';\nimport without from 'lodash/without';\nimport { useIntl } from 'react-intl';\n\nimport { useUsersPermissions } from '../../contexts/UsersPermissionsContext';\nimport BoundRoute from '../BoundRoute';\n\nconst Policies = () => {\n const { formatMessage } = useIntl();\n const { selectedAction, routes } = useUsersPermissions();\n\n const path = without(selectedAction.split('.'), 'controllers');\n const controllerRoutes = get(routes, path[0]);\n const pathResolved = path.slice(1).join('.');\n\n const displayedRoutes = isEmpty(controllerRoutes)\n ? []\n : controllerRoutes.filter((o) => o.handler.endsWith(pathResolved));\n\n return (\n <GridItem\n col={5}\n background=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n style={{ minHeight: '100%' }}\n >\n {selectedAction ? (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {displayedRoutes.map((route, key) => (\n // eslint-disable-next-line react/no-array-index-key\n <BoundRoute key={key} route={route} />\n ))}\n </Flex>\n ) : (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"delta\" as=\"h3\">\n {formatMessage({\n id: 'users-permissions.Policies.header.title',\n defaultMessage: 'Advanced settings',\n })}\n </Typography>\n <Typography as=\"p\" textColor=\"neutral600\">\n {formatMessage({\n id: 'users-permissions.Policies.header.hint',\n defaultMessage:\n \"Select the application's actions or the plugin's actions and click on the cog icon to display the bound route\",\n })}\n </Typography>\n </Flex>\n )}\n </GridItem>\n );\n};\n\nexport default Policies;\n","const init = (state, permissions, routes) => {\n return {\n ...state,\n initialData: permissions,\n modifiedData: permissions,\n routes,\n };\n};\n\nexport default init;\n","/* eslint-disable consistent-return */\nimport produce from 'immer';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\nimport take from 'lodash/take';\n\nexport const initialState = {\n initialData: {},\n modifiedData: {},\n routes: {},\n selectedAction: '',\n policies: [],\n};\n\nconst reducer = (state, action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'ON_CHANGE': {\n const keysLength = action.keys.length;\n const isChangingCheckbox = action.keys[keysLength - 1] === 'enabled';\n\n if (action.value && isChangingCheckbox) {\n const selectedAction = take(action.keys, keysLength - 1).join('.');\n draftState.selectedAction = selectedAction;\n }\n\n set(draftState, ['modifiedData', ...action.keys], action.value);\n break;\n }\n case 'ON_CHANGE_SELECT_ALL': {\n const pathToValue = ['modifiedData', ...action.keys];\n const oldValues = get(state, pathToValue, {});\n const updatedValues = Object.keys(oldValues).reduce((acc, current) => {\n acc[current] = { ...oldValues[current], enabled: action.value };\n\n return acc;\n }, {});\n\n set(draftState, pathToValue, updatedValues);\n\n break;\n }\n case 'ON_RESET': {\n draftState.modifiedData = state.initialData;\n break;\n }\n case 'ON_SUBMIT_SUCCEEDED': {\n draftState.initialData = state.modifiedData;\n break;\n }\n\n case 'SELECT_ACTION': {\n const { actionToSelect } = action;\n draftState.selectedAction = actionToSelect === state.selectedAction ? '' : actionToSelect;\n break;\n }\n default:\n return draftState;\n }\n });\n\nexport default reducer;\n","import React, { forwardRef, memo, useImperativeHandle, useReducer } from 'react';\n\nimport { Flex, Grid, GridItem, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { UsersPermissionsProvider } from '../../contexts/UsersPermissionsContext';\nimport getTrad from '../../utils/getTrad';\nimport Permissions from '../Permissions';\nimport Policies from '../Policies';\n\nimport init from './init';\nimport reducer, { initialState } from './reducer';\n\nconst UsersPermissions = forwardRef(({ permissions, routes }, ref) => {\n const { formatMessage } = useIntl();\n const [state, dispatch] = useReducer(reducer, initialState, (state) =>\n init(state, permissions, routes)\n );\n\n useImperativeHandle(ref, () => ({\n getPermissions() {\n return {\n permissions: state.modifiedData,\n };\n },\n resetForm() {\n dispatch({ type: 'ON_RESET' });\n },\n setFormAfterSubmit() {\n dispatch({ type: 'ON_SUBMIT_SUCCEEDED' });\n },\n }));\n\n const handleChange = ({ target: { name, value } }) =>\n dispatch({\n type: 'ON_CHANGE',\n keys: name.split('.'),\n value: value === 'empty__string_value' ? '' : value,\n });\n\n const handleChangeSelectAll = ({ target: { name, value } }) =>\n dispatch({\n type: 'ON_CHANGE_SELECT_ALL',\n keys: name.split('.'),\n value,\n });\n\n const handleSelectedAction = (actionToSelect) =>\n dispatch({\n type: 'SELECT_ACTION',\n actionToSelect,\n });\n\n const providerValue = {\n ...state,\n onChange: handleChange,\n onChangeSelectAll: handleChangeSelectAll,\n onSelectedAction: handleSelectedAction,\n };\n\n return (\n <UsersPermissionsProvider value={providerValue}>\n <Grid gap={0} shadow=\"filterShadow\" hasRadius background=\"neutral0\">\n <GridItem col={7} paddingTop={6} paddingBottom={6} paddingLeft={7} paddingRight={7}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: getTrad('Plugins.header.title'),\n defaultMessage: 'Permissions',\n })}\n </Typography>\n <Typography as=\"p\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('Plugins.header.description'),\n defaultMessage: 'Only actions bound by a route are listed below.',\n })}\n </Typography>\n </Flex>\n <Permissions />\n </Flex>\n </GridItem>\n <Policies />\n </Grid>\n </UsersPermissionsProvider>\n );\n});\n\nUsersPermissions.propTypes = {\n permissions: PropTypes.object.isRequired,\n routes: PropTypes.object.isRequired,\n};\n\nexport default memo(UsersPermissions);\n","import { translatedErrors } from '@strapi/helper-plugin';\nimport * as yup from 'yup';\n\nexport const createRoleSchema = yup.object().shape({\n name: yup.string().required(translatedErrors.required),\n description: yup.string().required(translatedErrors.required),\n});\n","import isEmpty from 'lodash/isEmpty';\n\nconst cleanPermissions = (permissions) =>\n Object.keys(permissions).reduce((acc, current) => {\n const currentPermission = permissions[current].controllers;\n const cleanedControllers = Object.keys(currentPermission).reduce((acc2, curr) => {\n if (isEmpty(currentPermission[curr])) {\n return acc2;\n }\n\n acc2[curr] = currentPermission[curr];\n\n return acc2;\n }, {});\n\n if (isEmpty(cleanedControllers)) {\n return acc;\n }\n\n acc[current] = { controllers: cleanedControllers };\n\n return acc;\n }, {});\n\nexport default cleanPermissions;\n","import { useEffect } from 'react';\n\nimport { useNotification, useFetchClient, useAPIErrorHandler } from '@strapi/helper-plugin';\nimport { useQueries } from 'react-query';\n\nimport { cleanPermissions, getTrad } from '../../../utils';\n\nexport const usePlugins = () => {\n const toggleNotification = useNotification();\n const { get } = useFetchClient();\n const { formatAPIError } = useAPIErrorHandler(getTrad);\n\n const [\n {\n data: permissions,\n isLoading: isLoadingPermissions,\n error: permissionsError,\n refetch: refetchPermissions,\n },\n { data: routes, isLoading: isLoadingRoutes, error: routesError, refetch: refetchRoutes },\n ] = useQueries([\n {\n queryKey: ['users-permissions', 'permissions'],\n async queryFn() {\n const {\n data: { permissions },\n } = await get(`/users-permissions/permissions`);\n\n return permissions;\n },\n },\n {\n queryKey: ['users-permissions', 'routes'],\n async queryFn() {\n const {\n data: { routes },\n } = await get(`/users-permissions/routes`);\n\n return routes;\n },\n },\n ]);\n\n const refetchQueries = async () => {\n await Promise.all([refetchPermissions(), refetchRoutes()]);\n };\n\n useEffect(() => {\n if (permissionsError) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(permissionsError),\n });\n }\n }, [toggleNotification, permissionsError, formatAPIError]);\n\n useEffect(() => {\n if (routesError) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(routesError),\n });\n }\n }, [toggleNotification, routesError, formatAPIError]);\n\n const isLoading = isLoadingPermissions || isLoadingRoutes;\n\n return {\n // TODO: these return values need to be memoized, otherwise\n // they will create infinite rendering loops when used as\n // effect dependencies\n permissions: permissions ? cleanPermissions(permissions) : {},\n routes: routes ?? {},\n\n getData: refetchQueries,\n isLoading,\n };\n};\n","import * as React from 'react';\n\nimport {\n Button,\n ContentLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Main,\n Textarea,\n TextInput,\n Typography,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n Form,\n SettingsPageTitle,\n useFetchClient,\n useNotification,\n useOverlayBlocker,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Check } from '@strapi/icons';\nimport { Formik } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useMutation } from 'react-query';\nimport { useHistory } from 'react-router-dom';\n\nimport UsersPermissions from '../../../components/UsersPermissions';\nimport { PERMISSIONS } from '../../../constants';\nimport getTrad from '../../../utils/getTrad';\nimport { createRoleSchema } from '../constants';\nimport { usePlugins } from '../hooks/usePlugins';\n\nexport const CreatePage = () => {\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const { goBack } = useHistory();\n const { lockApp, unlockApp } = useOverlayBlocker();\n const { isLoading: isLoadingPlugins, permissions, routes } = usePlugins();\n const { trackUsage } = useTracking();\n const permissionsRef = React.useRef();\n const { post } = useFetchClient();\n const mutation = useMutation((body) => post(`/users-permissions/roles`, body), {\n onError() {\n toggleNotification({\n type: 'warning',\n message: {\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n },\n });\n },\n\n onSuccess() {\n trackUsage('didCreateRole');\n\n toggleNotification({\n type: 'success',\n message: {\n id: getTrad('Settings.roles.created'),\n defaultMessage: 'Role created',\n },\n });\n\n // Forcing redirecting since we don't have the id in the response\n goBack();\n },\n });\n\n const handleCreateRoleSubmit = async (data) => {\n lockApp();\n\n // TODO: refactor. Child -> parent component communication is evil;\n // We should either move the provider one level up or move the state\n // straight into redux.\n const permissions = permissionsRef.current.getPermissions();\n\n await mutation.mutate({ ...data, ...permissions, users: [] });\n\n unlockApp();\n };\n\n return (\n <Main>\n {/* TODO: This needs to be translated */}\n <SettingsPageTitle name=\"Roles\" />\n <Formik\n enableReinitialize\n initialValues={{ name: '', description: '' }}\n onSubmit={handleCreateRoleSubmit}\n validationSchema={createRoleSchema}\n >\n {({ handleSubmit, values, handleChange, errors }) => (\n <Form noValidate onSubmit={handleSubmit}>\n <HeaderLayout\n primaryAction={\n !isLoadingPlugins && (\n <Button type=\"submit\" loading={mutation.isLoading} startIcon={<Check />}>\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n )\n }\n title={formatMessage({\n id: 'Settings.roles.create.title',\n defaultMessage: 'Create a role',\n })}\n subtitle={formatMessage({\n id: 'Settings.roles.create.description',\n defaultMessage: 'Define the rights given to the role',\n })}\n />\n <ContentLayout>\n <Flex\n background=\"neutral0\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={7}\n hasRadius\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n shadow=\"filterShadow\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\">\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: getTrad('EditPage.form.roles'),\n defaultMessage: 'Role details',\n })}\n </Typography>\n\n <Grid gap={4}>\n <GridItem col={6}>\n <TextInput\n name=\"name\"\n value={values.name || ''}\n onChange={handleChange}\n label={formatMessage({\n id: 'global.name',\n defaultMessage: 'Name',\n })}\n error={\n errors?.name\n ? formatMessage({ id: errors.name, defaultMessage: 'Name is required' })\n : false\n }\n required\n />\n </GridItem>\n <GridItem col={6}>\n <Textarea\n id=\"description\"\n value={values.description || ''}\n onChange={handleChange}\n label={formatMessage({\n id: 'global.description',\n defaultMessage: 'Description',\n })}\n error={\n errors?.description\n ? formatMessage({\n id: errors.description,\n defaultMessage: 'Description is required',\n })\n : false\n }\n required\n />\n </GridItem>\n </Grid>\n </Flex>\n\n {!isLoadingPlugins && (\n <UsersPermissions\n ref={permissionsRef}\n permissions={permissions}\n routes={routes}\n />\n )}\n </Flex>\n </ContentLayout>\n </Form>\n )}\n </Formik>\n </Main>\n );\n};\n\nexport const ProtectedRolesCreatePage = () => (\n <CheckPagePermissions permissions={PERMISSIONS.createRole}>\n <CreatePage />\n </CheckPagePermissions>\n);\n","import * as React from 'react';\n\nimport {\n ContentLayout,\n HeaderLayout,\n Main,\n Button,\n Flex,\n TextInput,\n Textarea,\n Typography,\n GridItem,\n Grid,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n useOverlayBlocker,\n SettingsPageTitle,\n LoadingIndicatorPage,\n Form,\n useAPIErrorHandler,\n useFetchClient,\n useNotification,\n Link,\n} from '@strapi/helper-plugin';\nimport { ArrowLeft, Check } from '@strapi/icons';\nimport { Formik } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useMutation } from 'react-query';\nimport { useRouteMatch } from 'react-router-dom';\n\nimport UsersPermissions from '../../../components/UsersPermissions';\nimport { PERMISSIONS } from '../../../constants';\nimport getTrad from '../../../utils/getTrad';\nimport { createRoleSchema } from '../constants';\nimport { usePlugins } from '../hooks/usePlugins';\n\nexport const EditPage = () => {\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const { lockApp, unlockApp } = useOverlayBlocker();\n const {\n params: { id },\n } = useRouteMatch(`/settings/users-permissions/roles/:id`);\n const { get } = useFetchClient();\n const { isLoading: isLoadingPlugins, routes } = usePlugins();\n const {\n data: role,\n isLoading: isLoadingRole,\n refetch: refetchRole,\n } = useQuery(['users-permissions', 'role', id], async () => {\n // TODO: why doesn't this endpoint follow the admin API conventions?\n const {\n data: { role },\n } = await get(`/users-permissions/roles/${id}`);\n\n return role;\n });\n\n const permissionsRef = React.useRef();\n const { put } = useFetchClient();\n const { formatAPIError } = useAPIErrorHandler();\n const mutation = useMutation((body) => put(`/users-permissions/roles/${id}`, body), {\n onError(error) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(error),\n });\n },\n\n async onSuccess() {\n toggleNotification({\n type: 'success',\n message: {\n id: getTrad('Settings.roles.created'),\n defaultMessage: 'Role edited',\n },\n });\n\n await refetchRole();\n },\n });\n\n const handleEditRoleSubmit = async (data) => {\n // Set loading state\n lockApp();\n\n const permissions = permissionsRef.current.getPermissions();\n\n await mutation.mutate({ ...data, ...permissions, users: [] });\n\n unlockApp();\n };\n\n if (isLoadingRole) {\n return <LoadingIndicatorPage />;\n }\n\n return (\n <Main>\n {/* TODO: this needs to be translated */}\n <SettingsPageTitle name=\"Roles\" />\n <Formik\n enableReinitialize\n initialValues={{ name: role.name, description: role.description }}\n onSubmit={handleEditRoleSubmit}\n validationSchema={createRoleSchema}\n >\n {({ handleSubmit, values, handleChange, errors }) => (\n <Form noValidate onSubmit={handleSubmit}>\n <HeaderLayout\n primaryAction={\n !isLoadingPlugins && (\n <Button\n disabled={role.code === 'strapi-super-admin'}\n type=\"submit\"\n loading={mutation.isLoading}\n startIcon={<Check />}\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n )\n }\n title={role.name}\n subtitle={role.description}\n navigationAction={\n <Link startIcon={<ArrowLeft />} to=\"/settings/users-permissions/roles\">\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n />\n <ContentLayout>\n <Flex\n background=\"neutral0\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={7}\n hasRadius\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n shadow=\"filterShadow\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: getTrad('EditPage.form.roles'),\n defaultMessage: 'Role details',\n })}\n </Typography>\n\n <Grid gap={4}>\n <GridItem col={6}>\n <TextInput\n name=\"name\"\n value={values.name || ''}\n onChange={handleChange}\n label={formatMessage({\n id: 'global.name',\n defaultMessage: 'Name',\n })}\n error={\n errors?.name\n ? formatMessage({ id: errors.name, defaultMessage: 'Name is required' })\n : false\n }\n required\n />\n </GridItem>\n <GridItem col={6}>\n <Textarea\n id=\"description\"\n value={values.description || ''}\n onChange={handleChange}\n label={formatMessage({\n id: 'global.description',\n defaultMessage: 'Description',\n })}\n error={\n errors?.description\n ? formatMessage({\n id: errors.description,\n defaultMessage: 'Description is required',\n })\n : false\n }\n required\n />\n </GridItem>\n </Grid>\n </Flex>\n\n {!isLoadingPlugins && (\n <UsersPermissions\n ref={permissionsRef}\n permissions={role.permissions}\n routes={routes}\n />\n )}\n </Flex>\n </ContentLayout>\n </Form>\n )}\n </Formik>\n </Main>\n );\n};\n\nexport const ProtectedRolesEditPage = () => (\n <CheckPagePermissions permissions={PERMISSIONS.updateRole}>\n <EditPage />\n </CheckPagePermissions>\n);\n","import React from 'react';\n\nimport { Flex, IconButton, Link, Tbody, Td, Tr, Typography } from '@strapi/design-system';\nimport { CheckPermissions, onRowClick, pxToRem, stopPropagation } from '@strapi/helper-plugin';\nimport { Pencil, Trash } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { useHistory } from 'react-router-dom';\nimport styled from 'styled-components';\n\nconst EditLink = styled(Link)`\n align-items: center;\n height: ${pxToRem(32)};\n display: flex;\n justify-content: center;\n padding: ${({ theme }) => `${theme.spaces[2]}}`};\n width: ${pxToRem(32)};\n\n svg {\n height: ${pxToRem(12)};\n width: ${pxToRem(12)};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n\n &:hover,\n &:focus {\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral800};\n }\n }\n }\n`;\n\nconst TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDelete }) => {\n const { formatMessage } = useIntl();\n const { push } = useHistory();\n const [showConfirmDelete, setShowConfirmDelete] = onDelete;\n\n const checkCanDeleteRole = (role) =>\n canDelete && !['public', 'authenticated'].includes(role.type);\n\n const handleClickDelete = (id) => {\n setRoleToDelete(id);\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleClickEdit = (id) => {\n push(`/settings/users-permissions/roles/${id}`);\n };\n\n return (\n <Tbody>\n {sortedRoles?.map((role) => (\n <Tr key={role.name} {...onRowClick({ fn: () => handleClickEdit(role.id) })}>\n <Td width=\"20%\">\n <Typography>{role.name}</Typography>\n </Td>\n <Td width=\"50%\">\n <Typography>{role.description}</Typography>\n </Td>\n <Td width=\"30%\">\n <Typography>\n {formatMessage(\n {\n id: 'Roles.RoleRow.user-count',\n defaultMessage: '{number, plural, =0 {# user} one {# user} other {# users}}',\n },\n { number: role.nb_users }\n )}\n </Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" {...stopPropagation}>\n <CheckPermissions permissions={permissions.updateRole}>\n <EditLink\n to={`/settings/users-permissions/roles/${role.id}`}\n aria-label={formatMessage(\n { id: 'app.component.table.edit', defaultMessage: 'Edit {target}' },\n { target: `${role.name}` }\n )}\n >\n <Pencil />\n </EditLink>\n </CheckPermissions>\n\n {checkCanDeleteRole(role) && (\n <CheckPermissions permissions={permissions.deleteRole}>\n <IconButton\n onClick={() => handleClickDelete(role.id)}\n noBorder\n icon={<Trash />}\n label={formatMessage(\n { id: 'global.delete-target', defaultMessage: 'Delete {target}' },\n { target: `${role.name}` }\n )}\n />\n </CheckPermissions>\n )}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n );\n};\n\nexport default TableBody;\n\nTableBody.defaultProps = {\n canDelete: false,\n};\n\nTableBody.propTypes = {\n onDelete: PropTypes.array.isRequired,\n permissions: PropTypes.object.isRequired,\n setRoleToDelete: PropTypes.func.isRequired,\n sortedRoles: PropTypes.array.isRequired,\n canDelete: PropTypes.bool,\n};\n","import { getFetchClient } from '@strapi/helper-plugin';\n\nexport const fetchData = async (toggleNotification, notifyStatus) => {\n try {\n const { get } = getFetchClient();\n const { data } = await get('/users-permissions/roles');\n notifyStatus('The roles have loaded successfully');\n\n return data;\n } catch (err) {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error' },\n });\n\n throw new Error(err);\n }\n};\n\nexport const deleteData = async (id, toggleNotification) => {\n try {\n const { del } = getFetchClient();\n await del(`/users-permissions/roles/${id}`);\n } catch (error) {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n }\n};\n","import React, { useState } from 'react';\n\nimport {\n ActionLayout,\n ContentLayout,\n HeaderLayout,\n Layout,\n Main,\n Table,\n Th,\n Thead,\n Tr,\n Typography,\n useNotifyAT,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n CheckPermissions,\n ConfirmDialog,\n EmptyStateLayout,\n LinkButton,\n LoadingIndicatorPage,\n NoPermissions,\n SearchURLQuery,\n SettingsPageTitle,\n useCollator,\n useFilter,\n useFocusWhenNavigate,\n useNotification,\n useQueryParams,\n useRBAC,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\n\nimport { PERMISSIONS } from '../../../../constants';\nimport { getTrad } from '../../../../utils';\n\nimport TableBody from './components/TableBody';\nimport { deleteData, fetchData } from './utils/api';\n\nexport const RolesListPage = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const toggleNotification = useNotification();\n const { notifyStatus } = useNotifyAT();\n const [{ query }] = useQueryParams();\n const _q = query?._q || '';\n const [showConfirmDelete, setShowConfirmDelete] = useState(false);\n const [isConfirmButtonLoading, setIsConfirmButtonLoading] = useState(false);\n const [roleToDelete, setRoleToDelete] = useState();\n useFocusWhenNavigate();\n\n const {\n isLoading: isLoadingForPermissions,\n allowedActions: { canRead, canDelete },\n } = useRBAC({\n create: PERMISSIONS.createRole,\n read: PERMISSIONS.readRoles,\n update: PERMISSIONS.updateRole,\n delete: PERMISSIONS.deleteRole,\n });\n\n const {\n isLoading: isLoadingForData,\n data: { roles },\n isFetching,\n refetch,\n } = useQuery('get-roles', () => fetchData(toggleNotification, notifyStatus), {\n initialData: {},\n enabled: canRead,\n });\n\n const { includes } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n /**\n * @type {Intl.Collator}\n */\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const isLoading = isLoadingForData || isFetching;\n\n const handleShowConfirmDelete = () => {\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const emptyLayout = {\n roles: {\n id: getTrad('Roles.empty'),\n defaultMessage: \"You don't have any roles yet.\",\n },\n search: {\n id: getTrad('Roles.empty.search'),\n defaultMessage: 'No roles match the search.',\n },\n };\n\n const pageTitle = formatMessage({\n id: 'global.roles',\n defaultMessage: 'Roles',\n });\n\n const deleteMutation = useMutation((id) => deleteData(id, toggleNotification), {\n async onSuccess() {\n await refetch();\n },\n });\n\n const handleConfirmDelete = async () => {\n setIsConfirmButtonLoading(true);\n await deleteMutation.mutateAsync(roleToDelete);\n setShowConfirmDelete(!showConfirmDelete);\n setIsConfirmButtonLoading(false);\n };\n\n const sortedRoles = (roles || [])\n .filter((role) => includes(role.name, _q) || includes(role.description, _q))\n .sort(\n (a, b) => formatter.compare(a.name, b.name) || formatter.compare(a.description, b.description)\n );\n\n const emptyContent = _q && !sortedRoles.length ? 'search' : 'roles';\n\n const colCount = 4;\n const rowCount = (roles?.length || 0) + 1;\n\n return (\n <Layout>\n <SettingsPageTitle name={pageTitle} />\n <Main aria-busy={isLoading}>\n <HeaderLayout\n title={formatMessage({\n id: 'global.roles',\n defaultMessage: 'Roles',\n })}\n subtitle={formatMessage({\n id: 'Settings.roles.list.description',\n defaultMessage: 'List of roles',\n })}\n primaryAction={\n <CheckPermissions permissions={PERMISSIONS.createRole}>\n <LinkButton\n to=\"/settings/users-permissions/roles/new\"\n onClick={() => trackUsage('willCreateRole')}\n startIcon={<Plus />}\n size=\"S\"\n >\n {formatMessage({\n id: getTrad('List.button.roles'),\n defaultMessage: 'Add new role',\n })}\n </LinkButton>\n </CheckPermissions>\n }\n />\n\n <ActionLayout\n startActions={\n <SearchURLQuery\n label={formatMessage({\n id: 'app.component.search.label',\n defaultMessage: 'Search',\n })}\n />\n }\n />\n\n <ContentLayout>\n {!canRead && <NoPermissions />}\n {(isLoading || isLoadingForPermissions) && <LoadingIndicatorPage />}\n {canRead && sortedRoles && sortedRoles?.length ? (\n <Table colCount={colCount} rowCount={rowCount}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({ id: 'global.name', defaultMessage: 'Name' })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'global.description',\n defaultMessage: 'Description',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'global.users',\n defaultMessage: 'Users',\n })}\n </Typography>\n </Th>\n <Th>\n <VisuallyHidden>\n {formatMessage({\n id: 'global.actions',\n defaultMessage: 'Actions',\n })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <TableBody\n sortedRoles={sortedRoles}\n canDelete={canDelete}\n permissions={PERMISSIONS}\n setRoleToDelete={setRoleToDelete}\n onDelete={[showConfirmDelete, setShowConfirmDelete]}\n />\n </Table>\n ) : (\n <EmptyStateLayout content={emptyLayout[emptyContent]} />\n )}\n </ContentLayout>\n <ConfirmDialog\n isConfirmButtonLoading={isConfirmButtonLoading}\n onConfirm={handleConfirmDelete}\n onToggleDialog={handleShowConfirmDelete}\n isOpen={showConfirmDelete}\n />\n </Main>\n </Layout>\n );\n};\n\nexport const ProtectedRolesListPage = () => {\n return (\n <CheckPagePermissions permissions={PERMISSIONS.accessRoles}>\n <RolesListPage />\n </CheckPagePermissions>\n );\n};\n","import React from 'react';\n\nimport { AnErrorOccurred, CheckPagePermissions } from '@strapi/helper-plugin';\nimport { Route, Switch } from 'react-router-dom';\n\nimport { PERMISSIONS } from '../../constants';\n\nimport { ProtectedRolesCreatePage } from './pages/CreatePage';\nimport { ProtectedRolesEditPage } from './pages/EditPage';\nimport { ProtectedRolesListPage } from './pages/ListPage';\n\nconst Roles = () => {\n return (\n <CheckPagePermissions permissions={PERMISSIONS.accessRoles}>\n <Switch>\n <Route\n path=\"/settings/users-permissions/roles/new\"\n component={ProtectedRolesCreatePage}\n exact\n />\n <Route\n path=\"/settings/users-permissions/roles/:id\"\n component={ProtectedRolesEditPage}\n exact\n />\n <Route path=\"/settings/users-permissions/roles\" component={ProtectedRolesListPage} exact />\n <Route path=\"\" component={AnErrorOccurred} />\n </Switch>\n </CheckPagePermissions>\n );\n};\n\nexport default Roles;\n"],"names":["UsersPermissions","init","initialState","CogIcon","acc","reducer","state","get","permissions","routes","role","Link"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { ModalLayout, ModalHeader, ModalBody, Grid, GridItem, Textarea, ModalFoo
|
|
|
4
4
|
import { translatedErrors, Form, GenericInput, onRowClick, stopPropagation, CheckPagePermissions, useTracking, useNotification, useOverlayBlocker, useFetchClient, useAPIErrorHandler, useFocusWhenNavigate, useRBAC, SettingsPageTitle, LoadingIndicatorPage } from "@strapi/helper-plugin";
|
|
5
5
|
import { useIntl } from "react-intl";
|
|
6
6
|
import { useQueryClient, useQuery, useMutation } from "react-query";
|
|
7
|
-
import { g as getTrad, P as PERMISSIONS } from "./index-
|
|
7
|
+
import { g as getTrad, P as PERMISSIONS } from "./index-Wx0Ad5g7.mjs";
|
|
8
8
|
import "lodash/isEmpty";
|
|
9
9
|
import { Breadcrumbs, Crumb } from "@strapi/design-system/v2";
|
|
10
10
|
import { Formik } from "formik";
|
|
@@ -382,4 +382,4 @@ const EmailTemplatesPage = () => {
|
|
|
382
382
|
export {
|
|
383
383
|
ProtectedEmailTemplatesPage as default
|
|
384
384
|
};
|
|
385
|
-
//# sourceMappingURL=index-
|
|
385
|
+
//# sourceMappingURL=index-Uw3UTtOL.mjs.map
|