@plone/volto 19.0.0-alpha.35 → 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 (218) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +1 -1
  3. package/locales/af/LC_MESSAGES/volto.po +29 -13
  4. package/locales/af.json +1 -1
  5. package/locales/ar/LC_MESSAGES/volto.po +29 -13
  6. package/locales/ar.json +1 -1
  7. package/locales/bg/LC_MESSAGES/volto.po +29 -13
  8. package/locales/bg.json +1 -1
  9. package/locales/bn/LC_MESSAGES/volto.po +29 -13
  10. package/locales/bn.json +1 -1
  11. package/locales/ca/LC_MESSAGES/volto.po +32 -16
  12. package/locales/ca.json +1 -1
  13. package/locales/cs/LC_MESSAGES/volto.po +30 -14
  14. package/locales/cs.json +1 -1
  15. package/locales/cy/LC_MESSAGES/volto.po +29 -13
  16. package/locales/cy.json +1 -1
  17. package/locales/da/LC_MESSAGES/volto.po +29 -13
  18. package/locales/da.json +1 -1
  19. package/locales/de/LC_MESSAGES/volto.po +32 -16
  20. package/locales/de.json +1 -1
  21. package/locales/el/LC_MESSAGES/volto.po +29 -13
  22. package/locales/el.json +1 -1
  23. package/locales/en/LC_MESSAGES/volto.po +25 -10
  24. package/locales/en.json +1 -1
  25. package/locales/en_AU/LC_MESSAGES/volto.po +29 -13
  26. package/locales/en_AU.json +1 -1
  27. package/locales/en_GB/LC_MESSAGES/volto.po +29 -13
  28. package/locales/en_GB.json +1 -1
  29. package/locales/eo/LC_MESSAGES/volto.po +29 -13
  30. package/locales/eo.json +1 -1
  31. package/locales/es/LC_MESSAGES/volto.po +67 -52
  32. package/locales/es.json +1 -1
  33. package/locales/et/LC_MESSAGES/volto.po +29 -13
  34. package/locales/et.json +1 -1
  35. package/locales/eu/LC_MESSAGES/volto.po +55 -40
  36. package/locales/eu.json +1 -1
  37. package/locales/fa/LC_MESSAGES/volto.po +29 -13
  38. package/locales/fa.json +1 -1
  39. package/locales/fi/LC_MESSAGES/volto.po +30 -14
  40. package/locales/fi.json +1 -1
  41. package/locales/fr/LC_MESSAGES/volto.po +208 -193
  42. package/locales/fr.json +1 -1
  43. package/locales/fu/LC_MESSAGES/volto.po +29 -13
  44. package/locales/fu.json +1 -1
  45. package/locales/gl/LC_MESSAGES/volto.po +58 -43
  46. package/locales/gl.json +1 -1
  47. package/locales/he/LC_MESSAGES/volto.po +29 -13
  48. package/locales/he.json +1 -1
  49. package/locales/hi/LC_MESSAGES/volto.po +34 -18
  50. package/locales/hi.json +1 -1
  51. package/locales/hr/LC_MESSAGES/volto.po +30 -14
  52. package/locales/hr.json +1 -1
  53. package/locales/hu/LC_MESSAGES/volto.po +29 -13
  54. package/locales/hu.json +1 -1
  55. package/locales/hy/LC_MESSAGES/volto.po +29 -13
  56. package/locales/hy.json +1 -1
  57. package/locales/id/LC_MESSAGES/volto.po +29 -13
  58. package/locales/id.json +1 -1
  59. package/locales/it/LC_MESSAGES/volto.po +34 -18
  60. package/locales/it.json +1 -1
  61. package/locales/ja/LC_MESSAGES/volto.po +29 -13
  62. package/locales/ja.json +1 -1
  63. package/locales/ka/LC_MESSAGES/volto.po +29 -13
  64. package/locales/ka.json +1 -1
  65. package/locales/kn/LC_MESSAGES/volto.po +29 -13
  66. package/locales/kn.json +1 -1
  67. package/locales/ko/LC_MESSAGES/volto.po +29 -13
  68. package/locales/ko.json +1 -1
  69. package/locales/lt/LC_MESSAGES/volto.po +30 -14
  70. package/locales/lt.json +1 -1
  71. package/locales/lv/LC_MESSAGES/volto.po +29 -13
  72. package/locales/lv.json +1 -1
  73. package/locales/mi/LC_MESSAGES/volto.po +29 -13
  74. package/locales/mi.json +1 -1
  75. package/locales/mk/LC_MESSAGES/volto.po +29 -13
  76. package/locales/mk.json +1 -1
  77. package/locales/my/LC_MESSAGES/volto.po +29 -13
  78. package/locales/my.json +1 -1
  79. package/locales/nb_NO/LC_MESSAGES/volto.po +29 -13
  80. package/locales/nb_NO.json +1 -1
  81. package/locales/nl/LC_MESSAGES/volto.po +69 -53
  82. package/locales/nl.json +1 -1
  83. package/locales/nn/LC_MESSAGES/volto.po +29 -13
  84. package/locales/nn.json +1 -1
  85. package/locales/pl/LC_MESSAGES/volto.po +30 -14
  86. package/locales/pl.json +1 -1
  87. package/locales/pt/LC_MESSAGES/volto.po +30 -14
  88. package/locales/pt.json +1 -1
  89. package/locales/pt_BR/LC_MESSAGES/volto.po +54 -39
  90. package/locales/pt_BR.json +1 -1
  91. package/locales/rm/LC_MESSAGES/volto.po +29 -13
  92. package/locales/rm.json +1 -1
  93. package/locales/ro/LC_MESSAGES/volto.po +30 -15
  94. package/locales/ro.json +1 -1
  95. package/locales/ru/LC_MESSAGES/volto.po +30 -14
  96. package/locales/ru.json +1 -1
  97. package/locales/sk/LC_MESSAGES/volto.po +30 -14
  98. package/locales/sk.json +1 -1
  99. package/locales/sl/LC_MESSAGES/volto.po +29 -13
  100. package/locales/sl.json +1 -1
  101. package/locales/sm/LC_MESSAGES/volto.po +29 -13
  102. package/locales/sm.json +1 -1
  103. package/locales/sq/LC_MESSAGES/volto.po +29 -13
  104. package/locales/sq.json +1 -1
  105. package/locales/sr/LC_MESSAGES/volto.po +30 -14
  106. package/locales/sr.json +1 -1
  107. package/locales/sr@cyrl/LC_MESSAGES/volto.po +29 -13
  108. package/locales/sr@cyrl.json +1 -1
  109. package/locales/sr@latn/LC_MESSAGES/volto.po +29 -13
  110. package/locales/sr@latn.json +1 -1
  111. package/locales/sv/LC_MESSAGES/volto.po +31 -15
  112. package/locales/sv.json +1 -1
  113. package/locales/ta/LC_MESSAGES/volto.po +30 -15
  114. package/locales/ta.json +1 -1
  115. package/locales/te/LC_MESSAGES/volto.po +29 -13
  116. package/locales/te.json +1 -1
  117. package/locales/th/LC_MESSAGES/volto.po +29 -13
  118. package/locales/th.json +1 -1
  119. package/locales/to/LC_MESSAGES/volto.po +29 -13
  120. package/locales/to.json +1 -1
  121. package/locales/tr/LC_MESSAGES/volto.po +29 -14
  122. package/locales/tr.json +1 -1
  123. package/locales/uk/LC_MESSAGES/volto.po +30 -14
  124. package/locales/uk.json +1 -1
  125. package/locales/vi/LC_MESSAGES/volto.po +29 -13
  126. package/locales/vi.json +1 -1
  127. package/locales/volto.pot +26 -11
  128. package/locales/zh_CN/LC_MESSAGES/volto.po +29 -14
  129. package/locales/zh_CN.json +1 -1
  130. package/locales/zh_Hant/LC_MESSAGES/volto.po +29 -13
  131. package/locales/zh_Hant.json +1 -1
  132. package/locales/zh_Hant_HK/LC_MESSAGES/volto.po +29 -13
  133. package/locales/zh_Hant_HK.json +1 -1
  134. package/package.json +10 -10
  135. package/src/components/manage/Add/Add.test.jsx +10 -3
  136. package/src/components/manage/Aliases/Aliases.test.jsx +5 -2
  137. package/src/components/manage/BlockChooser/BlockChooser.jsx +7 -10
  138. package/src/components/manage/Blocks/Block/Edit.jsx +19 -10
  139. package/src/components/manage/Blocks/Block/Order/Item.jsx +9 -4
  140. package/src/components/manage/Contents/Contents.test.jsx +7 -4
  141. package/src/components/manage/Contents/DropZoneContent.jsx +1 -0
  142. package/src/components/manage/Controlpanels/AddonsControlpanel.test.jsx +7 -4
  143. package/src/components/manage/Controlpanels/Aliases.test.jsx +7 -4
  144. package/src/components/manage/Controlpanels/BlockType.tsx +2 -3
  145. package/src/components/manage/Controlpanels/ContentType.test.jsx +12 -9
  146. package/src/components/manage/Controlpanels/ContentTypeLayout.test.jsx +12 -9
  147. package/src/components/manage/Controlpanels/ContentTypes.jsx +9 -2
  148. package/src/components/manage/Controlpanels/ContentTypes.test.jsx +7 -4
  149. package/src/components/manage/Controlpanels/Controlpanel.test.jsx +7 -4
  150. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +13 -8
  151. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.test.jsx +7 -4
  152. package/src/components/manage/Controlpanels/ModerateComments.test.jsx +7 -4
  153. package/src/components/manage/Controlpanels/Rules/AddRule.test.jsx +7 -4
  154. package/src/components/manage/Controlpanels/Rules/ConfigureRule.test.jsx +9 -6
  155. package/src/components/manage/Controlpanels/Rules/EditRule.test.jsx +7 -4
  156. package/src/components/manage/Controlpanels/Rules/Rules.test.jsx +7 -4
  157. package/src/components/manage/Controlpanels/UndoControlpanel.test.jsx +7 -4
  158. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.test.jsx +7 -4
  159. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +58 -5
  160. package/src/components/manage/Controlpanels/Users/UsersControlpanel.ssr.test.jsx +624 -0
  161. package/src/components/manage/Controlpanels/Users/UsersControlpanel.test.jsx +21 -8
  162. package/src/components/manage/Delete/Delete.test.jsx +13 -8
  163. package/src/components/manage/Diff/Diff.test.jsx +7 -4
  164. package/src/components/manage/Edit/Edit.test.jsx +11 -6
  165. package/src/components/manage/Form/Form.jsx +6 -1
  166. package/src/components/manage/Form/ModalForm.jsx +164 -88
  167. package/src/components/manage/History/History.test.jsx +15 -8
  168. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +7 -4
  169. package/src/components/manage/Multilingual/ManageTranslations.test.jsx +15 -12
  170. package/src/components/manage/Preferences/ChangePassword.test.jsx +7 -4
  171. package/src/components/manage/Preferences/PersonalPreferences.test.jsx +9 -6
  172. package/src/components/manage/Rules/Rules.test.jsx +5 -2
  173. package/src/components/manage/Sharing/Sharing.test.jsx +9 -6
  174. package/src/components/manage/Sidebar/ObjectBrowser.jsx +7 -0
  175. package/src/components/manage/Sidebar/ObjectBrowserBody.jsx +7 -3
  176. package/src/components/manage/Sidebar/ObjectBrowserBody.test.jsx +52 -0
  177. package/src/components/manage/Sidebar/Sidebar.jsx +2 -0
  178. package/src/components/manage/Sidebar/Sidebar.test.jsx +4 -1
  179. package/src/components/manage/Toolbar/Toolbar.jsx +89 -7
  180. package/src/components/manage/Toolbar/Toolbar.test.jsx +15 -10
  181. package/src/components/manage/Widgets/FormFieldWrapper.jsx +7 -5
  182. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +1 -0
  183. package/src/components/manage/Widgets/QuerystringWidget.test.jsx +3 -1
  184. package/src/components/manage/Widgets/TextWidget.jsx +4 -0
  185. package/src/components/manage/Widgets/TokenWidget.jsx +142 -186
  186. package/src/components/theme/App/App.test.jsx +13 -10
  187. package/src/components/theme/ContactForm/ContactForm.test.jsx +13 -8
  188. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.test.jsx +6 -3
  189. package/src/components/theme/Search/Search.jsx +218 -328
  190. package/src/components/theme/Search/Search.test.jsx +14 -14
  191. package/src/components/theme/Sitemap/Sitemap.jsx +22 -30
  192. package/src/components/theme/Sitemap/Sitemap.test.jsx +18 -0
  193. package/src/components/theme/Unauthorized/Unauthorized.jsx +23 -30
  194. package/src/components/theme/Unauthorized/Unauthorized.test.jsx +6 -4
  195. package/src/components/theme/View/View.test.jsx +37 -24
  196. package/src/config/index.js +1 -0
  197. package/src/helpers/Api/Api.js +2 -2
  198. package/src/helpers/I18n/I18n.test.ts +44 -0
  199. package/src/helpers/I18n/I18n.ts +31 -0
  200. package/src/helpers/Robots/Robots.js +1 -1
  201. package/src/helpers/Robots/Robots.test.js +34 -0
  202. package/src/helpers/index.js +1 -0
  203. package/theme/themes/pastanaga/collections/form.overrides +21 -0
  204. package/theme/themes/pastanaga/elements/button.overrides +30 -3
  205. package/types/components/manage/Controlpanels/Relations/RelationsMatrix.d.ts +1 -1
  206. package/types/components/manage/Controlpanels/Users/UsersControlpanel.d.ts +2 -6
  207. package/types/components/manage/Controlpanels/Users/UsersControlpanel.ssr.test.d.ts +1 -0
  208. package/types/components/manage/Controlpanels/index.d.ts +1 -1
  209. package/types/components/manage/Multilingual/ManageTranslations.d.ts +1 -1
  210. package/types/components/manage/Sidebar/ObjectBrowser.d.ts +1 -1
  211. package/types/components/manage/Sidebar/ObjectBrowserBody.test.d.ts +1 -0
  212. package/types/components/manage/Widgets/ImageWidget.d.ts +1 -1
  213. package/types/components/manage/Widgets/InternalUrlWidget.d.ts +1 -1
  214. package/types/components/manage/Widgets/UrlWidget.d.ts +1 -1
  215. package/types/components/manage/Widgets/index.d.ts +2 -2
  216. package/types/components/theme/Search/Search.d.ts +1 -1
  217. package/types/helpers/I18n/I18n.d.ts +20 -0
  218. 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);
