@wordpress/dataviews 9.1.1-next.233ccab9b.0 → 10.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 (787) hide show
  1. package/CHANGELOG.md +42 -1
  2. package/README.md +137 -36
  3. package/build/components/dataform/index.js +52 -28
  4. package/build/components/dataform/index.js.map +7 -1
  5. package/build/components/dataform-context/index.js +33 -25
  6. package/build/components/dataform-context/index.js.map +7 -1
  7. package/build/components/dataviews/index.js +193 -154
  8. package/build/components/dataviews/index.js.map +7 -1
  9. package/build/components/dataviews-bulk-actions/index.js +264 -155
  10. package/build/components/dataviews-bulk-actions/index.js.map +7 -1
  11. package/build/components/dataviews-context/index.js +40 -36
  12. package/build/components/dataviews-context/index.js.map +7 -1
  13. package/build/components/dataviews-filters/add-filter.js +78 -73
  14. package/build/components/dataviews-filters/add-filter.js.map +7 -1
  15. package/build/components/dataviews-filters/filter.js +473 -263
  16. package/build/components/dataviews-filters/filter.js.map +7 -1
  17. package/build/components/dataviews-filters/filters-toggled.js +39 -25
  18. package/build/components/dataviews-filters/filters-toggled.js.map +7 -1
  19. package/build/components/dataviews-filters/filters.js +95 -67
  20. package/build/components/dataviews-filters/filters.js.map +7 -1
  21. package/build/components/dataviews-filters/index.js +44 -31
  22. package/build/components/dataviews-filters/index.js.map +7 -1
  23. package/build/components/dataviews-filters/input-widget.js +88 -89
  24. package/build/components/dataviews-filters/input-widget.js.map +7 -1
  25. package/build/components/dataviews-filters/reset-filters.js +50 -34
  26. package/build/components/dataviews-filters/reset-filters.js.map +7 -1
  27. package/build/components/dataviews-filters/search-widget.js +301 -205
  28. package/build/components/dataviews-filters/search-widget.js.map +7 -1
  29. package/build/components/dataviews-filters/toggle.js +88 -63
  30. package/build/components/dataviews-filters/toggle.js.map +7 -1
  31. package/build/components/dataviews-filters/use-filters.js +40 -29
  32. package/build/components/dataviews-filters/use-filters.js.map +7 -1
  33. package/build/components/dataviews-filters/utils.js +26 -10
  34. package/build/components/dataviews-filters/utils.js.map +7 -1
  35. package/build/components/dataviews-footer/index.js +54 -33
  36. package/build/components/dataviews-footer/index.js.map +7 -1
  37. package/build/components/dataviews-item-actions/index.js +188 -150
  38. package/build/components/dataviews-item-actions/index.js.map +7 -1
  39. package/build/components/dataviews-layout/index.js +64 -49
  40. package/build/components/dataviews-layout/index.js.map +7 -1
  41. package/build/components/dataviews-pagination/index.js +143 -99
  42. package/build/components/dataviews-pagination/index.js.map +7 -1
  43. package/build/components/dataviews-picker/footer.js +152 -101
  44. package/build/components/dataviews-picker/footer.js.map +7 -1
  45. package/build/components/dataviews-picker/index.js +173 -145
  46. package/build/components/dataviews-picker/index.js.map +7 -1
  47. package/build/components/dataviews-search/index.js +63 -46
  48. package/build/components/dataviews-search/index.js.map +7 -1
  49. package/build/components/dataviews-selection-checkbox/index.js +45 -35
  50. package/build/components/dataviews-selection-checkbox/index.js.map +7 -1
  51. package/build/components/dataviews-view-config/index.js +587 -512
  52. package/build/components/dataviews-view-config/index.js.map +7 -1
  53. package/build/components/dataviews-view-config/infinite-scroll-toggle.js +56 -39
  54. package/build/components/dataviews-view-config/infinite-scroll-toggle.js.map +7 -1
  55. package/build/constants.js +215 -108
  56. package/build/constants.js.map +7 -1
  57. package/build/dataform-controls/array.js +109 -145
  58. package/build/dataform-controls/array.js.map +7 -1
  59. package/build/dataform-controls/checkbox.js +56 -66
  60. package/build/dataform-controls/checkbox.js.map +7 -1
  61. package/build/dataform-controls/color.js +112 -119
  62. package/build/dataform-controls/color.js.map +7 -1
  63. package/build/dataform-controls/date.js +531 -349
  64. package/build/dataform-controls/date.js.map +7 -1
  65. package/build/dataform-controls/datetime.js +189 -148
  66. package/build/dataform-controls/datetime.js.map +7 -1
  67. package/build/dataform-controls/email.js +52 -32
  68. package/build/dataform-controls/email.js.map +7 -1
  69. package/build/dataform-controls/index.js +83 -63
  70. package/build/dataform-controls/index.js.map +7 -1
  71. package/build/dataform-controls/integer.js +36 -129
  72. package/build/dataform-controls/integer.js.map +7 -1
  73. package/build/dataform-controls/number.js +39 -0
  74. package/build/dataform-controls/number.js.map +7 -0
  75. package/build/dataform-controls/password.js +66 -38
  76. package/build/dataform-controls/password.js.map +7 -1
  77. package/build/dataform-controls/radio.js +61 -64
  78. package/build/dataform-controls/radio.js.map +7 -1
  79. package/build/dataform-controls/select.js +70 -88
  80. package/build/dataform-controls/select.js.map +7 -1
  81. package/build/dataform-controls/telephone.js +52 -32
  82. package/build/dataform-controls/telephone.js.map +7 -1
  83. package/build/dataform-controls/text.js +52 -30
  84. package/build/dataform-controls/text.js.map +7 -1
  85. package/build/dataform-controls/textarea.js +62 -71
  86. package/build/dataform-controls/textarea.js.map +7 -1
  87. package/build/dataform-controls/toggle-group.js +73 -66
  88. package/build/dataform-controls/toggle-group.js.map +7 -1
  89. package/build/dataform-controls/toggle.js +57 -67
  90. package/build/dataform-controls/toggle.js.map +7 -1
  91. package/build/dataform-controls/url.js +52 -32
  92. package/build/dataform-controls/url.js.map +7 -1
  93. package/build/dataform-controls/utils/get-custom-validity.js +35 -0
  94. package/build/dataform-controls/utils/get-custom-validity.js.map +7 -0
  95. package/build/dataform-controls/utils/relative-date-control.js +122 -0
  96. package/build/dataform-controls/utils/relative-date-control.js.map +7 -0
  97. package/build/dataform-controls/utils/validated-input.js +67 -71
  98. package/build/dataform-controls/utils/validated-input.js.map +7 -1
  99. package/build/dataform-controls/utils/validated-number.js +167 -0
  100. package/build/dataform-controls/utils/validated-number.js.map +7 -0
  101. package/build/dataform-layouts/card/index.js +217 -0
  102. package/build/dataform-layouts/card/index.js.map +7 -0
  103. package/build/dataform-layouts/data-form-layout.js +95 -0
  104. package/build/dataform-layouts/data-form-layout.js.map +7 -0
  105. package/build/dataform-layouts/get-summary-fields.js +45 -0
  106. package/build/dataform-layouts/get-summary-fields.js.map +7 -0
  107. package/build/dataform-layouts/index.js +99 -0
  108. package/build/dataform-layouts/index.js.map +7 -0
  109. package/build/dataform-layouts/is-combined-field.js +31 -0
  110. package/build/dataform-layouts/is-combined-field.js.map +7 -0
  111. package/build/dataform-layouts/normalize-form-fields.js +104 -0
  112. package/build/dataform-layouts/normalize-form-fields.js.map +7 -0
  113. package/build/dataform-layouts/panel/dropdown.js +159 -0
  114. package/build/dataform-layouts/panel/dropdown.js.map +7 -0
  115. package/build/dataform-layouts/panel/index.js +152 -0
  116. package/build/dataform-layouts/panel/index.js.map +7 -0
  117. package/build/dataform-layouts/panel/modal.js +176 -0
  118. package/build/dataform-layouts/panel/modal.js.map +7 -0
  119. package/build/dataform-layouts/panel/summary-button.js +93 -0
  120. package/build/dataform-layouts/panel/summary-button.js.map +7 -0
  121. package/build/dataform-layouts/regular/index.js +139 -0
  122. package/build/dataform-layouts/regular/index.js.map +7 -0
  123. package/build/dataform-layouts/row/index.js +120 -0
  124. package/build/dataform-layouts/row/index.js.map +7 -0
  125. package/build/dataviews-layouts/grid/index.js +337 -278
  126. package/build/dataviews-layouts/grid/index.js.map +7 -1
  127. package/build/dataviews-layouts/grid/preview-size-picker.js +94 -69
  128. package/build/dataviews-layouts/grid/preview-size-picker.js.map +7 -1
  129. package/build/dataviews-layouts/index.js +75 -48
  130. package/build/dataviews-layouts/index.js.map +7 -1
  131. package/build/dataviews-layouts/list/index.js +441 -354
  132. package/build/dataviews-layouts/list/index.js.map +7 -1
  133. package/build/dataviews-layouts/picker-grid/index.js +366 -300
  134. package/build/dataviews-layouts/picker-grid/index.js.map +7 -1
  135. package/build/dataviews-layouts/table/column-header-menu.js +144 -133
  136. package/build/dataviews-layouts/table/column-header-menu.js.map +7 -1
  137. package/build/dataviews-layouts/table/column-primary.js +86 -66
  138. package/build/dataviews-layouts/table/column-primary.js.map +7 -1
  139. package/build/dataviews-layouts/table/density-picker.js +86 -46
  140. package/build/dataviews-layouts/table/density-picker.js.map +7 -1
  141. package/build/dataviews-layouts/table/index.js +354 -319
  142. package/build/dataviews-layouts/table/index.js.map +7 -1
  143. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js +55 -47
  144. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +7 -1
  145. package/build/dataviews-layouts/utils/get-data-by-group.js +24 -13
  146. package/build/dataviews-layouts/utils/get-data-by-group.js.map +7 -1
  147. package/build/dataviews-layouts/utils/grid-items.js +51 -34
  148. package/build/dataviews-layouts/utils/grid-items.js.map +7 -1
  149. package/build/dataviews-layouts/utils/item-click-wrapper.js +53 -31
  150. package/build/dataviews-layouts/utils/item-click-wrapper.js.map +7 -1
  151. package/build/dataviews-layouts/utils/preview-size-picker.js +94 -69
  152. package/build/dataviews-layouts/utils/preview-size-picker.js.map +7 -1
  153. package/build/field-types/array.js +46 -41
  154. package/build/field-types/array.js.map +7 -1
  155. package/build/field-types/boolean.js +52 -47
  156. package/build/field-types/boolean.js.map +7 -1
  157. package/build/field-types/color.js +79 -81
  158. package/build/field-types/color.js.map +7 -1
  159. package/build/field-types/date.js +69 -48
  160. package/build/field-types/date.js.map +7 -1
  161. package/build/field-types/datetime.js +62 -43
  162. package/build/field-types/datetime.js.map +7 -1
  163. package/build/field-types/email.js +58 -47
  164. package/build/field-types/email.js.map +7 -1
  165. package/build/field-types/index.js +84 -89
  166. package/build/field-types/index.js.map +7 -1
  167. package/build/field-types/integer.js +68 -45
  168. package/build/field-types/integer.js.map +7 -1
  169. package/build/field-types/media.js +25 -27
  170. package/build/field-types/media.js.map +7 -1
  171. package/build/field-types/number.js +95 -0
  172. package/build/field-types/number.js.map +7 -0
  173. package/build/field-types/password.js +40 -39
  174. package/build/field-types/password.js.map +7 -1
  175. package/build/field-types/telephone.js +55 -45
  176. package/build/field-types/telephone.js.map +7 -1
  177. package/build/field-types/text.js +55 -46
  178. package/build/field-types/text.js.map +7 -1
  179. package/build/field-types/url.js +55 -45
  180. package/build/field-types/url.js.map +7 -1
  181. package/build/field-types/utils/render-from-elements.js +52 -0
  182. package/build/field-types/utils/render-from-elements.js.map +7 -0
  183. package/build/hooks/index.js +39 -0
  184. package/build/hooks/index.js.map +7 -0
  185. package/build/hooks/use-elements.js +63 -0
  186. package/build/hooks/use-elements.js.map +7 -0
  187. package/build/hooks/use-form-validity.js +426 -0
  188. package/build/hooks/use-form-validity.js.map +7 -0
  189. package/build/index.js +50 -45
  190. package/build/index.js.map +7 -1
  191. package/build/lock-unlock.js +31 -14
  192. package/build/lock-unlock.js.map +7 -1
  193. package/build/types/dataform.js +17 -0
  194. package/build/types/dataform.js.map +7 -0
  195. package/build/types/dataviews.js +17 -0
  196. package/build/types/dataviews.js.map +7 -0
  197. package/build/types/field-api.js +17 -0
  198. package/build/types/field-api.js.map +7 -0
  199. package/build/types/index.js +17 -0
  200. package/build/types/index.js.map +7 -0
  201. package/build/types/private.js +17 -0
  202. package/build/types/private.js.map +7 -0
  203. package/build/utils/filter-sort-and-paginate.js +285 -0
  204. package/build/utils/filter-sort-and-paginate.js.map +7 -0
  205. package/build/utils/has-elements.js +27 -0
  206. package/build/utils/has-elements.js.map +7 -0
  207. package/build/utils/normalize-fields.js +160 -0
  208. package/build/utils/normalize-fields.js.map +7 -0
  209. package/build-module/components/dataform/index.js +25 -25
  210. package/build-module/components/dataform/index.js.map +7 -1
  211. package/build-module/components/dataform-context/index.js +11 -19
  212. package/build-module/components/dataform-context/index.js.map +7 -1
  213. package/build-module/components/dataviews/index.js +154 -127
  214. package/build-module/components/dataviews/index.js.map +7 -1
  215. package/build-module/components/dataviews-bulk-actions/index.js +227 -140
  216. package/build-module/components/dataviews-bulk-actions/index.js.map +7 -1
  217. package/build-module/components/dataviews-context/index.js +20 -30
  218. package/build-module/components/dataviews-context/index.js.map +7 -1
  219. package/build-module/components/dataviews-filters/add-filter.js +60 -68
  220. package/build-module/components/dataviews-filters/add-filter.js.map +7 -1
  221. package/build-module/components/dataviews-filters/filter.js +454 -232
  222. package/build-module/components/dataviews-filters/filter.js.map +7 -1
  223. package/build-module/components/dataviews-filters/filters-toggled.js +11 -19
  224. package/build-module/components/dataviews-filters/filters-toggled.js.map +7 -1
  225. package/build-module/components/dataviews-filters/filters.js +65 -59
  226. package/build-module/components/dataviews-filters/filters.js.map +7 -1
  227. package/build-module/components/dataviews-filters/index.js +11 -5
  228. package/build-module/components/dataviews-filters/index.js.map +7 -1
  229. package/build-module/components/dataviews-filters/input-widget.js +57 -81
  230. package/build-module/components/dataviews-filters/input-widget.js.map +7 -1
  231. package/build-module/components/dataviews-filters/reset-filters.js +33 -30
  232. package/build-module/components/dataviews-filters/reset-filters.js.map +7 -1
  233. package/build-module/components/dataviews-filters/search-widget.js +276 -195
  234. package/build-module/components/dataviews-filters/search-widget.js.map +7 -1
  235. package/build-module/components/dataviews-filters/toggle.js +58 -55
  236. package/build-module/components/dataviews-filters/toggle.js.map +7 -1
  237. package/build-module/components/dataviews-filters/use-filters.js +21 -23
  238. package/build-module/components/dataviews-filters/use-filters.js.map +7 -1
  239. package/build-module/components/dataviews-filters/utils.js +5 -6
  240. package/build-module/components/dataviews-filters/utils.js.map +7 -1
  241. package/build-module/components/dataviews-footer/index.js +28 -26
  242. package/build-module/components/dataviews-footer/index.js.map +7 -1
  243. package/build-module/components/dataviews-item-actions/index.js +171 -144
  244. package/build-module/components/dataviews-item-actions/index.js.map +7 -1
  245. package/build-module/components/dataviews-layout/index.js +35 -42
  246. package/build-module/components/dataviews-layout/index.js.map +7 -1
  247. package/build-module/components/dataviews-pagination/index.js +115 -92
  248. package/build-module/components/dataviews-pagination/index.js.map +7 -1
  249. package/build-module/components/dataviews-picker/footer.js +122 -93
  250. package/build-module/components/dataviews-picker/footer.js.map +7 -1
  251. package/build-module/components/dataviews-picker/index.js +137 -121
  252. package/build-module/components/dataviews-picker/index.js.map +7 -1
  253. package/build-module/components/dataviews-search/index.js +30 -35
  254. package/build-module/components/dataviews-search/index.js.map +7 -1
  255. package/build-module/components/dataviews-selection-checkbox/index.js +28 -31
  256. package/build-module/components/dataviews-selection-checkbox/index.js.map +7 -1
  257. package/build-module/components/dataviews-view-config/index.js +579 -504
  258. package/build-module/components/dataviews-view-config/index.js.map +7 -1
  259. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js +28 -33
  260. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js.map +7 -1
  261. package/build-module/constants.js +157 -101
  262. package/build-module/constants.js.map +7 -1
  263. package/build-module/dataform-controls/array.js +82 -141
  264. package/build-module/dataform-controls/array.js.map +7 -1
  265. package/build-module/dataform-controls/checkbox.js +28 -61
  266. package/build-module/dataform-controls/checkbox.js.map +7 -1
  267. package/build-module/dataform-controls/color.js +89 -115
  268. package/build-module/dataform-controls/color.js.map +7 -1
  269. package/build-module/dataform-controls/date.js +524 -337
  270. package/build-module/dataform-controls/date.js.map +7 -1
  271. package/build-module/dataform-controls/datetime.js +162 -139
  272. package/build-module/dataform-controls/datetime.js.map +7 -1
  273. package/build-module/dataform-controls/email.js +28 -28
  274. package/build-module/dataform-controls/email.js.map +7 -1
  275. package/build-module/dataform-controls/index.js +36 -43
  276. package/build-module/dataform-controls/index.js.map +7 -1
  277. package/build-module/dataform-controls/integer.js +8 -123
  278. package/build-module/dataform-controls/integer.js.map +7 -1
  279. package/build-module/dataform-controls/number.js +9 -0
  280. package/build-module/dataform-controls/number.js.map +7 -0
  281. package/build-module/dataform-controls/password.js +37 -30
  282. package/build-module/dataform-controls/password.js.map +7 -1
  283. package/build-module/dataform-controls/radio.js +34 -60
  284. package/build-module/dataform-controls/radio.js.map +7 -1
  285. package/build-module/dataform-controls/select.js +43 -84
  286. package/build-module/dataform-controls/select.js.map +7 -1
  287. package/build-module/dataform-controls/telephone.js +28 -28
  288. package/build-module/dataform-controls/telephone.js.map +7 -1
  289. package/build-module/dataform-controls/text.js +25 -26
  290. package/build-module/dataform-controls/text.js.map +7 -1
  291. package/build-module/dataform-controls/textarea.js +35 -67
  292. package/build-module/dataform-controls/textarea.js.map +7 -1
  293. package/build-module/dataform-controls/toggle-group.js +50 -62
  294. package/build-module/dataform-controls/toggle-group.js.map +7 -1
  295. package/build-module/dataform-controls/toggle.js +29 -62
  296. package/build-module/dataform-controls/toggle.js.map +7 -1
  297. package/build-module/dataform-controls/url.js +28 -28
  298. package/build-module/dataform-controls/url.js.map +7 -1
  299. package/build-module/dataform-controls/utils/get-custom-validity.js +15 -0
  300. package/build-module/dataform-controls/utils/get-custom-validity.js.map +7 -0
  301. package/build-module/dataform-controls/utils/relative-date-control.js +97 -0
  302. package/build-module/dataform-controls/utils/relative-date-control.js.map +7 -0
  303. package/build-module/dataform-controls/utils/validated-input.js +40 -67
  304. package/build-module/dataform-controls/utils/validated-input.js.map +7 -1
  305. package/build-module/dataform-controls/utils/validated-number.js +142 -0
  306. package/build-module/dataform-controls/utils/validated-number.js.map +7 -0
  307. package/build-module/dataform-layouts/card/index.js +183 -0
  308. package/build-module/dataform-layouts/card/index.js.map +7 -0
  309. package/build-module/dataform-layouts/data-form-layout.js +61 -0
  310. package/build-module/dataform-layouts/data-form-layout.js.map +7 -0
  311. package/build-module/dataform-layouts/get-summary-fields.js +21 -0
  312. package/build-module/dataform-layouts/get-summary-fields.js.map +7 -0
  313. package/build-module/dataform-layouts/index.js +68 -0
  314. package/build-module/dataform-layouts/index.js.map +7 -0
  315. package/build-module/dataform-layouts/is-combined-field.js +7 -0
  316. package/build-module/dataform-layouts/is-combined-field.js.map +7 -0
  317. package/build-module/dataform-layouts/normalize-form-fields.js +79 -0
  318. package/build-module/dataform-layouts/normalize-form-fields.js.map +7 -0
  319. package/build-module/dataform-layouts/panel/dropdown.js +136 -0
  320. package/build-module/dataform-layouts/panel/dropdown.js.map +7 -0
  321. package/build-module/dataform-layouts/panel/index.js +125 -0
  322. package/build-module/dataform-layouts/panel/index.js.map +7 -0
  323. package/build-module/dataform-layouts/panel/modal.js +151 -0
  324. package/build-module/dataform-layouts/panel/modal.js.map +7 -0
  325. package/build-module/dataform-layouts/panel/summary-button.js +73 -0
  326. package/build-module/dataform-layouts/panel/summary-button.js.map +7 -0
  327. package/build-module/dataform-layouts/regular/index.js +115 -0
  328. package/build-module/dataform-layouts/regular/index.js.map +7 -0
  329. package/build-module/dataform-layouts/row/index.js +95 -0
  330. package/build-module/dataform-layouts/row/index.js.map +7 -0
  331. package/build-module/dataviews-layouts/grid/index.js +316 -267
  332. package/build-module/dataviews-layouts/grid/index.js.map +7 -1
  333. package/build-module/dataviews-layouts/grid/preview-size-picker.js +66 -63
  334. package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +7 -1
  335. package/build-module/dataviews-layouts/index.js +53 -42
  336. package/build-module/dataviews-layouts/index.js.map +7 -1
  337. package/build-module/dataviews-layouts/list/index.js +422 -339
  338. package/build-module/dataviews-layouts/list/index.js.map +7 -1
  339. package/build-module/dataviews-layouts/picker-grid/index.js +344 -291
  340. package/build-module/dataviews-layouts/picker-grid/index.js.map +7 -1
  341. package/build-module/dataviews-layouts/table/column-header-menu.js +129 -127
  342. package/build-module/dataviews-layouts/table/column-header-menu.js.map +7 -1
  343. package/build-module/dataviews-layouts/table/column-primary.js +71 -62
  344. package/build-module/dataviews-layouts/table/column-primary.js.map +7 -1
  345. package/build-module/dataviews-layouts/table/density-picker.js +61 -40
  346. package/build-module/dataviews-layouts/table/density-picker.js.map +7 -1
  347. package/build-module/dataviews-layouts/table/index.js +326 -302
  348. package/build-module/dataviews-layouts/table/index.js.map +7 -1
  349. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js +31 -40
  350. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +7 -1
  351. package/build-module/dataviews-layouts/utils/get-data-by-group.js +7 -10
  352. package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +7 -1
  353. package/build-module/dataviews-layouts/utils/grid-items.js +19 -28
  354. package/build-module/dataviews-layouts/utils/grid-items.js.map +7 -1
  355. package/build-module/dataviews-layouts/utils/item-click-wrapper.js +32 -28
  356. package/build-module/dataviews-layouts/utils/item-click-wrapper.js.map +7 -1
  357. package/build-module/dataviews-layouts/utils/preview-size-picker.js +66 -63
  358. package/build-module/dataviews-layouts/utils/preview-size-picker.js.map +7 -1
  359. package/build-module/field-types/array.js +32 -37
  360. package/build-module/field-types/array.js.map +7 -1
  361. package/build-module/field-types/boolean.js +22 -41
  362. package/build-module/field-types/boolean.js.map +7 -1
  363. package/build-module/field-types/color.js +51 -72
  364. package/build-module/field-types/color.js.map +7 -1
  365. package/build-module/field-types/date.js +51 -44
  366. package/build-module/field-types/date.js.map +7 -1
  367. package/build-module/field-types/datetime.js +43 -39
  368. package/build-module/field-types/datetime.js.map +7 -1
  369. package/build-module/field-types/email.js +39 -42
  370. package/build-module/field-types/email.js.map +7 -1
  371. package/build-module/field-types/index.js +43 -72
  372. package/build-module/field-types/index.js.map +7 -1
  373. package/build-module/field-types/integer.js +52 -41
  374. package/build-module/field-types/integer.js.map +7 -1
  375. package/build-module/field-types/media.js +7 -23
  376. package/build-module/field-types/media.js.map +7 -1
  377. package/build-module/field-types/number.js +77 -0
  378. package/build-module/field-types/number.js.map +7 -0
  379. package/build-module/field-types/password.js +12 -36
  380. package/build-module/field-types/password.js.map +7 -1
  381. package/build-module/field-types/telephone.js +36 -40
  382. package/build-module/field-types/telephone.js.map +7 -1
  383. package/build-module/field-types/text.js +36 -41
  384. package/build-module/field-types/text.js.map +7 -1
  385. package/build-module/field-types/url.js +36 -40
  386. package/build-module/field-types/url.js.map +7 -1
  387. package/build-module/field-types/utils/render-from-elements.js +22 -0
  388. package/build-module/field-types/utils/render-from-elements.js.map +7 -0
  389. package/build-module/hooks/index.js +5 -0
  390. package/build-module/hooks/index.js.map +7 -0
  391. package/build-module/hooks/use-elements.js +43 -0
  392. package/build-module/hooks/use-elements.js.map +7 -0
  393. package/build-module/hooks/use-form-validity.js +392 -0
  394. package/build-module/hooks/use-form-validity.js.map +7 -0
  395. package/build-module/index.js +15 -7
  396. package/build-module/index.js.map +7 -1
  397. package/build-module/lock-unlock.js +8 -7
  398. package/build-module/lock-unlock.js.map +7 -1
  399. package/build-module/types/dataform.js +1 -0
  400. package/build-module/types/dataform.js.map +7 -0
  401. package/build-module/types/dataviews.js +1 -0
  402. package/build-module/types/dataviews.js.map +7 -0
  403. package/build-module/types/field-api.js +1 -0
  404. package/build-module/types/field-api.js.map +7 -0
  405. package/build-module/types/index.js +1 -0
  406. package/build-module/types/index.js.map +7 -0
  407. package/build-module/types/private.js +1 -0
  408. package/build-module/types/private.js.map +7 -0
  409. package/build-module/utils/filter-sort-and-paginate.js +278 -0
  410. package/build-module/utils/filter-sort-and-paginate.js.map +7 -0
  411. package/build-module/utils/has-elements.js +7 -0
  412. package/build-module/utils/has-elements.js.map +7 -0
  413. package/build-module/utils/normalize-fields.js +134 -0
  414. package/build-module/utils/normalize-fields.js.map +7 -0
  415. package/build-style/style-rtl.css +81 -217
  416. package/build-style/style.css +81 -217
  417. package/build-types/components/dataform/index.d.ts +1 -1
  418. package/build-types/components/dataform/index.d.ts.map +1 -1
  419. package/build-types/components/dataform-context/index.d.ts.map +1 -1
  420. package/build-types/components/dataviews-bulk-actions/index.d.ts +1 -1
  421. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
  422. package/build-types/components/dataviews-context/index.d.ts +1 -1
  423. package/build-types/components/dataviews-filters/filter.d.ts +1 -1
  424. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
  425. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -1
  426. package/build-types/components/dataviews-filters/use-filters.d.ts.map +1 -1
  427. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
  428. package/build-types/components/dataviews-picker/footer.d.ts.map +1 -1
  429. package/build-types/components/dataviews-selection-checkbox/index.d.ts +1 -1
  430. package/build-types/dataform-controls/array.d.ts +1 -1
  431. package/build-types/dataform-controls/array.d.ts.map +1 -1
  432. package/build-types/dataform-controls/checkbox.d.ts +1 -1
  433. package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
  434. package/build-types/dataform-controls/color.d.ts +1 -1
  435. package/build-types/dataform-controls/color.d.ts.map +1 -1
  436. package/build-types/dataform-controls/date.d.ts +1 -1
  437. package/build-types/dataform-controls/date.d.ts.map +1 -1
  438. package/build-types/dataform-controls/datetime.d.ts +1 -1
  439. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  440. package/build-types/dataform-controls/email.d.ts +1 -1
  441. package/build-types/dataform-controls/email.d.ts.map +1 -1
  442. package/build-types/dataform-controls/index.d.ts.map +1 -1
  443. package/build-types/dataform-controls/integer.d.ts +4 -1
  444. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  445. package/build-types/dataform-controls/number.d.ts +6 -0
  446. package/build-types/dataform-controls/number.d.ts.map +1 -0
  447. package/build-types/dataform-controls/password.d.ts +1 -1
  448. package/build-types/dataform-controls/password.d.ts.map +1 -1
  449. package/build-types/dataform-controls/radio.d.ts +1 -1
  450. package/build-types/dataform-controls/radio.d.ts.map +1 -1
  451. package/build-types/dataform-controls/select.d.ts +1 -1
  452. package/build-types/dataform-controls/select.d.ts.map +1 -1
  453. package/build-types/dataform-controls/telephone.d.ts +1 -1
  454. package/build-types/dataform-controls/telephone.d.ts.map +1 -1
  455. package/build-types/dataform-controls/text.d.ts +1 -1
  456. package/build-types/dataform-controls/text.d.ts.map +1 -1
  457. package/build-types/dataform-controls/textarea.d.ts +1 -1
  458. package/build-types/dataform-controls/textarea.d.ts.map +1 -1
  459. package/build-types/dataform-controls/toggle-group.d.ts +1 -1
  460. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
  461. package/build-types/dataform-controls/toggle.d.ts +1 -1
  462. package/build-types/dataform-controls/toggle.d.ts.map +1 -1
  463. package/build-types/dataform-controls/url.d.ts +1 -1
  464. package/build-types/dataform-controls/url.d.ts.map +1 -1
  465. package/build-types/dataform-controls/utils/get-custom-validity.d.ts +9 -0
  466. package/build-types/dataform-controls/utils/get-custom-validity.d.ts.map +1 -0
  467. package/build-types/dataform-controls/utils/relative-date-control.d.ts +5 -0
  468. package/build-types/dataform-controls/utils/relative-date-control.d.ts.map +1 -0
  469. package/build-types/dataform-controls/utils/validated-input.d.ts +1 -1
  470. package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -1
  471. package/build-types/dataform-controls/utils/validated-number.d.ts +9 -0
  472. package/build-types/dataform-controls/utils/validated-number.d.ts.map +1 -0
  473. package/build-types/{dataforms-layouts → dataform-layouts}/card/index.d.ts +1 -1
  474. package/build-types/dataform-layouts/card/index.d.ts.map +1 -0
  475. package/build-types/{dataforms-layouts → dataform-layouts}/data-form-layout.d.ts +5 -3
  476. package/build-types/dataform-layouts/data-form-layout.d.ts.map +1 -0
  477. package/build-types/dataform-layouts/get-summary-fields.d.ts +12 -0
  478. package/build-types/dataform-layouts/get-summary-fields.d.ts.map +1 -0
  479. package/build-types/{dataforms-layouts → dataform-layouts}/index.d.ts +0 -5
  480. package/build-types/dataform-layouts/index.d.ts.map +1 -0
  481. package/build-types/dataform-layouts/is-combined-field.d.ts.map +1 -0
  482. package/build-types/{normalize-form-fields.d.ts → dataform-layouts/normalize-form-fields.d.ts} +1 -1
  483. package/build-types/dataform-layouts/normalize-form-fields.d.ts.map +1 -0
  484. package/build-types/{dataforms-layouts → dataform-layouts}/panel/dropdown.d.ts +8 -7
  485. package/build-types/dataform-layouts/panel/dropdown.d.ts.map +1 -0
  486. package/build-types/{dataforms-layouts → dataform-layouts}/panel/index.d.ts +1 -1
  487. package/build-types/dataform-layouts/panel/index.d.ts.map +1 -0
  488. package/build-types/{dataforms-layouts → dataform-layouts}/panel/modal.d.ts +5 -5
  489. package/build-types/dataform-layouts/panel/modal.d.ts.map +1 -0
  490. package/build-types/dataform-layouts/panel/summary-button.d.ts.map +1 -0
  491. package/build-types/{dataforms-layouts → dataform-layouts}/regular/index.d.ts +1 -1
  492. package/build-types/dataform-layouts/regular/index.d.ts.map +1 -0
  493. package/build-types/{dataforms-layouts → dataform-layouts}/row/index.d.ts +1 -1
  494. package/build-types/dataform-layouts/row/index.d.ts.map +1 -0
  495. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  496. package/build-types/dataviews-layouts/utils/item-click-wrapper.d.ts +1 -1
  497. package/build-types/dataviews-layouts/utils/item-click-wrapper.d.ts.map +1 -1
  498. package/build-types/field-types/array.d.ts.map +1 -1
  499. package/build-types/field-types/boolean.d.ts +2 -1
  500. package/build-types/field-types/boolean.d.ts.map +1 -1
  501. package/build-types/field-types/color.d.ts +2 -1
  502. package/build-types/field-types/color.d.ts.map +1 -1
  503. package/build-types/field-types/date.d.ts +4 -3
  504. package/build-types/field-types/date.d.ts.map +1 -1
  505. package/build-types/field-types/datetime.d.ts +3 -2
  506. package/build-types/field-types/datetime.d.ts.map +1 -1
  507. package/build-types/field-types/email.d.ts +3 -2
  508. package/build-types/field-types/email.d.ts.map +1 -1
  509. package/build-types/field-types/index.d.ts.map +1 -1
  510. package/build-types/field-types/integer.d.ts +2 -1
  511. package/build-types/field-types/integer.d.ts.map +1 -1
  512. package/build-types/field-types/media.d.ts +2 -5
  513. package/build-types/field-types/media.d.ts.map +1 -1
  514. package/build-types/field-types/number.d.ts +21 -0
  515. package/build-types/field-types/number.d.ts.map +1 -0
  516. package/build-types/field-types/password.d.ts +4 -3
  517. package/build-types/field-types/password.d.ts.map +1 -1
  518. package/build-types/field-types/telephone.d.ts +4 -3
  519. package/build-types/field-types/telephone.d.ts.map +1 -1
  520. package/build-types/field-types/text.d.ts +4 -3
  521. package/build-types/field-types/text.d.ts.map +1 -1
  522. package/build-types/field-types/url.d.ts +4 -3
  523. package/build-types/field-types/url.d.ts.map +1 -1
  524. package/build-types/field-types/utils/render-from-elements.d.ts +6 -0
  525. package/build-types/field-types/utils/render-from-elements.d.ts.map +1 -0
  526. package/build-types/hooks/index.d.ts +5 -0
  527. package/build-types/hooks/index.d.ts.map +1 -0
  528. package/build-types/hooks/use-elements.d.ts +12 -0
  529. package/build-types/hooks/use-elements.d.ts.map +1 -0
  530. package/build-types/hooks/use-form-validity.d.ts +16 -0
  531. package/build-types/hooks/use-form-validity.d.ts.map +1 -0
  532. package/build-types/index.d.ts +2 -2
  533. package/build-types/index.d.ts.map +1 -1
  534. package/build-types/{components/dataform/stories/index.story.d.ts → stories/dataform.story.d.ts} +16 -6
  535. package/build-types/stories/dataform.story.d.ts.map +1 -0
  536. package/build-types/{components/dataviews-picker/stories/index.story.d.ts → stories/dataviews-picker.story.d.ts} +2 -2
  537. package/build-types/stories/dataviews-picker.story.d.ts.map +1 -0
  538. package/build-types/{components/dataviews/stories/fixtures.d.ts → stories/dataviews.fixtures.d.ts} +2 -2
  539. package/build-types/stories/dataviews.fixtures.d.ts.map +1 -0
  540. package/build-types/{components/dataviews/stories/index.story.d.ts → stories/dataviews.story.d.ts} +3 -3
  541. package/build-types/stories/dataviews.story.d.ts.map +1 -0
  542. package/build-types/stories/field-types.story.d.ts +157 -0
  543. package/build-types/stories/field-types.story.d.ts.map +1 -0
  544. package/build-types/test/use-form-validity.d.ts +2 -0
  545. package/build-types/test/use-form-validity.d.ts.map +1 -0
  546. package/build-types/types/dataform.d.ts +112 -0
  547. package/build-types/types/dataform.d.ts.map +1 -0
  548. package/build-types/types/dataviews.d.ts +341 -0
  549. package/build-types/types/dataviews.d.ts.map +1 -0
  550. package/build-types/types/field-api.d.ts +298 -0
  551. package/build-types/types/field-api.d.ts.map +1 -0
  552. package/build-types/types/index.d.ts +4 -0
  553. package/build-types/types/index.d.ts.map +1 -0
  554. package/build-types/{private-types.d.ts → types/private.d.ts} +1 -1
  555. package/build-types/types/private.d.ts.map +1 -0
  556. package/build-types/{filter-and-sort-data-view.d.ts → utils/filter-sort-and-paginate.d.ts} +3 -3
  557. package/build-types/utils/filter-sort-and-paginate.d.ts.map +1 -0
  558. package/build-types/utils/has-elements.d.ts +6 -0
  559. package/build-types/utils/has-elements.d.ts.map +1 -0
  560. package/build-types/utils/normalize-fields.d.ts +9 -0
  561. package/build-types/utils/normalize-fields.d.ts.map +1 -0
  562. package/build-wp/index.js +3151 -2714
  563. package/package.json +16 -18
  564. package/src/components/dataform/index.tsx +9 -3
  565. package/src/components/dataform-context/index.tsx +3 -1
  566. package/src/components/dataviews/index.tsx +2 -2
  567. package/src/components/dataviews/style.scss +4 -0
  568. package/src/components/dataviews-bulk-actions/index.tsx +1 -2
  569. package/src/components/dataviews-bulk-actions/style.scss +3 -0
  570. package/src/components/dataviews-context/index.ts +1 -1
  571. package/src/components/dataviews-filters/filter.tsx +11 -5
  572. package/src/components/dataviews-filters/search-widget.tsx +30 -3
  573. package/src/components/dataviews-filters/style.scss +21 -6
  574. package/src/components/dataviews-filters/use-filters.ts +4 -2
  575. package/src/components/dataviews-footer/style.scss +4 -0
  576. package/src/components/dataviews-item-actions/index.tsx +6 -2
  577. package/src/components/dataviews-item-actions/style.scss +3 -0
  578. package/src/components/dataviews-pagination/style.scss +3 -0
  579. package/src/components/dataviews-picker/footer.tsx +2 -4
  580. package/src/components/dataviews-picker/index.tsx +2 -2
  581. package/src/components/dataviews-picker/style.scss +2 -0
  582. package/src/components/dataviews-selection-checkbox/index.tsx +1 -1
  583. package/src/components/dataviews-selection-checkbox/style.scss +3 -0
  584. package/src/components/dataviews-view-config/style.scss +3 -0
  585. package/src/dataform-controls/array.tsx +16 -82
  586. package/src/dataform-controls/checkbox.tsx +5 -41
  587. package/src/dataform-controls/color.tsx +5 -37
  588. package/src/dataform-controls/date.tsx +375 -238
  589. package/src/dataform-controls/datetime.tsx +92 -60
  590. package/src/dataform-controls/email.tsx +2 -0
  591. package/src/dataform-controls/index.tsx +4 -1
  592. package/src/dataform-controls/integer.tsx +3 -179
  593. package/src/dataform-controls/number.tsx +10 -0
  594. package/src/dataform-controls/password.tsx +2 -0
  595. package/src/dataform-controls/radio.tsx +24 -55
  596. package/src/dataform-controls/select.tsx +14 -61
  597. package/src/dataform-controls/style.scss +2 -0
  598. package/src/dataform-controls/telephone.tsx +2 -0
  599. package/src/dataform-controls/text.tsx +2 -0
  600. package/src/dataform-controls/textarea.tsx +6 -42
  601. package/src/dataform-controls/toggle-group.tsx +38 -64
  602. package/src/dataform-controls/toggle.tsx +6 -42
  603. package/src/dataform-controls/url.tsx +2 -0
  604. package/src/dataform-controls/utils/get-custom-validity.ts +24 -0
  605. package/src/dataform-controls/{relative-date-control.tsx → utils/relative-date-control.tsx} +37 -25
  606. package/src/dataform-controls/utils/validated-input.tsx +4 -40
  607. package/src/dataform-controls/utils/validated-number.tsx +171 -0
  608. package/src/{dataforms-layouts → dataform-layouts}/card/index.tsx +106 -8
  609. package/src/dataform-layouts/card/style.scss +24 -0
  610. package/src/{dataforms-layouts → dataform-layouts}/data-form-layout.tsx +22 -5
  611. package/src/dataform-layouts/get-summary-fields.ts +42 -0
  612. package/src/{dataforms-layouts → dataform-layouts}/index.tsx +32 -2
  613. package/src/{normalize-form-fields.ts → dataform-layouts/normalize-form-fields.ts} +28 -1
  614. package/src/{dataforms-layouts → dataform-layouts}/panel/dropdown.tsx +36 -15
  615. package/src/{dataforms-layouts → dataform-layouts}/panel/index.tsx +88 -55
  616. package/src/{dataforms-layouts → dataform-layouts}/panel/modal.tsx +42 -31
  617. package/src/{dataforms-layouts → dataform-layouts}/panel/style.scss +3 -0
  618. package/src/{dataforms-layouts → dataform-layouts}/regular/index.tsx +5 -1
  619. package/src/{dataforms-layouts → dataform-layouts}/regular/style.scss +2 -0
  620. package/src/{dataforms-layouts → dataform-layouts}/row/index.tsx +9 -4
  621. package/src/dataform-layouts/style.scss +5 -0
  622. package/src/dataviews-layouts/grid/index.tsx +1 -1
  623. package/src/dataviews-layouts/grid/style.scss +8 -3
  624. package/src/dataviews-layouts/list/index.tsx +0 -2
  625. package/src/dataviews-layouts/list/style.scss +3 -0
  626. package/src/dataviews-layouts/picker-grid/index.tsx +1 -1
  627. package/src/dataviews-layouts/picker-grid/style.scss +8 -4
  628. package/src/dataviews-layouts/table/column-header-menu.tsx +1 -1
  629. package/src/dataviews-layouts/table/index.tsx +1 -1
  630. package/src/dataviews-layouts/table/style.scss +9 -0
  631. package/src/dataviews-layouts/utils/grid-items.scss +2 -0
  632. package/src/dataviews-layouts/utils/item-click-wrapper.tsx +40 -2
  633. package/src/field-types/array.tsx +1 -0
  634. package/src/field-types/boolean.tsx +4 -3
  635. package/src/field-types/color.tsx +4 -10
  636. package/src/field-types/{date.ts → date.tsx} +5 -16
  637. package/src/field-types/datetime.tsx +8 -21
  638. package/src/field-types/email.tsx +7 -11
  639. package/src/field-types/index.tsx +13 -23
  640. package/src/field-types/integer.tsx +7 -11
  641. package/src/field-types/media.tsx +3 -17
  642. package/src/field-types/number.tsx +92 -0
  643. package/src/field-types/password.tsx +8 -21
  644. package/src/field-types/telephone.tsx +8 -21
  645. package/src/field-types/text.tsx +8 -21
  646. package/src/field-types/url.tsx +8 -21
  647. package/src/field-types/utils/render-from-elements.tsx +29 -0
  648. package/src/hooks/index.ts +4 -0
  649. package/src/hooks/use-elements.ts +66 -0
  650. package/src/hooks/use-form-validity.ts +571 -0
  651. package/src/index.ts +2 -2
  652. package/src/{components/dataform/stories/index.story.tsx → stories/dataform.story.tsx} +455 -63
  653. package/src/{components/dataviews-picker/stories/index.story.tsx → stories/dataviews-picker.story.tsx} +5 -9
  654. package/src/{components/dataviews/stories/fixtures.tsx → stories/dataviews.fixtures.tsx} +36 -5
  655. package/src/{components/dataviews/stories/index.story.tsx → stories/dataviews.story.tsx} +7 -8
  656. package/src/{field-types/stories/index.story.tsx → stories/field-types.story.tsx} +244 -48
  657. package/src/style.scss +19 -18
  658. package/src/test/dataform.tsx +36 -0
  659. package/src/test/dataviews-picker.tsx +1 -1
  660. package/src/test/dataviews.tsx +1 -2
  661. package/src/test/{filter-and-sort-data-view.js → filter-sort-and-paginate.js} +63 -16
  662. package/src/test/normalize-fields.ts +23 -1
  663. package/src/test/normalize-form-fields.ts +54 -5
  664. package/src/test/use-form-validity.ts +546 -0
  665. package/src/types/dataform.ts +144 -0
  666. package/src/types/dataviews.ts +443 -0
  667. package/src/types/field-api.ts +381 -0
  668. package/src/types/index.ts +3 -0
  669. package/src/{filter-and-sort-data-view.ts → utils/filter-sort-and-paginate.ts} +4 -4
  670. package/src/utils/has-elements.ts +11 -0
  671. package/src/{normalize-fields.ts → utils/normalize-fields.ts} +13 -8
  672. package/tsconfig.tsbuildinfo +1 -1
  673. package/build/dataform-controls/relative-date-control.js +0 -105
  674. package/build/dataform-controls/relative-date-control.js.map +0 -1
  675. package/build/dataforms-layouts/card/index.js +0 -136
  676. package/build/dataforms-layouts/card/index.js.map +0 -1
  677. package/build/dataforms-layouts/data-form-layout.js +0 -71
  678. package/build/dataforms-layouts/data-form-layout.js.map +0 -1
  679. package/build/dataforms-layouts/index.js +0 -58
  680. package/build/dataforms-layouts/index.js.map +0 -1
  681. package/build/dataforms-layouts/is-combined-field.js +0 -14
  682. package/build/dataforms-layouts/is-combined-field.js.map +0 -1
  683. package/build/dataforms-layouts/panel/dropdown.js +0 -120
  684. package/build/dataforms-layouts/panel/dropdown.js.map +0 -1
  685. package/build/dataforms-layouts/panel/index.js +0 -126
  686. package/build/dataforms-layouts/panel/index.js.map +0 -1
  687. package/build/dataforms-layouts/panel/modal.js +0 -120
  688. package/build/dataforms-layouts/panel/modal.js.map +0 -1
  689. package/build/dataforms-layouts/panel/summary-button.js +0 -67
  690. package/build/dataforms-layouts/panel/summary-button.js.map +0 -1
  691. package/build/dataforms-layouts/regular/index.js +0 -116
  692. package/build/dataforms-layouts/regular/index.js.map +0 -1
  693. package/build/dataforms-layouts/row/index.js +0 -113
  694. package/build/dataforms-layouts/row/index.js.map +0 -1
  695. package/build/filter-and-sort-data-view.js +0 -313
  696. package/build/filter-and-sort-data-view.js.map +0 -1
  697. package/build/normalize-fields.js +0 -155
  698. package/build/normalize-fields.js.map +0 -1
  699. package/build/normalize-form-fields.js +0 -81
  700. package/build/normalize-form-fields.js.map +0 -1
  701. package/build/private-types.js +0 -6
  702. package/build/private-types.js.map +0 -1
  703. package/build/types.js +0 -6
  704. package/build/types.js.map +0 -1
  705. package/build/utils.js +0 -22
  706. package/build/utils.js.map +0 -1
  707. package/build/validation.js +0 -61
  708. package/build/validation.js.map +0 -1
  709. package/build-module/dataform-controls/relative-date-control.js +0 -96
  710. package/build-module/dataform-controls/relative-date-control.js.map +0 -1
  711. package/build-module/dataforms-layouts/card/index.js +0 -127
  712. package/build-module/dataforms-layouts/card/index.js.map +0 -1
  713. package/build-module/dataforms-layouts/data-form-layout.js +0 -62
  714. package/build-module/dataforms-layouts/data-form-layout.js.map +0 -1
  715. package/build-module/dataforms-layouts/index.js +0 -51
  716. package/build-module/dataforms-layouts/index.js.map +0 -1
  717. package/build-module/dataforms-layouts/is-combined-field.js +0 -8
  718. package/build-module/dataforms-layouts/is-combined-field.js.map +0 -1
  719. package/build-module/dataforms-layouts/panel/dropdown.js +0 -113
  720. package/build-module/dataforms-layouts/panel/dropdown.js.map +0 -1
  721. package/build-module/dataforms-layouts/panel/index.js +0 -119
  722. package/build-module/dataforms-layouts/panel/index.js.map +0 -1
  723. package/build-module/dataforms-layouts/panel/modal.js +0 -113
  724. package/build-module/dataforms-layouts/panel/modal.js.map +0 -1
  725. package/build-module/dataforms-layouts/panel/summary-button.js +0 -60
  726. package/build-module/dataforms-layouts/panel/summary-button.js.map +0 -1
  727. package/build-module/dataforms-layouts/regular/index.js +0 -109
  728. package/build-module/dataforms-layouts/regular/index.js.map +0 -1
  729. package/build-module/dataforms-layouts/row/index.js +0 -106
  730. package/build-module/dataforms-layouts/row/index.js.map +0 -1
  731. package/build-module/filter-and-sort-data-view.js +0 -305
  732. package/build-module/filter-and-sort-data-view.js.map +0 -1
  733. package/build-module/normalize-fields.js +0 -145
  734. package/build-module/normalize-fields.js.map +0 -1
  735. package/build-module/normalize-form-fields.js +0 -73
  736. package/build-module/normalize-form-fields.js.map +0 -1
  737. package/build-module/private-types.js +0 -2
  738. package/build-module/private-types.js.map +0 -1
  739. package/build-module/types.js +0 -2
  740. package/build-module/types.js.map +0 -1
  741. package/build-module/utils.js +0 -16
  742. package/build-module/utils.js.map +0 -1
  743. package/build-module/validation.js +0 -54
  744. package/build-module/validation.js.map +0 -1
  745. package/build-types/components/dataform/stories/index.story.d.ts.map +0 -1
  746. package/build-types/components/dataviews/stories/fixtures.d.ts.map +0 -1
  747. package/build-types/components/dataviews/stories/index.story.d.ts.map +0 -1
  748. package/build-types/components/dataviews-picker/stories/index.story.d.ts.map +0 -1
  749. package/build-types/dataform-controls/relative-date-control.d.ts +0 -47
  750. package/build-types/dataform-controls/relative-date-control.d.ts.map +0 -1
  751. package/build-types/dataforms-layouts/card/index.d.ts.map +0 -1
  752. package/build-types/dataforms-layouts/data-form-layout.d.ts.map +0 -1
  753. package/build-types/dataforms-layouts/index.d.ts.map +0 -1
  754. package/build-types/dataforms-layouts/is-combined-field.d.ts.map +0 -1
  755. package/build-types/dataforms-layouts/panel/dropdown.d.ts.map +0 -1
  756. package/build-types/dataforms-layouts/panel/index.d.ts.map +0 -1
  757. package/build-types/dataforms-layouts/panel/modal.d.ts.map +0 -1
  758. package/build-types/dataforms-layouts/panel/summary-button.d.ts.map +0 -1
  759. package/build-types/dataforms-layouts/regular/index.d.ts.map +0 -1
  760. package/build-types/dataforms-layouts/row/index.d.ts.map +0 -1
  761. package/build-types/field-types/stories/index.story.d.ts +0 -85
  762. package/build-types/field-types/stories/index.story.d.ts.map +0 -1
  763. package/build-types/filter-and-sort-data-view.d.ts.map +0 -1
  764. package/build-types/normalize-fields.d.ts +0 -12
  765. package/build-types/normalize-fields.d.ts.map +0 -1
  766. package/build-types/normalize-form-fields.d.ts.map +0 -1
  767. package/build-types/private-types.d.ts.map +0 -1
  768. package/build-types/test/validation.d.ts +0 -2
  769. package/build-types/test/validation.d.ts.map +0 -1
  770. package/build-types/types.d.ts +0 -688
  771. package/build-types/types.d.ts.map +0 -1
  772. package/build-types/utils.d.ts +0 -6
  773. package/build-types/utils.d.ts.map +0 -1
  774. package/build-types/validation.d.ts +0 -12
  775. package/build-types/validation.d.ts.map +0 -1
  776. package/src/dataforms-layouts/card/style.scss +0 -10
  777. package/src/test/validation.ts +0 -312
  778. package/src/types.ts +0 -891
  779. package/src/utils.ts +0 -15
  780. package/src/validation.ts +0 -91
  781. /package/build-types/{dataforms-layouts → dataform-layouts}/is-combined-field.d.ts +0 -0
  782. /package/build-types/{dataforms-layouts → dataform-layouts}/panel/summary-button.d.ts +0 -0
  783. /package/src/{dataforms-layouts → dataform-layouts}/is-combined-field.ts +0 -0
  784. /package/src/{dataforms-layouts → dataform-layouts}/panel/summary-button.tsx +0 -0
  785. /package/src/{dataforms-layouts → dataform-layouts}/row/style.scss +0 -0
  786. /package/src/{components/dataviews/stories/style.css → stories/dataviews.style.css} +0 -0
  787. /package/src/{private-types.tsx → types/private.ts} +0 -0
