@wordpress/dataviews 4.4.6 → 4.6.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 (108) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +4 -0
  3. package/build/components/dataform-combined-edit/index.js +67 -0
  4. package/build/components/dataform-combined-edit/index.js.map +1 -0
  5. package/build/components/dataviews-bulk-actions/index.js +2 -2
  6. package/build/components/dataviews-bulk-actions/index.js.map +1 -1
  7. package/build/components/dataviews-filters/filter-summary.js +8 -8
  8. package/build/components/dataviews-filters/filter-summary.js.map +1 -1
  9. package/build/components/dataviews-filters/index.js +1 -1
  10. package/build/components/dataviews-filters/index.js.map +1 -1
  11. package/build/components/dataviews-filters/search-widget.js +1 -1
  12. package/build/components/dataviews-filters/search-widget.js.map +1 -1
  13. package/build/components/dataviews-item-actions/index.js.map +1 -1
  14. package/build/components/dataviews-selection-checkbox/index.js +1 -1
  15. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  16. package/build/components/dataviews-view-config/index.js +54 -43
  17. package/build/components/dataviews-view-config/index.js.map +1 -1
  18. package/build/dataforms-layouts/get-visible-fields.js +21 -0
  19. package/build/dataforms-layouts/get-visible-fields.js.map +1 -0
  20. package/build/dataforms-layouts/panel/index.js +2 -6
  21. package/build/dataforms-layouts/panel/index.js.map +1 -1
  22. package/build/dataforms-layouts/regular/index.js +2 -6
  23. package/build/dataforms-layouts/regular/index.js.map +1 -1
  24. package/build/dataviews-layouts/grid/index.js.map +1 -1
  25. package/build/dataviews-layouts/list/index.js +70 -75
  26. package/build/dataviews-layouts/list/index.js.map +1 -1
  27. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
  28. package/build/normalize-fields.js +21 -0
  29. package/build/normalize-fields.js.map +1 -1
  30. package/build/types.js.map +1 -1
  31. package/build/validation.js.map +1 -1
  32. package/build-module/components/dataform-combined-edit/index.js +60 -0
  33. package/build-module/components/dataform-combined-edit/index.js.map +1 -0
  34. package/build-module/components/dataviews/index.js +1 -2
  35. package/build-module/components/dataviews/index.js.map +1 -1
  36. package/build-module/components/dataviews-bulk-actions/index.js +3 -4
  37. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
  38. package/build-module/components/dataviews-filters/filter-summary.js +9 -10
  39. package/build-module/components/dataviews-filters/filter-summary.js.map +1 -1
  40. package/build-module/components/dataviews-filters/index.js +2 -3
  41. package/build-module/components/dataviews-filters/index.js.map +1 -1
  42. package/build-module/components/dataviews-filters/search-widget.js +2 -3
  43. package/build-module/components/dataviews-filters/search-widget.js.map +1 -1
  44. package/build-module/components/dataviews-footer/index.js +1 -2
  45. package/build-module/components/dataviews-footer/index.js.map +1 -1
  46. package/build-module/components/dataviews-item-actions/index.js +1 -3
  47. package/build-module/components/dataviews-item-actions/index.js.map +1 -1
  48. package/build-module/components/dataviews-pagination/index.js +1 -2
  49. package/build-module/components/dataviews-pagination/index.js.map +1 -1
  50. package/build-module/components/dataviews-selection-checkbox/index.js +1 -1
  51. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  52. package/build-module/components/dataviews-view-config/index.js +56 -47
  53. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  54. package/build-module/dataform-controls/datetime.js +1 -2
  55. package/build-module/dataform-controls/datetime.js.map +1 -1
  56. package/build-module/dataforms-layouts/get-visible-fields.js +14 -0
  57. package/build-module/dataforms-layouts/get-visible-fields.js.map +1 -0
  58. package/build-module/dataforms-layouts/panel/index.js +3 -9
  59. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  60. package/build-module/dataforms-layouts/regular/index.js +2 -6
  61. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  62. package/build-module/dataviews-layouts/grid/index.js +1 -3
  63. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  64. package/build-module/dataviews-layouts/list/index.js +71 -77
  65. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  66. package/build-module/dataviews-layouts/table/column-header-menu.js +1 -2
  67. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  68. package/build-module/dataviews-layouts/table/index.js +1 -3
  69. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  70. package/build-module/normalize-fields.js +20 -0
  71. package/build-module/normalize-fields.js.map +1 -1
  72. package/build-module/types.js.map +1 -1
  73. package/build-module/validation.js.map +1 -1
  74. package/build-style/style-rtl.css +50 -37
  75. package/build-style/style.css +50 -37
  76. package/build-types/components/dataform/stories/index.story.d.ts +23 -0
  77. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  78. package/build-types/components/dataform-combined-edit/index.d.ts +7 -0
  79. package/build-types/components/dataform-combined-edit/index.d.ts.map +1 -0
  80. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  81. package/build-types/dataforms-layouts/get-visible-fields.d.ts +3 -0
  82. package/build-types/dataforms-layouts/get-visible-fields.d.ts.map +1 -0
  83. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  84. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  85. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  86. package/build-types/normalize-fields.d.ts +9 -1
  87. package/build-types/normalize-fields.d.ts.map +1 -1
  88. package/build-types/types.d.ts +27 -8
  89. package/build-types/types.d.ts.map +1 -1
  90. package/build-types/validation.d.ts +1 -1
  91. package/build-types/validation.d.ts.map +1 -1
  92. package/package.json +12 -12
  93. package/src/components/dataform/stories/index.story.tsx +65 -0
  94. package/src/components/dataform-combined-edit/index.tsx +66 -0
  95. package/src/components/dataform-combined-edit/style.scss +12 -0
  96. package/src/components/dataviews-filters/style.scss +0 -1
  97. package/src/components/dataviews-view-config/index.tsx +53 -41
  98. package/src/components/dataviews-view-config/style.scss +5 -8
  99. package/src/dataforms-layouts/get-visible-fields.ts +29 -0
  100. package/src/dataforms-layouts/panel/index.tsx +8 -7
  101. package/src/dataforms-layouts/regular/index.tsx +8 -7
  102. package/src/dataviews-layouts/list/index.tsx +81 -100
  103. package/src/dataviews-layouts/list/style.scss +32 -43
  104. package/src/normalize-fields.ts +33 -1
  105. package/src/style.scss +1 -0
  106. package/src/types.ts +29 -9
  107. package/src/validation.ts +1 -1
  108. package/tsconfig.tsbuildinfo +1 -1
