@wordpress/dataviews 13.1.1-next.v.202603161435.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 (370) hide show
  1. package/CHANGELOG.md +36 -6
  2. package/README.md +33 -7
  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 +17 -6
  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/card/index.cjs +132 -128
  34. package/build/components/dataform-layouts/card/index.cjs.map +3 -3
  35. package/build/components/dataform-layouts/panel/summary-button.cjs +0 -1
  36. package/build/components/dataform-layouts/panel/summary-button.cjs.map +2 -2
  37. package/build/components/dataviews-bulk-actions/index.cjs +28 -5
  38. package/build/components/dataviews-bulk-actions/index.cjs.map +2 -2
  39. package/build/components/dataviews-context/index.cjs +2 -2
  40. package/build/components/dataviews-context/index.cjs.map +2 -2
  41. package/build/components/dataviews-filters/input-widget.cjs +4 -0
  42. package/build/components/dataviews-filters/input-widget.cjs.map +2 -2
  43. package/build/components/dataviews-footer/index.cjs +2 -3
  44. package/build/components/dataviews-footer/index.cjs.map +2 -2
  45. package/build/components/dataviews-layouts/grid/composite-grid.cjs +378 -249
  46. package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
  47. package/build/components/dataviews-layouts/picker-grid/index.cjs +60 -30
  48. package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
  49. package/build/components/dataviews-layouts/picker-table/index.cjs +45 -30
  50. package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
  51. package/build/components/dataviews-layouts/table/index.cjs +0 -1
  52. package/build/components/dataviews-layouts/table/index.cjs.map +2 -2
  53. package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs +62 -0
  54. package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs.map +7 -0
  55. package/build/components/dataviews-pagination/index.cjs +1 -0
  56. package/build/components/dataviews-pagination/index.cjs.map +2 -2
  57. package/build/components/dataviews-picker-footer/index.cjs +23 -4
  58. package/build/components/dataviews-picker-footer/index.cjs.map +2 -2
  59. package/build/components/dataviews-search/index.cjs +2 -1
  60. package/build/components/dataviews-search/index.cjs.map +2 -2
  61. package/build/components/dataviews-selection-checkbox/index.cjs +3 -2
  62. package/build/components/dataviews-selection-checkbox/index.cjs.map +2 -2
  63. package/build/components/dataviews-view-config/index.cjs +0 -2
  64. package/build/components/dataviews-view-config/index.cjs.map +3 -3
  65. package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs +0 -3
  66. package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs.map +2 -2
  67. package/build/dataviews/index.cjs +47 -45
  68. package/build/dataviews/index.cjs.map +3 -3
  69. package/build/dataviews-picker/index.cjs +41 -33
  70. package/build/dataviews-picker/index.cjs.map +3 -3
  71. package/build/field-types/date.cjs +4 -1
  72. package/build/field-types/date.cjs.map +2 -2
  73. package/build/field-types/datetime.cjs +4 -1
  74. package/build/field-types/datetime.cjs.map +2 -2
  75. package/build/field-types/index.cjs +1 -0
  76. package/build/field-types/index.cjs.map +2 -2
  77. package/build/field-types/utils/get-is-valid.cjs +29 -24
  78. package/build/field-types/utils/get-is-valid.cjs.map +2 -2
  79. package/build/field-types/utils/is-valid-date-boundary.cjs +64 -0
  80. package/build/field-types/utils/is-valid-date-boundary.cjs.map +7 -0
  81. package/build/hooks/index.cjs +11 -2
  82. package/build/hooks/index.cjs.map +2 -2
  83. package/build/hooks/use-data.cjs +146 -9
  84. package/build/hooks/use-data.cjs.map +2 -2
  85. package/build/hooks/use-infinite-scroll.cjs +208 -0
  86. package/build/hooks/use-infinite-scroll.cjs.map +7 -0
  87. package/build/hooks/use-selected-items.cjs +57 -0
  88. package/build/hooks/use-selected-items.cjs.map +7 -0
  89. package/build/types/dataviews.cjs.map +1 -1
  90. package/build/types/field-api.cjs.map +1 -1
  91. package/build/utils/filter-sort-and-paginate.cjs +5 -1
  92. package/build/utils/filter-sort-and-paginate.cjs.map +2 -2
  93. package/build/utils/get-footer-message.cjs +8 -8
  94. package/build/utils/get-footer-message.cjs.map +2 -2
  95. package/build-module/components/dataform-controls/array.mjs +2 -0
  96. package/build-module/components/dataform-controls/array.mjs.map +2 -2
  97. package/build-module/components/dataform-controls/checkbox.mjs +3 -1
  98. package/build-module/components/dataform-controls/checkbox.mjs.map +2 -2
  99. package/build-module/components/dataform-controls/color.mjs +8 -2
  100. package/build-module/components/dataform-controls/color.mjs.map +2 -2
  101. package/build-module/components/dataform-controls/date.mjs +31 -9
  102. package/build-module/components/dataform-controls/date.mjs.map +2 -2
  103. package/build-module/components/dataform-controls/datetime.mjs +17 -6
  104. package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
  105. package/build-module/components/dataform-controls/password.mjs +4 -1
  106. package/build-module/components/dataform-controls/password.mjs.map +2 -2
  107. package/build-module/components/dataform-controls/radio.mjs +3 -1
  108. package/build-module/components/dataform-controls/radio.mjs.map +2 -2
  109. package/build-module/components/dataform-controls/select.mjs +3 -1
  110. package/build-module/components/dataform-controls/select.mjs.map +2 -2
  111. package/build-module/components/dataform-controls/textarea.mjs +2 -0
  112. package/build-module/components/dataform-controls/textarea.mjs.map +2 -2
  113. package/build-module/components/dataform-controls/toggle-group.mjs +3 -1
  114. package/build-module/components/dataform-controls/toggle-group.mjs.map +2 -2
  115. package/build-module/components/dataform-controls/toggle.mjs +3 -1
  116. package/build-module/components/dataform-controls/toggle.mjs.map +2 -2
  117. package/build-module/components/dataform-controls/utils/relative-date-control.mjs +5 -2
  118. package/build-module/components/dataform-controls/utils/relative-date-control.mjs.map +2 -2
  119. package/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs +27 -0
  120. package/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs.map +7 -0
  121. package/build-module/components/dataform-controls/utils/validated-input.mjs +2 -0
  122. package/build-module/components/dataform-controls/utils/validated-input.mjs.map +2 -2
  123. package/build-module/components/dataform-controls/utils/validated-number.mjs +3 -1
  124. package/build-module/components/dataform-controls/utils/validated-number.mjs.map +2 -2
  125. package/build-module/components/dataform-layouts/card/index.mjs +132 -133
  126. package/build-module/components/dataform-layouts/card/index.mjs.map +2 -2
  127. package/build-module/components/dataform-layouts/panel/summary-button.mjs +0 -1
  128. package/build-module/components/dataform-layouts/panel/summary-button.mjs.map +2 -2
  129. package/build-module/components/dataviews-bulk-actions/index.mjs +28 -5
  130. package/build-module/components/dataviews-bulk-actions/index.mjs.map +2 -2
  131. package/build-module/components/dataviews-context/index.mjs +2 -2
  132. package/build-module/components/dataviews-context/index.mjs.map +2 -2
  133. package/build-module/components/dataviews-filters/input-widget.mjs +4 -0
  134. package/build-module/components/dataviews-filters/input-widget.mjs.map +2 -2
  135. package/build-module/components/dataviews-footer/index.mjs +2 -3
  136. package/build-module/components/dataviews-footer/index.mjs.map +2 -2
  137. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs +387 -250
  138. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
  139. package/build-module/components/dataviews-layouts/picker-grid/index.mjs +64 -31
  140. package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
  141. package/build-module/components/dataviews-layouts/picker-table/index.mjs +45 -30
  142. package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
  143. package/build-module/components/dataviews-layouts/table/index.mjs +0 -1
  144. package/build-module/components/dataviews-layouts/table/index.mjs.map +2 -2
  145. package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs +26 -0
  146. package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs.map +7 -0
  147. package/build-module/components/dataviews-pagination/index.mjs +1 -0
  148. package/build-module/components/dataviews-pagination/index.mjs.map +2 -2
  149. package/build-module/components/dataviews-picker-footer/index.mjs +23 -4
  150. package/build-module/components/dataviews-picker-footer/index.mjs.map +2 -2
  151. package/build-module/components/dataviews-search/index.mjs +2 -1
  152. package/build-module/components/dataviews-search/index.mjs.map +2 -2
  153. package/build-module/components/dataviews-selection-checkbox/index.mjs +3 -2
  154. package/build-module/components/dataviews-selection-checkbox/index.mjs.map +2 -2
  155. package/build-module/components/dataviews-view-config/index.mjs +0 -2
  156. package/build-module/components/dataviews-view-config/index.mjs.map +2 -2
  157. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs +0 -3
  158. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs.map +2 -2
  159. package/build-module/dataviews/index.mjs +55 -47
  160. package/build-module/dataviews/index.mjs.map +2 -2
  161. package/build-module/dataviews-picker/index.mjs +49 -35
  162. package/build-module/dataviews-picker/index.mjs.map +2 -2
  163. package/build-module/field-types/date.mjs +4 -1
  164. package/build-module/field-types/date.mjs.map +2 -2
  165. package/build-module/field-types/datetime.mjs +4 -1
  166. package/build-module/field-types/datetime.mjs.map +2 -2
  167. package/build-module/field-types/index.mjs +1 -0
  168. package/build-module/field-types/index.mjs.map +2 -2
  169. package/build-module/field-types/utils/get-is-valid.mjs +29 -24
  170. package/build-module/field-types/utils/get-is-valid.mjs.map +2 -2
  171. package/build-module/field-types/utils/is-valid-date-boundary.mjs +38 -0
  172. package/build-module/field-types/utils/is-valid-date-boundary.mjs.map +7 -0
  173. package/build-module/hooks/index.mjs +7 -1
  174. package/build-module/hooks/index.mjs.map +2 -2
  175. package/build-module/hooks/use-data.mjs +147 -10
  176. package/build-module/hooks/use-data.mjs.map +2 -2
  177. package/build-module/hooks/use-infinite-scroll.mjs +188 -0
  178. package/build-module/hooks/use-infinite-scroll.mjs.map +7 -0
  179. package/build-module/hooks/use-selected-items.mjs +36 -0
  180. package/build-module/hooks/use-selected-items.mjs.map +7 -0
  181. package/build-module/utils/filter-sort-and-paginate.mjs +5 -1
  182. package/build-module/utils/filter-sort-and-paginate.mjs.map +2 -2
  183. package/build-module/utils/get-footer-message.mjs +8 -8
  184. package/build-module/utils/get-footer-message.mjs.map +2 -2
  185. package/build-style/style-rtl.css +75 -52
  186. package/build-style/style.css +75 -52
  187. package/build-types/components/dataform-controls/array.d.ts.map +1 -1
  188. package/build-types/components/dataform-controls/checkbox.d.ts.map +1 -1
  189. package/build-types/components/dataform-controls/color.d.ts.map +1 -1
  190. package/build-types/components/dataform-controls/date.d.ts.map +1 -1
  191. package/build-types/components/dataform-controls/datetime.d.ts +1 -1
  192. package/build-types/components/dataform-controls/datetime.d.ts.map +1 -1
  193. package/build-types/components/dataform-controls/password.d.ts.map +1 -1
  194. package/build-types/components/dataform-controls/radio.d.ts.map +1 -1
  195. package/build-types/components/dataform-controls/select.d.ts.map +1 -1
  196. package/build-types/components/dataform-controls/textarea.d.ts.map +1 -1
  197. package/build-types/components/dataform-controls/toggle-group.d.ts.map +1 -1
  198. package/build-types/components/dataform-controls/toggle.d.ts.map +1 -1
  199. package/build-types/components/dataform-controls/utils/relative-date-control.d.ts.map +1 -1
  200. package/build-types/components/dataform-controls/utils/use-disabled-date-matchers.d.ts +16 -0
  201. package/build-types/components/dataform-controls/utils/use-disabled-date-matchers.d.ts.map +1 -0
  202. package/build-types/components/dataform-controls/utils/validated-input.d.ts.map +1 -1
  203. package/build-types/components/dataform-controls/utils/validated-number.d.ts.map +1 -1
  204. package/build-types/components/dataform-layouts/card/index.d.ts.map +1 -1
  205. package/build-types/components/dataform-layouts/panel/summary-button.d.ts.map +1 -1
  206. package/build-types/components/dataviews-bulk-actions/index.d.ts +2 -1
  207. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
  208. package/build-types/components/dataviews-context/index.d.ts +3 -3
  209. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  210. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  211. package/build-types/components/dataviews-footer/index.d.ts.map +1 -1
  212. package/build-types/components/dataviews-layouts/grid/composite-grid.d.ts.map +1 -1
  213. package/build-types/components/dataviews-layouts/index.d.ts +6 -6
  214. package/build-types/components/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  215. package/build-types/components/dataviews-layouts/picker-table/index.d.ts.map +1 -1
  216. package/build-types/components/dataviews-layouts/table/index.d.ts.map +1 -1
  217. package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts +22 -0
  218. package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts.map +1 -0
  219. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -1
  220. package/build-types/components/dataviews-picker-footer/index.d.ts.map +1 -1
  221. package/build-types/components/dataviews-search/index.d.ts +1 -1
  222. package/build-types/components/dataviews-search/index.d.ts.map +1 -1
  223. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  224. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  225. package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts +1 -1
  226. package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts.map +1 -1
  227. package/build-types/constants.d.ts +2 -2
  228. package/build-types/dataform/stories/index.story.d.ts +11 -1
  229. package/build-types/dataform/stories/index.story.d.ts.map +1 -1
  230. package/build-types/dataform/stories/layout-regular.d.ts +2 -1
  231. package/build-types/dataform/stories/layout-regular.d.ts.map +1 -1
  232. package/build-types/dataform/stories/validation.d.ts.map +1 -1
  233. package/build-types/dataviews/index.d.ts +1 -2
  234. package/build-types/dataviews/index.d.ts.map +1 -1
  235. package/build-types/dataviews/stories/fixtures.d.ts.map +1 -1
  236. package/build-types/dataviews/stories/free-composition.d.ts.map +1 -1
  237. package/build-types/dataviews/stories/index.story.d.ts +11 -0
  238. package/build-types/dataviews/stories/index.story.d.ts.map +1 -1
  239. package/build-types/dataviews/stories/infinite-scroll.d.ts.map +1 -1
  240. package/build-types/dataviews/stories/with-card.d.ts.map +1 -1
  241. package/build-types/dataviews-picker/index.d.ts +3 -3
  242. package/build-types/dataviews-picker/index.d.ts.map +1 -1
  243. package/build-types/dataviews-picker/stories/fixtures.d.ts.map +1 -1
  244. package/build-types/dataviews-picker/stories/index.story.d.ts.map +1 -1
  245. package/build-types/field-types/array.d.ts +1 -1
  246. package/build-types/field-types/array.d.ts.map +1 -1
  247. package/build-types/field-types/boolean.d.ts +1 -1
  248. package/build-types/field-types/boolean.d.ts.map +1 -1
  249. package/build-types/field-types/color.d.ts +1 -1
  250. package/build-types/field-types/color.d.ts.map +1 -1
  251. package/build-types/field-types/date.d.ts +3 -0
  252. package/build-types/field-types/date.d.ts.map +1 -1
  253. package/build-types/field-types/datetime.d.ts +3 -0
  254. package/build-types/field-types/datetime.d.ts.map +1 -1
  255. package/build-types/field-types/email.d.ts +1 -1
  256. package/build-types/field-types/email.d.ts.map +1 -1
  257. package/build-types/field-types/index.d.ts.map +1 -1
  258. package/build-types/field-types/integer.d.ts +1 -1
  259. package/build-types/field-types/integer.d.ts.map +1 -1
  260. package/build-types/field-types/number.d.ts +1 -1
  261. package/build-types/field-types/number.d.ts.map +1 -1
  262. package/build-types/field-types/stories/index.story.d.ts +37 -15
  263. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  264. package/build-types/field-types/utils/get-is-valid.d.ts.map +1 -1
  265. package/build-types/field-types/utils/is-valid-date-boundary.d.ts +7 -0
  266. package/build-types/field-types/utils/is-valid-date-boundary.d.ts.map +1 -0
  267. package/build-types/hooks/index.d.ts +3 -0
  268. package/build-types/hooks/index.d.ts.map +1 -1
  269. package/build-types/hooks/test/use-data.d.ts +2 -0
  270. package/build-types/hooks/test/use-data.d.ts.map +1 -0
  271. package/build-types/hooks/use-data.d.ts +41 -3
  272. package/build-types/hooks/use-data.d.ts.map +1 -1
  273. package/build-types/hooks/use-infinite-scroll.d.ts +21 -0
  274. package/build-types/hooks/use-infinite-scroll.d.ts.map +1 -0
  275. package/build-types/hooks/use-selected-items.d.ts +19 -0
  276. package/build-types/hooks/use-selected-items.d.ts.map +1 -0
  277. package/build-types/types/dataviews.d.ts +15 -1
  278. package/build-types/types/dataviews.d.ts.map +1 -1
  279. package/build-types/types/field-api.d.ts +39 -13
  280. package/build-types/types/field-api.d.ts.map +1 -1
  281. package/build-types/utils/filter-sort-and-paginate.d.ts.map +1 -1
  282. package/build-types/utils/get-footer-message.d.ts +3 -2
  283. package/build-types/utils/get-footer-message.d.ts.map +1 -1
  284. package/build-wp/index.js +3264 -2713
  285. package/package.json +19 -19
  286. package/src/components/dataform-controls/array.tsx +2 -0
  287. package/src/components/dataform-controls/checkbox.tsx +2 -0
  288. package/src/components/dataform-controls/color.tsx +7 -0
  289. package/src/components/dataform-controls/date.tsx +30 -4
  290. package/src/components/dataform-controls/datetime.tsx +36 -11
  291. package/src/components/dataform-controls/password.tsx +3 -0
  292. package/src/components/dataform-controls/radio.tsx +2 -0
  293. package/src/components/dataform-controls/select.tsx +2 -0
  294. package/src/components/dataform-controls/textarea.tsx +2 -0
  295. package/src/components/dataform-controls/toggle-group.tsx +2 -0
  296. package/src/components/dataform-controls/toggle.tsx +2 -0
  297. package/src/components/dataform-controls/utils/relative-date-control.tsx +3 -0
  298. package/src/components/dataform-controls/utils/use-disabled-date-matchers.ts +48 -0
  299. package/src/components/dataform-controls/utils/validated-input.tsx +2 -0
  300. package/src/components/dataform-controls/utils/validated-number.tsx +2 -0
  301. package/src/components/dataform-layouts/card/index.tsx +171 -146
  302. package/src/components/dataform-layouts/card/style.scss +8 -5
  303. package/src/components/dataform-layouts/panel/style.scss +4 -5
  304. package/src/components/dataform-layouts/panel/summary-button.tsx +0 -1
  305. package/src/components/dataviews-bulk-actions/index.tsx +28 -1
  306. package/src/components/dataviews-context/index.ts +4 -4
  307. package/src/components/dataviews-filters/input-widget.tsx +4 -0
  308. package/src/components/dataviews-filters/style.scss +2 -2
  309. package/src/components/dataviews-footer/index.tsx +1 -6
  310. package/src/components/dataviews-layouts/activity/style.scss +3 -3
  311. package/src/components/dataviews-layouts/grid/composite-grid.tsx +433 -284
  312. package/src/components/dataviews-layouts/grid/style.scss +5 -1
  313. package/src/components/dataviews-layouts/list/style.scss +1 -1
  314. package/src/components/dataviews-layouts/picker-grid/index.tsx +49 -15
  315. package/src/components/dataviews-layouts/picker-grid/style.scss +1 -1
  316. package/src/components/dataviews-layouts/picker-table/index.tsx +45 -23
  317. package/src/components/dataviews-layouts/picker-table/style.scss +1 -1
  318. package/src/components/dataviews-layouts/table/index.tsx +0 -2
  319. package/src/components/dataviews-layouts/utils/use-infinite-scroll.ts +64 -0
  320. package/src/components/dataviews-pagination/index.tsx +1 -0
  321. package/src/components/dataviews-picker-footer/index.tsx +21 -1
  322. package/src/components/dataviews-search/index.tsx +2 -1
  323. package/src/components/dataviews-selection-checkbox/index.tsx +4 -2
  324. package/src/components/dataviews-view-config/index.tsx +0 -2
  325. package/src/components/dataviews-view-config/infinite-scroll-toggle.tsx +0 -5
  326. package/src/dataform/stories/content.story.tsx +1 -1
  327. package/src/dataform/stories/data-adapter.tsx +6 -6
  328. package/src/dataform/stories/index.story.tsx +7 -0
  329. package/src/dataform/stories/layout-card.tsx +5 -5
  330. package/src/dataform/stories/layout-details.tsx +5 -5
  331. package/src/dataform/stories/layout-panel.tsx +9 -9
  332. package/src/dataform/stories/layout-regular.tsx +31 -10
  333. package/src/dataform/stories/layout-row.tsx +9 -9
  334. package/src/dataform/stories/validation.tsx +25 -10
  335. package/src/dataviews/index.tsx +68 -59
  336. package/src/dataviews/stories/empty.tsx +4 -4
  337. package/src/dataviews/stories/fixtures.tsx +288 -0
  338. package/src/dataviews/stories/free-composition.tsx +14 -13
  339. package/src/dataviews/stories/index.story.tsx +19 -2
  340. package/src/dataviews/stories/infinite-scroll.tsx +16 -96
  341. package/src/dataviews/stories/layout-custom.tsx +1 -1
  342. package/src/dataviews/stories/layout-grid.tsx +1 -1
  343. package/src/dataviews/stories/layout-list.tsx +1 -1
  344. package/src/dataviews/stories/layout-table.tsx +1 -1
  345. package/src/dataviews/stories/minimal-ui.tsx +1 -1
  346. package/src/dataviews/stories/with-card.tsx +30 -23
  347. package/src/dataviews/style.scss +6 -8
  348. package/src/dataviews/test/dataviews.tsx +94 -15
  349. package/src/dataviews-picker/index.tsx +57 -41
  350. package/src/dataviews-picker/stories/fixtures.tsx +270 -0
  351. package/src/dataviews-picker/stories/index.story.tsx +62 -133
  352. package/src/dataviews-picker/test/dataviews-picker.tsx +79 -2
  353. package/src/field-types/date.tsx +3 -0
  354. package/src/field-types/datetime.tsx +3 -0
  355. package/src/field-types/index.tsx +4 -0
  356. package/src/field-types/stories/index.story.tsx +79 -6
  357. package/src/field-types/test/normalize-fields.ts +44 -0
  358. package/src/field-types/utils/get-is-valid.ts +44 -31
  359. package/src/field-types/utils/is-valid-date-boundary.ts +80 -0
  360. package/src/hooks/index.ts +3 -0
  361. package/src/hooks/test/use-data.ts +791 -0
  362. package/src/hooks/test/use-form-validity.ts +479 -0
  363. package/src/hooks/use-data.ts +288 -21
  364. package/src/hooks/use-infinite-scroll.ts +304 -0
  365. package/src/hooks/use-selected-items.ts +72 -0
  366. package/src/types/dataviews.ts +17 -1
  367. package/src/types/field-api.ts +43 -12
  368. package/src/utils/filter-sort-and-paginate.ts +13 -1
  369. package/src/utils/get-footer-message.ts +12 -9
  370. package/src/utils/test/filter-sort-and-paginate.js +78 -54
