@plone/volto 19.0.0-alpha.36 → 19.0.0-alpha.37

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 (176) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +1 -1
  3. package/locales/af/LC_MESSAGES/volto.po +29 -3
  4. package/locales/af.json +1 -1
  5. package/locales/ar/LC_MESSAGES/volto.po +29 -3
  6. package/locales/ar.json +1 -1
  7. package/locales/bg/LC_MESSAGES/volto.po +29 -3
  8. package/locales/bg.json +1 -1
  9. package/locales/bn/LC_MESSAGES/volto.po +29 -3
  10. package/locales/bn.json +1 -1
  11. package/locales/ca/LC_MESSAGES/volto.po +32 -6
  12. package/locales/ca.json +1 -1
  13. package/locales/cs/LC_MESSAGES/volto.po +30 -4
  14. package/locales/cs.json +1 -1
  15. package/locales/cy/LC_MESSAGES/volto.po +29 -3
  16. package/locales/cy.json +1 -1
  17. package/locales/da/LC_MESSAGES/volto.po +29 -3
  18. package/locales/da.json +1 -1
  19. package/locales/de/LC_MESSAGES/volto.po +32 -6
  20. package/locales/de.json +1 -1
  21. package/locales/el/LC_MESSAGES/volto.po +29 -3
  22. package/locales/el.json +1 -1
  23. package/locales/en/LC_MESSAGES/volto.po +25 -0
  24. package/locales/en.json +1 -1
  25. package/locales/en_AU/LC_MESSAGES/volto.po +29 -3
  26. package/locales/en_AU.json +1 -1
  27. package/locales/en_GB/LC_MESSAGES/volto.po +29 -3
  28. package/locales/en_GB.json +1 -1
  29. package/locales/eo/LC_MESSAGES/volto.po +29 -3
  30. package/locales/eo.json +1 -1
  31. package/locales/es/LC_MESSAGES/volto.po +30 -5
  32. package/locales/es.json +1 -1
  33. package/locales/et/LC_MESSAGES/volto.po +29 -3
  34. package/locales/et.json +1 -1
  35. package/locales/eu/LC_MESSAGES/volto.po +30 -5
  36. package/locales/eu.json +1 -1
  37. package/locales/fa/LC_MESSAGES/volto.po +29 -3
  38. package/locales/fa.json +1 -1
  39. package/locales/fi/LC_MESSAGES/volto.po +30 -4
  40. package/locales/fi.json +1 -1
  41. package/locales/fr/LC_MESSAGES/volto.po +208 -183
  42. package/locales/fr.json +1 -1
  43. package/locales/fu/LC_MESSAGES/volto.po +29 -3
  44. package/locales/fu.json +1 -1
  45. package/locales/gl/LC_MESSAGES/volto.po +27 -2
  46. package/locales/gl.json +1 -1
  47. package/locales/he/LC_MESSAGES/volto.po +29 -3
  48. package/locales/he.json +1 -1
  49. package/locales/hi/LC_MESSAGES/volto.po +34 -8
  50. package/locales/hi.json +1 -1
  51. package/locales/hr/LC_MESSAGES/volto.po +30 -4
  52. package/locales/hr.json +1 -1
  53. package/locales/hu/LC_MESSAGES/volto.po +29 -3
  54. package/locales/hu.json +1 -1
  55. package/locales/hy/LC_MESSAGES/volto.po +29 -3
  56. package/locales/hy.json +1 -1
  57. package/locales/id/LC_MESSAGES/volto.po +29 -3
  58. package/locales/id.json +1 -1
  59. package/locales/it/LC_MESSAGES/volto.po +29 -4
  60. package/locales/it.json +1 -1
  61. package/locales/ja/LC_MESSAGES/volto.po +29 -3
  62. package/locales/ja.json +1 -1
  63. package/locales/ka/LC_MESSAGES/volto.po +29 -3
  64. package/locales/ka.json +1 -1
  65. package/locales/kn/LC_MESSAGES/volto.po +29 -3
  66. package/locales/kn.json +1 -1
  67. package/locales/ko/LC_MESSAGES/volto.po +29 -3
  68. package/locales/ko.json +1 -1
  69. package/locales/lt/LC_MESSAGES/volto.po +30 -4
  70. package/locales/lt.json +1 -1
  71. package/locales/lv/LC_MESSAGES/volto.po +29 -3
  72. package/locales/lv.json +1 -1
  73. package/locales/mi/LC_MESSAGES/volto.po +29 -3
  74. package/locales/mi.json +1 -1
  75. package/locales/mk/LC_MESSAGES/volto.po +29 -3
  76. package/locales/mk.json +1 -1
  77. package/locales/my/LC_MESSAGES/volto.po +29 -3
  78. package/locales/my.json +1 -1
  79. package/locales/nb_NO/LC_MESSAGES/volto.po +29 -3
  80. package/locales/nb_NO.json +1 -1
  81. package/locales/nl/LC_MESSAGES/volto.po +69 -43
  82. package/locales/nl.json +1 -1
  83. package/locales/nn/LC_MESSAGES/volto.po +29 -3
  84. package/locales/nn.json +1 -1
  85. package/locales/pl/LC_MESSAGES/volto.po +30 -4
  86. package/locales/pl.json +1 -1
  87. package/locales/pt/LC_MESSAGES/volto.po +30 -4
  88. package/locales/pt.json +1 -1
  89. package/locales/pt_BR/LC_MESSAGES/volto.po +54 -29
  90. package/locales/pt_BR.json +1 -1
  91. package/locales/rm/LC_MESSAGES/volto.po +29 -3
  92. package/locales/rm.json +1 -1
  93. package/locales/ro/LC_MESSAGES/volto.po +30 -5
  94. package/locales/ro.json +1 -1
  95. package/locales/ru/LC_MESSAGES/volto.po +30 -4
  96. package/locales/ru.json +1 -1
  97. package/locales/sk/LC_MESSAGES/volto.po +30 -4
  98. package/locales/sk.json +1 -1
  99. package/locales/sl/LC_MESSAGES/volto.po +29 -3
  100. package/locales/sl.json +1 -1
  101. package/locales/sm/LC_MESSAGES/volto.po +29 -3
  102. package/locales/sm.json +1 -1
  103. package/locales/sq/LC_MESSAGES/volto.po +29 -3
  104. package/locales/sq.json +1 -1
  105. package/locales/sr/LC_MESSAGES/volto.po +30 -4
  106. package/locales/sr.json +1 -1
  107. package/locales/sr@cyrl/LC_MESSAGES/volto.po +29 -3
  108. package/locales/sr@cyrl.json +1 -1
  109. package/locales/sr@latn/LC_MESSAGES/volto.po +29 -3
  110. package/locales/sr@latn.json +1 -1
  111. package/locales/sv/LC_MESSAGES/volto.po +31 -5
  112. package/locales/sv.json +1 -1
  113. package/locales/ta/LC_MESSAGES/volto.po +30 -5
  114. package/locales/ta.json +1 -1
  115. package/locales/te/LC_MESSAGES/volto.po +29 -3
  116. package/locales/te.json +1 -1
  117. package/locales/th/LC_MESSAGES/volto.po +29 -3
  118. package/locales/th.json +1 -1
  119. package/locales/to/LC_MESSAGES/volto.po +29 -3
  120. package/locales/to.json +1 -1
  121. package/locales/tr/LC_MESSAGES/volto.po +29 -4
  122. package/locales/tr.json +1 -1
  123. package/locales/uk/LC_MESSAGES/volto.po +30 -4
  124. package/locales/uk.json +1 -1
  125. package/locales/vi/LC_MESSAGES/volto.po +29 -3
  126. package/locales/vi.json +1 -1
  127. package/locales/volto.pot +26 -1
  128. package/locales/zh_CN/LC_MESSAGES/volto.po +29 -4
  129. package/locales/zh_CN.json +1 -1
  130. package/locales/zh_Hant/LC_MESSAGES/volto.po +29 -3
  131. package/locales/zh_Hant.json +1 -1
  132. package/locales/zh_Hant_HK/LC_MESSAGES/volto.po +29 -3
  133. package/locales/zh_Hant_HK.json +1 -1
  134. package/package.json +8 -8
  135. package/src/components/manage/BlockChooser/BlockChooser.jsx +7 -10
  136. package/src/components/manage/Blocks/Block/Edit.jsx +19 -10
  137. package/src/components/manage/Blocks/Block/Order/Item.jsx +9 -4
  138. package/src/components/manage/Contents/DropZoneContent.jsx +1 -0
  139. package/src/components/manage/Controlpanels/BlockType.tsx +2 -3
  140. package/src/components/manage/Controlpanels/ContentTypes.jsx +9 -2
  141. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +58 -5
  142. package/src/components/manage/Controlpanels/Users/UsersControlpanel.ssr.test.jsx +624 -0
  143. package/src/components/manage/Controlpanels/Users/UsersControlpanel.test.jsx +8 -0
  144. package/src/components/manage/Form/Form.jsx +6 -1
  145. package/src/components/manage/Form/ModalForm.jsx +164 -88
  146. package/src/components/manage/Sidebar/ObjectBrowser.jsx +7 -0
  147. package/src/components/manage/Sidebar/ObjectBrowserBody.jsx +7 -3
  148. package/src/components/manage/Sidebar/ObjectBrowserBody.test.jsx +52 -0
  149. package/src/components/manage/Sidebar/Sidebar.jsx +2 -0
  150. package/src/components/manage/Toolbar/Toolbar.jsx +89 -7
  151. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +1 -0
  152. package/src/components/manage/Widgets/TokenWidget.jsx +142 -186
  153. package/src/components/theme/Search/Search.jsx +218 -328
  154. package/src/components/theme/Search/Search.test.jsx +5 -10
  155. package/src/components/theme/Sitemap/Sitemap.jsx +22 -30
  156. package/src/components/theme/Sitemap/Sitemap.test.jsx +18 -0
  157. package/src/config/index.js +1 -0
  158. package/src/helpers/I18n/I18n.test.ts +44 -0
  159. package/src/helpers/I18n/I18n.ts +31 -0
  160. package/src/helpers/index.js +1 -0
  161. package/theme/themes/pastanaga/collections/form.overrides +21 -0
  162. package/theme/themes/pastanaga/elements/button.overrides +30 -3
  163. package/types/components/manage/Controlpanels/Relations/RelationsMatrix.d.ts +1 -1
  164. package/types/components/manage/Controlpanels/Users/UsersControlpanel.d.ts +2 -6
  165. package/types/components/manage/Controlpanels/Users/UsersControlpanel.ssr.test.d.ts +1 -0
  166. package/types/components/manage/Controlpanels/index.d.ts +1 -1
  167. package/types/components/manage/Multilingual/ManageTranslations.d.ts +1 -1
  168. package/types/components/manage/Sidebar/ObjectBrowser.d.ts +1 -1
  169. package/types/components/manage/Sidebar/ObjectBrowserBody.test.d.ts +1 -0
  170. package/types/components/manage/Widgets/ImageWidget.d.ts +1 -1
  171. package/types/components/manage/Widgets/InternalUrlWidget.d.ts +1 -1
  172. package/types/components/manage/Widgets/UrlWidget.d.ts +1 -1
  173. package/types/components/manage/Widgets/index.d.ts +2 -2
  174. package/types/components/theme/Search/Search.d.ts +1 -1
  175. package/types/helpers/I18n/I18n.d.ts +20 -0
  176. package/types/helpers/index.d.ts +1 -0
