@wordpress/dataviews 4.9.1-next.cd6172eb0.0 → 4.11.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 (206) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/LICENSE.md +1 -1
  3. package/README.md +337 -228
  4. package/build/components/dataviews/index.js +13 -1
  5. package/build/components/dataviews/index.js.map +1 -1
  6. package/build/components/dataviews-bulk-actions/index.js +30 -2
  7. package/build/components/dataviews-bulk-actions/index.js.map +1 -1
  8. package/build/components/dataviews-context/index.js +2 -1
  9. package/build/components/dataviews-context/index.js.map +1 -1
  10. package/build/components/dataviews-filters/add-filter.js +36 -30
  11. package/build/components/dataviews-filters/add-filter.js.map +1 -1
  12. package/build/components/dataviews-filters/filter-summary.js +1 -0
  13. package/build/components/dataviews-filters/filter-summary.js.map +1 -1
  14. package/build/components/dataviews-filters/index.js +4 -1
  15. package/build/components/dataviews-filters/index.js.map +1 -1
  16. package/build/components/dataviews-filters/reset-filters.js +1 -0
  17. package/build/components/dataviews-filters/reset-filters.js.map +1 -1
  18. package/build/components/dataviews-filters/search-widget.js +1 -0
  19. package/build/components/dataviews-filters/search-widget.js.map +1 -1
  20. package/build/components/dataviews-item-actions/index.js +68 -79
  21. package/build/components/dataviews-item-actions/index.js.map +1 -1
  22. package/build/components/dataviews-layout/index.js +3 -0
  23. package/build/components/dataviews-layout/index.js.map +1 -1
  24. package/build/components/dataviews-pagination/index.js +1 -0
  25. package/build/components/dataviews-pagination/index.js.map +1 -1
  26. package/build/components/dataviews-selection-checkbox/index.js +4 -3
  27. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  28. package/build/components/dataviews-view-config/index.js +235 -161
  29. package/build/components/dataviews-view-config/index.js.map +1 -1
  30. package/build/dataforms-layouts/data-form-layout.js +1 -0
  31. package/build/dataforms-layouts/data-form-layout.js.map +1 -1
  32. package/build/dataforms-layouts/index.js +1 -0
  33. package/build/dataforms-layouts/index.js.map +1 -1
  34. package/build/dataforms-layouts/panel/index.js +1 -0
  35. package/build/dataforms-layouts/panel/index.js.map +1 -1
  36. package/build/dataforms-layouts/regular/index.js +1 -0
  37. package/build/dataforms-layouts/regular/index.js.map +1 -1
  38. package/build/dataviews-layouts/grid/index.js +108 -65
  39. package/build/dataviews-layouts/grid/index.js.map +1 -1
  40. package/build/dataviews-layouts/grid/preview-size-picker.js +22 -25
  41. package/build/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  42. package/build/dataviews-layouts/index.js +0 -60
  43. package/build/dataviews-layouts/index.js.map +1 -1
  44. package/build/dataviews-layouts/list/index.js +67 -33
  45. package/build/dataviews-layouts/list/index.js.map +1 -1
  46. package/build/dataviews-layouts/table/column-header-menu.js +119 -120
  47. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
  48. package/build/dataviews-layouts/table/column-primary.js +59 -0
  49. package/build/dataviews-layouts/table/column-primary.js.map +1 -0
  50. package/build/dataviews-layouts/table/index.js +78 -88
  51. package/build/dataviews-layouts/table/index.js.map +1 -1
  52. package/build/dataviews-layouts/utils/get-clickable-item-props.js +2 -2
  53. package/build/dataviews-layouts/utils/get-clickable-item-props.js.map +1 -1
  54. package/build/filter-and-sort-data-view.js +1 -0
  55. package/build/filter-and-sort-data-view.js.map +1 -1
  56. package/build/normalize-fields.js +1 -0
  57. package/build/normalize-fields.js.map +1 -1
  58. package/build/normalize-form-fields.js +1 -0
  59. package/build/normalize-form-fields.js.map +1 -1
  60. package/build/types.js.map +1 -1
  61. package/build/utils.js +1 -0
  62. package/build/utils.js.map +1 -1
  63. package/build/validation.js +1 -0
  64. package/build/validation.js.map +1 -1
  65. package/build-module/components/dataviews/index.js +13 -1
  66. package/build-module/components/dataviews/index.js.map +1 -1
  67. package/build-module/components/dataviews-bulk-actions/index.js +31 -3
  68. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
  69. package/build-module/components/dataviews-context/index.js +2 -1
  70. package/build-module/components/dataviews-context/index.js.map +1 -1
  71. package/build-module/components/dataviews-filters/add-filter.js +37 -31
  72. package/build-module/components/dataviews-filters/add-filter.js.map +1 -1
  73. package/build-module/components/dataviews-filters/filter-summary.js +1 -0
  74. package/build-module/components/dataviews-filters/filter-summary.js.map +1 -1
  75. package/build-module/components/dataviews-filters/index.js +4 -1
  76. package/build-module/components/dataviews-filters/index.js.map +1 -1
  77. package/build-module/components/dataviews-filters/reset-filters.js +1 -0
  78. package/build-module/components/dataviews-filters/reset-filters.js.map +1 -1
  79. package/build-module/components/dataviews-filters/search-widget.js +1 -0
  80. package/build-module/components/dataviews-filters/search-widget.js.map +1 -1
  81. package/build-module/components/dataviews-item-actions/index.js +69 -79
  82. package/build-module/components/dataviews-item-actions/index.js.map +1 -1
  83. package/build-module/components/dataviews-layout/index.js +3 -0
  84. package/build-module/components/dataviews-layout/index.js.map +1 -1
  85. package/build-module/components/dataviews-pagination/index.js +1 -0
  86. package/build-module/components/dataviews-pagination/index.js.map +1 -1
  87. package/build-module/components/dataviews-selection-checkbox/index.js +4 -3
  88. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  89. package/build-module/components/dataviews-view-config/index.js +240 -166
  90. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  91. package/build-module/dataforms-layouts/data-form-layout.js +1 -0
  92. package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
  93. package/build-module/dataforms-layouts/index.js +1 -0
  94. package/build-module/dataforms-layouts/index.js.map +1 -1
  95. package/build-module/dataforms-layouts/panel/index.js +1 -0
  96. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  97. package/build-module/dataforms-layouts/regular/index.js +1 -0
  98. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  99. package/build-module/dataviews-layouts/grid/index.js +111 -68
  100. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  101. package/build-module/dataviews-layouts/grid/preview-size-picker.js +22 -25
  102. package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  103. package/build-module/dataviews-layouts/index.js +0 -57
  104. package/build-module/dataviews-layouts/index.js.map +1 -1
  105. package/build-module/dataviews-layouts/list/index.js +67 -33
  106. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  107. package/build-module/dataviews-layouts/table/column-header-menu.js +119 -120
  108. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  109. package/build-module/dataviews-layouts/table/column-primary.js +52 -0
  110. package/build-module/dataviews-layouts/table/column-primary.js.map +1 -0
  111. package/build-module/dataviews-layouts/table/index.js +81 -91
  112. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  113. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js +2 -2
  114. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js.map +1 -1
  115. package/build-module/filter-and-sort-data-view.js +1 -0
  116. package/build-module/filter-and-sort-data-view.js.map +1 -1
  117. package/build-module/normalize-fields.js +1 -0
  118. package/build-module/normalize-fields.js.map +1 -1
  119. package/build-module/normalize-form-fields.js +1 -0
  120. package/build-module/normalize-form-fields.js.map +1 -1
  121. package/build-module/types.js.map +1 -1
  122. package/build-module/utils.js +1 -0
  123. package/build-module/utils.js.map +1 -1
  124. package/build-module/validation.js +1 -0
  125. package/build-module/validation.js.map +1 -1
  126. package/build-style/style-rtl.css +123 -121
  127. package/build-style/style.css +123 -121
  128. package/build-types/components/dataviews/index.d.ts +2 -1
  129. package/build-types/components/dataviews/index.d.ts.map +1 -1
  130. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  131. package/build-types/components/dataviews/stories/index.story.d.ts +0 -1
  132. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  133. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
  134. package/build-types/components/dataviews-context/index.d.ts +2 -0
  135. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  136. package/build-types/components/dataviews-filters/add-filter.d.ts +3 -2
  137. package/build-types/components/dataviews-filters/add-filter.d.ts.map +1 -1
  138. package/build-types/components/dataviews-item-actions/index.d.ts +7 -9
  139. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
  140. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  141. package/build-types/components/dataviews-selection-checkbox/index.d.ts +2 -2
  142. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  143. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  144. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  145. package/build-types/dataviews-layouts/grid/preview-size-picker.d.ts.map +1 -1
  146. package/build-types/dataviews-layouts/index.d.ts +0 -4
  147. package/build-types/dataviews-layouts/index.d.ts.map +1 -1
  148. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  149. package/build-types/dataviews-layouts/table/column-header-menu.d.ts +1 -0
  150. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
  151. package/build-types/dataviews-layouts/table/column-primary.d.ts +15 -0
  152. package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -0
  153. package/build-types/dataviews-layouts/table/index.d.ts +1 -1
  154. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  155. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts +3 -3
  156. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts.map +1 -1
  157. package/build-types/test/dataform.d.ts +2 -0
  158. package/build-types/test/dataform.d.ts.map +1 -0
  159. package/build-types/test/dataviews.d.ts +2 -0
  160. package/build-types/test/dataviews.d.ts.map +1 -0
  161. package/build-types/test/normalize-fields.d.ts +2 -0
  162. package/build-types/test/normalize-fields.d.ts.map +1 -0
  163. package/build-types/test/validation.d.ts +2 -0
  164. package/build-types/test/validation.d.ts.map +1 -0
  165. package/build-types/types.d.ts +25 -39
  166. package/build-types/types.d.ts.map +1 -1
  167. package/build-wp/index.js +1892 -1814
  168. package/build.js +1 -1
  169. package/package.json +13 -12
  170. package/src/components/dataviews/index.tsx +15 -1
  171. package/src/components/dataviews/stories/fixtures.tsx +0 -3
  172. package/src/components/dataviews/stories/index.story.tsx +14 -106
  173. package/src/components/dataviews/style.scss +32 -33
  174. package/src/components/dataviews-bulk-actions/index.tsx +43 -3
  175. package/src/components/dataviews-context/index.ts +3 -0
  176. package/src/components/dataviews-filters/add-filter.tsx +43 -39
  177. package/src/components/dataviews-filters/index.tsx +1 -1
  178. package/src/components/dataviews-footer/style.scss +0 -3
  179. package/src/components/dataviews-item-actions/index.tsx +90 -107
  180. package/src/components/dataviews-layout/index.tsx +2 -0
  181. package/src/components/dataviews-selection-checkbox/index.tsx +4 -4
  182. package/src/components/dataviews-view-config/index.tsx +347 -232
  183. package/src/components/dataviews-view-config/style.scss +17 -1
  184. package/src/dataviews-layouts/grid/index.tsx +150 -103
  185. package/src/dataviews-layouts/grid/preview-size-picker.tsx +25 -30
  186. package/src/dataviews-layouts/grid/style.scss +38 -56
  187. package/src/dataviews-layouts/index.ts +0 -88
  188. package/src/dataviews-layouts/list/index.tsx +95 -57
  189. package/src/dataviews-layouts/list/style.scss +10 -9
  190. package/src/dataviews-layouts/table/column-header-menu.tsx +183 -171
  191. package/src/dataviews-layouts/table/column-primary.tsx +65 -0
  192. package/src/dataviews-layouts/table/index.tsx +98 -133
  193. package/src/dataviews-layouts/table/style.scss +4 -1
  194. package/src/dataviews-layouts/utils/get-clickable-item-props.ts +9 -3
  195. package/src/test/dataform.tsx +348 -0
  196. package/src/test/dataviews.tsx +380 -0
  197. package/src/types.ts +27 -46
  198. package/tsconfig.json +14 -4
  199. package/tsconfig.tsbuildinfo +1 -1
  200. package/build/components/form-field-visibility/index.js +0 -32
  201. package/build/components/form-field-visibility/index.js.map +0 -1
  202. package/build-module/components/form-field-visibility/index.js +0 -26
  203. package/build-module/components/form-field-visibility/index.js.map +0 -1
  204. package/build-types/components/form-field-visibility/index.d.ts +0 -11
  205. package/build-types/components/form-field-visibility/index.d.ts.map +0 -1
  206. package/src/components/form-field-visibility/index.tsx +0 -32
