@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
@@ -6,7 +6,7 @@ import type { Meta } from '@storybook/react-vite';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { useState, useMemo, useCallback, useEffect } from '@wordpress/element';
9
+ import { useState, useMemo, useEffect } from '@wordpress/element';
10
10
  import { Modal, Button } from '@wordpress/components';
11
11
  import { Stack } from '@wordpress/ui';
12
12
 
@@ -14,7 +14,7 @@ import { Stack } from '@wordpress/ui';
14
14
  * Internal dependencies
15
15
  */
16
16
  import DataViewsPicker from '../index';
17
- import { LAYOUT_PICKER_GRID, LAYOUT_PICKER_TABLE } from '../../constants';
17
+ import { LAYOUT_PICKER_GRID } from '../../constants';
18
18
  import filterSortAndPaginate from '../../utils/filter-sort-and-paginate';
19
19
  import type { ActionButton, View } from '../../types';
20
20
  import { data, fields, type SpaceObject } from './fixtures';
@@ -70,32 +70,66 @@ const DataViewsPickerContent = ( {
70
70
  actions: customActions,
71
71
  selection: customSelection,
72
72
  }: PickerContentProps ) => {
73
- const [ view, setView ] = useState< View >( {
74
- fields: [],
75
- titleField: 'title',
76
- mediaField: 'image',
77
- search: '',
78
- page: 1,
79
- perPage: 10,
80
- filters: [],
81
- type: LAYOUT_PICKER_GRID,
82
- groupBy: isGrouped ? { field: 'type', direction: 'asc' } : undefined,
83
- infiniteScrollEnabled,
73
+ const [ view, setView ] = useState< View >( () => {
74
+ const baseView: View = {
75
+ fields: [],
76
+ titleField: 'title',
77
+ mediaField: 'image',
78
+ search: '',
79
+ filters: [],
80
+ type: LAYOUT_PICKER_GRID,
81
+ groupBy: isGrouped
82
+ ? { field: 'type', direction: 'asc' as const }
83
+ : undefined,
84
+ infiniteScrollEnabled,
85
+ };
86
+
87
+ if ( infiniteScrollEnabled ) {
88
+ return {
89
+ ...baseView,
90
+ startPosition: 1,
91
+ perPage: 10,
92
+ };
93
+ }
94
+
95
+ return {
96
+ ...baseView,
97
+ page: 1,
98
+ perPage: 10,
99
+ };
84
100
  } );
85
- const { data: shownData, paginationInfo: normalPaginationInfo } =
86
- useMemo( () => {
87
- return filterSortAndPaginate( data, view, fields );
88
- }, [ view ] );
101
+ const { data: shownData, paginationInfo } = useMemo( () => {
102
+ return filterSortAndPaginate( data, view, fields );
103
+ }, [ view ] );
89
104
 
90
105
  useEffect( () => {
91
- setView( ( prevView ) => ( {
92
- ...prevView,
93
- groupBy:
94
- isGrouped && ! infiniteScrollEnabled
95
- ? { field: 'type', direction: 'asc' }
96
- : undefined,
97
- infiniteScrollEnabled,
98
- } ) );
106
+ setView( ( prevView ) => {
107
+ const baseUpdates = {
108
+ groupBy:
109
+ isGrouped && ! infiniteScrollEnabled
110
+ ? { field: 'type', direction: 'asc' as const }
111
+ : undefined,
112
+ infiniteScrollEnabled,
113
+ };
114
+
115
+ if ( infiniteScrollEnabled ) {
116
+ return {
117
+ ...prevView,
118
+ ...baseUpdates,
119
+ startPosition: 1,
120
+ perPage: 15,
121
+ page: undefined,
122
+ } as View;
123
+ }
124
+
125
+ return {
126
+ ...prevView,
127
+ ...baseUpdates,
128
+ page: prevView.page ?? 1,
129
+ perPage: prevView.perPage ?? 10,
130
+ startPosition: undefined,
131
+ } as View;
132
+ } );
99
133
  }, [ isGrouped, infiniteScrollEnabled ] );
100
134
 
101
135
  const [ selection, setSelection ] = useState< string[] >(
@@ -129,24 +163,12 @@ const DataViewsPickerContent = ( {
129
163
  },
130
164
  ];
131
165
 
132
- const {
133
- data: infiniteScrollData,
134
- paginationInfo: infiniteScrollPaginationInfo,
135
- isLoadingMore,
136
- } = useInfiniteScroll( {
137
- view,
138
- setView,
139
- data: shownData,
140
- getItemId: ( item ) => item.id.toString(),
141
- totalDataLength: data.length,
142
- } );
143
-
144
166
  return (
145
167
  <>
146
168
  { infiniteScrollEnabled && (
147
169
  <style>{ `
148
170
  .dataviews-picker-wrapper {
149
- height: 600px;
171
+ height: 750px;
150
172
  overflow: auto;
151
173
  }
152
174
  ` }</style>
@@ -158,22 +180,13 @@ const DataViewsPickerContent = ( {
158
180
  setSelection( selectedIds );
159
181
  } }
160
182
  getItemId={ ( item ) => item.id.toString() }
161
- paginationInfo={
162
- infiniteScrollEnabled
163
- ? infiniteScrollPaginationInfo
164
- : normalPaginationInfo
165
- }
166
- data={ infiniteScrollEnabled ? infiniteScrollData : shownData }
167
- isLoading={ infiniteScrollEnabled ? isLoadingMore : undefined }
183
+ paginationInfo={ paginationInfo }
184
+ data={ shownData }
168
185
  view={ view }
169
186
  fields={ fields }
170
187
  onChangeView={ setView }
171
188
  config={ { perPageSizes } }
172
189
  itemListLabel="Galactic Bodies"
173
- defaultLayouts={ {
174
- [ LAYOUT_PICKER_GRID ]: {},
175
- [ LAYOUT_PICKER_TABLE ]: { perPage: 20 },
176
- } }
177
190
  />
178
191
  </>
179
192
  );
@@ -296,87 +309,3 @@ export const WithModal = ( {
296
309
 
297
310
  WithModal.args = storyArgs;
298
311
  WithModal.argTypes = storyArgTypes;
299
-
300
- function useInfiniteScroll( {
301
- view,
302
- setView,
303
- data: shownData,
304
- getItemId,
305
- totalDataLength,
306
- }: {
307
- view: View;
308
- setView: ( view: View ) => void;
309
- data: SpaceObject[];
310
- getItemId: ( item: SpaceObject ) => string;
311
- totalDataLength: number;
312
- } ): {
313
- data: SpaceObject[];
314
- paginationInfo: {
315
- totalItems: number;
316
- totalPages: number;
317
- infiniteScrollHandler?: ( () => void ) | undefined;
318
- };
319
- isLoadingMore: boolean;
320
- hasMoreData: boolean;
321
- } {
322
- // Custom pagination handler that simulates server-side pagination
323
- const [ allLoadedRecords, setAllLoadedRecords ] = useState< SpaceObject[] >(
324
- []
325
- );
326
- const [ isLoadingMore, setIsLoadingMore ] = useState( false );
327
-
328
- const totalItems = totalDataLength;
329
- const totalPages = Math.ceil( totalItems / ( view.perPage || 10 ) );
330
- const currentPage = view.page || 1;
331
- const hasMoreData = currentPage < totalPages;
332
-
333
- const infiniteScrollHandler = useCallback( () => {
334
- if ( isLoadingMore || currentPage >= totalPages ) {
335
- return;
336
- }
337
-
338
- setIsLoadingMore( true );
339
-
340
- setView( {
341
- ...view,
342
- page: currentPage + 1,
343
- } );
344
- }, [ isLoadingMore, currentPage, totalPages, view, setView ] );
345
-
346
- // Initialize data on first load or when view changes significantly
347
- useEffect( () => {
348
- if ( currentPage === 1 || ! view.infiniteScrollEnabled ) {
349
- // First page - replace all data
350
- setAllLoadedRecords( shownData );
351
- } else {
352
- // Subsequent pages - append to existing data
353
- setAllLoadedRecords( ( prev ) => {
354
- const existingIds = new Set( prev.map( getItemId ) );
355
- const newRecords = shownData.filter(
356
- ( record ) => ! existingIds.has( getItemId( record ) )
357
- );
358
- return [ ...prev, ...newRecords ];
359
- } );
360
- }
361
- setIsLoadingMore( false );
362
- }, [
363
- view.search,
364
- view.filters,
365
- view.perPage,
366
- currentPage,
367
- view.infiniteScrollEnabled,
368
- ] );
369
-
370
- const paginationInfo = {
371
- totalItems,
372
- totalPages,
373
- infiniteScrollHandler,
374
- };
375
-
376
- return {
377
- data: allLoadedRecords,
378
- paginationInfo,
379
- isLoadingMore,
380
- hasMoreData,
381
- };
382
- }
@@ -14,7 +14,12 @@ import { useMemo, useState } from '@wordpress/element';
14
14
  */
15
15
  import DataViewsPicker from '../index';
16
16
  import { LAYOUT_PICKER_GRID } from '../../constants';
17
- import type { ActionButton, View, ViewPickerGrid } from '../../types';
17
+ import type {
18
+ ActionButton,
19
+ SupportedLayouts,
20
+ View,
21
+ ViewPickerGrid,
22
+ } from '../../types';
18
23
  import filterSortAndPaginate from '../../utils/filter-sort-and-paginate';
19
24
 
20
25
  type Data = {
@@ -107,7 +112,7 @@ function Picker( {
107
112
  paginationInfo,
108
113
  data: shownData,
109
114
  view,
110
- defaultLayouts: { [ LAYOUT_PICKER_GRID ]: {} },
115
+ defaultLayouts: { [ LAYOUT_PICKER_GRID ]: true } as SupportedLayouts,
111
116
  fields: [],
112
117
  onChangeView: setView,
113
118
  multiselect,
@@ -475,4 +480,76 @@ describe( 'DataViews Picker', () => {
475
480
  } );
476
481
  } );
477
482
  } );
483
+
484
+ describe( 'Default layouts', () => {
485
+ /**
486
+ * A minimal Picker that intentionally omits the `defaultLayouts` prop so
487
+ * that DataViewsPicker falls back to its internal DEFAULT_PICKER_LAYOUTS
488
+ * constant ({ pickerGrid: true, pickerTable: true }).
489
+ */
490
+ function PickerWithoutDefaultLayouts() {
491
+ const [ view, setView ] = useState< View >( {
492
+ type: LAYOUT_PICKER_GRID,
493
+ fields: [],
494
+ titleField: 'title',
495
+ mediaField: 'image',
496
+ search: '',
497
+ page: 1,
498
+ perPage: 10,
499
+ filters: [],
500
+ } satisfies ViewPickerGrid );
501
+
502
+ const [ selection, setSelection ] = useState< string[] >( [] );
503
+
504
+ const { data: shownData, paginationInfo } = useMemo( () => {
505
+ return filterSortAndPaginate( data, view, [] );
506
+ }, [ view ] );
507
+
508
+ return (
509
+ <DataViewsPicker
510
+ getItemId={ ( item: Data ) => item.id.toString() }
511
+ paginationInfo={ paginationInfo }
512
+ data={ shownData }
513
+ view={ view }
514
+ fields={ [] }
515
+ onChangeView={ setView }
516
+ selection={ selection }
517
+ onChangeSelection={ setSelection }
518
+ // No `defaultLayouts` prop falls back to DEFAULT_PICKER_LAYOUTS
519
+ />
520
+ );
521
+ }
522
+
523
+ it( 'renders both picker layout options when defaultLayouts is not provided', async () => {
524
+ render( <PickerWithoutDefaultLayouts /> );
525
+
526
+ const user = userEvent.setup();
527
+
528
+ // Both picker layouts are available, so the Layout switcher button
529
+ // (rendered by ViewTypeMenu) must be present.
530
+ const layoutButton = screen.getByRole( 'button', {
531
+ name: 'Layout',
532
+ } );
533
+ expect( layoutButton ).toBeInTheDocument();
534
+
535
+ // Open the layout menu.
536
+ await user.click( layoutButton );
537
+
538
+ // Both "Grid" and "Table" picker layout options must appear in the menu.
539
+ expect(
540
+ screen.getByRole( 'menuitemradio', { name: 'Grid' } )
541
+ ).toBeInTheDocument();
542
+ expect(
543
+ screen.getByRole( 'menuitemradio', { name: 'Table' } )
544
+ ).toBeInTheDocument();
545
+
546
+ // The grid layout is active by default.
547
+ expect(
548
+ screen.getByRole( 'menuitemradio', { name: 'Grid' } )
549
+ ).toBeChecked();
550
+ expect(
551
+ screen.getByRole( 'menuitemradio', { name: 'Table' } )
552
+ ).not.toBeChecked();
553
+ } );
554
+ } );
478
555
  } );
@@ -21,6 +21,7 @@ import {
21
21
  OPERATOR_BETWEEN,
22
22
  } from '../constants';
23
23
  import isValidRequired from './utils/is-valid-required';
24
+ import { isValidMaxDate, isValidMinDate } from './utils/is-valid-date-boundary';
24
25
  import render from './utils/render-default';
25
26
 
26
27
  const format = {
@@ -91,5 +92,7 @@ export default {
91
92
  validate: {
92
93
  required: isValidRequired,
93
94
  elements: isValidElements,
95
+ min: isValidMinDate,
96
+ max: isValidMaxDate,
94
97
  },
95
98
  } satisfies FieldType< any >;
@@ -20,6 +20,7 @@ import {
20
20
  OPERATOR_OVER,
21
21
  } from '../constants';
22
22
  import isValidRequired from './utils/is-valid-required';
23
+ import { isValidMaxDate, isValidMinDate } from './utils/is-valid-date-boundary';
23
24
  import render from './utils/render-default';
24
25
 
25
26
  const format = {
@@ -88,5 +89,7 @@ export default {
88
89
  validate: {
89
90
  required: isValidRequired,
90
91
  elements: isValidElements,
92
+ min: isValidMinDate,
93
+ max: isValidMaxDate,
91
94
  },
92
95
  } satisfies FieldType< any >;
@@ -96,6 +96,10 @@ export default function normalizeFields< Item >(
96
96
  getElements: field.getElements,
97
97
  hasElements: hasElements( field ),
98
98
  isVisible: field.isVisible,
99
+ isDisabled:
100
+ typeof field.isDisabled === 'function'
101
+ ? field.isDisabled
102
+ : () => !! field.isDisabled,
99
103
  enableHiding: field.enableHiding ?? true,
100
104
  readOnly: field.readOnly ?? false,
101
105
  // The type provides defaults for the following props