@wordpress/dataviews 9.0.1-next.6870dfe5b.0 → 9.0.1-next.a730c9c8c.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 (255) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/README.md +107 -12
  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 +31 -20
  10. package/build/dataform-controls/checkbox.js.map +1 -1
  11. package/build/dataform-controls/color.js +29 -24
  12. package/build/dataform-controls/color.js.map +1 -1
  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 +9 -3
  18. package/build/dataform-controls/email.js.map +1 -1
  19. package/build/dataform-controls/index.js +27 -0
  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 +9 -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 +33 -22
  40. package/build/dataform-controls/toggle.js.map +1 -1
  41. package/build/dataform-controls/url.js +9 -3
  42. package/build/dataform-controls/url.js.map +1 -1
  43. package/build/dataform-controls/utils/{validated-text.js → validated-input.js} +36 -29
  44. package/build/dataform-controls/utils/validated-input.js.map +1 -0
  45. package/build/dataforms-layouts/panel/dropdown.js +10 -14
  46. package/build/dataforms-layouts/panel/dropdown.js.map +1 -1
  47. package/build/dataforms-layouts/panel/index.js +24 -11
  48. package/build/dataforms-layouts/panel/index.js.map +1 -1
  49. package/build/dataforms-layouts/panel/modal.js +22 -27
  50. package/build/dataforms-layouts/panel/modal.js.map +1 -1
  51. package/build/dataforms-layouts/panel/summary-button.js +67 -0
  52. package/build/dataforms-layouts/panel/summary-button.js.map +1 -0
  53. package/build/dataforms-layouts/regular/index.js +7 -9
  54. package/build/dataforms-layouts/regular/index.js.map +1 -1
  55. package/build/dataviews-layouts/grid/index.js +5 -15
  56. package/build/dataviews-layouts/grid/index.js.map +1 -1
  57. package/build/dataviews-layouts/list/index.js +47 -2
  58. package/build/dataviews-layouts/list/index.js.map +1 -1
  59. package/build/dataviews-layouts/picker-grid/index.js +5 -15
  60. package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
  61. package/build/dataviews-layouts/table/index.js +5 -17
  62. package/build/dataviews-layouts/table/index.js.map +1 -1
  63. package/build/dataviews-layouts/utils/get-data-by-group.js +23 -0
  64. package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  65. package/build/field-types/index.js +4 -0
  66. package/build/field-types/index.js.map +1 -1
  67. package/build/field-types/password.js +51 -0
  68. package/build/field-types/password.js.map +1 -0
  69. package/build/normalize-fields.js +17 -0
  70. package/build/normalize-fields.js.map +1 -1
  71. package/build/types.js.map +1 -1
  72. package/build/validation.js +1 -1
  73. package/build/validation.js.map +1 -1
  74. package/build-module/components/dataviews-filters/input-widget.js +48 -4
  75. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  76. package/build-module/components/dataviews-layout/index.js +3 -1
  77. package/build-module/components/dataviews-layout/index.js.map +1 -1
  78. package/build-module/dataform-controls/array.js +9 -7
  79. package/build-module/dataform-controls/array.js.map +1 -1
  80. package/build-module/dataform-controls/checkbox.js +31 -21
  81. package/build-module/dataform-controls/checkbox.js.map +1 -1
  82. package/build-module/dataform-controls/color.js +28 -24
  83. package/build-module/dataform-controls/color.js.map +1 -1
  84. package/build-module/dataform-controls/date.js +32 -24
  85. package/build-module/dataform-controls/date.js.map +1 -1
  86. package/build-module/dataform-controls/datetime.js +135 -21
  87. package/build-module/dataform-controls/datetime.js.map +1 -1
  88. package/build-module/dataform-controls/email.js +8 -2
  89. package/build-module/dataform-controls/email.js.map +1 -1
  90. package/build-module/dataform-controls/index.js +27 -0
  91. package/build-module/dataform-controls/index.js.map +1 -1
  92. package/build-module/dataform-controls/integer.js +46 -34
  93. package/build-module/dataform-controls/integer.js.map +1 -1
  94. package/build-module/dataform-controls/password.js +38 -0
  95. package/build-module/dataform-controls/password.js.map +1 -0
  96. package/build-module/dataform-controls/radio.js +44 -11
  97. package/build-module/dataform-controls/radio.js.map +1 -1
  98. package/build-module/dataform-controls/relative-date-control.js +6 -10
  99. package/build-module/dataform-controls/relative-date-control.js.map +1 -1
  100. package/build-module/dataform-controls/select.js +43 -12
  101. package/build-module/dataform-controls/select.js.map +1 -1
  102. package/build-module/dataform-controls/telephone.js +8 -2
  103. package/build-module/dataform-controls/telephone.js.map +1 -1
  104. package/build-module/dataform-controls/text.js +15 -3
  105. package/build-module/dataform-controls/text.js.map +1 -1
  106. package/build-module/dataform-controls/textarea.js +74 -0
  107. package/build-module/dataform-controls/textarea.js.map +1 -0
  108. package/build-module/dataform-controls/toggle-group.js +38 -8
  109. package/build-module/dataform-controls/toggle-group.js.map +1 -1
  110. package/build-module/dataform-controls/toggle.js +33 -23
  111. package/build-module/dataform-controls/toggle.js.map +1 -1
  112. package/build-module/dataform-controls/url.js +8 -2
  113. package/build-module/dataform-controls/url.js.map +1 -1
  114. package/build-module/dataform-controls/utils/validated-input.js +76 -0
  115. package/build-module/dataform-controls/utils/validated-input.js.map +1 -0
  116. package/build-module/dataforms-layouts/panel/dropdown.js +10 -15
  117. package/build-module/dataforms-layouts/panel/dropdown.js.map +1 -1
  118. package/build-module/dataforms-layouts/panel/index.js +24 -11
  119. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  120. package/build-module/dataforms-layouts/panel/modal.js +22 -28
  121. package/build-module/dataforms-layouts/panel/modal.js.map +1 -1
  122. package/build-module/dataforms-layouts/panel/summary-button.js +60 -0
  123. package/build-module/dataforms-layouts/panel/summary-button.js.map +1 -0
  124. package/build-module/dataforms-layouts/regular/index.js +8 -10
  125. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  126. package/build-module/dataviews-layouts/grid/index.js +6 -16
  127. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  128. package/build-module/dataviews-layouts/list/index.js +48 -3
  129. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  130. package/build-module/dataviews-layouts/picker-grid/index.js +6 -16
  131. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
  132. package/build-module/dataviews-layouts/table/index.js +5 -17
  133. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  134. package/build-module/dataviews-layouts/utils/get-data-by-group.js +17 -0
  135. package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  136. package/build-module/field-types/index.js +4 -0
  137. package/build-module/field-types/index.js.map +1 -1
  138. package/build-module/field-types/password.js +46 -0
  139. package/build-module/field-types/password.js.map +1 -0
  140. package/build-module/normalize-fields.js +15 -0
  141. package/build-module/normalize-fields.js.map +1 -1
  142. package/build-module/types.js.map +1 -1
  143. package/build-module/validation.js +1 -1
  144. package/build-module/validation.js.map +1 -1
  145. package/build-style/style-rtl.css +9 -6
  146. package/build-style/style.css +9 -6
  147. package/build-types/components/dataform/stories/index.story.d.ts +3 -14
  148. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  149. package/build-types/components/dataviews/stories/fixtures.d.ts +4 -2
  150. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  151. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  152. package/build-types/dataform-controls/array.d.ts.map +1 -1
  153. package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
  154. package/build-types/dataform-controls/color.d.ts.map +1 -1
  155. package/build-types/dataform-controls/date.d.ts.map +1 -1
  156. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  157. package/build-types/dataform-controls/email.d.ts.map +1 -1
  158. package/build-types/dataform-controls/index.d.ts +1 -1
  159. package/build-types/dataform-controls/index.d.ts.map +1 -1
  160. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  161. package/build-types/dataform-controls/password.d.ts +3 -0
  162. package/build-types/dataform-controls/password.d.ts.map +1 -0
  163. package/build-types/dataform-controls/radio.d.ts.map +1 -1
  164. package/build-types/dataform-controls/relative-date-control.d.ts +6 -5
  165. package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -1
  166. package/build-types/dataform-controls/select.d.ts.map +1 -1
  167. package/build-types/dataform-controls/telephone.d.ts.map +1 -1
  168. package/build-types/dataform-controls/text.d.ts +1 -1
  169. package/build-types/dataform-controls/text.d.ts.map +1 -1
  170. package/build-types/dataform-controls/textarea.d.ts +6 -0
  171. package/build-types/dataform-controls/textarea.d.ts.map +1 -0
  172. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
  173. package/build-types/dataform-controls/toggle.d.ts.map +1 -1
  174. package/build-types/dataform-controls/url.d.ts.map +1 -1
  175. package/build-types/dataform-controls/utils/validated-input.d.ts +20 -0
  176. package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -0
  177. package/build-types/dataforms-layouts/panel/dropdown.d.ts +2 -1
  178. package/build-types/dataforms-layouts/panel/dropdown.d.ts.map +1 -1
  179. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  180. package/build-types/dataforms-layouts/panel/modal.d.ts +2 -1
  181. package/build-types/dataforms-layouts/panel/modal.d.ts.map +1 -1
  182. package/build-types/dataforms-layouts/panel/summary-button.d.ts +15 -0
  183. package/build-types/dataforms-layouts/panel/summary-button.d.ts.map +1 -0
  184. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  185. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  186. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  187. package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  188. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  189. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts +6 -0
  190. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts.map +1 -0
  191. package/build-types/field-types/index.d.ts.map +1 -1
  192. package/build-types/field-types/password.d.ts +17 -0
  193. package/build-types/field-types/password.d.ts.map +1 -0
  194. package/build-types/field-types/stories/index.story.d.ts +5 -1
  195. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  196. package/build-types/normalize-fields.d.ts +3 -0
  197. package/build-types/normalize-fields.d.ts.map +1 -1
  198. package/build-types/types.d.ts +67 -4
  199. package/build-types/types.d.ts.map +1 -1
  200. package/build-types/validation.d.ts.map +1 -1
  201. package/build-wp/index.js +1670 -1350
  202. package/package.json +16 -15
  203. package/src/components/dataform/stories/index.story.tsx +489 -17
  204. package/src/components/dataviews/stories/fixtures.tsx +99 -41
  205. package/src/components/dataviews/stories/index.story.tsx +2 -2
  206. package/src/components/dataviews-filters/input-widget.tsx +44 -5
  207. package/src/components/dataviews-layout/index.tsx +1 -1
  208. package/src/components/dataviews-picker/stories/index.story.tsx +1 -1
  209. package/src/dataform-controls/array.tsx +4 -6
  210. package/src/dataform-controls/checkbox.tsx +41 -24
  211. package/src/dataform-controls/color.tsx +33 -24
  212. package/src/dataform-controls/date.tsx +47 -21
  213. package/src/dataform-controls/datetime.tsx +171 -23
  214. package/src/dataform-controls/email.tsx +10 -2
  215. package/src/dataform-controls/index.tsx +30 -0
  216. package/src/dataform-controls/integer.tsx +82 -49
  217. package/src/dataform-controls/password.tsx +50 -0
  218. package/src/dataform-controls/radio.tsx +53 -11
  219. package/src/dataform-controls/relative-date-control.tsx +11 -10
  220. package/src/dataform-controls/select.tsx +53 -10
  221. package/src/dataform-controls/telephone.tsx +10 -2
  222. package/src/dataform-controls/text.tsx +19 -2
  223. package/src/dataform-controls/textarea.tsx +85 -0
  224. package/src/dataform-controls/toggle-group.tsx +50 -10
  225. package/src/dataform-controls/toggle.tsx +41 -24
  226. package/src/dataform-controls/url.tsx +10 -2
  227. package/src/dataform-controls/utils/validated-input.tsx +109 -0
  228. package/src/dataforms-layouts/panel/dropdown.tsx +12 -23
  229. package/src/dataforms-layouts/panel/index.tsx +39 -16
  230. package/src/dataforms-layouts/panel/modal.tsx +24 -30
  231. package/src/dataforms-layouts/panel/summary-button.tsx +92 -0
  232. package/src/dataforms-layouts/regular/index.tsx +9 -7
  233. package/src/dataforms-layouts/regular/style.scss +0 -6
  234. package/src/dataviews-layouts/grid/index.tsx +9 -14
  235. package/src/dataviews-layouts/grid/style.scss +1 -0
  236. package/src/dataviews-layouts/list/index.tsx +74 -2
  237. package/src/dataviews-layouts/list/style.scss +8 -0
  238. package/src/dataviews-layouts/picker-grid/index.tsx +9 -13
  239. package/src/dataviews-layouts/table/index.tsx +10 -14
  240. package/src/dataviews-layouts/utils/get-data-by-group.ts +18 -0
  241. package/src/field-types/index.tsx +5 -0
  242. package/src/field-types/password.tsx +46 -0
  243. package/src/field-types/stories/index.story.tsx +138 -1
  244. package/src/normalize-fields.ts +18 -0
  245. package/src/test/filter-and-sort-data-view.js +148 -138
  246. package/src/test/normalize-fields.ts +114 -0
  247. package/src/types.ts +74 -3
  248. package/src/validation.ts +2 -0
  249. package/tsconfig.tsbuildinfo +1 -1
  250. package/build/dataform-controls/utils/validated-text.js.map +0 -1
  251. package/build-module/dataform-controls/utils/validated-text.js +0 -70
  252. package/build-module/dataform-controls/utils/validated-text.js.map +0 -1
  253. package/build-types/dataform-controls/utils/validated-text.d.ts +0 -16
  254. package/build-types/dataform-controls/utils/validated-text.d.ts.map +0 -1
  255. package/src/dataform-controls/utils/validated-text.tsx +0 -96
