@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
@@ -8,7 +8,7 @@ import {
8
8
  __unstableMotion as motion,
9
9
  __unstableAnimatePresence as AnimatePresence,
10
10
  } from '@wordpress/components';
11
- import { useMemo, useState, useRef } from '@wordpress/element';
11
+ import { useMemo, useState, useRef, useContext } from '@wordpress/element';
12
12
  import { _n, sprintf, __ } from '@wordpress/i18n';
13
13
  import { closeSmall } from '@wordpress/icons';
14
14
  import { useReducedMotion } from '@wordpress/compose';
@@ -17,30 +17,26 @@ import { useRegistry } from '@wordpress/data';
17
17
  /**
18
18
  * Internal dependencies
19
19
  */
20
- import { ActionWithModal } from './item-actions';
21
- import type { Action, AnyItem } from './types';
22
- import type { ActionTriggerProps } from './item-actions';
20
+ import { useSomeItemHasAPossibleBulkAction } from '../dataviews-bulk-actions';
21
+ import DataViewsContext from '../dataviews-context';
22
+ import { ActionWithModal } from '../dataviews-item-actions';
23
+ import { LAYOUT_GRID, LAYOUT_TABLE } from '../../constants';
24
+ import type { Action } from '../../types';
25
+ import type { ActionTriggerProps } from '../dataviews-item-actions';
26
+ import type { SetSelection } from '../../private-types';
23
27
 
