@wordpress/dataviews 14.0.0 → 14.1.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 (249) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +16 -5
  3. package/build/components/dataform-controls/array.cjs +2 -0
  4. package/build/components/dataform-controls/array.cjs.map +2 -2
  5. package/build/components/dataform-controls/checkbox.cjs +3 -1
  6. package/build/components/dataform-controls/checkbox.cjs.map +2 -2
  7. package/build/components/dataform-controls/color.cjs +8 -2
  8. package/build/components/dataform-controls/color.cjs.map +2 -2
  9. package/build/components/dataform-controls/date.cjs +31 -9
  10. package/build/components/dataform-controls/date.cjs.map +3 -3
  11. package/build/components/dataform-controls/datetime.cjs +9 -2
  12. package/build/components/dataform-controls/datetime.cjs.map +3 -3
  13. package/build/components/dataform-controls/password.cjs +4 -1
  14. package/build/components/dataform-controls/password.cjs.map +2 -2
  15. package/build/components/dataform-controls/radio.cjs +3 -1
  16. package/build/components/dataform-controls/radio.cjs.map +2 -2
  17. package/build/components/dataform-controls/select.cjs +3 -1
  18. package/build/components/dataform-controls/select.cjs.map +2 -2
  19. package/build/components/dataform-controls/textarea.cjs +2 -0
  20. package/build/components/dataform-controls/textarea.cjs.map +2 -2
  21. package/build/components/dataform-controls/toggle-group.cjs +3 -1
  22. package/build/components/dataform-controls/toggle-group.cjs.map +2 -2
  23. package/build/components/dataform-controls/toggle.cjs +3 -1
  24. package/build/components/dataform-controls/toggle.cjs.map +2 -2
  25. package/build/components/dataform-controls/utils/relative-date-control.cjs +5 -2
  26. package/build/components/dataform-controls/utils/relative-date-control.cjs.map +2 -2
  27. package/build/components/dataform-controls/utils/use-disabled-date-matchers.cjs +48 -0
  28. package/build/components/dataform-controls/utils/use-disabled-date-matchers.cjs.map +7 -0
  29. package/build/components/dataform-controls/utils/validated-input.cjs +2 -0
  30. package/build/components/dataform-controls/utils/validated-input.cjs.map +2 -2
  31. package/build/components/dataform-controls/utils/validated-number.cjs +3 -1
  32. package/build/components/dataform-controls/utils/validated-number.cjs.map +2 -2
  33. package/build/components/dataform-layouts/panel/summary-button.cjs +0 -1
  34. package/build/components/dataform-layouts/panel/summary-button.cjs.map +2 -2
  35. package/build/components/dataviews-context/index.cjs.map +1 -1
  36. package/build/components/dataviews-filters/input-widget.cjs +4 -0
  37. package/build/components/dataviews-filters/input-widget.cjs.map +2 -2
  38. package/build/components/dataviews-layouts/picker-grid/index.cjs +1 -4
  39. package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
  40. package/build/components/dataviews-layouts/picker-table/index.cjs +15 -12
  41. package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
  42. package/build/components/dataviews-layouts/table/index.cjs +0 -1
  43. package/build/components/dataviews-layouts/table/index.cjs.map +2 -2
  44. package/build/components/dataviews-pagination/index.cjs +1 -0
  45. package/build/components/dataviews-pagination/index.cjs.map +2 -2
  46. package/build/dataviews/index.cjs +10 -8
  47. package/build/dataviews/index.cjs.map +2 -2
  48. package/build/dataviews-picker/index.cjs +16 -9
  49. package/build/dataviews-picker/index.cjs.map +2 -2
  50. package/build/field-types/date.cjs +4 -1
  51. package/build/field-types/date.cjs.map +2 -2
  52. package/build/field-types/datetime.cjs +4 -1
  53. package/build/field-types/datetime.cjs.map +2 -2
  54. package/build/field-types/index.cjs +1 -0
  55. package/build/field-types/index.cjs.map +2 -2
  56. package/build/field-types/utils/get-is-valid.cjs +29 -24
  57. package/build/field-types/utils/get-is-valid.cjs.map +2 -2
  58. package/build/field-types/utils/is-valid-date-boundary.cjs +64 -0
  59. package/build/field-types/utils/is-valid-date-boundary.cjs.map +7 -0
  60. package/build/types/dataviews.cjs.map +1 -1
  61. package/build/types/field-api.cjs.map +1 -1
  62. package/build-module/components/dataform-controls/array.mjs +2 -0
  63. package/build-module/components/dataform-controls/array.mjs.map +2 -2
  64. package/build-module/components/dataform-controls/checkbox.mjs +3 -1
  65. package/build-module/components/dataform-controls/checkbox.mjs.map +2 -2
  66. package/build-module/components/dataform-controls/color.mjs +8 -2
  67. package/build-module/components/dataform-controls/color.mjs.map +2 -2
  68. package/build-module/components/dataform-controls/date.mjs +31 -9
  69. package/build-module/components/dataform-controls/date.mjs.map +2 -2
  70. package/build-module/components/dataform-controls/datetime.mjs +9 -2
  71. package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
  72. package/build-module/components/dataform-controls/password.mjs +4 -1
  73. package/build-module/components/dataform-controls/password.mjs.map +2 -2
  74. package/build-module/components/dataform-controls/radio.mjs +3 -1
  75. package/build-module/components/dataform-controls/radio.mjs.map +2 -2
  76. package/build-module/components/dataform-controls/select.mjs +3 -1
  77. package/build-module/components/dataform-controls/select.mjs.map +2 -2
  78. package/build-module/components/dataform-controls/textarea.mjs +2 -0
  79. package/build-module/components/dataform-controls/textarea.mjs.map +2 -2
  80. package/build-module/components/dataform-controls/toggle-group.mjs +3 -1
  81. package/build-module/components/dataform-controls/toggle-group.mjs.map +2 -2
  82. package/build-module/components/dataform-controls/toggle.mjs +3 -1
  83. package/build-module/components/dataform-controls/toggle.mjs.map +2 -2
  84. package/build-module/components/dataform-controls/utils/relative-date-control.mjs +5 -2
  85. package/build-module/components/dataform-controls/utils/relative-date-control.mjs.map +2 -2
  86. package/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs +27 -0
  87. package/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs.map +7 -0
  88. package/build-module/components/dataform-controls/utils/validated-input.mjs +2 -0
  89. package/build-module/components/dataform-controls/utils/validated-input.mjs.map +2 -2
  90. package/build-module/components/dataform-controls/utils/validated-number.mjs +3 -1
  91. package/build-module/components/dataform-controls/utils/validated-number.mjs.map +2 -2
  92. package/build-module/components/dataform-layouts/panel/summary-button.mjs +0 -1
  93. package/build-module/components/dataform-layouts/panel/summary-button.mjs.map +2 -2
  94. package/build-module/components/dataviews-context/index.mjs.map +1 -1
  95. package/build-module/components/dataviews-filters/input-widget.mjs +4 -0
  96. package/build-module/components/dataviews-filters/input-widget.mjs.map +2 -2
  97. package/build-module/components/dataviews-layouts/picker-grid/index.mjs +1 -4
  98. package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
  99. package/build-module/components/dataviews-layouts/picker-table/index.mjs +15 -12
  100. package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
  101. package/build-module/components/dataviews-layouts/table/index.mjs +0 -1
  102. package/build-module/components/dataviews-layouts/table/index.mjs.map +2 -2
  103. package/build-module/components/dataviews-pagination/index.mjs +1 -0
  104. package/build-module/components/dataviews-pagination/index.mjs.map +2 -2
  105. package/build-module/dataviews/index.mjs +10 -8
  106. package/build-module/dataviews/index.mjs.map +2 -2
  107. package/build-module/dataviews-picker/index.mjs +16 -9
  108. package/build-module/dataviews-picker/index.mjs.map +2 -2
  109. package/build-module/field-types/date.mjs +4 -1
  110. package/build-module/field-types/date.mjs.map +2 -2
  111. package/build-module/field-types/datetime.mjs +4 -1
  112. package/build-module/field-types/datetime.mjs.map +2 -2
  113. package/build-module/field-types/index.mjs +1 -0
  114. package/build-module/field-types/index.mjs.map +2 -2
  115. package/build-module/field-types/utils/get-is-valid.mjs +29 -24
  116. package/build-module/field-types/utils/get-is-valid.mjs.map +2 -2
  117. package/build-module/field-types/utils/is-valid-date-boundary.mjs +38 -0
  118. package/build-module/field-types/utils/is-valid-date-boundary.mjs.map +7 -0
  119. package/build-style/style-rtl.css +14 -15
  120. package/build-style/style.css +14 -15
  121. package/build-types/components/dataform-controls/array.d.ts.map +1 -1
  122. package/build-types/components/dataform-controls/checkbox.d.ts.map +1 -1
  123. package/build-types/components/dataform-controls/color.d.ts.map +1 -1
  124. package/build-types/components/dataform-controls/date.d.ts.map +1 -1
  125. package/build-types/components/dataform-controls/datetime.d.ts.map +1 -1
  126. package/build-types/components/dataform-controls/password.d.ts.map +1 -1
  127. package/build-types/components/dataform-controls/radio.d.ts.map +1 -1
  128. package/build-types/components/dataform-controls/select.d.ts.map +1 -1
  129. package/build-types/components/dataform-controls/textarea.d.ts.map +1 -1
  130. package/build-types/components/dataform-controls/toggle-group.d.ts.map +1 -1
  131. package/build-types/components/dataform-controls/toggle.d.ts.map +1 -1
  132. package/build-types/components/dataform-controls/utils/relative-date-control.d.ts.map +1 -1
  133. package/build-types/components/dataform-controls/utils/use-disabled-date-matchers.d.ts +16 -0
  134. package/build-types/components/dataform-controls/utils/use-disabled-date-matchers.d.ts.map +1 -0
  135. package/build-types/components/dataform-controls/utils/validated-input.d.ts.map +1 -1
  136. package/build-types/components/dataform-controls/utils/validated-number.d.ts.map +1 -1
  137. package/build-types/components/dataform-layouts/panel/summary-button.d.ts.map +1 -1
  138. package/build-types/components/dataviews-context/index.d.ts +2 -2
  139. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  140. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  141. package/build-types/components/dataviews-layouts/index.d.ts +6 -6
  142. package/build-types/components/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  143. package/build-types/components/dataviews-layouts/picker-table/index.d.ts.map +1 -1
  144. package/build-types/components/dataviews-layouts/table/index.d.ts.map +1 -1
  145. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -1
  146. package/build-types/components/dataviews-search/index.d.ts +1 -1
  147. package/build-types/components/dataviews-search/index.d.ts.map +1 -1
  148. package/build-types/constants.d.ts +2 -2
  149. package/build-types/dataform/stories/index.story.d.ts +11 -1
  150. package/build-types/dataform/stories/index.story.d.ts.map +1 -1
  151. package/build-types/dataform/stories/layout-regular.d.ts +2 -1
  152. package/build-types/dataform/stories/layout-regular.d.ts.map +1 -1
  153. package/build-types/dataform/stories/validation.d.ts.map +1 -1
  154. package/build-types/dataviews/index.d.ts +1 -1
  155. package/build-types/dataviews/index.d.ts.map +1 -1
  156. package/build-types/dataviews-picker/index.d.ts +3 -2
  157. package/build-types/dataviews-picker/index.d.ts.map +1 -1
  158. package/build-types/dataviews-picker/stories/index.story.d.ts.map +1 -1
  159. package/build-types/field-types/array.d.ts +1 -1
  160. package/build-types/field-types/array.d.ts.map +1 -1
  161. package/build-types/field-types/boolean.d.ts +1 -1
  162. package/build-types/field-types/boolean.d.ts.map +1 -1
  163. package/build-types/field-types/color.d.ts +1 -1
  164. package/build-types/field-types/color.d.ts.map +1 -1
  165. package/build-types/field-types/date.d.ts +3 -0
  166. package/build-types/field-types/date.d.ts.map +1 -1
  167. package/build-types/field-types/datetime.d.ts +3 -0
  168. package/build-types/field-types/datetime.d.ts.map +1 -1
  169. package/build-types/field-types/email.d.ts +1 -1
  170. package/build-types/field-types/email.d.ts.map +1 -1
  171. package/build-types/field-types/index.d.ts.map +1 -1
  172. package/build-types/field-types/integer.d.ts +1 -1
  173. package/build-types/field-types/integer.d.ts.map +1 -1
  174. package/build-types/field-types/number.d.ts +1 -1
  175. package/build-types/field-types/number.d.ts.map +1 -1
  176. package/build-types/field-types/stories/index.story.d.ts +37 -15
  177. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  178. package/build-types/field-types/utils/get-is-valid.d.ts.map +1 -1
  179. package/build-types/field-types/utils/is-valid-date-boundary.d.ts +7 -0
  180. package/build-types/field-types/utils/is-valid-date-boundary.d.ts.map +1 -0
  181. package/build-types/types/dataviews.d.ts +8 -0
  182. package/build-types/types/dataviews.d.ts.map +1 -1
  183. package/build-types/types/field-api.d.ts +24 -9
  184. package/build-types/types/field-api.d.ts.map +1 -1
  185. package/build-wp/index.js +1141 -990
  186. package/package.json +16 -16
  187. package/src/components/dataform-controls/array.tsx +2 -0
  188. package/src/components/dataform-controls/checkbox.tsx +2 -0
  189. package/src/components/dataform-controls/color.tsx +7 -0
  190. package/src/components/dataform-controls/date.tsx +30 -4
  191. package/src/components/dataform-controls/datetime.tsx +17 -0
  192. package/src/components/dataform-controls/password.tsx +3 -0
  193. package/src/components/dataform-controls/radio.tsx +2 -0
  194. package/src/components/dataform-controls/select.tsx +2 -0
  195. package/src/components/dataform-controls/textarea.tsx +2 -0
  196. package/src/components/dataform-controls/toggle-group.tsx +2 -0
  197. package/src/components/dataform-controls/toggle.tsx +2 -0
  198. package/src/components/dataform-controls/utils/relative-date-control.tsx +3 -0
  199. package/src/components/dataform-controls/utils/use-disabled-date-matchers.ts +48 -0
  200. package/src/components/dataform-controls/utils/validated-input.tsx +2 -0
  201. package/src/components/dataform-controls/utils/validated-number.tsx +2 -0
  202. package/src/components/dataform-layouts/panel/style.scss +4 -5
  203. package/src/components/dataform-layouts/panel/summary-button.tsx +0 -1
  204. package/src/components/dataviews-context/index.ts +2 -2
  205. package/src/components/dataviews-filters/input-widget.tsx +4 -0
  206. package/src/components/dataviews-filters/style.scss +2 -2
  207. package/src/components/dataviews-layouts/activity/style.scss +3 -3
  208. package/src/components/dataviews-layouts/grid/style.scss +1 -1
  209. package/src/components/dataviews-layouts/list/style.scss +1 -1
  210. package/src/components/dataviews-layouts/picker-grid/index.tsx +2 -6
  211. package/src/components/dataviews-layouts/picker-grid/style.scss +1 -1
  212. package/src/components/dataviews-layouts/picker-table/index.tsx +9 -7
  213. package/src/components/dataviews-layouts/picker-table/style.scss +1 -1
  214. package/src/components/dataviews-layouts/table/index.tsx +0 -2
  215. package/src/components/dataviews-pagination/index.tsx +1 -0
  216. package/src/dataform/stories/content.story.tsx +1 -1
  217. package/src/dataform/stories/data-adapter.tsx +6 -6
  218. package/src/dataform/stories/index.story.tsx +7 -0
  219. package/src/dataform/stories/layout-card.tsx +5 -5
  220. package/src/dataform/stories/layout-details.tsx +5 -5
  221. package/src/dataform/stories/layout-panel.tsx +9 -9
  222. package/src/dataform/stories/layout-regular.tsx +31 -10
  223. package/src/dataform/stories/layout-row.tsx +9 -9
  224. package/src/dataform/stories/validation.tsx +25 -10
  225. package/src/dataviews/index.tsx +11 -7
  226. package/src/dataviews/stories/empty.tsx +4 -4
  227. package/src/dataviews/stories/free-composition.tsx +2 -2
  228. package/src/dataviews/stories/infinite-scroll.tsx +4 -4
  229. package/src/dataviews/stories/layout-custom.tsx +1 -1
  230. package/src/dataviews/stories/layout-grid.tsx +1 -1
  231. package/src/dataviews/stories/layout-list.tsx +1 -1
  232. package/src/dataviews/stories/layout-table.tsx +1 -1
  233. package/src/dataviews/stories/minimal-ui.tsx +1 -1
  234. package/src/dataviews/stories/with-card.tsx +4 -4
  235. package/src/dataviews/style.scss +1 -1
  236. package/src/dataviews/test/dataviews.tsx +73 -6
  237. package/src/dataviews-picker/index.tsx +17 -7
  238. package/src/dataviews-picker/stories/index.story.tsx +1 -5
  239. package/src/dataviews-picker/test/dataviews-picker.tsx +79 -2
  240. package/src/field-types/date.tsx +3 -0
  241. package/src/field-types/datetime.tsx +3 -0
  242. package/src/field-types/index.tsx +4 -0
  243. package/src/field-types/stories/index.story.tsx +67 -6
  244. package/src/field-types/test/normalize-fields.ts +44 -0
  245. package/src/field-types/utils/get-is-valid.ts +44 -31
  246. package/src/field-types/utils/is-valid-date-boundary.ts +80 -0
  247. package/src/hooks/test/use-form-validity.ts +479 -0
  248. package/src/types/dataviews.ts +9 -0
  249. package/src/types/field-api.ts +27 -9
