@wordpress/dataviews 13.1.1-next.v.202603161435.0 → 14.0.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 (183) hide show
  1. package/CHANGELOG.md +15 -6
  2. package/README.md +17 -2
  3. package/build/components/dataform-controls/datetime.cjs +8 -4
  4. package/build/components/dataform-controls/datetime.cjs.map +2 -2
  5. package/build/components/dataform-layouts/card/index.cjs +132 -128
  6. package/build/components/dataform-layouts/card/index.cjs.map +3 -3
  7. package/build/components/dataviews-bulk-actions/index.cjs +28 -5
  8. package/build/components/dataviews-bulk-actions/index.cjs.map +2 -2
  9. package/build/components/dataviews-context/index.cjs +2 -2
  10. package/build/components/dataviews-context/index.cjs.map +2 -2
  11. package/build/components/dataviews-footer/index.cjs +2 -3
  12. package/build/components/dataviews-footer/index.cjs.map +2 -2
  13. package/build/components/dataviews-layouts/grid/composite-grid.cjs +378 -249
  14. package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
  15. package/build/components/dataviews-layouts/picker-grid/index.cjs +63 -30
  16. package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
  17. package/build/components/dataviews-layouts/picker-table/index.cjs +34 -22
  18. package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
  19. package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs +62 -0
  20. package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs.map +7 -0
  21. package/build/components/dataviews-picker-footer/index.cjs +23 -4
  22. package/build/components/dataviews-picker-footer/index.cjs.map +2 -2
  23. package/build/components/dataviews-search/index.cjs +2 -1
  24. package/build/components/dataviews-search/index.cjs.map +2 -2
  25. package/build/components/dataviews-selection-checkbox/index.cjs +3 -2
  26. package/build/components/dataviews-selection-checkbox/index.cjs.map +2 -2
  27. package/build/components/dataviews-view-config/index.cjs +0 -2
  28. package/build/components/dataviews-view-config/index.cjs.map +3 -3
  29. package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs +0 -3
  30. package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs.map +2 -2
  31. package/build/dataviews/index.cjs +37 -37
  32. package/build/dataviews/index.cjs.map +3 -3
  33. package/build/dataviews-picker/index.cjs +25 -24
  34. package/build/dataviews-picker/index.cjs.map +3 -3
  35. package/build/hooks/index.cjs +11 -2
  36. package/build/hooks/index.cjs.map +2 -2
  37. package/build/hooks/use-data.cjs +146 -9
  38. package/build/hooks/use-data.cjs.map +2 -2
  39. package/build/hooks/use-infinite-scroll.cjs +208 -0
  40. package/build/hooks/use-infinite-scroll.cjs.map +7 -0
  41. package/build/hooks/use-selected-items.cjs +57 -0
  42. package/build/hooks/use-selected-items.cjs.map +7 -0
  43. package/build/types/dataviews.cjs.map +1 -1
  44. package/build/types/field-api.cjs.map +1 -1
  45. package/build/utils/filter-sort-and-paginate.cjs +5 -1
  46. package/build/utils/filter-sort-and-paginate.cjs.map +2 -2
  47. package/build/utils/get-footer-message.cjs +8 -8
  48. package/build/utils/get-footer-message.cjs.map +2 -2
  49. package/build-module/components/dataform-controls/datetime.mjs +8 -4
  50. package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
  51. package/build-module/components/dataform-layouts/card/index.mjs +132 -133
  52. package/build-module/components/dataform-layouts/card/index.mjs.map +2 -2
  53. package/build-module/components/dataviews-bulk-actions/index.mjs +28 -5
  54. package/build-module/components/dataviews-bulk-actions/index.mjs.map +2 -2
  55. package/build-module/components/dataviews-context/index.mjs +2 -2
  56. package/build-module/components/dataviews-context/index.mjs.map +2 -2
  57. package/build-module/components/dataviews-footer/index.mjs +2 -3
  58. package/build-module/components/dataviews-footer/index.mjs.map +2 -2
  59. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs +387 -250
  60. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
  61. package/build-module/components/dataviews-layouts/picker-grid/index.mjs +67 -31
  62. package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
  63. package/build-module/components/dataviews-layouts/picker-table/index.mjs +34 -22
  64. package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
  65. package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs +26 -0
  66. package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs.map +7 -0
  67. package/build-module/components/dataviews-picker-footer/index.mjs +23 -4
  68. package/build-module/components/dataviews-picker-footer/index.mjs.map +2 -2
  69. package/build-module/components/dataviews-search/index.mjs +2 -1
  70. package/build-module/components/dataviews-search/index.mjs.map +2 -2
  71. package/build-module/components/dataviews-selection-checkbox/index.mjs +3 -2
  72. package/build-module/components/dataviews-selection-checkbox/index.mjs.map +2 -2
  73. package/build-module/components/dataviews-view-config/index.mjs +0 -2
  74. package/build-module/components/dataviews-view-config/index.mjs.map +2 -2
  75. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs +0 -3
  76. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs.map +2 -2
  77. package/build-module/dataviews/index.mjs +45 -39
  78. package/build-module/dataviews/index.mjs.map +2 -2
  79. package/build-module/dataviews-picker/index.mjs +33 -26
  80. package/build-module/dataviews-picker/index.mjs.map +2 -2
  81. package/build-module/hooks/index.mjs +7 -1
  82. package/build-module/hooks/index.mjs.map +2 -2
  83. package/build-module/hooks/use-data.mjs +147 -10
  84. package/build-module/hooks/use-data.mjs.map +2 -2
  85. package/build-module/hooks/use-infinite-scroll.mjs +188 -0
  86. package/build-module/hooks/use-infinite-scroll.mjs.map +7 -0
  87. package/build-module/hooks/use-selected-items.mjs +36 -0
  88. package/build-module/hooks/use-selected-items.mjs.map +7 -0
  89. package/build-module/utils/filter-sort-and-paginate.mjs +5 -1
  90. package/build-module/utils/filter-sort-and-paginate.mjs.map +2 -2
  91. package/build-module/utils/get-footer-message.mjs +8 -8
  92. package/build-module/utils/get-footer-message.mjs.map +2 -2
  93. package/build-style/style-rtl.css +61 -37
  94. package/build-style/style.css +61 -37
  95. package/build-types/components/dataform-controls/datetime.d.ts +1 -1
  96. package/build-types/components/dataform-controls/datetime.d.ts.map +1 -1
  97. package/build-types/components/dataform-layouts/card/index.d.ts.map +1 -1
  98. package/build-types/components/dataviews-bulk-actions/index.d.ts +2 -1
  99. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
  100. package/build-types/components/dataviews-context/index.d.ts +1 -1
  101. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  102. package/build-types/components/dataviews-footer/index.d.ts.map +1 -1
  103. package/build-types/components/dataviews-layouts/grid/composite-grid.d.ts.map +1 -1
  104. package/build-types/components/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  105. package/build-types/components/dataviews-layouts/picker-table/index.d.ts.map +1 -1
  106. package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts +22 -0
  107. package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts.map +1 -0
  108. package/build-types/components/dataviews-picker-footer/index.d.ts.map +1 -1
  109. package/build-types/components/dataviews-search/index.d.ts.map +1 -1
  110. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  111. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  112. package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts +1 -1
  113. package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts.map +1 -1
  114. package/build-types/dataviews/index.d.ts +0 -1
  115. package/build-types/dataviews/index.d.ts.map +1 -1
  116. package/build-types/dataviews/stories/fixtures.d.ts.map +1 -1
  117. package/build-types/dataviews/stories/free-composition.d.ts.map +1 -1
  118. package/build-types/dataviews/stories/index.story.d.ts +11 -0
  119. package/build-types/dataviews/stories/index.story.d.ts.map +1 -1
  120. package/build-types/dataviews/stories/infinite-scroll.d.ts.map +1 -1
  121. package/build-types/dataviews/stories/with-card.d.ts.map +1 -1
  122. package/build-types/dataviews-picker/index.d.ts +0 -1
  123. package/build-types/dataviews-picker/index.d.ts.map +1 -1
  124. package/build-types/dataviews-picker/stories/fixtures.d.ts.map +1 -1
  125. package/build-types/dataviews-picker/stories/index.story.d.ts.map +1 -1
  126. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  127. package/build-types/hooks/index.d.ts +3 -0
  128. package/build-types/hooks/index.d.ts.map +1 -1
  129. package/build-types/hooks/test/use-data.d.ts +2 -0
  130. package/build-types/hooks/test/use-data.d.ts.map +1 -0
  131. package/build-types/hooks/use-data.d.ts +41 -3
  132. package/build-types/hooks/use-data.d.ts.map +1 -1
  133. package/build-types/hooks/use-infinite-scroll.d.ts +21 -0
  134. package/build-types/hooks/use-infinite-scroll.d.ts.map +1 -0
  135. package/build-types/hooks/use-selected-items.d.ts +19 -0
  136. package/build-types/hooks/use-selected-items.d.ts.map +1 -0
  137. package/build-types/types/dataviews.d.ts +7 -1
  138. package/build-types/types/dataviews.d.ts.map +1 -1
  139. package/build-types/types/field-api.d.ts +15 -4
  140. package/build-types/types/field-api.d.ts.map +1 -1
  141. package/build-types/utils/filter-sort-and-paginate.d.ts.map +1 -1
  142. package/build-types/utils/get-footer-message.d.ts +3 -2
  143. package/build-types/utils/get-footer-message.d.ts.map +1 -1
  144. package/build-wp/index.js +3013 -2613
  145. package/package.json +19 -19
  146. package/src/components/dataform-controls/datetime.tsx +19 -11
  147. package/src/components/dataform-layouts/card/index.tsx +171 -146
  148. package/src/components/dataform-layouts/card/style.scss +8 -5
  149. package/src/components/dataviews-bulk-actions/index.tsx +28 -1
  150. package/src/components/dataviews-context/index.ts +2 -2
  151. package/src/components/dataviews-footer/index.tsx +1 -6
  152. package/src/components/dataviews-layouts/grid/composite-grid.tsx +433 -284
  153. package/src/components/dataviews-layouts/grid/style.scss +4 -0
  154. package/src/components/dataviews-layouts/picker-grid/index.tsx +53 -15
  155. package/src/components/dataviews-layouts/picker-table/index.tsx +42 -22
  156. package/src/components/dataviews-layouts/utils/use-infinite-scroll.ts +64 -0
  157. package/src/components/dataviews-picker-footer/index.tsx +21 -1
  158. package/src/components/dataviews-search/index.tsx +2 -1
  159. package/src/components/dataviews-selection-checkbox/index.tsx +4 -2
  160. package/src/components/dataviews-view-config/index.tsx +0 -2
  161. package/src/components/dataviews-view-config/infinite-scroll-toggle.tsx +0 -5
  162. package/src/dataviews/index.tsx +57 -52
  163. package/src/dataviews/stories/fixtures.tsx +288 -0
  164. package/src/dataviews/stories/free-composition.tsx +12 -11
  165. package/src/dataviews/stories/index.story.tsx +19 -2
  166. package/src/dataviews/stories/infinite-scroll.tsx +12 -92
  167. package/src/dataviews/stories/with-card.tsx +30 -23
  168. package/src/dataviews/style.scss +5 -7
  169. package/src/dataviews/test/dataviews.tsx +21 -9
  170. package/src/dataviews-picker/index.tsx +40 -34
  171. package/src/dataviews-picker/stories/fixtures.tsx +270 -0
  172. package/src/dataviews-picker/stories/index.story.tsx +62 -129
  173. package/src/field-types/stories/index.story.tsx +12 -0
  174. package/src/hooks/index.ts +3 -0
  175. package/src/hooks/test/use-data.ts +791 -0
  176. package/src/hooks/use-data.ts +288 -21
  177. package/src/hooks/use-infinite-scroll.ts +304 -0
  178. package/src/hooks/use-selected-items.ts +72 -0
  179. package/src/types/dataviews.ts +8 -1
  180. package/src/types/field-api.ts +16 -3
  181. package/src/utils/filter-sort-and-paginate.ts +13 -1
  182. package/src/utils/get-footer-message.ts +12 -9
  183. package/src/utils/test/filter-sort-and-paginate.js +78 -54
