@wordpress/dataviews 2.2.0 → 3.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 (153) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +5 -5
  3. package/build/add-filter.js +1 -1
  4. package/build/add-filter.js.map +1 -1
  5. package/build/bulk-actions-toolbar.js +0 -1
  6. package/build/bulk-actions-toolbar.js.map +1 -1
  7. package/build/bulk-actions.js +1 -1
  8. package/build/bulk-actions.js.map +1 -1
  9. package/build/dataform.js +78 -0
  10. package/build/dataform.js.map +1 -0
  11. package/build/dataviews.js +17 -28
  12. package/build/dataviews.js.map +1 -1
  13. package/build/filter-and-sort-data-view.js +4 -1
  14. package/build/filter-and-sort-data-view.js.map +1 -1
  15. package/build/filter-summary.js +6 -5
  16. package/build/filter-summary.js.map +1 -1
  17. package/build/filters.js +1 -1
  18. package/build/filters.js.map +1 -1
  19. package/build/index.js +7 -0
  20. package/build/index.js.map +1 -1
  21. package/build/item-actions.js +1 -1
  22. package/build/item-actions.js.map +1 -1
  23. package/build/normalize-fields.js.map +1 -1
  24. package/build/pagination.js +2 -2
  25. package/build/pagination.js.map +1 -1
  26. package/build/private-types.js +6 -0
  27. package/build/private-types.js.map +1 -0
  28. package/build/reset-filters.js +1 -1
  29. package/build/reset-filters.js.map +1 -1
  30. package/build/search-widget.js +8 -6
  31. package/build/search-widget.js.map +1 -1
  32. package/build/single-selection-checkbox.js +5 -16
  33. package/build/single-selection-checkbox.js.map +1 -1
  34. package/build/types.js.map +1 -1
  35. package/build/utils.js.map +1 -1
  36. package/build/view-actions.js +76 -65
  37. package/build/view-actions.js.map +1 -1
  38. package/build/view-grid.js +7 -19
  39. package/build/view-grid.js.map +1 -1
  40. package/build/view-list.js +6 -5
  41. package/build/view-list.js.map +1 -1
  42. package/build/view-table.js +11 -20
  43. package/build/view-table.js.map +1 -1
  44. package/build-module/add-filter.js +1 -1
  45. package/build-module/add-filter.js.map +1 -1
  46. package/build-module/bulk-actions-toolbar.js +0 -1
  47. package/build-module/bulk-actions-toolbar.js.map +1 -1
  48. package/build-module/bulk-actions.js +1 -1
  49. package/build-module/bulk-actions.js.map +1 -1
  50. package/build-module/dataform.js +72 -0
  51. package/build-module/dataform.js.map +1 -0
  52. package/build-module/dataviews.js +15 -28
  53. package/build-module/dataviews.js.map +1 -1
  54. package/build-module/filter-and-sort-data-view.js +4 -1
  55. package/build-module/filter-and-sort-data-view.js.map +1 -1
  56. package/build-module/filter-summary.js +6 -5
  57. package/build-module/filter-summary.js.map +1 -1
  58. package/build-module/filters.js +1 -1
  59. package/build-module/filters.js.map +1 -1
  60. package/build-module/index.js +1 -0
  61. package/build-module/index.js.map +1 -1
  62. package/build-module/item-actions.js +1 -1
  63. package/build-module/item-actions.js.map +1 -1
  64. package/build-module/normalize-fields.js.map +1 -1
  65. package/build-module/pagination.js +2 -2
  66. package/build-module/pagination.js.map +1 -1
  67. package/build-module/private-types.js +2 -0
  68. package/build-module/private-types.js.map +1 -0
  69. package/build-module/reset-filters.js +1 -1
  70. package/build-module/reset-filters.js.map +1 -1
  71. package/build-module/search-widget.js +8 -6
  72. package/build-module/search-widget.js.map +1 -1
  73. package/build-module/single-selection-checkbox.js +5 -16
  74. package/build-module/single-selection-checkbox.js.map +1 -1
  75. package/build-module/types.js.map +1 -1
  76. package/build-module/utils.js.map +1 -1
  77. package/build-module/view-actions.js +80 -68
  78. package/build-module/view-actions.js.map +1 -1
  79. package/build-module/view-grid.js +7 -19
  80. package/build-module/view-grid.js.map +1 -1
  81. package/build-module/view-list.js +6 -5
  82. package/build-module/view-list.js.map +1 -1
  83. package/build-module/view-table.js +11 -20
  84. package/build-module/view-table.js.map +1 -1
  85. package/build-style/style-rtl.css +8 -24
  86. package/build-style/style.css +8 -24
  87. package/build-types/bulk-actions-toolbar.d.ts +5 -4
  88. package/build-types/bulk-actions-toolbar.d.ts.map +1 -1
  89. package/build-types/bulk-actions.d.ts +7 -6
  90. package/build-types/bulk-actions.d.ts.map +1 -1
  91. package/build-types/dataform.d.ts +17 -0
  92. package/build-types/dataform.d.ts.map +1 -0
  93. package/build-types/dataviews.d.ts +14 -7
  94. package/build-types/dataviews.d.ts.map +1 -1
  95. package/build-types/filter-and-sort-data-view.d.ts +2 -2
  96. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  97. package/build-types/filter-summary.d.ts.map +1 -1
  98. package/build-types/filters.d.ts +3 -3
  99. package/build-types/filters.d.ts.map +1 -1
  100. package/build-types/index.d.ts +1 -0
  101. package/build-types/index.d.ts.map +1 -1
  102. package/build-types/item-actions.d.ts +10 -10
  103. package/build-types/item-actions.d.ts.map +1 -1
  104. package/build-types/normalize-fields.d.ts +2 -2
  105. package/build-types/normalize-fields.d.ts.map +1 -1
  106. package/build-types/private-types.d.ts +3 -0
  107. package/build-types/private-types.d.ts.map +1 -0
  108. package/build-types/single-selection-checkbox.d.ts +5 -5
  109. package/build-types/single-selection-checkbox.d.ts.map +1 -1
  110. package/build-types/stories/fixtures.d.ts +14 -1
  111. package/build-types/stories/fixtures.d.ts.map +1 -1
  112. package/build-types/stories/index.story.d.ts +15 -1
  113. package/build-types/stories/index.story.d.ts.map +1 -1
  114. package/build-types/types.d.ts +68 -27
  115. package/build-types/types.d.ts.map +1 -1
  116. package/build-types/utils.d.ts +2 -2
  117. package/build-types/utils.d.ts.map +1 -1
  118. package/build-types/view-actions.d.ts +4 -4
  119. package/build-types/view-actions.d.ts.map +1 -1
  120. package/build-types/view-grid.d.ts +2 -2
  121. package/build-types/view-grid.d.ts.map +1 -1
  122. package/build-types/view-list.d.ts +2 -2
  123. package/build-types/view-list.d.ts.map +1 -1
  124. package/build-types/view-table.d.ts +2 -2
  125. package/build-types/view-table.d.ts.map +1 -1
  126. package/package.json +10 -10
  127. package/src/add-filter.tsx +1 -1
  128. package/src/bulk-actions-toolbar.tsx +13 -13
  129. package/src/bulk-actions.tsx +18 -13
  130. package/src/dataform.tsx +106 -0
  131. package/src/dataviews.tsx +43 -49
  132. package/src/filter-and-sort-data-view.ts +13 -3
  133. package/src/filter-summary.tsx +18 -12
  134. package/src/filters.tsx +4 -4
  135. package/src/index.ts +1 -0
  136. package/src/item-actions.tsx +15 -16
  137. package/src/normalize-fields.ts +5 -3
  138. package/src/pagination.tsx +2 -2
  139. package/src/private-types.tsx +2 -0
  140. package/src/reset-filters.tsx +1 -1
  141. package/src/search-widget.tsx +6 -6
  142. package/src/single-selection-checkbox.tsx +14 -29
  143. package/src/stories/fixtures.js +17 -1
  144. package/src/stories/index.story.js +15 -28
  145. package/src/style.scss +10 -22
  146. package/src/test/filter-and-sort-data-view.js +16 -1
  147. package/src/types.ts +68 -34
  148. package/src/utils.ts +2 -4
  149. package/src/view-actions.tsx +105 -102
  150. package/src/view-grid.tsx +21 -38
  151. package/src/view-list.tsx +12 -15
  152. package/src/view-table.tsx +31 -42
  153. package/tsconfig.tsbuildinfo +1 -1
