@plone/volto 18.0.0-alpha.41 → 18.0.0-alpha.43

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 (187) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/finalreleasechangelog.py +48 -0
  3. package/locales/ca/LC_MESSAGES/volto.po +39 -13
  4. package/locales/ca.json +1 -1
  5. package/locales/de/LC_MESSAGES/volto.po +40 -14
  6. package/locales/de.json +1 -1
  7. package/locales/en/LC_MESSAGES/volto.po +39 -13
  8. package/locales/en.json +1 -1
  9. package/locales/es/LC_MESSAGES/volto.po +40 -14
  10. package/locales/es.json +1 -1
  11. package/locales/eu/LC_MESSAGES/volto.po +40 -14
  12. package/locales/eu.json +1 -1
  13. package/locales/fi/LC_MESSAGES/volto.po +40 -14
  14. package/locales/fi.json +1 -1
  15. package/locales/fr/LC_MESSAGES/volto.po +40 -14
  16. package/locales/fr.json +1 -1
  17. package/locales/hi/LC_MESSAGES/volto.po +40 -14
  18. package/locales/hi.json +1 -1
  19. package/locales/it/LC_MESSAGES/volto.po +40 -14
  20. package/locales/it.json +1 -1
  21. package/locales/ja/LC_MESSAGES/volto.po +39 -13
  22. package/locales/ja.json +1 -1
  23. package/locales/nl/LC_MESSAGES/volto.po +39 -13
  24. package/locales/nl.json +1 -1
  25. package/locales/pt/LC_MESSAGES/volto.po +39 -13
  26. package/locales/pt.json +1 -1
  27. package/locales/pt_BR/LC_MESSAGES/volto.po +40 -14
  28. package/locales/pt_BR.json +1 -1
  29. package/locales/ro/LC_MESSAGES/volto.po +39 -13
  30. package/locales/ro.json +1 -1
  31. package/locales/volto.pot +40 -14
  32. package/locales/zh_CN/LC_MESSAGES/volto.po +40 -14
  33. package/locales/zh_CN.json +1 -1
  34. package/package.json +5 -6
  35. package/razzle.config.js +3 -3
  36. package/src/components/index.js +0 -1
  37. package/src/components/manage/Actions/Actions.stories.jsx +138 -0
  38. package/src/components/manage/Add/Add.jsx +7 -4
  39. package/src/components/manage/BlockChooser/BlockChooser.jsx +9 -1
  40. package/src/components/manage/Blocks/Block/BlocksForm.jsx +5 -0
  41. package/src/components/manage/Blocks/Block/Edit.jsx +24 -8
  42. package/src/components/manage/Blocks/Block/EditBlockWrapper.jsx +17 -1
  43. package/src/components/manage/Blocks/Block/Order/Item.jsx +8 -2
  44. package/src/components/manage/Blocks/Block/Order/Order.jsx +2 -0
  45. package/src/components/manage/Blocks/Container/Data.jsx +10 -2
  46. package/src/components/manage/Blocks/Grid/View.jsx +3 -0
  47. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +10 -2
  48. package/src/components/manage/Blocks/LeadImage/Edit.jsx +74 -126
  49. package/src/components/manage/Blocks/Listing/ListingData.jsx +10 -2
  50. package/src/components/manage/Blocks/Maps/MapsSidebar.jsx +3 -1
  51. package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +2 -0
  52. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +18 -2
  53. package/src/components/manage/Blocks/Search/components/SortOn.jsx +82 -55
  54. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +1 -1
  55. package/src/components/manage/Blocks/Search/widgets/SelectMetadataField.jsx +107 -176
  56. package/src/components/manage/Blocks/Teaser/Data.jsx +10 -2
  57. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +15 -8
  58. package/src/components/manage/Blocks/ToC/Edit.jsx +36 -28
  59. package/src/components/manage/Blocks/Video/Edit.jsx +105 -172
  60. package/src/components/manage/Blocks/Video/Edit.stories.jsx +57 -0
  61. package/src/components/manage/Blocks/Video/VideoSidebar.jsx +3 -1
  62. package/src/components/manage/Contents/Contents.jsx +4 -1
  63. package/src/components/manage/Contents/ContentsBreadcrumbs.stories.jsx +46 -0
  64. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +85 -52
  65. package/src/components/manage/Contents/ContentsUploadModal.jsx +230 -323
  66. package/src/components/manage/Contents/ContentsUploadModal.stories.jsx +56 -0
  67. package/src/components/manage/Controlpanels/AddonsControlpanel.jsx +323 -441
  68. package/src/components/manage/Controlpanels/Aliases.jsx +452 -580
  69. package/src/components/manage/Controlpanels/Aliases.stories.jsx +74 -0
  70. package/src/components/manage/Controlpanels/ContentTypeSchema.jsx +1 -0
  71. package/src/components/manage/Controlpanels/Controlpanel.jsx +41 -2
  72. package/src/components/manage/Controlpanels/Controlpanel.test.jsx +55 -24
  73. package/src/components/manage/Controlpanels/DatabaseInformation.jsx +162 -229
  74. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +74 -122
  75. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +3 -3
  76. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +28 -12
  77. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +12 -4
  78. package/src/components/manage/Display/Display.jsx +92 -148
  79. package/src/components/manage/Display/Display.stories.jsx +46 -0
  80. package/src/components/manage/Edit/Edit.jsx +2 -4
  81. package/src/components/manage/Form/Form.jsx +85 -20
  82. package/src/components/manage/Form/InlineForm.jsx +2 -4
  83. package/src/components/manage/Form/ModalForm.jsx +1 -1
  84. package/src/components/manage/History/History.jsx +1 -1
  85. package/src/components/manage/Pluggable/Pluggable.test.js +1 -1
  86. package/src/components/manage/Preferences/ChangePassword.jsx +94 -172
  87. package/src/components/manage/Preferences/ChangePassword.stories.jsx +41 -0
  88. package/src/components/manage/Preferences/PersonalInformation.jsx +50 -115
  89. package/src/components/manage/Preferences/PersonalPreferences.jsx +46 -100
  90. package/src/components/manage/Preferences/PersonalPreferences.stories.jsx +48 -0
  91. package/src/components/manage/Toolbar/More.jsx +308 -399
  92. package/src/components/manage/Toolbar/Toolbar.jsx +1 -1
  93. package/src/components/manage/Widgets/ArrayWidget.jsx +2 -2
  94. package/src/components/manage/Widgets/DatetimeWidget.jsx +121 -175
  95. package/src/components/manage/Widgets/ImageWidget.jsx +6 -5
  96. package/src/components/manage/Widgets/RecurrenceWidget/EndField.jsx +7 -1
  97. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +80 -31
  98. package/src/components/manage/Widgets/ReferenceWidget.jsx +134 -210
  99. package/src/components/theme/Register/Register.jsx +70 -142
  100. package/src/components/theme/Register/Register.stories.jsx +49 -0
  101. package/src/components/theme/Search/Search.jsx +13 -5
  102. package/src/components/theme/Tags/Tags.jsx +19 -10
  103. package/src/components/theme/Tags/Tags.test.jsx +9 -11
  104. package/src/components/theme/View/AlbumView.jsx +122 -167
  105. package/src/components/theme/View/LinkView.jsx +4 -0
  106. package/src/components/theme/View/LinkView.test.jsx +2 -0
  107. package/src/components/theme/View/View.jsx +0 -13
  108. package/src/components/theme/View/View.test.jsx +0 -3
  109. package/src/config/ControlPanels.js +49 -43
  110. package/src/config/Widgets.jsx +1 -1
  111. package/src/config/config.test.js +1 -0
  112. package/src/config/index.js +23 -2
  113. package/src/config/slots.js +12 -0
  114. package/src/config/validation.ts +155 -0
  115. package/src/helpers/Blocks/Blocks.js +12 -7
  116. package/src/helpers/Blocks/Blocks.test.js +15 -0
  117. package/src/helpers/Blocks/cloneBlocks.ts +1 -1
  118. package/src/helpers/Extensions/withBlockExtensions.jsx +1 -1
  119. package/src/helpers/FormValidation/FormValidation.jsx +128 -172
  120. package/src/helpers/FormValidation/FormValidation.test.js +836 -8
  121. package/src/helpers/FormValidation/validators.ts +203 -0
  122. package/src/helpers/MessageLabels/MessageLabels.js +28 -0
  123. package/src/helpers/Url/Url.test.js +19 -6
  124. package/src/helpers/Url/urlRegex.js +1 -1
  125. package/src/helpers/User/User.js +1 -1
  126. package/src/helpers/index.js +2 -0
  127. package/src/hooks/client/useClient.js +1 -1
  128. package/src/middleware/api.js +4 -2
  129. package/src/middleware/index.js +1 -0
  130. package/src/middleware/userSessionReset.js +46 -0
  131. package/src/store.js +2 -0
  132. package/test-setup-config.jsx +10 -0
  133. package/theme/themes/default/modules/embed.variables +1 -1
  134. package/theme/themes/pastanaga/collections/form.overrides +34 -0
  135. package/theme/themes/pastanaga/extras/blocks.less +6 -0
  136. package/theme/themes/pastanaga/extras/sidebar.less +4 -0
  137. package/theme/themes/pastanaga/extras/toolbar.less +10 -3
  138. package/tsconfig.declarations.json +3 -2
  139. package/types/components/index.d.ts +0 -1
  140. package/types/components/manage/Actions/Actions.stories.d.ts +8 -0
  141. package/types/components/manage/Blocks/Block/Order/Order.d.ts +2 -1
  142. package/types/components/manage/Blocks/LeadImage/Edit.d.ts +14 -5
  143. package/types/components/manage/Blocks/Search/widgets/SelectMetadataField.d.ts +0 -5
  144. package/types/components/manage/Blocks/ToC/Edit.d.ts +1 -6
  145. package/types/components/manage/Blocks/Video/Edit.d.ts +1 -1
  146. package/types/components/manage/Blocks/Video/Edit.stories.d.ts +8 -0
  147. package/types/components/manage/Contents/ContentsBreadcrumbs.stories.d.ts +8 -0
  148. package/types/components/manage/Contents/ContentsUploadModal.d.ts +14 -2
  149. package/types/components/manage/Contents/ContentsUploadModal.stories.d.ts +8 -0
  150. package/types/components/manage/Contents/index.d.ts +1 -1
  151. package/types/components/manage/Controlpanels/AddonsControlpanel.d.ts +2 -2
  152. package/types/components/manage/Controlpanels/Aliases.d.ts +2 -2
  153. package/types/components/manage/Controlpanels/Aliases.stories.d.ts +8 -0
  154. package/types/components/manage/Controlpanels/DatabaseInformation.d.ts +2 -2
  155. package/types/components/manage/Controlpanels/Groups/RenderGroups.d.ts +10 -5
  156. package/types/components/manage/Controlpanels/index.d.ts +4 -4
  157. package/types/components/manage/Display/Display.stories.d.ts +8 -0
  158. package/types/components/manage/Preferences/ChangePassword.d.ts +2 -2
  159. package/types/components/manage/Preferences/ChangePassword.stories.d.ts +8 -0
  160. package/types/components/manage/Preferences/PersonalInformation.d.ts +7 -2
  161. package/types/components/manage/Preferences/PersonalPreferences.d.ts +5 -1
  162. package/types/components/manage/Preferences/PersonalPreferences.stories.d.ts +8 -0
  163. package/types/components/manage/Toolbar/More.d.ts +8 -5
  164. package/types/components/manage/Widgets/DatetimeWidget.d.ts +0 -85
  165. package/types/components/manage/Widgets/DatetimeWidget.stories.d.ts +0 -1
  166. package/types/components/manage/Widgets/ReferenceWidget.d.ts +27 -2
  167. package/types/components/manage/Widgets/index.d.ts +1 -1
  168. package/types/components/theme/Register/Register.d.ts +2 -2
  169. package/types/components/theme/Register/Register.stories.d.ts +9 -0
  170. package/types/components/theme/Tags/Tags.d.ts +15 -7
  171. package/types/components/theme/View/AlbumView.d.ts +3 -17
  172. package/types/config/ControlPanels.d.ts +8 -0
  173. package/types/config/RichTextEditor/ToHTML.d.ts +1 -1
  174. package/types/config/Widgets.d.ts +3 -3
  175. package/types/config/slots.d.ts +21 -0
  176. package/types/config/validation.d.ts +3 -0
  177. package/types/helpers/Blocks/Blocks.d.ts +6 -0
  178. package/types/helpers/Extensions/withBlockExtensions.d.ts +1 -1
  179. package/types/helpers/FormValidation/FormValidation.d.ts +2 -0
  180. package/types/helpers/FormValidation/validators.d.ts +29 -0
  181. package/types/helpers/MessageLabels/MessageLabels.d.ts +36 -0
  182. package/types/helpers/User/User.d.ts +1 -1
  183. package/types/helpers/index.d.ts +2 -2
  184. package/types/middleware/index.d.ts +1 -0
  185. package/types/middleware/userSessionReset.d.ts +5 -0
  186. package/src/components/theme/SocialSharing/SocialSharing.jsx +0 -48
  187. package/src/components/theme/SocialSharing/SocialSharing.test.jsx +0 -14
