@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
@@ -27,7 +27,6 @@ import type {
27
27
  ViewTable as ViewTableType,
28
28
  Operator,
29
29
  } from '../../types';
30
- import { getVisibleFieldIds } from '../index';
31
30
 
32
31
  const { Menu } = unlock( componentsPrivateApis );
33
32
 
@@ -38,6 +37,7 @@ interface HeaderMenuProps< Item > {
38
37
  onChangeView: ( view: ViewTableType ) => void;
39
38
  onHide: ( field: NormalizedField< Item > ) => void;
40
39
  setOpenedFilter: ( fieldId: string ) => void;
40
+ canMove?: boolean;
41
41
  }
42
42
 
43
43
  function WithMenuSeparators( { children }: { children: ReactNode } ) {
@@ -59,194 +59,206 @@ const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
59
59
  onChangeView,
60
60
  onHide,
61
61
  setOpenedFilter,
62
+ canMove = true,
62
63
  }: HeaderMenuProps< Item >,
63
64
  ref: Ref< HTMLButtonElement >
64
65
  ) {
65
- const visibleFieldIds = getVisibleFieldIds( view, fields );
66
+ const visibleFieldIds = view.fields ?? [];
66
67
  const index = visibleFieldIds?.indexOf( fieldId ) as number;
67
68
  const isSorted = view.sort?.field === fieldId;
68
69
  let isHidable = false;
69
70
  let isSortable = false;
70
71
  let canAddFilter = false;
71
- let header;
72
72
  let operators: Operator[] = [];
73
-
74
- const combinedField = view.layout?.combinedFields?.find(
75
- ( f ) => f.id === fieldId
76
- );
77
73
  const field = fields.find( ( f ) => f.id === fieldId );
78
74
 
79
- if ( ! combinedField ) {
80
- if ( ! field ) {
81
- // No combined or regular field found.
82
- return null;
83
- }
75
+ if ( ! field ) {
76
+ // No combined or regular field found.
77
+ return null;
78
+ }
84
79
 
85
- isHidable = field.enableHiding !== false;
86
- isSortable = field.enableSorting !== false;
87
- header = field.header;
80
+ isHidable = field.enableHiding !== false;
81
+ isSortable = field.enableSorting !== false;
82
+ const header = field.header;
88
83
 
89
- operators = sanitizeOperators( field );
90
- // Filter can be added:
91
- // 1. If the field is not already part of a view's filters.
92
- // 2. If the field meets the type and operator requirements.
93
- // 3. If it's not primary. If it is, it should be already visible.
94
- canAddFilter =
95
- ! view.filters?.some( ( _filter ) => fieldId === _filter.field ) &&
96
- !! field.elements?.length &&
97
- !! operators.length &&
98
- ! field.filterBy?.isPrimary;
99
- } else {
100
- header = combinedField.header || combinedField.label;
101
- }
84
+ operators = sanitizeOperators( field );
85
+ // Filter can be added:
86
+ // 1. If the field is not already part of a view's filters.
87
+ // 2. If the field meets the type and operator requirements.
88
+ // 3. If it's not primary. If it is, it should be already visible.
89
+ canAddFilter =
90
+ ! view.filters?.some( ( _filter ) => fieldId === _filter.field ) &&
91
+ !! field.elements?.length &&
92
+ !! operators.length &&
93
+ ! field.filterBy?.isPrimary;
102
94
 
103
95
  return (
104
- <Menu
105
- align="start"
106
- trigger={
107
- <Button
108
- size="compact"
109
- className="dataviews-view-table-header-button"
110
- ref={ ref }
111
- variant="tertiary"
112
- >
113
- { header }
114
- { view.sort && isSorted && (
115
- <span aria-hidden="true">
116
- { sortArrows[ view.sort.direction ] }
117
- </span>
118
- ) }
119
- </Button>
120
- }
121
- style={ { minWidth: '240px' } }
122
- >
123
- <WithMenuSeparators>
124
- { isSortable && (
125
- <Menu.Group>
126
- { SORTING_DIRECTIONS.map(
127
- ( direction: SortDirection ) => {
128
- const isChecked =
129
- view.sort &&
130
- isSorted &&
131
- view.sort.direction === direction;
96
+ <Menu>
97
+ <Menu.TriggerButton
98
+ render={
99
+ <Button
100
+ size="compact"
101
+ className="dataviews-view-table-header-button"
102
+ ref={ ref }
103
+ variant="tertiary"
104
+ />
105
+ }
106
+ >
107
+ { header }
108
+ { view.sort && isSorted && (
109
+ <span aria-hidden="true">
110
+ { sortArrows[ view.sort.direction ] }
111
+ </span>
112
+ ) }
113
+ </Menu.TriggerButton>
114
+ <Menu.Popover style={ { minWidth: '240px' } }>
115
+ <WithMenuSeparators>
116
+ { isSortable && (
117
+ <Menu.Group>
118
+ { SORTING_DIRECTIONS.map(
119
+ ( direction: SortDirection ) => {
120
+ const isChecked =
121
+ view.sort &&
122
+ isSorted &&
123
+ view.sort.direction === direction;
132
124
 
133
- const value = `${ fieldId }-${ direction }`;
125
+ const value = `${ fieldId }-${ direction }`;
134
126
 
135
- return (
136
- <Menu.RadioItem
137
- key={ value }
138
- // All sorting radio items share the same name, so that
139
- // selecting a sorting option automatically deselects the
140
- // previously selected one, even if it is displayed in
141
- // another submenu. The field and direction are passed via
142
- // the `value` prop.
143
- name="view-table-sorting"
144
- value={ value }
145
- checked={ isChecked }
146
- onChange={ () => {
147
- onChangeView( {
148
- ...view,
149
- sort: {
150
- field: fieldId,
151
- direction,
152
- },
153
- } );
154
- } }
155
- >
156
- <Menu.ItemLabel>
157
- { sortLabels[ direction ] }
158
- </Menu.ItemLabel>
159
- </Menu.RadioItem>
160
- );
161
- }
162
- ) }
163
- </Menu.Group>
164
- ) }
165
- { canAddFilter && (
166
- <Menu.Group>
167
- <Menu.Item
168
- prefix={ <Icon icon={ funnel } /> }
169
- onClick={ () => {
170
- setOpenedFilter( fieldId );
171
- onChangeView( {
172
- ...view,
173
- page: 1,
174
- filters: [
175
- ...( view.filters || [] ),
176
- {
177
- field: fieldId,
178
- value: undefined,
179
- operator: operators[ 0 ],
180
- },
181
- ],
182
- } );
183
- } }
184
- >
185
- <Menu.ItemLabel>
186
- { __( 'Add filter' ) }
187
- </Menu.ItemLabel>
188
- </Menu.Item>
189
- </Menu.Group>
190
- ) }
191
- <Menu.Group>
192
- <Menu.Item
193
- prefix={ <Icon icon={ arrowLeft } /> }
194
- disabled={ index < 1 }
195
- onClick={ () => {
196
- onChangeView( {
197
- ...view,
198
- fields: [
199
- ...( visibleFieldIds.slice(
200
- 0,
201
- index - 1
202
- ) ?? [] ),
203
- fieldId,
204
- visibleFieldIds[ index - 1 ],
205
- ...visibleFieldIds.slice( index + 1 ),
206
- ],
207
- } );
208
- } }
209
- >
210
- <Menu.ItemLabel>{ __( 'Move left' ) }</Menu.ItemLabel>
211
- </Menu.Item>
212
- <Menu.Item
213
- prefix={ <Icon icon={ arrowRight } /> }
214
- disabled={ index >= visibleFieldIds.length - 1 }
215
- onClick={ () => {
216
- onChangeView( {
217
- ...view,
218
- fields: [
219
- ...( visibleFieldIds.slice( 0, index ) ??
220
- [] ),
221
- visibleFieldIds[ index + 1 ],
222
- fieldId,
223
- ...visibleFieldIds.slice( index + 2 ),
224
- ],
225
- } );
226
- } }
227
- >
228
- <Menu.ItemLabel>{ __( 'Move right' ) }</Menu.ItemLabel>
229
- </Menu.Item>
230
- { isHidable && field && (
231
- <Menu.Item
232
- prefix={ <Icon icon={ unseen } /> }
233
- onClick={ () => {
234
- onHide( field );
235
- onChangeView( {
236
- ...view,
237
- fields: visibleFieldIds.filter(
238
- ( id ) => id !== fieldId
239
- ),
240
- } );
241
- } }
242
- >
243
- <Menu.ItemLabel>
244
- { __( 'Hide column' ) }
245
- </Menu.ItemLabel>
246
- </Menu.Item>
127
+ return (
128
+ <Menu.RadioItem
129
+ key={ value }
130
+ // All sorting radio items share the same name, so that
131
+ // selecting a sorting option automatically deselects the
132
+ // previously selected one, even if it is displayed in
133
+ // another submenu. The field and direction are passed via
134
+ // the `value` prop.
135
+ name="view-table-sorting"
136
+ value={ value }
137
+ checked={ isChecked }
138
+ onChange={ () => {
139
+ onChangeView( {
140
+ ...view,
141
+ sort: {
142
+ field: fieldId,
143
+ direction,
144
+ },
145
+ showLevels: false,
146
+ } );
147
+ } }
148
+ >
149
+ <Menu.ItemLabel>
150
+ { sortLabels[ direction ] }
151
+ </Menu.ItemLabel>
152
+ </Menu.RadioItem>
153
+ );
154
+ }
155
+ ) }
156
+ </Menu.Group>
157
+ ) }
158
+ { canAddFilter && (
159
+ <Menu.Group>
160
+ <Menu.Item
161
+ prefix={ <Icon icon={ funnel } /> }
162
+ onClick={ () => {
163
+ setOpenedFilter( fieldId );
164
+ onChangeView( {
165
+ ...view,
166
+ page: 1,
167
+ filters: [
168
+ ...( view.filters || [] ),
169
+ {
170
+ field: fieldId,
171
+ value: undefined,
172
+ operator: operators[ 0 ],
173
+ },
174
+ ],
175
+ } );
176
+ } }
177
+ >
178
+ <Menu.ItemLabel>
179
+ { __( 'Add filter' ) }
180
+ </Menu.ItemLabel>
181
+ </Menu.Item>
182
+ </Menu.Group>
183
+ ) }
184
+ { ( canMove || isHidable ) && field && (
185
+ <Menu.Group>
186
+ { canMove && (
187
+ <Menu.Item
188
+ prefix={ <Icon icon={ arrowLeft } /> }
189
+ disabled={ index < 1 }
190
+ onClick={ () => {
191
+ onChangeView( {
192
+ ...view,
193
+ fields: [
194
+ ...( visibleFieldIds.slice(
195
+ 0,
196
+ index - 1
197
+ ) ?? [] ),
198
+ fieldId,
199
+ visibleFieldIds[ index - 1 ],
200
+ ...visibleFieldIds.slice(
201
+ index + 1
202
+ ),
203
+ ],
204
+ } );
205
+ } }
206
+ >
207
+ <Menu.ItemLabel>
208
+ { __( 'Move left' ) }
209
+ </Menu.ItemLabel>
210
+ </Menu.Item>
211
+ ) }
212
+ { canMove && (
213
+ <Menu.Item
214
+ prefix={ <Icon icon={ arrowRight } /> }
215
+ disabled={
216
+ index >= visibleFieldIds.length - 1
217
+ }
218
+ onClick={ () => {
219
+ onChangeView( {
220
+ ...view,
221
+ fields: [
222
+ ...( visibleFieldIds.slice(
223
+ 0,
224
+ index
225
+ ) ?? [] ),
226
+ visibleFieldIds[ index + 1 ],
227
+ fieldId,
228
+ ...visibleFieldIds.slice(
229
+ index + 2
230
+ ),
231
+ ],
232
+ } );
233
+ } }
234
+ >
235
+ <Menu.ItemLabel>
236
+ { __( 'Move right' ) }
237
+ </Menu.ItemLabel>
238
+ </Menu.Item>
239
+ ) }
240
+ { isHidable && field && (
241
+ <Menu.Item
242
+ prefix={ <Icon icon={ unseen } /> }
243
+ onClick={ () => {
244
+ onHide( field );
245
+ onChangeView( {
246
+ ...view,
247
+ fields: visibleFieldIds.filter(
248
+ ( id ) => id !== fieldId
249
+ ),
250
+ } );
251
+ } }
252
+ >
253
+ <Menu.ItemLabel>
254
+ { __( 'Hide column' ) }
255
+ </Menu.ItemLabel>
256
+ </Menu.Item>
257
+ ) }
258
+ </Menu.Group>
247
259
  ) }
248
- </Menu.Group>
249
- </WithMenuSeparators>
260
+ </WithMenuSeparators>
261
+ </Menu.Popover>
250
262
  </Menu>
251
263
  );
252
264
  } );
@@ -0,0 +1,65 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ __experimentalHStack as HStack,
6
+ __experimentalVStack as VStack,
7
+ } from '@wordpress/components';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import type { NormalizedField } from '../../types';
13
+ import getClickableItemProps from '../utils/get-clickable-item-props';
14
+
15
+ function ColumnPrimary< Item >( {
16
+ item,
17
+ level,
18
+ titleField,
19
+ mediaField,
20
+ descriptionField,
21
+ onClickItem,
22
+ isItemClickable,
23
+ }: {
24
+ item: Item;
25
+ level?: number;
26
+ titleField?: NormalizedField< Item >;
27
+ mediaField?: NormalizedField< Item >;
28
+ descriptionField?: NormalizedField< Item >;
29
+ onClickItem?: ( item: Item ) => void;
30
+ isItemClickable: ( item: Item ) => boolean;
31
+ } ) {
32
+ const clickableProps = getClickableItemProps( {
33
+ item,
34
+ isItemClickable,
35
+ onClickItem,
36
+ className:
37
+ 'dataviews-view-table__cell-content-wrapper dataviews-title-field',
38
+ } );
39
+ return (
40
+ <HStack spacing={ 3 } justify="flex-start">
41
+ { mediaField && (
42
+ <div className="dataviews-view-table__cell-content-wrapper dataviews-column-primary__media">
43
+ <mediaField.render item={ item } />
44
+ </div>
45
+ ) }
46
+ <VStack spacing={ 0 }>
47
+ { titleField && (
48
+ <div { ...clickableProps }>
49
+ { level !== undefined && (
50
+ <span className="dataviews-view-table__level">
51
+ { '—'.repeat( level ) }&nbsp;
52
+ </span>
53
+ ) }
54
+ <titleField.render item={ item } />
55
+ </div>
56
+ ) }
57
+ { descriptionField && (
58
+ <descriptionField.render item={ item } />
59
+ ) }
60
+ </VStack>
61
+ </HStack>
62
+ );
63
+ }
64
+
65
+ export default ColumnPrimary;