@wordpress/dataviews 0.9.0 → 1.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 (109) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +0 -8
  3. package/build/add-filter.js.map +1 -1
  4. package/build/bulk-actions.js.map +1 -1
  5. package/build/constants.js +1 -26
  6. package/build/constants.js.map +1 -1
  7. package/build/dataviews.js +3 -6
  8. package/build/dataviews.js.map +1 -1
  9. package/build/dropdown-menu-helper.js.map +1 -1
  10. package/build/filter-and-sort-data-view.js +72 -65
  11. package/build/filter-and-sort-data-view.js.map +1 -1
  12. package/build/filter-summary.js +4 -2
  13. package/build/filter-summary.js.map +1 -1
  14. package/build/filters.js.map +1 -1
  15. package/build/index.js +2 -2
  16. package/build/index.js.map +1 -1
  17. package/build/item-actions.js.map +1 -1
  18. package/build/layouts.js +38 -0
  19. package/build/layouts.js.map +1 -0
  20. package/build/lock-unlock.js.map +1 -1
  21. package/build/normalize-fields.js +7 -2
  22. package/build/normalize-fields.js.map +1 -1
  23. package/build/pagination.js.map +1 -1
  24. package/build/reset-filters.js.map +1 -1
  25. package/build/search-widget.js +5 -4
  26. package/build/search-widget.js.map +1 -1
  27. package/build/search.js.map +1 -1
  28. package/build/single-selection-checkbox.js +1 -1
  29. package/build/single-selection-checkbox.js.map +1 -1
  30. package/build/types.js +6 -0
  31. package/build/types.js.map +1 -0
  32. package/build/utils.js.map +1 -1
  33. package/build/view-actions.js +2 -1
  34. package/build/view-actions.js.map +1 -1
  35. package/build/view-grid.js +43 -15
  36. package/build/view-grid.js.map +1 -1
  37. package/build/view-list.js +4 -22
  38. package/build/view-list.js.map +1 -1
  39. package/build/view-table.js +5 -11
  40. package/build/view-table.js.map +1 -1
  41. package/build-module/add-filter.js.map +1 -1
  42. package/build-module/bulk-actions.js.map +1 -1
  43. package/build-module/constants.js +1 -25
  44. package/build-module/constants.js.map +1 -1
  45. package/build-module/dataviews.js +3 -6
  46. package/build-module/dataviews.js.map +1 -1
  47. package/build-module/dropdown-menu-helper.js.map +1 -1
  48. package/build-module/filter-and-sort-data-view.js +72 -65
  49. package/build-module/filter-and-sort-data-view.js.map +1 -1
  50. package/build-module/filter-summary.js +3 -2
  51. package/build-module/filter-summary.js.map +1 -1
  52. package/build-module/filters.js.map +1 -1
  53. package/build-module/index.js +1 -1
  54. package/build-module/index.js.map +1 -1
  55. package/build-module/item-actions.js.map +1 -1
  56. package/build-module/layouts.js +30 -0
  57. package/build-module/layouts.js.map +1 -0
  58. package/build-module/lock-unlock.js.map +1 -1
  59. package/build-module/normalize-fields.js +7 -2
  60. package/build-module/normalize-fields.js.map +1 -1
  61. package/build-module/pagination.js.map +1 -1
  62. package/build-module/reset-filters.js.map +1 -1
  63. package/build-module/search-widget.js +4 -3
  64. package/build-module/search-widget.js.map +1 -1
  65. package/build-module/search.js.map +1 -1
  66. package/build-module/single-selection-checkbox.js +1 -1
  67. package/build-module/single-selection-checkbox.js.map +1 -1
  68. package/build-module/types.js +2 -0
  69. package/build-module/types.js.map +1 -0
  70. package/build-module/utils.js.map +1 -1
  71. package/build-module/view-actions.js +2 -1
  72. package/build-module/view-actions.js.map +1 -1
  73. package/build-module/view-grid.js +43 -15
  74. package/build-module/view-grid.js.map +1 -1
  75. package/build-module/view-list.js +6 -24
  76. package/build-module/view-list.js.map +1 -1
  77. package/build-module/view-table.js +5 -11
  78. package/build-module/view-table.js.map +1 -1
  79. package/build-style/style-rtl.css +60 -45
  80. package/build-style/style.css +60 -45
  81. package/build-types/constants.d.ts +45 -0
  82. package/build-types/constants.d.ts.map +1 -0
  83. package/build-types/filter-and-sort-data-view.d.ts +18 -0
  84. package/build-types/filter-and-sort-data-view.d.ts.map +1 -0
  85. package/build-types/normalize-fields.d.ts +12 -0
  86. package/build-types/normalize-fields.d.ts.map +1 -0
  87. package/build-types/types.d.ts +122 -0
  88. package/build-types/types.d.ts.map +1 -0
  89. package/package.json +11 -11
  90. package/src/{constants.js → constants.ts} +1 -35
  91. package/src/dataviews.js +2 -5
  92. package/src/filter-and-sort-data-view.ts +164 -0
  93. package/src/filter-summary.js +4 -4
  94. package/src/index.js +1 -1
  95. package/src/layouts.js +39 -0
  96. package/src/normalize-fields.ts +23 -0
  97. package/src/search-widget.js +4 -3
  98. package/src/single-selection-checkbox.js +1 -1
  99. package/src/stories/fixtures.js +0 -2
  100. package/src/style.scss +65 -51
  101. package/src/types.ts +144 -0
  102. package/src/view-actions.js +2 -1
  103. package/src/view-grid.js +91 -52
  104. package/src/view-list.js +4 -24
  105. package/src/view-table.js +7 -11
  106. package/tsconfig.json +20 -0
  107. package/tsconfig.tsbuildinfo +1 -0
  108. package/src/filter-and-sort-data-view.js +0 -154
  109. package/src/normalize-fields.js +0 -17
