@strapi/admin 4.5.0 → 4.5.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 (70) hide show
  1. package/admin/src/content-manager/components/DynamicZone/components/{AddComponentButton/index.js → AddComponentButton.js} +12 -6
  2. package/admin/src/content-manager/components/DynamicZone/components/{ComponentPicker/Category/ComponentCard/index.js → ComponentCard.js} +8 -19
  3. package/admin/src/content-manager/components/DynamicZone/components/{ComponentPicker/Category/index.js → ComponentCategory.js} +19 -18
  4. package/admin/src/content-manager/components/DynamicZone/components/{ComponentPicker/index.js → ComponentPicker.js} +36 -38
  5. package/admin/src/content-manager/components/DynamicZone/components/DynamicComponent.js +195 -0
  6. package/admin/src/content-manager/components/DynamicZone/components/{DzLabel/index.js → DynamicZoneLabel.js} +13 -5
  7. package/admin/src/content-manager/components/DynamicZone/index.js +33 -118
  8. package/admin/src/pages/HomePage/index.js +1 -1
  9. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FilterSelect.js +2 -1
  10. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/index.js +1 -0
  11. package/admin/src/translations/pt-BR.json +14 -14
  12. package/admin/src/translations/sv.json +117 -85
  13. package/build/{1856.172d5fa0.chunk.js → 1856.db9f5782.chunk.js} +22 -22
  14. package/build/{2077.058590f4.chunk.js → 2077.fed8c9c3.chunk.js} +7 -7
  15. package/build/{2912.2c42c07b.chunk.js → 2912.fccb2c43.chunk.js} +11 -11
  16. package/build/{9166.90876521.chunk.js → 4610.7614b003.chunk.js} +13 -13
  17. package/build/{4715.22747b59.chunk.js → 4715.8e33d630.chunk.js} +23 -23
  18. package/build/{4982.1b75ddb1.chunk.js → 4982.9e58ea3f.chunk.js} +12 -12
  19. package/build/6925.bb6dd64d.chunk.js +762 -0
  20. package/build/{7379.d246dd38.chunk.js → 7379.e972985f.chunk.js} +1 -1
  21. package/build/{7692.a36fb2c2.chunk.js → 7692.31e83caa.chunk.js} +79 -79
  22. package/build/{7841.c50e9509.chunk.js → 7841.4804bd98.chunk.js} +11 -11
  23. package/build/{7866.ba215f99.chunk.js → 7866.6db2248d.chunk.js} +14 -14
  24. package/build/{8380.e53e7207.chunk.js → 8380.37126e0d.chunk.js} +10 -10
  25. package/build/{8549.832ed79d.chunk.js → 8549.5e5fb6b6.chunk.js} +6 -6
  26. package/build/{8738.0fe8a61e.chunk.js → 8738.5a02bffb.chunk.js} +35 -35
  27. package/build/{9066.eaf76ff3.chunk.js → 9066.5d980488.chunk.js} +5 -5
  28. package/build/9420.7addc099.chunk.js +505 -0
  29. package/build/{9649.468667d9.chunk.js → 9649.b6afc945.chunk.js} +5 -5
  30. package/build/{Admin-authenticatedApp.c4f68103.chunk.js → Admin-authenticatedApp.c07d2a86.chunk.js} +2 -2
  31. package/build/{Admin_marketplace.32375885.chunk.js → Admin_marketplace.444ff7b8.chunk.js} +5 -5
  32. package/build/{admin-app.9049056c.chunk.js → admin-app.b157c10a.chunk.js} +1 -1
  33. package/build/content-manager.f38edbb6.chunk.js +1202 -0
  34. package/build/content-type-builder-translation-pt-BR-json.6fe3b8d1.chunk.js +1 -0
  35. package/build/{email-settings-page.c3469093.chunk.js → email-settings-page.91c925a5.chunk.js} +5 -5
  36. package/build/email-translation-en-json.ebad8943.chunk.js +1 -0
  37. package/build/{i18n-settings-page.46d894ff.chunk.js → i18n-settings-page.4ef64441.chunk.js} +5 -5
  38. package/build/index.html +1 -1
  39. package/build/{main.91328e7a.js → main.ca8b0ee3.js} +791 -707
  40. package/build/pt-BR-json.2b72b1d6.chunk.js +1 -0
  41. package/build/{runtime~main.c9c319c0.js → runtime~main.ede9da1e.js} +1 -1
  42. package/build/sv-json.fb1081ff.chunk.js +1 -0
  43. package/build/{upload-settings.53b690f3.chunk.js → upload-settings.3f7ad973.chunk.js} +5 -5
  44. package/build/{users-advanced-settings-page.3f4ee86e.chunk.js → users-advanced-settings-page.6a838320.chunk.js} +5 -5
  45. package/build/users-permissions-translation-sv-json.d5d11648.chunk.js +1 -0
  46. package/build/{webhook-list-page.02191138.chunk.js → webhook-list-page.a110c462.chunk.js} +5 -5
  47. package/package.json +15 -15
  48. package/server/content-types/api-token.js +1 -1
  49. package/admin/src/content-manager/components/DynamicZone/components/Component/Rectangle.js +0 -19
  50. package/admin/src/content-manager/components/DynamicZone/components/Component/index.js +0 -191
  51. package/admin/src/content-manager/icons/Bold/index.js +0 -22
  52. package/admin/src/content-manager/icons/Code/index.js +0 -13
  53. package/admin/src/content-manager/icons/Cross/index.js +0 -28
  54. package/admin/src/content-manager/icons/Italic/index.js +0 -23
  55. package/admin/src/content-manager/icons/Link/index.js +0 -21
  56. package/admin/src/content-manager/icons/Media/index.js +0 -14
  57. package/admin/src/content-manager/icons/Na/index.js +0 -39
  58. package/admin/src/content-manager/icons/Ol/index.js +0 -13
  59. package/admin/src/content-manager/icons/Quote/index.js +0 -13
  60. package/admin/src/content-manager/icons/Striked/index.js +0 -24
  61. package/admin/src/content-manager/icons/Ul/index.js +0 -15
  62. package/admin/src/content-manager/icons/Underline/index.js +0 -22
  63. package/build/6925.f5c8b6fc.chunk.js +0 -761
  64. package/build/9420.5292d1d2.chunk.js +0 -505
  65. package/build/content-manager.ff998bed.chunk.js +0 -1204
  66. package/build/content-type-builder-translation-pt-BR-json.d6c7fcc1.chunk.js +0 -1
  67. package/build/email-translation-en-json.3d74ff95.chunk.js +0 -1
  68. package/build/pt-BR-json.7852f808.chunk.js +0 -1
  69. package/build/sv-json.8e5a7911.chunk.js +0 -1
  70. package/build/users-permissions-translation-sv-json.83c60841.chunk.js +0 -1
