@wordpress/dataviews 0.2.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.
Files changed (84) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE.md +788 -0
  3. package/README.md +224 -0
  4. package/build/add-filter.js +90 -0
  5. package/build/add-filter.js.map +1 -0
  6. package/build/constants.js +55 -0
  7. package/build/constants.js.map +1 -0
  8. package/build/dataviews.js +93 -0
  9. package/build/dataviews.js.map +1 -0
  10. package/build/filter-summary.js +137 -0
  11. package/build/filter-summary.js.map +1 -0
  12. package/build/filters.js +75 -0
  13. package/build/filters.js.map +1 -0
  14. package/build/index.js +21 -0
  15. package/build/index.js.map +1 -0
  16. package/build/item-actions.js +185 -0
  17. package/build/item-actions.js.map +1 -0
  18. package/build/lock-unlock.js +18 -0
  19. package/build/lock-unlock.js.map +1 -0
  20. package/build/pagination.js +123 -0
  21. package/build/pagination.js.map +1 -0
  22. package/build/reset-filters.js +33 -0
  23. package/build/reset-filters.js.map +1 -0
  24. package/build/search.js +46 -0
  25. package/build/search.js.map +1 -0
  26. package/build/view-actions.js +223 -0
  27. package/build/view-actions.js.map +1 -0
  28. package/build/view-grid.js +80 -0
  29. package/build/view-grid.js.map +1 -0
  30. package/build/view-list.js +83 -0
  31. package/build/view-list.js.map +1 -0
  32. package/build/view-table.js +286 -0
  33. package/build/view-table.js.map +1 -0
  34. package/build-module/add-filter.js +83 -0
  35. package/build-module/add-filter.js.map +1 -0
  36. package/build-module/constants.js +41 -0
  37. package/build-module/constants.js.map +1 -0
  38. package/build-module/dataviews.js +85 -0
  39. package/build-module/dataviews.js.map +1 -0
  40. package/build-module/filter-summary.js +130 -0
  41. package/build-module/filter-summary.js.map +1 -0
  42. package/build-module/filters.js +67 -0
  43. package/build-module/filters.js.map +1 -0
  44. package/build-module/index.js +3 -0
  45. package/build-module/index.js.map +1 -0
  46. package/build-module/item-actions.js +178 -0
  47. package/build-module/item-actions.js.map +1 -0
  48. package/build-module/lock-unlock.js +9 -0
  49. package/build-module/lock-unlock.js.map +1 -0
  50. package/build-module/pagination.js +115 -0
  51. package/build-module/pagination.js.map +1 -0
  52. package/build-module/reset-filters.js +26 -0
  53. package/build-module/reset-filters.js.map +1 -0
  54. package/build-module/search.js +39 -0
  55. package/build-module/search.js.map +1 -0
  56. package/build-module/view-actions.js +216 -0
  57. package/build-module/view-actions.js.map +1 -0
  58. package/build-module/view-grid.js +72 -0
  59. package/build-module/view-grid.js.map +1 -0
  60. package/build-module/view-list.js +75 -0
  61. package/build-module/view-list.js.map +1 -0
  62. package/build-module/view-table.js +277 -0
  63. package/build-module/view-table.js.map +1 -0
  64. package/build-style/style-rtl.css +325 -0
  65. package/build-style/style.css +325 -0
  66. package/package.json +49 -0
  67. package/src/add-filter.js +106 -0
  68. package/src/constants.js +50 -0
  69. package/src/dataviews.js +99 -0
  70. package/src/filter-summary.js +221 -0
  71. package/src/filters.js +84 -0
  72. package/src/index.js +2 -0
  73. package/src/item-actions.js +211 -0
  74. package/src/lock-unlock.js +10 -0
  75. package/src/pagination.js +144 -0
  76. package/src/reset-filters.js +26 -0
  77. package/src/search.js +38 -0
  78. package/src/stories/fixtures.js +126 -0
  79. package/src/stories/index.story.js +137 -0
  80. package/src/style.scss +245 -0
  81. package/src/view-actions.js +298 -0
  82. package/src/view-grid.js +100 -0
  83. package/src/view-list.js +99 -0
  84. package/src/view-table.js +425 -0