@@ -333,6 +333,294 @@ export const data: SpaceObject[] = [
333
333
  email: 'thessalonikopolymnianebuchodonossarinacharybdis@example.com',
334
334
  author: 'interstellar_nomadic_planetary_body_tracking_specialist',
335
335
  },
336
+ {
337
+ id: 20,
338
+ name: {
339
+ title: 'Titan',
340
+ description: 'Largest moon of Saturn',
341
+ },
342
+ image: 'https://upload.wikimedia.org/wikipedia/commons/f/fe/Titan_in_true_color_by_Kevin_M._Gill.jpg',
343
+ type: 'Satellite',
344
+ isPlanet: false,
345
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
346
+ satellites: 0,
347
+ date: '2022-02-15',
348
+ datetime: '2022-02-15T08:30:00Z',
349
+ email: 'titan@example.com',
350
+ author: 'saturn_system_researcher',
351
+ },
352
+ {
353
+ id: 21,
354
+ name: {
355
+ title: 'Enceladus',
356
+ description: 'Icy moon of Saturn with geysers',
357
+ },
358
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/PIA17202_-_Approaching_Enceladus.jpg/960px-PIA17202_-_Approaching_Enceladus.jpg',
359
+ type: 'Satellite',
360
+ isPlanet: false,
361
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
362
+ satellites: 0,
363
+ date: '2023-03-20',
364
+ datetime: '2023-03-20T11:45:00Z',
365
+ email: 'enceladus@example.com',
366
+ author: 'cryovolcanism_observer',
367
+ },
368
+ {
369
+ id: 22,
370
+ name: {
371
+ title: 'Mimas',
372
+ description: 'Death Star moon of Saturn',
373
+ },
374
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Mimas_Cassini.jpg/960px-Mimas_Cassini.jpg',
375
+ type: 'Satellite',
376
+ isPlanet: false,
377
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
378
+ satellites: 0,
379
+ date: '2021-07-12',
380
+ datetime: '2021-07-12T15:20:00Z',
381
+ email: 'mimas@example.com',
382
+ author: 'impact_crater_analyst',
383
+ },
384
+ {
385
+ id: 23,
386
+ name: {
387
+ title: 'Charon',
388
+ description: 'Largest moon of Pluto',
389
+ },
390
+ image: 'https://upload.wikimedia.org/wikipedia/commons/2/2e/Charon_in_True_Color_-_High-Res.jpg',
391
+ type: 'Satellite',
392
+ isPlanet: false,
393
+ categories: [ 'Solar system', 'Satellite', 'Pluto', 'Moon' ],
394
+ satellites: 0,
395
+ date: '2020-09-25',
396
+ datetime: '2020-09-25T13:15:00Z',
397
+ email: 'charon@example.com',
398
+ author: 'pluto_system_mapper',
399
+ },
400
+ {
401
+ id: 24,
402
+ name: {
403
+ title: 'Phobos',
404
+ description: 'Larger moon of Mars',
405
+ },
406
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Phobos_colour_2008.jpg/960px-Phobos_colour_2008.jpg',
407
+ type: 'Satellite',
408
+ isPlanet: false,
409
+ categories: [ 'Solar system', 'Satellite', 'Mars', 'Moon' ],
410
+ satellites: 0,
411
+ date: '2019-06-14',
412
+ datetime: '2019-06-14T07:45:00Z',
413
+ email: 'phobos@example.com',
414
+ author: 'martian_surface_cartographer',
415
+ },
416
+ {
417
+ id: 25,
418
+ name: {
419
+ title: 'Deimos',
420
+ description: 'Smaller moon of Mars',
421
+ },
422
+ image: 'https://upload.wikimedia.org/wikipedia/commons/8/86/NASA-Deimos-MarsMoon-20090221.jpg',
423
+ type: 'Satellite',
424
+ isPlanet: false,
425
+ categories: [ 'Solar system', 'Satellite', 'Mars', 'Moon' ],
426
+ satellites: 0,
427
+ date: '2018-11-30',
428
+ datetime: '2018-11-30T16:00:00Z',
429
+ email: 'deimos@example.com',
430
+ author: 'small_moon_surveyor',
431
+ },
432
+ {
433
+ id: 26,
434
+ name: {
435
+ title: 'Rhea',
436
+ description: 'Second largest moon of Saturn',
437
+ },
438
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/PIA07763_Rhea_full_globe5.jpg/2560px-PIA07763_Rhea_full_globe5.jpg',
439
+ type: 'Satellite',
440
+ isPlanet: false,
441
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
442
+ satellites: 0,
443
+ date: '2022-08-19',
444
+ datetime: '2022-08-19T10:30:00Z',
445
+ email: 'rhea@example.com',
446
+ author: 'saturn_geology_specialist',
447
+ },
448
+ {
449
+ id: 27,
450
+ name: {
451
+ title: 'Iapetus',
452
+ description: 'Two-toned moon of Saturn',
453
+ },
454
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Iapetus_trailing_natural_color.jpg/2560px-Iapetus_trailing_natural_color.jpg',
455
+ type: 'Satellite',
456
+ isPlanet: false,
457
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
458
+ satellites: 0,
459
+ date: '2023-01-22',
460
+ datetime: '2023-01-22T14:20:00Z',
461
+ email: 'iapetus@example.com',
462
+ author: 'two_tone_surface_expert',
463
+ },
464
+ {
465
+ id: 28,
466
+ name: {
467
+ title: 'Dione',
468
+ description: 'Icy moon of Saturn',
469
+ },
470
+ image: 'https://upload.wikimedia.org/wikipedia/commons/d/d0/Dione_in_natural_light_%28cropped%29.jpg',
471
+ type: 'Satellite',
472
+ isPlanet: false,
473
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
474
+ satellites: 0,
475
+ date: '2021-04-17',
476
+ datetime: '2021-04-17T12:00:00Z',
477
+ email: 'dione@example.com',
478
+ author: 'icy_surface_geochemist',
479
+ },
480
+ {
481
+ id: 29,
482
+ name: {
483
+ title: 'Tethys',
484
+ description: 'Mid-sized moon of Saturn',
485
+ },
486
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Tethys_-_Rev_15_%2837267740632%29.png/960px-Tethys_-_Rev_15_%2837267740632%29.png',
487
+ type: 'Satellite',
488
+ isPlanet: false,
489
+ categories: [ 'Solar system', 'Satellite', 'Saturn', 'Moon' ],
490
+ satellites: 0,
491
+ date: '2020-12-05',
492
+ datetime: '2020-12-05T09:40:00Z',
493
+ email: 'tethys@example.com',
494
+ author: 'middle_satellite_researcher',
495
+ },
496
+ {
497
+ id: 30,
498
+ name: {
499
+ title: 'Miranda',
500
+ description: 'Unusual moon of Uranus',
501
+ },
502
+ 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',
503
+ type: 'Satellite',
504
+ isPlanet: false,
505
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
506
+ satellites: 0,
507
+ date: '2024-02-28',
508
+ datetime: '2024-02-28T11:15:00Z',
509
+ email: 'miranda@example.com',
510
+ author: 'uranian_moon_geologist',
511
+ },
512
+ {
513
+ id: 31,
514
+ name: {
515
+ title: 'Ariel',
516
+ description: 'Brightest moon of Uranus',
517
+ },
518
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Ariel_in_monochrome.jpg/960px-Ariel_in_monochrome.jpg',
519
+ type: 'Satellite',
520
+ isPlanet: false,
521
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
522
+ satellites: 0,
523
+ date: '2023-09-10',
524
+ datetime: '2023-09-10T08:25:00Z',
525
+ email: 'ariel@example.com',
526
+ author: 'planetary_reflectance_specialist',
527
+ },
528
+ {
529
+ id: 32,
530
+ name: {
531
+ title: 'Umbriel',
532
+ description: 'Dark moon of Uranus',
533
+ },
534
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/PIA00040_Umbrielx2.47.jpg/560px-PIA00040_Umbrielx2.47.jpg',
535
+ type: 'Satellite',
536
+ isPlanet: false,
537
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
538
+ satellites: 0,
539
+ date: '2022-05-03',
540
+ datetime: '2022-05-03T15:50:00Z',
541
+ email: 'umbriel@example.com',
542
+ author: 'dark_surface_researcher',
543
+ },
544
+ {
545
+ id: 33,
546
+ name: {
547
+ title: 'Titania',
548
+ description: 'Largest moon of Uranus',
549
+ },
550
+ 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',
551
+ type: 'Satellite',
552
+ isPlanet: false,
553
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
554
+ satellites: 0,
555
+ date: '2021-10-18',
556
+ datetime: '2021-10-18T13:35:00Z',
557
+ email: 'titania@example.com',
558
+ author: 'uranian_system_surveyor',
559
+ },
560
+ {
561
+ id: 34,
562
+ name: {
563
+ title: 'Oberon',
564
+ description: 'Outermost major moon of Uranus',
565
+ },
566
+ image: 'https://upload.wikimedia.org/wikipedia/commons/6/6d/Oberon_in_true_color_by_Kevin_M._Gill.jpg',
567
+ type: 'Satellite',
568
+ isPlanet: false,
569
+ categories: [ 'Solar system', 'Satellite', 'Uranus', 'Moon' ],
570
+ satellites: 0,
571
+ date: '2020-07-22',
572
+ datetime: '2020-07-22T10:05:00Z',
573
+ email: 'oberon@example.com',
574
+ author: 'outer_uranian_orbitalist',
575
+ },
576
+ {
577
+ id: 35,
578
+ name: {
579
+ title: 'Ceres',
580
+ description: 'Largest object in the asteroid belt',
581
+ },
582
+ 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',
583
+ type: 'Dwarf planet',
584
+ isPlanet: false,
585
+ categories: [ 'Solar system', 'Dwarf planet', 'Asteroid belt' ],
586
+ satellites: 0,
587
+ date: '2024-08-14',
588
+ datetime: '2024-08-14T16:40:00Z',
589
+ email: 'ceres@example.com',
590
+ author: 'asteroid_belt_specialist',
591
+ },
592
+ {
593
+ id: 36,
594
+ name: {
595
+ title: 'Makemake',
596
+ description: 'Reddish dwarf planet',
597
+ },
598
+ image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Makemake_and_its_moon.jpg/560px-Makemake_and_its_moon.jpg',
599
+ type: 'Dwarf planet',
600
+ isPlanet: false,
601
+ categories: [ 'Solar system', 'Dwarf planet', 'Trans-Neptunian' ],
602
+ satellites: 1,
603
+ date: '2022-03-29',
604
+ datetime: '2022-03-29T12:55:00Z',
605
+ email: 'makemake@example.com',
606
+ author: 'trans_neptunian_researcher',
607
+ },
608
+ {
609
+ id: 37,
610
+ name: {
611
+ title: 'Haumea',
612
+ description: 'Elongated dwarf planet',
613
+ },
614
+ image: 'https://upload.wikimedia.org/wikipedia/commons/2/2b/Haumea_Hubble.png',
615
+ type: 'Dwarf planet',
616
+ isPlanet: false,
617
+ categories: [ 'Solar system', 'Dwarf planet', 'Trans-Neptunian' ],
618
+ satellites: 2,
619
+ date: '2021-11-11',
620
+ datetime: '2021-11-11T09:10:00Z',
621
+ email: 'haumea@example.com',
622
+ author: 'dwarf_planet_dynamics_specialist',
623
+ },
336
624
  ];
