@wordpress/dataviews 4.6.0 → 4.8.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 +4 -0
- package/README.md +596 -89
- package/build/components/dataform-combined-edit/index.js +12 -6
- package/build/components/dataform-combined-edit/index.js.map +1 -1
- package/build/components/dataviews/index.js +8 -1
- package/build/components/dataviews/index.js.map +1 -1
- package/build/components/dataviews-bulk-actions/index.js +6 -6
- package/build/components/dataviews-bulk-actions/index.js.map +1 -1
- package/build/components/dataviews-context/index.js +2 -0
- package/build/components/dataviews-context/index.js.map +1 -1
- package/build/components/dataviews-filters/add-filter.js +7 -7
- package/build/components/dataviews-filters/add-filter.js.map +1 -1
- package/build/components/dataviews-filters/index.js +2 -2
- package/build/components/dataviews-filters/index.js.map +1 -1
- package/build/components/dataviews-item-actions/index.js +11 -11
- package/build/components/dataviews-item-actions/index.js.map +1 -1
- package/build/components/dataviews-layout/index.js +5 -1
- package/build/components/dataviews-layout/index.js.map +1 -1
- package/build/components/dataviews-selection-checkbox/index.js +1 -2
- package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
- package/build/components/dataviews-view-config/index.js +6 -6
- 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/panel/index.js +9 -3
- package/build/dataforms-layouts/panel/index.js.map +1 -1
- package/build/dataforms-layouts/regular/index.js +8 -2
- package/build/dataforms-layouts/regular/index.js.map +1 -1
- package/build/dataviews-layouts/grid/index.js +14 -3
- package/build/dataviews-layouts/grid/index.js.map +1 -1
- package/build/dataviews-layouts/list/index.js +10 -12
- package/build/dataviews-layouts/list/index.js.map +1 -1
- package/build/dataviews-layouts/table/column-header-menu.js +18 -18
- package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
- package/build/dataviews-layouts/table/index.js +22 -5
- 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 -3
- package/build/normalize-fields.js.map +1 -1
- 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-combined-edit/index.js +12 -6
- package/build-module/components/dataform-combined-edit/index.js.map +1 -1
- package/build-module/components/dataviews/index.js +8 -1
- package/build-module/components/dataviews/index.js.map +1 -1
- package/build-module/components/dataviews-bulk-actions/index.js +6 -6
- package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
- package/build-module/components/dataviews-context/index.js +2 -0
- package/build-module/components/dataviews-context/index.js.map +1 -1
- package/build-module/components/dataviews-filters/add-filter.js +6 -6
- package/build-module/components/dataviews-filters/add-filter.js.map +1 -1
- package/build-module/components/dataviews-filters/index.js +4 -4
- package/build-module/components/dataviews-filters/index.js.map +1 -1
- package/build-module/components/dataviews-item-actions/index.js +10 -10
- package/build-module/components/dataviews-item-actions/index.js.map +1 -1
- package/build-module/components/dataviews-layout/index.js +5 -1
- package/build-module/components/dataviews-layout/index.js.map +1 -1
- package/build-module/components/dataviews-selection-checkbox/index.js +1 -2
- package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
- package/build-module/components/dataviews-view-config/index.js +6 -6
- 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/panel/index.js +9 -4
- package/build-module/dataforms-layouts/panel/index.js.map +1 -1
- package/build-module/dataforms-layouts/regular/index.js +7 -2
- package/build-module/dataforms-layouts/regular/index.js.map +1 -1
- package/build-module/dataviews-layouts/grid/index.js +14 -3
- package/build-module/dataviews-layouts/grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/list/index.js +11 -13
- package/build-module/dataviews-layouts/list/index.js.map +1 -1
- package/build-module/dataviews-layouts/table/column-header-menu.js +18 -18
- package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
- package/build-module/dataviews-layouts/table/index.js +22 -5
- 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 -3
- package/build-module/normalize-fields.js.map +1 -1
- 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 +15 -6
- package/build-style/style.css +15 -6
- package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataform-combined-edit/index.d.ts.map +1 -1
- 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-context/index.d.ts +2 -0
- package/build-types/components/dataviews-context/index.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/add-filter.d.ts +1 -1
- package/build-types/components/dataviews-filters/add-filter.d.ts.map +1 -1
- package/build-types/components/dataviews-item-actions/index.d.ts +2 -2
- 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-selection-checkbox/index.d.ts.map +1 -1
- 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/panel/index.d.ts.map +1 -1
- 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/list/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
- 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.map +1 -1
- package/build-types/types.d.ts +11 -6
- package/build-types/types.d.ts.map +1 -1
- package/build-types/validation.d.ts +9 -0
- package/build-types/validation.d.ts.map +1 -1
- package/package.json +12 -11
- package/src/components/dataform/stories/index.story.tsx +19 -3
- package/src/components/dataform-combined-edit/index.tsx +10 -7
- package/src/components/dataform-combined-edit/style.scss +4 -0
- package/src/components/dataviews/index.tsx +10 -1
- package/src/components/dataviews/style.scss +9 -3
- package/src/components/dataviews-bulk-actions/index.tsx +6 -6
- package/src/components/dataviews-context/index.ts +4 -0
- package/src/components/dataviews-filters/add-filter.tsx +8 -10
- package/src/components/dataviews-filters/index.tsx +4 -4
- package/src/components/dataviews-item-actions/index.tsx +15 -15
- package/src/components/dataviews-layout/index.tsx +4 -0
- package/src/components/dataviews-selection-checkbox/index.tsx +3 -2
- package/src/components/dataviews-view-config/index.tsx +8 -10
- package/src/components/form-field-visibility/index.tsx +32 -0
- package/src/dataforms-layouts/panel/index.tsx +11 -5
- package/src/dataforms-layouts/regular/index.tsx +9 -3
- package/src/dataviews-layouts/grid/index.tsx +29 -5
- package/src/dataviews-layouts/grid/style.scss +5 -0
- package/src/dataviews-layouts/list/index.tsx +10 -12
- package/src/dataviews-layouts/list/style.scss +1 -7
- package/src/dataviews-layouts/table/column-header-menu.tsx +31 -35
- package/src/dataviews-layouts/table/index.tsx +34 -3
- package/src/dataviews-layouts/utils/get-clickable-item-props.ts +22 -0
- package/src/normalize-fields.ts +17 -2
- package/src/test/normalize-fields.ts +45 -0
- package/src/types.ts +13 -2
- package/src/validation.ts +9 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -35,11 +35,14 @@ import type {
|
|
|
35
35
|
import type { SetSelection } from '../../private-types';
|
|
36
36
|
import ColumnHeaderMenu from './column-header-menu';
|
|
37
37
|
import { getVisibleFieldIds } from '../index';
|
|
38
|
+
import getClickableItemProps from '../utils/get-clickable-item-props';
|
|
38
39
|
|
|
39
40
|
interface TableColumnFieldProps< Item > {
|
|
40
41
|
primaryField?: NormalizedField< Item >;
|
|
41
42
|
field: NormalizedField< Item >;
|
|
42
43
|
item: Item;
|
|
44
|
+
isItemClickable: ( item: Item ) => boolean;
|
|
45
|
+
onClickItem: ( item: Item ) => void;
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
interface TableColumnCombinedProps< Item > {
|
|
@@ -48,6 +51,8 @@ interface TableColumnCombinedProps< Item > {
|
|
|
48
51
|
field: CombinedField;
|
|
49
52
|
item: Item;
|
|
50
53
|
view: ViewTableType;
|
|
54
|
+
isItemClickable: ( item: Item ) => boolean;
|
|
55
|
+
onClickItem: ( item: Item ) => void;
|
|
51
56
|
}
|
|
52
57
|
|
|
53
58
|
interface TableColumnProps< Item > {
|
|
@@ -56,6 +61,8 @@ interface TableColumnProps< Item > {
|
|
|
56
61
|
item: Item;
|
|
57
62
|
column: string;
|
|
58
63
|
view: ViewTableType;
|
|
64
|
+
isItemClickable: ( item: Item ) => boolean;
|
|
65
|
+
onClickItem: ( item: Item ) => void;
|
|
59
66
|
}
|
|
60
67
|
|
|
61
68
|
interface TableRowProps< Item > {
|
|
@@ -69,6 +76,8 @@ interface TableRowProps< Item > {
|
|
|
69
76
|
selection: string[];
|
|
70
77
|
getItemId: ( item: Item ) => string;
|
|
71
78
|
onChangeSelection: SetSelection;
|
|
79
|
+
isItemClickable: ( item: Item ) => boolean;
|
|
80
|
+
onClickItem: ( item: Item ) => void;
|
|
72
81
|
}
|
|
73
82
|
|
|
74
83
|
function TableColumn< Item >( {
|
|
@@ -102,15 +111,29 @@ function TableColumnField< Item >( {
|
|
|
102
111
|
primaryField,
|
|
103
112
|
item,
|
|
104
113
|
field,
|
|
114
|
+
isItemClickable,
|
|
115
|
+
onClickItem,
|
|
105
116
|
}: TableColumnFieldProps< Item > ) {
|
|
117
|
+
const isPrimaryField = primaryField?.id === field.id;
|
|
118
|
+
const isItemClickableField = ( i: Item ) =>
|
|
119
|
+
isItemClickable( i ) && isPrimaryField;
|
|
120
|
+
|
|
121
|
+
const clickableProps = getClickableItemProps(
|
|
122
|
+
item,
|
|
123
|
+
isItemClickableField,
|
|
124
|
+
onClickItem,
|
|
125
|
+
'dataviews-view-table__cell-content'
|
|
126
|
+
);
|
|
127
|
+
|
|
106
128
|
return (
|
|
107
129
|
<div
|
|
108
130
|
className={ clsx( 'dataviews-view-table__cell-content-wrapper', {
|
|
109
|
-
'dataviews-view-table__primary-field':
|
|
110
|
-
primaryField?.id === field.id,
|
|
131
|
+
'dataviews-view-table__primary-field': isPrimaryField,
|
|
111
132
|
} ) }
|
|
112
133
|
>
|
|
113
|
-
<
|
|
134
|
+
<div { ...clickableProps }>
|
|
135
|
+
<field.render { ...{ item } } />
|
|
136
|
+
</div>
|
|
114
137
|
</div>
|
|
115
138
|
);
|
|
116
139
|
}
|
|
@@ -139,6 +162,8 @@ function TableRow< Item >( {
|
|
|
139
162
|
primaryField,
|
|
140
163
|
selection,
|
|
141
164
|
getItemId,
|
|
165
|
+
isItemClickable,
|
|
166
|
+
onClickItem,
|
|
142
167
|
onChangeSelection,
|
|
143
168
|
}: TableRowProps< Item > ) {
|
|
144
169
|
const hasPossibleBulkAction = useHasAPossibleBulkAction( actions, item );
|
|
@@ -214,6 +239,8 @@ function TableRow< Item >( {
|
|
|
214
239
|
<td key={ column } style={ { width, maxWidth, minWidth } }>
|
|
215
240
|
<TableColumn
|
|
216
241
|
primaryField={ primaryField }
|
|
242
|
+
isItemClickable={ isItemClickable }
|
|
243
|
+
onClickItem={ onClickItem }
|
|
217
244
|
fields={ fields }
|
|
218
245
|
item={ item }
|
|
219
246
|
column={ column }
|
|
@@ -252,6 +279,8 @@ function ViewTable< Item >( {
|
|
|
252
279
|
onChangeSelection,
|
|
253
280
|
selection,
|
|
254
281
|
setOpenedFilter,
|
|
282
|
+
onClickItem,
|
|
283
|
+
isItemClickable,
|
|
255
284
|
view,
|
|
256
285
|
}: ViewTableProps< Item > ) {
|
|
257
286
|
const headerMenuRefs = useRef<
|
|
@@ -392,6 +421,8 @@ function ViewTable< Item >( {
|
|
|
392
421
|
selection={ selection }
|
|
393
422
|
getItemId={ getItemId }
|
|
394
423
|
onChangeSelection={ onChangeSelection }
|
|
424
|
+
onClickItem={ onClickItem }
|
|
425
|
+
isItemClickable={ isItemClickable }
|
|
395
426
|
/>
|
|
396
427
|
) ) }
|
|
397
428
|
</tbody>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export default function getClickableItemProps< Item >(
|
|
2
|
+
item: Item,
|
|
3
|
+
isItemClickable: ( item: Item ) => boolean,
|
|
4
|
+
onClickItem: ( item: Item ) => void,
|
|
5
|
+
className: string
|
|
6
|
+
) {
|
|
7
|
+
if ( ! isItemClickable( item ) ) {
|
|
8
|
+
return { className };
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
className: `${ className } ${ className }--clickable`,
|
|
13
|
+
role: 'button',
|
|
14
|
+
tabIndex: 0,
|
|
15
|
+
onClick: () => onClickItem( item ),
|
|
16
|
+
onKeyDown: ( event: React.KeyboardEvent ) => {
|
|
17
|
+
if ( event.key === 'Enter' || event.key === '' ) {
|
|
18
|
+
onClickItem( item );
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
package/src/normalize-fields.ts
CHANGED
|
@@ -11,6 +11,22 @@ import type {
|
|
|
11
11
|
import { getControl } from './dataform-controls';
|
|
12
12
|
import DataFormCombinedEdit from './components/dataform-combined-edit';
|
|
13
13
|
|
|
14
|
+
const getValueFromId =
|
|
15
|
+
( id: string ) =>
|
|
16
|
+
( { item }: { item: any } ) => {
|
|
17
|
+
const path = id.split( '.' );
|
|
18
|
+
let value = item;
|
|
19
|
+
for ( const segment of path ) {
|
|
20
|
+
if ( value.hasOwnProperty( segment ) ) {
|
|
21
|
+
value = value[ segment ];
|
|
22
|
+
} else {
|
|
23
|
+
value = undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return value;
|
|
28
|
+
};
|
|
29
|
+
|
|
14
30
|
/**
|
|
15
31
|
* Apply default values and normalize the fields config.
|
|
16
32
|
*
|
|
@@ -23,8 +39,7 @@ export function normalizeFields< Item >(
|
|
|
23
39
|
return fields.map( ( field ) => {
|
|
24
40
|
const fieldTypeDefinition = getFieldTypeDefinition( field.type );
|
|
25
41
|
|
|
26
|
-
const getValue =
|
|
27
|
-
field.getValue || ( ( { item } ) => ( item as any )[ field.id ] );
|
|
42
|
+
const getValue = field.getValue || getValueFromId( field.id );
|
|
28
43
|
|
|
29
44
|
const sort =
|
|
30
45
|
field.sort ??
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { normalizeFields } from '../normalize-fields';
|
|
5
|
+
import type { Field } from '../types';
|
|
6
|
+
|
|
7
|
+
describe( 'normalizeFields: default getValue', () => {
|
|
8
|
+
describe( 'getValue from ID', () => {
|
|
9
|
+
it( 'user', () => {
|
|
10
|
+
const item = { user: 'value' };
|
|
11
|
+
const fields: Field< {} >[] = [
|
|
12
|
+
{
|
|
13
|
+
id: 'user',
|
|
14
|
+
},
|
|
15
|
+
];
|
|
16
|
+
const normalizedFields = normalizeFields( fields );
|
|
17
|
+
const result = normalizedFields[ 0 ].getValue( { item } );
|
|
18
|
+
expect( result ).toBe( 'value' );
|
|
19
|
+
} );
|
|
20
|
+
|
|
21
|
+
it( 'user.name', () => {
|
|
22
|
+
const item = { user: { name: 'value' } };
|
|
23
|
+
const fields: Field< {} >[] = [
|
|
24
|
+
{
|
|
25
|
+
id: 'user.name',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
const normalizedFields = normalizeFields( fields );
|
|
29
|
+
const result = normalizedFields[ 0 ].getValue( { item } );
|
|
30
|
+
expect( result ).toBe( 'value' );
|
|
31
|
+
} );
|
|
32
|
+
|
|
33
|
+
it( 'user.name.first', () => {
|
|
34
|
+
const item = { user: { name: { first: 'value' } } };
|
|
35
|
+
const fields: Field< {} >[] = [
|
|
36
|
+
{
|
|
37
|
+
id: 'user.name.first',
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
const normalizedFields = normalizeFields( fields );
|
|
41
|
+
const result = normalizedFields[ 0 ].getValue( { item } );
|
|
42
|
+
expect( result ).toBe( 'value' );
|
|
43
|
+
} );
|
|
44
|
+
} );
|
|
45
|
+
} );
|
package/src/types.ts
CHANGED
|
@@ -106,7 +106,7 @@ export type Field< Item > = {
|
|
|
106
106
|
/**
|
|
107
107
|
* Callback used to render the field. Defaults to `field.getValue`.
|
|
108
108
|
*/
|
|
109
|
-
render?: ComponentType<
|
|
109
|
+
render?: ComponentType< DataViewRenderFieldProps< Item > >;
|
|
110
110
|
|
|
111
111
|
/**
|
|
112
112
|
* Callback used to render an edit control for the field.
|
|
@@ -123,6 +123,11 @@ export type Field< Item > = {
|
|
|
123
123
|
*/
|
|
124
124
|
isValid?: ( item: Item, context?: ValidationContext ) => boolean;
|
|
125
125
|
|
|
126
|
+
/**
|
|
127
|
+
* Callback used to decide if a field should be displayed.
|
|
128
|
+
*/
|
|
129
|
+
isVisible?: ( item: Item ) => boolean;
|
|
130
|
+
|
|
126
131
|
/**
|
|
127
132
|
* Whether the field is sortable.
|
|
128
133
|
*/
|
|
@@ -159,7 +164,7 @@ export type NormalizedField< Item > = Field< Item > & {
|
|
|
159
164
|
label: string;
|
|
160
165
|
header: string | ReactElement;
|
|
161
166
|
getValue: ( args: { item: Item } ) => any;
|
|
162
|
-
render: ComponentType<
|
|
167
|
+
render: ComponentType< DataViewRenderFieldProps< Item > >;
|
|
163
168
|
Edit: ComponentType< DataFormControlProps< Item > >;
|
|
164
169
|
sort: ( a: Item, b: Item, direction: SortDirection ) => number;
|
|
165
170
|
isValid: ( item: Item, context?: ValidationContext ) => boolean;
|
|
@@ -181,6 +186,10 @@ export type DataFormControlProps< Item > = {
|
|
|
181
186
|
hideLabelFromVision?: boolean;
|
|
182
187
|
};
|
|
183
188
|
|
|
189
|
+
export type DataViewRenderFieldProps< Item > = {
|
|
190
|
+
item: Item;
|
|
191
|
+
};
|
|
192
|
+
|
|
184
193
|
/**
|
|
185
194
|
* The filters applied to the dataset.
|
|
186
195
|
*/
|
|
@@ -489,6 +498,8 @@ export interface ViewBaseProps< Item > {
|
|
|
489
498
|
onChangeSelection: SetSelection;
|
|
490
499
|
selection: string[];
|
|
491
500
|
setOpenedFilter: ( fieldId: string ) => void;
|
|
501
|
+
onClickItem: ( item: Item ) => void;
|
|
502
|
+
isItemClickable: ( item: Item ) => boolean;
|
|
492
503
|
view: View;
|
|
493
504
|
density: number;
|
|
494
505
|
}
|
package/src/validation.ts
CHANGED
|
@@ -4,6 +4,15 @@
|
|
|
4
4
|
import { normalizeFields } from './normalize-fields';
|
|
5
5
|
import type { Field, Form } from './types';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Whether or not the given item's value is valid according to the fields and form config.
|
|
9
|
+
*
|
|
10
|
+
* @param item The item to validate.
|
|
11
|
+
* @param fields Fields config.
|
|
12
|
+
* @param form Form config.
|
|
13
|
+
*
|
|
14
|
+
* @return A boolean indicating if the item is valid (true) or not (false).
|
|
15
|
+
*/
|
|
7
16
|
export function isItemValid< Item >(
|
|
8
17
|
item: Item,
|
|
9
18
|
fields: Field< Item >[],
|