@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
@@ -0,0 +1,79 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { isEmail } from '@wordpress/url';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type {
10
+ DataViewRenderFieldProps,
11
+ SortDirection,
12
+ ValidationContext,
13
+ FieldTypeDefinition,
14
+ } from '../types';
15
+ import { renderFromElements } from '../utils';
16
+ import {
17
+ OPERATOR_IS,
18
+ OPERATOR_IS_ALL,
19
+ OPERATOR_IS_NOT_ALL,
20
+ OPERATOR_IS_ANY,
21
+ OPERATOR_IS_NONE,
22
+ OPERATOR_IS_NOT,
23
+ OPERATOR_CONTAINS,
24
+ OPERATOR_NOT_CONTAINS,
25
+ OPERATOR_STARTS_WITH,
26
+ } from '../constants';
27
+
28
+ function sort( valueA: any, valueB: any, direction: SortDirection ) {
29
+ return direction === 'asc'
30
+ ? valueA.localeCompare( valueB )
31
+ : valueB.localeCompare( valueA );
32
+ }
33
+
34
+ function isValid( value: any, context?: ValidationContext ) {
35
+ // TODO: this implicitly means the value is required.
36
+ if ( value === '' ) {
37
+ return false;
38
+ }
39
+
40
+ if ( ! isEmail( value ) ) {
41
+ return false;
42
+ }
43
+
44
+ if ( context?.elements ) {
45
+ const validValues = context?.elements?.map( ( f ) => f.value );
46
+ if ( ! validValues.includes( value ) ) {
47
+ return false;
48
+ }
49
+ }
50
+
51
+ return true;
52
+ }
53
+
54
+ export default {
55
+ sort,
56
+ isValid,
57
+ Edit: 'email',
58
+ render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
59
+ return field.elements
60
+ ? renderFromElements( { item, field } )
61
+ : field.getValue( { item } );
62
+ },
63
+ enableSorting: true,
64
+ filterBy: {
65
+ defaultOperators: [ OPERATOR_IS_ANY, OPERATOR_IS_NONE ],
66
+ validOperators: [
67
+ OPERATOR_IS,
68
+ OPERATOR_IS_NOT,
69
+ OPERATOR_CONTAINS,
70
+ OPERATOR_NOT_CONTAINS,
71
+ OPERATOR_STARTS_WITH,
72
+ // Multiple selection
73
+ OPERATOR_IS_ANY,
74
+ OPERATOR_IS_NONE,
75
+ OPERATOR_IS_ALL,
76
+ OPERATOR_IS_NOT_ALL,
77
+ ],
78
+ },
79
+ } satisfies FieldTypeDefinition< any >;
@@ -1,10 +1,23 @@
1
1
  /**
2
2
  * Internal dependencies
3
3
  */
4
- import type { FieldType, SortDirection, ValidationContext } from '../types';
4
+ import type {
5
+ DataViewRenderFieldProps,
6
+ FieldType,
7
+ FieldTypeDefinition,
8
+ SortDirection,
9
+ ValidationContext,
10
+ } from '../types';
11
+ import { default as email } from './email';
5
12
  import { default as integer } from './integer';
6
13
  import { default as text } from './text';
7
14
  import { default as datetime } from './datetime';
15
+ import { default as date } from './date';
16
+ import { default as boolean } from './boolean';
17
+ import { default as media } from './media';
18
+ import { default as array } from './array';
19
+ import { renderFromElements } from '../utils';
20
+ import { ALL_OPERATORS, OPERATOR_IS, OPERATOR_IS_NOT } from '../constants';
8
21
 
9
22
  /**
10
23
  *
@@ -12,7 +25,13 @@ import { default as datetime } from './datetime';
12
25
  *
13
26
  * @return A field type definition.
14
27
  */