337
625
 
338
626
  export const actions: Action< SpaceObject >[] = [
@@ -7,14 +7,15 @@ import {
7
7
  createInterpolateElement,
8
8
  } from '@wordpress/element';
9
9
  import {
10
- Card,
11
- CardBody,
12
10
  __experimentalHeading as Heading,
13
11
  __experimentalText as Text,
14
12
  Button,
15
13
  } from '@wordpress/components';
16
14
  import { __, _n } from '@wordpress/i18n';
17
- import { Stack } from '@wordpress/ui';
15
+ // TODO: enable in the ESlint rule once we complete
16
+ // https://github.com/WordPress/gutenberg/issues/76135.
17
+ // eslint-disable-next-line @wordpress/use-recommended-components
18
+ import { Card, Stack } from '@wordpress/ui';
18
19
 
19
20
  /**
20
21
  * Internal dependencies
@@ -52,8 +53,8 @@ function PlanetOverview( { planets }: { planets: SpaceObject[] } ) {
52
53
  </Stack>
53
54
  </Stack>
54
55
  <DataViews.FiltersToggled />
55
- <Card variant="secondary">
56
- <CardBody>
56
+ <Card.Root>
57
+ <Card.Content>
57
58
  <Stack direction="column" gap="sm">
58
59
  <Text size={ 18 } as="p">
59
60
  { createInterpolateElement(
@@ -87,10 +88,10 @@ function PlanetOverview( { planets }: { planets: SpaceObject[] } ) {
87
88
  ) }
88
89
  </Text>
89
90
  </Stack>
90
- </CardBody>
91
- </Card>
92
- <Card style={ { width: '100%' } }>
93
- <CardBody>
91
+ </Card.Content>
92
+ </Card.Root>
93
+ <Card.Root style={ { width: '100%' } }>
94
+ <Card.Content>
94
95
  <Stack
95
96
  direction="row"
96
97
  justify="space-between"
@@ -100,8 +101,8 @@ function PlanetOverview( { planets }: { planets: SpaceObject[] } ) {
100
101
  <DataViews.BulkActionToolbar />
101
102
  <DataViews.Pagination />
102
103
  </Stack>
103
- </CardBody>
104
- </Card>
104
+ </Card.Content>
105
+ </Card.Root>
105
106
  </Stack>
106
107
  </div>
107
108
  <DataViews.Layout className="free-composition-dataviews-layout" />
@@ -41,9 +41,15 @@ const meta = {
41
41
  layout: 'fullscreen',
42
42
  },
43
43
  decorators: [
44
- ( Story, { args }: { args: any } ) => (
44
+ ( Story, { args, parameters }: { args: any; parameters: any } ) => (
45
45
  <div style={ { padding: '1rem' } }>
46
- <div style={ { height: args.containerHeight, minHeight: 0 } }>
46
+ <div
47
+ style={ {
48
+ height:
49
+ parameters.containerHeight ?? args.containerHeight,
50
+ minHeight: 0,
51
+ } }
52
+ >
47
53
  <Story containerHeight={ args.containerHeight } />
48
54
  </div>
49
55
  </div>
@@ -259,4 +265,15 @@ export const WithCard = {
259
265
 
260
266
  export const InfiniteScroll = {
261
267
  render: InfiniteScrollComponent,
268
+ parameters: {
269
+ containerHeight: '600px',
270
+ },
271
+ argTypes: {
272
+ containerHeight: {
273
+ control: false,
274
+ table: {
275
+ disable: true,
276
+ },
277
+ },
278
+ },
262
279
  };
@@ -1,9 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useState, useMemo, useCallback, useEffect } from '@wordpress/element';
5
- import { __experimentalText as Text } from '@wordpress/components';
6
- import { __ } from '@wordpress/i18n';
4
+ import { useState, useMemo } from '@wordpress/element';
7
5
 
8
6
  /**
9
7
  * Internal dependencies
@@ -17,14 +15,14 @@ import {
17
15
  } from '../../constants';
18
16
  import filterSortAndPaginate from '../../utils/filter-sort-and-paginate';
19
17
  import type { View } from '../../types';
20
- import { actions, data, fields, type SpaceObject } from './fixtures';
18
+ import { actions, data, fields } from './fixtures';
21
19
 
22
20
  const InfiniteScroll = () => {
23
21
  const [ view, setView ] = useState< View >( {
24
22
  type: LAYOUT_GRID,
25
23
  search: '',
26
- page: 1,
27
- perPage: 6, // Start with a small number to demonstrate pagination
24
+ startPosition: 1,
25
+ perPage: 15, // Start with a small number to demonstrate pagination
28
26
  filters: [],
29
27
  fields: [ 'satellites' ],
30
28
  titleField: 'title',
@@ -32,103 +30,25 @@ const InfiniteScroll = () => {
32
30
  mediaField: 'image',
33
31
  infiniteScrollEnabled: true, // Enable infinite scroll by default
34
32
  } );
35
- const { data: shownData } = useMemo( () => {
33
+ const { data: shownData, paginationInfo } = useMemo( () => {
36
34
  return filterSortAndPaginate( data, view, fields );
37
35
  }, [ view ] );
38
-
39
- // Custom pagination handler that simulates server-side pagination
40
- const [ allLoadedRecords, setAllLoadedRecords ] = useState< SpaceObject[] >(
41
- []
42
- );
43
- const [ isLoadingMore, setIsLoadingMore ] = useState( false );
44
-
45
- const totalItems = data.length;
46
- const totalPages = Math.ceil( totalItems / 6 ); // perPage is 6.
47
- const currentPage = view.page || 1;
48
- const hasMoreData = currentPage < totalPages;
49
- const getItemId = ( item: {
50
- id: any;
51
- title?: string;
52
- description?: string;
53
- image?: string;
54
- type?: string;
55
- isPlanet?: boolean;
56
- categories?: string[];
57
- satellites?: number;
58
- date?: string;
59
- datetime?: string;
60
- email?: string;
61
- } ) => item.id.toString();
62
-
63
- const infiniteScrollHandler = useCallback( () => {
64
- if ( isLoadingMore || currentPage >= totalPages ) {
65
- return;
66
- }
67
-
68
- setIsLoadingMore( true );
69
-
70
- setView( {
71
- ...view,
72
- page: currentPage + 1,
73
- } );
74
- }, [ isLoadingMore, currentPage, totalPages, view ] );
75
-
76
- // Initialize data on first load or when view changes significantly
77
- useEffect( () => {
78
- if ( currentPage === 1 || ! view.infiniteScrollEnabled ) {
79
- // First page - replace all data
80
- setAllLoadedRecords( shownData );
81
- } else {
82
- // Subsequent pages - append to existing data
83
- setAllLoadedRecords( ( prev ) => {
84
- const existingIds = new Set( prev.map( getItemId ) );
85
- const newRecords = shownData.filter(
86
- ( record ) => ! existingIds.has( getItemId( record ) )
87
- );
88
- return [ ...prev, ...newRecords ];
89
- } );
90
- }
91
- setIsLoadingMore( false );
92
- }, [
93
- shownData,
94
- view.search,
95
- view.filters,
96
- view.perPage,
97
- currentPage,
98
- view.infiniteScrollEnabled,
99
- ] );
100
-
101
- const paginationInfo = {
102
- totalItems,
103
- totalPages,
104
- infiniteScrollHandler,
105
- };
106
-
107
36
  return (
108
37
  <>
109
- <Text
110
- style={ {
111
- marginBottom: '16px',
112
- padding: '8px',
113
- background: '#f0f0f0',
114
- borderRadius: '4px',
115
- display: 'block',
116
- } }
117
- >
118
- { __( 'Infinite Scroll Demo' ) }: { allLoadedRecords.length } of{ ' ' }
119
- { totalItems } items loaded.
120
- { isLoadingMore && __( 'Loading more…' ) }
121
- { ! hasMoreData && __( 'All items loaded!' ) }
122
- </Text>
38
+ <style>{ `
39
+ .dataviews-wrapper {
40
+ height: 750px;
41
+ overflow: auto;
42
+ }
43
+ ` }</style>
123
44
  <DataViews
124
45
  getItemId={ ( item ) => item.id.toString() }
125
46
  paginationInfo={ paginationInfo }
126
- data={ allLoadedRecords }
47
+ data={ shownData }
127
48
  view={ view }
128
49
  fields={ fields }
129
50
  onChangeView={ setView }
130
51
  actions={ actions }
131
- isLoading={ isLoadingMore }
132
52
  defaultLayouts={ {
133
53
  [ LAYOUT_TABLE ]: {},
134
54
  [ LAYOUT_GRID ]: {},
@@ -2,7 +2,10 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useState, useMemo } from '@wordpress/element';
5
- import { Card, CardHeader, CardBody } from '@wordpress/components';
5
+ // TODO: enable in the ESlint rule once we complete
6
+ // https://github.com/WordPress/gutenberg/issues/76135.
7
+ // eslint-disable-next-line @wordpress/use-recommended-components
8
+ import { Card } from '@wordpress/ui';
6
9
 
7
10
  /**
8
11
  * Internal dependencies
@@ -39,28 +42,32 @@ const WithCardComponent = ( {
39
42
  return filterSortAndPaginate( data, view, fields );
40
43
  }, [ view ] );
41
44
  return (
42
- <Card>
43
- <CardHeader>Header</CardHeader>
44
- <CardBody style={ { height: containerHeight, minHeight: 0 } }>
45
- <DataViews
46
- getItemId={ ( item ) => item.id.toString() }
47
- paginationInfo={ paginationInfo }
48
- data={ shownData }
49
- view={ view }
50
- fields={ fields }
51
- onChangeView={ setView }
52
- actions={ actions.filter(
53
- ( action ) => ! action.supportsBulk
54
- ) }
55
- defaultLayouts={ {
56
- [ LAYOUT_TABLE ]: {},
57
- [ LAYOUT_GRID ]: {},
58
- [ LAYOUT_LIST ]: {},
59
- [ LAYOUT_ACTIVITY ]: {},
60
- } }
61
- />
62
- </CardBody>
63
- </Card>
45
+ <Card.Root>
46
+ <Card.Header>
47
+ <Card.Title>Header</Card.Title>
48
+ </Card.Header>
49
+ <Card.Content style={ { height: containerHeight, minHeight: 0 } }>
50
+ <Card.FullBleed>
51
+ <DataViews
52
+ getItemId={ ( item ) => item.id.toString() }
53
+ paginationInfo={ paginationInfo }
54
+ data={ shownData }
55
+ view={ view }
56
+ fields={ fields }
57
+ onChangeView={ setView }
58
+ actions={ actions.filter(
59
+ ( action ) => ! action.supportsBulk
60
+ ) }
61
+ defaultLayouts={ {
62
+ [ LAYOUT_TABLE ]: {},
63
+ [ LAYOUT_GRID ]: {},
64
+ [ LAYOUT_LIST ]: {},
65
+ [ LAYOUT_ACTIVITY ]: {},
66
+ } }
67
+ />
68
+ </Card.FullBleed>
69
+ </Card.Content>
70
+ </Card.Root>
64
71
  );
65
72
  };
66
73
 
@@ -126,11 +126,9 @@
126
126
  @include link-reset();
127
127
  }
128
128
 
129
- /**
130
- * When DataViews are placed within cards, apply a consistent top padding.
131
- */
132
- .components-card__body:has(> .dataviews-wrapper),
133
- .components-card__body:has(> .dataviews-picker-wrapper) {
134
- padding: $grid-unit-10 0 0;
135
- overflow: hidden; // Prevent cells with white backgrounds overflowing the card
129
+ .dataviews__view-actions--infinite-scroll {
130
+ position: sticky;
131
+ top: 0;
132
+ z-index: 2; // Ensure it appears above dataview items when scrolling.
133
+ background-color: #fff;
136
134
  }
@@ -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
  /**
@@ -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', () => {