package/src/style.scss CHANGED
@@ -92,10 +92,6 @@
92
92
  &.dataviews-view-table__checkbox-column {
93
93
  padding-right: 0;
94
94
  }
95
-
96
- .components-checkbox-control__input-container {
97
- margin: $grid-unit-05;
98
- }
99
95
  }
100
96
  tr {
101
97
  border-bottom: 1px solid $gray-100;
@@ -150,6 +146,14 @@
150
146
  }
151
147
  }
152
148
 
149
+ @media (hover: none) {
150
+ // Show checkboxes and quick-actions on devices that do not support hover.
151
+ .components-checkbox-control__input.components-checkbox-control__input,
152
+ .dataviews-item-actions .components-button:not(.dataviews-all-actions-button) {
153
+ opacity: 1;
154
+ }
155
+ }
156
+
153
157
  &.is-selected {
154
158
  background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
155
159
  color: $gray-700;
@@ -237,7 +241,7 @@
237
241
  .dataviews-view-table__primary-field {
238
242
  font-size: $default-font-size;
239
243
  font-weight: 500;
240
- color: $gray-900;
244
+ color: $gray-700;
241
245
  text-overflow: ellipsis;
242
246
  white-space: nowrap;
243
247
  display: block;
@@ -245,12 +249,12 @@
245
249
 
246
250
  a {
247
251
  text-decoration: none;
248
- color: inherit;
249
252
  text-overflow: ellipsis;
250
253
  white-space: nowrap;
251
254
  overflow: hidden;
252
255
  display: block;
253
256
  flex-grow: 0;
257
+ color: $gray-900;
254
258
 
255
259
  &:hover {
256
260
  color: var(--wp-admin-theme-color);
@@ -260,13 +264,16 @@
260
264
 
261
265
  button.components-button.is-link {
262
266
  text-decoration: none;
263
- color: inherit;
264
267
  font-weight: inherit;
265
268
  text-overflow: ellipsis;
266
269
  white-space: nowrap;
267
270
  overflow: hidden;
268
271
  display: block;
269
272
  width: 100%;
273
+ color: $gray-900;
274
+ &:hover {
275
+ color: var(--wp-admin-theme-color);
276
+ }
270
277
  }
271
278
  }
272
279
 
@@ -285,25 +292,26 @@
285
292
  }
286
293
 
287
294
  .dataviews-view-grid__card {
288
- border-radius: $radius-block-ui * 2;
289
- border: 1px solid $gray-200;
290
295
  height: 100%;
291
296
  justify-content: flex-start;
292
297
 
293
298
  .dataviews-view-grid__title-actions {
294
- padding: $grid-unit-05 $grid-unit $grid-unit-05 $grid-unit-05;
299
+ padding: $grid-unit-10 0 $grid-unit-05;
295
300
  }
296
301
 
297
302
  .dataviews-view-grid__primary-field {
298
- min-height: $grid-unit-50;
303
+ min-height: $grid-unit-40; // Preserve layout when there is no ellipsis button
299
304
  }
300
- &.is-selected {
301
- border-color: var(--wp-admin-theme-color);
302
- background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
303
305
 
306
+ &.is-selected {
304
307
  .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value {
305
308
  color: $gray-900;
306
309
  }
310
+
311
+ .page-pages-preview-field__button::after {
312
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
313
+ background: rgba(var(--wp-admin-theme-color--rgb), 0.04);
314
+ }
307
315
  }
308
316
  }
309
317
 
@@ -311,15 +319,27 @@
311
319
  width: 100%;
312
320
  min-height: 200px;
313
321
  aspect-ratio: 1/1;
314
- border-bottom: 1px solid $gray-200;
315
322
  background-color: $gray-100;
316
- border-radius: 3px 3px 0 0;
323
+ border-radius: $grid-unit-05;
324
+ overflow: hidden;
325
+ position: relative;
317
326
 
318
327
  img {
319
328
  object-fit: cover;
320
329
  width: 100%;
321
330
  height: 100%;
322
331
  }
332
+
333
+ &::after {
334
+ content: "";
335
+ position: absolute;
336
+ top: 0;
337
+ left: 0;
338
+ width: 100%;
339
+ height: 100%;
340
+ box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.1);
341
+ border-radius: $grid-unit-05;
342
+ }
323
343
  }
324
344
 
325
345
  .dataviews-view-grid__fields {
@@ -328,7 +348,7 @@
328
348
  line-height: 16px;
329
349
 
330
350
  &:not(:empty) {
331
- padding: $grid-unit-15;
351
+ padding: $grid-unit-15 0;
332
352
  padding-top: 0;
333
353
  }
334
354
 
@@ -355,6 +375,23 @@
355
375
  }
356
376
  }
