@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
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { fireEvent, render, screen } from '@testing-library/react';
4
+ import { fireEvent, render, screen, waitFor } from '@testing-library/react';
5
5
  import userEvent from '@testing-library/user-event';
6
6
 
7
7
  /**
@@ -19,7 +19,7 @@ import {
19
19
  LAYOUT_LIST,
20
20
  LAYOUT_TABLE,
21
21
  } from '../../constants';
22
- import type { Action, View } from '../../types';
22
+ import type { Action, SupportedLayouts, View } from '../../types';
23
23
  import filterSortAndPaginate from '../../utils/filter-sort-and-paginate';
24
24
 
25
25
  type Data = {
@@ -38,11 +38,11 @@ const DEFAULT_VIEW = {
38
38
  filters: [],
39
39
  };
40
40
 
41
- const defaultLayouts = {
42
- [ LAYOUT_TABLE ]: {},
43
- [ LAYOUT_GRID ]: {},
44
- [ LAYOUT_LIST ]: {},
45
- [ LAYOUT_ACTIVITY ]: {},
41
+ const defaultLayouts: SupportedLayouts = {
42
+ [ LAYOUT_TABLE ]: true,
43
+ [ LAYOUT_GRID ]: true,
44
+ [ LAYOUT_LIST ]: true,
45
+ [ LAYOUT_ACTIVITY ]: true,
46
46
  };
47
47
 
48
48
  const fields = [
@@ -240,8 +240,17 @@ describe( 'DataViews component', () => {
240
240
  expect( screen.getByText( 'TEST TITLE' ) ).toBeInTheDocument();
241
241
  } );
242
242
 
243
- it( 'should trigger infinite scroll when the layout container scrolls', () => {
244
- const infiniteScrollHandler = jest.fn();
243
+ it( 'should trigger infinite scroll when the layout container scrolls', async () => {
244
+ const onChangeView = jest.fn();
245
+
246
+ if ( typeof global.IntersectionObserver === 'undefined' ) {
247
+ ( global as any ).IntersectionObserver = jest.fn( () => ( {
248
+ observe: jest.fn(),
249
+ unobserve: jest.fn(),
250
+ disconnect: jest.fn(),
251
+ } ) );
252
+ }
253
+
245
254
  const { container } = render(
246
255
  <DataViewWrapper
247
256
  view={ {
@@ -249,11 +258,7 @@ describe( 'DataViews component', () => {
249
258
  infiniteScrollEnabled: true,
250
259
  perPage: 1,
251
260
  } }
252
- paginationInfo={ {
253
- totalItems: data.length,
254
- totalPages: data.length,
255
- infiniteScrollHandler,
256
- } }
261
+ onChangeView={ onChangeView }
257
262
  />
258
263
  );
259
264
  // eslint-disable-next-line testing-library/no-container, testing-library/no-node-access
@@ -278,7 +283,14 @@ describe( 'DataViews component', () => {
278
283
 
279
284
  fireEvent.scroll( layoutContainer );
280
285
 
281
- expect( infiniteScrollHandler ).toHaveBeenCalledTimes( 1 );
286
+ await waitFor( () => {
287
+ expect( onChangeView ).toHaveBeenCalledWith(
288
+ expect.objectContaining( {
289
+ infiniteScrollEnabled: true,
290
+ startPosition: 2,
291
+ } )
292
+ );
293
+ } );
282
294
  } );
283
295
 
284
296
  describe( 'in table view', () => {
@@ -725,4 +737,71 @@ describe( 'DataViews component', () => {
725
737
  ).toEqual( 3 );
726
738
  } );
727
739
  } );
740
+ describe( 'Default layouts', () => {
741
+ /**
742
+ * A minimal wrapper that intentionally omits the `defaultLayouts` prop so
743
+ * DataViews falls back to its internal DEFAULT_LAYOUTS constant
744
+ * ({ table: true, grid: true, list: true }).
745
+ */
746
+ function DataViewWrapperWithoutDefaultLayouts() {
747
+ const [ view, setView ] = useState< View >( {
748
+ ...DEFAULT_VIEW,
749
+ fields: [ 'title', 'order', 'author' ],
750
+ } );
751
+
752
+ const { data: shownData, paginationInfo } = useMemo( () => {
753
+ return filterSortAndPaginate( data, view, fields );
754
+ }, [ view ] );
755
+
756
+ return (
757
+ <DataViews
758
+ getItemId={ ( item: Data ) => item.id.toString() }
759
+ paginationInfo={ paginationInfo }
760
+ data={ shownData }
761
+ view={ view }
762
+ fields={ fields }
763
+ onChangeView={ setView }
764
+ // No `defaultLayouts` prop — falls back to DEFAULT_LAYOUTS
765
+ />
766
+ );
767
+ }
768
+
769
+ it( 'renders Table, Grid, and List layout options when defaultLayouts is not provided', async () => {
770
+ render( <DataViewWrapperWithoutDefaultLayouts /> );
771
+
772
+ const user = userEvent.setup();
773
+
774
+ // All three default layouts are available, so the Layout switcher
775
+ // button (rendered by ViewTypeMenu) must be present.
776
+ const layoutButton = screen.getByRole( 'button', {
777
+ name: 'Layout',
778
+ } );
779
+ expect( layoutButton ).toBeInTheDocument();
780
+
781
+ // Open the layout menu.
782
+ await user.click( layoutButton );
783
+
784
+ // Table, Grid, and List options must all appear.
785
+ expect(
786
+ screen.getByRole( 'menuitemradio', { name: 'Table' } )
787
+ ).toBeInTheDocument();
788
+ expect(
789
+ screen.getByRole( 'menuitemradio', { name: 'Grid' } )
790
+ ).toBeInTheDocument();
791
+ expect(
792
+ screen.getByRole( 'menuitemradio', { name: 'List' } )
793
+ ).toBeInTheDocument();
794
+
795
+ // Table is the default active layout.
796
+ expect(
797
+ screen.getByRole( 'menuitemradio', { name: 'Table' } )
798
+ ).toBeChecked();
799
+ expect(
800
+ screen.getByRole( 'menuitemradio', { name: 'Grid' } )
801
+ ).not.toBeChecked();
802
+ expect(
803
+ screen.getByRole( 'menuitemradio', { name: 'List' } )
804
+ ).not.toBeChecked();
805
+ } );
806
+ } );
728
807
  } );
