@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
@@ -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,65 @@ 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
+ | 'media'
98
+ | 'boolean'
99
+ | 'email'
100
+ | 'array';
51
101
 
52
102
  export type ValidationContext = {
53
103
  elements?: Option[];
@@ -70,7 +120,28 @@ export type FieldTypeDefinition< Item > = {
70
120
  /**
71
121
  * Callback used to render an edit control for the field or control name.
72
122
  */
73
- Edit: ComponentType< DataFormControlProps< Item > > | string;
123
+ Edit: ComponentType< DataFormControlProps< Item > > | string | null;
124
+
125
+ /**
126
+ * Callback used to render the field.
127
+ */
128
+ render: ComponentType< DataViewRenderFieldProps< Item > >;
129
+
130
+ /**
131
+ * The filter config for the field.
132
+ */
133
+ filterBy: FilterConfigForType | false;
134
+
135
+ /**
136
+ * Whether the field is readOnly.
137
+ * If `true`, the value will be rendered using the `render` callback.
138
+ */
139
+ readOnly?: boolean;
140
+
141
+ /**
142
+ * Whether the field is sortable.
143
+ */
144
+ enableSorting: boolean;
74
145
  };
75
146
 
76
147
  /**
@@ -156,7 +227,13 @@ export type Field< Item > = {
156
227
  /**
157
228
  * Filter config for the field.
158
229
  */
159
- filterBy?: FilterByConfig | undefined;
230
+ filterBy?: FilterByConfig | false;
231
+
232
+ /**
233
+ * Whether the field is readOnly.
234
+ * If `true`, the value will be rendered using the `render` callback.
235
+ */
236
+ readOnly?: boolean;
160
237
 
161
238
  /**
162
239
  * Callback used to retrieve the value of the field from the item.
@@ -165,16 +242,18 @@ export type Field< Item > = {
165
242
  getValue?: ( args: { item: Item } ) => any;
166
243
  };
167
244
 
168
- export type NormalizedField< Item > = Field< Item > & {
245
+ export type NormalizedField< Item > = Omit< Field< Item >, 'Edit' > & {
169
246
  label: string;
170
247
  header: string | ReactElement;
171
248
  getValue: ( args: { item: Item } ) => any;
172
249
  render: ComponentType< DataViewRenderFieldProps< Item > >;
173
- Edit: ComponentType< DataFormControlProps< Item > >;
250
+ Edit: ComponentType< DataFormControlProps< Item > > | null;
174
251
  sort: ( a: Item, b: Item, direction: SortDirection ) => number;
175
252
  isValid: ( item: Item, context?: ValidationContext ) => boolean;
176
253
  enableHiding: boolean;
177
254
  enableSorting: boolean;
255
+ filterBy: NormalizedFilterByConfig | false;
256
+ readOnly: boolean;
178
257
  };
179
258
 
180
259
  /**
@@ -189,10 +268,17 @@ export type DataFormControlProps< Item > = {
189
268
  field: NormalizedField< Item >;
190
269
  onChange: ( value: Record< string, any > ) => void;
191
270
  hideLabelFromVision?: boolean;
271
+ /**
272
+ * The currently selected filter operator for this field.
273
+ *
274
+ * Used by DataViews filters to determine which control to render based on the operator type.
275
+ */
276
+ operator?: Operator;
192
277
  };
193
278
 
194
279
  export type DataViewRenderFieldProps< Item > = {
195
280
  item: Item;
281
+ field: NormalizedField< Item >;
196
282
  };
197
283
 
198
284
  /**
@@ -349,6 +435,11 @@ export interface ColumnStyle {
349
435
  * The maximum width of the field column.
350
436
  */
351
437
  minWidth?: string | number;
438
+
439
+ /**
440
+ * The alignment of the field column, defaults to left.
441
+ */
442
+ align?: 'start' | 'center' | 'end';
352
443
  }
353
444
 
354
445
  export type Density = 'compact' | 'balanced' | 'comfortable';
@@ -500,6 +591,7 @@ export interface ActionButton< Item > extends ActionBase< Item > {
500
591
  export type Action< Item > = ActionModal< Item > | ActionButton< Item >;
501
592
 
502
593
  export interface ViewBaseProps< Item > {
594
+ className?: string;
503
595
  actions: Action< Item >[];
504
596
  data: Item[];
505
597
  fields: NormalizedField< Item >[];
@@ -511,6 +603,11 @@ export interface ViewBaseProps< Item > {
511
603
  selection: string[];
512
604
  setOpenedFilter: ( fieldId: string ) => void;
513
605
  onClickItem?: ( item: Item ) => void;
606
+ renderItemLink?: (
607
+ props: {
608
+ item: Item;
609
+ } & ComponentProps< 'a' >
610
+ ) => ReactElement;
514
611
  isItemClickable: ( item: Item ) => boolean;
515
612
  view: View;
516
613
  }
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": [