@wordpress/dataviews 5.0.1-next.719a03cbe.0 → 6.0.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 (254) hide show
  1. package/CHANGELOG.md +34 -4
  2. package/README.md +55 -26
  3. package/build/components/dataviews/index.js +13 -4
  4. package/build/components/dataviews/index.js.map +1 -1
  5. package/build/components/dataviews-context/index.js +3 -1
  6. package/build/components/dataviews-context/index.js.map +1 -1
  7. package/build/components/dataviews-filters/filter.js +15 -8
  8. package/build/components/dataviews-filters/filter.js.map +1 -1
  9. package/build/components/dataviews-filters/index.js +16 -5
  10. package/build/components/dataviews-filters/index.js.map +1 -1
  11. package/build/components/dataviews-filters/input-widget.js +7 -1
  12. package/build/components/dataviews-filters/input-widget.js.map +1 -1
  13. package/build/components/dataviews-filters/reset-filters.js +2 -2
  14. package/build/components/dataviews-filters/reset-filters.js.map +1 -1
  15. package/build/components/dataviews-layout/index.js +5 -2
  16. package/build/components/dataviews-layout/index.js.map +1 -1
  17. package/build/components/dataviews-view-config/index.js +4 -3
  18. package/build/components/dataviews-view-config/index.js.map +1 -1
  19. package/build/dataform-controls/boolean.js +15 -1
  20. package/build/dataform-controls/boolean.js.map +1 -1
  21. package/build/dataform-controls/date.js +385 -0
  22. package/build/dataform-controls/date.js.map +1 -0
  23. package/build/dataform-controls/datetime.js +5 -84
  24. package/build/dataform-controls/datetime.js.map +1 -1
  25. package/build/dataform-controls/email.js +15 -1
  26. package/build/dataform-controls/email.js.map +1 -1
  27. package/build/dataform-controls/index.js +2 -0
  28. package/build/dataform-controls/index.js.map +1 -1
  29. package/build/dataform-controls/integer.js +23 -4
  30. package/build/dataform-controls/integer.js.map +1 -1
  31. package/build/dataform-controls/relative-date-control.js +109 -0
  32. package/build/dataform-controls/relative-date-control.js.map +1 -0
  33. package/build/dataform-controls/select.js +12 -5
  34. package/build/dataform-controls/select.js.map +1 -1
  35. package/build/dataform-controls/text.js +15 -1
  36. package/build/dataform-controls/text.js.map +1 -1
  37. package/build/dataviews-layouts/grid/index.js +91 -18
  38. package/build/dataviews-layouts/grid/index.js.map +1 -1
  39. package/build/dataviews-layouts/grid/preview-size-picker.js +39 -85
  40. package/build/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  41. package/build/dataviews-layouts/list/index.js +7 -3
  42. package/build/dataviews-layouts/list/index.js.map +1 -1
  43. package/build/dataviews-layouts/table/column-primary.js +18 -3
  44. package/build/dataviews-layouts/table/column-primary.js.map +1 -1
  45. package/build/dataviews-layouts/table/index.js +57 -5
  46. package/build/dataviews-layouts/table/index.js.map +1 -1
  47. package/build/field-types/array.js +27 -18
  48. package/build/field-types/array.js.map +1 -1
  49. package/build/field-types/boolean.js +11 -7
  50. package/build/field-types/boolean.js.map +1 -1
  51. package/build/field-types/date.js +66 -0
  52. package/build/field-types/date.js.map +1 -0
  53. package/build/field-types/datetime.js +19 -10
  54. package/build/field-types/datetime.js.map +1 -1
  55. package/build/field-types/email.js +22 -18
  56. package/build/field-types/email.js.map +1 -1
  57. package/build/field-types/index.js +20 -6
  58. package/build/field-types/index.js.map +1 -1
  59. package/build/field-types/integer.js +22 -17
  60. package/build/field-types/integer.js.map +1 -1
  61. package/build/field-types/media.js +19 -10
  62. package/build/field-types/media.js.map +1 -1
  63. package/build/field-types/text.js +19 -10
  64. package/build/field-types/text.js.map +1 -1
  65. package/build/filter-and-sort-data-view.js +28 -14
  66. package/build/filter-and-sort-data-view.js.map +1 -1
  67. package/build/normalize-fields.js +4 -5
  68. package/build/normalize-fields.js.map +1 -1
  69. package/build/types.js.map +1 -1
  70. package/build/validation.js +15 -2
  71. package/build/validation.js.map +1 -1
  72. package/build-module/components/dataviews/index.js +15 -6
  73. package/build-module/components/dataviews/index.js.map +1 -1
  74. package/build-module/components/dataviews-context/index.js +3 -1
  75. package/build-module/components/dataviews-context/index.js.map +1 -1
  76. package/build-module/components/dataviews-filters/filter.js +15 -8
  77. package/build-module/components/dataviews-filters/filter.js.map +1 -1
  78. package/build-module/components/dataviews-filters/index.js +16 -5
  79. package/build-module/components/dataviews-filters/index.js.map +1 -1
  80. package/build-module/components/dataviews-filters/input-widget.js +7 -1
  81. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  82. package/build-module/components/dataviews-filters/reset-filters.js +2 -2
  83. package/build-module/components/dataviews-filters/reset-filters.js.map +1 -1
  84. package/build-module/components/dataviews-layout/index.js +5 -2
  85. package/build-module/components/dataviews-layout/index.js.map +1 -1
  86. package/build-module/components/dataviews-view-config/index.js +4 -3
  87. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  88. package/build-module/dataform-controls/boolean.js +17 -2
  89. package/build-module/dataform-controls/boolean.js.map +1 -1
  90. package/build-module/dataform-controls/date.js +376 -0
  91. package/build-module/dataform-controls/date.js.map +1 -0
  92. package/build-module/dataform-controls/datetime.js +3 -84
  93. package/build-module/dataform-controls/datetime.js.map +1 -1
  94. package/build-module/dataform-controls/email.js +17 -2
  95. package/build-module/dataform-controls/email.js.map +1 -1
  96. package/build-module/dataform-controls/index.js +2 -0
  97. package/build-module/dataform-controls/index.js.map +1 -1
  98. package/build-module/dataform-controls/integer.js +24 -5
  99. package/build-module/dataform-controls/integer.js.map +1 -1
  100. package/build-module/dataform-controls/relative-date-control.js +100 -0
  101. package/build-module/dataform-controls/relative-date-control.js.map +1 -0
  102. package/build-module/dataform-controls/select.js +12 -5
  103. package/build-module/dataform-controls/select.js.map +1 -1
  104. package/build-module/dataform-controls/text.js +17 -2
  105. package/build-module/dataform-controls/text.js.map +1 -1
  106. package/build-module/dataviews-layouts/grid/index.js +93 -20
  107. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  108. package/build-module/dataviews-layouts/grid/preview-size-picker.js +40 -85
  109. package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  110. package/build-module/dataviews-layouts/list/index.js +7 -3
  111. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  112. package/build-module/dataviews-layouts/table/column-primary.js +18 -3
  113. package/build-module/dataviews-layouts/table/column-primary.js.map +1 -1
  114. package/build-module/dataviews-layouts/table/index.js +58 -6
  115. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  116. package/build-module/field-types/array.js +27 -18
  117. package/build-module/field-types/array.js.map +1 -1
  118. package/build-module/field-types/boolean.js +11 -7
  119. package/build-module/field-types/boolean.js.map +1 -1
  120. package/build-module/field-types/date.js +60 -0
  121. package/build-module/field-types/date.js.map +1 -0
  122. package/build-module/field-types/datetime.js +19 -10
  123. package/build-module/field-types/datetime.js.map +1 -1
  124. package/build-module/field-types/email.js +22 -18
  125. package/build-module/field-types/email.js.map +1 -1
  126. package/build-module/field-types/index.js +20 -6
  127. package/build-module/field-types/index.js.map +1 -1
  128. package/build-module/field-types/integer.js +22 -17
  129. package/build-module/field-types/integer.js.map +1 -1
  130. package/build-module/field-types/media.js +19 -10
  131. package/build-module/field-types/media.js.map +1 -1
  132. package/build-module/field-types/text.js +19 -10
  133. package/build-module/field-types/text.js.map +1 -1
  134. package/build-module/filter-and-sort-data-view.js +28 -14
  135. package/build-module/filter-and-sort-data-view.js.map +1 -1
  136. package/build-module/normalize-fields.js +4 -5
  137. package/build-module/normalize-fields.js.map +1 -1
  138. package/build-module/types.js.map +1 -1
  139. package/build-module/validation.js +15 -2
  140. package/build-module/validation.js.map +1 -1
  141. package/build-style/style-rtl.css +84 -41
  142. package/build-style/style.css +84 -41
  143. package/build-types/components/dataform/stories/index.story.d.ts +21 -0
  144. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  145. package/build-types/components/dataviews/index.d.ts +3 -2
  146. package/build-types/components/dataviews/index.d.ts.map +1 -1
  147. package/build-types/components/dataviews/stories/fixtures.d.ts +1 -0
  148. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  149. package/build-types/components/dataviews/stories/index.story.d.ts +16 -2
  150. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  151. package/build-types/components/dataviews-context/index.d.ts +4 -2
  152. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  153. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
  154. package/build-types/components/dataviews-filters/index.d.ts.map +1 -1
  155. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  156. package/build-types/components/dataviews-filters/reset-filters.d.ts.map +1 -1
  157. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  158. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  159. package/build-types/components/stories/index.story.d.ts +4 -0
  160. package/build-types/components/stories/index.story.d.ts.map +1 -1
  161. package/build-types/constants.d.ts +2 -2
  162. package/build-types/dataform-controls/boolean.d.ts.map +1 -1
  163. package/build-types/dataform-controls/date.d.ts +3 -0
  164. package/build-types/dataform-controls/date.d.ts.map +1 -0
  165. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  166. package/build-types/dataform-controls/email.d.ts.map +1 -1
  167. package/build-types/dataform-controls/index.d.ts.map +1 -1
  168. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  169. package/build-types/dataform-controls/relative-date-control.d.ts +46 -0
  170. package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -0
  171. package/build-types/dataform-controls/select.d.ts.map +1 -1
  172. package/build-types/dataform-controls/text.d.ts.map +1 -1
  173. package/build-types/dataviews-layouts/grid/index.d.ts +1 -1
  174. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  175. package/build-types/dataviews-layouts/grid/preview-size-picker.d.ts +0 -1
  176. package/build-types/dataviews-layouts/grid/preview-size-picker.d.ts.map +1 -1
  177. package/build-types/dataviews-layouts/index.d.ts +3 -3
  178. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  179. package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -1
  180. package/build-types/dataviews-layouts/table/index.d.ts +1 -1
  181. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  182. package/build-types/field-types/array.d.ts.map +1 -1
  183. package/build-types/field-types/boolean.d.ts +5 -4
  184. package/build-types/field-types/boolean.d.ts.map +1 -1
  185. package/build-types/field-types/date.d.ts +20 -0
  186. package/build-types/field-types/date.d.ts.map +1 -0
  187. package/build-types/field-types/datetime.d.ts +4 -3
  188. package/build-types/field-types/datetime.d.ts.map +1 -1
  189. package/build-types/field-types/email.d.ts +4 -3
  190. package/build-types/field-types/email.d.ts.map +1 -1
  191. package/build-types/field-types/index.d.ts.map +1 -1
  192. package/build-types/field-types/integer.d.ts +4 -3
  193. package/build-types/field-types/integer.d.ts.map +1 -1
  194. package/build-types/field-types/media.d.ts +4 -3
  195. package/build-types/field-types/media.d.ts.map +1 -1
  196. package/build-types/field-types/text.d.ts +4 -3
  197. package/build-types/field-types/text.d.ts.map +1 -1
  198. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  199. package/build-types/normalize-fields.d.ts.map +1 -1
  200. package/build-types/types.d.ts +25 -8
  201. package/build-types/types.d.ts.map +1 -1
  202. package/build-types/validation.d.ts.map +1 -1
  203. package/build-wp/index.js +2196 -739
  204. package/package.json +15 -14
  205. package/src/components/dataform/stories/index.story.tsx +229 -2
  206. package/src/components/dataviews/index.tsx +30 -10
  207. package/src/components/dataviews/stories/fixtures.tsx +82 -59
  208. package/src/components/dataviews/stories/index.story.tsx +65 -8
  209. package/src/components/dataviews/stories/style.css +6 -0
  210. package/src/components/dataviews-context/index.ts +8 -2
  211. package/src/components/dataviews-filters/filter.tsx +17 -7
  212. package/src/components/dataviews-filters/index.tsx +17 -2
  213. package/src/components/dataviews-filters/input-widget.tsx +7 -1
  214. package/src/components/dataviews-filters/reset-filters.tsx +4 -2
  215. package/src/components/dataviews-filters/style.scss +8 -2
  216. package/src/components/dataviews-layout/index.tsx +3 -0
  217. package/src/components/dataviews-view-config/index.tsx +5 -3
  218. package/src/components/stories/index.story.tsx +21 -0
  219. package/src/dataform-controls/boolean.tsx +19 -2
  220. package/src/dataform-controls/date.tsx +499 -0
  221. package/src/dataform-controls/datetime.tsx +5 -91
  222. package/src/dataform-controls/email.tsx +19 -2
  223. package/src/dataform-controls/index.tsx +2 -0
  224. package/src/dataform-controls/integer.tsx +30 -4
  225. package/src/dataform-controls/relative-date-control.tsx +106 -0
  226. package/src/dataform-controls/select.tsx +23 -13
  227. package/src/dataform-controls/style.scss +19 -2
  228. package/src/dataform-controls/text.tsx +19 -2
  229. package/src/dataviews-layouts/grid/index.tsx +168 -55
  230. package/src/dataviews-layouts/grid/preview-size-picker.tsx +48 -73
  231. package/src/dataviews-layouts/grid/style.scss +21 -26
  232. package/src/dataviews-layouts/list/index.tsx +7 -4
  233. package/src/dataviews-layouts/list/style.scss +3 -3
  234. package/src/dataviews-layouts/table/column-primary.tsx +29 -5
  235. package/src/dataviews-layouts/table/index.tsx +134 -42
  236. package/src/dataviews-layouts/table/style.scss +45 -1
  237. package/src/field-types/array.tsx +33 -21
  238. package/src/field-types/boolean.tsx +15 -9
  239. package/src/field-types/date.ts +92 -0
  240. package/src/field-types/datetime.tsx +19 -13
  241. package/src/field-types/email.tsx +26 -21
  242. package/src/field-types/index.tsx +23 -8
  243. package/src/field-types/integer.tsx +26 -22
  244. package/src/field-types/media.tsx +19 -13
  245. package/src/field-types/text.tsx +19 -13
  246. package/src/filter-and-sort-data-view.ts +38 -13
  247. package/src/normalize-fields.ts +4 -8
  248. package/src/test/dataviews.tsx +129 -0
  249. package/src/test/filter-and-sort-data-view.js +150 -31
  250. package/src/test/validation.ts +4 -15
  251. package/src/types.ts +34 -8
  252. package/src/validation.ts +30 -1
  253. package/tsconfig.json +1 -0
  254. package/tsconfig.tsbuildinfo +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/dataviews",