357
377
  }
378
+
379
+ .dataviews-view-grid__badge-fields {
380
+ &:not(:empty) {
381
+ padding-bottom: $grid-unit-15;
382
+ }
383
+
384
+ .dataviews-view-grid__field-value {
385
+ width: fit-content;
386
+ background: $gray-100;
387
+ padding: 0 $grid-unit-10;
388
+ min-height: $grid-unit-30;
389
+ border-radius: $radius-block-ui;
390
+ display: flex;
391
+ align-items: center;
392
+ font-size: 12px;
393
+ }
394
+ }
358
395
  }
359
396
 
360
397
  .dataviews-view-list {
@@ -386,6 +423,9 @@
386
423
  }
387
424
 
388
425
  &:not(.is-selected) {
426
+ .dataviews-view-list__primary-field {
427
+ color: $gray-900;
428
+ }
389
429
  &:hover,
390
430
  &:focus-within {
391
431
  color: var(--wp-admin-theme-color);
@@ -492,26 +532,6 @@
492
532
  justify-content: space-between;
493
533
  }
494
534
 
495
- .dataviews-view-list__details-button {
496
- align-self: center;
497
- opacity: 0;
498
- }
499
-
500
- li.is-selected,
501
- li:hover,
502
- li:focus-within {
503
- .dataviews-view-list__details-button {
504
- opacity: 1;
505
- }
506
- }
507
-
508
- li.is-selected {
509
- .dataviews-view-list__details-button {
510
- &:focus {
511
- box-shadow: 0 0 0 var(--wp-admin-border-width-focus) currentColor;
512
- }
513
- }
514
- }
515
535
  }
