@wordpress/dataviews 8.0.2-next.836ecdcae.0 → 9.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 (322) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/README.md +127 -13
  3. package/build/components/dataviews-filters/input-widget.js +48 -4
  4. package/build/components/dataviews-filters/input-widget.js.map +1 -1
  5. package/build/components/dataviews-layout/index.js +3 -1
  6. package/build/components/dataviews-layout/index.js.map +1 -1
  7. package/build/dataform-controls/array.js +9 -7
  8. package/build/dataform-controls/array.js.map +1 -1
  9. package/build/dataform-controls/checkbox.js +40 -8
  10. package/build/dataform-controls/checkbox.js.map +1 -1
  11. package/build/dataform-controls/color.js +133 -0
  12. package/build/dataform-controls/color.js.map +1 -0
  13. package/build/dataform-controls/date.js +32 -24
  14. package/build/dataform-controls/date.js.map +1 -1
  15. package/build/dataform-controls/datetime.js +133 -19
  16. package/build/dataform-controls/datetime.js.map +1 -1
  17. package/build/dataform-controls/email.js +15 -3
  18. package/build/dataform-controls/email.js.map +1 -1
  19. package/build/dataform-controls/index.js +33 -2
  20. package/build/dataform-controls/index.js.map +1 -1
  21. package/build/dataform-controls/integer.js +47 -34
  22. package/build/dataform-controls/integer.js.map +1 -1
  23. package/build/dataform-controls/password.js +47 -0
  24. package/build/dataform-controls/password.js.map +1 -0
  25. package/build/dataform-controls/radio.js +42 -9
  26. package/build/dataform-controls/radio.js.map +1 -1
  27. package/build/dataform-controls/relative-date-control.js +6 -10
  28. package/build/dataform-controls/relative-date-control.js.map +1 -1
  29. package/build/dataform-controls/select.js +41 -10
  30. package/build/dataform-controls/select.js.map +1 -1
  31. package/build/dataform-controls/telephone.js +15 -3
  32. package/build/dataform-controls/telephone.js.map +1 -1
  33. package/build/dataform-controls/text.js +16 -4
  34. package/build/dataform-controls/text.js.map +1 -1
  35. package/build/dataform-controls/textarea.js +81 -0
  36. package/build/dataform-controls/textarea.js.map +1 -0
  37. package/build/dataform-controls/toggle-group.js +36 -6
  38. package/build/dataform-controls/toggle-group.js.map +1 -1
  39. package/build/dataform-controls/toggle.js +77 -0
  40. package/build/dataform-controls/toggle.js.map +1 -0
  41. package/build/dataform-controls/url.js +40 -0
  42. package/build/dataform-controls/url.js.map +1 -0
  43. package/build/dataform-controls/utils/validated-input.js +83 -0
  44. package/build/dataform-controls/utils/validated-input.js.map +1 -0
  45. package/build/dataforms-layouts/card/index.js +0 -4
  46. package/build/dataforms-layouts/card/index.js.map +1 -1
  47. package/build/dataforms-layouts/data-form-layout.js +16 -4
  48. package/build/dataforms-layouts/data-form-layout.js.map +1 -1
  49. package/build/dataforms-layouts/index.js +31 -1
  50. package/build/dataforms-layouts/index.js.map +1 -1
  51. package/build/dataforms-layouts/panel/dropdown.js +10 -14
  52. package/build/dataforms-layouts/panel/dropdown.js.map +1 -1
  53. package/build/dataforms-layouts/panel/index.js +24 -11
  54. package/build/dataforms-layouts/panel/index.js.map +1 -1
  55. package/build/dataforms-layouts/panel/modal.js +22 -27
  56. package/build/dataforms-layouts/panel/modal.js.map +1 -1
  57. package/build/dataforms-layouts/panel/summary-button.js +67 -0
  58. package/build/dataforms-layouts/panel/summary-button.js.map +1 -0
  59. package/build/dataforms-layouts/regular/index.js +7 -9
  60. package/build/dataforms-layouts/regular/index.js.map +1 -1
  61. package/build/dataforms-layouts/row/index.js +113 -0
  62. package/build/dataforms-layouts/row/index.js.map +1 -0
  63. package/build/dataviews-layouts/grid/index.js +5 -15
  64. package/build/dataviews-layouts/grid/index.js.map +1 -1
  65. package/build/dataviews-layouts/list/index.js +47 -2
  66. package/build/dataviews-layouts/list/index.js.map +1 -1
  67. package/build/dataviews-layouts/picker-grid/index.js +5 -15
  68. package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
  69. package/build/dataviews-layouts/table/index.js +5 -17
  70. package/build/dataviews-layouts/table/index.js.map +1 -1
  71. package/build/dataviews-layouts/utils/get-data-by-group.js +23 -0
  72. package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  73. package/build/field-types/boolean.js +1 -1
  74. package/build/field-types/boolean.js.map +1 -1
  75. package/build/field-types/color.js +113 -0
  76. package/build/field-types/color.js.map +1 -0
  77. package/build/field-types/index.js +12 -0
  78. package/build/field-types/index.js.map +1 -1
  79. package/build/field-types/password.js +51 -0
  80. package/build/field-types/password.js.map +1 -0
  81. package/build/field-types/url.js +57 -0
  82. package/build/field-types/url.js.map +1 -0
  83. package/build/normalize-fields.js +17 -0
  84. package/build/normalize-fields.js.map +1 -1
  85. package/build/normalize-form-fields.js +6 -0
  86. package/build/normalize-form-fields.js.map +1 -1
  87. package/build/types.js.map +1 -1
  88. package/build/validation.js +1 -1
  89. package/build/validation.js.map +1 -1
  90. package/build-module/components/dataviews-filters/input-widget.js +48 -4
  91. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  92. package/build-module/components/dataviews-layout/index.js +3 -1
  93. package/build-module/components/dataviews-layout/index.js.map +1 -1
  94. package/build-module/dataform-controls/array.js +9 -7
  95. package/build-module/dataform-controls/array.js.map +1 -1
  96. package/build-module/dataform-controls/checkbox.js +41 -9
  97. package/build-module/dataform-controls/checkbox.js.map +1 -1
  98. package/build-module/dataform-controls/color.js +126 -0
  99. package/build-module/dataform-controls/color.js.map +1 -0
  100. package/build-module/dataform-controls/date.js +32 -24
  101. package/build-module/dataform-controls/date.js.map +1 -1
  102. package/build-module/dataform-controls/datetime.js +135 -21
  103. package/build-module/dataform-controls/datetime.js.map +1 -1
  104. package/build-module/dataform-controls/email.js +14 -2
  105. package/build-module/dataform-controls/email.js.map +1 -1
  106. package/build-module/dataform-controls/index.js +33 -2
  107. package/build-module/dataform-controls/index.js.map +1 -1
  108. package/build-module/dataform-controls/integer.js +46 -34
  109. package/build-module/dataform-controls/integer.js.map +1 -1
  110. package/build-module/dataform-controls/password.js +38 -0
  111. package/build-module/dataform-controls/password.js.map +1 -0
  112. package/build-module/dataform-controls/radio.js +44 -11
  113. package/build-module/dataform-controls/radio.js.map +1 -1
  114. package/build-module/dataform-controls/relative-date-control.js +6 -10
  115. package/build-module/dataform-controls/relative-date-control.js.map +1 -1
  116. package/build-module/dataform-controls/select.js +43 -12
  117. package/build-module/dataform-controls/select.js.map +1 -1
  118. package/build-module/dataform-controls/telephone.js +14 -2
  119. package/build-module/dataform-controls/telephone.js.map +1 -1
  120. package/build-module/dataform-controls/text.js +15 -3
  121. package/build-module/dataform-controls/text.js.map +1 -1
  122. package/build-module/dataform-controls/textarea.js +74 -0
  123. package/build-module/dataform-controls/textarea.js.map +1 -0
  124. package/build-module/dataform-controls/toggle-group.js +38 -8
  125. package/build-module/dataform-controls/toggle-group.js.map +1 -1
  126. package/build-module/dataform-controls/toggle.js +70 -0
  127. package/build-module/dataform-controls/toggle.js.map +1 -0
  128. package/build-module/dataform-controls/url.js +33 -0
  129. package/build-module/dataform-controls/url.js.map +1 -0
  130. package/build-module/dataform-controls/utils/validated-input.js +76 -0
  131. package/build-module/dataform-controls/utils/validated-input.js.map +1 -0
  132. package/build-module/dataforms-layouts/card/index.js +0 -4
  133. package/build-module/dataforms-layouts/card/index.js.map +1 -1
  134. package/build-module/dataforms-layouts/data-form-layout.js +14 -4
  135. package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
  136. package/build-module/dataforms-layouts/index.js +32 -1
  137. package/build-module/dataforms-layouts/index.js.map +1 -1
  138. package/build-module/dataforms-layouts/panel/dropdown.js +10 -15
  139. package/build-module/dataforms-layouts/panel/dropdown.js.map +1 -1
  140. package/build-module/dataforms-layouts/panel/index.js +24 -11
  141. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  142. package/build-module/dataforms-layouts/panel/modal.js +22 -28
  143. package/build-module/dataforms-layouts/panel/modal.js.map +1 -1
  144. package/build-module/dataforms-layouts/panel/summary-button.js +60 -0
  145. package/build-module/dataforms-layouts/panel/summary-button.js.map +1 -0
  146. package/build-module/dataforms-layouts/regular/index.js +8 -10
  147. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  148. package/build-module/dataforms-layouts/row/index.js +106 -0
  149. package/build-module/dataforms-layouts/row/index.js.map +1 -0
  150. package/build-module/dataviews-layouts/grid/index.js +6 -16
  151. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  152. package/build-module/dataviews-layouts/list/index.js +48 -3
  153. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  154. package/build-module/dataviews-layouts/picker-grid/index.js +6 -16
  155. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
  156. package/build-module/dataviews-layouts/table/index.js +5 -17
  157. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  158. package/build-module/dataviews-layouts/utils/get-data-by-group.js +17 -0
  159. package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  160. package/build-module/field-types/boolean.js +1 -1
  161. package/build-module/field-types/boolean.js.map +1 -1
  162. package/build-module/field-types/color.js +107 -0
  163. package/build-module/field-types/color.js.map +1 -0
  164. package/build-module/field-types/index.js +12 -0
  165. package/build-module/field-types/index.js.map +1 -1
  166. package/build-module/field-types/password.js +46 -0
  167. package/build-module/field-types/password.js.map +1 -0
  168. package/build-module/field-types/url.js +51 -0
  169. package/build-module/field-types/url.js.map +1 -0
  170. package/build-module/normalize-fields.js +15 -0
  171. package/build-module/normalize-fields.js.map +1 -1
  172. package/build-module/normalize-form-fields.js +6 -0
  173. package/build-module/normalize-form-fields.js.map +1 -1
  174. package/build-module/types.js.map +1 -1
  175. package/build-module/validation.js +1 -1
  176. package/build-module/validation.js.map +1 -1
  177. package/build-style/style-rtl.css +13 -6
  178. package/build-style/style.css +13 -6
  179. package/build-types/components/dataform/stories/index.story.d.ts +21 -17
  180. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  181. package/build-types/components/dataviews/stories/fixtures.d.ts +4 -2
  182. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  183. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  184. package/build-types/dataform-controls/array.d.ts.map +1 -1
  185. package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
  186. package/build-types/dataform-controls/color.d.ts +6 -0
  187. package/build-types/dataform-controls/color.d.ts.map +1 -0
  188. package/build-types/dataform-controls/date.d.ts.map +1 -1
  189. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  190. package/build-types/dataform-controls/email.d.ts.map +1 -1
  191. package/build-types/dataform-controls/index.d.ts +1 -1
  192. package/build-types/dataform-controls/index.d.ts.map +1 -1
  193. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  194. package/build-types/dataform-controls/password.d.ts +3 -0
  195. package/build-types/dataform-controls/password.d.ts.map +1 -0
  196. package/build-types/dataform-controls/radio.d.ts.map +1 -1
  197. package/build-types/dataform-controls/relative-date-control.d.ts +6 -5
  198. package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -1
  199. package/build-types/dataform-controls/select.d.ts.map +1 -1
  200. package/build-types/dataform-controls/telephone.d.ts.map +1 -1
  201. package/build-types/dataform-controls/text.d.ts +1 -1
  202. package/build-types/dataform-controls/text.d.ts.map +1 -1
  203. package/build-types/dataform-controls/textarea.d.ts +6 -0
  204. package/build-types/dataform-controls/textarea.d.ts.map +1 -0
  205. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
  206. package/build-types/dataform-controls/toggle.d.ts +6 -0
  207. package/build-types/dataform-controls/toggle.d.ts.map +1 -0
  208. package/build-types/dataform-controls/url.d.ts +6 -0
  209. package/build-types/dataform-controls/url.d.ts.map +1 -0
  210. package/build-types/dataform-controls/utils/validated-input.d.ts +20 -0
  211. package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -0
  212. package/build-types/dataforms-layouts/card/index.d.ts +0 -3
  213. package/build-types/dataforms-layouts/card/index.d.ts.map +1 -1
  214. package/build-types/dataforms-layouts/data-form-layout.d.ts +4 -1
  215. package/build-types/dataforms-layouts/data-form-layout.d.ts.map +1 -1
  216. package/build-types/dataforms-layouts/index.d.ts +10 -0
  217. package/build-types/dataforms-layouts/index.d.ts.map +1 -1
  218. package/build-types/dataforms-layouts/panel/dropdown.d.ts +2 -1
  219. package/build-types/dataforms-layouts/panel/dropdown.d.ts.map +1 -1
  220. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  221. package/build-types/dataforms-layouts/panel/modal.d.ts +2 -1
  222. package/build-types/dataforms-layouts/panel/modal.d.ts.map +1 -1
  223. package/build-types/dataforms-layouts/panel/summary-button.d.ts +15 -0
  224. package/build-types/dataforms-layouts/panel/summary-button.d.ts.map +1 -0
  225. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  226. package/build-types/dataforms-layouts/row/index.d.ts +6 -0
  227. package/build-types/dataforms-layouts/row/index.d.ts.map +1 -0
  228. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  229. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  230. package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  231. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  232. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts +6 -0
  233. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts.map +1 -0
  234. package/build-types/field-types/color.d.ts +20 -0
  235. package/build-types/field-types/color.d.ts.map +1 -0
  236. package/build-types/field-types/index.d.ts.map +1 -1
  237. package/build-types/field-types/password.d.ts +17 -0
  238. package/build-types/field-types/password.d.ts.map +1 -0
  239. package/build-types/field-types/stories/index.story.d.ts +13 -1
  240. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  241. package/build-types/field-types/url.d.ts +20 -0
  242. package/build-types/field-types/url.d.ts.map +1 -0
  243. package/build-types/normalize-fields.d.ts +3 -0
  244. package/build-types/normalize-fields.d.ts.map +1 -1
  245. package/build-types/normalize-form-fields.d.ts.map +1 -1
  246. package/build-types/types.d.ts +78 -7
  247. package/build-types/types.d.ts.map +1 -1
  248. package/build-types/validation.d.ts.map +1 -1
  249. package/build-wp/index.js +2577 -1708
  250. package/package.json +17 -15
  251. package/src/components/dataform/stories/index.story.tsx +794 -27
  252. package/src/components/dataviews/stories/fixtures.tsx +99 -41
  253. package/src/components/dataviews/stories/index.story.tsx +2 -2
  254. package/src/components/dataviews-filters/input-widget.tsx +44 -5
  255. package/src/components/dataviews-layout/index.tsx +1 -1
  256. package/src/components/dataviews-picker/stories/index.story.tsx +1 -1
  257. package/src/dataform-controls/array.tsx +4 -6
  258. package/src/dataform-controls/checkbox.tsx +54 -7
  259. package/src/dataform-controls/color.tsx +148 -0
  260. package/src/dataform-controls/date.tsx +47 -21
  261. package/src/dataform-controls/datetime.tsx +171 -23
  262. package/src/dataform-controls/email.tsx +22 -2
  263. package/src/dataform-controls/index.tsx +36 -2
  264. package/src/dataform-controls/integer.tsx +82 -49
  265. package/src/dataform-controls/password.tsx +50 -0
  266. package/src/dataform-controls/radio.tsx +53 -11
  267. package/src/dataform-controls/relative-date-control.tsx +11 -10
  268. package/src/dataform-controls/select.tsx +53 -10
  269. package/src/dataform-controls/telephone.tsx +22 -2
  270. package/src/dataform-controls/text.tsx +19 -2
  271. package/src/dataform-controls/textarea.tsx +85 -0
  272. package/src/dataform-controls/toggle-group.tsx +50 -10
  273. package/src/dataform-controls/toggle.tsx +79 -0
  274. package/src/dataform-controls/url.tsx +38 -0
  275. package/src/dataform-controls/utils/validated-input.tsx +109 -0
  276. package/src/dataforms-layouts/card/index.tsx +0 -4
  277. package/src/dataforms-layouts/data-form-layout.tsx +15 -3
  278. package/src/dataforms-layouts/index.tsx +35 -0
  279. package/src/dataforms-layouts/panel/dropdown.tsx +12 -23
  280. package/src/dataforms-layouts/panel/index.tsx +39 -16
  281. package/src/dataforms-layouts/panel/modal.tsx +24 -30
  282. package/src/dataforms-layouts/panel/summary-button.tsx +92 -0
  283. package/src/dataforms-layouts/regular/index.tsx +9 -7
  284. package/src/dataforms-layouts/regular/style.scss +0 -6
  285. package/src/dataforms-layouts/row/index.tsx +115 -0
  286. package/src/dataforms-layouts/row/style.scss +3 -0
  287. package/src/dataviews-layouts/grid/index.tsx +9 -14
  288. package/src/dataviews-layouts/grid/style.scss +1 -0
  289. package/src/dataviews-layouts/list/index.tsx +74 -2
  290. package/src/dataviews-layouts/list/style.scss +8 -0
  291. package/src/dataviews-layouts/picker-grid/index.tsx +9 -13
  292. package/src/dataviews-layouts/table/index.tsx +10 -14
  293. package/src/dataviews-layouts/utils/get-data-by-group.ts +18 -0
  294. package/src/field-types/boolean.tsx +1 -1
  295. package/src/field-types/color.tsx +115 -0
  296. package/src/field-types/index.tsx +15 -0
  297. package/src/field-types/password.tsx +46 -0
  298. package/src/field-types/stories/index.story.tsx +234 -3
  299. package/src/field-types/url.tsx +71 -0
  300. package/src/normalize-fields.ts +18 -0
  301. package/src/normalize-form-fields.ts +6 -0
  302. package/src/style.scss +1 -0
  303. package/src/test/dataform.tsx +2 -2
  304. package/src/test/filter-and-sort-data-view.js +148 -138
  305. package/src/test/normalize-fields.ts +114 -0
  306. package/src/types.ts +89 -6
  307. package/src/validation.ts +5 -0
  308. package/tsconfig.tsbuildinfo +1 -1
  309. package/build/dataform-controls/boolean.js +0 -64
  310. package/build/dataform-controls/boolean.js.map +0 -1
  311. package/build/dataform-controls/utils/validated-text.js +0 -68
  312. package/build/dataform-controls/utils/validated-text.js.map +0 -1
  313. package/build-module/dataform-controls/boolean.js +0 -58
  314. package/build-module/dataform-controls/boolean.js.map +0 -1
  315. package/build-module/dataform-controls/utils/validated-text.js +0 -62
  316. package/build-module/dataform-controls/utils/validated-text.js.map +0 -1
  317. package/build-types/dataform-controls/boolean.d.ts +0 -6
  318. package/build-types/dataform-controls/boolean.d.ts.map +0 -1
  319. package/build-types/dataform-controls/utils/validated-text.d.ts +0 -12
  320. package/build-types/dataform-controls/utils/validated-text.d.ts.map +0 -1
  321. package/src/dataform-controls/boolean.tsx +0 -61
  322. package/src/dataform-controls/utils/validated-text.tsx +0 -79
