@wordpress/dataviews 4.22.0 → 5.0.1-next.719a03cbe.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +146 -32
  3. package/build/components/dataviews/index.js +71 -37
  4. package/build/components/dataviews/index.js.map +1 -1
  5. package/build/components/dataviews-context/index.js +15 -1
  6. package/build/components/dataviews-context/index.js.map +1 -1
  7. package/build/components/dataviews-filters/{filter-summary.js → filter.js} +108 -17
  8. package/build/components/dataviews-filters/filter.js.map +1 -0
  9. package/build/components/dataviews-filters/index.js +21 -20
  10. package/build/components/dataviews-filters/index.js.map +1 -1
  11. package/build/components/dataviews-filters/input-widget.js +76 -0
  12. package/build/components/dataviews-filters/input-widget.js.map +1 -0
  13. package/build/components/dataviews-filters/search-widget.js +33 -39
  14. package/build/components/dataviews-filters/search-widget.js.map +1 -1
  15. package/build/components/dataviews-filters/utils.js +25 -0
  16. package/build/components/dataviews-filters/utils.js.map +1 -0
  17. package/build/components/dataviews-item-actions/index.js +1 -1
  18. package/build/components/dataviews-item-actions/index.js.map +1 -1
  19. package/build/components/dataviews-layout/index.js +7 -2
  20. package/build/components/dataviews-layout/index.js.map +1 -1
  21. package/build/components/dataviews-pagination/index.js +4 -3
  22. package/build/components/dataviews-pagination/index.js.map +1 -1
  23. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  24. package/build/components/dataviews-view-config/index.js +10 -19
  25. package/build/components/dataviews-view-config/index.js.map +1 -1
  26. package/build/constants.js +83 -2
  27. package/build/constants.js.map +1 -1
  28. package/build/dataform-controls/boolean.js +42 -0
  29. package/build/dataform-controls/boolean.js.map +1 -0
  30. package/build/dataform-controls/checkbox.js +44 -0
  31. package/build/dataform-controls/checkbox.js.map +1 -0
  32. package/build/dataform-controls/datetime.js +96 -2
  33. package/build/dataform-controls/datetime.js.map +1 -1
  34. package/build/dataform-controls/email.js +48 -0
  35. package/build/dataform-controls/email.js.map +1 -0
  36. package/build/dataform-controls/index.js +9 -1
  37. package/build/dataform-controls/index.js.map +1 -1
  38. package/build/dataform-controls/integer.js +49 -1
  39. package/build/dataform-controls/integer.js.map +1 -1
  40. package/build/dataform-controls/select.js +1 -0
  41. package/build/dataform-controls/select.js.map +1 -1
  42. package/build/dataform-controls/text.js +3 -1
  43. package/build/dataform-controls/text.js.map +1 -1
  44. package/build/dataform-controls/toggle-group.js +52 -0
  45. package/build/dataform-controls/toggle-group.js.map +1 -0
  46. package/build/dataforms-layouts/data-form-layout.js +1 -1
  47. package/build/dataforms-layouts/data-form-layout.js.map +1 -1
  48. package/build/dataforms-layouts/panel/index.js +14 -5
  49. package/build/dataforms-layouts/panel/index.js.map +1 -1
  50. package/build/dataforms-layouts/regular/index.js +23 -4
  51. package/build/dataforms-layouts/regular/index.js.map +1 -1
  52. package/build/dataviews-layouts/grid/index.js +31 -25
  53. package/build/dataviews-layouts/grid/index.js.map +1 -1
  54. package/build/dataviews-layouts/list/index.js +11 -6
  55. package/build/dataviews-layouts/list/index.js.map +1 -1
  56. package/build/dataviews-layouts/table/column-header-menu.js +9 -7
  57. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
  58. package/build/dataviews-layouts/table/column-primary.js +18 -13
  59. package/build/dataviews-layouts/table/column-primary.js.map +1 -1
  60. package/build/dataviews-layouts/table/index.js +46 -14
  61. package/build/dataviews-layouts/table/index.js.map +1 -1
  62. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js +65 -0
  63. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -0
  64. package/build/dataviews-layouts/utils/item-click-wrapper.js +77 -0
  65. package/build/dataviews-layouts/utils/item-click-wrapper.js.map +1 -0
  66. package/build/field-types/array.js +62 -0
  67. package/build/field-types/array.js.map +1 -0
  68. package/build/field-types/boolean.js +71 -0
  69. package/build/field-types/boolean.js.map +1 -0
  70. package/build/field-types/datetime.js +19 -1
  71. package/build/field-types/datetime.js.map +1 -1
  72. package/build/field-types/email.js +60 -0
  73. package/build/field-types/email.js.map +1 -0
  74. package/build/field-types/index.js +38 -1
  75. package/build/field-types/index.js.map +1 -1
  76. package/build/field-types/integer.js +23 -1
  77. package/build/field-types/integer.js.map +1 -1
  78. package/build/field-types/media.js +31 -0
  79. package/build/field-types/media.js.map +1 -0
  80. package/build/field-types/text.js +23 -1
  81. package/build/field-types/text.js.map +1 -1
  82. package/build/filter-and-sort-data-view.js +152 -1
  83. package/build/filter-and-sort-data-view.js.map +1 -1
  84. package/build/normalize-fields.js +72 -11
  85. package/build/normalize-fields.js.map +1 -1
  86. package/build/types.js.map +1 -1
  87. package/build/utils.js +11 -19
  88. package/build/utils.js.map +1 -1
  89. package/build-module/components/dataviews/index.js +74 -40
  90. package/build-module/components/dataviews/index.js.map +1 -1
  91. package/build-module/components/dataviews-context/index.js +16 -2
  92. package/build-module/components/dataviews-context/index.js.map +1 -1
  93. package/build-module/components/dataviews-filters/filter.js +309 -0
  94. package/build-module/components/dataviews-filters/filter.js.map +1 -0
  95. package/build-module/components/dataviews-filters/index.js +22 -21
  96. package/build-module/components/dataviews-filters/index.js.map +1 -1
  97. package/build-module/components/dataviews-filters/input-widget.js +69 -0
  98. package/build-module/components/dataviews-filters/input-widget.js.map +1 -0
  99. package/build-module/components/dataviews-filters/search-widget.js +31 -37
  100. package/build-module/components/dataviews-filters/search-widget.js.map +1 -1
  101. package/build-module/components/dataviews-filters/utils.js +18 -0
  102. package/build-module/components/dataviews-filters/utils.js.map +1 -0
  103. package/build-module/components/dataviews-item-actions/index.js +1 -1
  104. package/build-module/components/dataviews-item-actions/index.js.map +1 -1
  105. package/build-module/components/dataviews-layout/index.js +7 -2
  106. package/build-module/components/dataviews-layout/index.js.map +1 -1
  107. package/build-module/components/dataviews-pagination/index.js +4 -4
  108. package/build-module/components/dataviews-pagination/index.js.map +1 -1
  109. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  110. package/build-module/components/dataviews-view-config/index.js +9 -20
  111. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  112. package/build-module/constants.js +82 -1
  113. package/build-module/constants.js.map +1 -1
  114. package/build-module/dataform-controls/boolean.js +35 -0
  115. package/build-module/dataform-controls/boolean.js.map +1 -0
  116. package/build-module/dataform-controls/checkbox.js +37 -0
  117. package/build-module/dataform-controls/checkbox.js.map +1 -0
  118. package/build-module/dataform-controls/datetime.js +98 -3
  119. package/build-module/dataform-controls/datetime.js.map +1 -1
  120. package/build-module/dataform-controls/email.js +41 -0
  121. package/build-module/dataform-controls/email.js.map +1 -0
  122. package/build-module/dataform-controls/index.js +9 -1
  123. package/build-module/dataform-controls/index.js.map +1 -1
  124. package/build-module/dataform-controls/integer.js +51 -3
  125. package/build-module/dataform-controls/integer.js.map +1 -1
  126. package/build-module/dataform-controls/select.js +1 -0
  127. package/build-module/dataform-controls/select.js.map +1 -1
  128. package/build-module/dataform-controls/text.js +3 -1
  129. package/build-module/dataform-controls/text.js.map +1 -1
  130. package/build-module/dataform-controls/toggle-group.js +45 -0
  131. package/build-module/dataform-controls/toggle-group.js.map +1 -0
  132. package/build-module/dataforms-layouts/data-form-layout.js +1 -1
  133. package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
  134. package/build-module/dataforms-layouts/panel/index.js +14 -5
  135. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  136. package/build-module/dataforms-layouts/regular/index.js +23 -4
  137. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  138. package/build-module/dataviews-layouts/grid/index.js +31 -26
  139. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  140. package/build-module/dataviews-layouts/list/index.js +11 -6
  141. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  142. package/build-module/dataviews-layouts/table/column-header-menu.js +9 -7
  143. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  144. package/build-module/dataviews-layouts/table/column-primary.js +18 -12
  145. package/build-module/dataviews-layouts/table/column-primary.js.map +1 -1
  146. package/build-module/dataviews-layouts/table/index.js +47 -16
  147. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  148. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js +58 -0
  149. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -0
  150. package/build-module/dataviews-layouts/utils/item-click-wrapper.js +71 -0
  151. package/build-module/dataviews-layouts/utils/item-click-wrapper.js.map +1 -0
  152. package/build-module/field-types/array.js +57 -0
  153. package/build-module/field-types/array.js.map +1 -0
  154. package/build-module/field-types/boolean.js +65 -0
  155. package/build-module/field-types/boolean.js.map +1 -0
  156. package/build-module/field-types/datetime.js +19 -1
  157. package/build-module/field-types/datetime.js.map +1 -1
  158. package/build-module/field-types/email.js +54 -0
  159. package/build-module/field-types/email.js.map +1 -0
  160. package/build-module/field-types/index.js +38 -1
  161. package/build-module/field-types/index.js.map +1 -1
  162. package/build-module/field-types/integer.js +23 -1
  163. package/build-module/field-types/integer.js.map +1 -1
  164. package/build-module/field-types/media.js +25 -0
  165. package/build-module/field-types/media.js.map +1 -0
  166. package/build-module/field-types/text.js +23 -1
  167. package/build-module/field-types/text.js.map +1 -1
  168. package/build-module/filter-and-sort-data-view.js +153 -2
  169. package/build-module/filter-and-sort-data-view.js.map +1 -1
  170. package/build-module/normalize-fields.js +72 -11
  171. package/build-module/normalize-fields.js.map +1 -1
  172. package/build-module/types.js.map +1 -1
  173. package/build-module/utils.js +10 -17
  174. package/build-module/utils.js.map +1 -1
  175. package/build-style/style-rtl.css +307 -13
  176. package/build-style/style.css +307 -13
  177. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  178. package/build-types/components/dataviews/index.d.ts +24 -3
  179. package/build-types/components/dataviews/index.d.ts.map +1 -1
  180. package/build-types/components/dataviews/stories/fixtures.d.ts +9 -1
  181. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  182. package/build-types/components/dataviews/stories/index.story.d.ts +22 -4
  183. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  184. package/build-types/components/dataviews-context/index.d.ts +14 -1
  185. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  186. package/build-types/components/dataviews-filters/filter.d.ts +15 -0
  187. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -0
  188. package/build-types/components/dataviews-filters/index.d.ts +3 -8
  189. package/build-types/components/dataviews-filters/index.d.ts.map +1 -1
  190. package/build-types/components/dataviews-filters/input-widget.d.ts +13 -0
  191. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -0
  192. package/build-types/components/dataviews-filters/search-widget.d.ts +4 -5
  193. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -1
  194. package/build-types/components/dataviews-filters/utils.d.ts +6 -0
  195. package/build-types/components/dataviews-filters/utils.d.ts.map +1 -0
  196. package/build-types/components/dataviews-layout/index.d.ts +5 -1
  197. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  198. package/build-types/components/dataviews-pagination/index.d.ts +1 -1
  199. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -1
  200. package/build-types/components/dataviews-selection-checkbox/index.d.ts +2 -2
  201. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  202. package/build-types/components/dataviews-view-config/index.d.ts +3 -4
  203. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  204. package/build-types/components/stories/index.story.d.ts +59 -0
  205. package/build-types/components/stories/index.story.d.ts.map +1 -0
  206. package/build-types/constants.d.ts +20 -3
  207. package/build-types/constants.d.ts.map +1 -1
  208. package/build-types/dataform-controls/boolean.d.ts +6 -0
  209. package/build-types/dataform-controls/boolean.d.ts.map +1 -0
  210. package/build-types/dataform-controls/checkbox.d.ts +6 -0
  211. package/build-types/dataform-controls/checkbox.d.ts.map +1 -0
  212. package/build-types/dataform-controls/datetime.d.ts +1 -1
  213. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  214. package/build-types/dataform-controls/email.d.ts +6 -0
  215. package/build-types/dataform-controls/email.d.ts.map +1 -0
  216. package/build-types/dataform-controls/index.d.ts +1 -1
  217. package/build-types/dataform-controls/index.d.ts.map +1 -1
  218. package/build-types/dataform-controls/integer.d.ts +1 -4
  219. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  220. package/build-types/dataform-controls/select.d.ts.map +1 -1
  221. package/build-types/dataform-controls/text.d.ts.map +1 -1
  222. package/build-types/dataform-controls/toggle-group.d.ts +6 -0
  223. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -0
  224. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  225. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  226. package/build-types/dataviews-layouts/grid/index.d.ts +2 -1
  227. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  228. package/build-types/dataviews-layouts/index.d.ts +3 -3
  229. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  230. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
  231. package/build-types/dataviews-layouts/table/column-primary.d.ts +8 -1
  232. package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -1
  233. package/build-types/dataviews-layouts/table/index.d.ts +1 -1
  234. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  235. package/build-types/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts +19 -0
  236. package/build-types/dataviews-layouts/table/use-is-horizontal-scroll-end.d.ts.map +1 -0
  237. package/build-types/dataviews-layouts/utils/item-click-wrapper.d.ts +15 -0
  238. package/build-types/dataviews-layouts/utils/item-click-wrapper.d.ts.map +1 -0
  239. package/build-types/field-types/array.d.ts +7 -0
  240. package/build-types/field-types/array.d.ts.map +1 -0
  241. package/build-types/field-types/boolean.d.ts +19 -0
  242. package/build-types/field-types/boolean.d.ts.map +1 -0
  243. package/build-types/field-types/datetime.d.ts +7 -1
  244. package/build-types/field-types/datetime.d.ts.map +1 -1
  245. package/build-types/field-types/email.d.ts +19 -0
  246. package/build-types/field-types/email.d.ts.map +1 -0
  247. package/build-types/field-types/index.d.ts +2 -10
  248. package/build-types/field-types/index.d.ts.map +1 -1
  249. package/build-types/field-types/integer.d.ts +7 -1
  250. package/build-types/field-types/integer.d.ts.map +1 -1
  251. package/build-types/field-types/media.d.ts +16 -0
  252. package/build-types/field-types/media.d.ts.map +1 -0
  253. package/build-types/field-types/text.d.ts +7 -1
  254. package/build-types/field-types/text.d.ts.map +1 -1
  255. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  256. package/build-types/normalize-fields.d.ts.map +1 -1
  257. package/build-types/types.d.ts +70 -8
  258. package/build-types/types.d.ts.map +1 -1
  259. package/build-types/utils.d.ts +5 -2
  260. package/build-types/utils.d.ts.map +1 -1
  261. package/build-wp/index.js +2545 -994
  262. package/package.json +18 -12
  263. package/src/components/dataform/stories/index.story.tsx +41 -20
  264. package/src/components/dataviews/index.tsx +108 -43
  265. package/src/components/dataviews/stories/fixtures.tsx +58 -13
  266. package/src/components/dataviews/stories/index.story.tsx +228 -7
  267. package/src/components/dataviews/stories/style.css +24 -3
  268. package/src/components/dataviews/style.scss +27 -0
  269. package/src/components/dataviews-context/index.ts +30 -2
  270. package/src/components/dataviews-filters/filter.tsx +603 -0
  271. package/src/components/dataviews-filters/index.tsx +23 -29
  272. package/src/components/dataviews-filters/input-widget.tsx +91 -0
  273. package/src/components/dataviews-filters/search-widget.tsx +51 -48
  274. package/src/components/dataviews-filters/style.scss +117 -14
  275. package/src/components/dataviews-filters/utils.ts +25 -0
  276. package/src/components/dataviews-item-actions/index.tsx +1 -1
  277. package/src/components/dataviews-layout/index.tsx +8 -1
  278. package/src/components/dataviews-pagination/index.tsx +4 -4
  279. package/src/components/dataviews-selection-checkbox/index.tsx +2 -2
  280. package/src/components/dataviews-view-config/index.tsx +10 -18
  281. package/src/components/stories/index.story.tsx +351 -0
  282. package/src/constants.ts +116 -1
  283. package/src/dataform-controls/boolean.tsx +30 -0
  284. package/src/dataform-controls/checkbox.tsx +31 -0
  285. package/src/dataform-controls/datetime.tsx +106 -2
  286. package/src/dataform-controls/email.tsx +42 -0
  287. package/src/dataform-controls/index.tsx +8 -0
  288. package/src/dataform-controls/integer.tsx +75 -1
  289. package/src/dataform-controls/select.tsx +1 -0
  290. package/src/dataform-controls/style.scss +5 -0
  291. package/src/dataform-controls/text.tsx +2 -1
  292. package/src/dataform-controls/toggle-group.tsx +59 -0
  293. package/src/dataforms-layouts/data-form-layout.tsx +1 -1
  294. package/src/dataforms-layouts/panel/index.tsx +19 -7
  295. package/src/dataforms-layouts/panel/style.scss +8 -1
  296. package/src/dataforms-layouts/regular/index.tsx +50 -17
  297. package/src/dataforms-layouts/regular/style.scss +4 -1
  298. package/src/dataviews-layouts/grid/index.tsx +47 -26
  299. package/src/dataviews-layouts/list/index.tsx +12 -5
  300. package/src/dataviews-layouts/table/column-header-menu.tsx +10 -8
  301. package/src/dataviews-layouts/table/column-primary.tsx +26 -13
  302. package/src/dataviews-layouts/table/index.tsx +74 -10
  303. package/src/dataviews-layouts/table/style.scss +37 -1
  304. package/src/dataviews-layouts/table/use-is-horizontal-scroll-end.ts +82 -0
  305. package/src/dataviews-layouts/utils/item-click-wrapper.tsx +93 -0
  306. package/src/field-types/array.tsx +75 -0
  307. package/src/field-types/boolean.tsx +66 -0
  308. package/src/field-types/datetime.tsx +46 -2
  309. package/src/field-types/email.tsx +79 -0
  310. package/src/field-types/index.tsx +45 -3
  311. package/src/field-types/integer.tsx +53 -2
  312. package/src/field-types/media.tsx +28 -0
  313. package/src/field-types/text.tsx +41 -2
  314. package/src/filter-and-sort-data-view.ts +243 -1
  315. package/src/normalize-fields.ts +116 -13
  316. package/src/test/dataviews.tsx +20 -2
  317. package/src/test/filter-and-sort-data-view.js +507 -0
  318. package/src/test/normalize-fields.ts +155 -0
  319. package/src/types.ts +106 -9
  320. package/src/utils.ts +10 -33
  321. package/tsconfig.json +2 -0
  322. package/tsconfig.tsbuildinfo +1 -1
  323. package/build/components/dataviews-filters/filter-summary.js.map +0 -1
  324. package/build/dataviews-layouts/utils/get-clickable-item-props.js +0 -36
  325. package/build/dataviews-layouts/utils/get-clickable-item-props.js.map +0 -1
  326. package/build-module/components/dataviews-filters/filter-summary.js +0 -218
  327. package/build-module/components/dataviews-filters/filter-summary.js.map +0 -1
  328. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js +0 -30
  329. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js.map +0 -1
  330. package/build-types/components/dataviews-filters/filter-summary.d.ts +0 -14
  331. package/build-types/components/dataviews-filters/filter-summary.d.ts.map +0 -1
  332. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts +0 -19
  333. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts.map +0 -1
  334. package/src/components/dataviews-filters/filter-summary.tsx +0 -338
  335. package/src/dataviews-layouts/utils/get-clickable-item-props.ts +0 -39
