@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/dataviews",
3
- "version": "5.0.0",
3
+ "version": "6.0.1-next.46f643fa0.0",
4
4
  "description": "DataViews is a component that provides an API to render datasets using different types of layouts (table, grid, list, etc.).",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -46,18 +46,19 @@
46
46
  "dependencies": {
47
47
  "@ariakit/react": "^0.4.15",
48
48
  "@babel/runtime": "7.25.7",
49
- "@wordpress/base-styles": "^6.3.0",
50
- "@wordpress/components": "^30.0.0",
51
- "@wordpress/compose": "^7.27.0",
52
- "@wordpress/data": "^10.27.0",
53
- "@wordpress/date": "^5.27.0",
54
- "@wordpress/element": "^6.27.0",
55
- "@wordpress/i18n": "^6.0.0",
56
- "@wordpress/icons": "^10.27.0",
57
- "@wordpress/primitives": "^4.27.0",
58
- "@wordpress/private-apis": "^1.27.0",
59
- "@wordpress/url": "^4.27.0",
60
- "@wordpress/warning": "^3.27.0",
49
+ "@wordpress/base-styles": "^6.3.1-next.46f643fa0.0",
50
+ "@wordpress/components": "^30.1.1-next.46f643fa0.0",
51
+ "@wordpress/compose": "^7.27.1-next.46f643fa0.0",
52
+ "@wordpress/data": "^10.27.1-next.46f643fa0.0",
53
+ "@wordpress/date": "^5.27.1-next.46f643fa0.0",
54
+ "@wordpress/element": "^6.27.1-next.46f643fa0.0",
55
+ "@wordpress/i18n": "^6.0.1-next.46f643fa0.0",
56
+ "@wordpress/icons": "^10.27.2-next.46f643fa0.0",
57
+ "@wordpress/keycodes": "^4.27.1-next.46f643fa0.0",
58
+ "@wordpress/primitives": "^4.27.1-next.46f643fa0.0",
59
+ "@wordpress/private-apis": "^1.27.1-next.46f643fa0.0",
60
+ "@wordpress/url": "^4.27.1-next.46f643fa0.0",
61
+ "@wordpress/warning": "^3.27.1-next.46f643fa0.0",
61
62
  "clsx": "^2.1.1",
62
63
  "date-fns": "^4.1.0",
63
64
  "fast-deep-equal": "^3.1.3",
@@ -73,5 +74,5 @@
73
74
  "scripts": {
74
75
  "build:wp": "node build"
75
76
  },
76
- "gitHead": "abe06a6f2aef8d03c30ea9d5b3e133f041e523b1"
77
+ "gitHead": "17e600e091675c5e3d809adfea23ac456bbeae19"
77
78
  }
@@ -1,13 +1,22 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useMemo, useState } from '@wordpress/element';
4
+ import { useCallback, useMemo, useState } from '@wordpress/element';
5
+ import {
6
+ Button,
7
+ __experimentalVStack as VStack,
8
+ privateApis,
9
+ } from '@wordpress/components';
5
10
 
6
11
  /**
7
12
  * Internal dependencies
8
13
  */
9
14
  import DataForm from '../index';
10
- import type { Field, Form } from '../../../types';
15
+ import { isItemValid } from '../../../validation';
16
+ import type { Field, Form, DataFormControlProps } from '../../../types';
17
+ import { unlock } from '../../../lock-unlock';
18
+
19
+ const { ValidatedTextControl } = unlock( privateApis );
11
20
 
12
21
  type SamplePost = {
13
22
  title: string;
@@ -259,3 +268,220 @@ export const CombinedFields = {
259
268
  type: 'panel',
260
269
  },
261
270
  };
