@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
@@ -1,19 +1,110 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { BaseControl, TimePicker, VisuallyHidden } from '@wordpress/components';
4
+ import {
5
+ BaseControl,
6
+ TimePicker,
7
+ VisuallyHidden,
8
+ SelectControl,
9
+ __experimentalNumberControl as NumberControl,
10
+ __experimentalHStack as HStack,
11
+ } from '@wordpress/components';
5
12
  import { useCallback } from '@wordpress/element';
13
+ import { __ } from '@wordpress/i18n';
6
14
 
7
15
  /**
8
16
  * Internal dependencies
9
17
  */
10
18
  import type { DataFormControlProps } from '../types';
19
+ import { OPERATOR_IN_THE_PAST, OPERATOR_OVER } from '../constants';
20
+
21
+ const TIME_UNITS_OPTIONS = {
22
+ [ OPERATOR_IN_THE_PAST ]: [
23
+ { value: 'days', label: __( 'Days' ) },
24
+ { value: 'weeks', label: __( 'Weeks' ) },
25
+ { value: 'months', label: __( 'Months' ) },
26
+ { value: 'years', label: __( 'Years' ) },
27
+ ],
28
+ [ OPERATOR_OVER ]: [
29
+ { value: 'days', label: __( 'Days ago' ) },
30
+ { value: 'weeks', label: __( 'Weeks ago' ) },
31
+ { value: 'months', label: __( 'Months ago' ) },
32
+ { value: 'years', label: __( 'Years ago' ) },
33
+ ],
34
+ };
35
+
36
+ function RelativeDateControls( {
37
+ id,
38
+ value,
39
+ onChange,
40
+ label,
41
+ hideLabelFromVision,
42
+ options,
43
+ }: {
44
+ id: string;
45
+ value: { value?: string | number; unit?: string };
46
+ onChange: ( value: any ) => void;
47
+ label: string;
48
+ hideLabelFromVision?: boolean;
49
+ options: { value: string; label: string }[];
50
+ } ) {
51
+ const { value: relValue = '', unit = options[ 0 ].value } = value;
52
+
53
+ const onChangeValue = useCallback(
54
+ ( newValue: string | undefined ) =>
55
+ onChange( {
56
+ [ id ]: { value: Number( newValue ), unit },
57
+ } ),
58
+ [ id, onChange, unit ]
59
+ );
60
+
61
+ const onChangeUnit = useCallback(
62
+ ( newUnit: string | undefined ) =>
63
+ onChange( {
64
+ [ id ]: { value: relValue, unit: newUnit },
65
+ } ),
66
+ [ id, onChange, relValue ]
67
+ );
68
+
69
+ return (
70
+ <BaseControl
71
+ id={ id }
72
+ __nextHasNoMarginBottom
73
+ className="dataviews-controls__datetime"
74
+ label={ label }
75
+ hideLabelFromVision={ hideLabelFromVision }
76
+ >
77
+ <HStack spacing={ 2.5 }>
78
+ <NumberControl
79
+ __next40pxDefaultSize
80
+ className="dataviews-controls__datetime-number"
81
+ spinControls="none"
82
+ min={ 1 }
83
+ step={ 1 }
84
+ value={ relValue }
85
+ onChange={ onChangeValue }
86
+ />
87
+ <SelectControl
88
+ className="dataviews-controls__datetime-unit"
89
+ __next40pxDefaultSize
90
+ __nextHasNoMarginBottom
91
+ label={ __( 'Unit' ) }
92
+ value={ unit }
93
+ options={ options }
94
+ onChange={ onChangeUnit }
95
+ hideLabelFromVision
96
+ />
97
+ </HStack>
98
+ </BaseControl>
99
+ );
100
+ }
11
101
 
