@wordpress/dataviews 10.1.2 → 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 (485) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +1 -0
  3. package/build/components/dataform/index.js +6 -2
  4. package/build/components/dataform/index.js.map +3 -3
  5. package/build/components/dataform-context/index.js +4 -2
  6. package/build/components/dataform-context/index.js.map +1 -1
  7. package/build/components/dataviews/index.js +8 -6
  8. package/build/components/dataviews/index.js.map +1 -1
  9. package/build/components/dataviews-bulk-actions/index.js +4 -2
  10. package/build/components/dataviews-bulk-actions/index.js.map +1 -1
  11. package/build/components/dataviews-context/index.js +3 -1
  12. package/build/components/dataviews-context/index.js.map +1 -1
  13. package/build/components/dataviews-filters/add-filter.js +4 -2
  14. package/build/components/dataviews-filters/add-filter.js.map +1 -1
  15. package/build/components/dataviews-filters/filter.js +20 -5
  16. package/build/components/dataviews-filters/filter.js.map +3 -3
  17. package/build/components/dataviews-filters/filters-toggled.js +3 -1
  18. package/build/components/dataviews-filters/filters-toggled.js.map +1 -1
  19. package/build/components/dataviews-filters/filters.js +3 -1
  20. package/build/components/dataviews-filters/filters.js.map +1 -1
  21. package/build/components/dataviews-filters/index.js +2 -0
  22. package/build/components/dataviews-filters/index.js.map +1 -1
  23. package/build/components/dataviews-filters/input-widget.js +3 -1
  24. package/build/components/dataviews-filters/input-widget.js.map +1 -1
  25. package/build/components/dataviews-filters/reset-filters.js +3 -1
  26. package/build/components/dataviews-filters/reset-filters.js.map +1 -1
  27. package/build/components/dataviews-filters/search-widget.js +8 -6
  28. package/build/components/dataviews-filters/search-widget.js.map +2 -2
  29. package/build/components/dataviews-filters/toggle.js +3 -1
  30. package/build/components/dataviews-filters/toggle.js.map +1 -1
  31. package/build/components/dataviews-filters/use-filters.js +2 -0
  32. package/build/components/dataviews-filters/use-filters.js.map +1 -1
  33. package/build/components/dataviews-filters/utils.js +4 -2
  34. package/build/components/dataviews-filters/utils.js.map +1 -1
  35. package/build/components/dataviews-footer/index.js +4 -2
  36. package/build/components/dataviews-footer/index.js.map +1 -1
  37. package/build/components/dataviews-item-actions/index.js +23 -4
  38. package/build/components/dataviews-item-actions/index.js.map +2 -2
  39. package/build/components/dataviews-layout/index.js +3 -1
  40. package/build/components/dataviews-layout/index.js.map +1 -1
  41. package/build/components/dataviews-pagination/index.js +3 -1
  42. package/build/components/dataviews-pagination/index.js.map +1 -1
  43. package/build/components/dataviews-picker/footer.js +4 -2
  44. package/build/components/dataviews-picker/footer.js.map +1 -1
  45. package/build/components/dataviews-picker/index.js +8 -6
  46. package/build/components/dataviews-picker/index.js.map +1 -1
  47. package/build/components/dataviews-search/index.js +4 -2
  48. package/build/components/dataviews-search/index.js.map +1 -1
  49. package/build/components/dataviews-selection-checkbox/index.js +3 -1
  50. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  51. package/build/components/dataviews-view-config/index.js +6 -4
  52. package/build/components/dataviews-view-config/index.js.map +1 -1
  53. package/build/components/dataviews-view-config/infinite-scroll-toggle.js +3 -1
  54. package/build/components/dataviews-view-config/infinite-scroll-toggle.js.map +1 -1
  55. package/build/constants.js +36 -34
  56. package/build/constants.js.map +1 -1
  57. package/build/dataform-controls/array.js +4 -2
  58. package/build/dataform-controls/array.js.map +1 -1
  59. package/build/dataform-controls/checkbox.js +4 -2
  60. package/build/dataform-controls/checkbox.js.map +1 -1
  61. package/build/dataform-controls/color.js +5 -3
  62. package/build/dataform-controls/color.js.map +1 -1
  63. package/build/dataform-controls/date.js +8 -6
  64. package/build/dataform-controls/date.js.map +1 -1
  65. package/build/dataform-controls/datetime.js +11 -15
  66. package/build/dataform-controls/datetime.js.map +3 -3
  67. package/build/dataform-controls/email.js +3 -1
  68. package/build/dataform-controls/email.js.map +1 -1
  69. package/build/dataform-controls/index.js +4 -2
  70. package/build/dataform-controls/index.js.map +1 -1
  71. package/build/dataform-controls/integer.js +3 -1
  72. package/build/dataform-controls/integer.js.map +1 -1
  73. package/build/dataform-controls/number.js +3 -1
  74. package/build/dataform-controls/number.js.map +1 -1
  75. package/build/dataform-controls/password.js +6 -5
  76. package/build/dataform-controls/password.js.map +3 -3
  77. package/build/dataform-controls/radio.js +4 -2
  78. package/build/dataform-controls/radio.js.map +1 -1
  79. package/build/dataform-controls/select.js +4 -2
  80. package/build/dataform-controls/select.js.map +1 -1
  81. package/build/dataform-controls/telephone.js +3 -1
  82. package/build/dataform-controls/telephone.js.map +1 -1
  83. package/build/dataform-controls/text.js +3 -1
  84. package/build/dataform-controls/text.js.map +1 -1
  85. package/build/dataform-controls/textarea.js +4 -2
  86. package/build/dataform-controls/textarea.js.map +1 -1
  87. package/build/dataform-controls/toggle-group.js +4 -2
  88. package/build/dataform-controls/toggle-group.js.map +1 -1
  89. package/build/dataform-controls/toggle.js +4 -2
  90. package/build/dataform-controls/toggle.js.map +1 -1
  91. package/build/dataform-controls/url.js +3 -1
  92. package/build/dataform-controls/url.js.map +1 -1
  93. package/build/dataform-controls/utils/get-custom-validity.js +2 -0
  94. package/build/dataform-controls/utils/get-custom-validity.js.map +1 -1
  95. package/build/dataform-controls/utils/relative-date-control.js +4 -2
  96. package/build/dataform-controls/utils/relative-date-control.js.map +1 -1
  97. package/build/dataform-controls/utils/validated-input.js +4 -2
  98. package/build/dataform-controls/utils/validated-input.js.map +1 -1
  99. package/build/dataform-controls/utils/validated-number.js +4 -2
  100. package/build/dataform-controls/utils/validated-number.js.map +1 -1
  101. package/build/dataform-layouts/card/index.js +91 -42
  102. package/build/dataform-layouts/card/index.js.map +3 -3
  103. package/build/dataform-layouts/data-form-layout.js +8 -14
  104. package/build/dataform-layouts/data-form-layout.js.map +3 -3
  105. package/build/dataform-layouts/get-summary-fields.js +3 -1
  106. package/build/dataform-layouts/get-summary-fields.js.map +1 -1
  107. package/build/dataform-layouts/index.js +4 -2
  108. package/build/dataform-layouts/index.js.map +2 -2
  109. package/build/dataform-layouts/{normalize-form-fields.js → normalize-form.js} +43 -24
  110. package/build/dataform-layouts/normalize-form.js.map +7 -0
  111. package/build/dataform-layouts/panel/dropdown.js +9 -8
  112. package/build/dataform-layouts/panel/dropdown.js.map +2 -2
  113. package/build/dataform-layouts/panel/index.js +10 -14
  114. package/build/dataform-layouts/panel/index.js.map +2 -2
  115. package/build/dataform-layouts/panel/modal.js +9 -8
  116. package/build/dataform-layouts/panel/modal.js.map +2 -2
  117. package/build/dataform-layouts/panel/summary-button.js +3 -1
  118. package/build/dataform-layouts/panel/summary-button.js.map +1 -1
  119. package/build/dataform-layouts/regular/index.js +8 -10
  120. package/build/dataform-layouts/regular/index.js.map +2 -2
  121. package/build/dataform-layouts/row/index.js +10 -33
  122. package/build/dataform-layouts/row/index.js.map +3 -3
  123. package/build/dataviews-layouts/grid/index.js +4 -2
  124. package/build/dataviews-layouts/grid/index.js.map +1 -1
  125. package/build/dataviews-layouts/grid/preview-size-picker.js +4 -2
  126. package/build/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  127. package/build/dataviews-layouts/index.js +3 -1
  128. package/build/dataviews-layouts/index.js.map +1 -1
  129. package/build/dataviews-layouts/list/index.js +5 -5
  130. package/build/dataviews-layouts/list/index.js.map +2 -2
  131. package/build/dataviews-layouts/picker-grid/index.js +4 -2
  132. package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
  133. package/build/dataviews-layouts/table/column-header-menu.js +6 -4
  134. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
  135. package/build/dataviews-layouts/table/column-primary.js +3 -1
  136. package/build/dataviews-layouts/table/column-primary.js.map +1 -1
  137. package/build/dataviews-layouts/table/density-picker.js +3 -1
  138. package/build/dataviews-layouts/table/density-picker.js.map +1 -1
  139. package/build/dataviews-layouts/table/index.js +3 -1
  140. package/build/dataviews-layouts/table/index.js.map +1 -1
  141. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js +3 -1
  142. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -1
  143. package/build/dataviews-layouts/utils/get-data-by-group.js +2 -0
  144. package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -1
  145. package/build/dataviews-layouts/utils/grid-items.js +4 -2
  146. package/build/dataviews-layouts/utils/grid-items.js.map +1 -1
  147. package/build/dataviews-layouts/utils/item-click-wrapper.js +3 -1
  148. package/build/dataviews-layouts/utils/item-click-wrapper.js.map +1 -1
  149. package/build/dataviews-layouts/utils/preview-size-picker.js +4 -2
  150. package/build/dataviews-layouts/utils/preview-size-picker.js.map +1 -1
  151. package/build/field-types/array.js +3 -1
  152. package/build/field-types/array.js.map +1 -1
  153. package/build/field-types/boolean.js +3 -1
  154. package/build/field-types/boolean.js.map +1 -1
  155. package/build/field-types/color.js +3 -1
  156. package/build/field-types/color.js.map +1 -1
  157. package/build/field-types/date.js +4 -2
  158. package/build/field-types/date.js.map +1 -1
  159. package/build/field-types/datetime.js +17 -2
  160. package/build/field-types/datetime.js.map +3 -3
  161. package/build/field-types/email.js +4 -2
  162. package/build/field-types/email.js.map +1 -1
  163. package/build/field-types/index.js +3 -1
  164. package/build/field-types/index.js.map +1 -1
  165. package/build/field-types/integer.js +3 -1
  166. package/build/field-types/integer.js.map +1 -1
  167. package/build/field-types/media.js +2 -0
  168. package/build/field-types/media.js.map +1 -1
  169. package/build/field-types/number.js +3 -1
  170. package/build/field-types/number.js.map +1 -1
  171. package/build/field-types/password.js +3 -1
  172. package/build/field-types/password.js.map +1 -1
  173. package/build/field-types/telephone.js +3 -1
  174. package/build/field-types/telephone.js.map +1 -1
  175. package/build/field-types/text.js +3 -1
  176. package/build/field-types/text.js.map +1 -1
  177. package/build/field-types/url.js +3 -1
  178. package/build/field-types/url.js.map +1 -1
  179. package/build/{dataform-layouts/is-combined-field.js → field-types/utils/parse-date-time.js} +15 -11
  180. package/build/field-types/utils/parse-date-time.js.map +7 -0
  181. package/build/field-types/utils/render-from-elements.js +2 -0
  182. package/build/field-types/utils/render-from-elements.js.map +1 -1
  183. package/build/hooks/index.js +2 -0
  184. package/build/hooks/index.js.map +1 -1
  185. package/build/hooks/use-elements.js +3 -1
  186. package/build/hooks/use-elements.js.map +1 -1
  187. package/build/hooks/use-form-validity.js +425 -321
  188. package/build/hooks/use-form-validity.js.map +3 -3
  189. package/build/index.js +2 -0
  190. package/build/index.js.map +1 -1
  191. package/build/lock-unlock.js +3 -1
  192. package/build/lock-unlock.js.map +1 -1
  193. package/build/types/dataform.js +2 -0
  194. package/build/types/dataform.js.map +2 -2
  195. package/build/types/dataviews.js +2 -0
  196. package/build/types/dataviews.js.map +1 -1
  197. package/build/types/field-api.js +2 -0
  198. package/build/types/field-api.js.map +1 -1
  199. package/build/types/index.js +2 -0
  200. package/build/types/index.js.map +1 -1
  201. package/build/types/private.js +2 -0
  202. package/build/types/private.js.map +1 -1
  203. package/build/utils/filter-sort-and-paginate.js +3 -1
  204. package/build/utils/filter-sort-and-paginate.js.map +1 -1
  205. package/build/utils/has-elements.js +2 -0
  206. package/build/utils/has-elements.js.map +1 -1
  207. package/build/utils/normalize-fields.js +4 -2
  208. package/build/utils/normalize-fields.js.map +1 -1
  209. package/build-module/components/dataform/index.js +5 -2
  210. package/build-module/components/dataform/index.js.map +2 -2
  211. package/build-module/components/dataform-context/index.js +3 -2
  212. package/build-module/components/dataform-context/index.js.map +1 -1
  213. package/build-module/components/dataviews/index.js +7 -6
  214. package/build-module/components/dataviews/index.js.map +1 -1
  215. package/build-module/components/dataviews-bulk-actions/index.js +3 -2
  216. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
  217. package/build-module/components/dataviews-context/index.js +2 -1
  218. package/build-module/components/dataviews-context/index.js.map +1 -1
  219. package/build-module/components/dataviews-filters/add-filter.js +3 -2
  220. package/build-module/components/dataviews-filters/add-filter.js.map +1 -1
  221. package/build-module/components/dataviews-filters/filter.js +19 -5
  222. package/build-module/components/dataviews-filters/filter.js.map +2 -2
  223. package/build-module/components/dataviews-filters/filters-toggled.js +2 -1
  224. package/build-module/components/dataviews-filters/filters-toggled.js.map +1 -1
  225. package/build-module/components/dataviews-filters/filters.js +2 -1
  226. package/build-module/components/dataviews-filters/filters.js.map +1 -1
  227. package/build-module/components/dataviews-filters/index.js +1 -0
  228. package/build-module/components/dataviews-filters/index.js.map +1 -1
  229. package/build-module/components/dataviews-filters/input-widget.js +2 -1
  230. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  231. package/build-module/components/dataviews-filters/reset-filters.js +2 -1
  232. package/build-module/components/dataviews-filters/reset-filters.js.map +1 -1
  233. package/build-module/components/dataviews-filters/search-widget.js +7 -6
  234. package/build-module/components/dataviews-filters/search-widget.js.map +2 -2
  235. package/build-module/components/dataviews-filters/toggle.js +2 -1
  236. package/build-module/components/dataviews-filters/toggle.js.map +1 -1
  237. package/build-module/components/dataviews-filters/use-filters.js +1 -0
  238. package/build-module/components/dataviews-filters/use-filters.js.map +1 -1
  239. package/build-module/components/dataviews-filters/utils.js +3 -2
  240. package/build-module/components/dataviews-filters/utils.js.map +1 -1
  241. package/build-module/components/dataviews-footer/index.js +3 -2
  242. package/build-module/components/dataviews-footer/index.js.map +1 -1
  243. package/build-module/components/dataviews-item-actions/index.js +22 -4
  244. package/build-module/components/dataviews-item-actions/index.js.map +2 -2
  245. package/build-module/components/dataviews-layout/index.js +2 -1
  246. package/build-module/components/dataviews-layout/index.js.map +1 -1
  247. package/build-module/components/dataviews-pagination/index.js +2 -1
  248. package/build-module/components/dataviews-pagination/index.js.map +1 -1
  249. package/build-module/components/dataviews-picker/footer.js +3 -2
  250. package/build-module/components/dataviews-picker/footer.js.map +1 -1
  251. package/build-module/components/dataviews-picker/index.js +7 -6
  252. package/build-module/components/dataviews-picker/index.js.map +1 -1
  253. package/build-module/components/dataviews-search/index.js +3 -2
  254. package/build-module/components/dataviews-search/index.js.map +1 -1
  255. package/build-module/components/dataviews-selection-checkbox/index.js +2 -1
  256. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  257. package/build-module/components/dataviews-view-config/index.js +5 -4
  258. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  259. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js +2 -1
  260. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js.map +1 -1
  261. package/build-module/constants.js +35 -34
  262. package/build-module/constants.js.map +1 -1
  263. package/build-module/dataform-controls/array.js +3 -2
  264. package/build-module/dataform-controls/array.js.map +1 -1
  265. package/build-module/dataform-controls/checkbox.js +3 -2
  266. package/build-module/dataform-controls/checkbox.js.map +1 -1
  267. package/build-module/dataform-controls/color.js +4 -3
  268. package/build-module/dataform-controls/color.js.map +1 -1
  269. package/build-module/dataform-controls/date.js +7 -6
  270. package/build-module/dataform-controls/date.js.map +1 -1
  271. package/build-module/dataform-controls/datetime.js +7 -12
  272. package/build-module/dataform-controls/datetime.js.map +2 -2
  273. package/build-module/dataform-controls/email.js +2 -1
  274. package/build-module/dataform-controls/email.js.map +1 -1
  275. package/build-module/dataform-controls/index.js +3 -2
  276. package/build-module/dataform-controls/index.js.map +1 -1
  277. package/build-module/dataform-controls/integer.js +2 -1
  278. package/build-module/dataform-controls/integer.js.map +1 -1
  279. package/build-module/dataform-controls/number.js +2 -1
  280. package/build-module/dataform-controls/number.js.map +1 -1
  281. package/build-module/dataform-controls/password.js +9 -6
  282. package/build-module/dataform-controls/password.js.map +2 -2
  283. package/build-module/dataform-controls/radio.js +3 -2
  284. package/build-module/dataform-controls/radio.js.map +1 -1
  285. package/build-module/dataform-controls/select.js +3 -2
  286. package/build-module/dataform-controls/select.js.map +1 -1
  287. package/build-module/dataform-controls/telephone.js +2 -1
  288. package/build-module/dataform-controls/telephone.js.map +1 -1
  289. package/build-module/dataform-controls/text.js +2 -1
  290. package/build-module/dataform-controls/text.js.map +1 -1
  291. package/build-module/dataform-controls/textarea.js +3 -2
  292. package/build-module/dataform-controls/textarea.js.map +1 -1
  293. package/build-module/dataform-controls/toggle-group.js +3 -2
  294. package/build-module/dataform-controls/toggle-group.js.map +1 -1
  295. package/build-module/dataform-controls/toggle.js +3 -2
  296. package/build-module/dataform-controls/toggle.js.map +1 -1
  297. package/build-module/dataform-controls/url.js +2 -1
  298. package/build-module/dataform-controls/url.js.map +1 -1
  299. package/build-module/dataform-controls/utils/get-custom-validity.js +1 -0
  300. package/build-module/dataform-controls/utils/get-custom-validity.js.map +1 -1
  301. package/build-module/dataform-controls/utils/relative-date-control.js +3 -2
  302. package/build-module/dataform-controls/utils/relative-date-control.js.map +1 -1
  303. package/build-module/dataform-controls/utils/validated-input.js +3 -2
  304. package/build-module/dataform-controls/utils/validated-input.js.map +1 -1
  305. package/build-module/dataform-controls/utils/validated-number.js +3 -2
  306. package/build-module/dataform-controls/utils/validated-number.js.map +1 -1
  307. package/build-module/dataform-layouts/card/index.js +95 -42
  308. package/build-module/dataform-layouts/card/index.js.map +3 -3
  309. package/build-module/dataform-layouts/data-form-layout.js +8 -15
  310. package/build-module/dataform-layouts/data-form-layout.js.map +2 -2
  311. package/build-module/dataform-layouts/get-summary-fields.js +2 -1
  312. package/build-module/dataform-layouts/get-summary-fields.js.map +1 -1
  313. package/build-module/dataform-layouts/index.js +3 -2
  314. package/build-module/dataform-layouts/index.js.map +2 -2
  315. package/build-module/dataform-layouts/{normalize-form-fields.js → normalize-form.js} +38 -19
  316. package/build-module/dataform-layouts/normalize-form.js.map +7 -0
  317. package/build-module/dataform-layouts/panel/dropdown.js +7 -7
  318. package/build-module/dataform-layouts/panel/dropdown.js.map +2 -2
  319. package/build-module/dataform-layouts/panel/index.js +9 -14
  320. package/build-module/dataform-layouts/panel/index.js.map +2 -2
  321. package/build-module/dataform-layouts/panel/modal.js +7 -7
  322. package/build-module/dataform-layouts/panel/modal.js.map +2 -2
  323. package/build-module/dataform-layouts/panel/summary-button.js +2 -1
  324. package/build-module/dataform-layouts/panel/summary-button.js.map +1 -1
  325. package/build-module/dataform-layouts/regular/index.js +6 -9
  326. package/build-module/dataform-layouts/regular/index.js.map +2 -2
  327. package/build-module/dataform-layouts/row/index.js +9 -23
  328. package/build-module/dataform-layouts/row/index.js.map +2 -2
  329. package/build-module/dataviews-layouts/grid/index.js +3 -2
  330. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  331. package/build-module/dataviews-layouts/grid/preview-size-picker.js +3 -2
  332. package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  333. package/build-module/dataviews-layouts/index.js +2 -1
  334. package/build-module/dataviews-layouts/index.js.map +1 -1
  335. package/build-module/dataviews-layouts/list/index.js +4 -5
  336. package/build-module/dataviews-layouts/list/index.js.map +2 -2
  337. package/build-module/dataviews-layouts/picker-grid/index.js +3 -2
  338. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
  339. package/build-module/dataviews-layouts/table/column-header-menu.js +5 -4
  340. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  341. package/build-module/dataviews-layouts/table/column-primary.js +2 -1
  342. package/build-module/dataviews-layouts/table/column-primary.js.map +1 -1
  343. package/build-module/dataviews-layouts/table/density-picker.js +2 -1
  344. package/build-module/dataviews-layouts/table/density-picker.js.map +1 -1
  345. package/build-module/dataviews-layouts/table/index.js +2 -1
  346. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  347. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js +2 -1
  348. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -1
  349. package/build-module/dataviews-layouts/utils/get-data-by-group.js +1 -0
  350. package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -1
  351. package/build-module/dataviews-layouts/utils/grid-items.js +3 -2
  352. package/build-module/dataviews-layouts/utils/grid-items.js.map +1 -1
  353. package/build-module/dataviews-layouts/utils/item-click-wrapper.js +2 -1
  354. package/build-module/dataviews-layouts/utils/item-click-wrapper.js.map +1 -1
  355. package/build-module/dataviews-layouts/utils/preview-size-picker.js +3 -2
  356. package/build-module/dataviews-layouts/utils/preview-size-picker.js.map +1 -1
  357. package/build-module/field-types/array.js +2 -1
  358. package/build-module/field-types/array.js.map +1 -1
  359. package/build-module/field-types/boolean.js +2 -1
  360. package/build-module/field-types/boolean.js.map +1 -1
  361. package/build-module/field-types/color.js +2 -1
  362. package/build-module/field-types/color.js.map +1 -1
  363. package/build-module/field-types/date.js +3 -2
  364. package/build-module/field-types/date.js.map +1 -1
  365. package/build-module/field-types/datetime.js +16 -2
  366. package/build-module/field-types/datetime.js.map +2 -2
  367. package/build-module/field-types/email.js +3 -2
  368. package/build-module/field-types/email.js.map +1 -1
  369. package/build-module/field-types/index.js +2 -1
  370. package/build-module/field-types/index.js.map +1 -1
  371. package/build-module/field-types/integer.js +2 -1
  372. package/build-module/field-types/integer.js.map +1 -1
  373. package/build-module/field-types/media.js +1 -0
  374. package/build-module/field-types/media.js.map +1 -1
  375. package/build-module/field-types/number.js +2 -1
  376. package/build-module/field-types/number.js.map +1 -1
  377. package/build-module/field-types/password.js +2 -1
  378. package/build-module/field-types/password.js.map +1 -1
  379. package/build-module/field-types/telephone.js +2 -1
  380. package/build-module/field-types/telephone.js.map +1 -1
  381. package/build-module/field-types/text.js +2 -1
  382. package/build-module/field-types/text.js.map +1 -1
  383. package/build-module/field-types/url.js +2 -1
  384. package/build-module/field-types/url.js.map +1 -1
  385. package/build-module/field-types/utils/parse-date-time.js +14 -0
  386. package/build-module/field-types/utils/parse-date-time.js.map +7 -0
  387. package/build-module/field-types/utils/render-from-elements.js +1 -0
  388. package/build-module/field-types/utils/render-from-elements.js.map +1 -1
  389. package/build-module/hooks/index.js +1 -0
  390. package/build-module/hooks/index.js.map +1 -1
  391. package/build-module/hooks/use-elements.js +2 -1
  392. package/build-module/hooks/use-elements.js.map +1 -1
  393. package/build-module/hooks/use-form-validity.js +424 -321
  394. package/build-module/hooks/use-form-validity.js.map +3 -3
  395. package/build-module/index.js +1 -0
  396. package/build-module/index.js.map +1 -1
  397. package/build-module/lock-unlock.js +2 -1
  398. package/build-module/lock-unlock.js.map +1 -1
  399. package/build-module/utils/filter-sort-and-paginate.js +2 -1
  400. package/build-module/utils/filter-sort-and-paginate.js.map +1 -1
  401. package/build-module/utils/has-elements.js +1 -0
  402. package/build-module/utils/has-elements.js.map +1 -1
  403. package/build-module/utils/normalize-fields.js +3 -2
  404. package/build-module/utils/normalize-fields.js.map +1 -1
  405. package/build-style/style-rtl.css +12 -12
  406. package/build-style/style.css +12 -12
  407. package/build-types/components/dataform/index.d.ts.map +1 -1
  408. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
  409. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
  410. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  411. package/build-types/dataform-controls/password.d.ts.map +1 -1
  412. package/build-types/dataform-layouts/card/index.d.ts +3 -3
  413. package/build-types/dataform-layouts/card/index.d.ts.map +1 -1
  414. package/build-types/dataform-layouts/data-form-layout.d.ts +4 -4
  415. package/build-types/dataform-layouts/data-form-layout.d.ts.map +1 -1
  416. package/build-types/dataform-layouts/index.d.ts +2 -2
  417. package/build-types/dataform-layouts/index.d.ts.map +1 -1
  418. package/build-types/dataform-layouts/normalize-form.d.ts +8 -0
  419. package/build-types/dataform-layouts/normalize-form.d.ts.map +1 -0
  420. package/build-types/dataform-layouts/panel/dropdown.d.ts +2 -2
  421. package/build-types/dataform-layouts/panel/dropdown.d.ts.map +1 -1
  422. package/build-types/dataform-layouts/panel/index.d.ts.map +1 -1
  423. package/build-types/dataform-layouts/panel/modal.d.ts +2 -2
  424. package/build-types/dataform-layouts/panel/modal.d.ts.map +1 -1
  425. package/build-types/dataform-layouts/regular/index.d.ts.map +1 -1
  426. package/build-types/dataform-layouts/row/index.d.ts.map +1 -1
  427. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  428. package/build-types/field-types/datetime.d.ts +1 -1
  429. package/build-types/field-types/datetime.d.ts.map +1 -1
  430. package/build-types/field-types/utils/parse-date-time.d.ts +2 -0
  431. package/build-types/field-types/utils/parse-date-time.d.ts.map +1 -0
  432. package/build-types/hooks/use-form-validity.d.ts.map +1 -1
  433. package/build-types/stories/dataform.story.d.ts +10 -11
  434. package/build-types/stories/dataform.story.d.ts.map +1 -1
  435. package/build-types/stories/dataviews-picker.story.d.ts +31 -0
  436. package/build-types/stories/dataviews-picker.story.d.ts.map +1 -1
  437. package/build-types/test/normalize-form.d.ts +2 -0
  438. package/build-types/test/normalize-form.d.ts.map +1 -0
  439. package/build-types/types/dataform.d.ts +16 -6
  440. package/build-types/types/dataform.d.ts.map +1 -1
  441. package/build-wp/index.js +830 -601
  442. package/package.json +15 -15
  443. package/src/components/dataform/index.tsx +3 -1
  444. package/src/components/dataviews/style.scss +1 -1
  445. package/src/components/dataviews-bulk-actions/style.scss +1 -1
  446. package/src/components/dataviews-filters/filter.tsx +16 -1
  447. package/src/components/dataviews-filters/style.scss +1 -1
  448. package/src/components/dataviews-item-actions/index.tsx +37 -14
  449. package/src/components/dataviews-pagination/style.scss +2 -2
  450. package/src/dataform-controls/datetime.tsx +3 -10
  451. package/src/dataform-controls/password.tsx +16 -12
  452. package/src/dataform-layouts/card/index.tsx +89 -33
  453. package/src/dataform-layouts/data-form-layout.tsx +12 -23
  454. package/src/dataform-layouts/index.tsx +5 -3
  455. package/src/dataform-layouts/{normalize-form-fields.ts → normalize-form.ts} +44 -23
  456. package/src/dataform-layouts/panel/dropdown.tsx +10 -13
  457. package/src/dataform-layouts/panel/index.tsx +9 -24
  458. package/src/dataform-layouts/panel/modal.tsx +15 -15
  459. package/src/dataform-layouts/regular/index.tsx +7 -12
  460. package/src/dataform-layouts/row/index.tsx +13 -26
  461. package/src/dataviews-layouts/list/index.tsx +0 -2
  462. package/src/dataviews-layouts/table/style.scss +2 -2
  463. package/src/field-types/datetime.tsx +16 -5
  464. package/src/field-types/utils/parse-date-time.ts +17 -0
  465. package/src/hooks/use-form-validity.ts +572 -422
  466. package/src/stories/dataform.story.tsx +520 -456
  467. package/src/stories/dataviews-picker.story.tsx +155 -32
  468. package/src/stories/field-types.story.tsx +7 -7
  469. package/src/test/normalize-form.ts +568 -0
  470. package/src/test/use-form-validity.ts +318 -33
  471. package/src/types/dataform.ts +18 -8
  472. package/tsconfig.tsbuildinfo +1 -1
  473. package/build/dataform-layouts/is-combined-field.js.map +0 -7
  474. package/build/dataform-layouts/normalize-form-fields.js.map +0 -7
  475. package/build-module/dataform-layouts/is-combined-field.js +0 -7
  476. package/build-module/dataform-layouts/is-combined-field.js.map +0 -7
  477. package/build-module/dataform-layouts/normalize-form-fields.js.map +0 -7
  478. package/build-types/dataform-layouts/is-combined-field.d.ts +0 -6
  479. package/build-types/dataform-layouts/is-combined-field.d.ts.map +0 -1
  480. package/build-types/dataform-layouts/normalize-form-fields.d.ts +0 -19
  481. package/build-types/dataform-layouts/normalize-form-fields.d.ts.map +0 -1
  482. package/build-types/test/normalize-form-fields.d.ts +0 -2
  483. package/build-types/test/normalize-form-fields.d.ts.map +0 -1
  484. package/src/dataform-layouts/is-combined-field.ts +0 -10
  485. package/src/test/normalize-form-fields.ts +0 -317
