@wordpress/dataviews 4.21.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 +41 -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 +317 -15
  180. package/build-style/style.css +317 -15
  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
@@ -16,34 +16,32 @@ import { __, _x } from '@wordpress/i18n';
16
16
  /**
17
17
  * Internal dependencies
18
18
  */
19
- import FilterSummary from './filter-summary';
19
+ import Filter from './filter';
20
20
  import { default as AddFilter, AddFilterMenu } from './add-filter';
21
21
  import ResetFilters from './reset-filters';
22
22
  import DataViewsContext from '../dataviews-context';
23
- import { sanitizeOperators } from '../../utils';
24
- import { ALL_OPERATORS, OPERATOR_IS, OPERATOR_IS_NOT } from '../../constants';
23
+ import { ALL_OPERATORS, SINGLE_SELECTION_OPERATORS } from '../../constants';
25
24
  import type { NormalizedFilter, NormalizedField, View } from '../../types';
26
25
 
27
26
  export function useFilters( fields: NormalizedField< any >[], view: View ) {
28
27
  return useMemo( () => {
29
28
  const filters: NormalizedFilter[] = [];
30
29
  fields.forEach( ( field ) => {
31
- if ( ! field.elements?.length ) {
32
- return;
33
- }
34
-
35
- const operators = sanitizeOperators( field );
36
- if ( operators.length === 0 ) {
30
+ if (
31
+ field.filterBy === false ||
32
+ ( ! field.elements?.length && ! field.Edit )
33
+ ) {
37
34
  return;
38
35
  }
39
36
 
37
+ const operators = field.filterBy.operators;
40
38
  const isPrimary = !! field.filterBy?.isPrimary;
41
39
  filters.push( {
42
40
  field: field.id,
43
41
  name: field.label,
44
- elements: field.elements,
42
+ elements: field.elements ?? [],
45
43
  singleSelection: operators.some( ( op ) =>
46
- [ OPERATOR_IS, OPERATOR_IS_NOT ].includes( op )
44
+ SINGLE_SELECTION_OPERATORS.includes( op )
47
45
  ),
48
46
  operators,
49
47
  isVisible:
@@ -71,21 +69,16 @@ export function useFilters( fields: NormalizedField< any >[], view: View ) {
71
69
  }, [ fields, view ] );
72
70
  }
73
71
 
74
- export function FiltersToggle( {
75
- filters,
76
- view,
77
- onChangeView,
78
- setOpenedFilter,
79
- isShowingFilter,
80
- setIsShowingFilter,
81
- }: {
82
- filters: NormalizedFilter[];
83
- view: View;
84
- onChangeView: ( view: View ) => void;
85
- setOpenedFilter: ( filter: string | null ) => void;
86
- isShowingFilter: boolean;
87
- setIsShowingFilter: React.Dispatch< React.SetStateAction< boolean > >;
88
- } ) {
72
+ export function FiltersToggle() {
73
+ const {
74
+ filters,
75
+ view,
76
+ onChangeView,
77
+ setOpenedFilter,
78
+ isShowingFilter,
79
+ setIsShowingFilter,
80
+ } = useContext( DataViewsContext );
81
+
89
82
  const buttonRef = useRef< HTMLButtonElement >( null );
90
83
  const onChangeViewWithFilterVisibility = useCallback(
91
84
  ( _view: View ) => {
@@ -178,7 +171,7 @@ function FilterVisibilityToggle( {
178
171
  );
179
172
  }
180
173
 
181
- function Filters() {
174
+ function Filters( { className }: { className?: string } ) {
182
175
  const { fields, view, onChangeView, openedFilter, setOpenedFilter } =
183
176
  useContext( DataViewsContext );
184
177
  const addFilterRef = useRef< HTMLButtonElement >( null );
@@ -200,10 +193,11 @@ function Filters() {
200
193
  const filterComponents = [
201
194
  ...visibleFilters.map( ( filter ) => {
202
195
  return (
203
- <FilterSummary
196
+ <Filter
204
197
  key={ filter.field }
205
198
  filter={ filter }
206
199
  view={ view }
200
+ fields={ fields }
207
201
  onChangeView={ onChangeView }
208
202
  addFilterRef={ addFilterRef }
209
203
  openedFilter={ openedFilter }
@@ -226,8 +220,8 @@ function Filters() {
226
220
  <HStack
227
221
  justify="flex-start"
228
222
  style={ { width: 'fit-content' } }
229
- className="dataviews-filters__container"
230
223
  wrap
224
+ className={ className }
231
225
  >
232
226
  { filterComponents }
233
227
  </HStack>
@@ -0,0 +1,91 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import fastDeepEqual from 'fast-deep-equal/es6';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useEvent } from '@wordpress/compose';
10
+ import { useMemo } from '@wordpress/element';
11
+ import { Flex } from '@wordpress/components';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import type { View, NormalizedFilter, NormalizedField } from '../../types';
17
+ import { getCurrentValue } from './utils';
18
+
19
+ interface UserInputWidgetProps {
20
+ view: View;
21
+ filter: NormalizedFilter;
22
+ onChangeView: ( view: View ) => void;
23
+ fields: NormalizedField< any >[];
24
+ }
25
+
26
+ export default function InputWidget( {
27
+ filter,
28
+ view,
29
+ onChangeView,
30
+ fields,
31
+ }: UserInputWidgetProps ) {
32
+ const currentFilter = view.filters?.find(
33
+ ( f ) => f.field === filter.field
34
+ );
35
+
36
+ const field = fields.find( ( f ) => f.id === filter.field );
37
+ const currentValue = getCurrentValue( filter, currentFilter );
38
+ const data = useMemo( () => {
39
+ return ( view.filters ?? [] ).reduce(
40
+ ( acc, f ) => {
41
+ acc[ f.field ] = f.value;
42
+ return acc;
43
+ },
44
+ {} as Record< string, any >
45
+ );
46
+ }, [ view.filters ] );
47
+
48
+ const handleChange = useEvent( ( updatedData: Record< string, any > ) => {
49
+ if ( ! field || ! currentFilter ) {
50
+ return;
51
+ }
52
+ const nextValue = updatedData[ field.id ];
53
+ if ( fastDeepEqual( nextValue, currentValue ) ) {
54
+ return;
55
+ }
56
+
57
+ onChangeView( {
58
+ ...view,
59
+ filters: ( view.filters ?? [] ).map( ( _filter ) =>
60
+ _filter.field === filter.field
61
+ ? {
62
+ ..._filter,
63
+ operator:
64
+ currentFilter.operator || filter.operators[ 0 ],
65
+ value: nextValue,
66
+ }
67
+ : _filter
68
+ ),
69
+ } );
70
+ } );
71
+
72
+ if ( ! field || ! field.Edit || ! currentFilter ) {
73
+ return null;
74
+ }
75
+
76
+ return (
77
+ <Flex
78
+ className="dataviews-filters__user-input-widget"
79
+ gap={ 2.5 }
80
+ direction="column"
81
+ >
82
+ <field.Edit
83
+ hideLabelFromVision
84
+ data={ data }
85
+ field={ field }
86
+ operator={ currentFilter.operator }
87
+ onChange={ handleChange }
88
+ />
89
+ </Flex>
90
+ );
91
+ }
@@ -4,6 +4,7 @@
4
4
  // eslint-disable-next-line no-restricted-imports
5
5
  import * as Ariakit from '@ariakit/react';
6
6
  import removeAccents from 'remove-accents';
7
+ import clsx from 'clsx';
7
8
 
8
9
  /**
9
10
  * WordPress dependencies
@@ -13,49 +14,25 @@ import { __, sprintf } from '@wordpress/i18n';
13
14
  import { useState, useMemo, useDeferredValue } from '@wordpress/element';
14
15
  import { VisuallyHidden, Icon, Composite } from '@wordpress/components';
15
16
  import { search, check } from '@wordpress/icons';
16
- import { SVG, Circle } from '@wordpress/primitives';
17
17
 
18
18
  /**
19
19
  * Internal dependencies
20
20
  */
21
- import type { Filter, NormalizedFilter, View } from '../../types';
21
+ import { getCurrentValue } from './utils';
22
+ import type { Filter, NormalizedFilter, View, Option } from '../../types';
22
23
 
23
24
  interface SearchWidgetProps {
24
25
  view: View;
25
- filter: NormalizedFilter;
26
+ filter: NormalizedFilter & {
27
+ elements: Option[];
28
+ };
26
29
  onChangeView: ( view: View ) => void;
27
30
  }
28
31
 
29
- const radioCheck = (
30
- <SVG xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
31
- <Circle cx={ 12 } cy={ 12 } r={ 3 }></Circle>
32
- </SVG>
33
- );
34
-
35
32
  function normalizeSearchInput( input = '' ) {
36
33
  return removeAccents( input.trim().toLowerCase() );
37
34
  }
38
35
 
39
- const EMPTY_ARRAY: [] = [];
40
- const getCurrentValue = (
41
- filterDefinition: NormalizedFilter,
42
- currentFilter?: Filter
43
- ) => {
44
- if ( filterDefinition.singleSelection ) {
45
- return currentFilter?.value;
46
- }
47
-
48
- if ( Array.isArray( currentFilter?.value ) ) {
49
- return currentFilter.value;
50
- }
51
-
52
- if ( ! Array.isArray( currentFilter?.value ) && !! currentFilter?.value ) {
53
- return [ currentFilter.value ];
54
- }
55
-
56
- return EMPTY_ARRAY;
57
- };
58
-
59
36
  const getNewValue = (
60
37
  filterDefinition: NormalizedFilter,
61
38
  currentFilter: Filter | undefined,
@@ -81,6 +58,30 @@ function generateFilterElementCompositeItemId(
81
58
  return `${ prefix }-${ filterElementValue }`;
82
59
  }
83
60
 
61
+ const MultiSelectionOption = ( { selected }: { selected: boolean } ) => {
62
+ return (
63
+ <span
64
+ className={ clsx(
65
+ 'dataviews-filters__search-widget-listitem-multi-selection',
66
+ { 'is-selected': selected }
67
+ ) }
68
+ >
69
+ { selected && <Icon icon={ check } /> }
70
+ </span>
71
+ );
72
+ };
73
+
74
+ const SingleSelectionOption = ( { selected }: { selected: boolean } ) => {
75
+ return (
76
+ <span
77
+ className={ clsx(
78
+ 'dataviews-filters__search-widget-listitem-single-selection',
79
+ { 'is-selected': selected }
80
+ ) }
81
+ />
82
+ );
83
+ };
84
+
84
85
  function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
85
86
  const baseId = useInstanceId( ListBox, 'dataviews-filter-list-box' );
86
87
 
@@ -189,16 +190,16 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
189
190
  />
190
191
  }
191
192
  >
192
- <span className="dataviews-filters__search-widget-listitem-check">
193
- { filter.singleSelection &&
194
- currentValue === element.value && (
195
- <Icon icon={ radioCheck } />
196
- ) }
197
- { ! filter.singleSelection &&
198
- currentValue.includes( element.value ) && (
199
- <Icon icon={ check } />
200
- ) }
201
- </span>
193
+ { filter.singleSelection && (
194
+ <SingleSelectionOption
195
+ selected={ currentValue === element.value }
196
+ />
197
+ ) }
198
+ { ! filter.singleSelection && (
199
+ <MultiSelectionOption
200
+ selected={ currentValue.includes( element.value ) }
201
+ />
202
+ ) }
202
203
  <span>{ element.label }</span>
203
204
  </Composite.Hover>
204
205
  ) ) }
@@ -288,16 +289,18 @@ function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
288
289
  setValueOnClick={ false }
289
290
  focusOnHover
290
291
  >
291
- <span className="dataviews-filters__search-widget-listitem-check">
292
- { filter.singleSelection &&
293
- currentValue === element.value && (
294
- <Icon icon={ radioCheck } />
295
- ) }
296
- { ! filter.singleSelection &&
297
- currentValue.includes( element.value ) && (
298
- <Icon icon={ check } />
292
+ { filter.singleSelection && (
293
+ <SingleSelectionOption
294
+ selected={ currentValue === element.value }
295
+ />
296
+ ) }
297
+ { ! filter.singleSelection && (
298
+ <MultiSelectionOption
299
+ selected={ currentValue.includes(
300
+ element.value
299
301
  ) }
300
- </span>
302
+ />
303
+ ) }
301
304
  <span>
302
305
  <Ariakit.ComboboxItemValue
303
306
  className="dataviews-filters__search-widget-filter-combobox-item-value"
@@ -34,11 +34,11 @@
34
34
  }
35
35
 
36
36
  .dataviews-filters__summary-operators-container {
37
- padding: $grid-unit-10 $grid-unit-10 0;
37
+ padding: $grid-unit-10 $grid-unit-20;
38
38
 
39
- &:has(+ .dataviews-filters__search-widget-listbox) {
39
+ &:has(+ .dataviews-filters__search-widget-listbox),
40
+ &:has(+ .dataviews-filters__user-input-widget) {
40
41
  border-bottom: 1px solid $gray-200;
41
- padding-bottom: $grid-unit-10;
42
42
  }
43
43
 
44
44
  &:empty {
@@ -47,6 +47,17 @@
47
47
 
48
48
  .dataviews-filters__summary-operators-filter-name {
49
49
  color: $gray-700;
50
+ white-space: nowrap;
51
+ overflow: hidden;
52
+ text-overflow: ellipsis;
53
+ flex-shrink: 0; /* Prevents this element from shrinking */
54
+ max-width: calc(100% - 55px);
55
+ }
56
+
57
+ .dataviews-filters__summary-operators-filter-select {
58
+ width: 100%;
59
+ white-space: nowrap;
60
+ overflow: hidden;
50
61
  }
51
62
  }
52
63
 
@@ -170,9 +181,10 @@
170
181
  gap: $grid-unit-10;
171
182
  border-radius: $radius-small;
172
183
  box-sizing: border-box;
173
- padding: $grid-unit-10 $grid-unit-15;
184
+ padding: $grid-unit-05 $grid-unit-15;
174
185
  cursor: default;
175
- margin-block-end: 2px;
186
+ min-height: $grid-unit-40;
187
+ @include body-medium();
176
188
 
177
189
  &:last-child {
178
190
  margin-block-end: 0;
@@ -184,19 +196,27 @@
184
196
  background-color: var(--wp-admin-theme-color);
185
197
  color: $white;
186
198
 
187
- .dataviews-filters__search-widget-listitem-check {
188
- fill: $white;
189
- }
190
-
191
199
  .dataviews-filters__search-widget-listitem-description {
192
200
  color: $white;
193
201
  }
194
- }
195
202
 
196
- .dataviews-filters__search-widget-listitem-check {
197
- width: 24px;
198
- height: 24px;
199
- flex-shrink: 0;
203
+ .dataviews-filters__search-widget-listitem-single-selection {
204
+ border-color: var(--wp-admin-theme-color-darker-20, #183ad6);
205
+ background: $white;
206
+ &.is-selected {
207
+ border-color: var(--wp-admin-theme-color-darker-20, #183ad6);
208
+ background: var(--wp-admin-theme-color-darker-20, #183ad6);
209
+ }
210
+ }
211
+
212
+ .dataviews-filters__search-widget-listitem-multi-selection {
213
+ border-color: var(--wp-admin-theme-color-darker-20, #183ad6);
214
+
215
+ &.is-selected {
216
+ border-color: var(--wp-admin-theme-color-darker-20, #183ad6);
217
+ background: var(--wp-admin-theme-color-darker-20, #183ad6);
218
+ }
219
+ }
200
220
  }
201
221
 
202
222
  .dataviews-filters__search-widget-listitem-description {
@@ -207,6 +227,81 @@
207
227
  line-height: 16px;
208
228
  color: $gray-700;
209
229
  }
230
+
231
+ .dataviews-filters__search-widget-listitem-single-selection {
232
+ @include radio-control;
233
+ margin: 0;
234
+ padding: 0;
235
+
236
+ &.is-selected {
237
+ background: var(--wp-admin-theme-color, #3858e9);
238
+ border-color: var(--wp-admin-theme-color, #3858e9);
239
+
240
+ &::before {
241
+ content: "";
242
+ border-radius: $radius-round;
243
+ box-sizing: inherit;
244
+ width: math.div($radio-input-size-sm, 2);
245
+ height: math.div($radio-input-size-sm, 2);
246
+ position: absolute;
247
+ top: 50%;
248
+ left: 50%;
249
+ transform: translate(-50%, -50%);
250
+ margin: 0;
251
+ background-color: $white;
252
+
253
+ // This border serves as a background color in Windows High Contrast mode.
254
+ border: 4px solid $white;
255
+
256
+ @include break-small() {
257
+ width: math.div($radio-input-size, 2);
258
+ height: math.div($radio-input-size, 2);
259
+ }
260
+ }
261
+ }
262
+ }
263
+
264
+ .dataviews-filters__search-widget-listitem-multi-selection {
265
+ --checkbox-size: 24px; // Width & height for small viewports.
266
+
267
+ @include checkbox-control;
268
+ position: relative;
269
+ background: $white;
270
+ color: $gray-900;
271
+ margin: 0;
272
+ padding: 0;
273
+ width: var(--checkbox-size);
274
+ height: var(--checkbox-size);
275
+
276
+ @include break-small() {
277
+ --checkbox-size: 16px;
278
+ }
279
+
280
+ @media not (prefers-reduced-motion) {
281
+ transition: 0.1s border-color ease-in-out;
282
+ }
283
+
284
+ &.is-selected {
285
+ background: var(--wp-admin-theme-color, #3858e9);
286
+ border-color: var(--wp-admin-theme-color, #3858e9);
287
+
288
+ svg {
289
+ --checkmark-size: var(--checkbox-size);
290
+
291
+ fill: $white;
292
+ position: absolute;
293
+ left: 50%;
294
+ top: 50%;
295
+ transform: translate(-50%, -50%);
296
+ width: var(--checkmark-size);
297
+ height: var(--checkmark-size);
298
+
299
+ @include break-small() {
300
+ --checkmark-size: calc(var(--checkbox-size) + 4px);
301
+ }
302
+ }
303
+ }
304
+ }
210
305
  }
211
306
 
212
307
  .dataviews-filters__search-widget-filter-combobox__wrapper {
@@ -289,3 +384,11 @@
289
384
  .dataviews-search {
290
385
  width: fit-content;
291
386
  }
387
+
388
+ .dataviews-filters__user-input-widget {
389
+ padding: $grid-unit-20;
390
+
391
+ .components-input-control__prefix {
392
+ padding-left: $grid-unit-10;
393
+ }
394
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import type { NormalizedFilter, Filter } from '../../types';
5
+
6
+ const EMPTY_ARRAY: [] = [];
7
+
8
+ export const getCurrentValue = (
9
+ filterDefinition: NormalizedFilter,
10
+ currentFilter?: Filter
11
+ ) => {
12
+ if ( filterDefinition.singleSelection ) {
13
+ return currentFilter?.value;
14
+ }
15
+
16
+ if ( Array.isArray( currentFilter?.value ) ) {
17
+ return currentFilter.value;
18
+ }
19
+
20
+ if ( ! Array.isArray( currentFilter?.value ) && !! currentFilter?.value ) {
21
+ return [ currentFilter.value ];
22
+ }
23
+
24
+ return EMPTY_ARRAY;
25
+ };
@@ -196,7 +196,7 @@ export default function ItemActions< Item >( {
196
196
  justify="flex-end"
197
197
  className="dataviews-item-actions"
198
198
  style={ {
199
- flexShrink: '0',
199
+ flexShrink: 0,
200
200
  width: 'auto',
201
201
  } }
202
202
  >
@@ -15,7 +15,11 @@ import DataViewsContext from '../dataviews-context';
15
15
  import { VIEW_LAYOUTS } from '../../dataviews-layouts';
16
16
  import type { ViewBaseProps } from '../../types';
17
17
 
18
- export default function DataViewsLayout() {
18
+ type DataViewsLayoutProps = {
19
+ className?: string;
20
+ };
21
+
22
+ export default function DataViewsLayout( { className }: DataViewsLayoutProps ) {
19
23
  const {
20
24
  actions = [],
21
25
  data,
@@ -30,6 +34,7 @@ export default function DataViewsLayout() {
30
34
  setOpenedFilter,
31
35
  onClickItem,
32
36
  isItemClickable,
37
+ renderItemLink,
33
38
  } = useContext( DataViewsContext );
34
39
 
35
40
  const ViewComponent = VIEW_LAYOUTS.find( ( v ) => v.type === view.type )
@@ -37,6 +42,7 @@ export default function DataViewsLayout() {
37
42
 
38
43
  return (
39
44
  <ViewComponent
45
+ className={ className }
40
46
  actions={ actions }
41
47
  data={ data }
42
48
  fields={ fields }
@@ -48,6 +54,7 @@ export default function DataViewsLayout() {
48
54
  selection={ selection }
49
55
  setOpenedFilter={ setOpenedFilter }
50
56
  onClickItem={ onClickItem }
57
+ renderItemLink={ renderItemLink }
51
58
  isItemClickable={ isItemClickable }
52
59
  view={ view }
53
60
  />
@@ -15,7 +15,7 @@ import { next, previous } from '@wordpress/icons';
15
15
  */
16
16
  import DataViewsContext from '../dataviews-context';
17
17
 
18
- function DataViewsPagination() {
18
+ export function DataViewsPagination() {
19
19
  const {
20
20
  view,
21
21
  onChangeView,
@@ -36,8 +36,8 @@ function DataViewsPagination() {
36
36
  'aria-label':
37
37
  currentPage === page
38
38
  ? sprintf(
39
- // translators: Current page number in total number of pages
40
- __( 'Page %1$s of %2$s' ),
39
+ // translators: 1: current page number. 2: total number of pages.
40
+ __( 'Page %1$d of %2$d' ),
41
41
  currentPage,
42
42
  totalPages
43
43
  )
@@ -65,7 +65,7 @@ function DataViewsPagination() {
65
65
  sprintf(
66
66
  // translators: 1: Current page number, 2: Total number of pages.
67
67
  _x(
68
- '<div>Page</div>%1$s<div>of %2$s</div>',
68
+ '<div>Page</div>%1$s<div>of %2$d</div>',
69
69
  'paging'
70
70
  ),
71
71
  '<CurrentPage />',
@@ -7,15 +7,15 @@ import { __ } from '@wordpress/i18n';
7
7
  /**
8
8
  * Internal dependencies
9
9
  */
10
- import type { Field } from '../../types';
11
10
  import type { SetSelection } from '../../private-types';
11
+ import type { NormalizedField } from '../../types';
12
12
 
13
13
  interface DataViewsSelectionCheckboxProps< Item > {
14
14
  selection: string[];
15
15
  onChangeSelection: SetSelection;
16
16
  item: Item;
17
17
  getItemId: ( item: Item ) => string;
18
- titleField?: Field< Item >;
18
+ titleField?: NormalizedField< Item >;
19
19
  disabled: boolean;
20
20
  }
21
21