@strapi/admin 4.12.0 → 4.12.2

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 (190) hide show
  1. package/admin/src/components/LeftMenu/index.js +1 -1
  2. package/admin/src/components/PluginsInitializer/index.js +23 -0
  3. package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +9 -14
  4. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js +1 -1
  5. package/admin/src/content-manager/components/InputUID/index.js +2 -3
  6. package/admin/src/content-manager/components/RelationInput/RelationInput.js +1 -1
  7. package/admin/src/content-manager/components/RelationInputDataManager/utils/getRelationLink.js +1 -3
  8. package/admin/src/content-manager/components/RelationInputDataManager/utils/select.js +4 -6
  9. package/admin/src/content-manager/components/SingleTypeFormWrapper/index.js +7 -9
  10. package/admin/src/content-manager/pages/App/utils/getContentTypeLinks.js +1 -3
  11. package/admin/src/content-manager/pages/EditSettingsView/index.js +31 -18
  12. package/admin/src/content-manager/pages/ListSettingsView/components/EditFieldForm.js +1 -3
  13. package/admin/src/content-manager/pages/ListSettingsView/components/Settings.js +1 -3
  14. package/admin/src/content-manager/pages/ListSettingsView/components/SortDisplayedFields.js +14 -32
  15. package/admin/src/content-manager/pages/ListSettingsView/index.js +50 -40
  16. package/admin/src/content-manager/pages/ListView/components/BulkActionButtons/SelectedEntriesModal/index.js +7 -2
  17. package/admin/src/content-manager/pages/ListView/components/CellContent/RelationMultiple/index.js +2 -2
  18. package/admin/src/content-manager/pages/ListView/index.js +10 -4
  19. package/admin/src/content-manager/sharedReducers/crudReducer/reducer.js +1 -1
  20. package/admin/src/content-manager/utils/checkIfAttributeIsDisplayable.js +2 -4
  21. package/admin/src/content-manager/utils/index.js +0 -1
  22. package/admin/src/hooks/index.js +0 -3
  23. package/admin/src/hooks/useAdminRolePermissions/__mocks__/index.js +5 -0
  24. package/admin/src/hooks/useAdminRolePermissions/index.js +34 -0
  25. package/admin/src/hooks/useAdminRoles/__mocks__/index.js +5 -0
  26. package/admin/src/hooks/useAdminRoles/index.js +40 -0
  27. package/admin/src/pages/AuthPage/components/Register/index.js +4 -0
  28. package/admin/src/pages/AuthPage/constants.js +2 -2
  29. package/admin/src/pages/InstalledPluginsPage/Plugins.js +2 -2
  30. package/admin/src/pages/InstalledPluginsPage/hooks/usePlugins/index.js +29 -0
  31. package/admin/src/pages/MarketplacePage/hooks/useFetchMarketplacePlugins/index.js +44 -0
  32. package/admin/src/pages/MarketplacePage/hooks/useFetchMarketplaceProviders/index.js +44 -0
  33. package/admin/src/pages/MarketplacePage/utils/useMarketplaceData.js +2 -2
  34. package/admin/src/pages/SettingsPage/pages/Roles/CreatePage/index.js +24 -9
  35. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RoleForm/index.js +1 -0
  36. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/index.js +34 -20
  37. package/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js +31 -84
  38. package/admin/src/pages/SettingsPage/pages/Roles/hooks/useAdminRolePermissionLayout/index.js +23 -0
  39. package/admin/src/translations/ar.json +9 -3
  40. package/admin/src/translations/ca.json +8 -2
  41. package/admin/src/translations/de.json +8 -2
  42. package/admin/src/translations/dk.json +8 -2
  43. package/admin/src/translations/en.json +9 -3
  44. package/admin/src/translations/es.json +9 -3
  45. package/admin/src/translations/eu.json +8 -2
  46. package/admin/src/translations/fr.json +9 -2
  47. package/admin/src/translations/gu.json +8 -2
  48. package/admin/src/translations/hi.json +9 -3
  49. package/admin/src/translations/hu.json +9 -3
  50. package/admin/src/translations/ja.json +12 -6
  51. package/admin/src/translations/ko.json +12 -6
  52. package/admin/src/translations/ml.json +8 -2
  53. package/admin/src/translations/nl.json +8 -2
  54. package/admin/src/translations/pl.json +8 -2
  55. package/admin/src/translations/pt-BR.json +8 -2
  56. package/admin/src/translations/ru.json +8 -2
  57. package/admin/src/translations/sa.json +9 -3
  58. package/admin/src/translations/sk.json +8 -2
  59. package/admin/src/translations/sv.json +7 -2
  60. package/admin/src/translations/tr.json +8 -2
  61. package/admin/src/translations/zh-Hans.json +8 -2
  62. package/admin/src/translations/zh.json +8 -2
  63. package/admin/src/utils/index.js +0 -1
  64. package/build/1049.f76cb14b.chunk.js +1 -0
  65. package/build/1386.879bcd90.chunk.js +7 -0
  66. package/build/{2225.15d1df72.chunk.js → 2225.c6244756.chunk.js} +1 -1
  67. package/build/2379.f1641312.chunk.js +1 -0
  68. package/build/2395.46f8d0c1.chunk.js +26 -0
  69. package/build/2801.5cef5ec8.chunk.js +1 -0
  70. package/build/{3483.e2ee2547.chunk.js → 3483.03c24f96.chunk.js} +1 -1
  71. package/build/3929.5632f24d.chunk.js +114 -0
  72. package/build/4546.cfafae68.chunk.js +1 -0
  73. package/build/6691.4985ef22.chunk.js +105 -0
  74. package/build/7464.3e64a1d5.chunk.js +1 -0
  75. package/build/8276.10a3f883.chunk.js +26 -0
  76. package/build/{9806.aa25371d.chunk.js → 9806.3392505e.chunk.js} +2 -2
  77. package/build/{Admin-authenticatedApp.376233ff.chunk.js → Admin-authenticatedApp.3c585a0d.chunk.js} +3 -3
  78. package/build/{Admin_marketplace.f0b87fce.chunk.js → Admin_marketplace.dde9c148.chunk.js} +6 -6
  79. package/build/Admin_pluginsPage.bbe79434.chunk.js +6 -0
  80. package/build/{Admin_profilePage.a968035f.chunk.js → Admin_profilePage.192edc52.chunk.js} +1 -1
  81. package/build/{Admin_settingsPage.8c600d1a.chunk.js → Admin_settingsPage.97cb9d41.chunk.js} +1 -1
  82. package/build/admin-app.91898385.chunk.js +36 -0
  83. package/build/admin-edit-roles-page.6d567273.chunk.js +267 -0
  84. package/build/{admin-edit-users.67704088.chunk.js → admin-edit-users.79eeb125.chunk.js} +1 -1
  85. package/build/admin-roles-list.23ddff26.chunk.js +22 -0
  86. package/build/{admin-users.3279ffb0.chunk.js → admin-users.123aa08e.chunk.js} +1 -1
  87. package/build/ar-json.74e40bc7.chunk.js +1 -0
  88. package/build/{ca-json.a53c10b6.chunk.js → ca-json.fc6001d3.chunk.js} +1 -1
  89. package/build/content-manager.2af15f57.chunk.js +1099 -0
  90. package/build/{de-json.b3be02c7.chunk.js → de-json.e72545cf.chunk.js} +1 -1
  91. package/build/dk-json.e77140ef.chunk.js +1 -0
  92. package/build/{en-json.e34140fc.chunk.js → en-json.08c05fcf.chunk.js} +1 -1
  93. package/build/es-json.b1f2284b.chunk.js +1 -0
  94. package/build/{eu-json.633025f0.chunk.js → eu-json.63d0a898.chunk.js} +1 -1
  95. package/build/{fr-json.aa8839d2.chunk.js → fr-json.33c6428b.chunk.js} +1 -1
  96. package/build/{gu-json.5bd62812.chunk.js → gu-json.7efe8cc2.chunk.js} +1 -1
  97. package/build/{hi-json.9104eb78.chunk.js → hi-json.0d633692.chunk.js} +1 -1
  98. package/build/{hu-json.9f4aae42.chunk.js → hu-json.c74b6a1e.chunk.js} +1 -1
  99. package/build/index.html +1 -1
  100. package/build/{ja-json.91286391.chunk.js → ja-json.e1959a1c.chunk.js} +1 -1
  101. package/build/{ko-json.fcf3ec4b.chunk.js → ko-json.ce5d6d94.chunk.js} +1 -1
  102. package/build/main.f13fc96c.js +2856 -0
  103. package/build/{ml-json.557aa14c.chunk.js → ml-json.940d7ace.chunk.js} +1 -1
  104. package/build/{nl-json.b2b16eea.chunk.js → nl-json.fe38f0fb.chunk.js} +1 -1
  105. package/build/{pl-json.f094a417.chunk.js → pl-json.d55e8e78.chunk.js} +1 -1
  106. package/build/{pt-BR-json.dec7fb01.chunk.js → pt-BR-json.ae0a0d2e.chunk.js} +1 -1
  107. package/build/review-workflows-settings-create-view.cb08cfa2.chunk.js +1 -0
  108. package/build/review-workflows-settings-edit-view.3c7cbe63.chunk.js +1 -0
  109. package/build/review-workflows-settings-list-view.1611dc1f.chunk.js +56 -0
  110. package/build/{ru-json.8193d8c4.chunk.js → ru-json.1c976644.chunk.js} +1 -1
  111. package/build/{runtime~main.58ec8df6.js → runtime~main.2902859a.js} +1 -1
  112. package/build/{sa-json.a56836f1.chunk.js → sa-json.2c03ef4e.chunk.js} +1 -1
  113. package/build/sk-json.b41847e8.chunk.js +1 -0
  114. package/build/sso-settings-page.12b6d8ae.chunk.js +1 -0
  115. package/build/{sv-json.fd0e86c6.chunk.js → sv-json.568cb7ae.chunk.js} +1 -1
  116. package/build/{tr-json.56c32cf6.chunk.js → tr-json.c9f22432.chunk.js} +1 -1
  117. package/build/upload-settings.7f93d4c0.chunk.js +14 -0
  118. package/build/upload.37488080.chunk.js +58 -0
  119. package/build/users-advanced-settings-page.f0760eb8.chunk.js +9 -0
  120. package/build/users-email-settings-page.ff4b32f3.chunk.js +9 -0
  121. package/build/users-providers-settings-page.48de0306.chunk.js +14 -0
  122. package/build/users-roles-settings-page.3f9f063e.chunk.js +30 -0
  123. package/build/{zh-Hans-json.36d81cdc.chunk.js → zh-Hans-json.937b395b.chunk.js} +1 -1
  124. package/build/{zh-json.1cc86ff0.chunk.js → zh-json.bfc2e036.chunk.js} +1 -1
  125. package/ee/admin/hooks/useAuthProviders/index.js +1 -3
  126. package/ee/admin/pages/AuthResponse/index.js +1 -3
  127. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/Stage.js +35 -32
  128. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js +1 -7
  129. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js +16 -14
  130. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/ListView/ListView.js +32 -31
  131. package/ee/admin/pages/SettingsPage/pages/SingleSignOn/index.js +16 -26
  132. package/ee/server/config/admin-actions.js +6 -6
  133. package/ee/server/services/review-workflows/entity-service-decorator.js +4 -3
  134. package/index.js +2 -0
  135. package/package.json +16 -16
  136. package/scripts/build.js +1 -0
  137. package/server/controllers/role.js +9 -1
  138. package/server/middlewares/rateLimit.js +6 -2
  139. package/server/services/role.js +3 -2
  140. package/server/services/transfer/token.js +27 -4
  141. package/server/validation/authentication/register.js +2 -2
  142. package/webpack.config.js +2 -1
  143. package/admin/src/content-manager/components/SingleTypeFormWrapper/utils/getRequestUrl.js +0 -5
  144. package/admin/src/content-manager/components/SingleTypeFormWrapper/utils/index.js +0 -2
  145. package/admin/src/content-manager/pages/EditSettingsView/utils/api.js +0 -16
  146. package/admin/src/content-manager/pages/ListSettingsView/init.js +0 -9
  147. package/admin/src/content-manager/utils/getRequestUrl.js +0 -4
  148. package/admin/src/hooks/marketplace/useFetchMarketplacePlugins/index.js +0 -44
  149. package/admin/src/hooks/marketplace/useFetchMarketplaceProviders/index.js +0 -44
  150. package/admin/src/hooks/useFetchEnabledPlugins/index.js +0 -24
  151. package/admin/src/hooks/useFetchEnabledPlugins/utils/api.js +0 -10
  152. package/admin/src/hooks/useFetchPermissionsLayout/index.js +0 -42
  153. package/admin/src/hooks/useFetchPermissionsLayout/reducer.js +0 -35
  154. package/admin/src/hooks/useFetchRole/index.js +0 -68
  155. package/admin/src/hooks/useFetchRole/reducer.js +0 -33
  156. package/admin/src/hooks/useRolesList/index.js +0 -58
  157. package/admin/src/hooks/useRolesList/init.js +0 -5
  158. package/admin/src/hooks/useRolesList/reducer.js +0 -31
  159. package/admin/src/utils/getRequestUrl.js +0 -3
  160. package/build/1049.758a01f5.chunk.js +0 -1
  161. package/build/1386.762d6eb8.chunk.js +0 -7
  162. package/build/2379.0ca87a89.chunk.js +0 -1
  163. package/build/2395.df7a044a.chunk.js +0 -26
  164. package/build/2801.b1140c9b.chunk.js +0 -1
  165. package/build/4546.ff9fdf30.chunk.js +0 -1
  166. package/build/6691.f880a0b6.chunk.js +0 -105
  167. package/build/7065.ec811562.chunk.js +0 -114
  168. package/build/7464.8a6c1e6c.chunk.js +0 -1
  169. package/build/8276.6c7b8e6e.chunk.js +0 -26
  170. package/build/Admin_pluginsPage.8728ff6e.chunk.js +0 -6
  171. package/build/admin-app.1c3f7fd6.chunk.js +0 -36
  172. package/build/admin-edit-roles-page.a49b9f4f.chunk.js +0 -267
  173. package/build/admin-roles-list.0c129e98.chunk.js +0 -23
  174. package/build/ar-json.f530bc3f.chunk.js +0 -1
  175. package/build/content-manager.e9205db1.chunk.js +0 -1103
  176. package/build/dk-json.842aa391.chunk.js +0 -1
  177. package/build/es-json.f57b5335.chunk.js +0 -1
  178. package/build/main.1e3b0985.js +0 -2856
  179. package/build/review-workflows-settings-create-view.05758184.chunk.js +0 -1
  180. package/build/review-workflows-settings-edit-view.c33f7c58.chunk.js +0 -1
  181. package/build/review-workflows-settings-list-view.f055e1be.chunk.js +0 -56
  182. package/build/sk-json.bf2f057a.chunk.js +0 -1
  183. package/build/sso-settings-page.7c9b2fd9.chunk.js +0 -1
  184. package/build/upload-settings.cac210a0.chunk.js +0 -14
  185. package/build/upload.cbfeefa5.chunk.js +0 -58
  186. package/build/users-advanced-settings-page.18379a56.chunk.js +0 -9
  187. package/build/users-email-settings-page.a87978e5.chunk.js +0 -9
  188. package/build/users-providers-settings-page.8876c1ee.chunk.js +0 -14
  189. package/build/users-roles-settings-page.0431f48c.chunk.js +0 -30
  190. /package/admin/src/{hooks/marketplace → pages/MarketplacePage}/constants.js +0 -0
