@wordpress/dataviews 5.0.0 → 6.0.1-next.46f643fa0.0

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 (212) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/README.md +45 -23
  3. package/build/components/dataviews/index.js +2 -1
  4. package/build/components/dataviews/index.js.map +1 -1
  5. package/build/components/dataviews-context/index.js +1 -0
  6. package/build/components/dataviews-context/index.js.map +1 -1
  7. package/build/components/dataviews-filters/filter.js +2 -2
  8. package/build/components/dataviews-filters/filter.js.map +1 -1
  9. package/build/components/dataviews-filters/input-widget.js +7 -1
  10. package/build/components/dataviews-filters/input-widget.js.map +1 -1
  11. package/build/dataform-controls/boolean.js +15 -1
  12. package/build/dataform-controls/boolean.js.map +1 -1
  13. package/build/dataform-controls/date.js +385 -0
  14. package/build/dataform-controls/date.js.map +1 -0
  15. package/build/dataform-controls/datetime.js +5 -84
  16. package/build/dataform-controls/datetime.js.map +1 -1
  17. package/build/dataform-controls/email.js +15 -1
  18. package/build/dataform-controls/email.js.map +1 -1
  19. package/build/dataform-controls/index.js +2 -0
  20. package/build/dataform-controls/index.js.map +1 -1
  21. package/build/dataform-controls/integer.js +23 -4
  22. package/build/dataform-controls/integer.js.map +1 -1
  23. package/build/dataform-controls/relative-date-control.js +109 -0
  24. package/build/dataform-controls/relative-date-control.js.map +1 -0
  25. package/build/dataform-controls/text.js +15 -1
  26. package/build/dataform-controls/text.js.map +1 -1
  27. package/build/dataviews-layouts/grid/index.js +37 -21
  28. package/build/dataviews-layouts/grid/index.js.map +1 -1
  29. package/build/dataviews-layouts/grid/preview-size-picker.js +39 -85
  30. package/build/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  31. package/build/dataviews-layouts/list/index.js +4 -1
  32. package/build/dataviews-layouts/list/index.js.map +1 -1
  33. package/build/dataviews-layouts/table/column-primary.js +4 -1
  34. package/build/dataviews-layouts/table/column-primary.js.map +1 -1
  35. package/build/dataviews-layouts/table/index.js +9 -2
  36. package/build/dataviews-layouts/table/index.js.map +1 -1
  37. package/build/field-types/array.js +27 -18
  38. package/build/field-types/array.js.map +1 -1
  39. package/build/field-types/boolean.js +11 -7
  40. package/build/field-types/boolean.js.map +1 -1
  41. package/build/field-types/date.js +21 -12
  42. package/build/field-types/date.js.map +1 -1
  43. package/build/field-types/datetime.js +19 -10
  44. package/build/field-types/datetime.js.map +1 -1
  45. package/build/field-types/email.js +22 -18
  46. package/build/field-types/email.js.map +1 -1
  47. package/build/field-types/index.js +16 -6
  48. package/build/field-types/index.js.map +1 -1
  49. package/build/field-types/integer.js +22 -17
  50. package/build/field-types/integer.js.map +1 -1
  51. package/build/field-types/media.js +19 -10
  52. package/build/field-types/media.js.map +1 -1
  53. package/build/field-types/text.js +19 -10
  54. package/build/field-types/text.js.map +1 -1
  55. package/build/filter-and-sort-data-view.js +6 -4
  56. package/build/filter-and-sort-data-view.js.map +1 -1
  57. package/build/normalize-fields.js +4 -5
  58. package/build/normalize-fields.js.map +1 -1
  59. package/build/types.js.map +1 -1
  60. package/build/validation.js +15 -2
  61. package/build/validation.js.map +1 -1
  62. package/build-module/components/dataviews/index.js +3 -2
  63. package/build-module/components/dataviews/index.js.map +1 -1
  64. package/build-module/components/dataviews-context/index.js +1 -0
  65. package/build-module/components/dataviews-context/index.js.map +1 -1
  66. package/build-module/components/dataviews-filters/filter.js +2 -2
  67. package/build-module/components/dataviews-filters/filter.js.map +1 -1
  68. package/build-module/components/dataviews-filters/input-widget.js +7 -1
  69. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  70. package/build-module/dataform-controls/boolean.js +17 -2
  71. package/build-module/dataform-controls/boolean.js.map +1 -1
  72. package/build-module/dataform-controls/date.js +376 -0
  73. package/build-module/dataform-controls/date.js.map +1 -0
  74. package/build-module/dataform-controls/datetime.js +3 -84
  75. package/build-module/dataform-controls/datetime.js.map +1 -1
  76. package/build-module/dataform-controls/email.js +17 -2
  77. package/build-module/dataform-controls/email.js.map +1 -1
  78. package/build-module/dataform-controls/index.js +2 -0
  79. package/build-module/dataform-controls/index.js.map +1 -1
  80. package/build-module/dataform-controls/integer.js +24 -5
  81. package/build-module/dataform-controls/integer.js.map +1 -1
  82. package/build-module/dataform-controls/relative-date-control.js +100 -0
  83. package/build-module/dataform-controls/relative-date-control.js.map +1 -0
  84. package/build-module/dataform-controls/text.js +17 -2
  85. package/build-module/dataform-controls/text.js.map +1 -1
  86. package/build-module/dataviews-layouts/grid/index.js +38 -22
  87. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  88. package/build-module/dataviews-layouts/grid/preview-size-picker.js +40 -85
  89. package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  90. package/build-module/dataviews-layouts/list/index.js +4 -1
  91. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  92. package/build-module/dataviews-layouts/table/column-primary.js +4 -1
  93. package/build-module/dataviews-layouts/table/column-primary.js.map +1 -1
  94. package/build-module/dataviews-layouts/table/index.js +9 -2
  95. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  96. package/build-module/field-types/array.js +27 -18
  97. package/build-module/field-types/array.js.map +1 -1
  98. package/build-module/field-types/boolean.js +11 -7
  99. package/build-module/field-types/boolean.js.map +1 -1
  100. package/build-module/field-types/date.js +21 -12
  101. package/build-module/field-types/date.js.map +1 -1
  102. package/build-module/field-types/datetime.js +19 -10
  103. package/build-module/field-types/datetime.js.map +1 -1
  104. package/build-module/field-types/email.js +22 -18
  105. package/build-module/field-types/email.js.map +1 -1
  106. package/build-module/field-types/index.js +16 -6
  107. package/build-module/field-types/index.js.map +1 -1
  108. package/build-module/field-types/integer.js +22 -17
  109. package/build-module/field-types/integer.js.map +1 -1
  110. package/build-module/field-types/media.js +19 -10
  111. package/build-module/field-types/media.js.map +1 -1
  112. package/build-module/field-types/text.js +19 -10
  113. package/build-module/field-types/text.js.map +1 -1
  114. package/build-module/filter-and-sort-data-view.js +6 -4
  115. package/build-module/filter-and-sort-data-view.js.map +1 -1
  116. package/build-module/normalize-fields.js +4 -5
  117. package/build-module/normalize-fields.js.map +1 -1
  118. package/build-module/types.js.map +1 -1
  119. package/build-module/validation.js +15 -2
  120. package/build-module/validation.js.map +1 -1
  121. package/build-style/style-rtl.css +53 -39
  122. package/build-style/style.css +53 -39
  123. package/build-types/components/dataform/stories/index.story.d.ts +21 -0
  124. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  125. package/build-types/components/dataviews/index.d.ts.map +1 -1
  126. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  127. package/build-types/components/dataviews-context/index.d.ts +1 -0
  128. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  129. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  130. package/build-types/constants.d.ts +2 -2
  131. package/build-types/dataform-controls/boolean.d.ts.map +1 -1
  132. package/build-types/dataform-controls/date.d.ts +3 -0
  133. package/build-types/dataform-controls/date.d.ts.map +1 -0
  134. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  135. package/build-types/dataform-controls/email.d.ts.map +1 -1
  136. package/build-types/dataform-controls/index.d.ts.map +1 -1
  137. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  138. package/build-types/dataform-controls/relative-date-control.d.ts +46 -0
  139. package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -0
  140. package/build-types/dataform-controls/text.d.ts.map +1 -1
  141. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  142. package/build-types/dataviews-layouts/grid/preview-size-picker.d.ts +0 -1
  143. package/build-types/dataviews-layouts/grid/preview-size-picker.d.ts.map +1 -1
  144. package/build-types/dataviews-layouts/index.d.ts +3 -3
  145. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  146. package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -1
  147. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  148. package/build-types/field-types/array.d.ts.map +1 -1
  149. package/build-types/field-types/boolean.d.ts +5 -4
  150. package/build-types/field-types/boolean.d.ts.map +1 -1
  151. package/build-types/field-types/date.d.ts +9 -5
  152. package/build-types/field-types/date.d.ts.map +1 -1
  153. package/build-types/field-types/datetime.d.ts +4 -3
  154. package/build-types/field-types/datetime.d.ts.map +1 -1
  155. package/build-types/field-types/email.d.ts +4 -3
  156. package/build-types/field-types/email.d.ts.map +1 -1
  157. package/build-types/field-types/index.d.ts.map +1 -1
  158. package/build-types/field-types/integer.d.ts +4 -3
  159. package/build-types/field-types/integer.d.ts.map +1 -1
  160. package/build-types/field-types/media.d.ts +4 -3
  161. package/build-types/field-types/media.d.ts.map +1 -1
  162. package/build-types/field-types/text.d.ts +4 -3
  163. package/build-types/field-types/text.d.ts.map +1 -1
  164. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  165. package/build-types/normalize-fields.d.ts.map +1 -1
  166. package/build-types/types.d.ts +10 -6
  167. package/build-types/types.d.ts.map +1 -1
  168. package/build-types/validation.d.ts.map +1 -1
  169. package/build-wp/index.js +1373 -600
  170. package/package.json +15 -14
  171. package/src/components/dataform/stories/index.story.tsx +228 -2
  172. package/src/components/dataviews/index.tsx +3 -5
  173. package/src/components/dataviews/stories/fixtures.tsx +1 -0
  174. package/src/components/dataviews-context/index.ts +4 -0
  175. package/src/components/dataviews-filters/filter.tsx +2 -2
  176. package/src/components/dataviews-filters/input-widget.tsx +7 -1
  177. package/src/components/dataviews-filters/style.scss +3 -1
  178. package/src/dataform-controls/boolean.tsx +19 -2
  179. package/src/dataform-controls/date.tsx +499 -0
  180. package/src/dataform-controls/datetime.tsx +5 -91
  181. package/src/dataform-controls/email.tsx +19 -2
  182. package/src/dataform-controls/index.tsx +2 -0
  183. package/src/dataform-controls/integer.tsx +30 -4
  184. package/src/dataform-controls/relative-date-control.tsx +106 -0
  185. package/src/dataform-controls/style.scss +19 -2
  186. package/src/dataform-controls/text.tsx +19 -2
  187. package/src/dataviews-layouts/grid/index.tsx +44 -23
  188. package/src/dataviews-layouts/grid/preview-size-picker.tsx +48 -73
  189. package/src/dataviews-layouts/grid/style.scss +13 -26
  190. package/src/dataviews-layouts/list/index.tsx +5 -1
  191. package/src/dataviews-layouts/list/style.scss +3 -3
  192. package/src/dataviews-layouts/table/column-primary.tsx +5 -1
  193. package/src/dataviews-layouts/table/index.tsx +22 -6
  194. package/src/dataviews-layouts/table/style.scss +22 -0
  195. package/src/field-types/array.tsx +33 -21
  196. package/src/field-types/boolean.tsx +15 -9
  197. package/src/field-types/date.ts +51 -15
  198. package/src/field-types/datetime.tsx +19 -13
  199. package/src/field-types/email.tsx +26 -21
  200. package/src/field-types/index.tsx +18 -8
  201. package/src/field-types/integer.tsx +26 -22
  202. package/src/field-types/media.tsx +19 -13
  203. package/src/field-types/text.tsx +19 -13
  204. package/src/filter-and-sort-data-view.ts +11 -4
  205. package/src/normalize-fields.ts +4 -8
  206. package/src/test/dataviews.tsx +129 -0
  207. package/src/test/filter-and-sort-data-view.js +48 -0
  208. package/src/test/validation.ts +4 -15
  209. package/src/types.ts +11 -7
  210. package/src/validation.ts +30 -1
  211. package/tsconfig.json +1 -0
  212. package/tsconfig.tsbuildinfo +1 -1