@@ -1,5 +1,7 @@
1
1
  import FormValidation from './FormValidation';
2
2
  import { messages } from '../MessageLabels/MessageLabels';
3
+ import config from '@plone/volto/registry';
4
+ import { urlValidator } from './validators';
3
5
 
4
6
  const schema = {
5
7
  properties: {
@@ -54,7 +56,7 @@ describe('FormValidation', () => {
54
56
  expect(FormValidation.validateFieldsPerFieldset()).toEqual({});
55
57
  });
56
58
 
57
- it('validates missing required', () => {
59
+ it('required - validates missing', () => {
58
60
  expect(
59
61
  FormValidation.validateFieldsPerFieldset({
60
62
  schema,
@@ -66,7 +68,7 @@ describe('FormValidation', () => {
66
68
  });
67
69
  });
68
70
 
69
- it('do not treat 0 as missing required value', () => {
71
+ it('required - do not treat 0 as missing required value', () => {
70
72
  let newSchema = {
71
73
  ...schema,
72
74
  properties: {
@@ -98,7 +100,7 @@ describe('FormValidation', () => {
98
100
  ).toEqual({});
99
101
  });
100
102
 
101
- it('validates incorrect email', () => {
103
+ it('email - validates incorrect', () => {
102
104
  expect(
103
105
  FormValidation.validateFieldsPerFieldset({
104
106
  schema,
@@ -110,7 +112,7 @@ describe('FormValidation', () => {
110
112
  });
111
113
  });
112
114
 
113
- it('validates correct email', () => {
115
+ it('email - validates', () => {
114
116
  formData.email = 'test@domain.name';
115
117
  expect(
116
118
  FormValidation.validateFieldsPerFieldset({
@@ -120,7 +122,8 @@ describe('FormValidation', () => {
120
122
  }),
121
123
  ).toEqual({});
122
124
  });
123
- it('validates incorrect url', () => {
125
+
126
+ it('url - validates incorrect url', () => {
124
127
  formData.url = 'foo';
125
128
  expect(
126
129
  FormValidation.validateFieldsPerFieldset({
@@ -130,7 +133,8 @@ describe('FormValidation', () => {
130
133
  }),
131
134
  ).toEqual({ url: [messages.isValidURL.defaultMessage] });
132
135
  });
133
- it('validates url', () => {
136
+
137
+ it('url - validates', () => {
134
138
  formData.url = 'https://plone.org/';
135
139
  expect(
136
140
  FormValidation.validateFieldsPerFieldset({
@@ -140,7 +144,8 @@ describe('FormValidation', () => {
140
144
  }),
141
145
  ).toEqual({});
142
146
  });
143
- it('validates url with ip', () => {
147
+
148
+ it('url - validates url with ip', () => {
144
149
  formData.url = 'http://127.0.0.1:8080/Plone';
145
150
  expect(
146
151
  FormValidation.validateFieldsPerFieldset({
@@ -150,7 +155,8 @@ describe('FormValidation', () => {
150
155
  }),
151
156
  ).toEqual({});
152
157
  });
153
- it('validates url with localhost', () => {
158
+
159
+ it('url - validates url with localhost', () => {
154
160
  formData.url = 'http://localhost:8080/Plone';
155
161
  expect(
156
162
  FormValidation.validateFieldsPerFieldset({
@@ -160,5 +166,827 @@ describe('FormValidation', () => {
160
166
  }),
161
167
  ).toEqual({});
162
168
  });
169
+
170
+ it('widget - validator from block - Fails', () => {
171
+ let newSchema = {
172
+ properties: {
173
+ ...schema.properties,
174
+ customField: {
175
+ title: 'Default field',
176
+ description: '',
177
+ widget: 'url',
178
+ },
179
+ },
180
+ required: [],
181
+ };
182
+
183
+ expect(
184
+ FormValidation.validateFieldsPerFieldset({
185
+ schema: newSchema,
186
+ formData: {
187
+ username: 'test username',
188
+ customField: 'asd',
189
+ },
190
+ formatMessage,
191
+ }),
192
+ ).toEqual({
193
+ customField: [messages.isValidURL.defaultMessage],
194
+ });
195
+ });
196
+
197
+ it('type + widget - validator from block - Fails', () => {
198
+ let newSchema = {
199
+ properties: {
200
+ ...schema.properties,
201
+ customField: {
202
+ title: 'Default field',
203
+ description: '',
204
+ type: 'customfieldtype',
205
+ widget: 'url',
206
+ },
207
+ },
208
+ required: [],
209
+ };
210
+ config.registerUtility({
211
+ type: 'validator',
212
+ name: 'alwaysFail',
213
+ dependencies: { fieldType: 'customfieldtype' },
214
+ method: () => 'Fails',
215
+ });
216
+ expect(
217
+ FormValidation.validateFieldsPerFieldset({
218
+ schema: newSchema,
219
+ formData: {
220
+ username: 'test username',
221
+ customField: 'asd',
222
+ },
223
+ formatMessage,
224
+ }),
225
+ ).toEqual({
226
+ customField: ['Fails', messages.isValidURL.defaultMessage],
227
+ });
228
+ });
229
+
230
+ it('widget - validator from content type set - Fails', () => {
231
+ let newSchema = {
232
+ properties: {
233
+ ...schema.properties,
234
+ customField: {
235
+ title: 'Default field',
236
+ description: '',
237
+ widgetOptions: {
238
+ frontendOptions: {
239
+ widget: 'url',
240
+ },
241
+ },
242
+ },
243
+ },
244
+ required: [],
245
+ };
246
+ expect(
247
+ FormValidation.validateFieldsPerFieldset({
248
+ schema: newSchema,
249
+ formData: {
250
+ username: 'test username',
251
+ customField: 'asd',
252
+ },
253
+ formatMessage,
254
+ }),
255
+ ).toEqual({
256
+ customField: [messages.isValidURL.defaultMessage],
257
+ });
258
+ });
259
+
260
+ it('string - min lenght', () => {
261
+ let newSchema = {
262
+ properties: {
263
+ ...schema.properties,
264
+ customField: {
265
+ title: 'password',
266
+ description: '',
267
+ minLength: '8',
268
+ },
269
+ },
270
+ required: [],
271
+ };
272
+ expect(
273
+ FormValidation.validateFieldsPerFieldset({
274
+ schema: newSchema,
275
+ formData: {
276
+ username: 'test username',
277
+ customField: 'asd',
278
+ },
279
+ formatMessage,
280
+ }),
281
+ ).toEqual({
282
+ customField: [messages.minLength.defaultMessage],
283
+ });
284
+ });
285
+
286
+ it('string - max lenght', () => {
287
+ let newSchema = {
288
+ properties: {
289
+ ...schema.properties,
290
+ customField: {
291
+ title: 'password',
292
+ description: '',
293
+ maxLength: '8',
294
+ },
295
+ },
296
+ required: [],
297
+ };
298
+ expect(
299
+ FormValidation.validateFieldsPerFieldset({
300
+ schema: newSchema,
301
+ formData: {
302
+ username: 'test username',
303
+ customField: 'asdasdasdasdasd',
304
+ },
305
+ formatMessage,
306
+ }),
307
+ ).toEqual({
308
+ customField: [messages.maxLength.defaultMessage],
309
+ });
310
+ });
311
+
312
+ it('string - pattern - Fail', () => {
313
+ let newSchema = {
314
+ properties: {
315
+ ...schema.properties,
316
+ customField: {
317
+ title: 'password',
318
+ description: '',
319
+ pattern: '^[a-zA-Z0-9]*$',
320
+ },
321
+ },
322
+ required: [],
323
+ };
324
+ expect(
325
+ FormValidation.validateFieldsPerFieldset({
326
+ schema: newSchema,
327
+ formData: {
328
+ username: 'test username',
329
+ customField: 'as#',
330
+ },
331
+ formatMessage,
332
+ }),
333
+ ).toEqual({
334
+ customField: [messages.pattern.defaultMessage],
335
+ });
336
+ });
337
+
338
+ it('string - pattern - Succeeds', () => {
339
+ let newSchema = {
340
+ properties: {
341
+ ...schema.properties,
342
+ customField: {
343
+ title: 'password',
344
+ description: '',
345
+ pattern: '^[a-zA-Z0-9]*$',
346
+ },
347
+ },
348
+ required: [],
349
+ };
350
+ expect(
351
+ FormValidation.validateFieldsPerFieldset({
352
+ schema: newSchema,
353
+ formData: {
354
+ username: 'test username',
355
+ customField: 'asasd',
356
+ },
357
+ formatMessage,
358
+ }),
359
+ ).toEqual({});
360
+ });
361
+
362
+ it('number - isNumber - fails (not string|number as number)', () => {
363
+ let newSchema = {
364
+ properties: {
365
+ ...schema.properties,
366
+ customField: {
367
+ title: 'Number field',
368
+ type: 'number',
369
+ description: '',
370
+ },
371
+ },
372
+ required: [],
373
+ };
374
+ expect(
375
+ FormValidation.validateFieldsPerFieldset({
376
+ schema: newSchema,
377
+ formData: {
378
+ username: 'test username',
379
+ //since 'number' can accept digits in string & number format hence testing it with an alphabet
380
+ customField: 'n',
381
+ },
382
+ formatMessage,
383
+ }),
384
+ ).toEqual({
385
+ customField: [messages.isNumber.defaultMessage],
386
+ });
387
+ });
388
+
389
+ it('number - isNumber - as string', () => {
390
+ let newSchema = {
391
+ properties: {
392
+ ...schema.properties,
393
+ customField: {
394
+ title: 'Number field',
395
+ type: 'number',
396
+ description: '',
397
+ },
398
+ },
399
+ required: [],
400
+ };
401
+ expect(
402
+ FormValidation.validateFieldsPerFieldset({
403
+ schema: newSchema,
404
+ formData: {
405
+ username: 'test username',
406
+ //since 'number' can accept digits in string & number format hence testing it with an alphabet
407
+ customField: '1',
408
+ },
409
+ formatMessage,
410
+ }),
411
+ ).toEqual({});
412
+ });
413
+
414
+ it('number - isNumber - as number', () => {
415
+ let newSchema = {
416
+ properties: {
417
+ ...schema.properties,
418
+ customField: {
419
+ title: 'Number field',
420
+ type: 'number',
421
+ description: '',
422
+ },
423
+ },
424
+ required: [],
425
+ };
426
+ expect(
427
+ FormValidation.validateFieldsPerFieldset({
428
+ schema: newSchema,
429
+ formData: {
430
+ username: 'test username',
431
+ //since 'number' can accept digits in string & number format hence testing it with an alphabet
432
+ customField: 1,
433
+ },
434
+ formatMessage,
435
+ }),
436
+ ).toEqual({});
437
+ });
438
+
439
+ it('number - minimum', () => {
440
+ let newSchema = {
441
+ properties: {
442
+ ...schema.properties,
443
+ customField: {
444
+ title: 'Number field',
445
+ type: 'number',
446
+ description: '',
447
+ minimum: 8,
448
+ },
449
+ },
450
+ required: [],
451
+ };
452
+ expect(
453
+ FormValidation.validateFieldsPerFieldset({
454
+ schema: newSchema,
455
+ formData: {
456
+ username: 'test username',
457
+ customField: 1,
458
+ },
459
+ formatMessage,
460
+ }),
461
+ ).toEqual({
462
+ customField: [messages.minimum.defaultMessage],
463
+ });
464
+ });
465
+
466
+ it('number - maximum', () => {
467
+ let newSchema = {
468
+ properties: {
469
+ ...schema.properties,
470
+ customField: {
471
+ title: 'Number field',
472
+ type: 'number',
473
+ description: '',
474
+ maximum: 8,
475
+ },
476
+ },
477
+ required: [],
478
+ };
479
+ expect(
480
+ FormValidation.validateFieldsPerFieldset({
481
+ schema: newSchema,
482
+ formData: {
483
+ username: 'test username',
484
+ customField: 10,
485
+ },
486
+ formatMessage,
487
+ }),
488
+ ).toEqual({
489
+ customField: [messages.maximum.defaultMessage],
490
+ });
491
+ });
492
+
493
+ it('integer - isInteger', () => {
494
+ let newSchema = {
495
+ properties: {
496
+ ...schema.properties,
497
+ customField: {
498
+ title: 'Integer field',
499
+ type: 'integer',
500
+ description: '',
501
+ },
502
+ },
503
+ required: [],
504
+ };
505
+ expect(
506
+ FormValidation.validateFieldsPerFieldset({
507
+ schema: newSchema,
508
+ formData: {
509
+ username: 'test username',
510
+ customField: 1.5,
511
+ },
512
+ formatMessage,
513
+ }),
514
+ ).toEqual({
515
+ customField: [messages.isInteger.defaultMessage],
516
+ });
517
+ });
518
+
519
+ it('integer - minimum', () => {
520
+ let newSchema = {
521
+ properties: {
522
+ ...schema.properties,
523
+ customField: {
524
+ title: 'Integer field',
525
+ type: 'integer',
526
+ description: '',
527
+ minimum: 8,
528
+ },
529
+ },
530
+ required: [],
531
+ };
532
+ expect(
533
+ FormValidation.validateFieldsPerFieldset({
534
+ schema: newSchema,
535
+ formData: {
536
+ username: 'test username',
537
+ customField: 1,
538
+ },
539
+ formatMessage,
540
+ }),
541
+ ).toEqual({
542
+ customField: [messages.minimum.defaultMessage],
543
+ });
544
+ });
545
+
546
+ it('integer - maximum', () => {
547
+ let newSchema = {
548
+ properties: {
549
+ ...schema.properties,
550
+ customField: {
551
+ title: 'Integer field',
552
+ type: 'integer',
553
+ description: '',
554
+ maximum: 8,
555
+ },
556
+ },
557
+ required: [],
558
+ };
559
+ expect(
560
+ FormValidation.validateFieldsPerFieldset({
561
+ schema: newSchema,
562
+ formData: {
563
+ username: 'test username',
564
+ customField: 10,
565
+ },
566
+ formatMessage,
567
+ }),
568
+ ).toEqual({
569
+ customField: [messages.maximum.defaultMessage],
570
+ });
571
+ });
572
+
573
+ it('password - min lenght', () => {
574
+ let newSchema = {
575
+ ...schema,
576
+ properties: {
577
+ ...schema.properties,
578
+ password: {
579
+ title: 'password',
580
+ type: 'password',
581
+ description: '',
582
+ minLength: '8',
583
+ },
584
+ },
585
+ required: [],
586
+ };
587
+ expect(
588
+ FormValidation.validateFieldsPerFieldset({
589
+ schema: newSchema,
590
+ formData: { username: 'test username', password: 'asd' },
591
+ formatMessage,
592
+ }),
593
+ ).toEqual({
594
+ password: [messages.minLength.defaultMessage],
595
+ });
596
+ });
597
+
598
+ it('password - max lenght', () => {
599
+ let newSchema = {
600
+ ...schema,
601
+ properties: {
602
+ ...schema.properties,
603
+ password: {
604
+ title: 'password',
605
+ type: 'password',
606
+ description: '',
607
+ maxLength: '8',
608
+ },
609
+ },
610
+ required: [],
611
+ };
612
+ expect(
613
+ FormValidation.validateFieldsPerFieldset({
614
+ schema: newSchema,
615
+ formData: { username: 'test username', password: 'asdasdasdasdasd' },
616
+ formatMessage,
617
+ }),
618
+ ).toEqual({
619
+ password: [messages.maxLength.defaultMessage],
620
+ });
621
+ });
622
+
623
+ it('array - maxItems', () => {
624
+ let newSchema = {
625
+ properties: {
626
+ ...schema.properties,
627
+ customField: {
628
+ title: 'Array field',
629
+ type: 'array',
630
+ description: '',
631
+ maxItems: 1,
632
+ },
633
+ },
634
+ required: [],
635
+ };
636
+ expect(
637
+ FormValidation.validateFieldsPerFieldset({
638
+ schema: newSchema,
639
+ formData: {
640
+ username: 'test username',
641
+ customField: [1, 2],
642
+ },
643
+ formatMessage,
644
+ }),
645
+ ).toEqual({
646
+ customField: [messages.maxItems.defaultMessage],
647
+ });
648
+ });
649
+
650
+ it('array - minItems', () => {
651
+ let newSchema = {
652
+ properties: {
653
+ ...schema.properties,
654
+ customField: {
655
+ title: 'Array field',
656
+ type: 'array',
657
+ description: '',
658
+ minItems: 3,
659
+ },
660
+ },
661
+ required: [],
662
+ };
663
+ expect(
664
+ FormValidation.validateFieldsPerFieldset({
665
+ schema: newSchema,
666
+ formData: {
667
+ username: 'test username',
668
+ customField: [1],
669
+ },
670
+ formatMessage,
671
+ }),
672
+ ).toEqual({
673
+ customField: [messages.minItems.defaultMessage],
674
+ });
675
+ });
676
+
677
+ it('array - uniqueItems', () => {
678
+ let newSchema = {
679
+ properties: {
680
+ ...schema.properties,
681
+ customField: {
682
+ title: 'Array field',
683
+ type: 'array',
684
+ description: '',
685
+ uniqueItems: true,
686
+ },
687
+ },
688
+ required: [],
689
+ };
690
+ expect(
691
+ FormValidation.validateFieldsPerFieldset({
692
+ schema: newSchema,
693
+ formData: {
694
+ username: 'test username',
695
+ customField: [1, 1],
696
+ },
697
+ formatMessage,
698
+ }),
699
+ ).toEqual({
700
+ customField: [messages.uniqueItems.defaultMessage],
701
+ });
702
+ });
703
+
704
+ it('array - uniqueItems - false', () => {
705
+ let newSchema = {
706
+ properties: {
707
+ ...schema.properties,
708
+ customField: {
709
+ title: 'Array field',
710
+ type: 'array',
711
+ description: '',
712
+ uniqueItems: false,
713
+ },
714
+ },
715
+ required: [],
716
+ };
717
+ expect(
718
+ FormValidation.validateFieldsPerFieldset({
719
+ schema: newSchema,
720
+ formData: {
721
+ username: 'test username',
722
+ customField: [1, 1],
723
+ },
724
+ formatMessage,
725
+ }),
726
+ ).toEqual({});
727
+ expect(
728
+ FormValidation.validateFieldsPerFieldset({
729
+ schema: newSchema,
730
+ formData: {
731
+ username: 'test username',
732
+ customField: [1],
733
+ },
734
+ formatMessage,
735
+ }),
736
+ ).toEqual({});
737
+ });
738
+
739
+ it('format - specific validator set - Errors', () => {
740
+ let newSchema = {
741
+ properties: {
742
+ ...schema.properties,
743
+ customField: {
744
+ title: 'Default field',
745
+ description: '',
746
+ format: 'url',
747
+ },
748
+ },
749
+ required: [],
750
+ };
751
+ config.registerUtility({
752
+ type: 'validator',
753
+ name: 'url',
754
+ dependencies: { format: 'url' },
755
+ method: urlValidator,
756
+ });
757
+ expect(
758
+ FormValidation.validateFieldsPerFieldset({
759
+ schema: newSchema,
760
+ formData: {
761
+ username: 'test username',
762
+ customField: 'foo',
763
+ },
764
+ formatMessage,
765
+ }),
766
+ ).toEqual({
767
+ customField: [messages.isValidURL.defaultMessage],
768
+ });
769
+ });
770
+
771
+ it('format - specific validator set - Succeeds', () => {
772
+ let newSchema = {
773
+ properties: {
774
+ ...schema.properties,
775
+ customField: {
776
+ title: 'Default field',
777
+ description: '',
778
+ format: 'url',
779
+ },
780
+ },
781
+ required: [],
782
+ };
783
+ config.registerUtility({
784
+ type: 'validator',
785
+ name: 'url',
786
+ dependencies: { format: 'url' },
787
+ method: urlValidator,
788
+ });
789
+ expect(
790
+ FormValidation.validateFieldsPerFieldset({
791
+ schema: newSchema,
792
+ formData: {
793
+ username: 'test username',
794
+ customField: 'https://plone.org/',
795
+ },
796
+ formatMessage,
797
+ }),
798
+ ).toEqual({});
799
+ });
800
+
801
+ it('format - specific validator from content type set - Fails', () => {
802
+ let newSchema = {
803
+ properties: {
804
+ ...schema.properties,
805
+ customField: {
806
+ title: 'Default field',
807
+ description: '',
808
+ widgetOptions: {
809
+ frontendOptions: {
810
+ format: 'url',
811
+ },
812
+ },
813
+ },
814
+ },
815
+ required: [],
816
+ };
817
+ config.registerUtility({
818
+ type: 'validator',
819
+ name: 'url',
820
+ dependencies: { format: 'url' },
821
+ method: urlValidator,
822
+ });
823
+ expect(
824
+ FormValidation.validateFieldsPerFieldset({
825
+ schema: newSchema,
826
+ formData: {
827
+ username: 'test username',
828
+ customField: 'asdasd',
829
+ },
830
+ formatMessage,
831
+ }),
832
+ ).toEqual({
833
+ customField: [messages.isValidURL.defaultMessage],
834
+ });
835
+ });
836
+
837
+ it('format - specific validator from content type set - Succeeds', () => {
838
+ let newSchema = {
839
+ properties: {
840
+ ...schema.properties,
841
+ customField: {
842
+ title: 'Default field',
843
+ description: '',
844
+ widgetOptions: {
845
+ frontendOptions: {
846
+ format: 'url',
847
+ },
848
+ },
849
+ },
850
+ },
851
+ required: [],
852
+ };
853
+ config.registerUtility({
854
+ type: 'validator',
855
+ name: 'url',
856
+ dependencies: { format: 'url' },
857
+ method: urlValidator,
858
+ });
859
+ expect(
860
+ FormValidation.validateFieldsPerFieldset({
861
+ schema: newSchema,
862
+ formData: {
863
+ username: 'test username',
864
+ customField: 'https://plone.org/',
865
+ },
866
+ formatMessage,
867
+ }),
868
+ ).toEqual({});
869
+ });
870
+
871
+ it('behavior + fieldName - Fails', () => {
872
+ let newSchema = {
873
+ properties: {
874
+ ...schema.properties,
875
+ customField: {
876
+ behavior: 'plone.eventbasic',
877
+ title: 'Default field',
878
+ description: '',
879
+ },
880
+ },
881
+ required: [],
882
+ };
883
+ config.registerUtility({
884
+ type: 'validator',
885
+ name: 'url',
886
+ dependencies: {
887
+ behaviorName: 'plone.eventbasic',
888
+ fieldName: 'customField',
889
+ format: 'url',
890
+ },
891
+ method: urlValidator,
892
+ });
893
+ expect(
894
+ FormValidation.validateFieldsPerFieldset({
895
+ schema: newSchema,
896
+ formData: {
897
+ username: 'test username',
898
+ customField: 'asd',
899
+ },
900
+ formatMessage,
901
+ }),
902
+ ).toEqual({
903
+ customField: [messages.isValidURL.defaultMessage],
904
+ });
905
+ });
906
+
907
+ it('behavior + fieldName - start date in Event - Fails', () => {
908
+ let contentTypeSchema = {
909
+ properties: {
910
+ ...schema.properties,
911
+ start: {
912
+ behavior: 'plone.eventbasic',
913
+ type: 'string',
914
+ title: 'Start date',
915
+ description: '',
916
+ },
917
+ },
918
+ required: [],
919
+ };
920
+ expect(
921
+ FormValidation.validateFieldsPerFieldset({
922
+ schema: contentTypeSchema,
923
+ formData: {
924
+ start: '2024-08-01T11:00:00+00:00',
925
+ end: '2024-04-01T11:00:00+00:00',
926
+ },
927
+ formatMessage,
928
+ }),
929
+ ).toEqual({
930
+ start: [messages.startEventRange.defaultMessage],
931
+ });
932
+ });
933
+
934
+ it('behavior + fieldName - end date in Event - Fails', () => {
935
+ let contentTypeSchema = {
936
+ properties: {
937
+ ...schema.properties,
938
+ end: {
939
+ behavior: 'plone.eventbasic',
940
+ type: 'string',
941
+ title: 'End date',
942
+ description: '',
943
+ },
944
+ },
945
+ required: [],
946
+ };
947
+ expect(
948
+ FormValidation.validateFieldsPerFieldset({
949
+ schema: contentTypeSchema,
950
+ formData: {
951
+ start: '2024-08-01T11:00:00+00:00',
952
+ end: '2024-04-01T11:00:00+00:00',
953
+ },
954
+ formatMessage,
955
+ }),
956
+ ).toEqual({
957
+ end: [messages.endEventRange.defaultMessage],
958
+ });
959
+ });
960
+
961
+ it('block - per block type and fieldID specific - Fails', () => {
962
+ let newSchema = {
963
+ properties: {
964
+ ...schema.properties,
965
+ customField: {
966
+ title: 'Default field',
967
+ description: '',
968
+ },
969
+ },
970
+ required: [],
971
+ };
972
+ config.registerUtility({
973
+ type: 'validator',
974
+ dependencies: { blockType: 'slider', fieldName: 'customField' },
975
+ method: urlValidator,
976
+ });
977
+ expect(
978
+ FormValidation.validateFieldsPerFieldset({
979
+ schema: newSchema,
980
+ formData: {
981
+ '@type': 'slider',
982
+ username: 'test username',
983
+ customField: 'asd',
984
+ },
985
+ formatMessage,
986
+ }),
987
+ ).toEqual({
988
+ customField: [messages.isValidURL.defaultMessage],
989
+ });
990
+ });
163
991
  });
164
992
  });