3
- "version": "5.0.1-next.719a03cbe.0",
3
+ "version": "6.0.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.2.1-next.719a03cbe.0",
50
- "@wordpress/components": "^29.13.1-next.719a03cbe.0",
51
- "@wordpress/compose": "^7.26.1-next.719a03cbe.0",
52
- "@wordpress/data": "^10.26.1-next.719a03cbe.0",
53
- "@wordpress/date": "^5.26.1-next.719a03cbe.0",
54
- "@wordpress/element": "^6.26.1-next.719a03cbe.0",
55
- "@wordpress/i18n": "^6.0.1-next.719a03cbe.0",
56
- "@wordpress/icons": "^10.26.2-next.719a03cbe.0",
57
- "@wordpress/primitives": "^4.26.1-next.719a03cbe.0",
58
- "@wordpress/private-apis": "^1.26.1-next.719a03cbe.0",
59
- "@wordpress/url": "^4.26.1-next.719a03cbe.0",
60
- "@wordpress/warning": "^3.26.1-next.719a03cbe.0",
49
+ "@wordpress/base-styles": "^6.4.0",
50
+ "@wordpress/components": "^30.1.0",
51
+ "@wordpress/compose": "^7.28.0",
52
+ "@wordpress/data": "^10.28.0",
53
+ "@wordpress/date": "^5.28.0",
54
+ "@wordpress/element": "^6.28.0",
55
+ "@wordpress/i18n": "^6.1.0",
56
+ "@wordpress/icons": "^10.28.0",
57
+ "@wordpress/keycodes": "^4.28.0",
58
+ "@wordpress/primitives": "^4.28.0",
59
+ "@wordpress/private-apis": "^1.28.0",
60
+ "@wordpress/url": "^4.28.0",
61
+ "@wordpress/warning": "^3.28.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": "5e146e949c2765411a8310bcc2641a88d036a6d9"
77
+ "gitHead": "28cc2098f5ee28f89096b638533796538f495f72"
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;
@@ -62,6 +71,7 @@ const fields = [
62
71
  label: 'Date as options',
63
72
  type: 'datetime' as const,
64
73
  elements: [
74
+ { value: '', label: 'Select a date' },
65
75
  { value: '1970-02-23T12:00:00', label: "Jane's birth date" },
66
76
  { value: '1950-02-23T12:00:00', label: "John's birth date" },
67
77
  ],
@@ -259,3 +269,220 @@ export const CombinedFields = {
259
269
  type: 'panel',
260
270
  },
261
271
  };