@@ -285,6 +285,71 @@ describe( 'DataViews component', () => {
285
285
  await user.click( titleField );
286
286
  expect( onClickItemCallback ).toHaveBeenCalledWith( data[ 0 ] );
287
287
  } );
288
+
289
+ it( 'accepts click for single selection', async () => {
290
+ render(
291
+ <DataViewWrapper
292
+ view={ {
293
+ ...DEFAULT_VIEW,
294
+ fields: [ 'author' ],
295
+ titleField: 'title',
296
+ } }
297
+ // A bulk action is required for the dataview to be multi-selectable.
298
+ actions={ actions }
299
+ />
300
+ );
301
+ const firstItemElement = screen.getByText( data[ 0 ].title );
302
+ const thirdItemElement = screen.getByText( data[ 2 ].title );
303
+ const user = userEvent.setup();
304
+ await user.click( firstItemElement );
305
+
306
+ // First item should be selected.
307
+ expect(
308
+ screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
309
+ ).toBeChecked();
310
+ await user.click( thirdItemElement );
311
+
312
+ // Third item should be selected. First item was deselected.
313
+ expect(
314
+ screen.getByRole( 'checkbox', { name: data[ 2 ].title } )
315
+ ).toBeChecked();
316
+ } );
317
+
318
+ it( 'accepts ctrl/cmd key and click for non-consecutive multi-selection', async () => {
319
+ render(
320
+ <DataViewWrapper
321
+ view={ {
322
+ ...DEFAULT_VIEW,
323
+ fields: [ 'author' ],
324
+ titleField: 'title',
325
+ } }
326
+ // A bulk action is required for the dataview to be multi-selectable.
327
+ actions={ actions }
328
+ />
329
+ );
330
+ const firstItemElement = screen.getByText( data[ 0 ].title );
331
+ const thirdItemElement = screen.getByText( data[ 2 ].title );
332
+ const user = userEvent.setup();
333
+ await user.click( firstItemElement );
334
+
335
+ // First item should be selected.
336
+ expect(
337
+ screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
338
+ ).toBeChecked();
339
+ await user.keyboard( '{Control>}' );
340
+ await user.click( thirdItemElement );
341
+
342
+ // Both items should be selected.
343
+ expect(
344
+ screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
345
+ ).toBeChecked();
346
+ expect(
347
+ screen.getByRole( 'checkbox', { name: data[ 2 ].title } )
348
+ ).toBeChecked();
349
+
350
+ // Don't keep the modifier pressed down, that's just mean.
351
+ await user.keyboard( '{/Control}' );
352
+ } );
288
353
  } );
