@wordpress/dataviews 4.22.0 → 5.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 (343) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +147 -32
  3. package/build/components/dataviews/index.js +71 -37
  4. package/build/components/dataviews/index.js.map +1 -1
  5. package/build/components/dataviews-context/index.js +15 -1
  6. package/build/components/dataviews-context/index.js.map +1 -1
  7. package/build/components/dataviews-filters/{filter-summary.js → filter.js} +108 -17
  8. package/build/components/dataviews-filters/filter.js.map +1 -0
  9. package/build/components/dataviews-filters/index.js +21 -20
  10. package/build/components/dataviews-filters/index.js.map +1 -1
  11. package/build/components/dataviews-filters/input-widget.js +76 -0
  12. package/build/components/dataviews-filters/input-widget.js.map +1 -0
  13. package/build/components/dataviews-filters/search-widget.js +33 -39
  14. package/build/components/dataviews-filters/search-widget.js.map +1 -1
  15. package/build/components/dataviews-filters/utils.js +25 -0
  16. package/build/components/dataviews-filters/utils.js.map +1 -0
  17. package/build/components/dataviews-item-actions/index.js +1 -1
  18. package/build/components/dataviews-item-actions/index.js.map +1 -1
  19. package/build/components/dataviews-layout/index.js +7 -2
  20. package/build/components/dataviews-layout/index.js.map +1 -1
  21. package/build/components/dataviews-pagination/index.js +4 -3
  22. package/build/components/dataviews-pagination/index.js.map +1 -1
  23. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  24. package/build/components/dataviews-view-config/index.js +10 -19
  25. package/build/components/dataviews-view-config/index.js.map +1 -1
  26. package/build/constants.js +83 -2
  27. package/build/constants.js.map +1 -1
  28. package/build/dataform-controls/boolean.js +42 -0
  29. package/build/dataform-controls/boolean.js.map +1 -0
  30. package/build/dataform-controls/checkbox.js +44 -0
  31. package/build/dataform-controls/checkbox.js.map +1 -0
  32. package/build/dataform-controls/datetime.js +96 -2
  33. package/build/dataform-controls/datetime.js.map +1 -1
  34. package/build/dataform-controls/email.js +48 -0
  35. package/build/dataform-controls/email.js.map +1 -0
  36. package/build/dataform-controls/index.js +9 -1
  37. package/build/dataform-controls/index.js.map +1 -1
  38. package/build/dataform-controls/integer.js +49 -1
  39. package/build/dataform-controls/integer.js.map +1 -1
  40. package/build/dataform-controls/select.js +1 -0
  41. package/build/dataform-controls/select.js.map +1 -1
  42. package/build/dataform-controls/text.js +3 -1
  43. package/build/dataform-controls/text.js.map +1 -1
  44. package/build/dataform-controls/toggle-group.js +52 -0
  45. package/build/dataform-controls/toggle-group.js.map +1 -0
  46. package/build/dataforms-layouts/data-form-layout.js +1 -1
  47. package/build/dataforms-layouts/data-form-layout.js.map +1 -1
  48. package/build/dataforms-layouts/panel/index.js +14 -5
  49. package/build/dataforms-layouts/panel/index.js.map +1 -1
  50. package/build/dataforms-layouts/regular/index.js +23 -4
  51. package/build/dataforms-layouts/regular/index.js.map +1 -1
  52. package/build/dataviews-layouts/grid/index.js +89 -27
  53. package/build/dataviews-layouts/grid/index.js.map +1 -1
  54. package/build/dataviews-layouts/list/index.js +11 -6
  55. package/build/dataviews-layouts/list/index.js.map +1 -1
  56. package/build/dataviews-layouts/table/column-header-menu.js +9 -7
  57. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
  58. package/build/dataviews-layouts/table/column-primary.js +18 -13
  59. package/build/dataviews-layouts/table/column-primary.js.map +1 -1
  60. package/build/dataviews-layouts/table/index.js +46 -14
  61. package/build/dataviews-layouts/table/index.js.map +1 -1
  62. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js +65 -0
  63. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -0
  64. package/build/dataviews-layouts/utils/item-click-wrapper.js +77 -0
  65. package/build/dataviews-layouts/utils/item-click-wrapper.js.map +1 -0
  66. package/build/field-types/array.js +62 -0
  67. package/build/field-types/array.js.map +1 -0
  68. package/build/field-types/boolean.js +71 -0
  69. package/build/field-types/boolean.js.map +1 -0
  70. package/build/field-types/date.js +57 -0
  71. package/build/field-types/date.js.map +1 -0
  72. package/build/field-types/datetime.js +19 -1
  73. package/build/field-types/datetime.js.map +1 -1
  74. package/build/field-types/email.js +60 -0
  75. package/build/field-types/email.js.map +1 -0
  76. package/build/field-types/index.js +42 -1
  77. package/build/field-types/index.js.map +1 -1
  78. package/build/field-types/integer.js +23 -1
  79. package/build/field-types/integer.js.map +1 -1
  80. package/build/field-types/media.js +31 -0
  81. package/build/field-types/media.js.map +1 -0
  82. package/build/field-types/text.js +23 -1
  83. package/build/field-types/text.js.map +1 -1
  84. package/build/filter-and-sort-data-view.js +174 -11
  85. package/build/filter-and-sort-data-view.js.map +1 -1
  86. package/build/normalize-fields.js +72 -11
  87. package/build/normalize-fields.js.map +1 -1
  88. package/build/types.js.map +1 -1
  89. package/build/utils.js +11 -19
  90. package/build/utils.js.map +1 -1
  91. package/build-module/components/dataviews/index.js +74 -40
  92. package/build-module/components/dataviews/index.js.map +1 -1
  93. package/build-module/components/dataviews-context/index.js +16 -2
  94. package/build-module/components/dataviews-context/index.js.map +1 -1
  95. package/build-module/components/dataviews-filters/filter.js +309 -0
  96. package/build-module/components/dataviews-filters/filter.js.map +1 -0
  97. package/build-module/components/dataviews-filters/index.js +22 -21
  98. package/build-module/components/dataviews-filters/index.js.map +1 -1
  99. package/build-module/components/dataviews-filters/input-widget.js +69 -0
  100. package/build-module/components/dataviews-filters/input-widget.js.map +1 -0
  101. package/build-module/components/dataviews-filters/search-widget.js +31 -37
  102. package/build-module/components/dataviews-filters/search-widget.js.map +1 -1
  103. package/build-module/components/dataviews-filters/utils.js +18 -0
  104. package/build-module/components/dataviews-filters/utils.js.map +1 -0
  105. package/build-module/components/dataviews-item-actions/index.js +1 -1
  106. package/build-module/components/dataviews-item-actions/index.js.map +1 -1
  107. package/build-module/components/dataviews-layout/index.js +7 -2
  108. package/build-module/components/dataviews-layout/index.js.map +1 -1
  109. package/build-module/components/dataviews-pagination/index.js +4 -4
  110. package/build-module/components/dataviews-pagination/index.js.map +1 -1
  111. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  112. package/build-module/components/dataviews-view-config/index.js +9 -20
  113. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  114. package/build-module/constants.js +82 -1
  115. package/build-module/constants.js.map +1 -1
  116. package/build-module/dataform-controls/boolean.js +35 -0
  117. package/build-module/dataform-controls/boolean.js.map +1 -0
  118. package/build-module/dataform-controls/checkbox.js +37 -0
  119. package/build-module/dataform-controls/checkbox.js.map +1 -0
  120. package/build-module/dataform-controls/datetime.js +98 -3
  121. package/build-module/dataform-controls/datetime.js.map +1 -1
  122. package/build-module/dataform-controls/email.js +41 -0
  123. package/build-module/dataform-controls/email.js.map +1 -0
  124. package/build-module/dataform-controls/index.js +9 -1
  125. package/build-module/dataform-controls/index.js.map +1 -1
  126. package/build-module/dataform-controls/integer.js +51 -3
  127. package/build-module/dataform-controls/integer.js.map +1 -1
  128. package/build-module/dataform-controls/select.js +1 -0
  129. package/build-module/dataform-controls/select.js.map +1 -1
  130. package/build-module/dataform-controls/text.js +3 -1
  131. package/build-module/dataform-controls/text.js.map +1 -1
  132. package/build-module/dataform-controls/toggle-group.js +45 -0
  133. package/build-module/dataform-controls/toggle-group.js.map +1 -0
  134. package/build-module/dataforms-layouts/data-form-layout.js +1 -1
  135. package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
  136. package/build-module/dataforms-layouts/panel/index.js +14 -5
  137. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  138. package/build-module/dataforms-layouts/regular/index.js +23 -4
  139. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  140. package/build-module/dataviews-layouts/grid/index.js +90 -29
  141. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  142. package/build-module/dataviews-layouts/list/index.js +11 -6
  143. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  144. package/build-module/dataviews-layouts/table/column-header-menu.js +9 -7
  145. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  146. package/build-module/dataviews-layouts/table/column-primary.js +18 -12
  147. package/build-module/dataviews-layouts/table/column-primary.js.map +1 -1
  148. package/build-module/dataviews-layouts/table/index.js +47 -16
  149. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  150. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js +58 -0
  151. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -0
  152. package/build-module/dataviews-layouts/utils/item-click-wrapper.js +71 -0
  153. package/build-module/dataviews-layouts/utils/item-click-wrapper.js.map +1 -0
  154. package/build-module/field-types/array.js +57 -0
  155. package/build-module/field-types/array.js.map +1 -0
  156. package/build-module/field-types/boolean.js +65 -0
  157. package/build-module/field-types/boolean.js.map +1 -0
  158. package/build-module/field-types/date.js +51 -0
  159. package/build-module/field-types/date.js.map +1 -0
  160. package/build-module/field-types/datetime.js +19 -1
  161. package/build-module/field-types/datetime.js.map +1 -1
  162. package/build-module/field-types/email.js +54 -0
  163. package/build-module/field-types/email.js.map +1 -0
  164. package/build-module/field-types/index.js +42 -1
  165. package/build-module/field-types/index.js.map +1 -1
  166. package/build-module/field-types/integer.js +23 -1
  167. package/build-module/field-types/integer.js.map +1 -1
  168. package/build-module/field-types/media.js +25 -0
  169. package/build-module/field-types/media.js.map +1 -0
  170. package/build-module/field-types/text.js +23 -1
  171. package/build-module/field-types/text.js.map +1 -1
  172. package/build-module/filter-and-sort-data-view.js +175 -12
  173. package/build-module/filter-and-sort-data-view.js.map +1 -1
  174. package/build-module/normalize-fields.js +72 -11
  175. package/build-module/normalize-fields.js.map +1 -1
  176. package/build-module/types.js.map +1 -1
  177. package/build-module/utils.js +10 -17
  178. package/build-module/utils.js.map +1 -1
  179. package/build-style/style-rtl.css +315 -13
  180. package/build-style/style.css +315 -13
  181. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  182. package/build-types/components/dataviews/index.d.ts +24 -3
  183. package/build-types/components/dataviews/index.d.ts.map +1 -1
  184. package/build-types/components/dataviews/stories/fixtures.d.ts +10 -1
  185. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  186. package/build-types/components/dataviews/stories/index.story.d.ts +23 -4
  187. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  188. package/build-types/components/dataviews-context/index.d.ts +14 -1
  189. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  190. package/build-types/components/dataviews-filters/filter.d.ts +15 -0
  191. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -0
  192. package/build-types/components/dataviews-filters/index.d.ts +3 -8
  193. package/build-types/components/dataviews-filters/index.d.ts.map +1 -1
  194. package/build-types/components/dataviews-filters/input-widget.d.ts +13 -0
  195. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -0
  196. package/build-types/components/dataviews-filters/search-widget.d.ts +4 -5
  197. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -1
  198. package/build-types/components/dataviews-filters/utils.d.ts +6 -0
  199. package/build-types/components/dataviews-filters/utils.d.ts.map +1 -0
  200. package/build-types/components/dataviews-layout/index.d.ts +5 -1
  201. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  202. package/build-types/components/dataviews-pagination/index.d.ts +1 -1
  203. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -1
  204. package/build-types/components/dataviews-selection-checkbox/index.d.ts +2 -2
  205. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  206. package/build-types/components/dataviews-view-config/index.d.ts +3 -4
  207. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  208. package/build-types/components/stories/index.story.d.ts +63 -0
  209. package/build-types/components/stories/index.story.d.ts.map +1 -0
  210. package/build-types/constants.d.ts +20 -3
  211. package/build-types/constants.d.ts.map +1 -1
  212. package/build-types/dataform-controls/boolean.d.ts +6 -0
  213. package/build-types/dataform-controls/boolean.d.ts.map +1 -0
  214. package/build-types/dataform-controls/checkbox.d.ts +6 -0
  215. package/build-types/dataform-controls/checkbox.d.ts.map +1 -0
  216. package/build-types/dataform-controls/datetime.d.ts +1 -1
  217. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  218. package/build-types/dataform-controls/email.d.ts +6 -0
  219. package/build-types/dataform-controls/email.d.ts.map +1 -0
  220. package/build-types/dataform-controls/index.d.ts +1 -1
  221. package/build-types/dataform-controls/index.d.ts.map +1 -1
  222. package/build-types/dataform-controls/integer.d.ts +1 -4
  223. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  224. package/build-types/dataform-controls/select.d.ts.map +1 -1
  225. package/build-types/dataform-controls/text.d.ts.map +1 -1
  226. package/build-types/dataform-controls/toggle-group.d.ts +6 -0
  227. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -0
  228. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  229. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  230. package/build-types/dataviews-layouts/grid/index.d.ts +2 -1
  231. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  232. package/build-types/dataviews-layouts/index.d.ts +3 -3
  233. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  234. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
  235. package/build-types/dataviews-layouts/table/column-primary.d.ts +8 -1
  236. package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -1
  237. package/build-types/dataviews-layouts/table/index.d.ts +1 -1
  238. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  239. package/build-types/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts +19 -0
  240. package/build-types/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts.map +1 -0
  241. package/build-types/dataviews-layouts/utils/item-click-wrapper.d.ts +15 -0
  242. package/build-types/dataviews-layouts/utils/item-click-wrapper.d.ts.map +1 -0
  243. package/build-types/field-types/array.d.ts +7 -0
  244. package/build-types/field-types/array.d.ts.map +1 -0
  245. package/build-types/field-types/boolean.d.ts +19 -0
  246. package/build-types/field-types/boolean.d.ts.map +1 -0
  247. package/build-types/field-types/date.d.ts +16 -0
  248. package/build-types/field-types/date.d.ts.map +1 -0
  249. package/build-types/field-types/datetime.d.ts +7 -1
  250. package/build-types/field-types/datetime.d.ts.map +1 -1
  251. package/build-types/field-types/email.d.ts +19 -0
  252. package/build-types/field-types/email.d.ts.map +1 -0
  253. package/build-types/field-types/index.d.ts +2 -10
  254. package/build-types/field-types/index.d.ts.map +1 -1
  255. package/build-types/field-types/integer.d.ts +7 -1
  256. package/build-types/field-types/integer.d.ts.map +1 -1
  257. package/build-types/field-types/media.d.ts +16 -0
  258. package/build-types/field-types/media.d.ts.map +1 -0
  259. package/build-types/field-types/text.d.ts +7 -1
  260. package/build-types/field-types/text.d.ts.map +1 -1
  261. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  262. package/build-types/normalize-fields.d.ts.map +1 -1
  263. package/build-types/types.d.ts +74 -8
  264. package/build-types/types.d.ts.map +1 -1
  265. package/build-types/utils.d.ts +5 -2
  266. package/build-types/utils.d.ts.map +1 -1
  267. package/build-wp/index.js +3299 -1182
  268. package/package.json +18 -12
  269. package/src/components/dataform/stories/index.story.tsx +41 -20
  270. package/src/components/dataviews/index.tsx +108 -43
  271. package/src/components/dataviews/stories/fixtures.tsx +135 -69
  272. package/src/components/dataviews/stories/index.story.tsx +265 -7
  273. package/src/components/dataviews/stories/style.css +24 -3
  274. package/src/components/dataviews/style.scss +27 -0
  275. package/src/components/dataviews-context/index.ts +30 -2
  276. package/src/components/dataviews-filters/filter.tsx +603 -0
  277. package/src/components/dataviews-filters/index.tsx +23 -29
  278. package/src/components/dataviews-filters/input-widget.tsx +91 -0
  279. package/src/components/dataviews-filters/search-widget.tsx +51 -48
  280. package/src/components/dataviews-filters/style.scss +117 -14
  281. package/src/components/dataviews-filters/utils.ts +25 -0
  282. package/src/components/dataviews-item-actions/index.tsx +1 -1
  283. package/src/components/dataviews-layout/index.tsx +8 -1
  284. package/src/components/dataviews-pagination/index.tsx +4 -4
  285. package/src/components/dataviews-selection-checkbox/index.tsx +2 -2
  286. package/src/components/dataviews-view-config/index.tsx +10 -18
  287. package/src/components/stories/index.story.tsx +372 -0
  288. package/src/constants.ts +116 -1
  289. package/src/dataform-controls/boolean.tsx +30 -0
  290. package/src/dataform-controls/checkbox.tsx +31 -0
  291. package/src/dataform-controls/datetime.tsx +106 -2
  292. package/src/dataform-controls/email.tsx +42 -0
  293. package/src/dataform-controls/index.tsx +8 -0
  294. package/src/dataform-controls/integer.tsx +75 -1
  295. package/src/dataform-controls/select.tsx +1 -0
  296. package/src/dataform-controls/style.scss +5 -0
  297. package/src/dataform-controls/text.tsx +2 -1
  298. package/src/dataform-controls/toggle-group.tsx +59 -0
  299. package/src/dataforms-layouts/data-form-layout.tsx +1 -1
  300. package/src/dataforms-layouts/panel/index.tsx +19 -7
  301. package/src/dataforms-layouts/panel/style.scss +8 -1
  302. package/src/dataforms-layouts/regular/index.tsx +50 -17
  303. package/src/dataforms-layouts/regular/style.scss +4 -1
  304. package/src/dataviews-layouts/grid/index.tsx +180 -68
  305. package/src/dataviews-layouts/grid/style.scss +8 -0
  306. package/src/dataviews-layouts/list/index.tsx +12 -5
  307. package/src/dataviews-layouts/table/column-header-menu.tsx +10 -8
  308. package/src/dataviews-layouts/table/column-primary.tsx +26 -13
  309. package/src/dataviews-layouts/table/index.tsx +74 -10
  310. package/src/dataviews-layouts/table/style.scss +37 -1
  311. package/src/dataviews-layouts/table/use-is-horizontal-scroll-end.ts +82 -0
  312. package/src/dataviews-layouts/utils/item-click-wrapper.tsx +93 -0
  313. package/src/field-types/array.tsx +75 -0
  314. package/src/field-types/boolean.tsx +66 -0
  315. package/src/field-types/date.ts +56 -0
  316. package/src/field-types/datetime.tsx +46 -2
  317. package/src/field-types/email.tsx +79 -0
  318. package/src/field-types/index.tsx +50 -3
  319. package/src/field-types/integer.tsx +53 -2
  320. package/src/field-types/media.tsx +28 -0
  321. package/src/field-types/text.tsx +41 -2
  322. package/src/filter-and-sort-data-view.ts +270 -10
  323. package/src/normalize-fields.ts +116 -13
  324. package/src/test/dataviews.tsx +20 -2
  325. package/src/test/filter-and-sort-data-view.js +601 -25
  326. package/src/test/normalize-fields.ts +155 -0
  327. package/src/types.ts +112 -9
  328. package/src/utils.ts +10 -33
  329. package/tsconfig.json +2 -0
  330. package/tsconfig.tsbuildinfo +1 -1
  331. package/build/components/dataviews-filters/filter-summary.js.map +0 -1
  332. package/build/dataviews-layouts/utils/get-clickable-item-props.js +0 -36
  333. package/build/dataviews-layouts/utils/get-clickable-item-props.js.map +0 -1
  334. package/build-module/components/dataviews-filters/filter-summary.js +0 -218
  335. package/build-module/components/dataviews-filters/filter-summary.js.map +0 -1
  336. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js +0 -30
  337. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js.map +0 -1
  338. package/build-types/components/dataviews-filters/filter-summary.d.ts +0 -14
  339. package/build-types/components/dataviews-filters/filter-summary.d.ts.map +0 -1
  340. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts +0 -19
  341. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts.map +0 -1
  342. package/src/components/dataviews-filters/filter-summary.tsx +0 -338
  343. package/src/dataviews-layouts/utils/get-clickable-item-props.ts +0 -39
