@wordpress/dataviews 10.2.0 → 10.3.1-next.2f1c7c01b.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 (477) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/build/components/dataform/index.js +6 -2
  3. package/build/components/dataform/index.js.map +3 -3
  4. package/build/components/dataform-context/index.js +4 -2
  5. package/build/components/dataform-context/index.js.map +1 -1
  6. package/build/components/dataviews/index.js +8 -6
  7. package/build/components/dataviews/index.js.map +1 -1
  8. package/build/components/dataviews-bulk-actions/index.js +4 -2
  9. package/build/components/dataviews-bulk-actions/index.js.map +1 -1
  10. package/build/components/dataviews-context/index.js +3 -1
  11. package/build/components/dataviews-context/index.js.map +1 -1
  12. package/build/components/dataviews-filters/add-filter.js +4 -2
  13. package/build/components/dataviews-filters/add-filter.js.map +1 -1
  14. package/build/components/dataviews-filters/filter.js +20 -5
  15. package/build/components/dataviews-filters/filter.js.map +3 -3
  16. package/build/components/dataviews-filters/filters-toggled.js +3 -1
  17. package/build/components/dataviews-filters/filters-toggled.js.map +1 -1
  18. package/build/components/dataviews-filters/filters.js +3 -1
  19. package/build/components/dataviews-filters/filters.js.map +1 -1
  20. package/build/components/dataviews-filters/index.js +2 -0
  21. package/build/components/dataviews-filters/index.js.map +1 -1
  22. package/build/components/dataviews-filters/input-widget.js +3 -1
  23. package/build/components/dataviews-filters/input-widget.js.map +1 -1
  24. package/build/components/dataviews-filters/reset-filters.js +3 -1
  25. package/build/components/dataviews-filters/reset-filters.js.map +1 -1
  26. package/build/components/dataviews-filters/search-widget.js +8 -6
  27. package/build/components/dataviews-filters/search-widget.js.map +2 -2
  28. package/build/components/dataviews-filters/toggle.js +3 -1
  29. package/build/components/dataviews-filters/toggle.js.map +1 -1
  30. package/build/components/dataviews-filters/use-filters.js +2 -0
  31. package/build/components/dataviews-filters/use-filters.js.map +1 -1
  32. package/build/components/dataviews-filters/utils.js +4 -2
  33. package/build/components/dataviews-filters/utils.js.map +1 -1
  34. package/build/components/dataviews-footer/index.js +4 -2
  35. package/build/components/dataviews-footer/index.js.map +1 -1
  36. package/build/components/dataviews-item-actions/index.js +23 -4
  37. package/build/components/dataviews-item-actions/index.js.map +2 -2
  38. package/build/components/dataviews-layout/index.js +3 -1
  39. package/build/components/dataviews-layout/index.js.map +1 -1
  40. package/build/components/dataviews-pagination/index.js +3 -1
  41. package/build/components/dataviews-pagination/index.js.map +1 -1
  42. package/build/components/dataviews-picker/footer.js +4 -2
  43. package/build/components/dataviews-picker/footer.js.map +1 -1
  44. package/build/components/dataviews-picker/index.js +8 -6
  45. package/build/components/dataviews-picker/index.js.map +1 -1
  46. package/build/components/dataviews-search/index.js +4 -2
  47. package/build/components/dataviews-search/index.js.map +1 -1
  48. package/build/components/dataviews-selection-checkbox/index.js +3 -1
  49. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  50. package/build/components/dataviews-view-config/index.js +6 -4
  51. package/build/components/dataviews-view-config/index.js.map +1 -1
  52. package/build/components/dataviews-view-config/infinite-scroll-toggle.js +3 -1
  53. package/build/components/dataviews-view-config/infinite-scroll-toggle.js.map +1 -1
  54. package/build/constants.js +36 -34
  55. package/build/constants.js.map +1 -1
  56. package/build/dataform-controls/array.js +4 -2
  57. package/build/dataform-controls/array.js.map +1 -1
  58. package/build/dataform-controls/checkbox.js +4 -2
  59. package/build/dataform-controls/checkbox.js.map +1 -1
  60. package/build/dataform-controls/color.js +5 -3
  61. package/build/dataform-controls/color.js.map +1 -1
  62. package/build/dataform-controls/date.js +8 -6
  63. package/build/dataform-controls/date.js.map +1 -1
  64. package/build/dataform-controls/datetime.js +11 -15
  65. package/build/dataform-controls/datetime.js.map +3 -3
  66. package/build/dataform-controls/email.js +3 -1
  67. package/build/dataform-controls/email.js.map +1 -1
  68. package/build/dataform-controls/index.js +4 -2
  69. package/build/dataform-controls/index.js.map +1 -1
  70. package/build/dataform-controls/integer.js +3 -1
  71. package/build/dataform-controls/integer.js.map +1 -1
  72. package/build/dataform-controls/number.js +3 -1
  73. package/build/dataform-controls/number.js.map +1 -1
  74. package/build/dataform-controls/password.js +3 -1
  75. package/build/dataform-controls/password.js.map +1 -1
  76. package/build/dataform-controls/radio.js +4 -2
  77. package/build/dataform-controls/radio.js.map +1 -1
  78. package/build/dataform-controls/select.js +4 -2
  79. package/build/dataform-controls/select.js.map +1 -1
  80. package/build/dataform-controls/telephone.js +3 -1
  81. package/build/dataform-controls/telephone.js.map +1 -1
  82. package/build/dataform-controls/text.js +3 -1
  83. package/build/dataform-controls/text.js.map +1 -1
  84. package/build/dataform-controls/textarea.js +4 -2
  85. package/build/dataform-controls/textarea.js.map +1 -1
  86. package/build/dataform-controls/toggle-group.js +4 -2
  87. package/build/dataform-controls/toggle-group.js.map +1 -1
  88. package/build/dataform-controls/toggle.js +4 -2
  89. package/build/dataform-controls/toggle.js.map +1 -1
  90. package/build/dataform-controls/url.js +3 -1
  91. package/build/dataform-controls/url.js.map +1 -1
  92. package/build/dataform-controls/utils/get-custom-validity.js +2 -0
  93. package/build/dataform-controls/utils/get-custom-validity.js.map +1 -1
  94. package/build/dataform-controls/utils/relative-date-control.js +4 -2
  95. package/build/dataform-controls/utils/relative-date-control.js.map +1 -1
  96. package/build/dataform-controls/utils/validated-input.js +4 -2
  97. package/build/dataform-controls/utils/validated-input.js.map +1 -1
  98. package/build/dataform-controls/utils/validated-number.js +4 -2
  99. package/build/dataform-controls/utils/validated-number.js.map +1 -1
  100. package/build/dataform-layouts/card/index.js +65 -34
  101. package/build/dataform-layouts/card/index.js.map +3 -3
  102. package/build/dataform-layouts/data-form-layout.js +8 -14
  103. package/build/dataform-layouts/data-form-layout.js.map +3 -3
  104. package/build/dataform-layouts/get-summary-fields.js +3 -1
  105. package/build/dataform-layouts/get-summary-fields.js.map +1 -1
  106. package/build/dataform-layouts/index.js +4 -2
  107. package/build/dataform-layouts/index.js.map +2 -2
  108. package/build/dataform-layouts/{normalize-form-fields.js → normalize-form.js} +39 -22
  109. package/build/dataform-layouts/normalize-form.js.map +7 -0
  110. package/build/dataform-layouts/panel/dropdown.js +9 -8
  111. package/build/dataform-layouts/panel/dropdown.js.map +2 -2
  112. package/build/dataform-layouts/panel/index.js +10 -14
  113. package/build/dataform-layouts/panel/index.js.map +2 -2
  114. package/build/dataform-layouts/panel/modal.js +9 -8
  115. package/build/dataform-layouts/panel/modal.js.map +2 -2
  116. package/build/dataform-layouts/panel/summary-button.js +3 -1
  117. package/build/dataform-layouts/panel/summary-button.js.map +1 -1
  118. package/build/dataform-layouts/regular/index.js +8 -10
  119. package/build/dataform-layouts/regular/index.js.map +2 -2
  120. package/build/dataform-layouts/row/index.js +10 -33
  121. package/build/dataform-layouts/row/index.js.map +3 -3
  122. package/build/dataviews-layouts/grid/index.js +4 -2
  123. package/build/dataviews-layouts/grid/index.js.map +1 -1
  124. package/build/dataviews-layouts/grid/preview-size-picker.js +4 -2
  125. package/build/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  126. package/build/dataviews-layouts/index.js +3 -1
  127. package/build/dataviews-layouts/index.js.map +1 -1
  128. package/build/dataviews-layouts/list/index.js +6 -6
  129. package/build/dataviews-layouts/list/index.js.map +2 -2
  130. package/build/dataviews-layouts/picker-grid/index.js +4 -2
  131. package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
  132. package/build/dataviews-layouts/table/column-header-menu.js +6 -4
  133. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
  134. package/build/dataviews-layouts/table/column-primary.js +3 -1
  135. package/build/dataviews-layouts/table/column-primary.js.map +1 -1
  136. package/build/dataviews-layouts/table/density-picker.js +3 -1
  137. package/build/dataviews-layouts/table/density-picker.js.map +1 -1
  138. package/build/dataviews-layouts/table/index.js +3 -1
  139. package/build/dataviews-layouts/table/index.js.map +1 -1
  140. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js +3 -1
  141. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -1
  142. package/build/dataviews-layouts/utils/get-data-by-group.js +2 -0
  143. package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -1
  144. package/build/dataviews-layouts/utils/grid-items.js +4 -2
  145. package/build/dataviews-layouts/utils/grid-items.js.map +1 -1
  146. package/build/dataviews-layouts/utils/item-click-wrapper.js +3 -1
  147. package/build/dataviews-layouts/utils/item-click-wrapper.js.map +1 -1
  148. package/build/dataviews-layouts/utils/preview-size-picker.js +4 -2
  149. package/build/dataviews-layouts/utils/preview-size-picker.js.map +1 -1
  150. package/build/field-types/array.js +3 -1
  151. package/build/field-types/array.js.map +1 -1
  152. package/build/field-types/boolean.js +3 -1
  153. package/build/field-types/boolean.js.map +1 -1
  154. package/build/field-types/color.js +3 -1
  155. package/build/field-types/color.js.map +1 -1
  156. package/build/field-types/date.js +4 -2
  157. package/build/field-types/date.js.map +1 -1
  158. package/build/field-types/datetime.js +17 -2
  159. package/build/field-types/datetime.js.map +3 -3
  160. package/build/field-types/email.js +4 -2
  161. package/build/field-types/email.js.map +1 -1
  162. package/build/field-types/index.js +3 -1
  163. package/build/field-types/index.js.map +1 -1
  164. package/build/field-types/integer.js +3 -1
  165. package/build/field-types/integer.js.map +1 -1
  166. package/build/field-types/media.js +2 -0
  167. package/build/field-types/media.js.map +1 -1
  168. package/build/field-types/number.js +3 -1
  169. package/build/field-types/number.js.map +1 -1
  170. package/build/field-types/password.js +3 -1
  171. package/build/field-types/password.js.map +1 -1
  172. package/build/field-types/telephone.js +3 -1
  173. package/build/field-types/telephone.js.map +1 -1
  174. package/build/field-types/text.js +3 -1
  175. package/build/field-types/text.js.map +1 -1
  176. package/build/field-types/url.js +3 -1
  177. package/build/field-types/url.js.map +1 -1
  178. package/build/{dataform-layouts/is-combined-field.js → field-types/utils/parse-date-time.js} +15 -11
  179. package/build/field-types/utils/parse-date-time.js.map +7 -0
  180. package/build/field-types/utils/render-from-elements.js +2 -0
  181. package/build/field-types/utils/render-from-elements.js.map +1 -1
  182. package/build/hooks/index.js +2 -0
  183. package/build/hooks/index.js.map +1 -1
  184. package/build/hooks/use-elements.js +3 -1
  185. package/build/hooks/use-elements.js.map +1 -1
  186. package/build/hooks/use-form-validity.js +425 -321
  187. package/build/hooks/use-form-validity.js.map +3 -3
  188. package/build/index.js +2 -0
  189. package/build/index.js.map +1 -1
  190. package/build/lock-unlock.js +3 -1
  191. package/build/lock-unlock.js.map +1 -1
  192. package/build/types/dataform.js +2 -0
  193. package/build/types/dataform.js.map +2 -2
  194. package/build/types/dataviews.js +2 -0
  195. package/build/types/dataviews.js.map +1 -1
  196. package/build/types/field-api.js +2 -0
  197. package/build/types/field-api.js.map +1 -1
  198. package/build/types/index.js +2 -0
  199. package/build/types/index.js.map +1 -1
  200. package/build/types/private.js +2 -0
  201. package/build/types/private.js.map +1 -1
  202. package/build/utils/filter-sort-and-paginate.js +3 -1
  203. package/build/utils/filter-sort-and-paginate.js.map +1 -1
  204. package/build/utils/has-elements.js +2 -0
  205. package/build/utils/has-elements.js.map +1 -1
  206. package/build/utils/normalize-fields.js +4 -2
  207. package/build/utils/normalize-fields.js.map +1 -1
  208. package/build-module/components/dataform/index.js +5 -2
  209. package/build-module/components/dataform/index.js.map +2 -2
  210. package/build-module/components/dataform-context/index.js +3 -2
  211. package/build-module/components/dataform-context/index.js.map +1 -1
  212. package/build-module/components/dataviews/index.js +7 -6
  213. package/build-module/components/dataviews/index.js.map +1 -1
  214. package/build-module/components/dataviews-bulk-actions/index.js +3 -2
  215. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
  216. package/build-module/components/dataviews-context/index.js +2 -1
  217. package/build-module/components/dataviews-context/index.js.map +1 -1
  218. package/build-module/components/dataviews-filters/add-filter.js +3 -2
  219. package/build-module/components/dataviews-filters/add-filter.js.map +1 -1
  220. package/build-module/components/dataviews-filters/filter.js +19 -5
  221. package/build-module/components/dataviews-filters/filter.js.map +2 -2
  222. package/build-module/components/dataviews-filters/filters-toggled.js +2 -1
  223. package/build-module/components/dataviews-filters/filters-toggled.js.map +1 -1
  224. package/build-module/components/dataviews-filters/filters.js +2 -1
  225. package/build-module/components/dataviews-filters/filters.js.map +1 -1
  226. package/build-module/components/dataviews-filters/index.js +1 -0
  227. package/build-module/components/dataviews-filters/index.js.map +1 -1
  228. package/build-module/components/dataviews-filters/input-widget.js +2 -1
  229. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  230. package/build-module/components/dataviews-filters/reset-filters.js +2 -1
  231. package/build-module/components/dataviews-filters/reset-filters.js.map +1 -1
  232. package/build-module/components/dataviews-filters/search-widget.js +7 -6
  233. package/build-module/components/dataviews-filters/search-widget.js.map +2 -2
  234. package/build-module/components/dataviews-filters/toggle.js +2 -1
  235. package/build-module/components/dataviews-filters/toggle.js.map +1 -1
  236. package/build-module/components/dataviews-filters/use-filters.js +1 -0
  237. package/build-module/components/dataviews-filters/use-filters.js.map +1 -1
  238. package/build-module/components/dataviews-filters/utils.js +3 -2
  239. package/build-module/components/dataviews-filters/utils.js.map +1 -1
  240. package/build-module/components/dataviews-footer/index.js +3 -2
  241. package/build-module/components/dataviews-footer/index.js.map +1 -1
  242. package/build-module/components/dataviews-item-actions/index.js +22 -4
  243. package/build-module/components/dataviews-item-actions/index.js.map +2 -2
  244. package/build-module/components/dataviews-layout/index.js +2 -1
  245. package/build-module/components/dataviews-layout/index.js.map +1 -1
  246. package/build-module/components/dataviews-pagination/index.js +2 -1
  247. package/build-module/components/dataviews-pagination/index.js.map +1 -1
  248. package/build-module/components/dataviews-picker/footer.js +3 -2
  249. package/build-module/components/dataviews-picker/footer.js.map +1 -1
  250. package/build-module/components/dataviews-picker/index.js +7 -6
  251. package/build-module/components/dataviews-picker/index.js.map +1 -1
  252. package/build-module/components/dataviews-search/index.js +3 -2
  253. package/build-module/components/dataviews-search/index.js.map +1 -1
  254. package/build-module/components/dataviews-selection-checkbox/index.js +2 -1
  255. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  256. package/build-module/components/dataviews-view-config/index.js +5 -4
  257. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  258. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js +2 -1
  259. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js.map +1 -1
  260. package/build-module/constants.js +35 -34
  261. package/build-module/constants.js.map +1 -1
  262. package/build-module/dataform-controls/array.js +3 -2
  263. package/build-module/dataform-controls/array.js.map +1 -1
  264. package/build-module/dataform-controls/checkbox.js +3 -2
  265. package/build-module/dataform-controls/checkbox.js.map +1 -1
  266. package/build-module/dataform-controls/color.js +4 -3
  267. package/build-module/dataform-controls/color.js.map +1 -1
  268. package/build-module/dataform-controls/date.js +7 -6
  269. package/build-module/dataform-controls/date.js.map +1 -1
  270. package/build-module/dataform-controls/datetime.js +7 -12
  271. package/build-module/dataform-controls/datetime.js.map +2 -2
  272. package/build-module/dataform-controls/email.js +2 -1
  273. package/build-module/dataform-controls/email.js.map +1 -1
  274. package/build-module/dataform-controls/index.js +3 -2
  275. package/build-module/dataform-controls/index.js.map +1 -1
  276. package/build-module/dataform-controls/integer.js +2 -1
  277. package/build-module/dataform-controls/integer.js.map +1 -1
  278. package/build-module/dataform-controls/number.js +2 -1
  279. package/build-module/dataform-controls/number.js.map +1 -1
  280. package/build-module/dataform-controls/password.js +2 -1
  281. package/build-module/dataform-controls/password.js.map +1 -1
  282. package/build-module/dataform-controls/radio.js +3 -2
  283. package/build-module/dataform-controls/radio.js.map +1 -1
  284. package/build-module/dataform-controls/select.js +3 -2
  285. package/build-module/dataform-controls/select.js.map +1 -1
  286. package/build-module/dataform-controls/telephone.js +2 -1
  287. package/build-module/dataform-controls/telephone.js.map +1 -1
  288. package/build-module/dataform-controls/text.js +2 -1
  289. package/build-module/dataform-controls/text.js.map +1 -1
  290. package/build-module/dataform-controls/textarea.js +3 -2
  291. package/build-module/dataform-controls/textarea.js.map +1 -1
  292. package/build-module/dataform-controls/toggle-group.js +3 -2
  293. package/build-module/dataform-controls/toggle-group.js.map +1 -1
  294. package/build-module/dataform-controls/toggle.js +3 -2
  295. package/build-module/dataform-controls/toggle.js.map +1 -1
  296. package/build-module/dataform-controls/url.js +2 -1
  297. package/build-module/dataform-controls/url.js.map +1 -1
  298. package/build-module/dataform-controls/utils/get-custom-validity.js +1 -0
  299. package/build-module/dataform-controls/utils/get-custom-validity.js.map +1 -1
  300. package/build-module/dataform-controls/utils/relative-date-control.js +3 -2
  301. package/build-module/dataform-controls/utils/relative-date-control.js.map +1 -1
  302. package/build-module/dataform-controls/utils/validated-input.js +3 -2
  303. package/build-module/dataform-controls/utils/validated-input.js.map +1 -1
  304. package/build-module/dataform-controls/utils/validated-number.js +3 -2
  305. package/build-module/dataform-controls/utils/validated-number.js.map +1 -1
  306. package/build-module/dataform-layouts/card/index.js +63 -33
  307. package/build-module/dataform-layouts/card/index.js.map +3 -3
  308. package/build-module/dataform-layouts/data-form-layout.js +8 -15
  309. package/build-module/dataform-layouts/data-form-layout.js.map +2 -2
  310. package/build-module/dataform-layouts/get-summary-fields.js +2 -1
  311. package/build-module/dataform-layouts/get-summary-fields.js.map +1 -1
  312. package/build-module/dataform-layouts/index.js +3 -2
  313. package/build-module/dataform-layouts/index.js.map +2 -2
  314. package/build-module/dataform-layouts/{normalize-form-fields.js → normalize-form.js} +34 -17
  315. package/build-module/dataform-layouts/normalize-form.js.map +7 -0
  316. package/build-module/dataform-layouts/panel/dropdown.js +7 -7
  317. package/build-module/dataform-layouts/panel/dropdown.js.map +2 -2
  318. package/build-module/dataform-layouts/panel/index.js +9 -14
  319. package/build-module/dataform-layouts/panel/index.js.map +2 -2
  320. package/build-module/dataform-layouts/panel/modal.js +7 -7
  321. package/build-module/dataform-layouts/panel/modal.js.map +2 -2
  322. package/build-module/dataform-layouts/panel/summary-button.js +2 -1
  323. package/build-module/dataform-layouts/panel/summary-button.js.map +1 -1
  324. package/build-module/dataform-layouts/regular/index.js +6 -9
  325. package/build-module/dataform-layouts/regular/index.js.map +2 -2
  326. package/build-module/dataform-layouts/row/index.js +9 -23
  327. package/build-module/dataform-layouts/row/index.js.map +2 -2
  328. package/build-module/dataviews-layouts/grid/index.js +3 -2
  329. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  330. package/build-module/dataviews-layouts/grid/preview-size-picker.js +3 -2
  331. package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  332. package/build-module/dataviews-layouts/index.js +2 -1
  333. package/build-module/dataviews-layouts/index.js.map +1 -1
  334. package/build-module/dataviews-layouts/list/index.js +5 -6
  335. package/build-module/dataviews-layouts/list/index.js.map +2 -2
  336. package/build-module/dataviews-layouts/picker-grid/index.js +3 -2
  337. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
  338. package/build-module/dataviews-layouts/table/column-header-menu.js +5 -4
  339. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  340. package/build-module/dataviews-layouts/table/column-primary.js +2 -1
  341. package/build-module/dataviews-layouts/table/column-primary.js.map +1 -1
  342. package/build-module/dataviews-layouts/table/density-picker.js +2 -1
  343. package/build-module/dataviews-layouts/table/density-picker.js.map +1 -1
  344. package/build-module/dataviews-layouts/table/index.js +2 -1
  345. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  346. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js +2 -1
  347. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -1
  348. package/build-module/dataviews-layouts/utils/get-data-by-group.js +1 -0
  349. package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -1
  350. package/build-module/dataviews-layouts/utils/grid-items.js +3 -2
  351. package/build-module/dataviews-layouts/utils/grid-items.js.map +1 -1
  352. package/build-module/dataviews-layouts/utils/item-click-wrapper.js +2 -1
  353. package/build-module/dataviews-layouts/utils/item-click-wrapper.js.map +1 -1
  354. package/build-module/dataviews-layouts/utils/preview-size-picker.js +3 -2
  355. package/build-module/dataviews-layouts/utils/preview-size-picker.js.map +1 -1
  356. package/build-module/field-types/array.js +2 -1
  357. package/build-module/field-types/array.js.map +1 -1
  358. package/build-module/field-types/boolean.js +2 -1
  359. package/build-module/field-types/boolean.js.map +1 -1
  360. package/build-module/field-types/color.js +2 -1
  361. package/build-module/field-types/color.js.map +1 -1
  362. package/build-module/field-types/date.js +3 -2
  363. package/build-module/field-types/date.js.map +1 -1
  364. package/build-module/field-types/datetime.js +16 -2
  365. package/build-module/field-types/datetime.js.map +2 -2
  366. package/build-module/field-types/email.js +3 -2
  367. package/build-module/field-types/email.js.map +1 -1
  368. package/build-module/field-types/index.js +2 -1
  369. package/build-module/field-types/index.js.map +1 -1
  370. package/build-module/field-types/integer.js +2 -1
  371. package/build-module/field-types/integer.js.map +1 -1
  372. package/build-module/field-types/media.js +1 -0
  373. package/build-module/field-types/media.js.map +1 -1
  374. package/build-module/field-types/number.js +2 -1
  375. package/build-module/field-types/number.js.map +1 -1
  376. package/build-module/field-types/password.js +2 -1
  377. package/build-module/field-types/password.js.map +1 -1
  378. package/build-module/field-types/telephone.js +2 -1
  379. package/build-module/field-types/telephone.js.map +1 -1
  380. package/build-module/field-types/text.js +2 -1
  381. package/build-module/field-types/text.js.map +1 -1
  382. package/build-module/field-types/url.js +2 -1
  383. package/build-module/field-types/url.js.map +1 -1
  384. package/build-module/field-types/utils/parse-date-time.js +14 -0
  385. package/build-module/field-types/utils/parse-date-time.js.map +7 -0
  386. package/build-module/field-types/utils/render-from-elements.js +1 -0
  387. package/build-module/field-types/utils/render-from-elements.js.map +1 -1
  388. package/build-module/hooks/index.js +1 -0
  389. package/build-module/hooks/index.js.map +1 -1
  390. package/build-module/hooks/use-elements.js +2 -1
  391. package/build-module/hooks/use-elements.js.map +1 -1
  392. package/build-module/hooks/use-form-validity.js +424 -321
  393. package/build-module/hooks/use-form-validity.js.map +3 -3
  394. package/build-module/index.js +1 -0
  395. package/build-module/index.js.map +1 -1
  396. package/build-module/lock-unlock.js +2 -1
  397. package/build-module/lock-unlock.js.map +1 -1
  398. package/build-module/utils/filter-sort-and-paginate.js +2 -1
  399. package/build-module/utils/filter-sort-and-paginate.js.map +1 -1
  400. package/build-module/utils/has-elements.js +1 -0
  401. package/build-module/utils/has-elements.js.map +1 -1
  402. package/build-module/utils/normalize-fields.js +3 -2
  403. package/build-module/utils/normalize-fields.js.map +1 -1
  404. package/build-types/components/dataform/index.d.ts.map +1 -1
  405. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
  406. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
  407. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  408. package/build-types/dataform-layouts/card/index.d.ts +1 -1
  409. package/build-types/dataform-layouts/card/index.d.ts.map +1 -1
  410. package/build-types/dataform-layouts/data-form-layout.d.ts +4 -4
  411. package/build-types/dataform-layouts/data-form-layout.d.ts.map +1 -1
  412. package/build-types/dataform-layouts/index.d.ts +2 -2
  413. package/build-types/dataform-layouts/index.d.ts.map +1 -1
  414. package/build-types/dataform-layouts/normalize-form.d.ts +8 -0
  415. package/build-types/dataform-layouts/normalize-form.d.ts.map +1 -0
  416. package/build-types/dataform-layouts/panel/dropdown.d.ts +2 -2
  417. package/build-types/dataform-layouts/panel/dropdown.d.ts.map +1 -1
  418. package/build-types/dataform-layouts/panel/index.d.ts.map +1 -1
  419. package/build-types/dataform-layouts/panel/modal.d.ts +2 -2
  420. package/build-types/dataform-layouts/panel/modal.d.ts.map +1 -1
  421. package/build-types/dataform-layouts/regular/index.d.ts.map +1 -1
  422. package/build-types/dataform-layouts/row/index.d.ts.map +1 -1
  423. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  424. package/build-types/field-types/datetime.d.ts +1 -1
  425. package/build-types/field-types/datetime.d.ts.map +1 -1
  426. package/build-types/field-types/utils/parse-date-time.d.ts +2 -0
  427. package/build-types/field-types/utils/parse-date-time.d.ts.map +1 -0
  428. package/build-types/hooks/use-form-validity.d.ts.map +1 -1
  429. package/build-types/stories/dataform.story.d.ts +1 -10
  430. package/build-types/stories/dataform.story.d.ts.map +1 -1
  431. package/build-types/stories/dataviews-picker.story.d.ts +31 -0
  432. package/build-types/stories/dataviews-picker.story.d.ts.map +1 -1
  433. package/build-types/stories/dataviews.fixtures.d.ts.map +1 -1
  434. package/build-types/test/normalize-form.d.ts +2 -0
  435. package/build-types/test/normalize-form.d.ts.map +1 -0
  436. package/build-types/types/dataform.d.ts +12 -6
  437. package/build-types/types/dataform.d.ts.map +1 -1
  438. package/build-wp/index.js +738 -532
  439. package/package.json +15 -15
  440. package/src/components/dataform/index.tsx +3 -1
  441. package/src/components/dataviews-filters/filter.tsx +16 -1
  442. package/src/components/dataviews-item-actions/index.tsx +37 -14
  443. package/src/dataform-controls/datetime.tsx +3 -10
  444. package/src/dataform-layouts/card/index.tsx +45 -21
  445. package/src/dataform-layouts/data-form-layout.tsx +12 -23
  446. package/src/dataform-layouts/index.tsx +5 -3
  447. package/src/dataform-layouts/{normalize-form-fields.ts → normalize-form.ts} +39 -23
  448. package/src/dataform-layouts/panel/dropdown.tsx +10 -13
  449. package/src/dataform-layouts/panel/index.tsx +9 -24
  450. package/src/dataform-layouts/panel/modal.tsx +15 -15
  451. package/src/dataform-layouts/regular/index.tsx +7 -12
  452. package/src/dataform-layouts/row/index.tsx +13 -26
  453. package/src/dataviews-layouts/list/index.tsx +2 -5
  454. package/src/field-types/datetime.tsx +16 -5
  455. package/src/field-types/utils/parse-date-time.ts +17 -0
  456. package/src/hooks/use-form-validity.ts +572 -422
  457. package/src/stories/dataform.story.tsx +502 -454
  458. package/src/stories/dataviews-picker.story.tsx +155 -32
  459. package/src/stories/dataviews.fixtures.tsx +4 -1
  460. package/src/stories/field-types.story.tsx +7 -7
  461. package/src/test/normalize-form.ts +568 -0
  462. package/src/test/use-form-validity.ts +318 -33
  463. package/src/types/dataform.ts +12 -8
  464. package/tsconfig.tsbuildinfo +1 -1
  465. package/build/dataform-layouts/is-combined-field.js.map +0 -7
  466. package/build/dataform-layouts/normalize-form-fields.js.map +0 -7
  467. package/build-module/dataform-layouts/is-combined-field.js +0 -7
  468. package/build-module/dataform-layouts/is-combined-field.js.map +0 -7
  469. package/build-module/dataform-layouts/normalize-form-fields.js.map +0 -7
  470. package/build-types/dataform-layouts/is-combined-field.d.ts +0 -6
  471. package/build-types/dataform-layouts/is-combined-field.d.ts.map +0 -1
  472. package/build-types/dataform-layouts/normalize-form-fields.d.ts +0 -19
  473. package/build-types/dataform-layouts/normalize-form-fields.d.ts.map +0 -1
  474. package/build-types/test/normalize-form-fields.d.ts +0 -2
  475. package/build-types/test/normalize-form-fields.d.ts.map +0 -1
  476. package/src/dataform-layouts/is-combined-field.ts +0 -10
  477. package/src/test/normalize-form-fields.ts +0 -324