@@ -3,11 +3,10 @@
3
3
  * @module components/manage/Widgets/TokenWidget
4
4
  */
5
5
 
6
- import React, { Component } from 'react';
6
+ import React, { useEffect, useMemo } from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { compose } from 'redux';
9
- import { connect } from 'react-redux';
10
- import { defineMessages, injectIntl } from 'react-intl';
8
+ import { useSelector, useDispatch } from 'react-redux';
9
+ import { defineMessages, useIntl } from 'react-intl';
11
10
  import {
12
11
  getVocabFromHint,
13
12
  getVocabFromField,
@@ -48,192 +47,149 @@ const messages = defineMessages({
48
47
  * @class TokenWidget
49
48
  * @extends Component
50
49
  */
51
- class TokenWidget extends Component {
52
- /**
53
- * Property types.
54
- * @property {Object} propTypes Property types.
55
- * @static
56
- */
57
- static propTypes = {
58
- id: PropTypes.string.isRequired,
59
- title: PropTypes.string.isRequired,
60
- description: PropTypes.string,
61
- required: PropTypes.bool,
62
- error: PropTypes.arrayOf(PropTypes.string),
63
- getVocabulary: PropTypes.func.isRequired,
64
- choices: PropTypes.arrayOf(PropTypes.object),
65
- vocabLoading: PropTypes.bool,
66
- vocabLoaded: PropTypes.bool,
67
- items: PropTypes.shape({
68
- vocabulary: PropTypes.object,
69
- }),
70
- widgetOptions: PropTypes.shape({
71
- vocabulary: PropTypes.object,
72
- }),
73
- value: PropTypes.arrayOf(PropTypes.string),
74
- onChange: PropTypes.func.isRequired,
75
- wrapped: PropTypes.bool,
76
- placeholder: PropTypes.string,
77
- };
78
-
79
- /**
80
- * Default properties
81
- * @property {Object} defaultProps Default properties.
82
- * @static
83
- */
84
- static defaultProps = {
85
- description: null,
86
- required: false,
87
- items: {
88
- vocabulary: null,
89
- },
90
- widgetOptions: {
91
- vocabulary: null,
92
- },
93
- error: [],
94
- choices: [],
95
- value: null,
96
- };
97
-
98
- /**
99
- * Constructor
100
- * @method constructor
101
- * @param {Object} props Component properties
102
- * @constructs Actions
103
- */
104
- constructor(props) {
105
- super(props);
106
- this.handleChange = this.handleChange.bind(this);
107
- }
108
-
109
- /**
110
- * Component did mount
111
- * @method componentDidMount
112
- * @returns {undefined}
113
- */
114
- componentDidMount() {
115
- if (!this.props.choices?.length) {
116
- this.props.getVocabulary({
117
- vocabNameOrURL: this.props.vocabBaseUrl,
118
- size: -1,
119
- subrequest: this.props.lang,
120
- });
50
+ const TokenWidget = (props) => {
51
+ const {
52
+ id,
53
+ onChange,
54
+ value,
55
+ placeholder,
56
+ reactSelectCreateable,
57
+ isDisabled,
58
+ fieldSet,
59
+ } = props;
60
+
61
+ const intl = useIntl();
62
+ const dispatch = useDispatch();
63
+
64
+ const vocabBaseUrl =
65
+ getVocabFromHint(props) ||
66
+ getVocabFromField(props) ||
67
+ getVocabFromItems(props);
68
+
69
+ const lang = useSelector((state) => state.intl.locale);
70
+
71
+ const vocabState = useSelector((state) => {
72
+ if (!vocabBaseUrl) return null;
73
+ return state.vocabularies?.[vocabBaseUrl]?.subrequests?.[lang];
74
+ });
75
+
76
+ const choices = useMemo(() => {
77
+ if (vocabState?.items) {
78
+ return vocabState.items.map((item) => ({
79
+ label: item.label || item.value,
80
+ value: item.value,
81
+ }));
121
82
  }
122
- }
83
+ return [];
84
+ }, [vocabState]);
123
85
 
124
- componentDidUpdate() {
86
+ const vocabLoading = vocabState?.loading;
87
+ const vocabLoaded = vocabState?.loaded;
88
+
89
+ useEffect(() => {
125
90
  if (
126
- !this.props.choices?.length &&
127
- this.props.vocabLoading === undefined &&
128
- !this.props.vocabLoaded
91
+ !choices?.length &&
92
+ vocabLoading === undefined &&
93
+ !vocabLoaded &&
94
+ vocabBaseUrl
129
95
  ) {
130
- this.props.getVocabulary({
131
- vocabNameOrURL: this.props.vocabBaseUrl,
132
- size: -1,
133
- subrequest: this.props.lang,
134
- });
96
+ dispatch(
97
+ getVocabulary({
98
+ vocabNameOrURL: vocabBaseUrl,
99
+ size: -1,
100
+ subrequest: lang,
101
+ }),
102
+ );
135
103
  }
136
- }
137
-
138
- /**
139
- * Handle the field change, store it in the local state and back to simple
140
- * array of tokens for correct serialization
141
- * @method handleChange
142
- * @param {array} selectedOption The selected options (already aggregated).
143
- * @returns {undefined}
144
- */
145
- handleChange(selectedOption) {
146
- this.props.onChange(
147
- this.props.id,
104
+ }, [
105
+ choices?.length,
106
+ vocabLoading,
107
+ vocabLoaded,
108
+ vocabBaseUrl,
109
+ lang,
110
+ dispatch,
111
+ ]);
112
+
113
+ const handleChange = (selectedOption) => {
114
+ onChange(
115
+ id,
148
116
  selectedOption ? selectedOption.map((item) => item.label) : null,
149
117
  );
150
- }
151
-
152
- /**
153
- * Render method.
154
- * @method render
155
- * @returns {string} Markup for the component.
156
- */
157
- render() {
158
- const selectedOption = this.props.value
159
- ? this.props.value.map((item) => ({ label: item, value: item }))
160
- : [];
161
-
162
- const defaultOptions = (this.props.choices || [])
163
- .filter(
164
- (item) => !selectedOption.find(({ label }) => label === item.label),
165
- )
166
- .map((item) => ({
167
- label: item.label || item.value,
168
- value: item.value,
169
- }));
170
- const CreatableSelect = this.props.reactSelectCreateable.default;
171
-
172
- return (
173
- <FormFieldWrapper {...this.props}>
174
- <CreatableSelect
175
- id={`field-${this.props.id}`}
176
- aria-labelledby={`fieldset-${this.props.fieldSet}-field-label-${this.props.id}`}
177
- key={this.props.id}
178
- menuShouldScrollIntoView={false}
179
- isDisabled={this.props.isDisabled}
180
- className="react-select-container"
181
- classNamePrefix="react-select"
182
- defaultOptions={defaultOptions}
183
- options={defaultOptions}
184
- styles={customSelectStyles}
185
- theme={selectTheme}
186
- components={{
187
- MultiValueContainer,
188
- ClearIndicator,
189
- DropdownIndicator,
190
- Option,
191
- }}
192
- isMulti
193
- value={selectedOption || []}
194
- onChange={this.handleChange}
195
- placeholder={
196
- this.props.placeholder ??
197
- this.props.intl.formatMessage(messages.select)
198
- }
199
- noOptionsMessage={() =>
200
- this.props.intl.formatMessage(messages.no_options)
201
- }
202
- />
203
- </FormFieldWrapper>
204
- );
205
- }
206
- }
207
-
208
- export default compose(
209
- injectIntl,
210
- injectLazyLibs(['reactSelectCreateable']),
211
- connect(
212
- (state, props) => {
213
- const vocabBaseUrl =
214
- getVocabFromHint(props) ||
215
- getVocabFromField(props) ||
216
- getVocabFromItems(props);
217
-
218
- const vocabState =
219
- state.vocabularies?.[vocabBaseUrl]?.subrequests?.[state.intl.locale];
220
-
221
- if (vocabState) {
222
- return {
223
- choices: vocabState.items
224
- ? vocabState.items.map((item) => ({
225
- label: item.label || item.value,
226
- value: item.value,
227
- }))
228
- : [],
229
- vocabLoading: vocabState.loading,
230
- vocabLoaded: vocabState.loaded,
231
- vocabBaseUrl,
232
- lang: state.intl.locale,
233
- };
234
- }
235
- return { vocabBaseUrl, lang: state.intl.locale };
236
- },
237
- { getVocabulary },
238
- ),
239
- )(TokenWidget);
118
+ };
119
+
120
+ const selectedOption = value
121
+ ? value.map((item) => ({ label: item, value: item }))
122
+ : [];
123
+
124
+ const defaultOptions = (choices || [])
125
+ .filter((item) => !selectedOption.find(({ label }) => label === item.label))
126
+ .map((item) => ({
127
+ label: item.label || item.value,
128
+ value: item.value,
129
+ }));
130
+ const CreatableSelect = reactSelectCreateable.default;
131
+
132
+ return (
133
+ <FormFieldWrapper {...props}>
134
+ <CreatableSelect
135
+ id={`field-${id}`}
136
+ aria-labelledby={`fieldset-${fieldSet}-field-label-${id}`}
137
+ key={id}
138
+ menuShouldScrollIntoView={false}
139
+ isDisabled={isDisabled}
140
+ className="react-select-container"
141
+ classNamePrefix="react-select"
142
+ defaultOptions={defaultOptions}
143
+ options={defaultOptions}
144
+ styles={customSelectStyles}
145
+ theme={selectTheme}
146
+ components={{
147
+ MultiValueContainer,
148
+ ClearIndicator,
149
+ DropdownIndicator,
150
+ Option,
151
+ }}
152
+ isMulti
153
+ value={selectedOption || []}
154
+ onChange={handleChange}
155
+ placeholder={placeholder ?? intl.formatMessage(messages.select)}
156
+ noOptionsMessage={() => intl.formatMessage(messages.no_options)}
157
+ />
158
+ </FormFieldWrapper>
159
+ );
160
+ };
161
+
162
+ TokenWidget.propTypes = {
163
+ id: PropTypes.string.isRequired,
164
+ title: PropTypes.string.isRequired,
165
+ description: PropTypes.string,
166
+ required: PropTypes.bool,
167
+ error: PropTypes.arrayOf(PropTypes.string),
168
+ choices: PropTypes.arrayOf(PropTypes.object),
169
+ items: PropTypes.shape({
170
+ vocabulary: PropTypes.object,
171
+ }),
172
+ widgetOptions: PropTypes.shape({
173
+ vocabulary: PropTypes.object,
174
+ }),
175
+ value: PropTypes.arrayOf(PropTypes.string),
176
+ onChange: PropTypes.func.isRequired,
177
+ wrapped: PropTypes.bool,
178
+ placeholder: PropTypes.string,
179
+ };
180
+
181
+ TokenWidget.defaultProps = {
182
+ description: null,
183
+ required: false,
184
+ items: {
185
+ vocabulary: null,
186
+ },
187
+ widgetOptions: {
188
+ vocabulary: null,
189
+ },
190
+ error: [],
191
+ choices: [],
192
+ value: null,
193
+ };
194
+
195
+ export default injectLazyLibs(['reactSelectCreateable'])(TokenWidget);