@@ -27,16 +27,16 @@ import {
27
27
  import { ArrowLeft } from '@strapi/icons';
28
28
  import { format } from 'date-fns';
29
29
  import { Formik } from 'formik';
30
- import get from 'lodash/get';
31
30
  import isEmpty from 'lodash/isEmpty';
32
31
  import { useIntl } from 'react-intl';
33
32
  import { useSelector } from 'react-redux';
34
33
  import { useHistory, useRouteMatch } from 'react-router-dom';
35
34
  import styled from 'styled-components';
36
35
 
37
- import { useFetchPermissionsLayout, useFetchRole } from '../../../../../hooks';
36
+ import { useAdminRolePermissions } from '../../../../../hooks/useAdminRolePermissions';
38
37
  import { selectAdminPermissions } from '../../../../App/selectors';
39
38
  import Permissions from '../EditPage/components/Permissions';
39
+ import { useAdminRolePermissionLayout } from '../hooks/useAdminRolePermissionLayout';
40
40
 
41
41
  import schema from './utils/schema';
42
42
 
@@ -51,6 +51,7 @@ const UsersRoleNumber = styled.div`
51
51
  `;
52
52
 
53
53
  const CreatePage = () => {
54
+ const route = useRouteMatch('/settings/roles/duplicate/:id');
54
55
  const toggleNotification = useNotification();
55
56
  const { lockApp, unlockApp } = useOverlayBlocker();
56
57
  const { formatMessage } = useIntl();
@@ -58,17 +59,30 @@ const CreatePage = () => {
58
59
  const { replace } = useHistory();
59
60
  const permissionsRef = useRef();
60
61
  const { trackUsage } = useTracking();
61
- const params = useRouteMatch('/settings/roles/duplicate/:id');
62
- const id = get(params, 'params.id', null);
63
- const { isLoading: isLayoutLoading, data: permissionsLayout } = useFetchPermissionsLayout();
64
- const { permissions: rolePermissions, isLoading: isRoleLoading } = useFetchRole(id);
65
62
  const { post, put } = useFetchClient();
66
63
 
64
+ const { params } = route ?? {};
65
+
66
+ const { isLoading: isLoadingPermissionsLayout, data: permissionsLayout } =
67
+ useAdminRolePermissionLayout(params?.id, {
68
+ cacheTime: 0,
69
+ });
70
+
71
+ const { permissions: rolePermissions, isLoading: isLoadingRole } = useAdminRolePermissions(
72
+ { id: params?.id },
73
+ {
74
+ cacheTime: 0,
75
+
76
+ // only fetch permissions if a role is cloned
77
+ enabled: !!params?.id,
78
+ }
79
+ );
80
+
67
81
  const handleCreateRoleSubmit = (data) => {
68
82
  lockApp();
69
83
  setIsSubmiting(true);
70
84
 
71
- if (id) {
85
+ if (params?.id) {
72
86
  trackUsage('willDuplicateRole');
73
87
  } else {
74
88
  trackUsage('willCreateNewRole');
@@ -78,7 +92,7 @@ const CreatePage = () => {
78
92
  .then(async ({ data: res }) => {
79
93
  const { permissionsToSend } = permissionsRef.current.getPermissions();
80
94
 
81
- if (id) {
95
+ if (params?.id) {
82
96
  trackUsage('didDuplicateRole');
83
97
  } else {
84
98
  trackUsage('didCreateNewRole');
@@ -213,6 +227,7 @@ const CreatePage = () => {
213
227
  defaultMessage: 'Name',
214
228
  })}
215
229
  onChange={handleChange}
230
+ required
216
231
  value={values.name}
217
232
  />
218
233
  </GridItem>
@@ -232,7 +247,7 @@ const CreatePage = () => {
232
247
  </Grid>
233
248
  </Flex>
234
249
  </Box>
235
- {!isLayoutLoading && !isRoleLoading ? (
250
+ {!isLoadingPermissionsLayout && !isLoadingRole ? (
236
251
  <Box shadow="filterShadow" hasRadius>
237
252
  <Permissions
238
253
  isFormDisabled={false}
@@ -65,6 +65,7 @@ const RoleForm = ({ disabled, role, values, errors, onChange, onBlur }) => {
65
65
  })}
66
66
  onChange={onChange}
67
67
  onBlur={onBlur}
68
+ required
68
69
  value={values.name || ''}
69
70
  />
70
71
  </GridItem>
@@ -5,6 +5,7 @@ import {
5
5
  Link,
6
6
  LoadingIndicatorPage,
7
7
  SettingsPageTitle,
8
+ useAPIErrorHandler,
8
9
  useFetchClient,
9
10
  useNotification,
10
11
  useOverlayBlocker,
@@ -12,11 +13,12 @@ import {
12
13
  } from '@strapi/helper-plugin';
13
14
  import { ArrowLeft } from '@strapi/icons';
14
15
  import { Formik } from 'formik';
15
- import get from 'lodash/get';
16
16
  import { useIntl } from 'react-intl';
17
17
  import { useRouteMatch } from 'react-router-dom';
18
18
 
19
- import { useFetchPermissionsLayout, useFetchRole } from '../../../../../hooks';
19
+ import { useAdminRolePermissions } from '../../../../../hooks/useAdminRolePermissions';
20
+ import { useAdminRoles } from '../../../../../hooks/useAdminRoles';
21
+ import { useAdminRolePermissionLayout } from '../hooks/useAdminRolePermissionLayout';
20
22
 
21
23
  import { Permissions, RoleForm } from './components';
22
24
  import schema from './utils/schema';
@@ -27,21 +29,37 @@ const EditPage = () => {
27
29
  const {
28
30
  params: { id },
29
31
  } = useRouteMatch('/settings/roles/:id');
32
+ const { put } = useFetchClient();
30
33
  const [isSubmitting, setIsSubmiting] = useState(false);
31
34
  const permissionsRef = useRef();
32
35
  const { lockApp, unlockApp } = useOverlayBlocker();
33
36
  const { trackUsage } = useTracking();
37
+ const { formatAPIError } = useAPIErrorHandler();
38
+
39
+ const { isLoading: isLoadingPermissionsLayout, data: permissionsLayout } =
40
+ useAdminRolePermissionLayout(id, {
41
+ cacheTime: 0,
42
+ });
34
43
 
35
- const { isLoading: isLayoutLoading, data: permissionsLayout } = useFetchPermissionsLayout(id);
36
44
  const {
37
- role,
38
- permissions: rolePermissions,
45
+ roles: [role = {}],
39
46
  isLoading: isRoleLoading,
40
- onSubmitSucceeded,
41
- } = useFetchRole(id);
47
+ refetch: refetchRole,
48
+ } = useAdminRoles(
49
+ { id },
50
+ {
51
+ cacheTime: 0,
52
+ }
53
+ );
42
54
 
43
- const { put } = useFetchClient();
55
+ const { permissions, isLoading: isLoadingPermissions } = useAdminRolePermissions(
56
+ { id },
57
+ {
58
+ cacheTime: 0,
59
+ }
60
+ );
44
61
 
62
+ // TODO: this should use a react-query mutation
45
63
  const handleEditRoleSubmit = async (data) => {
46
64
  try {
47
65
  lockApp();
@@ -62,21 +80,17 @@ const EditPage = () => {
62
80
  }
63
81
 
64
82
  permissionsRef.current.setFormAfterSubmit();
65
- onSubmitSucceeded({ name: data.name, description: data.description });
83
+
84
+ await refetchRole();
66
85
 
67
86
  toggleNotification({
68
87
  type: 'success',
69
88
  message: { id: 'notification.success.saved' },
70
89
  });
71
- } catch (err) {
72
- console.error(err.response);
73
-
74
- const errorMessage = get(err, 'response.payload.message', 'An error occured');
75
- const message = get(err, 'response.payload.data.permissions[0]', errorMessage);
76
-
90
+ } catch (error) {
77
91
  toggleNotification({
78
92
  type: 'warning',
79
- message,
93
+ message: formatAPIError(error),
80
94
  });
81
95
  } finally {
82
96
  setIsSubmiting(false);
@@ -84,7 +98,7 @@ const EditPage = () => {
84
98
  }
85
99
  };
86
100
 
87
- const isFormDisabled = role.code === 'strapi-super-admin';
101
+ const isFormDisabled = !isRoleLoading && role.code === 'strapi-super-admin';
88
102
 
89
103
  return (
90
104
  <Main>
@@ -137,7 +151,7 @@ const EditPage = () => {
137
151
  <ContentLayout>
138
152
  <Flex direction="column" alignItems="stretch" gap={6}>
139
153
  <RoleForm
140
- isLoading={isRoleLoading}
154
+ isLoading={isRoleLoading || isLoadingPermissions}
141
155
  disabled={isFormDisabled}
142
156
  errors={errors}
143
157
  values={values}
@@ -145,11 +159,11 @@ const EditPage = () => {
145
159
  onBlur={handleBlur}
146
160
  role={role}
147
161
  />
148
- {!isLayoutLoading && !isRoleLoading ? (
162
+ {!isLoadingPermissionsLayout && !isRoleLoading && !isLoadingPermissions ? (
149
163
  <Box shadow="filterShadow" hasRadius>
150
164
  <Permissions
151
165
  isFormDisabled={isFormDisabled}
152
- permissions={rolePermissions}
166
+ permissions={permissions}
153
167
  ref={permissionsRef}
154
168
  layout={permissionsLayout}
155
169
  />
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useReducer, useState } from 'react';
1
+ import React, { useCallback, useReducer, useState } from 'react';
2
2
 
3
3
  import {
4
4
  ActionLayout,
@@ -21,78 +21,27 @@ import {
21
21
  LoadingIndicatorPage,
22
22
  SearchURLQuery,
23
23
  SettingsPageTitle,
24
- useCollator,
25
- useFilter,
24
+ useAPIErrorHandler,
26
25
  useFocusWhenNavigate,
27
- useNotification,
28
26
  useQueryParams,
27
+ useNotification,
29
28
  useRBAC,
30
29
  } from '@strapi/helper-plugin';
31
30
  import { Duplicate, Pencil, Plus, Trash } from '@strapi/icons';
32
- import get from 'lodash/get';
33
31
  import { useIntl } from 'react-intl';
34
32
  import { useSelector } from 'react-redux';
35
33
  import { useHistory } from 'react-router-dom';
36
34
 
37
- import { useRolesList } from '../../../../../hooks';
35
+ import { useAdminRoles } from '../../../../../hooks/useAdminRoles';
38
36
  import { selectAdminPermissions } from '../../../../App/selectors';
39
37
 
40
38
  import EmptyRole from './components/EmptyRole';
41
39
  import BaseRoleRow from './components/RoleRow';
42
40
  import reducer, { initialState } from './reducer';
43
41
 
44
- const useSortedRoles = () => {
45
- useFocusWhenNavigate();
46
- const { locale } = useIntl();
47
- const permissions = useSelector(selectAdminPermissions);
48
- const {
49
- isLoading: isLoadingForPermissions,
50
- allowedActions: { canCreate, canDelete, canRead, canUpdate },
51
- } = useRBAC(permissions.settings.roles);
52
-
53
- const { getData, roles, isLoading } = useRolesList(false);
54
- const [{ query }] = useQueryParams();
55
- const _q = query?._q || '';
56
-
57
- const { includes } = useFilter(locale, {
58
- sensitivity: 'base',
59
- });
60
-
61
- /**
62
- * @type {Intl.Collator}
63
- */
64
- const formatter = useCollator(locale, {
65
- sensitivity: 'base',
66
- });
67
-
68
- const sortedRoles = (roles || [])
69
- .filter((role) => includes(role.name, _q) || includes(role.description, _q))
70
- .sort(
71
- (a, b) => formatter.compare(a.name, b.name) || formatter.compare(a.description, b.description)
72
- );
73
-
74
- useEffect(() => {
75
- if (!isLoadingForPermissions && canRead) {
76
- getData();
77
- }
78
- }, [isLoadingForPermissions, canRead, getData]);
79
-
80
- return {
81
- isLoadingForPermissions,
82
- canCreate,
83
- canDelete,
84
- canRead,
85
- canUpdate,
86
- isLoading,
87
- getData,
88
- sortedRoles,
89
- roles,
90
- };
91
- };
92
-
93
- const useRoleActions = ({ getData, canCreate, canDelete, canUpdate }) => {
42
+ const useRoleActions = ({ canCreate, canDelete, canUpdate, refetchRoles }) => {
94
43
  const { formatMessage } = useIntl();
95
-
44
+ const { formatAPIError } = useAPIErrorHandler();
96
45
  const toggleNotification = useNotification();
97
46
  const [isWarningDeleteAllOpened, setIsWarningDeleteAllOpenend] = useState(false);
98
47
  const { push } = useHistory();
@@ -113,26 +62,16 @@ const useRoleActions = ({ getData, canCreate, canDelete, canUpdate }) => {
113
62
  ids: [roleToDelete],
114
63
  });
115
64
 
116
- await getData();
65
+ await refetchRoles();
117
66
 
118
67
  dispatch({
119
68
  type: 'RESET_DATA_TO_DELETE',
120
69
  });
121
- } catch (err) {
122
- const errorIds = get(err, ['response', 'payload', 'data', 'ids'], null);
123
-
124
- if (errorIds && Array.isArray(errorIds)) {
125
- const errorsMsg = errorIds.join('\n');
126
- toggleNotification({
127
- type: 'warning',
128
- message: errorsMsg,
129
- });
130
- } else {
131
- toggleNotification({
132
- type: 'warning',
133
- message: { id: 'notification.error' },
134
- });
135
- }
70
+ } catch (error) {
71
+ toggleNotification({
72
+ type: 'warning',
73
+ message: formatAPIError(error),
74
+ });
136
75
  }
137
76
  handleToggleModal();
138
77
  };
@@ -244,17 +183,25 @@ const useRoleActions = ({ getData, canCreate, canDelete, canUpdate }) => {
244
183
 
245
184
  const RoleListPage = () => {
246
185
  const { formatMessage } = useIntl();
186
+ useFocusWhenNavigate();
187
+ const permissions = useSelector(selectAdminPermissions);
188
+ const [{ query }] = useQueryParams();
189
+ const {
190
+ isLoading: isLoadingForPermissions,
191
+ allowedActions: { canCreate, canDelete, canRead, canUpdate },
192
+ } = useRBAC(permissions.settings.roles);
247
193
 
248
194
  const {
249
- isLoadingForPermissions,
250
- canCreate,
251
- canRead,
252
- canDelete,
253
- canUpdate,
195
+ roles,
254
196
  isLoading,
255
- getData,
256
- sortedRoles,
257
- } = useSortedRoles();
197
+ refetch: refetchRoles,
198
+ } = useAdminRoles(
199
+ { filters: query?._q ? { name: { $containsi: query._q } } : undefined },
200
+ {
201
+ cacheTime: 0,
202
+ enabled: !isLoadingForPermissions && canRead,
203
+ }
204
+ );
258
205
 
259
206
  const {
260
207
  handleNewRoleClick,
@@ -263,12 +210,12 @@ const RoleListPage = () => {
263
210
  showModalConfirmButtonLoading,
264
211
  handleToggleModal,
265
212
  handleDeleteData,
266
- } = useRoleActions({ getData, canCreate, canDelete, canUpdate });
213
+ } = useRoleActions({ refetchRoles, canCreate, canDelete, canUpdate });
267
214
 
268
215
  // ! TODO - Show the search bar only if the user is allowed to read - add the search input
269
216
  // canRead
270
217
 
271
- const rowCount = sortedRoles.length + 1;
218
+ const rowCount = roles.length + 1;
272
219
  const colCount = 6;
273
220
 
274
221
  if (isLoadingForPermissions) {
@@ -370,7 +317,7 @@ const RoleListPage = () => {
370
317
  </Tr>
371
318
  </Thead>
372
319
  <Tbody>
373
- {sortedRoles?.map((role, index) => (
320
+ {roles?.map((role, index) => (
374
321
  <BaseRoleRow
375
322
  key={role.id}
376
323
  id={role.id}
@@ -0,0 +1,23 @@
1
+ import { useFetchClient } from '@strapi/helper-plugin';
2
+ import { useQuery } from 'react-query';
3
+
4
+ export const useAdminRolePermissionLayout = (id, queryOptions = {}) => {
5
+ const { get } = useFetchClient();
6
+
7
+ const { data, error, isError, isLoading } = useQuery(
8
+ ['permissions', id],
9
+ async () => {
10
+ const {
11
+ data: { data },
12
+ } = await get('/admin/permissions', {
13
+ // TODO: check with BE why we deviate from our usual admin API format here
14
+ params: { role: id },
15
+ });
16
+
17
+ return data;
18
+ },
19
+ queryOptions
20
+ );
21
+
22
+ return { data, error, isError, isLoading };
23
+ };
@@ -398,18 +398,24 @@
398
398
  "coming.soon": "هذا المحتوى قيد الإنشاء حاليًا وسيعود في غضون أسابيع قليلة!",
399
399
  "component.Input.error.validation.integer": "يجب أن تكون القيمة عددًا صحيحًا",
400
400
  "components.AutoReloadBlocker.description": "Strapi قم بتشغيل باستخدام أحد الأوامر التالية:",
401
- "components.FilterOptions.FILTER_TYPES.$contains": "يحتوي على (حساس لحالة الأحرف)",
401
+ "components.FilterOptions.FILTER_TYPES.$contains": "يحتوي على",
402
+ "components.FilterOptions.FILTER_TYPES.$containsi": "يحتوي على (case insensitive)",
402
403
  "components.FilterOptions.FILTER_TYPES.$endsWith": "ينتهي بـ",
404
+ "components.FilterOptions.FILTER_TYPES.$endsWithi": "ينتهي بـ (case insensitive)",
403
405
  "components.FilterOptions.FILTER_TYPES.$eq": "هو",
406
+ "components.FilterOptions.FILTER_TYPES.$eqi": "هو (case insensitive)",
404
407
  "components.FilterOptions.FILTER_TYPES.$gt": "أكبر من",
405
408
  "components.FilterOptions.FILTER_TYPES.$gte": "أكبر من أو يساوي",
406
409
  "components.FilterOptions.FILTER_TYPES.$lt": "أقل من",
407
410
  "components.FilterOptions.FILTER_TYPES.$lte": "أقل من أو يساوي",
408
411
  "components.FilterOptions.FILTER_TYPES.$ne": "ليس",
409
- "components.FilterOptions.FILTER_TYPES.$notContains": "لا يحتوي على (حساس لحالة الأحرف)",
412
+ "components.FilterOptions.FILTER_TYPES.$nei": "ليس (case insensitive)",
413
+ "components.FilterOptions.FILTER_TYPES.$notContains": "لا يحتوي على",
414
+ "components.FilterOptions.FILTER_TYPES.$notContainsi": "لا يحتوي على (case insensitive)",
410
415
  "components.FilterOptions.FILTER_TYPES.$notNull": "هو ليس لاشيء",
411
416
  "components.FilterOptions.FILTER_TYPES.$null": "هو لاشيء",
412
417
  "components.FilterOptions.FILTER_TYPES.$startsWith": "يبدا ب",
418
+ "components.FilterOptions.FILTER_TYPES.$startsWithi": "يبدا ب (case insensitive)",
413
419
  "components.Input.error.contain.lowercase": "يجب أن تحتوي كلمة المرور على حرف صغير واحد على الأقل",
414
420
  "components.Input.error.contain.number": "يجب ان تحتوي كلمة المرور على الاقل رقما واحدا",
415
421
  "components.Input.error.contain.uppercase": "يجب أن تحتوي كلمة المرور على حرف كبير واحد على الأقل",
@@ -559,7 +565,7 @@
559
565
  "content-manager.success.record.unpublish": "غير منشورة",
560
566
  "content-manager.utils.data-loaded": "The {number, plural, =1 {entry has} other {entries have}} successfully been loaded",
561
567
  "dark": "داكن",
562
- "Documentation": "توثيق",
568
+ "Documentation": "توثيق",
563
569
  "form.button.continue": "واصل",
564
570
  "form.button.done": "منتهي",
565
571
  "global.actions": "أجراءات",
@@ -380,18 +380,24 @@
380
380
  "components.AutoReloadBlocker.description": "Inicia Strapi amb una de les ordres següents:",
381
381
  "components.AutoReloadBlocker.header": "Cal recarregar aquesta extensió.",
382
382
  "components.ErrorBoundary.title": "Alguna cosa ha sortit malament...",
383
- "components.FilterOptions.FILTER_TYPES.$contains": "conté (sensible a majúscules i minúscules)",
383
+ "components.FilterOptions.FILTER_TYPES.$contains": "conté",
384
+ "components.FilterOptions.FILTER_TYPES.$containsi": "conté (no distingeix entre majúscules i minúscules)",
384
385
  "components.FilterOptions.FILTER_TYPES.$endsWith": "acaba amb",
386
+ "components.FilterOptions.FILTER_TYPES.$endsWithi": "acaba amb (no distingeix entre majúscules i minúscules)",
385
387
  "components.FilterOptions.FILTER_TYPES.$eq": "és",
388
+ "components.FilterOptions.FILTER_TYPES.$eqi": "és (no distingeix entre majúscules i minúscules)",
386
389
  "components.FilterOptions.FILTER_TYPES.$gt": "és més gran que",
387
390
  "components.FilterOptions.FILTER_TYPES.$gte": "és més gran o igual a",
388
391
  "components.FilterOptions.FILTER_TYPES.$lt": "és menor que",
389
392
  "components.FilterOptions.FILTER_TYPES.$lte": "és menor o igual a",
390
393
  "components.FilterOptions.FILTER_TYPES.$ne": "no és",
391
- "components.FilterOptions.FILTER_TYPES.$notContains": "no conté (sensible a majúscules i minúscules)",
394
+ "components.FilterOptions.FILTER_TYPES.$nei": "no és (no distingeix entre majúscules i minúscules)",
395
+ "components.FilterOptions.FILTER_TYPES.$notContains": "no conté",
396
+ "components.FilterOptions.FILTER_TYPES.$notContainsi": "no conté (no distingeix entre majúscules i minúscules)",
392
397
  "components.FilterOptions.FILTER_TYPES.$notNull": "no és nul",
393
398
  "components.FilterOptions.FILTER_TYPES.$null": "és nul",
394
399
  "components.FilterOptions.FILTER_TYPES.$startsWith": "comença amb",
400
+ "components.FilterOptions.FILTER_TYPES.$startsWithi": "comença amb (no distingeix entre majúscules i minúscules)",
395
401
  "components.Input.error.attribute.key.taken": "Aquest valor ja existeix",
396
402
  "components.Input.error.attribute.sameKeyAndName": "No pot ser igual",
397
403
  "components.Input.error.attribute.taken": "Aquest nom de camp ja existeix",
@@ -375,18 +375,24 @@
375
375
  "components.AutoReloadBlocker.description": "Strapi mit einem der folgenden Befehle ausführen:",
376
376
  "components.AutoReloadBlocker.header": "Dieses Plugin benötigt das Neuladen-Feature.",
377
377
  "components.ErrorBoundary.title": "Etwas ist falsch gelaufen...",
378
- "components.FilterOptions.FILTER_TYPES.$contains": "enthält (achtet auf Groß- und Kleinschreibung)",
378
+ "components.FilterOptions.FILTER_TYPES.$contains": "enthält",
379
+ "components.FilterOptions.FILTER_TYPES.$containsi": "enthält (Groß- und Kleinschreibung wird nicht beachtet)",
379
380
  "components.FilterOptions.FILTER_TYPES.$endsWith": "endet mit",
381
+ "components.FilterOptions.FILTER_TYPES.$endsWithi": "endet mit (Groß- und Kleinschreibung wird nicht beachtet)",
380
382
  "components.FilterOptions.FILTER_TYPES.$eq": "ist",
383
+ "components.FilterOptions.FILTER_TYPES.$eqi": "ist (Groß- und Kleinschreibung wird nicht beachtet)",
381
384
  "components.FilterOptions.FILTER_TYPES.$gt": "ist größer als",
382
385
  "components.FilterOptions.FILTER_TYPES.$gte": "is größer als oder gleich",
383
386
  "components.FilterOptions.FILTER_TYPES.$lt": "is kleiner als",
384
387
  "components.FilterOptions.FILTER_TYPES.$lte": "is kleiner als oder gleich",
385
388
  "components.FilterOptions.FILTER_TYPES.$ne": "ist nicht",
386
- "components.FilterOptions.FILTER_TYPES.$notContains": "enthält nicht (achtet auf Groß- und Kleinschreibung)",
389
+ "components.FilterOptions.FILTER_TYPES.$nei": "ist nicht (Groß- und Kleinschreibung wird nicht beachtet)",
390
+ "components.FilterOptions.FILTER_TYPES.$notContains": "enthält nicht",
391
+ "components.FilterOptions.FILTER_TYPES.$notContainsi": "enthält nicht (Groß- und Kleinschreibung wird nicht beachtet)",
387
392
  "components.FilterOptions.FILTER_TYPES.$notNull": "ist nicht null",
388
393
  "components.FilterOptions.FILTER_TYPES.$null": "ist null",
389
394
  "components.FilterOptions.FILTER_TYPES.$startsWith": "startet mit",
395
+ "components.FilterOptions.FILTER_TYPES.$startsWithi": "startet mit (Groß- und Kleinschreibung wird nicht beachtet)",
390
396
  "components.Input.error.attribute.key.taken": "Dieser Wert existiert bereits",
391
397
  "components.Input.error.attribute.sameKeyAndName": "Darf nicht gleich sein",
392
398
  "components.Input.error.attribute.taken": "Dieser Feldname ist bereits vergeben",
@@ -324,18 +324,24 @@
324
324
  "components.AutoReloadBlocker.description": "Kør Strapi med en af følgende kommandoer:",
325
325
  "components.AutoReloadBlocker.header": "Reload funktion er påkrævet for dette plugin.",
326
326
  "components.ErrorBoundary.title": "Noget gik galt...",
327
- "components.FilterOptions.FILTER_TYPES.$contains": "indeholder (forskel på små og store bogstaver)",
327
+ "components.FilterOptions.FILTER_TYPES.$contains": "indeholder",
328
+ "components.FilterOptions.FILTER_TYPES.$containsi": "indeholder (sag ufølsom)",
328
329
  "components.FilterOptions.FILTER_TYPES.$endsWith": "slutter med",
330
+ "components.FilterOptions.FILTER_TYPES.$endsWithi": "slutter med (sag ufølsom)",
329
331
  "components.FilterOptions.FILTER_TYPES.$eq": "er",
332
+ "components.FilterOptions.FILTER_TYPES.$eqi": "er (sag ufølsom)",
330
333
  "components.FilterOptions.FILTER_TYPES.$gt": "er større end",
331
334
  "components.FilterOptions.FILTER_TYPES.$gte": "er større end eller lig med",
332
335
  "components.FilterOptions.FILTER_TYPES.$lt": "er mindre end",
333
336
  "components.FilterOptions.FILTER_TYPES.$lte": "er mindre end eller lig med",
334
337
  "components.FilterOptions.FILTER_TYPES.$ne": "er ikke",
335
- "components.FilterOptions.FILTER_TYPES.$notContains": "indeholder ikke (forskel på små og store bogstaver)",
338
+ "components.FilterOptions.FILTER_TYPES.$nei": "er ikke (sag ufølsom)",
339
+ "components.FilterOptions.FILTER_TYPES.$notContains": "indeholder ikke",
340
+ "components.FilterOptions.FILTER_TYPES.$notContainsi": "indeholder ikke (sag ufølsom)",
336
341
  "components.FilterOptions.FILTER_TYPES.$notNull": "er ikke null",
337
342
  "components.FilterOptions.FILTER_TYPES.$null": "er null",
338
343
  "components.FilterOptions.FILTER_TYPES.$startsWith": "starter med",
344
+ "components.FilterOptions.FILTER_TYPES.$startsWithi": "starter med (sag ufølsom)",
339
345
  "components.Input.error.attribute.key.taken": "Værdien findes allerede",
340
346
  "components.Input.error.attribute.sameKeyAndName": "Kan ikke være lig",
341
347
  "components.Input.error.attribute.taken": "Dette feltnavn findes allerede",
@@ -553,18 +553,24 @@
553
553
  "components.AutoReloadBlocker.description": "Run Strapi with one of the following commands:",
554
554
  "components.AutoReloadBlocker.header": "Reload feature is required for this plugin.",
555
555
  "components.ErrorBoundary.title": "Something went wrong...",
556
- "components.FilterOptions.FILTER_TYPES.$contains": "contains (case sensitive)",
556
+ "components.FilterOptions.FILTER_TYPES.$contains": "contains",
557
+ "components.FilterOptions.FILTER_TYPES.$containsi": "contains (case insensitive)",
557
558
  "components.FilterOptions.FILTER_TYPES.$endsWith": "ends with",
559
+ "components.FilterOptions.FILTER_TYPES.$endsWithi": "ends with (case insensitive)",
558
560
  "components.FilterOptions.FILTER_TYPES.$eq": "is",
561
+ "components.FilterOptions.FILTER_TYPES.$eqi": "is (case insensitive)",
559
562
  "components.FilterOptions.FILTER_TYPES.$gt": "is greater than",
560
563
  "components.FilterOptions.FILTER_TYPES.$gte": "is greater than or equal to",
561
564
  "components.FilterOptions.FILTER_TYPES.$lt": "is lower than",
562
565
  "components.FilterOptions.FILTER_TYPES.$lte": "is lower than or equal to",
563
566
  "components.FilterOptions.FILTER_TYPES.$ne": "is not",
564
- "components.FilterOptions.FILTER_TYPES.$notContains": "does not contain (case sensitive)",
567
+ "components.FilterOptions.FILTER_TYPES.$nei": "is not (case insensitive)",
568
+ "components.FilterOptions.FILTER_TYPES.$notContains": "does not contain",
569
+ "components.FilterOptions.FILTER_TYPES.$notContainsi": "does not contain (case insensitive)",
565
570
  "components.FilterOptions.FILTER_TYPES.$notNull": "is not null",
566
571
  "components.FilterOptions.FILTER_TYPES.$null": "is null",
567
572
  "components.FilterOptions.FILTER_TYPES.$startsWith": "starts with",
573
+ "components.FilterOptions.FILTER_TYPES.$startsWithi": "starts with (case insensitive)",
568
574
  "components.Input.error.attribute.key.taken": "This value already exists",
569
575
  "components.Input.error.attribute.sameKeyAndName": "Can't be equal",
570
576
  "components.Input.error.attribute.taken": "This field name already exists",
@@ -727,7 +733,7 @@
727
733
  "content-manager.containers.ListPage.items": "{number, plural, =0 {items} one {item} other {items}}",
728
734
  "content-manager.containers.ListPage.table-headers.publishedAt": "State",
729
735
  "content-manager.containers.ListPage.selectedEntriesModal.title": "Publish entries",
730
- "content-manager.containers.ListPage.selectedEntriesModal.selectedCount": "<b>{readyToPublishCount}</b> {readyToPublishCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action.",
736
+ "content-manager.containers.ListPage.selectedEntriesModal.selectedCount": "<b>{alreadyPublishedCount}</b> {alreadyPublishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{readyToPublishCount}</b> {readyToPublishCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action.",
731
737
  "content-manager.containers.ListPage.selectedEntriesModal.publishedCount": "<b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} published. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action.",
732
738
  "content-manager.containers.ListSettingsView.modal-form.edit-label": "Edit {fieldName}",
733
739
  "content-manager.containers.SettingPage.add.field": "Insert another field",
@@ -329,18 +329,24 @@
329
329
  "components.AutoReloadBlocker.description": "Inicia Strapi con uno de los siguientes comandos:",
330
330
  "components.AutoReloadBlocker.header": "Es necesario recargar para este plugin.",
331
331
  "components.ErrorBoundary.title": "Algo salió mal...",
332
- "components.FilterOptions.FILTER_TYPES.$contains": "contiene (sensible a mayúsculas y minúsculas)",
332
+ "components.FilterOptions.FILTER_TYPES.$contains": "contiene",
333
+ "components.FilterOptions.FILTER_TYPES.$containsi": "contiene (insensible a mayúsculas y minúsculas)",
333
334
  "components.FilterOptions.FILTER_TYPES.$endsWith": "termina con",
335
+ "components.FilterOptions.FILTER_TYPES.$endsWithi": "termina con (insensible a mayúsculas y minúsculas)",
334
336
  "components.FilterOptions.FILTER_TYPES.$eq": "es",
337
+ "components.FilterOptions.FILTER_TYPES.$eqi": "es (insensible a mayúsculas y minúsculas)",
335
338
  "components.FilterOptions.FILTER_TYPES.$gt": "es mayor que",
336
339
  "components.FilterOptions.FILTER_TYPES.$gte": "es mayor o igual a",
337
340
  "components.FilterOptions.FILTER_TYPES.$lt": "es menor que",
338
341
  "components.FilterOptions.FILTER_TYPES.$lte": "es menor o igual a",
339
342
  "components.FilterOptions.FILTER_TYPES.$ne": "no es",
340
- "components.FilterOptions.FILTER_TYPES.$notContains": "no contiene (sensible a mayúsculas y minúsculas)",
343
+ "components.FilterOptions.FILTER_TYPES.$nei": "no es (insensible a mayúsculas y minúsculas)",
344
+ "components.FilterOptions.FILTER_TYPES.$notContains": "no contiene",
345
+ "components.FilterOptions.FILTER_TYPES.$notContainsi": "no contiene (insensible a mayúsculas y minúsculas)",
341
346
  "components.FilterOptions.FILTER_TYPES.$notNull": "is not null",
342
347
  "components.FilterOptions.FILTER_TYPES.$null": "is null",
343
- "components.FilterOptions.FILTER_TYPES.$startsWith": "starts with",
348
+ "components.FilterOptions.FILTER_TYPES.$startsWith": "comienza con",
349
+ "components.FilterOptions.FILTER_TYPES.$startsWithi": "comienza con (insensible a mayúsculas y minúsculas)",
344
350
  "components.Input.error.attribute.key.taken": "Este valor ya existe",
345
351
  "components.Input.error.attribute.sameKeyAndName": "No puede ser igual",
346
352
  "components.Input.error.attribute.taken": "Este nombre de campo ya existe",
@@ -459,18 +459,24 @@
459
459
  "components.AutoReloadBlocker.description": "Exekutatu Strapi komando hauetako batekin:",
460
460
  "components.AutoReloadBlocker.header": "Plugin honetarako birkargatu eginbidea beharrezkoa da",
461
461
  "components.ErrorBoundary.title": "Zerbait gaizki atera da...",
462
- "components.FilterOptions.FILTER_TYPES.$contains": "da (maiuskulak eta minuskulak bereizten ditu)",
462
+ "components.FilterOptions.FILTER_TYPES.$contains": "da",
463
+ "components.FilterOptions.FILTER_TYPES.$containsi": "da (ez ditu letra larriak eta txikiak bereizten)",
463
464
  "components.FilterOptions.FILTER_TYPES.$endsWith": "honekin bukatzen da",
465
+ "components.FilterOptions.FILTER_TYPES.$endsWithi": "honekin bukatzen da (ez ditu letra larriak eta txikiak bereizten)",
464
466
  "components.FilterOptions.FILTER_TYPES.$eq": "da",
467
+ "components.FilterOptions.FILTER_TYPES.$eqi": "da (ez ditu letra larriak eta txikiak bereizten)",
465
468
  "components.FilterOptions.FILTER_TYPES.$gt": "baino handiagoa da",
466
469
  "components.FilterOptions.FILTER_TYPES.$gte": "baino handiagoa edo berdina da",
467
470
  "components.FilterOptions.FILTER_TYPES.$lt": "baino baxuagoa da",
468
471
  "components.FilterOptions.FILTER_TYPES.$lte": "baino txikiagoa edo berdina da",
469
472
  "components.FilterOptions.FILTER_TYPES.$ne": "ez da",
470
- "components.FilterOptions.FILTER_TYPES.$notContains": "ez dauka (maiuskulak eta minuskulak bereizten ditu)",
473
+ "components.FilterOptions.FILTER_TYPES.$nei": "ez da (ez ditu letra larriak eta txikiak bereizten)",
474
+ "components.FilterOptions.FILTER_TYPES.$notContains": "ez dauka",
475
+ "components.FilterOptions.FILTER_TYPES.$notContainsi": "ez dauka (ez ditu letra larriak eta txikiak bereizten)",
471
476
  "components.FilterOptions.FILTER_TYPES.$notNull": "ez da nulua",
472
477
  "components.FilterOptions.FILTER_TYPES.$null": "nulua da",
473
478
  "components.FilterOptions.FILTER_TYPES.$startsWith": "hasten da",
479
+ "components.FilterOptions.FILTER_TYPES.$startsWithi": "hasten da (ez ditu letra larriak eta txikiak bereizten)",
474
480
  "components.Input.error.attribute.key.taken": "Balio hori existitzen da",
475
481
  "components.Input.error.attribute.sameKeyAndName": "Ezin da berdina izan",
476
482
  "components.Input.error.attribute.taken": "Eremu-izen hau dagoeneko badago",