272
+
273
+ function CustomEditControl< Item >( {
274
+ data,
275
+ field,
276
+ onChange,
277
+ hideLabelFromVision,
278
+ }: DataFormControlProps< Item > ) {
279
+ const { id, label, placeholder, description } = field;
280
+ const value = field.getValue( { item: data } );
281
+
282
+ const onChangeControl = useCallback(
283
+ ( newValue: string ) =>
284
+ onChange( {
285
+ [ id ]: newValue,
286
+ } ),
287
+ [ id, onChange ]
288
+ );
289
+
290
+ return (
291
+ <ValidatedTextControl
292
+ required={ !! field.isValid?.required }
293
+ label={ label }
294
+ placeholder={ placeholder }
295
+ value={ value ?? '' }
296
+ help={ description }
297
+ onChange={ onChangeControl }
298
+ __next40pxDefaultSize
299
+ __nextHasNoMarginBottom
300
+ hideLabelFromVision={ hideLabelFromVision }
301
+ />
302
+ );
303
+ }
304
+
305
+ const DataFormValidationComponent = ( { required }: { required: boolean } ) => {
306
+ type ValidatedItem = {
307
+ text: string;
308
+ email: string;
309
+ integer: number;
310
+ boolean: boolean;
311
+ customEdit: string;
312
+ customValidation: string;
313
+ };
314
+
315
+ const [ post, setPost ] = useState< ValidatedItem >( {
316
+ text: 'Hello, World!',
317
+ email: 'hi@example.com',
318
+ integer: 2,
319
+ boolean: true,
320
+ customEdit: 'custom control',
321
+ customValidation: 'potato',
322
+ } );
323
+
324
+ const _fields: Field< ValidatedItem >[] = [
325
+ {
326
+ id: 'text',
327
+ type: 'text' as const,
328
+ label: 'Text',
329
+ isValid: {
330
+ required,
331
+ },
332
+ },
333
+ {
334
+ id: 'email',
335
+ type: 'email' as const,
336
+ label: 'e-mail',
337
+ isValid: {
338
+ required,
339
+ },
340
+ },
341
+ {
342
+ id: 'integer',
343
+ type: 'integer' as const,
344
+ label: 'Integer',
345
+ isValid: {
346
+ required,
347
+ },
348
+ },
349
+ {
350
+ id: 'boolean',
351
+ type: 'boolean' as const,
352
+ label: 'Boolean',
353
+ isValid: {
354
+ required,
355
+ },
356
+ },
357
+ {
358
+ id: 'customEdit',
359
+ label: 'Custom Control',
360
+ Edit: CustomEditControl,
361
+ isValid: {
362
+ required,
363
+ },
364
+ },
365
+ {
366
+ id: 'customValidation',
367
+ type: 'text',
368
+ label: 'Custom validation',
369
+ isValid: {
370
+ required,
371
+ custom: ( value: ValidatedItem ) => {
372
+ if (
373
+ ! [ 'tomato', 'potato' ].includes(
374
+ value.customValidation
375
+ )
376
+ ) {
377
+ return 'Value must be one of "tomato", "potato"';
378
+ }
379
+
380
+ return null;
381
+ },
382
+ },
383
+ },
384
+ ];
385
+
386
+ const form = {
387
+ fields: [
388
+ 'text',
389
+ 'email',
390
+ 'integer',
391
+ 'boolean',
392
+ 'customEdit',
393
+ 'customValidation',
394
+ ],
395
+ };
396
+
397
+ const canSave = isItemValid( post, _fields, form );
398
+
399
+ return (
400
+ <form>
401
+ <VStack alignment="left">
402
+ <DataForm< ValidatedItem >
403
+ data={ post }
404
+ fields={ _fields }
405
+ form={ form }
406
+ onChange={ ( edits ) =>
407
+ setPost( ( prev ) => ( {
408
+ ...prev,
409
+ ...edits,
410
+ } ) )
411
+ }
412
+ />
413
+ <Button
414
+ __next40pxDefaultSize
415
+ accessibleWhenDisabled
416
+ disabled={ ! canSave }
417
+ variant="primary"
418
+ >
419
+ Submit
420
+ </Button>
421
+ </VStack>
422
+ </form>
423
+ );
424
+ };
425
+
426
+ export const Validation = {
427
+ title: 'DataForm/Validation',
428
+ render: DataFormValidationComponent,
429
+ argTypes: {
430
+ required: {
431
+ control: { type: 'boolean' },
432
+ description: 'Whether or not the fields are required.',
433
+ },
434
+ },
435
+ args: {
436
+ required: true,
437
+ },
438
+ };
439
+
440
+ const DataFormVisibilityComponent = () => {
441
+ type Post = {
442
+ name: string;
443
+ email: string;
444
+ isActive: boolean;
445
+ };
446
+ const [ data, setData ] = useState( {
447
+ name: '',
448
+ email: '',
449
+ isActive: true,
450
+ } );
451
+
452
+ const _fields = [
453
+ { id: 'isActive', label: 'Is module active?', type: 'boolean' },
454
+ {
455
+ id: 'name',
456
+ label: 'Name',
457
+ type: 'text',
458
+ isVisible: ( post ) => post.isActive === true,
459
+ },
460
+ {
461
+ id: 'email',
462
+ label: 'Email',
463
+ type: 'email',
464
+ isVisible: ( post ) => post.isActive === true,
465
+ },
466
+ ] satisfies Field< Post >[];
467
+ const form = {
468
+ fields: [ 'isActive', 'name', 'email' ],
469
+ };
470
+ return (
471
+ <DataForm< Post >
472
+ data={ data }
473
+ fields={ _fields }
474
+ form={ form }
475
+ onChange={ ( edits ) =>
476
+ setData( ( prev ) => ( {
477
+ ...prev,
478
+ ...edits,
479
+ } ) )
480
+ }
481
+ />
482
+ );
483
+ };
484
+
485
+ export const Visibility = {
486
+ title: 'DataForm/Visibility',
487
+ render: DataFormVisibilityComponent,
488
+ };
@@ -7,8 +7,14 @@ import type { ReactNode, ComponentProps, ReactElement } from 'react';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import { __experimentalHStack as HStack } from '@wordpress/components';
10
- import { useContext, useMemo, useRef, useState } from '@wordpress/element';
11
- import { useMergeRefs, useResizeObserver } from '@wordpress/compose';
10
+ import {
11
+ useContext,
12
+ useMemo,
13
+ useRef,
14
+ useState,
15
+ useEffect,
16
+ } from '@wordpress/element';
17
+ import { useResizeObserver } from '@wordpress/compose';
12
18
 