15
- export default function getFieldTypeDefinition( type?: FieldType ) {
28
+ export default function getFieldTypeDefinition< Item >(
29
+ type?: FieldType
30
+ ): FieldTypeDefinition< Item > {
31
+ if ( 'email' === type ) {
32
+ return email;
33
+ }
34
+
16
35
  if ( 'integer' === type ) {
17
36
  return integer;
18
37
  }
@@ -25,6 +44,24 @@ export default function getFieldTypeDefinition( type?: FieldType ) {
25
44
  return datetime;
26
45
  }
27
46
 
47
+ if ( 'date' === type ) {
48
+ return date;
49
+ }
50
+
51
+ if ( 'boolean' === type ) {
52
+ return boolean;
53
+ }
54
+
55
+ if ( 'media' === type ) {
56
+ return media;
57
+ }
58
+
59
+ if ( 'array' === type ) {
60
+ return array;
61
+ }
62
+
63
+ // This is a fallback for fields that don't provide a type.
64
+ // It can be removed when the field.type is mandatory.
28
65
  return {
29
66
  sort: ( a: any, b: any, direction: SortDirection ) => {
30
67
  if ( typeof a === 'number' && typeof b === 'number' ) {
@@ -45,6 +82,16 @@ export default function getFieldTypeDefinition( type?: FieldType ) {
45
82
 
46
83
  return true;
47
84
  },
48
- Edit: () => null,
85
+ Edit: null,
86
+ render: ( { item, field }: DataViewRenderFieldProps< Item > ) => {
87
+ return field.elements
88
+ ? renderFromElements( { item, field } )
89
+ : field.getValue( { item } );
90
+ },
91
+ enableSorting: true,
92
+ filterBy: {
93
+ defaultOperators: [ OPERATOR_IS, OPERATOR_IS_NOT ],
94
+ validOperators: ALL_OPERATORS,
95
+ },
49
96
  };
50
97
  }
@@ -1,7 +1,26 @@
1
1
  /**
2
2
  * Internal dependencies
3
3
  */
4
- import type { SortDirection, ValidationContext } from '../types';
4
+ import type {
5
+ DataViewRenderFieldProps,
6
+ SortDirection,
7
+ ValidationContext,
8
+ FieldTypeDefinition,
9
+ } from '../types';
10
+ import { renderFromElements } from '../utils';
11
+ import {
12
+ OPERATOR_IS,
13
+ OPERATOR_IS_NOT,
14
+ OPERATOR_LESS_THAN,
15
+ OPERATOR_GREATER_THAN,
16
+ OPERATOR_LESS_THAN_OR_EQUAL,
17
+ OPERATOR_GREATER_THAN_OR_EQUAL,
18
+ OPERATOR_IS_ANY,
19
+ OPERATOR_IS_NONE,
20
+ OPERATOR_IS_ALL,
21
+ OPERATOR_IS_NOT_ALL,
22
+ OPERATOR_BETWEEN,
23
+ } from '../constants';
5
24
 
6
25
  function sort( a: any, b: any, direction: SortDirection ) {
7
26
  return direction === 'asc' ? a - b : b - a;
@@ -31,4 +50,36 @@ export default {
31
50
  sort,
32
51
  isValid,
33
52
  Edit: 'integer',
34
- };
53
+ render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
54
+ return field.elements
55
+ ? renderFromElements( { item, field } )
56
+ : field.getValue( { item } );
57
+ },
58
+ enableSorting: true,
59
+ filterBy: {
60
+ defaultOperators: [
61
+ OPERATOR_IS,
62
+ OPERATOR_IS_NOT,
63
+ OPERATOR_LESS_THAN,
64
+ OPERATOR_GREATER_THAN,
65
+ OPERATOR_LESS_THAN_OR_EQUAL,
66
+ OPERATOR_GREATER_THAN_OR_EQUAL,
67
+ OPERATOR_BETWEEN,
68
+ ],
69
+ validOperators: [
70
+ // Single-selection
71
+ OPERATOR_IS,
72
+ OPERATOR_IS_NOT,
73
+ OPERATOR_LESS_THAN,
74
+ OPERATOR_GREATER_THAN,
75
+ OPERATOR_LESS_THAN_OR_EQUAL,
76
+ OPERATOR_GREATER_THAN_OR_EQUAL,
77
+ OPERATOR_BETWEEN,
78
+ // Multiple-selection
79
+ OPERATOR_IS_ANY,
80
+ OPERATOR_IS_NONE,
81
+ OPERATOR_IS_ALL,
82
+ OPERATOR_IS_NOT_ALL,
83
+ ],
84
+ },
85
+ } satisfies FieldTypeDefinition< any >;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import type { ValidationContext, FieldTypeDefinition } from '../types';
5
+
6
+ function sort() {
7
+ return 0;
8
+ }
9
+
10
+ function isValid( value: any, context?: ValidationContext ) {
11
+ if ( context?.elements ) {
12
+ const validValues = context?.elements.map( ( f ) => f.value );
13
+ if ( ! validValues.includes( value ) ) {
14
+ return false;
15
+ }
16
+ }
17
+
18
+ return true;
19
+ }
20
+
21
+ export default {
22
+ sort,
23
+ isValid,
24
+ Edit: null,
25
+ render: () => null,
26
+ enableSorting: false,
27
+ filterBy: false,
28
+ } satisfies FieldTypeDefinition< any >;
@@ -1,7 +1,24 @@
1
1
  /**
2
2
  * Internal dependencies
3
3
  */
4
- import type { SortDirection, ValidationContext } from '../types';
4
+ import type {
5
+ DataViewRenderFieldProps,
6
+ SortDirection,
7
+ ValidationContext,
8
+ FieldTypeDefinition,
9
+ } from '../types';
10
+ import { renderFromElements } from '../utils';
11
+ import {
12
+ OPERATOR_CONTAINS,
13
+ OPERATOR_IS,
14
+ OPERATOR_IS_ALL,
15
+ OPERATOR_IS_ANY,
16
+ OPERATOR_IS_NONE,
17
+ OPERATOR_IS_NOT,
18
+ OPERATOR_IS_NOT_ALL,
19
+ OPERATOR_NOT_CONTAINS,
20
+ OPERATOR_STARTS_WITH,
21
+ } from '../constants';
5
22
 
6
23
  function sort( valueA: any, valueB: any, direction: SortDirection ) {
7
24
  return direction === 'asc'
@@ -24,4 +41,26 @@ export default {
24
41
  sort,
25
42
  isValid,
26
43
  Edit: 'text',
27
- };
44
+ render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
45
+ return field.elements
46
+ ? renderFromElements( { item, field } )
47
+ : field.getValue( { item } );
48
+ },
49
+ enableSorting: true,
50
+ filterBy: {
51
+ defaultOperators: [ OPERATOR_IS_ANY, OPERATOR_IS_NONE ],
52
+ validOperators: [
53
+ // Single selection
54
+ OPERATOR_IS,
55
+ OPERATOR_IS_NOT,
56
+ OPERATOR_CONTAINS,
57
+ OPERATOR_NOT_CONTAINS,
58
+ OPERATOR_STARTS_WITH,
59
+ // Multiple selection
60
+ OPERATOR_IS_ANY,
61
+ OPERATOR_IS_NONE,
62
+ OPERATOR_IS_ALL,
63
+ OPERATOR_IS_NOT_ALL,
64
+ ],
65
+ },
66
+ } satisfies FieldTypeDefinition< any >;
@@ -2,6 +2,12 @@
2
2
  * External dependencies
3
3
  */
4
4
  import removeAccents from 'remove-accents';
5
+ import { subDays, subWeeks, subMonths, subYears } from 'date-fns';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+ import { getDate } from '@wordpress/date';
5
11
 
6
12
  /**
7
13
  * Internal dependencies
@@ -13,6 +19,22 @@ import {
13
19
  OPERATOR_IS_ANY,
14
20
  OPERATOR_IS_ALL,
15
21
  OPERATOR_IS_NOT_ALL,
22
+ OPERATOR_LESS_THAN,
23
+ OPERATOR_GREATER_THAN,
24
+ OPERATOR_LESS_THAN_OR_EQUAL,
25
+ OPERATOR_GREATER_THAN_OR_EQUAL,
26
+ OPERATOR_BEFORE,
27
+ OPERATOR_AFTER,
28
+ OPERATOR_BEFORE_INC,
29
+ OPERATOR_AFTER_INC,
30
+ OPERATOR_CONTAINS,
31
+ OPERATOR_NOT_CONTAINS,
32
+ OPERATOR_STARTS_WITH,
33
+ OPERATOR_BETWEEN,
34
+ OPERATOR_ON,
35
+ OPERATOR_NOT_ON,
36
+ OPERATOR_IN_THE_PAST,
37
+ OPERATOR_OVER,
16
38
  } from './constants';
17
39
  import { normalizeFields } from './normalize-fields';
18
40
  import type { Field, View } from './types';
@@ -23,6 +45,28 @@ function normalizeSearchInput( input = '' ) {
23
45
 
24
46
  const EMPTY_ARRAY: [] = [];
25
47
 
48
+ /**
49
+ * Calculates a date offset from now.
50
+ *
51
+ * @param value Number of units to offset.
52
+ * @param unit Unit of time to offset.
53
+ * @return Date offset from now.
54
+ */
55
+ function getRelativeDate( value: number, unit: string ): Date {
56
+ switch ( unit ) {
57
+ case 'days':
58
+ return subDays( new Date(), value );
59
+ case 'weeks':
60
+ return subWeeks( new Date(), value );
61
+ case 'months':
62
+ return subMonths( new Date(), value );
63
+ case 'years':
64
+ return subYears( new Date(), value );
65
+ default:
66
+ return new Date();
67
+ }
68
+ }
69
+
26
70
  /**
27
71
  * Applies the filtering, sorting and pagination to the raw data based on the view configuration.
28
72
  *
@@ -121,28 +165,244 @@ export function filterSortAndPaginate< Item >(
121
165
  } );
122
166
  } else if ( filter.operator === OPERATOR_IS ) {
123
167
  filteredData = filteredData.filter( ( item ) => {
124
- return filter.value === field.getValue( { item } );
168
+ return (
169
+ filter.value === field.getValue( { item } ) ||
170
+ filter.value === undefined
171
+ );
125
172
  } );
126
173
  } else if ( filter.operator === OPERATOR_IS_NOT ) {
127
174
  filteredData = filteredData.filter( ( item ) => {
128
175
  return filter.value !== field.getValue( { item } );
129
176
  } );
177
+ } else if (
178
+ filter.operator === OPERATOR_ON &&
179
+ filter.value !== undefined
180
+ ) {
181
+ const filterDate = getDate( filter.value );
182
+ filteredData = filteredData.filter( ( item ) => {
183
+ const fieldDate = getDate( field.getValue( { item } ) );
184
+ return filterDate.getTime() === fieldDate.getTime();
185
+ } );
186
+ } else if (
187
+ filter.operator === OPERATOR_NOT_ON &&
188
+ filter.value !== undefined
189
+ ) {
190
+ const filterDate = getDate( filter.value );
191
+ filteredData = filteredData.filter( ( item ) => {
192
+ const fieldDate = getDate( field.getValue( { item } ) );
193
+ return filterDate.getTime() !== fieldDate.getTime();
194
+ } );
195
+ } else if (
196
+ filter.operator === OPERATOR_LESS_THAN &&
197
+ filter.value !== undefined
198
+ ) {
199
+ filteredData = filteredData.filter( ( item ) => {
200
+ const fieldValue = field.getValue( { item } );
201
+ return fieldValue < filter.value;
202
+ } );
203
+ } else if (
204
+ filter.operator === OPERATOR_GREATER_THAN &&
205
+ filter.value !== undefined
206
+ ) {
207
+ filteredData = filteredData.filter( ( item ) => {
208
+ const fieldValue = field.getValue( { item } );
209
+ return fieldValue > filter.value;
210
+ } );
211
+ } else if (
212
+ filter.operator === OPERATOR_LESS_THAN_OR_EQUAL &&
213
+ filter.value !== undefined
214
+ ) {
215
+ filteredData = filteredData.filter( ( item ) => {
216
+ const fieldValue = field.getValue( { item } );
217
+ return fieldValue <= filter.value;
218
+ } );
219
+ } else if (
220
+ filter.operator === OPERATOR_GREATER_THAN_OR_EQUAL &&
221
+ filter.value !== undefined
222
+ ) {
223
+ filteredData = filteredData.filter( ( item ) => {
224
+ const fieldValue = field.getValue( { item } );
225
+ return fieldValue >= filter.value;
226
+ } );
227
+ } else if (
228
+ filter.operator === OPERATOR_CONTAINS &&
229
+ filter?.value !== undefined
230
+ ) {
231
+ filteredData = filteredData.filter( ( item ) => {
232
+ const fieldValue = field.getValue( { item } );
233
+ return (
234
+ typeof fieldValue === 'string' &&
235
+ filter.value &&
236
+ fieldValue
237
+ .toLowerCase()
238
+ .includes(
239
+ String( filter.value ).toLowerCase()
240
+ )
241
+ );
242
+ } );
243
+ } else if (
244
+ filter.operator === OPERATOR_NOT_CONTAINS &&
245
+ filter?.value !== undefined
246
+ ) {
247
+ filteredData = filteredData.filter( ( item ) => {
248
+ const fieldValue = field.getValue( { item } );
249
+ return (
250
+ typeof fieldValue === 'string' &&
251
+ filter.value &&
252
+ ! fieldValue
253
+ .toLowerCase()
254
+ .includes(
255
+ String( filter.value ).toLowerCase()
256
+ )
257
+ );
258
+ } );
259
+ } else if (
260
+ filter.operator === OPERATOR_STARTS_WITH &&
261
+ filter?.value !== undefined
262
+ ) {
263
+ filteredData = filteredData.filter( ( item ) => {
264
+ const fieldValue = field.getValue( { item } );
265
+ return (
266
+ typeof fieldValue === 'string' &&
267
+ filter.value &&
268
+ fieldValue
269
+ .toLowerCase()
270
+ .startsWith(
271
+ String( filter.value ).toLowerCase()
272
+ )
273
+ );
274
+ } );
275
+ } else if (
276
+ filter.operator === OPERATOR_BEFORE &&
277
+ filter.value !== undefined
278
+ ) {
279
+ const filterValue = getDate( filter.value );
280
+ filteredData = filteredData.filter( ( item ) => {
281
+ const fieldValue = getDate(
282
+ field.getValue( { item } )
283
+ );
284
+ return fieldValue < filterValue;
285
+ } );
286
+ } else if (
287
+ filter.operator === OPERATOR_AFTER &&
288
+ filter.value !== undefined
289
+ ) {
290
+ const filterValue = getDate( filter.value );
291
+ filteredData = filteredData.filter( ( item ) => {
292
+ const fieldValue = getDate(
293
+ field.getValue( { item } )
294
+ );
295
+ return fieldValue > filterValue;
296
+ } );
297
+ } else if (
298
+ filter.operator === OPERATOR_BEFORE_INC &&
299
+ filter.value !== undefined
300
+ ) {
301
+ const filterValue = getDate( filter.value );
302
+ filteredData = filteredData.filter( ( item ) => {
303
+ const fieldValue = getDate(
304
+ field.getValue( { item } )
305
+ );
306
+ return fieldValue <= filterValue;
307
+ } );
308
+ } else if (
309
+ filter.operator === OPERATOR_AFTER_INC &&
310
+ filter.value !== undefined
311
+ ) {
312
+ const filterValue = getDate( filter.value );
313
+ filteredData = filteredData.filter( ( item ) => {
314
+ const fieldValue = getDate(
315
+ field.getValue( { item } )
316
+ );
317
+ return fieldValue >= filterValue;
318
+ } );
319
+ } else if (
320
+ filter.operator === OPERATOR_BETWEEN &&
321
+ Array.isArray( filter.value ) &&
322
+ filter.value.length === 2 &&
323
+ filter.value[ 0 ] !== undefined &&
324
+ filter.value[ 1 ] !== undefined
325
+ ) {
326
+ filteredData = filteredData.filter( ( item ) => {
327
+ const fieldValue = field.getValue( { item } );
328
+ if (
329
+ typeof fieldValue === 'number' ||
330
+ fieldValue instanceof Date ||
331
+ typeof fieldValue === 'string'
332
+ ) {
333
+ return (
334
+ fieldValue >= filter.value[ 0 ] &&
335
+ fieldValue <= filter.value[ 1 ]
336
+ );
337
+ }
338
+ return false;
339
+ } );
340
+ } else if (
341
+ filter.operator === OPERATOR_IN_THE_PAST &&
342
+ filter.value?.value !== undefined &&
343
+ filter.value?.unit !== undefined
344
+ ) {
345
+ const targetDate = getRelativeDate(
346
+ filter.value.value,
347
+ filter.value.unit
348
+ );
349
+ filteredData = filteredData.filter( ( item ) => {
350
+ const fieldValue = getDate(
351
+ field.getValue( { item } )
352
+ );
353
+ return (
354
+ fieldValue >= targetDate && fieldValue <= new Date()
355
+ );
356
+ } );
357
+ } else if (
358
+ filter.operator === OPERATOR_OVER &&
359
+ filter.value?.value !== undefined &&
360
+ filter.value?.unit !== undefined
361
+ ) {
362
+ const targetDate = getRelativeDate(
363
+ filter.value.value,
364
+ filter.value.unit
365
+ );
366
+ filteredData = filteredData.filter( ( item ) => {
367
+ const fieldValue = getDate(
368
+ field.getValue( { item } )
369
+ );
370
+ return fieldValue < targetDate;
371
+ } );
130
372
  }
131
373
  }
132
374
  } );
133
375
  }
134
376
 
135
377
  // Handle sorting.
136
- if ( view.sort ) {
137
- const fieldId = view.sort.field;
138
- const fieldToSort = _fields.find( ( field ) => {
139
- return field.id === fieldId;
378
+ const sortByField = view.sort?.field
379
+ ? _fields.find( ( field ) => {
380
+ return field.id === view.sort?.field;
381
+ } )
382
+ : null;
383
+ const groupByField = view.groupByField
384
+ ? _fields.find( ( field ) => {
385
+ return field.id === view.groupByField;
386
+ } )
387
+ : null;
388
+ if ( sortByField || groupByField ) {
389
+ filteredData.sort( ( a, b ) => {
390
+ if ( groupByField ) {
391
+ const groupCompare = groupByField.sort( a, b, 'asc' );
392
+
393
+ // If items are in different groups, return the group comparison result.
394
+ // Otherwise, fall back to sorting by the sort field.
395
+ if ( groupCompare !== 0 ) {
396
+ return groupCompare;
397
+ }
398
+ }
399
+
400
+ if ( sortByField ) {
401
+ return sortByField.sort( a, b, view.sort?.direction ?? 'desc' );
402
+ }
403
+
404
+ return 0;
140
405
  } );
141
- if ( fieldToSort ) {
142
- filteredData.sort( ( a, b ) => {
143
- return fieldToSort.sort( a, b, view.sort?.direction ?? 'desc' );
144
- } );
145
- }
146
406
  }
147
407
 
148
408
  // Handle pagination.