@@ -1,45 +1,56 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import clsx from 'clsx';
5
+ import {
6
+ format,
7
+ isValid as isValidDate,
8
+ subMonths,
9
+ subDays,
10
+ subYears,
11
+ startOfMonth,
12
+ startOfYear,
13
+ } from 'date-fns';
14
+
1
15
  /**
2
16
  * WordPress dependencies
3
17
  */
4
18
  import {
5
19
  BaseControl,
6
20
  Button,
21
+ Icon,
7
22
  privateApis as componentsPrivateApis,
8
23
  __experimentalInputControl as InputControl,
9
24
  __experimentalHStack as HStack,
10
25
  __experimentalVStack as VStack,
11
26
  } from '@wordpress/components';
12
- import { useCallback, useMemo, useState } from '@wordpress/element';
27
+ import {
28
+ useCallback,
29
+ useEffect,
30
+ useMemo,
31
+ useRef,
32
+ useState,
33
+ } from '@wordpress/element';
13
34
  import { __ } from '@wordpress/i18n';
14
35
  import { getDate, getSettings } from '@wordpress/date';
15
-
16
- /**
17
- * External dependencies
18
- */
19
- import {
20
- format,
21
- isValid,
22
- subMonths,
23
- subDays,
24
- subYears,
25
- startOfMonth,
26
- startOfYear,
27
- } from 'date-fns';
36
+ import { error as errorIcon } from '@wordpress/icons';
28
37
 