@@ -4,6 +4,7 @@ import { Provider } from 'react-intl-redux';
4
4
  import { MemoryRouter } from 'react-router-dom';
5
5
  import renderer from 'react-test-renderer';
6
6
  import configureStore from 'redux-mock-store';
7
+ import { CookiesProvider } from 'react-cookie';
7
8
 
8
9
  import { __test__ as App } from './App';
9
10
 
@@ -55,16 +56,18 @@ describe('App', () => {
55
56
  });
56
57
  const component = renderer.create(
57
58
  <Provider store={store}>
58
- <MemoryRouter initialEntries={['/blog/edit']}>
59
- <App
60
- location={{ pathname: '/blog/edit' }}
61
- route={{
62
- routes: '',
63
- }}
64
- >
65
- <div />
66
- </App>
67
- </MemoryRouter>
59
+ <CookiesProvider>
60
+ <MemoryRouter initialEntries={['/blog/edit']}>
61
+ <App
62
+ location={{ pathname: '/blog/edit' }}
63
+ route={{
64
+ routes: '',
65
+ }}
66
+ >
67
+ <div />
68
+ </App>
69
+ </MemoryRouter>
70
+ </CookiesProvider>
68
71
  </Provider>,
69
72
  );
70
73
  const json = component.toJSON();