@@ -0,0 +1,66 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type {
10
+ DataViewRenderFieldProps,
11
+ SortDirection,
12
+ FieldTypeDefinition,
13
+ } from '../types';
14
+ import { renderFromElements } from '../utils';
15
+ import { OPERATOR_IS, OPERATOR_IS_NOT } from '../constants';
16
+
17
+ function sort( a: any, b: any, direction: SortDirection ) {
18
+ const boolA = Boolean( a );
19
+ const boolB = Boolean( b );
20
+
21
+ if ( boolA === boolB ) {
22
+ return 0;
23
+ }
24
+
25
+ // In ascending order, false comes before true
26
+ if ( direction === 'asc' ) {
27
+ return boolA ? 1 : -1;
28
+ }
29
+
30
+ // In descending order, true comes before false
31
+ return boolA ? -1 : 1;
32
+ }
33
+
34
+ function isValid( value: any ) {
35
+ if ( ! [ true, false, undefined ].includes( value ) ) {
36
+ return false;
37
+ }
38
+
39
+ return true;
40
+ }
41
+
42
+ export default {
43
+ sort,
44
+ isValid,
45
+ Edit: 'boolean',
46
+ render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
47
+ if ( field.elements ) {
48
+ return renderFromElements( { item, field } );
49
+ }
50
+
51
+ if ( field.getValue( { item } ) === true ) {
52
+ return __( 'True' );
53
+ }
54
+
55
+ if ( field.getValue( { item } ) === false ) {
56
+ return __( 'False' );
57
+ }
58
+
59
+ return null;
60
+ },
61
+ enableSorting: true,
62
+ filterBy: {
63
+ defaultOperators: [ OPERATOR_IS, OPERATOR_IS_NOT ],
64
+ validOperators: [ OPERATOR_IS, OPERATOR_IS_NOT ],
65
+ },
66
+ } satisfies FieldTypeDefinition< any >;
@@ -1,7 +1,23 @@
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_ON,
13
+ OPERATOR_NOT_ON,
14
+ OPERATOR_BEFORE,
15
+ OPERATOR_AFTER,
16
+ OPERATOR_BEFORE_INC,
17
+ OPERATOR_AFTER_INC,
18
+ OPERATOR_IN_THE_PAST,
19
+ OPERATOR_OVER,
20
+ } from '../constants';
5
21
 
