@strapi/admin 4.8.2 → 4.9.0-beta.1

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 (109) hide show
  1. package/admin/src/content-manager/components/DynamicZone/utils/select.js +1 -1
  2. package/admin/src/content-manager/components/FieldComponent/utils/select.js +2 -1
  3. package/admin/src/content-manager/components/Inputs/utils/getInputType.js +1 -1
  4. package/admin/src/content-manager/components/Inputs/utils/select.js +1 -1
  5. package/admin/src/content-manager/hooks/useContentTypeLayout/index.js +1 -2
  6. package/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/formatLayouts.js +4 -1
  7. package/admin/src/content-manager/pages/CollectionTypeRecursivePath/index.js +1 -2
  8. package/admin/src/content-manager/pages/EditSettingsView/init.js +3 -1
  9. package/admin/src/content-manager/pages/EditSettingsView/utils/createPossibleMainFieldsForModelsAndComponents.js +2 -4
  10. package/admin/src/content-manager/pages/EditView/DeleteLink/utils/select.js +1 -1
  11. package/admin/src/content-manager/pages/EditView/utils/createAttributesLayout.js +2 -1
  12. package/admin/src/content-manager/pages/EditView/utils/getFieldsActionMatchingPermissions.js +2 -1
  13. package/admin/src/content-manager/utils/checkIfAttributeIsDisplayable.js +1 -1
  14. package/admin/src/content-manager/utils/createDefaultForm.js +2 -2
  15. package/admin/src/content-manager/utils/formatLayoutToApi.js +2 -1
  16. package/admin/src/content-manager/utils/getFieldName.js +1 -1
  17. package/admin/src/content-manager/utils/mergeMetasWithSchema.js +1 -1
  18. package/admin/src/content-manager/utils/paths.js +1 -1
  19. package/admin/src/content-manager/utils/removePasswordFieldsFromData.js +1 -1
  20. package/admin/src/hooks/useRegenerate/index.js +12 -7
  21. package/admin/src/hooks/useSettingsForm/index.js +3 -3
  22. package/admin/src/hooks/useSettingsForm/reducer.js +3 -1
  23. package/admin/src/hooks/useSettingsMenu/reducer.js +1 -1
  24. package/admin/src/pages/AuthPage/reducer.js +1 -1
  25. package/admin/src/pages/SettingsPage/components/Tokens/FormHead/index.js +4 -0
  26. package/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js +5 -3
  27. package/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js +7 -5
  28. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +1 -1
  29. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/reducer.js +1 -1
  30. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/transformPermissionsData.js +6 -8
  31. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/utils/createDefaultConditionsForm.js +1 -1
  32. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/utils/generateCheckboxesActions.js +2 -1
  33. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/ActionRow/utils/getRowLabelCheckboxeState.js +2 -1
  34. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/utils/getRowLabelCheckboxesState.js +1 -1
  35. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/reducer.js +6 -1
  36. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultCTFormFromLayout.js +5 -1
  37. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultPluginsFormFromLayout.js +1 -2
  38. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/formatContentTypesPermissionToAPI.js +2 -2
  39. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/updateConditionsToFalse.js +4 -1
  40. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/updateValues.js +1 -1
  41. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/utils/formatActions.js +1 -1
  42. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/utils/createArrayOfValues.js +2 -1
  43. package/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js +1 -1
  44. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js +41 -0
  45. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js +53 -9
  46. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js +1 -0
  47. package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js +27 -5
  48. package/admin/src/pages/SettingsPage/pages/Users/ProtectedEditPage/index.js +2 -2
  49. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/utils/formatData.js +1 -7
  50. package/admin/src/permissions/index.js +1 -1
  51. package/admin/src/translations/en.json +1 -0
  52. package/admin/src/utils/getAttributesToDisplay.js +2 -4
  53. package/admin/src/utils/getExistingActions.js +1 -3
  54. package/admin/src/utils/sortLinks.js +1 -1
  55. package/build/{8580.0aa21940.chunk.js → 2263.4c5916f9.chunk.js} +61 -61
  56. package/build/5563.aa832e5f.chunk.js +30 -0
  57. package/build/6985.66cca29c.chunk.js +1 -0
  58. package/build/7259.e6ef3b8e.chunk.js +1 -0
  59. package/build/{7112.2bf13da3.chunk.js → 9505.dbe702ab.chunk.js} +6 -6
  60. package/build/Admin-authenticatedApp.cb754f73.chunk.js +79 -0
  61. package/build/{Admin_profilePage.d2a8f9ab.chunk.js → Admin_profilePage.76afeca0.chunk.js} +1 -1
  62. package/build/{Admin_settingsPage.7450acfc.chunk.js → Admin_settingsPage.0aa4fcdc.chunk.js} +2 -2
  63. package/build/admin-app.50584489.chunk.js +112 -0
  64. package/build/admin-edit-roles-page.cf543488.chunk.js +216 -0
  65. package/build/admin-edit-users.31c20712.chunk.js +10 -0
  66. package/build/admin-roles-list.489c501f.chunk.js +2 -0
  67. package/build/{admin-users.af8c3123.chunk.js → admin-users.3e111a7d.chunk.js} +1 -1
  68. package/build/{api-tokens-create-page.4328b852.chunk.js → api-tokens-create-page.2a6e22bd.chunk.js} +1 -1
  69. package/build/{api-tokens-edit-page.bce5050f.chunk.js → api-tokens-edit-page.fa38cd63.chunk.js} +1 -1
  70. package/build/content-manager.f8b9710b.chunk.js +1139 -0
  71. package/build/content-type-builder.0f5dbcf1.chunk.js +126 -0
  72. package/build/{en-json.01a88a30.chunk.js → en-json.b052667a.chunk.js} +1 -1
  73. package/build/index.html +1 -1
  74. package/build/main.7fa3d343.js +3783 -0
  75. package/build/{runtime~main.05f8f4a1.js → runtime~main.03d11c09.js} +2 -2
  76. package/build/sso-settings-page.272b87c8.chunk.js +1 -0
  77. package/build/transfer-tokens-list-page.3c9b0280.chunk.js +16 -0
  78. package/build/users-advanced-settings-page.1d3c14c7.chunk.js +1 -0
  79. package/build/{users-email-settings-page.a3c80419.chunk.js → users-email-settings-page.e8db68c4.chunk.js} +1 -1
  80. package/build/users-providers-settings-page.14cac425.chunk.js +1 -0
  81. package/build/users-roles-settings-page.2ea4de84.chunk.js +30 -0
  82. package/build/{webhook-edit-page.a2a2b7bb.chunk.js → webhook-edit-page.329141a5.chunk.js} +3 -3
  83. package/ee/server/bootstrap.js +3 -0
  84. package/ee/server/utils/persisted-tables.js +49 -0
  85. package/package.json +11 -11
  86. package/server/controllers/transfer/runner.js +4 -2
  87. package/server/middlewares/data-transfer.js +4 -1
  88. package/server/routes/transfer.js +13 -4
  89. package/server/services/constants.js +4 -0
  90. package/server/services/permission/permissions-manager/sanitize.js +2 -0
  91. package/server/services/transfer/permission.js +1 -1
  92. package/server/services/transfer/token.js +33 -31
  93. package/server/validation/transfer/token.js +10 -2
  94. package/build/2637.679b590b.chunk.js +0 -1
  95. package/build/4649.33220ac3.chunk.js +0 -30
  96. package/build/7259.3675c199.chunk.js +0 -1
  97. package/build/Admin-authenticatedApp.26f0eff6.chunk.js +0 -79
  98. package/build/admin-app.c0729915.chunk.js +0 -112
  99. package/build/admin-edit-roles-page.3b196317.chunk.js +0 -216
  100. package/build/admin-edit-users.af3b0f15.chunk.js +0 -10
  101. package/build/admin-roles-list.0ad504a7.chunk.js +0 -2
  102. package/build/content-manager.b2578b87.chunk.js +0 -1139
  103. package/build/content-type-builder.a93f97ba.chunk.js +0 -126
  104. package/build/main.ed856941.js +0 -3809
  105. package/build/sso-settings-page.5a8588ef.chunk.js +0 -1
  106. package/build/transfer-tokens-list-page.ce37354b.chunk.js +0 -16
  107. package/build/users-advanced-settings-page.c0cae03a.chunk.js +0 -1
  108. package/build/users-providers-settings-page.5f86e45c.chunk.js +0 -1
  109. package/build/users-roles-settings-page.b02986df.chunk.js +0 -30
