@wordpress/dataviews 2.2.0 → 4.0.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 (298) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +23 -8
  3. package/build/components/dataform/index.js +78 -0
  4. package/build/components/dataform/index.js.map +1 -0
  5. package/build/components/dataviews/index.js +115 -0
  6. package/build/components/dataviews/index.js.map +1 -0
  7. package/build/{bulk-actions.js → components/dataviews-bulk-actions/index.js} +39 -16
  8. package/build/components/dataviews-bulk-actions/index.js.map +1 -0
  9. package/build/{bulk-actions-toolbar.js → components/dataviews-bulk-actions-toolbar/index.js} +36 -20
  10. package/build/components/dataviews-bulk-actions-toolbar/index.js.map +1 -0
  11. package/build/components/dataviews-context/index.js +36 -0
  12. package/build/components/dataviews-context/index.js.map +1 -0
  13. package/build/{add-filter.js → components/dataviews-filters/add-filter.js} +3 -3
  14. package/build/components/dataviews-filters/add-filter.js.map +1 -0
  15. package/build/{filter-summary.js → components/dataviews-filters/filter-summary.js} +15 -14
  16. package/build/components/dataviews-filters/filter-summary.js.map +1 -0
  17. package/build/{filters.js → components/dataviews-filters/index.js} +15 -16
  18. package/build/components/dataviews-filters/index.js.map +1 -0
  19. package/build/{reset-filters.js → components/dataviews-filters/reset-filters.js} +1 -1
  20. package/build/components/dataviews-filters/reset-filters.js.map +1 -0
  21. package/build/{search-widget.js → components/dataviews-filters/search-widget.js} +21 -19
  22. package/build/components/dataviews-filters/search-widget.js.map +1 -0
  23. package/build/{item-actions.js → components/dataviews-item-actions/index.js} +3 -3
  24. package/build/components/dataviews-item-actions/index.js.map +1 -0
  25. package/build/components/dataviews-layout/index.js +53 -0
  26. package/build/components/dataviews-layout/index.js.map +1 -0
  27. package/build/{pagination.js → components/dataviews-pagination/index.js} +18 -15
  28. package/build/components/dataviews-pagination/index.js.map +1 -0
  29. package/build/{search.js → components/dataviews-search/index.js} +10 -6
  30. package/build/components/dataviews-search/index.js.map +1 -0
  31. package/build/components/dataviews-selection-checkbox/index.js +52 -0
  32. package/build/components/dataviews-selection-checkbox/index.js.map +1 -0
  33. package/build/{view-actions.js → components/dataviews-view-config/index.js} +94 -80
  34. package/build/components/dataviews-view-config/index.js.map +1 -0
  35. package/build/filter-and-sort-data-view.js +4 -1
  36. package/build/filter-and-sort-data-view.js.map +1 -1
  37. package/build/index.js +8 -1
  38. package/build/index.js.map +1 -1
  39. package/build/layouts/grid/density-picker.js +143 -0
  40. package/build/layouts/grid/density-picker.js.map +1 -0
  41. package/build/{view-grid.js → layouts/grid/index.js} +40 -53
  42. package/build/layouts/grid/index.js.map +1 -0
  43. package/build/layouts/index.js +52 -0
  44. package/build/layouts/index.js.map +1 -0
  45. package/build/{view-list.js → layouts/list/index.js} +31 -27
  46. package/build/layouts/list/index.js.map +1 -0
  47. package/build/layouts/table/column-header-menu.js +196 -0
  48. package/build/layouts/table/column-header-menu.js.map +1 -0
  49. package/build/layouts/table/index.js +350 -0
  50. package/build/layouts/table/index.js.map +1 -0
  51. package/build/normalize-fields.js +1 -1
  52. package/build/normalize-fields.js.map +1 -1
  53. package/build/private-types.js +6 -0
  54. package/build/private-types.js.map +1 -0
  55. package/build/types.js.map +1 -1
  56. package/build/utils.js.map +1 -1
  57. package/build-module/components/dataform/index.js +72 -0
  58. package/build-module/components/dataform/index.js.map +1 -0
  59. package/build-module/components/dataviews/index.js +108 -0
  60. package/build-module/components/dataviews/index.js.map +1 -0
  61. package/build-module/{bulk-actions.js → components/dataviews-bulk-actions/index.js} +39 -17
  62. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -0
  63. package/build-module/{bulk-actions-toolbar.js → components/dataviews-bulk-actions-toolbar/index.js} +35 -20
  64. package/build-module/components/dataviews-bulk-actions-toolbar/index.js.map +1 -0
  65. package/build-module/components/dataviews-context/index.js +30 -0
  66. package/build-module/components/dataviews-context/index.js.map +1 -0
  67. package/build-module/{add-filter.js → components/dataviews-filters/add-filter.js} +3 -3
  68. package/build-module/components/dataviews-filters/add-filter.js.map +1 -0
  69. package/build-module/{filter-summary.js → components/dataviews-filters/filter-summary.js} +15 -14
  70. package/build-module/components/dataviews-filters/filter-summary.js.map +1 -0
  71. package/build-module/{filters.js → components/dataviews-filters/index.js} +16 -17
  72. package/build-module/components/dataviews-filters/index.js.map +1 -0
  73. package/build-module/{reset-filters.js → components/dataviews-filters/reset-filters.js} +1 -1
  74. package/build-module/components/dataviews-filters/reset-filters.js.map +1 -0
  75. package/build-module/{search-widget.js → components/dataviews-filters/search-widget.js} +21 -19
  76. package/build-module/components/dataviews-filters/search-widget.js.map +1 -0
  77. package/build-module/{item-actions.js → components/dataviews-item-actions/index.js} +3 -3
  78. package/build-module/components/dataviews-item-actions/index.js.map +1 -0
  79. package/build-module/components/dataviews-layout/index.js +45 -0
  80. package/build-module/components/dataviews-layout/index.js.map +1 -0
  81. package/build-module/{pagination.js → components/dataviews-pagination/index.js} +19 -17
  82. package/build-module/components/dataviews-pagination/index.js.map +1 -0
  83. package/build-module/{search.js → components/dataviews-search/index.js} +10 -7
  84. package/build-module/components/dataviews-search/index.js.map +1 -0
  85. package/build-module/components/dataviews-selection-checkbox/index.js +45 -0
  86. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -0
  87. package/build-module/{view-actions.js → components/dataviews-view-config/index.js} +98 -84
  88. package/build-module/components/dataviews-view-config/index.js.map +1 -0
  89. package/build-module/filter-and-sort-data-view.js +4 -1
  90. package/build-module/filter-and-sort-data-view.js.map +1 -1
  91. package/build-module/index.js +2 -1
  92. package/build-module/index.js.map +1 -1
  93. package/build-module/layouts/grid/density-picker.js +138 -0
  94. package/build-module/layouts/grid/density-picker.js.map +1 -0
  95. package/build-module/{view-grid.js → layouts/grid/index.js} +37 -50
  96. package/build-module/layouts/grid/index.js.map +1 -0
  97. package/build-module/layouts/index.js +43 -0
  98. package/build-module/layouts/index.js.map +1 -0
  99. package/build-module/{view-list.js → layouts/list/index.js} +29 -25
  100. package/build-module/layouts/list/index.js.map +1 -0
  101. package/build-module/layouts/table/column-header-menu.js +190 -0
  102. package/build-module/layouts/table/column-header-menu.js.map +1 -0
  103. package/build-module/layouts/table/index.js +344 -0
  104. package/build-module/layouts/table/index.js.map +1 -0
  105. package/build-module/normalize-fields.js +1 -1
  106. package/build-module/normalize-fields.js.map +1 -1
  107. package/build-module/private-types.js +2 -0
  108. package/build-module/private-types.js.map +1 -0
  109. package/build-module/types.js.map +1 -1
  110. package/build-module/utils.js.map +1 -1
  111. package/build-style/style-rtl.css +607 -561
  112. package/build-style/style.css +607 -561
  113. package/build-types/components/dataform/index.d.ts +17 -0
  114. package/build-types/components/dataform/index.d.ts.map +1 -0
  115. package/build-types/components/dataform/stories/index.story.d.ts +11 -0
  116. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -0
  117. package/build-types/components/dataviews/index.d.ts +33 -0
  118. package/build-types/components/dataviews/index.d.ts.map +1 -0
  119. package/build-types/{stories → components/dataviews/stories}/fixtures.d.ts +18 -17
  120. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -0
  121. package/build-types/components/dataviews/stories/index.story.d.ts +46 -0
  122. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -0
  123. package/build-types/components/dataviews-bulk-actions/index.d.ts +5 -0
  124. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -0
  125. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts +2 -0
  126. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts.map +1 -0
  127. package/build-types/components/dataviews-context/index.d.ts +26 -0
  128. package/build-types/components/dataviews-context/index.d.ts.map +1 -0
  129. package/build-types/{add-filter.d.ts → components/dataviews-filters/add-filter.d.ts} +1 -2
  130. package/build-types/components/dataviews-filters/add-filter.d.ts.map +1 -0
  131. package/build-types/{filter-summary.d.ts → components/dataviews-filters/filter-summary.d.ts} +1 -1
  132. package/build-types/components/dataviews-filters/filter-summary.d.ts.map +1 -0
  133. package/build-types/components/dataviews-filters/index.d.ts +4 -0
  134. package/build-types/components/dataviews-filters/index.d.ts.map +1 -0
  135. package/build-types/{reset-filters.d.ts → components/dataviews-filters/reset-filters.d.ts} +1 -2
  136. package/build-types/components/dataviews-filters/reset-filters.d.ts.map +1 -0
  137. package/build-types/{search-widget.d.ts → components/dataviews-filters/search-widget.d.ts} +1 -2
  138. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -0
  139. package/build-types/components/dataviews-item-actions/index.d.ts +35 -0
  140. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -0
  141. package/build-types/components/dataviews-layout/index.d.ts +2 -0
  142. package/build-types/components/dataviews-layout/index.d.ts.map +1 -0
  143. package/build-types/components/dataviews-pagination/index.d.ts +4 -0
  144. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -0
  145. package/build-types/components/dataviews-search/index.d.ts +6 -0
  146. package/build-types/components/dataviews-search/index.d.ts.map +1 -0
  147. package/build-types/components/dataviews-selection-checkbox/index.d.ts +16 -0
  148. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -0
  149. package/build-types/components/dataviews-view-config/index.d.ts +8 -0
  150. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -0
  151. package/build-types/filter-and-sort-data-view.d.ts +2 -2
  152. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  153. package/build-types/index.d.ts +2 -1
  154. package/build-types/index.d.ts.map +1 -1
  155. package/build-types/layouts/grid/density-picker.d.ts +5 -0
  156. package/build-types/layouts/grid/density-picker.d.ts.map +1 -0
  157. package/build-types/layouts/grid/index.d.ts +3 -0
  158. package/build-types/layouts/grid/index.d.ts.map +1 -0
  159. package/build-types/{layouts.d.ts → layouts/index.d.ts} +6 -5
  160. package/build-types/layouts/index.d.ts.map +1 -0
  161. package/build-types/layouts/list/index.d.ts +3 -0
  162. package/build-types/layouts/list/index.d.ts.map +1 -0
  163. package/build-types/layouts/table/column-header-menu.d.ts +17 -0
  164. package/build-types/layouts/table/column-header-menu.d.ts.map +1 -0
  165. package/build-types/layouts/table/index.d.ts +4 -0
  166. package/build-types/layouts/table/index.d.ts.map +1 -0
  167. package/build-types/normalize-fields.d.ts +2 -2
  168. package/build-types/normalize-fields.d.ts.map +1 -1
  169. package/build-types/private-types.d.ts +3 -0
  170. package/build-types/private-types.d.ts.map +1 -0
  171. package/build-types/types.d.ts +106 -46
  172. package/build-types/types.d.ts.map +1 -1
  173. package/build-types/utils.d.ts +2 -2
  174. package/build-types/utils.d.ts.map +1 -1
  175. package/package.json +10 -10
  176. package/src/components/dataform/index.tsx +106 -0
  177. package/src/components/dataform/stories/index.story.tsx +42 -0
  178. package/src/components/dataviews/index.tsx +149 -0
  179. package/src/{stories → components/dataviews/stories}/fixtures.js +23 -11
  180. package/src/components/dataviews/stories/index.story.js +65 -0
  181. package/src/components/dataviews/style.scss +97 -0
  182. package/src/{bulk-actions.tsx → components/dataviews-bulk-actions/index.tsx} +58 -36
  183. package/src/components/dataviews-bulk-actions/style.scss +7 -0
  184. package/src/{bulk-actions-toolbar.tsx → components/dataviews-bulk-actions-toolbar/index.tsx} +48 -36
  185. package/src/components/dataviews-bulk-actions-toolbar/style.scss +45 -0
  186. package/src/components/dataviews-context/index.ts +49 -0
  187. package/src/{add-filter.tsx → components/dataviews-filters/add-filter.tsx} +4 -4
  188. package/src/{filter-summary.tsx → components/dataviews-filters/filter-summary.tsx} +36 -22
  189. package/src/{filters.tsx → components/dataviews-filters/index.tsx} +11 -25
  190. package/src/{reset-filters.tsx → components/dataviews-filters/reset-filters.tsx} +2 -2
  191. package/src/{search-widget.tsx → components/dataviews-filters/search-widget.tsx} +20 -20
  192. package/src/components/dataviews-filters/style.scss +252 -0
  193. package/src/{item-actions.tsx → components/dataviews-item-actions/index.tsx} +16 -17
  194. package/src/components/dataviews-item-actions/style.scss +3 -0
  195. package/src/components/dataviews-layout/index.tsx +51 -0
  196. package/src/{pagination.tsx → components/dataviews-pagination/index.tsx} +15 -23
  197. package/src/components/dataviews-pagination/style.scss +26 -0
  198. package/src/{search.tsx → components/dataviews-search/index.tsx} +5 -10
  199. package/src/components/dataviews-selection-checkbox/index.tsx +65 -0
  200. package/src/components/dataviews-selection-checkbox/style.scss +14 -0
  201. package/src/{view-actions.tsx → components/dataviews-view-config/index.tsx} +116 -119
  202. package/src/filter-and-sort-data-view.ts +13 -3
  203. package/src/index.ts +2 -1
  204. package/src/layouts/grid/density-picker.tsx +136 -0
  205. package/src/{view-grid.tsx → layouts/grid/index.tsx} +45 -63
  206. package/src/layouts/grid/style.scss +140 -0
  207. package/src/layouts/index.ts +66 -0
  208. package/src/{view-list.tsx → layouts/list/index.tsx} +40 -30
  209. package/src/layouts/list/style.scss +189 -0
  210. package/src/layouts/table/column-header-menu.tsx +268 -0
  211. package/src/layouts/table/index.tsx +471 -0
  212. package/src/layouts/table/style.scss +201 -0
  213. package/src/normalize-fields.ts +6 -4
  214. package/src/private-types.tsx +2 -0
  215. package/src/style.scss +11 -919
  216. package/src/test/filter-and-sort-data-view.js +17 -2
  217. package/src/types.ts +113 -55
  218. package/src/utils.ts +2 -4
  219. package/tsconfig.tsbuildinfo +1 -1
  220. package/build/add-filter.js.map +0 -1
  221. package/build/bulk-actions-toolbar.js.map +0 -1
  222. package/build/bulk-actions.js.map +0 -1
  223. package/build/dataviews.js +0 -136
  224. package/build/dataviews.js.map +0 -1
  225. package/build/filter-summary.js.map +0 -1
  226. package/build/filters.js.map +0 -1
  227. package/build/item-actions.js.map +0 -1
  228. package/build/layouts.js +0 -38
  229. package/build/layouts.js.map +0 -1
  230. package/build/pagination.js.map +0 -1
  231. package/build/reset-filters.js.map +0 -1
  232. package/build/search-widget.js.map +0 -1
  233. package/build/search.js.map +0 -1
  234. package/build/single-selection-checkbox.js +0 -63
  235. package/build/single-selection-checkbox.js.map +0 -1
  236. package/build/view-actions.js.map +0 -1
  237. package/build/view-grid.js.map +0 -1
  238. package/build/view-list.js.map +0 -1
  239. package/build/view-table.js +0 -409
  240. package/build/view-table.js.map +0 -1
  241. package/build-module/add-filter.js.map +0 -1
  242. package/build-module/bulk-actions-toolbar.js.map +0 -1
  243. package/build-module/bulk-actions.js.map +0 -1
  244. package/build-module/dataviews.js +0 -129
  245. package/build-module/dataviews.js.map +0 -1
  246. package/build-module/filter-summary.js.map +0 -1
  247. package/build-module/filters.js.map +0 -1
  248. package/build-module/item-actions.js.map +0 -1
  249. package/build-module/layouts.js +0 -30
  250. package/build-module/layouts.js.map +0 -1
  251. package/build-module/pagination.js.map +0 -1
  252. package/build-module/reset-filters.js.map +0 -1
  253. package/build-module/search-widget.js.map +0 -1
  254. package/build-module/search.js.map +0 -1
  255. package/build-module/single-selection-checkbox.js +0 -56
  256. package/build-module/single-selection-checkbox.js.map +0 -1
  257. package/build-module/view-actions.js.map +0 -1
  258. package/build-module/view-grid.js.map +0 -1
  259. package/build-module/view-list.js.map +0 -1
  260. package/build-module/view-table.js +0 -402
  261. package/build-module/view-table.js.map +0 -1
  262. package/build-types/add-filter.d.ts.map +0 -1
  263. package/build-types/bulk-actions-toolbar.d.ts +0 -12
  264. package/build-types/bulk-actions-toolbar.d.ts.map +0 -1
  265. package/build-types/bulk-actions.d.ts +0 -14
  266. package/build-types/bulk-actions.d.ts.map +0 -1
  267. package/build-types/dataviews.d.ts +0 -24
  268. package/build-types/dataviews.d.ts.map +0 -1
  269. package/build-types/filter-summary.d.ts.map +0 -1
  270. package/build-types/filters.d.ts +0 -13
  271. package/build-types/filters.d.ts.map +0 -1
  272. package/build-types/item-actions.d.ts +0 -35
  273. package/build-types/item-actions.d.ts.map +0 -1
  274. package/build-types/layouts.d.ts.map +0 -1
  275. package/build-types/pagination.d.ts +0 -16
  276. package/build-types/pagination.d.ts.map +0 -1
  277. package/build-types/reset-filters.d.ts.map +0 -1
  278. package/build-types/search-widget.d.ts.map +0 -1
  279. package/build-types/search.d.ts +0 -13
  280. package/build-types/search.d.ts.map +0 -1
  281. package/build-types/single-selection-checkbox.d.ts +0 -17
  282. package/build-types/single-selection-checkbox.d.ts.map +0 -1
  283. package/build-types/stories/fixtures.d.ts.map +0 -1
  284. package/build-types/stories/index.story.d.ts +0 -15
  285. package/build-types/stories/index.story.d.ts.map +0 -1
  286. package/build-types/view-actions.d.ts +0 -12
  287. package/build-types/view-actions.d.ts.map +0 -1
  288. package/build-types/view-grid.d.ts +0 -4
  289. package/build-types/view-grid.d.ts.map +0 -1
  290. package/build-types/view-list.d.ts +0 -4
  291. package/build-types/view-list.d.ts.map +0 -1
  292. package/build-types/view-table.d.ts +0 -5
  293. package/build-types/view-table.d.ts.map +0 -1
  294. package/src/dataviews.tsx +0 -189
  295. package/src/layouts.ts +0 -39
  296. package/src/single-selection-checkbox.tsx +0 -80
  297. package/src/stories/index.story.js +0 -64
  298. package/src/view-table.tsx +0 -603