6
22
  function sort( a: any, b: any, direction: SortDirection ) {
7
23
  const timeA = new Date( a ).getTime();
@@ -25,4 +41,32 @@ export default {
25
41
  sort,
26
42
  isValid,
27
43
  Edit: 'datetime',
28
- };
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: [
52
+ OPERATOR_ON,
53
+ OPERATOR_NOT_ON,
54
+ OPERATOR_BEFORE,
55
+ OPERATOR_AFTER,
56
+ OPERATOR_BEFORE_INC,
57
+ OPERATOR_AFTER_INC,
58
+ OPERATOR_IN_THE_PAST,
59
+ OPERATOR_OVER,
60
+ ],
61
+ validOperators: [
62
+ OPERATOR_ON,
63
+ OPERATOR_NOT_ON,
64
+ OPERATOR_BEFORE,
65
+ OPERATOR_AFTER,
66
+ OPERATOR_BEFORE_INC,
67
+ OPERATOR_AFTER_INC,
68
+ OPERATOR_IN_THE_PAST,
69
+ OPERATOR_OVER,
70
+ ],
71
+ },
72
+ } satisfies FieldTypeDefinition< any >;
@@ -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,22 @@
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 boolean } from './boolean';
16
+ import { default as media } from './media';
17
+ import { default as array } from './array';
18
+ import { renderFromElements } from '../utils';
19
+ import { ALL_OPERATORS, OPERATOR_IS, OPERATOR_IS_NOT } from '../constants';
8
20
 