@@ -16,7 +16,6 @@ import ViewTable from './table';
16
16
  import ViewGrid from './grid';
17
17
  import ViewList from './list';
18
18
  import { LAYOUT_GRID, LAYOUT_LIST, LAYOUT_TABLE } from '../constants';
19
- import type { View, Field } from '../types';
20
19
  import PreviewSizePicker from './grid/preview-size-picker';
21
20
  import DensityPicker from './table/density-picker';
22
21
 
@@ -42,90 +41,3 @@ export const VIEW_LAYOUTS = [
42
41
  icon: isRTL() ? formatListBulletsRTL : formatListBullets,
43
42
  },
44
43
  ];
45
-
46
- export function getNotHidableFieldIds( view: View ): string[] {
47
- if ( view.type === 'table' ) {
48
- return [ view.layout?.primaryField ]
49
- .concat(
50
- view.layout?.combinedFields?.flatMap(
51
- ( field ) => field.children
52
- ) ?? []
53
- )
54
- .filter( ( item ): item is string => !! item );
55
- }
56
-
57
- if ( view.type === 'grid' ) {
58
- return [ view.layout?.primaryField, view.layout?.mediaField ].filter(
59
- ( item ): item is string => !! item
60
- );
61
- }
62
-
63
- if ( view.type === 'list' ) {
64
- return [ view.layout?.primaryField, view.layout?.mediaField ].filter(
65
- ( item ): item is string => !! item
66
- );
67
- }
68
-
69
- return [];
70
- }
71
-
72
- function getCombinedFieldIds( view: View ): string[] {
73
- const combinedFields: string[] = [];
74
- if ( view.type === LAYOUT_TABLE && view.layout?.combinedFields ) {
75
- view.layout.combinedFields.forEach( ( combination ) => {
76
- combinedFields.push( ...combination.children );
77
- } );
78
- }
79
- return combinedFields;
80
- }
81
-
82
- export function getVisibleFieldIds(
83
- view: View,
84
- fields: Field< any >[]
85
- ): string[] {
86
- const fieldsToExclude = getCombinedFieldIds( view );
87
-
88
- if ( view.fields ) {
89
- return view.fields.filter( ( id ) => ! fieldsToExclude.includes( id ) );
90
- }
91
-
92
- const visibleFields = [];
93
- if ( view.type === LAYOUT_TABLE && view.layout?.combinedFields ) {
94
- visibleFields.push(
95
- ...view.layout.combinedFields.map( ( { id } ) => id )
96
- );
97
- }
98
- visibleFields.push(
99
- ...fields
100
- .filter( ( { id } ) => ! fieldsToExclude.includes( id ) )
101
- .map( ( { id } ) => id )
102
- );
103
-
104
- return visibleFields;
105
- }
106
-
107
- export function getHiddenFieldIds(
108
- view: View,
109
- fields: Field< any >[]
110
- ): string[] {
111
- const fieldsToExclude = [
112
- ...getCombinedFieldIds( view ),
113
- ...getVisibleFieldIds( view, fields ),
114
- ];
115
-
116
- // The media field does not need to be in the view.fields to be displayed.
117
- if ( view.type === LAYOUT_GRID && view.layout?.mediaField ) {
118
- fieldsToExclude.push( view.layout?.mediaField );
119
- }
120
-
121
- if ( view.type === LAYOUT_LIST && view.layout?.mediaField ) {
122
- fieldsToExclude.push( view.layout?.mediaField );
123
- }
124
-
125
- return fields
126
- .filter(
127
- ( { id, enableHiding } ) =>
128
- ! fieldsToExclude.includes( id ) && enableHiding
129
- )
130
- .map( ( { id } ) => id );
131
- }
@@ -35,17 +35,25 @@ import {
35
35
  ActionsMenuGroup,
36
36
  ActionModal,
37
37
  } from '../../components/dataviews-item-actions';