@@ -66,12 +66,17 @@ const meta = {
66
66
  'Add 10 more elements to push over the threshold and trigger Combobox rendering',
67
67
  if: { arg: 'Edit', eq: 'adaptiveSelect' },
68
68
  },
69
+ disabled: {
70
+ control: { type: 'boolean' },
71
+ description: 'Whether the field controls are disabled.',
72
+ },
69
73
  },
70
74
  args: {
71
75
  type: 'regular',
72
76
  Edit: 'default',
73
77
  asyncElements: false,
74
78
  manyElements: false,
79
+ disabled: false,
75
80
  },
76
81
  };
77
82
  export default meta;
@@ -110,6 +115,7 @@ type DataType = {
110
115
  booleanWithToggle: boolean;
111
116
  booleanWithElements: boolean;
112
117
  datetime: string;
118
+ datetimeCompact?: string;
113
119
  datetimeWithElements: string;
114
120
  date: string;
115
121
  dateWithElements: string;
@@ -150,6 +156,7 @@ const data: DataType[] = [
150
156
  booleanWithToggle: true,
151
157
  booleanWithElements: true,
152
158
  datetime: '2021-01-01T14:30:00Z',
159
+ datetimeCompact: '2021-01-01T14:30:00Z',
153
160
  datetimeWithElements: '1982-05-10T20:30:00Z',
154
161
  date: '2021-01-01',
155
162
  dateWithElements: '2021-01-01',
@@ -303,6 +310,16 @@ const fields: Field< DataType >[] = [
303
310
  label: 'Datetime',
304
311
  description: 'Help for datetime.',
305
312
  },
313
+ {
314
+ id: 'datetimeCompact',
315
+ type: 'datetime',
316
+ label: 'Datetime (compact)',
317
+ description: 'Datetime field without the calendar widget.',
318
+ Edit: {
319
+ control: 'datetime',
320
+ compact: true,
321
+ },
322
+ },
306
323
  {
307
324
  id: 'datetimeWithElements',
308
325
  type: 'datetime',
@@ -578,6 +595,7 @@ interface FieldTypeStoryProps {
578
595
  Edit: ControlTypes;
579
596
  asyncElements: boolean;
580
597
  manyElements: boolean;
598
+ disabled: boolean;
581
599
  }
582
600
 
583
601
  const FieldTypeStory = ( {
@@ -586,17 +604,27 @@ const FieldTypeStory = ( {
586
604
  Edit,
587
605
  asyncElements,
588
606
  manyElements,
607
+ disabled,
589
608
  }: FieldTypeStoryProps ) => {
590
609
  const storyFields = useMemo( () => {
591
610
  let fieldsToProcess = _fields;
592
611
 
593
- if ( Edit !== 'default' ) {
594
- fieldsToProcess = _fields.map( ( field: Field< DataType > ) => ( {
612
+ if ( disabled ) {
613
+ fieldsToProcess = fieldsToProcess.map( ( field ) => ( {
595
614
  ...field,
596
- Edit,
615
+ isDisabled: true,
597
616
  } ) );
598
617
  }
599
618
 
619
+ if ( Edit !== 'default' ) {
620
+ fieldsToProcess = fieldsToProcess.map(
621
+ ( field: Field< DataType > ) => ( {
622
+ ...field,
623
+ Edit,
624
+ } )
625
+ );
626
+ }
627
+
600
628
  // Expand elements when adaptiveSelect is selected and manyElements is toggled
601
629
  if ( Edit === 'adaptiveSelect' && manyElements ) {
602
630
  fieldsToProcess = fieldsToProcess.map( ( field ) => {
@@ -636,7 +664,7 @@ const FieldTypeStory = ( {
636
664
  }
637
665
 
638
666
  return fieldsToProcess;
639
- }, [ _fields, Edit, asyncElements, manyElements ] );
667
+ }, [ _fields, Edit, asyncElements, manyElements, disabled ] );
640
668
  const form = useMemo(
641
669
  () => ( {
642
670
  layout: { type },
@@ -687,7 +715,7 @@ const FieldTypeStory = ( {
687
715
  },
688
716
  ] }
689
717
  defaultLayouts={ {
690
- table: {},
718
+ table: true,
691
719
  } }
692
720
  selection={ selectedIds.map( ( id ) => id.toString() ) }
693
721
  onChangeSelection={ ( newSelection ) =>
@@ -744,11 +772,13 @@ export const AllComponent = ( {
744
772
  Edit,
745
773
  asyncElements,
746
774
  manyElements,
775
+ disabled,
747
776
  }: {
748
777
  type: PanelTypes;
749
778
  Edit: ControlTypes;
750
779
  asyncElements: boolean;
751
780
  manyElements: boolean;
781
+ disabled: boolean;
752
782
  } ) => {
753
783
  return (
754
784
  <FieldTypeStory
@@ -757,6 +787,7 @@ export const AllComponent = ( {
757
787
  Edit={ Edit }
758
788
  asyncElements={ asyncElements }
759
789
  manyElements={ manyElements }
790
+ disabled={ disabled }
760
791
  />
761
792
  );
762
793
  };
@@ -767,11 +798,13 @@ export const TextComponent = ( {
767
798
  Edit,
768
799
  asyncElements,
769
800
  manyElements,
801
+ disabled,
770
802
  }: {
771
803
  type: PanelTypes;
772
804
  Edit: ControlTypes;
773
805
  asyncElements: boolean;
774
806
  manyElements: boolean;
807
+ disabled: boolean;
775
808
  } ) => {
776
809
  const textFields = useMemo(
777
810
  () => fields.filter( ( field ) => field.type === 'text' ),
@@ -785,6 +818,7 @@ export const TextComponent = ( {
785
818
  Edit={ Edit }
786
819
  asyncElements={ asyncElements }
787
820
  manyElements={ manyElements }
821
+ disabled={ disabled }
788
822
  />
789
823
  );
790
824
  };
@@ -796,12 +830,14 @@ export const IntegerComponent = ( {
796
830
  asyncElements,
797
831
  manyElements,
798
832
  formatSeparatorThousand,
833
+ disabled,
799
834
  }: {
800
835
  type: PanelTypes;
801
836
  Edit: ControlTypes;
802
837
  asyncElements: boolean;
803
838
  manyElements: boolean;
804
839
  formatSeparatorThousand?: string;
840
+ disabled: boolean;
805
841
  } ) => {
806
842
  const integerFields = useMemo(
807
843
  () =>
@@ -828,6 +864,7 @@ export const IntegerComponent = ( {
828
864
  Edit={ Edit }
829
865
  asyncElements={ asyncElements }
830
866
  manyElements={ manyElements }
867
+ disabled={ disabled }
831
868
  />
832
869
  );
833
870
  };
@@ -851,6 +888,7 @@ export const NumberComponent = ( {
851
888
  formatSeparatorThousand,
852
889
  formatSeparatorDecimal,
853
890
  formatDecimals,
891
+ disabled,
854
892
  }: {
855
893
  type: PanelTypes;
856
894
  Edit: ControlTypes;
@@ -859,6 +897,7 @@ export const NumberComponent = ( {
859
897
  formatSeparatorThousand?: string;
860
898
  formatSeparatorDecimal?: string;
861
899
  formatDecimals?: number;
900
+ disabled: boolean;
862
901
  } ) => {
863
902
  const numberFields = useMemo(
864
903
  () =>
@@ -901,6 +940,7 @@ export const NumberComponent = ( {
901
940
  Edit={ Edit }
902
941
  asyncElements={ asyncElements }
903
942
  manyElements={ manyElements }
943
+ disabled={ disabled }
904
944
  />
905
945
  );
906
946
  };
@@ -933,11 +973,13 @@ export const BooleanComponent = ( {
933
973
  Edit,
934
974
  asyncElements,
935
975
  manyElements,
976
+ disabled,
936
977
  }: {
937
978
  type: PanelTypes;
938
979
  Edit: ControlTypes;
939
980
  asyncElements: boolean;
940
981
  manyElements: boolean;
982
+ disabled: boolean;
941
983
  } ) => {
942
984
  const booleanFields = useMemo(
943
985
  () => fields.filter( ( field ) => field.type === 'boolean' ),
@@ -951,6 +993,7 @@ export const BooleanComponent = ( {
951
993
  Edit={ Edit }
952
994
  asyncElements={ asyncElements }
953
995
  manyElements={ manyElements }
996
+ disabled={ disabled }
954
997
  />
955
998
  );
956
999
  };
@@ -963,6 +1006,7 @@ export const DateTimeComponent = ( {
963
1006
  manyElements,
964
1007
  formatDatetime,
965
1008
  formatWeekStartsOn,
1009
+ disabled,
966
1010
  }: {
967
1011
  type: PanelTypes;
968
1012
  Edit: ControlTypes;
@@ -970,6 +1014,7 @@ export const DateTimeComponent = ( {
970
1014
  manyElements: boolean;
971
1015
  formatDatetime?: string;
972
1016
  formatWeekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
1017
+ disabled: boolean;
973
1018
  } ) => {
974
1019
  const datetimeFields = useMemo(
975
1020
  () =>
@@ -994,7 +1039,7 @@ export const DateTimeComponent = ( {
994
1039
  }
995
1040
  return field;
996
1041
  } ),
997
- [ fields, formatDatetime, formatWeekStartsOn ]
1042
+ [ formatDatetime, formatWeekStartsOn ]
998
1043
  );
999
1044
 
1000
1045
  return (
@@ -1004,6 +1049,7 @@ export const DateTimeComponent = ( {
1004
1049
  Edit={ Edit }
1005
1050
  asyncElements={ asyncElements }
1006
1051
  manyElements={ manyElements }
1052
+ disabled={ disabled }
1007
1053
  />
1008
1054
  );
1009
1055
  };
@@ -1042,6 +1088,7 @@ export const DateComponent = ( {
1042
1088
  manyElements,
1043
1089
  formatDate,
1044
1090
  formatWeekStartsOn,
1091
+ disabled,
1045
1092
  }: {
1046
1093
  type: PanelTypes;
1047
1094
  Edit: ControlTypes;
@@ -1049,6 +1096,7 @@ export const DateComponent = ( {
1049
1096
  manyElements: boolean;
1050
1097
  formatDate?: string;
1051
1098
  formatWeekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
1099
+ disabled: boolean;
1052
1100
  } ) => {
1053
1101
  const dateFields = useMemo(
1054
1102
  () =>
@@ -1083,6 +1131,7 @@ export const DateComponent = ( {
1083
1131
  Edit={ Edit }
1084
1132
  asyncElements={ asyncElements }
1085
1133
  manyElements={ manyElements }
1134
+ disabled={ disabled }
1086
1135
  />
1087
1136
  );
1088
1137
  };
@@ -1119,11 +1168,13 @@ export const EmailComponent = ( {
1119
1168
  Edit,
1120
1169
  asyncElements,
1121
1170
  manyElements,
1171
+ disabled,
1122
1172
  }: {
1123
1173
  type: PanelTypes;
1124
1174
  Edit: ControlTypes;
1125
1175
  asyncElements: boolean;
1126
1176
  manyElements: boolean;
1177
+ disabled: boolean;
1127
1178
  } ) => {
1128
1179
  const emailFields = useMemo(
1129
1180
  () => fields.filter( ( field ) => field.type === 'email' ),
@@ -1137,6 +1188,7 @@ export const EmailComponent = ( {
1137
1188
  Edit={ Edit }
1138
1189
  asyncElements={ asyncElements }
1139
1190
  manyElements={ manyElements }
1191
+ disabled={ disabled }
1140
1192
  />
1141
1193
  );
1142
1194
  };
@@ -1147,11 +1199,13 @@ export const TelephoneComponent = ( {
1147
1199
  Edit,
1148
1200
  asyncElements,
1149
1201
  manyElements,
1202
+ disabled,
1150
1203
  }: {
1151
1204
  type: PanelTypes;
1152
1205
  Edit: ControlTypes;
1153
1206
  asyncElements: boolean;
1154
1207
  manyElements: boolean;
1208
+ disabled: boolean;
1155
1209
  } ) => {
1156
1210
  const telephoneFields = fields.filter( ( field ) =>
1157
1211
  field.id.startsWith( 'telephone' )
@@ -1164,6 +1218,7 @@ export const TelephoneComponent = ( {
1164
1218
  Edit={ Edit }
1165
1219
  asyncElements={ asyncElements }
1166
1220
  manyElements={ manyElements }
1221
+ disabled={ disabled }
1167
1222
  />
1168
1223
  );
1169
1224
  };
@@ -1174,11 +1229,13 @@ export const UrlComponent = ( {
1174
1229
  Edit,
1175
1230
  asyncElements,
1176
1231
  manyElements,
1232
+ disabled,
1177
1233
  }: {
1178
1234
  type: PanelTypes;
1179
1235
  Edit: ControlTypes;
1180
1236
  asyncElements: boolean;
1181
1237
  manyElements: boolean;
1238
+ disabled: boolean;
1182
1239
  } ) => {
1183
1240
  const urlFields = useMemo(
1184
1241
  () => fields.filter( ( field ) => field.type === 'url' ),
@@ -1192,6 +1249,7 @@ export const UrlComponent = ( {
1192
1249
  Edit={ Edit }
1193
1250
  asyncElements={ asyncElements }
1194
1251
  manyElements={ manyElements }
1252
+ disabled={ disabled }
1195
1253
  />
1196
1254
  );
1197
1255
  };
@@ -1202,11 +1260,13 @@ export const ColorComponent = ( {
1202
1260
  Edit,
1203
1261
  asyncElements,
1204
1262
  manyElements,
1263
+ disabled,
1205
1264
  }: {
1206
1265
  type: PanelTypes;
1207
1266
  Edit: ControlTypes;
1208
1267
  asyncElements: boolean;
1209
1268
  manyElements: boolean;
1269
+ disabled: boolean;
1210
1270
  } ) => {
1211
1271
  const colorFields = useMemo(
1212
1272
  () => fields.filter( ( field ) => field.type === 'color' ),
@@ -1220,6 +1280,7 @@ export const ColorComponent = ( {
1220
1280
  Edit={ Edit }
1221
1281
  asyncElements={ asyncElements }
1222
1282
  manyElements={ manyElements }
1283
+ disabled={ disabled }
1223
1284
  />
1224
1285
  );
1225
1286
  };
@@ -1230,11 +1291,13 @@ export const MediaComponent = ( {
1230
1291
  Edit,
1231
1292
  asyncElements,
1232
1293
  manyElements,
1294
+ disabled,
1233
1295
  }: {
1234
1296
  type: PanelTypes;
1235
1297
  Edit: ControlTypes;
1236
1298
  asyncElements: boolean;
1237
1299
  manyElements: boolean;
1300
+ disabled: boolean;
1238
1301
  } ) => {
1239
1302
  const mediaFields = useMemo(
1240
1303
  () => fields.filter( ( field ) => field.type === 'media' ),
@@ -1248,6 +1311,7 @@ export const MediaComponent = ( {
1248
1311
  Edit={ Edit }
1249
1312
  asyncElements={ asyncElements }
1250
1313
  manyElements={ manyElements }
1314
+ disabled={ disabled }
1251
1315
  />
1252
1316
  );
1253
1317
  };
@@ -1258,11 +1322,13 @@ export const ArrayComponent = ( {
1258
1322
  Edit,
1259
1323
  asyncElements,
1260
1324
  manyElements,
1325
+ disabled,
1261
1326
  }: {
1262
1327
  type: PanelTypes;
1263
1328
  Edit: ControlTypes;
1264
1329
  asyncElements: boolean;
1265
1330
  manyElements: boolean;
1331
+ disabled: boolean;
1266
1332
  } ) => {
1267
1333
  const arrayTextFields = useMemo(
1268
1334
  () => fields.filter( ( field ) => field.type === 'array' ),
@@ -1276,6 +1342,7 @@ export const ArrayComponent = ( {
1276
1342
  Edit={ Edit }
1277
1343
  asyncElements={ asyncElements }
1278
1344
  manyElements={ manyElements }
1345
+ disabled={ disabled }
1279
1346
  />
1280
1347
  );
1281
1348
  };
@@ -1286,11 +1353,13 @@ export const PasswordComponent = ( {
1286
1353
  Edit,
1287
1354
  asyncElements,
1288
1355
  manyElements,
1356
+ disabled,
1289
1357
  }: {
1290
1358
  type: PanelTypes;
1291
1359
  Edit: ControlTypes;
1292
1360
  asyncElements: boolean;
1293
1361
  manyElements: boolean;
1362
+ disabled: boolean;
1294
1363
  } ) => {
1295
1364
  const passwordFields = fields.filter( ( field ) =>
1296
1365
  field.id.startsWith( 'password' )
@@ -1303,6 +1372,7 @@ export const PasswordComponent = ( {
1303
1372
  Edit={ Edit }
1304
1373
  asyncElements={ asyncElements }
1305
1374
  manyElements={ manyElements }
1375
+ disabled={ disabled }
1306
1376
  />
1307
1377
  );
1308
1378
  };
@@ -1313,11 +1383,13 @@ export const NoTypeComponent = ( {
1313
1383
  Edit,
1314
1384
  asyncElements,
1315
1385
  manyElements,
1386
+ disabled,
1316
1387
  }: {
1317
1388
  type: PanelTypes;
1318
1389
  Edit: ControlTypes;
1319
1390
  asyncElements: boolean;
1320
1391
  manyElements: boolean;
1392
+ disabled: boolean;
1321
1393
  } ) => {
1322
1394
  const noTypeFields = useMemo(
1323
1395
  () => fields.filter( ( field ) => field.type === undefined ),
@@ -1331,6 +1403,7 @@ export const NoTypeComponent = ( {
1331
1403
  Edit={ Edit }
1332
1404
  asyncElements={ asyncElements }
1333
1405
  manyElements={ manyElements }
1406
+ disabled={ disabled }
1334
1407
  />
1335
1408
  );
1336
1409
  };
@@ -339,6 +339,50 @@ describe( 'normalizeFields: default getValue', () => {
339
339
  } );
340
340
  } );
341
341
 
342
+ describe( 'validation normalization', () => {
343
+ it( 'ignores string min/max rules on numeric fields', () => {
344
+ const fields: Field< {} >[] = [
345
+ {
346
+ id: 'price',
347
+ type: 'number',
348
+ isValid: {
349
+ min: '1',
350
+ max: '10',
351
+ },
352
+ },
353
+ ];
354
+ const normalizedFields = normalizeFields( fields );
355
+ expect( normalizedFields[ 0 ].isValid.min ).toBeUndefined();
356
+ expect( normalizedFields[ 0 ].isValid.max ).toBeUndefined();
357
+ } );
358
+
359
+ it( 'ignores numeric min/max rules on date-like fields', () => {
360
+ const fields: Field< {} >[] = [
361
+ {
362
+ id: 'publishDate',
363
+ type: 'date',
364
+ isValid: {
365
+ min: 1,
366
+ max: 10,
367
+ },
368
+ },
369
+ {
370
+ id: 'publishedAt',
371
+ type: 'datetime',
372
+ isValid: {
373
+ min: 1,
374
+ max: 10,
375
+ },
376
+ },
377
+ ];
378
+ const normalizedFields = normalizeFields( fields );
379
+ expect( normalizedFields[ 0 ].isValid.min ).toBeUndefined();
380
+ expect( normalizedFields[ 0 ].isValid.max ).toBeUndefined();
381
+ expect( normalizedFields[ 1 ].isValid.min ).toBeUndefined();
382
+ expect( normalizedFields[ 1 ].isValid.max ).toBeUndefined();
383
+ } );
384
+ } );
385
+
342
386
  describe( 'format normalization', () => {
343
387
  it( 'applies default format when not provided for date fields', () => {
344
388
  const fields: Field< {} >[] = [
@@ -4,13 +4,42 @@
4
4
  import type { Field, NormalizedRules } from '../../types';
5
5
  import type { FieldType } from '../../types/private';
6
6
 
7
+ function supportsNumericRangeConstraint( type?: string ) {
8
+ return type === 'integer' || type === 'number';
9
+ }
10
+
11
+ function supportsDateRangeConstraint( type?: string ) {
12
+ return type === 'date' || type === 'datetime';
13
+ }
14
+
15
+ function normalizeRangeRule< Item >(
16
+ value: number | string | undefined,
17
+ fieldType: FieldType< Item >,
18
+ key: 'min' | 'max'
19
+ ): NormalizedRules< Item >[ 'min' ] {
20
+ const validator = fieldType.validate[ key ];
21
+ if (
22
+ validator &&
23
+ ( ( typeof value === 'number' &&
24
+ supportsNumericRangeConstraint( fieldType.type ) ) ||
25
+ ( typeof value === 'string' &&
26
+ supportsDateRangeConstraint( fieldType.type ) ) )
27
+ ) {
28
+ return { constraint: value, validate: validator } as NonNullable<
29
+ NormalizedRules< Item >[ typeof key ]
30
+ >;
31
+ }
32
+ return undefined;
33
+ }
34
+
7
35
  export default function getIsValid< Item >(
8
36
  field: Field< Item >,
9
37
  fieldType: FieldType< Item >
10
38
  ): NormalizedRules< Item > {
39
+ const rules = field.isValid;
11
40
  let required;
12
41
  if (
13
- field.isValid?.required === true &&
42
+ rules?.required === true &&
14
43
  fieldType.validate.required !== undefined
15
44
  ) {
16
45
  required = {
@@ -21,9 +50,9 @@ export default function getIsValid< Item >(
21
50
 
22
51
  let elements;
23
52
  if (
24
- ( field.isValid?.elements === true ||
53
+ ( rules?.elements === true ||
25
54
  // elements is enabled unless the field opts-out
26
- ( field.isValid?.elements === undefined &&
55
+ ( rules?.elements === undefined &&
27
56
  ( !! field.elements || !! field.getElements ) ) ) &&
28
57
  fieldType.validate.elements !== undefined
29
58
  ) {
@@ -33,62 +62,46 @@ export default function getIsValid< Item >(
33
62
  };
34
63
  }
35
64
 
36
- let min;
37
- if (
38
- typeof field.isValid?.min === 'number' &&
39
- fieldType.validate.min !== undefined
40
- ) {
41
- min = {
42
- constraint: field.isValid.min,
43
- validate: fieldType.validate.min,
44
- };
45
- }
46
-
47
- let max;
48
- if (
49
- typeof field.isValid?.max === 'number' &&
50
- fieldType.validate.max !== undefined
51
- ) {
52
- max = {
53
- constraint: field.isValid.max,
54
- validate: fieldType.validate.max,
55
- };
56
- }
65
+ const min = normalizeRangeRule( rules?.min, fieldType, 'min' );
66
+ const max = normalizeRangeRule( rules?.max, fieldType, 'max' );
57
67
 
68
+ const minLengthValue = rules?.minLength;
58
69
  let minLength;
59
70
  if (
60
- typeof field.isValid?.minLength === 'number' &&
71
+ typeof minLengthValue === 'number' &&
61
72
  fieldType.validate.minLength !== undefined
62
73
  ) {
63
74
  minLength = {
64
- constraint: field.isValid.minLength,
75
+ constraint: minLengthValue,
65
76
  validate: fieldType.validate.minLength,
66
77
  };
67
78
  }
68
79
 
80
+ const maxLengthValue = rules?.maxLength;
69
81
  let maxLength;
70
82
  if (
71
- typeof field.isValid?.maxLength === 'number' &&
83
+ typeof maxLengthValue === 'number' &&
72
84
  fieldType.validate.maxLength !== undefined
73
85
  ) {
74
86
  maxLength = {
75
- constraint: field.isValid.maxLength,
87
+ constraint: maxLengthValue,
76
88
  validate: fieldType.validate.maxLength,
77
89
  };
78
90
  }
79
91
 
92
+ const patternValue = rules?.pattern;
80
93
  let pattern;
81
94
  if (
82
- field.isValid?.pattern !== undefined &&
95
+ patternValue !== undefined &&
83
96
  fieldType.validate.pattern !== undefined
84
97
  ) {
85
98
  pattern = {
86
- constraint: field.isValid?.pattern,
99
+ constraint: patternValue,
87
100
  validate: fieldType.validate.pattern,
88
101
  };
89
102
  }
90
103
 
91
- const custom = field.isValid?.custom ?? fieldType.validate.custom;
104
+ const custom = rules?.custom ?? fieldType.validate.custom;
92
105
 
93
106
  return {
94
107
  required,
@@ -0,0 +1,80 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { isValid as isValidDate } from 'date-fns';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { getDate } from '@wordpress/date';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import type { NormalizedField } from '../../types';
15
+
16
+ type Boundary = 'min' | 'max';
17
+
18
+ function parseDateLike( value?: string ) {
19
+ if ( ! value ) {
20
+ return null;
21
+ }
22
+
23
+ // Pre-check to avoid passing unparseable strings to getDate,
24
+ // which uses moment.js and emits deprecation warnings.
25
+ if ( ! isValidDate( new Date( value ) ) ) {
26
+ return null;
27
+ }
28
+
29
+ const parsed = getDate( value );
30
+ return parsed && isValidDate( parsed ) ? parsed : null;
31
+ }
32
+
33
+ function validateDateLikeBoundary< Item >(
34
+ item: Item,
35
+ field: NormalizedField< Item >,
36
+ boundary: Boundary
37
+ ): boolean {
38
+ const constraint = field.isValid[ boundary ]?.constraint;
39
+ if ( typeof constraint !== 'string' ) {
40
+ return false;
41
+ }
42
+
43
+ const value = field.getValue( { item } );
44
+ const boundaryValue = Array.isArray( value )
45
+ ? value[ boundary === 'min' ? 0 : value.length - 1 ]
46
+ : value;
47
+
48
+ if (
49
+ boundaryValue === undefined ||
50
+ boundaryValue === null ||
51
+ boundaryValue === ''
52
+ ) {
53
+ return true;
54
+ }
55
+
56
+ const parsedConstraint = parseDateLike( constraint );
57
+ const parsedValue = parseDateLike( String( boundaryValue ) );
58
+
59
+ return (
60
+ !! parsedConstraint &&
61
+ !! parsedValue &&
62
+ ( boundary === 'min'
63
+ ? parsedValue.getTime() >= parsedConstraint.getTime()
64
+ : parsedValue.getTime() <= parsedConstraint.getTime() )
65
+ );
66
+ }
67
+
68
+ export function isValidMinDate< Item >(
69
+ item: Item,
70
+ field: NormalizedField< Item >
71
+ ): boolean {
72
+ return validateDateLikeBoundary( item, field, 'min' );
73
+ }
74
+
75
+ export function isValidMaxDate< Item >(
76
+ item: Item,
77
+ field: NormalizedField< Item >
78
+ ): boolean {
79
+ return validateDateLikeBoundary( item, field, 'max' );
80
+ }
@@ -2,3 +2,6 @@
2
2
  * Internal dependencies
3
3
  */
4
4
  export { default as useFormValidity } from './use-form-validity';
5
+ export { default as useData } from './use-data';
6
+ export { useInfiniteScroll } from './use-infinite-scroll';
7
+ export { default as useSelectedItems } from './use-selected-items';