29
38
  /**
30
39
  * Internal dependencies
31
40
  */
32
- import RelativeDateControl, {
33
- TIME_UNITS_OPTIONS,
34
- type DateRelative,
35
- } from './relative-date-control';
41
+ import RelativeDateControl from './utils/relative-date-control';
36
42
  import {
37
43
  OPERATOR_IN_THE_PAST,
38
44
  OPERATOR_OVER,
39
45
  OPERATOR_BETWEEN,
40
46
  } from '../constants';
41
47
  import { unlock } from '../lock-unlock';
42
- import type { DataFormControlProps } from '../types';
48
+ import type {
49
+ DataFormControlProps,
50
+ FieldValidity,
51
+ NormalizedField,
52
+ } from '../types';
53
+ import getCustomValidity from './utils/get-custom-validity';
43
54
 
44
55
  const { DateCalendar, DateRangeCalendar } = unlock( componentsPrivateApis );
45
56
 
@@ -129,7 +140,7 @@ const parseDate = ( dateString?: string ): Date | null => {
129
140
  return null;
130
141
  }
131
142
  const parsed = getDate( dateString );
132
- return parsed && isValid( parsed ) ? parsed : null;
143
+ return parsed && isValidDate( parsed ) ? parsed : null;
133
144
  };
134
145
 