@@ -13,6 +13,7 @@ import {
13
13
  useGuidedTour,
14
14
  useRBAC,
15
15
  useFetchClient,
16
+ useAPIErrorHandler,
16
17
  } from '@strapi/helper-plugin';
17
18
  import { ContentLayout, Main, Flex } from '@strapi/design-system';
18
19
  import { formatAPIErrors } from '../../../../../utils';
@@ -52,6 +53,8 @@ const TransferTokenCreateView = () => {
52
53
 
53
54
  const isCreating = id === 'create';
54
55
 
56
+ const { formatAPIError } = useAPIErrorHandler();
57
+
55
58
  useEffect(() => {
56
59
  trackUsageRef.current(isCreating ? 'didAddTokenFromList' : 'didEditTokenFromList', {
57
60
  tokenType: TRANSFER_TOKEN_TYPE,
@@ -73,11 +76,22 @@ const TransferTokenCreateView = () => {
73
76
  },
74
77
  {
75
78
  enabled: !isCreating && !transferToken,
76
- onError() {
77
- toggleNotification({
78
- type: 'warning',
79
- message: { id: 'notification.error', defaultMessage: 'An error occured' },
80
- });
79
+ onError(err) {
80
+ if (err.response.data.error.details?.code === 'INVALID_TOKEN_SALT') {
81
+ toggleNotification({
82
+ type: 'warning',
83
+ message: {
84
+ id: 'notification.error.invalid.configuration',
85
+ defaultMessage:
86
+ 'You have an invalid configuration, check your server log for more information.',
87
+ },
88
+ });
89
+ } else {
90
+ toggleNotification({
91
+ type: 'warning',
92
+ message: formatAPIError(err),
93
+ });
94
+ }
81
95
  },
82
96
  }
83
97
  );
@@ -92,6 +106,8 @@ const TransferTokenCreateView = () => {
92
106
  ? parseInt(body.lifespan, 10)
93
107
  : null;
94
108
 
109
+ const permissions = body.permissions.split('-');
110
+
95
111
  try {
96
112
  const {
97
113
  data: { data: response },
@@ -99,13 +115,12 @@ const TransferTokenCreateView = () => {
99
115
  ? await post(`/admin/transfer/tokens`, {
100
116
  ...body,
101
117
  lifespan: lifespanVal,
102
- permissions: ['push'],
118
+ permissions,
103
119
  })
104
120
  : await put(`/admin/transfer/tokens/${id}`, {
105
121
  name: body.name,
106
122
  description: body.description,
107
- type: body.type,
108
- permissions: ['push'],
123
+ permissions,
109
124
  });
110
125
 
111
126
  unlockApp();
@@ -132,7 +147,7 @@ const TransferTokenCreateView = () => {
132
147
  });
133
148
 
134
149
  trackUsageRef.current(isCreating ? 'didCreateToken' : 'didEditToken', {
135
- type: transferToken?.type,
150
+ type: transferToken?.permissions,
136
151
  tokenType: TRANSFER_TOKEN_TYPE,
137
152
  });
138
153
  } catch (err) {
@@ -144,6 +159,15 @@ const TransferTokenCreateView = () => {
144
159
  type: 'warning',
145
160
  message: err.response.data.message || 'notification.error.tokennamenotunique',
146
161
  });
162
+ } else if (err?.response?.data?.error?.details?.code === 'INVALID_TOKEN_SALT') {
163
+ toggleNotification({
164
+ type: 'warning',
165
+ message: {
166
+ id: 'notification.error.invalid.configuration',
167
+ defaultMessage:
168
+ 'You have an invalid configuration, check your server log for more information.',
169
+ },
170
+ });
147
171
  } else {
148
172
  toggleNotification({
149
173
  type: 'warning',
@@ -161,6 +185,24 @@ const TransferTokenCreateView = () => {
161
185
  return <LoadingView transferTokenName={transferToken?.name} />;
162
186
  }
163
187
 
188
+ const handleErrorRegenerate = (err) => {
189
+ if (err?.response?.data?.error?.details?.code === 'INVALID_TOKEN_SALT') {
190
+ toggleNotification({
191
+ type: 'warning',
192
+ message: {
193
+ id: 'notification.error.invalid.configuration',
194
+ defaultMessage:
195
+ 'You have an invalid configuration, check your server log for more information.',
196
+ },
197
+ });
198
+ } else {
199
+ toggleNotification({
200
+ type: 'warning',
201
+ message: formatAPIError(err),
202
+ });
203
+ }
204
+ };
205
+
164
206
  return (
165
207
  <Main>
166
208
  <SettingsPageTitle name="Transfer Tokens" />
@@ -173,6 +215,7 @@ const TransferTokenCreateView = () => {
173
215
  lifespan: transferToken?.lifespan
174
216
  ? transferToken.lifespan.toString()
175
217
  : transferToken?.lifespan,
218
+ permissions: transferToken?.permissions.join('-'),
176
219
  }}
177
220
  enableReinitialize
178
221
  onSubmit={(body, actions) => handleSubmit(body, actions)}
@@ -192,6 +235,7 @@ const TransferTokenCreateView = () => {
192
235
  canRegenerate={canRegenerate}
193
236
  isSubmitting={isSubmitting}
194
237
  regenerateUrl="/admin/transfer/tokens/"
238
+ onErrorRegenerate={handleErrorRegenerate}
195
239
  />
196
240
  <ContentLayout>
197
241
  <Flex direction="column" alignItems="stretch" gap={6}>
@@ -5,6 +5,7 @@ const schema = yup.object().shape({
5
5
  name: yup.string(translatedErrors.string).max(100).required(translatedErrors.required),
6
6
  description: yup.string().nullable(),
7
7
  lifespan: yup.number().integer().min(0).nullable().defined(translatedErrors.required),
8
+ permissions: yup.string(translatedErrors.string).required(translatedErrors.required),
8
9
  });
9
10
 
10
11
  export default schema;
@@ -77,11 +77,24 @@ const TransferTokenListView = () => {
77
77
  },
78
78
  {
79
79
  enabled: canRead,
80
- onError() {
81
- toggleNotification({
82
- type: 'warning',
83
- message: { id: 'notification.error', defaultMessage: 'An error occured' },
84
- });
80
+ onError(err) {
81
+ console.log('error', err);
82
+
83
+ if (err?.response?.data?.error?.details?.code === 'INVALID_TOKEN_SALT') {
84
+ toggleNotification({
85
+ type: 'warning',
86
+ message: {
87
+ id: 'notification.error.invalid.configuration',
88
+ defaultMessage:
89
+ 'You have an invalid configuration, check your server log for more information.',
90
+ },
91
+ });
92
+ } else {
93
+ toggleNotification({
94
+ type: 'warning',
95
+ message: { id: 'notification.error', defaultMessage: 'An error occured' },
96
+ });
97
+ }
85
98
  },
86
99
  }
87
100
  );
@@ -101,6 +114,15 @@ const TransferTokenListView = () => {
101
114
  onError(err) {
102
115
  if (err?.response?.data?.data) {
103
116
  toggleNotification({ type: 'warning', message: err.response.data.data });
117
+ } else if (err?.response?.data?.error?.details?.code === 'INVALID_TOKEN_SALT') {
118
+ toggleNotification({
119
+ type: 'warning',
120
+ message: {
121
+ id: 'notification.error.invalid.configuration',
122
+ defaultMessage:
123
+ 'You have an invalid configuration, check your server log for more information.',
124
+ },
125
+ });
104
126
  } else {
105
127
  toggleNotification({
106
128
  type: 'warning',
@@ -1,7 +1,7 @@
1
1
  import React, { useEffect, useMemo } from 'react';
2
2
  import { useRBAC, LoadingIndicatorPage, useNotification } from '@strapi/helper-plugin';
3
3
  import { Redirect, useLocation } from 'react-router-dom';
4
- import { get } from 'lodash';
4
+
5
5
  import adminPermissions from '../../../../../permissions';
6
6
  import EditPage from '../EditPage';
7
7
 
@@ -19,7 +19,7 @@ const ProtectedEditPage = () => {
19
19
  allowedActions: { canRead, canUpdate },
20
20
  } = useRBAC(permissions);
21
21
  const { state } = useLocation();
22
- const from = get(state, 'from', '/');
22
+ const from = state?.from ?? '/';
23
23
 
24
24
  useEffect(() => {
25
25
  if (!isLoading) {
@@ -1,11 +1,5 @@
1
- import { set } from 'lodash';
2
-
3
1
  const cleanData = (data) => {
4
- const webhooks = { ...data };
5
-
6
- set(webhooks, 'headers', unformatHeaders(data.headers));
7
-
8
- return webhooks;
2
+ return { ...data, headers: unformatHeaders(data.headers) };
9
3
  };
10
4
 
11
5
  const unformatHeaders = (headers) => {
@@ -1,4 +1,4 @@
1
- import { merge } from 'lodash';
1
+ import merge from 'lodash/merge';
2
2
  import customPermissions from 'ee_else_ce/permissions/customPermissions';
3
3
  import defaultPermissions from './defaultPermissions';
4
4
 
@@ -878,6 +878,7 @@
878
878
  "notification.success.transfertokencreated": "Transfer Token successfully created",
879
879
  "notification.success.transfertokenedited": "Transfer Token successfully edited",
880
880
  "notification.error.tokennamenotunique": "Name already assigned to another token",
881
+ "notification.error.invalid.configuration": "You have an invalid configuration, check your server log for more information.",
881
882
  "notification.version.update.message": "A new version of Strapi is available!",
882
883
  "notification.warning.title": "Warning:",
883
884
  "notification.warning.404": "404 - Not found",
@@ -1,13 +1,11 @@
1
- import { get } from 'lodash';
2
-
3
1
  const getAttributesToDisplay = (contentType) => {
4
- const timestamps = get(contentType, ['options', 'timestamps']);
2
+ const timestamps = contentType?.options?.timestamps;
5
3
 
6
4
  // Sometimes timestamps is false
7
5
  let timestampsArray = Array.isArray(timestamps) ? timestamps : [];
8
6
  const idsAttributes = ['id', '_id']; // For both SQL and mongo
9
7
  const unwritableAttributes = [...idsAttributes, ...timestampsArray, 'publishedAt'];
10
- const schemaAttributes = get(contentType, ['attributes'], {});
8
+ const schemaAttributes = contentType?.attributes ?? {};
11
9
 
12
10
  return Object.keys(schemaAttributes).reduce((acc, current) => {
13
11
  if (!unwritableAttributes.includes(current)) {
@@ -1,5 +1,3 @@
1
- import { get } from 'lodash';
2
-
3
1
  const getExistingActions = (permissions) => {
4
2
  return Array.from(
5
3
  new Set(
@@ -23,7 +21,7 @@ const getExistingActions = (permissions) => {
23
21
  ...acc,
24
22
  ...getActionsPermission([
25
23
  ...Object.values(current[1].attributes || {}),
26
- get(current[1], 'contentTypeActions', {}),
24
+ current[1]?.contentTypeActions ?? {},
27
25
  ]),
28
26
  ];
29
27
  }, [])
@@ -1,4 +1,4 @@
1
- import { sortBy } from 'lodash';
1
+ import sortBy from 'lodash/sortBy';
2
2
 
3
3
  const sortLinks = (links) => sortBy(links, (object) => object.name);
4
4