@@ -0,0 +1,50 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Button } from '@wordpress/components';
5
+ import { useCallback, useState } from '@wordpress/element';
6
+ import { __ } from '@wordpress/i18n';
7
+ import { seen, unseen } from '@wordpress/icons';
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import ValidatedText from './utils/validated-input';
12
+ import type { DataFormControlProps } from '../types';
13
+
14
+ export default function Password< Item >( {
15
+ data,
16
+ field,
17
+ onChange,
18
+ hideLabelFromVision,
19
+ }: DataFormControlProps< Item > ) {
20
+ const [ isVisible, setIsVisible ] = useState( false );
21
+
22
+ const toggleVisibility = useCallback( () => {
23
+ setIsVisible( ( prev ) => ! prev );
24
+ }, [] );
25
+
26
+ return (
27
+ <ValidatedText
28
+ { ...{
29
+ data,
30
+ field,
31
+ onChange,
32
+ hideLabelFromVision,
33
+ type: isVisible ? 'text' : 'password',
34
+ suffix: (
35
+ <Button
36
+ icon={ isVisible ? unseen : seen }
37
+ onClick={ toggleVisibility }
38
+ size="small"
39
+ variant="tertiary"
40
+ aria-label={
41
+ isVisible
42
+ ? __( 'Hide password' )
43
+ : __( 'Show password' )
44
+ }
45
+ />
46
+ ),
47
+ } }
48
+ />
49
+ );
50
+ }
@@ -1,13 +1,21 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import deepMerge from 'deepmerge';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
4
- import { RadioControl } from '@wordpress/components';
5
- import { useCallback } from '@wordpress/element';
9
+ import { privateApis } from '@wordpress/components';
10
+ import { useCallback, useState } from '@wordpress/element';
6
11
 
