@wordpress/dataviews 4.7.0 → 4.8.2-next.082ed6819.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 +9 -2
- package/README.md +793 -97
- package/build/components/dataform/index.js +20 -8
- package/build/components/dataform/index.js.map +1 -1
- package/build/components/dataform-context/index.js +33 -0
- package/build/components/dataform-context/index.js.map +1 -0
- package/build/components/dataviews/index.js +10 -7
- package/build/components/dataviews/index.js.map +1 -1
- package/build/components/dataviews-context/index.js +2 -1
- package/build/components/dataviews-context/index.js.map +1 -1
- package/build/components/dataviews-filters/index.js +49 -31
- package/build/components/dataviews-filters/index.js.map +1 -1
- package/build/components/dataviews-item-actions/index.js +46 -20
- package/build/components/dataviews-item-actions/index.js.map +1 -1
- package/build/components/dataviews-layout/index.js +5 -3
- package/build/components/dataviews-layout/index.js.map +1 -1
- package/build/components/dataviews-view-config/index.js +4 -15
- package/build/components/dataviews-view-config/index.js.map +1 -1
- package/build/components/form-field-visibility/index.js +32 -0
- package/build/components/form-field-visibility/index.js.map +1 -0
- package/build/dataforms-layouts/data-form-layout.js +59 -0
- package/build/dataforms-layouts/data-form-layout.js.map +1 -0
- package/build/dataforms-layouts/index.js +4 -4
- package/build/dataforms-layouts/index.js.map +1 -1
- package/build/dataforms-layouts/is-combined-field.js +14 -0
- package/build/dataforms-layouts/is-combined-field.js.map +1 -0
- package/build/dataforms-layouts/panel/index.js +158 -67
- package/build/dataforms-layouts/panel/index.js.map +1 -1
- package/build/dataforms-layouts/regular/index.js +86 -14
- package/build/dataforms-layouts/regular/index.js.map +1 -1
- package/build/dataviews-layouts/grid/index.js +18 -7
- package/build/dataviews-layouts/grid/index.js.map +1 -1
- package/build/dataviews-layouts/grid/{density-picker.js → preview-size-picker.js} +40 -24
- package/build/dataviews-layouts/grid/preview-size-picker.js.map +1 -0
- package/build/dataviews-layouts/index.js +6 -2
- package/build/dataviews-layouts/index.js.map +1 -1
- package/build/dataviews-layouts/list/index.js +3 -2
- package/build/dataviews-layouts/list/index.js.map +1 -1
- package/build/dataviews-layouts/table/density-picker.js +51 -0
- package/build/dataviews-layouts/table/density-picker.js.map +1 -0
- package/build/dataviews-layouts/table/index.js +26 -6
- package/build/dataviews-layouts/table/index.js.map +1 -1
- package/build/dataviews-layouts/utils/get-clickable-item-props.js +25 -0
- package/build/dataviews-layouts/utils/get-clickable-item-props.js.map +1 -0
- package/build/normalize-fields.js +16 -24
- package/build/normalize-fields.js.map +1 -1
- package/build/normalize-form-fields.js +36 -0
- package/build/normalize-form-fields.js.map +1 -0
- package/build/types.js.map +1 -1
- package/build/validation.js +9 -0
- package/build/validation.js.map +1 -1
- package/build-module/components/dataform/index.js +20 -8
- package/build-module/components/dataform/index.js.map +1 -1
- package/build-module/components/dataform-context/index.js +25 -0
- package/build-module/components/dataform-context/index.js.map +1 -0
- package/build-module/components/dataviews/index.js +11 -8
- package/build-module/components/dataviews/index.js.map +1 -1
- package/build-module/components/dataviews-context/index.js +2 -1
- package/build-module/components/dataviews-context/index.js.map +1 -1
- package/build-module/components/dataviews-filters/index.js +50 -32
- package/build-module/components/dataviews-filters/index.js.map +1 -1
- package/build-module/components/dataviews-item-actions/index.js +46 -20
- package/build-module/components/dataviews-item-actions/index.js.map +1 -1
- package/build-module/components/dataviews-layout/index.js +5 -3
- package/build-module/components/dataviews-layout/index.js.map +1 -1
- package/build-module/components/dataviews-view-config/index.js +5 -16
- package/build-module/components/dataviews-view-config/index.js.map +1 -1
- package/build-module/components/form-field-visibility/index.js +26 -0
- package/build-module/components/form-field-visibility/index.js.map +1 -0
- package/build-module/dataforms-layouts/data-form-layout.js +52 -0
- package/build-module/dataforms-layouts/data-form-layout.js.map +1 -0
- package/build-module/dataforms-layouts/index.js +7 -7
- package/build-module/dataforms-layouts/index.js.map +1 -1
- package/build-module/dataforms-layouts/is-combined-field.js +8 -0
- package/build-module/dataforms-layouts/is-combined-field.js.map +1 -0
- package/build-module/dataforms-layouts/panel/index.js +157 -66
- package/build-module/dataforms-layouts/panel/index.js.map +1 -1
- package/build-module/dataforms-layouts/regular/index.js +87 -15
- package/build-module/dataforms-layouts/regular/index.js.map +1 -1
- package/build-module/dataviews-layouts/grid/index.js +18 -7
- package/build-module/dataviews-layouts/grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/grid/{density-picker.js → preview-size-picker.js} +38 -24
- package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +1 -0
- package/build-module/dataviews-layouts/index.js +6 -2
- package/build-module/dataviews-layouts/index.js.map +1 -1
- package/build-module/dataviews-layouts/list/index.js +3 -2
- package/build-module/dataviews-layouts/list/index.js.map +1 -1
- package/build-module/dataviews-layouts/table/density-picker.js +43 -0
- package/build-module/dataviews-layouts/table/density-picker.js.map +1 -0
- package/build-module/dataviews-layouts/table/index.js +26 -6
- package/build-module/dataviews-layouts/table/index.js.map +1 -1
- package/build-module/dataviews-layouts/utils/get-clickable-item-props.js +19 -0
- package/build-module/dataviews-layouts/utils/get-clickable-item-props.js.map +1 -0
- package/build-module/normalize-fields.js +15 -23
- package/build-module/normalize-fields.js.map +1 -1
- package/build-module/normalize-form-fields.js +30 -0
- package/build-module/normalize-form-fields.js.map +1 -0
- package/build-module/types.js.map +1 -1
- package/build-module/validation.js +9 -0
- package/build-module/validation.js.map +1 -1
- package/build-style/style-rtl.css +65 -10
- package/build-style/style.css +65 -10
- package/build-types/components/dataform/index.d.ts +1 -1
- package/build-types/components/dataform/index.d.ts.map +1 -1
- package/build-types/components/dataform/stories/index.story.d.ts +18 -7
- package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataform-context/index.d.ts +13 -0
- package/build-types/components/dataform-context/index.d.ts.map +1 -0
- package/build-types/components/dataviews/index.d.ts +3 -1
- package/build-types/components/dataviews/index.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataviews-context/index.d.ts +2 -1
- package/build-types/components/dataviews-context/index.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/index.d.ts +1 -1
- package/build-types/components/dataviews-filters/index.d.ts.map +1 -1
- package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
- package/build-types/components/dataviews-view-config/index.d.ts +1 -3
- package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
- package/build-types/components/form-field-visibility/index.d.ts +11 -0
- package/build-types/components/form-field-visibility/index.d.ts.map +1 -0
- package/build-types/dataforms-layouts/data-form-layout.d.ts +16 -0
- package/build-types/dataforms-layouts/data-form-layout.d.ts.map +1 -0
- package/build-types/dataforms-layouts/index.d.ts +3 -3
- package/build-types/dataforms-layouts/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/is-combined-field.d.ts +6 -0
- package/build-types/dataforms-layouts/is-combined-field.d.ts.map +1 -0
- package/build-types/dataforms-layouts/panel/index.d.ts +5 -2
- package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/regular/index.d.ts +5 -2
- package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/grid/index.d.ts +1 -1
- package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/grid/preview-size-picker.d.ts +3 -0
- package/build-types/dataviews-layouts/grid/preview-size-picker.d.ts.map +1 -0
- package/build-types/dataviews-layouts/index.d.ts +5 -0
- package/build-types/dataviews-layouts/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/density-picker.d.ts +2 -0
- package/build-types/dataviews-layouts/table/density-picker.d.ts.map +1 -0
- package/build-types/dataviews-layouts/table/index.d.ts +1 -1
- package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts +14 -0
- package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts.map +1 -0
- package/build-types/lock-unlock.d.ts +1 -1
- package/build-types/lock-unlock.d.ts.map +1 -1
- package/build-types/normalize-fields.d.ts +1 -9
- package/build-types/normalize-fields.d.ts.map +1 -1
- package/build-types/normalize-form-fields.d.ts +12 -0
- package/build-types/normalize-form-fields.d.ts.map +1 -0
- package/build-types/types.d.ts +37 -22
- package/build-types/types.d.ts.map +1 -1
- package/build-types/validation.d.ts +10 -1
- package/build-types/validation.d.ts.map +1 -1
- package/package.json +10 -10
- package/src/components/dataform/index.tsx +22 -5
- package/src/components/dataform/stories/index.story.tsx +105 -50
- package/src/components/dataform-context/index.tsx +30 -0
- package/src/components/dataviews/index.tsx +12 -7
- package/src/components/dataviews/stories/fixtures.tsx +1 -0
- package/src/components/dataviews/stories/index.story.tsx +16 -3
- package/src/components/dataviews/style.scss +9 -3
- package/src/components/dataviews-context/index.ts +4 -2
- package/src/components/dataviews-filters/index.tsx +73 -38
- package/src/components/dataviews-item-actions/index.tsx +73 -25
- package/src/components/dataviews-layout/index.tsx +4 -2
- package/src/components/dataviews-view-config/index.tsx +7 -23
- package/src/components/form-field-visibility/index.tsx +32 -0
- package/src/dataforms-layouts/data-form-layout.tsx +87 -0
- package/src/dataforms-layouts/index.tsx +7 -7
- package/src/dataforms-layouts/is-combined-field.ts +10 -0
- package/src/dataforms-layouts/panel/index.tsx +190 -93
- package/src/dataforms-layouts/panel/style.scss +4 -0
- package/src/dataforms-layouts/regular/index.tsx +99 -29
- package/src/dataforms-layouts/regular/style.scss +30 -0
- package/src/dataviews-layouts/grid/index.tsx +34 -8
- package/src/dataviews-layouts/grid/{density-picker.tsx → preview-size-picker.tsx} +39 -26
- package/src/dataviews-layouts/grid/style.scss +8 -1
- package/src/dataviews-layouts/index.ts +4 -0
- package/src/dataviews-layouts/list/index.tsx +31 -27
- package/src/dataviews-layouts/table/density-picker.tsx +57 -0
- package/src/dataviews-layouts/table/index.tsx +46 -5
- package/src/dataviews-layouts/table/style.scss +32 -0
- package/src/dataviews-layouts/utils/get-clickable-item-props.ts +22 -0
- package/src/normalize-fields.ts +18 -35
- package/src/normalize-form-fields.ts +42 -0
- package/src/style.scss +1 -1
- package/src/test/normalize-fields.ts +45 -0
- package/src/types.ts +43 -21
- package/src/validation.ts +10 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/build/components/dataform-combined-edit/index.js +0 -67
- package/build/components/dataform-combined-edit/index.js.map +0 -1
- package/build/dataforms-layouts/get-visible-fields.js +0 -21
- package/build/dataforms-layouts/get-visible-fields.js.map +0 -1
- package/build/dataviews-layouts/grid/density-picker.js.map +0 -1
- package/build-module/components/dataform-combined-edit/index.js +0 -60
- package/build-module/components/dataform-combined-edit/index.js.map +0 -1
- package/build-module/dataforms-layouts/get-visible-fields.js +0 -14
- package/build-module/dataforms-layouts/get-visible-fields.js.map +0 -1
- package/build-module/dataviews-layouts/grid/density-picker.js.map +0 -1
- package/build-types/components/dataform-combined-edit/index.d.ts +0 -7
- package/build-types/components/dataform-combined-edit/index.d.ts.map +0 -1
- package/build-types/dataforms-layouts/get-visible-fields.d.ts +0 -3
- package/build-types/dataforms-layouts/get-visible-fields.d.ts.map +0 -1
- package/build-types/dataviews-layouts/grid/density-picker.d.ts +0 -5
- package/build-types/dataviews-layouts/grid/density-picker.d.ts.map +0 -1
- package/src/components/dataform-combined-edit/index.tsx +0 -66
- package/src/components/dataform-combined-edit/style.scss +0 -12
- package/src/dataforms-layouts/get-visible-fields.ts +0 -29
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Internal dependencies
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import FormRegularField from './regular';
|
|
5
|
+
import FormPanelField from './panel';
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const FORM_FIELD_LAYOUTS = [
|
|
8
8
|
{
|
|
9
9
|
type: 'regular',
|
|
10
|
-
component:
|
|
10
|
+
component: FormRegularField,
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
type: 'panel',
|
|
14
|
-
component:
|
|
14
|
+
component: FormPanelField,
|
|
15
15
|
},
|
|
16
16
|
];
|
|
17
17
|
|
|
18
|
-
export function
|
|
19
|
-
return
|
|
18
|
+
export function getFormFieldLayout( type: string ) {
|
|
19
|
+
return FORM_FIELD_LAYOUTS.find( ( layout ) => layout.type === type );
|
|
20
20
|
}
|
|
@@ -9,28 +9,29 @@ import {
|
|
|
9
9
|
Dropdown,
|
|
10
10
|
Button,
|
|
11
11
|
} from '@wordpress/components';
|
|
12
|
-
import { useState, useMemo } from '@wordpress/element';
|
|
13
12
|
import { sprintf, __, _x } from '@wordpress/i18n';
|
|
13
|
+
import { useState, useMemo, useContext } from '@wordpress/element';
|
|
14
14
|
import { closeSmall } from '@wordpress/icons';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Internal dependencies
|
|
18
18
|
*/
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
19
|
+
import type {
|
|
20
|
+
Form,
|
|
21
|
+
FormField,
|
|
22
|
+
FieldLayoutProps,
|
|
23
|
+
NormalizedField,
|
|
24
|
+
SimpleFormField,
|
|
25
|
+
} from '../../types';
|
|
26
|
+
import DataFormContext from '../../components/dataform-context';
|
|
27
|
+
import { DataFormLayout } from '../data-form-layout';
|
|
28
|
+
import { isCombinedField } from '../is-combined-field';
|
|
28
29
|
|
|
29
30
|
function DropdownHeader( {
|
|
30
31
|
title,
|
|
31
32
|
onClose,
|
|
32
33
|
}: {
|
|
33
|
-
title
|
|
34
|
+
title?: string;
|
|
34
35
|
onClose: () => void;
|
|
35
36
|
} ) {
|
|
36
37
|
return (
|
|
@@ -39,9 +40,11 @@ function DropdownHeader( {
|
|
|
39
40
|
spacing={ 4 }
|
|
40
41
|
>
|
|
41
42
|
<HStack alignment="center">
|
|
42
|
-
|
|
43
|
-
{
|
|
44
|
-
|
|
43
|
+
{ title && (
|
|
44
|
+
<Heading level={ 2 } size={ 13 }>
|
|
45
|
+
{ title }
|
|
46
|
+
</Heading>
|
|
47
|
+
) }
|
|
45
48
|
<Spacer />
|
|
46
49
|
{ onClose && (
|
|
47
50
|
<Button
|
|
@@ -56,16 +59,45 @@ function DropdownHeader( {
|
|
|
56
59
|
);
|
|
57
60
|
}
|
|
58
61
|
|
|
59
|
-
function
|
|
62
|
+
function PanelDropdown< Item >( {
|
|
63
|
+
fieldDefinition,
|
|
64
|
+
popoverAnchor,
|
|
65
|
+
labelPosition = 'side',
|
|
60
66
|
data,
|
|
61
|
-
field,
|
|
62
67
|
onChange,
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
field,
|
|
69
|
+
}: {
|
|
70
|
+
fieldDefinition: NormalizedField< Item >;
|
|
71
|
+
popoverAnchor: HTMLElement | null;
|
|
72
|
+
labelPosition: 'side' | 'top' | 'none';
|
|
73
|
+
data: Item;
|
|
74
|
+
onChange: ( value: any ) => void;
|
|
75
|
+
field: FormField;
|
|
76
|
+
} ) {
|
|
77
|
+
const fieldLabel = isCombinedField( field )
|
|
78
|
+
? field.label
|
|
79
|
+
: fieldDefinition?.label;
|
|
80
|
+
const form = useMemo( () => {
|
|
81
|
+
if ( isCombinedField( field ) ) {
|
|
82
|
+
return {
|
|
83
|
+
type: 'regular' as const,
|
|
84
|
+
fields: field.children.map( ( child ) => {
|
|
85
|
+
if ( typeof child === 'string' ) {
|
|
86
|
+
return {
|
|
87
|
+
id: child,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return child;
|
|
91
|
+
} ),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// If not explicit children return the field id itself.
|
|
95
|
+
return {
|
|
96
|
+
type: 'regular' as const,
|
|
97
|
+
fields: [ { id: field.id } ],
|
|
98
|
+
};
|
|
99
|
+
}, [ field ] );
|
|
100
|
+
|
|
69
101
|
// Memoize popoverProps to avoid returning a new object every time.
|
|
70
102
|
const popoverProps = useMemo(
|
|
71
103
|
() => ( {
|
|
@@ -80,90 +112,155 @@ function FormField< Item >( {
|
|
|
80
112
|
);
|
|
81
113
|
|
|
82
114
|
return (
|
|
83
|
-
<
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
aria-label={ sprintf(
|
|
107
|
-
// translators: %s: Field name.
|
|
108
|
-
_x( 'Edit %s', 'field' ),
|
|
109
|
-
field.label
|
|
110
|
-
) }
|
|
111
|
-
onClick={ onToggle }
|
|
112
|
-
>
|
|
113
|
-
<field.render item={ data } />
|
|
114
|
-
</Button>
|
|
115
|
+
<Dropdown
|
|
116
|
+
contentClassName="dataforms-layouts-panel__field-dropdown"
|
|
117
|
+
popoverProps={ popoverProps }
|
|
118
|
+
focusOnMount
|
|
119
|
+
toggleProps={ {
|
|
120
|
+
size: 'compact',
|
|
121
|
+
variant: 'tertiary',
|
|
122
|
+
tooltipPosition: 'middle left',
|
|
123
|
+
} }
|
|
124
|
+
renderToggle={ ( { isOpen, onToggle } ) => (
|
|
125
|
+
<Button
|
|
126
|
+
className="dataforms-layouts-panel__field-control"
|
|
127
|
+
size="compact"
|
|
128
|
+
variant={
|
|
129
|
+
[ 'none', 'top' ].includes( labelPosition )
|
|
130
|
+
? 'link'
|
|
131
|
+
: 'tertiary'
|
|
132
|
+
}
|
|
133
|
+
aria-expanded={ isOpen }
|
|
134
|
+
aria-label={ sprintf(
|
|
135
|
+
// translators: %s: Field name.
|
|
136
|
+
_x( 'Edit %s', 'field' ),
|
|
137
|
+
fieldLabel
|
|
115
138
|
) }
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
139
|
+
onClick={ onToggle }
|
|
140
|
+
>
|
|
141
|
+
<fieldDefinition.render item={ data } />
|
|
142
|
+
</Button>
|
|
143
|
+
) }
|
|
144
|
+
renderContent={ ( { onClose } ) => (
|
|
145
|
+
<>
|
|
146
|
+
<DropdownHeader title={ fieldLabel } onClose={ onClose } />
|
|
147
|
+
<DataFormLayout
|
|
148
|
+
data={ data }
|
|
149
|
+
form={ form as Form }
|
|
150
|
+
onChange={ onChange }
|
|
151
|
+
>
|
|
152
|
+
{ ( FieldLayout, nestedField ) => (
|
|
153
|
+
<FieldLayout
|
|
154
|
+
key={ nestedField.id }
|
|
124
155
|
data={ data }
|
|
125
|
-
field={
|
|
156
|
+
field={ nestedField }
|
|
126
157
|
onChange={ onChange }
|
|
127
|
-
hideLabelFromVision
|
|
158
|
+
hideLabelFromVision={
|
|
159
|
+
( form?.fields ?? [] ).length < 2
|
|
160
|
+
}
|
|
128
161
|
/>
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
162
|
+
) }
|
|
163
|
+
</DataFormLayout>
|
|
164
|
+
</>
|
|
165
|
+
) }
|
|
166
|
+
/>
|
|
134
167
|
);
|
|
135
168
|
}
|
|
136
169
|
|
|
137
|
-
export default function
|
|
170
|
+
export default function FormPanelField< Item >( {
|
|
138
171
|
data,
|
|
139
|
-
|
|
140
|
-
form,
|
|
172
|
+
field,
|
|
141
173
|
onChange,
|
|
142
|
-
}:
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
174
|
+
}: FieldLayoutProps< Item > ) {
|
|
175
|
+
const { fields } = useContext( DataFormContext );
|
|
176
|
+
const fieldDefinition = fields.find( ( fieldDef ) => {
|
|
177
|
+
// Default to the first child if it is a combined field.
|
|
178
|
+
if ( isCombinedField( field ) ) {
|
|
179
|
+
const children = field.children.filter(
|
|
180
|
+
( child ): child is string | SimpleFormField =>
|
|
181
|
+
typeof child === 'string' || ! isCombinedField( child )
|
|
182
|
+
);
|
|
183
|
+
const firstChildFieldId =
|
|
184
|
+
typeof children[ 0 ] === 'string'
|
|
185
|
+
? children[ 0 ]
|
|
186
|
+
: children[ 0 ].id;
|
|
187
|
+
return fieldDef.id === firstChildFieldId;
|
|
188
|
+
}
|
|
189
|
+
return fieldDef.id === field.id;
|
|
190
|
+
} );
|
|
191
|
+
const labelPosition = field.labelPosition ?? 'side';
|
|
192
|
+
|
|
193
|
+
// Use internal state instead of a ref to make sure that the component
|
|
194
|
+
// re-renders when the popover's anchor updates.
|
|
195
|
+
const [ popoverAnchor, setPopoverAnchor ] = useState< HTMLElement | null >(
|
|
196
|
+
null
|
|
153
197
|
);
|
|
154
198
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
199
|
+
if ( ! fieldDefinition ) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const fieldLabel = isCombinedField( field )
|
|
204
|
+
? field.label
|
|
205
|
+
: fieldDefinition?.label;
|
|
206
|
+
|
|
207
|
+
if ( labelPosition === 'top' ) {
|
|
208
|
+
return (
|
|
209
|
+
<VStack className="dataforms-layouts-panel__field" spacing={ 0 }>
|
|
210
|
+
<div
|
|
211
|
+
className="dataforms-layouts-panel__field-label"
|
|
212
|
+
style={ { paddingBottom: 0 } }
|
|
213
|
+
>
|
|
214
|
+
{ fieldLabel }
|
|
215
|
+
</div>
|
|
216
|
+
<div className="dataforms-layouts-panel__field-control">
|
|
217
|
+
<PanelDropdown
|
|
162
218
|
field={ field }
|
|
219
|
+
popoverAnchor={ popoverAnchor }
|
|
220
|
+
fieldDefinition={ fieldDefinition }
|
|
221
|
+
data={ data }
|
|
163
222
|
onChange={ onChange }
|
|
223
|
+
labelPosition={ labelPosition }
|
|
164
224
|
/>
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
225
|
+
</div>
|
|
226
|
+
</VStack>
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if ( labelPosition === 'none' ) {
|
|
231
|
+
return (
|
|
232
|
+
<div className="dataforms-layouts-panel__field">
|
|
233
|
+
<PanelDropdown
|
|
234
|
+
field={ field }
|
|
235
|
+
popoverAnchor={ popoverAnchor }
|
|
236
|
+
fieldDefinition={ fieldDefinition }
|
|
237
|
+
data={ data }
|
|
238
|
+
onChange={ onChange }
|
|
239
|
+
labelPosition={ labelPosition }
|
|
240
|
+
/>
|
|
241
|
+
</div>
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Defaults to label position side.
|
|
246
|
+
return (
|
|
247
|
+
<HStack
|
|
248
|
+
ref={ setPopoverAnchor }
|
|
249
|
+
className="dataforms-layouts-panel__field"
|
|
250
|
+
>
|
|
251
|
+
<div className="dataforms-layouts-panel__field-label">
|
|
252
|
+
{ fieldLabel }
|
|
253
|
+
</div>
|
|
254
|
+
<div className="dataforms-layouts-panel__field-control">
|
|
255
|
+
<PanelDropdown
|
|
256
|
+
field={ field }
|
|
257
|
+
popoverAnchor={ popoverAnchor }
|
|
258
|
+
fieldDefinition={ fieldDefinition }
|
|
259
|
+
data={ data }
|
|
260
|
+
onChange={ onChange }
|
|
261
|
+
labelPosition={ labelPosition }
|
|
262
|
+
/>
|
|
263
|
+
</div>
|
|
264
|
+
</HStack>
|
|
168
265
|
);
|
|
169
266
|
}
|
|
@@ -44,3 +44,7 @@
|
|
|
44
44
|
.dataforms-layouts-panel__dropdown-header {
|
|
45
45
|
margin-bottom: $grid-unit-20;
|
|
46
46
|
}
|
|
47
|
+
|
|
48
|
+
.components-popover.components-dropdown__content.dataforms-layouts-panel__field-dropdown {
|
|
49
|
+
z-index: z-index(".components-popover.components-dropdown__content.dataforms-layouts-panel__field-dropdown");
|
|
50
|
+
}
|
|
@@ -1,46 +1,116 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WordPress dependencies
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { useContext, useMemo } from '@wordpress/element';
|
|
5
|
+
import {
|
|
6
|
+
__experimentalHStack as HStack,
|
|
7
|
+
__experimentalVStack as VStack,
|
|
8
|
+
__experimentalHeading as Heading,
|
|
9
|
+
__experimentalSpacer as Spacer,
|
|
10
|
+
} from '@wordpress/components';
|
|
6
11
|
|
|
7
12
|
/**
|
|
8
13
|
* Internal dependencies
|
|
9
14
|
*/
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
import
|
|
15
|
+
import type { Form, FieldLayoutProps } from '../../types';
|
|
16
|
+
import DataFormContext from '../../components/dataform-context';
|
|
17
|
+
import { DataFormLayout } from '../data-form-layout';
|
|
18
|
+
import { isCombinedField } from '../is-combined-field';
|
|
13
19
|
|
|
14
|
-
|
|
20
|
+
function Header( { title }: { title: string } ) {
|
|
21
|
+
return (
|
|
22
|
+
<VStack className="dataforms-layouts-regular__header" spacing={ 4 }>
|
|
23
|
+
<HStack alignment="center">
|
|
24
|
+
<Heading level={ 2 } size={ 13 }>
|
|
25
|
+
{ title }
|
|
26
|
+
</Heading>
|
|
27
|
+
<Spacer />
|
|
28
|
+
</HStack>
|
|
29
|
+
</VStack>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default function FormRegularField< Item >( {
|
|
15
34
|
data,
|
|
16
|
-
|
|
17
|
-
form,
|
|
35
|
+
field,
|
|
18
36
|
onChange,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
hideLabelFromVision,
|
|
38
|
+
}: FieldLayoutProps< Item > ) {
|
|
39
|
+
const { fields } = useContext( DataFormContext );
|
|
40
|
+
|
|
41
|
+
const form = useMemo( () => {
|
|
42
|
+
if ( isCombinedField( field ) ) {
|
|
43
|
+
return {
|
|
44
|
+
fields: field.children.map( ( child ) => {
|
|
45
|
+
if ( typeof child === 'string' ) {
|
|
46
|
+
return {
|
|
47
|
+
id: child,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return child;
|
|
51
|
+
} ),
|
|
52
|
+
type: 'regular' as const,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
type: 'regular' as const,
|
|
58
|
+
fields: [],
|
|
59
|
+
};
|
|
60
|
+
}, [ field ] );
|
|
61
|
+
|
|
62
|
+
if ( isCombinedField( field ) ) {
|
|
63
|
+
return (
|
|
64
|
+
<>
|
|
65
|
+
{ ! hideLabelFromVision && field.label && (
|
|
66
|
+
<Header title={ field.label } />
|
|
67
|
+
) }
|
|
68
|
+
<DataFormLayout
|
|
69
|
+
data={ data }
|
|
70
|
+
form={ form as Form }
|
|
71
|
+
onChange={ onChange }
|
|
72
|
+
/>
|
|
73
|
+
</>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const labelPosition = field.labelPosition ?? 'top';
|
|
78
|
+
const fieldDefinition = fields.find(
|
|
79
|
+
( fieldDef ) => fieldDef.id === field.id
|
|
30
80
|
);
|
|
31
81
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
82
|
+
if ( ! fieldDefinition ) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
if ( labelPosition === 'side' ) {
|
|
86
|
+
return (
|
|
87
|
+
<HStack className="dataforms-layouts-regular__field">
|
|
88
|
+
<div className="dataforms-layouts-regular__field-label">
|
|
89
|
+
{ fieldDefinition.label }
|
|
90
|
+
</div>
|
|
91
|
+
<div className="dataforms-layouts-regular__field-control">
|
|
92
|
+
<fieldDefinition.Edit
|
|
93
|
+
key={ fieldDefinition.id }
|
|
38
94
|
data={ data }
|
|
39
|
-
field={
|
|
95
|
+
field={ fieldDefinition }
|
|
40
96
|
onChange={ onChange }
|
|
97
|
+
hideLabelFromVision
|
|
41
98
|
/>
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
99
|
+
</div>
|
|
100
|
+
</HStack>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<div className="dataforms-layouts-regular__field">
|
|
106
|
+
<fieldDefinition.Edit
|
|
107
|
+
data={ data }
|
|
108
|
+
field={ fieldDefinition }
|
|
109
|
+
onChange={ onChange }
|
|
110
|
+
hideLabelFromVision={
|
|
111
|
+
labelPosition === 'none' ? true : hideLabelFromVision
|
|
112
|
+
}
|
|
113
|
+
/>
|
|
114
|
+
</div>
|
|
45
115
|
);
|
|
46
116
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
.dataforms-layouts-regular__field {
|
|
2
|
+
width: 100%;
|
|
3
|
+
min-height: $grid-unit-40;
|
|
4
|
+
justify-content: flex-start !important;
|
|
5
|
+
align-items: flex-start !important;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.dataforms-layouts-regular__field .components-base-control__label {
|
|
9
|
+
font-size: inherit;
|
|
10
|
+
font-weight: normal;
|
|
11
|
+
text-transform: none;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.dataforms-layouts-regular__field-label {
|
|
15
|
+
width: 38%;
|
|
16
|
+
flex-shrink: 0;
|
|
17
|
+
min-height: $grid-unit-40;
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
padding: 6px 0; // Matches button to ensure alignment
|
|
21
|
+
line-height: $grid-unit-05 * 5;
|
|
22
|
+
hyphens: auto;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.dataforms-layouts-regular__field-control {
|
|
26
|
+
flex-grow: 1;
|
|
27
|
+
min-height: $grid-unit-40;
|
|
28
|
+
display: flex;
|
|
29
|
+
align-items: center;
|
|
30
|
+
}
|
|
@@ -24,11 +24,15 @@ import SingleSelectionCheckbox from '../../components/dataviews-selection-checkb
|
|
|
24
24
|
import { useHasAPossibleBulkAction } from '../../components/dataviews-bulk-actions';
|
|
25
25
|
import type { Action, NormalizedField, ViewGridProps } from '../../types';
|
|
26
26
|
import type { SetSelection } from '../../private-types';
|
|
27
|
+
import getClickableItemProps from '../utils/get-clickable-item-props';
|
|
28
|
+
import { useUpdatedPreviewSizeOnViewportChange } from './preview-size-picker';
|
|
27
29
|
|
|
28
30
|
interface GridItemProps< Item > {
|
|
29
31
|
selection: string[];
|
|
30
32
|
onChangeSelection: SetSelection;
|
|
31
33
|
getItemId: ( item: Item ) => string;
|
|
34
|
+
onClickItem: ( item: Item ) => void;
|
|
35
|
+
isItemClickable: ( item: Item ) => boolean;
|
|
32
36
|
item: Item;
|
|
33
37
|
actions: Action< Item >[];
|
|
34
38
|
mediaField?: NormalizedField< Item >;
|
|
@@ -41,6 +45,8 @@ interface GridItemProps< Item > {
|
|
|
41
45
|
function GridItem< Item >( {
|
|
42
46
|
selection,
|
|
43
47
|
onChangeSelection,
|
|
48
|
+
onClickItem,
|
|
49
|
+
isItemClickable,
|
|
44
50
|
getItemId,
|
|
45
51
|
item,
|
|
46
52
|
actions,
|
|
@@ -59,6 +65,21 @@ function GridItem< Item >( {
|
|
|
59
65
|
const renderedPrimaryField = primaryField?.render ? (
|
|
60
66
|
<primaryField.render item={ item } />
|
|
61
67
|
) : null;
|
|
68
|
+
|
|
69
|
+
const clickableMediaItemProps = getClickableItemProps(
|
|
70
|
+
item,
|
|
71
|
+
isItemClickable,
|
|
72
|
+
onClickItem,
|
|
73
|
+
'dataviews-view-grid__media'
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const clickablePrimaryItemProps = getClickableItemProps(
|
|
77
|
+
item,
|
|
78
|
+
isItemClickable,
|
|
79
|
+
onClickItem,
|
|
80
|
+
'dataviews-view-grid__primary-field'
|
|
81
|
+
);
|
|
82
|
+
|
|
62
83
|
return (
|
|
63
84
|
<VStack
|
|
64
85
|
spacing={ 0 }
|
|
@@ -81,9 +102,7 @@ function GridItem< Item >( {
|
|
|
81
102
|
}
|
|
82
103
|
} }
|
|
83
104
|
>
|
|
84
|
-
<div
|
|
85
|
-
{ renderedMediaField }
|
|
86
|
-
</div>
|
|
105
|
+
<div { ...clickableMediaItemProps }>{ renderedMediaField }</div>
|
|
87
106
|
<SingleSelectionCheckbox
|
|
88
107
|
item={ item }
|
|
89
108
|
selection={ selection }
|
|
@@ -96,9 +115,9 @@ function GridItem< Item >( {
|
|
|
96
115
|
justify="space-between"
|
|
97
116
|
className="dataviews-view-grid__title-actions"
|
|
98
117
|
>
|
|
99
|
-
<
|
|
118
|
+
<div { ...clickablePrimaryItemProps }>
|
|
100
119
|
{ renderedPrimaryField }
|
|
101
|
-
</
|
|
120
|
+
</div>
|
|
102
121
|
<ItemActions item={ item } actions={ actions } isCompact />
|
|
103
122
|
</HStack>
|
|
104
123
|
{ !! badgeFields?.length && (
|
|
@@ -170,9 +189,10 @@ export default function ViewGrid< Item >( {
|
|
|
170
189
|
getItemId,
|
|
171
190
|
isLoading,
|
|
172
191
|
onChangeSelection,
|
|
192
|
+
onClickItem,
|
|
193
|
+
isItemClickable,
|
|
173
194
|
selection,
|
|
174
195
|
view,
|
|
175
|
-
density,
|
|
176
196
|
}: ViewGridProps< Item > ) {
|
|
177
197
|
const mediaField = fields.find(
|
|
178
198
|
( field ) => field.id === view.layout?.mediaField
|
|
@@ -203,8 +223,12 @@ export default function ViewGrid< Item >( {
|
|
|
203
223
|
{ visibleFields: [], badgeFields: [] }
|
|
204
224
|
);
|
|
205
225
|
const hasData = !! data?.length;
|
|
206
|
-
const
|
|
207
|
-
|
|
226
|
+
const updatedPreviewSize = useUpdatedPreviewSizeOnViewportChange();
|
|
227
|
+
const usedPreviewSize = updatedPreviewSize || view.layout?.previewSize;
|
|
228
|
+
const gridStyle = usedPreviewSize
|
|
229
|
+
? {
|
|
230
|
+
gridTemplateColumns: `repeat(${ usedPreviewSize }, minmax(0, 1fr))`,
|
|
231
|
+
}
|
|
208
232
|
: {};
|
|
209
233
|
return (
|
|
210
234
|
<>
|
|
@@ -223,6 +247,8 @@ export default function ViewGrid< Item >( {
|
|
|
223
247
|
key={ getItemId( item ) }
|
|
224
248
|
selection={ selection }
|
|
225
249
|
onChangeSelection={ onChangeSelection }
|
|
250
|
+
onClickItem={ onClickItem }
|
|
251
|
+
isItemClickable={ isItemClickable }
|
|
226
252
|
getItemId={ getItemId }
|
|
227
253
|
item={ item }
|
|
228
254
|
actions={ actions }
|