@@ -1,24 +1,22 @@
1
- import React, { memo, useCallback, useMemo, useState, useEffect } from 'react';
1
+ import React, { memo, useMemo, useState } from 'react';
2
2
  import get from 'lodash/get';
3
3
  import isEqual from 'react-fast-compare';
4
4
  import PropTypes from 'prop-types';
5
5
  import { Stack } from '@strapi/design-system/Stack';
6
6
  import { Box } from '@strapi/design-system/Box';
7
7
  import { NotAllowedInput, useNotification } from '@strapi/helper-plugin';
8
+
8
9
  import { getTrad } from '../../utils';
10
+
9
11
  import connect from './utils/connect';
10
12
  import select from './utils/select';
11
- import AddComponentButton from './components/AddComponentButton';
12
- import DzLabel from './components/DzLabel';
13
- import Component from './components/Component';
14
13
 
14
+ import DynamicZoneComponent from './components/DynamicComponent';
15
+ import AddComponentButton from './components/AddComponentButton';
16
+ import DynamicZoneLabel from './components/DynamicZoneLabel';
15
17
  import ComponentPicker from './components/ComponentPicker';
16
- import { useContentTypeLayout } from '../../hooks';
17
18
 
18
- /* eslint-disable react/no-array-index-key */
19
-
20
- const createCollapses = (arrayLength) =>
21
- Array.from({ length: arrayLength }).map(() => ({ isOpen: false }));
19
+ import { useContentTypeLayout } from '../../hooks';
22
20
 
