@plone/volto 18.0.0-alpha.40 → 18.0.0-alpha.42

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 (102) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/locales/ca/LC_MESSAGES/volto.po +31 -1
  3. package/locales/ca.json +1 -1
  4. package/locales/de/LC_MESSAGES/volto.po +31 -1
  5. package/locales/de.json +1 -1
  6. package/locales/en/LC_MESSAGES/volto.po +31 -1
  7. package/locales/en.json +1 -1
  8. package/locales/es/LC_MESSAGES/volto.po +31 -1
  9. package/locales/es.json +1 -1
  10. package/locales/eu/LC_MESSAGES/volto.po +31 -1
  11. package/locales/eu.json +1 -1
  12. package/locales/fi/LC_MESSAGES/volto.po +31 -1
  13. package/locales/fi.json +1 -1
  14. package/locales/fr/LC_MESSAGES/volto.po +31 -1
  15. package/locales/fr.json +1 -1
  16. package/locales/hi/LC_MESSAGES/volto.po +31 -1
  17. package/locales/hi.json +1 -1
  18. package/locales/it/LC_MESSAGES/volto.po +31 -1
  19. package/locales/it.json +1 -1
  20. package/locales/ja/LC_MESSAGES/volto.po +31 -1
  21. package/locales/ja.json +1 -1
  22. package/locales/nl/LC_MESSAGES/volto.po +31 -1
  23. package/locales/nl.json +1 -1
  24. package/locales/pt/LC_MESSAGES/volto.po +31 -1
  25. package/locales/pt.json +1 -1
  26. package/locales/pt_BR/LC_MESSAGES/volto.po +31 -1
  27. package/locales/pt_BR.json +1 -1
  28. package/locales/ro/LC_MESSAGES/volto.po +31 -1
  29. package/locales/ro.json +1 -1
  30. package/locales/volto.pot +32 -2
  31. package/locales/zh_CN/LC_MESSAGES/volto.po +31 -1
  32. package/locales/zh_CN.json +1 -1
  33. package/package.json +4 -5
  34. package/razzle.config.js +2 -2
  35. package/src/components/index.js +0 -1
  36. package/src/components/manage/AnchorPlugin/components/LinkButton/AddLinkForm.jsx +1 -1
  37. package/src/components/manage/AnchorPlugin/useLinkEditor.jsx +21 -21
  38. package/src/components/manage/Blocks/Block/BlocksForm.jsx +5 -0
  39. package/src/components/manage/Blocks/Block/Order/Item.jsx +6 -2
  40. package/src/components/manage/Blocks/Block/Order/Order.jsx +2 -0
  41. package/src/components/manage/Blocks/Container/Data.jsx +10 -2
  42. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +10 -2
  43. package/src/components/manage/Blocks/Listing/ListingData.jsx +10 -2
  44. package/src/components/manage/Blocks/Maps/MapsSidebar.jsx +3 -1
  45. package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +2 -0
  46. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +18 -2
  47. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +1 -1
  48. package/src/components/manage/Blocks/Teaser/Data.jsx +10 -2
  49. package/src/components/manage/Blocks/ToC/Edit.jsx +1 -0
  50. package/src/components/manage/Blocks/Video/Edit.jsx +1 -1
  51. package/src/components/manage/Blocks/Video/VideoSidebar.jsx +3 -1
  52. package/src/components/manage/Contents/Contents.jsx +1 -1
  53. package/src/components/manage/Controlpanels/ContentTypeSchema.jsx +1 -0
  54. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +3 -3
  55. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +28 -12
  56. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +12 -4
  57. package/src/components/manage/Form/Form.jsx +85 -20
  58. package/src/components/manage/Form/InlineForm.jsx +4 -6
  59. package/src/components/manage/Form/ModalForm.jsx +1 -1
  60. package/src/components/manage/History/History.jsx +1 -1
  61. package/src/components/manage/Pluggable/Pluggable.test.js +1 -1
  62. package/src/components/manage/Toolbar/Toolbar.jsx +1 -1
  63. package/src/components/manage/Widgets/ArrayWidget.jsx +2 -2
  64. package/src/components/manage/Widgets/ImageWidget.jsx +34 -10
  65. package/src/components/manage/Widgets/RecurrenceWidget/EndField.jsx +7 -1
  66. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +80 -31
  67. package/src/components/theme/Login/Login.jsx +25 -4
  68. package/src/components/theme/Logout/Logout.jsx +2 -2
  69. package/src/components/theme/Search/Search.jsx +13 -5
  70. package/src/components/theme/View/View.jsx +0 -7
  71. package/src/components/theme/View/View.test.jsx +0 -3
  72. package/src/config/Widgets.jsx +1 -1
  73. package/src/config/index.js +7 -2
  74. package/src/config/validation.ts +155 -0
  75. package/src/helpers/Extensions/withBlockExtensions.jsx +1 -1
  76. package/src/helpers/FormValidation/FormValidation.jsx +109 -170
  77. package/src/helpers/FormValidation/FormValidation.test.js +836 -8
  78. package/src/helpers/FormValidation/validators.ts +203 -0
  79. package/src/helpers/MessageLabels/MessageLabels.js +28 -0
  80. package/src/helpers/Url/Url.test.js +4 -4
  81. package/src/helpers/User/User.js +1 -1
  82. package/src/hooks/client/useClient.js +1 -1
  83. package/test-setup-config.jsx +7 -0
  84. package/theme/themes/default/modules/embed.variables +1 -1
  85. package/theme/themes/pastanaga/collections/form.overrides +36 -2
  86. package/theme/themes/pastanaga/extras/blocks.less +14 -5
  87. package/theme/themes/pastanaga/extras/sidebar.less +4 -0
  88. package/theme/themes/pastanaga/extras/toolbar.less +10 -3
  89. package/tsconfig.declarations.json +3 -2
  90. package/types/components/index.d.ts +0 -1
  91. package/types/components/manage/Blocks/Block/Order/Order.d.ts +2 -1
  92. package/types/components/theme/Logout/Logout.d.ts +1 -1
  93. package/types/config/RichTextEditor/ToHTML.d.ts +1 -1
  94. package/types/config/Widgets.d.ts +2 -2
  95. package/types/config/validation.d.ts +3 -0
  96. package/types/helpers/Extensions/withBlockExtensions.d.ts +1 -1
  97. package/types/helpers/FormValidation/FormValidation.d.ts +1 -0
  98. package/types/helpers/FormValidation/validators.d.ts +29 -0
  99. package/types/helpers/MessageLabels/MessageLabels.d.ts +36 -0
  100. package/types/helpers/User/User.d.ts +1 -1
  101. package/src/components/theme/SocialSharing/SocialSharing.jsx +0 -48
  102. 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
  });