@@ -9,10 +9,11 @@ import type { ChangeEvent } from 'react';
9
9
  import {
10
10
  Button,
11
11
  privateApis as componentsPrivateApis,
12
+ __experimentalHStack as HStack,
12
13
  } from '@wordpress/components';
13
- import { __ } from '@wordpress/i18n';
14
+ import { __, _x } from '@wordpress/i18n';
14
15
  import { memo } from '@wordpress/element';
15
- import { settings } from '@wordpress/icons';
16
+ import { cog } from '@wordpress/icons';
16
17
 
17
18
  /**
18
19
  * Internal dependencies
@@ -20,7 +21,7 @@ import { settings } from '@wordpress/icons';
20
21
  import { unlock } from './lock-unlock';
21
22
  import { SORTING_DIRECTIONS, sortLabels } from './constants';
22
23
  import { VIEW_LAYOUTS } from './layouts';
23
- import type { AnyItem, NormalizedField, View } from './types';
24
+ import type { NormalizedField, View, SupportedLayouts } from './types';
24
25
 
25
26
  const {
26
27
  DropdownMenuV2: DropdownMenu,
@@ -34,7 +35,7 @@ const {
34
35
  interface ViewTypeMenuProps {
35
36
  view: View;
36
37
  onChangeView: ( view: View ) => void;
37
- supportedLayouts?: string[];
38
+ defaultLayouts?: SupportedLayouts;
38
39
  }
39
40
 
40
41
  interface PageSizeMenuProps {
@@ -42,84 +43,64 @@ interface PageSizeMenuProps {
42
43
  onChangeView: ( view: View ) => void;
43
44
  }
44
45
 
45
- interface FieldsVisibilityMenuProps< Item extends AnyItem > {
46
+ interface FieldsVisibilityMenuProps< Item > {
46
47
  view: View;
47
48
  onChangeView: ( view: View ) => void;
48
49
  fields: NormalizedField< Item >[];
49
50
  }
50
51
 
51
- interface SortMenuProps< Item extends AnyItem > {
52
+ interface SortMenuProps< Item > {
52
53
  fields: NormalizedField< Item >[];
53
54
  view: View;
54
55
  onChangeView: ( view: View ) => void;
55
56
  }
56
57
 
57
- interface ViewActionsProps< Item extends AnyItem > {
58
+ interface ViewActionsProps< Item > {
58
59
  fields: NormalizedField< Item >[];
59
60
  view: View;
60
61
  onChangeView: ( view: View ) => void;
61
- supportedLayouts?: string[];
62
+ defaultLayouts?: SupportedLayouts;
62
63
  }
63
64
 
64
65
  function ViewTypeMenu( {
65
66
  view,
66
67
  onChangeView,
67
- supportedLayouts,
68
+ defaultLayouts = { list: {}, grid: {}, table: {} },
68
69
  }: ViewTypeMenuProps ) {
69
- let _availableViews = VIEW_LAYOUTS;
70
- if ( supportedLayouts ) {
71
- _availableViews = _availableViews.filter( ( _view ) =>
72
- supportedLayouts.includes( _view.type )
73
- );
74
- }
75
- if ( _availableViews.length === 1 ) {
70
+ const availableLayouts = Object.keys( defaultLayouts );
71
+ if ( availableLayouts.length <= 1 ) {
76
72
  return null;
77
73
  }
78
- const activeView = _availableViews.find( ( v ) => view.type === v.type );
79
- return (
80
- <DropdownMenu
81
- trigger={
82
- <DropdownMenuItem
83
- suffix={
84
- <span aria-hidden="true">{ activeView?.label }</span>
74
+ return availableLayouts.map( ( layout ) => {
75
+ const config = VIEW_LAYOUTS.find( ( v ) => v.type === layout );
76
+ if ( ! config ) {
77
+ return null;
78
+ }
79
+ return (
80
+ <DropdownMenuRadioItem
81
+ key={ layout }
82
+ value={ layout }
83
+ name="view-actions-available-view"
84
+ checked={ layout === view.type }
85
+ hideOnClick
86
+ onChange={ ( e: ChangeEvent< HTMLInputElement > ) => {
87
+ switch ( e.target.value ) {
88
+ case 'list':
89
+ case 'grid':
90
+ case 'table':
91
+ return onChangeView( {
92
+ ...view,
93
+ type: e.target.value,
94
+ ...defaultLayouts[ e.target.value ],
95
+ } );
85
96
  }
86
- >
87
- <DropdownMenuItemLabel>
88
- { __( 'Layout' ) }
89
- </DropdownMenuItemLabel>
90
- </DropdownMenuItem>
91
- }
92
- >
93
- { _availableViews.map( ( availableView ) => {
94
- return (
95
- <DropdownMenuRadioItem
96
- key={ availableView.type }
97
- value={ availableView.type }
98
- name="view-actions-available-view"
99
- checked={ availableView.type === view.type }
100
- hideOnClick
101
- onChange={ ( e: ChangeEvent< HTMLInputElement > ) => {
102
- switch ( e.target.value ) {
103
- case 'list':
104
- case 'grid':
105
- case 'table':
106
- return onChangeView( {
107
- ...view,
108
- type: e.target.value,
109
- layout: {},
110
- } );
111
- }
112
- throw new Error( 'Invalid dataview' );
113
- } }
114
- >
115
- <DropdownMenuItemLabel>
116
- { availableView.label }
117
- </DropdownMenuItemLabel>
118
- </DropdownMenuRadioItem>
119
- );
120
- } ) }
121
- </DropdownMenu>
122
- );
97
+ throw new Error( 'Invalid dataview' );
98
+ } }
99
+ >
100
+ <DropdownMenuItemLabel>{ config.label }</DropdownMenuItemLabel>
101
+ </DropdownMenuRadioItem>
102
+ );
103
+ } );
123
104
  }
124
105
 
125
106
  const PAGE_SIZE_VALUES = [ 10, 20, 50, 100 ];
@@ -161,15 +142,17 @@ function PageSizeMenu( { view, onChangeView }: PageSizeMenuProps ) {
161
142
  );
162
143
  }
163
144
 
164
- function FieldsVisibilityMenu< Item extends AnyItem >( {
145
+ function FieldsVisibilityMenu< Item >( {
165
146
  view,
166
147
  onChangeView,
167
148
  fields,
168
149
  }: FieldsVisibilityMenuProps< Item > ) {
169
150
  const hidableFields = fields.filter(
170
151
  ( field ) =>
171
- field.enableHiding !== false && field.id !== view.layout.mediaField
152
+ field.enableHiding !== false &&
153
+ field.id !== view?.layout?.mediaField
172
154
  );
155
+ const viewFields = view.fields || fields.map( ( field ) => field.id );
173
156
  if ( ! hidableFields?.length ) {
174
157
  return null;
175
158
  }
@@ -188,20 +171,15 @@ function FieldsVisibilityMenu< Item extends AnyItem >( {
188
171
  <DropdownMenuCheckboxItem
189
172
  key={ field.id }
190
173
  value={ field.id }
191
- checked={ ! view.hiddenFields?.includes( field.id ) }
174
+ checked={ viewFields.includes( field.id ) }
192
175
  onChange={ () => {
193
176
  onChangeView( {
194
177
  ...view,
195
- hiddenFields: view.hiddenFields?.includes(
196
- field.id
197
- )
198
- ? view.hiddenFields.filter(
178
+ fields: viewFields.includes( field.id )
179
+ ? viewFields.filter(
199
180
  ( id ) => id !== field.id
200
181
  )
201
- : [
202
- ...( view.hiddenFields || [] ),
203
- field.id,
204
- ],
182
+ : [ ...viewFields, field.id ],
205
183
  } );
206
184
  } }
207
185
  >
@@ -215,7 +193,7 @@ function FieldsVisibilityMenu< Item extends AnyItem >( {
215
193
  );
216
194
  }
217
195
 
218
- function SortMenu< Item extends AnyItem >( {
196
+ function SortMenu< Item >( {
219
197
  fields,
220
198
  view,
221
199
  onChangeView,
@@ -303,41 +281,66 @@ function SortMenu< Item extends AnyItem >( {
303
281
  );
304
282
  }
305
283
 
306
- function _ViewActions< Item extends AnyItem >( {
284
+ function _ViewActions< Item >( {
307
285
  fields,
308
286
  view,
309
287
  onChangeView,
310
- supportedLayouts,
288
+ defaultLayouts,
311
289
  }: ViewActionsProps< Item > ) {
290
+ const activeView = VIEW_LAYOUTS.find( ( v ) => view.type === v.type );
312
291
  return (
313
- <DropdownMenu
314
- trigger={
315
- <Button
316
- size="compact"
317
- icon={ settings }
318
- label={ __( 'View options' ) }
319
- />
320
- }
321
- >
322
- <DropdownMenuGroup>
323
- <ViewTypeMenu
324
- view={ view }
325
- onChangeView={ onChangeView }
326
- supportedLayouts={ supportedLayouts }
327
- />
328
- <SortMenu
329
- fields={ fields }
330
- view={ view }
331
- onChangeView={ onChangeView }
332
- />
333
- <FieldsVisibilityMenu
334
- fields={ fields }
335
- view={ view }
336
- onChangeView={ onChangeView }
337
- />
338
- <PageSizeMenu view={ view } onChangeView={ onChangeView } />
339
- </DropdownMenuGroup>
340
- </DropdownMenu>
292
+ <>
293
+ <HStack
294
+ spacing={ 1 }
295
+ expanded={ false }
296
+ style={ { flexShrink: 0 } }
297
+ >
298
+ <DropdownMenu
299
+ trigger={
300
+ <Button
301
+ size="compact"
302
+ icon={ activeView?.icon }
303
+ label={ __( 'Layout' ) }
304
+ />
305
+ }
306
+ >
307
+ <ViewTypeMenu
308
+ view={ view }
309
+ onChangeView={ onChangeView }
310
+ defaultLayouts={ defaultLayouts }
311
+ />
312
+ </DropdownMenu>
313
+ <DropdownMenu
314
+ trigger={
315
+ <Button
316
+ size="compact"
317
+ icon={ cog }
318
+ label={ _x(
319
+ 'View options',
320
+ 'View is used as a noun'
321
+ ) }
322
+ />
323
+ }
324
+ >
325
+ <DropdownMenuGroup>
326
+ <SortMenu
327
+ fields={ fields }
328
+ view={ view }
329
+ onChangeView={ onChangeView }
330
+ />
331
+ <FieldsVisibilityMenu
332
+ fields={ fields }
333
+ view={ view }
334
+ onChangeView={ onChangeView }
335
+ />
336
+ <PageSizeMenu
337
+ view={ view }
338
+ onChangeView={ onChangeView }
339
+ />
340
+ </DropdownMenuGroup>
341
+ </DropdownMenu>
342
+ </HStack>
343
+ </>
341
344
  );
342
345
  }
343
346
 
package/src/view-grid.tsx CHANGED
@@ -22,12 +22,12 @@ import { __ } from '@wordpress/i18n';
22
22
  import ItemActions from './item-actions';
23
23
  import SingleSelectionCheckbox from './single-selection-checkbox';
24
24
  import { useHasAPossibleBulkAction } from './bulk-actions';
25
- import type { Action, AnyItem, NormalizedField, ViewGridProps } from './types';
25
+ import type { Action, NormalizedField, ViewGridProps } from './types';
26
+ import type { SetSelection } from './private-types';
26
27
 
27
- interface GridItemProps< Item extends AnyItem > {
28
+ interface GridItemProps< Item > {
28
29
  selection: string[];
29
- data: Item[];
30
- onSelectionChange: ( items: Item[] ) => void;
30
+ onSelectionChange: SetSelection;
31
31
  getItemId: ( item: Item ) => string;
32
32
  item: Item;
33
33
  actions: Action< Item >[];
@@ -38,9 +38,8 @@ interface GridItemProps< Item extends AnyItem > {
38
38
  columnFields?: string[];
39
39
  }
40
40
 
41
- function GridItem< Item extends AnyItem >( {
41
+ function GridItem< Item >( {
42
42
  selection,
43
- data,
44
43
  onSelectionChange,
45
44
  getItemId,
46
45
  item,
@@ -68,27 +67,11 @@ function GridItem< Item extends AnyItem >( {
68
67
  if ( ! hasBulkAction ) {
69
68
  return;
70
69
  }
71
- if ( ! isSelected ) {
72
- onSelectionChange(
73
- data.filter( ( _item ) => {
74
- const itemId = getItemId?.( _item );
75
- return (
76
- itemId === id ||
77
- selection.includes( itemId )
78
- );
79
- } )
80
- );
81
- } else {
82
- onSelectionChange(
83
- data.filter( ( _item ) => {
84
- const itemId = getItemId?.( _item );
85
- return (
86
- itemId !== id &&
87
- selection.includes( itemId )
88
- );
89
- } )
90
- );
91
- }
70
+ onSelectionChange(
71
+ selection.includes( id )
72
+ ? selection.filter( ( itemId ) => id !== itemId )
73
+ : [ ...selection, id ]
74
+ );
92
75
  }
93
76
  } }
94
77
  >
@@ -104,7 +87,6 @@ function GridItem< Item extends AnyItem >( {
104
87
  selection={ selection }
105
88
  onSelectionChange={ onSelectionChange }
106
89
  getItemId={ getItemId }
107
- data={ data }
108
90
  primaryField={ primaryField }
109
91
  disabled={ ! hasBulkAction }
110
92
  />
@@ -187,7 +169,7 @@ function GridItem< Item extends AnyItem >( {
187
169
  );
188
170
  }
189
171
 
190
- export default function ViewGrid< Item extends AnyItem >( {
172
+ export default function ViewGrid< Item >( {
191
173
  actions,
192
174
  data,
193
175
  fields,
@@ -198,24 +180,26 @@ export default function ViewGrid< Item extends AnyItem >( {
198
180
  view,
199
181
  }: ViewGridProps< Item > ) {
200
182
  const mediaField = fields.find(
201
- ( field ) => field.id === view.layout.mediaField
183
+ ( field ) => field.id === view.layout?.mediaField
202
184
  );
203
185
  const primaryField = fields.find(
204
- ( field ) => field.id === view.layout.primaryField
186
+ ( field ) => field.id === view.layout?.primaryField
205
187
  );
188
+ const viewFields = view.fields || fields.map( ( field ) => field.id );
206
189
  const { visibleFields, badgeFields } = fields.reduce(
207
190
  ( accumulator: Record< string, NormalizedField< Item >[] >, field ) => {
208
191
  if (
209
- view.hiddenFields.includes( field.id ) ||
210
- [ view.layout.mediaField, view.layout.primaryField ].includes(
211
- field.id
212
- )
192
+ ! viewFields.includes( field.id ) ||
193
+ [
194
+ view.layout?.mediaField,
195
+ view?.layout?.primaryField,
196
+ ].includes( field.id )
213
197
  ) {
214
198
  return accumulator;
215
199
  }
216
200
  // If the field is a badge field, add it to the badgeFields array
217
201
  // otherwise add it to the rest visibleFields array.
218
- const key = view.layout.badgeFields?.includes( field.id )
202
+ const key = view.layout?.badgeFields?.includes( field.id )
219
203
  ? 'badgeFields'
220
204
  : 'visibleFields';
221
205
  accumulator[ key ].push( field );
@@ -239,7 +223,6 @@ export default function ViewGrid< Item extends AnyItem >( {
239
223
  <GridItem
240
224
  key={ getItemId( item ) }
241
225
  selection={ selection }
242
- data={ data }
243
226
  onSelectionChange={ onSelectionChange }
244
227
  getItemId={ getItemId }
245
228
  item={ item }
@@ -248,7 +231,7 @@ export default function ViewGrid< Item extends AnyItem >( {
248
231
  primaryField={ primaryField }
249
232
  visibleFields={ visibleFields }
250
233
  badgeFields={ badgeFields }
251
- columnFields={ view.layout.columnFields }
234
+ columnFields={ view.layout?.columnFields }
252
235
  />
253
236
  );
254
237
  } ) }
package/src/view-list.tsx CHANGED
@@ -33,11 +33,11 @@ import { useRegistry } from '@wordpress/data';
33
33
  * Internal dependencies
34
34
  */