@@ -2,12 +2,19 @@
2
2
  * External dependencies
3
3
  */
4
4
  import type { ReactNode } 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
  /**
@@ -30,6 +37,8 @@ import DataViewsViewConfig, {
30
37
  ViewTypeMenu,
31
38
  } from '../components/dataviews-view-config';
32
39
  import normalizeFields from '../field-types';
40
+ import useData from '../hooks/use-data';
41
+ import { useInfiniteScroll } from '../hooks/use-infinite-scroll';
33
42
  import type { ActionButton, Field, View, SupportedLayouts } from '../types';
34
43
  import type { SelectionOrUpdater } from '../types/private';
35
44
  type ItemWithId = { id: string };
@@ -52,9 +61,8 @@ type DataViewsPickerProps< Item > = {
52
61
  paginationInfo: {
53
62
  totalItems: number;
54
63
  totalPages: number;
55
- infiniteScrollHandler?: () => void;
56
64
  };
57
- defaultLayouts: SupportedLayouts;
65
+ defaultLayouts?: SupportedLayouts;
58
66
  selection: string[];
59
67
  onChangeSelection: ( items: string[] ) => void;
60
68
  children?: ReactNode;
@@ -63,12 +71,17 @@ type DataViewsPickerProps< Item > = {
63
71
  };
64
72
  itemListLabel?: string;
65
73
  empty?: ReactNode;
74
+ onReset?: ( () => void ) | false;
66
75
  } & ( Item extends ItemWithId
67
76
  ? { getItemId?: ( item: Item ) => string }
68
77
  : { getItemId: ( item: Item ) => string } );
69
78
 
70
79
  const defaultGetItemId = ( item: ItemWithId ) => item.id;
71
80
  const EMPTY_ARRAY: any[] = [];
81
+ const DEFAULT_PICKER_LAYOUTS: SupportedLayouts = {
82
+ pickerGrid: true,
83
+ pickerTable: true,
84
+ };
72
85
 
73
86
  type DefaultUIProps = Pick<
74
87
  DataViewsPickerProps< any >,
@@ -79,13 +92,18 @@ function DefaultUI( {
79
92
  search = true,
80
93
  searchLabel = undefined,
81
94
  }: DefaultUIProps ) {
95
+ const { view } = useContext( DataViewsContext );
96
+ const isInfiniteScroll = view.infiniteScrollEnabled;
82
97
  return (
83
98
  <>
84
99
  <Stack
85
100
  direction="row"
86
101
  align="top"
87
102
  justify="space-between"
88
- className="dataviews__view-actions"
103
+ className={ clsx( 'dataviews__view-actions', {
104
+ 'dataviews__view-actions--infinite-scroll':
105
+ isInfiniteScroll,
106
+ } ) }
89
107
  gap="xs"
90
108
  >
91
109
  <Stack
@@ -119,15 +137,26 @@ function DataViewsPicker< Item >( {
119
137
  getItemId = defaultGetItemId,
120
138
  isLoading = false,
121
139
  paginationInfo,
122
- defaultLayouts: defaultLayoutsProperty,
140
+ defaultLayouts: defaultLayoutsProperty = DEFAULT_PICKER_LAYOUTS,
123
141
  selection,
124
142
  onChangeSelection,
125
143
  children,
126
144
  config = { perPageSizes: [ 10, 20, 50, 100 ] },
127
145
  itemListLabel,
128
146
  empty,
147
+ onReset,
129
148
  }: DataViewsPickerProps< Item > ) {
130
- const { infiniteScrollHandler } = paginationInfo;
149
+ // useData ensures data loading is correct whether infinite scroll is enabled or pagination is used.
150
+ const { data: displayData, setVisibleEntries } = useData( {
151
+ view,
152
+ data: data as any,
153
+ getItemId: getItemId as any,
154
+ selection,
155
+ paginationInfo,
156
+ } ) as {
157
+ data: ( Item & { position?: number } )[];
158
+ setVisibleEntries?: React.Dispatch< React.SetStateAction< number[] > >;
159
+ };
131
160
  const containerRef = useRef< HTMLDivElement >( null );
132
161
  const [ containerWidth, setContainerWidth ] = useState( 0 );
133
162
  const resizeObserverRef = useResizeObserver(
@@ -148,6 +177,7 @@ function DataViewsPicker< Item >( {
148
177
  }
149
178
  const _fields = useMemo( () => normalizeFields( fields ), [ fields ] );
150
179
  const filters = useFilters( _fields, view );
180
+
151
181
  const hasPrimaryOrLockedFilters = useMemo(
152
182
  () =>
153
183
  ( filters || [] ).some(
@@ -159,50 +189,35 @@ function DataViewsPicker< Item >( {
159
189
  hasPrimaryOrLockedFilters
160
190
  );
161
191
 
192
+ const { intersectionObserver } = useInfiniteScroll( {
193
+ view,
194
+ onChangeView,
195
+ isLoading,
196
+ paginationInfo,
197
+ containerRef,
198
+ setVisibleEntries,
199
+ } );
200
+
162
201
  useEffect( () => {
163
202
  if ( hasPrimaryOrLockedFilters && ! isShowingFilter ) {
164
203
  setIsShowingFilter( true );
165
204
  }
166
205
  }, [ hasPrimaryOrLockedFilters, isShowingFilter ] );
167
206
 
168
- // Attach scroll event listener for infinite scroll
169
- useEffect( () => {
170
- if ( ! view.infiniteScrollEnabled || ! containerRef.current ) {
171
- return;
172
- }
173
-
174
- const handleScroll = throttle( ( event: unknown ) => {
175
- const target = ( event as Event ).target as HTMLElement;
176
- const scrollTop = target.scrollTop;
177
- const scrollHeight = target.scrollHeight;
178
- const clientHeight = target.clientHeight;
179
-
180
- // Check if user has scrolled near the bottom
181
- if ( scrollTop + clientHeight >= scrollHeight - 100 ) {
182
- infiniteScrollHandler?.();
183
- }
184
- }, 100 ); // Throttle to 100ms
185
-
186
- const container = containerRef.current;
187
- container.addEventListener( 'scroll', handleScroll );
188
-
189
- return () => {
190
- container.removeEventListener( 'scroll', handleScroll );
191
- handleScroll.cancel(); // Cancel any pending throttled calls
192
- };
193
- }, [ infiniteScrollHandler, view.infiniteScrollEnabled ] );
194
-
195
- // Filter out DataViewsPicker layouts.
207
+ // Filter out non-picker layouts and normalize `true` to `{}`.
196
208
  const defaultLayouts = useMemo(
197
209
  () =>
198
210
  Object.fromEntries(
199
- Object.entries( defaultLayoutsProperty ).filter(
200
- ( [ layoutType ] ) => {
211
+ Object.entries( defaultLayoutsProperty )
212
+ .filter( ( [ layoutType ] ) => {
201
213
  return dataViewsPickerLayouts.some(
202
214
  ( viewLayout ) => viewLayout.type === layoutType
203
215
  );
204
- }
205
- )
216
+ } )
217
+ .map( ( [ key, value ] ) => [
218
+ key,
219
+ value === true ? {} : value,
220
+ ] )
206
221
  ),
207
222
  [ defaultLayoutsProperty ]
208
223
  );
@@ -218,7 +233,7 @@ function DataViewsPicker< Item >( {
218
233
  onChangeView,
219
234
  fields: _fields,
220
235
  actions,
221
- data,
236
+ data: displayData,
222
237
  isLoading,
223
238
  paginationInfo,
224
239
  isItemClickable,
@@ -237,8 +252,9 @@ function DataViewsPicker< Item >( {
237
252
  config,
238
253
  itemListLabel,
239
254
  empty,
255
+ onReset,
240
256
  hasInitiallyLoaded: true,
241
- hasInfiniteScrollHandler: !! infiniteScrollHandler,
257
+ intersectionObserver,
242
258
  } }
243
259
  >
244
260
  <div className="dataviews-picker-wrapper">
@@ -312,6 +312,276 @@ export const data: SpaceObject[] = [
312
312
  datetime: '2020-03-01T10:15:20Z',
313
313
  email: 'thessalonikopolymnianebuchodonossarinacharybdis@example.com',
314
314
  },
315
+ {
316
+ id: 20,
317
+ name: {
318
+ title: 'Titan',
319
+ description: 'Largest moon of Saturn',
320
+ },
321
+ image: 'https://upload.wikimedia.org/wikipedia/commons/f/fe/Titan_in_true_color_by_Kevin_M._Gill.jpg',
322
+ type: 'Satellite',
323
+ isPlanet: false,
324
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
325
+ satellites: 0,
326
+ date: '2022-02-15',
327
+ datetime: '2022-02-15T08:30:00Z',
328
+ email: 'titan@example.com',
329
+ },
330
+ {
331
+ id: 21,
332
+ name: {
333
+ title: 'Enceladus',
334
+ description: 'Icy moon of Saturn with geysers',
335
+ },
336
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/PIA17202_-_Approaching_Enceladus.jpg/960px-PIA17202_-_Approaching_Enceladus.jpg',
337
+ type: 'Satellite',
338
+ isPlanet: false,
339
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
340
+ satellites: 0,
341
+ date: '2023-03-20',
342
+ datetime: '2023-03-20T11:45:00Z',
343
+ email: 'enceladus@example.com',
344
+ },
345
+ {
346
+ id: 22,
347
+ name: {
348
+ title: 'Mimas',
349
+ description: 'Death Star moon of Saturn',
350
+ },
351
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Mimas_Cassini.jpg/960px-Mimas_Cassini.jpg',
352
+ type: 'Satellite',
353
+ isPlanet: false,
354
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
355
+ satellites: 0,
356
+ date: '2021-07-12',
357
+ datetime: '2021-07-12T15:20:00Z',
358
+ email: 'mimas@example.com',
359
+ },
360
+ {
361
+ id: 23,
362
+ name: {
363
+ title: 'Charon',
364
+ description: 'Largest moon of Pluto',
365
+ },
366
+ image: 'https://upload.wikimedia.org/wikipedia/commons/2/2e/Charon_in_True_Color_-_High-Res.jpg',
367
+ type: 'Satellite',
368
+ isPlanet: false,
369
+ categories: [ 'Solar system', 'Satellite', 'Pluto', 'Moon' ],
370
+ satellites: 0,
371
+ date: '2020-09-25',
372
+ datetime: '2020-09-25T13:15:00Z',
373
+ email: 'charon@example.com',
374
+ },
375
+ {
376
+ id: 24,
377
+ name: {
378
+ title: 'Phobos',
379
+ description: 'Larger moon of Mars',
380
+ },
381
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Phobos_colour_2008.jpg/960px-Phobos_colour_2008.jpg',
382
+ type: 'Satellite',
383
+ isPlanet: false,
384
+ categories: [ 'Solar system', 'Satellite', 'Mars', 'Moon' ],
385
+ satellites: 0,
386
+ date: '2019-06-14',
387
+ datetime: '2019-06-14T07:45:00Z',
388
+ email: 'phobos@example.com',
389
+ },
390
+ {
391
+ id: 25,
392
+ name: {
393
+ title: 'Deimos',
394
+ description: 'Smaller moon of Mars',
395
+ },
396
+ image: 'https://upload.wikimedia.org/wikipedia/commons/8/86/NASA-Deimos-MarsMoon-20090221.jpg',
397
+ type: 'Satellite',
398
+ isPlanet: false,
399
+ categories: [ 'Solar system', 'Satellite', 'Mars', 'Moon' ],
400
+ satellites: 0,
401
+ date: '2018-11-30',
402
+ datetime: '2018-11-30T16:00:00Z',
403
+ email: 'deimos@example.com',
404
+ },
405
+ {
406
+ id: 26,
407
+ name: {
408
+ title: 'Rhea',
409
+ description: 'Second largest moon of Saturn',
410
+ },
411
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/PIA07763_Rhea_full_globe5.jpg/2560px-PIA07763_Rhea_full_globe5.jpg',
412
+ type: 'Satellite',
413
+ isPlanet: false,
414
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
415
+ satellites: 0,
416
+ date: '2022-08-19',
417
+ datetime: '2022-08-19T10:30:00Z',
418
+ email: 'rhea@example.com',
419
+ },
420
+ {
421
+ id: 27,
422
+ name: {
423
+ title: 'Iapetus',
424
+ description: 'Two-toned moon of Saturn',
425
+ },
426
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Iapetus_trailing_natural_color.jpg/2560px-Iapetus_trailing_natural_color.jpg',
427
+ type: 'Satellite',
428
+ isPlanet: false,
429
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
430
+ satellites: 0,
431
+ date: '2023-01-22',
432
+ datetime: '2023-01-22T14:20:00Z',
433
+ email: 'iapetus@example.com',
434
+ },
435
+ {
436
+ id: 28,
437
+ name: {
438
+ title: 'Dione',
439
+ description: 'Icy moon of Saturn',
440
+ },
441
+ image: 'https://upload.wikimedia.org/wikipedia/commons/d/d0/Dione_in_natural_light_%28cropped%29.jpg',
442
+ type: 'Satellite',
443
+ isPlanet: false,
444
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
445
+ satellites: 0,
446
+ date: '2021-04-17',
447
+ datetime: '2021-04-17T12:00:00Z',
448
+ email: 'dione@example.com',
449
+ },
450
+ {
451
+ id: 29,
452
+ name: {
453
+ title: 'Tethys',
454
+ description: 'Mid-sized moon of Saturn',
455
+ },
456
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Tethys_-_Rev_15_%2837267740632%29.png/960px-Tethys_-_Rev_15_%2837267740632%29.png',
457
+ type: 'Satellite',
458
+ isPlanet: false,
459
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
460
+ satellites: 0,
461
+ date: '2020-12-05',
462
+ datetime: '2020-12-05T09:40:00Z',
463
+ email: 'tethys@example.com',
464
+ },
465
+ {
466
+ id: 30,
467
+ name: {
468
+ title: 'Miranda',
469
+ description: 'Unusual moon of Uranus',
470
+ },
471
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Miranda_mosaic_in_color_-_Voyager_2.png/960px-Miranda_mosaic_in_color_-_Voyager_2.png',
472
+ type: 'Satellite',
473
+ isPlanet: false,
474
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
475
+ satellites: 0,
476
+ date: '2024-02-28',
477
+ datetime: '2024-02-28T11:15:00Z',
478
+ email: 'miranda@example.com',
479
+ },
480
+ {
481
+ id: 31,
482
+ name: {
483
+ title: 'Ariel',
484
+ description: 'Brightest moon of Uranus',
485
+ },
486
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Ariel_in_monochrome.jpg/960px-Ariel_in_monochrome.jpg',
487
+ type: 'Satellite',
488
+ isPlanet: false,
489
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
490
+ satellites: 0,
491
+ date: '2023-09-10',
492
+ datetime: '2023-09-10T08:25:00Z',
493
+ email: 'ariel@example.com',
494
+ },
495
+ {
496
+ id: 32,
497
+ name: {
498
+ title: 'Umbriel',
499
+ description: 'Dark moon of Uranus',
500
+ },
501
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/PIA00040_Umbrielx2.47.jpg/560px-PIA00040_Umbrielx2.47.jpg',
502
+ type: 'Satellite',
503
+ isPlanet: false,
504
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
505
+ satellites: 0,
506
+ date: '2022-05-03',
507
+ datetime: '2022-05-03T15:50:00Z',
508
+ email: 'umbriel@example.com',
509
+ },
510
+ {
511
+ id: 33,
512
+ name: {
513
+ title: 'Titania',
514
+ description: 'Largest moon of Uranus',
515
+ },
516
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Titania_-_Jan_24_1986_%2822689891350%29.jpg/560px-Titania_-_Jan_24_1986_%2822689891350%29.jpg',
517
+ type: 'Satellite',
518
+ isPlanet: false,
519
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
520
+ satellites: 0,
521
+ date: '2021-10-18',
522
+ datetime: '2021-10-18T13:35:00Z',
523
+ email: 'titania@example.com',
524
+ },
525
+ {
526
+ id: 34,
527
+ name: {
528
+ title: 'Oberon',
529
+ description: 'Outermost major moon of Uranus',
530
+ },
531
+ image: 'https://upload.wikimedia.org/wikipedia/commons/6/6d/Oberon_in_true_color_by_Kevin_M._Gill.jpg',
532
+ type: 'Satellite',
533
+ isPlanet: false,
534
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
535
+ satellites: 0,
536
+ date: '2020-07-22',
537
+ datetime: '2020-07-22T10:05:00Z',
538
+ email: 'oberon@example.com',
539
+ },
540
+ {
541
+ id: 35,
542
+ name: {
543
+ title: 'Ceres',
544
+ description: 'Largest object in the asteroid belt',
545
+ },
546
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Ceres_-_RC3_-_Haulani_Crater_%2822381131691%29_%28cropped%29.jpg/560px-Ceres_-_RC3_-_Haulani_Crater_%2822381131691%29_%28cropped%29.jpg',
547
+ type: 'Dwarf planet',
548
+ isPlanet: false,
549
+ categories: [ 'Solar system', 'Dwarf planet', 'Asteroid belt' ],
550
+ satellites: 0,
551
+ date: '2024-08-14',
552
+ datetime: '2024-08-14T16:40:00Z',
553
+ email: 'ceres@example.com',
554
+ },
555
+ {
556
+ id: 36,
557
+ name: {
558
+ title: 'Makemake',
559
+ description: 'Reddish dwarf planet',
560
+ },
561
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Makemake_and_its_moon.jpg/560px-Makemake_and_its_moon.jpg',
562
+ type: 'Dwarf planet',
563
+ isPlanet: false,
564
+ categories: [ 'Solar system', 'Dwarf planet', 'Trans-Neptunian' ],
565
+ satellites: 1,
566
+ date: '2022-03-29',
567
+ datetime: '2022-03-29T12:55:00Z',
568
+ email: 'makemake@example.com',
569
+ },
570
+ {
571
+ id: 37,
572
+ name: {
573
+ title: 'Haumea',
574
+ description: 'Elongated dwarf planet',
575
+ },
576
+ image: 'https://upload.wikimedia.org/wikipedia/commons/2/2b/Haumea_Hubble.png',
577
+ type: 'Dwarf planet',
578
+ isPlanet: false,
579
+ categories: [ 'Solar system', 'Dwarf planet', 'Trans-Neptunian' ],
580
+ satellites: 2,
581
+ date: '2021-11-11',
582
+ datetime: '2021-11-11T09:10:00Z',
583
+ email: 'haumea@example.com',
584
+ },
315
585
  ];
316
586
 
317
587
  export const fields: Field< SpaceObject >[] = [