@@ -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,13 +1,17 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
+ import {
5
+ Icon,
6
+ __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
7
+ } from '@wordpress/components';
4
8
  import { mobile } from '@wordpress/icons';
5
9
 
6
10
  /**
7
11
  * Internal dependencies
8
12
  */
9
13
  import type { DataFormControlProps } from '../types';
10
- import ValidatedText from './utils/validated-text';
14
+ import ValidatedText from './utils/validated-input';
11
15
 
12
16
  export default function Telephone< Item >( {
13
17
  data,
@@ -23,7 +27,11 @@ export default function Telephone< Item >( {
23
27
  onChange,
24
28
  hideLabelFromVision,
25
29
  type: 'tel',
26
- icon: mobile,
30
+ prefix: (
31
+ <InputControlPrefixWrapper variant="icon">
32
+ <Icon icon={ mobile } />
33
+ </InputControlPrefixWrapper>
34
+ ),
27
35
  } }
28
36
  />
29
37
  );
@@ -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
 
@@ -1,8 +1,13 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import deepMerge from 'deepmerge';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
4
9
  import { privateApis } from '@wordpress/components';
5
- import { useState } from '@wordpress/element';
10
+ import { useCallback, useState } from '@wordpress/element';
6
11
 
7
12
  /**
8
13
  * Internal dependencies
@@ -18,7 +23,7 @@ export default function Toggle< Item >( {
18
23
  data,
19
24
  hideLabelFromVision,
20
25
  }: DataFormControlProps< Item > ) {
21
- const { id, getValue, label, description } = field;
26
+ const { label, description, getValue, setValue } = field;
22
27
  const [ customValidity, setCustomValidity ] =
23
28
  useState<
24
29
  React.ComponentProps<
@@ -26,37 +31,49 @@ export default function Toggle< Item >( {
26
31
  >[ 'customValidity' ]
27
32
  >( undefined );
28
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
+
29
66
  return (
30
67
  <ValidatedToggleControl
31
68
  required={ !! field.isValid.required }
32
- onValidate={ ( newValue: any ) => {
33
- const message = field.isValid?.custom?.(
34
- {
35
- ...data,
36
- [ id ]: newValue,
37
- },
38
- field
39
- );
40
-
41
- if ( message ) {
42
- setCustomValidity( {
43
- type: 'invalid',
44
- message,
45
- } );
46
- return;
47
- }
48
-
49
- setCustomValidity( undefined );
50
- } }
69
+ onValidate={ onValidateControl }
51
70
  customValidity={ customValidity }
52
71
  hidden={ hideLabelFromVision }
53
72
  __nextHasNoMarginBottom
54
73
  label={ label }
55
74
  help={ description }
56
75
  checked={ getValue( { item: data } ) }
57
- onChange={ () =>
58
- onChange( { [ id ]: ! getValue( { item: data } ) } )
59
- }
76
+ onChange={ onChangeControl }
60
77
  />
61
78
  );
62
79
  }
@@ -1,13 +1,17 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
+ import {
5
+ Icon,
6
+ __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
7
+ } from '@wordpress/components';
4
8
  import { link } from '@wordpress/icons';
5
9
 
6
10
  /**
7
11
  * Internal dependencies
8
12
  */
9
13
  import type { DataFormControlProps } from '../types';
10
- import ValidatedText from './utils/validated-text';
14
+ import ValidatedText from './utils/validated-input';
11
15
 
12
16
  export default function Url< Item >( {
13
17
  data,
@@ -23,7 +27,11 @@ export default function Url< Item >( {
23
27
  onChange,
24
28
  hideLabelFromVision,
25
29
  type: 'url',
26
- icon: link,
30
+ prefix: (
31
+ <InputControlPrefixWrapper variant="icon">
32
+ <Icon icon={ link } />
33
+ </InputControlPrefixWrapper>
34
+ ),
27
35
  } }
28
36
  />
29
37
  );