271
+
272
+ function CustomEditControl< Item >( {
273
+ data,
274
+ field,
275
+ onChange,
276
+ hideLabelFromVision,
277
+ }: DataFormControlProps< Item > ) {
278
+ const { id, label, placeholder, description } = field;
279
+ const value = field.getValue( { item: data } );
280
+
281
+ const onChangeControl = useCallback(
282
+ ( newValue: string ) =>
283
+ onChange( {
284
+ [ id ]: newValue,
285
+ } ),
286
+ [ id, onChange ]
287
+ );
288
+
289
+ return (
290
+ <ValidatedTextControl
291
+ required={ !! field.isValid?.required }
292
+ label={ label }
293
+ placeholder={ placeholder }
294
+ value={ value ?? '' }
295
+ help={ description }
296
+ onChange={ onChangeControl }
297
+ __next40pxDefaultSize
298
+ __nextHasNoMarginBottom
299
+ hideLabelFromVision={ hideLabelFromVision }
300
+ />
301
+ );
302
+ }
303
+
304
+ const DataFormValidationComponent = ( { required }: { required: boolean } ) => {
305
+ type ValidatedItem = {
306
+ text: string;
307
+ email: string;
308
+ integer: number;
309
+ boolean: boolean;
310
+ customEdit: string;
311
+ customValidation: string;
312
+ };
313
+
314
+ const [ post, setPost ] = useState< ValidatedItem >( {
315
+ text: 'Hello, World!',
316
+ email: 'hi@example.com',
317
+ integer: 2,
318
+ boolean: true,
319
+ customEdit: 'custom control',
320
+ customValidation: 'potato',
321
+ } );
322
+
323
+ const _fields: Field< ValidatedItem >[] = [
324
+ {
325
+ id: 'text',
326
+ type: 'text' as const,
327
+ label: 'Text',
328
+ isValid: {
329
+ required,
330
+ },
331
+ },
332
+ {
333
+ id: 'email',
334
+ type: 'email' as const,
335
+ label: 'e-mail',
336
+ isValid: {
337
+ required,
338
+ },
339
+ },
340
+ {
341
+ id: 'integer',
342
+ type: 'integer' as const,
343
+ label: 'Integer',
344
+ isValid: {
345
+ required,
346
+ },
347
+ },
348
+ {
349
+ id: 'boolean',
350
+ type: 'boolean' as const,
351
+ label: 'Boolean',
352
+ isValid: {
353
+ required,
354
+ },
355
+ },
356
+ {
357
+ id: 'customEdit',
358
+ label: 'Custom Control',
359
+ Edit: CustomEditControl,
360
+ isValid: {
361
+ required,
362
+ },
363
+ },
364
+ {
365
+ id: 'customValidation',
366
+ type: 'text',
367
+ label: 'Custom validation',
368
+ isValid: {
369
+ required,
370
+ custom: ( value: ValidatedItem ) => {
371
+ if (
372
+ ! [ 'tomato', 'potato' ].includes(
373
+ value.customValidation
374
+ )
375
+ ) {
376
+ return 'Value must be one of "tomato", "potato"';
377
+ }
378
+
379
+ return null;
380
+ },
381
+ },
382
+ },
383
+ ];
384
+
385
+ const form = {
386
+ fields: [
387
+ 'text',
388
+ 'email',
389
+ 'integer',
390
+ 'boolean',
391
+ 'customEdit',
392
+ 'customValidation',
393
+ ],
394
+ };
395
+
396
+ const canSave = isItemValid( post, _fields, form );
397
+
398
+ return (
399
+ <form>
400
+ <VStack alignment="left">
401
+ <DataForm< ValidatedItem >
402
+ data={ post }
403
+ fields={ _fields }
404
+ form={ form }
405
+ onChange={ ( edits ) =>
406
+ setPost( ( prev ) => ( {
407
+ ...prev,
408
+ ...edits,
409
+ } ) )
410
+ }
411
+ />
412
+ <Button
413
+ __next40pxDefaultSize
414
+ accessibleWhenDisabled
415
+ disabled={ ! canSave }
416
+ variant="primary"
417
+ >
418
+ Submit
419
+ </Button>
420
+ </VStack>
421
+ </form>
422
+ );
423
+ };
424
+
425
+ export const Validation = {
426
+ title: 'DataForm/Validation',
427
+ render: DataFormValidationComponent,
428
+ argTypes: {
429
+ required: {
430
+ control: { type: 'boolean' },
431
+ description: 'Whether or not the fields are required.',
432
+ },
433
+ },
434
+ args: {
435
+ required: true,
436
+ },
437
+ };
438
+
439
+ const DataFormVisibilityComponent = () => {
440
+ type Post = {
441
+ name: string;
442
+ email: string;
443
+ isActive: boolean;
444
+ };
445
+ const [ data, setData ] = useState( {
446
+ name: '',
447
+ email: '',
448
+ isActive: true,
449
+ } );
450
+
451
+ const _fields = [
452
+ { id: 'isActive', label: 'Is module active?', type: 'boolean' },
453
+ {
454
+ id: 'name',
455
+ label: 'Name',
456
+ type: 'text',
457
+ isVisible: ( post ) => post.isActive === true,
458
+ },
459
+ {
460
+ id: 'email',
461
+ label: 'Email',
462
+ type: 'email',
463
+ isVisible: ( post ) => post.isActive === true,
464
+ },
465
+ ] satisfies Field< Post >[];
466
+ const form = {
467
+ fields: [ 'isActive', 'name', 'email' ],
468
+ };
469
+ return (
470
+ <DataForm< Post >
471
+ data={ data }
472
+ fields={ _fields }
473
+ form={ form }
474
+ onChange={ ( edits ) =>
475
+ setData( ( prev ) => ( {
476
+ ...prev,
477
+ ...edits,
478
+ } ) )
479
+ }
480
+ />
481
+ );
482
+ };
483
+
484
+ export const Visibility = {
485
+ title: 'DataForm/Visibility',
486
+ render: DataFormVisibilityComponent,
487
+ };
@@ -8,7 +8,7 @@ import type { ReactNode, ComponentProps, ReactElement } from 'react';
8
8
  */
9
9
  import { __experimentalHStack as HStack } from '@wordpress/components';
10
10
  import { useContext, useMemo, useRef, useState } from '@wordpress/element';
