@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,189 @@
1
+ .dataviews-view-list {
2
+ margin: 0 0 auto;
3
+
4
+ li {
5
+ margin: 0;
6
+ cursor: pointer;
7
+ border-top: 1px solid $gray-100;
8
+
9
+ .dataviews-view-list__item-wrapper {
10
+ position: relative;
11
+ border-radius: $grid-unit-05;
12
+
13
+ > * {
14
+ width: 100%;
15
+ }
16
+ }
17
+
18
+ .dataviews-view-list__item-actions {
19
+ position: absolute;
20
+ top: $grid-unit-20;
21
+ right: 0;
22
+
23
+
24
+ > div {
25
+ height: $button-size-small;
26
+ }
27
+
28
+ .components-button {
29
+ opacity: 0;
30
+ }
31
+ }
32
+
33
+ &:has(.dataviews-view-list__fields:empty) {
34
+ .dataviews-view-list__item-actions {
35
+ top: 50%;
36
+ transform: translateY(-50%);
37
+ }
38
+ }
39
+
40
+ &.is-selected,
41
+ &.is-hovered,
42
+ &:focus-within {
43
+ .dataviews-view-list__item-actions {
44
+ background: #f8f8f8;
45
+ padding-left: $grid-unit-10;
46
+ margin-right: $grid-unit-30;
47
+ box-shadow: -12px 0 8px 0 #f8f8f8;
48
+
49
+ .components-button {
50
+ opacity: 1;
51
+ position: static;
52
+ }
53
+ }
54
+ }
55
+
56
+ &.is-selected {
57
+ .dataviews-view-list__item-actions {
58
+ background-color: rgb(247 248 255);
59
+ box-shadow: -12px 0 8px 0 rgb(247 248 255);
60
+ }
61
+ }
62
+
63
+ &.is-selected.is-selected {
64
+ border-top: 1px solid rgba(var(--wp-admin-theme-color--rgb), 0.12);
65
+
66
+ & + li {
67
+ border-top: 1px solid rgba(var(--wp-admin-theme-color--rgb), 0.12);
68
+ }
69
+ }
70
+
71
+ &:not(.is-selected) {
72
+ .dataviews-view-list__primary-field {
73
+ color: $gray-900;
74
+ }
75
+ &:hover,
76
+ &:focus-within {
77
+ color: var(--wp-admin-theme-color);
78
+ background-color: #f8f8f8;
79
+
80
+ .dataviews-view-list__primary-field,
81
+ .dataviews-view-list__fields {
82
+ color: var(--wp-admin-theme-color);
83
+ }
84
+ }
85
+ }
86
+
87
+ }
88
+
89
+ li.is-selected,
90
+ li.is-selected:focus-within {
91
+ .dataviews-view-list__item-wrapper {
92
+ background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
93
+ color: $gray-900;
94
+
95
+ .dataviews-view-list__primary-field,
96
+ .dataviews-view-list__fields {
97
+ color: var(--wp-admin-theme-color);
98
+ }
99
+ }
100
+ }
101
+
102
+ .dataviews-view-list__item {
103
+ padding: $grid-unit-20 $grid-unit-30;
104
+ width: 100%;
105
+ scroll-margin: $grid-unit-10 0;
106
+
107
+ &:focus-visible {
108
+ &::before {
109
+ position: absolute;
110
+ content: "";
111
+ top: calc(var(--wp-admin-border-width-focus) + 1px);
112
+ right: var(--wp-admin-border-width-focus);
113
+ bottom: var(--wp-admin-border-width-focus);
114
+ left: var(--wp-admin-border-width-focus);
115
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
116
+ border-radius: $radius-block-ui;
117
+ }
118
+ }
119
+ .dataviews-view-list__primary-field {
120
+ min-height: $grid-unit-30;
121
+ line-height: $grid-unit-30;
122
+ overflow: hidden;
123
+ }
124
+ }
125
+
126
+ .dataviews-view-list__media-wrapper {
127
+ width: $grid-unit-05 * 13;
128
+ height: $grid-unit-05 * 13;
129
+ overflow: hidden;
130
+ position: relative;
131
+ flex-shrink: 0;
132
+ background-color: $gray-100;
133
+ border-radius: $grid-unit-05;
134
+
135
+ img {
136
+ width: 100%;
137
+ height: 100%;
138
+ object-fit: cover;
139
+ }
140
+
141
+ &::after {
142
+ content: "";
143
+ position: absolute;
144
+ top: 0;
145
+ left: 0;
146
+ width: 100%;
147
+ height: 100%;
148
+ box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.1);
149
+ border-radius: $grid-unit-05;
150
+ }
151
+ }
152
+
153
+ .dataviews-view-list__media-placeholder {
154
+ min-width: $grid-unit-40;
155
+ height: $grid-unit-40;
156
+ background-color: $gray-200;
157
+ }
158
+
159
+ .dataviews-view-list__field-wrapper {
160
+ min-height: $grid-unit-05 * 13; // Ensures title is centrally aligned when all fields are hidden
161
+ }
162
+
163
+ .dataviews-view-list__fields {
164
+ color: $gray-700;
165
+ display: flex;
166
+ gap: $grid-unit-15;
167
+ row-gap: $grid-unit-05;
168
+ flex-wrap: wrap;
169
+ font-size: 12px;
170
+
171
+ &:empty {
172
+ display: none;
173
+ }
174
+
175
+ .dataviews-view-list__field {
176
+ &:has(.dataviews-view-list__field-value:empty) {
177
+ display: none;
178
+ }
179
+ }
180
+
181
+ .dataviews-view-list__field-value {
182
+ line-height: $grid-unit-05 * 6;
183
+ }
184
+ }
185
+
186
+ & + .dataviews-pagination {
187
+ justify-content: space-between;
188
+ }
189
+ }
@@ -0,0 +1,268 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { ReactNode, Ref, PropsWithoutRef, RefAttributes } from 'react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { __ } from '@wordpress/i18n';
10
+ import { arrowLeft, arrowRight, unseen, funnel } from '@wordpress/icons';
11
+ import {
12
+ Button,
13
+ Icon,
14
+ privateApis as componentsPrivateApis,
15
+ } from '@wordpress/components';
16
+ import { forwardRef, Children, Fragment } from '@wordpress/element';
17
+
18
+ /**
19
+ * Internal dependencies
20
+ */
21
+ import { unlock } from '../../lock-unlock';
22
+ import { sanitizeOperators } from '../../utils';
23
+ import { SORTING_DIRECTIONS, sortArrows, sortLabels } from '../../constants';
24
+ import type {
25
+ NormalizedField,
26
+ SortDirection,
27
+ ViewTable as ViewTableType,
28
+ } from '../../types';
29
+
30
+ const {
31
+ DropdownMenuV2: DropdownMenu,
32
+ DropdownMenuGroupV2: DropdownMenuGroup,
33
+ DropdownMenuItemV2: DropdownMenuItem,
34
+ DropdownMenuRadioItemV2: DropdownMenuRadioItem,
35
+ DropdownMenuItemLabelV2: DropdownMenuItemLabel,
36
+ DropdownMenuSeparatorV2: DropdownMenuSeparator,
37
+ } = unlock( componentsPrivateApis );
38
+
39
+ interface HeaderMenuProps< Item > {
40
+ fieldId: string;
41
+ view: ViewTableType;
42
+ fields: NormalizedField< Item >[];
43
+ onChangeView: ( view: ViewTableType ) => void;
44
+ onHide: ( field: NormalizedField< Item > ) => void;
45
+ setOpenedFilter: ( fieldId: string ) => void;
46
+ }
47
+
48
+ function WithDropDownMenuSeparators( { children }: { children: ReactNode } ) {
49
+ return Children.toArray( children )
50
+ .filter( Boolean )
51
+ .map( ( child, i ) => (
52
+ <Fragment key={ i }>
53
+ { i > 0 && <DropdownMenuSeparator /> }
54
+ { child }
55
+ </Fragment>
56
+ ) );
57
+ }
58
+
59
+ const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
60
+ {
61
+ fieldId,
62
+ view,
63
+ fields,
64
+ onChangeView,
65
+ onHide,
66
+ setOpenedFilter,
67
+ }: HeaderMenuProps< Item >,
68
+ ref: Ref< HTMLButtonElement >
69
+ ) {
70
+ const combinedField = view.layout?.combinedFields?.find(
71
+ ( f ) => f.id === fieldId
72
+ );
73
+ const index = view.fields?.indexOf( fieldId ) as number;
74
+ if ( !! combinedField ) {
75
+ return combinedField.label;
76
+ }
77
+ const field = fields.find( ( f ) => f.id === fieldId );
78
+ if ( ! field ) {
79
+ return null;
80
+ }
81
+ const isHidable = field.enableHiding !== false;
82
+ const isSortable = field.enableSorting !== false;
83
+ const isSorted = view.sort?.field === field.id;
84
+ const operators = sanitizeOperators( field );
85
+ // Filter can be added:
86
+ // 1. If the field is not already part of a view's filters.
87
+ // 2. If the field meets the type and operator requirements.
88
+ // 3. If it's not primary. If it is, it should be already visible.
89
+ const canAddFilter =
90
+ ! view.filters?.some( ( _filter ) => field.id === _filter.field ) &&
91
+ !! field.elements?.length &&
92
+ !! operators.length &&
93
+ ! field.filterBy?.isPrimary;
94
+ if ( ! isSortable && ! isHidable && ! canAddFilter ) {
95
+ return field.label;
96
+ }
97
+ return (
98
+ <DropdownMenu
99
+ align="start"
100
+ trigger={
101
+ <Button
102
+ size="compact"
103
+ className="dataviews-view-table-header-button"
104
+ ref={ ref }
105
+ variant="tertiary"
106
+ >
107
+ { field.label }
108
+ { view.sort && isSorted && (
109
+ <span aria-hidden="true">
110
+ { sortArrows[ view.sort.direction ] }
111
+ </span>
112
+ ) }
113
+ </Button>
114
+ }
115
+ style={ { minWidth: '240px' } }
116
+ >
117
+ <WithDropDownMenuSeparators>
118
+ { isSortable && (
119
+ <DropdownMenuGroup>
120
+ { SORTING_DIRECTIONS.map(
121
+ ( direction: SortDirection ) => {
122
+ const isChecked =
123
+ view.sort &&
124
+ isSorted &&
125
+ view.sort.direction === direction;
126
+
127
+ const value = `${ field.id }-${ direction }`;
128
+
129
+ return (
130
+ <DropdownMenuRadioItem
131
+ key={ value }
132
+ // All sorting radio items share the same name, so that
133
+ // selecting a sorting option automatically deselects the
134
+ // previously selected one, even if it is displayed in
135
+ // another submenu. The field and direction are passed via
136
+ // the `value` prop.
137
+ name="view-table-sorting"
138
+ value={ value }
139
+ checked={ isChecked }
140
+ onChange={ () => {
141
+ onChangeView( {
142
+ ...view,
143
+ sort: {
144
+ field: field.id,
145
+ direction,
146
+ },
147
+ } );
148
+ } }
149
+ >
150
+ <DropdownMenuItemLabel>
151
+ { sortLabels[ direction ] }
152
+ </DropdownMenuItemLabel>
153
+ </DropdownMenuRadioItem>
154
+ );
155
+ }
156
+ ) }
157
+ </DropdownMenuGroup>
158
+ ) }
159
+ { canAddFilter && (
160
+ <DropdownMenuGroup>
161
+ <DropdownMenuItem
162
+ prefix={ <Icon icon={ funnel } /> }
163
+ onClick={ () => {
164
+ setOpenedFilter( field.id );
165
+ onChangeView( {
166
+ ...view,
167
+ page: 1,
168
+ filters: [
169
+ ...( view.filters || [] ),
170
+ {
171
+ field: field.id,
172
+ value: undefined,
173
+ operator: operators[ 0 ],
174
+ },
175
+ ],
176
+ } );
177
+ } }
178
+ >
179
+ <DropdownMenuItemLabel>
180
+ { __( 'Add filter' ) }
181
+ </DropdownMenuItemLabel>
182
+ </DropdownMenuItem>
183
+ </DropdownMenuGroup>
184
+ ) }
185
+ <DropdownMenuGroup>
186
+ <DropdownMenuItem
187
+ prefix={ <Icon icon={ arrowLeft } /> }
188
+ disabled={ index < 1 }
189
+ onClick={ () => {
190
+ if ( ! view.fields || index < 1 ) {
191
+ return;
192
+ }
193
+ onChangeView( {
194
+ ...view,
195
+ fields: [
196
+ ...( view.fields.slice( 0, index - 1 ) ??
197
+ [] ),
198
+ field.id,
199
+ view.fields[ index - 1 ],
200
+ ...view.fields.slice( index + 1 ),
201
+ ],
202
+ } );
203
+ } }
204
+ >
205
+ <DropdownMenuItemLabel>
206
+ { __( 'Move left' ) }
207
+ </DropdownMenuItemLabel>
208
+ </DropdownMenuItem>
209
+ <DropdownMenuItem
210
+ prefix={ <Icon icon={ arrowRight } /> }
211
+ disabled={
212
+ ! view.fields || index >= view.fields.length - 1
213
+ }
214
+ onClick={ () => {
215
+ if (
216
+ ! view.fields ||
217
+ index >= view.fields.length - 1
218
+ ) {
219
+ return;
220
+ }
221
+ onChangeView( {
222
+ ...view,
223
+ fields: [
224
+ ...( view.fields.slice( 0, index ) ?? [] ),
225
+ view.fields[ index + 1 ],
226
+ field.id,
227
+ ...view.fields.slice( index + 2 ),
228
+ ],
229
+ } );
230
+ } }
231
+ >
232
+ <DropdownMenuItemLabel>
233
+ { __( 'Move right' ) }
234
+ </DropdownMenuItemLabel>
235
+ </DropdownMenuItem>
236
+ { isHidable && (
237
+ <DropdownMenuItem
238
+ prefix={ <Icon icon={ unseen } /> }
239
+ onClick={ () => {
240
+ const viewFields =
241
+ view.fields || fields.map( ( f ) => f.id );
242
+ onHide( field );
243
+ onChangeView( {
244
+ ...view,
245
+ fields: viewFields.filter(
246
+ ( id ) => id !== field.id
247
+ ),
248
+ } );
249
+ } }
250
+ >
251
+ <DropdownMenuItemLabel>
252
+ { __( 'Hide' ) }
253
+ </DropdownMenuItemLabel>
254
+ </DropdownMenuItem>
255
+ ) }
256
+ </DropdownMenuGroup>
257
+ </WithDropDownMenuSeparators>
258
+ </DropdownMenu>
259
+ );
260
+ } );
261
+
262
+ // @ts-expect-error Lift the `Item` type argument through the forwardRef.
263
+ const ColumnHeaderMenu: < Item >(
264
+ props: PropsWithoutRef< HeaderMenuProps< Item > > &
265
+ RefAttributes< HTMLButtonElement >
266
+ ) => ReturnType< typeof _HeaderMenu > = _HeaderMenu;
267
+
268
+ export default ColumnHeaderMenu;