/
view-grid.js
100 lines (98 loc) · 2.19 KB
/
view-grid.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
* WordPress dependencies
*/
import {
FlexBlock,
__experimentalGrid as Grid,
__experimentalHStack as HStack,
__experimentalVStack as VStack,
} from '@wordpress/components';
import { useAsyncList } from '@wordpress/compose';
/**
* Internal dependencies
*/
import ItemActions from './item-actions';
export default function ViewGrid( {
data,
fields,
view,
actions,
getItemId,
deferredRendering,
} ) {
const mediaField = fields.find(
( field ) => field.id === view.layout.mediaField
);
const primaryField = fields.find(
( field ) => field.id === view.layout.primaryField
);
const visibleFields = fields.filter(
( field ) =>
! view.hiddenFields.includes( field.id ) &&
! [ view.layout.mediaField, view.layout.primaryField ].includes(
field.id
)
);
const shownData = useAsyncList( data, { step: 3 } );
const usedData = deferredRendering ? shownData : data;
return (
<Grid
gap={ 8 }
columns={ 2 }
alignment="top"
className="dataviews-grid-view"
>
{ usedData.map( ( item ) => (
<VStack
spacing={ 3 }
key={ getItemId( item ) }
className="dataviews-view-grid__card"
>
<div className="dataviews-view-grid__media">
{ mediaField?.render( { item } ) }
</div>
<HStack
className="dataviews-view-grid__primary-field"
justify="space-between"
>
<FlexBlock>
{ primaryField?.render( { item } ) }
</FlexBlock>
<ItemActions
item={ item }
actions={ actions }
isCompact
/>
</HStack>
<VStack
className="dataviews-view-grid__fields"
spacing={ 3 }
>
{ visibleFields.map( ( field ) => {
const renderedValue = field.render( {
item,
} );
if ( ! renderedValue ) {
return null;
}
return (
<VStack
className="dataviews-view-grid__field"
key={ field.id }
spacing={ 1 }
>
<div className="dataviews-view-grid__field-header">
{ field.header }
</div>
<div className="dataviews-view-grid__field-value">
{ renderedValue }
</div>
</VStack>
);
} ) }
</VStack>
</VStack>
) ) }
</Grid>
);
}