@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,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 {
@@ -2,6 +2,7 @@
2
2
  * External dependencies
3
3
  */
4
4
  import clsx from 'clsx';
5
+ import type { ComponentProps, ReactElement } from 'react';
5
6
 
6
7
  /**
7
8
  * WordPress dependencies
@@ -35,7 +36,7 @@ import type {
35
36
  ViewGridProps,
36
37
  } from '../../types';
37
38
  import type { SetSelection } from '../../private-types';
38
- import getClickableItemProps from '../utils/get-clickable-item-props';
39
+ import { ItemClickWrapper } from '../utils/item-click-wrapper';
39
40
  import { useUpdatedPreviewSizeOnViewportChange } from './preview-size-picker';
40
41
  const { Badge } = unlock( componentsPrivateApis );
41
42
 
@@ -45,6 +46,11 @@ interface GridItemProps< Item > {
45
46
  onChangeSelection: SetSelection;
46
47
  getItemId: ( item: Item ) => string;
47
48
  onClickItem?: ( item: Item ) => void;
49
+ renderItemLink?: (
50
+ props: {
51
+ item: Item;
52
+ } & ComponentProps< 'a' >
53
+ ) => ReactElement;
48
54
  isItemClickable: ( item: Item ) => boolean;
49
55
  item: Item;
50
56
  actions: Action< Item >[];
@@ -62,6 +68,7 @@ function GridItem< Item >( {
62
68
  onChangeSelection,
63
69
  onClickItem,
64
70
  isItemClickable,
71
+ renderItemLink,
65
72
  getItemId,
66
73
  item,
67
74
  actions,
@@ -78,27 +85,13 @@ function GridItem< Item >( {
78
85
  const instanceId = useInstanceId( GridItem );
79
86
  const isSelected = selection.includes( id );
80
87
  const renderedMediaField = mediaField?.render ? (
81
- <mediaField.render item={ item } />
88
+ <mediaField.render item={ item } field={ mediaField } />
82
89
  ) : null;
83
90
  const renderedTitleField =
84
91
  showTitle && titleField?.render ? (
85
- <titleField.render item={ item } />
92
+ <titleField.render item={ item } field={ titleField } />
86
93
  ) : null;
87
94
 
88
- const clickableMediaItemProps = getClickableItemProps( {
89
- item,
90
- isItemClickable,
91
- onClickItem,
92
- className: 'dataviews-view-grid__media',
93
- } );
94
-
95
- const clickableTitleItemProps = getClickableItemProps( {
96
- item,
97
- isItemClickable,
98
- onClickItem,
99
- className: 'dataviews-view-grid__title-field dataviews-title-field',
100
- } );
101
-
102
95
  let mediaA11yProps;
103
96
  let titleA11yProps;
104
97
  if ( isItemClickable( item ) && onClickItem ) {
@@ -139,9 +132,16 @@ function GridItem< Item >( {
139
132
  } }
140
133
  >
141
134
  { showMedia && renderedMediaField && (
142
- <div { ...clickableMediaItemProps } { ...mediaA11yProps }>
135
+ <ItemClickWrapper
136
+ item={ item }
137
+ isItemClickable={ isItemClickable }
138
+ onClickItem={ onClickItem }
139
+ renderItemLink={ renderItemLink }
140
+ className="dataviews-view-grid__media"
141
+ { ...mediaA11yProps }
142
+ >
143
143
  { renderedMediaField }
144
- </div>
144
+ </ItemClickWrapper>
145
145
  ) }
146
146
  { hasBulkActions && showMedia && renderedMediaField && (
147
147
  <DataViewsSelectionCheckbox
@@ -157,16 +157,26 @@ function GridItem< Item >( {
157
157
  justify="space-between"
158
158
  className="dataviews-view-grid__title-actions"
159
159
  >
160
- <div { ...clickableTitleItemProps } { ...titleA11yProps }>
160
+ <ItemClickWrapper
161
+ item={ item }
162
+ isItemClickable={ isItemClickable }
163
+ onClickItem={ onClickItem }
164
+ renderItemLink={ renderItemLink }
165
+ className="dataviews-view-grid__title-field dataviews-title-field"
166
+ { ...titleA11yProps }
167
+ >
161
168
  { renderedTitleField }
162
- </div>
169
+ </ItemClickWrapper>
163
170
  { !! actions?.length && (
164
171
  <ItemActions item={ item } actions={ actions } isCompact />
165
172
  ) }
166
173
  </HStack>
167
174
  <VStack spacing={ 1 }>
168
175
  { showDescription && descriptionField?.render && (
169
- <descriptionField.render item={ item } />
176
+ <descriptionField.render
177
+ item={ item }
178
+ field={ descriptionField }
179
+ />
170
180
  ) }
171
181
  { !! badgeFields?.length && (
172
182
  <HStack
@@ -182,7 +192,10 @@ function GridItem< Item >( {
182
192
  key={ field.id }
183
193
  className="dataviews-view-grid__field-value"
184
194
  >
185
- <field.render item={ item } />
195
+ <field.render
196
+ item={ item }
197
+ field={ field }
198
+ />
186
199
  </Badge>
187
200
  );
188
201
  } ) }
@@ -212,7 +225,10 @@ function GridItem< Item >( {
212
225
  className="dataviews-view-grid__field-value"
213
226
  style={ { maxHeight: 'none' } }
214
227
  >
215
- <field.render item={ item } />
228
+ <field.render
229
+ item={ item }
230
+ field={ field }
231
+ />
216
232
  </FlexItem>
217
233
  </>
218
234
  </Flex>
@@ -225,7 +241,7 @@ function GridItem< Item >( {
225
241
  );
226
242
  }
227
243
 
228
- export default function ViewGrid< Item >( {
244
+ function ViewGrid< Item >( {
229
245
  actions,
230
246
  data,
231
247
  fields,
@@ -234,8 +250,10 @@ export default function ViewGrid< Item >( {
234
250
  onChangeSelection,
235
251
  onClickItem,
236
252
  isItemClickable,
253
+ renderItemLink,
237
254
  selection,
238
255
  view,
256
+ className,
239
257
  }: ViewGridProps< Item > ) {
240
258
  const titleField = fields.find(
241
259
  ( field ) => field.id === view?.titleField
@@ -282,7 +300,7 @@ export default function ViewGrid< Item >( {
282
300
  gap={ 8 }
283
301
  columns={ 2 }
284
302
  alignment="top"
285
- className="dataviews-view-grid"
303
+ className={ clsx( 'dataviews-view-grid', className ) }
286
304
  style={ gridStyle }
287
305
  aria-busy={ isLoading }
288
306
  >
@@ -295,6 +313,7 @@ export default function ViewGrid< Item >( {
295
313
  onChangeSelection={ onChangeSelection }
296
314
  onClickItem={ onClickItem }
297
315
  isItemClickable={ isItemClickable }
316
+ renderItemLink={ renderItemLink }
298
317
  getItemId={ getItemId }
299
318
  item={ item }
300
319
  actions={ actions }
@@ -322,3 +341,5 @@ export default function ViewGrid< Item >( {
322
341
  </>
323
342
  );
324
343
  }
344
+
345
+ export default ViewGrid;