@wordpress/dataviews 0.4.1 → 0.5.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 +2 -0
- package/README.md +1 -0
- package/build/add-filter.js +25 -108
- package/build/add-filter.js.map +1 -1
- package/build/constants.js +9 -18
- package/build/constants.js.map +1 -1
- package/build/dataviews.js +22 -16
- package/build/dataviews.js.map +1 -1
- package/build/dropdown-menu-helper.js +1 -2
- package/build/dropdown-menu-helper.js.map +1 -1
- package/build/filter-summary.js +180 -77
- package/build/filter-summary.js.map +1 -1
- package/build/filters.js +32 -18
- package/build/filters.js.map +1 -1
- package/build/pagination.js +1 -2
- package/build/pagination.js.map +1 -1
- package/build/reset-filters.js +4 -1
- package/build/reset-filters.js.map +1 -1
- package/build/search-widget.js +111 -0
- package/build/search-widget.js.map +1 -0
- package/build/search.js +2 -3
- package/build/search.js.map +1 -1
- package/build/single-selection-checkbox.js +54 -0
- package/build/single-selection-checkbox.js.map +1 -0
- package/build/utils.js +14 -1
- package/build/utils.js.map +1 -1
- package/build/view-actions.js +2 -3
- package/build/view-actions.js.map +1 -1
- package/build/view-grid.js +92 -22
- package/build/view-grid.js.map +1 -1
- package/build/view-list.js +2 -1
- package/build/view-list.js.map +1 -1
- package/build/view-table.js +43 -132
- package/build/view-table.js.map +1 -1
- package/build-module/add-filter.js +28 -111
- package/build-module/add-filter.js.map +1 -1
- package/build-module/dataviews.js +23 -17
- package/build-module/dataviews.js.map +1 -1
- package/build-module/filter-summary.js +181 -79
- package/build-module/filter-summary.js.map +1 -1
- package/build-module/filters.js +32 -17
- package/build-module/filters.js.map +1 -1
- package/build-module/reset-filters.js +4 -1
- package/build-module/reset-filters.js.map +1 -1
- package/build-module/search-widget.js +101 -0
- package/build-module/search-widget.js.map +1 -0
- package/build-module/search.js +1 -1
- package/build-module/search.js.map +1 -1
- package/build-module/single-selection-checkbox.js +47 -0
- package/build-module/single-selection-checkbox.js.map +1 -0
- package/build-module/utils.js +12 -0
- package/build-module/utils.js.map +1 -1
- package/build-module/view-actions.js +1 -1
- package/build-module/view-actions.js.map +1 -1
- package/build-module/view-grid.js +92 -22
- package/build-module/view-grid.js.map +1 -1
- package/build-module/view-list.js +2 -1
- package/build-module/view-list.js.map +1 -1
- package/build-module/view-table.js +43 -131
- package/build-module/view-table.js.map +1 -1
- package/build-style/style-rtl.css +253 -44
- package/build-style/style.css +253 -44
- package/package.json +12 -11
- package/src/add-filter.js +39 -230
- package/src/dataviews.js +31 -20
- package/src/filter-summary.js +228 -135
- package/src/filters.js +42 -29
- package/src/reset-filters.js +12 -2
- package/src/search-widget.js +128 -0
- package/src/search.js +1 -1
- package/src/single-selection-checkbox.js +59 -0
- package/src/style.scss +259 -44
- package/src/utils.js +15 -0
- package/src/view-actions.js +1 -2
- package/src/view-grid.js +127 -53
- package/src/view-list.js +5 -1
- package/src/view-table.js +57 -230
|
@@ -1,38 +1,63 @@
|
|
|
1
1
|
import { createElement } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* External dependencies
|
|
4
|
+
*/
|
|
5
|
+
import classnames from 'classnames';
|
|
6
|
+
|
|
2
7
|
/**
|
|
3
8
|
* WordPress dependencies
|
|
4
9
|
*/
|
|
5
10
|
import { __experimentalGrid as Grid, __experimentalHStack as HStack, __experimentalVStack as VStack, Tooltip } from '@wordpress/components';
|
|
6
11
|
import { useAsyncList } from '@wordpress/compose';
|
|
12
|
+
import { useState } from '@wordpress/element';
|
|
7
13
|
|
|
8
14
|
/**
|
|
9
15
|
* Internal dependencies
|
|
10
16
|
*/
|
|
11
17
|
import ItemActions from './item-actions';
|
|
12
|
-
|
|
18
|
+
import SingleSelectionCheckbox from './single-selection-checkbox';
|
|
19
|
+
function GridItem({
|
|
20
|
+
selection,
|
|
13
21
|
data,
|
|
14
|
-
|
|
15
|
-
view,
|
|
16
|
-
actions,
|
|
22
|
+
onSelectionChange,
|
|
17
23
|
getItemId,
|
|
18
|
-
|
|
24
|
+
item,
|
|
25
|
+
actions,
|
|
26
|
+
mediaField,
|
|
27
|
+
primaryField,
|
|
28
|
+
visibleFields
|
|
19
29
|
}) {
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
step: 3
|
|
25
|
-
});
|
|
26
|
-
const usedData = deferredRendering ? shownData : data;
|
|
27
|
-
return createElement(Grid, {
|
|
28
|
-
gap: 6,
|
|
29
|
-
columns: 2,
|
|
30
|
-
alignment: "top",
|
|
31
|
-
className: "dataviews-view-grid"
|
|
32
|
-
}, usedData.map(item => createElement(VStack, {
|
|
30
|
+
const [hasNoPointerEvents, setHasNoPointerEvents] = useState(false);
|
|
31
|
+
const id = getItemId(item);
|
|
32
|
+
const isSelected = selection.includes(id);
|
|
33
|
+
return createElement(VStack, {
|
|
33
34
|
spacing: 0,
|
|
34
|
-
key:
|
|
35
|
-
className:
|
|
35
|
+
key: id,
|
|
36
|
+
className: classnames('dataviews-view-grid__card', {
|
|
37
|
+
'is-selected': isSelected,
|
|
38
|
+
'has-no-pointer-events': hasNoPointerEvents
|
|
39
|
+
}),
|
|
40
|
+
onMouseDown: event => {
|
|
41
|
+
if (event.ctrlKey || event.metaKey) {
|
|
42
|
+
setHasNoPointerEvents(true);
|
|
43
|
+
if (!isSelected) {
|
|
44
|
+
onSelectionChange(data.filter(_item => {
|
|
45
|
+
const itemId = getItemId?.(_item);
|
|
46
|
+
return itemId === id || selection.includes(itemId);
|
|
47
|
+
}));
|
|
48
|
+
} else {
|
|
49
|
+
onSelectionChange(data.filter(_item => {
|
|
50
|
+
const itemId = getItemId?.(_item);
|
|
51
|
+
return itemId !== id && selection.includes(itemId);
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
onClick: () => {
|
|
57
|
+
if (hasNoPointerEvents) {
|
|
58
|
+
setHasNoPointerEvents(false);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
36
61
|
}, createElement("div", {
|
|
37
62
|
className: "dataviews-view-grid__media"
|
|
38
63
|
}, mediaField?.render({
|
|
@@ -40,7 +65,15 @@ export default function ViewGrid({
|
|
|
40
65
|
})), createElement(HStack, {
|
|
41
66
|
justify: "space-between",
|
|
42
67
|
className: "dataviews-view-grid__title-actions"
|
|
43
|
-
}, createElement(
|
|
68
|
+
}, createElement(SingleSelectionCheckbox, {
|
|
69
|
+
id: id,
|
|
70
|
+
item: item,
|
|
71
|
+
selection: selection,
|
|
72
|
+
onSelectionChange: onSelectionChange,
|
|
73
|
+
getItemId: getItemId,
|
|
74
|
+
data: data,
|
|
75
|
+
primaryField: primaryField
|
|
76
|
+
}), createElement(HStack, {
|
|
44
77
|
className: "dataviews-view-grid__primary-field"
|
|
45
78
|
}, primaryField?.render({
|
|
46
79
|
item
|
|
@@ -68,6 +101,43 @@ export default function ViewGrid({
|
|
|
68
101
|
}, createElement("div", {
|
|
69
102
|
className: "dataviews-view-grid__field-value"
|
|
70
103
|
}, renderedValue)));
|
|
71
|
-
})))
|
|
104
|
+
})));
|
|
105
|
+
}
|
|
106
|
+
export default function ViewGrid({
|
|
107
|
+
data,
|
|
108
|
+
fields,
|
|
109
|
+
view,
|
|
110
|
+
actions,
|
|
111
|
+
getItemId,
|
|
112
|
+
deferredRendering,
|
|
113
|
+
selection,
|
|
114
|
+
onSelectionChange
|
|
115
|
+
}) {
|
|
116
|
+
const mediaField = fields.find(field => field.id === view.layout.mediaField);
|
|
117
|
+
const primaryField = fields.find(field => field.id === view.layout.primaryField);
|
|
118
|
+
const visibleFields = fields.filter(field => !view.hiddenFields.includes(field.id) && ![view.layout.mediaField, view.layout.primaryField].includes(field.id));
|
|
119
|
+
const shownData = useAsyncList(data, {
|
|
120
|
+
step: 3
|
|
121
|
+
});
|
|
122
|
+
const usedData = deferredRendering ? shownData : data;
|
|
123
|
+
return createElement(Grid, {
|
|
124
|
+
gap: 6,
|
|
125
|
+
columns: 2,
|
|
126
|
+
alignment: "top",
|
|
127
|
+
className: "dataviews-view-grid"
|
|
128
|
+
}, usedData.map(item => {
|
|
129
|
+
return createElement(GridItem, {
|
|
130
|
+
key: getItemId(item),
|
|
131
|
+
selection: selection,
|
|
132
|
+
data: data,
|
|
133
|
+
onSelectionChange: onSelectionChange,
|
|
134
|
+
getItemId: getItemId,
|
|
135
|
+
item: item,
|
|
136
|
+
actions: actions,
|
|
137
|
+
mediaField: mediaField,
|
|
138
|
+
primaryField: primaryField,
|
|
139
|
+
visibleFields: visibleFields
|
|
140
|
+
});
|
|
141
|
+
}));
|
|
72
142
|
}
|
|
73
143
|
//# sourceMappingURL=view-grid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__experimentalGrid","Grid","__experimentalHStack","HStack","__experimentalVStack","VStack","Tooltip","useAsyncList","
|
|
1
|
+
{"version":3,"names":["classnames","__experimentalGrid","Grid","__experimentalHStack","HStack","__experimentalVStack","VStack","Tooltip","useAsyncList","useState","ItemActions","SingleSelectionCheckbox","GridItem","selection","data","onSelectionChange","getItemId","item","actions","mediaField","primaryField","visibleFields","hasNoPointerEvents","setHasNoPointerEvents","id","isSelected","includes","createElement","spacing","key","className","onMouseDown","event","ctrlKey","metaKey","filter","_item","itemId","onClick","render","justify","isCompact","map","field","renderedValue","text","header","placement","ViewGrid","fields","view","deferredRendering","find","layout","hiddenFields","shownData","step","usedData","gap","columns","alignment"],"sources":["@wordpress/dataviews/src/view-grid.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport {\n\t__experimentalGrid as Grid,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n\tTooltip,\n} from '@wordpress/components';\nimport { useAsyncList } from '@wordpress/compose';\nimport { useState } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport ItemActions from './item-actions';\nimport SingleSelectionCheckbox from './single-selection-checkbox';\n\nfunction GridItem( {\n\tselection,\n\tdata,\n\tonSelectionChange,\n\tgetItemId,\n\titem,\n\tactions,\n\tmediaField,\n\tprimaryField,\n\tvisibleFields,\n} ) {\n\tconst [ hasNoPointerEvents, setHasNoPointerEvents ] = useState( false );\n\tconst id = getItemId( item );\n\tconst isSelected = selection.includes( id );\n\treturn (\n\t\t<VStack\n\t\t\tspacing={ 0 }\n\t\t\tkey={ id }\n\t\t\tclassName={ classnames( 'dataviews-view-grid__card', {\n\t\t\t\t'is-selected': isSelected,\n\t\t\t\t'has-no-pointer-events': hasNoPointerEvents,\n\t\t\t} ) }\n\t\t\tonMouseDown={ ( event ) => {\n\t\t\t\tif ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\tsetHasNoPointerEvents( true );\n\t\t\t\t\tif ( ! isSelected ) {\n\t\t\t\t\t\tonSelectionChange(\n\t\t\t\t\t\t\tdata.filter( ( _item ) => {\n\t\t\t\t\t\t\t\tconst itemId = getItemId?.( _item );\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\titemId === id ||\n\t\t\t\t\t\t\t\t\tselection.includes( itemId )\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonSelectionChange(\n\t\t\t\t\t\t\tdata.filter( ( _item ) => {\n\t\t\t\t\t\t\t\tconst itemId = getItemId?.( _item );\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\titemId !== id &&\n\t\t\t\t\t\t\t\t\tselection.includes( itemId )\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} }\n\t\t\tonClick={ () => {\n\t\t\t\tif ( hasNoPointerEvents ) {\n\t\t\t\t\tsetHasNoPointerEvents( false );\n\t\t\t\t}\n\t\t\t} }\n\t\t>\n\t\t\t<div className=\"dataviews-view-grid__media\">\n\t\t\t\t{ mediaField?.render( { item } ) }\n\t\t\t</div>\n\t\t\t<HStack\n\t\t\t\tjustify=\"space-between\"\n\t\t\t\tclassName=\"dataviews-view-grid__title-actions\"\n\t\t\t>\n\t\t\t\t<SingleSelectionCheckbox\n\t\t\t\t\tid={ id }\n\t\t\t\t\titem={ item }\n\t\t\t\t\tselection={ selection }\n\t\t\t\t\tonSelectionChange={ onSelectionChange }\n\t\t\t\t\tgetItemId={ getItemId }\n\t\t\t\t\tdata={ data }\n\t\t\t\t\tprimaryField={ primaryField }\n\t\t\t\t/>\n\t\t\t\t<HStack className=\"dataviews-view-grid__primary-field\">\n\t\t\t\t\t{ primaryField?.render( { item } ) }\n\t\t\t\t</HStack>\n\t\t\t\t<ItemActions item={ item } actions={ actions } isCompact />\n\t\t\t</HStack>\n\t\t\t<VStack className=\"dataviews-view-grid__fields\" spacing={ 3 }>\n\t\t\t\t{ visibleFields.map( ( field ) => {\n\t\t\t\t\tconst renderedValue = field.render( {\n\t\t\t\t\t\titem,\n\t\t\t\t\t} );\n\t\t\t\t\tif ( ! renderedValue ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<VStack\n\t\t\t\t\t\t\tclassName=\"dataviews-view-grid__field\"\n\t\t\t\t\t\t\tkey={ field.id }\n\t\t\t\t\t\t\tspacing={ 1 }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Tooltip text={ field.header } placement=\"left\">\n\t\t\t\t\t\t\t\t<div className=\"dataviews-view-grid__field-value\">\n\t\t\t\t\t\t\t\t\t{ renderedValue }\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t</VStack>\n\t\t\t\t\t);\n\t\t\t\t} ) }\n\t\t\t</VStack>\n\t\t</VStack>\n\t);\n}\n\nexport default function ViewGrid( {\n\tdata,\n\tfields,\n\tview,\n\tactions,\n\tgetItemId,\n\tdeferredRendering,\n\tselection,\n\tonSelectionChange,\n} ) {\n\tconst mediaField = fields.find(\n\t\t( field ) => field.id === view.layout.mediaField\n\t);\n\tconst primaryField = fields.find(\n\t\t( field ) => field.id === view.layout.primaryField\n\t);\n\tconst visibleFields = fields.filter(\n\t\t( field ) =>\n\t\t\t! view.hiddenFields.includes( field.id ) &&\n\t\t\t! [ view.layout.mediaField, view.layout.primaryField ].includes(\n\t\t\t\tfield.id\n\t\t\t)\n\t);\n\tconst shownData = useAsyncList( data, { step: 3 } );\n\tconst usedData = deferredRendering ? shownData : data;\n\treturn (\n\t\t<Grid\n\t\t\tgap={ 6 }\n\t\t\tcolumns={ 2 }\n\t\t\talignment=\"top\"\n\t\t\tclassName=\"dataviews-view-grid\"\n\t\t>\n\t\t\t{ usedData.map( ( item ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<GridItem\n\t\t\t\t\t\tkey={ getItemId( item ) }\n\t\t\t\t\t\tselection={ selection }\n\t\t\t\t\t\tdata={ data }\n\t\t\t\t\t\tonSelectionChange={ onSelectionChange }\n\t\t\t\t\t\tgetItemId={ getItemId }\n\t\t\t\t\t\titem={ item }\n\t\t\t\t\t\tactions={ actions }\n\t\t\t\t\t\tmediaField={ mediaField }\n\t\t\t\t\t\tprimaryField={ primaryField }\n\t\t\t\t\t\tvisibleFields={ visibleFields }\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Grid>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -66,7 +66,8 @@ export default function ViewList({
|
|
|
66
66
|
onClick: () => onSelectionChange([item])
|
|
67
67
|
}, createElement(HStack, {
|
|
68
68
|
spacing: 3,
|
|
69
|
-
justify: "start"
|
|
69
|
+
justify: "start",
|
|
70
|
+
alignment: "flex-start"
|
|
70
71
|
}, createElement("div", {
|
|
71
72
|
className: "dataviews-view-list__media-wrapper"
|
|
72
73
|
}, mediaField?.render({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["classNames","useAsyncList","__experimentalHStack","HStack","__experimentalVStack","VStack","Button","ENTER","SPACE","info","__","ViewList","view","fields","data","isLoading","getItemId","onSelectionChange","onDetailsChange","selection","deferredRendering","shownData","step","usedData","mediaField","find","field","id","layout","primaryField","visibleFields","filter","hiddenFields","includes","onEnter","item","event","keyCode","hasData","length","createElement","className","map","key","role","tabIndex","onKeyDown","onClick","spacing","justify","render","icon","label","size"],"sources":["@wordpress/dataviews/src/view-list.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport classNames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { useAsyncList } from '@wordpress/compose';\nimport {\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n\tButton,\n} from '@wordpress/components';\nimport { ENTER, SPACE } from '@wordpress/keycodes';\nimport { info } from '@wordpress/icons';\nimport { __ } from '@wordpress/i18n';\n\nexport default function ViewList( {\n\tview,\n\tfields,\n\tdata,\n\tisLoading,\n\tgetItemId,\n\tonSelectionChange,\n\tonDetailsChange,\n\tselection,\n\tdeferredRendering,\n} ) {\n\tconst shownData = useAsyncList( data, { step: 3 } );\n\tconst usedData = deferredRendering ? shownData : data;\n\tconst mediaField = fields.find(\n\t\t( field ) => field.id === view.layout.mediaField\n\t);\n\tconst primaryField = fields.find(\n\t\t( field ) => field.id === view.layout.primaryField\n\t);\n\tconst visibleFields = fields.filter(\n\t\t( field ) =>\n\t\t\t! view.hiddenFields.includes( field.id ) &&\n\t\t\t! [ view.layout.primaryField, view.layout.mediaField ].includes(\n\t\t\t\tfield.id\n\t\t\t)\n\t);\n\n\tconst onEnter = ( item ) => ( event ) => {\n\t\tconst { keyCode } = event;\n\t\tif ( [ ENTER, SPACE ].includes( keyCode ) ) {\n\t\t\tonSelectionChange( [ item ] );\n\t\t}\n\t};\n\n\tconst hasData = usedData?.length;\n\tif ( ! hasData ) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={ classNames( {\n\t\t\t\t\t'dataviews-loading': isLoading,\n\t\t\t\t\t'dataviews-no-results': ! hasData && ! isLoading,\n\t\t\t\t} ) }\n\t\t\t>\n\t\t\t\t{ ! hasData && (\n\t\t\t\t\t<p>{ isLoading ? __( 'Loading…' ) : __( 'No results' ) }</p>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ul className=\"dataviews-view-list\">\n\t\t\t{ usedData.map( ( item ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<li\n\t\t\t\t\t\tkey={ getItemId( item ) }\n\t\t\t\t\t\tclassName={ classNames( {\n\t\t\t\t\t\t\t'is-selected': selection.includes( item.id ),\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t<HStack className=\"dataviews-view-list__item-wrapper\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabIndex={ 0 }\n\t\t\t\t\t\t\t\taria-pressed={ selection.includes( item.id ) }\n\t\t\t\t\t\t\t\tonKeyDown={ onEnter( item ) }\n\t\t\t\t\t\t\t\tclassName=\"dataviews-view-list__item\"\n\t\t\t\t\t\t\t\tonClick={ () => onSelectionChange( [ item ] ) }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<HStack
|
|
1
|
+
{"version":3,"names":["classNames","useAsyncList","__experimentalHStack","HStack","__experimentalVStack","VStack","Button","ENTER","SPACE","info","__","ViewList","view","fields","data","isLoading","getItemId","onSelectionChange","onDetailsChange","selection","deferredRendering","shownData","step","usedData","mediaField","find","field","id","layout","primaryField","visibleFields","filter","hiddenFields","includes","onEnter","item","event","keyCode","hasData","length","createElement","className","map","key","role","tabIndex","onKeyDown","onClick","spacing","justify","alignment","render","icon","label","size"],"sources":["@wordpress/dataviews/src/view-list.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport classNames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { useAsyncList } from '@wordpress/compose';\nimport {\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n\tButton,\n} from '@wordpress/components';\nimport { ENTER, SPACE } from '@wordpress/keycodes';\nimport { info } from '@wordpress/icons';\nimport { __ } from '@wordpress/i18n';\n\nexport default function ViewList( {\n\tview,\n\tfields,\n\tdata,\n\tisLoading,\n\tgetItemId,\n\tonSelectionChange,\n\tonDetailsChange,\n\tselection,\n\tdeferredRendering,\n} ) {\n\tconst shownData = useAsyncList( data, { step: 3 } );\n\tconst usedData = deferredRendering ? shownData : data;\n\tconst mediaField = fields.find(\n\t\t( field ) => field.id === view.layout.mediaField\n\t);\n\tconst primaryField = fields.find(\n\t\t( field ) => field.id === view.layout.primaryField\n\t);\n\tconst visibleFields = fields.filter(\n\t\t( field ) =>\n\t\t\t! view.hiddenFields.includes( field.id ) &&\n\t\t\t! [ view.layout.primaryField, view.layout.mediaField ].includes(\n\t\t\t\tfield.id\n\t\t\t)\n\t);\n\n\tconst onEnter = ( item ) => ( event ) => {\n\t\tconst { keyCode } = event;\n\t\tif ( [ ENTER, SPACE ].includes( keyCode ) ) {\n\t\t\tonSelectionChange( [ item ] );\n\t\t}\n\t};\n\n\tconst hasData = usedData?.length;\n\tif ( ! hasData ) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={ classNames( {\n\t\t\t\t\t'dataviews-loading': isLoading,\n\t\t\t\t\t'dataviews-no-results': ! hasData && ! isLoading,\n\t\t\t\t} ) }\n\t\t\t>\n\t\t\t\t{ ! hasData && (\n\t\t\t\t\t<p>{ isLoading ? __( 'Loading…' ) : __( 'No results' ) }</p>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ul className=\"dataviews-view-list\">\n\t\t\t{ usedData.map( ( item ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<li\n\t\t\t\t\t\tkey={ getItemId( item ) }\n\t\t\t\t\t\tclassName={ classNames( {\n\t\t\t\t\t\t\t'is-selected': selection.includes( item.id ),\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t<HStack className=\"dataviews-view-list__item-wrapper\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabIndex={ 0 }\n\t\t\t\t\t\t\t\taria-pressed={ selection.includes( item.id ) }\n\t\t\t\t\t\t\t\tonKeyDown={ onEnter( item ) }\n\t\t\t\t\t\t\t\tclassName=\"dataviews-view-list__item\"\n\t\t\t\t\t\t\t\tonClick={ () => onSelectionChange( [ item ] ) }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<HStack\n\t\t\t\t\t\t\t\t\tspacing={ 3 }\n\t\t\t\t\t\t\t\t\tjustify=\"start\"\n\t\t\t\t\t\t\t\t\talignment=\"flex-start\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"dataviews-view-list__media-wrapper\">\n\t\t\t\t\t\t\t\t\t\t{ mediaField?.render( { item } ) || (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"dataviews-view-list__media-placeholder\"></div>\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<VStack spacing={ 1 }>\n\t\t\t\t\t\t\t\t\t\t<span className=\"dataviews-view-list__primary-field\">\n\t\t\t\t\t\t\t\t\t\t\t{ primaryField?.render( { item } ) }\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<div className=\"dataviews-view-list__fields\">\n\t\t\t\t\t\t\t\t\t\t\t{ visibleFields.map( ( field ) => {\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={ field.id }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"dataviews-view-list__field\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ field.render( {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</VStack>\n\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{ onDetailsChange && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"dataviews-view-list__details-button\"\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tonDetailsChange( [ item ] )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ticon={ info }\n\t\t\t\t\t\t\t\t\tlabel={ __( 'View details' ) }\n\t\t\t\t\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</HStack>\n\t\t\t\t\t</li>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</ul>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -7,63 +7,56 @@ import classnames from 'classnames';
|
|
|
7
7
|
/**
|
|
8
8
|
* WordPress dependencies
|
|
9
9
|
*/
|
|
10
|
-
import { __
|
|
10
|
+
import { __ } from '@wordpress/i18n';
|
|
11
11
|
import { useAsyncList } from '@wordpress/compose';
|
|
12
12
|
import { unseen, funnel } from '@wordpress/icons';
|
|
13
13
|
import { Button, Icon, privateApis as componentsPrivateApis, CheckboxControl } from '@wordpress/components';
|
|
14
|
-
import {
|
|
14
|
+
import { forwardRef, useEffect, useId, useRef, useState, Children, Fragment } from '@wordpress/element';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Internal dependencies
|
|
18
18
|
*/
|
|
19
|
+
import SingleSelectionCheckbox from './single-selection-checkbox';
|
|
19
20
|
import { unlock } from './lock-unlock';
|
|
20
21
|
import ItemActions from './item-actions';
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
22
|
+
import { sanitizeOperators } from './utils';
|
|
23
|
+
import { ENUMERATION_TYPE, SORTING_DIRECTIONS } from './constants';
|
|
23
24
|
const {
|
|
24
25
|
DropdownMenuV2: DropdownMenu,
|
|
25
26
|
DropdownMenuGroupV2: DropdownMenuGroup,
|
|
26
27
|
DropdownMenuItemV2: DropdownMenuItem,
|
|
27
28
|
DropdownMenuRadioItemV2: DropdownMenuRadioItem,
|
|
28
|
-
DropdownMenuSeparatorV2: DropdownMenuSeparator,
|
|
29
29
|
DropdownMenuItemLabelV2: DropdownMenuItemLabel,
|
|
30
|
-
|
|
30
|
+
DropdownMenuSeparatorV2: DropdownMenuSeparator
|
|
31
31
|
} = unlock(componentsPrivateApis);
|
|
32
|
+
function WithSeparators({
|
|
33
|
+
children
|
|
34
|
+
}) {
|
|
35
|
+
return Children.toArray(children).filter(Boolean).map((child, i) => createElement(Fragment, {
|
|
36
|
+
key: i
|
|
37
|
+
}, i > 0 && createElement(DropdownMenuSeparator, null), child));
|
|
38
|
+
}
|
|
32
39
|
const sortArrows = {
|
|
33
40
|
asc: '↑',
|
|
34
41
|
desc: '↓'
|
|
35
42
|
};
|
|
36
|
-
const sanitizeOperators = field => {
|
|
37
|
-
let operators = field.filterBy?.operators;
|
|
38
|
-
if (!operators || !Array.isArray(operators)) {
|
|
39
|
-
operators = Object.keys(OPERATORS);
|
|
40
|
-
}
|
|
41
|
-
return operators.filter(operator => Object.keys(OPERATORS).includes(operator));
|
|
42
|
-
};
|
|
43
43
|
const HeaderMenu = forwardRef(function HeaderMenu({
|
|
44
44
|
field,
|
|
45
45
|
view,
|
|
46
46
|
onChangeView,
|
|
47
|
-
onHide
|
|
47
|
+
onHide,
|
|
48
|
+
setOpenedFilter
|
|
48
49
|
}, ref) {
|
|
49
50
|
const isHidable = field.enableHiding !== false;
|
|
50
51
|
const isSortable = field.enableSorting !== false;
|
|
51
52
|
const isSorted = view.sort?.field === field.id;
|
|
52
|
-
let filter, filterInView, activeElement, activeOperator, otherFilters;
|
|
53
53
|
const operators = sanitizeOperators(field);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
filterInView = view.filters.find(f => f.field === filter.field);
|
|
61
|
-
otherFilters = view.filters.filter(f => f.field !== filter.field);
|
|
62
|
-
activeElement = filter.elements.find(element => element.value === filterInView?.value);
|
|
63
|
-
activeOperator = filterInView?.operator || filter.operators[0];
|
|
64
|
-
}
|
|
65
|
-
const isFilterable = !!filter;
|
|
66
|
-
if (!isSortable && !isHidable && !isFilterable) {
|
|
54
|
+
// Filter can be added:
|
|
55
|
+
// 1. If the field is not already part of a view's filters.
|
|
56
|
+
// 2. If the field meets the type and operator requirements.
|
|
57
|
+
// 3. If it's not primary. If it is, it should be already visible.
|
|
58
|
+
const canAddFilter = !view.filters?.some(_filter => field.id === _filter.field) && field.type === ENUMERATION_TYPE && !!operators.length && !field.filterBy?.isPrimary;
|
|
59
|
+
if (!isSortable && !isHidable && !canAddFilter) {
|
|
67
60
|
return field.header;
|
|
68
61
|
}
|
|
69
62
|
return createElement(DropdownMenu, {
|
|
@@ -103,7 +96,23 @@ const HeaderMenu = forwardRef(function HeaderMenu({
|
|
|
103
96
|
});
|
|
104
97
|
}
|
|
105
98
|
}, createElement(DropdownMenuItemLabel, null, info.label));
|
|
106
|
-
})),
|
|
99
|
+
})), canAddFilter && createElement(DropdownMenuGroup, null, createElement(DropdownMenuItem, {
|
|
100
|
+
prefix: createElement(Icon, {
|
|
101
|
+
icon: funnel
|
|
102
|
+
}),
|
|
103
|
+
onClick: () => {
|
|
104
|
+
setOpenedFilter(field.id);
|
|
105
|
+
onChangeView({
|
|
106
|
+
...view,
|
|
107
|
+
page: 1,
|
|
108
|
+
filters: [...(view.filters || []), {
|
|
109
|
+
field: field.id,
|
|
110
|
+
value: undefined,
|
|
111
|
+
operator: operators[0]
|
|
112
|
+
}]
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}, createElement(DropdownMenuItemLabel, null, __('Add filter')))), isHidable && createElement(DropdownMenuItem, {
|
|
107
116
|
prefix: createElement(Icon, {
|
|
108
117
|
icon: unseen
|
|
109
118
|
}),
|
|
@@ -114,67 +123,8 @@ const HeaderMenu = forwardRef(function HeaderMenu({
|
|
|
114
123
|
hiddenFields: view.hiddenFields.concat(field.id)
|
|
115
124
|
});
|
|
116
125
|
}
|
|
117
|
-
}, createElement(DropdownMenuItemLabel, null, __('Hide')))
|
|
118
|
-
key: filter.field,
|
|
119
|
-
trigger: createElement(DropdownMenuItem, {
|
|
120
|
-
prefix: createElement(Icon, {
|
|
121
|
-
icon: funnel
|
|
122
|
-
}),
|
|
123
|
-
suffix: activeElement && createElement("span", {
|
|
124
|
-
"aria-hidden": "true"
|
|
125
|
-
}, activeOperator in OPERATORS && `${OPERATORS[activeOperator].label} `, activeElement?.label)
|
|
126
|
-
}, createElement(DropdownMenuItemLabel, null, __('Filter by')))
|
|
127
|
-
}, createElement(WithSeparators, null, createElement(DropdownMenuGroup, null, filter.elements.map(element => {
|
|
128
|
-
const isActive = activeElement?.value === element.value;
|
|
129
|
-
return createElement(DropdownMenuRadioItemCustom, {
|
|
130
|
-
key: element.value,
|
|
131
|
-
name: `view-table-${filter.field}`,
|
|
132
|
-
value: element.value,
|
|
133
|
-
checked: isActive,
|
|
134
|
-
onClick: () => {
|
|
135
|
-
onChangeView({
|
|
136
|
-
...view,
|
|
137
|
-
page: 1,
|
|
138
|
-
filters: [...otherFilters, {
|
|
139
|
-
field: filter.field,
|
|
140
|
-
operator: activeOperator,
|
|
141
|
-
value: isActive ? undefined : element.value
|
|
142
|
-
}]
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
}, createElement(DropdownMenuItemLabel, null, element.label), !!element.description && createElement(DropdownMenuItemHelpText, null, element.description));
|
|
146
|
-
})), filter.operators.length > 1 && createElement(DropdownMenu, {
|
|
147
|
-
trigger: createElement(DropdownMenuItem, {
|
|
148
|
-
suffix: createElement("span", {
|
|
149
|
-
"aria-hidden": "true"
|
|
150
|
-
}, OPERATORS[activeOperator]?.label)
|
|
151
|
-
}, createElement(DropdownMenuItemLabel, null, __('Conditions')))
|
|
152
|
-
}, Object.entries(OPERATORS).map(([operator, {
|
|
153
|
-
label,
|
|
154
|
-
key
|
|
155
|
-
}]) => createElement(DropdownMenuRadioItem, {
|
|
156
|
-
key: key,
|
|
157
|
-
name: `view-table-${filter.field}-conditions`,
|
|
158
|
-
value: operator,
|
|
159
|
-
checked: activeOperator === operator,
|
|
160
|
-
onChange: e => onChangeView({
|
|
161
|
-
...view,
|
|
162
|
-
page: 1,
|
|
163
|
-
filters: [...otherFilters, {
|
|
164
|
-
field: filter.field,
|
|
165
|
-
operator: e.target.value,
|
|
166
|
-
value: filterInView?.value
|
|
167
|
-
}]
|
|
168
|
-
})
|
|
169
|
-
}, createElement(DropdownMenuItemLabel, null, label)))))))));
|
|
126
|
+
}, createElement(DropdownMenuItemLabel, null, __('Hide')))));
|
|
170
127
|
});
|
|
171
|
-
function WithSeparators({
|
|
172
|
-
children
|
|
173
|
-
}) {
|
|
174
|
-
return Children.toArray(children).filter(Boolean).map((child, i) => createElement(Fragment, {
|
|
175
|
-
key: i
|
|
176
|
-
}, i > 0 && createElement(DropdownMenuSeparator, null), child));
|
|
177
|
-
}
|
|
178
128
|
function BulkSelectionCheckbox({
|
|
179
129
|
selection,
|
|
180
130
|
onSelectionChange,
|
|
@@ -196,46 +146,6 @@ function BulkSelectionCheckbox({
|
|
|
196
146
|
label: areAllSelected ? __('Deselect all') : __('Select all')
|
|
197
147
|
});
|
|
198
148
|
}
|
|
199
|
-
function SingleSelectionCheckbox({
|
|
200
|
-
selection,
|
|
201
|
-
onSelectionChange,
|
|
202
|
-
item,
|
|
203
|
-
data,
|
|
204
|
-
getItemId,
|
|
205
|
-
primaryField
|
|
206
|
-
}) {
|
|
207
|
-
const id = getItemId(item);
|
|
208
|
-
const isSelected = selection.includes(id);
|
|
209
|
-
let selectionLabel;
|
|
210
|
-
if (primaryField?.getValue && item) {
|
|
211
|
-
// eslint-disable-next-line @wordpress/valid-sprintf
|
|
212
|
-
selectionLabel = sprintf( /* translators: %s: item title. */
|
|
213
|
-
isSelected ? __('Deselect item: %s') : __('Select item: %s'), primaryField.getValue({
|
|
214
|
-
item
|
|
215
|
-
}));
|
|
216
|
-
} else {
|
|
217
|
-
selectionLabel = isSelected ? __('Select a new item') : __('Deselect item');
|
|
218
|
-
}
|
|
219
|
-
return createElement(CheckboxControl, {
|
|
220
|
-
className: "dataviews-view-table-selection-checkbox",
|
|
221
|
-
__nextHasNoMarginBottom: true,
|
|
222
|
-
checked: isSelected,
|
|
223
|
-
label: selectionLabel,
|
|
224
|
-
onChange: () => {
|
|
225
|
-
if (!isSelected) {
|
|
226
|
-
onSelectionChange(data.filter(_item => {
|
|
227
|
-
const itemId = getItemId?.(_item);
|
|
228
|
-
return itemId === id || selection.includes(itemId);
|
|
229
|
-
}));
|
|
230
|
-
} else {
|
|
231
|
-
onSelectionChange(data.filter(_item => {
|
|
232
|
-
const itemId = getItemId?.(_item);
|
|
233
|
-
return itemId !== id && selection.includes(itemId);
|
|
234
|
-
}));
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
149
|
function ViewTable({
|
|
240
150
|
view,
|
|
241
151
|
onChangeView,
|
|
@@ -246,7 +156,8 @@ function ViewTable({
|
|
|
246
156
|
isLoading = false,
|
|
247
157
|
deferredRendering,
|
|
248
158
|
selection,
|
|
249
|
-
onSelectionChange
|
|
159
|
+
onSelectionChange,
|
|
160
|
+
setOpenedFilter
|
|
250
161
|
}) {
|
|
251
162
|
const hasBulkActions = actions?.some(action => action.supportsBulk);
|
|
252
163
|
const headerMenuRefs = useRef(new Map());
|
|
@@ -326,7 +237,8 @@ function ViewTable({
|
|
|
326
237
|
field: field,
|
|
327
238
|
view: view,
|
|
328
239
|
onChangeView: onChangeView,
|
|
329
|
-
onHide: onHide
|
|
240
|
+
onHide: onHide,
|
|
241
|
+
setOpenedFilter: setOpenedFilter
|
|
330
242
|
}))), !!actions?.length && createElement("th", {
|
|
331
243
|
"data-field-id": "actions",
|
|
332
244
|
className: "dataviews-view-table__actions-column"
|