@wordpress/dataviews 4.22.0 → 5.0.1-next.719a03cbe.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 (335) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +146 -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 +31 -25
  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/datetime.js +19 -1
  71. package/build/field-types/datetime.js.map +1 -1
  72. package/build/field-types/email.js +60 -0
  73. package/build/field-types/email.js.map +1 -0
  74. package/build/field-types/index.js +38 -1
  75. package/build/field-types/index.js.map +1 -1
  76. package/build/field-types/integer.js +23 -1
  77. package/build/field-types/integer.js.map +1 -1
  78. package/build/field-types/media.js +31 -0
  79. package/build/field-types/media.js.map +1 -0
  80. package/build/field-types/text.js +23 -1
  81. package/build/field-types/text.js.map +1 -1
  82. package/build/filter-and-sort-data-view.js +152 -1
  83. package/build/filter-and-sort-data-view.js.map +1 -1
  84. package/build/normalize-fields.js +72 -11
  85. package/build/normalize-fields.js.map +1 -1
  86. package/build/types.js.map +1 -1
  87. package/build/utils.js +11 -19
  88. package/build/utils.js.map +1 -1
  89. package/build-module/components/dataviews/index.js +74 -40
  90. package/build-module/components/dataviews/index.js.map +1 -1
  91. package/build-module/components/dataviews-context/index.js +16 -2
  92. package/build-module/components/dataviews-context/index.js.map +1 -1
  93. package/build-module/components/dataviews-filters/filter.js +309 -0
  94. package/build-module/components/dataviews-filters/filter.js.map +1 -0
  95. package/build-module/components/dataviews-filters/index.js +22 -21
  96. package/build-module/components/dataviews-filters/index.js.map +1 -1
  97. package/build-module/components/dataviews-filters/input-widget.js +69 -0
  98. package/build-module/components/dataviews-filters/input-widget.js.map +1 -0
  99. package/build-module/components/dataviews-filters/search-widget.js +31 -37
  100. package/build-module/components/dataviews-filters/search-widget.js.map +1 -1
  101. package/build-module/components/dataviews-filters/utils.js +18 -0
  102. package/build-module/components/dataviews-filters/utils.js.map +1 -0
  103. package/build-module/components/dataviews-item-actions/index.js +1 -1
  104. package/build-module/components/dataviews-item-actions/index.js.map +1 -1
  105. package/build-module/components/dataviews-layout/index.js +7 -2
  106. package/build-module/components/dataviews-layout/index.js.map +1 -1
  107. package/build-module/components/dataviews-pagination/index.js +4 -4
  108. package/build-module/components/dataviews-pagination/index.js.map +1 -1
  109. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  110. package/build-module/components/dataviews-view-config/index.js +9 -20
  111. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  112. package/build-module/constants.js +82 -1
  113. package/build-module/constants.js.map +1 -1
  114. package/build-module/dataform-controls/boolean.js +35 -0
  115. package/build-module/dataform-controls/boolean.js.map +1 -0
  116. package/build-module/dataform-controls/checkbox.js +37 -0
  117. package/build-module/dataform-controls/checkbox.js.map +1 -0
  118. package/build-module/dataform-controls/datetime.js +98 -3
  119. package/build-module/dataform-controls/datetime.js.map +1 -1
  120. package/build-module/dataform-controls/email.js +41 -0
  121. package/build-module/dataform-controls/email.js.map +1 -0
  122. package/build-module/dataform-controls/index.js +9 -1
  123. package/build-module/dataform-controls/index.js.map +1 -1
  124. package/build-module/dataform-controls/integer.js +51 -3
  125. package/build-module/dataform-controls/integer.js.map +1 -1
  126. package/build-module/dataform-controls/select.js +1 -0
  127. package/build-module/dataform-controls/select.js.map +1 -1
  128. package/build-module/dataform-controls/text.js +3 -1
  129. package/build-module/dataform-controls/text.js.map +1 -1
  130. package/build-module/dataform-controls/toggle-group.js +45 -0
  131. package/build-module/dataform-controls/toggle-group.js.map +1 -0
  132. package/build-module/dataforms-layouts/data-form-layout.js +1 -1
  133. package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
  134. package/build-module/dataforms-layouts/panel/index.js +14 -5
  135. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  136. package/build-module/dataforms-layouts/regular/index.js +23 -4
  137. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  138. package/build-module/dataviews-layouts/grid/index.js +31 -26
  139. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  140. package/build-module/dataviews-layouts/list/index.js +11 -6
  141. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  142. package/build-module/dataviews-layouts/table/column-header-menu.js +9 -7
  143. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  144. package/build-module/dataviews-layouts/table/column-primary.js +18 -12
  145. package/build-module/dataviews-layouts/table/column-primary.js.map +1 -1
  146. package/build-module/dataviews-layouts/table/index.js +47 -16
  147. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  148. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js +58 -0
  149. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -0
  150. package/build-module/dataviews-layouts/utils/item-click-wrapper.js +71 -0
  151. package/build-module/dataviews-layouts/utils/item-click-wrapper.js.map +1 -0
  152. package/build-module/field-types/array.js +57 -0
  153. package/build-module/field-types/array.js.map +1 -0
  154. package/build-module/field-types/boolean.js +65 -0
  155. package/build-module/field-types/boolean.js.map +1 -0
  156. package/build-module/field-types/datetime.js +19 -1
  157. package/build-module/field-types/datetime.js.map +1 -1
  158. package/build-module/field-types/email.js +54 -0
  159. package/build-module/field-types/email.js.map +1 -0
  160. package/build-module/field-types/index.js +38 -1
  161. package/build-module/field-types/index.js.map +1 -1
  162. package/build-module/field-types/integer.js +23 -1
  163. package/build-module/field-types/integer.js.map +1 -1
  164. package/build-module/field-types/media.js +25 -0
  165. package/build-module/field-types/media.js.map +1 -0
  166. package/build-module/field-types/text.js +23 -1
  167. package/build-module/field-types/text.js.map +1 -1
  168. package/build-module/filter-and-sort-data-view.js +153 -2
  169. package/build-module/filter-and-sort-data-view.js.map +1 -1
  170. package/build-module/normalize-fields.js +72 -11
  171. package/build-module/normalize-fields.js.map +1 -1
  172. package/build-module/types.js.map +1 -1
  173. package/build-module/utils.js +10 -17
  174. package/build-module/utils.js.map +1 -1
  175. package/build-style/style-rtl.css +307 -13
  176. package/build-style/style.css +307 -13
  177. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  178. package/build-types/components/dataviews/index.d.ts +24 -3
  179. package/build-types/components/dataviews/index.d.ts.map +1 -1
  180. package/build-types/components/dataviews/stories/fixtures.d.ts +9 -1
  181. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  182. package/build-types/components/dataviews/stories/index.story.d.ts +22 -4
  183. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  184. package/build-types/components/dataviews-context/index.d.ts +14 -1
  185. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  186. package/build-types/components/dataviews-filters/filter.d.ts +15 -0
  187. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -0
  188. package/build-types/components/dataviews-filters/index.d.ts +3 -8
  189. package/build-types/components/dataviews-filters/index.d.ts.map +1 -1
  190. package/build-types/components/dataviews-filters/input-widget.d.ts +13 -0
  191. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -0
  192. package/build-types/components/dataviews-filters/search-widget.d.ts +4 -5
  193. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -1
  194. package/build-types/components/dataviews-filters/utils.d.ts +6 -0
  195. package/build-types/components/dataviews-filters/utils.d.ts.map +1 -0
  196. package/build-types/components/dataviews-layout/index.d.ts +5 -1
  197. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  198. package/build-types/components/dataviews-pagination/index.d.ts +1 -1
  199. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -1
  200. package/build-types/components/dataviews-selection-checkbox/index.d.ts +2 -2
  201. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  202. package/build-types/components/dataviews-view-config/index.d.ts +3 -4
  203. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  204. package/build-types/components/stories/index.story.d.ts +59 -0
  205. package/build-types/components/stories/index.story.d.ts.map +1 -0
  206. package/build-types/constants.d.ts +20 -3
  207. package/build-types/constants.d.ts.map +1 -1
  208. package/build-types/dataform-controls/boolean.d.ts +6 -0
  209. package/build-types/dataform-controls/boolean.d.ts.map +1 -0
  210. package/build-types/dataform-controls/checkbox.d.ts +6 -0
  211. package/build-types/dataform-controls/checkbox.d.ts.map +1 -0
  212. package/build-types/dataform-controls/datetime.d.ts +1 -1
  213. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  214. package/build-types/dataform-controls/email.d.ts +6 -0
  215. package/build-types/dataform-controls/email.d.ts.map +1 -0
  216. package/build-types/dataform-controls/index.d.ts +1 -1
  217. package/build-types/dataform-controls/index.d.ts.map +1 -1
  218. package/build-types/dataform-controls/integer.d.ts +1 -4
  219. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  220. package/build-types/dataform-controls/select.d.ts.map +1 -1
  221. package/build-types/dataform-controls/text.d.ts.map +1 -1
  222. package/build-types/dataform-controls/toggle-group.d.ts +6 -0
  223. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -0
  224. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  225. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  226. package/build-types/dataviews-layouts/grid/index.d.ts +2 -1
  227. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  228. package/build-types/dataviews-layouts/index.d.ts +3 -3
  229. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  230. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
  231. package/build-types/dataviews-layouts/table/column-primary.d.ts +8 -1
  232. package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -1
  233. package/build-types/dataviews-layouts/table/index.d.ts +1 -1
  234. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  235. package/build-types/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts +19 -0
  236. package/build-types/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts.map +1 -0
  237. package/build-types/dataviews-layouts/utils/item-click-wrapper.d.ts +15 -0
  238. package/build-types/dataviews-layouts/utils/item-click-wrapper.d.ts.map +1 -0
  239. package/build-types/field-types/array.d.ts +7 -0
  240. package/build-types/field-types/array.d.ts.map +1 -0
  241. package/build-types/field-types/boolean.d.ts +19 -0
  242. package/build-types/field-types/boolean.d.ts.map +1 -0
  243. package/build-types/field-types/datetime.d.ts +7 -1
  244. package/build-types/field-types/datetime.d.ts.map +1 -1
  245. package/build-types/field-types/email.d.ts +19 -0
  246. package/build-types/field-types/email.d.ts.map +1 -0
  247. package/build-types/field-types/index.d.ts +2 -10
  248. package/build-types/field-types/index.d.ts.map +1 -1
  249. package/build-types/field-types/integer.d.ts +7 -1
  250. package/build-types/field-types/integer.d.ts.map +1 -1
  251. package/build-types/field-types/media.d.ts +16 -0
  252. package/build-types/field-types/media.d.ts.map +1 -0
  253. package/build-types/field-types/text.d.ts +7 -1
  254. package/build-types/field-types/text.d.ts.map +1 -1
  255. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  256. package/build-types/normalize-fields.d.ts.map +1 -1
  257. package/build-types/types.d.ts +70 -8
  258. package/build-types/types.d.ts.map +1 -1
  259. package/build-types/utils.d.ts +5 -2
  260. package/build-types/utils.d.ts.map +1 -1
  261. package/build-wp/index.js +2545 -994
  262. package/package.json +18 -12
  263. package/src/components/dataform/stories/index.story.tsx +41 -20
  264. package/src/components/dataviews/index.tsx +108 -43
  265. package/src/components/dataviews/stories/fixtures.tsx +58 -13
  266. package/src/components/dataviews/stories/index.story.tsx +228 -7
  267. package/src/components/dataviews/stories/style.css +24 -3
  268. package/src/components/dataviews/style.scss +27 -0
  269. package/src/components/dataviews-context/index.ts +30 -2
  270. package/src/components/dataviews-filters/filter.tsx +603 -0
  271. package/src/components/dataviews-filters/index.tsx +23 -29
  272. package/src/components/dataviews-filters/input-widget.tsx +91 -0
  273. package/src/components/dataviews-filters/search-widget.tsx +51 -48
  274. package/src/components/dataviews-filters/style.scss +117 -14
  275. package/src/components/dataviews-filters/utils.ts +25 -0
  276. package/src/components/dataviews-item-actions/index.tsx +1 -1
  277. package/src/components/dataviews-layout/index.tsx +8 -1
  278. package/src/components/dataviews-pagination/index.tsx +4 -4
  279. package/src/components/dataviews-selection-checkbox/index.tsx +2 -2
  280. package/src/components/dataviews-view-config/index.tsx +10 -18
  281. package/src/components/stories/index.story.tsx +351 -0
  282. package/src/constants.ts +116 -1
  283. package/src/dataform-controls/boolean.tsx +30 -0
  284. package/src/dataform-controls/checkbox.tsx +31 -0
  285. package/src/dataform-controls/datetime.tsx +106 -2
  286. package/src/dataform-controls/email.tsx +42 -0
  287. package/src/dataform-controls/index.tsx +8 -0
  288. package/src/dataform-controls/integer.tsx +75 -1
  289. package/src/dataform-controls/select.tsx +1 -0
  290. package/src/dataform-controls/style.scss +5 -0
  291. package/src/dataform-controls/text.tsx +2 -1
  292. package/src/dataform-controls/toggle-group.tsx +59 -0
  293. package/src/dataforms-layouts/data-form-layout.tsx +1 -1
  294. package/src/dataforms-layouts/panel/index.tsx +19 -7
  295. package/src/dataforms-layouts/panel/style.scss +8 -1
  296. package/src/dataforms-layouts/regular/index.tsx +50 -17
  297. package/src/dataforms-layouts/regular/style.scss +4 -1
  298. package/src/dataviews-layouts/grid/index.tsx +47 -26
  299. package/src/dataviews-layouts/list/index.tsx +12 -5
  300. package/src/dataviews-layouts/table/column-header-menu.tsx +10 -8
  301. package/src/dataviews-layouts/table/column-primary.tsx +26 -13
  302. package/src/dataviews-layouts/table/index.tsx +74 -10
  303. package/src/dataviews-layouts/table/style.scss +37 -1
  304. package/src/dataviews-layouts/table/use-is-horizontal-scroll-end.ts +82 -0
  305. package/src/dataviews-layouts/utils/item-click-wrapper.tsx +93 -0
  306. package/src/field-types/array.tsx +75 -0
  307. package/src/field-types/boolean.tsx +66 -0
  308. package/src/field-types/datetime.tsx +46 -2
  309. package/src/field-types/email.tsx +79 -0
  310. package/src/field-types/index.tsx +45 -3
  311. package/src/field-types/integer.tsx +53 -2
  312. package/src/field-types/media.tsx +28 -0
  313. package/src/field-types/text.tsx +41 -2
  314. package/src/filter-and-sort-data-view.ts +243 -1
  315. package/src/normalize-fields.ts +116 -13
  316. package/src/test/dataviews.tsx +20 -2
  317. package/src/test/filter-and-sort-data-view.js +507 -0
  318. package/src/test/normalize-fields.ts +155 -0
  319. package/src/types.ts +106 -9
  320. package/src/utils.ts +10 -33
  321. package/tsconfig.json +2 -0
  322. package/tsconfig.tsbuildinfo +1 -1
  323. package/build/components/dataviews-filters/filter-summary.js.map +0 -1
  324. package/build/dataviews-layouts/utils/get-clickable-item-props.js +0 -36
  325. package/build/dataviews-layouts/utils/get-clickable-item-props.js.map +0 -1
  326. package/build-module/components/dataviews-filters/filter-summary.js +0 -218
  327. package/build-module/components/dataviews-filters/filter-summary.js.map +0 -1
  328. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js +0 -30
  329. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js.map +0 -1
  330. package/build-types/components/dataviews-filters/filter-summary.d.ts +0 -14
  331. package/build-types/components/dataviews-filters/filter-summary.d.ts.map +0 -1
  332. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts +0 -19
  333. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts.map +0 -1
  334. package/src/components/dataviews-filters/filter-summary.tsx +0 -338
  335. package/src/dataviews-layouts/utils/get-clickable-item-props.ts +0 -39
