@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
@@ -57,6 +57,10 @@
57
57
  }
58
58
  }
59
59
  }
60
+ }
61
+
62
+ .dataviews-view-grid,
63
+ .dataviews-view-grid-infinite-scroll {
60
64
 
61
65
  .dataviews-view-grid__card {
62
66
  height: 100%;
@@ -246,7 +250,7 @@
246
250
  }
247
251
 
248
252
  .dataviews-view-grid__media--clickable {
249
- cursor: pointer;
253
+ cursor: var(--wpds-cursor-control);
250
254
  }
251
255
 
252
256
  .dataviews-view-grid__group-header {
@@ -115,7 +115,7 @@ div.dataviews-view-list {
115
115
  border: none;
116
116
  background: none;
117
117
  padding: 0;
118
- cursor: pointer;
118
+ cursor: var(--wpds-cursor-control);
119
119
 
120
120
  &:focus-visible {
121
121
  outline: none;
@@ -16,7 +16,7 @@ import {
16
16
  } from '@wordpress/components';
17
17
  import { __, sprintf } from '@wordpress/i18n';
18
18
  import { useInstanceId } from '@wordpress/compose';
19
- import { useContext } from '@wordpress/element';
19
+ import { useContext, useRef } from '@wordpress/element';
20
20
  import { Stack } from '@wordpress/ui';
21
21
 
22
22
  /**
@@ -35,6 +35,11 @@ import type { SetSelection } from '../../../types/private';
35
35
  import { GridItems } from '../utils/grid-items';
36
36
  const { Badge } = unlock( componentsPrivateApis );
37
37
  import getDataByGroup from '../utils/get-data-by-group';
38
+ import { useGridColumns } from '../grid/preview-size-picker';
39
+ import {
40
+ useIntersectionObserver,
41
+ usePlaceholdersNeeded,
42
+ } from '../utils/use-infinite-scroll';
38
43
 
39
44
  interface GridItemProps< Item > {
40
45
  view: ViewPickerGridType;
@@ -73,7 +78,12 @@ function GridItem< Item >( {
73
78
  }: GridItemProps< Item > ) {
74
79
  const { showTitle = true, showMedia = true, showDescription = true } = view;
75
80
  const id = getItemId( item );
81
+ const elementRef = useRef< HTMLButtonElement >( null );
82
+
76
83
  const isSelected = selection.includes( id );
84
+
85
+ useIntersectionObserver( elementRef, posinset );
86
+
77
87
  const renderedMediaField = mediaField?.render ? (
78
88
  <mediaField.render
79
89
  item={ item }
@@ -88,6 +98,7 @@ function GridItem< Item >( {
88
98
 
89
99
  return (
90
100
  <Composite.Item
101
+ ref={ elementRef }
91
102
  aria-label={
92
103
  titleField
93
104
  ? titleField.getValue( { item } ) || __( '(no title)' )
@@ -105,6 +116,7 @@ function GridItem< Item >( {
105
116
  } ) }
106
117
  aria-selected={ isSelected }
107
118
  onClick={ () => {
119
+ // Toggle in/out of selection array
108
120
  if ( isSelected ) {
109
121
  onChangeSelection(
110
122
  selection.filter( ( itemId ) => id !== itemId )
@@ -318,12 +330,21 @@ function ViewPickerGrid< Item >( {
318
330
  : null;
319
331
  const dataByGroup = groupField ? getDataByGroup( data, groupField ) : null;
320
332
 
321
- const isInfiniteScroll = view.infiniteScrollEnabled && ! dataByGroup;
333
+ const isInfiniteScroll =
334
+ ( view.infiniteScrollEnabled && ! dataByGroup ) ?? false;
322
335
 
323
336
  const currentPage = view?.page ?? 1;
324
337
  const perPage = view?.perPage ?? 0;
325
338
  const setSize = isInfiniteScroll ? paginationInfo?.totalItems : undefined;
326
339
 
340
+ // Calculate placeholders needed for infinite scroll
341
+ const gridColumns = useGridColumns();
342
+ const placeholdersNeeded = usePlaceholdersNeeded(
343
+ data,
344
+ isInfiniteScroll,
345
+ gridColumns
346
+ );
347
+
327
348
  return (
328
349
  <>
329
350
  {
@@ -378,10 +399,12 @@ function ViewPickerGrid< Item >( {
378
399
  }
379
400
  >
380
401
  { groupItems.map( ( item ) => {
402
+ // Use position from item if available (infinite scroll), otherwise calculate.
381
403
  const posInSet =
404
+ ( item as any ).position ??
382
405
  ( currentPage - 1 ) * perPage +
383
- data.indexOf( item ) +
384
- 1;
406
+ data.indexOf( item ) +
407
+ 1;
385
408
  return (
386
409
  <GridItem
387
410
  key={ getItemId( item ) }
@@ -451,17 +474,28 @@ function ViewPickerGrid< Item >( {
451
474
  aria-multiselectable={ isMultiselect }
452
475
  aria-label={ itemListLabel }
453
476
  >
454
- { data.map( ( item, index ) => {
455
- let posinset = isInfiniteScroll
456
- ? index + 1
457
- : undefined;
458
-
459
- if ( ! isInfiniteScroll ) {
460
- // When infinite scroll isn't active, take pagination into account
461
- // when calculating the posinset.
462
- posinset =
463
- ( currentPage - 1 ) * perPage + index + 1;
464
- }
477
+ { /* Render placeholders for unloaded items in first row */ }
478
+ { Array.from( { length: placeholdersNeeded } ).map(
479
+ ( _, index ) => (
480
+ <Composite.Item
481
+ key={ `placeholder-${ index }` }
482
+ render={ ( { children, ...props } ) => (
483
+ <Stack
484
+ direction="column"
485
+ children={ children }
486
+ { ...props }
487
+ />
488
+ ) }
489
+ role="option"
490
+ aria-hidden
491
+ tabIndex={ -1 }
492
+ className="dataviews-view-picker-grid__card dataviews-view-picker-grid__placeholder"
493
+ />
494
+ )
495
+ ) }
496
+ { data.map( ( item ) => {
497
+ // Use position from item for accessibility in infinite scroll mode.
498
+ const posinset = ( item as any ).position;
465
499
 
466
500
  return (
467
501
  <GridItem
@@ -174,7 +174,7 @@
174
174
  }
175
175
 
176
176
  .dataviews-view-picker-grid__media--clickable {
177
- cursor: pointer;
177
+ cursor: var(--wpds-cursor-control);
178
178
  }
179
179
 
180
180
  .dataviews-view-picker-grid-group__header {
@@ -33,6 +33,7 @@ import type { SetSelection } from '../../../types/private';
33
33
  import ColumnHeaderMenu from '../table/column-header-menu';
34
34
  import ColumnPrimary from '../table/column-primary';
35
35
  import getDataByGroup from '../utils/get-data-by-group';
36
+ import { useIntersectionObserver } from '../utils/use-infinite-scroll';
36
37
 
37
38
  interface TableColumnFieldProps< Item > {
38
39
  fields: NormalizedField< Item >[];
@@ -95,8 +96,13 @@ function TableRow< Item >( {
95
96
  posinset,
96
97
  }: TableRowProps< Item > ) {
97
98
  const { paginationInfo } = useContext( DataViewsContext );
99
+
98
100
  const isSelected = selection.includes( id );
101
+
99
102
  const [ isHovered, setIsHovered ] = useState( false );
103
+ const elementRef = useRef< HTMLButtonElement >( null );
104
+
105
+ useIntersectionObserver( elementRef, posinset );
100
106
  const {
101
107
  showTitle = true,
102
108
  showMedia = true,
@@ -119,6 +125,7 @@ function TableRow< Item >( {
119
125
  return (
120
126
  <Composite.Item
121
127
  key={ id }
128
+ ref={ elementRef }
122
129
  render={ ( { children, ...props } ) => (
123
130
  <tr
124
131
  className={ clsx( 'dataviews-view-table__row', {
@@ -136,6 +143,7 @@ function TableRow< Item >( {
136
143
  aria-posinset={ posinset }
137
144
  role={ infiniteScrollEnabled ? 'article' : 'option' }
138
145
  onClick={ () => {
146
+ // Toggle in/out of selection array
139
147
  if ( isSelected ) {
140
148
  onChangeSelection(
141
149
  selection.filter( ( itemId ) => id !== itemId )
@@ -150,6 +158,7 @@ function TableRow< Item >( {
150
158
  >
151
159
  <td
152
160
  className="dataviews-view-table__checkbox-column"
161
+ // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
153
162
  role="presentation"
154
163
  >
155
164
  <div className="dataviews-view-table__cell-content-wrapper">
@@ -167,7 +176,10 @@ function TableRow< Item >( {
167
176
  </td>
168
177
 
169
178
  { hasPrimaryColumn && (
170
- <td role="presentation">
179
+ <td
180
+ // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
181
+ role="presentation"
182
+ >
171
183
  <ColumnPrimary
172
184
  item={ item }
173
185
  titleField={ showTitle ? titleField : undefined }
@@ -192,6 +204,7 @@ function TableRow< Item >( {
192
204
  maxWidth,
193
205
  minWidth,
194
206
  } }
207
+ // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
195
208
  role="presentation"
196
209
  >
197
210
  <TableColumnField
@@ -236,6 +249,12 @@ function ViewPickerTable< Item >( {
236
249
  }
237
250
  } );
238
251
 
252
+ const groupField = view.groupBy?.field
253
+ ? fields.find( ( f ) => f.id === view.groupBy?.field )
254
+ : null;
255
+ const dataByGroup = groupField ? getDataByGroup( data, groupField ) : null;
256
+ const isInfiniteScroll = view.infiniteScrollEnabled && ! dataByGroup;
257
+
239
258
  const tableNoticeId = useId();
240
259
 
241
260
  if ( nextHeaderMenuToFocus ) {
@@ -264,10 +283,6 @@ function ViewPickerTable< Item >( {
264
283
  ( field ) => field.id === view.descriptionField
265
284
  );
266
285
 
267
- const groupField = view.groupBy?.field
268
- ? fields.find( ( f ) => f.id === view.groupBy?.field )
269
- : null;
270
- const dataByGroup = groupField ? getDataByGroup( data, groupField ) : null;
271
286
  const { showTitle = true, showMedia = true, showDescription = true } = view;
272
287
  const hasPrimaryColumn =
273
288
  ( titleField && showTitle ) ||
@@ -285,7 +300,6 @@ function ViewPickerTable< Item >( {
285
300
  headerMenuRefs.current.delete( column );
286
301
  }
287
302
  };
288
- const isInfiniteScroll = view.infiniteScrollEnabled && ! dataByGroup;
289
303
 
290
304
  return (
291
305
  <>
@@ -319,6 +333,7 @@ function ViewPickerTable< Item >( {
319
333
  data={ data }
320
334
  actions={ actions }
321
335
  getItemId={ getItemId }
336
+ disableSelectAll={ isInfiniteScroll }
322
337
  />
323
338
  ) }
324
339
  </th>
@@ -400,6 +415,7 @@ function ViewPickerTable< Item >( {
400
415
  1
401
416
  }
402
417
  className="dataviews-view-table__group-header-cell"
418
+ // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
403
419
  role="presentation"
404
420
  >
405
421
  { view.groupBy?.showLabel === false
@@ -441,23 +457,29 @@ function ViewPickerTable< Item >( {
441
457
  orientation="vertical"
442
458
  >
443
459
  { hasData &&
444
- data.map( ( item, index ) => (
445
- <TableRow
446
- key={ getItemId( item ) }
447
- item={ item }
448
- fields={ fields }
449
- id={ getItemId( item ) || index.toString() }
450
- view={ view }
451
- titleField={ titleField }
452
- mediaField={ mediaField }
453
- descriptionField={ descriptionField }
454
- selection={ selection }
455
- getItemId={ getItemId }
456
- onChangeSelection={ onChangeSelection }
457
- multiselect={ isMultiselect }
458
- posinset={ index + 1 }
459
- />
460
- ) ) }
460
+ data.map( ( item, index ) => {
461
+ const itemId = getItemId( item );
462
+ // Use position from item for accessibility in infinite scroll mode.
463
+ const posinset = ( item as any ).position;
464
+
465
+ return (
466
+ <TableRow
467
+ key={ itemId }
468
+ item={ item }
469
+ fields={ fields }
470
+ id={ itemId || index.toString() }
471
+ view={ view }
472
+ titleField={ titleField }
473
+ mediaField={ mediaField }
474
+ descriptionField={ descriptionField }
475
+ selection={ selection }
476
+ getItemId={ getItemId }
477
+ onChangeSelection={ onChangeSelection }
478
+ multiselect={ isMultiselect }
479
+ posinset={ posinset }
480
+ />
481
+ );
482
+ } ) }
461
483
  </Composite>
462
484
  ) }
463
485
  </table>
@@ -36,7 +36,7 @@
36
36
 
37
37
  // When used in picker context, ensure row selection works as expected
38
38
  .dataviews-view-table__row {
39
- cursor: pointer;
39
+ cursor: var(--wpds-cursor-control);
40
40
 
41
41
  &.is-selected {
42
42
  // Ensure selected rows are visually distinct
@@ -267,7 +267,6 @@ function TableRow< Item >( {
267
267
  // itself (to toggle row selection) without erroneously
268
268
  // intercepting click events from ItemActions.
269
269
 
270
- /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
271
270
  <td
272
271
  className={ clsx( 'dataviews-view-table__actions-column', {
273
272
  'dataviews-view-table__actions-column--sticky': true,
@@ -278,7 +277,6 @@ function TableRow< Item >( {
278
277
  >
279
278
  <ItemActions item={ item } actions={ actions } />
280
279
  </td>
281
- /* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
282
280
  ) }
283
281
  </tr>
284
282
  );
@@ -0,0 +1,64 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useContext, useEffect } from '@wordpress/element';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import DataViewsContext from '../../dataviews-context';
10
+
11
+ /**
12
+ * Hook to set up an IntersectionObserver for infinite scroll items.
13
+ * Observes the element and triggers the callback when the item becomes visible.
14
+ *
15
+ * @param elementRef - Ref to the DOM element to observe.
16
+ * @param posinset - The position of the item in the set (1-based index).
17
+ */
18
+ export function useIntersectionObserver(
19
+ elementRef: React.RefObject< HTMLElement | null >,
20
+ posinset: number | undefined
21
+ ) {
22
+ const { intersectionObserver } = useContext( DataViewsContext );
23
+
24
+ useEffect( () => {
25
+ const element = elementRef.current;
26
+ if ( ! element || posinset === undefined || ! intersectionObserver ) {
27
+ return;
28
+ }
29
+
30
+ intersectionObserver.observe( element );
31
+
32
+ return () => {
33
+ intersectionObserver.unobserve( element );
34
+ };
35
+ }, [ elementRef, intersectionObserver, posinset ] );
36
+ }
37
+
38
+ /**
39
+ * Hook to calculate the number of placeholder items needed for the first row
40
+ * in an infinite scroll grid layout.
41
+ *
42
+ * When items are loaded starting from a position other than 1, placeholders
43
+ * are needed to maintain proper grid alignment.
44
+ *
45
+ * @param data - The array of data items.
46
+ * @param isInfiniteScroll - Whether infinite scroll is enabled.
47
+ * @param gridColumns - The number of columns in the grid.
48
+ * @return The number of placeholder items needed.
49
+ */
50
+ export function usePlaceholdersNeeded< Item >(
51
+ data: Item[],
52
+ isInfiniteScroll: boolean,
53
+ gridColumns: number
54
+ ): number {
55
+ const hasData = !! data?.length;
56
+ const firstItemPosition =
57
+ hasData && isInfiniteScroll
58
+ ? ( data[ 0 ] as { position?: number } ).position
59
+ : undefined;
60
+
61
+ return firstItemPosition && gridColumns
62
+ ? ( firstItemPosition - 1 ) % gridColumns
63
+ : 0;
64
+ }
@@ -72,6 +72,7 @@ export function DataViewsPagination() {
72
72
  ),
73
73
  {
74
74
  div: <div aria-hidden />,
75
+ // @ts-expect-error — Tag injected via sprintf argument, not visible in format string.
75
76
  CurrentPage: (
76
77
  <SelectControl
77
78
  aria-label={ __( 'Current page' ) }
@@ -32,15 +32,32 @@ function BulkSelectionCheckbox< Item >( {
32
32
  onChangeSelection,
33
33
  data,
34
34
  getItemId,
35
+ disableSelectAll = false,
35
36
  }: {
36
37
  selection: string[];
37
38
  selectedItems: Item[];
38
39
  onChangeSelection: SetSelection;
39
40
  data: Item[];
40
41
  getItemId: ( item: Item ) => string;
42
+ disableSelectAll?: boolean;
41
43
  } ) {
44
+ const hasSelection = selection.length > 0;
42
45
  const areAllSelected = selectedItems.length === data.length;
43
46
 
47
+ if ( disableSelectAll ) {
48
+ return (
49
+ <CheckboxControl
50
+ className="dataviews-view-table-selection-checkbox"
51
+ checked={ hasSelection }
52
+ disabled={ ! hasSelection }
53
+ onChange={ () => {
54
+ onChangeSelection( [] );
55
+ } }
56
+ aria-label={ __( 'Deselect all' ) }
57
+ />
58
+ );
59
+ }
60
+
44
61
  return (
45
62
  <CheckboxControl
46
63
  className="dataviews-view-table-selection-checkbox"
@@ -136,6 +153,7 @@ export function DataViewsPickerFooter() {
136
153
  getItemId,
137
154
  actions = EMPTY_ARRAY,
138
155
  paginationInfo,
156
+ view,
139
157
  } = useContext( DataViewsContext );
140
158
 
141
159
  const isMultiselect = useIsMultiselectPicker( actions );
@@ -143,7 +161,8 @@ export function DataViewsPickerFooter() {
143
161
  const message = getFooterMessage(
144
162
  selection.length,
145
163
  data.length,
146
- paginationInfo.totalItems
164
+ paginationInfo.totalItems,
165
+ !! view.infiniteScrollEnabled
147
166
  );
148
167
 
149
168
  const selectedItems = useMemo(
@@ -173,6 +192,7 @@ export function DataViewsPickerFooter() {
173
192
  onChangeSelection={ onChangeSelection }
174
193
  data={ data }
175
194
  getItemId={ getItemId }
195
+ disableSelectAll={ !! view.infiniteScrollEnabled }
176
196
  />
177
197
  ) }
178
198
  <span className="dataviews-bulk-actions-footer__item-count">
@@ -35,7 +35,8 @@ const DataViewsSearch = memo( function Search( { label }: SearchProps ) {
35
35
  if ( debouncedSearch !== viewRef.current?.search ) {
36
36
  onChangeViewRef.current( {
37
37
  ...viewRef.current,
38
- page: 1,
38
+ page: view.page ? 1 : undefined,
39
+ startPosition: view.startPosition ? 1 : undefined,
39
40
  search: debouncedSearch,
40
41
  } );
41
42
  }
@@ -30,7 +30,8 @@ export default function DataViewsSelectionCheckbox< Item >( {
30
30
  ...extraProps
31
31
  }: DataViewsSelectionCheckboxProps< Item > ) {
32
32
  const id = getItemId( item );
33
- const checked = ! disabled && selection.includes( id );
33
+ const isInSelectionArray = selection.includes( id );
34
+ const checked = ! disabled && isInSelectionArray;
34
35
 
35
36
  // Fallback label to ensure accessibility
36
37
  const selectionLabel =
@@ -47,8 +48,9 @@ export default function DataViewsSelectionCheckbox< Item >( {
47
48
  return;
48
49
  }
49
50
 
51
+ // Toggle in/out of selection array
50
52
  onChangeSelection(
51
- selection.includes( id )
53
+ isInSelectionArray
52
54
  ? selection.filter( ( itemId ) => id !== itemId )
53
55
  : [ ...selection, id ]
54
56
  );
@@ -31,7 +31,6 @@ import { SORTING_DIRECTIONS, sortIcons, sortLabels } from '../../constants';
31
31
  import { VIEW_LAYOUTS } from '../dataviews-layouts';
32
32
  import type { View } from '../../types';
33
33
  import DataViewsContext from '../dataviews-context';
34
- import InfiniteScrollToggle from './infinite-scroll-toggle';
35
34
  import { PropertiesSection } from './properties-section';
36
35
  import { unlock } from '../../lock-unlock';
37
36
 
@@ -346,7 +345,6 @@ export function DataviewsViewConfigDropdown() {
346
345
  { !! activeLayout?.viewConfigOptions && (
347
346
  <activeLayout.viewConfigOptions />
348
347
  ) }
349
- <InfiniteScrollToggle />
350
348
  <ItemsPerPageControl />
351
349
  <PropertiesSection />
352
350
  </Stack>
@@ -15,11 +15,6 @@ export default function InfiniteScrollToggle() {
15
15
  const { view, onChangeView } = context;
16
16
  const infiniteScrollEnabled = view.infiniteScrollEnabled ?? false;
17
17
 
18
- // Only render the toggle if an infinite scroll handler is available
19
- if ( ! context.hasInfiniteScrollHandler ) {
20
- return null;
21
- }
22
-
23
18
  return (
24
19
  <ToggleControl
25
20
  label={ __( 'Enable infinite scroll' ) }
@@ -297,7 +297,7 @@ export const HighLevelHelpText: Story = {
297
297
  fields: [
298
298
  {
299
299
  id: 'accountForm',
300
- label: 'Account Information',
300
+ label: 'Account information',
301
301
  description:
302
302
  'We collect this information to create your account and provide personalized services. Your data will be kept secure and used only for account management and service improvements.',
303
303
  children: [ 'name', 'email', 'phone' ],
@@ -54,17 +54,17 @@ const DataAdapterComponent = () => {
54
54
  // for nested data based on the field id.
55
55
  {
56
56
  id: 'user.profile.name',
57
- label: 'User Name',
57
+ label: 'User name',
58
58
  type: 'text',
59
59
  },
60
60
  {
61
61
  id: 'user.profile.email',
62
- label: 'User Email',
62
+ label: 'User email',
63
63
  type: 'email',
64
64
  },
65
65
  {
66
66
  id: 'user.profile.tags',
67
- label: 'User Tags',
67
+ label: 'User tags',
68
68
  type: 'array',
69
69
  placeholder: 'Enter comma-separated tags',
70
70
  description:
@@ -101,13 +101,13 @@ const DataAdapterComponent = () => {
101
101
  // Example of deriving data by leveraging setValue method.
102
102
  {
103
103
  id: 'revenue.total',
104
- label: 'Total Revenue',
104
+ label: 'Total revenue',
105
105
  type: 'integer',
106
106
  readOnly: true,
107
107
  },
108
108
  {
109
109
  id: 'revenue.pricePerUnit',
110
- label: 'Price Per Unit',
110
+ label: 'Price per unit',
111
111
  type: 'integer',
112
112
  setValue: ( { item, value } ) => ( {
113
113
  revenue: {
@@ -174,7 +174,7 @@ const DataAdapterComponent = () => {
174
174
  fields: [
175
175
  {
176
176
  id: 'userProfile',
177
- label: 'User Profile',
177
+ label: 'User profile',
178
178
  children: [
179
179
  'user.profile.name',
180
180
  'user.profile.email',
@@ -93,6 +93,13 @@ export const LayoutRegular = {
93
93
  description: 'Chooses the label position.',
94
94
  options: [ 'default', 'top', 'side', 'none' ],
95
95
  },
96
+ disabled: {
97
+ control: { type: 'boolean' },
98
+ description: 'Disable all fields in the form.',
99
+ },
100
+ },
101
+ args: {
102
+ disabled: false,
96
103
  },
97
104
  };
98
105
 
@@ -44,7 +44,7 @@ const LayoutCardComponent = ( {
44
44
  const customerFields: Field< Customer >[] = [
45
45
  {
46
46
  id: 'name',
47
- label: 'Customer Name',
47
+ label: 'Customer name',
48
48
  type: 'text',
49
49
  },
50
50
  {
@@ -70,17 +70,17 @@ const LayoutCardComponent = ( {
70
70
  },
71
71
  {
72
72
  id: 'shippingAddress',
73
- label: 'Shipping Address',
73
+ label: 'Shipping address',
74
74
  type: 'text',
75
75
  },
76
76
  {
77
77
  id: 'billingAddress',
78
- label: 'Billing Address',
78
+ label: 'Billing address',
79
79
  type: 'text',
80
80
  },
81
81
  {
82
82
  id: 'displayPayments',
83
- label: 'Display Payments?',
83
+ label: 'Display payments?',
84
84
  type: 'boolean',
85
85
  },
86
86
  {
@@ -112,7 +112,7 @@ const LayoutCardComponent = ( {
112
112
  },
113
113
  {
114
114
  id: 'dueDate',
115
- label: 'Due Date',
115
+ label: 'Due date',
116
116
  type: 'text',
117
117
  render: ( { item } ) => {
118
118
  return <Badge>Due on: { item.dueDate }</Badge>;