289
354
 
290
355
  describe( 'in grid view', () => {
@@ -363,6 +428,70 @@ describe( 'DataViews component', () => {
363
428
  await user.click( imageField );
364
429
  expect( mediaClickItemCallback ).toHaveBeenCalledWith( data[ 0 ] );
365
430
  } );
431
+
432
+ it( 'accepts click for single selection', async () => {
433
+ render(
434
+ <DataViewWrapper
435
+ view={ {
436
+ ...DEFAULT_VIEW,
437
+ fields: [ 'author' ],
438
+ titleField: 'title',
439
+ } }
440
+ // A bulk action is required for the dataview to be multi-selectable.
441
+ actions={ actions }
442
+ />
443
+ );
444
+ const firstItemElement = screen.getByText( data[ 0 ].title );
445
+ const thirdItemElement = screen.getByText( data[ 2 ].title );
446
+ const user = userEvent.setup();
447
+ await user.click( firstItemElement );
448
+
449
+ // First item should be selected.
450
+ expect(
451
+ screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
452
+ ).toBeChecked();
453
+ await user.click( thirdItemElement );
454
+
455
+ // Third item should be selected. First item was deselected.
456
+ expect(
457
+ screen.getByRole( 'checkbox', { name: data[ 2 ].title } )
458
+ ).toBeChecked();
459
+ } );
460
+
461
+ it( 'accepts ctrl/cmd key and click for non-consecutive multi-selection', async () => {
462
+ render(
463
+ <DataViewWrapper
464
+ view={ {
465
+ ...DEFAULT_VIEW,
466
+ fields: [ 'author' ],
467
+ titleField: 'title',
468
+ } }
469
+ // A bulk action is required for the dataview to be multi-selectable.
470
+ actions={ actions }
471
+ />
472
+ );
473
+ const firstItemElement = screen.getByText( data[ 0 ].title );
474
+ const thirdItemElement = screen.getByText( data[ 2 ].title );
475
+ const user = userEvent.setup();
476
+ await user.click( firstItemElement );
477
+
478
+ // First item should be selected.
479
+ expect(
480
+ screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
481
+ ).toBeChecked();
482
+ await user.keyboard( '{Control>}' );
483
+ await user.click( thirdItemElement );
484
+
485
+ // Both items should be selected.
486
+ expect(
487
+ screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
488
+ ).toBeChecked();
489
+ expect(
490
+ screen.getByRole( 'checkbox', { name: data[ 2 ].title } )
491
+ ).toBeChecked();
492
+
493
+ await user.keyboard( '{/Control}' );
494
+ } );
366
495
  } );