7
12
  /**
8
13
  * Internal dependencies
9
14
  */
10
15
  import type { DataFormControlProps } from '../types';
16
+ import { unlock } from '../lock-unlock';
17
+
18
+ const { ValidatedRadioControl } = unlock( privateApis );
11
19
 
12
20
  export default function Radio< Item >( {
13
21
  data,
@@ -15,23 +23,57 @@ export default function Radio< Item >( {
15
23
  onChange,
16
24
  hideLabelFromVision,
17
25
  }: DataFormControlProps< Item > ) {
18
- const { id, label } = field;
19
- const value = field.getValue( { item: data } );
26
+ const { label, description, elements, getValue, setValue } = field;
27
+ const value = getValue( { item: data } );
28
+ const [ customValidity, setCustomValidity ] =
29
+ useState<
30
+ React.ComponentProps<
31
+ typeof ValidatedRadioControl
32
+ >[ 'customValidity' ]
33
+ >( undefined );
20
34
 
21
35
  const onChangeControl = useCallback(
22
36
  ( newValue: string ) =>
23
- onChange( {
24
- [ id ]: newValue,
25
- } ),
26
- [ id, onChange ]
37
+ onChange( setValue( { item: data, value: newValue } ) ),
38
+ [ data, onChange, setValue ]
39
+ );
40
+
41
+ const onValidateControl = useCallback(
42
+ ( newValue: any ) => {
43
+ const message = field.isValid?.custom?.(
44
+ deepMerge(
45
+ data,
46
+ setValue( {
47
+ item: data,
48
+ value: newValue,
49
+ } ) as Partial< Item >
50
+ ),
51
+ field
52
+ );
53
+
54
+ if ( message ) {
55
+ setCustomValidity( {
56
+ type: 'invalid',
57
+ message,
58
+ } );
59
+ return;
60
+ }
61
+
62
+ setCustomValidity( undefined );
63
+ },
64
+ [ data, field, setValue ]
27
65
  );
28
66
 
29
- if ( field.elements ) {
67
+ if ( elements ) {
30
68
  return (
31
- <RadioControl
69
+ <ValidatedRadioControl
70
+ required={ !! field.isValid?.required }
71
+ onValidate={ onValidateControl }
72
+ customValidity={ customValidity }
32
73
  label={ label }
74
+ help={ description }
33
75
  onChange={ onChangeControl }
34
- options={ field.elements }
76
+ options={ elements }
35
77
  selected={ value }
36
78
  hideLabelFromVision={ hideLabelFromVision }
37
79
  />
@@ -20,10 +20,15 @@ import { __ } from '@wordpress/i18n';
20
20
  */
21
21
  import { OPERATOR_IN_THE_PAST, OPERATOR_OVER } from '../constants';
22
22
 
23
+ export type DateRelative = {
24
+ value?: string | number;
25
+ unit?: string;
26
+ };
27
+
23
28
  interface RelativeDateControlProps {
24
29
  id: string;
25
- value: { value?: string | number; unit?: string };
26
- onChange: ( value: any ) => void;
30
+ value: DateRelative;
31
+ onChange: ( args: DateRelative ) => void;
27
32
  label: string;
28
33
  hideLabelFromVision?: boolean;
29
34
  options: { value: string; label: string }[];
@@ -58,18 +63,14 @@ export default function RelativeDateControl( {
58
63
 
59
64
  const onChangeValue = useCallback(
60
65
  ( newValue: string | undefined ) =>
61
- onChange( {
62
- [ id ]: { value: Number( newValue ), unit },
63
- } ),
64
- [ id, onChange, unit ]
66
+ onChange( { value: Number( newValue ), unit } ),
67
+ [ onChange, unit ]
65
68
  );
66
69
 
67
70
  const onChangeUnit = useCallback(
68
71
  ( newUnit: string | undefined ) =>
69
- onChange( {
70
- [ id ]: { value: relValue, unit: newUnit },
71
- } ),
72
- [ id, onChange, relValue ]
72
+ onChange( { value: relValue, unit: newUnit } ),
73
+ [ onChange, relValue ]
73
74
  );
74
75
 
75
76
  return (
@@ -1,14 +1,22 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import deepMerge from 'deepmerge';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
4
- import { SelectControl } from '@wordpress/components';
5
- import { useCallback } from '@wordpress/element';
9
+ import { privateApis } from '@wordpress/components';
10
+ import { useCallback, useState } from '@wordpress/element';
6
11
  import { __ } from '@wordpress/i18n';
7
12
 
8
13
  /**
9
14
  * Internal dependencies
10
15
  */
11
16
  import type { DataFormControlProps } from '../types';
17
+ import { unlock } from '../lock-unlock';
18
+
19
+ const { ValidatedSelectControl } = unlock( privateApis );
12
20
 
13
21
  export default function Select< Item >( {
14
22
  data,
@@ -16,15 +24,47 @@ export default function Select< Item >( {
16
24
  onChange,
17
25
  hideLabelFromVision,
18
26
  }: DataFormControlProps< Item > ) {
19
- const { id, label, type } = field;
27
+ const { type, label, description, getValue, setValue } = field;
28
+ const [ customValidity, setCustomValidity ] =
29
+ useState<
30
+ React.ComponentProps<
31
+ typeof ValidatedSelectControl
32
+ >[ 'customValidity' ]
33
+ >( undefined );
34
+
20
35
  const isMultiple = type === 'array';
21
- const value = field.getValue( { item: data } ) ?? ( isMultiple ? [] : '' );
36
+ const value = getValue( { item: data } ) ?? ( isMultiple ? [] : '' );
37
+
22
38
  const onChangeControl = useCallback(
23
39
  ( newValue: any ) =>
24
- onChange( {
25
- [ id ]: newValue,
26
- } ),
27
- [ id, onChange ]
40
+ onChange( setValue( { item: data, value: newValue } ) ),
41
+ [ data, onChange, setValue ]
42
+ );
43
+
44
+ const onValidateControl = useCallback(
45
+ ( newValue: any ) => {
46
+ const message = field.isValid?.custom?.(
47
+ deepMerge(
48
+ data,
49
+ setValue( {
50
+ item: data,
51
+ value: newValue,
52
+ } ) as Partial< Item >
53
+ ),
54
+ field
55
+ );
56
+
57
+ if ( message ) {
58
+ setCustomValidity( {
59
+ type: 'invalid',
60
+ message,
61
+ } );
62
+ return;
63
+ }
64
+
65
+ setCustomValidity( undefined );
66
+ },
67
+ [ data, field, setValue ]
28
68
  );
29
69
 
30
70
  const fieldElements = field?.elements ?? [];
@@ -48,10 +88,13 @@ export default function Select< Item >( {
48
88
  ];
49
89
 
50
90
  return (
51
- <SelectControl
91
+ <ValidatedSelectControl
92
+ required={ !! field.isValid?.required }
93
+ onValidate={ onValidateControl }
94
+ customValidity={ customValidity }
52
95
  label={ label }
53
96
  value={ value }
54
- help={ field.description }
97
+ help={ description }
55
98
  options={ elements }
56
99
  onChange={ onChangeControl }
57
100
  __next40pxDefaultSize
@@ -1,8 +1,17 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ Icon,
6
+ __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
7
+ } from '@wordpress/components';
8
+ import { mobile } from '@wordpress/icons';
9
+
1
10
  /**
2
11
  * Internal dependencies
3
12
  */
4
13
  import type { DataFormControlProps } from '../types';
5
- import ValidatedText from './utils/validated-text';
14
+ import ValidatedText from './utils/validated-input';
6
15
 
7
16
  export default function Telephone< Item >( {
8
17
  data,
@@ -12,7 +21,18 @@ export default function Telephone< Item >( {
12
21
  }: DataFormControlProps< Item > ) {
13
22
  return (
14
23
  <ValidatedText
15
- { ...{ data, field, onChange, hideLabelFromVision, type: 'tel' } }
24
+ { ...{
25
+ data,
26
+ field,
27
+ onChange,
28
+ hideLabelFromVision,
29
+ type: 'tel',
30
+ prefix: (
31
+ <InputControlPrefixWrapper variant="icon">
32
+ <Icon icon={ mobile } />
33
+ </InputControlPrefixWrapper>
34
+ ),
35
+ } }
16
36
  />
17
37
  );
18
38
  }
@@ -1,16 +1,33 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { createElement } from '@wordpress/element';
5
+
1
6
  /**
2
7
  * Internal dependencies
3
8
  */
4
9
  import type { DataFormControlProps } from '../types';
5
- import ValidatedText from './utils/validated-text';
10
+ import ValidatedText from './utils/validated-input';
6
11
 
7
12
  export default function Text< Item >( {
8
13
  data,
9
14
  field,
10
15
  onChange,
11
16
  hideLabelFromVision,
17
+ config,
12
18
  }: DataFormControlProps< Item > ) {
19
+ const { prefix, suffix } = config || {};
20
+
13
21
  return (
14
- <ValidatedText { ...{ data, field, onChange, hideLabelFromVision } } />
22
+ <ValidatedText
23
+ { ...{
24
+ data,
25
+ field,
26
+ onChange,
27
+ hideLabelFromVision,
28
+ prefix: prefix ? createElement( prefix ) : undefined,
29
+ suffix: suffix ? createElement( suffix ) : undefined,
30
+ } }
31
+ />
15
32
  );
16
33
  }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import deepMerge from 'deepmerge';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { privateApis } from '@wordpress/components';
10
+ import { useCallback, useState } from '@wordpress/element';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import type { DataFormControlProps } from '../types';
16
+ import { unlock } from '../lock-unlock';
17
+
18
+ const { ValidatedTextareaControl } = unlock( privateApis );
19
+
20
+ export default function Textarea< Item >( {
21
+ data,
22
+ field,
23
+ onChange,
24
+ hideLabelFromVision,
25
+ config,
26
+ }: DataFormControlProps< Item > ) {
27
+ const { rows = 4 } = config || {};
28
+ const { label, placeholder, description, setValue } = field;
29
+ const value = field.getValue( { item: data } );
30
+ const [ customValidity, setCustomValidity ] =
31
+ useState<
32
+ React.ComponentProps<
33
+ typeof ValidatedTextareaControl
34
+ >[ 'customValidity' ]
35
+ >( undefined );
36
+
37
+ const onChangeControl = useCallback(
38
+ ( newValue: string ) =>
39
+ onChange( setValue( { item: data, value: newValue } ) ),
40
+ [ data, onChange, setValue ]
41
+ );
42
+
43
+ const onValidateControl = useCallback(
44
+ ( newValue: any ) => {
45
+ const message = field.isValid?.custom?.(
46
+ deepMerge(
47
+ data,
48
+ setValue( {
49
+ item: data,
50
+ value: newValue,
51
+ } ) as Partial< Item >
52
+ ),
53
+ field
54
+ );
55
+
56
+ if ( message ) {
57
+ setCustomValidity( {
58
+ type: 'invalid',
59
+ message,
60
+ } );
61
+ return;
62
+ }
63
+
64
+ setCustomValidity( undefined );
65
+ },
66
+ [ data, field, setValue ]
67
+ );
68
+
69
+ return (
70
+ <ValidatedTextareaControl
71
+ required={ !! field.isValid?.required }
72
+ onValidate={ onValidateControl }
73
+ customValidity={ customValidity }
74
+ label={ label }
75
+ placeholder={ placeholder }
76
+ value={ value ?? '' }
77
+ help={ description }
78
+ onChange={ onChangeControl }
79
+ rows={ rows }
80
+ __next40pxDefaultSize
81
+ __nextHasNoMarginBottom
82
+ hideLabelFromVision={ hideLabelFromVision }
83
+ />
84
+ );
85
+ }
@@ -1,16 +1,24 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import deepMerge from 'deepmerge';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
4
9
  import {
5
- __experimentalToggleGroupControl as ToggleGroupControl,
10
+ privateApis,
6
11
  __experimentalToggleGroupControlOption as ToggleGroupControlOption,
7
12
  } from '@wordpress/components';
8
- import { useCallback } from '@wordpress/element';
13
+ import { useCallback, useState } from '@wordpress/element';
9
14
 
10
15
  /**
11
16
  * Internal dependencies
12
17
  */
13
18
  import type { DataFormControlProps } from '../types';
19
+ import { unlock } from '../lock-unlock';
20
+
21
+ const { ValidatedToggleGroupControl } = unlock( privateApis );
14
22
 
15
23
  export default function ToggleGroup< Item >( {
16
24
  data,
@@ -18,15 +26,44 @@ export default function ToggleGroup< Item >( {
18
26
  onChange,
19
27
  hideLabelFromVision,
20
28
  }: DataFormControlProps< Item > ) {
21
- const { id } = field;
22
- const value = field.getValue( { item: data } );
29
+ const { getValue, setValue } = field;
30
+ const [ customValidity, setCustomValidity ] =
31
+ useState<
32
+ React.ComponentProps<
33
+ typeof ValidatedToggleGroupControl
34
+ >[ 'customValidity' ]
35
+ >( undefined );
36
+ const value = getValue( { item: data } );
23
37
 
24
38
  const onChangeControl = useCallback(
25
39
  ( newValue: string | number | undefined ) =>
26
- onChange( {
27
- [ id ]: newValue,
28
- } ),
29
- [ id, onChange ]
40
+ onChange( setValue( { item: data, value: newValue } ) ),
41
+ [ data, onChange, setValue ]
42
+ );
43
+ const onValidateControl = useCallback(
44
+ ( newValue: any ) => {
45
+ const message = field.isValid?.custom?.(
46
+ deepMerge(
47
+ data,
48
+ setValue( {
49
+ item: data,
50
+ value: newValue,
51
+ } ) as Partial< Item >
52
+ ),
53
+ field
54
+ );
55
+
56
+ if ( message ) {
57
+ setCustomValidity( {
58
+ type: 'invalid',
59
+ message,
60
+ } );
61
+ return;
62
+ }
63
+
64
+ setCustomValidity( undefined );
65
+ },
66
+ [ data, field, setValue ]
30
67
  );
31
68
 
32
69
  if ( field.elements ) {
@@ -34,7 +71,10 @@ export default function ToggleGroup< Item >( {
34
71
  ( el ) => el.value === value
35
72
  );
36
73
  return (
37
- <ToggleGroupControl
74
+ <ValidatedToggleGroupControl
75
+ required={ !! field.isValid?.required }
76
+ onValidate={ onValidateControl }
77
+ customValidity={ customValidity }
38
78
  __next40pxDefaultSize
39
79
  __nextHasNoMarginBottom
40
80
  isBlock
@@ -51,7 +91,7 @@ export default function ToggleGroup< Item >( {
51
91
  value={ el.value }
52
92
  />
53
93
  ) ) }
54
- </ToggleGroupControl>
94
+ </ValidatedToggleGroupControl>
55
95
  );
56
96
  }
57
97
 
@@ -0,0 +1,79 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import deepMerge from 'deepmerge';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { privateApis } from '@wordpress/components';
10
+ import { useCallback, useState } from '@wordpress/element';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import type { DataFormControlProps } from '../types';
16
+ import { unlock } from '../lock-unlock';
17
+
18
+ const { ValidatedToggleControl } = unlock( privateApis );
19
+
20
+ export default function Toggle< Item >( {
21
+ field,
22
+ onChange,
23
+ data,
24
+ hideLabelFromVision,
25
+ }: DataFormControlProps< Item > ) {
26
+ const { label, description, getValue, setValue } = field;
27
+ const [ customValidity, setCustomValidity ] =
28
+ useState<
29
+ React.ComponentProps<
30
+ typeof ValidatedToggleControl
31
+ >[ 'customValidity' ]
32
+ >( undefined );
33
+
34
+ const onChangeControl = useCallback( () => {
35
+ onChange(
36
+ setValue( { item: data, value: ! getValue( { item: data } ) } )
37
+ );
38
+ }, [ onChange, setValue, data, getValue ] );
39
+
40
+ const onValidateControl = useCallback(
41
+ ( newValue: any ) => {
42
+ const message = field.isValid?.custom?.(
43
+ deepMerge(
44
+ data,
45
+ setValue( {
46
+ item: data,
47
+ value: newValue,
48
+ } ) as Partial< Item >
49
+ ),
50
+ field
51
+ );
52
+
53
+ if ( message ) {
54
+ setCustomValidity( {
55
+ type: 'invalid',
56
+ message,
57
+ } );
58
+ return;
59
+ }
60
+
61
+ setCustomValidity( undefined );
62
+ },
63
+ [ data, field, setValue ]
64
+ );
65
+
66
+ return (
67
+ <ValidatedToggleControl
68
+ required={ !! field.isValid.required }
69
+ onValidate={ onValidateControl }
70
+ customValidity={ customValidity }
71
+ hidden={ hideLabelFromVision }
72
+ __nextHasNoMarginBottom
73
+ label={ label }
74
+ help={ description }
75
+ checked={ getValue( { item: data } ) }
76
+ onChange={ onChangeControl }
77
+ />
78
+ );
79
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ Icon,
6
+ __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
7
+ } from '@wordpress/components';
8
+ import { link } from '@wordpress/icons';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import type { DataFormControlProps } from '../types';
14
+ import ValidatedText from './utils/validated-input';
15
+
16
+ export default function Url< Item >( {
17
+ data,
18
+ field,
19
+ onChange,
20
+ hideLabelFromVision,
21
+ }: DataFormControlProps< Item > ) {
22
+ return (
23
+ <ValidatedText
24
+ { ...{
25
+ data,
26
+ field,
27
+ onChange,
28
+ hideLabelFromVision,
29
+ type: 'url',
30
+ prefix: (
31
+ <InputControlPrefixWrapper variant="icon">
32
+ <Icon icon={ link } />
33
+ </InputControlPrefixWrapper>
34
+ ),
35
+ } }
36
+ />
37
+ );
38
+ }