@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.
- package/CHANGELOG.md +6 -0
- package/README.md +4 -0
- package/build/components/dataform-combined-edit/index.js +67 -0
- package/build/components/dataform-combined-edit/index.js.map +1 -0
- package/build/components/dataviews-bulk-actions/index.js +2 -2
- package/build/components/dataviews-bulk-actions/index.js.map +1 -1
- package/build/components/dataviews-filters/filter-summary.js +8 -8
- package/build/components/dataviews-filters/filter-summary.js.map +1 -1
- package/build/components/dataviews-filters/index.js +1 -1
- package/build/components/dataviews-filters/index.js.map +1 -1
- package/build/components/dataviews-filters/search-widget.js +1 -1
- package/build/components/dataviews-filters/search-widget.js.map +1 -1
- package/build/components/dataviews-item-actions/index.js.map +1 -1
- package/build/components/dataviews-selection-checkbox/index.js +1 -1
- package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
- package/build/components/dataviews-view-config/index.js +54 -43
- package/build/components/dataviews-view-config/index.js.map +1 -1
- package/build/dataforms-layouts/get-visible-fields.js +21 -0
- package/build/dataforms-layouts/get-visible-fields.js.map +1 -0
- package/build/dataforms-layouts/panel/index.js +2 -6
- package/build/dataforms-layouts/panel/index.js.map +1 -1
- package/build/dataforms-layouts/regular/index.js +2 -6
- package/build/dataforms-layouts/regular/index.js.map +1 -1
- package/build/dataviews-layouts/grid/index.js.map +1 -1
- package/build/dataviews-layouts/list/index.js +70 -75
- package/build/dataviews-layouts/list/index.js.map +1 -1
- package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
- package/build/normalize-fields.js +21 -0
- package/build/normalize-fields.js.map +1 -1
- package/build/types.js.map +1 -1
- package/build/validation.js.map +1 -1
- package/build-module/components/dataform-combined-edit/index.js +60 -0
- package/build-module/components/dataform-combined-edit/index.js.map +1 -0
- package/build-module/components/dataviews/index.js +1 -2
- package/build-module/components/dataviews/index.js.map +1 -1
- package/build-module/components/dataviews-bulk-actions/index.js +3 -4
- package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
- package/build-module/components/dataviews-filters/filter-summary.js +9 -10
- package/build-module/components/dataviews-filters/filter-summary.js.map +1 -1
- package/build-module/components/dataviews-filters/index.js +2 -3
- package/build-module/components/dataviews-filters/index.js.map +1 -1
- package/build-module/components/dataviews-filters/search-widget.js +2 -3
- package/build-module/components/dataviews-filters/search-widget.js.map +1 -1
- package/build-module/components/dataviews-footer/index.js +1 -2
- package/build-module/components/dataviews-footer/index.js.map +1 -1
- package/build-module/components/dataviews-item-actions/index.js +1 -3
- package/build-module/components/dataviews-item-actions/index.js.map +1 -1
- package/build-module/components/dataviews-pagination/index.js +1 -2
- package/build-module/components/dataviews-pagination/index.js.map +1 -1
- package/build-module/components/dataviews-selection-checkbox/index.js +1 -1
- package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
- package/build-module/components/dataviews-view-config/index.js +56 -47
- package/build-module/components/dataviews-view-config/index.js.map +1 -1
- package/build-module/dataform-controls/datetime.js +1 -2
- package/build-module/dataform-controls/datetime.js.map +1 -1
- package/build-module/dataforms-layouts/get-visible-fields.js +14 -0
- package/build-module/dataforms-layouts/get-visible-fields.js.map +1 -0
- package/build-module/dataforms-layouts/panel/index.js +3 -9
- package/build-module/dataforms-layouts/panel/index.js.map +1 -1
- package/build-module/dataforms-layouts/regular/index.js +2 -6
- package/build-module/dataforms-layouts/regular/index.js.map +1 -1
- package/build-module/dataviews-layouts/grid/index.js +1 -3
- package/build-module/dataviews-layouts/grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/list/index.js +71 -77
- package/build-module/dataviews-layouts/list/index.js.map +1 -1
- package/build-module/dataviews-layouts/table/column-header-menu.js +1 -2
- package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
- package/build-module/dataviews-layouts/table/index.js +1 -3
- package/build-module/dataviews-layouts/table/index.js.map +1 -1
- package/build-module/normalize-fields.js +20 -0
- package/build-module/normalize-fields.js.map +1 -1
- package/build-module/types.js.map +1 -1
- package/build-module/validation.js.map +1 -1
- package/build-style/style-rtl.css +50 -37
- package/build-style/style.css +50 -37
- package/build-types/components/dataform/stories/index.story.d.ts +23 -0
- package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataform-combined-edit/index.d.ts +7 -0
- package/build-types/components/dataform-combined-edit/index.d.ts.map +1 -0
- package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/get-visible-fields.d.ts +3 -0
- package/build-types/dataforms-layouts/get-visible-fields.d.ts.map +1 -0
- package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
- package/build-types/normalize-fields.d.ts +9 -1
- package/build-types/normalize-fields.d.ts.map +1 -1
- package/build-types/types.d.ts +27 -8
- package/build-types/types.d.ts.map +1 -1
- package/build-types/validation.d.ts +1 -1
- package/build-types/validation.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/components/dataform/stories/index.story.tsx +65 -0
- package/src/components/dataform-combined-edit/index.tsx +66 -0
- package/src/components/dataform-combined-edit/style.scss +12 -0
- package/src/components/dataviews-filters/style.scss +0 -1
- package/src/components/dataviews-view-config/index.tsx +53 -41
- package/src/components/dataviews-view-config/style.scss +5 -8
- package/src/dataforms-layouts/get-visible-fields.ts +29 -0
- package/src/dataforms-layouts/panel/index.tsx +8 -7
- package/src/dataforms-layouts/regular/index.tsx +8 -7
- package/src/dataviews-layouts/list/index.tsx +81 -100
- package/src/dataviews-layouts/list/style.scss +32 -43
- package/src/normalize-fields.ts +33 -1
- package/src/style.scss +1 -0
- package/src/types.ts +29 -9
- package/src/validation.ts +1 -1
- 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;
|
|
@@ -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 ?
|
|
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
|
|
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
|
-
<
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
<
|
|
530
|
-
|
|
531
|
-
|
|
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
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
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
|
-
<
|
|
556
|
-
|
|
557
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
149
|
-
|
|
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={
|
|
200
|
-
onMouseLeave={
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
238
|
-
|
|
273
|
+
key={ field.id }
|
|
274
|
+
className="dataviews-view-list__field"
|
|
239
275
|
>
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
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
|
-
</
|
|
308
|
-
|
|
288
|
+
</VStack>
|
|
289
|
+
</HStack>
|
|
309
290
|
</HStack>
|
|
310
291
|
</Composite.Row>
|
|
311
292
|
);
|