@@ -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
 
@@ -45,26 +45,21 @@ import { useInstanceId } from '@wordpress/compose';
45
45
  */
46
46
  import { SORTING_DIRECTIONS, sortIcons, sortLabels } from '../../constants';
47
47
  import { VIEW_LAYOUTS } from '../../dataviews-layouts';
48
- import type { NormalizedField, SupportedLayouts, View } from '../../types';
48
+ import type { NormalizedField, View } from '../../types';
49
49
  import DataViewsContext from '../dataviews-context';
50
50
  import { unlock } from '../../lock-unlock';
51
51
 
52
52
  const { Menu } = unlock( componentsPrivateApis );
53
53
 
54
- interface ViewTypeMenuProps {
55
- defaultLayouts?: SupportedLayouts;
56
- }
57
-
58
54
  const DATAVIEWS_CONFIG_POPOVER_PROPS = {
59
55
  className: 'dataviews-config__popover',
60
56
  placement: 'bottom-end',
61
57
  offset: 9,
62
58
  };
63
59
 
64
- function ViewTypeMenu( {
65
- defaultLayouts = { list: {}, grid: {}, table: {} },
66
- }: ViewTypeMenuProps ) {
67
- const { view, onChangeView } = useContext( DataViewsContext );
60
+ export function ViewTypeMenu() {
61
+ const { view, onChangeView, defaultLayouts } =
62
+ useContext( DataViewsContext );
68
63
  const availableLayouts = Object.keys( defaultLayouts );
69
64
  if ( availableLayouts.length <= 1 ) {
70
65
  return null;
@@ -220,7 +215,8 @@ function SortDirectionControl() {
220
215
 
221
216
  const PAGE_SIZE_VALUES = [ 10, 20, 50, 100 ];
222
217
  function ItemsPerPageControl() {
223
- const { view, onChangeView } = useContext( DataViewsContext );
218
+ const { view, perPageSizes, onChangeView } = useContext( DataViewsContext );
219
+ const pageSizeValues = perPageSizes ?? PAGE_SIZE_VALUES;
224
220
  return (
225
221
  <ToggleGroupControl
226
222
  __nextHasNoMarginBottom
@@ -242,7 +238,7 @@ function ItemsPerPageControl() {
242
238
  } );
243
239
  } }
244
240
  >
245
- { PAGE_SIZE_VALUES.map( ( value ) => {
241
+ { pageSizeValues.map( ( value ) => {
246
242
  return (
247
243
  <ToggleGroupControlOption
248
244
  key={ value }
@@ -761,7 +757,7 @@ function SettingsSection( {
761
757
  );
762
758
  }
763
759
 
764
- function DataviewsViewConfigDropdown() {
760
+ export function DataviewsViewConfigDropdown() {
765
761
  const { view } = useContext( DataViewsContext );
766
762
  const popoverId = useInstanceId(
767
763
  _DataViewsViewConfig,
@@ -815,14 +811,10 @@ function DataviewsViewConfigDropdown() {
815
811
  );
816
812
  }
817
813
 
818
- function _DataViewsViewConfig( {
819
- defaultLayouts = { list: {}, grid: {}, table: {} },
820
- }: {
821
- defaultLayouts?: SupportedLayouts;
822
- } ) {
814
+ function _DataViewsViewConfig() {
823
815
  return (
824
816
  <>
825
- <ViewTypeMenu defaultLayouts={ defaultLayouts } />
817
+ <ViewTypeMenu />
826
818
  <DataviewsViewConfigDropdown />
827
819
  </>
828
820
  );