24
- interface ActionButtonProps< Item extends AnyItem > {
28
+ interface ActionButtonProps< Item > {
25
29
  action: Action< Item >;
26
30
  selectedItems: Item[];
27
31
  actionInProgress: string | null;
28
32
  setActionInProgress: ( actionId: string | null ) => void;
29
33
  }
30
34
 
31
- interface ToolbarContentProps< Item extends AnyItem > {
35
+ interface ToolbarContentProps< Item > {
32
36
  selection: string[];
33
37
  actionsToShow: Action< Item >[];
34
38
  selectedItems: Item[];
35
- onSelectionChange: ( selection: Item[] ) => void;
36
- }
37
-
38
- interface BulkActionsToolbarProps< Item extends AnyItem > {
39
- data: Item[];
40
- selection: string[];
41
- actions: Action< Item >[];
42
- onSelectionChange: ( selection: Item[] ) => void;
43
- getItemId: ( item: Item ) => string;
39
+ onChangeSelection: SetSelection;
44
40
  }
45
41
 
46
42
  const SNACKBAR_VARIANTS = {
@@ -62,7 +58,7 @@ const SNACKBAR_VARIANTS = {
62
58
  },
63
59
  };
64
60
 
65
- function ActionTrigger< Item extends AnyItem >( {
61
+ function ActionTrigger< Item >( {
66
62
  action,
67
63
  onClick,
68
64
  isBusy,
@@ -79,7 +75,6 @@ function ActionTrigger< Item extends AnyItem >( {
79
75
  size="compact"
80
76
  onClick={ onClick }
81
77
  isBusy={ isBusy }
82
- __experimentalIsFocusable
83
78
  tooltipPosition="top"
84
79
  />
85
80
  );
@@ -87,7 +82,7 @@ function ActionTrigger< Item extends AnyItem >( {
87
82
 
88
83
  const EMPTY_ARRAY: [] = [];
89
84
 
90
- function ActionButton< Item extends AnyItem >( {
85
+ function ActionButton< Item >( {
91
86
  action,
92
87
  selectedItems,
93
88
  actionInProgress,
@@ -125,18 +120,18 @@ function ActionButton< Item extends AnyItem >( {
125
120
  );
126
121
  }
127
122
 
128
- function renderToolbarContent< Item extends AnyItem >(
123
+ function renderToolbarContent< Item >(
129
124
  selection: string[],
130
125
  actionsToShow: Action< Item >[],
131
126
  selectedItems: Item[],
132
127
  actionInProgress: string | null,
133
128
  setActionInProgress: ( actionId: string | null ) => void,
134
- onSelectionChange: ( selection: Item[] ) => void
129
+ onChangeSelection: SetSelection
135
130
  ) {
136
131
  return (
137
132
  <>
138
133
  <ToolbarGroup>
139
- <div className="dataviews-bulk-actions__selection-count">
134
+ <div className="dataviews-bulk-actions-toolbar__selection-count">
140
135
  { selection.length === 1
141
136
  ? __( '1 item selected' )
142
137
  : sprintf(
@@ -171,7 +166,7 @@ function renderToolbarContent< Item extends AnyItem >(
171
166
  label={ __( 'Cancel' ) }
172
167
  disabled={ !! actionInProgress }
173
168
  onClick={ () => {
174
- onSelectionChange( EMPTY_ARRAY );
169
+ onChangeSelection( EMPTY_ARRAY );
175
170
  } }
176
171
  />
177
172
  </ToolbarGroup>
@@ -179,11 +174,11 @@ function renderToolbarContent< Item extends AnyItem >(
179
174
  );
180
175
  }
181
176
 
182
- function ToolbarContent< Item extends AnyItem >( {
177
+ function ToolbarContent< Item >( {
183
178
  selection,
184
179
  actionsToShow,
185
180
  selectedItems,
186
- onSelectionChange,
181
+ onChangeSelection,
187
182
  }: ToolbarContentProps< Item > ) {
188
183
  const [ actionInProgress, setActionInProgress ] = useState< string | null >(
189
184
  null
@@ -199,7 +194,7 @@ function ToolbarContent< Item extends AnyItem >( {
199
194
  selectedItems,
200
195
  actionInProgress,
201
196
  setActionInProgress,
202
- onSelectionChange
197
+ onChangeSelection
203
198
  );
204
199
  } else if ( ! buttons.current ) {
205
200
  buttons.current = renderToolbarContent(
@@ -208,19 +203,20 @@ function ToolbarContent< Item extends AnyItem >( {
208
203
  selectedItems,
209
204
  actionInProgress,
210
205
  setActionInProgress,
211
- onSelectionChange
206
+ onChangeSelection
212
207
  );
213
208
  }
214
209
  return buttons.current;
215
210
  }
216
211
 
217
- export default function BulkActionsToolbar< Item extends AnyItem >( {
218
- data,
219
- selection,
220
- actions = EMPTY_ARRAY,
221
- onSelectionChange,
222
- getItemId,
223
- }: BulkActionsToolbarProps< Item > ) {
212
+ function _BulkActionsToolbar() {
213
+ const {
214
+ data,
215
+ selection,
216
+ actions = EMPTY_ARRAY,
217
+ onChangeSelection,
218
+ getItemId,
219
+ } = useContext( DataViewsContext );
224
220
  const isReducedMotion = useReducedMotion();
225
221
  const selectedItems = useMemo( () => {
226
222
  return data.filter( ( item ) =>
@@ -258,15 +254,15 @@ export default function BulkActionsToolbar< Item extends AnyItem >( {
258
254
  animate="open"
259
255
  exit="exit"
260
256
  variants={ isReducedMotion ? undefined : SNACKBAR_VARIANTS }
261
- className="dataviews-bulk-actions"
257
+ className="dataviews-bulk-actions-toolbar"
262
258
  >
263
259
  <Toolbar label={ __( 'Bulk actions' ) }>
264
- <div className="dataviews-bulk-actions-toolbar-wrapper">
260
+ <div className="dataviews-bulk-actions-toolbar__wrapper">
265
261
  <ToolbarContent
266
262
  selection={ selection }
267
263
  actionsToShow={ actionsToShow }
268
264
  selectedItems={ selectedItems }
269
- onSelectionChange={ onSelectionChange }
265
+ onChangeSelection={ onChangeSelection }
270
266
  />
271
267
  </div>
272
268
  </Toolbar>
@@ -274,3 +270,19 @@ export default function BulkActionsToolbar< Item extends AnyItem >( {
274
270
  </AnimatePresence>
275
271
  );
276
272
  }
273
+
274
+ export default function BulkActionsToolbar() {
275
+ const { data, actions = [], view } = useContext( DataViewsContext );
276
+ const hasPossibleBulkAction = useSomeItemHasAPossibleBulkAction(
277
+ actions,
278
+ data
279
+ );
280
+ if (
281
+ ! [ LAYOUT_TABLE, LAYOUT_GRID ].includes( view.type ) ||
282
+ ! hasPossibleBulkAction
283
+ ) {
284
+ return null;
285
+ }
286
+
287
+ return <_BulkActionsToolbar />;
288
+ }
@@ -0,0 +1,45 @@
1
+ .dataviews-bulk-actions-toolbar {
2
+ position: sticky;
3
+ display: flex;
4
+ flex-direction: column;
5
+ align-content: center;
6
+ flex-wrap: wrap;
7
+ width: fit-content;
8
+ margin-left: auto;
9
+ margin-right: auto;
10
+ bottom: $grid-unit-30;
11
+ z-index: z-index(".dataviews-bulk-actions-toolbar");
12
+
13
+ .components-accessible-toolbar {
14
+ border-color: $gray-300;
15
+ box-shadow: $shadow-popover;
16
+
17
+ .components-toolbar-group {
18
+ border-color: $gray-200;
19
+
20
+ &:last-child {
21
+ border: 0;
22
+ }
23
+ }
24
+ }
25
+
26
+ .dataviews-bulk-actions-toolbar__selection-count {
27
+ display: flex;
28
+ align-items: center;
29
+ margin: 0 $grid-unit-10 0 $grid-unit-10;
30
+ }
31
+ }
32
+
33
+ .dataviews-bulk-actions-toolbar__wrapper {
34
+ display: flex;
35
+ flex-grow: 1;
36
+ width: 100%;
37
+
38
+ .components-toolbar-group {
39
+ align-items: center;
40
+ }
41
+
42
+ .components-button.is-busy {
43
+ max-height: $button-size;
44
+ }
45
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { createContext } from '@wordpress/element';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type { View, Action, NormalizedField } from '../../types';
10
+ import type { SetSelection } from '../../private-types';
11
+ import { LAYOUT_TABLE } from '../../constants';
12
+
13
+ type DataViewsContextType< Item > = {
14
+ view: View;
15
+ onChangeView: ( view: View ) => void;
16
+ fields: NormalizedField< Item >[];
17
+ actions?: Action< Item >[];
18
+ data: Item[];
19
+ isLoading?: boolean;
20
+ paginationInfo: {
21
+ totalItems: number;
22
+ totalPages: number;
23
+ };
24
+ selection: string[];
25
+ onChangeSelection: SetSelection;
26
+ openedFilter: string | null;
27
+ setOpenedFilter: ( openedFilter: string | null ) => void;
28
+ getItemId: ( item: Item ) => string;
29
+ density: number;
30
+ };
31
+
32
+ const DataViewsContext = createContext< DataViewsContextType< any > >( {
33
+ view: { type: LAYOUT_TABLE },
34
+ onChangeView: () => {},
35
+ fields: [],
36
+ data: [],
37
+ paginationInfo: {
38
+ totalItems: 0,
39
+ totalPages: 0,
40
+ },
41
+ selection: [],
42
+ onChangeSelection: () => {},
43
+ setOpenedFilter: () => {},
44
+ openedFilter: null,
45
+ getItemId: ( item ) => item.id,
46
+ density: 0,
47
+ } );
48
+
49
+ export default DataViewsContext;
@@ -16,8 +16,8 @@ import { forwardRef } from '@wordpress/element';
16
16
  /**
17
17
  * Internal dependencies
18
18
  */
19
- import { unlock } from './lock-unlock';
20
- import type { NormalizedFilter, View } from './types';
19
+ import { unlock } from '../../lock-unlock';
20
+ import type { NormalizedFilter, View } from '../../types';
21
21
 
22
22
  const {
23
23
  DropdownMenuV2: DropdownMenu,
@@ -44,9 +44,9 @@ function AddFilter(
44
44
  <DropdownMenu
45
45
  trigger={
46
46
  <Button
47
- __experimentalIsFocusable
47
+ accessibleWhenDisabled
48
48
  size="compact"
49
- className="dataviews-filters-button"
49
+ className="dataviews-filters__button"
50
50
  variant="tertiary"
51
51
  disabled={ ! inactiveFilters.length }
52
52
  ref={ ref }
@@ -35,8 +35,14 @@ import {
35
35
  OPERATOR_IS_NONE,
36
36
  OPERATOR_IS_ALL,
37
37
  OPERATOR_IS_NOT_ALL,
38
- } from './constants';
39
- import type { Filter, NormalizedFilter, Operator, Option, View } from './types';
38
+ } from '../../constants';
39
+ import type {
40
+ Filter,
41
+ NormalizedFilter,
42
+ Operator,
43
+ Option,
44
+ View,
45
+ } from '../../types';
40
46
 
41
47
  interface FilterTextProps {
42
48
  activeElements: Option[];
@@ -65,8 +71,10 @@ const FilterText = ( {
65
71
  }
66
72
 
67
73
  const filterTextWrappers = {
68
- Name: <span className="dataviews-filter-summary__filter-text-name" />,
69
- Value: <span className="dataviews-filter-summary__filter-text-value" />,
74
+ Name: <span className="dataviews-filters__summary-filter-text-name" />,
75
+ Value: (
76
+ <span className="dataviews-filters__summary-filter-text-value" />
77
+ ),
70
78
  };
71
79
 
72
80
  if ( filterInView?.operator === OPERATOR_IS_ANY ) {
@@ -157,7 +165,7 @@ function OperatorSelector( {
157
165
  value: operator,
158
166
  label: OPERATORS[ operator ]?.label,
159
167
  } ) );
160
- const currentFilter = view.filters.find(
168
+ const currentFilter = view.filters?.find(
161
169
  ( _filter ) => _filter.field === filter.field
162
170
  );
163
171
  const value = currentFilter?.operator || filter.operators[ 0 ];
@@ -166,9 +174,9 @@ function OperatorSelector( {
166
174
  <HStack
167
175
  spacing={ 2 }
168
176
  justify="flex-start"
169
- className="dataviews-filter-summary__operators-container"
177
+ className="dataviews-filters__summary-operators-container"
170
178
  >
171
- <FlexItem className="dataviews-filter-summary__operators-filter-name">
179
+ <FlexItem className="dataviews-filters__summary-operators-filter-name">
172
180
  { filter.name }
173
181
  </FlexItem>
174
182
 
@@ -180,18 +188,22 @@ function OperatorSelector( {
180
188
  const operator = newValue as Operator;
181
189
  const newFilters = currentFilter
182
190
  ? [
183
- ...view.filters.map( ( _filter ) => {
184
- if ( _filter.field === filter.field ) {
185
- return {
186
- ..._filter,
187
- operator,
188
- };
191
+ ...( view.filters ?? [] ).map(
192
+ ( _filter ) => {
193
+ if (
194
+ _filter.field === filter.field
195
+ ) {
196
+ return {
197
+ ..._filter,
198
+ operator,
199
+ };
200
+ }
201
+ return _filter;
189
202
  }
190
- return _filter;
191
- } ),
203
+ ),
192
204
  ]
193
205
  : [
194
- ...view.filters,
206
+ ...( view.filters ?? [] ),
195
207
  {
196
208
  field: filter.field,
197
209
  operator,
@@ -220,7 +232,9 @@ export default function FilterSummary( {
220
232
  }: FilterSummaryProps ) {
221
233
  const toggleRef = useRef< HTMLDivElement >( null );
222
234
  const { filter, view, onChangeView } = commonProps;
223
- const filterInView = view.filters.find( ( f ) => f.field === filter.field );
235
+ const filterInView = view.filters?.find(
236
+ ( f ) => f.field === filter.field
237
+ );
224
238
  const activeElements = filter.elements.filter( ( element ) => {
225
239
  if ( filter.singleSelection ) {
226
240
  return element.value === filterInView?.value;
@@ -233,13 +247,13 @@ export default function FilterSummary( {
233
247
  return (
234
248
  <Dropdown
235
249
  defaultOpen={ openedFilter === filter.field }
236
- contentClassName="dataviews-filter-summary__popover"
250
+ contentClassName="dataviews-filters__summary-popover"
237
251
  popoverProps={ { placement: 'bottom-start', role: 'dialog' } }
238
252
  onClose={ () => {
239
253
  toggleRef.current?.focus();
240
254
  } }
241
255
  renderToggle={ ( { isOpen, onToggle } ) => (
242
- <div className="dataviews-filter-summary__chip-container">
256
+ <div className="dataviews-filters__summary-chip-container">
243
257
  <Tooltip
244
258
  text={ sprintf(
245
259
  /* translators: 1: Filter name. */
@@ -250,7 +264,7 @@ export default function FilterSummary( {
250
264
  >
251
265
  <div
252
266
  className={ clsx(
253
- 'dataviews-filter-summary__chip',
267
+ 'dataviews-filters__summary-chip',
254
268
  {
255
269
  'has-reset': canResetOrRemove,
256
270
  'has-values': hasValues,
@@ -283,14 +297,14 @@ export default function FilterSummary( {
283
297
  >
284
298
  <button
285
299
  className={ clsx(
286
- 'dataviews-filter-summary__chip-remove',
300
+ 'dataviews-filters__summary-chip-remove',
287
301
  { 'has-values': hasValues }
288
302
  ) }
289
303
  onClick={ () => {
290
304
  onChangeView( {
291
305
  ...view,
292
306
  page: 1,
293
- filters: view.filters.filter(
307
+ filters: view.filters?.filter(
294
308
  ( _filter ) =>
295
309
  _filter.field !== filter.field
296
310
  ),
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { memo, useRef } from '@wordpress/element';
4
+ import { memo, useContext, useRef } from '@wordpress/element';
5
5
  import { __experimentalHStack as HStack } from '@wordpress/components';
6
6
 
7
7
  /**
@@ -10,25 +10,14 @@ import { __experimentalHStack as HStack } from '@wordpress/components';
10
10
  import FilterSummary from './filter-summary';
11
11
  import AddFilter from './add-filter';
12
12
  import ResetFilters from './reset-filters';
13
- import { sanitizeOperators } from './utils';
14
- import { ALL_OPERATORS, OPERATOR_IS, OPERATOR_IS_NOT } from './constants';
15
- import type { AnyItem, NormalizedField, NormalizedFilter, View } from './types';
13
+ import DataViewsContext from '../dataviews-context';
14
+ import { sanitizeOperators } from '../../utils';
15
+ import { ALL_OPERATORS, OPERATOR_IS, OPERATOR_IS_NOT } from '../../constants';
16
+ import type { NormalizedFilter } from '../../types';
16
17
 
17
- interface FiltersProps< Item extends AnyItem > {
18
- fields: NormalizedField< Item >[];
19
- view: View;
20
- onChangeView: ( view: View ) => void;
21
- openedFilter: string | null;
22
- setOpenedFilter: ( openedFilter: string | null ) => void;
23
- }
24
-
25
- function _Filters< Item extends AnyItem >( {
26
- fields,
27
- view,
28
- onChangeView,
29
- openedFilter,
30
- setOpenedFilter,
31
- }: FiltersProps< Item > ) {
18
+ function Filters() {
19
+ const { fields, view, onChangeView, openedFilter, setOpenedFilter } =
20
+ useContext( DataViewsContext );
32
21
  const addFilterRef = useRef< HTMLButtonElement >( null );
33
22
  const filters: NormalizedFilter[] = [];
34
23
  fields.forEach( ( field ) => {
@@ -44,7 +33,7 @@ function _Filters< Item extends AnyItem >( {
44
33
  const isPrimary = !! field.filterBy?.isPrimary;
45
34
  filters.push( {
46
35
  field: field.id,
47
- name: field.header,
36
+ name: field.label,
48
37
  elements: field.elements,
49
38
  singleSelection: operators.some( ( op ) =>
50
39
  [ OPERATOR_IS, OPERATOR_IS_NOT ].includes( op )
@@ -52,7 +41,7 @@ function _Filters< Item extends AnyItem >( {
52
41
  operators,
53
42
  isVisible:
54
43
  isPrimary ||
55
- view.filters.some(
44
+ !! view.filters?.some(
56
45
  ( f ) =>
57
46
  f.field === field.id &&
58
47
  ALL_OPERATORS.includes( f.operator )
@@ -119,7 +108,4 @@ function _Filters< Item extends AnyItem >( {
119
108
  );
120
109
  }
121
110
 
122
- // A type assertion is used here to keep the type argument.
123
- const Filters = memo( _Filters ) as typeof _Filters;
124
-
125
- export default Filters;
111
+ export default memo( Filters );
@@ -7,7 +7,7 @@ import { __ } from '@wordpress/i18n';
7
7
  /**
8
8
  * Internal dependencies
9
9
  */
10
- import type { NormalizedFilter, View } from './types';
10
+ import type { NormalizedFilter, View } from '../../types';
11
11
 
12
12
  interface ResetFilterProps {
13
13
  filters: NormalizedFilter[];
@@ -33,7 +33,7 @@ export default function ResetFilter( {
33
33
  return (
34
34
  <Button
35
35
  disabled={ isDisabled }
36
- __experimentalIsFocusable
36
+ accessibleWhenDisabled
37
37
  size="compact"
38
38
  variant="tertiary"
39
39
  className="dataviews-filters__reset-button"
@@ -21,8 +21,8 @@ import { SVG, Circle } from '@wordpress/primitives';
21
21
  /**
22
22
  * Internal dependencies
23
23
  */
24
- import { unlock } from './lock-unlock';
25
- import type { Filter, NormalizedFilter, View } from './types';
24
+ import { unlock } from '../../lock-unlock';
25
+ import type { Filter, NormalizedFilter, View } from '../../types';
26
26
 
27
27
  const {
28
28
  CompositeV2: Composite,
@@ -93,7 +93,7 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
93
93
  // so the first item is not selected, since the focus is on the operators control.
94
94
  defaultActiveId: filter.operators?.length === 1 ? undefined : null,
95
95
  } );
96
- const currentFilter = view.filters.find(
96
+ const currentFilter = view.filters?.find(
97
97
  ( f ) => f.field === filter.field
98
98
  );
99
99
  const currentValue = getCurrentValue( filter, currentFilter );
@@ -101,7 +101,7 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
101
101
  <Composite
102
102
  store={ compositeStore }
103
103
  role="listbox"
104
- className="dataviews-search-widget-listbox"
104
+ className="dataviews-filters__search-widget-listbox"
105
105
  aria-label={ sprintf(
106
106
  /* translators: List of items for a filter. 1: Filter name. e.g.: "List of: Author". */
107
107
  __( 'List of: %1$s' ),
@@ -124,13 +124,13 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
124
124
  <div
125
125
  aria-label={ element.label }
126
126
  role="option"
127
- className="dataviews-search-widget-listitem"
127
+ className="dataviews-filters__search-widget-listitem"
128
128
  />
129
129
  }
130
130
  onClick={ () => {
131
131
  const newFilters = currentFilter
132
132
  ? [
133
- ...view.filters.map(
133
+ ...( view.filters ?? [] ).map(
134
134
  ( _filter ) => {
135
135
  if (
136
136
  _filter.field ===
@@ -154,7 +154,7 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
154
154
  ),
155
155
  ]
156
156
  : [
157
- ...view.filters,
157
+ ...( view.filters ?? [] ),
158
158
  {
159
159
  field: filter.field,
160
160
  operator: filter.operators[ 0 ],
@@ -174,7 +174,7 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
174
174
  />
175
175
  }
176
176
  >
177
- <span className="dataviews-search-widget-listitem-check">
177
+ <span className="dataviews-filters__search-widget-listitem-check">
178
178
  { filter.singleSelection &&
179
179
  currentValue === element.value && (
180
180
  <Icon icon={ radioCheck } />
@@ -187,7 +187,7 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
187
187
  <span>
188
188
  { element.label }
189
189
  { !! element.description && (
190
- <span className="dataviews-search-widget-listitem-description">
190
+ <span className="dataviews-filters__search-widget-listitem-description">
191
191
  { element.description }
192
192
  </span>
193
193
  ) }
@@ -201,7 +201,7 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
201
201
  function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
202
202
  const [ searchValue, setSearchValue ] = useState( '' );
203
203
  const deferredSearchValue = useDeferredValue( searchValue );
204
- const currentFilter = view.filters.find(
204
+ const currentFilter = view.filters?.find(
205
205
  ( _filter ) => _filter.field === filter.field
206
206
  );
207
207
  const currentValue = getCurrentValue( filter, currentFilter );
@@ -218,7 +218,7 @@ function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
218
218
  setSelectedValue={ ( value ) => {
219
219
  const newFilters = currentFilter
220
220
  ? [
221
- ...view.filters.map( ( _filter ) => {
221
+ ...( view.filters ?? [] ).map( ( _filter ) => {
222
222
  if ( _filter.field === filter.field ) {
223
223
  return {
224
224
  ..._filter,
@@ -232,7 +232,7 @@ function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
232
232
  } ),
233
233
  ]
234
234
  : [
235
- ...view.filters,
235
+ ...( view.filters ?? [] ),
236
236
  {
237
237
  field: filter.field,
238
238
  operator: filter.operators[ 0 ],
@@ -247,7 +247,7 @@ function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
247
247
  } }
248
248
  setValue={ setSearchValue }
249
249
  >
250
- <div className="dataviews-search-widget-filter-combobox__wrapper">
250
+ <div className="dataviews-filters__search-widget-filter-combobox__wrapper">
251
251
  <Ariakit.ComboboxLabel
252
252
  render={
253
253
  <VisuallyHidden>
@@ -260,14 +260,14 @@ function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
260
260
  <Ariakit.Combobox
261
261
  autoSelect="always"
262
262
  placeholder={ __( 'Search' ) }
263
- className="dataviews-search-widget-filter-combobox__input"
263
+ className="dataviews-filters__search-widget-filter-combobox__input"
264
264
  />
265
- <div className="dataviews-search-widget-filter-combobox__icon">
265
+ <div className="dataviews-filters__search-widget-filter-combobox__icon">
266
266
  <Icon icon={ search } />
267
267
  </div>
268
268
  </div>
269
269
  <Ariakit.ComboboxList
270
- className="dataviews-search-widget-filter-combobox-list"
270
+ className="dataviews-filters__search-widget-filter-combobox-list"
271
271
  alwaysVisible
272
272
  >
273
273
  { matches.map( ( element ) => {
@@ -275,12 +275,12 @@ function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
275
275
  <Ariakit.ComboboxItem
276
276
  key={ element.value }
277
277
  value={ element.value }
278
- className="dataviews-search-widget-listitem"
278
+ className="dataviews-filters__search-widget-listitem"
279
279
  hideOnClick={ false }
280
280
  setValueOnClick={ false }
281
281
  focusOnHover
282
282
  >
283
- <span className="dataviews-search-widget-listitem-check">
283
+ <span className="dataviews-filters__search-widget-listitem-check">
284
284
  { filter.singleSelection &&
285
285
  currentValue === element.value && (
286
286
  <Icon icon={ radioCheck } />
@@ -292,11 +292,11 @@ function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
292
292
  </span>
293
293
  <span>
294
294
  <Ariakit.ComboboxItemValue
295
- className="dataviews-search-widget-filter-combobox-item-value"
295
+ className="dataviews-filters__search-widget-filter-combobox-item-value"
296
296
  value={ element.label }
297
297
  />
298
298
  { !! element.description && (
299
- <span className="dataviews-search-widget-listitem-description">
299
+ <span className="dataviews-filters__search-widget-listitem-description">
300
300
  { element.description }
301
301
  </span>
302
302
  ) }