516
536
 
517
537
  .dataviews-action-modal {
@@ -527,16 +547,14 @@
527
547
  justify-content: center;
528
548
  }
529
549
 
530
- .dataviews-view-table-selection-checkbox label {
531
- position: absolute;
532
- width: 1px;
533
- height: 1px;
534
- padding: 0;
535
- margin: -1px;
536
- overflow: hidden;
537
- clip: rect(0, 0, 0, 0);
538
- white-space: nowrap;
539
- border: 0;
550
+ .dataviews-view-table-selection-checkbox {
551
+ // Experimental override for CheckboxControl size (fragile)
552
+ --checkbox-input-size: 24px;
553
+ @include break-small() {
554
+ --checkbox-input-size: 16px;
555
+ }
556
+
557
+ line-height: 0;
540
558
  }
541
559
 
542
560
  .dataviews-filters__custom-menu-radio-item-prefix {
@@ -548,10 +566,6 @@
548
566
  flex-shrink: 0;
549
567
  }
550
568
 
551
- .dataviews-view-grid__title-actions .dataviews-view-table-selection-checkbox {
552
- margin-left: $grid-unit-10;
553
- }
554
-
555
569
  .dataviews-filter-summary__popover {
556
570
  .components-popover__content {
557
571
  width: 230px;
package/src/types.ts ADDED
@@ -0,0 +1,144 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { ReactNode } from 'react';
5
+
6
+ type Item = Record< string, any >;
7
+
8
+ interface Option {
9
+ value: any;
10
+ label: string;
11
+ }
12
+
13
+ interface filterByConfig {
14
+ operators?: Operator[];
15
+ isPrimary?: boolean;
16
+ }
17
+
18
+ type Operator = 'is' | 'isNot' | 'isAny' | 'isNone' | 'isAll' | 'isNotAll';
19
+
20
+ export interface Field {
21
+ /**
22
+ * The unique identifier of the field.
23
+ */
24
+ id: string;
25
+
26
+ /**
27
+ * The label of the field. Defaults to the id.
28
+ */
29
+ header?: string;
30
+
31
+ /**
32
+ * Callback used to retrieve the value of the field from the item.
33
+ * Defaults to `item[ field.id ]`.
34
+ */
35
+ getValue?: ( { item }: { item: Item } ) => any;
36
+
37
+ /**
38
+ * Callback used to render the field. Defaults to `field.getValue`.
39
+ */
40
+ render?: ( { item }: { item: Item } ) => ReactNode;
41
+
42
+ /**
43
+ * The width of the field column.
44
+ */
45
+ width: string | number | undefined;
46
+
47
+ /**
48
+ * The minimum width of the field column.
49
+ */
50
+ maxWidth: string | number | undefined;
51
+
52
+ /**
53
+ * The maximum width of the field column.
54
+ */
55
+ minWidth: string | number | undefined;
56
+
57
+ /**
58
+ * Whether the field is sortable.
59
+ */
60
+ enableSorting: boolean | undefined;
61
+
62
+ /**
63
+ * Whether the field is searchable.
64
+ */
65
+ enableGlobalSearch: boolean | undefined;
66
+
67
+ /**
68
+ * Whether the field is filterable.
69
+ */
70
+ enableHiding: boolean | undefined;
71
+
72
+ /**
73
+ * The list of options to pick from when using the field as a filter.
74
+ */
75
+ elements: Option[] | undefined;
76
+
77
+ /**
78
+ * Filter config for the field.
79
+ */
80
+ filterBy: filterByConfig | undefined;
81
+ }
82
+
83
+ export type NormalizedField = Required< Field >;
84
+
85
+ export type Data = Item[];
86
+
87
+ export interface Filter {
88
+ /**
89
+ * The field to filter by.
90
+ */
91
+ field: string;
92
+
93
+ /**
94
+ * The operator to use.
95
+ */
96
+ operator: Operator;
97
+
98
+ /**
99
+ * The value to filter by.
100
+ */
101
+ value: any;
102
+ }
103
+
104
+ export interface View {
105
+ /**
106
+ * The layout of the view.
107
+ */
108
+ type: string;
109
+
110
+ /**
111
+ * The global search term.
112
+ */
113
+ search?: string;
114
+
115
+ /**
116
+ * The filters to apply.
117
+ */
118
+ filters: Filter[];
119
+
120
+ /**
121
+ * The sorting configuration.
122
+ */
123
+ sort?: {
124
+ /**
125
+ * The field to sort by.
126
+ */
127
+ field: string;
128
+
129
+ /**
130
+ * The direction to sort by.
131
+ */
132
+ direction: string;
133
+ };
134
+
135
+ /**
136
+ * The active page
137
+ */
138
+ page?: number;
139
+
140
+ /**
141
+ * The number of items per page
142
+ */
143
+ perPage?: number;
144
+ }
@@ -13,7 +13,8 @@ import { settings } from '@wordpress/icons';
13
13
  * Internal dependencies
14
14
  */
15
15
  import { unlock } from './lock-unlock';
16
- import { VIEW_LAYOUTS, SORTING_DIRECTIONS } from './constants';
16
+ import { SORTING_DIRECTIONS } from './constants';
17
+ import { VIEW_LAYOUTS } from './layouts';
17
18
 
18
19
  const {
19
20
  DropdownMenuV2: DropdownMenu,
package/src/view-grid.js CHANGED
@@ -15,7 +15,6 @@ import {
15
15
  FlexItem,
16
16
  } from '@wordpress/components';
17
17
  import { __ } from '@wordpress/i18n';
18
- import { useAsyncList } from '@wordpress/compose';
19
18
 
20
19
  /**
21
20
  * Internal dependencies
@@ -35,7 +34,8 @@ function GridItem( {
35
34
  mediaField,
36
35
  primaryField,
37
36
  visibleFields,
38
- displayAsColumnFields,
37
+ badgeFields,
38
+ columnFields,
39
39
  } ) {
40
40
  const hasBulkAction = useHasAPossibleBulkAction( actions, item );
41
41
  const id = getItemId( item );
@@ -100,46 +100,76 @@ function GridItem( {
100
100
  </HStack>
101
101
  <ItemActions item={ item } actions={ actions } isCompact />
102
102
  </HStack>
103
- <VStack className="dataviews-view-grid__fields" spacing={ 3 }>
104
- { visibleFields.map( ( field ) => {
105
- const renderedValue = field.render( {
106
- item,
107
- } );
108
- if ( ! renderedValue ) {
109
- return null;
110
- }
111
- return (
112
- <Flex
113
- className={ classnames(
114
- 'dataviews-view-grid__field',
115
- displayAsColumnFields?.includes( field.id )
116
- ? 'is-column'
117
- : 'is-row'
118
- ) }
119
- key={ field.id }
120
- gap={ 1 }
121
- justify="flex-start"
122
- expanded
123
- style={ { height: 'auto' } }
124
- direction={
125
- displayAsColumnFields?.includes( field.id )
126
- ? 'column'
127
- : 'row'
128
- }
129
- >
130
- <FlexItem className="dataviews-view-grid__field-name">
131
- { field.header }
132
- </FlexItem>
103
+ { !! badgeFields?.length && (
104
+ <HStack
105
+ className="dataviews-view-grid__badge-fields"
106
+ spacing={ 2 }
107
+ wrap
108
+ align="top"
109
+ justify="flex-start"
110
+ >
111
+ { badgeFields.map( ( field ) => {
112
+ const renderedValue = field.render( {
113
+ item,
114
+ } );
115
+ if ( ! renderedValue ) {
116
+ return null;
117
+ }
118
+ return (
133
119
  <FlexItem
134
- className="dataviews-view-grid__field-value"
135
- style={ { maxHeight: 'none' } }
120
+ key={ field.id }
121
+ className={ 'dataviews-view-grid__field-value' }
136
122
  >
137
123
  { renderedValue }
138
124
  </FlexItem>
139
- </Flex>
140
- );
141
- } ) }
142
- </VStack>
125
+ );
126
+ } ) }
127
+ </HStack>
128
+ ) }
129
+ { !! visibleFields?.length && (
130
+ <VStack className="dataviews-view-grid__fields" spacing={ 3 }>
131
+ { visibleFields.map( ( field ) => {
132
+ const renderedValue = field.render( {
133
+ item,
134
+ } );
135
+ if ( ! renderedValue ) {
136
+ return null;
137
+ }
138
+ return (
139
+ <Flex
140
+ className={ classnames(
141
+ 'dataviews-view-grid__field',
142
+ columnFields?.includes( field.id )
143
+ ? 'is-column'
144
+ : 'is-row'
145
+ ) }
146
+ key={ field.id }
147
+ gap={ 1 }
148
+ justify="flex-start"
149
+ expanded
150
+ style={ { height: 'auto' } }
151
+ direction={
152
+ columnFields?.includes( field.id )
153
+ ? 'column'
154
+ : 'row'
155
+ }
156
+ >
157
+ <>
158
+ <FlexItem className="dataviews-view-grid__field-name">
159
+ { field.header }
160
+ </FlexItem>
161
+ <FlexItem
162
+ className="dataviews-view-grid__field-value"
163
+ style={ { maxHeight: 'none' } }
164
+ >
165
+ { renderedValue }
166
+ </FlexItem>
167
+ </>
168
+ </Flex>
169
+ );
170
+ } ) }
171
+ </VStack>
172
+ ) }
143
173
  </VStack>
144
174
  );
145
175
  }
@@ -151,7 +181,6 @@ export default function ViewGrid( {
151
181
  actions,
152
182
  isLoading,
153
183
  getItemId,
154
- deferredRendering,
155
184
  selection,
156
185
  onSelectionChange,
157
186
  } ) {
@@ -161,16 +190,27 @@ export default function ViewGrid( {
161
190
  const primaryField = fields.find(
162
191
  ( field ) => field.id === view.layout.primaryField
163
192
  );
164
- const visibleFields = fields.filter(
165
- ( field ) =>
166
- ! view.hiddenFields.includes( field.id ) &&
167
- ! [ view.layout.mediaField, view.layout.primaryField ].includes(
168
- field.id
169
- )
193
+ const { visibleFields, badgeFields } = fields.reduce(
194
+ ( accumulator, field ) => {
195
+ if (
196
+ view.hiddenFields.includes( field.id ) ||
197
+ [ view.layout.mediaField, view.layout.primaryField ].includes(
198
+ field.id
199
+ )
200
+ ) {
201
+ return accumulator;
202
+ }
203
+ // If the field is a badge field, add it to the badgeFields array
204
+ // otherwise add it to the rest visibleFields array.
205
+ const key = view.layout.badgeFields?.includes( field.id )
206
+ ? 'badgeFields'
207
+ : 'visibleFields';
208
+ accumulator[ key ].push( field );
209
+ return accumulator;
210
+ },
211
+ { visibleFields: [], badgeFields: [] }
170
212
  );
171
- const shownData = useAsyncList( data, { step: 3 } );
172
- const usedData = deferredRendering ? shownData : data;
173
- const hasData = !! usedData?.length;
213
+ const hasData = !! data?.length;
174
214
  return (
175
215
  <>
176
216
  { hasData && (
@@ -181,7 +221,7 @@ export default function ViewGrid( {
181
221
  className="dataviews-view-grid"
182
222
  aria-busy={ isLoading }
183
223
  >
184
- { usedData.map( ( item ) => {
224
+ { data.map( ( item ) => {
185
225
  return (
186
226
  <GridItem
187
227
  key={ getItemId( item ) }
@@ -194,9 +234,8 @@ export default function ViewGrid( {
194
234
  mediaField={ mediaField }
195
235
  primaryField={ primaryField }
196
236
  visibleFields={ visibleFields }
197
- displayAsColumnFields={
198
- view.layout.displayAsColumnFields
199
- }
237
+ badgeFields={ badgeFields }
238
+ columnFields={ view.layout.columnFields }
200
239
  />
201
240
  );
202
241
  } ) }
package/src/view-list.js CHANGED
@@ -6,17 +6,15 @@ import classNames from 'classnames';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { useAsyncList, useInstanceId } from '@wordpress/compose';
9
+ import { useInstanceId } from '@wordpress/compose';
10
10
  import {
11
11
  __experimentalHStack as HStack,
12
12
  __experimentalVStack as VStack,
13
13
  privateApis as componentsPrivateApis,
14
- Button,
15
14
  Spinner,
16
15
  VisuallyHidden,
17
16
  } from '@wordpress/components';
18
17
  import { useCallback, useEffect, useRef } from '@wordpress/element';
19
- import { info } from '@wordpress/icons';
20
18
  import { __ } from '@wordpress/i18n';
21
19
 
22
20
  /**
@@ -36,7 +34,6 @@ function ListItem( {
36
34
  item,
37
35
  isSelected,
38
36
  onSelect,
39
- onDetailsChange,
40
37
  mediaField,
41
38
  primaryField,
42
39
  visibleFields,
@@ -118,18 +115,6 @@ function ListItem( {
118
115
  </HStack>
119
116
  </CompositeItem>
120
117
  </div>
121
- { onDetailsChange && (
122
- <div role="gridcell">
123
- <CompositeItem
124
- render={ <Button /> }
125
- className="dataviews-view-list__details-button"
126
- onClick={ () => onDetailsChange( [ item ] ) }
127
- icon={ info }
128
- label={ __( 'View details' ) }
129
- size="compact"
130
- />
131
- </div>
132
- ) }
133
118
  </HStack>
134
119
  </CompositeRow>
135
120
  );
@@ -142,15 +127,11 @@ export default function ViewList( {
142
127
  isLoading,
143
128
  getItemId,
144
129
  onSelectionChange,
145
- onDetailsChange,
146
130
  selection,
147
- deferredRendering,
148
131
  id: preferredId,
149
132
  } ) {
150
133
  const baseId = useInstanceId( ViewList, 'view-list', preferredId );
151
- const shownData = useAsyncList( data, { step: 3 } );
152
- const usedData = deferredRendering ? shownData : data;
153
- const selectedItem = usedData?.findLast( ( item ) =>
134
+ const selectedItem = data?.findLast( ( item ) =>
154
135
  selection.includes( item.id )
155
136
  );
156
137
 
@@ -182,7 +163,7 @@ export default function ViewList( {
182
163
  defaultActiveId: getItemDomId( selectedItem ),
183
164
  } );
184
165
 
185
- const hasData = usedData?.length;
166
+ const hasData = data?.length;
186
167
  if ( ! hasData ) {
187
168
  return (
188
169
  <div
@@ -206,7 +187,7 @@ export default function ViewList( {
206
187
  role="grid"
207
188
  store={ store }
208
189
  >
209
- { usedData.map( ( item ) => {
190
+ { data.map( ( item ) => {
210
191
  const id = getItemDomId( item );
211
192
  return (
212
193
  <ListItem
@@ -215,7 +196,6 @@ export default function ViewList( {
215
196
  item={ item }
216
197
  isSelected={ item === selectedItem }
217
198
  onSelect={ onSelect }
218
- onDetailsChange={ onDetailsChange }
219
199
  mediaField={ mediaField }
220
200
  primaryField={ primaryField }
221
201
  visibleFields={ visibleFields }