@@ -7,6 +7,7 @@ import { useState } from '@wordpress/element';
7
7
  * Internal dependencies
8
8
  */
9
9
  import DataForm from '../index';
10
+ import type { CombinedFormField } from '../../../types';
10
11
 
11
12
  const meta = {
12
13
  title: 'DataViews/DataForm',
@@ -76,6 +77,11 @@ const fields = [
76
77
  { value: 'published', label: 'Published' },
77
78
  ],
78
79
  },
80
+ {
81
+ id: 'password',
82
+ label: 'Password',
83
+ type: 'text' as const,
84
+ },
79
85
  ];
80
86
 
81
87
  export const Default = ( { type }: { type: 'panel' | 'regular' } ) => {
@@ -118,3 +124,62 @@ export const Default = ( { type }: { type: 'panel' | 'regular' } ) => {
118
124
  />
119
125
  );
120
126
  };
127
+
128
+ const CombinedFieldsComponent = ( {
129
+ type = 'regular',
130
+ combinedFieldDirection = 'vertical',
131
+ }: {
132
+ type: 'panel' | 'regular';
133
+ combinedFieldDirection: 'vertical' | 'horizontal';
134
+ } ) => {
135
+ const [ post, setPost ] = useState( {
136
+ title: 'Hello, World!',
137
+ order: 2,
138
+ author: 1,
139
+ status: 'draft',
140
+ } );
141
+
142
+ const form = {
143
+ fields: [ 'title', 'status_and_visibility', 'order', 'author' ],
144
+ combinedFields: [
145
+ {
146
+ id: 'status_and_visibility',
147
+ label: 'Status & Visibility',
148
+ children: [ 'status', 'password' ],
149
+ direction: combinedFieldDirection,
150
+ render: ( { item } ) => item.status,
151
+ },
152
+ ] as CombinedFormField< any >[],
153
+ };
154
+
155
+ return (
156
+ <DataForm
157
+ data={ post }
158
+ fields={ fields }
159
+ form={ {
160
+ ...form,
161
+ type,
162
+ } }
163
+ onChange={ ( edits ) =>
164
+ setPost( ( prev ) => ( {
165
+ ...prev,
166
+ ...edits,
167
+ } ) )
168
+ }
169
+ />
170
+ );
171
+ };
172
+
173
+ export const CombinedFields = {
174
+ title: 'DataViews/CombinedFields',
175
+ render: CombinedFieldsComponent,
176
+ argTypes: {
177
+ ...meta.argTypes,
178
+ combinedFieldDirection: {
179
+ control: { type: 'select' },
180
+ description:
181
+ 'Chooses the direction of the combined field. "vertical" is the default layout.',
182
+ options: [ 'vertical', 'horizontal' ],
183
+ },
184
+ },
185
+ };
@@ -0,0 +1,66 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ __experimentalHStack as HStack,
6
+ __experimentalVStack as VStack,
7
+ __experimentalHeading as Heading,
8
+ __experimentalSpacer as Spacer,
9
+ } from '@wordpress/components';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import type { DataFormCombinedEditProps, NormalizedField } from '../../types';
15
+
16
+ function Header( { title }: { title: string } ) {
17
+ return (
18
+ <VStack className="dataforms-layouts__dropdown-header" spacing={ 4 }>
19
+ <HStack alignment="center">
20
+ <Heading level={ 2 } size={ 13 }>
21
+ { title }
22
+ </Heading>
23
+ <Spacer />
24
+ </HStack>
25
+ </VStack>
26
+ );
27
+ }
28
+
29
+ function DataFormCombinedEdit< Item >( {
30
+ field,
31
+ data,
32
+ onChange,
33
+ hideLabelFromVision,
34
+ }: DataFormCombinedEditProps< Item > ) {
35
+ const className = 'dataforms-combined-edit';
36
+ const visibleChildren = ( field.children ?? [] )
37
+ .map( ( fieldId ) => field.fields.find( ( { id } ) => id === fieldId ) )
38
+ .filter(
39
+ ( childField ): childField is NormalizedField< Item > =>
40
+ !! childField
41
+ );
42
+ const children = visibleChildren.map( ( child ) => {
43
+ return (
44
+ <div className="dataforms-combined-edit__field" key={ child.id }>
45
+ <child.Edit
46
+ data={ data }
47
+ field={ child }
48
+ onChange={ onChange }
49
+ />
50
+ </div>
51
+ );
52
+ } );
53
+
54
+ const Stack = field.direction === 'horizontal' ? HStack : VStack;
55
+
56
+ return (
57
+ <>
58
+ { ! hideLabelFromVision && <Header title={ field.label } /> }
59
+ <Stack spacing={ 4 } className={ className } as="fieldset">
60
+ { children }
61
+ </Stack>
62
+ </>
63
+ );
64
+ }
65
+
66
+ export default DataFormCombinedEdit;
@@ -0,0 +1,12 @@
1
+ .dataforms-layouts-panel__field-dropdown {
2
+ .dataforms-combined-edit {
3
+ border: none;
4
+ padding: 0;
5
+ }
6
+ }
7
+
8
+ .dataforms-combined-edit {
9
+ &__field {
10
+ flex: 1 1 auto;
11
+ }
12
+ }
@@ -160,7 +160,6 @@
160
160
  }