23
21
  const DynamicZone = ({
24
22
  name,
@@ -36,39 +34,16 @@ const DynamicZone = ({
36
34
  fieldSchema,
37
35
  metadatas,
38
36
  }) => {
37
+ const [addComponentIsOpen, setAddComponentIsOpen] = useState(false);
38
+
39
39
  const toggleNotification = useNotification();
40
- const [isOpen, setIsOpen] = useState(false);
41
- const [shouldOpenAddedComponent, setShouldOpenAddedComponent] = useState(false);
42
40
  const { getComponentLayout, components } = useContentTypeLayout();
41
+
43
42
  const dynamicDisplayedComponentsLength = dynamicDisplayedComponents.length;
44
43
  const intlDescription = metadatas.description
45
44
  ? { id: metadatas.description, defaultMessage: metadatas.description }
46
45
  : null;
47
46
 
48
- const [componentCollapses, setComponentsCollapses] = useState(
49
- createCollapses(dynamicDisplayedComponentsLength)
50
- );
51
-
52
- useEffect(() => {
53
- setComponentsCollapses(createCollapses(dynamicDisplayedComponentsLength));
54
- }, [dynamicDisplayedComponentsLength]);
55
-
56
- useEffect(() => {
57
- if (shouldOpenAddedComponent) {
58
- setComponentsCollapses((prev) =>
59
- prev.map((collapse, index) => {
60
- if (index === prev.length - 1) {
61
- return { ...collapse, isOpen: true };
62
- }
63
-
64
- return collapse;
65
- })
66
- );
67
-
68
- setShouldOpenAddedComponent(false);
69
- }
70
- }, [shouldOpenAddedComponent]);
71
-
72
47
  // We cannot use the default props here
73
48
  const { max = Infinity, min = -Infinity } = fieldSchema;
74
49
  const dynamicZoneErrors = useMemo(() => {
@@ -79,8 +54,6 @@ const DynamicZone = ({
79
54
  .map((key) => formErrors[key]);
80
55
  }, [formErrors, name]);
81
56
 
82
- const dynamicZoneAvailableComponents = useMemo(() => fieldSchema.components || [], [fieldSchema]);
83
-
84
57
  const missingComponentNumber = min - dynamicDisplayedComponentsLength;
85
58
  const hasError = dynamicZoneErrors.length > 0;
86
59
 
@@ -90,21 +63,17 @@ const DynamicZone = ({
90
63
  const hasMaxError =
91
64
  hasError && get(dynamicZoneErrors, [0, 'id'], '') === 'components.Input.error.validation.max';
92
65
 
93
- const handleAddComponent = useCallback(
94
- (componentUid) => {
95
- setIsOpen(false);
66
+ const handleAddComponent = (componentUid) => {
67
+ setAddComponentIsOpen(false);
96
68
 
97
- const componentLayoutData = getComponentLayout(componentUid);
69
+ const componentLayoutData = getComponentLayout(componentUid);
98
70
 
99
- addComponentToDynamicZone(name, componentLayoutData, components, hasError);
100
- setShouldOpenAddedComponent(true);
101
- },
102
- [addComponentToDynamicZone, hasError, name, components, getComponentLayout]
103
- );
71
+ addComponentToDynamicZone(name, componentLayoutData, components, hasError);
72
+ };
104
73
 
105
74
  const handleClickOpenPicker = () => {
106
75
  if (dynamicDisplayedComponentsLength < max) {
107
- setIsOpen((prev) => !prev);
76
+ setAddComponentIsOpen((prev) => !prev);
108
77
  } else {
109
78
  toggleNotification({
110
79
  type: 'info',
@@ -113,68 +82,19 @@ const DynamicZone = ({
113
82
  }
114
83
  };
115
84
 
116
- const handleToggleComponent = (indexToToggle) => {
117
- setComponentsCollapses((prev) =>
118
- prev.map(({ isOpen }, index) => {
119
- if (index === indexToToggle) {
120
- return { isOpen: !isOpen };
121
- }
122
-
123
- return { isOpen };
124
- })
125
- );
126
- };
127
-
128
- const handleMoveComponentDown = (name, currentIndex) => {
129
- moveComponentDown(name, currentIndex);
130
- setComponentsCollapses((prev) => {
131
- return prev.map(({ isOpen }, index, refArray) => {
132
- if (index === currentIndex + 1) {
133
- return { isOpen: refArray[currentIndex].isOpen };
134
- }
135
-
136
- if (index === currentIndex) {
137
- return { isOpen: refArray[index + 1].isOpen };
138
- }
139
-
140
- return { isOpen };
141
- });
142
- });
85
+ const handleMoveComponentDown = (name, componentIndex) => () => {
86
+ moveComponentDown(name, componentIndex);
143
87
  };
144
88
 
145
- const handleMoveComponentUp = (name, currentIndex) => {
146
- moveComponentUp(name, currentIndex);
147
- setComponentsCollapses((prev) => {
148
- return prev.map(({ isOpen }, index, refArray) => {
149
- if (index === currentIndex - 1) {
150
- return { isOpen: refArray[currentIndex].isOpen };
151
- }
152
-
153
- if (index === currentIndex) {
154
- return { isOpen: refArray[index - 1].isOpen };
155
- }
156
-
157
- return { isOpen };
158
- });
159
- });
89
+ const handleMoveComponentUp = (name, componentIndex) => () => {
90
+ moveComponentUp(name, componentIndex);
160
91
  };
161
92
 
162
- const handleRemoveComponent = (name, currentIndex) => {
93
+ const handleRemoveComponent = (name, currentIndex) => () => {
163
94
  removeComponentFromDynamicZone(name, currentIndex);
164
95
  };
165
96
 
166
- if (!isFieldAllowed && isCreatingEntry) {
167
- return (
168
- <NotAllowedInput
169
- description={intlDescription}
170
- intlLabel={{ id: metadatas.label, defaultMessage: metadatas.label }}
171
- labelAction={labelAction}
172
- name={name}
173
- />
174
- );
175
- }
176
-
177
- if (!isFieldAllowed && !isFieldReadable && !isCreatingEntry) {
97
+ if (!isFieldAllowed && (isCreatingEntry || (!isFieldReadable && !isCreatingEntry))) {
178
98
  return (
179
99
  <NotAllowedInput
180
100
  description={intlDescription}
@@ -189,7 +109,7 @@ const DynamicZone = ({
189
109
  <Stack spacing={6}>
190
110
  {dynamicDisplayedComponentsLength > 0 && (
191
111
  <Box>
192
- <DzLabel
112
+ <DynamicZoneLabel
193
113
  intlDescription={intlDescription}
194
114
  label={metadatas.label}
195
115
  labelAction={labelAction}
@@ -198,26 +118,21 @@ const DynamicZone = ({
198
118
  required={fieldSchema.required || false}
199
119
  />
200
120
  {dynamicDisplayedComponents.map((componentUid, index) => {
201
- const showDownIcon =
202
- isFieldAllowed &&
203
- dynamicDisplayedComponentsLength > 0 &&
204
- index < dynamicDisplayedComponentsLength - 1;
205
- const showUpIcon = isFieldAllowed && dynamicDisplayedComponentsLength > 0 && index > 0;
206
- const isOpen = componentCollapses[index]?.isOpen || false;
121
+ const showDownIcon = isFieldAllowed && index < dynamicDisplayedComponentsLength - 1;
122
+ const showUpIcon = isFieldAllowed && index > 0;
207
123
 
208
124
  return (
209
- <Component
125
+ <DynamicZoneComponent
210
126
  componentUid={componentUid}
211
127
  formErrors={formErrors}
128
+ // eslint-disable-next-line react/no-array-index-key
212
129
  key={index}
213
130
  index={index}
214
- isOpen={isOpen}
215
131
  isFieldAllowed={isFieldAllowed}
216
- moveComponentDown={handleMoveComponentDown}
217
- moveComponentUp={handleMoveComponentUp}
218
- onToggle={handleToggleComponent}
132
+ onMoveComponentDownClick={handleMoveComponentDown(name, index)}
133
+ onMoveComponentUpClick={handleMoveComponentUp(name, index)}
219
134
  name={name}
220
- removeComponentFromDynamicZone={handleRemoveComponent}
135
+ onRemoveComponentClick={handleRemoveComponent(name, index)}
221
136
  showDownIcon={showDownIcon}
222
137
  showUpIcon={showUpIcon}
223
138
  />
@@ -233,13 +148,13 @@ const DynamicZone = ({
233
148
  isDisabled={!isFieldAllowed}
234
149
  label={metadatas.label}
235
150
  missingComponentNumber={missingComponentNumber}
236
- isOpen={isOpen}
151
+ isOpen={addComponentIsOpen}
237
152
  name={name}
238
153
  onClick={handleClickOpenPicker}
239
154
  />
240
155
  <ComponentPicker
241
- isOpen={isOpen}
242
- components={dynamicZoneAvailableComponents}
156
+ isOpen={addComponentIsOpen}
157
+ components={fieldSchema.components ?? []}
243
158
  onClickAddComponent={handleAddComponent}
244
159
  />
245
160
  </Stack>
@@ -32,7 +32,7 @@ const LogoContainer = styled(Box)`
32
32
  `;
33
33
 
34
34
  const HomePage = () => {
35
- // // Temporary until we develop the menu API
35
+ // Temporary until we develop the menu API
36
36
  const { collectionTypes, singleTypes, isLoading: isLoadingForModels } = useModels();
37
37
  const { guidedTourState, isGuidedTourVisible, isSkipped } = useGuidedTour();
38
38
 
@@ -9,6 +9,7 @@ const FilterSelect = ({ message, value, onChange, possibleFilters, onClear, cust
9
9
 
10
10
  return (
11
11
  <Select
12
+ data-testid={`${message}-button`}
12
13
  aria-label={message}
13
14
  placeholder={message}
14
15
  size="M"
@@ -20,7 +21,7 @@ const FilterSelect = ({ message, value, onChange, possibleFilters, onClear, cust
20
21
  >
21
22
  {Object.entries(possibleFilters).map(([filterName, count]) => {
22
23
  return (
23
- <Option key={filterName} value={filterName}>
24
+ <Option data-testid={`${filterName}-${count}`} key={filterName} value={filterName}>
24
25
  {computeFilterMessage(filterName, count)}
25
26
  </Option>
26
27
  );
@@ -51,6 +51,7 @@ const NpmPackagesFilters = ({
51
51
  <ButtonToggle
52
52
  variant="tertiary"
53
53
  ref={buttonRef}
54
+ data-testid="filters-button"
54
55
  startIcon={<Filter />}
55
56
  onClick={handleToggle}
56
57
  size="S"
@@ -73,7 +73,7 @@
73
73
  "ResetPasswordToken": "Redefinir o token de senha",
74
74
  "Role": "Função",
75
75
  "Roles & Permissions": "Funções e Permissões",
76
- "Roles.ListPage.notification.delete-all-not-allowed": "Algumass funções não puderam ser removidos por estarem associadas a alguns usuários",
76
+ "Roles.ListPage.notification.delete-all-not-allowed": "Algumas funções não puderam ser removidos por estarem associadas a alguns usuários",
77
77
  "Roles.ListPage.notification.delete-not-allowed": "A função não pode ser removida se ainda estiver associada a algum usuário",
78
78
  "Roles.RoleRow.select-all": "Selecione {name} para ações em massa",
79
79
  "Roles.RoleRow.user-count": "{number, plural, =0 {# user} um {# user} outros {# users}}",
@@ -153,7 +153,7 @@
153
153
  "Settings.profile.form.section.experience.clear.select": "Limpar a linguagem da interface selecionada",
154
154
  "Settings.profile.form.section.experience.here": "aqui",
155
155
  "Settings.profile.form.section.experience.interfaceLanguage": "Linguagem da interface",
156
- "Settings.profile.form.section.experience.interfaceLanguage.hint": "Somente sua interface será exibida com a lingaugem selecionada.",
156
+ "Settings.profile.form.section.experience.interfaceLanguage.hint": "Somente sua interface será exibida com a linguagem selecionada.",
157
157
  "Settings.profile.form.section.experience.interfaceLanguageHelp": "A nova linguagem seleciona só será exibida a você. Por favor, leia essa {documentation} para disponibilizar outras linguagens para sua equipe.",
158
158
  "Settings.profile.form.section.experience.mode.label": "Modo de interface",
159
159
  "Settings.profile.form.section.experience.mode.hint": "Selecione o modo de interface que você deseja usar",
@@ -212,7 +212,7 @@
212
212
  "Settings.webhooks.trigger.cancel": "Cancelar disparo",
213
213
  "Settings.webhooks.trigger.pending": "Pendente…",
214
214
  "Settings.webhooks.trigger.save": "Por favor salve para disparar",
215
- "Settings.webhooks.trigger.success": "Successo!",
215
+ "Settings.webhooks.trigger.success": "Sucesso!",
216
216
  "Settings.webhooks.trigger.success.label": "Disparo realizado com sucesso",
217
217
  "Settings.webhooks.trigger.test": "Disparo de teste",
218
218
  "Settings.webhooks.trigger.title": "Salvar antes do Disparo",
@@ -235,7 +235,7 @@
235
235
  "admin.pages.MarketPlacePage.helmet": "Loja - Extensões",
236
236
  "admin.pages.MarketPlacePage.offline.title": "Você está offline",
237
237
  "admin.pages.MarketPlacePage.offline.subtitle": "Você precisa estar online para ver as extensões",
238
- "admin.pages.MarketPlacePage.plugins": "Extenções",
238
+ "admin.pages.MarketPlacePage.plugins": "Extensões",
239
239
  "admin.pages.MarketPlacePage.plugin.copy": "Copiar comando de instalação",
240
240
  "admin.pages.MarketPlacePage.plugin.copy.success": "Comando de instalação pronto para ser colado em seu terminal",
241
241
  "admin.pages.MarketPlacePage.plugin.info": "Saber mais",
@@ -249,10 +249,10 @@
249
249
  "admin.pages.MarketPlacePage.search.empty": "Sem resultado para \"{target}\"",
250
250
  "admin.pages.MarketPlacePage.search.placeholder": "Pesquisar",
251
251
  "admin.pages.MarketPlacePage.submit.plugin.link": "Submeta sua extensão",
252
- "admin.pages.MarketPlacePage.submit.provider.link": "Submit provider",
252
+ "admin.pages.MarketPlacePage.submit.provider.link": "Submeta provedor",
253
253
  "admin.pages.MarketPlacePage.subtitle": "Faça mais com o Strapi",
254
- "admin.pages.MarketPlacePage.tab-group.label": "Plugins and Providers for Strapi",
255
- "admin.pages.MarketPlacePage.missingPlugin.title": "Missing a plugin?",
254
+ "admin.pages.MarketPlacePage.tab-group.label": "Plugins e Provedores para Strapi",
255
+ "admin.pages.MarketPlacePage.missingPlugin.title": "Falta-lhe um plugin?",
256
256
  "admin.pages.MarketPlacePage.missingPlugin.description": "Diga-nos qual extensão você está procurando e informaremos nossos desenvolvedores de extensões da comunidade caso eles estejam em busca de inspiração!",
257
257
  "anErrorOccurred": "Ops! Algo deu errado. Por favor, tente novamente.",
258
258
  "app.component.CopyToClipboard.label": "Copiar pra área de transferência",
@@ -275,7 +275,7 @@
275
275
  "app.components.DownloadInfo.download": "Transferência em andamento...",
276
276
  "app.components.DownloadInfo.text": "Isto poderá levar alguns minutos. Obrigado pela sua paciência",
277
277
  "app.components.EmptyAttributes.title": "Ainda não existem campos",
278
- "app.components.EmptyStateLayout.content-document": "Nenhum conteúdo encontrato",
278
+ "app.components.EmptyStateLayout.content-document": "Nenhum conteúdo encontrado",
279
279
  "app.components.EmptyStateLayout.content-permissions": "Você não tem permissão para acessar esse conteúdo",
280
280
  "app.components.GuidedTour.CM.create.content": "<p>Crie e gerencie todo o conteúdo aqui no Gerenciador de Conteúdos.</p><p>Ex: Levando ainda mais o exemplo do site do Blog, pode-se escrever um artigo, salvá-lo e publicá-lo como quiser.</p><p>💡 Dica rápida - Não se esqueça de clicar em publicar no conteúdo que você criar.</p>",
281
281
  "app.components.GuidedTour.CM.create.title": "⚡️ Crie seu primeiro conteúdo",
@@ -320,7 +320,7 @@
320
320
  "app.components.InputFileDetails.size": "Tamanho:",
321
321
  "app.components.InstallPluginPage.Download.description": "Pode demorar alguns segundos para baixar e instalar a extensão.",
322
322
  "app.components.InstallPluginPage.Download.title": "Baixando...",
323
- "app.components.InstallPluginPage.description": "Extenda seu aplicativo sem esforço.",
323
+ "app.components.InstallPluginPage.description": "Estenda seu aplicativo sem esforço.",
324
324
  "app.components.LeftMenu.collapse": "Recolher barra de navegação",
325
325
  "app.components.LeftMenu.expand": "Expandir barra de navegação",
326
326
  "app.components.LeftMenu.general": "Geral",
@@ -334,7 +334,7 @@
334
334
  "app.components.LeftMenuLinkContainer.collectionTypes": "Tipos de coleção",
335
335
  "app.components.LeftMenuLinkContainer.configuration": "Configurações",
336
336
  "app.components.LeftMenuLinkContainer.general": "Geral",
337
- "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Nehuma extensão instalada ainda",
337
+ "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Nenhuma extensão instalada ainda",
338
338
  "app.components.LeftMenuLinkContainer.plugins": "Extensões",
339
339
  "app.components.LeftMenuLinkContainer.singleTypes": "Tipos singulares",
340
340
  "app.components.ListPluginsPage.deletePlugin.description": "Pode demorar alguns segundos para desinstalar a extensão.",
@@ -357,9 +357,9 @@
357
357
  "app.components.PluginCard.PopUpWarning.install.impossible.autoReload.needed": "O recurso autoReload precisa estar ativado. Por favor, inicie seu aplicativo com `yarn develop`.",
358
358
  "app.components.PluginCard.PopUpWarning.install.impossible.confirm": "Eu compreendo!",
359
359
  "app.components.PluginCard.PopUpWarning.install.impossible.environment": "Por motivos de segurança, uma extensão só pode ser baixada no ambiente de desenvolvimento.",
360
- "app.components.PluginCard.PopUpWarning.install.impossible.title": "Não é possivel baixar",
360
+ "app.components.PluginCard.PopUpWarning.install.impossible.title": "Não é possível baixar",
361
361
  "app.components.PluginCard.compatible": "Compatível com a sua aplicação",
362
- "app.components.PluginCard.compatibleCommunity": "Compativel com a comunidade",
362
+ "app.components.PluginCard.compatibleCommunity": "Compatível com a comunidade",
363
363
  "app.components.PluginCard.more-details": "Mais detalhes",
364
364
  "app.components.ToggleCheckbox.off-label": "Desativado",
365
365
  "app.components.ToggleCheckbox.on-label": "Ativado",
@@ -527,7 +527,7 @@
527
527
  "content-manager.components.NotAllowedInput.text": "Sem permissão para ver esse campo",
528
528
  "content-manager.components.RepeatableComponent.error-message": "Um ou mais componentes contêm erros",
529
529
  "content-manager.components.Search.placeholder": "Buscar registro...",
530
- "content-manager.components.Select.draft-info-title": "Estado: Rasunho",
530
+ "content-manager.components.Select.draft-info-title": "Estado: Rascunho",
531
531
  "content-manager.components.Select.publish-info-title": "Estado: Publicado",
532
532
  "content-manager.components.SettingsViewWrapper.pluginHeader.description.edit-settings": "Customizar visualização de edição.",
533
533
  "content-manager.components.SettingsViewWrapper.pluginHeader.description.list-settings": "Customizar visualização de lista.",
@@ -718,7 +718,7 @@
718
718
  "global.plugins.users-permissions": "Funções e permissões",
719
719
  "global.plugins.users-permissions.description": "Proteja sua API com um processo de autenticação completo baseado em JWT. Esta extensão também vem com uma estratégia de ACL que permite gerenciar as permissões entre os grupos de usuários.",
720
720
  "global.profile": "Perfil",
721
- "global.prompt.unsaved": "Você tem certeza que deseja sair desta página? Todas as suas modificacões serão perdidas",
721
+ "global.prompt.unsaved": "Você tem certeza que deseja sair desta página? Todas as suas modificações serão perdidas",
722
722
  "global.reset-password": "Redefinir senha",
723
723
  "global.roles": "Funções",
724
724
  "global.save": "Salvar",