11
- import { useMergeRefs, useResizeObserver } from '@wordpress/compose';
11
+ import { useResizeObserver } from '@wordpress/compose';
12
12
 
13
13
  /**
14
14
  * Internal dependencies
@@ -193,6 +193,7 @@ function DataViews< Item >( {
193
193
  renderItemLink,
194
194
  containerWidth,
195
195
  containerRef,
196
+ resizeObserverRef,
196
197
  defaultLayouts,
197
198
  filters,
198
199
  isShowingFilter,
@@ -200,10 +201,7 @@ function DataViews< Item >( {
200
201
  perPageSizes,
201
202
  } }
202
203
  >
203
- <div
204
- className="dataviews-wrapper"
205
- ref={ useMergeRefs( [ containerRef, resizeObserverRef ] ) }
206
- >
204
+ <div className="dataviews-wrapper" ref={ containerRef }>
207
205
  { children ?? (
208
206
  <DefaultUI
209
207
  header={ header }
@@ -759,5 +759,6 @@ export const fields: Field< SpaceObject >[] = [
759
759
  { value: 'Gas giant', label: 'Gas giant' },
760
760
  ],
761
761
  type: 'array',
762
+ enableGlobalSearch: true,
762
763
  },
763
764
  ];
@@ -47,6 +47,9 @@ type DataViewsContextType< Item > = {
47
47
  isItemClickable: ( item: Item ) => boolean;
48
48
  containerWidth: number;
49
49
  containerRef: React.MutableRefObject< HTMLDivElement | null >;
50
+ resizeObserverRef:
51
+ | ( ( element?: HTMLDivElement | null ) => void )
52
+ | React.RefObject< HTMLDivElement >;
50
53
  defaultLayouts: SupportedLayouts;
51
54
  filters: NormalizedFilter[];
52
55
  isShowingFilter: boolean;
@@ -72,6 +75,7 @@ const DataViewsContext = createContext< DataViewsContextType< any > >( {
72
75
  renderItemLink: undefined,
73
76
  containerWidth: 0,
74
77
  containerRef: createRef(),
78
+ resizeObserverRef: () => {},
75
79
  defaultLayouts: { list: {}, grid: {}, table: {} },
76
80
  filters: [],
77
81
  isShowingFilter: false,
@@ -309,9 +309,9 @@ const FilterText = ( {
309
309
 
310
310
  return createInterpolateElement(
311
311
  sprintf(
312
- /* translators: 1: Filter name. 2: Min value. 3: Max value. e.g.: "Item count between (inc): 10-180". */
312
+ /* translators: 1: Filter name. 2: Min value. 3: Max value. e.g.: "Item count between (inc): 10 and 180". */
313
313
  __(
314
- '<Name>%1$s between (inc): </Name><Value>%2$s-%3$s</Value>'
314
+ '<Name>%1$s between (inc): </Name><Value>%2$s and %3$s</Value>'
315
315
  ),
316
316
  filter.name,
317
317
  label[ 0 ],
@@ -62,7 +62,13 @@ export default function InputWidget( {
62
62
  ..._filter,
63
63
  operator:
64
64
  currentFilter.operator || filter.operators[ 0 ],
65
- value: nextValue,
65
+ // Consider empty strings as undefined:
66
+ //
67
+ // - undefined as value means the filter is unset: the filter widget displays no value and the search returns all records
68
+ // - empty string as value means "search empty string": returns only the records that have an empty string as value
69
+ //
70
+ // In practice, this means the filter will not be able to find an empty string as the value.
71
+ value: nextValue === '' ? undefined : nextValue,
66
72
  }
67
73
  : _filter
68
74
  ),
@@ -22,7 +22,9 @@
22
22
  line-height: $default-line-height;
23
23
 
24
24
  .components-popover__content {
25
- width: 230px;
25
+ width: 100%;
26
+ min-width: 230px;
27
+ max-width: 250px;
26
28
  border-radius: $grid-unit-05;
27
29
  }
28
30
 
@@ -1,12 +1,15 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { ToggleControl } from '@wordpress/components';
4
+ import { privateApis } from '@wordpress/components';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
8
8
  */
9
9
  import type { DataFormControlProps } from '../types';
10
+ import { unlock } from '../lock-unlock';
11
+
12
+ const { ValidatedToggleControl } = unlock( privateApis );
10
13
 
11
14
  export default function Boolean< Item >( {
12
15
  field,
@@ -17,7 +20,21 @@ export default function Boolean< Item >( {
17
20
  const { id, getValue, label } = field;
18
21
 
19
22
  return (
20
- <ToggleControl
23
+ <ValidatedToggleControl
24
+ required={ !! field.isValid.required }
25
+ customValidator={ ( newValue: any ) => {
26
+ if ( field.isValid?.custom ) {
27
+ return field.isValid.custom(
28
+ {
29
+ ...data,
30
+ [ id ]: newValue,
31
+ },
32
+ field
33
+ );
34
+ }
35
+
36
+ return null;
37
+ } }
21
38
  hidden={ hideLabelFromVision }
22
39
  __nextHasNoMarginBottom
23
40
  label={ label }