@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
@@ -42,4 +42,159 @@ describe( 'normalizeFields: default getValue', () => {
42
42
  expect( result ).toBe( 'value' );
43
43
  } );
44
44
  } );
45
+ describe( 'filterBy', () => {
46
+ it( 'returns the default field type definition if undefined for untyped field', () => {
47
+ const fields: Field< {} >[] = [
48
+ {
49
+ id: 'user',
50
+ },
51
+ ];
52
+ const normalizedFields = normalizeFields( fields );
53
+ const result = normalizedFields[ 0 ].filterBy;
54
+ expect( result ).toStrictEqual( { operators: [ 'is', 'isNot' ] } );
55
+ } );
56
+ it( 'returns the default field type definition if undefined for untyped field (for primary filters)', () => {
57
+ const fields: Field< {} >[] = [
58
+ {
59
+ id: 'user',
60
+ filterBy: {
61
+ isPrimary: true,
62
+ },
63
+ },
64
+ ];
65
+ const normalizedFields = normalizeFields( fields );
66
+ const result = normalizedFields[ 0 ].filterBy;
67
+ expect( result ).toStrictEqual( {
68
+ isPrimary: true,
69
+ operators: [ 'is', 'isNot' ],
70
+ } );
71
+ } );
72
+
73
+ it( 'returns the field type definition for typed fields', () => {
74
+ const fields: Field< {} >[] = [
75
+ {
76
+ id: 'user',
77
+ type: 'integer',
78
+ },
79
+ ];
80
+ const normalizedFields = normalizeFields( fields );
81
+ const result = normalizedFields[ 0 ].filterBy;
82
+ expect( result ).toStrictEqual( {
83
+ operators: [
84
+ 'is',
85
+ 'isNot',
86
+ 'lessThan',
87
+ 'greaterThan',
88
+ 'lessThanOrEqual',
89
+ 'greaterThanOrEqual',
90
+ 'between',
91
+ ],
92
+ } );
93
+ } );
94
+
95
+ it( 'returns the field type definition for typed fields (for primary filters)', () => {
96
+ const fields: Field< {} >[] = [
97
+ {
98
+ id: 'user',
99
+ type: 'integer',
100
+ filterBy: {
101
+ isPrimary: true,
102
+ },
103
+ },
104
+ ];
105
+ const normalizedFields = normalizeFields( fields );
106
+ const result = normalizedFields[ 0 ].filterBy;
107
+ expect( result ).toStrictEqual( {
108
+ isPrimary: true,
109
+ operators: [
110
+ 'is',
111
+ 'isNot',
112
+ 'lessThan',
113
+ 'greaterThan',
114
+ 'lessThanOrEqual',
115
+ 'greaterThanOrEqual',
116
+ 'between',
117
+ ],
118
+ } );
119
+ } );
120
+
121
+ it( 'returns false if is false', () => {
122
+ const fields: Field< {} >[] = [
123
+ {
124
+ id: 'user',
125
+ filterBy: false,
126
+ },
127
+ ];
128
+ const normalizedFields = normalizeFields( fields );
129
+ const result = normalizedFields[ 0 ].filterBy;
130
+ expect( result ).toBe( false );
131
+ } );
132
+
133
+ it( 'returns the config if it provides one', () => {
134
+ const fields: Field< {} >[] = [
135
+ {
136
+ id: 'user',
137
+ filterBy: {
138
+ isPrimary: true,
139
+ operators: [ 'is', 'isNot' ],
140
+ },
141
+ },
142
+ ];
143
+ const normalizedFields = normalizeFields( fields );
144
+ const result = normalizedFields[ 0 ].filterBy;
145
+ expect( result ).toStrictEqual( {
146
+ isPrimary: true,
147
+ operators: [ 'is', 'isNot' ],
148
+ } );
149
+ } );
150
+
151
+ it( 'returns false if the none of the operators are valid for the type', () => {
152
+ const fields: Field< {} >[] = [
153
+ {
154
+ id: 'user',
155
+ filterBy: {
156
+ // @ts-ignore
157
+ operators: [ 'invalid', 'operator' ],
158
+ },
159
+ },
160
+ ];
161
+ const normalizedFields = normalizeFields( fields );
162
+ const result = normalizedFields[ 0 ].filterBy;
163
+ expect( result ).toBe( false );
164
+ } );
165
+
166
+ it( 'returns false if the list of operators is empty', () => {
167
+ const fields: Field< {} >[] = [
168
+ {
169
+ id: 'user',
170
+ filterBy: {
171
+ operators: [],
172
+ },
173
+ },
174
+ ];
175
+ const normalizedFields = normalizeFields( fields );
176
+ const result = normalizedFields[ 0 ].filterBy;
177
+ expect( result ).toBe( false );
178
+ } );
179
+
180
+ it( 'removes invalid operators for the type', () => {
181
+ const fields: Field< {} >[] = [
182
+ {
183
+ id: 'user',
184
+ type: 'integer',
185
+ filterBy: {
186
+ isPrimary: true,
187
+ // @ts-ignore
188
+ operators: [ 'invalid', 'lessThan' ],
189
+ },
190
+ },
191
+ ];
192
+ const normalizedFields = normalizeFields( fields );
193
+ const result = normalizedFields[ 0 ].filterBy;
194
+ expect( result ).toStrictEqual( {
195
+ isPrimary: true,
196
+ operators: [ 'lessThan' ],
197
+ } );
198
+ } );
199
+ } );
45
200
  } );