38
- import type { Action, NormalizedField, ViewListProps } from '../../types';
38
+ import type {
39
+ Action,
40
+ NormalizedField,
41
+ ViewList as ViewListType,
42
+ ViewListProps,
43
+ ActionModal as ActionModalType,
44
+ } from '../../types';
39
45
 
40
46
  interface ListViewItemProps< Item > {
47
+ view: ViewListType;
41
48
  actions: Action< Item >[];
42
49
  idPrefix: string;
43
50
  isSelected: boolean;
44
51
  item: Item;
52
+ titleField?: NormalizedField< Item >;
45
53
  mediaField?: NormalizedField< Item >;
54
+ descriptionField?: NormalizedField< Item >;
46
55
  onSelect: ( item: Item ) => void;
47
- primaryField?: NormalizedField< Item >;
48
- visibleFields: NormalizedField< Item >[];
56
+ otherFields: NormalizedField< Item >[];
49
57
  onDropdownTriggerKeyDown: React.KeyboardEventHandler< HTMLButtonElement >;
50
58
  }
51
59
 
@@ -93,6 +101,8 @@ function PrimaryActionGridCell< Item >( {
93
101
  render={
94
102
  <Button
95
103
  label={ label }
104
+ disabled={ !! primaryAction.disabled }
105
+ accessibleWhenDisabled
96
106
  icon={ primaryAction.icon }
97
107
  isDestructive={ primaryAction.isDestructive }
98
108
  size="small"
@@ -116,6 +126,8 @@ function PrimaryActionGridCell< Item >( {
116
126
  render={
117
127
  <Button
118
128
  label={ label }
129
+ disabled={ !! primaryAction.disabled }
130
+ accessibleWhenDisabled
119
131
  icon={ primaryAction.icon }
120
132
  isDestructive={ primaryAction.isDestructive }
121
133
  size="small"
@@ -130,21 +142,28 @@ function PrimaryActionGridCell< Item >( {
130
142
  }
131
143
 
132
144
  function ListItem< Item >( {
145
+ view,
133
146
  actions,
134
147
  idPrefix,
135
148
  isSelected,
136
149
  item,
150
+ titleField,
137
151
  mediaField,
152
+ descriptionField,
138
153
  onSelect,
139
- primaryField,
140
- visibleFields,
154
+ otherFields,
141
155
  onDropdownTriggerKeyDown,
142
156
  }: ListViewItemProps< Item > ) {
157
+ const { showTitle = true, showMedia = true, showDescription = true } = view;
143
158
  const itemRef = useRef< HTMLDivElement >( null );
144
159
  const labelId = `${ idPrefix }-label`;
145
160
  const descriptionId = `${ idPrefix }-description`;
146
161
 
162
+ const registry = useRegistry();
147
163
  const [ isHovered, setIsHovered ] = useState( false );
164
+ const [ activeModalAction, setActiveModalAction ] = useState(
165
+ null as ActionModalType< Item > | null
166
+ );
148
167
  const handleHover: React.MouseEventHandler = ( { type } ) => {
149
168
  const isHover = type === 'mouseenter';
150
169
  setIsHovered( isHover );
@@ -177,15 +196,17 @@ function ListItem< Item >( {
177
196
 
178
197
  const hasOnlyOnePrimaryAction = primaryAction && actions.length === 1;
179
198
 
180
- const renderedMediaField = mediaField?.render ? (
181
- <div className="dataviews-view-list__media-wrapper">
182
- <mediaField.render item={ item } />
183
- </div>
184
- ) : null;
199
+ const renderedMediaField =
200
+ showMedia && mediaField?.render ? (
201
+ <div className="dataviews-view-list__media-wrapper">
202
+ <mediaField.render item={ item } />
203
+ </div>
204
+ ) : null;
185
205
 
186
- const renderedPrimaryField = primaryField?.render ? (
187
- <primaryField.render item={ item } />
188
- ) : null;
206
+ const renderedTitleField =
207
+ showTitle && titleField?.render ? (
208
+ <titleField.render item={ item } />
209
+ ) : null;
189
210
 
190
211
  const usedActions = eligibleActions?.length > 0 && (
191
212
  <HStack spacing={ 3 } className="dataviews-view-list__item-actions">
@@ -198,31 +219,44 @@ function ListItem< Item >( {
198
219
  ) }
199
220
  { ! hasOnlyOnePrimaryAction && (
200
221
  <div role="gridcell">
201
- <Menu
202
- trigger={
203
- <Composite.Item
204
- id={ generateDropdownTriggerCompositeId(
205
- idPrefix
206
- ) }
207
- render={
208
- <Button
209
- size="small"
210
- icon={ moreVertical }
211
- label={ __( 'Actions' ) }
212
- accessibleWhenDisabled
213
- disabled={ ! actions.length }
214
- onKeyDown={ onDropdownTriggerKeyDown }
215
- />
216
- }
217
- />
218
- }
219
- placement="bottom-end"
220
- >
221
- <ActionsMenuGroup
222
- actions={ eligibleActions }
223
- item={ item }
222
+ <Menu placement="bottom-end">
223
+ <Menu.TriggerButton
224
+ render={
225
+ <Composite.Item
226
+ id={ generateDropdownTriggerCompositeId(
227
+ idPrefix
228
+ ) }
229
+ render={
230
+ <Button
231
+ size="small"
232
+ icon={ moreVertical }
233
+ label={ __( 'Actions' ) }
234
+ accessibleWhenDisabled
235
+ disabled={ ! actions.length }
236
+ onKeyDown={
237
+ onDropdownTriggerKeyDown
238
+ }
239
+ />
240
+ }
241
+ />
242
+ }
224
243
  />
244
+ <Menu.Popover>
245
+ <ActionsMenuGroup
246
+ actions={ eligibleActions }
247
+ item={ item }
248
+ registry={ registry }
249
+ setActiveModalAction={ setActiveModalAction }
250
+ />
251
+ </Menu.Popover>
225
252
  </Menu>
253
+ { !! activeModalAction && (
254
+ <ActionModal
255
+ action={ activeModalAction }
256
+ items={ [ item ] }
257
+ closeModal={ () => setActiveModalAction( null ) }
258
+ />
259
+ ) }
226
260
  </div>
227
261
  ) }
228
262
  </HStack>
@@ -231,7 +265,7 @@ function ListItem< Item >( {
231
265
  return (
232
266
  <Composite.Row
233
267
  ref={ itemRef }
234
- render={ <li /> }
268
+ render={ <div /> }
235
269
  role="row"
236
270
  className={ clsx( {
237
271
  'is-selected': isSelected,
@@ -259,18 +293,23 @@ function ListItem< Item >( {
259
293
  >
260
294
  <HStack spacing={ 0 }>
261
295
  <div
262
- className="dataviews-view-list__primary-field"
296
+ className="dataviews-title-field"
263
297
  id={ labelId }
264
298
  >
265
- { renderedPrimaryField }
299
+ { renderedTitleField }
266
300
  </div>
267
301
  { usedActions }
268
302
  </HStack>
303
+ { showDescription && descriptionField?.render && (
304
+ <div className="dataviews-view-list__field">
305
+ <descriptionField.render item={ item } />
306
+ </div>
307
+ ) }
269
308
  <div
270
309
  className="dataviews-view-list__fields"
271
310
  id={ descriptionId }
272
311
  >
273
- { visibleFields.map( ( field ) => (
312
+ { otherFields.map( ( field ) => (
274
313
  <div
275
314
  key={ field.id }
276
315
  className="dataviews-view-list__field"
@@ -294,6 +333,10 @@ function ListItem< Item >( {
294
333
  );
295
334
  }
296
335
 
336
+ function isDefined< T >( item: T | undefined ): item is T {
337
+ return !! item;
338
+ }
339
+
297
340
  export default function ViewList< Item >( props: ViewListProps< Item > ) {
298
341
  const {
299
342
  actions,
@@ -310,21 +353,14 @@ export default function ViewList< Item >( props: ViewListProps< Item > ) {
310
353
  const selectedItem = data?.findLast( ( item ) =>
311
354
  selection.includes( getItemId( item ) )
312
355
  );
313
-
314
- const mediaField = fields.find(
315
- ( field ) => field.id === view.layout?.mediaField
316
- );
317
- const primaryField = fields.find(
318
- ( field ) => field.id === view.layout?.primaryField
319
- );
320
- const viewFields = view.fields || fields.map( ( field ) => field.id );
321
- const visibleFields = fields.filter(
322
- ( field ) =>
323
- viewFields.includes( field.id ) &&
324
- ! [ view.layout?.primaryField, view.layout?.mediaField ].includes(
325
- field.id
326
- )
356
+ const titleField = fields.find( ( field ) => field.id === view.titleField );
357
+ const mediaField = fields.find( ( field ) => field.id === view.mediaField );
358
+ const descriptionField = fields.find(
359
+ ( field ) => field.id === view.descriptionField
327
360
  );
361
+ const otherFields = ( view?.fields ?? [] )
362
+ .map( ( fieldId ) => fields.find( ( f ) => fieldId === f.id ) )
363
+ .filter( isDefined );
328
364
 
329
365
  const onSelect = ( item: Item ) =>
330
366
  onChangeSelection( [ getItemId( item ) ] );
@@ -454,7 +490,7 @@ export default function ViewList< Item >( props: ViewListProps< Item > ) {
454
490
  return (
455
491
  <Composite
456
492
  id={ baseId }
457
- render={ <ul /> }
493
+ render={ <div /> }
458
494
  className="dataviews-view-list"
459
495
  role="grid"
460
496
  activeId={ activeCompositeId }
@@ -465,14 +501,16 @@ export default function ViewList< Item >( props: ViewListProps< Item > ) {
465
501
  return (
466
502
  <ListItem
467
503
  key={ id }
504
+ view={ view }
468
505
  idPrefix={ id }
469
506
  actions={ actions }
470
507
  item={ item }
471
508
  isSelected={ item === selectedItem }
472
509
  onSelect={ onSelect }
473
510
  mediaField={ mediaField }
474
- primaryField={ primaryField }
475
- visibleFields={ visibleFields }
511
+ titleField={ titleField }
512
+ descriptionField={ descriptionField }
513
+ otherFields={ otherFields }
476
514
  onDropdownTriggerKeyDown={ onDropdownTriggerKeyDown }
477
515
  />
478
516
  );
@@ -1,17 +1,18 @@
1
- ul.dataviews-view-list {
1
+ div.dataviews-view-list {
2
2
  list-style-type: none;
3
3
  }
4
4
 
5
5
  .dataviews-view-list {
6
6
  margin: 0 0 auto;
7
7
 
8
- li {
8
+ div[role="row"] {
9
9
  margin: 0;
10
10
  border-top: 1px solid $gray-100;
11
11
 
12
12
  .dataviews-view-list__item-wrapper {
13
13
  position: relative;
14
14
  padding: $grid-unit-20 $grid-unit-30;
15
+ box-sizing: border-box;
15
16
  }
16
17
 
17
18
  .dataviews-view-list__item-actions {
@@ -44,13 +45,13 @@ ul.dataviews-view-list {
44
45
  &.is-selected.is-selected {
45
46
  border-top: 1px solid rgba(var(--wp-admin-theme-color--rgb), 0.12);
46
47
 
47
- & + li {
48
+ & + div[role="row"] {
48
49
  border-top: 1px solid rgba(var(--wp-admin-theme-color--rgb), 0.12);
49
50
  }
50
51
  }
51
52
 
52
53
  &:not(.is-selected) {
53
- .dataviews-view-list__primary-field {
54
+ .dataviews-view-list__title-field {
54
55
  color: $gray-900;
55
56
  }
56
57
  &:hover,
@@ -59,7 +60,7 @@ ul.dataviews-view-list {
59
60
  color: var(--wp-admin-theme-color);
60
61
  background-color: #f8f8f8;
61
62
 
62
- .dataviews-view-list__primary-field,
63
+ .dataviews-view-list__title-field,
63
64
  .dataviews-view-list__fields {
64
65
  color: var(--wp-admin-theme-color);
65
66
  }
@@ -68,13 +69,13 @@ ul.dataviews-view-list {
68
69
 
69
70
  }
70
71
 
71
- li.is-selected,
72
- li.is-selected:focus-within {
72
+ div[role="row"].is-selected,
73
+ div[role="row"].is-selected:focus-within {
73
74
  .dataviews-view-list__item-wrapper {
74
75
  background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
75
76
  color: $gray-900;
76
77
 
77
- .dataviews-view-list__primary-field,
78
+ .dataviews-view-list__title-field,
78
79
  .dataviews-view-list__fields {
79
80
  color: var(--wp-admin-theme-color);
80
81
  }
@@ -106,7 +107,7 @@ ul.dataviews-view-list {
106
107
  }
107
108
  }
108
109
  }
109
- .dataviews-view-list__primary-field {
110
+ .dataviews-view-list__title-field {
110
111
  flex: 1;
111
112
  min-height: $grid-unit-30;
112
113
  line-height: $grid-unit-30;