13
19
  /**
14
20
  * Internal dependencies
@@ -59,7 +65,8 @@ type DataViewsProps< Item > = {
59
65
  header?: ReactNode;
60
66
  getItemLevel?: ( item: Item ) => number;
61
67
  children?: ReactNode;
62
- perPageSizes?: [ number, number, number, number ];
68
+ perPageSizes?: number[];
69
+ empty?: ReactNode;
63
70
  } & ( Item extends ItemWithId
64
71
  ? { getItemId?: ( item: Item ) => string }
65
72
  : { getItemId: ( item: Item ) => string } );
@@ -133,7 +140,8 @@ function DataViews< Item >( {
133
140
  isItemClickable = defaultIsItemClickable,
134
141
  header,
135
142
  children,
136
- perPageSizes,
143
+ perPageSizes = [ 10, 20, 50, 100 ],
144
+ empty,
137
145
  }: DataViewsProps< Item > ) {
138
146
  const containerRef = useRef< HTMLDivElement | null >( null );
139
147
  const [ containerWidth, setContainerWidth ] = useState( 0 );
@@ -168,10 +176,23 @@ function DataViews< Item >( {
168
176
  }, [ selection, data, getItemId ] );
169
177
 
170
178
  const filters = useFilters( _fields, view );
171
- const [ isShowingFilter, setIsShowingFilter ] = useState< boolean >( () =>
172
- ( filters || [] ).some( ( filter ) => filter.isPrimary )
179
+ const hasPrimaryOrLockedFilters = useMemo(
180
+ () =>
181
+ ( filters || [] ).some(
182
+ ( filter ) => filter.isPrimary || filter.isLocked
183
+ ),
184
+ [ filters ]
185
+ );
186
+ const [ isShowingFilter, setIsShowingFilter ] = useState< boolean >(
187
+ hasPrimaryOrLockedFilters
173
188
  );
174
189
 
190
+ useEffect( () => {
191
+ if ( hasPrimaryOrLockedFilters && ! isShowingFilter ) {
192
+ setIsShowingFilter( true );
193
+ }
194
+ }, [ hasPrimaryOrLockedFilters, isShowingFilter ] );
195
+
175
196
  return (
176
197
  <DataViewsContext.Provider
177
198
  value={ {
@@ -193,17 +214,16 @@ function DataViews< Item >( {
193
214
  renderItemLink,
194
215
  containerWidth,
195
216
  containerRef,
217
+ resizeObserverRef,
196
218
  defaultLayouts,
197
219
  filters,
198
220
  isShowingFilter,
199
221
  setIsShowingFilter,
200
222
  perPageSizes,
223
+ empty,
201
224
  } }
202
225
  >
203
- <div
204
- className="dataviews-wrapper"
205
- ref={ useMergeRefs( [ containerRef, resizeObserverRef ] ) }
206
- >
226
+ <div className="dataviews-wrapper" ref={ containerRef }>
207
227
  { children ?? (
208
228
  <DefaultUI
209
229
  header={ header }
@@ -33,140 +33,153 @@ export type SpaceObject = {
33
33
  categories: string[];
34
34
  satellites: number;
35
35
  date: string;
36
+ datetime: string;
36
37
  email: string;
37
38
  };
38
39
 
39
40
  export const data: SpaceObject[] = [
40
41
  {
41
42
  id: 1,
42
- title: 'Apollo',
43
- description: 'Apollo description',
44
- image: 'https://live.staticflickr.com/5725/21726228300_51333bd62c_b.jpg',
45
- type: 'Not a planet',
43
+ title: 'Moon',
44
+ description:
45
+ 'The Moon is Earth’s only natural satellite, orbiting at an average distance of 384,400 kilometers with a synchronous rotation that leads to fixed lunar phases as seen from Earth. Its cratered surface and subtle glow define night skies, inspiring exploration missions and influencing tides and biological rhythms worldwide.',
46
+ image: 'https://live.staticflickr.com/7398/9458193857_e1256123e3_z.jpg',
47
+ type: 'Satellite',
46
48
  isPlanet: false,
47
- categories: [ 'Space', 'NASA' ],
49
+ categories: [ 'Solar system', 'Satellite', 'Earth', 'Moon' ],
48
50
  satellites: 0,
49
- date: '2021-01-01T00:00:00Z',
50
- email: 'apollo@example.com',
51
+ date: '2021-01-01',
52
+ datetime: '2021-01-01T14:30:00Z',
53
+ email: 'moon@example.com',
51
54
  },
52
55
  {
53
56
  id: 2,
54
- title: 'Space',
55
- description: 'Space description',
56
- image: 'https://live.staticflickr.com/5678/21911065441_92e2d44708_b.jpg',
57
- type: 'Not a planet',
57
+ title: 'Io',
58
+ description: 'Moon of Jupiter',
59
+ image: 'https://live.staticflickr.com/5482/9460973502_07e8ab81fe_z.jpg',
60
+ type: 'Satellite',
58
61
  isPlanet: false,
59
- categories: [ 'Space' ],
62
+ categories: [ 'Solar system', 'Satellite', 'Jupiter', 'Moon' ],
60
63
  satellites: 0,
61
- date: '2019-01-02T00:00:00Z',
62
- email: 'space@example.com',
64
+ date: '2019-01-02',
65
+ datetime: '2019-01-02T09:15:00Z',
66
+ email: 'io@example.com',
63
67
  },
64
68
  {
65
69
  id: 3,
66
- title: 'NASA',
67
- description: 'NASA photo',
68
- image: 'https://live.staticflickr.com/742/21712365770_8f70a2c91e_b.jpg',
69
- type: 'Not a planet',
70
+ title: 'Europa',
71
+ description: 'Moon of Jupiter',
72
+ image: 'https://live.staticflickr.com/65535/31499273012_baf5f38cc1_z.jpg',
73
+ type: 'Satellite',
70
74
  isPlanet: false,
71
- categories: [ 'NASA' ],
75
+ categories: [ 'Solar system', 'Satellite', 'Jupiter', 'Moon' ],
72
76
  satellites: 0,
73
- date: '2025-01-03T00:00:00Z',
74
- email: 'nasa@example.com',
77
+ date: '2025-01-03',
78
+ datetime: '2025-01-03T16:45:30Z',
79
+ email: 'europa@example.com',
75
80
  },
76
81
  {
77
82
  id: 4,
78
83
  title: 'Neptune',
79
- description: 'Neptune description',
80
- image: 'https://live.staticflickr.com/5725/21726228300_51333bd62c_b.jpg',
84
+ description: 'Ice giant in the Solar system',
85
+ image: 'https://live.staticflickr.com/65535/29523683990_000ff4720c_z.jpg',
81
86
  type: 'Ice giant',
82
87
  isPlanet: true,
83
- categories: [ 'Space', 'Planet', 'Solar system' ],
84
- satellites: 14,
85
- date: '2020-01-01T00:00:00Z',
88
+ categories: [ 'Ice giant', 'Planet', 'Solar system' ],
89
+ satellites: 16,
90
+ date: '2020-01-01',
91
+ datetime: '2020-01-01T11:22:15Z',
86
92
  email: 'neptune@example.com',
87
93
  },
88
94
  {
89
95
  id: 5,
90
96
  title: 'Mercury',
91
- description: 'Mercury description',
92
- image: 'https://live.staticflickr.com/5725/21726228300_51333bd62c_b.jpg',
97
+ description: 'Terrestrial planet in the Solar system',
98
+ image: 'https://live.staticflickr.com/813/40199101735_e5e92ffd11_z.jpg',
93
99
  type: 'Terrestrial',
94
100
  isPlanet: true,
95
- categories: [ 'Space', 'Planet', 'Solar system' ],
101
+ categories: [ 'Terrestrial', 'Planet', 'Solar system' ],
96
102
  satellites: 0,
97
- date: '2020-01-02T01:00:00Z',
103
+ date: '2020-01-02',
104
+ datetime: '2020-01-02T13:05:45Z',
98
105
  email: 'mercury@example.com',
99
106
  },
100
107
  {
101
108
  id: 6,
102
109
  title: 'Venus',
103
110
  description: 'La planète Vénus',
104
- image: 'https://live.staticflickr.com/5725/21726228300_51333bd62c_b.jpg',
111
+ image: 'https://live.staticflickr.com/8025/7544560662_900e717727_z.jpg',
105
112
  type: 'Terrestrial',
106
113
  isPlanet: true,
107
- categories: [ 'Space', 'Planet', 'Solar system' ],
114
+ categories: [ 'Terrestrial', 'Planet', 'Solar system' ],
108
115
  satellites: 0,
109
- date: '2020-01-02T00:00:00Z',
116
+ date: '2020-01-02',
117
+ datetime: '2020-01-02T08:30:12Z',
110
118
  email: 'venus@example.com',
111
119
  },
112
120
  {
113
121
  id: 7,
114
122
  title: 'Earth',
115
- description: 'Earth description',
116
- image: 'https://live.staticflickr.com/5725/21726228300_51333bd62c_b.jpg',
123
+ description: 'Terrestrial planet in the Solar system',
124
+ image: 'https://live.staticflickr.com/3762/9460163562_964fe6af07_z.jpg',
117
125
  type: 'Terrestrial',
118
126
  isPlanet: true,
119
- categories: [ 'Space', 'Planet', 'Solar system' ],
127
+ categories: [ 'Terrestrial', 'Planet', 'Solar system', 'Earth' ],
120
128
  satellites: 1,
121
- date: '2023-01-03T00:00:00Z',
129
+ date: '2023-01-03',
130
+ datetime: '2023-01-03T18:15:30Z',
122
131
  email: 'earth@example.com',
123
132
  },
124
133
  {
125
134
  id: 8,
126
135
  title: 'Mars',
127
- description: 'Mars description',
128
- image: 'https://live.staticflickr.com/5725/21726228300_51333bd62c_b.jpg',
136
+ description: 'Terrestrial planet in the Solar system',
137
+ image: 'https://live.staticflickr.com/8151/7651156426_e047f4d219_z.jpg',
129
138
  type: 'Terrestrial',
130
139
  isPlanet: true,
131
- categories: [ 'Space', 'Planet', 'Solar system' ],
140
+ categories: [ 'Terrestrial', 'Planet', 'Solar system' ],
132
141
  satellites: 2,
133
- date: '2020-01-01T00:00:00Z',
142
+ date: '2020-01-01',
143
+ datetime: '2020-01-01T20:45:00Z',
134
144
  email: 'mars@example.com',
135
145
  },
136
146
  {
137
147
  id: 9,
138
148
  title: 'Jupiter',
139
- description: 'Jupiter description',
140
- image: 'https://live.staticflickr.com/5725/21726228300_51333bd62c_b.jpg',
149
+ description: 'Gas giant in the Solar system',
150
+ image: 'https://staging-jubilee.flickr.com/2853/9458010071_6e6fc41408_z.jpg',
141
151
  type: 'Gas giant',
142
152
  isPlanet: true,
143
- categories: [ 'Space', 'Planet', 'Solar system' ],
144
- satellites: 95,
145
- date: '2017-01-01T00:01:00Z',
153
+ categories: [ 'Solar system', 'Planet', 'Gas giant' ],
154
+ satellites: 97,
155
+ date: '2017-01-01',
156
+ datetime: '2017-01-01T00:01:00Z',
146
157
  email: 'jupiter@example.com',
147
158
  },
148
159
  {
149
160
  id: 10,
150
161
  title: 'Saturn',
151
- description: 'Saturn description',
152
- image: 'https://live.staticflickr.com/5725/21726228300_51333bd62c_b.jpg',
162
+ description: 'Gas giant in the Solar system',
163
+ image: 'https://live.staticflickr.com/5524/9464658509_fc2d83dff5_z.jpg',
153
164
  type: 'Gas giant',
154
165
  isPlanet: true,
155
- categories: [ 'Space', 'Planet', 'Solar system' ],
156
- satellites: 146,
157
- date: '2020-02-01T00:02:00Z',
166
+ categories: [ 'Gas giant', 'Solar system', 'Planet' ],
167
+ satellites: 274,
168
+ date: '2020-02-01',
169
+ datetime: '2020-02-01T00:02:00Z',
158
170
  email: 'saturn@example.com',
159
171
  },
160
172
  {
161
173
  id: 11,
162
174
  title: 'Uranus',
163
- description: 'Uranus description',
164
- image: 'https://live.staticflickr.com/5725/21726228300_51333bd62c_b.jpg',
175
+ description: 'Ice giant in the Solar system',
176
+ image: 'https://live.staticflickr.com/65535/5553350875_3072df91e2_c.jpg',
165
177
  type: 'Ice giant',
166
178
  isPlanet: true,
167
- categories: [ 'Space', 'Ice giant', 'Solar system' ],
179
+ categories: [ 'Planet', 'Ice giant', 'Solar system' ],
168
180
  satellites: 28,
169
- date: '2020-03-01T00:00:00Z',
181
+ date: '2020-03-01',
182
+ datetime: '2020-03-01T10:15:20Z',
170
183
  email: 'uranus@example.com',
171
184
  },
172
185
  ];
@@ -677,6 +690,11 @@ export const fields: Field< SpaceObject >[] = [
677
690
  {
678
691
  id: 'date',
679
692
  label: 'Date',
693
+ type: 'date',
694
+ },
695
+ {
696
+ id: 'datetime',
697
+ label: 'Datetime',
680
698
  type: 'datetime',
681
699
  },
682
700
  {
@@ -684,7 +702,7 @@ export const fields: Field< SpaceObject >[] = [
684
702
  id: 'type',
685
703
  enableHiding: false,
686
704
  elements: [
687
- { value: 'Not a planet', label: 'Not a planet' },
705
+ { value: 'Satellite', label: 'Satellite' },
688
706
  { value: 'Ice giant', label: 'Ice giant' },
689
707
  { value: 'Terrestrial', label: 'Terrestrial' },
690
708
  { value: 'Gas giant', label: 'Gas giant' },
@@ -731,12 +749,17 @@ export const fields: Field< SpaceObject >[] = [
731
749
  </HStack>
732
750
  ),
733
751
  elements: [
734
- { value: 'Space', label: 'Space' },
735
- { value: 'NASA', label: 'NASA' },
736
- { value: 'Planet', label: 'Planet' },
737
752
  { value: 'Solar system', label: 'Solar system' },
753
+ { value: 'Satellite', label: 'Satellite' },
754
+ { value: 'Moon', label: 'Moon' },
755
+ { value: 'Earth', label: 'Earth' },
756
+ { value: 'Jupiter', label: 'Jupiter' },
757
+ { value: 'Planet', label: 'Planet' },
738
758
  { value: 'Ice giant', label: 'Ice giant' },
759
+ { value: 'Terrestrial', label: 'Terrestrial' },
760
+ { value: 'Gas giant', label: 'Gas giant' },
739
761
  ],
740
762
  type: 'array',
763
+ enableGlobalSearch: true,
741
764
  },
742
765
  ];