@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
@@ -123,7 +123,7 @@ const fields: Field< SamplePost >[] = [
123
123
  },
124
124
  {
125
125
  id: 'filesize',
126
- label: 'File Size',
126
+ label: 'File size',
127
127
  type: 'integer',
128
128
  readOnly: true,
129
129
  },
@@ -170,7 +170,7 @@ const fields: Field< SamplePost >[] = [
170
170
  },
171
171
  {
172
172
  id: 'longDescription',
173
- label: 'Long Description',
173
+ label: 'Long description',
174
174
  type: 'text',
175
175
  Edit: {
176
176
  control: 'textarea',
@@ -179,7 +179,7 @@ const fields: Field< SamplePost >[] = [
179
179
  },
180
180
  {
181
181
  id: 'comment_status',
182
- label: 'Comment Status',
182
+ label: 'Comment status',
183
183
  type: 'text',
184
184
  Edit: 'radio',
185
185
  elements: [
@@ -189,7 +189,7 @@ const fields: Field< SamplePost >[] = [
189
189
  },
190
190
  {
191
191
  id: 'ping_status',
192
- label: 'Allow Pings/Trackbacks',
192
+ label: 'Allow pings/trackbacks',
193
193
  type: 'boolean',
194
194
  },
195
195
  {
@@ -223,7 +223,7 @@ const fields: Field< SamplePost >[] = [
223
223
  },
224
224
  {
225
225
  id: 'flight_status',
226
- label: 'Flight Status',
226
+ label: 'Flight status',
227
227
  type: 'text',
228
228
  Edit: 'radio',
229
229
  elements: [
@@ -133,7 +133,7 @@ const fields: Field< SamplePost >[] = [
133
133
  },
134
134
  {
135
135
  id: 'filesize',
136
- label: 'File Size',
136
+ label: 'File size',
137
137
  type: 'integer',
138
138
  readOnly: true,
139
139
  },
@@ -180,7 +180,7 @@ const fields: Field< SamplePost >[] = [
180
180
  },
181
181
  {
182
182
  id: 'longDescription',
183
- label: 'Long Description',
183
+ label: 'Long description',
184
184
  type: 'text',
185
185
  Edit: {
186
186
  control: 'textarea',
@@ -189,7 +189,7 @@ const fields: Field< SamplePost >[] = [
189
189
  },
190
190
  {
191
191
  id: 'comment_status',
192
- label: 'Comment Status',
192
+ label: 'Comment status',
193
193
  type: 'text',
194
194
  Edit: 'radio',
195
195
  elements: [
@@ -199,7 +199,7 @@ const fields: Field< SamplePost >[] = [
199
199
  },
200
200
  {
201
201
  id: 'ping_status',
202
- label: 'Allow Pings/Trackbacks',
202
+ label: 'Allow pings/trackbacks',
203
203
  type: 'boolean',
204
204
  },
205
205
  {
@@ -233,7 +233,7 @@ const fields: Field< SamplePost >[] = [
233
233
  },
234
234
  {
235
235
  id: 'flight_status',
236
- label: 'Flight Status',
236
+ label: 'Flight status',
237
237
  type: 'text',
238
238
  Edit: 'radio',
239
239
  elements: [
@@ -360,7 +360,7 @@ const LayoutPanelComponent = ( {
360
360
  'title',
361
361
  {
362
362
  id: 'status',
363
- label: 'Status & Visibility',
363
+ label: 'Status & visibility',
364
364
  children: [ 'status', 'password' ],
365
365
  },
366
366
  'order',
@@ -375,12 +375,12 @@ const LayoutPanelComponent = ( {
375
375
  },
376
376
  {
377
377
  id: 'address1',
378
- label: 'Combined Address',
378
+ label: 'Combined address',
379
379
  children: [ 'address1', 'address2', 'city' ],
380
380
  },
381
381
  {
382
382
  id: 'flight_info',
383
- label: 'Flight Information',
383
+ label: 'Flight information',
384
384
  children: [
385
385
  'origin',
386
386
  'destination',
@@ -396,7 +396,7 @@ const LayoutPanelComponent = ( {
396
396
  },
397
397
  {
398
398
  id: 'passenger_details',
399
- label: 'Passenger Details',
399
+ label: 'Passenger details',
400
400
  children: [ 'author', 'seat' ],
401
401
  layout: getPanelLayoutFromStoryArgs( {
402
402
  summary: [ 'author', 'seat' ],
@@ -55,11 +55,16 @@ const fields: Field< SamplePost >[] = [
55
55
  {
56
56
  id: 'date',
57
57
  label: 'Date',
58
+ type: 'date',
59
+ },
60
+ {
61
+ id: 'datetime',
62
+ label: 'DateTime',
58
63
  type: 'datetime',
59
64
  },
60
65
  {
61
66
  id: 'birthdate',
62
- label: 'Date as options',
67
+ label: 'DateTime as options',
63
68
  type: 'datetime',
64
69
  elements: [
65
70
  { value: '', label: 'Select a date' },
@@ -126,11 +131,11 @@ const fields: Field< SamplePost >[] = [
126
131
  id: 'can_comment',
127
132
  label: 'Allow people to leave a comment',
128
133
  type: 'boolean',
129
- Edit: 'checkbox',
134
+ Edit: 'toggle',
130
135
  },
131
136
  {
132
137
  id: 'filesize',
133
- label: 'File Size',
138
+ label: 'File size',
134
139
  type: 'integer',
135
140
  readOnly: true,
136
141
  },
@@ -177,7 +182,7 @@ const fields: Field< SamplePost >[] = [
177
182
  },
178
183
  {
179
184
  id: 'longDescription',
180
- label: 'Long Description',
185
+ label: 'Long description',
181
186
  type: 'text',
182
187
  Edit: {
183
188
  control: 'textarea',
@@ -186,7 +191,7 @@ const fields: Field< SamplePost >[] = [
186
191
  },
187
192
  {
188
193
  id: 'comment_status',
189
- label: 'Comment Status',
194
+ label: 'Comment status',
190
195
  type: 'text',
191
196
  Edit: 'radio',
192
197
  elements: [
@@ -196,7 +201,7 @@ const fields: Field< SamplePost >[] = [
196
201
  },
197
202
  {
198
203
  id: 'ping_status',
199
- label: 'Allow Pings/Trackbacks',
204
+ label: 'Allow pings/trackbacks',
200
205
  type: 'boolean',
201
206
  },
202
207
  {
@@ -230,7 +235,7 @@ const fields: Field< SamplePost >[] = [
230
235
  },
231
236
  {
232
237
  id: 'flight_status',
233
- label: 'Flight Status',
238
+ label: 'Flight status',
234
239
  type: 'text',
235
240
  Edit: 'radio',
236
241
  elements: [
@@ -312,8 +317,10 @@ const getLayoutFromStoryArgs = ( {
312
317
 
313
318
  const LayoutRegularComponent = ( {
314
319
  labelPosition,
320
+ disabled = false,
315
321
  }: {
316
322
  labelPosition: 'default' | 'top' | 'side' | 'none';
323
+ disabled?: boolean;
317
324
  } ) => {
318
325
  const [ post, setPost ] = useState( {
319
326
  title: 'Hello, World!',
@@ -322,7 +329,8 @@ const LayoutRegularComponent = ( {
322
329
  status: 'draft',
323
330
  reviewer: 'fulano',
324
331
  email: 'hello@wordpress.org',
325
- date: '2021-01-01T12:00:00',
332
+ date: '2021-01-01',
333
+ datetime: '2021-01-01T12:00:00',
326
334
  birthdate: '1950-02-23T12:00:00',
327
335
  sticky: false,
328
336
  can_comment: false,
@@ -332,6 +340,18 @@ const LayoutRegularComponent = ( {
332
340
  description: 'This is a sample description.',
333
341
  } );
334
342
 
343
+ // Make fields disabled when control is set to disabled.
344
+ const _fields: Field< SamplePost >[] = useMemo( () => {
345
+ if ( ! disabled ) {
346
+ return fields;
347
+ }
348
+
349
+ return fields.map( ( field ) => ( {
350
+ ...field,
351
+ isDisabled: true,
352
+ } ) );
353
+ }, [ disabled ] );
354
+
335
355
  const form: Form = useMemo(
336
356
  () => ( {
337
357
  layout: getLayoutFromStoryArgs( {
@@ -342,14 +362,15 @@ const LayoutRegularComponent = ( {
342
362
  'title',
343
363
  'order',
344
364
  'sticky',
365
+ 'can_comment',
345
366
  'author',
346
367
  'status',
347
368
  'reviewer',
348
369
  'email',
349
370
  'password',
350
371
  'date',
372
+ 'datetime',
351
373
  'birthdate',
352
- 'can_comment',
353
374
  'filesize',
354
375
  'dimensions',
355
376
  'tags',
@@ -363,7 +384,7 @@ const LayoutRegularComponent = ( {
363
384
  return (
364
385
  <DataForm< SamplePost >
365
386
  data={ post }
366
- fields={ fields }
387
+ fields={ _fields }
367
388
  form={ form }
368
389
  onChange={ ( edits ) =>
369
390
  setPost( ( prev ) => ( {
@@ -42,7 +42,7 @@ const LayoutRowComponent = ( {
42
42
  const customerFields: Field< Customer >[] = [
43
43
  {
44
44
  id: 'name',
45
- label: 'Customer Name',
45
+ label: 'Customer name',
46
46
  type: 'text',
47
47
  },
48
48
  {
@@ -57,37 +57,37 @@ const LayoutRowComponent = ( {
57
57
  },
58
58
  {
59
59
  id: 'shippingAddress',
60
- label: 'Shipping Address',
60
+ label: 'Shipping address',
61
61
  type: 'text',
62
62
  },
63
63
  {
64
64
  id: 'shippingCity',
65
- label: 'Shipping City',
65
+ label: 'Shipping city',
66
66
  type: 'text',
67
67
  },
68
68
  {
69
69
  id: 'shippingPostalCode',
70
- label: 'Shipping Postal Code',
70
+ label: 'Shipping postal code',
71
71
  type: 'text',
72
72
  },
73
73
  {
74
74
  id: 'shippingCountry',
75
- label: 'Shipping Country',
75
+ label: 'Shipping country',
76
76
  type: 'text',
77
77
  },
78
78
  {
79
79
  id: 'billingAddress',
80
- label: 'Billing Address',
80
+ label: 'Billing address',
81
81
  type: 'text',
82
82
  },
83
83
  {
84
84
  id: 'billingCity',
85
- label: 'Billing City',
85
+ label: 'Billing city',
86
86
  type: 'text',
87
87
  },
88
88
  {
89
89
  id: 'billingPostalCode',
90
- label: 'Billing Postal Code',
90
+ label: 'Billing postal code',
91
91
  type: 'text',
92
92
  },
93
93
  {
@@ -102,7 +102,7 @@ const LayoutRowComponent = ( {
102
102
  },
103
103
  {
104
104
  id: 'hasDiscount',
105
- label: 'Has Discount?',
105
+ label: 'Has discount?',
106
106
  type: 'boolean',
107
107
  },
108
108
  {
@@ -739,7 +739,7 @@ const ValidationComponent = ( {
739
739
  },
740
740
  {
741
741
  id: 'customEdit',
742
- label: 'Custom Control',
742
+ label: 'Custom control',
743
743
  Edit: CustomEditControl,
744
744
  isValid: {
745
745
  required,
@@ -783,7 +783,7 @@ const ValidationComponent = ( {
783
783
  {
784
784
  id: 'toggleGroup',
785
785
  type: 'text',
786
- label: 'Toggle Group',
786
+ label: 'Toggle group',
787
787
  Edit: 'toggleGroup',
788
788
  elements:
789
789
  elements === 'async'
@@ -849,31 +849,46 @@ const ValidationComponent = ( {
849
849
  id: 'date',
850
850
  type: 'date',
851
851
  label: 'Date',
852
+ description: minMax
853
+ ? 'Must be between Apr 1 and Apr 20, 2026'
854
+ : undefined,
852
855
  isValid: {
853
856
  required,
854
857
  elements: elements !== 'none' ? true : false,
855
858
  custom: maybeCustomRule( customDateRule ),
859
+ min: minMax ? '2026-04-01' : undefined,
860
+ max: minMax ? '2026-04-20' : undefined,
856
861
  },
857
862
  },
858
863
  {
859
864
  id: 'dateRange',
860
865
  type: 'date',
861
- label: 'Date Range',
866
+ label: 'Date range',
862
867
  Edit: DateRangeEdit,
868
+ description: minMax
869
+ ? 'Must be between Apr 1 and Apr 20, 2026'
870
+ : undefined,
863
871
  isValid: {
864
872
  required,
865
873
  elements: elements !== 'none' ? true : false,
866
874
  custom: maybeCustomRule( customDateRangeRule ),
875
+ min: minMax ? '2026-04-01' : undefined,
876
+ max: minMax ? '2026-04-20' : undefined,
867
877
  },
868
878
  },
869
879
  {
870
880
  id: 'datetime',
871
881
  type: 'datetime',
872
- label: 'Date Time',
882
+ label: 'Date time',
883
+ description: minMax
884
+ ? 'Must be between Apr 1 and Apr 20, 2026'
885
+ : undefined,
873
886
  isValid: {
874
887
  required,
875
888
  elements: elements !== 'none' ? true : false,
876
889
  custom: maybeCustomRule( customDateTimeRule ),
890
+ min: minMax ? '2026-04-01T00:00:00.000Z' : undefined,
891
+ max: minMax ? '2026-04-20T23:59:59.000Z' : undefined,
877
892
  },
878
893
  },
879
894
  ];
@@ -947,34 +962,34 @@ const ValidationComponent = ( {
947
962
  const groupedFields = [
948
963
  {
949
964
  id: 'textFields',
950
- label: 'Text Fields',
965
+ label: 'Text fields',
951
966
  children: [ 'text', 'textarea', 'password', 'customEdit' ],
952
967
  },
953
968
  {
954
969
  id: 'numberFields',
955
- label: 'Number Fields',
970
+ label: 'Number fields',
956
971
  children: [ 'integer', 'number' ],
957
972
  },
958
973
  {
959
974
  id: 'contactFields',
960
- label: 'Contact Fields',
975
+ label: 'Contact fields',
961
976
  children: [ 'email', 'telephone', 'url' ],
962
977
  },
963
978
  {
964
979
  id: 'selectFields',
965
- label: 'Selection Fields',
980
+ label: 'Selection fields',
966
981
  children: [ 'select', 'combobox', 'textWithRadio' ],
967
982
  },
968
983
  {
969
984
  id: 'booleanFields',
970
- label: 'Boolean Fields',
985
+ label: 'Boolean fields',
971
986
  children: [ 'boolean', 'toggle', 'toggleGroup' ],
972
987
  },
973
988
  { id: 'color' },
974
989
  { id: 'array' },
975
990
  {
976
991
  id: 'dateFields',
977
- label: 'Date Fields',
992
+ label: 'Date fields',
978
993
  children: [ 'date', 'dateRange', 'datetime' ],
979
994
  },
980
995
  ];
@@ -2,12 +2,19 @@
2
2
  * External dependencies
3
3
  */
4
4
  import type { ReactNode, ComponentProps, ReactElement } from 'react';
5
+ import clsx from 'clsx';
5
6
 
6
7
  /**
7
8
  * WordPress dependencies
8
9
  */
9
- import { useEffect, useMemo, useRef, useState } from '@wordpress/element';
10
- import { useResizeObserver, throttle } from '@wordpress/compose';
10
+ import {
11
+ useContext,
12
+ useEffect,
13
+ useMemo,
14
+ useRef,
15
+ useState,
16
+ } from '@wordpress/element';
17
+ import { useResizeObserver } from '@wordpress/compose';
11
18
  import { Stack } from '@wordpress/ui';
12
19
 
13
20
  /**
@@ -32,6 +39,7 @@ import DataViewsViewConfig, {
32
39
  } from '../components/dataviews-view-config';
33
40
  import normalizeFields from '../field-types';
34
41
  import useData from '../hooks/use-data';
42
+ import { useInfiniteScroll } from '../hooks/use-infinite-scroll';
35
43
  import type { Action, Field, View, SupportedLayouts } from '../types';
36
44
  import type { SelectionOrUpdater } from '../types/private';
37
45
  type ItemWithId = { id: string };
@@ -48,9 +56,8 @@ type DataViewsProps< Item > = {
48
56
  paginationInfo: {
49
57
  totalItems: number;
50
58
  totalPages: number;
51
- infiniteScrollHandler?: () => void;
52
59
  };
53
- defaultLayouts: SupportedLayouts;
60
+ defaultLayouts?: SupportedLayouts;
54
61
  selection?: string[];
55
62
  onChangeSelection?: ( items: string[] ) => void;
56
63
  onClickItem?: ( item: Item ) => void;
@@ -75,6 +82,7 @@ type DataViewsProps< Item > = {
75
82
  const defaultGetItemId = ( item: ItemWithId ) => item.id;
76
83
  const defaultIsItemClickable = () => true;
77
84
  const EMPTY_ARRAY: any[] = [];
85
+ const DEFAULT_LAYOUTS: SupportedLayouts = { table: {}, grid: {}, list: {} };
78
86
 
79
87
  const dataViewsLayouts = VIEW_LAYOUTS.filter(
80
88
  ( viewLayout ) => ! viewLayout.isPicker
@@ -90,13 +98,18 @@ function DefaultUI( {
90
98
  search = true,
91
99
  searchLabel = undefined,
92
100
  }: DefaultUIProps ) {
101
+ const { view } = useContext( DataViewsContext );
102
+ const isInfiniteScroll = view.infiniteScrollEnabled;
93
103
  return (
94
104
  <>
95
105
  <Stack
96
106
  direction="row"
97
107
  align="top"
98
108
  justify="space-between"
99
- className="dataviews__view-actions"
109
+ className={ clsx( 'dataviews__view-actions', {
110
+ 'dataviews__view-actions--infinite-scroll':
111
+ isInfiniteScroll,
112
+ } ) }
100
113
  gap="xs"
101
114
  >
102
115
  <Stack
@@ -132,7 +145,7 @@ function DataViews< Item >( {
132
145
  getItemLevel,
133
146
  isLoading = false,
134
147
  paginationInfo,
135
- defaultLayouts: defaultLayoutsProperty,
148
+ defaultLayouts: defaultLayoutsProperty = DEFAULT_LAYOUTS,
136
149
  selection: selectionProperty,
137
150
  onChangeSelection,
138
151
  onClickItem,
@@ -144,7 +157,31 @@ function DataViews< Item >( {
144
157
  empty,
145
158
  onReset,
146
159
  }: DataViewsProps< Item > ) {
147
- const { infiniteScrollHandler } = paginationInfo;
160
+ const [ selectionState, setSelectionState ] = useState< string[] >( [] );
161
+ const isUncontrolled =
162
+ selectionProperty === undefined || onChangeSelection === undefined;
163
+ const selection = isUncontrolled ? selectionState : selectionProperty;
164
+
165
+ // useData handles both infinite scroll and standard pagination paths,
166
+ // preserving previous data while loading and tracking initial load state.
167
+ const {
168
+ data: displayData,
169
+ paginationInfo: displayPaginationInfo,
170
+ hasInitiallyLoaded,
171
+ setVisibleEntries,
172
+ } = useData( {
173
+ view,
174
+ data: data as any,
175
+ getItemId: getItemId as any,
176
+ isLoading,
177
+ selection,
178
+ paginationInfo,
179
+ } ) as {
180
+ data: ( Item & { position?: number } )[];
181
+ paginationInfo: { totalItems: number; totalPages: number };
182
+ hasInitiallyLoaded: boolean;
183
+ setVisibleEntries?: React.Dispatch< React.SetStateAction< number[] > >;
184
+ };
148
185
  const containerRef = useRef< HTMLDivElement >( null );
149
186
  const [ containerWidth, setContainerWidth ] = useState( 0 );
150
187
  const resizeObserverRef = useResizeObserver(
@@ -155,10 +192,6 @@ function DataViews< Item >( {
155
192
  },
156
193
  { box: 'border-box' }
157
194
  );
158
- const [ selectionState, setSelectionState ] = useState< string[] >( [] );
159
- const isUncontrolled =
160
- selectionProperty === undefined || onChangeSelection === undefined;
161
- const selection = isUncontrolled ? selectionState : selectionProperty;
162
195
  const [ openedFilter, setOpenedFilter ] = useState< string | null >( null );
163
196
  function setSelectionWithChange( value: SelectionOrUpdater ) {
164
197
  const newValue =
@@ -171,11 +204,16 @@ function DataViews< Item >( {
171
204
  }
172
205
  }
173
206
  const _fields = useMemo( () => normalizeFields( fields ), [ fields ] );
207
+ // When infinite scroll is enabled, don't filter selection by current data
208
+ // because items may be scrolled out of view but still selected.
174
209
  const _selection = useMemo( () => {
210
+ if ( view.infiniteScrollEnabled ) {
211
+ return selection;
212
+ }
175
213
  return selection.filter( ( id ) =>
176
214
  data.some( ( item ) => getItemId( item ) === id )
177
215
  );
178
- }, [ selection, data, getItemId ] );
216
+ }, [ selection, data, getItemId, view.infiniteScrollEnabled ] );
179
217
 
180
218
  const filters = useFilters( _fields, view );
181
219
  const hasPrimaryOrLockedFilters = useMemo(
@@ -189,64 +227,35 @@ function DataViews< Item >( {
189
227
  hasPrimaryOrLockedFilters
190
228
  );
191
229
 
230
+ const { intersectionObserver } = useInfiniteScroll( {
231
+ view,
232
+ onChangeView,
233
+ isLoading,
234
+ paginationInfo,
235
+ containerRef,
236
+ setVisibleEntries,
237
+ } );
238
+
192
239
  useEffect( () => {
193
240
  if ( hasPrimaryOrLockedFilters && ! isShowingFilter ) {
194
241
  setIsShowingFilter( true );
195
242
  }
196
243
  }, [ hasPrimaryOrLockedFilters, isShowingFilter ] );
197
244
 
198
- const {
199
- data: displayData,
200
- paginationInfo: displayPaginationInfo,
201
- hasInitiallyLoaded,
202
- } = useData( data, isLoading, paginationInfo );
203
-
204
- // Attach scroll event listener for infinite scroll
205
- useEffect( () => {
206
- if (
207
- ! hasInitiallyLoaded ||
208
- ! view.infiniteScrollEnabled ||
209
- ! containerRef.current
210
- ) {
211
- return;
212
- }
213
-
214
- const handleScroll = throttle( ( event: unknown ) => {
215
- const target = ( event as Event ).target as HTMLElement;
216
- const scrollTop = target.scrollTop;
217
- const scrollHeight = target.scrollHeight;
218
- const clientHeight = target.clientHeight;
219
-
220
- // Check if user has scrolled near the bottom
221
- if ( scrollTop + clientHeight >= scrollHeight - 100 ) {
222
- infiniteScrollHandler?.();
223
- }
224
- }, 100 ); // Throttle to 100ms
225
-
226
- const container = containerRef.current;
227
- container.addEventListener( 'scroll', handleScroll );
228
-
229
- return () => {
230
- container.removeEventListener( 'scroll', handleScroll );
231
- handleScroll.cancel(); // Cancel any pending throttled calls
232
- };
233
- }, [
234
- hasInitiallyLoaded,
235
- infiniteScrollHandler,
236
- view.infiniteScrollEnabled,
237
- ] );
238
-
239
- // Filter out DataViewsPicker layouts.
245
+ // Filter out DataViewsPicker layouts and normalize `true` to `{}`.
240
246
  const defaultLayouts = useMemo(
241
247
  () =>
242
248
  Object.fromEntries(
243
- Object.entries( defaultLayoutsProperty ).filter(
244
- ( [ layoutType ] ) => {
249
+ Object.entries( defaultLayoutsProperty )
250
+ .filter( ( [ layoutType ] ) => {
245
251
  return dataViewsLayouts.some(
246
252
  ( viewLayout ) => viewLayout.type === layoutType
247
253
  );
248
- }
249
- )
254
+ } )
255
+ .map( ( [ key, value ] ) => [
256
+ key,
257
+ value === true ? {} : value,
258
+ ] )
250
259
  ),
251
260
  [ defaultLayoutsProperty ]
252
261
  );
@@ -284,8 +293,8 @@ function DataViews< Item >( {
284
293
  config,
285
294
  empty,
286
295
  hasInitiallyLoaded,
287
- hasInfiniteScrollHandler: !! infiniteScrollHandler,
288
296
  onReset,
297
+ intersectionObserver,
289
298
  } }
290
299
  >
291
300
  <div className="dataviews-wrapper">
@@ -79,10 +79,10 @@ const EmptyComponent = ( {
79
79
  onChangeView={ setView }
80
80
  actions={ actions }
81
81
  defaultLayouts={ {
82
- [ LAYOUT_TABLE ]: {},
83
- [ LAYOUT_GRID ]: {},
84
- [ LAYOUT_LIST ]: {},
85
- [ LAYOUT_ACTIVITY ]: {},
82
+ [ LAYOUT_TABLE ]: true,
83
+ [ LAYOUT_GRID ]: true,
84
+ [ LAYOUT_LIST ]: true,
85
+ [ LAYOUT_ACTIVITY ]: true,
86
86
  } }
87
87
  isLoading={ isLoading }
88
88
  empty={ customEmpty ? <CustomEmptyComponent /> : undefined }