@@ -78,14 +78,10 @@ function GridItem< Item >( {
78
78
  }: GridItemProps< Item > ) {
79
79
  const { showTitle = true, showMedia = true, showDescription = true } = view;
80
80
  const id = getItemId( item );
81
- const elementRef = useRef< HTMLElement | null >( null );
81
+ const elementRef = useRef< HTMLButtonElement >( null );
82
82
 
83
83
  const isSelected = selection.includes( id );
84
84
 
85
- const setElementRef = ( element: HTMLElement | null ) => {
86
- elementRef.current = element;
87
- };
88
-
89
85
  useIntersectionObserver( elementRef, posinset );
90
86
 
91
87
  const renderedMediaField = mediaField?.render ? (
@@ -102,7 +98,7 @@ function GridItem< Item >( {
102
98
 
103
99
  return (
104
100
  <Composite.Item
105
- ref={ setElementRef }
101
+ ref={ elementRef }
106
102
  aria-label={
107
103
  titleField
108
104
  ? titleField.getValue( { item } ) || __( '(no title)' )
@@ -174,7 +174,7 @@
174
174
  }
175
175
 
176
176
  .dataviews-view-picker-grid__media--clickable {
177
- cursor: pointer;
177
+ cursor: var(--wpds-cursor-control);
178
178
  }
179
179
 
180
180
  .dataviews-view-picker-grid-group__header {
@@ -100,11 +100,7 @@ function TableRow< Item >( {
100
100
  const isSelected = selection.includes( id );
101
101
 
102
102
  const [ isHovered, setIsHovered ] = useState( false );
103
- const elementRef = useRef< HTMLElement | null >( null );
104
-
105
- const setElementRef = ( element: HTMLElement | null ) => {
106
- elementRef.current = element;
107
- };
103
+ const elementRef = useRef< HTMLButtonElement >( null );
108
104
 
109
105
  useIntersectionObserver( elementRef, posinset );
110
106
  const {
@@ -129,7 +125,7 @@ function TableRow< Item >( {
129
125
  return (
130
126
  <Composite.Item
131
127
  key={ id }
132
- ref={ setElementRef }
128
+ ref={ elementRef }
133
129
  render={ ( { children, ...props } ) => (
134
130
  <tr
135
131
  className={ clsx( 'dataviews-view-table__row', {
@@ -162,6 +158,7 @@ function TableRow< Item >( {
162
158
  >
163
159
  <td
164
160
  className="dataviews-view-table__checkbox-column"
161
+ // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
165
162
  role="presentation"
166
163
  >
167
164
  <div className="dataviews-view-table__cell-content-wrapper">
@@ -179,7 +176,10 @@ function TableRow< Item >( {
179
176
  </td>
180
177
 
181
178
  { hasPrimaryColumn && (
182
- <td role="presentation">
179
+ <td
180
+ // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
181
+ role="presentation"
182
+ >
183
183
  <ColumnPrimary
184
184
  item={ item }
185
185
  titleField={ showTitle ? titleField : undefined }
@@ -204,6 +204,7 @@ function TableRow< Item >( {
204
204
  maxWidth,
205
205
  minWidth,
206
206
  } }
207
+ // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
207
208
  role="presentation"
208
209
  >
209
210
  <TableColumnField
@@ -414,6 +415,7 @@ function ViewPickerTable< Item >( {
414
415
  1
415
416
  }
416
417
  className="dataviews-view-table__group-header-cell"
418
+ // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
417
419
  role="presentation"
418
420
  >
419
421
  { view.groupBy?.showLabel === false
@@ -36,7 +36,7 @@
36
36
 
37
37
  // When used in picker context, ensure row selection works as expected
38
38
  .dataviews-view-table__row {
39
- cursor: pointer;
39
+ cursor: var(--wpds-cursor-control);
40
40
 
41
41
  &.is-selected {
42
42
  // Ensure selected rows are visually distinct
@@ -267,7 +267,6 @@ function TableRow< Item >( {
267
267
  // itself (to toggle row selection) without erroneously
268
268
  // intercepting click events from ItemActions.
269
269
 
270
- /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
271
270
  <td
272
271
  className={ clsx( 'dataviews-view-table__actions-column', {
273
272
  'dataviews-view-table__actions-column--sticky': true,
@@ -278,7 +277,6 @@ function TableRow< Item >( {
278
277
  >
279
278
  <ItemActions item={ item } actions={ actions } />
280
279
  </td>
281
- /* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
282
280
  ) }
283
281
  </tr>
284
282
  );
@@ -72,6 +72,7 @@ export function DataViewsPagination() {
72
72
  ),
73
73
  {
74
74
  div: <div aria-hidden />,
75
+ // @ts-expect-error — Tag injected via sprintf argument, not visible in format string.
75
76
  CurrentPage: (
76
77
  <SelectControl
77
78
  aria-label={ __( 'Current page' ) }
@@ -297,7 +297,7 @@ export const HighLevelHelpText: Story = {
297
297
  fields: [
298
298
  {
299
299
  id: 'accountForm',
300
- label: 'Account Information',
300
+ label: 'Account information',
301
301
  description:
302
302
  'We collect this information to create your account and provide personalized services. Your data will be kept secure and used only for account management and service improvements.',
303
303
  children: [ 'name', 'email', 'phone' ],
@@ -54,17 +54,17 @@ const DataAdapterComponent = () => {
54
54
  // for nested data based on the field id.
55
55
  {
56
56
  id: 'user.profile.name',
57
- label: 'User Name',
57
+ label: 'User name',
58
58
  type: 'text',
59
59
  },
60
60
  {
61
61
  id: 'user.profile.email',
62
- label: 'User Email',
62
+ label: 'User email',
63
63
  type: 'email',
64
64
  },
65
65
  {
66
66
  id: 'user.profile.tags',
67
- label: 'User Tags',
67
+ label: 'User tags',
68
68
  type: 'array',
69
69
  placeholder: 'Enter comma-separated tags',
70
70
  description:
@@ -101,13 +101,13 @@ const DataAdapterComponent = () => {
101
101
  // Example of deriving data by leveraging setValue method.
102
102
  {
103
103
  id: 'revenue.total',
104
- label: 'Total Revenue',
104
+ label: 'Total revenue',
105
105
  type: 'integer',
106
106
  readOnly: true,
107
107
  },
108
108
  {
109
109
  id: 'revenue.pricePerUnit',
110
- label: 'Price Per Unit',
110
+ label: 'Price per unit',
111
111
  type: 'integer',
112
112
  setValue: ( { item, value } ) => ( {
113
113
  revenue: {
@@ -174,7 +174,7 @@ const DataAdapterComponent = () => {
174
174
  fields: [
175
175
  {
176
176
  id: 'userProfile',
177
- label: 'User Profile',
177
+ label: 'User profile',
178
178
  children: [
179
179
  'user.profile.name',
180
180
  'user.profile.email',
@@ -93,6 +93,13 @@ export const LayoutRegular = {
93
93
  description: 'Chooses the label position.',
94
94
  options: [ 'default', 'top', 'side', 'none' ],
95
95
  },
96
+ disabled: {
97
+ control: { type: 'boolean' },
98
+ description: 'Disable all fields in the form.',
99
+ },
100
+ },
101
+ args: {
102
+ disabled: false,
96
103
  },
97
104
  };
98
105
 
@@ -44,7 +44,7 @@ const LayoutCardComponent = ( {
44
44
  const customerFields: Field< Customer >[] = [
45
45
  {
46
46
  id: 'name',
47
- label: 'Customer Name',
47
+ label: 'Customer name',
48
48
  type: 'text',
49
49
  },
50
50
  {
@@ -70,17 +70,17 @@ const LayoutCardComponent = ( {
70
70
  },
71
71
  {
72
72
  id: 'shippingAddress',
73
- label: 'Shipping Address',
73
+ label: 'Shipping address',
74
74
  type: 'text',
75
75
  },
76
76
  {
77
77
  id: 'billingAddress',
78
- label: 'Billing Address',
78
+ label: 'Billing address',
79
79
  type: 'text',
80
80
  },
81
81
  {
82
82
  id: 'displayPayments',
83
- label: 'Display Payments?',
83
+ label: 'Display payments?',
84
84
  type: 'boolean',
85
85
  },
86
86
  {
@@ -112,7 +112,7 @@ const LayoutCardComponent = ( {
112
112
  },
113
113
  {
114
114
  id: 'dueDate',
115
- label: 'Due Date',
115
+ label: 'Due date',
116
116
  type: 'text',
117
117
  render: ( { item } ) => {
118
118
  return <Badge>Due on: { item.dueDate }</Badge>;
@@ -123,7 +123,7 @@ const fields: Field< SamplePost >[] = [
123
123
  },
124
124
  {
125
125
  id: 'filesize',
126
- label: 'File Size',
126
+ label: 'File size',
127
127
  type: 'integer',
128
128
  readOnly: true,
129
129
  },
@@ -170,7 +170,7 @@ const fields: Field< SamplePost >[] = [
170
170
  },
171
171
  {
172
172
  id: 'longDescription',
173
- label: 'Long Description',
173
+ label: 'Long description',
174
174
  type: 'text',
175
175
  Edit: {
176
176
  control: 'textarea',
@@ -179,7 +179,7 @@ const fields: Field< SamplePost >[] = [
179
179
  },
180
180
  {
181
181
  id: 'comment_status',
182
- label: 'Comment Status',
182
+ label: 'Comment status',
183
183
  type: 'text',
184
184
  Edit: 'radio',
185
185
  elements: [
@@ -189,7 +189,7 @@ const fields: Field< SamplePost >[] = [
189
189
  },
190
190
  {
191
191
  id: 'ping_status',
192
- label: 'Allow Pings/Trackbacks',
192
+ label: 'Allow pings/trackbacks',
193
193
  type: 'boolean',
194
194
  },
195
195
  {
@@ -223,7 +223,7 @@ const fields: Field< SamplePost >[] = [
223
223
  },
224
224
  {
225
225
  id: 'flight_status',
226
- label: 'Flight Status',
226
+ label: 'Flight status',
227
227
  type: 'text',
228
228
  Edit: 'radio',
229
229
  elements: [
@@ -133,7 +133,7 @@ const fields: Field< SamplePost >[] = [
133
133
  },
134
134
  {
135
135
  id: 'filesize',
136
- label: 'File Size',
136
+ label: 'File size',
137
137
  type: 'integer',
138
138
  readOnly: true,
139
139
  },
@@ -180,7 +180,7 @@ const fields: Field< SamplePost >[] = [
180
180
  },
181
181
  {
182
182
  id: 'longDescription',
183
- label: 'Long Description',
183
+ label: 'Long description',
184
184
  type: 'text',
185
185
  Edit: {
186
186
  control: 'textarea',
@@ -189,7 +189,7 @@ const fields: Field< SamplePost >[] = [
189
189
  },
190
190
  {
191
191
  id: 'comment_status',
192
- label: 'Comment Status',
192
+ label: 'Comment status',
193
193
  type: 'text',
194
194
  Edit: 'radio',
195
195
  elements: [
@@ -199,7 +199,7 @@ const fields: Field< SamplePost >[] = [
199
199
  },
200
200
  {
201
201
  id: 'ping_status',
202
- label: 'Allow Pings/Trackbacks',
202
+ label: 'Allow pings/trackbacks',
203
203
  type: 'boolean',
204
204
  },
205
205
  {
@@ -233,7 +233,7 @@ const fields: Field< SamplePost >[] = [
233
233
  },
234
234
  {
235
235
  id: 'flight_status',
236
- label: 'Flight Status',
236
+ label: 'Flight status',
237
237
  type: 'text',
238
238
  Edit: 'radio',
239
239
  elements: [
@@ -360,7 +360,7 @@ const LayoutPanelComponent = ( {
360
360
  'title',
361
361
  {
362
362
  id: 'status',
363
- label: 'Status & Visibility',
363
+ label: 'Status & visibility',
364
364
  children: [ 'status', 'password' ],
365
365
  },
366
366
  'order',
@@ -375,12 +375,12 @@ const LayoutPanelComponent = ( {
375
375
  },
376
376
  {
377
377
  id: 'address1',
378
- label: 'Combined Address',
378
+ label: 'Combined address',
379
379
  children: [ 'address1', 'address2', 'city' ],
380
380
  },
381
381
  {
382
382
  id: 'flight_info',
383
- label: 'Flight Information',
383
+ label: 'Flight information',
384
384
  children: [
385
385
  'origin',
386
386
  'destination',
@@ -396,7 +396,7 @@ const LayoutPanelComponent = ( {
396
396
  },
397
397
  {
398
398
  id: 'passenger_details',
399
- label: 'Passenger Details',
399
+ label: 'Passenger details',
400
400
  children: [ 'author', 'seat' ],
401
401
  layout: getPanelLayoutFromStoryArgs( {
402
402
  summary: [ 'author', 'seat' ],
@@ -55,11 +55,16 @@ const fields: Field< SamplePost >[] = [
55
55
  {
56
56
  id: 'date',
57
57
  label: 'Date',
58
+ type: 'date',
59
+ },
60
+ {
61
+ id: 'datetime',
62
+ label: 'DateTime',
58
63
  type: 'datetime',
59
64
  },
60
65
  {
61
66
  id: 'birthdate',
62
- label: 'Date as options',
67
+ label: 'DateTime as options',
63
68
  type: 'datetime',
64
69
  elements: [
65
70
  { value: '', label: 'Select a date' },
@@ -126,11 +131,11 @@ const fields: Field< SamplePost >[] = [
126
131
  id: 'can_comment',
127
132
  label: 'Allow people to leave a comment',
128
133
  type: 'boolean',
129
- Edit: 'checkbox',
134
+ Edit: 'toggle',
130
135
  },
131
136
  {
132
137
  id: 'filesize',
133
- label: 'File Size',
138
+ label: 'File size',
134
139
  type: 'integer',
135
140
  readOnly: true,
136
141
  },
@@ -177,7 +182,7 @@ const fields: Field< SamplePost >[] = [
177
182
  },
178
183
  {
179
184
  id: 'longDescription',
180
- label: 'Long Description',
185
+ label: 'Long description',
181
186
  type: 'text',
182
187
  Edit: {
183
188
  control: 'textarea',
@@ -186,7 +191,7 @@ const fields: Field< SamplePost >[] = [
186
191
  },
187
192
  {
188
193
  id: 'comment_status',
189
- label: 'Comment Status',
194
+ label: 'Comment status',
190
195
  type: 'text',
191
196
  Edit: 'radio',
192
197
  elements: [
@@ -196,7 +201,7 @@ const fields: Field< SamplePost >[] = [
196
201
  },
197
202
  {
198
203
  id: 'ping_status',
199
- label: 'Allow Pings/Trackbacks',
204
+ label: 'Allow pings/trackbacks',
200
205
  type: 'boolean',
201
206
  },
202
207
  {
@@ -230,7 +235,7 @@ const fields: Field< SamplePost >[] = [
230
235
  },
231
236
  {
232
237
  id: 'flight_status',
233
- label: 'Flight Status',
238
+ label: 'Flight status',
234
239
  type: 'text',
235
240
  Edit: 'radio',
236
241
  elements: [
@@ -312,8 +317,10 @@ const getLayoutFromStoryArgs = ( {
312
317
 
313
318
  const LayoutRegularComponent = ( {
314
319
  labelPosition,
320
+ disabled = false,
315
321
  }: {
316
322
  labelPosition: 'default' | 'top' | 'side' | 'none';
323
+ disabled?: boolean;
317
324
  } ) => {
318
325
  const [ post, setPost ] = useState( {
319
326
  title: 'Hello, World!',
@@ -322,7 +329,8 @@ const LayoutRegularComponent = ( {
322
329
  status: 'draft',
323
330
  reviewer: 'fulano',
324
331
  email: 'hello@wordpress.org',
325
- date: '2021-01-01T12:00:00',
332
+ date: '2021-01-01',
333
+ datetime: '2021-01-01T12:00:00',
326
334
  birthdate: '1950-02-23T12:00:00',
327
335
  sticky: false,
328
336
  can_comment: false,
@@ -332,6 +340,18 @@ const LayoutRegularComponent = ( {
332
340
  description: 'This is a sample description.',
333
341
  } );
334
342
 
343
+ // Make fields disabled when control is set to disabled.
344
+ const _fields: Field< SamplePost >[] = useMemo( () => {
345
+ if ( ! disabled ) {
346
+ return fields;
347
+ }
348
+
349
+ return fields.map( ( field ) => ( {
350
+ ...field,
351
+ isDisabled: true,
352
+ } ) );
353
+ }, [ disabled ] );
354
+
335
355
  const form: Form = useMemo(
336
356
  () => ( {
337
357
  layout: getLayoutFromStoryArgs( {
@@ -342,14 +362,15 @@ const LayoutRegularComponent = ( {
342
362
  'title',
343
363
  'order',
344
364
  'sticky',
365
+ 'can_comment',
345
366
  'author',
346
367
  'status',
347
368
  'reviewer',
348
369
  'email',
349
370
  'password',
350
371
  'date',
372
+ 'datetime',
351
373
  'birthdate',
352
- 'can_comment',
353
374
  'filesize',
354
375
  'dimensions',
355
376
  'tags',
@@ -363,7 +384,7 @@ const LayoutRegularComponent = ( {
363
384
  return (
364
385
  <DataForm< SamplePost >
365
386
  data={ post }
366
- fields={ fields }
387
+ fields={ _fields }
367
388
  form={ form }
368
389
  onChange={ ( edits ) =>
369
390
  setPost( ( prev ) => ( {
@@ -42,7 +42,7 @@ const LayoutRowComponent = ( {
42
42
  const customerFields: Field< Customer >[] = [
43
43
  {
44
44
  id: 'name',
45
- label: 'Customer Name',
45
+ label: 'Customer name',
46
46
  type: 'text',
47
47
  },
48
48
  {
@@ -57,37 +57,37 @@ const LayoutRowComponent = ( {
57
57
  },
58
58
  {
59
59
  id: 'shippingAddress',
60
- label: 'Shipping Address',
60
+ label: 'Shipping address',
61
61
  type: 'text',
62
62
  },
63
63
  {
64
64
  id: 'shippingCity',
65
- label: 'Shipping City',
65
+ label: 'Shipping city',
66
66
  type: 'text',
67
67
  },
68
68
  {
69
69
  id: 'shippingPostalCode',
70
- label: 'Shipping Postal Code',
70
+ label: 'Shipping postal code',
71
71
  type: 'text',
72
72
  },
73
73
  {
74
74
  id: 'shippingCountry',
75
- label: 'Shipping Country',
75
+ label: 'Shipping country',
76
76
  type: 'text',
77
77
  },
78
78
  {
79
79
  id: 'billingAddress',
80
- label: 'Billing Address',
80
+ label: 'Billing address',
81
81
  type: 'text',
82
82
  },
83
83
  {
84
84
  id: 'billingCity',
85
- label: 'Billing City',
85
+ label: 'Billing city',
86
86
  type: 'text',
87
87
  },
88
88
  {
89
89
  id: 'billingPostalCode',
90
- label: 'Billing Postal Code',
90
+ label: 'Billing postal code',
91
91
  type: 'text',
92
92
  },
93
93
  {
@@ -102,7 +102,7 @@ const LayoutRowComponent = ( {
102
102
  },
103
103
  {
104
104
  id: 'hasDiscount',
105
- label: 'Has Discount?',
105
+ label: 'Has discount?',
106
106
  type: 'boolean',
107
107
  },
108
108
  {
@@ -739,7 +739,7 @@ const ValidationComponent = ( {
739
739
  },
740
740
  {
741
741
  id: 'customEdit',
742
- label: 'Custom Control',
742
+ label: 'Custom control',
743
743
  Edit: CustomEditControl,
744
744
  isValid: {
745
745
  required,
@@ -783,7 +783,7 @@ const ValidationComponent = ( {
783
783
  {
784
784
  id: 'toggleGroup',
785
785
  type: 'text',
786
- label: 'Toggle Group',
786
+ label: 'Toggle group',
787
787
  Edit: 'toggleGroup',
788
788
  elements:
789
789
  elements === 'async'
@@ -849,31 +849,46 @@ const ValidationComponent = ( {
849
849
  id: 'date',
850
850
  type: 'date',
851
851
  label: 'Date',
852
+ description: minMax
853
+ ? 'Must be between Apr 1 and Apr 20, 2026'
854
+ : undefined,
852
855
  isValid: {
853
856
  required,
854
857
  elements: elements !== 'none' ? true : false,
855
858
  custom: maybeCustomRule( customDateRule ),
859
+ min: minMax ? '2026-04-01' : undefined,
860
+ max: minMax ? '2026-04-20' : undefined,
856
861
  },
857
862
  },
858
863
  {
859
864
  id: 'dateRange',
860
865
  type: 'date',
861
- label: 'Date Range',
866
+ label: 'Date range',
862
867
  Edit: DateRangeEdit,
868
+ description: minMax
869
+ ? 'Must be between Apr 1 and Apr 20, 2026'
870
+ : undefined,
863
871
  isValid: {
864
872
  required,
865
873
  elements: elements !== 'none' ? true : false,
866
874
  custom: maybeCustomRule( customDateRangeRule ),
875
+ min: minMax ? '2026-04-01' : undefined,
876
+ max: minMax ? '2026-04-20' : undefined,
867
877
  },
868
878
  },
869
879
  {
870
880
  id: 'datetime',
871
881
  type: 'datetime',
872
- label: 'Date Time',
882
+ label: 'Date time',
883
+ description: minMax
884
+ ? 'Must be between Apr 1 and Apr 20, 2026'
885
+ : undefined,
873
886
  isValid: {
874
887
  required,
875
888
  elements: elements !== 'none' ? true : false,
876
889
  custom: maybeCustomRule( customDateTimeRule ),
890
+ min: minMax ? '2026-04-01T00:00:00.000Z' : undefined,
891
+ max: minMax ? '2026-04-20T23:59:59.000Z' : undefined,
877
892
  },
878
893
  },
879
894
  ];
@@ -947,34 +962,34 @@ const ValidationComponent = ( {
947
962
  const groupedFields = [
948
963
  {
949
964
  id: 'textFields',
950
- label: 'Text Fields',
965
+ label: 'Text fields',
951
966
  children: [ 'text', 'textarea', 'password', 'customEdit' ],
952
967
  },
953
968
  {
954
969
  id: 'numberFields',
955
- label: 'Number Fields',
970
+ label: 'Number fields',
956
971
  children: [ 'integer', 'number' ],
957
972
  },
958
973
  {
959
974
  id: 'contactFields',
960
- label: 'Contact Fields',
975
+ label: 'Contact fields',
961
976
  children: [ 'email', 'telephone', 'url' ],
962
977
  },
963
978
  {
964
979
  id: 'selectFields',
965
- label: 'Selection Fields',
980
+ label: 'Selection fields',
966
981
  children: [ 'select', 'combobox', 'textWithRadio' ],
967
982
  },
968
983
  {
969
984
  id: 'booleanFields',
970
- label: 'Boolean Fields',
985
+ label: 'Boolean fields',
971
986
  children: [ 'boolean', 'toggle', 'toggleGroup' ],
972
987
  },
973
988
  { id: 'color' },
974
989
  { id: 'array' },
975
990
  {
976
991
  id: 'dateFields',
977
- label: 'Date Fields',
992
+ label: 'Date fields',
978
993
  children: [ 'date', 'dateRange', 'datetime' ],
979
994
  },
980
995
  ];