@@ -539,13 +539,11 @@ function CustomEditControl< Item >( {
539
539
  const ValidationComponent = ( {
540
540
  required,
541
541
  elements,
542
- type,
543
542
  custom,
544
543
  }: {
545
544
  required: boolean;
546
545
  elements: 'sync' | 'async' | 'none';
547
546
  custom: 'sync' | 'async' | 'none';
548
- type: 'regular' | 'panel';
549
547
  } ) => {
550
548
  type ValidatedItem = {
551
549
  text: string;
@@ -570,10 +568,6 @@ const ValidationComponent = ( {
570
568
  datetime?: string;
571
569
  };
572
570
 
573
- const DateRangeEdit = ( props: DataFormControlProps< ValidatedItem > ) => {
574
- return <DateControl { ...props } operator="between" />;
575
- };
576
-
577
571
  const [ post, setPost ] = useState< ValidatedItem >( {
578
572
  text: 'Can have letters and spaces',
579
573
  select: undefined,
@@ -597,184 +591,6 @@ const ValidationComponent = ( {
597
591
  datetime: undefined,
598
592
  } );
599
593
 
600
- const makeAsync = ( rule: ( item: ValidatedItem ) => null | string ) => {
601
- return async ( value: ValidatedItem ) => {
602
- return await new Promise< string | null >( ( resolve ) => {
603
- setTimeout( () => {
604
- const validationResult = rule( value );
605
- resolve( validationResult );
606
- }, 2000 );
607
- } );
608
- };
609
- };
610
-
611
- const customTextRule = ( value: ValidatedItem ) => {
612
- if ( ! /^[a-zA-Z ]+$/.test( value.text ) ) {
613
- return 'Value must only contain letters and spaces.';
614
- }
615
-
616
- return null;
617
- };
618
-
619
- const customSelectRule = ( value: ValidatedItem ) => {
620
- if ( value.select !== 'option1' ) {
621
- return 'Value must be Option 1.';
622
- }
623
- return null;
624
- };
625
-
626
- const customTextRadioRule = ( value: ValidatedItem ) => {
627
- if ( value.textWithRadio !== 'item1' ) {
628
- return 'Value must be Item 1.';
629
- }
630
-
631
- return null;
632
- };
633
-
634
- const customTextareaRule = ( value: ValidatedItem ) => {
635
- if ( ! /^[a-zA-Z ]+$/.test( value.textarea ) ) {
636
- return 'Value must only contain letters and spaces.';
637
- }
638
-
639
- return null;
640
- };
641
- const customEmailRule = ( value: ValidatedItem ) => {
642
- if ( ! /^[a-zA-Z0-9._%+-]+@example\.com$/.test( value.email ) ) {
643
- return 'Email address must be from @example.com domain.';
644
- }
645
-
646
- return null;
647
- };
648
- const customTelephoneRule = ( value: ValidatedItem ) => {
649
- if ( ! /^\+30\d{10}$/.test( value.telephone ) ) {
650
- return 'Telephone number must start with +30 and have 10 digits after.';
651
- }
652
-
653
- return null;
654
- };
655
- const customUrlRule = ( value: ValidatedItem ) => {
656
- if ( ! /^https:\/\/example\.com$/.test( value.url ) ) {
657
- return 'URL must be from https://example.com domain.';
658
- }
659
-
660
- return null;
661
- };
662
- const customColorRule = ( value: ValidatedItem ) => {
663
- if ( ! /^#[0-9A-Fa-f]{6}$/.test( value.color ) ) {
664
- return 'Color must be a valid hex format (e.g., #ff6600).';
665
- }
666
-
667
- return null;
668
- };
669
- const customIntegerRule = ( value: ValidatedItem ) => {
670
- if ( value.integer % 2 !== 0 ) {
671
- return 'Integer must be an even number.';
672
- }
673
-
674
- return null;
675
- };
676
- const customNumberRule = ( value: ValidatedItem ) => {
677
- if ( ! /^\d+\.\d{2}$/.test( value?.number?.toString() ) ) {
678
- return 'Number must have exactly two decimal places.';
679
- }
680
-
681
- return null;
682
- };
683
- const customBooleanRule = ( value: ValidatedItem ) => {
684
- if ( value.boolean !== true ) {
685
- return 'Boolean must be active.';
686
- }
687
-
688
- return null;
689
- };
690
- const customToggleRule = ( value: ValidatedItem ) => {
691
- if ( value.toggle !== true ) {
692
- return 'Toggle must be checked.';
693
- }
694
-
695
- return null;
696
- };
697
- const customToggleGroupRule = ( value: ValidatedItem ) => {
698
- if ( value.toggleGroup !== 'option1' ) {
699
- return 'Value must be Option 1.';
700
- }
701
-
702
- return null;
703
- };
704
-
705
- const customPasswordRule = ( value: ValidatedItem ) => {
706
- if ( value.password.length < 8 ) {
707
- return 'Password must be at least 8 characters long.';
708
- }
709
- if ( ! /[A-Z]/.test( value.password ) ) {
710
- return 'Password must contain at least one uppercase letter.';
711
- }
712
- if ( ! /[0-9]/.test( value.password ) ) {
713
- return 'Password must contain at least one number.';
714
- }
715
-
716
- return null;
717
- };
718
-
719
- const customDateRule = ( value: ValidatedItem ) => {
720
- if ( ! value.date ) {
721
- return null;
722
- }
723
- const selectedDate = new Date( value.date );
724
- const today = new Date();
725
- today.setHours( 0, 0, 0, 0 );
726
- if ( selectedDate < today ) {
727
- return 'Date must not be in the past.';
728
- }
729
-
730
- return null;
731
- };
732
- const customDateTimeRule = ( value: ValidatedItem ) => {
733
- if ( ! value.datetime ) {
734
- return null;
735
- }
736
- const selectedDateTime = new Date( value.datetime );
737
- const now = new Date();
738
- if ( selectedDateTime < now ) {
739
- return 'Date and time must not be in the past.';
740
- }
741
-
742
- return null;
743
- };
744
-
745
- const customDateRangeRule = ( value: ValidatedItem ) => {
746
- if ( ! value.dateRange ) {
747
- return null;
748
- }
749
- const [ fromDate, toDate ] = value.dateRange;
750
- if ( ! fromDate || ! toDate ) {
751
- return null;
752
- }
753
- const from = new Date( fromDate );
754
- const to = new Date( toDate );
755
- const daysDiff = Math.ceil(
756
- ( to.getTime() - from.getTime() ) / ( 1000 * 60 * 60 * 24 )
757
- );
758
- if ( daysDiff > 30 ) {
759
- return 'Date range must not exceed 30 days.';
760
- }
761
- return null;
762
- };
763
-
764
- const maybeCustomRule = (
765
- rule: ( item: ValidatedItem ) => null | string
766
- ) => {
767
- if ( custom === 'sync' ) {
768
- return rule;
769
- }
770
-
771
- if ( custom === 'async' ) {
772
- return makeAsync( rule );
773
- }
774
-
775
- return undefined;
776
- };
777
-
778
594
  // Cache for getElements functions - ensures promises are only created once
779
595
  const getElements = useMemo( () => {
780
596
  const promiseCache: Record< string, Promise< any > > = {};
@@ -810,8 +626,14 @@ const ValidationComponent = ( {
810
626
  setTimeout(
811
627
  () =>
812
628
  resolve( [
813
- { value: 'item1', label: 'Item 1' },
814
- { value: 'item2', label: 'Item 2' },
629
+ {
630
+ value: 'item1',
631
+ label: 'Item 1',
632
+ },
633
+ {
634
+ value: 'item2',
635
+ label: 'Item 2',
636
+ },
815
637
  ] ),
816
638
  3500
817
639
  )
@@ -827,15 +649,27 @@ const ValidationComponent = ( {
827
649
  value: 'us',
828
650
  label: 'United States',
829
651
  },
830
- { value: 'ca', label: 'Canada' },
652
+ {
653
+ value: 'ca',
654
+ label: 'Canada',
655
+ },
831
656
  {
832
657
  value: 'uk',
833
658
  label: 'United Kingdom',
834
659
  },
835
- { value: 'fr', label: 'France' },
836
- { value: 'de', label: 'Germany' },
660
+ {
661
+ value: 'fr',
662
+ label: 'France',
663
+ },
664
+ {
665
+ value: 'de',
666
+ label: 'Germany',
667
+ },
837
668
  { value: 'jp', label: 'Japan' },
838
- { value: 'au', label: 'Australia' },
669
+ {
670
+ value: 'au',
671
+ label: 'Australia',
672
+ },
839
673
  ] ),
840
674
  3500
841
675
  )
@@ -872,279 +706,503 @@ const ValidationComponent = ( {
872
706
  return promiseCache[ fieldId ];
873
707
  };
874
708
  };
875
- }, [ elements ] );
709
+ }, [] );
876
710
 
877
- const _fields: Field< ValidatedItem >[] = [
878
- {
879
- id: 'text',
880
- type: 'text',
881
- label: 'Text',
882
- isValid: {
883
- required,
884
- elements: elements !== 'none' ? true : false,
885
- custom: maybeCustomRule( customTextRule ),
886
- },
887
- },
888
- {
889
- id: 'select',
890
- type: 'text',
891
- label: 'Select',
892
- elements:
893
- elements === 'async'
894
- ? undefined
895
- : [
896
- { value: 'option1', label: 'Option 1' },
897
- { value: 'option2', label: 'Option 2' },
898
- ],
899
- getElements:
900
- elements === 'async' ? getElements( 'select' ) : undefined,
901
- isValid: {
902
- required,
903
- elements: elements !== 'none' ? true : false,
904
- custom: maybeCustomRule( customSelectRule ),
711
+ const _fields: Field< ValidatedItem >[] = useMemo( () => {
712
+ const DateRangeEdit = (
713
+ props: DataFormControlProps< ValidatedItem >
714
+ ) => {
715
+ return <DateControl { ...props } operator="between" />;
716
+ };
717
+ const makeAsync = (
718
+ rule: ( item: ValidatedItem ) => null | string
719
+ ) => {
720
+ return async ( value: ValidatedItem ) => {
721
+ return await new Promise< string | null >( ( resolve ) => {
722
+ setTimeout( () => {
723
+ const validationResult = rule( value );
724
+ resolve( validationResult );
725
+ }, 2000 );
726
+ } );
727
+ };
728
+ };
729
+
730
+ const customTextRule = ( value: ValidatedItem ) => {
731
+ if ( ! /^[a-zA-Z ]+$/.test( value.text ) ) {
732
+ return 'Value must only contain letters and spaces.';
733
+ }
734
+
735
+ return null;
736
+ };
737
+
738
+ const customSelectRule = ( value: ValidatedItem ) => {
739
+ if ( value.select !== 'option1' ) {
740
+ return 'Value must be Option 1.';
741
+ }
742
+ return null;
743
+ };
744
+
745
+ const customTextRadioRule = ( value: ValidatedItem ) => {
746
+ if ( value.textWithRadio !== 'item1' ) {
747
+ return 'Value must be Item 1.';
748
+ }
749
+
750
+ return null;
751
+ };
752
+
753
+ const customTextareaRule = ( value: ValidatedItem ) => {
754
+ if ( ! /^[a-zA-Z ]+$/.test( value.textarea ) ) {
755
+ return 'Value must only contain letters and spaces.';
756
+ }
757
+
758
+ return null;
759
+ };
760
+ const customEmailRule = ( value: ValidatedItem ) => {
761
+ if ( ! /^[a-zA-Z0-9._%+-]+@example\.com$/.test( value.email ) ) {
762
+ return 'Email address must be from @example.com domain.';
763
+ }
764
+
765
+ return null;
766
+ };
767
+ const customTelephoneRule = ( value: ValidatedItem ) => {
768
+ if ( ! /^\+30\d{10}$/.test( value.telephone ) ) {
769
+ return 'Telephone number must start with +30 and have 10 digits after.';
770
+ }
771
+
772
+ return null;
773
+ };
774
+ const customUrlRule = ( value: ValidatedItem ) => {
775
+ if ( ! /^https:\/\/example\.com$/.test( value.url ) ) {
776
+ return 'URL must be from https://example.com domain.';
777
+ }
778
+
779
+ return null;
780
+ };
781
+ const customColorRule = ( value: ValidatedItem ) => {
782
+ if ( ! /^#[0-9A-Fa-f]{6}$/.test( value.color ) ) {
783
+ return 'Color must be a valid hex format (e.g., #ff6600).';
784
+ }
785
+
786
+ return null;
787
+ };
788
+ const customIntegerRule = ( value: ValidatedItem ) => {
789
+ if ( value.integer % 2 !== 0 ) {
790
+ return 'Integer must be an even number.';
791
+ }
792
+
793
+ return null;
794
+ };
795
+ const customNumberRule = ( value: ValidatedItem ) => {
796
+ if ( ! /^\d+\.\d{2}$/.test( value?.number?.toString() ) ) {
797
+ return 'Number must have exactly two decimal places.';
798
+ }
799
+
800
+ return null;
801
+ };
802
+ const customBooleanRule = ( value: ValidatedItem ) => {
803
+ if ( value.boolean !== true ) {
804
+ return 'Boolean must be active.';
805
+ }
806
+
807
+ return null;
808
+ };
809
+ const customToggleRule = ( value: ValidatedItem ) => {
810
+ if ( value.toggle !== true ) {
811
+ return 'Toggle must be checked.';
812
+ }
813
+
814
+ return null;
815
+ };
816
+ const customToggleGroupRule = ( value: ValidatedItem ) => {
817
+ if ( value.toggleGroup !== 'option1' ) {
818
+ return 'Value must be Option 1.';
819
+ }
820
+
821
+ return null;
822
+ };
823
+
824
+ const customPasswordRule = ( value: ValidatedItem ) => {
825
+ if ( value.password.length < 8 ) {
826
+ return 'Password must be at least 8 characters long.';
827
+ }
828
+ if ( ! /[A-Z]/.test( value.password ) ) {
829
+ return 'Password must contain at least one uppercase letter.';
830
+ }
831
+ if ( ! /[0-9]/.test( value.password ) ) {
832
+ return 'Password must contain at least one number.';
833
+ }
834
+
835
+ return null;
836
+ };
837
+
838
+ const customDateRule = ( value: ValidatedItem ) => {
839
+ if ( ! value.date ) {
840
+ return null;
841
+ }
842
+ const selectedDate = new Date( value.date );
843
+ const today = new Date();
844
+ today.setHours( 0, 0, 0, 0 );
845
+ if ( selectedDate < today ) {
846
+ return 'Date must not be in the past.';
847
+ }
848
+
849
+ return null;
850
+ };
851
+ const customDateTimeRule = ( value: ValidatedItem ) => {
852
+ if ( ! value.datetime ) {
853
+ return null;
854
+ }
855
+ const selectedDateTime = new Date( value.datetime );
856
+ const now = new Date();
857
+ if ( selectedDateTime < now ) {
858
+ return 'Date and time must not be in the past.';
859
+ }
860
+
861
+ return null;
862
+ };
863
+
864
+ const customDateRangeRule = ( value: ValidatedItem ) => {
865
+ if ( ! value.dateRange ) {
866
+ return null;
867
+ }
868
+ const [ fromDate, toDate ] = value.dateRange;
869
+ if ( ! fromDate || ! toDate ) {
870
+ return null;
871
+ }
872
+ const from = new Date( fromDate );
873
+ const to = new Date( toDate );
874
+ const daysDiff = Math.ceil(
875
+ ( to.getTime() - from.getTime() ) / ( 1000 * 60 * 60 * 24 )
876
+ );
877
+ if ( daysDiff > 30 ) {
878
+ return 'Date range must not exceed 30 days.';
879
+ }
880
+ return null;
881
+ };
882
+
883
+ const maybeCustomRule = (
884
+ rule: ( item: ValidatedItem ) => null | string
885
+ ) => {
886
+ if ( custom === 'sync' ) {
887
+ return rule;
888
+ }
889
+
890
+ if ( custom === 'async' ) {
891
+ return makeAsync( rule );
892
+ }
893
+
894
+ return undefined;
895
+ };
896
+
897
+ return [
898
+ {
899
+ id: 'text',
900
+ type: 'text',
901
+ label: 'Text',
902
+ isValid: {
903
+ required,
904
+ elements: elements !== 'none' ? true : false,
905
+ custom: maybeCustomRule( customTextRule ),
906
+ },
905
907
  },
906
- },
907
- {
908
- id: 'textWithRadio',
909
- type: 'text',
910
- Edit: 'radio',
911
- label: 'Text with radio',
912
- elements:
913
- elements === 'async'
914
- ? undefined
915
- : [
916
- { value: 'item1', label: 'Item 1' },
917
- { value: 'item2', label: 'Item 2' },
918
- ],
919
- getElements:
920
- elements === 'async'
921
- ? getElements( 'textWithRadio' )
922
- : undefined,
923
- isValid: {
924
- required,
925
- elements: elements !== 'none' ? true : false,
926
- custom: maybeCustomRule( customTextRadioRule ),
908
+ {
909
+ id: 'select',
910
+ type: 'text',
911
+ label: 'Select',
912
+ elements:
913
+ elements === 'async'
914
+ ? undefined
915
+ : [
916
+ { value: 'option1', label: 'Option 1' },
917
+ { value: 'option2', label: 'Option 2' },
918
+ ],
919
+ getElements:
920
+ elements === 'async' ? getElements( 'select' ) : undefined,
921
+ isValid: {
922
+ required,
923
+ elements: elements !== 'none' ? true : false,
924
+ custom: maybeCustomRule( customSelectRule ),
925
+ },
927
926
  },
928
- },
929
- {
930
- id: 'textarea',
931
- type: 'text',
932
- Edit: 'textarea',
933
- label: 'Textarea',
934
- isValid: {
935
- required,
936
- elements: elements !== 'none' ? true : false,
937
- custom: maybeCustomRule( customTextareaRule ),
927
+ {
928
+ id: 'textWithRadio',
929
+ type: 'text',
930
+ Edit: 'radio',
931
+ label: 'Text with radio',
932
+ elements:
933
+ elements === 'async'
934
+ ? undefined
935
+ : [
936
+ { value: 'item1', label: 'Item 1' },
937
+ { value: 'item2', label: 'Item 2' },
938
+ ],
939
+ getElements:
940
+ elements === 'async'
941
+ ? getElements( 'textWithRadio' )
942
+ : undefined,
943
+ isValid: {
944
+ required,
945
+ elements: elements !== 'none' ? true : false,
946
+ custom: maybeCustomRule( customTextRadioRule ),
947
+ },
938
948
  },
939
- },
940
- {
941
- id: 'email',
942
- type: 'email',
943
- label: 'e-mail',
944
- isValid: {
945
- required,
946
- elements: elements !== 'none' ? true : false,
947
- custom: maybeCustomRule( customEmailRule ),
949
+ {
950
+ id: 'textarea',
951
+ type: 'text',
952
+ Edit: 'textarea',
953
+ label: 'Textarea',
954
+ isValid: {
955
+ required,
956
+ elements: elements !== 'none' ? true : false,
957
+ custom: maybeCustomRule( customTextareaRule ),
958
+ },
948
959
  },
949
- },
950
- {
951
- id: 'telephone',
952
- type: 'telephone',
953
- label: 'telephone',
954
- isValid: {
955
- required,
956
- elements: elements !== 'none' ? true : false,
957
- custom: maybeCustomRule( customTelephoneRule ),
960
+ {
961
+ id: 'email',
962
+ type: 'email',
963
+ label: 'e-mail',
964
+ isValid: {
965
+ required,
966
+ elements: elements !== 'none' ? true : false,
967
+ custom: maybeCustomRule( customEmailRule ),
968
+ },
958
969
  },
959
- },
960
- {
961
- id: 'url',
962
- type: 'url',
963
- label: 'URL',
964
- isValid: {
965
- required,
966
- elements: elements !== 'none' ? true : false,
967
- custom: maybeCustomRule( customUrlRule ),
970
+ {
971
+ id: 'telephone',
972
+ type: 'telephone',
973
+ label: 'telephone',
974
+ isValid: {
975
+ required,
976
+ elements: elements !== 'none' ? true : false,
977
+ custom: maybeCustomRule( customTelephoneRule ),
978
+ },
968
979
  },
969
- },
970
- {
971
- id: 'color',
972
- type: 'color',
973
- label: 'Color',
974
- isValid: {
975
- required,
976
- elements: elements !== 'none' ? true : false,
977
- custom: maybeCustomRule( customColorRule ),
980
+ {
981
+ id: 'url',
982
+ type: 'url',
983
+ label: 'URL',
984
+ isValid: {
985
+ required,
986
+ elements: elements !== 'none' ? true : false,
987
+ custom: maybeCustomRule( customUrlRule ),
988
+ },
978
989
  },
979
- },
980
- {
981
- id: 'integer',
982
- type: 'integer',
983
- label: 'Integer',
984
- isValid: {
985
- required,
986
- elements: elements !== 'none' ? true : false,
987
- custom: maybeCustomRule( customIntegerRule ),
990
+ {
991
+ id: 'color',
992
+ type: 'color',
993
+ label: 'Color',
994
+ isValid: {
995
+ required,
996
+ elements: elements !== 'none' ? true : false,
997
+ custom: maybeCustomRule( customColorRule ),
998
+ },
988
999
  },
989
- },
990
- {
991
- id: 'number',
992
- type: 'number',
993
- label: 'Number',
994
- isValid: {
995
- required,
996
- elements: elements !== 'none' ? true : false,
997
- custom: maybeCustomRule( customNumberRule ),
1000
+ {
1001
+ id: 'integer',
1002
+ type: 'integer',
1003
+ label: 'Integer',
1004
+ isValid: {
1005
+ required,
1006
+ elements: elements !== 'none' ? true : false,
1007
+ custom: maybeCustomRule( customIntegerRule ),
1008
+ },
998
1009
  },
999
- },
1000
- {
1001
- id: 'boolean',
1002
- type: 'boolean',
1003
- label: 'Boolean',
1004
- isValid: {
1005
- required,
1006
- elements: elements !== 'none' ? true : false,
1007
- custom: maybeCustomRule( customBooleanRule ),
1010
+ {
1011
+ id: 'number',
1012
+ type: 'number',
1013
+ label: 'Number',
1014
+ isValid: {
1015
+ required,
1016
+ elements: elements !== 'none' ? true : false,
1017
+ custom: maybeCustomRule( customNumberRule ),
1018
+ },
1008
1019
  },
1009
- },
1010
- {
1011
- id: 'countries',
1012
- label: 'Countries Visited',
1013
- type: 'array' as const,
1014
- placeholder: 'Select countries',
1015
- description: 'Countries you have visited',
1016
- isValid: {
1017
- required,
1018
- elements: elements !== 'none' ? true : false,
1020
+ {
1021
+ id: 'boolean',
1022
+ type: 'boolean',
1023
+ label: 'Boolean',
1024
+ isValid: {
1025
+ required,
1026
+ elements: elements !== 'none' ? true : false,
1027
+ custom: maybeCustomRule( customBooleanRule ),
1028
+ },
1019
1029
  },
1020
- elements:
1021
- elements === 'async'
1022
- ? undefined
1023
- : [
1024
- { value: 'us', label: 'United States' },
1025
- { value: 'ca', label: 'Canada' },
1026
- { value: 'uk', label: 'United Kingdom' },
1027
- { value: 'fr', label: 'France' },
1028
- { value: 'de', label: 'Germany' },
1029
- { value: 'jp', label: 'Japan' },
1030
- { value: 'au', label: 'Australia' },
1031
- ],
1032
- getElements:
1033
- elements === 'async' ? getElements( 'countries' ) : undefined,
1034
- },
1035
- {
1036
- id: 'customEdit',
1037
- label: 'Custom Control',
1038
- Edit: CustomEditControl,
1039
- isValid: {
1040
- required,
1041
- elements: elements !== 'none' ? true : false,
1030
+ {
1031
+ id: 'array',
1032
+ label: 'Array',
1033
+ type: 'array',
1034
+ placeholder: 'Select countries',
1035
+ description: 'Countries you have visited',
1036
+ isValid: {
1037
+ required,
1038
+ elements: elements !== 'none' ? true : false,
1039
+ },
1040
+ elements:
1041
+ elements === 'async'
1042
+ ? undefined
1043
+ : [
1044
+ { value: 'us', label: 'United States' },
1045
+ { value: 'ca', label: 'Canada' },
1046
+ { value: 'uk', label: 'United Kingdom' },
1047
+ { value: 'fr', label: 'France' },
1048
+ { value: 'de', label: 'Germany' },
1049
+ { value: 'jp', label: 'Japan' },
1050
+ { value: 'au', label: 'Australia' },
1051
+ ],
1052
+ getElements:
1053
+ elements === 'async'
1054
+ ? getElements( 'countries' )
1055
+ : undefined,
1042
1056
  },
1043
- },
1044
- {
1045
- id: 'password',
1046
- type: 'password',
1047
- label: 'Password',
1048
- isValid: {
1049
- required,
1050
- elements: elements !== 'none' ? true : false,
1051
- custom: maybeCustomRule( customPasswordRule ),
1057
+ {
1058
+ id: 'customEdit',
1059
+ label: 'Custom Control',
1060
+ Edit: CustomEditControl,
1061
+ isValid: {
1062
+ required,
1063
+ elements: elements !== 'none' ? true : false,
1064
+ },
1052
1065
  },
1053
- },
1054
- {
1055
- id: 'toggle',
1056
- type: 'boolean',
1057
- label: 'Toggle',
1058
- Edit: 'toggle',
1059
- isValid: {
1060
- required,
1061
- elements: elements !== 'none' ? true : false,
1062
- custom: maybeCustomRule( customToggleRule ),
1066
+ {
1067
+ id: 'password',
1068
+ type: 'password',
1069
+ label: 'Password',
1070
+ isValid: {
1071
+ required,
1072
+ elements: elements !== 'none' ? true : false,
1073
+ custom: maybeCustomRule( customPasswordRule ),
1074
+ },
1063
1075
  },
1064
- },
1065
- {
1066
- id: 'toggleGroup',
1067
- type: 'text',
1068
- label: 'Toggle Group',
1069
- Edit: 'toggleGroup',
1070
- elements:
1071
- elements === 'async'
1072
- ? undefined
1073
- : [
1074
- { value: 'option1', label: 'Option 1' },
1075
- { value: 'option2', label: 'Option 2' },
1076
- { value: 'option3', label: 'Option 3' },
1077
- ],
1078
- getElements:
1079
- elements === 'async' ? getElements( 'toggleGroup' ) : undefined,
1080
- isValid: {
1081
- required,
1082
- elements: elements !== 'none' ? true : false,
1083
- custom: maybeCustomRule( customToggleGroupRule ),
1076
+ {
1077
+ id: 'toggle',
1078
+ type: 'boolean',
1079
+ label: 'Toggle',
1080
+ Edit: 'toggle',
1081
+ isValid: {
1082
+ required,
1083
+ elements: elements !== 'none' ? true : false,
1084
+ custom: maybeCustomRule( customToggleRule ),
1085
+ },
1084
1086
  },
1085
- },
1086
- {
1087
- id: 'date',
1088
- type: 'date',
1089
- label: 'Date',
1090
- isValid: {
1091
- required,
1092
- elements: elements !== 'none' ? true : false,
1093
- custom: maybeCustomRule( customDateRule ),
1087
+ {
1088
+ id: 'toggleGroup',
1089
+ type: 'text',
1090
+ label: 'Toggle Group',
1091
+ Edit: 'toggleGroup',
1092
+ elements:
1093
+ elements === 'async'
1094
+ ? undefined
1095
+ : [
1096
+ { value: 'option1', label: 'Option 1' },
1097
+ { value: 'option2', label: 'Option 2' },
1098
+ { value: 'option3', label: 'Option 3' },
1099
+ ],
1100
+ getElements:
1101
+ elements === 'async'
1102
+ ? getElements( 'toggleGroup' )
1103
+ : undefined,
1104
+ isValid: {
1105
+ required,
1106
+ elements: elements !== 'none' ? true : false,
1107
+ custom: maybeCustomRule( customToggleGroupRule ),
1108
+ },
1094
1109
  },
1095
- },
1096
- {
1097
- id: 'dateRange',
1098
- type: 'date',
1099
- label: 'Date Range',
1100
- Edit: DateRangeEdit,
1101
- isValid: {
1102
- required,
1103
- elements: elements !== 'none' ? true : false,
1104
- custom: maybeCustomRule( customDateRangeRule ),
1110
+ {
1111
+ id: 'date',
1112
+ type: 'date',
1113
+ label: 'Date',
1114
+ isValid: {
1115
+ required,
1116
+ elements: elements !== 'none' ? true : false,
1117
+ custom: maybeCustomRule( customDateRule ),
1118
+ },
1105
1119
  },
1106
- },
1107
- {
1108
- id: 'datetime',
1109
- type: 'datetime',
1110
- label: 'Date Time',
1111
- isValid: {
1112
- required,
1113
- elements: elements !== 'none' ? true : false,
1114
- custom: maybeCustomRule( customDateTimeRule ),
1120
+ {
1121
+ id: 'dateRange',
1122
+ type: 'date',
1123
+ label: 'Date Range',
1124
+ Edit: DateRangeEdit,
1125
+ isValid: {
1126
+ required,
1127
+ elements: elements !== 'none' ? true : false,
1128
+ custom: maybeCustomRule( customDateRangeRule ),
1129
+ },
1115
1130
  },
1116
- },
1117
- ];
1118
-
1119
- const form = {
1120
- layout: { type },
1121
- fields: [
1122
- // Use field object for testing purposes.
1123
- { id: 'text' },
1124
- 'select',
1125
- 'textWithRadio',
1126
- 'textarea',
1127
- 'email',
1128
- 'telephone',
1129
- 'url',
1130
- 'color',
1131
- 'integer',
1132
- 'number',
1133
- 'boolean',
1134
- 'categories',
1135
- 'countries',
1136
- 'toggle',
1137
- 'toggleGroup',
1138
- 'password',
1139
- 'customEdit',
1140
- // Use field object with children for testing purposes.
1141
1131
  {
1142
- id: 'dates',
1143
- label: 'Dates',
1144
- children: [ 'date', 'dateRange', 'datetime' ],
1132
+ id: 'datetime',
1133
+ type: 'datetime',
1134
+ label: 'Date Time',
1135
+ isValid: {
1136
+ required,
1137
+ elements: elements !== 'none' ? true : false,
1138
+ custom: maybeCustomRule( customDateTimeRule ),
1139
+ },
1145
1140
  },
1146
- ],
1147
- };
1141
+ ];
1142
+ }, [ elements, custom, required, getElements ] );
1143
+
1144
+ const form = useMemo(
1145
+ () => ( {
1146
+ fields: [
1147
+ 'text',
1148
+ { id: 'customEdit' },
1149
+ {
1150
+ id: 'level1Integer',
1151
+ children: [ 'integer' ],
1152
+ },
1153
+ {
1154
+ id: 'level1Number',
1155
+ children: [
1156
+ { id: 'level2Number', children: [ 'number' ] },
1157
+ ],
1158
+ },
1159
+ {
1160
+ id: 'level1Email',
1161
+ children: [
1162
+ {
1163
+ id: 'level2Email',
1164
+ children: [
1165
+ { id: 'level3Email', children: [ 'email' ] },
1166
+ ],
1167
+ },
1168
+ ],
1169
+ },
1170
+ {
1171
+ id: 'level1Telephone',
1172
+ children: [
1173
+ {
1174
+ id: 'level2Telephone',
1175
+ children: [
1176
+ {
1177
+ id: 'level3Telephone',
1178
+ children: [
1179
+ {
1180
+ id: 'level4Telephone',
1181
+ children: [ 'telephone' ],
1182
+ },
1183
+ ],
1184
+ },
1185
+ ],
1186
+ },
1187
+ ],
1188
+ },
1189
+ 'url',
1190
+ 'color',
1191
+ 'password',
1192
+ 'textarea',
1193
+ 'select',
1194
+ 'textWithRadio',
1195
+ 'boolean',
1196
+ 'toggle',
1197
+ 'toggleGroup',
1198
+ 'array',
1199
+ 'date',
1200
+ 'dateRange',
1201
+ 'datetime',
1202
+ ],
1203
+ } ),
1204
+ []
1205
+ );
1148
1206
 
1149
1207
  const { validity, isValid } = useFormValidity( post, _fields, form );
1150
1208
 
@@ -1326,7 +1384,7 @@ const LayoutCardComponent = ( {
1326
1384
  isVisible: ( item ) => item.displayPayments,
1327
1385
  render: ( { item } ) => {
1328
1386
  return (
1329
- <p>
1387
+ <p style={ { margin: 0 } }>
1330
1388
  The customer has made a total of { item.totalOrders }{ ' ' }
1331
1389
  orders, amounting to { item.totalRevenue } dollars. The
1332
1390
  average order value is { item.averageOrderValue }{ ' ' }
@@ -1382,17 +1440,13 @@ const LayoutCardComponent = ( {
1382
1440
 
1383
1441
  const form: Form = useMemo(
1384
1442
  () => ( {
1385
- layout: getLayoutFromStoryArgs( {
1386
- type: 'card',
1387
- withHeader,
1388
- } ),
1389
1443
  fields: [
1390
1444
  {
1391
1445
  id: 'customerCard',
1392
1446
  layout: {
1393
1447
  type: 'card',
1394
1448
  summary: 'plan-summary',
1395
- isCollapsible,
1449
+ withHeader,
1396
1450
  },
1397
1451
  label: 'Customer',
1398
1452
  description:
@@ -1946,17 +2000,11 @@ export const Validation = {
1946
2000
  description: 'Whether or not the custom validation rule is active.',
1947
2001
  options: [ 'sync', 'async', 'none' ],
1948
2002
  },
1949
- type: {
1950
- control: { type: 'select' },
1951
- description: 'Chooses the layout type.',
1952
- options: [ 'regular', 'panel', 'card', 'row' ],
1953
- },
1954
2003
  },
1955
2004
  args: {
1956
2005
  required: true,
1957
2006
  elements: 'sync',
1958
2007
  custom: 'sync',
1959
- type: 'regular',
1960
2008
  },
1961
2009
  };
1962
2010