9
21
  /**
10
22
  *
@@ -12,7 +24,13 @@ import { default as datetime } from './datetime';
12
24
  *
13
25
  * @return A field type definition.
14
26
  */
15
- export default function getFieldTypeDefinition( type?: FieldType ) {
27
+ export default function getFieldTypeDefinition< Item >(
28
+ type?: FieldType
29
+ ): FieldTypeDefinition< Item > {
30
+ if ( 'email' === type ) {
31
+ return email;
32
+ }
33
+
16
34
  if ( 'integer' === type ) {
17
35
  return integer;
18
36
  }
@@ -25,6 +43,20 @@ export default function getFieldTypeDefinition( type?: FieldType ) {
25
43
  return datetime;
26
44
  }
27
45
 
46
+ if ( 'boolean' === type ) {
47
+ return boolean;
48
+ }
49
+
50
+ if ( 'media' === type ) {
51
+ return media;
52
+ }
53
+
54
+ if ( 'array' === type ) {
55
+ return array;
56
+ }
57
+
58
+ // This is a fallback for fields that don't provide a type.
59
+ // It can be removed when the field.type is mandatory.
28
60
  return {
29
61
  sort: ( a: any, b: any, direction: SortDirection ) => {
30
62
  if ( typeof a === 'number' && typeof b === 'number' ) {
@@ -45,6 +77,16 @@ export default function getFieldTypeDefinition( type?: FieldType ) {
45
77
 
46
78
  return true;
47
79
  },
48
- Edit: () => null,
80
+ Edit: null,
81
+ render: ( { item, field }: DataViewRenderFieldProps< Item > ) => {
82
+ return field.elements
83
+ ? renderFromElements( { item, field } )
84
+ : field.getValue( { item } );
85
+ },
86
+ enableSorting: true,
87
+ filterBy: {
88
+ defaultOperators: [ OPERATOR_IS, OPERATOR_IS_NOT ],
89
+ validOperators: ALL_OPERATORS,
90
+ },
49
91
  };
50
92
  }
@@ -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,12 +165,210 @@ 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
  } );