161
161
 
162
162
  .dataviews-filters__search-widget-listbox {
163
- max-height: $grid-unit * 23;
164
163
  padding: $grid-unit-05;
165
164
  overflow: auto;
166
165
  }
@@ -8,6 +8,7 @@ import type { ChangeEvent } from 'react';
8
8
  */
9
9
  import {
10
10
  Button,
11
+ __experimentalDropdownContentWrapper as DropdownContentWrapper,
11
12
  Dropdown,
12
13
  __experimentalToggleGroupControl as ToggleGroupControl,
13
14
  __experimentalToggleGroupControlOption as ToggleGroupControlOption,
@@ -27,6 +28,7 @@ import { __, _x, sprintf } from '@wordpress/i18n';
27
28
  import { memo, useContext, useMemo } from '@wordpress/element';
28
29
  import { chevronDown, chevronUp, cog, seen, unseen } from '@wordpress/icons';
29
30
  import warning from '@wordpress/warning';
31
+ import { useInstanceId } from '@wordpress/compose';
30
32
 
31
33
  /**
32
34
  * Internal dependencies
@@ -55,6 +57,8 @@ interface ViewTypeMenuProps {
55
57
  defaultLayouts?: SupportedLayouts;
56
58
  }
57
59
 
60
+ const DATAVIEWS_CONFIG_POPOVER_PROPS = { placement: 'bottom-end', offset: 9 };
61
+
58
62
  function ViewTypeMenu( {
59
63
  defaultLayouts = { list: {}, grid: {}, table: {} },
60
64
  }: ViewTypeMenuProps ) {
@@ -354,7 +358,7 @@ function FieldItem( {
354
358
  }
355
359
  }, 50 );
356
360
  } }
357
- icon={ isVisible ? seen : unseen }
361
+ icon={ isVisible ? unseen : seen }
358
362
  label={
359
363
  isVisible
360
364
  ? sprintf(
@@ -510,7 +514,7 @@ function SettingsSection( {
510
514
  );
511
515
  }
512
516
 
513
- function DataviewsViewConfigContent( {
517
+ function DataviewsViewConfigDropdown( {
514
518
  density,
515
519
  setDensity,
516
520
  }: {
@@ -518,25 +522,52 @@ function DataviewsViewConfigContent( {
518
522
  setDensity: React.Dispatch< React.SetStateAction< number > >;
519
523
  } ) {
520
524
  const { view } = useContext( DataViewsContext );
525
+ const popoverId = useInstanceId(
526
+ _DataViewsViewConfig,
527
+ 'dataviews-view-config-dropdown'
528
+ );
529
+
521
530
  return (
522
- <VStack className="dataviews-view-config" spacing={ 6 }>
523
- <SettingsSection title={ __( 'Appearance' ) }>
524
- <HStack expanded className="is-divided-in-two">
525
- <SortFieldControl />
526
- <SortDirectionControl />
527
- </HStack>
528
- { view.type === LAYOUT_GRID && (
529
- <DensityPicker
530
- density={ density }
531
- setDensity={ setDensity }
531
+ <Dropdown
532
+ popoverProps={ {
533
+ ...DATAVIEWS_CONFIG_POPOVER_PROPS,
534
+ id: popoverId,
535
+ } }
536
+ renderToggle={ ( { onToggle, isOpen } ) => {
537
+ return (
538
+ <Button
539
+ size="compact"
540
+ icon={ cog }
541
+ label={ _x( 'View options', 'View is used as a noun' ) }
542
+ onClick={ onToggle }
543
+ aria-expanded={ isOpen ? 'true' : 'false' }
544
+ aria-controls={ popoverId }
532
545
  />
533
- ) }
534
- <ItemsPerPageControl />
535
- </SettingsSection>
536
- <SettingsSection title={ __( 'Properties' ) }>
537
- <FieldControl />
538
- </SettingsSection>
539
- </VStack>
546
+ );
547
+ } }
548
+ renderContent={ () => (
549
+ <DropdownContentWrapper paddingSize="medium">
550
+ <VStack className="dataviews-view-config" spacing={ 6 }>
551
+ <SettingsSection title={ __( 'Appearance' ) }>
552
+ <HStack expanded className="is-divided-in-two">
553
+ <SortFieldControl />
554
+ <SortDirectionControl />
555
+ </HStack>
556
+ { view.type === LAYOUT_GRID && (
557
+ <DensityPicker
558
+ density={ density }
559
+ setDensity={ setDensity }
560
+ />
561
+ ) }
562
+ <ItemsPerPageControl />
563
+ </SettingsSection>
564
+ <SettingsSection title={ __( 'Properties' ) }>
565
+ <FieldControl />
566
+ </SettingsSection>
567
+ </VStack>
568
+ </DropdownContentWrapper>
569
+ ) }
570
+ />
540
571
  );
541
572
  }
542
573
 
@@ -552,28 +583,9 @@ function _DataViewsViewConfig( {
552
583
  return (
553
584
  <>
554
585
  <ViewTypeMenu defaultLayouts={ defaultLayouts } />
555
- <Dropdown
556
- popoverProps={ { placement: 'bottom-end', offset: 9 } }
557
- contentClassName="dataviews-view-config"
558
- renderToggle={ ( { onToggle } ) => {
559
- return (
560
- <Button
561
- size="compact"
562
- icon={ cog }
563
- label={ _x(
564
- 'View options',
565
- 'View is used as a noun'
566
- ) }
567
- onClick={ onToggle }
568
- />
569
- );
570
- } }
571
- renderContent={ () => (
572
- <DataviewsViewConfigContent
573
- density={ density }
574
- setDensity={ setDensity }
575
- />
576
- ) }
586
+ <DataviewsViewConfigDropdown
587
+ density={ density }
588
+ setDensity={ setDensity }
577
589
  />
578
590
  </>
579
591
  );
@@ -1,12 +1,9 @@
1
1
  .dataviews-view-config {
2
- .components-popover__content {
3
- width: 320px;
4
- /* stylelint-disable-next-line property-no-unknown -- the linter needs to be updated to accepted the container-type property */
5
- container-type: inline-size;
6
- padding: $grid-unit-20;
7
- font-size: $default-font-size;
8
- line-height: $default-line-height;
9
- }
2
+ width: 320px;
3
+ /* stylelint-disable-next-line property-no-unknown -- the linter needs to be updated to accepted the container-type property */
4
+ container-type: inline-size;
5
+ font-size: $default-font-size;
6
+ line-height: $default-line-height;
10
7
  }
