@wordpress/dataviews 10.2.0 → 10.3.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 (529) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +108 -1
  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 +17 -400
  52. package/build/components/dataviews-view-config/index.js.map +3 -3
  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/components/dataviews-view-config/properties-section.js +177 -0
  56. package/build/components/dataviews-view-config/properties-section.js.map +7 -0
  57. package/build/constants.js +39 -34
  58. package/build/constants.js.map +2 -2
  59. package/build/dataform-controls/array.js +4 -2
  60. package/build/dataform-controls/array.js.map +1 -1
  61. package/build/dataform-controls/checkbox.js +4 -2
  62. package/build/dataform-controls/checkbox.js.map +1 -1
  63. package/build/dataform-controls/color.js +5 -3
  64. package/build/dataform-controls/color.js.map +1 -1
  65. package/build/dataform-controls/date.js +8 -6
  66. package/build/dataform-controls/date.js.map +1 -1
  67. package/build/dataform-controls/datetime.js +11 -15
  68. package/build/dataform-controls/datetime.js.map +3 -3
  69. package/build/dataform-controls/email.js +3 -1
  70. package/build/dataform-controls/email.js.map +1 -1
  71. package/build/dataform-controls/index.js +4 -2
  72. package/build/dataform-controls/index.js.map +1 -1
  73. package/build/dataform-controls/integer.js +3 -1
  74. package/build/dataform-controls/integer.js.map +1 -1
  75. package/build/dataform-controls/number.js +3 -1
  76. package/build/dataform-controls/number.js.map +1 -1
  77. package/build/dataform-controls/password.js +3 -1
  78. package/build/dataform-controls/password.js.map +1 -1
  79. package/build/dataform-controls/radio.js +4 -2
  80. package/build/dataform-controls/radio.js.map +1 -1
  81. package/build/dataform-controls/select.js +4 -2
  82. package/build/dataform-controls/select.js.map +1 -1
  83. package/build/dataform-controls/telephone.js +3 -1
  84. package/build/dataform-controls/telephone.js.map +1 -1
  85. package/build/dataform-controls/text.js +3 -1
  86. package/build/dataform-controls/text.js.map +1 -1
  87. package/build/dataform-controls/textarea.js +4 -2
  88. package/build/dataform-controls/textarea.js.map +1 -1
  89. package/build/dataform-controls/toggle-group.js +4 -2
  90. package/build/dataform-controls/toggle-group.js.map +1 -1
  91. package/build/dataform-controls/toggle.js +4 -2
  92. package/build/dataform-controls/toggle.js.map +1 -1
  93. package/build/dataform-controls/url.js +3 -1
  94. package/build/dataform-controls/url.js.map +1 -1
  95. package/build/dataform-controls/utils/get-custom-validity.js +2 -0
  96. package/build/dataform-controls/utils/get-custom-validity.js.map +1 -1
  97. package/build/dataform-controls/utils/relative-date-control.js +4 -2
  98. package/build/dataform-controls/utils/relative-date-control.js.map +1 -1
  99. package/build/dataform-controls/utils/validated-input.js +4 -2
  100. package/build/dataform-controls/utils/validated-input.js.map +1 -1
  101. package/build/dataform-controls/utils/validated-number.js +4 -2
  102. package/build/dataform-controls/utils/validated-number.js.map +1 -1
  103. package/build/dataform-layouts/card/index.js +65 -34
  104. package/build/dataform-layouts/card/index.js.map +3 -3
  105. package/build/dataform-layouts/data-form-layout.js +8 -14
  106. package/build/dataform-layouts/data-form-layout.js.map +3 -3
  107. package/build/dataform-layouts/details/index.js +78 -0
  108. package/build/dataform-layouts/details/index.js.map +7 -0
  109. package/build/dataform-layouts/get-summary-fields.js +3 -1
  110. package/build/dataform-layouts/get-summary-fields.js.map +1 -1
  111. package/build/dataform-layouts/index.js +9 -2
  112. package/build/dataform-layouts/index.js.map +3 -3
  113. package/build/dataform-layouts/{normalize-form-fields.js → normalize-form.js} +44 -22
  114. package/build/dataform-layouts/normalize-form.js.map +7 -0
  115. package/build/dataform-layouts/panel/dropdown.js +9 -8
  116. package/build/dataform-layouts/panel/dropdown.js.map +2 -2
  117. package/build/dataform-layouts/panel/index.js +10 -14
  118. package/build/dataform-layouts/panel/index.js.map +2 -2
  119. package/build/dataform-layouts/panel/modal.js +9 -8
  120. package/build/dataform-layouts/panel/modal.js.map +2 -2
  121. package/build/dataform-layouts/panel/summary-button.js +3 -1
  122. package/build/dataform-layouts/panel/summary-button.js.map +1 -1
  123. package/build/dataform-layouts/regular/index.js +8 -10
  124. package/build/dataform-layouts/regular/index.js.map +2 -2
  125. package/build/dataform-layouts/row/index.js +10 -33
  126. package/build/dataform-layouts/row/index.js.map +3 -3
  127. package/build/dataviews-layouts/grid/index.js +4 -2
  128. package/build/dataviews-layouts/grid/index.js.map +1 -1
  129. package/build/dataviews-layouts/grid/preview-size-picker.js +4 -2
  130. package/build/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  131. package/build/dataviews-layouts/index.js +12 -1
  132. package/build/dataviews-layouts/index.js.map +3 -3
  133. package/build/dataviews-layouts/list/index.js +6 -6
  134. package/build/dataviews-layouts/list/index.js.map +2 -2
  135. package/build/dataviews-layouts/picker-grid/index.js +4 -2
  136. package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
  137. package/build/dataviews-layouts/picker-table/index.js +422 -0
  138. package/build/dataviews-layouts/picker-table/index.js.map +7 -0
  139. package/build/dataviews-layouts/table/column-header-menu.js +6 -4
  140. package/build/dataviews-layouts/table/column-header-menu.js.map +2 -2
  141. package/build/dataviews-layouts/table/column-primary.js +4 -7
  142. package/build/dataviews-layouts/table/column-primary.js.map +2 -2
  143. package/build/dataviews-layouts/table/density-picker.js +3 -1
  144. package/build/dataviews-layouts/table/density-picker.js.map +1 -1
  145. package/build/dataviews-layouts/table/index.js +48 -2
  146. package/build/dataviews-layouts/table/index.js.map +2 -2
  147. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js +3 -1
  148. package/build/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -1
  149. package/build/dataviews-layouts/utils/get-data-by-group.js +2 -0
  150. package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -1
  151. package/build/dataviews-layouts/utils/grid-items.js +4 -2
  152. package/build/dataviews-layouts/utils/grid-items.js.map +1 -1
  153. package/build/dataviews-layouts/utils/item-click-wrapper.js +3 -1
  154. package/build/dataviews-layouts/utils/item-click-wrapper.js.map +1 -1
  155. package/build/dataviews-layouts/utils/preview-size-picker.js +4 -2
  156. package/build/dataviews-layouts/utils/preview-size-picker.js.map +1 -1
  157. package/build/field-types/array.js +3 -1
  158. package/build/field-types/array.js.map +1 -1
  159. package/build/field-types/boolean.js +3 -1
  160. package/build/field-types/boolean.js.map +1 -1
  161. package/build/field-types/color.js +3 -1
  162. package/build/field-types/color.js.map +1 -1
  163. package/build/field-types/date.js +4 -2
  164. package/build/field-types/date.js.map +1 -1
  165. package/build/field-types/datetime.js +17 -2
  166. package/build/field-types/datetime.js.map +3 -3
  167. package/build/field-types/email.js +4 -2
  168. package/build/field-types/email.js.map +1 -1
  169. package/build/field-types/index.js +3 -1
  170. package/build/field-types/index.js.map +1 -1
  171. package/build/field-types/integer.js +3 -1
  172. package/build/field-types/integer.js.map +1 -1
  173. package/build/field-types/media.js +2 -0
  174. package/build/field-types/media.js.map +1 -1
  175. package/build/field-types/number.js +3 -1
  176. package/build/field-types/number.js.map +1 -1
  177. package/build/field-types/password.js +3 -1
  178. package/build/field-types/password.js.map +1 -1
  179. package/build/field-types/telephone.js +3 -1
  180. package/build/field-types/telephone.js.map +1 -1
  181. package/build/field-types/text.js +3 -1
  182. package/build/field-types/text.js.map +1 -1
  183. package/build/field-types/url.js +3 -1
  184. package/build/field-types/url.js.map +1 -1
  185. package/build/{dataform-layouts/is-combined-field.js → field-types/utils/parse-date-time.js} +15 -11
  186. package/build/field-types/utils/parse-date-time.js.map +7 -0
  187. package/build/field-types/utils/render-from-elements.js +2 -0
  188. package/build/field-types/utils/render-from-elements.js.map +1 -1
  189. package/build/hooks/index.js +2 -0
  190. package/build/hooks/index.js.map +1 -1
  191. package/build/hooks/use-elements.js +3 -1
  192. package/build/hooks/use-elements.js.map +1 -1
  193. package/build/hooks/use-form-validity.js +425 -321
  194. package/build/hooks/use-form-validity.js.map +3 -3
  195. package/build/index.js +2 -0
  196. package/build/index.js.map +1 -1
  197. package/build/lock-unlock.js +3 -1
  198. package/build/lock-unlock.js.map +1 -1
  199. package/build/types/dataform.js +2 -0
  200. package/build/types/dataform.js.map +2 -2
  201. package/build/types/dataviews.js +2 -0
  202. package/build/types/dataviews.js.map +2 -2
  203. package/build/types/field-api.js +2 -0
  204. package/build/types/field-api.js.map +1 -1
  205. package/build/types/index.js +2 -0
  206. package/build/types/index.js.map +1 -1
  207. package/build/types/private.js +2 -0
  208. package/build/types/private.js.map +1 -1
  209. package/build/utils/filter-sort-and-paginate.js +3 -1
  210. package/build/utils/filter-sort-and-paginate.js.map +1 -1
  211. package/build/utils/has-elements.js +2 -0
  212. package/build/utils/has-elements.js.map +1 -1
  213. package/build/utils/normalize-fields.js +4 -2
  214. package/build/utils/normalize-fields.js.map +1 -1
  215. package/build-module/components/dataform/index.js +5 -2
  216. package/build-module/components/dataform/index.js.map +2 -2
  217. package/build-module/components/dataform-context/index.js +3 -2
  218. package/build-module/components/dataform-context/index.js.map +1 -1
  219. package/build-module/components/dataviews/index.js +7 -6
  220. package/build-module/components/dataviews/index.js.map +1 -1
  221. package/build-module/components/dataviews-bulk-actions/index.js +3 -2
  222. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
  223. package/build-module/components/dataviews-context/index.js +2 -1
  224. package/build-module/components/dataviews-context/index.js.map +1 -1
  225. package/build-module/components/dataviews-filters/add-filter.js +3 -2
  226. package/build-module/components/dataviews-filters/add-filter.js.map +1 -1
  227. package/build-module/components/dataviews-filters/filter.js +19 -5
  228. package/build-module/components/dataviews-filters/filter.js.map +2 -2
  229. package/build-module/components/dataviews-filters/filters-toggled.js +2 -1
  230. package/build-module/components/dataviews-filters/filters-toggled.js.map +1 -1
  231. package/build-module/components/dataviews-filters/filters.js +2 -1
  232. package/build-module/components/dataviews-filters/filters.js.map +1 -1
  233. package/build-module/components/dataviews-filters/index.js +1 -0
  234. package/build-module/components/dataviews-filters/index.js.map +1 -1
  235. package/build-module/components/dataviews-filters/input-widget.js +2 -1
  236. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  237. package/build-module/components/dataviews-filters/reset-filters.js +2 -1
  238. package/build-module/components/dataviews-filters/reset-filters.js.map +1 -1
  239. package/build-module/components/dataviews-filters/search-widget.js +7 -6
  240. package/build-module/components/dataviews-filters/search-widget.js.map +2 -2
  241. package/build-module/components/dataviews-filters/toggle.js +2 -1
  242. package/build-module/components/dataviews-filters/toggle.js.map +1 -1
  243. package/build-module/components/dataviews-filters/use-filters.js +1 -0
  244. package/build-module/components/dataviews-filters/use-filters.js.map +1 -1
  245. package/build-module/components/dataviews-filters/utils.js +3 -2
  246. package/build-module/components/dataviews-filters/utils.js.map +1 -1
  247. package/build-module/components/dataviews-footer/index.js +3 -2
  248. package/build-module/components/dataviews-footer/index.js.map +1 -1
  249. package/build-module/components/dataviews-item-actions/index.js +22 -4
  250. package/build-module/components/dataviews-item-actions/index.js.map +2 -2
  251. package/build-module/components/dataviews-layout/index.js +2 -1
  252. package/build-module/components/dataviews-layout/index.js.map +1 -1
  253. package/build-module/components/dataviews-pagination/index.js +2 -1
  254. package/build-module/components/dataviews-pagination/index.js.map +1 -1
  255. package/build-module/components/dataviews-picker/footer.js +3 -2
  256. package/build-module/components/dataviews-picker/footer.js.map +1 -1
  257. package/build-module/components/dataviews-picker/index.js +7 -6
  258. package/build-module/components/dataviews-picker/index.js.map +1 -1
  259. package/build-module/components/dataviews-search/index.js +3 -2
  260. package/build-module/components/dataviews-search/index.js.map +1 -1
  261. package/build-module/components/dataviews-selection-checkbox/index.js +2 -1
  262. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  263. package/build-module/components/dataviews-view-config/index.js +20 -416
  264. package/build-module/components/dataviews-view-config/index.js.map +2 -2
  265. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js +2 -1
  266. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.js.map +1 -1
  267. package/build-module/components/dataviews-view-config/properties-section.js +149 -0
  268. package/build-module/components/dataviews-view-config/properties-section.js.map +7 -0
  269. package/build-module/constants.js +37 -34
  270. package/build-module/constants.js.map +2 -2
  271. package/build-module/dataform-controls/array.js +3 -2
  272. package/build-module/dataform-controls/array.js.map +1 -1
  273. package/build-module/dataform-controls/checkbox.js +3 -2
  274. package/build-module/dataform-controls/checkbox.js.map +1 -1
  275. package/build-module/dataform-controls/color.js +4 -3
  276. package/build-module/dataform-controls/color.js.map +1 -1
  277. package/build-module/dataform-controls/date.js +7 -6
  278. package/build-module/dataform-controls/date.js.map +1 -1
  279. package/build-module/dataform-controls/datetime.js +7 -12
  280. package/build-module/dataform-controls/datetime.js.map +2 -2
  281. package/build-module/dataform-controls/email.js +2 -1
  282. package/build-module/dataform-controls/email.js.map +1 -1
  283. package/build-module/dataform-controls/index.js +3 -2
  284. package/build-module/dataform-controls/index.js.map +1 -1
  285. package/build-module/dataform-controls/integer.js +2 -1
  286. package/build-module/dataform-controls/integer.js.map +1 -1
  287. package/build-module/dataform-controls/number.js +2 -1
  288. package/build-module/dataform-controls/number.js.map +1 -1
  289. package/build-module/dataform-controls/password.js +2 -1
  290. package/build-module/dataform-controls/password.js.map +1 -1
  291. package/build-module/dataform-controls/radio.js +3 -2
  292. package/build-module/dataform-controls/radio.js.map +1 -1
  293. package/build-module/dataform-controls/select.js +3 -2
  294. package/build-module/dataform-controls/select.js.map +1 -1
  295. package/build-module/dataform-controls/telephone.js +2 -1
  296. package/build-module/dataform-controls/telephone.js.map +1 -1
  297. package/build-module/dataform-controls/text.js +2 -1
  298. package/build-module/dataform-controls/text.js.map +1 -1
  299. package/build-module/dataform-controls/textarea.js +3 -2
  300. package/build-module/dataform-controls/textarea.js.map +1 -1
  301. package/build-module/dataform-controls/toggle-group.js +3 -2
  302. package/build-module/dataform-controls/toggle-group.js.map +1 -1
  303. package/build-module/dataform-controls/toggle.js +3 -2
  304. package/build-module/dataform-controls/toggle.js.map +1 -1
  305. package/build-module/dataform-controls/url.js +2 -1
  306. package/build-module/dataform-controls/url.js.map +1 -1
  307. package/build-module/dataform-controls/utils/get-custom-validity.js +1 -0
  308. package/build-module/dataform-controls/utils/get-custom-validity.js.map +1 -1
  309. package/build-module/dataform-controls/utils/relative-date-control.js +3 -2
  310. package/build-module/dataform-controls/utils/relative-date-control.js.map +1 -1
  311. package/build-module/dataform-controls/utils/validated-input.js +3 -2
  312. package/build-module/dataform-controls/utils/validated-input.js.map +1 -1
  313. package/build-module/dataform-controls/utils/validated-number.js +3 -2
  314. package/build-module/dataform-controls/utils/validated-number.js.map +1 -1
  315. package/build-module/dataform-layouts/card/index.js +63 -33
  316. package/build-module/dataform-layouts/card/index.js.map +3 -3
  317. package/build-module/dataform-layouts/data-form-layout.js +8 -15
  318. package/build-module/dataform-layouts/data-form-layout.js.map +2 -2
  319. package/build-module/dataform-layouts/details/index.js +47 -0
  320. package/build-module/dataform-layouts/details/index.js.map +7 -0
  321. package/build-module/dataform-layouts/get-summary-fields.js +2 -1
  322. package/build-module/dataform-layouts/get-summary-fields.js.map +1 -1
  323. package/build-module/dataform-layouts/index.js +8 -2
  324. package/build-module/dataform-layouts/index.js.map +2 -2
  325. package/build-module/dataform-layouts/{normalize-form-fields.js → normalize-form.js} +39 -17
  326. package/build-module/dataform-layouts/normalize-form.js.map +7 -0
  327. package/build-module/dataform-layouts/panel/dropdown.js +7 -7
  328. package/build-module/dataform-layouts/panel/dropdown.js.map +2 -2
  329. package/build-module/dataform-layouts/panel/index.js +9 -14
  330. package/build-module/dataform-layouts/panel/index.js.map +2 -2
  331. package/build-module/dataform-layouts/panel/modal.js +7 -7
  332. package/build-module/dataform-layouts/panel/modal.js.map +2 -2
  333. package/build-module/dataform-layouts/panel/summary-button.js +2 -1
  334. package/build-module/dataform-layouts/panel/summary-button.js.map +1 -1
  335. package/build-module/dataform-layouts/regular/index.js +6 -9
  336. package/build-module/dataform-layouts/regular/index.js.map +2 -2
  337. package/build-module/dataform-layouts/row/index.js +9 -23
  338. package/build-module/dataform-layouts/row/index.js.map +2 -2
  339. package/build-module/dataviews-layouts/grid/index.js +3 -2
  340. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  341. package/build-module/dataviews-layouts/grid/preview-size-picker.js +3 -2
  342. package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
  343. package/build-module/dataviews-layouts/index.js +13 -2
  344. package/build-module/dataviews-layouts/index.js.map +2 -2
  345. package/build-module/dataviews-layouts/list/index.js +5 -6
  346. package/build-module/dataviews-layouts/list/index.js.map +2 -2
  347. package/build-module/dataviews-layouts/picker-grid/index.js +3 -2
  348. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
  349. package/build-module/dataviews-layouts/picker-table/index.js +397 -0
  350. package/build-module/dataviews-layouts/picker-table/index.js.map +7 -0
  351. package/build-module/dataviews-layouts/table/column-header-menu.js +5 -4
  352. package/build-module/dataviews-layouts/table/column-header-menu.js.map +2 -2
  353. package/build-module/dataviews-layouts/table/column-primary.js +3 -7
  354. package/build-module/dataviews-layouts/table/column-primary.js.map +2 -2
  355. package/build-module/dataviews-layouts/table/density-picker.js +2 -1
  356. package/build-module/dataviews-layouts/table/density-picker.js.map +1 -1
  357. package/build-module/dataviews-layouts/table/index.js +48 -3
  358. package/build-module/dataviews-layouts/table/index.js.map +2 -2
  359. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js +2 -1
  360. package/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js.map +1 -1
  361. package/build-module/dataviews-layouts/utils/get-data-by-group.js +1 -0
  362. package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -1
  363. package/build-module/dataviews-layouts/utils/grid-items.js +3 -2
  364. package/build-module/dataviews-layouts/utils/grid-items.js.map +1 -1
  365. package/build-module/dataviews-layouts/utils/item-click-wrapper.js +2 -1
  366. package/build-module/dataviews-layouts/utils/item-click-wrapper.js.map +1 -1
  367. package/build-module/dataviews-layouts/utils/preview-size-picker.js +3 -2
  368. package/build-module/dataviews-layouts/utils/preview-size-picker.js.map +1 -1
  369. package/build-module/field-types/array.js +2 -1
  370. package/build-module/field-types/array.js.map +1 -1
  371. package/build-module/field-types/boolean.js +2 -1
  372. package/build-module/field-types/boolean.js.map +1 -1
  373. package/build-module/field-types/color.js +2 -1
  374. package/build-module/field-types/color.js.map +1 -1
  375. package/build-module/field-types/date.js +3 -2
  376. package/build-module/field-types/date.js.map +1 -1
  377. package/build-module/field-types/datetime.js +16 -2
  378. package/build-module/field-types/datetime.js.map +2 -2
  379. package/build-module/field-types/email.js +3 -2
  380. package/build-module/field-types/email.js.map +1 -1
  381. package/build-module/field-types/index.js +2 -1
  382. package/build-module/field-types/index.js.map +1 -1
  383. package/build-module/field-types/integer.js +2 -1
  384. package/build-module/field-types/integer.js.map +1 -1
  385. package/build-module/field-types/media.js +1 -0
  386. package/build-module/field-types/media.js.map +1 -1
  387. package/build-module/field-types/number.js +2 -1
  388. package/build-module/field-types/number.js.map +1 -1
  389. package/build-module/field-types/password.js +2 -1
  390. package/build-module/field-types/password.js.map +1 -1
  391. package/build-module/field-types/telephone.js +2 -1
  392. package/build-module/field-types/telephone.js.map +1 -1
  393. package/build-module/field-types/text.js +2 -1
  394. package/build-module/field-types/text.js.map +1 -1
  395. package/build-module/field-types/url.js +2 -1
  396. package/build-module/field-types/url.js.map +1 -1
  397. package/build-module/field-types/utils/parse-date-time.js +14 -0
  398. package/build-module/field-types/utils/parse-date-time.js.map +7 -0
  399. package/build-module/field-types/utils/render-from-elements.js +1 -0
  400. package/build-module/field-types/utils/render-from-elements.js.map +1 -1
  401. package/build-module/hooks/index.js +1 -0
  402. package/build-module/hooks/index.js.map +1 -1
  403. package/build-module/hooks/use-elements.js +2 -1
  404. package/build-module/hooks/use-elements.js.map +1 -1
  405. package/build-module/hooks/use-form-validity.js +424 -321
  406. package/build-module/hooks/use-form-validity.js.map +3 -3
  407. package/build-module/index.js +1 -0
  408. package/build-module/index.js.map +1 -1
  409. package/build-module/lock-unlock.js +2 -1
  410. package/build-module/lock-unlock.js.map +1 -1
  411. package/build-module/utils/filter-sort-and-paginate.js +2 -1
  412. package/build-module/utils/filter-sort-and-paginate.js.map +1 -1
  413. package/build-module/utils/has-elements.js +1 -0
  414. package/build-module/utils/has-elements.js.map +1 -1
  415. package/build-module/utils/normalize-fields.js +3 -2
  416. package/build-module/utils/normalize-fields.js.map +1 -1
  417. package/build-style/style-rtl.css +35 -40
  418. package/build-style/style.css +35 -40
  419. package/build-types/components/dataform/index.d.ts.map +1 -1
  420. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
  421. package/build-types/components/dataviews-filters/utils.d.ts.map +1 -1
  422. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
  423. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  424. package/build-types/components/dataviews-view-config/properties-section.d.ts +4 -0
  425. package/build-types/components/dataviews-view-config/properties-section.d.ts.map +1 -0
  426. package/build-types/constants.d.ts +1 -0
  427. package/build-types/constants.d.ts.map +1 -1
  428. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  429. package/build-types/dataform-layouts/card/index.d.ts +1 -1
  430. package/build-types/dataform-layouts/card/index.d.ts.map +1 -1
  431. package/build-types/dataform-layouts/data-form-layout.d.ts +4 -4
  432. package/build-types/dataform-layouts/data-form-layout.d.ts.map +1 -1
  433. package/build-types/dataform-layouts/details/index.d.ts +6 -0
  434. package/build-types/dataform-layouts/details/index.d.ts.map +1 -0
  435. package/build-types/dataform-layouts/get-summary-fields.d.ts.map +1 -1
  436. package/build-types/dataform-layouts/index.d.ts +7 -2
  437. package/build-types/dataform-layouts/index.d.ts.map +1 -1
  438. package/build-types/dataform-layouts/normalize-form.d.ts +8 -0
  439. package/build-types/dataform-layouts/normalize-form.d.ts.map +1 -0
  440. package/build-types/dataform-layouts/panel/dropdown.d.ts +2 -2
  441. package/build-types/dataform-layouts/panel/dropdown.d.ts.map +1 -1
  442. package/build-types/dataform-layouts/panel/index.d.ts.map +1 -1
  443. package/build-types/dataform-layouts/panel/modal.d.ts +2 -2
  444. package/build-types/dataform-layouts/panel/modal.d.ts.map +1 -1
  445. package/build-types/dataform-layouts/regular/index.d.ts.map +1 -1
  446. package/build-types/dataform-layouts/row/index.d.ts.map +1 -1
  447. package/build-types/dataviews-layouts/index.d.ts +8 -0
  448. package/build-types/dataviews-layouts/index.d.ts.map +1 -1
  449. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  450. package/build-types/dataviews-layouts/picker-table/index.d.ts +4 -0
  451. package/build-types/dataviews-layouts/picker-table/index.d.ts.map +1 -0
  452. package/build-types/dataviews-layouts/table/column-header-menu.d.ts +3 -3
  453. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
  454. package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -1
  455. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  456. package/build-types/field-types/datetime.d.ts +1 -1
  457. package/build-types/field-types/datetime.d.ts.map +1 -1
  458. package/build-types/field-types/utils/parse-date-time.d.ts +2 -0
  459. package/build-types/field-types/utils/parse-date-time.d.ts.map +1 -0
  460. package/build-types/hooks/use-form-validity.d.ts.map +1 -1
  461. package/build-types/stories/dataform.story.d.ts +4 -10
  462. package/build-types/stories/dataform.story.d.ts.map +1 -1
  463. package/build-types/stories/dataviews-picker.story.d.ts +33 -0
  464. package/build-types/stories/dataviews-picker.story.d.ts.map +1 -1
  465. package/build-types/stories/dataviews.fixtures.d.ts.map +1 -1
  466. package/build-types/stories/dataviews.story.d.ts +7 -1
  467. package/build-types/stories/dataviews.story.d.ts.map +1 -1
  468. package/build-types/test/normalize-form.d.ts +2 -0
  469. package/build-types/test/normalize-form.d.ts.map +1 -0
  470. package/build-types/types/dataform.d.ts +23 -9
  471. package/build-types/types/dataform.d.ts.map +1 -1
  472. package/build-types/types/dataviews.d.ts +23 -2
  473. package/build-types/types/dataviews.d.ts.map +1 -1
  474. package/build-wp/index.js +2101 -1673
  475. package/package.json +15 -15
  476. package/src/components/dataform/index.tsx +3 -1
  477. package/src/components/dataviews-filters/filter.tsx +16 -1
  478. package/src/components/dataviews-item-actions/index.tsx +37 -14
  479. package/src/components/dataviews-view-config/index.tsx +8 -504
  480. package/src/components/dataviews-view-config/properties-section.tsx +201 -0
  481. package/src/components/dataviews-view-config/style.scss +2 -39
  482. package/src/constants.ts +1 -0
  483. package/src/dataform-controls/datetime.tsx +3 -10
  484. package/src/dataform-layouts/card/index.tsx +45 -21
  485. package/src/dataform-layouts/data-form-layout.tsx +12 -23
  486. package/src/dataform-layouts/details/index.tsx +71 -0
  487. package/src/dataform-layouts/details/style.scss +5 -0
  488. package/src/dataform-layouts/index.tsx +10 -3
  489. package/src/dataform-layouts/{normalize-form-fields.ts → normalize-form.ts} +45 -23
  490. package/src/dataform-layouts/panel/dropdown.tsx +10 -13
  491. package/src/dataform-layouts/panel/index.tsx +9 -24
  492. package/src/dataform-layouts/panel/modal.tsx +15 -15
  493. package/src/dataform-layouts/regular/index.tsx +7 -12
  494. package/src/dataform-layouts/row/index.tsx +13 -26
  495. package/src/dataviews-layouts/index.ts +10 -0
  496. package/src/dataviews-layouts/list/index.tsx +2 -5
  497. package/src/dataviews-layouts/picker-table/index.tsx +487 -0
  498. package/src/dataviews-layouts/picker-table/style.scss +45 -0
  499. package/src/dataviews-layouts/table/column-header-menu.tsx +3 -2
  500. package/src/dataviews-layouts/table/column-primary.tsx +4 -7
  501. package/src/dataviews-layouts/table/index.tsx +54 -2
  502. package/src/dataviews-layouts/table/style.scss +6 -1
  503. package/src/field-types/datetime.tsx +16 -5
  504. package/src/field-types/utils/parse-date-time.ts +17 -0
  505. package/src/hooks/use-form-validity.ts +572 -422
  506. package/src/stories/dataform.story.tsx +586 -454
  507. package/src/stories/dataviews-picker.story.tsx +166 -38
  508. package/src/stories/dataviews.fixtures.tsx +4 -1
  509. package/src/stories/dataviews.story.tsx +10 -2
  510. package/src/stories/field-types.story.tsx +7 -7
  511. package/src/style.scss +2 -0
  512. package/src/test/normalize-form.ts +568 -0
  513. package/src/test/use-form-validity.ts +318 -33
  514. package/src/types/dataform.ts +30 -11
  515. package/src/types/dataviews.ts +36 -2
  516. package/tsconfig.tsbuildinfo +1 -1
  517. package/build/dataform-layouts/is-combined-field.js.map +0 -7
  518. package/build/dataform-layouts/normalize-form-fields.js.map +0 -7
  519. package/build-module/dataform-layouts/is-combined-field.js +0 -7
  520. package/build-module/dataform-layouts/is-combined-field.js.map +0 -7
  521. package/build-module/dataform-layouts/normalize-form-fields.js.map +0 -7
  522. package/build-types/dataform-layouts/is-combined-field.d.ts +0 -6
  523. package/build-types/dataform-layouts/is-combined-field.d.ts.map +0 -1
  524. package/build-types/dataform-layouts/normalize-form-fields.d.ts +0 -19
  525. package/build-types/dataform-layouts/normalize-form-fields.d.ts.map +0 -1
  526. package/build-types/test/normalize-form-fields.d.ts +0 -2
  527. package/build-types/test/normalize-form-fields.d.ts.map +0 -1
  528. package/src/dataform-layouts/is-combined-field.ts +0 -10
  529. package/src/test/normalize-form-fields.ts +0 -324
