@plone/volto 18.0.0-alpha.45 → 18.0.0-alpha.47

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 (76) hide show
  1. package/.eslintrc +19 -22
  2. package/CHANGELOG.md +62 -0
  3. package/locales/ca/LC_MESSAGES/volto.po +81 -13
  4. package/locales/ca.json +1 -1
  5. package/locales/de/LC_MESSAGES/volto.po +86 -18
  6. package/locales/de.json +1 -1
  7. package/locales/en/LC_MESSAGES/volto.po +81 -13
  8. package/locales/en.json +1 -1
  9. package/locales/es/LC_MESSAGES/volto.po +81 -13
  10. package/locales/es.json +1 -1
  11. package/locales/eu/LC_MESSAGES/volto.po +81 -13
  12. package/locales/eu.json +1 -1
  13. package/locales/fi/LC_MESSAGES/volto.po +81 -13
  14. package/locales/fi.json +1 -1
  15. package/locales/fr/LC_MESSAGES/volto.po +81 -13
  16. package/locales/fr.json +1 -1
  17. package/locales/hi/LC_MESSAGES/volto.po +81 -13
  18. package/locales/hi.json +1 -1
  19. package/locales/it/LC_MESSAGES/volto.po +81 -13
  20. package/locales/it.json +1 -1
  21. package/locales/ja/LC_MESSAGES/volto.po +81 -13
  22. package/locales/ja.json +1 -1
  23. package/locales/nl/LC_MESSAGES/volto.po +81 -13
  24. package/locales/nl.json +1 -1
  25. package/locales/pt/LC_MESSAGES/volto.po +81 -13
  26. package/locales/pt.json +1 -1
  27. package/locales/pt_BR/LC_MESSAGES/volto.po +81 -13
  28. package/locales/pt_BR.json +1 -1
  29. package/locales/ro/LC_MESSAGES/volto.po +81 -13
  30. package/locales/ro.json +1 -1
  31. package/locales/volto.pot +82 -14
  32. package/locales/zh_CN/LC_MESSAGES/volto.po +81 -13
  33. package/locales/zh_CN.json +1 -1
  34. package/package.json +11 -9
  35. package/razzle.config.js +8 -5
  36. package/src/actions/aliases/aliases.js +27 -7
  37. package/src/actions/aliases/aliases.test.js +1 -1
  38. package/src/components/manage/BlockChooser/BlockChooserSearch.jsx +0 -1
  39. package/src/components/manage/Contents/Contents.jsx +2 -0
  40. package/src/components/manage/Controlpanels/Aliases.jsx +499 -412
  41. package/src/components/manage/Controlpanels/Aliases.test.jsx +7 -0
  42. package/src/components/manage/Controlpanels/DatabaseInformation.jsx +1 -0
  43. package/src/components/manage/Controlpanels/UpgradeControlPanel.jsx +1 -0
  44. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +14 -12
  45. package/src/components/manage/Edit/Edit.jsx +7 -3
  46. package/src/components/manage/Form/ModalForm.jsx +3 -1
  47. package/src/components/manage/Pluggable/Pluggable.test.js +3 -3
  48. package/src/components/manage/Sidebar/ObjectBrowserNav.jsx +1 -0
  49. package/src/components/manage/Toolbar/More.jsx +2 -2
  50. package/src/components/manage/Toolbar/PersonalTools.jsx +7 -7
  51. package/src/components/manage/Toolbar/PersonalTools.test.jsx +71 -0
  52. package/src/components/theme/Icon/Icon.stories.jsx +1 -0
  53. package/src/components/theme/Login/Login.jsx +1 -2
  54. package/src/components/theme/Widgets/ArrayWidget.jsx +2 -2
  55. package/src/constants/ActionTypes.js +1 -0
  56. package/src/express-middleware/static.js +2 -2
  57. package/src/helpers/Api/Api.js +12 -1
  58. package/src/helpers/Html/Html.jsx +1 -0
  59. package/src/middleware/api.js +3 -0
  60. package/src/reducers/content/content.js +12 -0
  61. package/src/start-server.js +2 -5
  62. package/types/actions/aliases/aliases.d.ts +8 -1
  63. package/types/components/manage/Contents/__mocks__/index.d.ts +0 -1
  64. package/types/components/manage/Controlpanels/Relations/RelationsMatrix.d.ts +1 -1
  65. package/types/components/manage/Controlpanels/index.d.ts +0 -1
  66. package/types/components/manage/Form/__mocks__/index.d.ts +0 -1
  67. package/types/components/manage/Form/index.d.ts +0 -1
  68. package/types/components/manage/Multilingual/ManageTranslations.d.ts +1 -1
  69. package/types/components/manage/Sidebar/ObjectBrowser.d.ts +1 -1
  70. package/types/components/manage/Widgets/InternalUrlWidget.d.ts +1 -1
  71. package/types/components/manage/Widgets/UrlWidget.d.ts +1 -1
  72. package/types/components/manage/Widgets/__mocks__/index.d.ts +0 -1
  73. package/types/components/manage/Widgets/index.d.ts +2 -3
  74. package/types/config/slots.d.ts +1 -1
  75. package/types/constants/ActionTypes.d.ts +1 -0
  76. package/types/helpers/Helmet/Helmet.d.ts +1 -1
