@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
@@ -5,7 +5,11 @@ import { useState, useMemo } from '@wordpress/element';
5
5
  import {
6
6
  __experimentalHStack as HStack,
7
7
  __experimentalVStack as VStack,
8
+ Icon,
9
+ __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
10
+ __experimentalInputControlSuffixWrapper as InputControlSuffixWrapper,
8
11
  } from '@wordpress/components';
12
+ import { starFilled } from '@wordpress/icons';
9
13
 
10
14
  /**
11
15
  * Internal dependencies
@@ -32,16 +36,19 @@ const meta = {
32
36
  options: [
33
37
  'default',
34
38
  'array',
35
- 'boolean',
36
39
  'checkbox',
40
+ 'color',
37
41
  'date',
38
42
  'datetime',
39
43
  'email',
40
44
  'integer',
45
+ 'password',
41
46
  'radio',
42
47
  'select',
43
48
  'telephone',
49
+ 'url',
44
50
  'text',
51
+ 'toggle',
45
52
  'toggleGroup',
46
53
  ],
47
54
  },
@@ -53,13 +60,37 @@ const meta = {
53
60
  };
54
61
  export default meta;
55
62
 
63
+ const DollarPrefix = () => (
64
+ <InputControlPrefixWrapper>
65
+ <span>$</span>
66
+ </InputControlPrefixWrapper>
67
+ );
68
+ const StarIconPrefix = () => (
69
+ <InputControlPrefixWrapper variant="icon">
70
+ <Icon icon={ starFilled } />
71
+ </InputControlPrefixWrapper>
72
+ );
73
+ const PercentSuffix = () => (
74
+ <InputControlSuffixWrapper>
75
+ <span>%</span>
76
+ </InputControlSuffixWrapper>
77
+ );
78
+ const USDSuffix = () => (
79
+ <InputControlSuffixWrapper>
80
+ <span>USD</span>
81
+ </InputControlSuffixWrapper>
82
+ );
83
+
56
84
  type DataType = {
57
85
  id: number;
58
86
  text: string;
59
87
  textWithElements: string;
88
+ textWithRadio: string;
89
+ textWithTextarea: string;
60
90
  integer: number;
61
91
  integerWithElements: number;
62
92
  boolean: boolean;
93
+ booleanWithToggle: boolean;
63
94
  booleanWithElements: boolean;
64
95
  datetime: string;
65
96
  datetimeWithElements: string;
@@ -69,22 +100,35 @@ type DataType = {
69
100
  emailWithElements: string;
70
101
  telephone: string;
71
102
  telephoneWithElements: string;
103
+ color: string;
104
+ colorWithElements: string;
105
+ url: string;
106
+ urlWithElements: string;
107
+ password: string;
108
+ passwordWithElements: string;
72
109
  media: string;
73
110
  mediaWithElements: string;
74
111
  array: string[];
75
112
  arrayWithElements: string[];
76
113
  notype: string;
77
114
  notypeWithElements: string;
115
+ priceWithPrefix?: string;
116
+ ratingWithIcon?: string;
117
+ percentageWithSuffix?: string;
118
+ priceWithBoth?: string;
78
119
  };
79
120
 
80
121
  const data: DataType[] = [
81
122
  {
82
123
  id: 1,
83
124
  text: 'Text',
84
- textWithElements: 'Item 1',
125
+ textWithElements: 'item1',
126
+ textWithRadio: 'item2',
127
+ textWithTextarea: 'Textarea',
85
128
  integer: 1,
86
129
  integerWithElements: 1,
87
130
  boolean: true,
131
+ booleanWithToggle: true,
88
132
  booleanWithElements: true,
89
133
  datetime: '2021-01-01T14:30:00Z',
90
134
  datetimeWithElements: '2021-01-01T14:30:00Z',
@@ -94,6 +138,12 @@ const data: DataType[] = [
94
138
  emailWithElements: 'hi@example.com',
95
139
  telephone: '+1-555-123-4567',
96
140
  telephoneWithElements: '+1-555-123-4567',
141
+ color: '#ff6600',
142
+ colorWithElements: 'rgba(255, 165, 0, 0.8)',
143
+ url: 'https://example.com',
144
+ urlWithElements: 'https://example.com',
145
+ password: 'secretpassword123',
146
+ passwordWithElements: 'secretpassword123',
97
147
  media: 'https://live.staticflickr.com/7398/9458193857_e1256123e3_z.jpg',
98
148
  mediaWithElements:
99
149
  'https://live.staticflickr.com/7398/9458193857_e1256123e3_z.jpg',
@@ -101,6 +151,10 @@ const data: DataType[] = [
101
151
  arrayWithElements: [ 'item1', 'item2', 'item3' ],
102
152
  notype: 'No type',
103
153
  notypeWithElements: 'No type',
154
+ priceWithPrefix: '25.99',
155
+ ratingWithIcon: '4.5',
156
+ percentageWithSuffix: '85',
157
+ priceWithBoth: '199.99',
104
158
  },
105
159
  ];
106
160
 
@@ -122,6 +176,25 @@ const fields: Field< DataType >[] = [
122
176
  { value: 'item3', label: 'Item 3' },
123
177
  ],
124
178
  },
179
+ {
180
+ id: 'textWithRadio',
181
+ type: 'text',
182
+ label: 'Text (with radio)',
183
+ description: 'Help for text with radio.',
184
+ Edit: 'radio',
185
+ elements: [
186
+ { value: 'item1', label: 'Item 1' },
187
+ { value: 'item2', label: 'Item 2' },
188
+ { value: 'item3', label: 'Item 3' },
189
+ ],
190
+ },
191
+ {
192
+ id: 'textWithTextarea',
193
+ type: 'text',
194
+ label: 'Textarea',
195
+ description: 'Help for textarea.',
196
+ Edit: 'textarea',
197
+ },
125
198
  {
126
199
  id: 'integer',
127
200
  type: 'integer',
@@ -145,6 +218,13 @@ const fields: Field< DataType >[] = [
145
218
  label: 'Boolean',
146
219
  description: 'Help for boolean.',
147
220
  },
221
+ {
222
+ id: 'booleanWithToggle',
223
+ type: 'boolean',
224
+ label: 'Boolean (with toggle)',
225
+ description: 'Help for boolean with toggle control.',
226
+ Edit: 'toggle',
227
+ },
148
228
  {
149
229
  id: 'booleanWithElements',
150
230
  type: 'boolean',
@@ -232,6 +312,64 @@ const fields: Field< DataType >[] = [
232
312
  { value: '+81-3-1234-5678', label: '+81-3-1234-5678' },
233
313
  ],
234
314
  },
315
+ {
316
+ id: 'url',
317
+ type: 'url',
318
+ label: 'URL',
319
+ description: 'Help for URL.',
320
+ },
321
+ {
322
+ id: 'urlWithElements',
323
+ type: 'url',
324
+ label: 'URL (with elements)',
325
+ description: 'Help for URL with elements.',
326
+ elements: [
327
+ { value: 'https://example.com', label: 'https://example.com' },
328
+ { value: 'https://wordpress.org', label: 'https://wordpress.org' },
329
+ { value: 'https://github.com', label: 'https://github.com' },
330
+ ],
331
+ },
332
+ {
333
+ id: 'color',
334
+ type: 'color',
335
+ label: 'Color',
336
+ description:
337
+ 'Help for color. Supports hex, rgb, hsl formats with alpha channel.',
338
+ },
339
+ {
340
+ id: 'colorWithElements',
341
+ type: 'color',
342
+ label: 'Color (with elements)',
343
+ description: 'Help for color with predefined color options.',
344
+ elements: [
345
+ { value: '#ff0000', label: 'Red' },
346
+ { value: '#00ff00', label: 'Green' },
347
+ { value: '#0000ff', label: 'Blue' },
348
+ { value: 'rgba(255, 165, 0, 0.8)', label: 'Orange (80% opacity)' },
349
+ { value: 'hsl(300, 100%, 50%)', label: 'Magenta' },
350
+ {
351
+ value: 'hsla(120, 100%, 25%, 0.6)',
352
+ label: 'Dark Green (60% opacity)',
353
+ },
354
+ ],
355
+ },
356
+ {
357
+ id: 'password',
358
+ type: 'password',
359
+ label: 'Password',
360
+ description: 'Help for password.',
361
+ },
362
+ {
363
+ id: 'passwordWithElements',
364
+ type: 'password',
365
+ label: 'Password (with elements)',
366
+ description: 'Help for password with elements.',
367
+ elements: [
368
+ { value: 'secretpassword123', label: 'Secret Password' },
369
+ { value: 'adminpass456', label: 'Admin Password' },
370
+ { value: 'userpass789', label: 'User Password' },
371
+ ],
372
+ },
235
373
  {
236
374
  id: 'media',
237
375
  type: 'media',
@@ -304,22 +442,66 @@ const fields: Field< DataType >[] = [
304
442
  { value: 'item3', label: 'Item 3' },
305
443
  ],
306
444
  },
445
+ {
446
+ id: 'priceWithPrefix',
447
+ label: 'Text with Prefix',
448
+ type: 'text',
449
+ description: 'Text field with dollar sign prefix.',
450
+ Edit: {
451
+ control: 'text',
452
+ prefix: DollarPrefix,
453
+ },
454
+ },
455
+ {
456
+ id: 'ratingWithIcon',
457
+ label: 'Text with Icon Prefix',
458
+ type: 'text',
459
+ description: 'Text field with star icon prefix.',
460
+ Edit: {
461
+ control: 'text',
462
+ prefix: StarIconPrefix,
463
+ },
464
+ },
465
+ {
466
+ id: 'percentageWithSuffix',
467
+ label: 'Text with Suffix',
468
+ type: 'text',
469
+ description: 'Text field with percent sign suffix.',
470
+ Edit: {
471
+ control: 'text',
472
+ suffix: PercentSuffix,
473
+ },
474
+ },
475
+ {
476
+ id: 'priceWithBoth',
477
+ label: 'Text with Prefix and Suffix',
478
+ type: 'text',
479
+ description: 'Text field with both dollar prefix and USD suffix.',
480
+ Edit: {
481
+ control: 'text',
482
+ prefix: DollarPrefix,
483
+ suffix: USDSuffix,
484
+ },
485
+ },
307
486
  ];
308
487
 
309
488
  type PanelTypes = 'regular' | 'panel';
310
489
  type ControlTypes =
311
490
  | 'default'
312
491
  | 'array'
313
- | 'boolean'
314
492
  | 'checkbox'
493
+ | 'color'
315
494
  | 'date'
316
495
  | 'datetime'
317
496
  | 'email'
318
497
  | 'integer'
498
+ | 'password'
319
499
  | 'radio'
320
500
  | 'select'
321
501
  | 'telephone'
502
+ | 'url'
322
503
  | 'text'
504
+ | 'toggle'
323
505
  | 'toggleGroup';
324
506
 
325
507
  interface FieldTypeStoryProps {
@@ -569,6 +751,38 @@ export const Telephone = ( {
569
751
  );
570
752
  };
571
753
 
754
+ export const Url = ( {
755
+ type,
756
+ Edit,
757
+ }: {
758
+ type: PanelTypes;
759
+ Edit: ControlTypes;
760
+ } ) => {
761
+ const urlFields = useMemo(
762
+ () => fields.filter( ( field ) => field.type === 'url' ),
763
+ []
764
+ );
765
+
766
+ return <FieldTypeStory fields={ urlFields } type={ type } Edit={ Edit } />;
767
+ };
768
+
769
+ export const Color = ( {
770
+ type,
771
+ Edit,
772
+ }: {
773
+ type: PanelTypes;
774
+ Edit: ControlTypes;
775
+ } ) => {
776
+ const colorFields = useMemo(
777
+ () => fields.filter( ( field ) => field.type === 'color' ),
778
+ []
779
+ );
780
+
781
+ return (
782
+ <FieldTypeStory fields={ colorFields } type={ type } Edit={ Edit } />
783
+ );
784
+ };
785
+
572
786
  export const Media = ( {
573
787
  type,
574
788
  Edit,
@@ -607,6 +821,23 @@ export const Array = ( {
607
821
  );
608
822
  };
609
823
 
824
+ export const Password = ( {
825
+ type,
826
+ Edit,
827
+ }: {
828
+ type: PanelTypes;
829
+ Edit: ControlTypes;
830
+ } ) => {
831
+ const passwordFields = useMemo(
832
+ () => fields.filter( ( field ) => field.type === 'password' ),
833
+ []
834
+ );
835
+
836
+ return (
837
+ <FieldTypeStory fields={ passwordFields } type={ type } Edit={ Edit } />
838
+ );
839
+ };
840
+
610
841
  export const NoType = ( {
611
842
  type,
612
843
  Edit,
@@ -0,0 +1,71 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type {
10
+ DataViewRenderFieldProps,
11
+ SortDirection,
12
+ NormalizedField,
13
+ FieldTypeDefinition,
14
+ } from '../types';
15
+ import { renderFromElements } from '../utils';
16
+ import {
17
+ OPERATOR_IS,
18
+ OPERATOR_IS_ALL,
19
+ OPERATOR_IS_NOT_ALL,
20
+ OPERATOR_IS_ANY,
21
+ OPERATOR_IS_NONE,
22
+ OPERATOR_IS_NOT,
23
+ OPERATOR_CONTAINS,
24
+ OPERATOR_NOT_CONTAINS,
25
+ OPERATOR_STARTS_WITH,
26
+ } from '../constants';
27
+
28
+ function sort( valueA: any, valueB: any, direction: SortDirection ) {
29
+ return direction === 'asc'
30
+ ? valueA.localeCompare( valueB )
31
+ : valueB.localeCompare( valueA );
32
+ }
33
+
34
+ export default {
35
+ sort,
36
+ isValid: {
37
+ custom: ( item: any, field: NormalizedField< any > ) => {
38
+ const value = field.getValue( { item } );
39
+ if ( field?.elements ) {
40
+ const validValues = field.elements.map( ( f ) => f.value );
41
+ if ( ! validValues.includes( value ) ) {
42
+ return __( 'Value must be one of the elements.' );
43
+ }
44
+ }
45
+
46
+ return null;
47
+ },
48
+ },
49
+ Edit: 'url',
50
+ render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
51
+ return field.elements
52
+ ? renderFromElements( { item, field } )
53
+ : field.getValue( { item } );
54
+ },
55
+ enableSorting: true,
56
+ filterBy: {
57
+ defaultOperators: [ OPERATOR_IS_ANY, OPERATOR_IS_NONE ],
58
+ validOperators: [
59
+ OPERATOR_IS,
60
+ OPERATOR_IS_NOT,
61
+ OPERATOR_CONTAINS,
62
+ OPERATOR_NOT_CONTAINS,
63
+ OPERATOR_STARTS_WITH,
64
+ // Multiple selection
65
+ OPERATOR_IS_ANY,
66
+ OPERATOR_IS_NONE,
67
+ OPERATOR_IS_ALL,
68
+ OPERATOR_IS_NOT_ALL,
69
+ ],
70
+ },
71
+ } satisfies FieldTypeDefinition< any >;
@@ -37,6 +37,22 @@ const getValueFromId =
37
37
  return value;
38
38
  };
39
39
 
40
+ export const setValueFromId =
41
+ ( id: string ) =>
42
+ ( { value }: { value: any } ) => {
43
+ const path = id.split( '.' );
44
+ const result: any = {};
45
+ let current = result;
46
+
47
+ for ( const segment of path.slice( 0, -1 ) ) {
48
+ current[ segment ] = {};
49
+ current = current[ segment ];
50
+ }
51
+
52
+ current[ path.at( -1 )! ] = value;
53
+ return result;
54
+ };
55
+
40
56
  function getFilterBy< Item >(
41
57
  field: Field< Item >,
42
58
  fieldTypeDefinition: FieldTypeDefinition< Item >
@@ -128,6 +144,7 @@ export function normalizeFields< Item >(
128
144
  field.type
129
145
  );
130
146
  const getValue = field.getValue || getValueFromId( field.id );
147
+ const setValue = field.setValue || setValueFromId( field.id );
131
148
 
132
149
  const sort =
133
150
  field.sort ??
@@ -166,6 +183,7 @@ export function normalizeFields< Item >(
166
183
  label: field.label || field.id,
167
184
  header: field.header || field.label || field.id,
168
185
  getValue,
186
+ setValue,
169
187
  render,
170
188
  sort,
171
189
  isValid,
@@ -8,6 +8,7 @@ import type {
8
8
  NormalizedRegularLayout,
9
9
  NormalizedPanelLayout,
10
10
  NormalizedCardLayout,
11
+ NormalizedRowLayout,
11
12
  } from './types';
12
13
 
13
14
  interface NormalizedFormField {
@@ -59,6 +60,11 @@ export function normalizeLayout( layout?: Layout ): NormalizedLayout {
59
60
  : true,
60
61
  } satisfies NormalizedCardLayout;
61
62
  }
63
+ } else if ( layout?.type === 'row' ) {
64
+ normalizedLayout = {
65
+ type: 'row',
66
+ alignment: layout?.alignment ?? 'center',
67
+ } satisfies NormalizedRowLayout;
62
68
  }
63
69
 
64
70
  return normalizedLayout;
package/src/style.scss CHANGED
@@ -17,3 +17,4 @@
17
17
  @import "./dataforms-layouts/panel/style.scss";
18
18
  @import "./dataforms-layouts/regular/style.scss";
19
19
  @import "./dataforms-layouts/card/style.scss";
20
+ @import "./dataforms-layouts/row/style.scss";
@@ -139,7 +139,7 @@ describe( 'DataForm component', () => {
139
139
  expect( onChange ).toHaveBeenCalledTimes( newValue.length );
140
140
  for ( let i = 0; i < newValue.length; i++ ) {
141
141
  expect( onChange ).toHaveBeenNthCalledWith( i + 1, {
142
- title: newValue[ i ],
142
+ title: newValue.slice( 0, i + 1 ),
143
143
  } );
144
144
  }
145
145
  } );
@@ -408,7 +408,7 @@ describe( 'DataForm component', () => {
408
408
  expect( onChange ).toHaveBeenCalledTimes( newValue.length );
409
409
  for ( let i = 0; i < newValue.length; i++ ) {
410
410
  expect( onChange ).toHaveBeenNthCalledWith( i + 1, {
411
- title: newValue[ i ],
411
+ title: newValue.slice( 0, i + 1 ),
412
412
  } );
413
413
  }
414
414
  } );