@@ -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
 
@@ -1252,7 +1310,13 @@ const VisibilityComponent = () => {
1252
1310
  );
1253
1311
  };
1254
1312
 
1255
- const LayoutCardComponent = ( { withHeader }: { withHeader: boolean } ) => {
1313
+ const LayoutCardComponent = ( {
1314
+ withHeader,
1315
+ isCollapsible,
1316
+ }: {
1317
+ withHeader: boolean;
1318
+ isCollapsible: boolean;
1319
+ } ) => {
1256
1320
  type Customer = {
1257
1321
  name: string;
1258
1322
  email: string;
@@ -1320,7 +1384,7 @@ const LayoutCardComponent = ( { withHeader }: { withHeader: boolean } ) => {
1320
1384
  isVisible: ( item ) => item.displayPayments,
1321
1385
  render: ( { item } ) => {
1322
1386
  return (
1323
- <p>
1387
+ <p style={ { margin: 0 } }>
1324
1388
  The customer has made a total of { item.totalOrders }{ ' ' }
1325
1389
  orders, amounting to { item.totalRevenue } dollars. The
1326
1390
  average order value is { item.averageOrderValue }{ ' ' }
@@ -1376,14 +1440,14 @@ const LayoutCardComponent = ( { withHeader }: { withHeader: boolean } ) => {
1376
1440
 
1377
1441
  const form: Form = useMemo(
1378
1442
  () => ( {
1379
- layout: getLayoutFromStoryArgs( {
1380
- type: 'card',
1381
- withHeader,
1382
- } ),
1383
1443
  fields: [
1384
1444
  {
1385
1445
  id: 'customerCard',
1386
- layout: { type: 'card', summary: 'plan-summary' },
1446
+ layout: {
1447
+ type: 'card',
1448
+ summary: 'plan-summary',
1449
+ withHeader,
1450
+ },
1387
1451
  label: 'Customer',
1388
1452
  description:
1389
1453
  'Enter your contact details, plan type, and addresses to complete your customer information.',
@@ -1448,12 +1512,13 @@ const LayoutCardComponent = ( { withHeader }: { withHeader: boolean } ) => {
1448
1512
  type: 'card',
1449
1513
  isOpened: false,
1450
1514
  summary: [ { id: 'dueDate', visibility: 'always' } ],
1515
+ isCollapsible,
1451
1516
  },
1452
1517
  children: [ 'vat', 'commission' ],
1453
1518
  },
1454
1519
  ],
1455
1520
  } ),
1456
- [ withHeader ]
1521
+ [ withHeader, isCollapsible ]
1457
1522
  );
1458
1523
 
1459
1524
  return (
@@ -1860,9 +1925,14 @@ export const LayoutCard = {
1860
1925
  control: { type: 'boolean' },
1861
1926
  description: 'Whether the card has a header.',
1862
1927
  },
1928
+ isCollapsible: {
1929
+ control: { type: 'boolean' },
1930
+ description: 'Whether the card can be collapsed/expanded.',
1931
+ },
1863
1932
  },
1864
1933
  args: {
1865
1934
  withHeader: true,
1935
+ isCollapsible: true,
1866
1936
  },
1867
1937
  };
1868
1938
 
@@ -1930,17 +2000,11 @@ export const Validation = {
1930
2000
  description: 'Whether or not the custom validation rule is active.',
1931
2001
  options: [ 'sync', 'async', 'none' ],
1932
2002
  },
1933
- type: {
1934
- control: { type: 'select' },
1935
- description: 'Chooses the layout type.',
1936
- options: [ 'regular', 'panel', 'card', 'row' ],
1937
- },
1938
2003
  },
1939
2004
  args: {
1940
2005
  required: true,
1941
2006
  elements: 'sync',
1942
2007
  custom: 'sync',
1943
- type: 'regular',
1944
2008
  },
1945
2009
  };
1946
2010