@wordpress/dataviews 10.0.1-next.ff1cebbba.0 → 10.1.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 (399) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/README.md +97 -8
  3. package/build/components/dataform/index.js +11 -2
  4. package/build/components/dataform/index.js.map +2 -2
  5. package/build/components/dataform-context/index.js.map +2 -2
  6. package/build/components/dataviews-bulk-actions/index.js +2 -4
  7. package/build/components/dataviews-bulk-actions/index.js.map +2 -2
  8. package/build/components/dataviews-filters/filter.js +9 -4
  9. package/build/components/dataviews-filters/filter.js.map +3 -3
  10. package/build/components/dataviews-filters/search-widget.js +13 -2
  11. package/build/components/dataviews-filters/search-widget.js.map +3 -3
  12. package/build/components/dataviews-filters/use-filters.js +4 -2
  13. package/build/components/dataviews-filters/use-filters.js.map +2 -2
  14. package/build/components/dataviews-item-actions/index.js +6 -6
  15. package/build/components/dataviews-item-actions/index.js.map +2 -2
  16. package/build/dataform-controls/array.js +14 -61
  17. package/build/dataform-controls/array.js.map +3 -3
  18. package/build/dataform-controls/checkbox.js +5 -29
  19. package/build/dataform-controls/checkbox.js.map +3 -3
  20. package/build/dataform-controls/color.js +5 -29
  21. package/build/dataform-controls/color.js.map +3 -3
  22. package/build/dataform-controls/date.js +40 -57
  23. package/build/dataform-controls/date.js.map +3 -3
  24. package/build/dataform-controls/datetime.js +12 -37
  25. package/build/dataform-controls/datetime.js.map +3 -3
  26. package/build/dataform-controls/email.js +3 -1
  27. package/build/dataform-controls/email.js.map +2 -2
  28. package/build/dataform-controls/index.js +2 -1
  29. package/build/dataform-controls/index.js.map +3 -3
  30. package/build/dataform-controls/password.js +3 -1
  31. package/build/dataform-controls/password.js.map +2 -2
  32. package/build/dataform-controls/radio.js +24 -43
  33. package/build/dataform-controls/radio.js.map +3 -3
  34. package/build/dataform-controls/select.js +13 -30
  35. package/build/dataform-controls/select.js.map +3 -3
  36. package/build/dataform-controls/telephone.js +3 -1
  37. package/build/dataform-controls/telephone.js.map +2 -2
  38. package/build/dataform-controls/text.js +3 -1
  39. package/build/dataform-controls/text.js.map +2 -2
  40. package/build/dataform-controls/textarea.js +6 -30
  41. package/build/dataform-controls/textarea.js.map +3 -3
  42. package/build/dataform-controls/toggle-group.js +38 -56
  43. package/build/dataform-controls/toggle-group.js.map +3 -3
  44. package/build/dataform-controls/toggle.js +6 -30
  45. package/build/dataform-controls/toggle.js.map +3 -3
  46. package/build/dataform-controls/url.js +3 -1
  47. package/build/dataform-controls/url.js.map +2 -2
  48. package/build/dataform-controls/utils/get-custom-validity.js +35 -0
  49. package/build/dataform-controls/utils/get-custom-validity.js.map +7 -0
  50. package/build/dataform-controls/utils/validated-input.js +4 -28
  51. package/build/dataform-controls/utils/validated-input.js.map +3 -3
  52. package/build/dataform-controls/utils/validated-number.js +6 -30
  53. package/build/dataform-controls/utils/validated-number.js.map +3 -3
  54. package/build/dataform-layouts/card/index.js +6 -3
  55. package/build/dataform-layouts/card/index.js.map +2 -2
  56. package/build/dataform-layouts/data-form-layout.js +8 -2
  57. package/build/dataform-layouts/data-form-layout.js.map +2 -2
  58. package/build/dataform-layouts/panel/dropdown.js +21 -9
  59. package/build/dataform-layouts/panel/dropdown.js.map +2 -2
  60. package/build/dataform-layouts/panel/index.js +12 -10
  61. package/build/dataform-layouts/panel/index.js.map +2 -2
  62. package/build/dataform-layouts/panel/modal.js +32 -22
  63. package/build/dataform-layouts/panel/modal.js.map +3 -3
  64. package/build/dataform-layouts/regular/index.js +8 -4
  65. package/build/dataform-layouts/regular/index.js.map +2 -2
  66. package/build/dataform-layouts/row/index.js +11 -7
  67. package/build/dataform-layouts/row/index.js.map +2 -2
  68. package/build/dataviews-layouts/list/index.js +7 -7
  69. package/build/dataviews-layouts/list/index.js.map +2 -2
  70. package/build/dataviews-layouts/table/column-header-menu.js +1 -1
  71. package/build/dataviews-layouts/table/column-header-menu.js.map +2 -2
  72. package/build/field-types/boolean.js +3 -2
  73. package/build/field-types/boolean.js.map +3 -3
  74. package/build/field-types/color.js +2 -2
  75. package/build/field-types/color.js.map +3 -3
  76. package/build/field-types/date.js +3 -2
  77. package/build/field-types/date.js.map +3 -3
  78. package/build/field-types/datetime.js +2 -1
  79. package/build/field-types/datetime.js.map +3 -3
  80. package/build/field-types/email.js +2 -1
  81. package/build/field-types/email.js.map +3 -3
  82. package/build/field-types/index.js +2 -1
  83. package/build/field-types/index.js.map +3 -3
  84. package/build/field-types/integer.js +2 -1
  85. package/build/field-types/integer.js.map +3 -3
  86. package/build/field-types/number.js +18 -9
  87. package/build/field-types/number.js.map +3 -3
  88. package/build/field-types/password.js +2 -1
  89. package/build/field-types/password.js.map +3 -3
  90. package/build/field-types/telephone.js +2 -1
  91. package/build/field-types/telephone.js.map +3 -3
  92. package/build/field-types/text.js +2 -1
  93. package/build/field-types/text.js.map +3 -3
  94. package/build/field-types/url.js +2 -1
  95. package/build/field-types/url.js.map +3 -3
  96. package/build/field-types/utils/render-from-elements.js +24 -3
  97. package/build/field-types/utils/render-from-elements.js.map +4 -4
  98. package/build/hooks/index.js +39 -0
  99. package/build/hooks/index.js.map +7 -0
  100. package/build/hooks/use-elements.js +63 -0
  101. package/build/hooks/use-elements.js.map +7 -0
  102. package/build/hooks/use-form-validity.js +426 -0
  103. package/build/hooks/use-form-validity.js.map +7 -0
  104. package/build/index.js +3 -3
  105. package/build/index.js.map +2 -2
  106. package/build/types/dataform.js.map +1 -1
  107. package/build/types/dataviews.js.map +1 -1
  108. package/build/types/field-api.js.map +1 -1
  109. package/build/utils/has-elements.js +27 -0
  110. package/build/utils/has-elements.js.map +7 -0
  111. package/build/utils/normalize-fields.js +4 -2
  112. package/build/utils/normalize-fields.js.map +3 -3
  113. package/build-module/components/dataform/index.js +11 -2
  114. package/build-module/components/dataform/index.js.map +2 -2
  115. package/build-module/components/dataform-context/index.js.map +2 -2
  116. package/build-module/components/dataviews-bulk-actions/index.js +2 -4
  117. package/build-module/components/dataviews-bulk-actions/index.js.map +2 -2
  118. package/build-module/components/dataviews-filters/filter.js +9 -4
  119. package/build-module/components/dataviews-filters/filter.js.map +2 -2
  120. package/build-module/components/dataviews-filters/search-widget.js +19 -3
  121. package/build-module/components/dataviews-filters/search-widget.js.map +2 -2
  122. package/build-module/components/dataviews-filters/use-filters.js +4 -2
  123. package/build-module/components/dataviews-filters/use-filters.js.map +2 -2
  124. package/build-module/components/dataviews-item-actions/index.js +6 -6
  125. package/build-module/components/dataviews-item-actions/index.js.map +2 -2
  126. package/build-module/dataform-controls/array.js +16 -63
  127. package/build-module/dataform-controls/array.js.map +2 -2
  128. package/build-module/dataform-controls/checkbox.js +6 -30
  129. package/build-module/dataform-controls/checkbox.js.map +2 -2
  130. package/build-module/dataform-controls/color.js +6 -30
  131. package/build-module/dataform-controls/color.js.map +2 -2
  132. package/build-module/dataform-controls/date.js +49 -66
  133. package/build-module/dataform-controls/date.js.map +2 -2
  134. package/build-module/dataform-controls/datetime.js +14 -39
  135. package/build-module/dataform-controls/datetime.js.map +2 -2
  136. package/build-module/dataform-controls/email.js +3 -1
  137. package/build-module/dataform-controls/email.js.map +2 -2
  138. package/build-module/dataform-controls/index.js +2 -1
  139. package/build-module/dataform-controls/index.js.map +2 -2
  140. package/build-module/dataform-controls/password.js +3 -1
  141. package/build-module/dataform-controls/password.js.map +2 -2
  142. package/build-module/dataform-controls/radio.js +26 -45
  143. package/build-module/dataform-controls/radio.js.map +2 -2
  144. package/build-module/dataform-controls/select.js +15 -32
  145. package/build-module/dataform-controls/select.js.map +2 -2
  146. package/build-module/dataform-controls/telephone.js +3 -1
  147. package/build-module/dataform-controls/telephone.js.map +2 -2
  148. package/build-module/dataform-controls/text.js +3 -1
  149. package/build-module/dataform-controls/text.js.map +2 -2
  150. package/build-module/dataform-controls/textarea.js +7 -31
  151. package/build-module/dataform-controls/textarea.js.map +2 -2
  152. package/build-module/dataform-controls/toggle-group.js +41 -58
  153. package/build-module/dataform-controls/toggle-group.js.map +2 -2
  154. package/build-module/dataform-controls/toggle.js +7 -31
  155. package/build-module/dataform-controls/toggle.js.map +2 -2
  156. package/build-module/dataform-controls/url.js +3 -1
  157. package/build-module/dataform-controls/url.js.map +2 -2
  158. package/build-module/dataform-controls/utils/get-custom-validity.js +15 -0
  159. package/build-module/dataform-controls/utils/get-custom-validity.js.map +7 -0
  160. package/build-module/dataform-controls/utils/validated-input.js +5 -29
  161. package/build-module/dataform-controls/utils/validated-input.js.map +2 -2
  162. package/build-module/dataform-controls/utils/validated-number.js +7 -31
  163. package/build-module/dataform-controls/utils/validated-number.js.map +2 -2
  164. package/build-module/dataform-layouts/card/index.js +6 -3
  165. package/build-module/dataform-layouts/card/index.js.map +2 -2
  166. package/build-module/dataform-layouts/data-form-layout.js +8 -2
  167. package/build-module/dataform-layouts/data-form-layout.js.map +2 -2
  168. package/build-module/dataform-layouts/panel/dropdown.js +21 -9
  169. package/build-module/dataform-layouts/panel/dropdown.js.map +2 -2
  170. package/build-module/dataform-layouts/panel/index.js +12 -10
  171. package/build-module/dataform-layouts/panel/index.js.map +2 -2
  172. package/build-module/dataform-layouts/panel/modal.js +33 -23
  173. package/build-module/dataform-layouts/panel/modal.js.map +2 -2
  174. package/build-module/dataform-layouts/regular/index.js +8 -4
  175. package/build-module/dataform-layouts/regular/index.js.map +2 -2
  176. package/build-module/dataform-layouts/row/index.js +11 -7
  177. package/build-module/dataform-layouts/row/index.js.map +2 -2
  178. package/build-module/dataviews-layouts/list/index.js +7 -7
  179. package/build-module/dataviews-layouts/list/index.js.map +2 -2
  180. package/build-module/dataviews-layouts/table/column-header-menu.js +1 -1
  181. package/build-module/dataviews-layouts/table/column-header-menu.js.map +2 -2
  182. package/build-module/field-types/boolean.js +4 -3
  183. package/build-module/field-types/boolean.js.map +2 -2
  184. package/build-module/field-types/color.js +3 -3
  185. package/build-module/field-types/color.js.map +2 -2
  186. package/build-module/field-types/date.js +4 -3
  187. package/build-module/field-types/date.js.map +2 -2
  188. package/build-module/field-types/datetime.js +3 -2
  189. package/build-module/field-types/datetime.js.map +2 -2
  190. package/build-module/field-types/email.js +3 -2
  191. package/build-module/field-types/email.js.map +2 -2
  192. package/build-module/field-types/index.js +3 -2
  193. package/build-module/field-types/index.js.map +2 -2
  194. package/build-module/field-types/integer.js +3 -2
  195. package/build-module/field-types/integer.js.map +2 -2
  196. package/build-module/field-types/number.js +8 -9
  197. package/build-module/field-types/number.js.map +2 -2
  198. package/build-module/field-types/password.js +3 -2
  199. package/build-module/field-types/password.js.map +2 -2
  200. package/build-module/field-types/telephone.js +3 -2
  201. package/build-module/field-types/telephone.js.map +2 -2
  202. package/build-module/field-types/text.js +3 -2
  203. package/build-module/field-types/text.js.map +2 -2
  204. package/build-module/field-types/url.js +3 -2
  205. package/build-module/field-types/url.js.map +2 -2
  206. package/build-module/field-types/utils/render-from-elements.js +14 -3
  207. package/build-module/field-types/utils/render-from-elements.js.map +3 -3
  208. package/build-module/hooks/index.js +5 -0
  209. package/build-module/hooks/index.js.map +7 -0
  210. package/build-module/hooks/use-elements.js +43 -0
  211. package/build-module/hooks/use-elements.js.map +7 -0
  212. package/build-module/hooks/use-form-validity.js +392 -0
  213. package/build-module/hooks/use-form-validity.js.map +7 -0
  214. package/build-module/index.js +2 -2
  215. package/build-module/index.js.map +2 -2
  216. package/build-module/utils/has-elements.js +7 -0
  217. package/build-module/utils/has-elements.js.map +7 -0
  218. package/build-module/utils/normalize-fields.js +4 -2
  219. package/build-module/utils/normalize-fields.js.map +2 -2
  220. package/build-style/style-rtl.css +10 -4
  221. package/build-style/style.css +10 -4
  222. package/build-types/components/dataform/index.d.ts +1 -1
  223. package/build-types/components/dataform/index.d.ts.map +1 -1
  224. package/build-types/components/dataform-context/index.d.ts.map +1 -1
  225. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
  226. package/build-types/components/dataviews-filters/filter.d.ts +1 -1
  227. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
  228. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -1
  229. package/build-types/components/dataviews-filters/use-filters.d.ts.map +1 -1
  230. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
  231. package/build-types/dataform-controls/array.d.ts +1 -1
  232. package/build-types/dataform-controls/array.d.ts.map +1 -1
  233. package/build-types/dataform-controls/checkbox.d.ts +1 -1
  234. package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
  235. package/build-types/dataform-controls/color.d.ts +1 -1
  236. package/build-types/dataform-controls/color.d.ts.map +1 -1
  237. package/build-types/dataform-controls/date.d.ts +1 -1
  238. package/build-types/dataform-controls/date.d.ts.map +1 -1
  239. package/build-types/dataform-controls/datetime.d.ts +1 -1
  240. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  241. package/build-types/dataform-controls/email.d.ts +1 -1
  242. package/build-types/dataform-controls/email.d.ts.map +1 -1
  243. package/build-types/dataform-controls/index.d.ts.map +1 -1
  244. package/build-types/dataform-controls/password.d.ts +1 -1
  245. package/build-types/dataform-controls/password.d.ts.map +1 -1
  246. package/build-types/dataform-controls/radio.d.ts +1 -1
  247. package/build-types/dataform-controls/radio.d.ts.map +1 -1
  248. package/build-types/dataform-controls/select.d.ts +1 -1
  249. package/build-types/dataform-controls/select.d.ts.map +1 -1
  250. package/build-types/dataform-controls/telephone.d.ts +1 -1
  251. package/build-types/dataform-controls/telephone.d.ts.map +1 -1
  252. package/build-types/dataform-controls/text.d.ts +1 -1
  253. package/build-types/dataform-controls/text.d.ts.map +1 -1
  254. package/build-types/dataform-controls/textarea.d.ts +1 -1
  255. package/build-types/dataform-controls/textarea.d.ts.map +1 -1
  256. package/build-types/dataform-controls/toggle-group.d.ts +1 -1
  257. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
  258. package/build-types/dataform-controls/toggle.d.ts +1 -1
  259. package/build-types/dataform-controls/toggle.d.ts.map +1 -1
  260. package/build-types/dataform-controls/url.d.ts +1 -1
  261. package/build-types/dataform-controls/url.d.ts.map +1 -1
  262. package/build-types/dataform-controls/utils/get-custom-validity.d.ts +9 -0
  263. package/build-types/dataform-controls/utils/get-custom-validity.d.ts.map +1 -0
  264. package/build-types/dataform-controls/utils/validated-input.d.ts +1 -1
  265. package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -1
  266. package/build-types/dataform-controls/utils/validated-number.d.ts +1 -1
  267. package/build-types/dataform-controls/utils/validated-number.d.ts.map +1 -1
  268. package/build-types/dataform-layouts/card/index.d.ts +1 -1
  269. package/build-types/dataform-layouts/card/index.d.ts.map +1 -1
  270. package/build-types/dataform-layouts/data-form-layout.d.ts +5 -3
  271. package/build-types/dataform-layouts/data-form-layout.d.ts.map +1 -1
  272. package/build-types/dataform-layouts/panel/dropdown.d.ts +8 -7
  273. package/build-types/dataform-layouts/panel/dropdown.d.ts.map +1 -1
  274. package/build-types/dataform-layouts/panel/index.d.ts +1 -1
  275. package/build-types/dataform-layouts/panel/index.d.ts.map +1 -1
  276. package/build-types/dataform-layouts/panel/modal.d.ts +5 -5
  277. package/build-types/dataform-layouts/panel/modal.d.ts.map +1 -1
  278. package/build-types/dataform-layouts/regular/index.d.ts +1 -1
  279. package/build-types/dataform-layouts/regular/index.d.ts.map +1 -1
  280. package/build-types/dataform-layouts/row/index.d.ts +1 -1
  281. package/build-types/dataform-layouts/row/index.d.ts.map +1 -1
  282. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  283. package/build-types/field-types/boolean.d.ts +1 -1
  284. package/build-types/field-types/date.d.ts +1 -1
  285. package/build-types/field-types/datetime.d.ts.map +1 -1
  286. package/build-types/field-types/email.d.ts.map +1 -1
  287. package/build-types/field-types/index.d.ts.map +1 -1
  288. package/build-types/field-types/integer.d.ts.map +1 -1
  289. package/build-types/field-types/number.d.ts +1 -1
  290. package/build-types/field-types/number.d.ts.map +1 -1
  291. package/build-types/field-types/password.d.ts +1 -1
  292. package/build-types/field-types/password.d.ts.map +1 -1
  293. package/build-types/field-types/telephone.d.ts.map +1 -1
  294. package/build-types/field-types/text.d.ts.map +1 -1
  295. package/build-types/field-types/url.d.ts.map +1 -1
  296. package/build-types/field-types/utils/render-from-elements.d.ts +1 -1
  297. package/build-types/field-types/utils/render-from-elements.d.ts.map +1 -1
  298. package/build-types/hooks/index.d.ts +5 -0
  299. package/build-types/hooks/index.d.ts.map +1 -0
  300. package/build-types/hooks/use-elements.d.ts +12 -0
  301. package/build-types/hooks/use-elements.d.ts.map +1 -0
  302. package/build-types/hooks/use-form-validity.d.ts +16 -0
  303. package/build-types/hooks/use-form-validity.d.ts.map +1 -0
  304. package/build-types/index.d.ts +1 -1
  305. package/build-types/index.d.ts.map +1 -1
  306. package/build-types/stories/dataform.story.d.ts +14 -4
  307. package/build-types/stories/dataform.story.d.ts.map +1 -1
  308. package/build-types/stories/dataviews.fixtures.d.ts.map +1 -1
  309. package/build-types/stories/field-types.story.d.ts +38 -15
  310. package/build-types/stories/field-types.story.d.ts.map +1 -1
  311. package/build-types/test/use-form-validity.d.ts +2 -0
  312. package/build-types/test/use-form-validity.d.ts.map +1 -0
  313. package/build-types/types/dataform.d.ts +4 -1
  314. package/build-types/types/dataform.d.ts.map +1 -1
  315. package/build-types/types/dataviews.d.ts +10 -2
  316. package/build-types/types/dataviews.d.ts.map +1 -1
  317. package/build-types/types/field-api.d.ts +25 -1
  318. package/build-types/types/field-api.d.ts.map +1 -1
  319. package/build-types/utils/has-elements.d.ts +6 -0
  320. package/build-types/utils/has-elements.d.ts.map +1 -0
  321. package/build-types/utils/normalize-fields.d.ts.map +1 -1
  322. package/build-wp/index.js +1011 -819
  323. package/package.json +15 -15
  324. package/src/components/dataform/index.tsx +7 -1
  325. package/src/components/dataform-context/index.tsx +3 -1
  326. package/src/components/dataviews-bulk-actions/index.tsx +3 -5
  327. package/src/components/dataviews-filters/filter.tsx +11 -5
  328. package/src/components/dataviews-filters/search-widget.tsx +30 -3
  329. package/src/components/dataviews-filters/style.scss +8 -0
  330. package/src/components/dataviews-filters/use-filters.ts +4 -2
  331. package/src/components/dataviews-item-actions/index.tsx +11 -6
  332. package/src/components/dataviews-item-actions/style.scss +1 -0
  333. package/src/dataform-controls/array.tsx +16 -82
  334. package/src/dataform-controls/checkbox.tsx +5 -41
  335. package/src/dataform-controls/color.tsx +5 -37
  336. package/src/dataform-controls/date.tsx +63 -76
  337. package/src/dataform-controls/datetime.tsx +11 -45
  338. package/src/dataform-controls/email.tsx +2 -0
  339. package/src/dataform-controls/index.tsx +2 -1
  340. package/src/dataform-controls/password.tsx +2 -0
  341. package/src/dataform-controls/radio.tsx +24 -55
  342. package/src/dataform-controls/select.tsx +14 -42
  343. package/src/dataform-controls/telephone.tsx +2 -0
  344. package/src/dataform-controls/text.tsx +2 -0
  345. package/src/dataform-controls/textarea.tsx +6 -42
  346. package/src/dataform-controls/toggle-group.tsx +38 -64
  347. package/src/dataform-controls/toggle.tsx +6 -42
  348. package/src/dataform-controls/url.tsx +2 -0
  349. package/src/dataform-controls/utils/get-custom-validity.ts +24 -0
  350. package/src/dataform-controls/utils/validated-input.tsx +4 -40
  351. package/src/dataform-controls/utils/validated-number.tsx +6 -44
  352. package/src/dataform-layouts/card/index.tsx +3 -0
  353. package/src/dataform-layouts/data-form-layout.tsx +18 -3
  354. package/src/dataform-layouts/panel/dropdown.tsx +35 -14
  355. package/src/dataform-layouts/panel/index.tsx +9 -7
  356. package/src/dataform-layouts/panel/modal.tsx +41 -30
  357. package/src/dataform-layouts/regular/index.tsx +4 -0
  358. package/src/dataform-layouts/row/index.tsx +8 -4
  359. package/src/dataviews-layouts/list/index.tsx +9 -7
  360. package/src/dataviews-layouts/table/column-header-menu.tsx +1 -1
  361. package/src/dataviews-layouts/table/style.scss +2 -3
  362. package/src/field-types/boolean.tsx +3 -3
  363. package/src/field-types/color.tsx +3 -3
  364. package/src/field-types/date.tsx +3 -3
  365. package/src/field-types/datetime.tsx +6 -4
  366. package/src/field-types/email.tsx +6 -4
  367. package/src/field-types/index.tsx +6 -4
  368. package/src/field-types/integer.tsx +6 -4
  369. package/src/field-types/number.tsx +8 -12
  370. package/src/field-types/password.tsx +6 -4
  371. package/src/field-types/telephone.tsx +6 -4
  372. package/src/field-types/text.tsx +6 -4
  373. package/src/field-types/url.tsx +6 -4
  374. package/src/field-types/utils/render-from-elements.tsx +29 -0
  375. package/src/hooks/index.ts +4 -0
  376. package/src/hooks/use-elements.ts +66 -0
  377. package/src/hooks/use-form-validity.ts +571 -0
  378. package/src/index.ts +1 -1
  379. package/src/stories/dataform.story.tsx +243 -59
  380. package/src/stories/dataviews.fixtures.tsx +9 -4
  381. package/src/stories/field-types.story.tsx +159 -29
  382. package/src/test/use-form-validity.ts +546 -0
  383. package/src/types/dataform.ts +5 -1
  384. package/src/types/dataviews.ts +12 -2
  385. package/src/types/field-api.ts +32 -1
  386. package/src/utils/has-elements.ts +11 -0
  387. package/src/utils/normalize-fields.ts +7 -2
  388. package/tsconfig.tsbuildinfo +1 -1
  389. package/build/utils/is-item-valid.js +0 -75
  390. package/build/utils/is-item-valid.js.map +0 -7
  391. package/build-module/utils/is-item-valid.js +0 -45
  392. package/build-module/utils/is-item-valid.js.map +0 -7
  393. package/build-types/test/validation.d.ts +0 -2
  394. package/build-types/test/validation.d.ts.map +0 -1
  395. package/build-types/utils/is-item-valid.d.ts +0 -12
  396. package/build-types/utils/is-item-valid.d.ts.map +0 -1
  397. package/src/field-types/utils/render-from-elements.ts +0 -15
  398. package/src/test/validation.ts +0 -322
  399. package/src/utils/is-item-valid.ts +0 -93
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var hooks_exports = {};
30
+ __export(hooks_exports, {
31
+ useFormValidity: () => import_use_form_validity.default
32
+ });
33
+ module.exports = __toCommonJS(hooks_exports);
34
+ var import_use_form_validity = __toESM(require("./use-form-validity"));
35
+ // Annotate the CommonJS export names for ESM import in node:
36
+ 0 && (module.exports = {
37
+ useFormValidity
38
+ });
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/hooks/index.ts"],
4
+ "sourcesContent": ["/**\n * Internal dependencies\n */\nexport { default as useFormValidity } from './use-form-validity';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,+BAA2C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var use_elements_exports = {};
20
+ __export(use_elements_exports, {
21
+ default: () => useElements
22
+ });
23
+ module.exports = __toCommonJS(use_elements_exports);
24
+ var import_element = require("@wordpress/element");
25
+ const EMPTY_ARRAY = [];
26
+ function useElements({
27
+ elements,
28
+ getElements
29
+ }) {
30
+ const staticElements = Array.isArray(elements) && elements.length > 0 ? elements : EMPTY_ARRAY;
31
+ const [records, setRecords] = (0, import_element.useState)(staticElements);
32
+ const [isLoading, setIsLoading] = (0, import_element.useState)(false);
33
+ (0, import_element.useEffect)(() => {
34
+ if (!getElements) {
35
+ setRecords(staticElements);
36
+ return;
37
+ }
38
+ let cancelled = false;
39
+ setIsLoading(true);
40
+ getElements().then((fetchedElements) => {
41
+ if (!cancelled) {
42
+ const dynamicElements = Array.isArray(fetchedElements) && fetchedElements.length > 0 ? fetchedElements : staticElements;
43
+ setRecords(dynamicElements);
44
+ }
45
+ }).catch(() => {
46
+ if (!cancelled) {
47
+ setRecords(staticElements);
48
+ }
49
+ }).finally(() => {
50
+ if (!cancelled) {
51
+ setIsLoading(false);
52
+ }
53
+ });
54
+ return () => {
55
+ cancelled = true;
56
+ };
57
+ }, [getElements, staticElements]);
58
+ return {
59
+ elements: records,
60
+ isLoading
61
+ };
62
+ }
63
+ //# sourceMappingURL=use-elements.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/hooks/use-elements.ts"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useEffect, useState } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport type { Option } from '../types';\n\nconst EMPTY_ARRAY: Option[] = [];\n\nexport default function useElements( {\n\telements,\n\tgetElements,\n}: {\n\telements?: Option[];\n\tgetElements?: () => Promise< Option[] >;\n} ) {\n\tconst staticElements =\n\t\tArray.isArray( elements ) && elements.length > 0\n\t\t\t? elements\n\t\t\t: EMPTY_ARRAY;\n\tconst [ records, setRecords ] = useState< Option[] >( staticElements );\n\tconst [ isLoading, setIsLoading ] = useState( false );\n\n\tuseEffect( () => {\n\t\tif ( ! getElements ) {\n\t\t\tsetRecords( staticElements );\n\t\t\treturn;\n\t\t}\n\n\t\tlet cancelled = false;\n\t\tsetIsLoading( true );\n\t\tgetElements()\n\t\t\t.then( ( fetchedElements ) => {\n\t\t\t\tif ( ! cancelled ) {\n\t\t\t\t\tconst dynamicElements =\n\t\t\t\t\t\tArray.isArray( fetchedElements ) &&\n\t\t\t\t\t\tfetchedElements.length > 0\n\t\t\t\t\t\t\t? fetchedElements\n\t\t\t\t\t\t\t: staticElements;\n\t\t\t\t\tsetRecords( dynamicElements );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.catch( () => {\n\t\t\t\tif ( ! cancelled ) {\n\t\t\t\t\tsetRecords( staticElements );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.finally( () => {\n\t\t\t\tif ( ! cancelled ) {\n\t\t\t\t\tsetIsLoading( false );\n\t\t\t\t}\n\t\t\t} );\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [ getElements, staticElements ] );\n\n\treturn {\n\t\telements: records,\n\t\tisLoading,\n\t};\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAAoC;AAOpC,MAAM,cAAwB,CAAC;AAEhB,SAAR,YAA8B;AAAA,EACpC;AAAA,EACA;AACD,GAGI;AACH,QAAM,iBACL,MAAM,QAAS,QAAS,KAAK,SAAS,SAAS,IAC5C,WACA;AACJ,QAAM,CAAE,SAAS,UAAW,QAAI,yBAAsB,cAAe;AACrE,QAAM,CAAE,WAAW,YAAa,QAAI,yBAAU,KAAM;AAEpD,gCAAW,MAAM;AAChB,QAAK,CAAE,aAAc;AACpB,iBAAY,cAAe;AAC3B;AAAA,IACD;AAEA,QAAI,YAAY;AAChB,iBAAc,IAAK;AACnB,gBAAY,EACV,KAAM,CAAE,oBAAqB;AAC7B,UAAK,CAAE,WAAY;AAClB,cAAM,kBACL,MAAM,QAAS,eAAgB,KAC/B,gBAAgB,SAAS,IACtB,kBACA;AACJ,mBAAY,eAAgB;AAAA,MAC7B;AAAA,IACD,CAAE,EACD,MAAO,MAAM;AACb,UAAK,CAAE,WAAY;AAClB,mBAAY,cAAe;AAAA,MAC5B;AAAA,IACD,CAAE,EACD,QAAS,MAAM;AACf,UAAK,CAAE,WAAY;AAClB,qBAAc,KAAM;AAAA,MACrB;AAAA,IACD,CAAE;AAEH,WAAO,MAAM;AACZ,kBAAY;AAAA,IACb;AAAA,EACD,GAAG,CAAE,aAAa,cAAe,CAAE;AAEnC,SAAO;AAAA,IACN,UAAU;AAAA,IACV;AAAA,EACD;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,426 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var use_form_validity_exports = {};
30
+ __export(use_form_validity_exports, {
31
+ default: () => use_form_validity_default,
32
+ useFormValidity: () => useFormValidity
33
+ });
34
+ module.exports = __toCommonJS(use_form_validity_exports);
35
+ var import_deepmerge = __toESM(require("deepmerge"));
36
+ var import_element = require("@wordpress/element");
37
+ var import_i18n = require("@wordpress/i18n");
38
+ var import_normalize_fields = __toESM(require("../utils/normalize-fields"));
39
+ var import_normalize_form_fields = __toESM(require("../dataform-layouts/normalize-form-fields"));
40
+ const isEmptyNullOrUndefined = (value) => [void 0, "", null].includes(value);
41
+ const isArrayOrElementsEmptyNullOrUndefined = (value) => {
42
+ return !Array.isArray(value) || value.length === 0 || value.every((element) => isEmptyNullOrUndefined(element));
43
+ };
44
+ function isInvalidForRequired(fieldType, value) {
45
+ if (fieldType === void 0 && isEmptyNullOrUndefined(value) || fieldType === "text" && isEmptyNullOrUndefined(value) || fieldType === "email" && isEmptyNullOrUndefined(value) || fieldType === "url" && isEmptyNullOrUndefined(value) || fieldType === "telephone" && isEmptyNullOrUndefined(value) || fieldType === "password" && isEmptyNullOrUndefined(value) || fieldType === "integer" && isEmptyNullOrUndefined(value) || fieldType === "number" && isEmptyNullOrUndefined(value) || fieldType === "array" && isArrayOrElementsEmptyNullOrUndefined(value) || fieldType === "boolean" && value !== true) {
46
+ return true;
47
+ }
48
+ return false;
49
+ }
50
+ function isFormValid(formValidity) {
51
+ if (!formValidity) {
52
+ return true;
53
+ }
54
+ return Object.values(formValidity).every((fieldValidation) => {
55
+ return Object.entries(fieldValidation).every(
56
+ ([key, validation]) => {
57
+ if (key === "children" && validation && typeof validation === "object") {
58
+ return isFormValid(validation);
59
+ }
60
+ return validation.type === "valid";
61
+ }
62
+ );
63
+ });
64
+ }
65
+ function updateFieldValidity(setFormValidity, parentFieldId, fieldId, newValidity) {
66
+ if (parentFieldId) {
67
+ setFormValidity((prev) => ({
68
+ ...prev,
69
+ [parentFieldId]: {
70
+ ...prev?.[parentFieldId],
71
+ children: {
72
+ ...prev?.[parentFieldId]?.children,
73
+ [fieldId]: {
74
+ ...newValidity
75
+ }
76
+ }
77
+ }
78
+ }));
79
+ } else {
80
+ setFormValidity((prev) => ({
81
+ ...prev,
82
+ [fieldId]: {
83
+ ...newValidity
84
+ }
85
+ }));
86
+ }
87
+ }
88
+ function getFieldsToValidate(fields, form) {
89
+ const formFields = (0, import_normalize_form_fields.default)(form);
90
+ if (formFields.length === 0) {
91
+ return { fields: [], fieldToParent: /* @__PURE__ */ new Map() };
92
+ }
93
+ const fieldToParent = /* @__PURE__ */ new Map();
94
+ const fieldIdsToValidate = [];
95
+ formFields.forEach((formField) => {
96
+ if (!!formField.children) {
97
+ formField.children.forEach((child) => {
98
+ const childId = typeof child === "string" ? child : child.id;
99
+ fieldIdsToValidate.push(childId);
100
+ fieldToParent.set(childId, formField.id);
101
+ });
102
+ } else {
103
+ fieldIdsToValidate.push(formField.id);
104
+ }
105
+ });
106
+ return {
107
+ fields: (0, import_normalize_fields.default)(
108
+ fields.filter(
109
+ (field) => fieldIdsToValidate.includes(field.id)
110
+ )
111
+ ),
112
+ fieldToParent
113
+ };
114
+ }
115
+ function useFormValidity(item, fields, form) {
116
+ const [formValidity, setFormValidity] = (0, import_element.useState)();
117
+ const previousValidatedValuesRef = (0, import_element.useRef)({});
118
+ const customValidationCounterRef = (0, import_element.useRef)({});
119
+ const elementsValidationCounterRef = (0, import_element.useRef)(
120
+ {}
121
+ );
122
+ const validate = (0, import_element.useCallback)(() => {
123
+ const { fields: fieldsToValidate, fieldToParent } = getFieldsToValidate(
124
+ fields,
125
+ form
126
+ );
127
+ if (fieldsToValidate.length === 0) {
128
+ setFormValidity(void 0);
129
+ return;
130
+ }
131
+ fieldsToValidate.forEach((field) => {
132
+ const value = field.getValue({ item });
133
+ if (previousValidatedValuesRef.current.hasOwnProperty(field.id) && value === previousValidatedValuesRef.current[field.id]) {
134
+ return;
135
+ }
136
+ previousValidatedValuesRef.current[field.id] = value;
137
+ const parentFieldId = fieldToParent.get(field.id);
138
+ if (field.isValid.required && isInvalidForRequired(field.type, value)) {
139
+ updateFieldValidity(setFormValidity, parentFieldId, field.id, {
140
+ required: { type: "invalid" }
141
+ });
142
+ return;
143
+ }
144
+ if (field.isValid.elements && field.hasElements && !field.getElements && Array.isArray(field.elements)) {
145
+ const validValues = field.elements.map((el) => el.value);
146
+ if (field.type !== "array" && !validValues.includes(value)) {
147
+ updateFieldValidity(
148
+ setFormValidity,
149
+ parentFieldId,
150
+ field.id,
151
+ {
152
+ elements: {
153
+ type: "invalid",
154
+ message: "Value must be one of the elements."
155
+ }
156
+ }
157
+ );
158
+ return;
159
+ }
160
+ if (field.type === "array" && !Array.isArray(value)) {
161
+ updateFieldValidity(
162
+ setFormValidity,
163
+ parentFieldId,
164
+ field.id,
165
+ {
166
+ elements: {
167
+ type: "invalid",
168
+ message: "Value must be an array."
169
+ }
170
+ }
171
+ );
172
+ return;
173
+ }
174
+ if (field.type === "array" && value.some((v) => !validValues.includes(v))) {
175
+ updateFieldValidity(
176
+ setFormValidity,
177
+ parentFieldId,
178
+ field.id,
179
+ {
180
+ elements: {
181
+ type: "invalid",
182
+ message: "Value must be one of the elements."
183
+ }
184
+ }
185
+ );
186
+ return;
187
+ }
188
+ }
189
+ if (field.isValid.elements && field.hasElements && typeof field.getElements === "function") {
190
+ const currentToken = (elementsValidationCounterRef.current[field.id] || 0) + 1;
191
+ elementsValidationCounterRef.current[field.id] = currentToken;
192
+ updateFieldValidity(setFormValidity, parentFieldId, field.id, {
193
+ elements: {
194
+ type: "validating",
195
+ message: "Validating..."
196
+ }
197
+ });
198
+ field.getElements().then((result) => {
199
+ if (elementsValidationCounterRef.current[field.id] !== currentToken) {
200
+ return;
201
+ }
202
+ if (!Array.isArray(result)) {
203
+ updateFieldValidity(
204
+ setFormValidity,
205
+ parentFieldId,
206
+ field.id,
207
+ {
208
+ elements: {
209
+ type: "invalid",
210
+ message: "Could not validate elements."
211
+ }
212
+ }
213
+ );
214
+ return;
215
+ }
216
+ const validValues = result.map((el) => el.value);
217
+ if (field.type !== "array" && !validValues.includes(value)) {
218
+ updateFieldValidity(
219
+ setFormValidity,
220
+ parentFieldId,
221
+ field.id,
222
+ {
223
+ elements: {
224
+ type: "invalid",
225
+ message: "Value must be one of the elements."
226
+ }
227
+ }
228
+ );
229
+ return;
230
+ }
231
+ if (field.type === "array" && !Array.isArray(value)) {
232
+ updateFieldValidity(
233
+ setFormValidity,
234
+ parentFieldId,
235
+ field.id,
236
+ {
237
+ elements: {
238
+ type: "invalid",
239
+ message: "Value must be an array."
240
+ }
241
+ }
242
+ );
243
+ return;
244
+ }
245
+ if (field.type === "array" && value.some(
246
+ (v) => !validValues.includes(v)
247
+ )) {
248
+ updateFieldValidity(
249
+ setFormValidity,
250
+ parentFieldId,
251
+ field.id,
252
+ {
253
+ elements: {
254
+ type: "invalid",
255
+ message: "Value must be one of the elements."
256
+ }
257
+ }
258
+ );
259
+ }
260
+ }).catch((error) => {
261
+ if (elementsValidationCounterRef.current[field.id] !== currentToken) {
262
+ return;
263
+ }
264
+ updateFieldValidity(
265
+ setFormValidity,
266
+ parentFieldId,
267
+ field.id,
268
+ {
269
+ elements: {
270
+ type: "invalid",
271
+ message: error.message
272
+ }
273
+ }
274
+ );
275
+ });
276
+ }
277
+ let customError;
278
+ try {
279
+ customError = field.isValid?.custom?.(
280
+ (0, import_deepmerge.default)(
281
+ item,
282
+ field.setValue({
283
+ item,
284
+ value
285
+ })
286
+ ),
287
+ field
288
+ );
289
+ } catch (error) {
290
+ let errorMessage;
291
+ if (error instanceof Error) {
292
+ errorMessage = error.message;
293
+ } else {
294
+ errorMessage = String(error) || (0, import_i18n.__)("Unknown error when running custom validation.");
295
+ }
296
+ updateFieldValidity(setFormValidity, parentFieldId, field.id, {
297
+ custom: {
298
+ type: "invalid",
299
+ message: errorMessage
300
+ }
301
+ });
302
+ }
303
+ if (typeof customError === "string") {
304
+ updateFieldValidity(setFormValidity, parentFieldId, field.id, {
305
+ custom: {
306
+ type: "invalid",
307
+ message: customError
308
+ }
309
+ });
310
+ return;
311
+ }
312
+ if (customError instanceof Promise) {
313
+ const currentToken = (customValidationCounterRef.current[field.id] || 0) + 1;
314
+ customValidationCounterRef.current[field.id] = currentToken;
315
+ updateFieldValidity(setFormValidity, parentFieldId, field.id, {
316
+ custom: {
317
+ type: "validating",
318
+ message: "Validating..."
319
+ }
320
+ });
321
+ customError.then((result) => {
322
+ if (customValidationCounterRef.current[field.id] !== currentToken) {
323
+ return;
324
+ }
325
+ if (result === null) {
326
+ updateFieldValidity(
327
+ setFormValidity,
328
+ parentFieldId,
329
+ field.id,
330
+ {
331
+ custom: {
332
+ type: "valid",
333
+ message: "Valid"
334
+ }
335
+ }
336
+ );
337
+ return;
338
+ }
339
+ if (typeof result === "string") {
340
+ updateFieldValidity(
341
+ setFormValidity,
342
+ parentFieldId,
343
+ field.id,
344
+ {
345
+ custom: {
346
+ type: "invalid",
347
+ message: result
348
+ }
349
+ }
350
+ );
351
+ }
352
+ }).catch((error) => {
353
+ if (customValidationCounterRef.current[field.id] !== currentToken) {
354
+ return;
355
+ }
356
+ updateFieldValidity(
357
+ setFormValidity,
358
+ parentFieldId,
359
+ field.id,
360
+ {
361
+ custom: {
362
+ type: "invalid",
363
+ message: error.message
364
+ }
365
+ }
366
+ );
367
+ });
368
+ return;
369
+ }
370
+ setFormValidity((prev) => {
371
+ if (!prev) {
372
+ return prev;
373
+ }
374
+ if (parentFieldId) {
375
+ const parentField = prev[parentFieldId];
376
+ if (!parentField?.children) {
377
+ return prev;
378
+ }
379
+ const { [field.id]: removed2, ...restChildren } = parentField.children;
380
+ if (Object.keys(restChildren).length === 0) {
381
+ const { children, ...restParent } = parentField;
382
+ if (Object.keys(restParent).length === 0) {
383
+ const {
384
+ [parentFieldId]: removedParent,
385
+ ...restFields
386
+ } = prev;
387
+ return Object.keys(restFields).length === 0 ? void 0 : restFields;
388
+ }
389
+ return {
390
+ ...prev,
391
+ [parentFieldId]: restParent
392
+ };
393
+ }
394
+ return {
395
+ ...prev,
396
+ [parentFieldId]: {
397
+ ...parentField,
398
+ children: restChildren
399
+ }
400
+ };
401
+ }
402
+ if (!prev[field.id]) {
403
+ return prev;
404
+ }
405
+ const { [field.id]: removed, ...rest } = prev;
406
+ if (Object.keys(rest).length === 0) {
407
+ return void 0;
408
+ }
409
+ return rest;
410
+ });
411
+ });
412
+ }, [item, fields, form]);
413
+ (0, import_element.useEffect)(() => {
414
+ validate();
415
+ }, [validate]);
416
+ return {
417
+ validity: formValidity,
418
+ isValid: isFormValid(formValidity)
419
+ };
420
+ }
421
+ var use_form_validity_default = useFormValidity;
422
+ // Annotate the CommonJS export names for ESM import in node:
423
+ 0 && (module.exports = {
424
+ useFormValidity
425
+ });
426
+ //# sourceMappingURL=use-form-validity.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/hooks/use-form-validity.ts"],
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport deepMerge from 'deepmerge';\n\n/**\n * WordPress dependencies\n */\nimport { useCallback, useEffect, useRef, useState } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport normalizeFields from '../utils/normalize-fields';\nimport normalizeFormFields from '../dataform-layouts/normalize-form-fields';\nimport type {\n\tCombinedFormField,\n\tField,\n\tFieldValidity,\n\tForm,\n\tFormValidity,\n\tNormalizedField,\n} from '../types';\nconst isEmptyNullOrUndefined = ( value: any ) =>\n\t[ undefined, '', null ].includes( value );\n\nconst isArrayOrElementsEmptyNullOrUndefined = ( value: any ) => {\n\treturn (\n\t\t! Array.isArray( value ) ||\n\t\tvalue.length === 0 ||\n\t\tvalue.every( ( element: any ) => isEmptyNullOrUndefined( element ) )\n\t);\n};\n\nfunction isInvalidForRequired( fieldType: string | undefined, value: any ) {\n\tif (\n\t\t( fieldType === undefined && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'text' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'email' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'url' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'telephone' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'password' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'integer' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'number' && isEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'array' &&\n\t\t\tisArrayOrElementsEmptyNullOrUndefined( value ) ) ||\n\t\t( fieldType === 'boolean' && value !== true )\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction isFormValid( formValidity: FormValidity | undefined ): boolean {\n\tif ( ! formValidity ) {\n\t\treturn true;\n\t}\n\n\treturn Object.values( formValidity ).every( ( fieldValidation ) => {\n\t\treturn Object.entries( fieldValidation ).every(\n\t\t\t( [ key, validation ] ) => {\n\t\t\t\tif (\n\t\t\t\t\tkey === 'children' &&\n\t\t\t\t\tvalidation &&\n\t\t\t\t\ttypeof validation === 'object'\n\t\t\t\t) {\n\t\t\t\t\t// Recursively check children validations\n\t\t\t\t\treturn isFormValid( validation as FormValidity );\n\t\t\t\t}\n\t\t\t\treturn validation.type === 'valid';\n\t\t\t}\n\t\t);\n\t} );\n}\n\nfunction updateFieldValidity(\n\tsetFormValidity: React.Dispatch< React.SetStateAction< FormValidity > >,\n\tparentFieldId: string | undefined,\n\tfieldId: string,\n\tnewValidity: FieldValidity\n) {\n\tif ( parentFieldId ) {\n\t\tsetFormValidity( ( prev ) => ( {\n\t\t\t...prev,\n\t\t\t[ parentFieldId ]: {\n\t\t\t\t...prev?.[ parentFieldId ],\n\t\t\t\tchildren: {\n\t\t\t\t\t...prev?.[ parentFieldId ]?.children,\n\t\t\t\t\t[ fieldId ]: {\n\t\t\t\t\t\t...newValidity,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t} ) );\n\t} else {\n\t\tsetFormValidity( ( prev ) => ( {\n\t\t\t...prev,\n\t\t\t[ fieldId ]: {\n\t\t\t\t...newValidity,\n\t\t\t},\n\t\t} ) );\n\t}\n}\n\nfunction getFieldsToValidate< Item >(\n\tfields: Field< Item >[],\n\tform: Form\n): {\n\tfields: NormalizedField< Item >[];\n\tfieldToParent: Map< string, string >;\n} {\n\tconst formFields = normalizeFormFields( form );\n\tif ( formFields.length === 0 ) {\n\t\treturn { fields: [], fieldToParent: new Map() };\n\t}\n\n\tconst fieldToParent = new Map< string, string >();\n\tconst fieldIdsToValidate: string[] = [];\n\tformFields.forEach( ( formField ) => {\n\t\tif ( !! ( formField as CombinedFormField ).children ) {\n\t\t\t( formField as CombinedFormField ).children.forEach( ( child ) => {\n\t\t\t\tconst childId = typeof child === 'string' ? child : child.id;\n\t\t\t\tfieldIdsToValidate.push( childId );\n\t\t\t\tfieldToParent.set( childId, formField.id );\n\t\t\t} );\n\t\t} else {\n\t\t\tfieldIdsToValidate.push( formField.id );\n\t\t}\n\t} );\n\n\treturn {\n\t\tfields: normalizeFields(\n\t\t\tfields.filter( ( field ) =>\n\t\t\t\tfieldIdsToValidate.includes( field.id )\n\t\t\t)\n\t\t),\n\t\tfieldToParent,\n\t};\n}\n\n/**\n * Hook that validates a form item and returns an object with error messages for each field.\n *\n * @param item The item to validate.\n * @param fields Fields config.\n * @param form Form config.\n *\n * @return Record of field IDs to error messages (undefined means no error).\n */\nexport function useFormValidity< Item >(\n\titem: Item,\n\tfields: Field< Item >[],\n\tform: Form\n): { validity: FormValidity; isValid: boolean } {\n\tconst [ formValidity, setFormValidity ] = useState< FormValidity >();\n\tconst previousValidatedValuesRef = useRef< Record< string, any > >( {} );\n\n\t// The following counters are used to track the validation promises triggered\n\t// by executing isValid.custom and the elements validation. When the promise resolves,\n\t// it will update the form validity state ONLY if its counter matches the current one.\n\tconst customValidationCounterRef = useRef< Record< string, number > >( {} );\n\tconst elementsValidationCounterRef = useRef< Record< string, number > >(\n\t\t{}\n\t);\n\n\tconst validate = useCallback( () => {\n\t\tconst { fields: fieldsToValidate, fieldToParent } = getFieldsToValidate(\n\t\t\tfields,\n\t\t\tform\n\t\t);\n\t\tif ( fieldsToValidate.length === 0 ) {\n\t\t\tsetFormValidity( undefined );\n\t\t\treturn;\n\t\t}\n\n\t\tfieldsToValidate.forEach( ( field ) => {\n\t\t\tconst value = field.getValue( { item } );\n\t\t\tif (\n\t\t\t\tpreviousValidatedValuesRef.current.hasOwnProperty( field.id ) &&\n\t\t\t\tvalue === previousValidatedValuesRef.current[ field.id ]\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpreviousValidatedValuesRef.current[ field.id ] = value;\n\n\t\t\tconst parentFieldId = fieldToParent.get( field.id );\n\n\t\t\t// isValid.required\n\t\t\tif (\n\t\t\t\tfield.isValid.required &&\n\t\t\t\tisInvalidForRequired( field.type, value )\n\t\t\t) {\n\t\t\t\tupdateFieldValidity( setFormValidity, parentFieldId, field.id, {\n\t\t\t\t\trequired: { type: 'invalid' },\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// isValid.elements (static elements)\n\t\t\tif (\n\t\t\t\tfield.isValid.elements &&\n\t\t\t\tfield.hasElements &&\n\t\t\t\t! field.getElements &&\n\t\t\t\tArray.isArray( field.elements )\n\t\t\t) {\n\t\t\t\tconst validValues = field.elements.map( ( el ) => el.value );\n\n\t\t\t\tif (\n\t\t\t\t\tfield.type !== 'array' &&\n\t\t\t\t\t! validValues.includes( value )\n\t\t\t\t) {\n\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: 'Value must be one of the elements.',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( field.type === 'array' && ! Array.isArray( value ) ) {\n\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: 'Value must be an array.',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tfield.type === 'array' &&\n\t\t\t\t\tvalue.some( ( v: any ) => ! validValues.includes( v ) )\n\t\t\t\t) {\n\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: 'Value must be one of the elements.',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// isValid.elements (get them via getElements first)\n\t\t\tif (\n\t\t\t\tfield.isValid.elements &&\n\t\t\t\tfield.hasElements &&\n\t\t\t\ttypeof field.getElements === 'function'\n\t\t\t) {\n\t\t\t\tconst currentToken =\n\t\t\t\t\t( elementsValidationCounterRef.current[ field.id ] || 0 ) +\n\t\t\t\t\t1;\n\t\t\t\telementsValidationCounterRef.current[ field.id ] = currentToken;\n\t\t\t\tupdateFieldValidity( setFormValidity, parentFieldId, field.id, {\n\t\t\t\t\telements: {\n\t\t\t\t\t\ttype: 'validating',\n\t\t\t\t\t\tmessage: 'Validating...',\n\t\t\t\t\t},\n\t\t\t\t} );\n\n\t\t\t\tfield\n\t\t\t\t\t.getElements()\n\t\t\t\t\t.then( ( result ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\telementsValidationCounterRef.current[ field.id ] !==\n\t\t\t\t\t\t\tcurrentToken\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! Array.isArray( result ) ) {\n\t\t\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\t\t\tmessage: 'Could not validate elements.',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst validValues = result.map( ( el ) => el.value );\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tfield.type !== 'array' &&\n\t\t\t\t\t\t\t! validValues.includes( value )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\t\t\t'Value must be one of the elements.',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tfield.type === 'array' &&\n\t\t\t\t\t\t\t! Array.isArray( value )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\t\t\tmessage: 'Value must be an array.',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tfield.type === 'array' &&\n\t\t\t\t\t\t\tvalue.some(\n\t\t\t\t\t\t\t\t( v: any ) => ! validValues.includes( v )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\t\t\t'Value must be one of the elements.',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} )\n\t\t\t\t\t.catch( ( error ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\telementsValidationCounterRef.current[ field.id ] !==\n\t\t\t\t\t\t\tcurrentToken\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Check isValid.custom\n\t\t\tlet customError;\n\t\t\ttry {\n\t\t\t\tcustomError = field.isValid?.custom?.(\n\t\t\t\t\tdeepMerge(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tfield.setValue( {\n\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t} ) as Partial< Item >\n\t\t\t\t\t),\n\t\t\t\t\tfield\n\t\t\t\t);\n\t\t\t} catch ( error: any ) {\n\t\t\t\tlet errorMessage;\n\t\t\t\tif ( error instanceof Error ) {\n\t\t\t\t\terrorMessage = error.message;\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tString( error ) ||\n\t\t\t\t\t\t__( 'Unknown error when running custom validation.' );\n\t\t\t\t}\n\n\t\t\t\tupdateFieldValidity( setFormValidity, parentFieldId, field.id, {\n\t\t\t\t\tcustom: {\n\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// \u2014 isValid.custom (sync version)\n\t\t\tif ( typeof customError === 'string' ) {\n\t\t\t\tupdateFieldValidity( setFormValidity, parentFieldId, field.id, {\n\t\t\t\t\tcustom: {\n\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\tmessage: customError,\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// \u2014 isValid.custom (async version)\n\t\t\tif ( customError instanceof Promise ) {\n\t\t\t\t// Increment token for this field to track the latest validation\n\t\t\t\tconst currentToken =\n\t\t\t\t\t( customValidationCounterRef.current[ field.id ] || 0 ) + 1;\n\t\t\t\tcustomValidationCounterRef.current[ field.id ] = currentToken;\n\n\t\t\t\tupdateFieldValidity( setFormValidity, parentFieldId, field.id, {\n\t\t\t\t\tcustom: {\n\t\t\t\t\t\ttype: 'validating',\n\t\t\t\t\t\tmessage: 'Validating...',\n\t\t\t\t\t},\n\t\t\t\t} );\n\n\t\t\t\tcustomError\n\t\t\t\t\t.then( ( result ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcustomValidationCounterRef.current[ field.id ] !==\n\t\t\t\t\t\t\tcurrentToken\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( result === null ) {\n\t\t\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\t\t\t\ttype: 'valid',\n\t\t\t\t\t\t\t\t\t\tmessage: 'Valid',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( typeof result === 'string' ) {\n\t\t\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\t\t\tmessage: result,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} )\n\t\t\t\t\t.catch( ( error ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcustomValidationCounterRef.current[ field.id ] !==\n\t\t\t\t\t\t\tcurrentToken\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tupdateFieldValidity(\n\t\t\t\t\t\t\tsetFormValidity,\n\t\t\t\t\t\t\tparentFieldId,\n\t\t\t\t\t\t\tfield.id,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// No errors for this field, remove from errors object\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tif ( ! prev ) {\n\t\t\t\t\treturn prev;\n\t\t\t\t}\n\n\t\t\t\tif ( parentFieldId ) {\n\t\t\t\t\t// This field is a child - remove it from parent's children\n\t\t\t\t\tconst parentField = prev[ parentFieldId ];\n\t\t\t\t\tif ( ! parentField?.children ) {\n\t\t\t\t\t\treturn prev;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { [ field.id ]: removed, ...restChildren } =\n\t\t\t\t\t\tparentField.children as any;\n\n\t\t\t\t\t// If no more children, remove the children property\n\t\t\t\t\tif ( Object.keys( restChildren ).length === 0 ) {\n\t\t\t\t\t\tconst { children, ...restParent } = parentField;\n\t\t\t\t\t\tif ( Object.keys( restParent ).length === 0 ) {\n\t\t\t\t\t\t\t// Remove parent field entirely if no other validations\n\t\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\t\t[ parentFieldId ]: removedParent,\n\t\t\t\t\t\t\t\t...restFields\n\t\t\t\t\t\t\t} = prev;\n\t\t\t\t\t\t\treturn Object.keys( restFields ).length === 0\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: restFields;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t[ parentFieldId ]: restParent,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t[ parentFieldId ]: {\n\t\t\t\t\t\t\t...parentField,\n\t\t\t\t\t\t\tchildren: restChildren,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Regular field - remove from top level\n\t\t\t\tif ( ! prev[ field.id ] ) {\n\t\t\t\t\treturn prev;\n\t\t\t\t}\n\n\t\t\t\tconst { [ field.id ]: removed, ...rest } = prev;\n\n\t\t\t\tif ( Object.keys( rest ).length === 0 ) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn rest;\n\t\t\t} );\n\t\t} );\n\t}, [ item, fields, form ] );\n\n\tuseEffect( () => {\n\t\tvalidate();\n\t}, [ validate ] );\n\n\treturn {\n\t\tvalidity: formValidity,\n\t\tisValid: isFormValid( formValidity ),\n\t};\n}\n\nexport default useFormValidity;\n"],
5
+ "mappings": "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",
6
+ "names": ["normalizeFormFields", "normalizeFields", "deepMerge", "removed"]
7
+ }
package/build/index.js CHANGED
@@ -33,14 +33,14 @@ __export(index_exports, {
33
33
  DataViewsPicker: () => import_dataviews_picker.default,
34
34
  VIEW_LAYOUTS: () => import_dataviews_layouts.VIEW_LAYOUTS,
35
35
  filterSortAndPaginate: () => import_filter_sort_and_paginate.default,
36
- isItemValid: () => import_is_item_valid.default
36
+ useFormValidity: () => import_hooks.useFormValidity
37
37
  });
38
38
  module.exports = __toCommonJS(index_exports);
39
39
  var import_dataviews = __toESM(require("./components/dataviews"));
40
40
  var import_dataviews_picker = __toESM(require("./components/dataviews-picker"));
41
41
  var import_dataform = __toESM(require("./components/dataform"));
42
42
  var import_filter_sort_and_paginate = __toESM(require("./utils/filter-sort-and-paginate"));
43
- var import_is_item_valid = __toESM(require("./utils/is-item-valid"));
43
+ var import_hooks = require("./hooks");
44
44
  var import_dataviews_layouts = require("./dataviews-layouts");
45
45
  // Annotate the CommonJS export names for ESM import in node:
46
46
  0 && (module.exports = {
@@ -49,6 +49,6 @@ var import_dataviews_layouts = require("./dataviews-layouts");
49
49
  DataViewsPicker,
50
50
  VIEW_LAYOUTS,
51
51
  filterSortAndPaginate,
52
- isItemValid
52
+ useFormValidity
53
53
  });
54
54
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["export { default as DataViews } from './components/dataviews';\nexport { default as DataViewsPicker } from './components/dataviews-picker';\nexport { default as DataForm } from './components/dataform';\nexport { default as filterSortAndPaginate } from './utils/filter-sort-and-paginate';\nexport { default as isItemValid } from './utils/is-item-valid';\nexport { VIEW_LAYOUTS } from './dataviews-layouts';\nexport type * from './types';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAqC;AACrC,8BAA2C;AAC3C,sBAAoC;AACpC,sCAAiD;AACjD,2BAAuC;AACvC,+BAA6B;",
4
+ "sourcesContent": ["export { default as DataViews } from './components/dataviews';\nexport { default as DataViewsPicker } from './components/dataviews-picker';\nexport { default as DataForm } from './components/dataform';\nexport { default as filterSortAndPaginate } from './utils/filter-sort-and-paginate';\nexport { useFormValidity } from './hooks';\nexport { VIEW_LAYOUTS } from './dataviews-layouts';\nexport type * from './types';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAqC;AACrC,8BAA2C;AAC3C,sBAAoC;AACpC,sCAAiD;AACjD,mBAAgC;AAChC,+BAA6B;",
6
6
  "names": []
7
7
  }