@@ -2,6 +2,7 @@
2
2
  * External dependencies
3
3
  */
4
4
  import clsx from 'clsx';
5
+ import type { ComponentProps, ReactElement } from 'react';
5
6
 
6
7
  /**
7
8
  * WordPress dependencies
@@ -15,7 +16,7 @@ import {
15
16
  FlexItem,
16
17
  privateApis as componentsPrivateApis,
17
18
  } from '@wordpress/components';
18
- import { __ } from '@wordpress/i18n';
19
+ import { __, sprintf } from '@wordpress/i18n';
19
20
  import { useInstanceId } from '@wordpress/compose';
20
21
 
21
22
  /**
@@ -35,7 +36,7 @@ import type {
35
36
  ViewGridProps,
36
37
  } from '../../types';
37
38
  import type { SetSelection } from '../../private-types';
38
- import getClickableItemProps from '../utils/get-clickable-item-props';
39
+ import { ItemClickWrapper } from '../utils/item-click-wrapper';
39
40
  import { useUpdatedPreviewSizeOnViewportChange } from './preview-size-picker';
40
41
  const { Badge } = unlock( componentsPrivateApis );
41
42
 
@@ -45,6 +46,11 @@ interface GridItemProps< Item > {
45
46
  onChangeSelection: SetSelection;
46
47
  getItemId: ( item: Item ) => string;
47
48
  onClickItem?: ( item: Item ) => void;
49
+ renderItemLink?: (
50
+ props: {
51
+ item: Item;
52
+ } & ComponentProps< 'a' >
53
+ ) => ReactElement;
48
54
  isItemClickable: ( item: Item ) => boolean;
49
55
  item: Item;
50
56
  actions: Action< Item >[];
@@ -62,6 +68,7 @@ function GridItem< Item >( {
62
68
  onChangeSelection,
63
69
  onClickItem,
64
70
  isItemClickable,
71
+ renderItemLink,
65
72
  getItemId,
66
73
  item,
67
74
  actions,
@@ -78,27 +85,13 @@ function GridItem< Item >( {
78
85
  const instanceId = useInstanceId( GridItem );
79
86
  const isSelected = selection.includes( id );
80
87
  const renderedMediaField = mediaField?.render ? (
81
- <mediaField.render item={ item } />
88
+ <mediaField.render item={ item } field={ mediaField } />
82
89
  ) : null;
83
90
  const renderedTitleField =
84
91
  showTitle && titleField?.render ? (
85
- <titleField.render item={ item } />
92
+ <titleField.render item={ item } field={ titleField } />
86
93
  ) : null;
87
94
 
88
- const clickableMediaItemProps = getClickableItemProps( {
89
- item,
90
- isItemClickable,
91
- onClickItem,
92
- className: 'dataviews-view-grid__media',
93
- } );
94
-
95
- const clickableTitleItemProps = getClickableItemProps( {
96
- item,
97
- isItemClickable,
98
- onClickItem,
99
- className: 'dataviews-view-grid__title-field dataviews-title-field',
100
- } );
101
-
102
95
  let mediaA11yProps;
103
96
  let titleA11yProps;
104
97
  if ( isItemClickable( item ) && onClickItem ) {
@@ -139,9 +132,16 @@ function GridItem< Item >( {
139
132
  } }
140
133
  >
141
134
  { showMedia && renderedMediaField && (
142
- <div { ...clickableMediaItemProps } { ...mediaA11yProps }>
135
+ <ItemClickWrapper
136
+ item={ item }
137
+ isItemClickable={ isItemClickable }
138
+ onClickItem={ onClickItem }
139
+ renderItemLink={ renderItemLink }
140
+ className="dataviews-view-grid__media"
141
+ { ...mediaA11yProps }
142
+ >
143
143
  { renderedMediaField }
144
- </div>
144
+ </ItemClickWrapper>
145
145
  ) }
146
146
  { hasBulkActions && showMedia && renderedMediaField && (
147
147
  <DataViewsSelectionCheckbox
@@ -157,16 +157,26 @@ function GridItem< Item >( {
157
157
  justify="space-between"
158
158
  className="dataviews-view-grid__title-actions"
159
159
  >
160
- <div { ...clickableTitleItemProps } { ...titleA11yProps }>
160
+ <ItemClickWrapper
161
+ item={ item }
162
+ isItemClickable={ isItemClickable }
163
+ onClickItem={ onClickItem }
164
+ renderItemLink={ renderItemLink }
165
+ className="dataviews-view-grid__title-field dataviews-title-field"
166
+ { ...titleA11yProps }
167
+ >
161
168
  { renderedTitleField }
162
- </div>
169
+ </ItemClickWrapper>
163
170
  { !! actions?.length && (
164
171
  <ItemActions item={ item } actions={ actions } isCompact />
165
172
  ) }
166
173
  </HStack>
167
174
  <VStack spacing={ 1 }>
168
175
  { showDescription && descriptionField?.render && (
169
- <descriptionField.render item={ item } />
176
+ <descriptionField.render
177
+ item={ item }
178
+ field={ descriptionField }
179
+ />
170
180
  ) }
171
181
  { !! badgeFields?.length && (
172
182
  <HStack
@@ -182,7 +192,10 @@ function GridItem< Item >( {
182
192
  key={ field.id }
183
193
  className="dataviews-view-grid__field-value"
184
194
  >
185
- <field.render item={ item } />
195
+ <field.render
196
+ item={ item }
197
+ field={ field }
198
+ />
186
199
  </Badge>
187
200
  );
188
201
  } ) }
@@ -212,7 +225,10 @@ function GridItem< Item >( {
212
225
  className="dataviews-view-grid__field-value"
213
226
  style={ { maxHeight: 'none' } }
214
227
  >
215
- <field.render item={ item } />
228
+ <field.render
229
+ item={ item }
230
+ field={ field }
231
+ />
216
232
  </FlexItem>
217
233
  </>
218
234
  </Flex>
@@ -225,7 +241,7 @@ function GridItem< Item >( {
225
241
  );
226
242
  }
227
243
 
228
- export default function ViewGrid< Item >( {
244
+ function ViewGrid< Item >( {
229
245
  actions,
230
246
  data,
231
247
  fields,
@@ -234,8 +250,10 @@ export default function ViewGrid< Item >( {
234
250
  onChangeSelection,
235
251
  onClickItem,
236
252
  isItemClickable,
253
+ renderItemLink,
237
254
  selection,
238
255
  view,
256
+ className,
239
257
  }: ViewGridProps< Item > ) {
240
258
  const titleField = fields.find(
241
259
  ( field ) => field.id === view?.titleField
@@ -275,50 +293,144 @@ export default function ViewGrid< Item >( {
275
293
  gridTemplateColumns: `repeat(${ usedPreviewSize }, minmax(0, 1fr))`,
276
294
  }
277
295
  : {};
296
+
297
+ const groupField = view.groupByField
298
+ ? fields.find( ( f ) => f.id === view.groupByField )
299
+ : null;
300
+
301
+ // Group data by groupByField if specified
302
+ const dataByGroup = groupField
303
+ ? data.reduce( ( groups: Map< string, typeof data >, item ) => {
304
+ const groupName = groupField.getValue( { item } );
305
+ if ( ! groups.has( groupName ) ) {
306
+ groups.set( groupName, [] );
307
+ }
308
+ groups.get( groupName )?.push( item );
309
+ return groups;
310
+ }, new Map< string, typeof data >() )
311
+ : null;
312
+
278
313
  return (
279
314
  <>
280
- { hasData && (
281
- <Grid
282
- gap={ 8 }
283
- columns={ 2 }
284
- alignment="top"
285
- className="dataviews-view-grid"
286
- style={ gridStyle }
287
- aria-busy={ isLoading }
288
- >
289
- { data.map( ( item ) => {
290
- return (
291
- <GridItem
292
- key={ getItemId( item ) }
293
- view={ view }
294
- selection={ selection }
295
- onChangeSelection={ onChangeSelection }
296
- onClickItem={ onClickItem }
297
- isItemClickable={ isItemClickable }
298
- getItemId={ getItemId }
299
- item={ item }
300
- actions={ actions }
301
- mediaField={ mediaField }
302
- titleField={ titleField }
303
- descriptionField={ descriptionField }
304
- regularFields={ regularFields }
305
- badgeFields={ badgeFields }
306
- hasBulkActions={ hasBulkActions }
307
- />
308
- );
309
- } ) }
310
- </Grid>
311
- ) }
312
- { ! hasData && (
313
- <div
314
- className={ clsx( {
315
- 'dataviews-loading': isLoading,
316
- 'dataviews-no-results': ! isLoading,
317
- } ) }
318
- >
319
- <p>{ isLoading ? <Spinner /> : __( 'No results' ) }</p>
320
- </div>
321
- ) }
315
+ {
316
+ // Render multiple groups.
317
+ hasData && groupField && dataByGroup && (
318
+ <VStack spacing={ 4 }>
319
+ { Array.from( dataByGroup.entries() ).map(
320
+ ( [ groupName, groupItems ] ) => (
321
+ <VStack key={ groupName } spacing={ 2 }>
322
+ <h3 className="dataviews-view-grid__group-header">
323
+ { sprintf(
324
+ // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
325
+ __( '%1$s: %2$s' ),
326
+ groupField.label,
327
+ groupName
328
+ ) }
329
+ </h3>
330
+ <Grid
331
+ gap={ 8 }
332
+ columns={ 2 }
333
+ alignment="top"
334
+ className={ clsx(
335
+ 'dataviews-view-grid',
336
+ className
337
+ ) }
338
+ style={ gridStyle }
339
+ aria-busy={ isLoading }
340
+ >
341
+ { groupItems.map( ( item ) => {
342
+ return (
343
+ <GridItem
344
+ key={ getItemId( item ) }
345
+ view={ view }
346
+ selection={ selection }
347
+ onChangeSelection={
348
+ onChangeSelection
349
+ }
350
+ onClickItem={ onClickItem }
351
+ isItemClickable={
352
+ isItemClickable
353
+ }
354
+ renderItemLink={
355
+ renderItemLink
356
+ }
357
+ getItemId={ getItemId }
358
+ item={ item }
359
+ actions={ actions }
360
+ mediaField={ mediaField }
361
+ titleField={ titleField }
362
+ descriptionField={
363
+ descriptionField
364
+ }
365
+ regularFields={
366
+ regularFields
367
+ }
368
+ badgeFields={ badgeFields }
369
+ hasBulkActions={
370
+ hasBulkActions
371
+ }
372
+ />
373
+ );
374
+ } ) }
375
+ </Grid>
376
+ </VStack>
377
+ )
378
+ ) }
379
+ </VStack>
380
+ )
381
+ }
382
+
383
+ {
384
+ // Render a single grid with all data.
385
+ hasData && ! dataByGroup && (
386
+ <Grid
387
+ gap={ 8 }
388
+ columns={ 2 }
389
+ alignment="top"
390
+ className={ clsx( 'dataviews-view-grid', className ) }
391
+ style={ gridStyle }
392
+ aria-busy={ isLoading }
393
+ >
394
+ { data.map( ( item ) => {
395
+ return (
396
+ <GridItem
397
+ key={ getItemId( item ) }
398
+ view={ view }
399
+ selection={ selection }
400
+ onChangeSelection={ onChangeSelection }
401
+ onClickItem={ onClickItem }
402
+ isItemClickable={ isItemClickable }
403
+ renderItemLink={ renderItemLink }
404
+ getItemId={ getItemId }
405
+ item={ item }
406
+ actions={ actions }
407
+ mediaField={ mediaField }
408
+ titleField={ titleField }
409
+ descriptionField={ descriptionField }
410
+ regularFields={ regularFields }
411
+ badgeFields={ badgeFields }
412
+ hasBulkActions={ hasBulkActions }
413
+ />
414
+ );
415
+ } ) }
416
+ </Grid>
417
+ )
418
+ }
419
+ {
420
+ // Render empty state.
421
+ ! hasData && (
422
+ <div
423
+ className={ clsx( {
424
+ 'dataviews-loading': isLoading,
425
+ 'dataviews-no-results': ! isLoading,
426
+ } ) }
427
+ >
428
+ <p>{ isLoading ? <Spinner /> : __( 'No results' ) }</p>
429
+ </div>
430
+ )
431
+ }
322
432
  </>
323
433
  );
324
434
  }
435
+
436
+ export default ViewGrid;
@@ -166,3 +166,11 @@
166
166
  .dataviews-view-grid__media--clickable {
167
167
  cursor: pointer;
168
168
  }
169
+
170
+ .dataviews-view-grid__group-header {
171
+ font-size: 16px;
172
+ font-weight: 600;
173
+ color: $gray-900;
174
+ margin: 0 0 $grid-unit-10 0;
175
+ padding: 0 $grid-unit-60;
176
+ }
@@ -199,13 +199,13 @@ function ListItem< Item >( {
199
199
  const renderedMediaField =
200
200
  showMedia && mediaField?.render ? (
201
201
  <div className="dataviews-view-list__media-wrapper">
202
- <mediaField.render item={ item } />
202
+ <mediaField.render item={ item } field={ mediaField } />
203
203
  </div>
204
204
  ) : null;
205
205
 
206
206
  const renderedTitleField =
207
207
  showTitle && titleField?.render ? (
208
- <titleField.render item={ item } />
208
+ <titleField.render item={ item } field={ titleField } />
209
209
  ) : null;
210
210
 
211
211
  const usedActions = eligibleActions?.length > 0 && (
@@ -302,7 +302,10 @@ function ListItem< Item >( {
302
302
  </HStack>
303
303
  { showDescription && descriptionField?.render && (
304
304
  <div className="dataviews-view-list__field">
305
- <descriptionField.render item={ item } />
305
+ <descriptionField.render
306
+ item={ item }
307
+ field={ descriptionField }
308
+ />
306
309
  </div>
307
310
  ) }
308
311
  <div
@@ -321,7 +324,10 @@ function ListItem< Item >( {
321
324
  { field.label }
322
325
  </VisuallyHidden>
323
326
  <span className="dataviews-view-list__field-value">
324
- <field.render item={ item } />
327
+ <field.render
328
+ item={ item }
329
+ field={ field }
330
+ />
325
331
  </span>
326
332
  </div>
327
333
  ) ) }
@@ -347,6 +353,7 @@ export default function ViewList< Item >( props: ViewListProps< Item > ) {
347
353
  onChangeSelection,
348
354
  selection,
349
355
  view,
356
+ className,
350
357
  } = props;
351
358
  const baseId = useInstanceId( ViewList, 'view-list' );
352
359
 
@@ -491,7 +498,7 @@ export default function ViewList< Item >( props: ViewListProps< Item > ) {
491
498
  <Composite
492
499
  id={ baseId }
493
500
  render={ <div /> }
494
- className="dataviews-view-list"
501
+ className={ clsx( 'dataviews-view-list', className ) }
495
502
  role="grid"
496
503
  activeId={ activeCompositeId }
497
504
  setActiveId={ setActiveCompositeId }
@@ -19,7 +19,6 @@ import { forwardRef, Children, Fragment } from '@wordpress/element';
19
19
  * Internal dependencies
20
20
  */