367
496
 
368
497
  describe( 'in list view', () => {
@@ -71,6 +71,54 @@ describe( 'filters', () => {
71
71
  expect( result[ 0 ].description ).toBe( 'La planète Vénus' );
72
72
  } );
73
73
 
74
+ it( 'should search over array fields when enableGlobalSearch is true', () => {
75
+ const fieldsWithArraySearch = fields.map( ( field ) =>
76
+ field.id === 'categories'
77
+ ? { ...field, enableGlobalSearch: true }
78
+ : field
79
+ );
80
+
81
+ const { data: result } = filterSortAndPaginate(
82
+ data,
83
+ {
84
+ search: 'Moon',
85
+ filters: [],
86
+ },
87
+ fieldsWithArraySearch
88
+ );
89
+
90
+ // Should find items with "satellite" in categories
91
+ expect( result ).toHaveLength( 3 );
92
+ expect( result.map( ( r ) => r.title ).sort() ).toEqual( [
93
+ 'Europa',
94
+ 'Io',
95
+ 'Moon',
96
+ ] );
97
+ } );
98
+
99
+ it( 'should search over array fields case-insensitively', () => {
100
+ const fieldsWithArraySearch = fields.map( ( field ) =>
101
+ field.id === 'categories'
102
+ ? { ...field, enableGlobalSearch: true }
103
+ : field
104
+ );
105
+
106
+ const { data: result } = filterSortAndPaginate(
107
+ data,
108
+ {
109
+ search: 'planet',
110
+ filters: [],
111
+ },
112
+ fieldsWithArraySearch
113
+ );
114
+
115
+ // Should find items with "Planet" in categories (case-insensitive)
116
+ expect( result ).toHaveLength( 8 );
117
+ expect( result.map( ( r ) => r.title ) ).toContain( 'Neptune' );
118
+ expect( result.map( ( r ) => r.title ) ).toContain( 'Mercury' );
119
+ expect( result.map( ( r ) => r.title ) ).toContain( 'Earth' );
120
+ } );
121
+
74
122
  it( 'should search using IS filter', () => {
75
123
  const { data: result } = filterSortAndPaginate(
76
124
  data,
@@ -35,7 +35,7 @@ describe( 'validation', () => {
35
35
  expect( result ).toBe( true );
36
36
  } );
37
37
 
38
- it( 'integer field is invalid if value is not integer', () => {
38
+ it( 'integer field is invalid if value is not integer when not empty', () => {
39
39
  const item = { id: 1, order: 'd' };
40
40
  const fields: Field< {} >[] = [
41
41
  {
@@ -48,19 +48,6 @@ describe( 'validation', () => {
48
48
  expect( result ).toBe( false );
49
49
  } );
50
50
 
51
- it( 'integer field is invalid if value is empty', () => {
52
- const item = { id: 1, order: '' };
53
- const fields: Field< {} >[] = [
54
- {
55
- id: 'order',
56
- type: 'integer',
57
- },
58
- ];
59
- const form = { fields: [ 'order' ] };
60
- const result = isItemValid( item, fields, form );
61
- expect( result ).toBe( false );
62
- } );
63
-
64
51
  it( 'integer field is invalid if value is not one of the elements', () => {
65
52
  const item = { id: 1, author: 3 };
66
53
  const fields: Field< {} >[] = [
@@ -121,7 +108,9 @@ describe( 'validation', () => {
121
108
  { value: 'a', label: 'A' },
122
109
  { value: 'b', label: 'B' },
123
110
  ],
124
- isValid: () => true, // Overrides the validation provided for integer types.
111
+ isValid: {
112
+ custom: () => null, // Overrides the validation provided for integer types.
113
+ },
125
114
  },
126
115
  ];
127
116
  const form = { fields: [ 'order' ] };
package/src/types.ts CHANGED
@@ -100,10 +100,6 @@ export type FieldType =
100
100
  | 'email'
101
101
  | 'array';
102
102
 
103
- export type ValidationContext = {
104
- elements?: Option[];
105
- };
106
-
107
103
  /**
108
104
  * An abstract interface for Field based on the field type.
109
105
  */
@@ -116,7 +112,7 @@ export type FieldTypeDefinition< Item > = {
116
112
  /**
117
113
  * Callback used to validate the field.
118
114
  */
119
- isValid: ( item: Item, context?: ValidationContext ) => boolean;
115
+ isValid: Rules< Item >;
120
116
 
121
117
  /**
122
118
  * Callback used to render an edit control for the field or control name.
@@ -145,6 +141,11 @@ export type FieldTypeDefinition< Item > = {
145
141
  enableSorting: boolean;
146
142
  };
147
143
 
144
+ export type Rules< Item > = {
145
+ required?: boolean;
146
+ custom?: ( item: Item, field: NormalizedField< Item > ) => null | string;
147
+ };
148
+
148
149
  /**
149
150
  * A dataview field for a specific property of a data type.
150
151
  */
@@ -198,7 +199,7 @@ export type Field< Item > = {
198
199
  /**
199
200
  * Callback used to validate the field.
200
201
  */
201
- isValid?: ( item: Item, context?: ValidationContext ) => boolean;
202
+ isValid?: Rules< Item >;
202
203
 
203
204
  /**
204
205
  * Callback used to decide if a field should be displayed.
@@ -250,7 +251,7 @@ export type NormalizedField< Item > = Omit< Field< Item >, 'Edit' > & {
250
251
  render: ComponentType< DataViewRenderFieldProps< Item > >;
251
252
  Edit: ComponentType< DataFormControlProps< Item > > | null;
252
253
  sort: ( a: Item, b: Item, direction: SortDirection ) => number;
253
- isValid: ( item: Item, context?: ValidationContext ) => boolean;
254
+ isValid: Rules< Item >;
254
255
  enableHiding: boolean;
255
256
  enableSorting: boolean;
256
257
  filterBy: NormalizedFilterByConfig | false;
@@ -280,6 +281,9 @@ export type DataFormControlProps< Item > = {
280
281
  export type DataViewRenderFieldProps< Item > = {
281
282
  item: Item;
282
283
  field: NormalizedField< Item >;
284
+ config?: {
285
+ sizes: string;
286
+ };
283
287
  };
284
288
 
285
289
  /**
package/src/validation.ts CHANGED
@@ -21,7 +21,36 @@ export function isItemValid< Item >(
21
21
  const _fields = normalizeFields(
22
22
  fields.filter( ( { id } ) => !! form.fields?.includes( id ) )
23
23
  );
24
+
25
+ const isEmptyNullOrUndefined = ( value: any ) =>
26
+ [ undefined, '', null ].includes( value );
27
+
24
28
  return _fields.every( ( field ) => {
25
- return field.isValid( item, { elements: field.elements } );
29
+ const value = field.getValue( { item } );
30
+
31
+ if ( field.isValid.required ) {
32
+ if (
33
+ ( field.type === 'text' && isEmptyNullOrUndefined( value ) ) ||
34
+ ( field.type === 'email' && isEmptyNullOrUndefined( value ) ) ||
35
+ ( field.type === 'integer' &&
36
+ isEmptyNullOrUndefined( value ) ) ||
37
+ ( field.type === undefined && isEmptyNullOrUndefined( value ) )
38
+ ) {
39
+ return false;
40
+ }
41
+
42
+ if ( field.type === 'boolean' && value !== true ) {
43
+ return false;
44
+ }
45
+ }
46
+
47
+ if (
48
+ typeof field.isValid.custom === 'function' &&
49
+ field.isValid.custom( item, field ) !== null
50
+ ) {
51
+ return false;
52
+ }
53
+
54
+ return true;
26
55
  } );
27
56
  }
package/tsconfig.json CHANGED
@@ -17,6 +17,7 @@
17
17
  { "path": "../element" },
18
18
  { "path": "../i18n" },
19
19
  { "path": "../icons" },
20
+ { "path": "../keycodes" },
20
21
  { "path": "../primitives" },
21
22
  { "path": "../private-apis" },
22
23
  { "path": "../url" },