35
35
  import { unlock } from './lock-unlock';
36
- import type { Action, AnyItem, NormalizedField, ViewListProps } from './types';
36
+ import type { Action, NormalizedField, ViewListProps } from './types';
37
37
 
38
38
  import { ActionsDropdownMenuGroup, ActionModal } from './item-actions';
39
39
 
40
- interface ListViewItemProps< Item extends AnyItem > {
40
+ interface ListViewItemProps< Item > {
41
41
  actions: Action< Item >[];
42
42
  id?: string;
43
43
  isSelected: boolean;
@@ -57,7 +57,7 @@ const {
57
57
  DropdownMenuV2: DropdownMenu,
58
58
  } = unlock( componentsPrivateApis );
59
59
 
60
- function ListItem< Item extends AnyItem >( {
60
+ function ListItem< Item >( {
61
61
  actions,
62
62
  id,
63
63
  isSelected,
@@ -258,7 +258,7 @@ function ListItem< Item extends AnyItem >( {
258
258
  size="compact"
259
259
  icon={ moreVertical }
260
260
  label={ __( 'Actions' ) }
261
- __experimentalIsFocusable
261
+ accessibleWhenDisabled
262
262
  disabled={ ! actions.length }
263
263
  onKeyDown={ ( event: {
264
264
  key: string;
@@ -303,9 +303,7 @@ function ListItem< Item extends AnyItem >( {
303
303
  );
304
304
  }
305
305
 
306
- export default function ViewList< Item extends AnyItem >(
307
- props: ViewListProps< Item >
308
- ) {
306
+ export default function ViewList< Item >( props: ViewListProps< Item > ) {
309
307
  const {
310
308
  actions,
311
309
  data,
@@ -322,23 +320,22 @@ export default function ViewList< Item extends AnyItem >(
322
320
  );
323
321
 
324
322
  const mediaField = fields.find(
325
- ( field ) => field.id === view.layout.mediaField
323
+ ( field ) => field.id === view.layout?.mediaField
326
324
  );
327
325
  const primaryField = fields.find(
328
- ( field ) => field.id === view.layout.primaryField
326
+ ( field ) => field.id === view.layout?.primaryField
329
327
  );
328
+ const viewFields = view.fields || fields.map( ( field ) => field.id );
330
329
  const visibleFields = fields.filter(
331
330
  ( field ) =>
332
- ! view.hiddenFields.includes( field.id ) &&
333
- ! [ view.layout.primaryField, view.layout.mediaField ].includes(
331
+ viewFields.includes( field.id ) &&
332
+ ! [ view.layout?.primaryField, view.layout?.mediaField ].includes(
334
333
  field.id
335
334
  )
336
335
  );
337
336
 
338
- const onSelect = useCallback(
339
- ( item: Item ) => onSelectionChange( [ item ] ),
340
- [ onSelectionChange ]
341
- );
337
+ const onSelect = ( item: Item ) =>
338
+ onSelectionChange( [ getItemId( item ) ] );
342
339
 
343
340
  const getItemDomId = useCallback(
344
341
  ( item?: Item ) =>