@strapi/admin 4.7.2-exp.175f7ac70ee76d6c825e4429e15fc85ee78d23bb → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/admin/src/content-manager/components/ComponentInitializer/index.js +1 -1
  2. package/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +3 -31
  3. package/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +65 -134
  4. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/findAllAndReplace.js +85 -0
  5. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js +1 -2
  6. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/schema.js +7 -1
  7. package/admin/src/content-manager/components/NonRepeatableComponent/index.js +1 -1
  8. package/admin/src/content-manager/components/RelationInput/RelationInput.js +1 -2
  9. package/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +39 -33
  10. package/admin/src/content-manager/hooks/useRelation/useRelation.js +2 -2
  11. package/admin/src/content-manager/pages/EditView/Header/index.js +1 -1
  12. package/admin/src/content-manager/utils/createDefaultForm.js +0 -8
  13. package/admin/src/pages/AuthPage/components/Register/index.js +1 -1
  14. package/admin/src/pages/SettingsPage/components/Tokens/FormHead/index.js +1 -0
  15. package/admin/src/pages/SettingsPage/components/Tokens/Table/index.js +2 -2
  16. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/schema.js +1 -1
  17. package/admin/src/pages/SettingsPage/pages/Roles/CreatePage/index.js +266 -4
  18. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/index.js +1 -2
  19. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/index.js +2 -3
  20. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/ActionRow/index.js +2 -3
  21. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/SubActionRow/index.js +2 -3
  22. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/index.js +9 -4
  23. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/index.js +3 -7
  24. package/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js +303 -124
  25. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js +1 -1
  26. package/admin/src/pages/SettingsPage/utils/defaultRoutes.js +18 -10
  27. package/admin/src/translations/ca.json +7 -13
  28. package/admin/src/translations/de.json +0 -6
  29. package/admin/src/translations/dk.json +0 -6
  30. package/admin/src/translations/en.json +0 -6
  31. package/admin/src/translations/es.json +0 -6
  32. package/admin/src/translations/eu.json +165 -171
  33. package/admin/src/translations/fr.json +0 -6
  34. package/admin/src/translations/gu.json +0 -6
  35. package/admin/src/translations/he.json +0 -6
  36. package/admin/src/translations/hi.json +0 -6
  37. package/admin/src/translations/hu.json +0 -6
  38. package/admin/src/translations/id.json +0 -6
  39. package/admin/src/translations/it.json +0 -6
  40. package/admin/src/translations/ja.json +0 -6
  41. package/admin/src/translations/ko.json +0 -6
  42. package/admin/src/translations/ml.json +0 -6
  43. package/admin/src/translations/nl.json +0 -6
  44. package/admin/src/translations/no.json +0 -6
  45. package/admin/src/translations/pl.json +0 -6
  46. package/admin/src/translations/pt-BR.json +0 -6
  47. package/admin/src/translations/ru.json +0 -6
  48. package/admin/src/translations/sa.json +0 -6
  49. package/admin/src/translations/sk.json +0 -6
  50. package/admin/src/translations/sv.json +0 -6
  51. package/admin/src/translations/th.json +0 -6
  52. package/admin/src/translations/tr.json +0 -6
  53. package/admin/src/translations/zh-Hans.json +0 -6
  54. package/admin/src/translations/zh.json +0 -6
  55. package/build/{4649.daa290f6.chunk.js → 4649.33220ac3.chunk.js} +2 -2
  56. package/build/{6891.ef7464be.chunk.js → 7112.2bf13da3.chunk.js} +6 -6
  57. package/build/7259.3675c199.chunk.js +1 -0
  58. package/build/{3094.1cac9087.chunk.js → 8580.0aa21940.chunk.js} +5 -5
  59. package/build/{Admin-authenticatedApp.25bdcdc0.chunk.js → Admin-authenticatedApp.5abacdd4.chunk.js} +4 -4
  60. package/build/Admin_settingsPage.caf3b9ab.chunk.js +9 -0
  61. package/build/{admin-app.d9d96db4.chunk.js → admin-app.4b313104.chunk.js} +2 -2
  62. package/build/admin-edit-roles-page.3b196317.chunk.js +216 -0
  63. package/build/{admin-edit-users.48031e30.chunk.js → admin-edit-users.af3b0f15.chunk.js} +1 -1
  64. package/build/admin-roles-list.0ad504a7.chunk.js +2 -0
  65. package/build/{admin-users.77b4188a.chunk.js → admin-users.af8c3123.chunk.js} +1 -1
  66. package/build/api-tokens-list-page.93f24348.chunk.js +16 -0
  67. package/build/ca-json.43e14418.chunk.js +1 -0
  68. package/build/content-manager.84afc839.chunk.js +1139 -0
  69. package/build/{content-type-builder.cdd117c3.chunk.js → content-type-builder.55dac849.chunk.js} +1 -1
  70. package/build/de-json.fcac7381.chunk.js +1 -0
  71. package/build/dk-json.e34cad0d.chunk.js +1 -0
  72. package/build/{en-json.e688dfe2.chunk.js → en-json.01a88a30.chunk.js} +1 -1
  73. package/build/es-json.715b6fd8.chunk.js +1 -0
  74. package/build/eu-json.fb17c8f9.chunk.js +1 -0
  75. package/build/fr-json.f66c3211.chunk.js +1 -0
  76. package/build/gu-json.4d667d0c.chunk.js +1 -0
  77. package/build/{he-json.f0de8cdb.chunk.js → he-json.3cf0b48a.chunk.js} +1 -1
  78. package/build/{hi-json.14a17920.chunk.js → hi-json.323be97d.chunk.js} +1 -1
  79. package/build/{hu-json.33172d09.chunk.js → hu-json.fe71e6c8.chunk.js} +1 -1
  80. package/build/id-json.41e07c46.chunk.js +1 -0
  81. package/build/index.html +1 -1
  82. package/build/it-json.bfe27ed8.chunk.js +1 -0
  83. package/build/ja-json.81b6d1e3.chunk.js +1 -0
  84. package/build/ko-json.4539f4ba.chunk.js +1 -0
  85. package/build/main.5b92c1d6.js +3809 -0
  86. package/build/{ml-json.3e69969b.chunk.js → ml-json.8988e374.chunk.js} +1 -1
  87. package/build/{nl-json.641782d5.chunk.js → nl-json.98345913.chunk.js} +1 -1
  88. package/build/{no-json.9b3cd181.chunk.js → no-json.19a2dbfa.chunk.js} +1 -1
  89. package/build/pl-json.59a5dab3.chunk.js +1 -0
  90. package/build/pt-BR-json.9410688b.chunk.js +1 -0
  91. package/build/{ru-json.c4a4f50b.chunk.js → ru-json.6a01cea6.chunk.js} +1 -1
  92. package/build/runtime~main.0bf1f619.js +2 -0
  93. package/build/sa-json.6359a11c.chunk.js +1 -0
  94. package/build/sk-json.2374f129.chunk.js +1 -0
  95. package/build/{sv-json.207afc0d.chunk.js → sv-json.ae6e71ea.chunk.js} +1 -1
  96. package/build/th-json.5f659396.chunk.js +1 -0
  97. package/build/{tr-json.f1a0d19d.chunk.js → tr-json.bac5dbd3.chunk.js} +1 -1
  98. package/build/transfer-tokens-list-page.ce37354b.chunk.js +16 -0
  99. package/build/zh-Hans-json.4c9706a6.chunk.js +1 -0
  100. package/build/{zh-json.085a34f4.chunk.js → zh-json.3529f1e5.chunk.js} +1 -1
  101. package/ee/server/controllers/index.js +0 -1
  102. package/ee/server/controllers/role.js +0 -39
  103. package/ee/server/controllers/user.js +1 -35
  104. package/ee/server/routes/index.js +0 -49
  105. package/ee/server/validation/role.js +28 -20
  106. package/package.json +13 -13
  107. package/server/bootstrap.js +0 -1
  108. package/server/controllers/api-token.js +4 -2
  109. package/server/controllers/permission.js +2 -4
  110. package/server/controllers/role.js +70 -23
  111. package/server/controllers/transfer/runner.js +5 -3
  112. package/server/domain/user.js +3 -0
  113. package/server/routes/roles.js +48 -0
  114. package/server/services/permission/permissions-manager/sanitize.js +2 -2
  115. package/server/services/permission/queries.js +1 -74
  116. package/server/strategies/data-transfer.js +3 -1
  117. package/server/validation/permission.js +1 -82
  118. package/server/validation/role.js +44 -0
  119. package/admin/src/assets/images/hot-air-balloon.png +0 -0
  120. package/admin/src/assets/images/upgrade-details.png +0 -0
  121. package/admin/src/components/UpgradePlanModal/index.js +0 -123
  122. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/findLeafByPathAndReplace.js +0 -51
  123. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/recursivelyFindPathsBasedOnCondition.js +0 -79
  124. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/constants.js +0 -3
  125. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/utils/constants.js +0 -3
  126. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/ActionRow/utils/constants.js +0 -3
  127. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/SubActionRow/utils/constants.js +0 -3
  128. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/utils/constants.js +0 -3
  129. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/utils/constants.js +0 -3
  130. package/build/617f9c948fa79e6d73bd.png +0 -0
  131. package/build/6d21938306785f176538.png +0 -0
  132. package/build/7259.63e91b59.chunk.js +0 -1
  133. package/build/Admin_settingsPage.6814a96e.chunk.js +0 -177
  134. package/build/admin-edit-roles-page.bf130aaf.chunk.js +0 -1
  135. package/build/api-tokens-list-page.149903c8.chunk.js +0 -16
  136. package/build/ca-json.59c4502c.chunk.js +0 -1
  137. package/build/content-manager.d792c194.chunk.js +0 -1139
  138. package/build/de-json.dbc2cf1b.chunk.js +0 -1
  139. package/build/dk-json.52f67b15.chunk.js +0 -1
  140. package/build/es-json.c40c57dd.chunk.js +0 -1
  141. package/build/eu-json.6702a0d2.chunk.js +0 -1
  142. package/build/fr-json.ea9ec573.chunk.js +0 -1
  143. package/build/gu-json.94f0d242.chunk.js +0 -1
  144. package/build/id-json.e0d83d41.chunk.js +0 -1
  145. package/build/it-json.8be59205.chunk.js +0 -1
  146. package/build/ja-json.3008b720.chunk.js +0 -1
  147. package/build/ko-json.7d2f95b1.chunk.js +0 -1
  148. package/build/main.64fe0c37.js +0 -3928
  149. package/build/pl-json.05814145.chunk.js +0 -1
  150. package/build/pt-BR-json.d72350de.chunk.js +0 -1
  151. package/build/runtime~main.122b5a09.js +0 -2
  152. package/build/sa-json.e5e7ccaf.chunk.js +0 -1
  153. package/build/sk-json.3529b8aa.chunk.js +0 -1
  154. package/build/th-json.f664b96d.chunk.js +0 -1
  155. package/build/transfer-tokens-list-page.c6f8039a.chunk.js +0 -16
  156. package/build/zh-Hans-json.993d085f.chunk.js +0 -1
  157. package/ee/admin/pages/SettingsPage/pages/Roles/CreatePage/index.js +0 -270
  158. package/ee/admin/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/constants.js +0 -3
  159. package/ee/admin/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ConditionsSelect/MenuList/utils/constants.js +0 -3
  160. package/ee/admin/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/utils/constants.js +0 -3
  161. package/ee/admin/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/ActionRow/utils/constants.js +0 -3
  162. package/ee/admin/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/SubActionRow/utils/constants.js +0 -3
  163. package/ee/admin/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/utils/constants.js +0 -3
  164. package/ee/admin/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/utils/constants.js +0 -3
  165. package/ee/admin/pages/SettingsPage/pages/Roles/ListPage/index.js +0 -376
  166. package/ee/admin/pages/SettingsPage/pages/Roles/ProtectedListPage/index.js +0 -12
  167. package/ee/server/controllers/permission.js +0 -21
  168. package/ee/server/validation/permission.js +0 -8
  169. package/server/domain/role.js +0 -29
  170. /package/{ee/admin → admin/src}/pages/SettingsPage/pages/Roles/CreatePage/utils/schema.js +0 -0
  171. /package/{ee/admin → admin/src}/pages/SettingsPage/pages/Roles/ListPage/reducer.js +0 -0