@@ -3,6 +3,7 @@ import { render } from '@testing-library/react';
3
3
  import configureStore from 'redux-mock-store';
4
4
  import { Provider } from 'react-intl-redux';
5
5
  import { MemoryRouter } from 'react-router-dom';
6
+ import { CookiesProvider } from 'react-cookie';
6
7
  import ContactForm from './ContactForm';
7
8
 
8
9
  vi.mock('../../manage/Toolbar/Toolbar', () => ({
@@ -29,10 +30,12 @@ describe('Contact form', () => {
29
30
  });
30
31
  const { container } = render(
31
32
  <Provider store={store}>
32
- <MemoryRouter>
33
- <ContactForm />
34
- <div id="toolbar"></div>
35
- </MemoryRouter>
33
+ <CookiesProvider>
34
+ <MemoryRouter>
35
+ <ContactForm />
36
+ <div id="toolbar"></div>
37
+ </MemoryRouter>
38
+ </CookiesProvider>
36
39
  </Provider>,
37
40
  );
38
41
 
@@ -57,10 +60,12 @@ describe('Contact form', () => {
57
60
  });
58
61
  const { container } = render(
59
62
  <Provider store={store}>
60
- <MemoryRouter>
61
- <ContactForm />
62
- <div id="toolbar"></div>
63
- </MemoryRouter>
63
+ <CookiesProvider>
64
+ <MemoryRouter>
65
+ <ContactForm />
66
+ <div id="toolbar"></div>
67
+ </MemoryRouter>
68
+ </CookiesProvider>
64
69
  </Provider>,
65
70
  );
66
71
 
@@ -3,6 +3,7 @@ import renderer from 'react-test-renderer';
3
3
  import configureStore from 'redux-mock-store';
4
4
  import { Provider } from 'react-intl-redux';
5
5
  import { MemoryRouter } from 'react-router-dom';
6
+ import { CookiesProvider } from 'react-cookie';
6
7
 
7
8
  import MultilingualRedirector from './MultilingualRedirector';
8
9
 
@@ -21,9 +22,11 @@ describe('MultilingualRedirector', () => {
21
22
  });
22
23
  const component = renderer.create(
23
24
  <Provider store={store}>
24
- <MemoryRouter>
25
- <MultilingualRedirector pathname={'/'} />
26
- </MemoryRouter>
25
+ <CookiesProvider>
26
+ <MemoryRouter>
27
+ <MultilingualRedirector pathname={'/'} />
28
+ </MemoryRouter>
29
+ </CookiesProvider>
27
30
  </Provider>,
28
31
  );
29
32
  const json = component.toJSON();