@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
@@ -268,6 +268,19 @@ const fields: Field< SamplePost >[] = [
268
268
  label: 'Seat',
269
269
  type: 'text',
270
270
  },
271
+ {
272
+ id: 'metadata_summary',
273
+ label: 'Metadata',
274
+ type: 'text',
275
+ render: ( { item } ) => {
276
+ return (
277
+ <span>
278
+ <>Metadata</>
279
+ { item.filesize ? `, ${ item.filesize } KB` : '' }
280
+ </span>
281
+ );
282
+ },
283
+ },
271
284
  ];
272
285
 
273
286
  const LayoutRegularComponent = ( {
@@ -539,13 +552,11 @@ function CustomEditControl< Item >( {
539
552
  const ValidationComponent = ( {
540
553
  required,
541
554
  elements,
542
- type,
543
555
  custom,
544
556
  }: {
545
557
  required: boolean;
546
558
  elements: 'sync' | 'async' | 'none';
547
559
  custom: 'sync' | 'async' | 'none';
548
- type: 'regular' | 'panel';
549
560
  } ) => {
550
561
  type ValidatedItem = {
551
562
  text: string;
@@ -570,10 +581,6 @@ const ValidationComponent = ( {
570
581
  datetime?: string;
571
582
  };
572
583
 
573
- const DateRangeEdit = ( props: DataFormControlProps< ValidatedItem > ) => {
574
- return <DateControl { ...props } operator="between" />;
575
- };
576
-
577
584
  const [ post, setPost ] = useState< ValidatedItem >( {
578
585
  text: 'Can have letters and spaces',
579
586
  select: undefined,
@@ -597,184 +604,6 @@ const ValidationComponent = ( {
597
604
  datetime: undefined,
598
605
  } );
599
606
 
600
- const makeAsync = ( rule: ( item: ValidatedItem ) => null | string ) => {
601
- return async ( value: ValidatedItem ) => {
602
- return await new Promise< string | null >( ( resolve ) => {
603
- setTimeout( () => {
604
- const validationResult = rule( value );
605
- resolve( validationResult );
606
- }, 2000 );
607
- } );
608
- };
609
- };
610
-
611
- const customTextRule = ( value: ValidatedItem ) => {
612
- if ( ! /^[a-zA-Z ]+$/.test( value.text ) ) {
613
- return 'Value must only contain letters and spaces.';
614
- }
615
-
616
- return null;
617
- };
618
-
619
- const customSelectRule = ( value: ValidatedItem ) => {
620
- if ( value.select !== 'option1' ) {
621
- return 'Value must be Option 1.';
622
- }
623
- return null;
624
- };
625
-
626
- const customTextRadioRule = ( value: ValidatedItem ) => {
627
- if ( value.textWithRadio !== 'item1' ) {
628
- return 'Value must be Item 1.';
629
- }
630
-
631
- return null;
632
- };
633
-
634
- const customTextareaRule = ( value: ValidatedItem ) => {
635
- if ( ! /^[a-zA-Z ]+$/.test( value.textarea ) ) {
636
- return 'Value must only contain letters and spaces.';
637
- }
638
-
639
- return null;
640
- };
641
- const customEmailRule = ( value: ValidatedItem ) => {
642
- if ( ! /^[a-zA-Z0-9._%+-]+@example\.com$/.test( value.email ) ) {
643
- return 'Email address must be from @example.com domain.';
644
- }
645
-
646
- return null;
647
- };
648
- const customTelephoneRule = ( value: ValidatedItem ) => {
649
- if ( ! /^\+30\d{10}$/.test( value.telephone ) ) {
650
- return 'Telephone number must start with +30 and have 10 digits after.';
651
- }
652
-
653
- return null;
654
- };
655
- const customUrlRule = ( value: ValidatedItem ) => {
656
- if ( ! /^https:\/\/example\.com$/.test( value.url ) ) {
657
- return 'URL must be from https://example.com domain.';
658
- }
659
-
660
- return null;
661
- };
662
- const customColorRule = ( value: ValidatedItem ) => {
663
- if ( ! /^#[0-9A-Fa-f]{6}$/.test( value.color ) ) {
664
- return 'Color must be a valid hex format (e.g., #ff6600).';
665
- }
666
-
667
- return null;
668
- };
669
- const customIntegerRule = ( value: ValidatedItem ) => {
670
- if ( value.integer % 2 !== 0 ) {
671
- return 'Integer must be an even number.';
672
- }
673
-
674
- return null;
675
- };
676
- const customNumberRule = ( value: ValidatedItem ) => {
677
- if ( ! /^\d+\.\d{2}$/.test( value?.number?.toString() ) ) {
678
- return 'Number must have exactly two decimal places.';
679
- }
680
-
681
- return null;
682
- };
683
- const customBooleanRule = ( value: ValidatedItem ) => {
684
- if ( value.boolean !== true ) {
685
- return 'Boolean must be active.';
686
- }
687
-
688
- return null;
689
- };
690
- const customToggleRule = ( value: ValidatedItem ) => {
691
- if ( value.toggle !== true ) {
692
- return 'Toggle must be checked.';
693
- }
694
-
695
- return null;
696
- };
697
- const customToggleGroupRule = ( value: ValidatedItem ) => {
698
- if ( value.toggleGroup !== 'option1' ) {
699
- return 'Value must be Option 1.';
700
- }
701
-
702
- return null;
703
- };
704
-
705
- const customPasswordRule = ( value: ValidatedItem ) => {
706
- if ( value.password.length < 8 ) {
707
- return 'Password must be at least 8 characters long.';
708
- }
709
- if ( ! /[A-Z]/.test( value.password ) ) {
710
- return 'Password must contain at least one uppercase letter.';
711
- }
712
- if ( ! /[0-9]/.test( value.password ) ) {
713
- return 'Password must contain at least one number.';
714
- }
715
-
716
- return null;
717
- };
718
-
719
- const customDateRule = ( value: ValidatedItem ) => {
720
- if ( ! value.date ) {
721
- return null;
722
- }
723
- const selectedDate = new Date( value.date );
724
- const today = new Date();
725
- today.setHours( 0, 0, 0, 0 );
726
- if ( selectedDate < today ) {
727
- return 'Date must not be in the past.';
728
- }
729
-
730
- return null;
731
- };
732
- const customDateTimeRule = ( value: ValidatedItem ) => {
733
- if ( ! value.datetime ) {
734
- return null;
735
- }
736
- const selectedDateTime = new Date( value.datetime );
737
- const now = new Date();
738
- if ( selectedDateTime < now ) {
739
- return 'Date and time must not be in the past.';
740
- }
741
-
742
- return null;
743
- };
744
-
745
- const customDateRangeRule = ( value: ValidatedItem ) => {
746
- if ( ! value.dateRange ) {
747
- return null;
748
- }
749
- const [ fromDate, toDate ] = value.dateRange;
750
- if ( ! fromDate || ! toDate ) {
751
- return null;
752
- }
753
- const from = new Date( fromDate );
754
- const to = new Date( toDate );
755
- const daysDiff = Math.ceil(
756
- ( to.getTime() - from.getTime() ) / ( 1000 * 60 * 60 * 24 )
757
- );
758
- if ( daysDiff > 30 ) {
759
- return 'Date range must not exceed 30 days.';
760
- }
761
- return null;
762
- };
763
-
764
- const maybeCustomRule = (
765
- rule: ( item: ValidatedItem ) => null | string
766
- ) => {
767
- if ( custom === 'sync' ) {
768
- return rule;
769
- }
770
-
771
- if ( custom === 'async' ) {
772
- return makeAsync( rule );
773
- }
774
-
775
- return undefined;
776
- };
777
-
778
607
  // Cache for getElements functions - ensures promises are only created once
779
608
  const getElements = useMemo( () => {
780
609
  const promiseCache: Record< string, Promise< any > > = {};
@@ -810,8 +639,14 @@ const ValidationComponent = ( {
810
639
  setTimeout(
811
640
  () =>
812
641
  resolve( [
813
- { value: 'item1', label: 'Item 1' },
814
- { value: 'item2', label: 'Item 2' },
642
+ {
643
+ value: 'item1',
644
+ label: 'Item 1',
645
+ },
646
+ {
647
+ value: 'item2',
648
+ label: 'Item 2',
649
+ },
815
650
  ] ),
816
651
  3500
817
652
  )
@@ -827,15 +662,27 @@ const ValidationComponent = ( {
827
662
  value: 'us',
828
663
  label: 'United States',
829
664
  },
830
- { value: 'ca', label: 'Canada' },
665
+ {
666
+ value: 'ca',
667
+ label: 'Canada',
668
+ },
831
669
  {
832
670
  value: 'uk',
833
671
  label: 'United Kingdom',
834
672
  },
835
- { value: 'fr', label: 'France' },
836
- { value: 'de', label: 'Germany' },
673
+ {
674
+ value: 'fr',
675
+ label: 'France',
676
+ },
677
+ {
678
+ value: 'de',
679
+ label: 'Germany',
680
+ },
837
681
  { value: 'jp', label: 'Japan' },
838
- { value: 'au', label: 'Australia' },
682
+ {
683
+ value: 'au',
684
+ label: 'Australia',
685
+ },
839
686
  ] ),
840
687
  3500
841
688
  )
@@ -872,279 +719,503 @@ const ValidationComponent = ( {
872
719
  return promiseCache[ fieldId ];
873
720
  };
874
721
  };
875
- }, [ elements ] );
722
+ }, [] );
876
723
 
877
- const _fields: Field< ValidatedItem >[] = [
878
- {
879
- id: 'text',
880
- type: 'text',
881
- label: 'Text',
882
- isValid: {
883
- required,
884
- elements: elements !== 'none' ? true : false,
885
- custom: maybeCustomRule( customTextRule ),
886
- },
887
- },
888
- {
889
- id: 'select',
890
- type: 'text',
891
- label: 'Select',
892
- elements:
893
- elements === 'async'
894
- ? undefined
895
- : [
896
- { value: 'option1', label: 'Option 1' },
897
- { value: 'option2', label: 'Option 2' },
898
- ],
899
- getElements:
900
- elements === 'async' ? getElements( 'select' ) : undefined,
901
- isValid: {
902
- required,
903
- elements: elements !== 'none' ? true : false,
904
- custom: maybeCustomRule( customSelectRule ),
724
+ const _fields: Field< ValidatedItem >[] = useMemo( () => {
725
+ const DateRangeEdit = (
726
+ props: DataFormControlProps< ValidatedItem >
727
+ ) => {
728
+ return <DateControl { ...props } operator="between" />;
729
+ };
730
+ const makeAsync = (
731
+ rule: ( item: ValidatedItem ) => null | string
732
+ ) => {
733
+ return async ( value: ValidatedItem ) => {
734
+ return await new Promise< string | null >( ( resolve ) => {
735
+ setTimeout( () => {
736
+ const validationResult = rule( value );
737
+ resolve( validationResult );
738
+ }, 2000 );
739
+ } );
740
+ };
741
+ };
742
+
743
+ const customTextRule = ( value: ValidatedItem ) => {
744
+ if ( ! /^[a-zA-Z ]+$/.test( value.text ) ) {
745
+ return 'Value must only contain letters and spaces.';
746
+ }
747
+
748
+ return null;
749
+ };
750
+
751
+ const customSelectRule = ( value: ValidatedItem ) => {
752
+ if ( value.select !== 'option1' ) {
753
+ return 'Value must be Option 1.';
754
+ }
755
+ return null;
756
+ };
757
+
758
+ const customTextRadioRule = ( value: ValidatedItem ) => {
759
+ if ( value.textWithRadio !== 'item1' ) {
760
+ return 'Value must be Item 1.';
761
+ }
762
+
763
+ return null;
764
+ };
765
+
766
+ const customTextareaRule = ( value: ValidatedItem ) => {
767
+ if ( ! /^[a-zA-Z ]+$/.test( value.textarea ) ) {
768
+ return 'Value must only contain letters and spaces.';
769
+ }
770
+
771
+ return null;
772
+ };
773
+ const customEmailRule = ( value: ValidatedItem ) => {
774
+ if ( ! /^[a-zA-Z0-9._%+-]+@example\.com$/.test( value.email ) ) {
775
+ return 'Email address must be from @example.com domain.';
776
+ }
777
+
778
+ return null;
779
+ };
780
+ const customTelephoneRule = ( value: ValidatedItem ) => {
781
+ if ( ! /^\+30\d{10}$/.test( value.telephone ) ) {
782
+ return 'Telephone number must start with +30 and have 10 digits after.';
783
+ }
784
+
785
+ return null;
786
+ };
787
+ const customUrlRule = ( value: ValidatedItem ) => {
788
+ if ( ! /^https:\/\/example\.com$/.test( value.url ) ) {
789
+ return 'URL must be from https://example.com domain.';
790
+ }
791
+
792
+ return null;
793
+ };
794
+ const customColorRule = ( value: ValidatedItem ) => {
795
+ if ( ! /^#[0-9A-Fa-f]{6}$/.test( value.color ) ) {
796
+ return 'Color must be a valid hex format (e.g., #ff6600).';
797
+ }
798
+
799
+ return null;
800
+ };
801
+ const customIntegerRule = ( value: ValidatedItem ) => {
802
+ if ( value.integer % 2 !== 0 ) {
803
+ return 'Integer must be an even number.';
804
+ }
805
+
806
+ return null;
807
+ };
808
+ const customNumberRule = ( value: ValidatedItem ) => {
809
+ if ( ! /^\d+\.\d{2}$/.test( value?.number?.toString() ) ) {
810
+ return 'Number must have exactly two decimal places.';
811
+ }
812
+
813
+ return null;
814
+ };
815
+ const customBooleanRule = ( value: ValidatedItem ) => {
816
+ if ( value.boolean !== true ) {
817
+ return 'Boolean must be active.';
818
+ }
819
+
820
+ return null;
821
+ };
822
+ const customToggleRule = ( value: ValidatedItem ) => {
823
+ if ( value.toggle !== true ) {
824
+ return 'Toggle must be checked.';
825
+ }
826
+
827
+ return null;
828
+ };
829
+ const customToggleGroupRule = ( value: ValidatedItem ) => {
830
+ if ( value.toggleGroup !== 'option1' ) {
831
+ return 'Value must be Option 1.';
832
+ }
833
+
834
+ return null;
835
+ };
836
+
837
+ const customPasswordRule = ( value: ValidatedItem ) => {
838
+ if ( value.password.length < 8 ) {
839
+ return 'Password must be at least 8 characters long.';
840
+ }
841
+ if ( ! /[A-Z]/.test( value.password ) ) {
842
+ return 'Password must contain at least one uppercase letter.';
843
+ }
844
+ if ( ! /[0-9]/.test( value.password ) ) {
845
+ return 'Password must contain at least one number.';
846
+ }
847
+
848
+ return null;
849
+ };
850
+
851
+ const customDateRule = ( value: ValidatedItem ) => {
852
+ if ( ! value.date ) {
853
+ return null;
854
+ }
855
+ const selectedDate = new Date( value.date );
856
+ const today = new Date();
857
+ today.setHours( 0, 0, 0, 0 );
858
+ if ( selectedDate < today ) {
859
+ return 'Date must not be in the past.';
860
+ }
861
+
862
+ return null;
863
+ };
864
+ const customDateTimeRule = ( value: ValidatedItem ) => {
865
+ if ( ! value.datetime ) {
866
+ return null;
867
+ }
868
+ const selectedDateTime = new Date( value.datetime );
869
+ const now = new Date();
870
+ if ( selectedDateTime < now ) {
871
+ return 'Date and time must not be in the past.';
872
+ }
873
+
874
+ return null;
875
+ };
876
+
877
+ const customDateRangeRule = ( value: ValidatedItem ) => {
878
+ if ( ! value.dateRange ) {
879
+ return null;
880
+ }
881
+ const [ fromDate, toDate ] = value.dateRange;
882
+ if ( ! fromDate || ! toDate ) {
883
+ return null;
884
+ }
885
+ const from = new Date( fromDate );
886
+ const to = new Date( toDate );
887
+ const daysDiff = Math.ceil(
888
+ ( to.getTime() - from.getTime() ) / ( 1000 * 60 * 60 * 24 )
889
+ );
890
+ if ( daysDiff > 30 ) {
891
+ return 'Date range must not exceed 30 days.';
892
+ }
893
+ return null;
894
+ };
895
+
896
+ const maybeCustomRule = (
897
+ rule: ( item: ValidatedItem ) => null | string
898
+ ) => {
899
+ if ( custom === 'sync' ) {
900
+ return rule;
901
+ }
902
+
903
+ if ( custom === 'async' ) {
904
+ return makeAsync( rule );
905
+ }
906
+
907
+ return undefined;
908
+ };
909
+
910
+ return [
911
+ {
912
+ id: 'text',
913
+ type: 'text',
914
+ label: 'Text',
915
+ isValid: {
916
+ required,
917
+ elements: elements !== 'none' ? true : false,
918
+ custom: maybeCustomRule( customTextRule ),
919
+ },
905
920
  },
906
- },
907
- {
908
- id: 'textWithRadio',
909
- type: 'text',
910
- Edit: 'radio',
911
- label: 'Text with radio',
912
- elements:
913
- elements === 'async'
914
- ? undefined
915
- : [
916
- { value: 'item1', label: 'Item 1' },
917
- { value: 'item2', label: 'Item 2' },
918
- ],
919
- getElements:
920
- elements === 'async'
921
- ? getElements( 'textWithRadio' )
922
- : undefined,
923
- isValid: {
924
- required,
925
- elements: elements !== 'none' ? true : false,
926
- custom: maybeCustomRule( customTextRadioRule ),
921
+ {
922
+ id: 'select',
923
+ type: 'text',
924
+ label: 'Select',
925
+ elements:
926
+ elements === 'async'
927
+ ? undefined
928
+ : [
929
+ { value: 'option1', label: 'Option 1' },
930
+ { value: 'option2', label: 'Option 2' },
931
+ ],
932
+ getElements:
933
+ elements === 'async' ? getElements( 'select' ) : undefined,
934
+ isValid: {
935
+ required,
936
+ elements: elements !== 'none' ? true : false,
937
+ custom: maybeCustomRule( customSelectRule ),
938
+ },
927
939
  },
928
- },
929
- {
930
- id: 'textarea',
931
- type: 'text',
932
- Edit: 'textarea',
933
- label: 'Textarea',
934
- isValid: {
935
- required,
936
- elements: elements !== 'none' ? true : false,
937
- custom: maybeCustomRule( customTextareaRule ),
940
+ {
941
+ id: 'textWithRadio',
942
+ type: 'text',
943
+ Edit: 'radio',
944
+ label: 'Text with radio',
945
+ elements:
946
+ elements === 'async'
947
+ ? undefined
948
+ : [
949
+ { value: 'item1', label: 'Item 1' },
950
+ { value: 'item2', label: 'Item 2' },
951
+ ],
952
+ getElements:
953
+ elements === 'async'
954
+ ? getElements( 'textWithRadio' )
955
+ : undefined,
956
+ isValid: {
957
+ required,
958
+ elements: elements !== 'none' ? true : false,
959
+ custom: maybeCustomRule( customTextRadioRule ),
960
+ },
938
961
  },
939
- },
940
- {
941
- id: 'email',
942
- type: 'email',
943
- label: 'e-mail',
944
- isValid: {
945
- required,
946
- elements: elements !== 'none' ? true : false,
947
- custom: maybeCustomRule( customEmailRule ),
962
+ {
963
+ id: 'textarea',
964
+ type: 'text',
965
+ Edit: 'textarea',
966
+ label: 'Textarea',
967
+ isValid: {
968
+ required,
969
+ elements: elements !== 'none' ? true : false,
970
+ custom: maybeCustomRule( customTextareaRule ),
971
+ },
948
972
  },
949
- },
950
- {
951
- id: 'telephone',
952
- type: 'telephone',
953
- label: 'telephone',
954
- isValid: {
955
- required,
956
- elements: elements !== 'none' ? true : false,
957
- custom: maybeCustomRule( customTelephoneRule ),
973
+ {
974
+ id: 'email',
975
+ type: 'email',
976
+ label: 'e-mail',
977
+ isValid: {
978
+ required,
979
+ elements: elements !== 'none' ? true : false,
980
+ custom: maybeCustomRule( customEmailRule ),
981
+ },
958
982
  },
959
- },
960
- {
961
- id: 'url',
962
- type: 'url',
963
- label: 'URL',
964
- isValid: {
965
- required,
966
- elements: elements !== 'none' ? true : false,
967
- custom: maybeCustomRule( customUrlRule ),
983
+ {
984
+ id: 'telephone',
985
+ type: 'telephone',
986
+ label: 'telephone',
987
+ isValid: {
988
+ required,
989
+ elements: elements !== 'none' ? true : false,
990
+ custom: maybeCustomRule( customTelephoneRule ),
991
+ },
968
992
  },
969
- },
970
- {
971
- id: 'color',
972
- type: 'color',
973
- label: 'Color',
974
- isValid: {
975
- required,
976
- elements: elements !== 'none' ? true : false,
977
- custom: maybeCustomRule( customColorRule ),
993
+ {
994
+ id: 'url',
995
+ type: 'url',
996
+ label: 'URL',
997
+ isValid: {
998
+ required,
999
+ elements: elements !== 'none' ? true : false,
1000
+ custom: maybeCustomRule( customUrlRule ),
1001
+ },
978
1002
  },
979
- },
980
- {
981
- id: 'integer',
982
- type: 'integer',
983
- label: 'Integer',
984
- isValid: {
985
- required,
986
- elements: elements !== 'none' ? true : false,
987
- custom: maybeCustomRule( customIntegerRule ),
1003
+ {
1004
+ id: 'color',
1005
+ type: 'color',
1006
+ label: 'Color',
1007
+ isValid: {
1008
+ required,
1009
+ elements: elements !== 'none' ? true : false,
1010
+ custom: maybeCustomRule( customColorRule ),
1011
+ },
988
1012
  },
989
- },
990
- {
991
- id: 'number',
992
- type: 'number',
993
- label: 'Number',
994
- isValid: {
995
- required,
996
- elements: elements !== 'none' ? true : false,
997
- custom: maybeCustomRule( customNumberRule ),
1013
+ {
1014
+ id: 'integer',
1015
+ type: 'integer',
1016
+ label: 'Integer',
1017
+ isValid: {
1018
+ required,
1019
+ elements: elements !== 'none' ? true : false,
1020
+ custom: maybeCustomRule( customIntegerRule ),
1021
+ },
998
1022
  },
999
- },
1000
- {
1001
- id: 'boolean',
1002
- type: 'boolean',
1003
- label: 'Boolean',
1004
- isValid: {
1005
- required,
1006
- elements: elements !== 'none' ? true : false,
1007
- custom: maybeCustomRule( customBooleanRule ),
1023
+ {
1024
+ id: 'number',
1025
+ type: 'number',
1026
+ label: 'Number',
1027
+ isValid: {
1028
+ required,
1029
+ elements: elements !== 'none' ? true : false,
1030
+ custom: maybeCustomRule( customNumberRule ),
1031
+ },
1008
1032
  },
1009
- },
1010
- {
1011
- id: 'countries',
1012
- label: 'Countries Visited',
1013
- type: 'array' as const,
1014
- placeholder: 'Select countries',
1015
- description: 'Countries you have visited',
1016
- isValid: {
1017
- required,
1018
- elements: elements !== 'none' ? true : false,
1033
+ {
1034
+ id: 'boolean',
1035
+ type: 'boolean',
1036
+ label: 'Boolean',
1037
+ isValid: {
1038
+ required,
1039
+ elements: elements !== 'none' ? true : false,
1040
+ custom: maybeCustomRule( customBooleanRule ),
1041
+ },
1019
1042
  },
1020
- elements:
1021
- elements === 'async'
1022
- ? undefined
1023
- : [
1024
- { value: 'us', label: 'United States' },
1025
- { value: 'ca', label: 'Canada' },
1026
- { value: 'uk', label: 'United Kingdom' },
1027
- { value: 'fr', label: 'France' },
1028
- { value: 'de', label: 'Germany' },
1029
- { value: 'jp', label: 'Japan' },
1030
- { value: 'au', label: 'Australia' },
1031
- ],
1032
- getElements:
1033
- elements === 'async' ? getElements( 'countries' ) : undefined,
1034
- },
1035
- {
1036
- id: 'customEdit',
1037
- label: 'Custom Control',
1038
- Edit: CustomEditControl,
1039
- isValid: {
1040
- required,
1041
- elements: elements !== 'none' ? true : false,
1043
+ {
1044
+ id: 'array',
1045
+ label: 'Array',
1046
+ type: 'array',
1047
+ placeholder: 'Select countries',
1048
+ description: 'Countries you have visited',
1049
+ isValid: {
1050
+ required,
1051
+ elements: elements !== 'none' ? true : false,
1052
+ },
1053
+ elements:
1054
+ elements === 'async'
1055
+ ? undefined
1056
+ : [
1057
+ { value: 'us', label: 'United States' },
1058
+ { value: 'ca', label: 'Canada' },
1059
+ { value: 'uk', label: 'United Kingdom' },
1060
+ { value: 'fr', label: 'France' },
1061
+ { value: 'de', label: 'Germany' },
1062
+ { value: 'jp', label: 'Japan' },
1063
+ { value: 'au', label: 'Australia' },
1064
+ ],
1065
+ getElements:
1066
+ elements === 'async'
1067
+ ? getElements( 'countries' )
1068
+ : undefined,
1042
1069
  },
1043
- },
1044
- {
1045
- id: 'password',
1046
- type: 'password',
1047
- label: 'Password',
1048
- isValid: {
1049
- required,
1050
- elements: elements !== 'none' ? true : false,
1051
- custom: maybeCustomRule( customPasswordRule ),
1070
+ {
1071
+ id: 'customEdit',
1072
+ label: 'Custom Control',
1073
+ Edit: CustomEditControl,
1074
+ isValid: {
1075
+ required,
1076
+ elements: elements !== 'none' ? true : false,
1077
+ },
1052
1078
  },
1053
- },
1054
- {
1055
- id: 'toggle',
1056
- type: 'boolean',
1057
- label: 'Toggle',
1058
- Edit: 'toggle',
1059
- isValid: {
1060
- required,
1061
- elements: elements !== 'none' ? true : false,
1062
- custom: maybeCustomRule( customToggleRule ),
1079
+ {
1080
+ id: 'password',
1081
+ type: 'password',
1082
+ label: 'Password',
1083
+ isValid: {
1084
+ required,
1085
+ elements: elements !== 'none' ? true : false,
1086
+ custom: maybeCustomRule( customPasswordRule ),
1087
+ },
1063
1088
  },
1064
- },
1065
- {
1066
- id: 'toggleGroup',
1067
- type: 'text',
1068
- label: 'Toggle Group',
1069
- Edit: 'toggleGroup',
1070
- elements:
1071
- elements === 'async'
1072
- ? undefined
1073
- : [
1074
- { value: 'option1', label: 'Option 1' },
1075
- { value: 'option2', label: 'Option 2' },
1076
- { value: 'option3', label: 'Option 3' },
1077
- ],
1078
- getElements:
1079
- elements === 'async' ? getElements( 'toggleGroup' ) : undefined,
1080
- isValid: {
1081
- required,
1082
- elements: elements !== 'none' ? true : false,
1083
- custom: maybeCustomRule( customToggleGroupRule ),
1089
+ {
1090
+ id: 'toggle',
1091
+ type: 'boolean',
1092
+ label: 'Toggle',
1093
+ Edit: 'toggle',
1094
+ isValid: {
1095
+ required,
1096
+ elements: elements !== 'none' ? true : false,
1097
+ custom: maybeCustomRule( customToggleRule ),
1098
+ },
1084
1099
  },
1085
- },
1086
- {
1087
- id: 'date',
1088
- type: 'date',
1089
- label: 'Date',
1090
- isValid: {
1091
- required,
1092
- elements: elements !== 'none' ? true : false,
1093
- custom: maybeCustomRule( customDateRule ),
1100
+ {
1101
+ id: 'toggleGroup',
1102
+ type: 'text',
1103
+ label: 'Toggle Group',
1104
+ Edit: 'toggleGroup',
1105
+ elements:
1106
+ elements === 'async'
1107
+ ? undefined
1108
+ : [
1109
+ { value: 'option1', label: 'Option 1' },
1110
+ { value: 'option2', label: 'Option 2' },
1111
+ { value: 'option3', label: 'Option 3' },
1112
+ ],
1113
+ getElements:
1114
+ elements === 'async'
1115
+ ? getElements( 'toggleGroup' )
1116
+ : undefined,
1117
+ isValid: {
1118
+ required,
1119
+ elements: elements !== 'none' ? true : false,
1120
+ custom: maybeCustomRule( customToggleGroupRule ),
1121
+ },
1094
1122
  },
1095
- },
1096
- {
1097
- id: 'dateRange',
1098
- type: 'date',
1099
- label: 'Date Range',
1100
- Edit: DateRangeEdit,
1101
- isValid: {
1102
- required,
1103
- elements: elements !== 'none' ? true : false,
1104
- custom: maybeCustomRule( customDateRangeRule ),
1123
+ {
1124
+ id: 'date',
1125
+ type: 'date',
1126
+ label: 'Date',
1127
+ isValid: {
1128
+ required,
1129
+ elements: elements !== 'none' ? true : false,
1130
+ custom: maybeCustomRule( customDateRule ),
1131
+ },
1105
1132
  },
1106
- },
1107
- {
1108
- id: 'datetime',
1109
- type: 'datetime',
1110
- label: 'Date Time',
1111
- isValid: {
1112
- required,
1113
- elements: elements !== 'none' ? true : false,
1114
- custom: maybeCustomRule( customDateTimeRule ),
1133
+ {
1134
+ id: 'dateRange',
1135
+ type: 'date',
1136
+ label: 'Date Range',
1137
+ Edit: DateRangeEdit,
1138
+ isValid: {
1139
+ required,
1140
+ elements: elements !== 'none' ? true : false,
1141
+ custom: maybeCustomRule( customDateRangeRule ),
1142
+ },
1115
1143
  },
1116
- },
1117
- ];
1118
-
1119
- const form = {
1120
- layout: { type },
1121
- fields: [
1122
- // Use field object for testing purposes.
1123
- { id: 'text' },
1124
- 'select',
1125
- 'textWithRadio',
1126
- 'textarea',
1127
- 'email',
1128
- 'telephone',
1129
- 'url',
1130
- 'color',
1131
- 'integer',
1132
- 'number',
1133
- 'boolean',
1134
- 'categories',
1135
- 'countries',
1136
- 'toggle',
1137
- 'toggleGroup',
1138
- 'password',
1139
- 'customEdit',
1140
- // Use field object with children for testing purposes.
1141
1144
  {
1142
- id: 'dates',
1143
- label: 'Dates',
1144
- children: [ 'date', 'dateRange', 'datetime' ],
1145
+ id: 'datetime',
1146
+ type: 'datetime',
1147
+ label: 'Date Time',
1148
+ isValid: {
1149
+ required,
1150
+ elements: elements !== 'none' ? true : false,
1151
+ custom: maybeCustomRule( customDateTimeRule ),
1152
+ },
1145
1153
  },
1146
- ],
1147
- };
1154
+ ];
1155
+ }, [ elements, custom, required, getElements ] );
1156
+
1157
+ const form = useMemo(
1158
+ () => ( {
1159
+ fields: [
1160
+ 'text',
1161
+ { id: 'customEdit' },
1162
+ {
1163
+ id: 'level1Integer',
1164
+ children: [ 'integer' ],
1165
+ },
1166
+ {
1167
+ id: 'level1Number',
1168
+ children: [
1169
+ { id: 'level2Number', children: [ 'number' ] },
1170
+ ],
1171
+ },
1172
+ {
1173
+ id: 'level1Email',
1174
+ children: [
1175
+ {
1176
+ id: 'level2Email',
1177
+ children: [
1178
+ { id: 'level3Email', children: [ 'email' ] },
1179
+ ],
1180
+ },
1181
+ ],
1182
+ },
1183
+ {
1184
+ id: 'level1Telephone',
1185
+ children: [
1186
+ {
1187
+ id: 'level2Telephone',
1188
+ children: [
1189
+ {
1190
+ id: 'level3Telephone',
1191
+ children: [
1192
+ {
1193
+ id: 'level4Telephone',
1194
+ children: [ 'telephone' ],
1195
+ },
1196
+ ],
1197
+ },
1198
+ ],
1199
+ },
1200
+ ],
1201
+ },
1202
+ 'url',
1203
+ 'color',
1204
+ 'password',
1205
+ 'textarea',
1206
+ 'select',
1207
+ 'textWithRadio',
1208
+ 'boolean',
1209
+ 'toggle',
1210
+ 'toggleGroup',
1211
+ 'array',
1212
+ 'date',
1213
+ 'dateRange',
1214
+ 'datetime',
1215
+ ],
1216
+ } ),
1217
+ []
1218
+ );
1148
1219
 
1149
1220
  const { validity, isValid } = useFormValidity( post, _fields, form );
1150
1221
 
@@ -1326,7 +1397,7 @@ const LayoutCardComponent = ( {
1326
1397
  isVisible: ( item ) => item.displayPayments,
1327
1398
  render: ( { item } ) => {
1328
1399
  return (
1329
- <p>
1400
+ <p style={ { margin: 0 } }>
1330
1401
  The customer has made a total of { item.totalOrders }{ ' ' }
1331
1402
  orders, amounting to { item.totalRevenue } dollars. The
1332
1403
  average order value is { item.averageOrderValue }{ ' ' }
@@ -1382,17 +1453,13 @@ const LayoutCardComponent = ( {
1382
1453
 
1383
1454
  const form: Form = useMemo(
1384
1455
  () => ( {
1385
- layout: getLayoutFromStoryArgs( {
1386
- type: 'card',
1387
- withHeader,
1388
- } ),
1389
1456
  fields: [
1390
1457
  {
1391
1458
  id: 'customerCard',
1392
1459
  layout: {
1393
1460
  type: 'card',
1394
1461
  summary: 'plan-summary',
1395
- isCollapsible,
1462
+ withHeader,
1396
1463
  },
1397
1464
  label: 'Customer',
1398
1465
  description:
@@ -1796,6 +1863,73 @@ const LayoutRowComponent = ( {
1796
1863
  );
1797
1864
  };
1798
1865
 
1866
+ const LayoutDetailsComponent = () => {
1867
+ const [ post, setPost ] = useState< SamplePost >( {
1868
+ title: 'Hello, World!',
1869
+ order: 2,
1870
+ author: 1,
1871
+ status: 'draft',
1872
+ reviewer: 'fulano',
1873
+ date: '2021-01-01T12:00:00',
1874
+ birthdate: '1950-02-23T12:00:00',
1875
+ filesize: 1024,
1876
+ dimensions: '1920x1080',
1877
+ comment_status: 'open',
1878
+ ping_status: true,
1879
+ tags: [ 'photography' ],
1880
+ } );
1881
+
1882
+ const form: Form = {
1883
+ fields: [
1884
+ {
1885
+ id: 'discussion',
1886
+ label: 'Discussion',
1887
+ children: [ 'comment_status', 'ping_status' ],
1888
+ layout: {
1889
+ type: 'details',
1890
+ summary: 'discussion',
1891
+ },
1892
+ },
1893
+ {
1894
+ id: 'metadata',
1895
+ label: 'Metadata',
1896
+ children: [ 'filesize', 'dimensions' ],
1897
+ layout: {
1898
+ type: 'details',
1899
+ summary: 'metadata_summary',
1900
+ },
1901
+ },
1902
+ {
1903
+ id: 'categorization',
1904
+ label: 'Categorization',
1905
+ children: [ 'tags', 'description' ],
1906
+ layout: { type: 'details' },
1907
+ },
1908
+ {
1909
+ id: 'scheduling',
1910
+ children: [ 'date', 'birthdate' ],
1911
+ layout: {
1912
+ type: 'details',
1913
+ },
1914
+ },
1915
+ ],
1916
+ };
1917
+
1918
+ return (
1919
+ <DataForm< SamplePost >
1920
+ data={ post }
1921
+ fields={ fields }
1922
+ form={ form }
1923
+ onChange={ ( edits ) =>
1924
+ setPost( ( prev ) => ( {
1925
+ ...prev,
1926
+ ...edits,
1927
+ } ) )
1928
+ }
1929
+ />
1930
+ );
1931
+ };
1932
+
1799
1933
  const LayoutMixedComponent = () => {
1800
1934
  const [ post, setPost ] = useState< SamplePost >( {
1801
1935
  title: 'Hello, World!',
@@ -1923,6 +2057,10 @@ export const LayoutRow = {
1923
2057
  },
1924
2058
  };
1925
2059
 
2060
+ export const LayoutDetails = {
2061
+ render: LayoutDetailsComponent,
2062
+ };
2063
+
1926
2064
  export const LayoutMixed = {
1927
2065
  render: LayoutMixedComponent,
1928
2066
  };
@@ -1946,17 +2084,11 @@ export const Validation = {
1946
2084
  description: 'Whether or not the custom validation rule is active.',
1947
2085
  options: [ 'sync', 'async', 'none' ],
1948
2086
  },
1949
- type: {
1950
- control: { type: 'select' },
1951
- description: 'Chooses the layout type.',
1952
- options: [ 'regular', 'panel', 'card', 'row' ],
1953
- },
1954
2087
  },
1955
2088
  args: {
1956
2089
  required: true,
1957
2090
  elements: 'sync',
1958
2091
  custom: 'sync',
1959
- type: 'regular',
1960
2092
  },
1961
2093
  };
1962
2094