@@ -57,6 +57,13 @@ describe('Aliases', () => {
57
57
  locale: 'en',
58
58
  messages: {},
59
59
  },
60
+ site: {
61
+ data: {
62
+ features: {
63
+ filter_aliases_by_date: true,
64
+ },
65
+ },
66
+ },
60
67
  });
61
68
  const { container } = render(
62
69
  <Provider store={store}>
@@ -150,6 +150,7 @@ const DatabaseInformation = () => {
150
150
  </Table.Row>
151
151
  </Table.Header>
152
152
  {databaseInformation.cache_detail_length.map((item) => (
153
+ // eslint-disable-next-line react/jsx-key
153
154
  <Table.Row>
154
155
  <Table.Cell>{item.connection}</Table.Cell>
155
156
  <Table.Cell>{item.ngsize}</Table.Cell>
@@ -251,6 +251,7 @@ class UpgradeControlPanel extends Component {
251
251
  <Container>
252
252
  {map(upgradeSteps, (upgradeGroup) => [
253
253
  <UpgradeStep
254
+ key={upgradeGroup[0]}
254
255
  title={upgradeGroup[0]}
255
256
  steps={upgradeGroup[1]}
256
257
  />,
@@ -188,18 +188,20 @@ const UserGroupMembershipMatrix = ({ many_users, many_groups }) => {
188
188
  </Form>
189
189
  {(!many_groups || query_group_filter.length > 1) &&
190
190
  filter_options?.map((filter_option) => (
191
- <Form.Field>
192
- <Checkbox
193
- name={`filter_option_${filter_option.value}`}
194
- key={filter_option.value}
195
- title={filter_option.label}
196
- label={filter_option.label}
197
- defaultChecked={false}
198
- onChange={(event, { checked }) => {
199
- onSelectOptionHandler(filter_option, checked);
200
- }}
201
- />
202
- </Form.Field>
191
+ <React.Fragment key={filter_option.value}>
192
+ <Form.Field>
193
+ <Checkbox
194
+ name={`filter_option_${filter_option.value}`}
195
+ key={filter_option.value}
196
+ title={filter_option.label}
197
+ label={filter_option.label}
198
+ defaultChecked={false}
199
+ onChange={(event, { checked }) => {
200
+ onSelectOptionHandler(filter_option, checked);
201
+ }}
202
+ />
203
+ </Form.Field>
204
+ </React.Fragment>
203
205
  ))}
204
206
  </div>
205
207
  <UserGroupMembershipListing
@@ -346,11 +346,15 @@ class Edit extends Component {
346
346
  <>
347
347
  <Helmet
348
348
  title={
349
- this.props?.schema?.title
349
+ this.props?.content?.title
350
350
  ? this.props.intl.formatMessage(messages.edit, {
351
- title: this.props.schema.title,
351
+ title: this.props?.content?.title,
352
352
  })
353
- : null
353
+ : this.props?.schema?.title
354
+ ? this.props.intl.formatMessage(messages.edit, {
355
+ title: this.props.schema.title,
356
+ })
357
+ : null
354
358
  }
355
359
  >
356
360
  {this.props.content?.language && (
@@ -70,6 +70,7 @@ class ModalForm extends Component {
70
70
  required: PropTypes.arrayOf(PropTypes.string),
71
71
  }).isRequired,
72
72
  title: PropTypes.string.isRequired,
73
+ description: PropTypes.objectOf(PropTypes.any),
73
74
  formData: PropTypes.objectOf(PropTypes.any),
74
75
  submitError: PropTypes.string,
75
76
  onSubmit: PropTypes.func.isRequired,
@@ -211,7 +212,7 @@ class ModalForm extends Component {
211
212
  * @returns {string} Markup for the component.
212
213
  */
213
214
  render() {
214
- const { schema, onCancel } = this.props;
215
+ const { schema, onCancel, description } = this.props;
215
216
  const currentFieldset = schema.fieldsets[this.state.currentTab];
216
217
 
217
218
  const fields = map(currentFieldset.fields, (field) => ({
@@ -245,6 +246,7 @@ class ModalForm extends Component {
245
246
  onSubmit={this.onSubmit}
246
247
  error={state_errors || Boolean(this.props.submitError)}
247
248
  >
249
+ {description}
248
250
  <Message error>
249
251
  {state_errors ? (
250
252
  <FormattedMessage
@@ -57,8 +57,8 @@ describe('<Pluggable />', () => {
57
57
  </header>
58
58
  <div className="pastanaga-menu-list">
59
59
  <ul>
60
- {pluggables.map((p) => (
61
- <>{p()}</>
60
+ {pluggables.map((p, index) => (
61
+ <React.Fragment key={index}>{p()}</React.Fragment>
62
62
  ))}
63
63
  </ul>
64
64
  </div>
@@ -92,7 +92,7 @@ describe('<Pluggable />', () => {
92
92
  <div className="pastanaga-menu-list">
93
93
  <ul>
94
94
  {pluggables.map((p) => (
95
- <>{p()}</>
95
+ <React.Fragment key={p}>{p()}</React.Fragment>
96
96
  ))}
97
97
  </ul>
98
98
  </div>
@@ -51,6 +51,7 @@ const ObjectBrowserNav = ({
51
51
  currentSearchResults.items.map((item) =>
52
52
  view === 'icons' ? (
53
53
  <li
54
+ key={item['@id']}
54
55
  className="image-wrapper"
55
56
  title={`${item['@id']} (${item['@type']})`}
56
57
  >
@@ -311,8 +311,8 @@ const More = (props) => {
311
311
  </header>
312
312
  <div className="pastanaga-menu-list">
313
313
  <ul>
314
- {pluggables.map((p) => (
315
- <>{p()}</>
314
+ {pluggables.map((p, index) => (
315
+ <React.Fragment key={index}>{p()}</React.Fragment>
316
316
  ))}
317
317
  </ul>
318
318
  </div>
@@ -9,11 +9,7 @@ import { FormattedMessage, useIntl, defineMessages } from 'react-intl';
9
9
  import { Icon } from '@plone/volto/components';
10
10
  import { getUser } from '@plone/volto/actions';
11
11
  import { Pluggable } from '@plone/volto/components/manage/Pluggable';
12
- import {
13
- expandToBackendURL,
14
- getBaseUrl,
15
- userHasRoles,
16
- } from '@plone/volto/helpers';
12
+ import { expandToBackendURL, getBaseUrl } from '@plone/volto/helpers';
17
13
  import logoutSVG from '@plone/volto/icons/log-out.svg';
18
14
  import rightArrowSVG from '@plone/volto/icons/right-key.svg';
19
15
  import backSVG from '@plone/volto/icons/back.svg';
@@ -50,7 +46,11 @@ const PersonalTools = (props) => {
50
46
  const token = useSelector((state) => state.userSession.token, shallowEqual);
51
47
  const user = useSelector((state) => state.users.user);
52
48
  const userId = token ? jwtDecode(token).sub : '';
53
-
49
+ const siteSetupAction = useSelector((state) =>
50
+ state.actions?.actions?.user?.find(
51
+ (action) => action?.id === 'plone_setup',
52
+ ),
53
+ );
54
54
  useEffect(() => {
55
55
  dispatch(getUser(userId));
56
56
  }, [dispatch, userId]);
@@ -127,7 +127,7 @@ const PersonalTools = (props) => {
127
127
  </button>
128
128
  </li>
129
129
 
130
- {userHasRoles(user, ['Site Administrator', 'Manager']) && (
130
+ {siteSetupAction && (
131
131
  <li>
132
132
  <Link to="/controlpanel">
133
133
  <FormattedMessage id="Site Setup" defaultMessage="Site Setup" />
@@ -29,6 +29,16 @@ describe('Toolbar Personal Tools component', () => {
29
29
  is_folderish: true,
30
30
  },
31
31
  },
32
+ actions: {
33
+ actions: {
34
+ user: [
35
+ {
36
+ id: 'plone_setup',
37
+ title: 'Site Setup',
38
+ },
39
+ ],
40
+ },
41
+ },
32
42
  intl: {
33
43
  locale: 'en',
34
44
  messages: {},
@@ -70,6 +80,16 @@ describe('Toolbar Personal Tools component', () => {
70
80
  is_folderish: true,
71
81
  },
72
82
  },
83
+ actions: {
84
+ actions: {
85
+ user: [
86
+ {
87
+ id: 'plone_setup',
88
+ title: 'Site Setup',
89
+ },
90
+ ],
91
+ },
92
+ },
73
93
  intl: {
74
94
  locale: 'en',
75
95
  messages: {},
@@ -112,6 +132,57 @@ describe('Toolbar Personal Tools component', () => {
112
132
  is_folderish: true,
113
133
  },
114
134
  },
135
+ actions: {
136
+ actions: {
137
+ user: [
138
+ {
139
+ id: 'plone_setup',
140
+ title: 'Site Setup',
141
+ },
142
+ ],
143
+ },
144
+ },
145
+ intl: {
146
+ locale: 'en',
147
+ messages: {},
148
+ },
149
+ });
150
+ const component = renderer.create(
151
+ <Provider store={store}>
152
+ <PluggablesProvider>
153
+ <MemoryRouter>
154
+ <PersonalTools
155
+ loadComponent={() => {}}
156
+ theToolbar={{
157
+ current: { getBoundingClientRect: () => ({ width: '320' }) },
158
+ }}
159
+ />
160
+ </MemoryRouter>
161
+ </PluggablesProvider>
162
+ </Provider>,
163
+ );
164
+ const json = component.toJSON();
165
+ expect(json).toMatchSnapshot();
166
+ });
167
+
168
+ it('renders an Toolbar Personal Tools component without Site Setup access', () => {
169
+ const store = mockStore({
170
+ users: {
171
+ user: {
172
+ fullname: 'regular_user',
173
+ email: 'user@plone.org',
174
+ roles: ['Member'],
175
+ },
176
+ },
177
+ userSession: {
178
+ token: jwt.sign({ sub: 'regular_user' }, 'secret'),
179
+ },
180
+ content: {
181
+ data: {
182
+ '@type': 'Folder',
183
+ is_folderish: true,
184
+ },
185
+ },
115
186
  intl: {
116
187
  locale: 'en',
117
188
  messages: {},
@@ -43,6 +43,7 @@ const iconElements = Object.keys(icons).map((iconName) => {
43
43
  const icon = icons[iconName];
44
44
  return (
45
45
  <center
46
+ key={icons[iconName]}
46
47
  style={{
47
48
  float: 'left',
48
49
  width: '150px',
@@ -80,9 +80,8 @@ const Login = (props) => {
80
80
  const loading = useSelector((state) => state.userSession.login.loading);
81
81
  const returnUrl =
82
82
  qs.parse(props.location?.search ?? location.search).return_url ||
83
- location.pathname.replace(/\/login\/?$/, '').replace(/\/logout\/?$/, '') ||
83
+ location.pathname.replace(/\/[^/]*\/?$/, '') ||
84
84
  '/';
85
-
86
85
  const previousToken = usePrevious(token);
87
86
 
88
87
  useEffect(() => {
@@ -5,14 +5,14 @@ const ArrayWidget = ({ value, children, className }) =>
5
5
  value ? (
6
6
  <span className={cx(className, 'array', 'widget')}>
7
7
  {value.map((item, key) => (
8
- <>
8
+ <React.Fragment key={item.token}>
9
9
  {key ? ', ' : ''}
10
10
  <span key={item.token || item.title || item}>
11
11
  {children
12
12
  ? children(item.title || item.token || item)
13
13
  : item.title || item.token || item}
14
14
  </span>
15
- </>
15
+ </React.Fragment>
16
16
  ))}
17
17
  </span>
18
18
  ) : (
@@ -138,6 +138,7 @@ export const MOVE_CONTENT_RULE = 'MOVE_CONTENT_RULE';
138
138
  export const GET_ALIASES = 'GET_ALIASES';
139
139
  export const ADD_ALIASES = 'ADD_ALIASES';
140
140
  export const REMOVE_ALIASES = 'REMOVE_ALIASES';
141
+ export const UPLOAD_ALIASES = 'UPLOAD_ALIASES';
141
142
  export const GET_USERSCHEMA = 'GET_USERSCHEMA';
142
143
  export const GET_UPGRADE = 'GET_UPGRADE';
143
144
  export const POST_UPGRADE = 'POST_UPGRADE';
@@ -1,10 +1,10 @@
1
1
  import express from 'express';
2
2
  import path from 'path';
3
- import AddonConfigurationRegistry from '@plone/registry/src/addon-registry';
3
+ import { AddonRegistry } from '@plone/registry/addon-registry';
4
4
  import config from '@plone/volto/registry';
5
5
 
6
6
  const projectRootPath = path.resolve('.');
7
- const registry = new AddonConfigurationRegistry(projectRootPath);
7
+ const { registry } = AddonRegistry.init(projectRootPath);
8
8
 
9
9
  const staticDirectory = () => {
10
10
  if (process.env.BUILD_DIR) {
@@ -50,7 +50,14 @@ class Api {
50
50
  methods.forEach((method) => {
51
51
  this[method] = (
52
52
  path,
53
- { params, data, type, headers = {}, checkUrl = false } = {},
53
+ {
54
+ params,
55
+ data,
56
+ type,
57
+ headers = {},
58
+ checkUrl = false,
59
+ attach = [],
60
+ } = {},
54
61
  ) => {
55
62
  let request;
56
63
  let promise = new Promise((resolve, reject) => {
@@ -88,6 +95,10 @@ class Api {
88
95
  request.send(data);
89
96
  }
90
97
 
98
+ attach.forEach((attachment) => {
99
+ request.attach.apply(request, attachment);
100
+ });
101
+
91
102
  request.end((err, response) => {
92
103
  if (
93
104
  checkUrl &&
@@ -158,6 +158,7 @@ class Html extends Component {
158
158
  }}
159
159
  ></script>
160
160
  {extractor.getStyleElements().map((elem) => (
161
+ // eslint-disable-next-line react/jsx-key
161
162
  <noscript>
162
163
  {React.cloneElement(elem, {
163
164
  rel: 'stylesheet',
@@ -186,6 +186,7 @@ const apiMiddlewareFactory =
186
186
  checkUrl: settings.actions_raising_api_errors.includes(
187
187
  action.type,
188
188
  ),
189
+ attach: item.attach,
189
190
  },
190
191
  ).then((reqres) => {
191
192
  if (action.subrequest === 'batch-upload') {
@@ -205,6 +206,7 @@ const apiMiddlewareFactory =
205
206
  checkUrl: settings.actions_raising_api_errors.includes(
206
207
  action.type,
207
208
  ),
209
+ attach: item.attach,
208
210
  }),
209
211
  ),
210
212
  )
@@ -214,6 +216,7 @@ const apiMiddlewareFactory =
214
216
  headers: request.headers,
215
217
  params: request.params,
216
218
  checkUrl: settings.actions_raising_api_errors.includes(action.type),
219
+ attach: request.attach,
217
220
  });
218
221
  actionPromise.then(
219
222
  (result) => {
@@ -20,6 +20,8 @@ import {
20
20
  UPDATE_UPLOADED_FILES,
21
21
  } from '@plone/volto/constants/ActionTypes';
22
22
 
23
+ import config from '@plone/volto/registry';
24
+
23
25
  const initialState = {
24
26
  create: {
25
27
  loaded: false,
@@ -192,6 +194,16 @@ export default function content(state = initialState, action = {}) {
192
194
  };
193
195
  });
194
196
  }
197
+
198
+ const transforms = config.getUtilities({
199
+ type: 'transform',
200
+ dependencies: { reducer: 'content' },
201
+ });
202
+
203
+ transforms.forEach(({ method }) => {
204
+ method(result);
205
+ });
206
+
195
207
  return action.subrequest
196
208
  ? {
197
209
  ...state,
@@ -18,11 +18,8 @@ export default function server() {
18
18
 
19
19
  server
20
20
  .listen(port, bind_address, () => {
21
- if (app.apiPath === app.publicURL || !app.apiPath) {
22
- console.log(`Volto is running in SEAMLESS mode`);
23
- } else {
24
- console.log(`API server (API_PATH) is set to: ${app.apiPath}`);
25
- }
21
+ console.log(`API server (API_PATH) is set to: ${app.apiPath}`);
22
+
26
23
  if (app.devProxyToApiPath)
27
24
  console.log(
28
25
  `Proxying API requests from ${app.publicURL}/++api++ to ${
@@ -5,7 +5,7 @@
5
5
  * @param {Object} options Options data.
6
6
  * @returns {Object} Get aliases action.
7
7
  */
8
- export function getAliases(url: string, options: any): any;
8
+ export function getAliases(url: string, options?: any): any;
9
9
  /**
10
10
  * Add alias function.
11
11
  * @function addAliases
@@ -22,3 +22,10 @@ export function addAliases(url: string, data: any): any;
22
22
  * @returns {Object} Remove alias action.
23
23
  */
24
24
  export function removeAliases(url: string, data: any): any;
25
+ /**
26
+ * Upload aliases function.
27
+ * @function uploadAliases
28
+ * @param {Object} file CSV file.
29
+ * @returns {Object} Upload aliases action.
30
+ */
31
+ export function uploadAliases(file: any): any;
@@ -1,3 +1,2 @@
1
- /// <reference types="jest" />
2
1
  export declare const Contents: jest.Mock<import("react/jsx-runtime").JSX.Element, [], any>;
3
2
  export declare const ContentsRenameModal: jest.Mock<import("react/jsx-runtime").JSX.Element, [], any>;
@@ -36,7 +36,7 @@ declare const _default: {
36
36
  data: {};
37
37
  block: string;
38
38
  };
39
- contextType?: React.Context<any>;
39
+ contextType?: React.Context<any> | undefined;
40
40
  };
41
41
  export default _default;
42
42
  import React from 'react';
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  export declare const Controlpanels: any;
3
2
  export declare const Controlpanel: import("@loadable/component").LoadableComponent<Omit<import("react-intl").WithIntlProps<import("react-intl").WrappedComponentProps<string>>, "ref"> & import("react").RefAttributes<import("react").ComponentType<import("react-intl").WrappedComponentProps<string>>>>;
4
3
  export declare const RulesControlpanel: import("@loadable/component").LoadableClassComponent<any>;
@@ -1,4 +1,3 @@
1
- /// <reference types="jest" />
2
1
  export declare const Field: jest.Mock<import("react/jsx-runtime").JSX.Element, [props: any], any>;
3
2
  export declare const InlineForm: jest.Mock<import("react/jsx-runtime").JSX.Element, [props: any], any>;
4
3
  export declare const ModalForm: jest.Mock<import("react/jsx-runtime").JSX.Element, [props: any], any>;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  export declare const Field: import("@loadable/component").LoadableComponent<import("react-intl").WithIntlProps<any>>;
3
2
  export declare const InlineForm: import("@loadable/component").LoadableComponent<Omit<import("react-intl").WithIntlProps<any>, "ref"> & import("react").RefAttributes<any>>;
4
3
  export declare const ModalForm: import("@loadable/component").LoadableComponent<import("react-intl").WithIntlProps<any>>;
@@ -36,7 +36,7 @@ declare const _default: {
36
36
  data: {};
37
37
  block: string;
38
38
  };
39
- contextType?: React.Context<any>;
39
+ contextType?: React.Context<any> | undefined;
40
40
  };
41
41
  export default _default;
42
42
  import React from 'react';
@@ -69,6 +69,6 @@ declare function withObjectBrowser(WrappedComponent: any): {
69
69
  data: {};
70
70
  block: string;
71
71
  };
72
- contextType?: React.Context<any>;
72
+ contextType?: React.Context<any> | undefined;
73
73
  };
74
74
  import React from 'react';
@@ -74,7 +74,7 @@ declare const _default: {
74
74
  data: {};
75
75
  block: string;
76
76
  };
77
- contextType?: React.Context<any>;
77
+ contextType?: React.Context<any> | undefined;
78
78
  };
79
79
  export default _default;
80
80
  import React from 'react';
@@ -74,7 +74,7 @@ declare const _default: {
74
74
  data: {};
75
75
  block: string;
76
76
  };
77
- contextType?: React.Context<any>;
77
+ contextType?: React.Context<any> | undefined;
78
78
  };
79
79
  export default _default;
80
80
  import React from 'react';
@@ -1,4 +1,3 @@
1
- /// <reference types="jest" />
2
1
  export declare const AlignWidget: jest.Mock<import("react/jsx-runtime").JSX.Element, [], any>;
3
2
  export declare const ButtonsWidget: jest.Mock<import("react/jsx-runtime").JSX.Element, [], any>;
4
3
  export declare const ArrayWidget: jest.Mock<import("react/jsx-runtime").JSX.Element, [], any>;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  export declare const AlignWidget: import("@loadable/component").LoadableComponent<any>;
3
2
  export declare const ButtonsWidget: import("@loadable/component").LoadableComponent<any>;
4
3
  export declare const ArrayWidget: import("@loadable/component").LoadableClassComponent<any>;
@@ -53,7 +52,7 @@ export declare const UrlWidget: import("@loadable/component").LoadableClassCompo
53
52
  data: {};
54
53
  block: string;
55
54
  };
56
- contextType?: import("react").Context<any>;
55
+ contextType?: import("react").Context<any> | undefined;
57
56
  }>;
58
57
  export declare const InternalUrlWidget: import("@loadable/component").LoadableClassComponent<{
59
58
  new (): {
@@ -93,7 +92,7 @@ export declare const InternalUrlWidget: import("@loadable/component").LoadableCl
93
92
  data: {};
94
93
  block: string;
95
94
  };
96
- contextType?: import("react").Context<any>;
95
+ contextType?: import("react").Context<any> | undefined;
97
96
  }>;
98
97
  export declare const EmailWidget: import("@loadable/component").LoadableComponent<any>;
99
98
  export declare const NumberWidget: import("@loadable/component").LoadableComponent<import("react-intl").WithIntlProps<any>>;
@@ -7,7 +7,7 @@ declare namespace slots {
7
7
  content: {
8
8
  subjects?: any[];
9
9
  };
10
- }): JSX.Element;
10
+ }): JSX.Element | null;
11
11
  propTypes: {
12
12
  content: any;
13
13
  };
@@ -134,6 +134,7 @@ export const MOVE_CONTENT_RULE: "MOVE_CONTENT_RULE";
134
134
  export const GET_ALIASES: "GET_ALIASES";
135
135
  export const ADD_ALIASES: "ADD_ALIASES";
136
136
  export const REMOVE_ALIASES: "REMOVE_ALIASES";
137
+ export const UPLOAD_ALIASES: "UPLOAD_ALIASES";
137
138
  export const GET_USERSCHEMA: "GET_USERSCHEMA";
138
139
  export const GET_UPGRADE: "GET_UPGRADE";
139
140
  export const POST_UPGRADE: "POST_UPGRADE";
@@ -133,6 +133,6 @@ declare const HelmetExport: {
133
133
  peek: any;
134
134
  rewind: () => any;
135
135
  canUseDOM: any;
136
- contextType?: React.Context<any>;
136
+ contextType?: React.Context<any> | undefined;
137
137
  };
138
138
  import React from 'react';