@@ -1,10 +1,12 @@
1
+ // packages/dataviews/src/hooks/use-form-validity.ts
1
2
  import deepMerge from "deepmerge";
3
+ import fastDeepEqual from "fast-deep-equal/es6";
2
4
  import { useCallback, useEffect, useRef, useState } from "@wordpress/element";
3
5
  import { __ } from "@wordpress/i18n";
4
6
  import normalizeFields from "../utils/normalize-fields";
5
- import normalizeFormFields from "../dataform-layouts/normalize-form-fields";
6
- const isEmptyNullOrUndefined = (value) => [void 0, "", null].includes(value);
7
- const isArrayOrElementsEmptyNullOrUndefined = (value) => {
7
+ import normalizeForm from "../dataform-layouts/normalize-form";
8
+ var isEmptyNullOrUndefined = (value) => [void 0, "", null].includes(value);
9
+ var isArrayOrElementsEmptyNullOrUndefined = (value) => {
8
10
  return !Array.isArray(value) || value.length === 0 || value.every((element) => isEmptyNullOrUndefined(element));
9
11
  };
10
12
  function isInvalidForRequired(fieldType, value) {
@@ -28,352 +30,453 @@ function isFormValid(formValidity) {
28
30
  );
29
31
  });
30
32
  }
31
- function updateFieldValidity(setFormValidity, parentFieldId, fieldId, newValidity) {
32
- if (parentFieldId) {
33
- setFormValidity((prev) => ({
34
- ...prev,
35
- [parentFieldId]: {
36
- ...prev?.[parentFieldId],
37
- children: {
38
- ...prev?.[parentFieldId]?.children,
39
- [fieldId]: {
40
- ...newValidity
41
- }
42
- }
33
+ function getFormFieldsToValidate(form, fields) {
34
+ const normalizedForm = normalizeForm(form);
35
+ if (normalizedForm.fields.length === 0) {
36
+ return [];
37
+ }
38
+ const fieldsMap = /* @__PURE__ */ new Map();
39
+ fields.forEach((field) => {
40
+ fieldsMap.set(field.id, field);
41
+ });
42
+ function processFormField(formField) {
43
+ if ("children" in formField && Array.isArray(formField.children)) {
44
+ const processedChildren = formField.children.map(processFormField).filter((child) => child !== null);
45
+ if (processedChildren.length === 0) {
46
+ return null;
43
47
  }
44
- }));
45
- } else {
46
- setFormValidity((prev) => ({
47
- ...prev,
48
- [fieldId]: {
49
- ...newValidity
48
+ const fieldDef2 = fieldsMap.get(formField.id);
49
+ if (fieldDef2) {
50
+ const [normalizedField2] = normalizeFields([
51
+ fieldDef2
52
+ ]);
53
+ return {
54
+ id: formField.id,
55
+ children: processedChildren,
56
+ field: normalizedField2
57
+ };
50
58
  }
51
- }));
59
+ return {
60
+ id: formField.id,
61
+ children: processedChildren
62
+ };
63
+ }
64
+ const fieldDef = fieldsMap.get(formField.id);
65
+ if (!fieldDef) {
66
+ return null;
67
+ }
68
+ const [normalizedField] = normalizeFields([fieldDef]);
69
+ return {
70
+ id: formField.id,
71
+ children: [],
72
+ field: normalizedField
73
+ };
52
74
  }
75
+ const toValidate = normalizedForm.fields.map(processFormField).filter((field) => field !== null);
76
+ return toValidate;
53
77
  }
54
- function getFieldsToValidate(fields, form) {
55
- const formFields = normalizeFormFields(form);
56
- if (formFields.length === 0) {
57
- return { fields: [], fieldToParent: /* @__PURE__ */ new Map() };
78
+ function setValidityAtPath(formValidity, fieldValidity, path) {
79
+ if (!formValidity) {
80
+ formValidity = {};
58
81
  }
59
- const fieldToParent = /* @__PURE__ */ new Map();
60
- const fieldIdsToValidate = [];
61
- formFields.forEach((formField) => {
62
- if (!!formField.children) {
63
- formField.children.forEach((child) => {
64
- const childId = typeof child === "string" ? child : child.id;
65
- fieldIdsToValidate.push(childId);
66
- fieldToParent.set(childId, formField.id);
67
- });
68
- } else {
69
- fieldIdsToValidate.push(formField.id);
82
+ if (path.length === 0) {
83
+ return formValidity;
84
+ }
85
+ const result = { ...formValidity };
86
+ let current = result;
87
+ for (let i = 0; i < path.length - 1; i++) {
88
+ const segment = path[i];
89
+ if (!current[segment]) {
90
+ current[segment] = {};
70
91
  }
71
- });
72
- return {
73
- fields: normalizeFields(
74
- fields.filter(
75
- (field) => fieldIdsToValidate.includes(field.id)
76
- )
77
- ),
78
- fieldToParent
92
+ current = current[segment];
93
+ }
94
+ const finalKey = path[path.length - 1];
95
+ current[finalKey] = {
96
+ ...current[finalKey] || {},
97
+ ...fieldValidity
79
98
  };
99
+ return result;
80
100
  }
81
- function useFormValidity(item, fields, form) {
82
- const [formValidity, setFormValidity] = useState();
83
- const previousValidatedValuesRef = useRef({});
84
- const customValidationCounterRef = useRef({});
85
- const elementsValidationCounterRef = useRef(
86
- {}
87
- );
88
- const validate = useCallback(() => {
89
- const { fields: fieldsToValidate, fieldToParent } = getFieldsToValidate(
90
- fields,
91
- form
92
- );
93
- if (fieldsToValidate.length === 0) {
94
- setFormValidity(void 0);
101
+ function handleElementsValidationAsync(promise, formField, promiseHandler) {
102
+ const { elementsCounterRef, setFormValidity, path, item } = promiseHandler;
103
+ const currentToken = (elementsCounterRef.current[formField.id] || 0) + 1;
104
+ elementsCounterRef.current[formField.id] = currentToken;
105
+ promise.then((result) => {
106
+ if (currentToken !== elementsCounterRef.current[formField.id]) {
95
107
  return;
96
108
  }
97
- fieldsToValidate.forEach((field) => {
98
- const value = field.getValue({ item });
99
- if (previousValidatedValuesRef.current.hasOwnProperty(field.id) && value === previousValidatedValuesRef.current[field.id]) {
100
- return;
101
- }
102
- previousValidatedValuesRef.current[field.id] = value;
103
- const parentFieldId = fieldToParent.get(field.id);
104
- if (field.isValid.required && isInvalidForRequired(field.type, value)) {
105
- updateFieldValidity(setFormValidity, parentFieldId, field.id, {
106
- required: { type: "invalid" }
107
- });
108
- return;
109
- }
110
- if (field.isValid.elements && field.hasElements && !field.getElements && Array.isArray(field.elements)) {
111
- const validValues = field.elements.map((el) => el.value);
112
- if (field.type !== "array" && !validValues.includes(value)) {
113
- updateFieldValidity(
114
- setFormValidity,
115
- parentFieldId,
116
- field.id,
117
- {
118
- elements: {
119
- type: "invalid",
120
- message: "Value must be one of the elements."
121
- }
109
+ if (!Array.isArray(result)) {
110
+ setFormValidity((prev) => {
111
+ const newFormValidity = setValidityAtPath(
112
+ prev,
113
+ {
114
+ elements: {
115
+ type: "invalid",
116
+ message: __("Could not validate elements.")
122
117
  }
123
- );
124
- return;
125
- }
126
- if (field.type === "array" && !Array.isArray(value)) {
127
- updateFieldValidity(
128
- setFormValidity,
129
- parentFieldId,
130
- field.id,
131
- {
132
- elements: {
133
- type: "invalid",
134
- message: "Value must be an array."
135
- }
118
+ },
119
+ [...path, formField.id]
120
+ );
121
+ return newFormValidity;
122
+ });
123
+ return;
124
+ }
125
+ const validValues = result.map((el) => el.value);
126
+ if (!!formField.field && formField.field.type !== "array" && !validValues.includes(formField.field.getValue({ item }))) {
127
+ setFormValidity((prev) => {
128
+ const newFormValidity = setValidityAtPath(
129
+ prev,
130
+ {
131
+ elements: {
132
+ type: "invalid",
133
+ message: __(
134
+ "Value must be one of the elements."
135
+ )
136
136
  }
137
- );
138
- return;
139
- }
140
- if (field.type === "array" && value.some((v) => !validValues.includes(v))) {
141
- updateFieldValidity(
142
- setFormValidity,
143
- parentFieldId,
144
- field.id,
145
- {
146
- elements: {
147
- type: "invalid",
148
- message: "Value must be one of the elements."
149
- }
137
+ },
138
+ [...path, formField.id]
139
+ );
140
+ return newFormValidity;
141
+ });
142
+ return;
143
+ }
144
+ if (!!formField.field && formField.field.type === "array" && !Array.isArray(formField.field.getValue({ item }))) {
145
+ setFormValidity((prev) => {
146
+ const newFormValidity = setValidityAtPath(
147
+ prev,
148
+ {
149
+ elements: {
150
+ type: "invalid",
151
+ message: __("Value must be an array.")
150
152
  }
151
- );
152
- return;
153
- }
154
- }
155
- if (field.isValid.elements && field.hasElements && typeof field.getElements === "function") {
156
- const currentToken = (elementsValidationCounterRef.current[field.id] || 0) + 1;
157
- elementsValidationCounterRef.current[field.id] = currentToken;
158
- updateFieldValidity(setFormValidity, parentFieldId, field.id, {
159
- elements: {
160
- type: "validating",
161
- message: "Validating..."
162
- }
163
- });
164
- field.getElements().then((result) => {
165
- if (elementsValidationCounterRef.current[field.id] !== currentToken) {
166
- return;
167
- }
168
- if (!Array.isArray(result)) {
169
- updateFieldValidity(
170
- setFormValidity,
171
- parentFieldId,
172
- field.id,
173
- {
174
- elements: {
175
- type: "invalid",
176
- message: "Could not validate elements."
177
- }
178
- }
179
- );
180
- return;
181
- }
182
- const validValues = result.map((el) => el.value);
183
- if (field.type !== "array" && !validValues.includes(value)) {
184
- updateFieldValidity(
185
- setFormValidity,
186
- parentFieldId,
187
- field.id,
188
- {
189
- elements: {
190
- type: "invalid",
191
- message: "Value must be one of the elements."
192
- }
193
- }
194
- );
195
- return;
196
- }
197
- if (field.type === "array" && !Array.isArray(value)) {
198
- updateFieldValidity(
199
- setFormValidity,
200
- parentFieldId,
201
- field.id,
202
- {
203
- elements: {
204
- type: "invalid",
205
- message: "Value must be an array."
206
- }
207
- }
208
- );
209
- return;
210
- }
211
- if (field.type === "array" && value.some(
212
- (v) => !validValues.includes(v)
213
- )) {
214
- updateFieldValidity(
215
- setFormValidity,
216
- parentFieldId,
217
- field.id,
218
- {
219
- elements: {
220
- type: "invalid",
221
- message: "Value must be one of the elements."
222
- }
223
- }
224
- );
225
- }
226
- }).catch((error) => {
227
- if (elementsValidationCounterRef.current[field.id] !== currentToken) {
228
- return;
229
- }
230
- updateFieldValidity(
231
- setFormValidity,
232
- parentFieldId,
233
- field.id,
234
- {
235
- elements: {
236
- type: "invalid",
237
- message: error.message
238
- }
153
+ },
154
+ [...path, formField.id]
155
+ );
156
+ return newFormValidity;
157
+ });
158
+ return;
159
+ }
160
+ if (!!formField.field && formField.field.type === "array" && formField.field.getValue({ item }).some((v) => !validValues.includes(v))) {
161
+ setFormValidity((prev) => {
162
+ const newFormValidity = setValidityAtPath(
163
+ prev,
164
+ {
165
+ elements: {
166
+ type: "invalid",
167
+ message: __(
168
+ "Value must be one of the elements."
169
+ )
239
170
  }
240
- );
241
- });
242
- }
243
- let customError;
244
- try {
245
- customError = field.isValid?.custom?.(
246
- deepMerge(
247
- item,
248
- field.setValue({
249
- item,
250
- value
251
- })
252
- ),
253
- field
171
+ },
172
+ [...path, formField.id]
254
173
  );
255
- } catch (error) {
256
- let errorMessage;
257
- if (error instanceof Error) {
258
- errorMessage = error.message;
259
- } else {
260
- errorMessage = String(error) || __("Unknown error when running custom validation.");
261
- }
262
- updateFieldValidity(setFormValidity, parentFieldId, field.id, {
263
- custom: {
174
+ return newFormValidity;
175
+ });
176
+ }
177
+ }).catch((error) => {
178
+ if (currentToken !== elementsCounterRef.current[formField.id]) {
179
+ return;
180
+ }
181
+ let errorMessage;
182
+ if (error instanceof Error) {
183
+ errorMessage = error.message;
184
+ } else {
185
+ errorMessage = String(error) || __(
186
+ "Unknown error when running elements validation asynchronously."
187
+ );
188
+ }
189
+ setFormValidity((prev) => {
190
+ const newFormValidity = setValidityAtPath(
191
+ prev,
192
+ {
193
+ elements: {
264
194
  type: "invalid",
265
195
  message: errorMessage
266
196
  }
267
- });
268
- }
269
- if (typeof customError === "string") {
270
- updateFieldValidity(setFormValidity, parentFieldId, field.id, {
197
+ },
198
+ [...path, formField.id]
199
+ );
200
+ return newFormValidity;
201
+ });
202
+ });
203
+ }
204
+ function handleCustomValidationAsync(promise, formField, promiseHandler) {
205
+ const { customCounterRef, setFormValidity, path } = promiseHandler;
206
+ const currentToken = (customCounterRef.current[formField.id] || 0) + 1;
207
+ customCounterRef.current[formField.id] = currentToken;
208
+ promise.then((result) => {
209
+ if (currentToken !== customCounterRef.current[formField.id]) {
210
+ return;
211
+ }
212
+ if (result === null) {
213
+ setFormValidity((prev) => {
214
+ const newFormValidity = setValidityAtPath(
215
+ prev,
216
+ {
217
+ custom: {
218
+ type: "valid",
219
+ message: __("Valid")
220
+ }
221
+ },
222
+ [...path, formField.id]
223
+ );
224
+ return newFormValidity;
225
+ });
226
+ return;
227
+ }
228
+ if (typeof result === "string") {
229
+ setFormValidity((prev) => {
230
+ const newFormValidity = setValidityAtPath(
231
+ prev,
232
+ {
233
+ custom: {
234
+ type: "invalid",
235
+ message: result
236
+ }
237
+ },
238
+ [...path, formField.id]
239
+ );
240
+ return newFormValidity;
241
+ });
242
+ return;
243
+ }
244
+ setFormValidity((prev) => {
245
+ const newFormValidity = setValidityAtPath(
246
+ prev,
247
+ {
271
248
  custom: {
272
249
  type: "invalid",
273
- message: customError
250
+ message: __("Validation could not be processed.")
274
251
  }
275
- });
276
- return;
277
- }
278
- if (customError instanceof Promise) {
279
- const currentToken = (customValidationCounterRef.current[field.id] || 0) + 1;
280
- customValidationCounterRef.current[field.id] = currentToken;
281
- updateFieldValidity(setFormValidity, parentFieldId, field.id, {
252
+ },
253
+ [...path, formField.id]
254
+ );
255
+ return newFormValidity;
256
+ });
257
+ }).catch((error) => {
258
+ if (currentToken !== customCounterRef.current[formField.id]) {
259
+ return;
260
+ }
261
+ let errorMessage;
262
+ if (error instanceof Error) {
263
+ errorMessage = error.message;
264
+ } else {
265
+ errorMessage = String(error) || __(
266
+ "Unknown error when running custom validation asynchronously."
267
+ );
268
+ }
269
+ setFormValidity((prev) => {
270
+ const newFormValidity = setValidityAtPath(
271
+ prev,
272
+ {
282
273
  custom: {
283
- type: "validating",
284
- message: "Validating..."
285
- }
286
- });
287
- customError.then((result) => {
288
- if (customValidationCounterRef.current[field.id] !== currentToken) {
289
- return;
290
- }
291
- if (result === null) {
292
- updateFieldValidity(
293
- setFormValidity,
294
- parentFieldId,
295
- field.id,
296
- {
297
- custom: {
298
- type: "valid",
299
- message: "Valid"
300
- }
301
- }
302
- );
303
- return;
304
- }
305
- if (typeof result === "string") {
306
- updateFieldValidity(
307
- setFormValidity,
308
- parentFieldId,
309
- field.id,
310
- {
311
- custom: {
312
- type: "invalid",
313
- message: result
314
- }
315
- }
316
- );
317
- }
318
- }).catch((error) => {
319
- if (customValidationCounterRef.current[field.id] !== currentToken) {
320
- return;
274
+ type: "invalid",
275
+ message: errorMessage
321
276
  }
322
- updateFieldValidity(
323
- setFormValidity,
324
- parentFieldId,
325
- field.id,
326
- {
327
- custom: {
328
- type: "invalid",
329
- message: error.message
330
- }
331
- }
332
- );
333
- });
334
- return;
335
- }
336
- setFormValidity((prev) => {
337
- if (!prev) {
338
- return prev;
277
+ },
278
+ [...path, formField.id]
279
+ );
280
+ return newFormValidity;
281
+ });
282
+ });
283
+ }
284
+ function validateFormField(item, formField, promiseHandler) {
285
+ if (!!formField.field && formField.field.isValid.required && isInvalidForRequired(
286
+ formField.field.type,
287
+ formField.field.getValue({ item })
288
+ )) {
289
+ return {
290
+ required: { type: "invalid" }
291
+ };
292
+ }
293
+ if (!!formField.field && formField.field.isValid.elements && formField.field.hasElements && !formField.field.getElements && Array.isArray(formField.field.elements)) {
294
+ const value = formField.field.getValue({ item });
295
+ const validValues = formField.field.elements.map((el) => el.value);
296
+ if (formField.field.type !== "array" && !validValues.includes(value)) {
297
+ return {
298
+ elements: {
299
+ type: "invalid",
300
+ message: __("Value must be one of the elements.")
339
301
  }
340
- if (parentFieldId) {
341
- const parentField = prev[parentFieldId];
342
- if (!parentField?.children) {
343
- return prev;
344
- }
345
- const { [field.id]: removed2, ...restChildren } = parentField.children;
346
- if (Object.keys(restChildren).length === 0) {
347
- const { children, ...restParent } = parentField;
348
- if (Object.keys(restParent).length === 0) {
349
- const {
350
- [parentFieldId]: removedParent,
351
- ...restFields
352
- } = prev;
353
- return Object.keys(restFields).length === 0 ? void 0 : restFields;
354
- }
355
- return {
356
- ...prev,
357
- [parentFieldId]: restParent
358
- };
359
- }
360
- return {
361
- ...prev,
362
- [parentFieldId]: {
363
- ...parentField,
364
- children: restChildren
365
- }
366
- };
302
+ };
303
+ }
304
+ if (formField.field.type === "array" && !Array.isArray(value)) {
305
+ return {
306
+ elements: {
307
+ type: "invalid",
308
+ message: __("Value must be an array.")
367
309
  }
368
- if (!prev[field.id]) {
369
- return prev;
310
+ };
311
+ }
312
+ if (formField.field.type === "array" && value.some((v) => !validValues.includes(v))) {
313
+ return {
314
+ elements: {
315
+ type: "invalid",
316
+ message: __("Value must be one of the elements.")
370
317
  }
371
- const { [field.id]: removed, ...rest } = prev;
372
- if (Object.keys(rest).length === 0) {
373
- return void 0;
318
+ };
319
+ }
320
+ }
321
+ if (!!formField.field && formField.field.isValid.elements && formField.field.hasElements && typeof formField.field.getElements === "function") {
322
+ handleElementsValidationAsync(
323
+ formField.field.getElements(),
324
+ formField,
325
+ promiseHandler
326
+ );
327
+ return {
328
+ elements: {
329
+ type: "validating",
330
+ message: __("Validating\u2026")
331
+ }
332
+ };
333
+ }
334
+ let customError;
335
+ if (!!formField.field) {
336
+ try {
337
+ const value = formField.field.getValue({ item });
338
+ customError = formField.field.isValid?.custom?.(
339
+ deepMerge(
340
+ item,
341
+ formField.field.setValue({
342
+ item,
343
+ value
344
+ })
345
+ ),
346
+ formField.field
347
+ );
348
+ } catch (error) {
349
+ let errorMessage;
350
+ if (error instanceof Error) {
351
+ errorMessage = error.message;
352
+ } else {
353
+ errorMessage = String(error) || __("Unknown error when running custom validation.");
354
+ }
355
+ return {
356
+ custom: {
357
+ type: "invalid",
358
+ message: errorMessage
359
+ }
360
+ };
361
+ }
362
+ }
363
+ if (typeof customError === "string") {
364
+ return {
365
+ custom: {
366
+ type: "invalid",
367
+ message: customError
368
+ }
369
+ };
370
+ }
371
+ if (customError instanceof Promise) {
372
+ handleCustomValidationAsync(customError, formField, promiseHandler);
373
+ return {
374
+ custom: {
375
+ type: "validating",
376
+ message: __("Validating\u2026")
377
+ }
378
+ };
379
+ }
380
+ if (formField.children.length > 0) {
381
+ const result = {};
382
+ formField.children.forEach((child) => {
383
+ result[child.id] = validateFormField(item, child, {
384
+ ...promiseHandler,
385
+ path: [...promiseHandler.path, formField.id, "children"]
386
+ });
387
+ });
388
+ const filteredResult = {};
389
+ Object.entries(result).forEach(([key, value]) => {
390
+ if (value !== void 0) {
391
+ filteredResult[key] = value;
392
+ }
393
+ });
394
+ if (Object.keys(filteredResult).length === 0) {
395
+ return void 0;
396
+ }
397
+ return {
398
+ children: filteredResult
399
+ };
400
+ }
401
+ return void 0;
402
+ }
403
+ function getFormFieldValue(formField, item) {
404
+ const fieldValue = formField?.field?.getValue({ item });
405
+ if (formField.children.length === 0) {
406
+ return fieldValue;
407
+ }
408
+ const childrenValues = formField.children.map(
409
+ (child) => getFormFieldValue(child, item)
410
+ );
411
+ if (!childrenValues) {
412
+ return fieldValue;
413
+ }
414
+ return {
415
+ value: fieldValue,
416
+ children: childrenValues
417
+ };
418
+ }
419
+ function useFormValidity(item, fields, form) {
420
+ const [formValidity, setFormValidity] = useState();
421
+ const customCounterRef = useRef({});
422
+ const elementsCounterRef = useRef({});
423
+ const previousValuesRef = useRef({});
424
+ const validate = useCallback(() => {
425
+ const promiseHandler = {
426
+ customCounterRef,
427
+ elementsCounterRef,
428
+ setFormValidity,
429
+ path: [],
430
+ item
431
+ };
432
+ const formFieldsToValidate = getFormFieldsToValidate(form, fields);
433
+ if (formFieldsToValidate.length === 0) {
434
+ setFormValidity(void 0);
435
+ return;
436
+ }
437
+ const newFormValidity = {};
438
+ const untouchedFields = [];
439
+ formFieldsToValidate.forEach((formField) => {
440
+ const value = getFormFieldValue(formField, item);
441
+ if (previousValuesRef.current.hasOwnProperty(formField.id) && fastDeepEqual(
442
+ previousValuesRef.current[formField.id],
443
+ value
444
+ )) {
445
+ untouchedFields.push(formField.id);
446
+ return;
447
+ }
448
+ previousValuesRef.current[formField.id] = value;
449
+ const fieldValidity = validateFormField(
450
+ item,
451
+ formField,
452
+ promiseHandler
453
+ );
454
+ if (fieldValidity !== void 0) {
455
+ newFormValidity[formField.id] = fieldValidity;
456
+ }
457
+ });
458
+ setFormValidity((existingFormValidity) => {
459
+ let validity = {
460
+ ...existingFormValidity,
461
+ ...newFormValidity
462
+ };
463
+ const fieldsToKeep = [
464
+ ...untouchedFields,
465
+ ...Object.keys(newFormValidity)
466
+ ];
467
+ Object.keys(validity).forEach((key) => {
468
+ if (validity && !fieldsToKeep.includes(key)) {
469
+ delete validity[key];
374
470
  }
375
- return rest;
376
471
  });
472
+ if (Object.keys(validity).length === 0) {
473
+ validity = void 0;
474
+ }
475
+ const areEqual = fastDeepEqual(existingFormValidity, validity);
476
+ if (areEqual) {
477
+ return existingFormValidity;
478
+ }
479
+ return validity;
377
480
  });
378
481
  }, [item, fields, form]);
379
482
  useEffect(() => {