@@ -0,0 +1,108 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+
5
+ /**
6
+ * WordPress dependencies
7
+ */
8
+ import { __experimentalHStack as HStack } from '@wordpress/components';
9
+ import { useMemo, useState } from '@wordpress/element';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import { default as DataViewsBulkActions } from '../dataviews-bulk-actions';
15
+ import DataViewsBulkActionsToolbar from '../dataviews-bulk-actions-toolbar';
16
+ import DataViewsContext from '../dataviews-context';
17
+ import DataViewsFilters from '../dataviews-filters';
18
+ import DataViewsLayout from '../dataviews-layout';
19
+ import DataviewsPagination from '../dataviews-pagination';
20
+ import DataViewsSearch from '../dataviews-search';
21
+ import DataViewsViewConfig from '../dataviews-view-config';
22
+ import { normalizeFields } from '../../normalize-fields';
23
+ import DensityPicker from '../../layouts/grid/density-picker';
24
+ import { LAYOUT_GRID } from '../../constants';
25
+ import { jsx as _jsx } from "react/jsx-runtime";
26
+ import { jsxs as _jsxs } from "react/jsx-runtime";
27
+ const defaultGetItemId = item => item.id;
28
+ export default function DataViews({
29
+ view,
30
+ onChangeView,
31
+ fields,
32
+ search = true,
33
+ searchLabel = undefined,
34
+ actions = [],
35
+ data,
36
+ getItemId = defaultGetItemId,
37
+ isLoading = false,
38
+ paginationInfo,
39
+ defaultLayouts,
40
+ selection: selectionProperty,
41
+ onChangeSelection,
42
+ header
43
+ }) {
44
+ const [selectionState, setSelectionState] = useState([]);
45
+ const [density, setDensity] = useState(0);
46
+ const isUncontrolled = selectionProperty === undefined || onChangeSelection === undefined;
47
+ const selection = isUncontrolled ? selectionState : selectionProperty;
48
+ const [openedFilter, setOpenedFilter] = useState(null);
49
+ function setSelectionWithChange(value) {
50
+ const newValue = typeof value === 'function' ? value(selection) : value;
51
+ if (isUncontrolled) {
52
+ setSelectionState(newValue);
53
+ }
54
+ if (onChangeSelection) {
55
+ onChangeSelection(newValue);
56
+ }
57
+ }
58
+ const _fields = useMemo(() => normalizeFields(fields), [fields]);
59
+ const _selection = useMemo(() => {
60
+ return selection.filter(id => data.some(item => getItemId(item) === id));
61
+ }, [selection, data, getItemId]);
62
+ return /*#__PURE__*/_jsx(DataViewsContext.Provider, {
63
+ value: {
64
+ view,
65
+ onChangeView,
66
+ fields: _fields,
67
+ actions,
68
+ data,
69
+ isLoading,
70
+ paginationInfo,
71
+ selection: _selection,
72
+ onChangeSelection: setSelectionWithChange,
73
+ openedFilter,
74
+ setOpenedFilter,
75
+ getItemId,
76
+ density
77
+ },
78
+ children: /*#__PURE__*/_jsxs("div", {
79
+ className: "dataviews-wrapper",
80
+ children: [/*#__PURE__*/_jsxs(HStack, {
81
+ alignment: "top",
82
+ justify: "start",
83
+ className: "dataviews__view-actions",
84
+ children: [/*#__PURE__*/_jsxs(HStack, {
85
+ justify: "start",
86
+ className: "dataviews-filters__container",
87
+ wrap: true,
88
+ children: [search && /*#__PURE__*/_jsx(DataViewsSearch, {
89
+ label: searchLabel
90
+ }), /*#__PURE__*/_jsx(DataViewsFilters, {})]
91
+ }), view.type === LAYOUT_GRID && /*#__PURE__*/_jsx(DensityPicker, {
92
+ density: density,
93
+ setDensity: setDensity
94
+ }), /*#__PURE__*/_jsx(DataViewsBulkActions, {}), /*#__PURE__*/_jsxs(HStack, {
95
+ spacing: 1,
96
+ expanded: false,
97
+ style: {
98
+ flexShrink: 0
99
+ },
100
+ children: [/*#__PURE__*/_jsx(DataViewsViewConfig, {
101
+ defaultLayouts: defaultLayouts
102
+ }), header]
103
+ })]
104
+ }), /*#__PURE__*/_jsx(DataViewsLayout, {}), /*#__PURE__*/_jsx(DataviewsPagination, {}), /*#__PURE__*/_jsx(DataViewsBulkActionsToolbar, {})]
105
+ })
106
+ });
107
+ }
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__experimentalHStack","HStack","useMemo","useState","default","DataViewsBulkActions","DataViewsBulkActionsToolbar","DataViewsContext","DataViewsFilters","DataViewsLayout","DataviewsPagination","DataViewsSearch","DataViewsViewConfig","normalizeFields","DensityPicker","LAYOUT_GRID","jsx","_jsx","jsxs","_jsxs","defaultGetItemId","item","id","DataViews","view","onChangeView","fields","search","searchLabel","undefined","actions","data","getItemId","isLoading","paginationInfo","defaultLayouts","selection","selectionProperty","onChangeSelection","header","selectionState","setSelectionState","density","setDensity","isUncontrolled","openedFilter","setOpenedFilter","setSelectionWithChange","value","newValue","_fields","_selection","filter","some","Provider","children","className","alignment","justify","wrap","label","type","spacing","expanded","style","flexShrink"],"sources":["@wordpress/dataviews/src/components/dataviews/index.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport type { ReactNode } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport { __experimentalHStack as HStack } from '@wordpress/components';\nimport { useMemo, useState } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { default as DataViewsBulkActions } from '../dataviews-bulk-actions';\nimport DataViewsBulkActionsToolbar from '../dataviews-bulk-actions-toolbar';\nimport DataViewsContext from '../dataviews-context';\nimport DataViewsFilters from '../dataviews-filters';\nimport DataViewsLayout from '../dataviews-layout';\nimport DataviewsPagination from '../dataviews-pagination';\nimport DataViewsSearch from '../dataviews-search';\nimport DataViewsViewConfig from '../dataviews-view-config';\nimport { normalizeFields } from '../../normalize-fields';\nimport type { Action, Field, View, SupportedLayouts } from '../../types';\nimport type { SelectionOrUpdater } from '../../private-types';\nimport DensityPicker from '../../layouts/grid/density-picker';\nimport { LAYOUT_GRID } from '../../constants';\n\ntype ItemWithId = { id: string };\n\ntype DataViewsProps< Item > = {\n\tview: View;\n\tonChangeView: ( view: View ) => void;\n\tfields: Field< Item >[];\n\tsearch?: boolean;\n\tsearchLabel?: string;\n\tactions?: Action< Item >[];\n\tdata: Item[];\n\tisLoading?: boolean;\n\tpaginationInfo: {\n\t\ttotalItems: number;\n\t\ttotalPages: number;\n\t};\n\tdefaultLayouts: SupportedLayouts;\n\tselection?: string[];\n\tonChangeSelection?: ( items: string[] ) => void;\n\theader?: ReactNode;\n} & ( Item extends ItemWithId\n\t? { getItemId?: ( item: Item ) => string }\n\t: { getItemId: ( item: Item ) => string } );\n\nconst defaultGetItemId = ( item: ItemWithId ) => item.id;\n\nexport default function DataViews< Item >( {\n\tview,\n\tonChangeView,\n\tfields,\n\tsearch = true,\n\tsearchLabel = undefined,\n\tactions = [],\n\tdata,\n\tgetItemId = defaultGetItemId,\n\tisLoading = false,\n\tpaginationInfo,\n\tdefaultLayouts,\n\tselection: selectionProperty,\n\tonChangeSelection,\n\theader,\n}: DataViewsProps< Item > ) {\n\tconst [ selectionState, setSelectionState ] = useState< string[] >( [] );\n\tconst [ density, setDensity ] = useState< number >( 0 );\n\tconst isUncontrolled =\n\t\tselectionProperty === undefined || onChangeSelection === undefined;\n\tconst selection = isUncontrolled ? selectionState : selectionProperty;\n\tconst [ openedFilter, setOpenedFilter ] = useState< string | null >( null );\n\tfunction setSelectionWithChange( value: SelectionOrUpdater ) {\n\t\tconst newValue =\n\t\t\ttypeof value === 'function' ? value( selection ) : value;\n\t\tif ( isUncontrolled ) {\n\t\t\tsetSelectionState( newValue );\n\t\t}\n\t\tif ( onChangeSelection ) {\n\t\t\tonChangeSelection( newValue );\n\t\t}\n\t}\n\tconst _fields = useMemo( () => normalizeFields( fields ), [ fields ] );\n\tconst _selection = useMemo( () => {\n\t\treturn selection.filter( ( id ) =>\n\t\t\tdata.some( ( item ) => getItemId( item ) === id )\n\t\t);\n\t}, [ selection, data, getItemId ] );\n\n\treturn (\n\t\t<DataViewsContext.Provider\n\t\t\tvalue={ {\n\t\t\t\tview,\n\t\t\t\tonChangeView,\n\t\t\t\tfields: _fields,\n\t\t\t\tactions,\n\t\t\t\tdata,\n\t\t\t\tisLoading,\n\t\t\t\tpaginationInfo,\n\t\t\t\tselection: _selection,\n\t\t\t\tonChangeSelection: setSelectionWithChange,\n\t\t\t\topenedFilter,\n\t\t\t\tsetOpenedFilter,\n\t\t\t\tgetItemId,\n\t\t\t\tdensity,\n\t\t\t} }\n\t\t>\n\t\t\t<div className=\"dataviews-wrapper\">\n\t\t\t\t<HStack\n\t\t\t\t\talignment=\"top\"\n\t\t\t\t\tjustify=\"start\"\n\t\t\t\t\tclassName=\"dataviews__view-actions\"\n\t\t\t\t>\n\t\t\t\t\t<HStack\n\t\t\t\t\t\tjustify=\"start\"\n\t\t\t\t\t\tclassName=\"dataviews-filters__container\"\n\t\t\t\t\t\twrap\n\t\t\t\t\t>\n\t\t\t\t\t\t{ search && <DataViewsSearch label={ searchLabel } /> }\n\t\t\t\t\t\t<DataViewsFilters />\n\t\t\t\t\t</HStack>\n\t\t\t\t\t{ view.type === LAYOUT_GRID && (\n\t\t\t\t\t\t<DensityPicker\n\t\t\t\t\t\t\tdensity={ density }\n\t\t\t\t\t\t\tsetDensity={ setDensity }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t\t<DataViewsBulkActions />\n\t\t\t\t\t<HStack\n\t\t\t\t\t\tspacing={ 1 }\n\t\t\t\t\t\texpanded={ false }\n\t\t\t\t\t\tstyle={ { flexShrink: 0 } }\n\t\t\t\t\t>\n\t\t\t\t\t\t<DataViewsViewConfig\n\t\t\t\t\t\t\tdefaultLayouts={ defaultLayouts }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ header }\n\t\t\t\t\t</HStack>\n\t\t\t\t</HStack>\n\t\t\t\t<DataViewsLayout />\n\t\t\t\t<DataviewsPagination />\n\t\t\t\t<DataViewsBulkActionsToolbar />\n\t\t\t</div>\n\t\t</DataViewsContext.Provider>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,13 +3,15 @@
3
3
  */
4
4
  import { privateApis as componentsPrivateApis, Button, Modal } from '@wordpress/components';
5
5
  import { __, sprintf, _n } from '@wordpress/i18n';
6
- import { useMemo, useState, useCallback } from '@wordpress/element';
6
+ import { useMemo, useState, useCallback, useContext } from '@wordpress/element';
7
7
  import { useRegistry } from '@wordpress/data';
8
8
 
9
9
  /**
10
10
  * Internal dependencies
11
11
  */
12
- import { unlock } from './lock-unlock';
12
+ import DataViewsContext from '../dataviews-context';
13
+ import { LAYOUT_TABLE, LAYOUT_GRID } from '../../constants';
14
+ import { unlock } from '../../lock-unlock';
13
15
  import { jsx as _jsx } from "react/jsx-runtime";
14
16
  import { Fragment as _Fragment } from "react/jsx-runtime";
15
17
  import { jsxs as _jsxs } from "react/jsx-runtime";
@@ -56,7 +58,7 @@ function ActionWithModal({
56
58
  title: !hideModalHeader ? label : undefined,
57
59
  __experimentalHideHeader: !!hideModalHeader,
58
60
  onRequestClose: onCloseModal,
59
- overlayClassName: "dataviews-action-modal",
61
+ overlayClassName: "dataviews-bulk-actions__modal",
60
62
  children: /*#__PURE__*/_jsx(RenderModal, {
61
63
  items: eligibleItems,
62
64
  closeModal: onCloseModal,
@@ -75,7 +77,6 @@ function BulkActionItem({
75
77
  }, [action, selectedItems]);
76
78
  const shouldShowModal = ('RenderModal' in action);
77
79
  return /*#__PURE__*/_jsx(DropdownMenuItem, {
78
- disabled: eligibleItems.length === 0,
79
80
  hideOnClick: !shouldShowModal,
80
81
  onClick: async () => {
81
82
  if (shouldShowModal) {
@@ -86,7 +87,7 @@ function BulkActionItem({
86
87
  });
87
88
  }
88
89
  },
89
- suffix: eligibleItems.length > 0 ? eligibleItems.length : undefined,
90
+ suffix: eligibleItems.length,
90
91
  children: action.label
91
92
  }, action.id);
92
93
  }
@@ -95,9 +96,17 @@ function ActionsMenuGroup({
95
96
  selectedItems,
96
97
  setActionWithModal
97
98
  }) {
99
+ const elligibleActions = useMemo(() => {
100
+ return actions.filter(action => {
101
+ return selectedItems.some(item => !action.isEligible || action.isEligible(item));
102
+ });
103
+ }, [actions, selectedItems]);
104
+ if (!elligibleActions.length) {
105
+ return null;
106
+ }
98
107
  return /*#__PURE__*/_jsxs(_Fragment, {
99
108
  children: [/*#__PURE__*/_jsx(DropdownMenuGroup, {
100
- children: actions.map(action => /*#__PURE__*/_jsx(BulkActionItem, {
109
+ children: elligibleActions.map(action => /*#__PURE__*/_jsx(BulkActionItem, {
101
110
  action: action,
102
111
  selectedItems: selectedItems,
103
112
  setActionWithModal: setActionWithModal
@@ -105,13 +114,14 @@ function ActionsMenuGroup({
105
114
  }), /*#__PURE__*/_jsx(DropdownMenuSeparator, {})]
106
115
  });
107
116
  }
108
- export default function BulkActions({
109
- data,
110
- actions,
111
- selection,
112
- onSelectionChange,
113
- getItemId
114
- }) {
117
+ function _BulkActions() {
118
+ const {
119
+ data,
120
+ actions = [],
121
+ selection,
122
+ onChangeSelection,
123
+ getItemId
124
+ } = useContext(DataViewsContext);
115
125
  const bulkActions = useMemo(() => actions.filter(action => action.supportsBulk), [actions]);
116
126
  const [isMenuOpen, onMenuOpenChange] = useState(false);
117
127
  const [actionWithModal, setActionWithModal] = useState();
@@ -137,7 +147,7 @@ export default function BulkActions({
137
147
  minWidth: '240px'
138
148
  },
139
149
  trigger: /*#__PURE__*/_jsx(Button, {
140
- className: "dataviews-bulk-edit-button",
150
+ className: "dataviews-bulk-actions__edit-button",
141
151
  __next40pxDefaultSize: true,
142
152
  variant: "tertiary",
143
153
  size: "compact",
@@ -153,7 +163,7 @@ export default function BulkActions({
153
163
  disabled: areAllSelected,
154
164
  hideOnClick: false,
155
165
  onClick: () => {
156
- onSelectionChange(selectableItems);
166
+ onChangeSelection(selectableItems.map(item => getItemId(item)));
157
167
  },
158
168
  suffix: numberSelectableItems,
159
169
  children: __('Select all')
@@ -161,7 +171,7 @@ export default function BulkActions({
161
171
  disabled: selection.length === 0,
162
172
  hideOnClick: false,
163
173
  onClick: () => {
164
- onSelectionChange([]);
174
+ onChangeSelection([]);
165
175
  },
166
176
  children: __('Deselect')
167
177
  })]
@@ -174,4 +184,16 @@ export default function BulkActions({
174
184
  })]
175
185
  });
176
186
  }
177
- //# sourceMappingURL=bulk-actions.js.map
187
+ export default function BulkActions() {
188
+ const {
189
+ data,
190
+ actions = [],
191
+ view
192
+ } = useContext(DataViewsContext);
193
+ const hasPossibleBulkAction = useSomeItemHasAPossibleBulkAction(actions, data);
194
+ if (![LAYOUT_TABLE, LAYOUT_GRID].includes(view.type) || !hasPossibleBulkAction) {
195
+ return null;
196
+ }
197
+ return /*#__PURE__*/_jsx(_BulkActions, {});
198
+ }
199
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["privateApis","componentsPrivateApis","Button","Modal","__","sprintf","_n","useMemo","useState","useCallback","useContext","useRegistry","DataViewsContext","LAYOUT_TABLE","LAYOUT_GRID","unlock","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","DropdownMenuV2","DropdownMenu","DropdownMenuGroupV2","DropdownMenuGroup","DropdownMenuItemV2","DropdownMenuItem","DropdownMenuSeparatorV2","DropdownMenuSeparator","useHasAPossibleBulkAction","actions","item","some","action","supportsBulk","isEligible","useSomeItemHasAPossibleBulkAction","data","ActionWithModal","selectedItems","setActionWithModal","onMenuOpenChange","eligibleItems","filter","RenderModal","hideModalHeader","onCloseModal","undefined","label","title","__experimentalHideHeader","onRequestClose","overlayClassName","children","items","closeModal","onActionPerformed","BulkActionItem","registry","shouldShowModal","hideOnClick","onClick","callback","suffix","length","id","ActionsMenuGroup","elligibleActions","map","_BulkActions","selection","onChangeSelection","getItemId","bulkActions","isMenuOpen","actionWithModal","selectableItems","numberSelectableItems","includes","areAllSelected","open","onOpenChange","style","minWidth","trigger","className","__next40pxDefaultSize","variant","size","disabled","BulkActions","view","hasPossibleBulkAction","type"],"sources":["@wordpress/dataviews/src/components/dataviews-bulk-actions/index.tsx"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tprivateApis as componentsPrivateApis,\n\tButton,\n\tModal,\n} from '@wordpress/components';\nimport { __, sprintf, _n } from '@wordpress/i18n';\nimport { useMemo, useState, useCallback, useContext } from '@wordpress/element';\nimport { useRegistry } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport DataViewsContext from '../dataviews-context';\nimport { LAYOUT_TABLE, LAYOUT_GRID } from '../../constants';\nimport { unlock } from '../../lock-unlock';\nimport type { Action, ActionModal } from '../../types';\n\nconst {\n\tDropdownMenuV2: DropdownMenu,\n\tDropdownMenuGroupV2: DropdownMenuGroup,\n\tDropdownMenuItemV2: DropdownMenuItem,\n\tDropdownMenuSeparatorV2: DropdownMenuSeparator,\n} = unlock( componentsPrivateApis );\n\ninterface ActionWithModalProps< Item > {\n\taction: ActionModal< Item >;\n\tselectedItems: Item[];\n\tsetActionWithModal: ( action?: ActionModal< Item > ) => void;\n\tonMenuOpenChange: ( isOpen: boolean ) => void;\n}\n\ninterface BulkActionsItemProps< Item > {\n\taction: Action< Item >;\n\tselectedItems: Item[];\n\tsetActionWithModal: ( action?: ActionModal< Item > ) => void;\n}\n\ninterface ActionsMenuGroupProps< Item > {\n\tactions: Action< Item >[];\n\tselectedItems: Item[];\n\tsetActionWithModal: ( action?: ActionModal< Item > ) => void;\n}\n\nexport function useHasAPossibleBulkAction< Item >(\n\tactions: Action< Item >[],\n\titem: Item\n) {\n\treturn useMemo( () => {\n\t\treturn actions.some( ( action ) => {\n\t\t\treturn (\n\t\t\t\taction.supportsBulk &&\n\t\t\t\t( ! action.isEligible || action.isEligible( item ) )\n\t\t\t);\n\t\t} );\n\t}, [ actions, item ] );\n}\n\nexport function useSomeItemHasAPossibleBulkAction< Item >(\n\tactions: Action< Item >[],\n\tdata: Item[]\n) {\n\treturn useMemo( () => {\n\t\treturn data.some( ( item ) => {\n\t\t\treturn actions.some( ( action ) => {\n\t\t\t\treturn (\n\t\t\t\t\taction.supportsBulk &&\n\t\t\t\t\t( ! action.isEligible || action.isEligible( item ) )\n\t\t\t\t);\n\t\t\t} );\n\t\t} );\n\t}, [ actions, data ] );\n}\n\nfunction ActionWithModal< Item >( {\n\taction,\n\tselectedItems,\n\tsetActionWithModal,\n\tonMenuOpenChange,\n}: ActionWithModalProps< Item > ) {\n\tconst eligibleItems = useMemo( () => {\n\t\treturn selectedItems.filter(\n\t\t\t( item ) => ! action.isEligible || action.isEligible( item )\n\t\t);\n\t}, [ action, selectedItems ] );\n\tconst { RenderModal, hideModalHeader } = action;\n\tconst onCloseModal = useCallback( () => {\n\t\tsetActionWithModal( undefined );\n\t}, [ setActionWithModal ] );\n\tconst label =\n\t\ttypeof action.label === 'string'\n\t\t\t? action.label\n\t\t\t: action.label( selectedItems );\n\treturn (\n\t\t<Modal\n\t\t\ttitle={ ! hideModalHeader ? label : undefined }\n\t\t\t__experimentalHideHeader={ !! hideModalHeader }\n\t\t\tonRequestClose={ onCloseModal }\n\t\t\toverlayClassName=\"dataviews-bulk-actions__modal\"\n\t\t>\n\t\t\t<RenderModal\n\t\t\t\titems={ eligibleItems }\n\t\t\t\tcloseModal={ onCloseModal }\n\t\t\t\tonActionPerformed={ () => onMenuOpenChange( false ) }\n\t\t\t/>\n\t\t</Modal>\n\t);\n}\n\nfunction BulkActionItem< Item >( {\n\taction,\n\tselectedItems,\n\tsetActionWithModal,\n}: BulkActionsItemProps< Item > ) {\n\tconst registry = useRegistry();\n\tconst eligibleItems = useMemo( () => {\n\t\treturn selectedItems.filter(\n\t\t\t( item ) => ! action.isEligible || action.isEligible( item )\n\t\t);\n\t}, [ action, selectedItems ] );\n\n\tconst shouldShowModal = 'RenderModal' in action;\n\n\treturn (\n\t\t<DropdownMenuItem\n\t\t\tkey={ action.id }\n\t\t\thideOnClick={ ! shouldShowModal }\n\t\t\tonClick={ async () => {\n\t\t\t\tif ( shouldShowModal ) {\n\t\t\t\t\tsetActionWithModal( action );\n\t\t\t\t} else {\n\t\t\t\t\taction.callback( eligibleItems, { registry } );\n\t\t\t\t}\n\t\t\t} }\n\t\t\tsuffix={ eligibleItems.length }\n\t\t>\n\t\t\t{ action.label }\n\t\t</DropdownMenuItem>\n\t);\n}\n\nfunction ActionsMenuGroup< Item >( {\n\tactions,\n\tselectedItems,\n\tsetActionWithModal,\n}: ActionsMenuGroupProps< Item > ) {\n\tconst elligibleActions = useMemo( () => {\n\t\treturn actions.filter( ( action ) => {\n\t\t\treturn selectedItems.some(\n\t\t\t\t( item ) => ! action.isEligible || action.isEligible( item )\n\t\t\t);\n\t\t} );\n\t}, [ actions, selectedItems ] );\n\tif ( ! elligibleActions.length ) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<>\n\t\t\t<DropdownMenuGroup>\n\t\t\t\t{ elligibleActions.map( ( action ) => (\n\t\t\t\t\t<BulkActionItem\n\t\t\t\t\t\tkey={ action.id }\n\t\t\t\t\t\taction={ action }\n\t\t\t\t\t\tselectedItems={ selectedItems }\n\t\t\t\t\t\tsetActionWithModal={ setActionWithModal }\n\t\t\t\t\t/>\n\t\t\t\t) ) }\n\t\t\t</DropdownMenuGroup>\n\t\t\t<DropdownMenuSeparator />\n\t\t</>\n\t);\n}\n\nfunction _BulkActions() {\n\tconst {\n\t\tdata,\n\t\tactions = [],\n\t\tselection,\n\t\tonChangeSelection,\n\t\tgetItemId,\n\t} = useContext( DataViewsContext );\n\tconst bulkActions = useMemo(\n\t\t() => actions.filter( ( action ) => action.supportsBulk ),\n\t\t[ actions ]\n\t);\n\tconst [ isMenuOpen, onMenuOpenChange ] = useState( false );\n\tconst [ actionWithModal, setActionWithModal ] = useState<\n\t\tActionModal< any > | undefined\n\t>();\n\tconst selectableItems = useMemo( () => {\n\t\treturn data.filter( ( item ) => {\n\t\t\treturn bulkActions.some(\n\t\t\t\t( action ) => ! action.isEligible || action.isEligible( item )\n\t\t\t);\n\t\t} );\n\t}, [ data, bulkActions ] );\n\n\tconst numberSelectableItems = selectableItems.length;\n\n\tconst selectedItems = useMemo( () => {\n\t\treturn data.filter(\n\t\t\t( item ) =>\n\t\t\t\tselection.includes( getItemId( item ) ) &&\n\t\t\t\tselectableItems.includes( item )\n\t\t);\n\t}, [ selection, data, getItemId, selectableItems ] );\n\n\tconst areAllSelected = selectedItems.length === numberSelectableItems;\n\n\tif ( bulkActions.length === 0 ) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<>\n\t\t\t<DropdownMenu\n\t\t\t\topen={ isMenuOpen }\n\t\t\t\tonOpenChange={ onMenuOpenChange }\n\t\t\t\tlabel={ __( 'Bulk actions' ) }\n\t\t\t\tstyle={ { minWidth: '240px' } }\n\t\t\t\ttrigger={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tclassName=\"dataviews-bulk-actions__edit-button\"\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ selectedItems.length\n\t\t\t\t\t\t\t? sprintf(\n\t\t\t\t\t\t\t\t\t/* translators: %d: Number of items. */\n\t\t\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t\t\t'Edit %d item',\n\t\t\t\t\t\t\t\t\t\t'Edit %d items',\n\t\t\t\t\t\t\t\t\t\tselectedItems.length\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tselectedItems.length\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: __( 'Bulk edit' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<ActionsMenuGroup\n\t\t\t\t\tactions={ bulkActions }\n\t\t\t\t\tsetActionWithModal={ setActionWithModal }\n\t\t\t\t\tselectedItems={ selectedItems }\n\t\t\t\t/>\n\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tdisabled={ areAllSelected }\n\t\t\t\t\t\thideOnClick={ false }\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tonChangeSelection(\n\t\t\t\t\t\t\t\tselectableItems.map( ( item ) =>\n\t\t\t\t\t\t\t\t\tgetItemId( item )\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\tsuffix={ numberSelectableItems }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Select all' ) }\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tdisabled={ selection.length === 0 }\n\t\t\t\t\t\thideOnClick={ false }\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tonChangeSelection( [] );\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Deselect' ) }\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuGroup>\n\t\t\t</DropdownMenu>\n\t\t\t{ actionWithModal && (\n\t\t\t\t<ActionWithModal\n\t\t\t\t\taction={ actionWithModal }\n\t\t\t\t\tselectedItems={ selectedItems }\n\t\t\t\t\tsetActionWithModal={ setActionWithModal }\n\t\t\t\t\tonMenuOpenChange={ onMenuOpenChange }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport default function BulkActions() {\n\tconst { data, actions = [], view } = useContext( DataViewsContext );\n\tconst hasPossibleBulkAction = useSomeItemHasAPossibleBulkAction(\n\t\tactions,\n\t\tdata\n\t);\n\tif (\n\t\t! [ LAYOUT_TABLE, LAYOUT_GRID ].includes( view.type ) ||\n\t\t! hasPossibleBulkAction\n\t) {\n\t\treturn null;\n\t}\n\n\treturn <_BulkActions />;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,SACCA,WAAW,IAAIC,qBAAqB,EACpCC,MAAM,EACNC,KAAK,QACC,uBAAuB;AAC9B,SAASC,EAAE,EAAEC,OAAO,EAAEC,EAAE,QAAQ,iBAAiB;AACjD,SAASC,OAAO,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,UAAU,QAAQ,oBAAoB;AAC/E,SAASC,WAAW,QAAQ,iBAAiB;;AAE7C;AACA;AACA;AACA,OAAOC,gBAAgB,MAAM,sBAAsB;AACnD,SAASC,YAAY,EAAEC,WAAW,QAAQ,iBAAiB;AAC3D,SAASC,MAAM,QAAQ,mBAAmB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAG3C,MAAM;EACLC,cAAc,EAAEC,YAAY;EAC5BC,mBAAmB,EAAEC,iBAAiB;EACtCC,kBAAkB,EAAEC,gBAAgB;EACpCC,uBAAuB,EAAEC;AAC1B,CAAC,GAAGd,MAAM,CAAEd,qBAAsB,CAAC;AAqBnC,OAAO,SAAS6B,yBAAyBA,CACxCC,OAAyB,EACzBC,IAAU,EACT;EACD,OAAOzB,OAAO,CAAE,MAAM;IACrB,OAAOwB,OAAO,CAACE,IAAI,CAAIC,MAAM,IAAM;MAClC,OACCA,MAAM,CAACC,YAAY,KACjB,CAAED,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACE,UAAU,CAAEJ,IAAK,CAAC,CAAE;IAEtD,CAAE,CAAC;EACJ,CAAC,EAAE,CAAED,OAAO,EAAEC,IAAI,CAAG,CAAC;AACvB;AAEA,OAAO,SAASK,iCAAiCA,CAChDN,OAAyB,EACzBO,IAAY,EACX;EACD,OAAO/B,OAAO,CAAE,MAAM;IACrB,OAAO+B,IAAI,CAACL,IAAI,CAAID,IAAI,IAAM;MAC7B,OAAOD,OAAO,CAACE,IAAI,CAAIC,MAAM,IAAM;QAClC,OACCA,MAAM,CAACC,YAAY,KACjB,CAAED,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACE,UAAU,CAAEJ,IAAK,CAAC,CAAE;MAEtD,CAAE,CAAC;IACJ,CAAE,CAAC;EACJ,CAAC,EAAE,CAAED,OAAO,EAAEO,IAAI,CAAG,CAAC;AACvB;AAEA,SAASC,eAAeA,CAAU;EACjCL,MAAM;EACNM,aAAa;EACbC,kBAAkB;EAClBC;AAC6B,CAAC,EAAG;EACjC,MAAMC,aAAa,GAAGpC,OAAO,CAAE,MAAM;IACpC,OAAOiC,aAAa,CAACI,MAAM,CACxBZ,IAAI,IAAM,CAAEE,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACE,UAAU,CAAEJ,IAAK,CAC5D,CAAC;EACF,CAAC,EAAE,CAAEE,MAAM,EAAEM,aAAa,CAAG,CAAC;EAC9B,MAAM;IAAEK,WAAW;IAAEC;EAAgB,CAAC,GAAGZ,MAAM;EAC/C,MAAMa,YAAY,GAAGtC,WAAW,CAAE,MAAM;IACvCgC,kBAAkB,CAAEO,SAAU,CAAC;EAChC,CAAC,EAAE,CAAEP,kBAAkB,CAAG,CAAC;EAC3B,MAAMQ,KAAK,GACV,OAAOf,MAAM,CAACe,KAAK,KAAK,QAAQ,GAC7Bf,MAAM,CAACe,KAAK,GACZf,MAAM,CAACe,KAAK,CAAET,aAAc,CAAC;EACjC,oBACCvB,IAAA,CAACd,KAAK;IACL+C,KAAK,EAAG,CAAEJ,eAAe,GAAGG,KAAK,GAAGD,SAAW;IAC/CG,wBAAwB,EAAG,CAAC,CAAEL,eAAiB;IAC/CM,cAAc,EAAGL,YAAc;IAC/BM,gBAAgB,EAAC,+BAA+B;IAAAC,QAAA,eAEhDrC,IAAA,CAAC4B,WAAW;MACXU,KAAK,EAAGZ,aAAe;MACvBa,UAAU,EAAGT,YAAc;MAC3BU,iBAAiB,EAAGA,CAAA,KAAMf,gBAAgB,CAAE,KAAM;IAAG,CACrD;EAAC,CACI,CAAC;AAEV;AAEA,SAASgB,cAAcA,CAAU;EAChCxB,MAAM;EACNM,aAAa;EACbC;AAC6B,CAAC,EAAG;EACjC,MAAMkB,QAAQ,GAAGhD,WAAW,CAAC,CAAC;EAC9B,MAAMgC,aAAa,GAAGpC,OAAO,CAAE,MAAM;IACpC,OAAOiC,aAAa,CAACI,MAAM,CACxBZ,IAAI,IAAM,CAAEE,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACE,UAAU,CAAEJ,IAAK,CAC5D,CAAC;EACF,CAAC,EAAE,CAAEE,MAAM,EAAEM,aAAa,CAAG,CAAC;EAE9B,MAAMoB,eAAe,IAAG,aAAa,IAAI1B,MAAM;EAE/C,oBACCjB,IAAA,CAACU,gBAAgB;IAEhBkC,WAAW,EAAG,CAAED,eAAiB;IACjCE,OAAO,EAAG,MAAAA,CAAA,KAAY;MACrB,IAAKF,eAAe,EAAG;QACtBnB,kBAAkB,CAAEP,MAAO,CAAC;MAC7B,CAAC,MAAM;QACNA,MAAM,CAAC6B,QAAQ,CAAEpB,aAAa,EAAE;UAAEgB;QAAS,CAAE,CAAC;MAC/C;IACD,CAAG;IACHK,MAAM,EAAGrB,aAAa,CAACsB,MAAQ;IAAAX,QAAA,EAE7BpB,MAAM,CAACe;EAAK,GAXRf,MAAM,CAACgC,EAYI,CAAC;AAErB;AAEA,SAASC,gBAAgBA,CAAU;EAClCpC,OAAO;EACPS,aAAa;EACbC;AAC8B,CAAC,EAAG;EAClC,MAAM2B,gBAAgB,GAAG7D,OAAO,CAAE,MAAM;IACvC,OAAOwB,OAAO,CAACa,MAAM,CAAIV,MAAM,IAAM;MACpC,OAAOM,aAAa,CAACP,IAAI,CACtBD,IAAI,IAAM,CAAEE,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACE,UAAU,CAAEJ,IAAK,CAC5D,CAAC;IACF,CAAE,CAAC;EACJ,CAAC,EAAE,CAAED,OAAO,EAAES,aAAa,CAAG,CAAC;EAC/B,IAAK,CAAE4B,gBAAgB,CAACH,MAAM,EAAG;IAChC,OAAO,IAAI;EACZ;EACA,oBACC5C,KAAA,CAAAF,SAAA;IAAAmC,QAAA,gBACCrC,IAAA,CAACQ,iBAAiB;MAAA6B,QAAA,EACfc,gBAAgB,CAACC,GAAG,CAAInC,MAAM,iBAC/BjB,IAAA,CAACyC,cAAc;QAEdxB,MAAM,EAAGA,MAAQ;QACjBM,aAAa,EAAGA,aAAe;QAC/BC,kBAAkB,EAAGA;MAAoB,GAHnCP,MAAM,CAACgC,EAIb,CACA;IAAC,CACe,CAAC,eACpBjD,IAAA,CAACY,qBAAqB,IAAE,CAAC;EAAA,CACxB,CAAC;AAEL;AAEA,SAASyC,YAAYA,CAAA,EAAG;EACvB,MAAM;IACLhC,IAAI;IACJP,OAAO,GAAG,EAAE;IACZwC,SAAS;IACTC,iBAAiB;IACjBC;EACD,CAAC,GAAG/D,UAAU,CAAEE,gBAAiB,CAAC;EAClC,MAAM8D,WAAW,GAAGnE,OAAO,CAC1B,MAAMwB,OAAO,CAACa,MAAM,CAAIV,MAAM,IAAMA,MAAM,CAACC,YAAa,CAAC,EACzD,CAAEJ,OAAO,CACV,CAAC;EACD,MAAM,CAAE4C,UAAU,EAAEjC,gBAAgB,CAAE,GAAGlC,QAAQ,CAAE,KAAM,CAAC;EAC1D,MAAM,CAAEoE,eAAe,EAAEnC,kBAAkB,CAAE,GAAGjC,QAAQ,CAEtD,CAAC;EACH,MAAMqE,eAAe,GAAGtE,OAAO,CAAE,MAAM;IACtC,OAAO+B,IAAI,CAACM,MAAM,CAAIZ,IAAI,IAAM;MAC/B,OAAO0C,WAAW,CAACzC,IAAI,CACpBC,MAAM,IAAM,CAAEA,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACE,UAAU,CAAEJ,IAAK,CAC9D,CAAC;IACF,CAAE,CAAC;EACJ,CAAC,EAAE,CAAEM,IAAI,EAAEoC,WAAW,CAAG,CAAC;EAE1B,MAAMI,qBAAqB,GAAGD,eAAe,CAACZ,MAAM;EAEpD,MAAMzB,aAAa,GAAGjC,OAAO,CAAE,MAAM;IACpC,OAAO+B,IAAI,CAACM,MAAM,CACfZ,IAAI,IACLuC,SAAS,CAACQ,QAAQ,CAAEN,SAAS,CAAEzC,IAAK,CAAE,CAAC,IACvC6C,eAAe,CAACE,QAAQ,CAAE/C,IAAK,CACjC,CAAC;EACF,CAAC,EAAE,CAAEuC,SAAS,EAAEjC,IAAI,EAAEmC,SAAS,EAAEI,eAAe,CAAG,CAAC;EAEpD,MAAMG,cAAc,GAAGxC,aAAa,CAACyB,MAAM,KAAKa,qBAAqB;EAErE,IAAKJ,WAAW,CAACT,MAAM,KAAK,CAAC,EAAG;IAC/B,OAAO,IAAI;EACZ;EACA,oBACC5C,KAAA,CAAAF,SAAA;IAAAmC,QAAA,gBACCjC,KAAA,CAACE,YAAY;MACZ0D,IAAI,EAAGN,UAAY;MACnBO,YAAY,EAAGxC,gBAAkB;MACjCO,KAAK,EAAG7C,EAAE,CAAE,cAAe,CAAG;MAC9B+E,KAAK,EAAG;QAAEC,QAAQ,EAAE;MAAQ,CAAG;MAC/BC,OAAO,eACNpE,IAAA,CAACf,MAAM;QACNoF,SAAS,EAAC,qCAAqC;QAC/CC,qBAAqB;QACrBC,OAAO,EAAC,UAAU;QAClBC,IAAI,EAAC,SAAS;QAAAnC,QAAA,EAEZd,aAAa,CAACyB,MAAM,GACnB5D,OAAO,EACP;QACAC,EAAE,CACD,cAAc,EACd,eAAe,EACfkC,aAAa,CAACyB,MACf,CAAC,EACDzB,aAAa,CAACyB,MACd,CAAC,GACD7D,EAAE,CAAE,WAAY;MAAC,CACb,CACR;MAAAkD,QAAA,gBAEDrC,IAAA,CAACkD,gBAAgB;QAChBpC,OAAO,EAAG2C,WAAa;QACvBjC,kBAAkB,EAAGA,kBAAoB;QACzCD,aAAa,EAAGA;MAAe,CAC/B,CAAC,eACFnB,KAAA,CAACI,iBAAiB;QAAA6B,QAAA,gBACjBrC,IAAA,CAACU,gBAAgB;UAChB+D,QAAQ,EAAGV,cAAgB;UAC3BnB,WAAW,EAAG,KAAO;UACrBC,OAAO,EAAGA,CAAA,KAAM;YACfU,iBAAiB,CAChBK,eAAe,CAACR,GAAG,CAAIrC,IAAI,IAC1ByC,SAAS,CAAEzC,IAAK,CACjB,CACD,CAAC;UACF,CAAG;UACHgC,MAAM,EAAGc,qBAAuB;UAAAxB,QAAA,EAE9BlD,EAAE,CAAE,YAAa;QAAC,CACH,CAAC,eACnBa,IAAA,CAACU,gBAAgB;UAChB+D,QAAQ,EAAGnB,SAAS,CAACN,MAAM,KAAK,CAAG;UACnCJ,WAAW,EAAG,KAAO;UACrBC,OAAO,EAAGA,CAAA,KAAM;YACfU,iBAAiB,CAAE,EAAG,CAAC;UACxB,CAAG;UAAAlB,QAAA,EAEDlD,EAAE,CAAE,UAAW;QAAC,CACD,CAAC;MAAA,CACD,CAAC;IAAA,CACP,CAAC,EACbwE,eAAe,iBAChB3D,IAAA,CAACsB,eAAe;MACfL,MAAM,EAAG0C,eAAiB;MAC1BpC,aAAa,EAAGA,aAAe;MAC/BC,kBAAkB,EAAGA,kBAAoB;MACzCC,gBAAgB,EAAGA;IAAkB,CACrC,CACD;EAAA,CACA,CAAC;AAEL;AAEA,eAAe,SAASiD,WAAWA,CAAA,EAAG;EACrC,MAAM;IAAErD,IAAI;IAAEP,OAAO,GAAG,EAAE;IAAE6D;EAAK,CAAC,GAAGlF,UAAU,CAAEE,gBAAiB,CAAC;EACnE,MAAMiF,qBAAqB,GAAGxD,iCAAiC,CAC9DN,OAAO,EACPO,IACD,CAAC;EACD,IACC,CAAE,CAAEzB,YAAY,EAAEC,WAAW,CAAE,CAACiE,QAAQ,CAAEa,IAAI,CAACE,IAAK,CAAC,IACrD,CAAED,qBAAqB,EACtB;IACD,OAAO,IAAI;EACZ;EAEA,oBAAO5E,IAAA,CAACqD,YAAY,IAAE,CAAC;AACxB","ignoreList":[]}
@@ -2,7 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { ToolbarButton, Toolbar, ToolbarGroup, __unstableMotion as motion, __unstableAnimatePresence as AnimatePresence } from '@wordpress/components';
5
- import { useMemo, useState, useRef } from '@wordpress/element';
5
+ import { useMemo, useState, useRef, useContext } from '@wordpress/element';
6
6
  import { _n, sprintf, __ } from '@wordpress/i18n';
7
7
  import { closeSmall } from '@wordpress/icons';
8
8
  import { useReducedMotion } from '@wordpress/compose';
@@ -11,7 +11,10 @@ import { useRegistry } from '@wordpress/data';
11
11
  /**
12
12
  * Internal dependencies
13
13
  */
14
- import { ActionWithModal } from './item-actions';
14
+ import { useSomeItemHasAPossibleBulkAction } from '../dataviews-bulk-actions';
15
+ import DataViewsContext from '../dataviews-context';
16
+ import { ActionWithModal } from '../dataviews-item-actions';
17
+ import { LAYOUT_GRID, LAYOUT_TABLE } from '../../constants';
15
18
  import { jsx as _jsx } from "react/jsx-runtime";
16
19
  import { Fragment as _Fragment } from "react/jsx-runtime";
17
20
  import { jsxs as _jsxs } from "react/jsx-runtime";
@@ -56,7 +59,6 @@ function ActionTrigger({
56
59
  size: "compact",
57
60
  onClick: onClick,
58
61
  isBusy: isBusy,
59
- __experimentalIsFocusable: true,
60
62
  tooltipPosition: "top"
61
63
  });
62
64
  }
@@ -92,11 +94,11 @@ function ActionButton({
92
94
  isBusy: actionInProgress === action.id
93
95
  }, action.id);
94
96
  }
95
- function renderToolbarContent(selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onSelectionChange) {
97
+ function renderToolbarContent(selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection) {
96
98
  return /*#__PURE__*/_jsxs(_Fragment, {
97
99
  children: [/*#__PURE__*/_jsx(ToolbarGroup, {
98
100
  children: /*#__PURE__*/_jsx("div", {
99
- className: "dataviews-bulk-actions__selection-count",
101
+ className: "dataviews-bulk-actions-toolbar__selection-count",
100
102
  children: selection.length === 1 ? __('1 item selected') : sprintf(
101
103
  // translators: %s: Total number of selected items.
102
104
  _n('%s item selected', '%s items selected', selection.length), selection.length)
@@ -118,7 +120,7 @@ function renderToolbarContent(selection, actionsToShow, selectedItems, actionInP
118
120
  label: __('Cancel'),
119
121
  disabled: !!actionInProgress,
120
122
  onClick: () => {
121
- onSelectionChange(EMPTY_ARRAY);
123
+ onChangeSelection(EMPTY_ARRAY);
122
124
  }
123
125
  })
124
126
  })]
@@ -128,7 +130,7 @@ function ToolbarContent({
128
130
  selection,
129
131
  actionsToShow,
130
132
  selectedItems,
131
- onSelectionChange
133
+ onChangeSelection
132
134
  }) {
133
135
  const [actionInProgress, setActionInProgress] = useState(null);
134
136
  const buttons = useRef(null);
@@ -136,19 +138,20 @@ function ToolbarContent({
136
138
  if (buttons.current) {
137
139
  buttons.current = null;
138
140
  }
139
- return renderToolbarContent(selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onSelectionChange);
141
+ return renderToolbarContent(selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection);
140
142
  } else if (!buttons.current) {
141
- buttons.current = renderToolbarContent(selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onSelectionChange);
143
+ buttons.current = renderToolbarContent(selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection);
142
144
  }
143
145
  return buttons.current;
144
146
  }
145
- export default function BulkActionsToolbar({
146
- data,
147
- selection,
148
- actions = EMPTY_ARRAY,
149
- onSelectionChange,
150
- getItemId
151
- }) {
147
+ function _BulkActionsToolbar() {
148
+ const {
149
+ data,
150
+ selection,
151
+ actions = EMPTY_ARRAY,
152
+ onChangeSelection,
153
+ getItemId
154
+ } = useContext(DataViewsContext);
152
155
  const isReducedMotion = useReducedMotion();
153
156
  const selectedItems = useMemo(() => {
154
157
  return data.filter(item => selection.includes(getItemId(item)));
@@ -167,20 +170,32 @@ export default function BulkActionsToolbar({
167
170
  animate: "open",
168
171
  exit: "exit",
169
172
  variants: isReducedMotion ? undefined : SNACKBAR_VARIANTS,
170
- className: "dataviews-bulk-actions",
173
+ className: "dataviews-bulk-actions-toolbar",
171
174
  children: /*#__PURE__*/_jsx(Toolbar, {
172
175
  label: __('Bulk actions'),
173
176
  children: /*#__PURE__*/_jsx("div", {
174
- className: "dataviews-bulk-actions-toolbar-wrapper",
177
+ className: "dataviews-bulk-actions-toolbar__wrapper",
175
178
  children: /*#__PURE__*/_jsx(ToolbarContent, {
176
179
  selection: selection,
177
180
  actionsToShow: actionsToShow,
178
181
  selectedItems: selectedItems,
179
- onSelectionChange: onSelectionChange
182
+ onChangeSelection: onChangeSelection
180
183
  })
181
184
  })
182
185
  })
183
186
  })
184
187
  });
185
188
  }
186
- //# sourceMappingURL=bulk-actions-toolbar.js.map
189
+ export default function BulkActionsToolbar() {
190
+ const {
191
+ data,
192
+ actions = [],
193
+ view
194
+ } = useContext(DataViewsContext);
195
+ const hasPossibleBulkAction = useSomeItemHasAPossibleBulkAction(actions, data);
196
+ if (![LAYOUT_TABLE, LAYOUT_GRID].includes(view.type) || !hasPossibleBulkAction) {
197
+ return null;
198
+ }
199
+ return /*#__PURE__*/_jsx(_BulkActionsToolbar, {});
200
+ }
201
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ToolbarButton","Toolbar","ToolbarGroup","__unstableMotion","motion","__unstableAnimatePresence","AnimatePresence","useMemo","useState","useRef","useContext","_n","sprintf","__","closeSmall","useReducedMotion","useRegistry","useSomeItemHasAPossibleBulkAction","DataViewsContext","ActionWithModal","LAYOUT_GRID","LAYOUT_TABLE","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","SNACKBAR_VARIANTS","init","bottom","open","transition","type","duration","ease","exit","opacity","ActionTrigger","action","onClick","isBusy","items","label","disabled","icon","isDestructive","size","tooltipPosition","EMPTY_ARRAY","ActionButton","selectedItems","actionInProgress","setActionInProgress","registry","selectedEligibleItems","filter","item","isEligible","id","callback","renderToolbarContent","selection","actionsToShow","onChangeSelection","children","className","length","map","showTooltip","ToolbarContent","buttons","current","_BulkActionsToolbar","data","actions","getItemId","isReducedMotion","includes","supportsBulk","some","div","layout","initial","animate","variants","undefined","BulkActionsToolbar","view","hasPossibleBulkAction"],"sources":["@wordpress/dataviews/src/components/dataviews-bulk-actions-toolbar/index.tsx"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tToolbarButton,\n\tToolbar,\n\tToolbarGroup,\n\t__unstableMotion as motion,\n\t__unstableAnimatePresence as AnimatePresence,\n} from '@wordpress/components';\nimport { useMemo, useState, useRef, useContext } from '@wordpress/element';\nimport { _n, sprintf, __ } from '@wordpress/i18n';\nimport { closeSmall } from '@wordpress/icons';\nimport { useReducedMotion } from '@wordpress/compose';\nimport { useRegistry } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { useSomeItemHasAPossibleBulkAction } from '../dataviews-bulk-actions';\nimport DataViewsContext from '../dataviews-context';\nimport { ActionWithModal } from '../dataviews-item-actions';\nimport { LAYOUT_GRID, LAYOUT_TABLE } from '../../constants';\nimport type { Action } from '../../types';\nimport type { ActionTriggerProps } from '../dataviews-item-actions';\nimport type { SetSelection } from '../../private-types';\n\ninterface ActionButtonProps< Item > {\n\taction: Action< Item >;\n\tselectedItems: Item[];\n\tactionInProgress: string | null;\n\tsetActionInProgress: ( actionId: string | null ) => void;\n}\n\ninterface ToolbarContentProps< Item > {\n\tselection: string[];\n\tactionsToShow: Action< Item >[];\n\tselectedItems: Item[];\n\tonChangeSelection: SetSelection;\n}\n\nconst SNACKBAR_VARIANTS = {\n\tinit: {\n\t\tbottom: -48,\n\t},\n\topen: {\n\t\tbottom: 24,\n\t\ttransition: {\n\t\t\tbottom: { type: 'tween', duration: 0.2, ease: [ 0, 0, 0.2, 1 ] },\n\t\t},\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tbottom: 24,\n\t\ttransition: {\n\t\t\topacity: { type: 'tween', duration: 0.2, ease: [ 0, 0, 0.2, 1 ] },\n\t\t},\n\t},\n};\n\nfunction ActionTrigger< Item >( {\n\taction,\n\tonClick,\n\tisBusy,\n\titems,\n}: ActionTriggerProps< Item > ) {\n\tconst label =\n\t\ttypeof action.label === 'string' ? action.label : action.label( items );\n\treturn (\n\t\t<ToolbarButton\n\t\t\tdisabled={ isBusy }\n\t\t\tlabel={ label }\n\t\t\ticon={ action.icon }\n\t\t\tisDestructive={ action.isDestructive }\n\t\t\tsize=\"compact\"\n\t\t\tonClick={ onClick }\n\t\t\tisBusy={ isBusy }\n\t\t\ttooltipPosition=\"top\"\n\t\t/>\n\t);\n}\n\nconst EMPTY_ARRAY: [] = [];\n\nfunction ActionButton< Item >( {\n\taction,\n\tselectedItems,\n\tactionInProgress,\n\tsetActionInProgress,\n}: ActionButtonProps< Item > ) {\n\tconst registry = useRegistry();\n\tconst selectedEligibleItems = useMemo( () => {\n\t\treturn selectedItems.filter( ( item ) => {\n\t\t\treturn ! action.isEligible || action.isEligible( item );\n\t\t} );\n\t}, [ action, selectedItems ] );\n\tif ( 'RenderModal' in action ) {\n\t\treturn (\n\t\t\t<ActionWithModal\n\t\t\t\tkey={ action.id }\n\t\t\t\taction={ action }\n\t\t\t\titems={ selectedEligibleItems }\n\t\t\t\tActionTrigger={ ActionTrigger }\n\t\t\t/>\n\t\t);\n\t}\n\treturn (\n\t\t<ActionTrigger\n\t\t\tkey={ action.id }\n\t\t\taction={ action }\n\t\t\tonClick={ () => {\n\t\t\t\tsetActionInProgress( action.id );\n\t\t\t\taction.callback( selectedItems, {\n\t\t\t\t\tregistry,\n\t\t\t\t} );\n\t\t\t} }\n\t\t\titems={ selectedEligibleItems }\n\t\t\tisBusy={ actionInProgress === action.id }\n\t\t/>\n\t);\n}\n\nfunction renderToolbarContent< Item >(\n\tselection: string[],\n\tactionsToShow: Action< Item >[],\n\tselectedItems: Item[],\n\tactionInProgress: string | null,\n\tsetActionInProgress: ( actionId: string | null ) => void,\n\tonChangeSelection: SetSelection\n) {\n\treturn (\n\t\t<>\n\t\t\t<ToolbarGroup>\n\t\t\t\t<div className=\"dataviews-bulk-actions-toolbar__selection-count\">\n\t\t\t\t\t{ selection.length === 1\n\t\t\t\t\t\t? __( '1 item selected' )\n\t\t\t\t\t\t: sprintf(\n\t\t\t\t\t\t\t\t// translators: %s: Total number of selected items.\n\t\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t\t'%s item selected',\n\t\t\t\t\t\t\t\t\t'%s items selected',\n\t\t\t\t\t\t\t\t\tselection.length\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tselection.length\n\t\t\t\t\t\t ) }\n\t\t\t\t</div>\n\t\t\t</ToolbarGroup>\n\t\t\t<ToolbarGroup>\n\t\t\t\t{ actionsToShow.map( ( action ) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ActionButton\n\t\t\t\t\t\t\tkey={ action.id }\n\t\t\t\t\t\t\taction={ action }\n\t\t\t\t\t\t\tselectedItems={ selectedItems }\n\t\t\t\t\t\t\tactionInProgress={ actionInProgress }\n\t\t\t\t\t\t\tsetActionInProgress={ setActionInProgress }\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t} ) }\n\t\t\t</ToolbarGroup>\n\t\t\t<ToolbarGroup>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ticon={ closeSmall }\n\t\t\t\t\tshowTooltip\n\t\t\t\t\ttooltipPosition=\"top\"\n\t\t\t\t\tlabel={ __( 'Cancel' ) }\n\t\t\t\t\tdisabled={ !! actionInProgress }\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tonChangeSelection( EMPTY_ARRAY );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</ToolbarGroup>\n\t\t</>\n\t);\n}\n\nfunction ToolbarContent< Item >( {\n\tselection,\n\tactionsToShow,\n\tselectedItems,\n\tonChangeSelection,\n}: ToolbarContentProps< Item > ) {\n\tconst [ actionInProgress, setActionInProgress ] = useState< string | null >(\n\t\tnull\n\t);\n\tconst buttons = useRef< JSX.Element | null >( null );\n\tif ( ! actionInProgress ) {\n\t\tif ( buttons.current ) {\n\t\t\tbuttons.current = null;\n\t\t}\n\t\treturn renderToolbarContent(\n\t\t\tselection,\n\t\t\tactionsToShow,\n\t\t\tselectedItems,\n\t\t\tactionInProgress,\n\t\t\tsetActionInProgress,\n\t\t\tonChangeSelection\n\t\t);\n\t} else if ( ! buttons.current ) {\n\t\tbuttons.current = renderToolbarContent(\n\t\t\tselection,\n\t\t\tactionsToShow,\n\t\t\tselectedItems,\n\t\t\tactionInProgress,\n\t\t\tsetActionInProgress,\n\t\t\tonChangeSelection\n\t\t);\n\t}\n\treturn buttons.current;\n}\n\nfunction _BulkActionsToolbar() {\n\tconst {\n\t\tdata,\n\t\tselection,\n\t\tactions = EMPTY_ARRAY,\n\t\tonChangeSelection,\n\t\tgetItemId,\n\t} = useContext( DataViewsContext );\n\tconst isReducedMotion = useReducedMotion();\n\tconst selectedItems = useMemo( () => {\n\t\treturn data.filter( ( item ) =>\n\t\t\tselection.includes( getItemId( item ) )\n\t\t);\n\t}, [ selection, data, getItemId ] );\n\n\tconst actionsToShow = useMemo(\n\t\t() =>\n\t\t\tactions.filter( ( action ) => {\n\t\t\t\treturn (\n\t\t\t\t\taction.supportsBulk &&\n\t\t\t\t\taction.icon &&\n\t\t\t\t\tselectedItems.some(\n\t\t\t\t\t\t( item ) =>\n\t\t\t\t\t\t\t! action.isEligible || action.isEligible( item )\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} ),\n\t\t[ actions, selectedItems ]\n\t);\n\n\tif (\n\t\t( selection && selection.length === 0 ) ||\n\t\tactionsToShow.length === 0\n\t) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t<motion.div\n\t\t\t\tlayout={ ! isReducedMotion } // See https://www.framer.com/docs/animation/#layout-animations\n\t\t\t\tinitial=\"init\"\n\t\t\t\tanimate=\"open\"\n\t\t\t\texit=\"exit\"\n\t\t\t\tvariants={ isReducedMotion ? undefined : SNACKBAR_VARIANTS }\n\t\t\t\tclassName=\"dataviews-bulk-actions-toolbar\"\n\t\t\t>\n\t\t\t\t<Toolbar label={ __( 'Bulk actions' ) }>\n\t\t\t\t\t<div className=\"dataviews-bulk-actions-toolbar__wrapper\">\n\t\t\t\t\t\t<ToolbarContent\n\t\t\t\t\t\t\tselection={ selection }\n\t\t\t\t\t\t\tactionsToShow={ actionsToShow }\n\t\t\t\t\t\t\tselectedItems={ selectedItems }\n\t\t\t\t\t\t\tonChangeSelection={ onChangeSelection }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</Toolbar>\n\t\t\t</motion.div>\n\t\t</AnimatePresence>\n\t);\n}\n\nexport default function BulkActionsToolbar() {\n\tconst { data, actions = [], view } = useContext( DataViewsContext );\n\tconst hasPossibleBulkAction = useSomeItemHasAPossibleBulkAction(\n\t\tactions,\n\t\tdata\n\t);\n\tif (\n\t\t! [ LAYOUT_TABLE, LAYOUT_GRID ].includes( view.type ) ||\n\t\t! hasPossibleBulkAction\n\t) {\n\t\treturn null;\n\t}\n\n\treturn <_BulkActionsToolbar />;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { createContext } from '@wordpress/element';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+
10
+ import { LAYOUT_TABLE } from '../../constants';
11
+ const DataViewsContext = createContext({
12
+ view: {
13
+ type: LAYOUT_TABLE
14
+ },
15
+ onChangeView: () => {},
16
+ fields: [],
17
+ data: [],
18
+ paginationInfo: {
19
+ totalItems: 0,
20
+ totalPages: 0
21
+ },
22
+ selection: [],
23
+ onChangeSelection: () => {},
24
+ setOpenedFilter: () => {},
25
+ openedFilter: null,
26
+ getItemId: item => item.id,
27
+ density: 0
28
+ });
29
+ export default DataViewsContext;
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","LAYOUT_TABLE","DataViewsContext","view","type","onChangeView","fields","data","paginationInfo","totalItems","totalPages","selection","onChangeSelection","setOpenedFilter","openedFilter","getItemId","item","id","density"],"sources":["@wordpress/dataviews/src/components/dataviews-context/index.ts"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { createContext } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport type { View, Action, NormalizedField } from '../../types';\nimport type { SetSelection } from '../../private-types';\nimport { LAYOUT_TABLE } from '../../constants';\n\ntype DataViewsContextType< Item > = {\n\tview: View;\n\tonChangeView: ( view: View ) => void;\n\tfields: NormalizedField< Item >[];\n\tactions?: Action< Item >[];\n\tdata: Item[];\n\tisLoading?: boolean;\n\tpaginationInfo: {\n\t\ttotalItems: number;\n\t\ttotalPages: number;\n\t};\n\tselection: string[];\n\tonChangeSelection: SetSelection;\n\topenedFilter: string | null;\n\tsetOpenedFilter: ( openedFilter: string | null ) => void;\n\tgetItemId: ( item: Item ) => string;\n\tdensity: number;\n};\n\nconst DataViewsContext = createContext< DataViewsContextType< any > >( {\n\tview: { type: LAYOUT_TABLE },\n\tonChangeView: () => {},\n\tfields: [],\n\tdata: [],\n\tpaginationInfo: {\n\t\ttotalItems: 0,\n\t\ttotalPages: 0,\n\t},\n\tselection: [],\n\tonChangeSelection: () => {},\n\tsetOpenedFilter: () => {},\n\topenedFilter: null,\n\tgetItemId: ( item ) => item.id,\n\tdensity: 0,\n} );\n\nexport default DataViewsContext;\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,aAAa,QAAQ,oBAAoB;;AAElD;AACA;AACA;;AAGA,SAASC,YAAY,QAAQ,iBAAiB;AAqB9C,MAAMC,gBAAgB,GAAGF,aAAa,CAAiC;EACtEG,IAAI,EAAE;IAAEC,IAAI,EAAEH;EAAa,CAAC;EAC5BI,YAAY,EAAEA,CAAA,KAAM,CAAC,CAAC;EACtBC,MAAM,EAAE,EAAE;EACVC,IAAI,EAAE,EAAE;EACRC,cAAc,EAAE;IACfC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE;EACb,CAAC;EACDC,SAAS,EAAE,EAAE;EACbC,iBAAiB,EAAEA,CAAA,KAAM,CAAC,CAAC;EAC3BC,eAAe,EAAEA,CAAA,KAAM,CAAC,CAAC;EACzBC,YAAY,EAAE,IAAI;EAClBC,SAAS,EAAIC,IAAI,IAAMA,IAAI,CAACC,EAAE;EAC9BC,OAAO,EAAE;AACV,CAAE,CAAC;AAEH,eAAehB,gBAAgB","ignoreList":[]}
@@ -12,7 +12,7 @@ import { forwardRef } from '@wordpress/element';
12
12
  /**
13
13
  * Internal dependencies
14
14
  */
15
- import { unlock } from './lock-unlock';
15
+ import { unlock } from '../../lock-unlock';
16
16
  import { jsx as _jsx } from "react/jsx-runtime";
17
17
  const {
18
18
  DropdownMenuV2: DropdownMenu,
@@ -33,9 +33,9 @@ function AddFilter({
33
33
  const inactiveFilters = filters.filter(filter => !filter.isVisible);
34
34
  return /*#__PURE__*/_jsx(DropdownMenu, {
35
35
  trigger: /*#__PURE__*/_jsx(Button, {
36
- __experimentalIsFocusable: true,
36
+ accessibleWhenDisabled: true,
37
37
  size: "compact",
38
- className: "dataviews-filters-button",
38
+ className: "dataviews-filters__button",
39
39
  variant: "tertiary",
40
40
  disabled: !inactiveFilters.length,
41
41
  ref: ref,
@@ -0,0 +1 @@
1
+ {"version":3,"names":["privateApis","componentsPrivateApis","Button","__","forwardRef","unlock","jsx","_jsx","DropdownMenuV2","DropdownMenu","DropdownMenuItemV2","DropdownMenuItem","DropdownMenuItemLabelV2","DropdownMenuItemLabel","AddFilter","filters","view","onChangeView","setOpenedFilter","ref","length","every","isPrimary","inactiveFilters","filter","isVisible","trigger","accessibleWhenDisabled","size","className","variant","disabled","children","map","onClick","field","page","value","undefined","operator","operators","name"],"sources":["@wordpress/dataviews/src/components/dataviews-filters/add-filter.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport type { Ref } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tprivateApis as componentsPrivateApis,\n\tButton,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { forwardRef } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\nimport type { NormalizedFilter, View } from '../../types';\n\nconst {\n\tDropdownMenuV2: DropdownMenu,\n\tDropdownMenuItemV2: DropdownMenuItem,\n\tDropdownMenuItemLabelV2: DropdownMenuItemLabel,\n} = unlock( componentsPrivateApis );\n\ninterface AddFilterProps {\n\tfilters: NormalizedFilter[];\n\tview: View;\n\tonChangeView: ( view: View ) => void;\n\tsetOpenedFilter: ( filter: string | null ) => void;\n}\n\nfunction AddFilter(\n\t{ filters, view, onChangeView, setOpenedFilter }: AddFilterProps,\n\tref: Ref< HTMLButtonElement >\n) {\n\tif ( ! filters.length || filters.every( ( { isPrimary } ) => isPrimary ) ) {\n\t\treturn null;\n\t}\n\tconst inactiveFilters = filters.filter( ( filter ) => ! filter.isVisible );\n\treturn (\n\t\t<DropdownMenu\n\t\t\ttrigger={\n\t\t\t\t<Button\n\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\tclassName=\"dataviews-filters__button\"\n\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\tdisabled={ ! inactiveFilters.length }\n\t\t\t\t\tref={ ref }\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Add filter' ) }\n\t\t\t\t</Button>\n\t\t\t}\n\t\t>\n\t\t\t{ inactiveFilters.map( ( filter ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={ filter.field }\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tsetOpenedFilter( filter.field );\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\tpage: 1,\n\t\t\t\t\t\t\t\tfilters: [\n\t\t\t\t\t\t\t\t\t...( view.filters || [] ),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tfield: filter.field,\n\t\t\t\t\t\t\t\t\t\tvalue: undefined,\n\t\t\t\t\t\t\t\t\t\toperator: filter.operators[ 0 ],\n\t\t\t\t\t\t\t\t\t},\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\t\t<DropdownMenuItemLabel>\n\t\t\t\t\t\t\t{ filter.name }\n\t\t\t\t\t\t</DropdownMenuItemLabel>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</DropdownMenu>\n\t);\n}\n\nexport default forwardRef( AddFilter );\n"],"mappings":"AAAA;AACA;AACA;;AAGA;AACA;AACA;AACA,SACCA,WAAW,IAAIC,qBAAqB,EACpCC,MAAM,QACA,uBAAuB;AAC9B,SAASC,EAAE,QAAQ,iBAAiB;AACpC,SAASC,UAAU,QAAQ,oBAAoB;;AAE/C;AACA;AACA;AACA,SAASC,MAAM,QAAQ,mBAAmB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAG3C,MAAM;EACLC,cAAc,EAAEC,YAAY;EAC5BC,kBAAkB,EAAEC,gBAAgB;EACpCC,uBAAuB,EAAEC;AAC1B,CAAC,GAAGR,MAAM,CAAEJ,qBAAsB,CAAC;AASnC,SAASa,SAASA,CACjB;EAAEC,OAAO;EAAEC,IAAI;EAAEC,YAAY;EAAEC;AAAgC,CAAC,EAChEC,GAA6B,EAC5B;EACD,IAAK,CAAEJ,OAAO,CAACK,MAAM,IAAIL,OAAO,CAACM,KAAK,CAAE,CAAE;IAAEC;EAAU,CAAC,KAAMA,SAAU,CAAC,EAAG;IAC1E,OAAO,IAAI;EACZ;EACA,MAAMC,eAAe,GAAGR,OAAO,CAACS,MAAM,CAAIA,MAAM,IAAM,CAAEA,MAAM,CAACC,SAAU,CAAC;EAC1E,oBACClB,IAAA,CAACE,YAAY;IACZiB,OAAO,eACNnB,IAAA,CAACL,MAAM;MACNyB,sBAAsB;MACtBC,IAAI,EAAC,SAAS;MACdC,SAAS,EAAC,2BAA2B;MACrCC,OAAO,EAAC,UAAU;MAClBC,QAAQ,EAAG,CAAER,eAAe,CAACH,MAAQ;MACrCD,GAAG,EAAGA,GAAK;MAAAa,QAAA,EAET7B,EAAE,CAAE,YAAa;IAAC,CACb,CACR;IAAA6B,QAAA,EAECT,eAAe,CAACU,GAAG,CAAIT,MAAM,IAAM;MACpC,oBACCjB,IAAA,CAACI,gBAAgB;QAEhBuB,OAAO,EAAGA,CAAA,KAAM;UACfhB,eAAe,CAAEM,MAAM,CAACW,KAAM,CAAC;UAC/BlB,YAAY,CAAE;YACb,GAAGD,IAAI;YACPoB,IAAI,EAAE,CAAC;YACPrB,OAAO,EAAE,CACR,IAAKC,IAAI,CAACD,OAAO,IAAI,EAAE,CAAE,EACzB;cACCoB,KAAK,EAAEX,MAAM,CAACW,KAAK;cACnBE,KAAK,EAAEC,SAAS;cAChBC,QAAQ,EAAEf,MAAM,CAACgB,SAAS,CAAE,CAAC;YAC9B,CAAC;UAEH,CAAE,CAAC;QACJ,CAAG;QAAAR,QAAA,eAEHzB,IAAA,CAACM,qBAAqB;UAAAmB,QAAA,EACnBR,MAAM,CAACiB;QAAI,CACS;MAAC,GAnBlBjB,MAAM,CAACW,KAoBI,CAAC;IAErB,CAAE;EAAC,CACU,CAAC;AAEjB;AAEA,eAAe/B,UAAU,CAAEU,SAAU,CAAC","ignoreList":[]}
@@ -16,7 +16,7 @@ const SPACE = ' ';
16
16
  * Internal dependencies
17
17
  */
18
18
  import SearchWidget from './search-widget';
19
- import { OPERATORS, OPERATOR_IS, OPERATOR_IS_NOT, OPERATOR_IS_ANY, OPERATOR_IS_NONE, OPERATOR_IS_ALL, OPERATOR_IS_NOT_ALL } from './constants';
19
+ import { OPERATORS, OPERATOR_IS, OPERATOR_IS_NOT, OPERATOR_IS_ANY, OPERATOR_IS_NONE, OPERATOR_IS_ALL, OPERATOR_IS_NOT_ALL } from '../../constants';
20
20
  import { jsx as _jsx } from "react/jsx-runtime";
21
21
  import { jsxs as _jsxs } from "react/jsx-runtime";
22
22
  const FilterText = ({
@@ -29,10 +29,10 @@ const FilterText = ({
29
29
  }
30
30
  const filterTextWrappers = {
31
31
  Name: /*#__PURE__*/_jsx("span", {
32
- className: "dataviews-filter-summary__filter-text-name"
32
+ className: "dataviews-filters__summary-filter-text-name"
33
33
  }),
34
34
  Value: /*#__PURE__*/_jsx("span", {
35
- className: "dataviews-filter-summary__filter-text-value"
35
+ className: "dataviews-filters__summary-filter-text-value"
36
36
  })
37
37
  };
38
38
  if (filterInView?.operator === OPERATOR_IS_ANY) {
@@ -71,22 +71,23 @@ function OperatorSelector({
71
71
  value: operator,
72
72
  label: OPERATORS[operator]?.label
73
73
  }));
74
- const currentFilter = view.filters.find(_filter => _filter.field === filter.field);
74
+ const currentFilter = view.filters?.find(_filter => _filter.field === filter.field);
75
75
  const value = currentFilter?.operator || filter.operators[0];
76
76
  return operatorOptions.length > 1 && /*#__PURE__*/_jsxs(HStack, {
77
77
  spacing: 2,
78
78
  justify: "flex-start",
79
- className: "dataviews-filter-summary__operators-container",
79
+ className: "dataviews-filters__summary-operators-container",
80
80
  children: [/*#__PURE__*/_jsx(FlexItem, {
81
- className: "dataviews-filter-summary__operators-filter-name",
81
+ className: "dataviews-filters__summary-operators-filter-name",
82
82
  children: filter.name
83
83
  }), /*#__PURE__*/_jsx(SelectControl, {
84
84
  label: __('Conditions'),
85
85
  value: value,
86
86
  options: operatorOptions,
87
87
  onChange: newValue => {
88
+ var _view$filters, _view$filters2;
88
89
  const operator = newValue;
89
- const newFilters = currentFilter ? [...view.filters.map(_filter => {
90
+ const newFilters = currentFilter ? [...((_view$filters = view.filters) !== null && _view$filters !== void 0 ? _view$filters : []).map(_filter => {
90
91
  if (_filter.field === filter.field) {
91
92
  return {
92
93
  ..._filter,
@@ -94,7 +95,7 @@ function OperatorSelector({
94
95
  };
95
96
  }
96
97
  return _filter;
97
- })] : [...view.filters, {
98
+ })] : [...((_view$filters2 = view.filters) !== null && _view$filters2 !== void 0 ? _view$filters2 : []), {
98
99
  field: filter.field,
99
100
  operator,
100
101
  value: undefined
@@ -122,7 +123,7 @@ export default function FilterSummary({
122
123
  view,
123
124
  onChangeView
124
125
  } = commonProps;
125
- const filterInView = view.filters.find(f => f.field === filter.field);
126
+ const filterInView = view.filters?.find(f => f.field === filter.field);
126
127
  const activeElements = filter.elements.filter(element => {
127
128
  if (filter.singleSelection) {
128
129
  return element.value === filterInView?.value;
@@ -134,7 +135,7 @@ export default function FilterSummary({
134
135
  const canResetOrRemove = !isPrimary || hasValues;
135
136
  return /*#__PURE__*/_jsx(Dropdown, {
136
137
  defaultOpen: openedFilter === filter.field,
137
- contentClassName: "dataviews-filter-summary__popover",
138
+ contentClassName: "dataviews-filters__summary-popover",
138
139
  popoverProps: {
139
140
  placement: 'bottom-start',
140
141
  role: 'dialog'
@@ -146,13 +147,13 @@ export default function FilterSummary({
146
147
  isOpen,
147
148
  onToggle
148
149
  }) => /*#__PURE__*/_jsxs("div", {
149
- className: "dataviews-filter-summary__chip-container",
150
+ className: "dataviews-filters__summary-chip-container",
150
151
  children: [/*#__PURE__*/_jsx(Tooltip, {
151
152
  text: sprintf( /* translators: 1: Filter name. */
152
153
  __('Filter by: %1$s'), filter.name.toLowerCase()),
153
154
  placement: "top",
154
155
  children: /*#__PURE__*/_jsx("div", {
155
- className: clsx('dataviews-filter-summary__chip', {
156
+ className: clsx('dataviews-filters__summary-chip', {
156
157
  'has-reset': canResetOrRemove,
157
158
  'has-values': hasValues
158
159
  }),
@@ -178,14 +179,14 @@ export default function FilterSummary({
178
179
  text: isPrimary ? __('Reset') : __('Remove'),
179
180
  placement: "top",
180
181
  children: /*#__PURE__*/_jsx("button", {
181
- className: clsx('dataviews-filter-summary__chip-remove', {
182
+ className: clsx('dataviews-filters__summary-chip-remove', {
182
183
  'has-values': hasValues
183
184
  }),
184
185
  onClick: () => {
185
186
  onChangeView({
186
187
  ...view,
187
188
  page: 1,
188
- filters: view.filters.filter(_filter => _filter.field !== filter.field)
189
+ filters: view.filters?.filter(_filter => _filter.field !== filter.field)
189
190
  });
190
191
  // If the filter is not primary and can be removed, it will be added
191
192
  // back to the available filters from `Add filter` component.