@@ -1,270 +0,0 @@
1
- import React, { useRef, useState } from 'react';
2
- import { format } from 'date-fns';
3
- import {
4
- CheckPagePermissions,
5
- Form,
6
- LoadingIndicatorPage,
7
- SettingsPageTitle,
8
- request,
9
- useNotification,
10
- useOverlayBlocker,
11
- useTracking,
12
- Link,
13
- } from '@strapi/helper-plugin';
14
- import {
15
- Box,
16
- Button,
17
- ContentLayout,
18
- HeaderLayout,
19
- Grid,
20
- GridItem,
21
- Main,
22
- Flex,
23
- Typography,
24
- TextInput,
25
- Textarea,
26
- } from '@strapi/design-system';
27
- import { ArrowLeft } from '@strapi/icons';
28
- import { Formik } from 'formik';
29
- import get from 'lodash/get';
30
- import isEmpty from 'lodash/isEmpty';
31
- import { useIntl } from 'react-intl';
32
- import { useHistory, useRouteMatch } from 'react-router-dom';
33
- import styled from 'styled-components';
34
- import Permissions from '../../../../../../../admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions';
35
- import { useFetchPermissionsLayout, useFetchRole } from '../../../../../../../admin/src/hooks';
36
- import adminPermissions from '../../../../../../../admin/src/permissions';
37
- import schema from './utils/schema';
38
-
39
- const UsersRoleNumber = styled.div`
40
- border: 1px solid ${({ theme }) => theme.colors.primary200};
41
- background: ${({ theme }) => theme.colors.primary100};
42
- padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[4]}`};
43
- color: ${({ theme }) => theme.colors.primary600};
44
- border-radius: ${({ theme }) => theme.borderRadius};
45
- font-size: ${12 / 16}rem;
46
- font-weight: bold;
47
- `;
48
-
49
- const CreatePage = () => {
50
- const toggleNotification = useNotification();
51
- const { lockApp, unlockApp } = useOverlayBlocker();
52
- const { formatMessage } = useIntl();
53
- const [isSubmitting, setIsSubmiting] = useState(false);
54
- const { replace } = useHistory();
55
- const permissionsRef = useRef();
56
- const { trackUsage } = useTracking();
57
- const params = useRouteMatch('/settings/roles/duplicate/:id');
58
- const id = get(params, 'params.id', null);
59
- const { isLoading: isLayoutLoading, data: permissionsLayout } = useFetchPermissionsLayout();
60
- const { permissions: rolePermissions, isLoading: isRoleLoading } = useFetchRole(id);
61
-
62
- const handleCreateRoleSubmit = (data) => {
63
- lockApp();
64
- setIsSubmiting(true);
65
-
66
- if (id) {
67
- trackUsage('willDuplicateRole');
68
- } else {
69
- trackUsage('willCreateNewRole');
70
- }
71
-
72
- Promise.resolve(
73
- request('/admin/roles', {
74
- method: 'POST',
75
- body: data,
76
- })
77
- )
78
- .then(async (res) => {
79
- const { permissionsToSend } = permissionsRef.current.getPermissions();
80
-
81
- if (id) {
82
- trackUsage('didDuplicateRole');
83
- } else {
84
- trackUsage('didCreateNewRole');
85
- }
86
-
87
- if (res.data.id && !isEmpty(permissionsToSend)) {
88
- await request(`/admin/roles/${res.data.id}/permissions`, {
89
- method: 'PUT',
90
- body: { permissions: permissionsToSend },
91
- });
92
- }
93
-
94
- return res;
95
- })
96
- .then((res) => {
97
- setIsSubmiting(false);
98
- toggleNotification({
99
- type: 'success',
100
- message: { id: 'Settings.roles.created', defaultMessage: 'created' },
101
- });
102
- replace(`/settings/roles/${res.data.id}`);
103
- })
104
- .catch((err) => {
105
- console.error(err);
106
- setIsSubmiting(false);
107
- toggleNotification({
108
- type: 'warning',
109
- message: { id: 'notification.error' },
110
- });
111
- })
112
- .finally(() => {
113
- unlockApp();
114
- });
115
- };
116
-
117
- const defaultDescription = `${formatMessage({
118
- id: 'Settings.roles.form.created',
119
- defaultMessage: 'Created',
120
- })} ${format(new Date(), 'PPP')}`;
121
-
122
- return (
123
- <Main>
124
- <SettingsPageTitle name="Roles" />
125
- <Formik
126
- initialValues={{ name: '', description: defaultDescription }}
127
- onSubmit={handleCreateRoleSubmit}
128
- validationSchema={schema}
129
- validateOnChange={false}
130
- >
131
- {({ handleSubmit, values, errors, handleReset, handleChange }) => (
132
- <Form noValidate>
133
- <>
134
- <HeaderLayout
135
- primaryAction={
136
- <Flex gap={2}>
137
- <Button
138
- variant="secondary"
139
- onClick={() => {
140
- handleReset();
141
- permissionsRef.current.resetForm();
142
- }}
143
- size="L"
144
- >
145
- {formatMessage({
146
- id: 'app.components.Button.reset',
147
- defaultMessage: 'Reset',
148
- })}
149
- </Button>
150
- <Button onClick={handleSubmit} loading={isSubmitting} size="L">
151
- {formatMessage({
152
- id: 'global.save',
153
- defaultMessage: 'Save',
154
- })}
155
- </Button>
156
- </Flex>
157
- }
158
- title={formatMessage({
159
- id: 'Settings.roles.create.title',
160
- defaultMessage: 'Create a role',
161
- })}
162
- subtitle={formatMessage({
163
- id: 'Settings.roles.create.description',
164
- defaultMessage: 'Define the rights given to the role',
165
- })}
166
- navigationAction={
167
- <Link startIcon={<ArrowLeft />} to="/settings/roles">
168
- {formatMessage({
169
- id: 'global.back',
170
- defaultMessage: 'Back',
171
- })}
172
- </Link>
173
- }
174
- />
175
- <ContentLayout>
176
- <Flex direction="column" alignItems="stretch" gap={6}>
177
- <Box background="neutral0" padding={6} shadow="filterShadow" hasRadius>
178
- <Flex direction="column" alignItems="stretch" gap={4}>
179
- <Flex justifyContent="space-between">
180
- <Box>
181
- <Box>
182
- <Typography fontWeight="bold">
183
- {formatMessage({
184
- id: 'global.details',
185
- defaultMessage: 'Details',
186
- })}
187
- </Typography>
188
- </Box>
189
- <Box>
190
- <Typography variant="pi" textColor="neutral600">
191
- {formatMessage({
192
- id: 'Settings.roles.form.description',
193
- defaultMessage: 'Name and description of the role',
194
- })}
195
- </Typography>
196
- </Box>
197
- </Box>
198
- <UsersRoleNumber>
199
- {formatMessage(
200
- {
201
- id: 'Settings.roles.form.button.users-with-role',
202
- defaultMessage:
203
- '{number, plural, =0 {# users} one {# user} other {# users}} with this role',
204
- },
205
- { number: 0 }
206
- )}
207
- </UsersRoleNumber>
208
- </Flex>
209
- <Grid gap={4}>
210
- <GridItem col={6}>
211
- <TextInput
212
- name="name"
213
- error={errors.name && formatMessage({ id: errors.name })}
214
- label={formatMessage({
215
- id: 'global.name',
216
- defaultMessage: 'Name',
217
- })}
218
- onChange={handleChange}
219
- value={values.name}
220
- />
221
- </GridItem>
222
- <GridItem col={6}>
223
- <Textarea
224
- label={formatMessage({
225
- id: 'global.description',
226
- defaultMessage: 'Description',
227
- })}
228
- name="description"
229
- error={errors.description && formatMessage({ id: errors.description })}
230
- onChange={handleChange}
231
- >
232
- {values.description}
233
- </Textarea>
234
- </GridItem>
235
- </Grid>
236
- </Flex>
237
- </Box>
238
- {!isLayoutLoading && !isRoleLoading ? (
239
- <Box shadow="filterShadow" hasRadius>
240
- <Permissions
241
- isFormDisabled={false}
242
- ref={permissionsRef}
243
- permissions={rolePermissions}
244
- layout={permissionsLayout}
245
- />
246
- </Box>
247
- ) : (
248
- <Box background="neutral0" padding={6} shadow="filterShadow" hasRadius>
249
- <LoadingIndicatorPage />
250
- </Box>
251
- )}
252
- </Flex>
253
- </ContentLayout>
254
- </>
255
- </Form>
256
- )}
257
- </Formik>
258
- </Main>
259
- );
260
- };
261
-
262
- export default function () {
263
- return (
264
- <CheckPagePermissions permissions={adminPermissions.settings.roles.create}>
265
- <CreatePage />
266
- </CheckPagePermissions>
267
- );
268
- }
269
-
270
- export { CreatePage };
@@ -1,3 +0,0 @@
1
- const IS_DISABLED = false;
2
-
3
- export default IS_DISABLED;
@@ -1,3 +0,0 @@
1
- const IS_DISABLED = false;
2
-
3
- export default IS_DISABLED;
@@ -1,3 +0,0 @@
1
- const IS_DISABLED = false;
2
-
3
- export default IS_DISABLED;
@@ -1,3 +0,0 @@
1
- const IS_DISABLED = false;
2
-
3
- export default IS_DISABLED;
@@ -1,376 +0,0 @@
1
- import React, { useCallback, useEffect, useReducer, useState } from 'react';
2
- import {
3
- ConfirmDialog,
4
- LoadingIndicatorPage,
5
- SearchURLQuery,
6
- SettingsPageTitle,
7
- getFetchClient,
8
- useNotification,
9
- useQueryParams,
10
- useRBAC,
11
- useFocusWhenNavigate,
12
- } from '@strapi/helper-plugin';
13
- import { Plus, Trash, Duplicate, Pencil } from '@strapi/icons';
14
- import {
15
- Button,
16
- ActionLayout,
17
- ContentLayout,
18
- HeaderLayout,
19
- Main,
20
- Table,
21
- Tbody,
22
- TFooter,
23
- Thead,
24
- Th,
25
- Tr,
26
- Typography,
27
- VisuallyHidden,
28
- } from '@strapi/design-system';
29
- import { get } from 'lodash';
30
- import matchSorter from 'match-sorter';
31
- import { useIntl } from 'react-intl';
32
- import { useHistory } from 'react-router-dom';
33
- import { useRolesList } from '../../../../../../../admin/src/hooks';
34
- import adminPermissions from '../../../../../../../admin/src/permissions';
35
- import EmptyRole from '../../../../../../../admin/src/pages/SettingsPage/pages/Roles/ListPage/components/EmptyRole';
36
- import BaseRoleRow from '../../../../../../../admin/src/pages/SettingsPage/pages/Roles/ListPage/components/RoleRow';
37
- import reducer, { initialState } from './reducer';
38
-
39
- const useSortedRoles = () => {
40
- useFocusWhenNavigate();
41
- const {
42
- isLoading: isLoadingForPermissions,
43
- allowedActions: { canCreate, canDelete, canRead, canUpdate },
44
- } = useRBAC(adminPermissions.settings.roles);
45
-
46
- const { getData, roles, isLoading } = useRolesList(false);
47
- const [{ query }] = useQueryParams();
48
- const _q = query?._q || '';
49
- const sortedRoles = matchSorter(roles, _q, { keys: ['name', 'description'] });
50
-
51
- useEffect(() => {
52
- if (!isLoadingForPermissions && canRead) {
53
- getData();
54
- }
55
- }, [isLoadingForPermissions, canRead, getData]);
56
-
57
- return {
58
- isLoadingForPermissions,
59
- canCreate,
60
- canDelete,
61
- canRead,
62
- canUpdate,
63
- isLoading,
64
- getData,
65
- sortedRoles,
66
- roles,
67
- };
68
- };
69
-
70
- const useRoleActions = ({ getData, canCreate, canDelete, canUpdate }) => {
71
- const { formatMessage } = useIntl();
72
-
73
- const toggleNotification = useNotification();
74
- const [isWarningDeleteAllOpened, setIsWarningDeleteAllOpenend] = useState(false);
75
- const { push } = useHistory();
76
- const [{ selectedRoles, showModalConfirmButtonLoading, roleToDelete }, dispatch] = useReducer(
77
- reducer,
78
- initialState
79
- );
80
-
81
- const { post } = getFetchClient();
82
-
83
- const handleDeleteData = async () => {
84
- try {
85
- dispatch({
86
- type: 'ON_REMOVE_ROLES',
87
- });
88
-
89
- await post('/admin/roles/batch-delete', {
90
- ids: [roleToDelete],
91
- });
92
-
93
- await getData();
94
-
95
- dispatch({
96
- type: 'RESET_DATA_TO_DELETE',
97
- });
98
- } catch (err) {
99
- const errorIds = get(err, ['response', 'payload', 'data', 'ids'], null);
100
-
101
- if (errorIds && Array.isArray(errorIds)) {
102
- const errorsMsg = errorIds.join('\n');
103
- toggleNotification({
104
- type: 'warning',
105
- message: errorsMsg,
106
- });
107
- } else {
108
- toggleNotification({
109
- type: 'warning',
110
- message: { id: 'notification.error' },
111
- });
112
- }
113
- }
114
- handleToggleModal();
115
- };
116
-
117
- const onRoleDuplicate = useCallback(
118
- (id) => {
119
- push(`/settings/roles/duplicate/${id}`);
120
- },
121
- [push]
122
- );
123
-
124
- const handleNewRoleClick = () => push('/settings/roles/new');
125
-
126
- const onRoleRemove = useCallback((roleId) => {
127
- dispatch({
128
- type: 'SET_ROLE_TO_DELETE',
129
- id: roleId,
130
- });
131
-
132
- handleToggleModal();
133
- }, []);
134
-
135
- const handleToggleModal = () => setIsWarningDeleteAllOpenend((prev) => !prev);
136
-
137
- const handleGoTo = useCallback(
138
- (id) => {
139
- push(`/settings/roles/${id}`);
140
- },
141
- [push]
142
- );
143
-
144
- const handleClickDelete = useCallback(
145
- (e, role) => {
146
- e.preventDefault();
147
- e.stopPropagation();
148
-
149
- if (role.usersCount) {
150
- toggleNotification({
151
- type: 'info',
152
- message: { id: 'Roles.ListPage.notification.delete-not-allowed' },
153
- });
154
- } else {
155
- onRoleRemove(role.id);
156
- }
157
- },
158
- [toggleNotification, onRoleRemove]
159
- );
160
-
161
- const handleClickDuplicate = useCallback(
162
- (e, role) => {
163
- e.preventDefault();
164
- e.stopPropagation();
165
- onRoleDuplicate(role.id);
166
- },
167
- [onRoleDuplicate]
168
- );
169
-
170
- const getIcons = useCallback(
171
- (role) => [
172
- ...(canCreate
173
- ? [
174
- {
175
- onClick: (e) => handleClickDuplicate(e, role),
176
- label: formatMessage({ id: 'app.utils.duplicate', defaultMessage: 'Duplicate' }),
177
- icon: <Duplicate />,
178
- },
179
- ]
180
- : []),
181
- ...(canUpdate
182
- ? [
183
- {
184
- onClick: () => handleGoTo(role.id),
185
- label: formatMessage({ id: 'app.utils.edit', defaultMessage: 'Edit' }),
186
- icon: <Pencil />,
187
- },
188
- ]
189
- : []),
190
- ...(canDelete
191
- ? [
192
- {
193
- onClick: (e) => handleClickDelete(e, role),
194
- label: formatMessage({ id: 'global.delete', defaultMessage: 'Delete' }),
195
- icon: <Trash />,
196
- },
197
- ]
198
- : []),
199
- ],
200
- [
201
- formatMessage,
202
- handleClickDelete,
203
- handleClickDuplicate,
204
- handleGoTo,
205
- canCreate,
206
- canUpdate,
207
- canDelete,
208
- ]
209
- );
210
-
211
- return {
212
- handleNewRoleClick,
213
- getIcons,
214
- selectedRoles,
215
- isWarningDeleteAllOpened,
216
- showModalConfirmButtonLoading,
217
- handleToggleModal,
218
- handleDeleteData,
219
- };
220
- };
221
-
222
- const RoleListPage = () => {
223
- const { formatMessage } = useIntl();
224
-
225
- const {
226
- isLoadingForPermissions,
227
- canCreate,
228
- canRead,
229
- canDelete,
230
- canUpdate,
231
- isLoading,
232
- getData,
233
- sortedRoles,
234
- } = useSortedRoles();
235
-
236
- const {
237
- handleNewRoleClick,
238
- getIcons,
239
- isWarningDeleteAllOpened,
240
- showModalConfirmButtonLoading,
241
- handleToggleModal,
242
- handleDeleteData,
243
- } = useRoleActions({ getData, canCreate, canDelete, canUpdate });
244
-
245
- // ! TODO - Show the search bar only if the user is allowed to read - add the search input
246
- // canRead
247
-
248
- const rowCount = sortedRoles.length + 1;
249
- const colCount = 6;
250
-
251
- if (isLoadingForPermissions) {
252
- return (
253
- <Main>
254
- <LoadingIndicatorPage />
255
- </Main>
256
- );
257
- }
258
-
259
- const title = formatMessage({
260
- id: 'global.roles',
261
- defaultMessage: 'roles',
262
- });
263
-
264
- return (
265
- <Main>
266
- <SettingsPageTitle name="Roles" />
267
- <HeaderLayout
268
- primaryAction={
269
- canCreate ? (
270
- <Button onClick={handleNewRoleClick} startIcon={<Plus />} size="S">
271
- {formatMessage({
272
- id: 'Settings.roles.list.button.add',
273
- defaultMessage: 'Add new role',
274
- })}
275
- </Button>
276
- ) : null
277
- }
278
- title={title}
279
- subtitle={formatMessage({
280
- id: 'Settings.roles.list.description',
281
- defaultMessage: 'List of roles',
282
- })}
283
- as="h2"
284
- />
285
- {canRead && (
286
- <ActionLayout
287
- startActions={
288
- <SearchURLQuery
289
- label={formatMessage(
290
- { id: 'app.component.search.label', defaultMessage: 'Search for {target}' },
291
- { target: title }
292
- )}
293
- />
294
- }
295
- />
296
- )}
297
- {canRead && (
298
- <ContentLayout>
299
- <Table
300
- colCount={colCount}
301
- rowCount={rowCount}
302
- footer={
303
- canCreate ? (
304
- <TFooter onClick={handleNewRoleClick} icon={<Plus />}>
305
- {formatMessage({
306
- id: 'Settings.roles.list.button.add',
307
- defaultMessage: 'Add new role',
308
- })}
309
- </TFooter>
310
- ) : null
311
- }
312
- >
313
- <Thead>
314
- <Tr aria-rowindex={1}>
315
- <Th>
316
- <Typography variant="sigma" textColor="neutral600">
317
- {formatMessage({
318
- id: 'global.name',
319
- defaultMessage: 'Name',
320
- })}
321
- </Typography>
322
- </Th>
323
- <Th>
324
- <Typography variant="sigma" textColor="neutral600">
325
- {formatMessage({
326
- id: 'global.description',
327
- defaultMessage: 'Description',
328
- })}
329
- </Typography>
330
- </Th>
331
- <Th>
332
- <Typography variant="sigma" textColor="neutral600">
333
- {formatMessage({
334
- id: 'global.users',
335
- defaultMessage: 'Users',
336
- })}
337
- </Typography>
338
- </Th>
339
- <Th>
340
- <VisuallyHidden>
341
- {formatMessage({
342
- id: 'global.actions',
343
- defaultMessage: 'Actions',
344
- })}
345
- </VisuallyHidden>
346
- </Th>
347
- </Tr>
348
- </Thead>
349
- <Tbody>
350
- {sortedRoles?.map((role, index) => (
351
- <BaseRoleRow
352
- key={role.id}
353
- id={role.id}
354
- name={role.name}
355
- description={role.description}
356
- usersCount={role.usersCount}
357
- icons={getIcons(role)}
358
- rowIndex={index + 2}
359
- />
360
- ))}
361
- </Tbody>
362
- </Table>
363
- {!rowCount && !isLoading && <EmptyRole />}
364
- </ContentLayout>
365
- )}
366
- <ConfirmDialog
367
- isOpen={isWarningDeleteAllOpened}
368
- onConfirm={handleDeleteData}
369
- isConfirmButtonLoading={showModalConfirmButtonLoading}
370
- onToggleDialog={handleToggleModal}
371
- />
372
- </Main>
373
- );
374
- };
375
-
376
- export default RoleListPage;
@@ -1,12 +0,0 @@
1
- import React from 'react';
2
- import { CheckPagePermissions } from '@strapi/helper-plugin';
3
- import adminPermissions from '../../../../../../../admin/src/permissions';
4
- import ListPage from '../ListPage';
5
-
6
- const ProtectedListPage = () => (
7
- <CheckPagePermissions permissions={adminPermissions.settings.roles.main}>
8
- <ListPage />
9
- </CheckPagePermissions>
10
- );
11
-
12
- export default ProtectedListPage;