11
8
 
12
9
  .dataviews-view-config__sort-direction .components-toggle-group-control-option-base {
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { normalizeCombinedFields } from '../normalize-fields';
5
+ import type {
6
+ Field,
7
+ CombinedFormField,
8
+ NormalizedCombinedFormField,
9
+ } from '../types';
10
+
11
+ export function getVisibleFields< Item >(
12
+ fields: Field< Item >[],
13
+ formFields: string[] = [],
14
+ combinedFields?: CombinedFormField< Item >[]
15
+ ): Field< Item >[] {
16
+ const visibleFields: Array<
17
+ Field< Item > | NormalizedCombinedFormField< Item >
18
+ > = [ ...fields ];
19
+ if ( combinedFields ) {
20
+ visibleFields.push(
21
+ ...normalizeCombinedFields( combinedFields, fields )
22
+ );
23
+ }
24
+ return formFields
25
+ .map( ( fieldId ) =>
26
+ visibleFields.find( ( { id } ) => id === fieldId )
27
+ )
28
+ .filter( ( field ): field is Field< Item > => !! field );
29
+ }
@@ -17,7 +17,8 @@ import { closeSmall } from '@wordpress/icons';
17
17
  * Internal dependencies
18
18
  */
19
19
  import { normalizeFields } from '../../normalize-fields';
20
- import type { DataFormProps, NormalizedField, Field } from '../../types';
20
+ import { getVisibleFields } from '../get-visible-fields';
21
+ import type { DataFormProps, NormalizedField } from '../../types';
21
22
 
22
23
  interface FormFieldProps< Item > {
23
24
  data: Item;
@@ -142,13 +143,13 @@ export default function FormPanel< Item >( {
142
143
  const visibleFields = useMemo(
143
144
  () =>
144
145
  normalizeFields(
145
- ( form.fields ?? [] )
146
- .map( ( fieldId ) =>
147
- fields.find( ( { id } ) => id === fieldId )
148
- )
149
- .filter( ( field ): field is Field< Item > => !! field )
146
+ getVisibleFields< Item >(
147
+ fields,
148
+ form.fields,
149
+ form.combinedFields
150
+ )
150
151
  ),
151
- [ fields, form.fields ]
152
+ [ fields, form.fields, form.combinedFields ]
152
153
  );
153
154
 
154
155
  return (
@@ -8,7 +8,8 @@ import { useMemo } from '@wordpress/element';
8
8
  * Internal dependencies
9
9
  */
10
10
  import { normalizeFields } from '../../normalize-fields';
11
- import type { DataFormProps, Field } from '../../types';
11
+ import { getVisibleFields } from '../get-visible-fields';
12
+ import type { DataFormProps } from '../../types';
12
13
 
13
14
  export default function FormRegular< Item >( {
14
15
  data,
@@ -19,13 +20,13 @@ export default function FormRegular< Item >( {
19
20
  const visibleFields = useMemo(
20
21
  () =>
21
22
  normalizeFields(
22
- ( form.fields ?? [] )
23
- .map( ( fieldId ) =>
24
- fields.find( ( { id } ) => id === fieldId )
25
- )
26
- .filter( ( field ): field is Field< Item > => !! field )
23
+ getVisibleFields< Item >(
24
+ fields,
25
+ form.fields,
26
+ form.combinedFields
27
+ )
27
28
  ),
28
- [ fields, form.fields ]
29
+ [ fields, form.fields, form.combinedFields ]
29
30
  );
30
31
 
31
32
  return (
@@ -145,11 +145,9 @@ function ListItem< Item >( {
145
145
  const descriptionId = `${ idPrefix }-description`;
146
146
 
147
147
  const [ isHovered, setIsHovered ] = useState( false );
148
- const handleMouseEnter = () => {
149
- setIsHovered( true );
150
- };
151
- const handleMouseLeave = () => {
152
- setIsHovered( false );
148
+ const handleHover: React.MouseEventHandler = ( { type } ) => {
149
+ const isHover = type === 'mouseenter';
150
+ setIsHovered( isHover );
153
151
  };
154
152
 
155
153
  useEffect( () => {
@@ -187,6 +185,45 @@ function ListItem< Item >( {
187
185
  <primaryField.render item={ item } />
188
186
  ) : null;
189
187
 
188
+ const usedActions = eligibleActions?.length > 0 && (
189
+ <HStack spacing={ 3 } className="dataviews-view-list__item-actions">
190
+ { primaryAction && (
191
+ <PrimaryActionGridCell
192
+ idPrefix={ idPrefix }
193
+ primaryAction={ primaryAction }
194
+ item={ item }
195
+ />
196
+ ) }
197
+ <div role="gridcell">
198
+ <DropdownMenu
199
+ trigger={
200
+ <Composite.Item
201
+ id={ generateDropdownTriggerCompositeId(
202
+ idPrefix
203
+ ) }
204
+ render={
205
+ <Button
206
+ size="small"
207
+ icon={ moreVertical }
208
+ label={ __( 'Actions' ) }
209
+ accessibleWhenDisabled
210
+ disabled={ ! actions.length }
211
+ onKeyDown={ onDropdownTriggerKeyDown }
212
+ />
213
+ }
214
+ />
215
+ }
216
+ placement="bottom-end"
217
+ >
218
+ <ActionsDropdownMenuGroup
219
+ actions={ eligibleActions }
220
+ item={ item }
221
+ />
222
+ </DropdownMenu>
223
+ </div>
224
+ </HStack>
225
+ );
226
+
190
227
  return (
191
228
  <Composite.Row
192
229
  ref={ itemRef }
@@ -196,116 +233,60 @@ function ListItem< Item >( {
196
233
  'is-selected': isSelected,
197
234
  'is-hovered': isHovered,
198
235
  } ) }
199
- onMouseEnter={ handleMouseEnter }
200
- onMouseLeave={ handleMouseLeave }
236
+ onMouseEnter={ handleHover }
237
+ onMouseLeave={ handleHover }
201
238
  >
202
- <HStack
203
- className="dataviews-view-list__item-wrapper"
204
- alignment="center"
205
- spacing={ 0 }
206
- >
239
+ <HStack className="dataviews-view-list__item-wrapper" spacing={ 0 }>
207
240
  <div role="gridcell">
208
241
  <Composite.Item
209
- render={ <div /> }
210
- role="button"
211
242
  id={ generateItemWrapperCompositeId( idPrefix ) }
212
243
  aria-pressed={ isSelected }
213
244
  aria-labelledby={ labelId }
214
245
  aria-describedby={ descriptionId }
215
246
  className="dataviews-view-list__item"
216
247
  onClick={ () => onSelect( item ) }
248
+ />
249
+ </div>
250
+ <HStack spacing={ 3 } justify="start" alignment="flex-start">
251
+ <div className="dataviews-view-list__media-wrapper">
252
+ { renderedMediaField }
253
+ </div>
254
+ <VStack
255
+ spacing={ 1 }
256
+ className="dataviews-view-list__field-wrapper"
217
257
  >
218
- <HStack
219
- spacing={ 3 }
220
- justify="start"
221
- alignment="flex-start"
222
- >
223
- <div className="dataviews-view-list__media-wrapper">
224
- { renderedMediaField }
225
- </div>
226
- <VStack
227
- spacing={ 1 }
228
- className="dataviews-view-list__field-wrapper"
258
+ <HStack spacing={ 0 }>
259
+ <div
260
+ className="dataviews-view-list__primary-field"
261
+ id={ labelId }
229
262
  >
230
- <span
231
- className="dataviews-view-list__primary-field"
232
- id={ labelId }
233
- >
234
- { renderedPrimaryField }
235
- </span>
263
+ { renderedPrimaryField }
264
+ </div>
265
+ { usedActions }
266
+ </HStack>
267
+ <div
268
+ className="dataviews-view-list__fields"
269
+ id={ descriptionId }
270
+ >
271
+ { visibleFields.map( ( field ) => (
236
272
  <div
237
- className="dataviews-view-list__fields"
238
- id={ descriptionId }
273
+ key={ field.id }
274
+ className="dataviews-view-list__field"
239
275
  >
240
- { visibleFields.map( ( field ) => (
241
- <div
242
- key={ field.id }
243
- className="dataviews-view-list__field"
244
- >
245
- <VisuallyHidden
246
- as="span"
247
- className="dataviews-view-list__field-label"
248
- >
249
- { field.label }
250
- </VisuallyHidden>
251
- <span className="dataviews-view-list__field-value">
252
- <field.render item={ item } />
253
- </span>
254
- </div>
255
- ) ) }
276
+ <VisuallyHidden
277
+ as="span"
278
+ className="dataviews-view-list__field-label"
279
+ >
280
+ { field.label }
281
+ </VisuallyHidden>
282
+ <span className="dataviews-view-list__field-value">
283
+ <field.render item={ item } />
284
+ </span>
256
285
  </div>
257
- </VStack>
258
- </HStack>
259
- </Composite.Item>
260
- </div>
261
- { eligibleActions?.length > 0 && (
262
- <HStack
263
- spacing={ 3 }
264
- justify="flex-end"
265
- className="dataviews-view-list__item-actions"
266
- style={ {
267
- flexShrink: '0',
268
- width: 'auto',
269
- } }
270
- >
271
- { primaryAction && (
272
- <PrimaryActionGridCell
273
- idPrefix={ idPrefix }
274
- primaryAction={ primaryAction }
275
- item={ item }
276
- />
277
- ) }
278
- <div role="gridcell">
279
- <DropdownMenu
280
- trigger={
281
- <Composite.Item
282
- id={ generateDropdownTriggerCompositeId(
283
- idPrefix
284
- ) }
285
- render={
286
- <Button
287
- size="small"
288
- icon={ moreVertical }
289
- label={ __( 'Actions' ) }
290
- accessibleWhenDisabled
291
- disabled={ ! actions.length }
292
- onKeyDown={
293
- onDropdownTriggerKeyDown
294
- }
295
- />
296
- }
297
- />
298
- }
299
- placement="bottom-end"
300
- >
301
- <ActionsDropdownMenuGroup
302
- actions={ eligibleActions }
303
- item={ item }
304
- />
305
- </DropdownMenu>
286
+ ) ) }
306
287
  </div>
307
- </HStack>
308
- ) }
288
+ </VStack>
289
+ </HStack>
309
290
  </HStack>
310
291
  </Composite.Row>
311
292
  );