package/src/types.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import type { ReactElement, ComponentType } from 'react';
4
+ import type { ReactElement, ComponentType, ComponentProps } from 'react';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
@@ -24,7 +24,7 @@ export interface Option< Value extends any = any > {
24
24
  description?: string;
25
25
  }
26
26
 
27
- interface FilterByConfig {
27
+ export interface FilterByConfig {
28
28
  /**
29
29
  * The list of operators supported by the field.
30
30
  */
@@ -39,15 +39,66 @@ interface FilterByConfig {
39
39
  isPrimary?: boolean;
40
40
  }
41
41
 
42
+ export interface NormalizedFilterByConfig {
43
+ /**
44
+ * The list of operators supported by the field.
45
+ */
46
+ operators: Operator[];
47
+
48
+ /**
49
+ * Whether it is a primary filter.
50
+ *
51
+ * A primary filter is always visible and is not listed in the "Add filter" component,
52
+ * except for the list layout where it behaves like a secondary filter.
53
+ */
54
+ isPrimary?: boolean;
55
+ }
56
+
57
+ interface FilterConfigForType {
58
+ /**
59
+ * What operators are used by default.
60
+ */
61
+ defaultOperators: Operator[];
62
+
63
+ /**
64
+ * What operators are supported by the field.
65
+ */
66
+ validOperators: Operator[];
67
+ }
68
+
42
69
  export type Operator =
43
70
  | 'is'
44
71
  | 'isNot'
45
72
  | 'isAny'
46
73
  | 'isNone'
47
74
  | 'isAll'
48
- | 'isNotAll';
49
-
50
- export type FieldType = 'text' | 'integer' | 'datetime' | 'media';
75
+ | 'isNotAll'
76
+ | 'lessThan'
77
+ | 'greaterThan'
78
+ | 'lessThanOrEqual'
79
+ | 'greaterThanOrEqual'
80
+ | 'before'
81
+ | 'after'
82
+ | 'beforeInc'
83
+ | 'afterInc'
84
+ | 'contains'
85
+ | 'notContains'
86
+ | 'startsWith'
87
+ | 'between'
88
+ | 'on'
89
+ | 'notOn'
90
+ | 'inThePast'
91
+ | 'over';
92
+
93
+ export type FieldType =
94
+ | 'text'
95
+ | 'integer'
96
+ | 'datetime'
97
+ | 'date'
98
+ | 'media'
99
+ | 'boolean'
100
+ | 'email'
101
+ | 'array';
51
102
 
52
103
  export type ValidationContext = {
53
104
  elements?: Option[];
@@ -70,7 +121,28 @@ export type FieldTypeDefinition< Item > = {
70
121
  /**
71
122
  * Callback used to render an edit control for the field or control name.
72
123
  */
73
- Edit: ComponentType< DataFormControlProps< Item > > | string;
124
+ Edit: ComponentType< DataFormControlProps< Item > > | string | null;
125
+
126
+ /**
127
+ * Callback used to render the field.
128
+ */
129
+ render: ComponentType< DataViewRenderFieldProps< Item > >;
130
+
131
+ /**
132
+ * The filter config for the field.
133
+ */
134
+ filterBy: FilterConfigForType | false;
135
+
136
+ /**
137
+ * Whether the field is readOnly.
138
+ * If `true`, the value will be rendered using the `render` callback.
139
+ */
140
+ readOnly?: boolean;
141
+
142
+ /**
143
+ * Whether the field is sortable.
144
+ */
145
+ enableSorting: boolean;
74
146
  };
75
147
 
76
148
  /**
@@ -156,7 +228,13 @@ export type Field< Item > = {
156
228
  /**
157
229
  * Filter config for the field.
158
230
  */
159
- filterBy?: FilterByConfig | undefined;
231
+ filterBy?: FilterByConfig | false;
232
+
233
+ /**
234
+ * Whether the field is readOnly.
235
+ * If `true`, the value will be rendered using the `render` callback.
236
+ */
237
+ readOnly?: boolean;
160
238
 
161
239
  /**
162
240
  * Callback used to retrieve the value of the field from the item.
@@ -165,16 +243,18 @@ export type Field< Item > = {
165
243
  getValue?: ( args: { item: Item } ) => any;
166
244
  };
167
245
 
168
- export type NormalizedField< Item > = Field< Item > & {
246
+ export type NormalizedField< Item > = Omit< Field< Item >, 'Edit' > & {
169
247
  label: string;
170
248
  header: string | ReactElement;
171
249
  getValue: ( args: { item: Item } ) => any;
172
250
  render: ComponentType< DataViewRenderFieldProps< Item > >;
173
- Edit: ComponentType< DataFormControlProps< Item > >;
251
+ Edit: ComponentType< DataFormControlProps< Item > > | null;
174
252
  sort: ( a: Item, b: Item, direction: SortDirection ) => number;
175
253
  isValid: ( item: Item, context?: ValidationContext ) => boolean;
176
254
  enableHiding: boolean;
177
255
  enableSorting: boolean;
256
+ filterBy: NormalizedFilterByConfig | false;
257
+ readOnly: boolean;
178
258
  };
179
259
 
180
260
  /**
@@ -189,10 +269,17 @@ export type DataFormControlProps< Item > = {
189
269
  field: NormalizedField< Item >;
190
270
  onChange: ( value: Record< string, any > ) => void;
191
271
  hideLabelFromVision?: boolean;
272
+ /**
273
+ * The currently selected filter operator for this field.
274
+ *
275
+ * Used by DataViews filters to determine which control to render based on the operator type.
276
+ */
277
+ operator?: Operator;
192
278
  };
193
279
 
194
280
  export type DataViewRenderFieldProps< Item > = {
195
281
  item: Item;
282
+ field: NormalizedField< Item >;
196
283
  };
197
284
 
198
285
  /**
@@ -332,6 +419,11 @@ interface ViewBase {
332
419
  * Whether to show the hierarchical levels.
333
420
  */
334
421
  showLevels?: boolean;
422
+
423
+ /**
424
+ * The field to group by.
425
+ */
426
+ groupByField?: string;
335
427
  }
336
428
 
337
429
  export interface ColumnStyle {
@@ -349,6 +441,11 @@ export interface ColumnStyle {
349
441
  * The maximum width of the field column.
350
442
  */
351
443
  minWidth?: string | number;
444
+
445
+ /**
446
+ * The alignment of the field column, defaults to left.
447
+ */
448
+ align?: 'start' | 'center' | 'end';
352
449
  }
353
450
 
354
451
  export type Density = 'compact' | 'balanced' | 'comfortable';
@@ -500,6 +597,7 @@ export interface ActionButton< Item > extends ActionBase< Item > {
500
597
  export type Action< Item > = ActionModal< Item > | ActionButton< Item >;
501
598
 
502
599
  export interface ViewBaseProps< Item > {
600
+ className?: string;
503
601
  actions: Action< Item >[];
504
602
  data: Item[];
505
603
  fields: NormalizedField< Item >[];
@@ -511,6 +609,11 @@ export interface ViewBaseProps< Item > {
511
609
  selection: string[];
512
610
  setOpenedFilter: ( fieldId: string ) => void;
513
611
  onClickItem?: ( item: Item ) => void;
612
+ renderItemLink?: (
613
+ props: {
614
+ item: Item;
615
+ } & ComponentProps< 'a' >
616
+ ) => ReactElement;
514
617
  isItemClickable: ( item: Item ) => boolean;
515
618
  view: View;
516
619
  }
package/src/utils.ts CHANGED
@@ -1,38 +1,15 @@
1
1
  /**
2
2
  * Internal dependencies
3
3
  */
4
- import {
5
- ALL_OPERATORS,
6
- OPERATOR_IS,
7
- OPERATOR_IS_NOT,
8
- OPERATOR_IS_ANY,
9
- OPERATOR_IS_NONE,
10
- } from './constants';
11
- import type { NormalizedField } from './types';
12
-
13
- export function sanitizeOperators< Item >( field: NormalizedField< Item > ) {
14
- let operators = field.filterBy?.operators;
15
-
16
- // Assign default values.
17
- if ( ! operators || ! Array.isArray( operators ) ) {
18
- operators = [ OPERATOR_IS_ANY, OPERATOR_IS_NONE ];
19
- }
20
-
21
- // Make sure only valid operators are used.
22
- operators = operators.filter( ( operator ) =>
23
- ALL_OPERATORS.includes( operator )
4
+ import type { DataViewRenderFieldProps } from './types';
5
+
6
+ export function renderFromElements< Item >( {
7
+ item,
8
+ field,
9
+ }: DataViewRenderFieldProps< Item > ) {
10
+ const value = field.getValue( { item } );
11
+ return (
12
+ field?.elements?.find( ( element ) => element.value === value )
13
+ ?.label || field.getValue( { item } )
24
14
  );
25
-
26
- // Do not allow mixing single & multiselection operators.
27
- // Remove multiselection operators if any of the single selection ones is present.
28
- if (
29
- operators.includes( OPERATOR_IS ) ||
30
- operators.includes( OPERATOR_IS_NOT )
31
- ) {
32
- operators = operators.filter( ( operator ) =>
33
- [ OPERATOR_IS, OPERATOR_IS_NOT ].includes( operator )
34
- );
35
- }
36
-
37
- return operators;
38
15
  }
package/tsconfig.json CHANGED
@@ -13,11 +13,13 @@
13
13
  { "path": "../components" },
14
14
  { "path": "../compose" },
15
15
  { "path": "../data" },
16
+ { "path": "../date" },
16
17
  { "path": "../element" },
17
18
  { "path": "../i18n" },
18
19
  { "path": "../icons" },
19
20
  { "path": "../primitives" },
20
21
  { "path": "../private-apis" },
22
+ { "path": "../url" },
21
23
  { "path": "../warning" }
22
24
  ],
23
25
  "exclude": [