12
102
  export default function DateTime< Item >( {
13
103
  data,
14
104
  field,
15
105
  onChange,
16
106
  hideLabelFromVision,
107
+ operator,
17
108
  }: DataFormControlProps< Item > ) {
18
109
  const { id, label } = field;
19
110
  const value = field.getValue( { item: data } );
@@ -23,6 +114,19 @@ export default function DateTime< Item >( {
23
114
  [ id, onChange ]
24
115
  );
25
116
 
117
+ if ( operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER ) {
118
+ return (
119
+ <RelativeDateControls
120
+ id={ id }
121
+ value={ value && typeof value === 'object' ? value : {} }
122
+ onChange={ onChange }
123
+ label={ label }
124
+ hideLabelFromVision={ hideLabelFromVision }
125
+ options={ TIME_UNITS_OPTIONS[ operator ] }
126
+ />
127
+ );
128
+ }
129
+
26
130
  return (
27
131
  <fieldset className="dataviews-controls__datetime">
28
132
  { ! hideLabelFromVision && (
@@ -34,7 +138,7 @@ export default function DateTime< Item >( {
34
138
  <VisuallyHidden as="legend">{ label }</VisuallyHidden>
35
139
  ) }
36
140
  <TimePicker
37
- currentTime={ value }
141
+ currentTime={ typeof value === 'string' ? value : undefined }
38
142
  onChange={ onChangeControl }
39
143
  hideLabelFromVision
40
144
  />
@@ -0,0 +1,42 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { TextControl } from '@wordpress/components';
5
+ import { useCallback } from '@wordpress/element';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import type { DataFormControlProps } from '../types';
11
+
12
+ export default function Email< Item >( {
13
+ data,
14
+ field,
15
+ onChange,
16
+ hideLabelFromVision,
17
+ }: DataFormControlProps< Item > ) {
18
+ const { id, label, placeholder, description } = field;
19
+ const value = field.getValue( { item: data } );
20
+
21
+ const onChangeControl = useCallback(
22
+ ( newValue: string ) =>
23
+ onChange( {
24
+ [ id ]: newValue,
25
+ } ),
26
+ [ id, onChange ]
27
+ );
28
+
29
+ return (
30
+ <TextControl
31
+ type="email"
32
+ label={ label }
33
+ placeholder={ placeholder }
34
+ value={ value ?? '' }
35
+ help={ description }
36
+ onChange={ onChangeControl }
37
+ __next40pxDefaultSize
38
+ __nextHasNoMarginBottom
39
+ hideLabelFromVision={ hideLabelFromVision }
40
+ />
41
+ );
42
+ }
@@ -11,22 +11,30 @@ import type {
11
11
  Field,
12
12
  FieldTypeDefinition,
13
13
  } from '../types';
14
+ import checkbox from './checkbox';
14
15
  import datetime from './datetime';
16
+ import email from './email';
15
17
  import integer from './integer';
16
18
  import radio from './radio';
17
19
  import select from './select';
18
20
  import text from './text';
21
+ import toggleGroup from './toggle-group';
22
+ import boolean from './boolean';
19
23
 
20
24
  interface FormControls {
21
25
  [ key: string ]: ComponentType< DataFormControlProps< any > >;
22
26
  }
23
27
 
24
28
  const FORM_CONTROLS: FormControls = {
29
+ boolean,
30
+ checkbox,
25
31
  datetime,
32
+ email,
26
33
  integer,
27
34
  radio,
28
35
  select,
29
36
  text,
37
+ toggleGroup,
30
38
  };
31
39
 
32
40
  export function getControl< Item >(
@@ -1,19 +1,82 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { __experimentalNumberControl as NumberControl } from '@wordpress/components';
4
+ import {
5
+ Flex,
6
+ BaseControl,
7
+ __experimentalNumberControl as NumberControl,
8
+ } from '@wordpress/components';
5
9
  import { useCallback } from '@wordpress/element';
10
+ import { __ } from '@wordpress/i18n';
6
11
 
7
12
  /**
8
13
  * Internal dependencies
9
14
  */
15
+ import { OPERATOR_BETWEEN } from '../constants';
10
16
  import type { DataFormControlProps } from '../types';
11
17
 
18
+ function BetweenControls< Item >( {
19
+ id,
20
+ value,
21
+ onChange,
22
+ hideLabelFromVision,
23
+ }: {
24
+ id: string;
25
+ value: any;
26
+ onChange: DataFormControlProps< Item >[ 'onChange' ];
27
+ hideLabelFromVision?: boolean;
28
+ } ) {
29
+ const [ min = '', max = '' ] = Array.isArray( value ) ? value : [];
30
+
31
+ const onChangeMin = useCallback(
32
+ ( newValue: string | undefined ) =>
33
+ onChange( {
34
+ [ id ]: [ Number( newValue ), max ],
35
+ } ),
36
+ [ id, onChange, max ]
37
+ );
38
+
39
+ const onChangeMax = useCallback(
40
+ ( newValue: string | undefined ) =>
41
+ onChange( {
42
+ [ id ]: [ min, Number( newValue ) ],
43
+ } ),
44
+ [ id, onChange, min ]
45
+ );
46
+
47
+ return (
48
+ <BaseControl
49
+ __nextHasNoMarginBottom
50
+ help={ __( 'The max. value must be greater than the min. value.' ) }
51
+ >
52
+ <Flex direction="row" gap={ 4 }>
53
+ <NumberControl
54
+ label={ __( 'Min.' ) }
55
+ value={ min }
56
+ max={ max ? Number( max ) - 1 : undefined }
57
+ onChange={ onChangeMin }
58
+ __next40pxDefaultSize
59
+ hideLabelFromVision={ hideLabelFromVision }
60
+ />
61
+ <NumberControl
62
+ label={ __( 'Max.' ) }
63
+ value={ max }
64
+ min={ min ? Number( min ) + 1 : undefined }
65
+ onChange={ onChangeMax }
66
+ __next40pxDefaultSize
67
+ hideLabelFromVision={ hideLabelFromVision }
68
+ />
69
+ </Flex>
70
+ </BaseControl>
71
+ );
72
+ }
73
+
12
74
  export default function Integer< Item >( {
13
75
  data,
14
76
  field,
15
77
  onChange,
16
78
  hideLabelFromVision,
79
+ operator,
17
80
  }: DataFormControlProps< Item > ) {
18
81
  const { id, label, description } = field;
19
82
  const value = field.getValue( { item: data } ) ?? '';
@@ -25,6 +88,17 @@ export default function Integer< Item >( {
25
88
  [ id, onChange ]
26
89
  );
27
90
 
91
+ if ( operator === OPERATOR_BETWEEN ) {
92
+ return (
93
+ <BetweenControls
94
+ id={ id }
95
+ value={ value }
96
+ onChange={ onChange }
97
+ hideLabelFromVision={ hideLabelFromVision }
98
+ />
99
+ );
100
+ }
101
+
28
102
  return (
29
103
  <NumberControl
30
104
  label={ label }
@@ -42,6 +42,7 @@ export default function Select< Item >( {
42
42
  <SelectControl
43
43
  label={ label }
44
44
  value={ value }
45
+ help={ field.description }
45
46
  options={ elements }
46
47
  onChange={ onChangeControl }
47
48
  __next40pxDefaultSize
@@ -2,3 +2,8 @@
2
2
  border: none;
3
3
  padding: 0;
4
4
  }
5
+
6
+ .dataviews-controls__datetime-number,
7
+ .dataviews-controls__datetime-unit {
8
+ flex: 1 1 50%;
9
+ }
@@ -15,7 +15,7 @@ export default function Text< Item >( {
15
15
  onChange,
16
16
  hideLabelFromVision,
17
17
  }: DataFormControlProps< Item > ) {
18
- const { id, label, placeholder } = field;
18
+ const { id, label, placeholder, description } = field;
19
19
  const value = field.getValue( { item: data } );
20
20
 
21
21
  const onChangeControl = useCallback(
@@ -31,6 +31,7 @@ export default function Text< Item >( {
31
31
  label={ label }
32
32
  placeholder={ placeholder }
33
33
  value={ value ?? '' }
34
+ help={ description }
34
35
  onChange={ onChangeControl }
35
36
  __next40pxDefaultSize
36
37
  __nextHasNoMarginBottom
@@ -0,0 +1,59 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ __experimentalToggleGroupControl as ToggleGroupControl,
6
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
7
+ } from '@wordpress/components';
8
+ import { useCallback } from '@wordpress/element';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import type { DataFormControlProps } from '../types';
14
+
15
+ export default function ToggleGroup< Item >( {
16
+ data,
17
+ field,
18
+ onChange,
19
+ hideLabelFromVision,
20
+ }: DataFormControlProps< Item > ) {
21
+ const { id } = field;
22
+ const value = field.getValue( { item: data } );
23
+
24
+ const onChangeControl = useCallback(
25
+ ( newValue: string | number | undefined ) =>
26
+ onChange( {
27
+ [ id ]: newValue,
28
+ } ),
29
+ [ id, onChange ]
30
+ );
31
+
32
+ if ( field.elements ) {
33
+ const selectedOption = field.elements.find(
34
+ ( el ) => el.value === value
35
+ );
36
+ return (
37
+ <ToggleGroupControl
38
+ __next40pxDefaultSize
39
+ __nextHasNoMarginBottom
40
+ isBlock
41
+ label={ field.label }
42
+ help={ selectedOption?.description || field.description }
43
+ onChange={ onChangeControl }
44
+ value={ value }
45
+ hideLabelFromVision={ hideLabelFromVision }
46
+ >
47
+ { field.elements.map( ( el ) => (
48
+ <ToggleGroupControlOption
49
+ key={ el.value }
50
+ label={ el.label }
51
+ value={ el.value }
52
+ />
53
+ ) ) }
54
+ </ToggleGroupControl>
55
+ );
56
+ }
57
+
58
+ return null;
59
+ }
@@ -48,7 +48,7 @@ export function DataFormLayout< Item >( {
48
48
  );
49
49
 
50
50
  return (
51
- <VStack spacing={ 4 }>
51
+ <VStack spacing={ form?.type === 'panel' ? 2 : 4 }>
52
52
  { normalizedFormFields.map( ( formField ) => {
53
53
  const FieldLayout = getFormFieldLayout( formField.layout )
54
54
  ?.component;
@@ -1,3 +1,8 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import clsx from 'clsx';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
@@ -134,11 +139,16 @@ function PanelDropdown< Item >( {
134
139
  aria-label={ sprintf(
135
140
  // translators: %s: Field name.
136
141
  _x( 'Edit %s', 'field' ),
137
- fieldLabel
142
+ fieldLabel || ''
138
143
  ) }
139
144
  onClick={ onToggle }
145
+ disabled={ fieldDefinition.readOnly === true }
146
+ accessibleWhenDisabled
140
147
  >
141
- <fieldDefinition.render item={ data } />
148
+ <fieldDefinition.render
149
+ item={ data }
150
+ field={ fieldDefinition }
151
+ />
142
152
  </Button>
143
153
  ) }
144
154
  renderContent={ ( { onClose } ) => (
@@ -188,7 +198,6 @@ export default function FormPanelField< Item >( {
188
198
  }
189
199
  return fieldDef.id === field.id;
190
200
  } );
191
- const labelPosition = field.labelPosition ?? 'side';
192
201
 
193
202
  // Use internal state instead of a ref to make sure that the component
194
203
  // re-renders when the popover's anchor updates.
@@ -200,6 +209,11 @@ export default function FormPanelField< Item >( {
200
209
  return null;
201
210
  }
202
211
 
212
+ const labelPosition = field.labelPosition ?? 'side';
213
+ const labelClassName = clsx(
214
+ 'dataforms-layouts-panel__field-label',
215
+ `dataforms-layouts-panel__field-label--label-position-${ labelPosition }`
216
+ );
203
217
  const fieldLabel = isCombinedField( field )
204
218
  ? field.label
205
219
  : fieldDefinition?.label;
@@ -208,7 +222,7 @@ export default function FormPanelField< Item >( {
208
222
  return (
209
223
  <VStack className="dataforms-layouts-panel__field" spacing={ 0 }>
210
224
  <div
211
- className="dataforms-layouts-panel__field-label"
225
+ className={ labelClassName }
212
226
  style={ { paddingBottom: 0 } }
213
227
  >
214
228
  { fieldLabel }
@@ -248,9 +262,7 @@ export default function FormPanelField< Item >( {
248
262
  ref={ setPopoverAnchor }
249
263
  className="dataforms-layouts-panel__field"
250
264
  >
251
- <div className="dataforms-layouts-panel__field-label">
252
- { fieldLabel }
253
- </div>
265
+ <div className={ labelClassName }>{ fieldLabel }</div>
254
266
  <div className="dataforms-layouts-panel__field-control">
255
267
  <PanelDropdown
256
268
  field={ field }
@@ -13,7 +13,10 @@
13
13
  align-items: center;
14
14
  line-height: $grid-unit-05 * 5;
15
15
  hyphens: auto;
16
- align-self: center;
16
+
17
+ &--label-position-side {
18
+ align-self: center;
19
+ }
17
20
  }
18
21
 
19
22
  .dataforms-layouts-panel__field-control {
@@ -31,6 +34,10 @@
31
34
  min-height: $button-size-compact;
32
35
  }
33
36
 
37
+ &.components-button.is-link[aria-disabled="true"] {
38
+ text-decoration: none;
39
+ }
40
+
34
41
  .components-dropdown {
35
42
  max-width: 100%;
36
43
  }
@@ -1,3 +1,8 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import clsx from 'clsx';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
@@ -79,23 +84,35 @@ export default function FormRegularField< Item >( {
79
84
  ( fieldDef ) => fieldDef.id === field.id
80
85
  );
81
86
 
82
- if ( ! fieldDefinition ) {
87
+ if ( ! fieldDefinition || ! fieldDefinition.Edit ) {
83
88
  return null;
84
89
  }
85
90
  if ( labelPosition === 'side' ) {
86
91
  return (
87
92
  <HStack className="dataforms-layouts-regular__field">
88
- <div className="dataforms-layouts-regular__field-label">
93
+ <div
94
+ className={ clsx(
95
+ 'dataforms-layouts-regular__field-label',
96
+ `dataforms-layouts-regular__field-label--label-position-${ labelPosition }`
97
+ ) }
98
+ >
89
99
  { fieldDefinition.label }
90
100
  </div>
91
101
  <div className="dataforms-layouts-regular__field-control">
92
- <fieldDefinition.Edit
93
- key={ fieldDefinition.id }
94
- data={ data }
95
- field={ fieldDefinition }
96
- onChange={ onChange }
97
- hideLabelFromVision
98
- />
102
+ { fieldDefinition.readOnly === true ? (
103
+ <fieldDefinition.render
104
+ item={ data }
105
+ field={ fieldDefinition }
106
+ />
107
+ ) : (
108
+ <fieldDefinition.Edit
109
+ key={ fieldDefinition.id }
110
+ data={ data }
111
+ field={ fieldDefinition }
112
+ onChange={ onChange }
113
+ hideLabelFromVision
114
+ />
115
+ ) }
99
116
  </div>
100
117
  </HStack>
101
118
  );
@@ -103,14 +120,30 @@ export default function FormRegularField< Item >( {
103
120
 
104
121
  return (
105
122
  <div className="dataforms-layouts-regular__field">
106
- <fieldDefinition.Edit
107
- data={ data }
108
- field={ fieldDefinition }
109
- onChange={ onChange }
110
- hideLabelFromVision={
111
- labelPosition === 'none' ? true : hideLabelFromVision
112
- }
113
- />
123
+ { fieldDefinition.readOnly === true ? (
124
+ <>
125
+ { ! hideLabelFromVision && labelPosition !== 'none' && (
126
+ <div className="dataforms-layouts-regular__field-label">
127
+ { fieldDefinition.label }
128
+ </div>
129
+ ) }
130
+ <div className="dataforms-layouts-regular__field-control">
131
+ <fieldDefinition.render
132
+ item={ data }
133
+ field={ fieldDefinition }
134
+ />
135
+ </div>
136
+ </>
137
+ ) : (
138
+ <fieldDefinition.Edit
139
+ data={ data }
140
+ field={ fieldDefinition }
141
+ onChange={ onChange }
142
+ hideLabelFromVision={
143
+ labelPosition === 'none' ? true : hideLabelFromVision
144
+ }
145
+ />
146
+ ) }
114
147
  </div>
115
148
  );
116
149
  }
@@ -19,7 +19,10 @@
19
19
  align-items: center;
20
20
  line-height: $grid-unit-05 * 5;
21
21
  hyphens: auto;
22
- align-self: center;
22
+
23
+ &--label-position-side {
24
+ align-self: center;
25
+ }
23
26
  }
24
27
 
25
28
  .dataforms-layouts-regular__field-control {