@@ -0,0 +1,39 @@
1
+ import { createElement } from "react";
2
+ /**
3
+ * WordPress dependencies
4
+ */
5
+ import { __ } from '@wordpress/i18n';
6
+ import { useEffect, useRef } from '@wordpress/element';
7
+ import { SearchControl } from '@wordpress/components';
8
+ import { useDebouncedInput } from '@wordpress/compose';
9
+ export default function Search({
10
+ label,
11
+ view,
12
+ onChangeView
13
+ }) {
14
+ const [search, setSearch, debouncedSearch] = useDebouncedInput(view.search);
15
+ useEffect(() => {
16
+ setSearch(view.search);
17
+ }, [view]);
18
+ const onChangeViewRef = useRef(onChangeView);
19
+ useEffect(() => {
20
+ onChangeViewRef.current = onChangeView;
21
+ }, [onChangeView]);
22
+ useEffect(() => {
23
+ onChangeViewRef.current(currentView => ({
24
+ ...currentView,
25
+ page: 1,
26
+ search: debouncedSearch
27
+ }));
28
+ }, [debouncedSearch]);
29
+ const searchLabel = label || __('Filter list');
30
+ return createElement(SearchControl, {
31
+ __nextHasNoMarginBottom: true,
32
+ onChange: setSearch,
33
+ value: search,
34
+ label: searchLabel,
35
+ placeholder: searchLabel,
36
+ size: "compact"
37
+ });
38
+ }
39
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__","useEffect","useRef","SearchControl","useDebouncedInput","Search","label","view","onChangeView","search","setSearch","debouncedSearch","onChangeViewRef","current","currentView","page","searchLabel","createElement","__nextHasNoMarginBottom","onChange","value","placeholder","size"],"sources":["@wordpress/dataviews/src/search.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useEffect, useRef } from '@wordpress/element';\nimport { SearchControl } from '@wordpress/components';\nimport { useDebouncedInput } from '@wordpress/compose';\n\nexport default function Search( { label, view, onChangeView } ) {\n\tconst [ search, setSearch, debouncedSearch ] = useDebouncedInput(\n\t\tview.search\n\t);\n\tuseEffect( () => {\n\t\tsetSearch( view.search );\n\t}, [ view ] );\n\tconst onChangeViewRef = useRef( onChangeView );\n\tuseEffect( () => {\n\t\tonChangeViewRef.current = onChangeView;\n\t}, [ onChangeView ] );\n\tuseEffect( () => {\n\t\tonChangeViewRef.current( ( currentView ) => ( {\n\t\t\t...currentView,\n\t\t\tpage: 1,\n\t\t\tsearch: debouncedSearch,\n\t\t} ) );\n\t}, [ debouncedSearch ] );\n\tconst searchLabel = label || __( 'Filter list' );\n\treturn (\n\t\t<SearchControl\n\t\t\t__nextHasNoMarginBottom\n\t\t\tonChange={ setSearch }\n\t\t\tvalue={ search }\n\t\t\tlabel={ searchLabel }\n\t\t\tplaceholder={ searchLabel }\n\t\t\tsize=\"compact\"\n\t\t/>\n\t);\n}\n"],"mappings":";AAAA;AACA;AACA;AACA,SAASA,EAAE,QAAQ,iBAAiB;AACpC,SAASC,SAAS,EAAEC,MAAM,QAAQ,oBAAoB;AACtD,SAASC,aAAa,QAAQ,uBAAuB;AACrD,SAASC,iBAAiB,QAAQ,oBAAoB;AAEtD,eAAe,SAASC,MAAMA,CAAE;EAAEC,KAAK;EAAEC,IAAI;EAAEC;AAAa,CAAC,EAAG;EAC/D,MAAM,CAAEC,MAAM,EAAEC,SAAS,EAAEC,eAAe,CAAE,GAAGP,iBAAiB,CAC/DG,IAAI,CAACE,MACN,CAAC;EACDR,SAAS,CAAE,MAAM;IAChBS,SAAS,CAAEH,IAAI,CAACE,MAAO,CAAC;EACzB,CAAC,EAAE,CAAEF,IAAI,CAAG,CAAC;EACb,MAAMK,eAAe,GAAGV,MAAM,CAAEM,YAAa,CAAC;EAC9CP,SAAS,CAAE,MAAM;IAChBW,eAAe,CAACC,OAAO,GAAGL,YAAY;EACvC,CAAC,EAAE,CAAEA,YAAY,CAAG,CAAC;EACrBP,SAAS,CAAE,MAAM;IAChBW,eAAe,CAACC,OAAO,CAAIC,WAAW,KAAQ;MAC7C,GAAGA,WAAW;MACdC,IAAI,EAAE,CAAC;MACPN,MAAM,EAAEE;IACT,CAAC,CAAG,CAAC;EACN,CAAC,EAAE,CAAEA,eAAe,CAAG,CAAC;EACxB,MAAMK,WAAW,GAAGV,KAAK,IAAIN,EAAE,CAAE,aAAc,CAAC;EAChD,OACCiB,aAAA,CAACd,aAAa;IACbe,uBAAuB;IACvBC,QAAQ,EAAGT,SAAW;IACtBU,KAAK,EAAGX,MAAQ;IAChBH,KAAK,EAAGU,WAAa;IACrBK,WAAW,EAAGL,WAAa;IAC3BM,IAAI,EAAC;EAAS,CACd,CAAC;AAEJ"}
@@ -0,0 +1,216 @@
1
+ import { createElement, Fragment } from "react";
2
+ /**
3
+ * WordPress dependencies
4
+ */
5
+ import { Button, Icon, privateApis as componentsPrivateApis } from '@wordpress/components';
6
+ import { chevronRightSmall, check, arrowUp, arrowDown } from '@wordpress/icons';
7
+ import { __ } from '@wordpress/i18n';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import { unlock } from './lock-unlock';
13
+ import { VIEW_LAYOUTS, LAYOUT_TABLE } from './constants';
14
+ const {
15
+ DropdownMenuV2: DropdownMenu,
16
+ DropdownMenuGroupV2: DropdownMenuGroup,
17
+ DropdownMenuItemV2: DropdownMenuItem,
18
+ DropdownSubMenuV2: DropdownSubMenu,
19
+ DropdownSubMenuTriggerV2: DropdownSubMenuTrigger
20
+ } = unlock(componentsPrivateApis);
21
+ function ViewTypeMenu({
22
+ view,
23
+ onChangeView,
24
+ supportedLayouts
25
+ }) {
26
+ let _availableViews = VIEW_LAYOUTS;
27
+ if (supportedLayouts) {
28
+ _availableViews = _availableViews.filter(_view => supportedLayouts.includes(_view.type));
29
+ }
30
+ if (_availableViews.length === 1) {
31
+ return null;
32
+ }
33
+ const activeView = _availableViews.find(v => view.type === v.type);
34
+ return createElement(DropdownSubMenu, {
35
+ trigger: createElement(DropdownSubMenuTrigger, {
36
+ suffix: createElement(Fragment, null, activeView.label, createElement(Icon, {
37
+ icon: chevronRightSmall
38
+ }))
39
+ }, __('Layout'))
40
+ }, _availableViews.map(availableView => {
41
+ return createElement(DropdownMenuItem, {
42
+ key: availableView.type,
43
+ role: "menuitemradio",
44
+ "aria-checked": availableView.id === view.type,
45
+ prefix: availableView.type === view.type && createElement(Icon, {
46
+ icon: check
47
+ }),
48
+ onSelect: event => {
49
+ // We need to handle this on DropDown component probably..
50
+ event.preventDefault();
51
+ onChangeView({
52
+ ...view,
53
+ type: availableView.type
54
+ });
55
+ }
56
+ }, availableView.label);
57
+ }));
58
+ }
59
+ const PAGE_SIZE_VALUES = [10, 20, 50, 100];
60
+ function PageSizeMenu({
61
+ view,
62
+ onChangeView
63
+ }) {
64
+ return createElement(DropdownSubMenu, {
65
+ trigger: createElement(DropdownSubMenuTrigger, {
66
+ suffix: createElement(Fragment, null, view.perPage, createElement(Icon, {
67
+ icon: chevronRightSmall
68
+ }))
69
+ }, __('Rows per page'))
70
+ }, PAGE_SIZE_VALUES.map(size => {
71
+ return createElement(DropdownMenuItem, {
72
+ key: size,
73
+ role: "menuitemradio",
74
+ "aria-checked": view.perPage === size,
75
+ prefix: view.perPage === size && createElement(Icon, {
76
+ icon: check
77
+ }),
78
+ onSelect: event => {
79
+ // We need to handle this on DropDown component probably..
80
+ event.preventDefault();
81
+ onChangeView({
82
+ ...view,
83
+ perPage: size,
84
+ page: 1
85
+ });
86
+ }
87
+ }, size);
88
+ }));
89
+ }
90
+ function FieldsVisibilityMenu({
91
+ view,
92
+ onChangeView,
93
+ fields
94
+ }) {
95
+ const hidableFields = fields.filter(field => field.enableHiding !== false && field.id !== view.layout.mediaField);
96
+ if (!hidableFields?.length) {
97
+ return null;
98
+ }
99
+ return createElement(DropdownSubMenu, {
100
+ trigger: createElement(DropdownSubMenuTrigger, {
101
+ suffix: createElement(Icon, {
102
+ icon: chevronRightSmall
103
+ })
104
+ }, __('Fields'))
105
+ }, hidableFields?.map(field => {
106
+ return createElement(DropdownMenuItem, {
107
+ key: field.id,
108
+ role: "menuitemcheckbox",
109
+ prefix: !view.hiddenFields?.includes(field.id) && createElement(Icon, {
110
+ icon: check
111
+ }),
112
+ onSelect: event => {
113
+ event.preventDefault();
114
+ onChangeView({
115
+ ...view,
116
+ hiddenFields: view.hiddenFields?.includes(field.id) ? view.hiddenFields.filter(id => id !== field.id) : [...(view.hiddenFields || []), field.id]
117
+ });
118
+ }
119
+ }, field.header);
120
+ }));
121
+ }
122
+
123
+ // This object is used to construct the sorting options per sortable field.
124
+ const sortingItemsInfo = {
125
+ asc: {
126
+ icon: arrowUp,
127
+ label: __('Sort ascending')
128
+ },
129
+ desc: {
130
+ icon: arrowDown,
131
+ label: __('Sort descending')
132
+ }
133
+ };
134
+ function SortMenu({
135
+ fields,
136
+ view,
137
+ onChangeView
138
+ }) {
139
+ const sortableFields = fields.filter(field => field.enableSorting !== false);
140
+ if (!sortableFields?.length) {
141
+ return null;
142
+ }
143
+ const currentSortedField = fields.find(field => field.id === view.sort?.field);
144
+ return createElement(DropdownSubMenu, {
145
+ trigger: createElement(DropdownSubMenuTrigger, {
146
+ suffix: createElement(Fragment, null, currentSortedField?.header, createElement(Icon, {
147
+ icon: chevronRightSmall
148
+ }))
149
+ }, __('Sort by'))
150
+ }, sortableFields?.map(field => {
151
+ const sortedDirection = view.sort?.direction;
152
+ return createElement(DropdownSubMenu, {
153
+ key: field.id,
154
+ trigger: createElement(DropdownSubMenuTrigger, {
155
+ suffix: createElement(Icon, {
156
+ icon: chevronRightSmall
157
+ })
158
+ }, field.header),
159
+ side: "left"
160
+ }, Object.entries(sortingItemsInfo).map(([direction, info]) => {
161
+ const isActive = currentSortedField && sortedDirection === direction && field.id === currentSortedField.id;
162
+ return createElement(DropdownMenuItem, {
163
+ key: direction,
164
+ role: "menuitemradio",
165
+ "aria-checked": isActive,
166
+ prefix: createElement(Icon, {
167
+ icon: info.icon
168
+ }),
169
+ suffix: isActive && createElement(Icon, {
170
+ icon: check
171
+ }),
172
+ onSelect: event => {
173
+ event.preventDefault();
174
+ onChangeView({
175
+ ...view,
176
+ sort: {
177
+ field: field.id,
178
+ direction
179
+ }
180
+ });
181
+ }
182
+ }, info.label);
183
+ }));
184
+ }));
185
+ }
186
+ export default function ViewActions({
187
+ fields,
188
+ view,
189
+ onChangeView,
190
+ supportedLayouts
191
+ }) {
192
+ return createElement(DropdownMenu, {
193
+ trigger: createElement(Button, {
194
+ variant: "tertiary",
195
+ size: "compact",
196
+ icon: VIEW_LAYOUTS.find(v => v.type === view.type)?.icon || VIEW_LAYOUTS.find(v => v.type === LAYOUT_TABLE).icon,
197
+ label: __('View options')
198
+ })
199
+ }, createElement(DropdownMenuGroup, null, createElement(ViewTypeMenu, {
200
+ view: view,
201
+ onChangeView: onChangeView,
202
+ supportedLayouts: supportedLayouts
203
+ }), createElement(SortMenu, {
204
+ fields: fields,
205
+ view: view,
206
+ onChangeView: onChangeView
207
+ }), createElement(FieldsVisibilityMenu, {
208
+ fields: fields,
209
+ view: view,
210
+ onChangeView: onChangeView
211
+ }), createElement(PageSizeMenu, {
212
+ view: view,
213
+ onChangeView: onChangeView
214
+ })));
215
+ }
216
+ //# sourceMappingURL=view-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Button","Icon","privateApis","componentsPrivateApis","chevronRightSmall","check","arrowUp","arrowDown","__","unlock","VIEW_LAYOUTS","LAYOUT_TABLE","DropdownMenuV2","DropdownMenu","DropdownMenuGroupV2","DropdownMenuGroup","DropdownMenuItemV2","DropdownMenuItem","DropdownSubMenuV2","DropdownSubMenu","DropdownSubMenuTriggerV2","DropdownSubMenuTrigger","ViewTypeMenu","view","onChangeView","supportedLayouts","_availableViews","filter","_view","includes","type","length","activeView","find","v","createElement","trigger","suffix","Fragment","label","icon","map","availableView","key","role","id","prefix","onSelect","event","preventDefault","PAGE_SIZE_VALUES","PageSizeMenu","perPage","size","page","FieldsVisibilityMenu","fields","hidableFields","field","enableHiding","layout","mediaField","hiddenFields","header","sortingItemsInfo","asc","desc","SortMenu","sortableFields","enableSorting","currentSortedField","sort","sortedDirection","direction","side","Object","entries","info","isActive","ViewActions","variant"],"sources":["@wordpress/dataviews/src/view-actions.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tButton,\n\tIcon,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { chevronRightSmall, check, arrowUp, arrowDown } from '@wordpress/icons';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from './lock-unlock';\nimport { VIEW_LAYOUTS, LAYOUT_TABLE } from './constants';\n\nconst {\n\tDropdownMenuV2: DropdownMenu,\n\tDropdownMenuGroupV2: DropdownMenuGroup,\n\tDropdownMenuItemV2: DropdownMenuItem,\n\tDropdownSubMenuV2: DropdownSubMenu,\n\tDropdownSubMenuTriggerV2: DropdownSubMenuTrigger,\n} = unlock( componentsPrivateApis );\n\nfunction ViewTypeMenu( { view, onChangeView, supportedLayouts } ) {\n\tlet _availableViews = VIEW_LAYOUTS;\n\tif ( supportedLayouts ) {\n\t\t_availableViews = _availableViews.filter( ( _view ) =>\n\t\t\tsupportedLayouts.includes( _view.type )\n\t\t);\n\t}\n\tif ( _availableViews.length === 1 ) {\n\t\treturn null;\n\t}\n\tconst activeView = _availableViews.find( ( v ) => view.type === v.type );\n\treturn (\n\t\t<DropdownSubMenu\n\t\t\ttrigger={\n\t\t\t\t<DropdownSubMenuTrigger\n\t\t\t\t\tsuffix={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{ activeView.label }\n\t\t\t\t\t\t\t<Icon icon={ chevronRightSmall } />\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Layout' ) }\n\t\t\t\t</DropdownSubMenuTrigger>\n\t\t\t}\n\t\t>\n\t\t\t{ _availableViews.map( ( availableView ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={ availableView.type }\n\t\t\t\t\t\trole=\"menuitemradio\"\n\t\t\t\t\t\taria-checked={ availableView.id === view.type }\n\t\t\t\t\t\tprefix={\n\t\t\t\t\t\t\tavailableView.type === view.type && (\n\t\t\t\t\t\t\t\t<Icon icon={ check } />\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonSelect={ ( event ) => {\n\t\t\t\t\t\t\t// We need to handle this on DropDown component probably..\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tonChangeView( {\n\t\t\t\t\t\t\t\t...view,\n\t\t\t\t\t\t\t\ttype: availableView.type,\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\t\t{ availableView.label }\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</DropdownSubMenu>\n\t);\n}\n\nconst PAGE_SIZE_VALUES = [ 10, 20, 50, 100 ];\nfunction PageSizeMenu( { view, onChangeView } ) {\n\treturn (\n\t\t<DropdownSubMenu\n\t\t\ttrigger={\n\t\t\t\t<DropdownSubMenuTrigger\n\t\t\t\t\tsuffix={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{ view.perPage }\n\t\t\t\t\t\t\t<Icon icon={ chevronRightSmall } />\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{ /* TODO: probably label per view type. */ }\n\t\t\t\t\t{ __( 'Rows per page' ) }\n\t\t\t\t</DropdownSubMenuTrigger>\n\t\t\t}\n\t\t>\n\t\t\t{ PAGE_SIZE_VALUES.map( ( size ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={ size }\n\t\t\t\t\t\trole=\"menuitemradio\"\n\t\t\t\t\t\taria-checked={ view.perPage === size }\n\t\t\t\t\t\tprefix={\n\t\t\t\t\t\t\tview.perPage === size && <Icon icon={ check } />\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonSelect={ ( event ) => {\n\t\t\t\t\t\t\t// We need to handle this on DropDown component probably..\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tonChangeView( { ...view, perPage: size, page: 1 } );\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ size }\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</DropdownSubMenu>\n\t);\n}\n\nfunction FieldsVisibilityMenu( { view, onChangeView, fields } ) {\n\tconst hidableFields = fields.filter(\n\t\t( field ) =>\n\t\t\tfield.enableHiding !== false && field.id !== view.layout.mediaField\n\t);\n\tif ( ! hidableFields?.length ) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<DropdownSubMenu\n\t\t\ttrigger={\n\t\t\t\t<DropdownSubMenuTrigger\n\t\t\t\t\tsuffix={ <Icon icon={ chevronRightSmall } /> }\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Fields' ) }\n\t\t\t\t</DropdownSubMenuTrigger>\n\t\t\t}\n\t\t>\n\t\t\t{ hidableFields?.map( ( field ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={ field.id }\n\t\t\t\t\t\trole=\"menuitemcheckbox\"\n\t\t\t\t\t\tprefix={\n\t\t\t\t\t\t\t! view.hiddenFields?.includes( field.id ) && (\n\t\t\t\t\t\t\t\t<Icon icon={ check } />\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonSelect={ ( event ) => {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tonChangeView( {\n\t\t\t\t\t\t\t\t...view,\n\t\t\t\t\t\t\t\thiddenFields: view.hiddenFields?.includes(\n\t\t\t\t\t\t\t\t\tfield.id\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t? view.hiddenFields.filter(\n\t\t\t\t\t\t\t\t\t\t\t( id ) => id !== field.id\n\t\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t\t...( view.hiddenFields || [] ),\n\t\t\t\t\t\t\t\t\t\t\tfield.id,\n\t\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\t\t{ field.header }\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</DropdownSubMenu>\n\t);\n}\n\n// This object is used to construct the sorting options per sortable field.\nconst sortingItemsInfo = {\n\tasc: { icon: arrowUp, label: __( 'Sort ascending' ) },\n\tdesc: { icon: arrowDown, label: __( 'Sort descending' ) },\n};\nfunction SortMenu( { fields, view, onChangeView } ) {\n\tconst sortableFields = fields.filter(\n\t\t( field ) => field.enableSorting !== false\n\t);\n\tif ( ! sortableFields?.length ) {\n\t\treturn null;\n\t}\n\tconst currentSortedField = fields.find(\n\t\t( field ) => field.id === view.sort?.field\n\t);\n\treturn (\n\t\t<DropdownSubMenu\n\t\t\ttrigger={\n\t\t\t\t<DropdownSubMenuTrigger\n\t\t\t\t\tsuffix={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{ currentSortedField?.header }\n\t\t\t\t\t\t\t<Icon icon={ chevronRightSmall } />\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Sort by' ) }\n\t\t\t\t</DropdownSubMenuTrigger>\n\t\t\t}\n\t\t>\n\t\t\t{ sortableFields?.map( ( field ) => {\n\t\t\t\tconst sortedDirection = view.sort?.direction;\n\t\t\t\treturn (\n\t\t\t\t\t<DropdownSubMenu\n\t\t\t\t\t\tkey={ field.id }\n\t\t\t\t\t\ttrigger={\n\t\t\t\t\t\t\t<DropdownSubMenuTrigger\n\t\t\t\t\t\t\t\tsuffix={ <Icon icon={ chevronRightSmall } /> }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ field.header }\n\t\t\t\t\t\t\t</DropdownSubMenuTrigger>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tside=\"left\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ Object.entries( sortingItemsInfo ).map(\n\t\t\t\t\t\t\t( [ direction, info ] ) => {\n\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\tcurrentSortedField &&\n\t\t\t\t\t\t\t\t\tsortedDirection === direction &&\n\t\t\t\t\t\t\t\t\tfield.id === currentSortedField.id;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\t\t\tkey={ direction }\n\t\t\t\t\t\t\t\t\t\trole=\"menuitemradio\"\n\t\t\t\t\t\t\t\t\t\taria-checked={ isActive }\n\t\t\t\t\t\t\t\t\t\tprefix={ <Icon icon={ info.icon } /> }\n\t\t\t\t\t\t\t\t\t\tsuffix={\n\t\t\t\t\t\t\t\t\t\t\tisActive && <Icon icon={ check } />\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tonSelect={ ( event ) => {\n\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\tonChangeView( {\n\t\t\t\t\t\t\t\t\t\t\t\t...view,\n\t\t\t\t\t\t\t\t\t\t\t\tsort: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield: field.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdirection,\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} }\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ info.label }\n\t\t\t\t\t\t\t\t\t</DropdownMenuItem>\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</DropdownSubMenu>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</DropdownSubMenu>\n\t);\n}\n\nexport default function ViewActions( {\n\tfields,\n\tview,\n\tonChangeView,\n\tsupportedLayouts,\n} ) {\n\treturn (\n\t\t<DropdownMenu\n\t\t\ttrigger={\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\ticon={\n\t\t\t\t\t\tVIEW_LAYOUTS.find( ( v ) => v.type === view.type )\n\t\t\t\t\t\t\t?.icon ||\n\t\t\t\t\t\tVIEW_LAYOUTS.find( ( v ) => v.type === LAYOUT_TABLE )\n\t\t\t\t\t\t\t.icon\n\t\t\t\t\t}\n\t\t\t\t\tlabel={ __( 'View options' ) }\n\t\t\t\t/>\n\t\t\t}\n\t\t>\n\t\t\t<DropdownMenuGroup>\n\t\t\t\t<ViewTypeMenu\n\t\t\t\t\tview={ view }\n\t\t\t\t\tonChangeView={ onChangeView }\n\t\t\t\t\tsupportedLayouts={ supportedLayouts }\n\t\t\t\t/>\n\t\t\t\t<SortMenu\n\t\t\t\t\tfields={ fields }\n\t\t\t\t\tview={ view }\n\t\t\t\t\tonChangeView={ onChangeView }\n\t\t\t\t/>\n\t\t\t\t<FieldsVisibilityMenu\n\t\t\t\t\tfields={ fields }\n\t\t\t\t\tview={ view }\n\t\t\t\t\tonChangeView={ onChangeView }\n\t\t\t\t/>\n\t\t\t\t<PageSizeMenu view={ view } onChangeView={ onChangeView } />\n\t\t\t</DropdownMenuGroup>\n\t\t</DropdownMenu>\n\t);\n}\n"],"mappings":";AAAA;AACA;AACA;AACA,SACCA,MAAM,EACNC,IAAI,EACJC,WAAW,IAAIC,qBAAqB,QAC9B,uBAAuB;AAC9B,SAASC,iBAAiB,EAAEC,KAAK,EAAEC,OAAO,EAAEC,SAAS,QAAQ,kBAAkB;AAC/E,SAASC,EAAE,QAAQ,iBAAiB;;AAEpC;AACA;AACA;AACA,SAASC,MAAM,QAAQ,eAAe;AACtC,SAASC,YAAY,EAAEC,YAAY,QAAQ,aAAa;AAExD,MAAM;EACLC,cAAc,EAAEC,YAAY;EAC5BC,mBAAmB,EAAEC,iBAAiB;EACtCC,kBAAkB,EAAEC,gBAAgB;EACpCC,iBAAiB,EAAEC,eAAe;EAClCC,wBAAwB,EAAEC;AAC3B,CAAC,GAAGZ,MAAM,CAAEN,qBAAsB,CAAC;AAEnC,SAASmB,YAAYA,CAAE;EAAEC,IAAI;EAAEC,YAAY;EAAEC;AAAiB,CAAC,EAAG;EACjE,IAAIC,eAAe,GAAGhB,YAAY;EAClC,IAAKe,gBAAgB,EAAG;IACvBC,eAAe,GAAGA,eAAe,CAACC,MAAM,CAAIC,KAAK,IAChDH,gBAAgB,CAACI,QAAQ,CAAED,KAAK,CAACE,IAAK,CACvC,CAAC;EACF;EACA,IAAKJ,eAAe,CAACK,MAAM,KAAK,CAAC,EAAG;IACnC,OAAO,IAAI;EACZ;EACA,MAAMC,UAAU,GAAGN,eAAe,CAACO,IAAI,CAAIC,CAAC,IAAMX,IAAI,CAACO,IAAI,KAAKI,CAAC,CAACJ,IAAK,CAAC;EACxE,OACCK,aAAA,CAAChB,eAAe;IACfiB,OAAO,EACND,aAAA,CAACd,sBAAsB;MACtBgB,MAAM,EACLF,aAAA,CAAAG,QAAA,QACGN,UAAU,CAACO,KAAK,EAClBJ,aAAA,CAAClC,IAAI;QAACuC,IAAI,EAAGpC;MAAmB,CAAE,CACjC;IACF,GAECI,EAAE,CAAE,QAAS,CACQ;EACxB,GAECkB,eAAe,CAACe,GAAG,CAAIC,aAAa,IAAM;IAC3C,OACCP,aAAA,CAAClB,gBAAgB;MAChB0B,GAAG,EAAGD,aAAa,CAACZ,IAAM;MAC1Bc,IAAI,EAAC,eAAe;MACpB,gBAAeF,aAAa,CAACG,EAAE,KAAKtB,IAAI,CAACO,IAAM;MAC/CgB,MAAM,EACLJ,aAAa,CAACZ,IAAI,KAAKP,IAAI,CAACO,IAAI,IAC/BK,aAAA,CAAClC,IAAI;QAACuC,IAAI,EAAGnC;MAAO,CAAE,CAEvB;MACD0C,QAAQ,EAAKC,KAAK,IAAM;QACvB;QACAA,KAAK,CAACC,cAAc,CAAC,CAAC;QACtBzB,YAAY,CAAE;UACb,GAAGD,IAAI;UACPO,IAAI,EAAEY,aAAa,CAACZ;QACrB,CAAE,CAAC;MACJ;IAAG,GAEDY,aAAa,CAACH,KACC,CAAC;EAErB,CAAE,CACc,CAAC;AAEpB;AAEA,MAAMW,gBAAgB,GAAG,CAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAE;AAC5C,SAASC,YAAYA,CAAE;EAAE5B,IAAI;EAAEC;AAAa,CAAC,EAAG;EAC/C,OACCW,aAAA,CAAChB,eAAe;IACfiB,OAAO,EACND,aAAA,CAACd,sBAAsB;MACtBgB,MAAM,EACLF,aAAA,CAAAG,QAAA,QACGf,IAAI,CAAC6B,OAAO,EACdjB,aAAA,CAAClC,IAAI;QAACuC,IAAI,EAAGpC;MAAmB,CAAE,CACjC;IACF,GAGCI,EAAE,CAAE,eAAgB,CACC;EACxB,GAEC0C,gBAAgB,CAACT,GAAG,CAAIY,IAAI,IAAM;IACnC,OACClB,aAAA,CAAClB,gBAAgB;MAChB0B,GAAG,EAAGU,IAAM;MACZT,IAAI,EAAC,eAAe;MACpB,gBAAerB,IAAI,CAAC6B,OAAO,KAAKC,IAAM;MACtCP,MAAM,EACLvB,IAAI,CAAC6B,OAAO,KAAKC,IAAI,IAAIlB,aAAA,CAAClC,IAAI;QAACuC,IAAI,EAAGnC;MAAO,CAAE,CAC/C;MACD0C,QAAQ,EAAKC,KAAK,IAAM;QACvB;QACAA,KAAK,CAACC,cAAc,CAAC,CAAC;QACtBzB,YAAY,CAAE;UAAE,GAAGD,IAAI;UAAE6B,OAAO,EAAEC,IAAI;UAAEC,IAAI,EAAE;QAAE,CAAE,CAAC;MACpD;IAAG,GAEDD,IACe,CAAC;EAErB,CAAE,CACc,CAAC;AAEpB;AAEA,SAASE,oBAAoBA,CAAE;EAAEhC,IAAI;EAAEC,YAAY;EAAEgC;AAAO,CAAC,EAAG;EAC/D,MAAMC,aAAa,GAAGD,MAAM,CAAC7B,MAAM,CAChC+B,KAAK,IACNA,KAAK,CAACC,YAAY,KAAK,KAAK,IAAID,KAAK,CAACb,EAAE,KAAKtB,IAAI,CAACqC,MAAM,CAACC,UAC3D,CAAC;EACD,IAAK,CAAEJ,aAAa,EAAE1B,MAAM,EAAG;IAC9B,OAAO,IAAI;EACZ;EACA,OACCI,aAAA,CAAChB,eAAe;IACfiB,OAAO,EACND,aAAA,CAACd,sBAAsB;MACtBgB,MAAM,EAAGF,aAAA,CAAClC,IAAI;QAACuC,IAAI,EAAGpC;MAAmB,CAAE;IAAG,GAE5CI,EAAE,CAAE,QAAS,CACQ;EACxB,GAECiD,aAAa,EAAEhB,GAAG,CAAIiB,KAAK,IAAM;IAClC,OACCvB,aAAA,CAAClB,gBAAgB;MAChB0B,GAAG,EAAGe,KAAK,CAACb,EAAI;MAChBD,IAAI,EAAC,kBAAkB;MACvBE,MAAM,EACL,CAAEvB,IAAI,CAACuC,YAAY,EAAEjC,QAAQ,CAAE6B,KAAK,CAACb,EAAG,CAAC,IACxCV,aAAA,CAAClC,IAAI;QAACuC,IAAI,EAAGnC;MAAO,CAAE,CAEvB;MACD0C,QAAQ,EAAKC,KAAK,IAAM;QACvBA,KAAK,CAACC,cAAc,CAAC,CAAC;QACtBzB,YAAY,CAAE;UACb,GAAGD,IAAI;UACPuC,YAAY,EAAEvC,IAAI,CAACuC,YAAY,EAAEjC,QAAQ,CACxC6B,KAAK,CAACb,EACP,CAAC,GACEtB,IAAI,CAACuC,YAAY,CAACnC,MAAM,CACtBkB,EAAE,IAAMA,EAAE,KAAKa,KAAK,CAACb,EACvB,CAAC,GACD,CACA,IAAKtB,IAAI,CAACuC,YAAY,IAAI,EAAE,CAAE,EAC9BJ,KAAK,CAACb,EAAE;QAEZ,CAAE,CAAC;MACJ;IAAG,GAEDa,KAAK,CAACK,MACS,CAAC;EAErB,CAAE,CACc,CAAC;AAEpB;;AAEA;AACA,MAAMC,gBAAgB,GAAG;EACxBC,GAAG,EAAE;IAAEzB,IAAI,EAAElC,OAAO;IAAEiC,KAAK,EAAE/B,EAAE,CAAE,gBAAiB;EAAE,CAAC;EACrD0D,IAAI,EAAE;IAAE1B,IAAI,EAAEjC,SAAS;IAAEgC,KAAK,EAAE/B,EAAE,CAAE,iBAAkB;EAAE;AACzD,CAAC;AACD,SAAS2D,QAAQA,CAAE;EAAEX,MAAM;EAAEjC,IAAI;EAAEC;AAAa,CAAC,EAAG;EACnD,MAAM4C,cAAc,GAAGZ,MAAM,CAAC7B,MAAM,CACjC+B,KAAK,IAAMA,KAAK,CAACW,aAAa,KAAK,KACtC,CAAC;EACD,IAAK,CAAED,cAAc,EAAErC,MAAM,EAAG;IAC/B,OAAO,IAAI;EACZ;EACA,MAAMuC,kBAAkB,GAAGd,MAAM,CAACvB,IAAI,CACnCyB,KAAK,IAAMA,KAAK,CAACb,EAAE,KAAKtB,IAAI,CAACgD,IAAI,EAAEb,KACtC,CAAC;EACD,OACCvB,aAAA,CAAChB,eAAe;IACfiB,OAAO,EACND,aAAA,CAACd,sBAAsB;MACtBgB,MAAM,EACLF,aAAA,CAAAG,QAAA,QACGgC,kBAAkB,EAAEP,MAAM,EAC5B5B,aAAA,CAAClC,IAAI;QAACuC,IAAI,EAAGpC;MAAmB,CAAE,CACjC;IACF,GAECI,EAAE,CAAE,SAAU,CACO;EACxB,GAEC4D,cAAc,EAAE3B,GAAG,CAAIiB,KAAK,IAAM;IACnC,MAAMc,eAAe,GAAGjD,IAAI,CAACgD,IAAI,EAAEE,SAAS;IAC5C,OACCtC,aAAA,CAAChB,eAAe;MACfwB,GAAG,EAAGe,KAAK,CAACb,EAAI;MAChBT,OAAO,EACND,aAAA,CAACd,sBAAsB;QACtBgB,MAAM,EAAGF,aAAA,CAAClC,IAAI;UAACuC,IAAI,EAAGpC;QAAmB,CAAE;MAAG,GAE5CsD,KAAK,CAACK,MACe,CACxB;MACDW,IAAI,EAAC;IAAM,GAETC,MAAM,CAACC,OAAO,CAAEZ,gBAAiB,CAAC,CAACvB,GAAG,CACvC,CAAE,CAAEgC,SAAS,EAAEI,IAAI,CAAE,KAAM;MAC1B,MAAMC,QAAQ,GACbR,kBAAkB,IAClBE,eAAe,KAAKC,SAAS,IAC7Bf,KAAK,CAACb,EAAE,KAAKyB,kBAAkB,CAACzB,EAAE;MACnC,OACCV,aAAA,CAAClB,gBAAgB;QAChB0B,GAAG,EAAG8B,SAAW;QACjB7B,IAAI,EAAC,eAAe;QACpB,gBAAekC,QAAU;QACzBhC,MAAM,EAAGX,aAAA,CAAClC,IAAI;UAACuC,IAAI,EAAGqC,IAAI,CAACrC;QAAM,CAAE,CAAG;QACtCH,MAAM,EACLyC,QAAQ,IAAI3C,aAAA,CAAClC,IAAI;UAACuC,IAAI,EAAGnC;QAAO,CAAE,CAClC;QACD0C,QAAQ,EAAKC,KAAK,IAAM;UACvBA,KAAK,CAACC,cAAc,CAAC,CAAC;UACtBzB,YAAY,CAAE;YACb,GAAGD,IAAI;YACPgD,IAAI,EAAE;cACLb,KAAK,EAAEA,KAAK,CAACb,EAAE;cACf4B;YACD;UACD,CAAE,CAAC;QACJ;MAAG,GAEDI,IAAI,CAACtC,KACU,CAAC;IAErB,CACD,CACgB,CAAC;EAEpB,CAAE,CACc,CAAC;AAEpB;AAEA,eAAe,SAASwC,WAAWA,CAAE;EACpCvB,MAAM;EACNjC,IAAI;EACJC,YAAY;EACZC;AACD,CAAC,EAAG;EACH,OACCU,aAAA,CAACtB,YAAY;IACZuB,OAAO,EACND,aAAA,CAACnC,MAAM;MACNgF,OAAO,EAAC,UAAU;MAClB3B,IAAI,EAAC,SAAS;MACdb,IAAI,EACH9B,YAAY,CAACuB,IAAI,CAAIC,CAAC,IAAMA,CAAC,CAACJ,IAAI,KAAKP,IAAI,CAACO,IAAK,CAAC,EAC/CU,IAAI,IACP9B,YAAY,CAACuB,IAAI,CAAIC,CAAC,IAAMA,CAAC,CAACJ,IAAI,KAAKnB,YAAa,CAAC,CACnD6B,IACF;MACDD,KAAK,EAAG/B,EAAE,CAAE,cAAe;IAAG,CAC9B;EACD,GAED2B,aAAA,CAACpB,iBAAiB,QACjBoB,aAAA,CAACb,YAAY;IACZC,IAAI,EAAGA,IAAM;IACbC,YAAY,EAAGA,YAAc;IAC7BC,gBAAgB,EAAGA;EAAkB,CACrC,CAAC,EACFU,aAAA,CAACgC,QAAQ;IACRX,MAAM,EAAGA,MAAQ;IACjBjC,IAAI,EAAGA,IAAM;IACbC,YAAY,EAAGA;EAAc,CAC7B,CAAC,EACFW,aAAA,CAACoB,oBAAoB;IACpBC,MAAM,EAAGA,MAAQ;IACjBjC,IAAI,EAAGA,IAAM;IACbC,YAAY,EAAGA;EAAc,CAC7B,CAAC,EACFW,aAAA,CAACgB,YAAY;IAAC5B,IAAI,EAAGA,IAAM;IAACC,YAAY,EAAGA;EAAc,CAAE,CACzC,CACN,CAAC;AAEjB"}
@@ -0,0 +1,72 @@
1
+ import { createElement } from "react";
2
+ /**
3
+ * WordPress dependencies
4
+ */
5
+ import { FlexBlock, __experimentalGrid as Grid, __experimentalHStack as HStack, __experimentalVStack as VStack } from '@wordpress/components';
6
+ import { useAsyncList } from '@wordpress/compose';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import ItemActions from './item-actions';
12
+ export default function ViewGrid({
13
+ data,
14
+ fields,
15
+ view,
16
+ actions,
17
+ getItemId,
18
+ deferredRendering
19
+ }) {
20
+ const mediaField = fields.find(field => field.id === view.layout.mediaField);
21
+ const primaryField = fields.find(field => field.id === view.layout.primaryField);
22
+ const visibleFields = fields.filter(field => !view.hiddenFields.includes(field.id) && ![view.layout.mediaField, view.layout.primaryField].includes(field.id));
23
+ const shownData = useAsyncList(data, {
24
+ step: 3
25
+ });
26
+ const usedData = deferredRendering ? shownData : data;
27
+ return createElement(Grid, {
28
+ gap: 8,
29
+ columns: 2,
30
+ alignment: "top",
31
+ className: "dataviews-grid-view"
32
+ }, usedData.map((item, index) => createElement(VStack, {
33
+ spacing: 3,
34
+ key: getItemId?.(item) || index,
35
+ className: "dataviews-view-grid__card"
36
+ }, createElement("div", {
37
+ className: "dataviews-view-grid__media"
38
+ }, mediaField?.render({
39
+ item
40
+ })), createElement(HStack, {
41
+ className: "dataviews-view-grid__primary-field",
42
+ justify: "space-between"
43
+ }, createElement(FlexBlock, null, primaryField?.render({
44
+ item
45
+ })), createElement(ItemActions, {
46
+ item: item,
47
+ actions: actions,
48
+ isCompact: true
49
+ })), createElement(VStack, {
50
+ className: "dataviews-view-grid__fields",
51
+ spacing: 3
52
+ }, visibleFields.map(field => {
53
+ const renderedValue = field.render({
54
+ item
55
+ });
56
+ if (!renderedValue) {
57
+ return null;
58
+ }
59
+ return createElement(VStack, {
60
+ className: "dataviews-view-grid__field",
61
+ key: field.id,
62
+ spacing: 1
63
+ }, createElement("div", {
64
+ className: "dataviews-view-grid__field-header"
65
+ }, field.header), createElement("div", {
66
+ className: "dataviews-view-grid__field-value"
67
+ }, field.render({
68
+ item
69
+ })));
70
+ })))));
71
+ }
72
+ //# sourceMappingURL=view-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FlexBlock","__experimentalGrid","Grid","__experimentalHStack","HStack","__experimentalVStack","VStack","useAsyncList","ItemActions","ViewGrid","data","fields","view","actions","getItemId","deferredRendering","mediaField","find","field","id","layout","primaryField","visibleFields","filter","hiddenFields","includes","shownData","step","usedData","createElement","gap","columns","alignment","className","map","item","index","spacing","key","render","justify","isCompact","renderedValue","header"],"sources":["@wordpress/dataviews/src/view-grid.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tFlexBlock,\n\t__experimentalGrid as Grid,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n} from '@wordpress/components';\nimport { useAsyncList } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport ItemActions from './item-actions';\n\nexport default function ViewGrid( {\n\tdata,\n\tfields,\n\tview,\n\tactions,\n\tgetItemId,\n\tdeferredRendering,\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={ 8 }\n\t\t\tcolumns={ 2 }\n\t\t\talignment=\"top\"\n\t\t\tclassName=\"dataviews-grid-view\"\n\t\t>\n\t\t\t{ usedData.map( ( item, index ) => (\n\t\t\t\t<VStack\n\t\t\t\t\tspacing={ 3 }\n\t\t\t\t\tkey={ getItemId?.( item ) || index }\n\t\t\t\t\tclassName=\"dataviews-view-grid__card\"\n\t\t\t\t>\n\t\t\t\t\t<div className=\"dataviews-view-grid__media\">\n\t\t\t\t\t\t{ mediaField?.render( { item } ) }\n\t\t\t\t\t</div>\n\t\t\t\t\t<HStack\n\t\t\t\t\t\tclassName=\"dataviews-view-grid__primary-field\"\n\t\t\t\t\t\tjustify=\"space-between\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<FlexBlock>\n\t\t\t\t\t\t\t{ primaryField?.render( { item } ) }\n\t\t\t\t\t\t</FlexBlock>\n\t\t\t\t\t\t<ItemActions\n\t\t\t\t\t\t\titem={ item }\n\t\t\t\t\t\t\tactions={ actions }\n\t\t\t\t\t\t\tisCompact\n\t\t\t\t\t\t/>\n\t\t\t\t\t</HStack>\n\t\t\t\t\t<VStack\n\t\t\t\t\t\tclassName=\"dataviews-view-grid__fields\"\n\t\t\t\t\t\tspacing={ 3 }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ visibleFields.map( ( field ) => {\n\t\t\t\t\t\t\tconst renderedValue = field.render( {\n\t\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\tif ( ! renderedValue ) {\n\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<VStack\n\t\t\t\t\t\t\t\t\tclassName=\"dataviews-view-grid__field\"\n\t\t\t\t\t\t\t\t\tkey={ field.id }\n\t\t\t\t\t\t\t\t\tspacing={ 1 }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"dataviews-view-grid__field-header\">\n\t\t\t\t\t\t\t\t\t\t{ field.header }\n\t\t\t\t\t\t\t\t\t</div>\n\t\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\t{ field.render( { item } ) }\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</VStack>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t</VStack>\n\t\t\t\t</VStack>\n\t\t\t) ) }\n\t\t</Grid>\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { createElement } from "react";
2
+ /**
3
+ * External dependencies
4
+ */
5
+ import classNames from 'classnames';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+ import { useAsyncList } from '@wordpress/compose';
11
+ import { __experimentalHStack as HStack, __experimentalVStack as VStack } from '@wordpress/components';
12
+ import { ENTER, SPACE } from '@wordpress/keycodes';
13
+ export default function ViewList({
14
+ view,
15
+ fields,
16
+ data,
17
+ getItemId,
18
+ onSelectionChange,
19
+ selection,
20
+ deferredRendering
21
+ }) {
22
+ const shownData = useAsyncList(data, {
23
+ step: 3
24
+ });
25
+ const usedData = deferredRendering ? shownData : data;
26
+ const mediaField = fields.find(field => field.id === view.layout.mediaField);
27
+ const primaryField = fields.find(field => field.id === view.layout.primaryField);
28
+ const visibleFields = fields.filter(field => !view.hiddenFields.includes(field.id) && ![view.layout.primaryField, view.layout.mediaField].includes(field.id));
29
+ const onEnter = item => event => {
30
+ const {
31
+ keyCode
32
+ } = event;
33
+ if ([ENTER, SPACE].includes(keyCode)) {
34
+ onSelectionChange([item]);
35
+ }
36
+ };
37
+ return createElement("ul", {
38
+ className: "dataviews-list-view"
39
+ }, usedData.map((item, index) => {
40
+ return createElement("li", {
41
+ key: getItemId?.(item) || index
42
+ }, createElement("div", {
43
+ role: "button",
44
+ tabIndex: 0,
45
+ "aria-pressed": selection.includes(item.id),
46
+ onKeyDown: onEnter(item),
47
+ className: classNames('dataviews-list-view__item', {
48
+ 'dataviews-list-view__item-selected': selection.includes(item.id)
49
+ }),
50
+ onClick: () => onSelectionChange([item])
51
+ }, createElement(HStack, {
52
+ spacing: 3
53
+ }, createElement("div", {
54
+ className: "dataviews-list-view__media-wrapper"
55
+ }, mediaField?.render({
56
+ item
57
+ }) || createElement("div", {
58
+ className: "dataviews-list-view__media-placeholder"
59
+ })), createElement(HStack, null, createElement(VStack, {
60
+ spacing: 1
61
+ }, primaryField?.render({
62
+ item
63
+ }), createElement("div", {
64
+ className: "dataviews-list-view__fields"
65
+ }, visibleFields.map(field => {
66
+ return createElement("span", {
67
+ key: field.id,
68
+ className: "dataviews-list-view__field"
69
+ }, field.render({
70
+ item
71
+ }));
72
+ })))))));
73
+ }));
74
+ }
75
+ //# sourceMappingURL=view-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["classNames","useAsyncList","__experimentalHStack","HStack","__experimentalVStack","VStack","ENTER","SPACE","ViewList","view","fields","data","getItemId","onSelectionChange","selection","deferredRendering","shownData","step","usedData","mediaField","find","field","id","layout","primaryField","visibleFields","filter","hiddenFields","includes","onEnter","item","event","keyCode","createElement","className","map","index","key","role","tabIndex","onKeyDown","onClick","spacing","render"],"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} from '@wordpress/components';\nimport { ENTER, SPACE } from '@wordpress/keycodes';\n\nexport default function ViewList( {\n\tview,\n\tfields,\n\tdata,\n\tgetItemId,\n\tonSelectionChange,\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\treturn (\n\t\t<ul className=\"dataviews-list-view\">\n\t\t\t{ usedData.map( ( item, index ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<li key={ getItemId?.( item ) || index }>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\ttabIndex={ 0 }\n\t\t\t\t\t\t\taria-pressed={ selection.includes( item.id ) }\n\t\t\t\t\t\t\tonKeyDown={ onEnter( item ) }\n\t\t\t\t\t\t\tclassName={ classNames(\n\t\t\t\t\t\t\t\t'dataviews-list-view__item',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'dataviews-list-view__item-selected':\n\t\t\t\t\t\t\t\t\t\tselection.includes( item.id ),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\tonClick={ () => onSelectionChange( [ item ] ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<HStack spacing={ 3 }>\n\t\t\t\t\t\t\t\t<div className=\"dataviews-list-view__media-wrapper\">\n\t\t\t\t\t\t\t\t\t{ mediaField?.render( { item } ) || (\n\t\t\t\t\t\t\t\t\t\t<div className=\"dataviews-list-view__media-placeholder\"></div>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<HStack>\n\t\t\t\t\t\t\t\t\t<VStack spacing={ 1 }>\n\t\t\t\t\t\t\t\t\t\t{ primaryField?.render( { item } ) }\n\t\t\t\t\t\t\t\t\t\t<div className=\"dataviews-list-view__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-list-view__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</HStack>\n\t\t\t\t\t\t</div>\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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"}