135
146
  const formatDate = ( date?: Date | string ): string => {
@@ -139,39 +150,144 @@ const formatDate = ( date?: Date | string ): string => {
139
150
  return typeof date === 'string' ? date : format( date, 'yyyy-MM-dd' );
140
151
  };
141
152
 
142
- function CalendarDateControl( {
143
- id,
144
- value,
145
- onChange,
146
- label,
147
- hideLabelFromVision,
148
- className,
153
+ function ValidatedDateControl< Item >( {
154
+ field,
155
+ validity,
156
+ inputRefs,
157
+ isTouched,
158
+ setIsTouched,
159
+ children,
149
160
  }: {
150
- id: string;
151
- value: string | undefined;
152
- onChange: ( value: string | undefined ) => void;
153
- label: string;
154
- hideLabelFromVision?: boolean;
155
- className?: string;
161
+ field: NormalizedField< Item >;
162
+ validity?: FieldValidity;
163
+ inputRefs:
164
+ | React.RefObject< HTMLInputElement >
165
+ | React.RefObject< HTMLInputElement >[];
166
+ isTouched: boolean;
167
+ setIsTouched: ( touched: boolean ) => void;
168
+ children: React.ReactNode;
156
169
  } ) {
170
+ const { isValid } = field;
171
+ const [ customValidity, setCustomValidity ] = useState<
172
+ | { type: 'valid' | 'validating' | 'invalid'; message?: string }
173
+ | undefined
174
+ >( undefined );
175
+
176
+ const validateRefs = useCallback( () => {
177
+ // Check HTML5 validity on all refs
178
+ const refs = Array.isArray( inputRefs ) ? inputRefs : [ inputRefs ];
179
+ for ( const ref of refs ) {
180
+ const input = ref.current;
181
+ if ( input && ! input.validity.valid ) {
182
+ setCustomValidity( {
183
+ type: 'invalid',
184
+ message: input.validationMessage,
185
+ } );
186
+ return;
187
+ }
188
+ }
189
+
190
+ // No errors
191
+ setCustomValidity( undefined );
192
+ }, [ inputRefs ] );
193
+
194
+ useEffect( () => {
195
+ if ( isTouched ) {
196
+ const timeoutId = setTimeout( () => {
197
+ if ( validity ) {
198
+ setCustomValidity( getCustomValidity( isValid, validity ) );
199
+ } else {
200
+ validateRefs();
201
+ }
202
+ }, 0 );
203
+ return () => clearTimeout( timeoutId );
204
+ }
205
+ return undefined;
206
+ }, [ isTouched, isValid, validity, validateRefs ] );
207
+
208
+ const onBlur = ( event: React.FocusEvent< HTMLDivElement > ) => {
209
+ if ( isTouched ) {
210
+ return;
211
+ }
212
+
213
+ // Only consider "blurred from the component" if focus has fully left the wrapping div.
214
+ // This prevents unnecessary blurs from components with multiple focusable elements.
215
+ if (
216
+ ! event.relatedTarget ||
217
+ ! event.currentTarget.contains( event.relatedTarget )
218
+ ) {
219
+ setIsTouched( true );
220
+ }
221
+ };
222
+
223
+ return (
224
+ <div onBlur={ onBlur }>
225
+ { children }
226
+ <div aria-live="polite">
227
+ { customValidity && (
228
+ <p
229
+ className={ clsx(
230
+ 'components-validated-control__indicator',
231
+ customValidity.type === 'invalid'
232
+ ? 'is-invalid'
233
+ : undefined,
234
+ customValidity.type === 'valid'
235
+ ? 'is-valid'
236
+ : undefined
237
+ ) }
238
+ >
239
+ <Icon
240
+ className="components-validated-control__indicator-icon"
241
+ icon={ errorIcon }
242
+ size={ 16 }
243
+ fill="currentColor"
244
+ />
245
+ { customValidity.message }
246
+ </p>
247
+ ) }
248
+ </div>
249
+ </div>
250
+ );
251
+ }
252
+
253
+ function CalendarDateControl< Item >( {
254
+ data,
255
+ field,
256
+ onChange,
257
+ hideLabelFromVision,
258
+ validity,
259
+ }: DataFormControlProps< Item > ) {
260
+ const { id, label, setValue, getValue, isValid } = field;
157
261
  const [ selectedPresetId, setSelectedPresetId ] = useState< string | null >(
158
262
  null
159
263
  );
160
264
 
265
+ const fieldValue = getValue( { item: data } );
266
+ const value = typeof fieldValue === 'string' ? fieldValue : undefined;
161
267
  const [ calendarMonth, setCalendarMonth ] = useState< Date >( () => {
162
268
  const parsedDate = parseDate( value );
163
269
  return parsedDate || new Date(); // Default to current month
164
270
  } );
165
271
 
272
+ const [ isTouched, setIsTouched ] = useState( false );
273
+ const validityTargetRef = useRef< HTMLInputElement >( null );
274
+
275
+ const onChangeCallback = useCallback(
276
+ ( newValue: string | undefined ) =>
277
+ onChange( setValue( { item: data, value: newValue } ) ),
278
+ [ data, onChange, setValue ]
279
+ );
280
+
166
281
  const onSelectDate = useCallback(
167
282
  ( newDate: Date | undefined | null ) => {
168
283
  const dateValue = newDate
169
284
  ? format( newDate, 'yyyy-MM-dd' )
170
285
  : undefined;
171
- onChange( dateValue );
286
+ onChangeCallback( dateValue );
172
287
  setSelectedPresetId( null );
288
+ setIsTouched( true );
173
289
  },
174
- [ onChange ]
290
+ [ onChangeCallback ]
175
291
  );
176
292
 
177
293
  const handlePresetClick = useCallback(
@@ -180,15 +296,16 @@ function CalendarDateControl( {
180
296
  const dateValue = formatDate( presetDate );
181
297
 
182
298
  setCalendarMonth( presetDate );
183
- onChange( dateValue );
299
+ onChangeCallback( dateValue );
184
300
  setSelectedPresetId( preset.id );
301
+ setIsTouched( true );
185
302
  },
186
- [ onChange ]
303
+ [ onChangeCallback ]
187
304
  );
188
305
 
189
306
  const handleManualDateChange = useCallback(
190
307
  ( newValue?: string ) => {
191
- onChange( newValue );
308
+ onChangeCallback( newValue );
192
309
  if ( newValue ) {
193
310
  const parsedDate = parseDate( newValue );
194
311
  if ( parsedDate ) {
@@ -196,8 +313,9 @@ function CalendarDateControl( {
196
313
  }
197
314
  }
198
315
  setSelectedPresetId( null );
316
+ setIsTouched( true );
199
317
  },
200
- [ onChange ]
318
+ [ onChangeCallback ]
201
319
  );
202
320
 
203
321
  const {
@@ -205,86 +323,117 @@ function CalendarDateControl( {
205
323
  l10n: { startOfWeek },
206
324
  } = getSettings();
207
325
 
326
+ const displayLabel = isValid?.required
327
+ ? `${ label } (${ __( 'Required' ) })`
328
+ : label;
329
+
208
330
  return (
209
- <BaseControl
210
- __nextHasNoMarginBottom
211
- id={ id }
212
- className={ className }
213
- label={ label }
214
- hideLabelFromVision={ hideLabelFromVision }
331
+ <ValidatedDateControl
332
+ field={ field }
333
+ validity={ validity }
334
+ inputRefs={ validityTargetRef }
335
+ isTouched={ isTouched }
336
+ setIsTouched={ setIsTouched }
215
337
  >
216
- <VStack spacing={ 4 }>
217
- { /* Preset buttons */ }
218
- <HStack spacing={ 2 } wrap justify="flex-start">
219
- { DATE_PRESETS.map( ( preset ) => {
220
- const isSelected = selectedPresetId === preset.id;
221
- return (
222
- <Button
223
- className="dataviews-controls__date-preset"
224
- key={ preset.id }
225
- variant="tertiary"
226
- isPressed={ isSelected }
227
- size="small"
228
- onClick={ () => handlePresetClick( preset ) }
229
- >
230
- { preset.label }
231
- </Button>
232
- );
233
- } ) }
234
- <Button
235
- className="dataviews-controls__date-preset"
236
- variant="tertiary"
237
- isPressed={ ! selectedPresetId }
238
- size="small"
239
- disabled={ !! selectedPresetId }
240
- accessibleWhenDisabled={ false }
241
- >
242
- { __( 'Custom' ) }
243
- </Button>
244
- </HStack>
245
-
246
- { /* Manual date input */ }
247
- <InputControl
248
- __next40pxDefaultSize
249
- type="date"
250
- label={ __( 'Date' ) }
251
- hideLabelFromVision
252
- value={ value }
253
- onChange={ handleManualDateChange }
254
- />
255
-
256
- { /* Calendar widget */ }
257
- <DateCalendar
258
- style={ { width: '100%' } }
259
- selected={
260
- value ? parseDate( value ) || undefined : undefined
261
- }
262
- onSelect={ onSelectDate }
263
- month={ calendarMonth }
264
- onMonthChange={ setCalendarMonth }
265
- timeZone={ timezoneString || undefined }
266
- weekStartsOn={ startOfWeek }
267
- />
268
- </VStack>
269
- </BaseControl>
338
+ <BaseControl
339
+ __nextHasNoMarginBottom
340
+ id={ id }
341
+ className="dataviews-controls__date"
342
+ label={ displayLabel }
343
+ hideLabelFromVision={ hideLabelFromVision }
344
+ >
345
+ <VStack spacing={ 4 }>
346
+ { /* Preset buttons */ }
347
+ <HStack spacing={ 2 } wrap justify="flex-start">
348
+ { DATE_PRESETS.map( ( preset ) => {
349
+ const isSelected = selectedPresetId === preset.id;
350
+ return (
351
+ <Button
352
+ className="dataviews-controls__date-preset"
353
+ key={ preset.id }
354
+ variant="tertiary"
355
+ isPressed={ isSelected }
356
+ size="small"
357
+ onClick={ () =>
358
+ handlePresetClick( preset )
359
+ }
360
+ >
361
+ { preset.label }
362
+ </Button>
363
+ );
364
+ } ) }
365
+ <Button
366
+ className="dataviews-controls__date-preset"
367
+ variant="tertiary"
368
+ isPressed={ ! selectedPresetId }
369
+ size="small"
370
+ disabled={ !! selectedPresetId }
371
+ accessibleWhenDisabled={ false }
372
+ >
373
+ { __( 'Custom' ) }
374
+ </Button>
375
+ </HStack>
376
+
377
+ { /* Manual date input */ }
378
+ <InputControl
379
+ __next40pxDefaultSize
380
+ ref={ validityTargetRef }
381
+ type="date"
382
+ label={ __( 'Date' ) }
383
+ hideLabelFromVision
384
+ value={ value }
385
+ onChange={ handleManualDateChange }
386
+ required={ !! field.isValid?.required }
387
+ />
388
+
389
+ { /* Calendar widget */ }
390
+ <DateCalendar
391
+ style={ { width: '100%' } }
392
+ selected={
393
+ value ? parseDate( value ) || undefined : undefined
394
+ }
395
+ onSelect={ onSelectDate }
396
+ month={ calendarMonth }
397
+ onMonthChange={ setCalendarMonth }
398
+ timeZone={ timezoneString || undefined }
399
+ weekStartsOn={ startOfWeek }
400
+ />
401
+ </VStack>
402
+ </BaseControl>
403
+ </ValidatedDateControl>
270
404
  );
271
405
  }
272
406
 
273
- function CalendarDateRangeControl( {
274
- id,
275
- value,
407
+ function CalendarDateRangeControl< Item >( {
408
+ data,
409
+ field,
276
410
  onChange,
277
- label,
278
411
  hideLabelFromVision,
279
- className,
280
- }: {
281
- id: string;
282
- value: DateRange;
283
- onChange: ( value: DateRange ) => void;
284
- label: string;
285
- hideLabelFromVision?: boolean;
286
- className?: string;
287
- } ) {
412
+ validity,
413
+ }: DataFormControlProps< Item > ) {
414
+ const { id, label, getValue, setValue } = field;
415
+ let value: DateRange;
416
+ const fieldValue = getValue( { item: data } );
417
+ if (
418
+ Array.isArray( fieldValue ) &&
419
+ fieldValue.length === 2 &&
420
+ fieldValue.every( ( date ) => typeof date === 'string' )
421
+ ) {
422
+ value = fieldValue as DateRange;
423
+ }
424
+
425
+ const onChangeCallback = useCallback(
426
+ ( newValue: DateRange ) => {
427
+ onChange(
428
+ setValue( {
429
+ item: data,
430
+ value: newValue,
431
+ } )
432
+ );
433
+ },
434
+ [ data, onChange, setValue ]
435
+ );
436
+
288
437
  const [ selectedPresetId, setSelectedPresetId ] = useState< string | null >(
289
438
  null
290
439
  );
@@ -305,16 +454,23 @@ function CalendarDateRangeControl( {
305
454
  return selectedRange.from || new Date();
306
455
  } );
307
456
 
457
+ const [ isTouched, setIsTouched ] = useState( false );
458
+ const fromInputRef = useRef< HTMLInputElement >( null );
459
+ const toInputRef = useRef< HTMLInputElement >( null );
460
+
308
461
  const updateDateRange = useCallback(
309
462
  ( fromDate?: Date | string, toDate?: Date | string ) => {
310
463
  if ( fromDate && toDate ) {
311
- onChange( [ formatDate( fromDate ), formatDate( toDate ) ] );
464
+ onChangeCallback( [
465
+ formatDate( fromDate ),
466
+ formatDate( toDate ),
467
+ ] );
312
468
  } else if ( ! fromDate && ! toDate ) {
313
- onChange( undefined );
469
+ onChangeCallback( undefined );
314
470
  }
315
471
  // Do nothing if only one date is set - wait for both
316
472
  },
317
- [ onChange ]
473
+ [ onChangeCallback ]
318
474
  );
319
475
 
320
476
  const onSelectCalendarRange = useCallback(
@@ -325,6 +481,7 @@ function CalendarDateRangeControl( {
325
481
  ) => {
326
482
  updateDateRange( newRange?.from, newRange?.to );
327
483
  setSelectedPresetId( null );
484
+ setIsTouched( true );
328
485
  },
329
486
  [ updateDateRange ]
330
487
  );
@@ -335,6 +492,7 @@ function CalendarDateRangeControl( {
335
492
  setCalendarMonth( startDate );
336
493
  updateDateRange( startDate, endDate );
337
494
  setSelectedPresetId( preset.id );
495
+ setIsTouched( true );
338
496
  },
339
497
  [ updateDateRange ]
340
498
  );
@@ -358,85 +516,104 @@ function CalendarDateRangeControl( {
358
516
  }
359
517
 
360
518
  setSelectedPresetId( null );
519
+ setIsTouched( true );
361
520
  },
362
521
  [ value, updateDateRange ]
363
522
  );
364
523
 
365
524
  const { timezone, l10n } = getSettings();
366
525
 
526
+ const displayLabel = field.isValid?.required
527
+ ? `${ label } (${ __( 'Required' ) })`
528
+ : label;
529
+
367
530
  return (
368
- <BaseControl
369
- __nextHasNoMarginBottom
370
- id={ id }
371
- className={ className }
372
- label={ label }
373
- hideLabelFromVision={ hideLabelFromVision }
531
+ <ValidatedDateControl
532
+ field={ field }
533
+ validity={ validity }
534
+ inputRefs={ [ fromInputRef, toInputRef ] }
535
+ isTouched={ isTouched }
536
+ setIsTouched={ setIsTouched }
374
537
  >
375
- <VStack spacing={ 4 }>
376
- { /* Preset buttons */ }
377
- <HStack spacing={ 2 } wrap justify="flex-start">
378
- { DATE_RANGE_PRESETS.map( ( preset ) => {
379
- const isSelected = selectedPresetId === preset.id;
380
- return (
381
- <Button
382
- className="dataviews-controls__date-preset"
383
- key={ preset.id }
384
- variant="tertiary"
385
- isPressed={ isSelected }
386
- size="small"
387
- onClick={ () => handlePresetClick( preset ) }
388
- >
389
- { preset.label }
390
- </Button>
391
- );
392
- } ) }
393
- <Button
394
- className="dataviews-controls__date-preset"
395
- variant="tertiary"
396
- isPressed={ ! selectedPresetId }
397
- size="small"
398
- accessibleWhenDisabled={ false }
399
- disabled={ !! selectedPresetId }
400
- >
401
- { __( 'Custom' ) }
402
- </Button>
403
- </HStack>
404
-
405
- { /* Manual date range inputs */ }
406
- <HStack spacing={ 2 }>
407
- <InputControl
408
- __next40pxDefaultSize
409
- type="date"
410
- label={ __( 'From' ) }
411
- hideLabelFromVision
412
- value={ value?.[ 0 ] }
413
- onChange={ ( newValue ) =>
414
- handleManualDateChange( 'from', newValue )
415
- }
416
- />
417
- <InputControl
418
- __next40pxDefaultSize
419
- type="date"
420
- label={ __( 'To' ) }
421
- hideLabelFromVision
422
- value={ value?.[ 1 ] }
423
- onChange={ ( newValue ) =>
424
- handleManualDateChange( 'to', newValue )
425
- }
538
+ <BaseControl
539
+ __nextHasNoMarginBottom
540
+ id={ id }
541
+ className="dataviews-controls__date"
542
+ label={ displayLabel }
543
+ hideLabelFromVision={ hideLabelFromVision }
544
+ >
545
+ <VStack spacing={ 4 }>
546
+ { /* Preset buttons */ }
547
+ <HStack spacing={ 2 } wrap justify="flex-start">
548
+ { DATE_RANGE_PRESETS.map( ( preset ) => {
549
+ const isSelected = selectedPresetId === preset.id;
550
+ return (
551
+ <Button
552
+ className="dataviews-controls__date-preset"
553
+ key={ preset.id }
554
+ variant="tertiary"
555
+ isPressed={ isSelected }
556
+ size="small"
557
+ onClick={ () =>
558
+ handlePresetClick( preset )
559
+ }
560
+ >
561
+ { preset.label }
562
+ </Button>
563
+ );
564
+ } ) }
565
+ <Button
566
+ className="dataviews-controls__date-preset"
567
+ variant="tertiary"
568
+ isPressed={ ! selectedPresetId }
569
+ size="small"
570
+ accessibleWhenDisabled={ false }
571
+ disabled={ !! selectedPresetId }
572
+ >
573
+ { __( 'Custom' ) }
574
+ </Button>
575
+ </HStack>
576
+
577
+ { /* Manual date range inputs */ }
578
+ <HStack spacing={ 2 }>
579
+ <InputControl
580
+ __next40pxDefaultSize
581
+ ref={ fromInputRef }
582
+ type="date"
583
+ label={ __( 'From' ) }
584
+ hideLabelFromVision
585
+ value={ value?.[ 0 ] }
586
+ onChange={ ( newValue ) =>
587
+ handleManualDateChange( 'from', newValue )
588
+ }
589
+ required={ !! field.isValid?.required }
590
+ />
591
+ <InputControl
592
+ __next40pxDefaultSize
593
+ ref={ toInputRef }
594
+ type="date"
595
+ label={ __( 'To' ) }
596
+ hideLabelFromVision
597
+ value={ value?.[ 1 ] }
598
+ onChange={ ( newValue ) =>
599
+ handleManualDateChange( 'to', newValue )
600
+ }
601
+ required={ !! field.isValid?.required }
602
+ />
603
+ </HStack>
604
+
605
+ <DateRangeCalendar
606
+ style={ { width: '100%' } }
607
+ selected={ selectedRange }
608
+ onSelect={ onSelectCalendarRange }
609
+ month={ calendarMonth }
610
+ onMonthChange={ setCalendarMonth }
611
+ timeZone={ timezone.string || undefined }
612
+ weekStartsOn={ l10n.startOfWeek }
426
613
  />
427
- </HStack>
428
-
429
- <DateRangeCalendar
430
- style={ { width: '100%' } }
431
- selected={ selectedRange }
432
- onSelect={ onSelectCalendarRange }
433
- month={ calendarMonth }
434
- onMonthChange={ setCalendarMonth }
435
- timeZone={ timezone.string || undefined }
436
- weekStartsOn={ l10n.startOfWeek }
437
- />
438
- </VStack>
439
- </BaseControl>
614
+ </VStack>
615
+ </BaseControl>
616
+ </ValidatedDateControl>
440
617
  );
441
618
  }
442
619
 
@@ -446,80 +623,40 @@ export default function DateControl< Item >( {
446
623
  onChange,
447
624
  hideLabelFromVision,
448
625
  operator,
626
+ validity,
449
627
  }: DataFormControlProps< Item > ) {
450
- const { id, label, getValue, setValue } = field;
451
- const value = getValue( { item: data } );
452
-
453
- const onChangeRelativeDateControl = useCallback(
454
- ( newValue: DateRelative ) => {
455
- onChange( setValue( { item: data, value: newValue } ) );
456
- },
457
- [ data, onChange, setValue ]
458
- );
459
-
460
- const onChangeCalendarDateRangeControl = useCallback(
461
- ( newValue: DateRange ) => {
462
- onChange(
463
- setValue( {
464
- item: data,
465
- value: newValue,
466
- } )
467
- );
468
- },
469
- [ data, onChange, setValue ]
470
- );
471
-
472
- const onChangeCalendarDateControl = useCallback(
473
- ( newValue: string | undefined ) =>
474
- onChange( setValue( { item: data, value: newValue } ) ),
475
- [ data, onChange, setValue ]
476
- );
477
-
478
628
  if ( operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER ) {
479
629
  return (
480
630
  <RelativeDateControl
481
631
  className="dataviews-controls__date"
482
- id={ id }
483
- value={ value && typeof value === 'object' ? value : {} }
484
- onChange={ onChangeRelativeDateControl }
485
- label={ label }
632
+ data={ data }
633
+ field={ field }
634
+ onChange={ onChange }
486
635
  hideLabelFromVision={ hideLabelFromVision }
487
- options={ TIME_UNITS_OPTIONS[ operator ] }
636
+ operator={ operator }
488
637
  />
489
638
  );
490
639
  }
491
640
 
492
641
  if ( operator === OPERATOR_BETWEEN ) {
493
- let dateRangeValue: DateRange;
494
- if (
495
- Array.isArray( value ) &&
496
- value.length === 2 &&
497
- value.every( ( date ) => typeof date === 'string' )
498
- ) {
499
- // Ensure the value is expected format
500
- dateRangeValue = value as DateRange;
501
- }
502
-
503
642
  return (
504
643
  <CalendarDateRangeControl
505
- className="dataviews-controls__date"
506
- id={ id }
507
- value={ dateRangeValue }
508
- onChange={ onChangeCalendarDateRangeControl }
509
- label={ label }
644
+ data={ data }
645
+ field={ field }
646
+ onChange={ onChange }
510
647
  hideLabelFromVision={ hideLabelFromVision }
648
+ validity={ validity }
511
649
  />
512
650
  );
513
651
  }
514
652
 
515
653
  return (
516
654
  <CalendarDateControl
517
- className="dataviews-controls__date"
518
- id={ id }
519
- value={ typeof value === 'string' ? value : undefined }
520
- onChange={ onChangeCalendarDateControl }
521
- label={ label }
655
+ data={ data }
656
+ field={ field }
657
+ onChange={ onChange }
522
658
  hideLabelFromVision={ hideLabelFromVision }
659
+ validity={ validity }
523
660
  />
524
661
  );
525
662
  }