21
21
  import { unlock } from '../../lock-unlock';
22
- import { sanitizeOperators } from '../../utils';
23
22
  import { SORTING_DIRECTIONS, sortArrows, sortLabels } from '../../constants';
24
23
  import type {
25
24
  NormalizedField,
@@ -81,15 +80,18 @@ const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
81
80
  isSortable = field.enableSorting !== false;
82
81
  const header = field.header;
83
82
 
84
- 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.
83
+ operators = ( !! field.filterBy && field.filterBy?.operators ) || [];
84
+
85
+ // Filter can be added if:
86
+ //
87
+ // 1. The field is not already part of a view's filters.
88
+ // 2. The field has elements or Edit property.
89
+ // 3. The field does not opt-out of filtering.
90
+ // 4. The filter is not primary (if it is, it is already visible).
89
91
  canAddFilter =
90
92
  ! view.filters?.some( ( _filter ) => fieldId === _filter.field ) &&
91
- !! field.elements?.length &&
92
- !! operators.length &&
93
+ !! ( field.elements?.length || field.Edit ) &&
94
+ field.filterBy !== false &&
93
95
  ! field.filterBy?.isPrimary;
94
96
 
95
97
  return (
@@ -1,3 +1,8 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { ComponentProps, ReactElement } from 'react';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
@@ -10,7 +15,7 @@ import {
10
15
  * Internal dependencies
11
16
  */
12
17
  import type { NormalizedField } from '../../types';
13
- import getClickableItemProps from '../utils/get-clickable-item-props';
18
+ import { ItemClickWrapper } from '../utils/item-click-wrapper';
14
19
 
15
20
  function ColumnPrimary< Item >( {
16
21
  item,
@@ -19,6 +24,7 @@ function ColumnPrimary< Item >( {
19
24
  mediaField,
20
25
  descriptionField,
21
26
  onClickItem,
27
+ renderItemLink,
22
28
  isItemClickable,
23
29
  }: {
24
30
  item: Item;
@@ -27,35 +33,42 @@ function ColumnPrimary< Item >( {
27
33
  mediaField?: NormalizedField< Item >;
28
34
  descriptionField?: NormalizedField< Item >;
29
35
  onClickItem?: ( item: Item ) => void;
36
+ renderItemLink?: (
37
+ props: {
38
+ item: Item;
39
+ } & ComponentProps< 'a' >
40
+ ) => ReactElement;
30
41
  isItemClickable: ( item: Item ) => boolean;
31
42
  } ) {
32
- const clickableProps = getClickableItemProps( {
33
- item,
34
- isItemClickable,
35
- onClickItem,
36
- className:
37
- 'dataviews-view-table__cell-content-wrapper dataviews-title-field',
38
- } );
39
43
  return (
40
44
  <HStack spacing={ 3 } justify="flex-start">
41
45
  { mediaField && (
42
46
  <div className="dataviews-view-table__cell-content-wrapper dataviews-column-primary__media">
43
- <mediaField.render item={ item } />
47
+ <mediaField.render item={ item } field={ mediaField } />
44
48
  </div>
45
49
  ) }
46
50
  <VStack spacing={ 0 }>
47
51
  { titleField && (
48
- <div { ...clickableProps }>
52
+ <ItemClickWrapper
53
+ item={ item }
54
+ isItemClickable={ isItemClickable }
55
+ onClickItem={ onClickItem }
56
+ renderItemLink={ renderItemLink }
57
+ className="dataviews-view-table__cell-content-wrapper dataviews-title-field"
58
+ >
49
59
  { level !== undefined && (
50
60
  <span className="dataviews-view-table__level">
51
61
  { '—'.repeat( level ) }&nbsp;
52
62
  </span>
53
63
  ) }
54
- <titleField.render item={ item } />
55
- </div>
64
+ <titleField.render item={ item } field={ titleField } />
65
+ </ItemClickWrapper>
56
66
  ) }
57
67
  { descriptionField && (
58
- <descriptionField.render item={ item } />
68
+ <descriptionField.render
69
+ item={ item }
70
+ field={ descriptionField }
71
+ />
59
72
  ) }
60
73
  </VStack>
61
74
  </HStack>