@wordpress/dataviews 11.4.1-next.v.0 → 12.0.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 (415) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/README.md +44 -2
  3. package/build/components/dataform-controls/adaptive-select.cjs +52 -0
  4. package/build/components/dataform-controls/adaptive-select.cjs.map +7 -0
  5. package/build/components/dataform-controls/array.cjs +2 -0
  6. package/build/components/dataform-controls/array.cjs.map +2 -2
  7. package/build/components/dataform-controls/checkbox.cjs +2 -0
  8. package/build/components/dataform-controls/checkbox.cjs.map +2 -2
  9. package/build/components/dataform-controls/color.cjs +21 -30
  10. package/build/components/dataform-controls/color.cjs.map +3 -3
  11. package/build/components/dataform-controls/date.cjs +23 -9
  12. package/build/components/dataform-controls/date.cjs.map +2 -2
  13. package/build/components/dataform-controls/datetime.cjs +11 -3
  14. package/build/components/dataform-controls/datetime.cjs.map +2 -2
  15. package/build/components/dataform-controls/email.cjs +2 -0
  16. package/build/components/dataform-controls/email.cjs.map +2 -2
  17. package/build/components/dataform-controls/index.cjs +3 -1
  18. package/build/components/dataform-controls/index.cjs.map +3 -3
  19. package/build/components/dataform-controls/password.cjs +2 -0
  20. package/build/components/dataform-controls/password.cjs.map +2 -2
  21. package/build/components/dataform-controls/radio.cjs +2 -0
  22. package/build/components/dataform-controls/radio.cjs.map +2 -2
  23. package/build/components/dataform-controls/select.cjs +2 -0
  24. package/build/components/dataform-controls/select.cjs.map +2 -2
  25. package/build/components/dataform-controls/telephone.cjs +2 -0
  26. package/build/components/dataform-controls/telephone.cjs.map +2 -2
  27. package/build/components/dataform-controls/text.cjs +2 -0
  28. package/build/components/dataform-controls/text.cjs.map +2 -2
  29. package/build/components/dataform-controls/textarea.cjs +2 -0
  30. package/build/components/dataform-controls/textarea.cjs.map +2 -2
  31. package/build/components/dataform-controls/toggle-group.cjs +2 -0
  32. package/build/components/dataform-controls/toggle-group.cjs.map +2 -2
  33. package/build/components/dataform-controls/toggle.cjs +2 -0
  34. package/build/components/dataform-controls/toggle.cjs.map +2 -2
  35. package/build/components/dataform-controls/url.cjs +2 -0
  36. package/build/components/dataform-controls/url.cjs.map +2 -2
  37. package/build/components/dataform-controls/utils/relative-date-control.cjs +1 -1
  38. package/build/components/dataform-controls/utils/relative-date-control.cjs.map +1 -1
  39. package/build/components/dataform-controls/utils/validated-input.cjs +2 -0
  40. package/build/components/dataform-controls/utils/validated-input.cjs.map +2 -2
  41. package/build/components/dataform-controls/utils/validated-number.cjs +2 -0
  42. package/build/components/dataform-controls/utils/validated-number.cjs.map +2 -2
  43. package/build/components/dataform-layouts/card/index.cjs +2 -0
  44. package/build/components/dataform-layouts/card/index.cjs.map +2 -2
  45. package/build/components/dataform-layouts/data-form-layout.cjs +11 -2
  46. package/build/components/dataform-layouts/data-form-layout.cjs.map +2 -2
  47. package/build/components/dataform-layouts/details/index.cjs +1 -1
  48. package/build/components/dataform-layouts/details/index.cjs.map +1 -1
  49. package/build/components/dataform-layouts/index.cjs +5 -5
  50. package/build/components/dataform-layouts/index.cjs.map +1 -1
  51. package/build/components/dataform-layouts/normalize-form.cjs +2 -1
  52. package/build/components/dataform-layouts/normalize-form.cjs.map +2 -2
  53. package/build/components/dataform-layouts/panel/dropdown.cjs +81 -66
  54. package/build/components/dataform-layouts/panel/dropdown.cjs.map +3 -3
  55. package/build/components/dataform-layouts/panel/index.cjs +13 -177
  56. package/build/components/dataform-layouts/panel/index.cjs.map +3 -3
  57. package/build/components/dataform-layouts/panel/modal.cjs +15 -11
  58. package/build/components/dataform-layouts/panel/modal.cjs.map +3 -3
  59. package/build/components/dataform-layouts/panel/summary-button.cjs +125 -56
  60. package/build/components/dataform-layouts/panel/summary-button.cjs.map +3 -3
  61. package/build/components/dataform-layouts/panel/utils/get-first-validation-error.cjs +59 -0
  62. package/build/components/dataform-layouts/panel/utils/get-first-validation-error.cjs.map +7 -0
  63. package/build/components/dataform-layouts/panel/utils/get-label-classname.cjs +45 -0
  64. package/build/components/dataform-layouts/panel/utils/get-label-classname.cjs.map +7 -0
  65. package/build/components/dataform-layouts/panel/utils/get-label-content.cjs +36 -0
  66. package/build/components/dataform-layouts/panel/utils/get-label-content.cjs.map +7 -0
  67. package/build/components/dataform-layouts/panel/utils/use-field-from-form-field.cjs +77 -0
  68. package/build/components/dataform-layouts/panel/utils/use-field-from-form-field.cjs.map +7 -0
  69. package/build/components/dataform-layouts/regular/index.cjs +6 -3
  70. package/build/components/dataform-layouts/regular/index.cjs.map +2 -2
  71. package/build/components/dataform-layouts/row/index.cjs +5 -2
  72. package/build/components/dataform-layouts/row/index.cjs.map +2 -2
  73. package/build/components/dataviews-bulk-actions/index.cjs +4 -4
  74. package/build/components/dataviews-bulk-actions/index.cjs.map +2 -2
  75. package/build/components/dataviews-context/index.cjs.map +2 -2
  76. package/build/components/dataviews-filters/filter.cjs +1 -1
  77. package/build/components/dataviews-filters/filter.cjs.map +1 -1
  78. package/build/components/dataviews-filters/filters.cjs +1 -1
  79. package/build/components/dataviews-filters/filters.cjs.map +1 -1
  80. package/build/components/dataviews-filters/search-widget.cjs +25 -11
  81. package/build/components/dataviews-filters/search-widget.cjs.map +2 -2
  82. package/build/components/dataviews-filters/toggle.cjs.map +1 -1
  83. package/build/components/dataviews-footer/index.cjs +1 -1
  84. package/build/components/dataviews-footer/index.cjs.map +1 -1
  85. package/build/components/dataviews-layouts/activity/activity-item.cjs +4 -4
  86. package/build/components/dataviews-layouts/activity/activity-item.cjs.map +1 -1
  87. package/build/components/dataviews-layouts/activity/index.cjs +1 -1
  88. package/build/components/dataviews-layouts/activity/index.cjs.map +1 -1
  89. package/build/components/dataviews-layouts/grid/composite-grid.cjs +27 -38
  90. package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
  91. package/build/components/dataviews-layouts/grid/index.cjs +2 -2
  92. package/build/components/dataviews-layouts/grid/index.cjs.map +1 -1
  93. package/build/components/dataviews-layouts/list/index.cjs +7 -8
  94. package/build/components/dataviews-layouts/list/index.cjs.map +2 -2
  95. package/build/components/dataviews-layouts/picker-grid/index.cjs +5 -5
  96. package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
  97. package/build/components/dataviews-layouts/picker-table/index.cjs +1 -1
  98. package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
  99. package/build/components/dataviews-layouts/table/column-primary.cjs +1 -1
  100. package/build/components/dataviews-layouts/table/column-primary.cjs.map +1 -1
  101. package/build/components/dataviews-layouts/table/index.cjs +1 -1
  102. package/build/components/dataviews-layouts/table/index.cjs.map +2 -2
  103. package/build/components/dataviews-layouts/utils/item-click-wrapper.cjs.map +2 -2
  104. package/build/components/dataviews-pagination/index.cjs +3 -3
  105. package/build/components/dataviews-pagination/index.cjs.map +2 -2
  106. package/build/components/dataviews-picker-footer/index.cjs +3 -3
  107. package/build/components/dataviews-picker-footer/index.cjs.map +2 -2
  108. package/build/components/dataviews-view-config/index.cjs +74 -57
  109. package/build/components/dataviews-view-config/index.cjs.map +3 -3
  110. package/build/components/dataviews-view-config/properties-section.cjs +1 -1
  111. package/build/components/dataviews-view-config/properties-section.cjs.map +1 -1
  112. package/build/dataviews/index.cjs +7 -5
  113. package/build/dataviews/index.cjs.map +2 -2
  114. package/build/dataviews-picker/index.cjs +3 -3
  115. package/build/dataviews-picker/index.cjs.map +2 -2
  116. package/build/hooks/use-form-validity.cjs +61 -28
  117. package/build/hooks/use-form-validity.cjs.map +2 -2
  118. package/build/types/dataform.cjs.map +1 -1
  119. package/build/types/field-api.cjs.map +1 -1
  120. package/build-module/components/dataform-controls/adaptive-select.mjs +21 -0
  121. package/build-module/components/dataform-controls/adaptive-select.mjs.map +7 -0
  122. package/build-module/components/dataform-controls/array.mjs +2 -0
  123. package/build-module/components/dataform-controls/array.mjs.map +2 -2
  124. package/build-module/components/dataform-controls/checkbox.mjs +2 -0
  125. package/build-module/components/dataform-controls/checkbox.mjs.map +2 -2
  126. package/build-module/components/dataform-controls/color.mjs +26 -31
  127. package/build-module/components/dataform-controls/color.mjs.map +2 -2
  128. package/build-module/components/dataform-controls/date.mjs +23 -9
  129. package/build-module/components/dataform-controls/date.mjs.map +2 -2
  130. package/build-module/components/dataform-controls/datetime.mjs +11 -3
  131. package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
  132. package/build-module/components/dataform-controls/email.mjs +2 -0
  133. package/build-module/components/dataform-controls/email.mjs.map +2 -2
  134. package/build-module/components/dataform-controls/index.mjs +3 -1
  135. package/build-module/components/dataform-controls/index.mjs.map +2 -2
  136. package/build-module/components/dataform-controls/password.mjs +2 -0
  137. package/build-module/components/dataform-controls/password.mjs.map +2 -2
  138. package/build-module/components/dataform-controls/radio.mjs +2 -0
  139. package/build-module/components/dataform-controls/radio.mjs.map +2 -2
  140. package/build-module/components/dataform-controls/select.mjs +2 -0
  141. package/build-module/components/dataform-controls/select.mjs.map +2 -2
  142. package/build-module/components/dataform-controls/telephone.mjs +2 -0
  143. package/build-module/components/dataform-controls/telephone.mjs.map +2 -2
  144. package/build-module/components/dataform-controls/text.mjs +2 -0
  145. package/build-module/components/dataform-controls/text.mjs.map +2 -2
  146. package/build-module/components/dataform-controls/textarea.mjs +2 -0
  147. package/build-module/components/dataform-controls/textarea.mjs.map +2 -2
  148. package/build-module/components/dataform-controls/toggle-group.mjs +2 -0
  149. package/build-module/components/dataform-controls/toggle-group.mjs.map +2 -2
  150. package/build-module/components/dataform-controls/toggle.mjs +2 -0
  151. package/build-module/components/dataform-controls/toggle.mjs.map +2 -2
  152. package/build-module/components/dataform-controls/url.mjs +2 -0
  153. package/build-module/components/dataform-controls/url.mjs.map +2 -2
  154. package/build-module/components/dataform-controls/utils/relative-date-control.mjs +1 -1
  155. package/build-module/components/dataform-controls/utils/relative-date-control.mjs.map +1 -1
  156. package/build-module/components/dataform-controls/utils/validated-input.mjs +2 -0
  157. package/build-module/components/dataform-controls/utils/validated-input.mjs.map +2 -2
  158. package/build-module/components/dataform-controls/utils/validated-number.mjs +2 -0
  159. package/build-module/components/dataform-controls/utils/validated-number.mjs.map +2 -2
  160. package/build-module/components/dataform-layouts/card/index.mjs +2 -0
  161. package/build-module/components/dataform-layouts/card/index.mjs.map +2 -2
  162. package/build-module/components/dataform-layouts/data-form-layout.mjs +12 -3
  163. package/build-module/components/dataform-layouts/data-form-layout.mjs.map +2 -2
  164. package/build-module/components/dataform-layouts/details/index.mjs +1 -1
  165. package/build-module/components/dataform-layouts/details/index.mjs.map +1 -1
  166. package/build-module/components/dataform-layouts/index.mjs +5 -5
  167. package/build-module/components/dataform-layouts/index.mjs.map +1 -1
  168. package/build-module/components/dataform-layouts/normalize-form.mjs +2 -1
  169. package/build-module/components/dataform-layouts/normalize-form.mjs.map +2 -2
  170. package/build-module/components/dataform-layouts/panel/dropdown.mjs +83 -68
  171. package/build-module/components/dataform-layouts/panel/dropdown.mjs.map +2 -2
  172. package/build-module/components/dataform-layouts/panel/index.mjs +14 -178
  173. package/build-module/components/dataform-layouts/panel/index.mjs.map +2 -2
  174. package/build-module/components/dataform-layouts/panel/modal.mjs +15 -11
  175. package/build-module/components/dataform-layouts/panel/modal.mjs.map +2 -2
  176. package/build-module/components/dataform-layouts/panel/summary-button.mjs +117 -58
  177. package/build-module/components/dataform-layouts/panel/summary-button.mjs.map +2 -2
  178. package/build-module/components/dataform-layouts/panel/utils/get-first-validation-error.mjs +38 -0
  179. package/build-module/components/dataform-layouts/panel/utils/get-first-validation-error.mjs.map +7 -0
  180. package/build-module/components/dataform-layouts/panel/utils/get-label-classname.mjs +14 -0
  181. package/build-module/components/dataform-layouts/panel/utils/get-label-classname.mjs.map +7 -0
  182. package/build-module/components/dataform-layouts/panel/utils/get-label-content.mjs +15 -0
  183. package/build-module/components/dataform-layouts/panel/utils/get-label-content.mjs.map +7 -0
  184. package/build-module/components/dataform-layouts/panel/utils/use-field-from-form-field.mjs +46 -0
  185. package/build-module/components/dataform-layouts/panel/utils/use-field-from-form-field.mjs.map +7 -0
  186. package/build-module/components/dataform-layouts/regular/index.mjs +6 -3
  187. package/build-module/components/dataform-layouts/regular/index.mjs.map +2 -2
  188. package/build-module/components/dataform-layouts/row/index.mjs +5 -2
  189. package/build-module/components/dataform-layouts/row/index.mjs.map +2 -2
  190. package/build-module/components/dataviews-bulk-actions/index.mjs +4 -4
  191. package/build-module/components/dataviews-bulk-actions/index.mjs.map +2 -2
  192. package/build-module/components/dataviews-context/index.mjs.map +2 -2
  193. package/build-module/components/dataviews-filters/filter.mjs +1 -1
  194. package/build-module/components/dataviews-filters/filter.mjs.map +1 -1
  195. package/build-module/components/dataviews-filters/filters.mjs +1 -1
  196. package/build-module/components/dataviews-filters/filters.mjs.map +1 -1
  197. package/build-module/components/dataviews-filters/search-widget.mjs +25 -11
  198. package/build-module/components/dataviews-filters/search-widget.mjs.map +2 -2
  199. package/build-module/components/dataviews-filters/toggle.mjs.map +1 -1
  200. package/build-module/components/dataviews-footer/index.mjs +1 -1
  201. package/build-module/components/dataviews-footer/index.mjs.map +1 -1
  202. package/build-module/components/dataviews-layouts/activity/activity-item.mjs +4 -4
  203. package/build-module/components/dataviews-layouts/activity/activity-item.mjs.map +1 -1
  204. package/build-module/components/dataviews-layouts/activity/index.mjs +1 -1
  205. package/build-module/components/dataviews-layouts/activity/index.mjs.map +1 -1
  206. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs +27 -38
  207. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
  208. package/build-module/components/dataviews-layouts/grid/index.mjs +2 -2
  209. package/build-module/components/dataviews-layouts/grid/index.mjs.map +1 -1
  210. package/build-module/components/dataviews-layouts/list/index.mjs +7 -8
  211. package/build-module/components/dataviews-layouts/list/index.mjs.map +2 -2
  212. package/build-module/components/dataviews-layouts/picker-grid/index.mjs +5 -5
  213. package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
  214. package/build-module/components/dataviews-layouts/picker-table/index.mjs +1 -1
  215. package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
  216. package/build-module/components/dataviews-layouts/table/column-primary.mjs +1 -1
  217. package/build-module/components/dataviews-layouts/table/column-primary.mjs.map +1 -1
  218. package/build-module/components/dataviews-layouts/table/index.mjs +1 -1
  219. package/build-module/components/dataviews-layouts/table/index.mjs.map +2 -2
  220. package/build-module/components/dataviews-layouts/utils/item-click-wrapper.mjs.map +2 -2
  221. package/build-module/components/dataviews-pagination/index.mjs +3 -3
  222. package/build-module/components/dataviews-pagination/index.mjs.map +2 -2
  223. package/build-module/components/dataviews-picker-footer/index.mjs +3 -3
  224. package/build-module/components/dataviews-picker-footer/index.mjs.map +2 -2
  225. package/build-module/components/dataviews-view-config/index.mjs +74 -59
  226. package/build-module/components/dataviews-view-config/index.mjs.map +2 -2
  227. package/build-module/components/dataviews-view-config/properties-section.mjs +1 -1
  228. package/build-module/components/dataviews-view-config/properties-section.mjs.map +1 -1
  229. package/build-module/dataviews/index.mjs +7 -5
  230. package/build-module/dataviews/index.mjs.map +2 -2
  231. package/build-module/dataviews-picker/index.mjs +3 -3
  232. package/build-module/dataviews-picker/index.mjs.map +2 -2
  233. package/build-module/hooks/use-form-validity.mjs +61 -28
  234. package/build-module/hooks/use-form-validity.mjs.map +2 -2
  235. package/build-style/style-rtl.css +144 -217
  236. package/build-style/style.css +144 -217
  237. package/build-types/components/dataform-controls/adaptive-select.d.ts +6 -0
  238. package/build-types/components/dataform-controls/adaptive-select.d.ts.map +1 -0
  239. package/build-types/components/dataform-controls/array.d.ts +1 -1
  240. package/build-types/components/dataform-controls/array.d.ts.map +1 -1
  241. package/build-types/components/dataform-controls/checkbox.d.ts +1 -1
  242. package/build-types/components/dataform-controls/checkbox.d.ts.map +1 -1
  243. package/build-types/components/dataform-controls/color.d.ts +1 -1
  244. package/build-types/components/dataform-controls/color.d.ts.map +1 -1
  245. package/build-types/components/dataform-controls/date.d.ts +1 -1
  246. package/build-types/components/dataform-controls/date.d.ts.map +1 -1
  247. package/build-types/components/dataform-controls/datetime.d.ts +1 -1
  248. package/build-types/components/dataform-controls/datetime.d.ts.map +1 -1
  249. package/build-types/components/dataform-controls/email.d.ts +1 -1
  250. package/build-types/components/dataform-controls/email.d.ts.map +1 -1
  251. package/build-types/components/dataform-controls/index.d.ts.map +1 -1
  252. package/build-types/components/dataform-controls/password.d.ts +1 -1
  253. package/build-types/components/dataform-controls/password.d.ts.map +1 -1
  254. package/build-types/components/dataform-controls/radio.d.ts +1 -1
  255. package/build-types/components/dataform-controls/radio.d.ts.map +1 -1
  256. package/build-types/components/dataform-controls/select.d.ts +1 -1
  257. package/build-types/components/dataform-controls/select.d.ts.map +1 -1
  258. package/build-types/components/dataform-controls/telephone.d.ts +1 -1
  259. package/build-types/components/dataform-controls/telephone.d.ts.map +1 -1
  260. package/build-types/components/dataform-controls/text.d.ts +1 -1
  261. package/build-types/components/dataform-controls/text.d.ts.map +1 -1
  262. package/build-types/components/dataform-controls/textarea.d.ts +1 -1
  263. package/build-types/components/dataform-controls/textarea.d.ts.map +1 -1
  264. package/build-types/components/dataform-controls/toggle-group.d.ts +1 -1
  265. package/build-types/components/dataform-controls/toggle-group.d.ts.map +1 -1
  266. package/build-types/components/dataform-controls/toggle.d.ts +1 -1
  267. package/build-types/components/dataform-controls/toggle.d.ts.map +1 -1
  268. package/build-types/components/dataform-controls/url.d.ts +1 -1
  269. package/build-types/components/dataform-controls/url.d.ts.map +1 -1
  270. package/build-types/components/dataform-controls/utils/validated-input.d.ts +1 -1
  271. package/build-types/components/dataform-controls/utils/validated-input.d.ts.map +1 -1
  272. package/build-types/components/dataform-controls/utils/validated-number.d.ts +1 -1
  273. package/build-types/components/dataform-controls/utils/validated-number.d.ts.map +1 -1
  274. package/build-types/components/dataform-layouts/card/index.d.ts +1 -1
  275. package/build-types/components/dataform-layouts/card/index.d.ts.map +1 -1
  276. package/build-types/components/dataform-layouts/data-form-layout.d.ts +2 -1
  277. package/build-types/components/dataform-layouts/data-form-layout.d.ts.map +1 -1
  278. package/build-types/components/dataform-layouts/normalize-form.d.ts.map +1 -1
  279. package/build-types/components/dataform-layouts/panel/dropdown.d.ts +2 -13
  280. package/build-types/components/dataform-layouts/panel/dropdown.d.ts.map +1 -1
  281. package/build-types/components/dataform-layouts/panel/index.d.ts +1 -1
  282. package/build-types/components/dataform-layouts/panel/index.d.ts.map +1 -1
  283. package/build-types/components/dataform-layouts/panel/modal.d.ts +2 -11
  284. package/build-types/components/dataform-layouts/panel/modal.d.ts.map +1 -1
  285. package/build-types/components/dataform-layouts/panel/summary-button.d.ts +6 -5
  286. package/build-types/components/dataform-layouts/panel/summary-button.d.ts.map +1 -1
  287. package/build-types/components/dataform-layouts/panel/utils/get-first-validation-error.d.ts +4 -0
  288. package/build-types/components/dataform-layouts/panel/utils/get-first-validation-error.d.ts.map +1 -0
  289. package/build-types/components/dataform-layouts/panel/utils/get-label-classname.d.ts +4 -0
  290. package/build-types/components/dataform-layouts/panel/utils/get-label-classname.d.ts.map +1 -0
  291. package/build-types/components/dataform-layouts/panel/utils/get-label-content.d.ts +3 -0
  292. package/build-types/components/dataform-layouts/panel/utils/get-label-content.d.ts.map +1 -0
  293. package/build-types/components/dataform-layouts/panel/utils/use-field-from-form-field.d.ts +23 -0
  294. package/build-types/components/dataform-layouts/panel/utils/use-field-from-form-field.d.ts.map +1 -0
  295. package/build-types/components/dataform-layouts/regular/index.d.ts +1 -1
  296. package/build-types/components/dataform-layouts/regular/index.d.ts.map +1 -1
  297. package/build-types/components/dataform-layouts/row/index.d.ts +1 -1
  298. package/build-types/components/dataform-layouts/row/index.d.ts.map +1 -1
  299. package/build-types/components/dataviews-context/index.d.ts +1 -0
  300. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  301. package/build-types/components/dataviews-filters/filter.d.ts +1 -1
  302. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
  303. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -1
  304. package/build-types/components/dataviews-layouts/list/index.d.ts.map +1 -1
  305. package/build-types/components/dataviews-layouts/utils/item-click-wrapper.d.ts +1 -0
  306. package/build-types/components/dataviews-layouts/utils/item-click-wrapper.d.ts.map +1 -1
  307. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  308. package/build-types/dataform/stories/index.story.d.ts +9 -1
  309. package/build-types/dataform/stories/index.story.d.ts.map +1 -1
  310. package/build-types/dataform/stories/layout-panel.d.ts +3 -1
  311. package/build-types/dataform/stories/layout-panel.d.ts.map +1 -1
  312. package/build-types/dataviews/index.d.ts +2 -1
  313. package/build-types/dataviews/index.d.ts.map +1 -1
  314. package/build-types/dataviews/stories/fixtures.d.ts +1 -0
  315. package/build-types/dataviews/stories/fixtures.d.ts.map +1 -1
  316. package/build-types/dataviews/stories/index.story.d.ts +14 -2
  317. package/build-types/dataviews/stories/index.story.d.ts.map +1 -1
  318. package/build-types/dataviews/stories/layout-activity.d.ts +2 -1
  319. package/build-types/dataviews/stories/layout-activity.d.ts.map +1 -1
  320. package/build-types/dataviews/stories/layout-list.d.ts +2 -1
  321. package/build-types/dataviews/stories/layout-list.d.ts.map +1 -1
  322. package/build-types/field-types/stories/index.story.d.ts +42 -16
  323. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  324. package/build-types/hooks/use-form-validity.d.ts.map +1 -1
  325. package/build-types/types/dataform.d.ts +4 -0
  326. package/build-types/types/dataform.d.ts.map +1 -1
  327. package/build-types/types/field-api.d.ts +4 -0
  328. package/build-types/types/field-api.d.ts.map +1 -1
  329. package/build-wp/index.js +2689 -2167
  330. package/package.json +21 -21
  331. package/src/components/dataform-controls/adaptive-select.tsx +23 -0
  332. package/src/components/dataform-controls/array.tsx +2 -0
  333. package/src/components/dataform-controls/checkbox.tsx +2 -0
  334. package/src/components/dataform-controls/color.tsx +31 -36
  335. package/src/components/dataform-controls/date.tsx +24 -16
  336. package/src/components/dataform-controls/datetime.tsx +16 -6
  337. package/src/components/dataform-controls/email.tsx +2 -0
  338. package/src/components/dataform-controls/index.tsx +3 -1
  339. package/src/components/dataform-controls/password.tsx +2 -0
  340. package/src/components/dataform-controls/radio.tsx +2 -0
  341. package/src/components/dataform-controls/select.tsx +2 -0
  342. package/src/components/dataform-controls/style.scss +4 -0
  343. package/src/components/dataform-controls/telephone.tsx +2 -0
  344. package/src/components/dataform-controls/text.tsx +2 -0
  345. package/src/components/dataform-controls/textarea.tsx +2 -0
  346. package/src/components/dataform-controls/toggle-group.tsx +2 -0
  347. package/src/components/dataform-controls/toggle.tsx +2 -0
  348. package/src/components/dataform-controls/url.tsx +2 -0
  349. package/src/components/dataform-controls/utils/relative-date-control.tsx +1 -1
  350. package/src/components/dataform-controls/utils/validated-input.tsx +2 -0
  351. package/src/components/dataform-controls/utils/validated-number.tsx +2 -0
  352. package/src/components/dataform-layouts/card/index.tsx +2 -0
  353. package/src/components/dataform-layouts/data-form-layout.tsx +18 -4
  354. package/src/components/dataform-layouts/details/index.tsx +1 -1
  355. package/src/components/dataform-layouts/index.tsx +5 -5
  356. package/src/components/dataform-layouts/normalize-form.ts +1 -0
  357. package/src/components/dataform-layouts/panel/dropdown.tsx +97 -96
  358. package/src/components/dataform-layouts/panel/index.tsx +10 -245
  359. package/src/components/dataform-layouts/panel/modal.tsx +24 -22
  360. package/src/components/dataform-layouts/panel/style.scss +109 -27
  361. package/src/components/dataform-layouts/panel/summary-button.tsx +140 -62
  362. package/src/components/dataform-layouts/panel/utils/get-first-validation-error.ts +47 -0
  363. package/src/components/dataform-layouts/panel/utils/get-label-classname.ts +18 -0
  364. package/src/components/dataform-layouts/panel/utils/get-label-content.tsx +26 -0
  365. package/src/components/dataform-layouts/panel/utils/use-field-from-form-field.ts +78 -0
  366. package/src/components/dataform-layouts/regular/index.tsx +8 -3
  367. package/src/components/dataform-layouts/regular/style.scss +10 -0
  368. package/src/components/dataform-layouts/row/index.tsx +5 -2
  369. package/src/components/dataform-layouts/test/normalize-form.ts +5 -0
  370. package/src/components/dataviews-bulk-actions/index.tsx +4 -4
  371. package/src/components/dataviews-context/index.ts +1 -0
  372. package/src/components/dataviews-filters/filter.tsx +2 -2
  373. package/src/components/dataviews-filters/filters.tsx +1 -1
  374. package/src/components/dataviews-filters/search-widget.tsx +10 -2
  375. package/src/components/dataviews-filters/style.scss +8 -0
  376. package/src/components/dataviews-filters/toggle.tsx +1 -1
  377. package/src/components/dataviews-footer/index.tsx +1 -1
  378. package/src/components/dataviews-layouts/activity/activity-item.tsx +4 -4
  379. package/src/components/dataviews-layouts/activity/index.tsx +1 -1
  380. package/src/components/dataviews-layouts/grid/composite-grid.tsx +35 -35
  381. package/src/components/dataviews-layouts/grid/index.tsx +2 -2
  382. package/src/components/dataviews-layouts/grid/style.scss +15 -1
  383. package/src/components/dataviews-layouts/list/index.tsx +7 -8
  384. package/src/components/dataviews-layouts/list/style.scss +1 -0
  385. package/src/components/dataviews-layouts/picker-grid/index.tsx +5 -5
  386. package/src/components/dataviews-layouts/picker-table/index.tsx +1 -1
  387. package/src/components/dataviews-layouts/table/column-primary.tsx +1 -1
  388. package/src/components/dataviews-layouts/table/index.tsx +1 -1
  389. package/src/components/dataviews-layouts/utils/item-click-wrapper.tsx +1 -0
  390. package/src/components/dataviews-pagination/index.tsx +3 -3
  391. package/src/components/dataviews-picker-footer/index.tsx +3 -3
  392. package/src/components/dataviews-view-config/index.tsx +61 -50
  393. package/src/components/dataviews-view-config/properties-section.tsx +1 -1
  394. package/src/components/dataviews-view-config/style.scss +21 -0
  395. package/src/dataform/stories/content.story.tsx +5 -5
  396. package/src/dataform/stories/index.story.tsx +6 -1
  397. package/src/dataform/stories/layout-panel.tsx +19 -2
  398. package/src/dataform/stories/validation.tsx +2 -2
  399. package/src/dataform/test/dataform.tsx +2 -2
  400. package/src/dataviews/index.tsx +7 -4
  401. package/src/dataviews/stories/empty.tsx +1 -1
  402. package/src/dataviews/stories/fixtures.tsx +93 -4
  403. package/src/dataviews/stories/free-composition.tsx +6 -6
  404. package/src/dataviews/stories/index.story.tsx +12 -0
  405. package/src/dataviews/stories/layout-activity.tsx +6 -3
  406. package/src/dataviews/stories/layout-list.tsx +3 -0
  407. package/src/dataviews-picker/index.tsx +4 -4
  408. package/src/dataviews-picker/stories/fixtures.tsx +2 -2
  409. package/src/dataviews-picker/stories/index.story.tsx +1 -1
  410. package/src/field-types/stories/index.story.tsx +99 -5
  411. package/src/hooks/test/use-form-validity.ts +303 -178
  412. package/src/hooks/use-form-validity.ts +85 -36
  413. package/src/style.scss +0 -2
  414. package/src/types/dataform.ts +5 -0
  415. package/src/types/field-api.ts +4 -0
@@ -23,7 +23,7 @@ import type {
23
23
  Field,
24
24
  NormalizedForm,
25
25
  NormalizedFormField,
26
- NormalizedField,
26
+ FieldLayoutProps,
27
27
  } from '../../../types';
28
28
  import { DataFormLayout } from '../data-form-layout';
29
29
  import { DEFAULT_LAYOUT } from '../normalize-form';
@@ -31,6 +31,7 @@ import SummaryButton from './summary-button';
31
31
  import useFormValidity from '../../../hooks/use-form-validity';
32
32
  import useReportValidity from '../../../hooks/use-report-validity';
33
33
  import DataFormContext from '../../dataform-context';
34
+ import useFieldFromFormField from './utils/use-field-from-form-field';
34
35
 
35
36
  function ModalContent< Item >( {
36
37
  data,
@@ -117,13 +118,19 @@ function ModalContent< Item >( {
117
118
  onChange={ handleOnChange }
118
119
  validity={ validity }
119
120
  >
120
- { ( FieldLayout, childField, childFieldValidity ) => (
121
+ { (
122
+ FieldLayout,
123
+ childField,
124
+ childFieldValidity,
125
+ markWhenOptional
126
+ ) => (
121
127
  <FieldLayout
122
128
  key={ childField.id }
123
129
  data={ modalData }
124
130
  field={ childField }
125
131
  onChange={ handleOnChange }
126
132
  hideLabelFromVision={ form.fields.length < 2 }
133
+ markWhenOptional={ markWhenOptional }
127
134
  validity={ childFieldValidity }
128
135
  />
129
136
  ) }
@@ -132,7 +139,7 @@ function ModalContent< Item >( {
132
139
  <Stack
133
140
  direction="row"
134
141
  className="dataforms-layouts-panel__modal-footer"
135
- gap="sm"
142
+ gap="md"
136
143
  >
137
144
  <Spacer style={ { flex: 1 } } />
138
145
  <Button
@@ -158,37 +165,32 @@ function PanelModal< Item >( {
158
165
  data,
159
166
  field,
160
167
  onChange,
161
- labelPosition,
162
- summaryFields,
163
- fieldDefinition,
164
- onClose: onCloseCallback,
165
- touched,
166
- }: {
167
- data: Item;
168
- field: NormalizedFormField;
169
- onChange: ( value: any ) => void;
170
- labelPosition: 'side' | 'top' | 'none';
171
- summaryFields: NormalizedField< Item >[];
172
- fieldDefinition: NormalizedField< Item >;
173
- onClose?: () => void;
174
- touched: boolean;
175
- } ) {
168
+ validity,
169
+ }: FieldLayoutProps< Item > ) {
170
+ const [ touched, setTouched ] = useState( false );
171
+
176
172
  const [ isOpen, setIsOpen ] = useState( false );
177
173
 
178
- const fieldLabel = !! field.children ? field.label : fieldDefinition?.label;
174
+ const { fieldDefinition, fieldLabel, summaryFields } =
175
+ useFieldFromFormField( field );
176
+ if ( ! fieldDefinition ) {
177
+ return null;
178
+ }
179
179
 
180
180
  const handleClose = () => {
181
181
  setIsOpen( false );
182
- onCloseCallback?.();
182
+ setTouched( true );
183
183
  };
184
184
 
185
185
  return (
186
186
  <>
187
187
  <SummaryButton
188
- summaryFields={ summaryFields }
189
188
  data={ data }
190
- labelPosition={ labelPosition }
189
+ field={ field }
191
190
  fieldLabel={ fieldLabel }
191
+ summaryFields={ summaryFields }
192
+ validity={ validity }
193
+ touched={ touched }
192
194
  disabled={ fieldDefinition.readOnly === true }
193
195
  onClick={ () => setIsOpen( true ) }
194
196
  aria-expanded={ isOpen }
@@ -2,28 +2,101 @@
2
2
  @use "@wordpress/base-styles/colors" as *;
3
3
  @use "@wordpress/base-styles/z-index" as *;
4
4
 
5
- .dataforms-layouts-panel__field {
5
+ .dataforms-layouts-panel__field-trigger {
6
+ position: relative;
7
+ color: inherit;
8
+ display: flex;
6
9
  width: 100%;
7
- min-height: $grid-unit-40;
8
- justify-content: flex-start !important;
9
- align-items: flex-start !important;
10
+ min-height: $grid-unit-30;
11
+ cursor: pointer;
12
+ align-items: flex-start;
13
+ border-radius: $radius-small;
14
+ isolation: isolate;
15
+
16
+ &--label-side {
17
+ flex-direction: row;
18
+ gap: var(--wpds-dimension-gap-md);
19
+ }
20
+
21
+ &--label-top {
22
+ display: grid;
23
+ grid-template-columns: 1fr auto;
24
+ }
25
+
26
+ &--label-none {
27
+ align-items: center;
28
+ }
29
+
30
+ &:not(.is-disabled):hover {
31
+ color: var(--wp-admin-theme-color);
32
+
33
+ .dataforms-layouts-panel__field-trigger-icon {
34
+ opacity: 1;
35
+ }
36
+
37
+ .dataforms-layouts-panel__field-label {
38
+ color: var(--wp-admin-theme-color);
39
+ }
40
+ }
41
+
42
+ &.is-disabled {
43
+ cursor: default;
44
+
45
+ .dataforms-layouts-panel__field-control {
46
+ color: $gray-700;
47
+ font-weight: var(--wpds-font-weight-regular);
48
+ }
49
+ }
50
+ }
51
+
52
+ .dataforms-layouts-panel__field-trigger--edit-always
53
+ .dataforms-layouts-panel__field-trigger-icon {
54
+ opacity: 1;
55
+ fill: currentColor;
56
+
57
+ &:hover,
58
+ &:focus-visible {
59
+ fill: var(--wp-admin-theme-color);
60
+ }
61
+ }
62
+
63
+ .dataforms-layouts-panel__field-trigger-icon {
64
+ padding: 0;
65
+ color: var(--wp-admin-theme-color);
66
+ flex: 0 0 auto;
67
+ opacity: 0;
68
+ border-radius: var(--wpds-border-radius-xs);
10
69
 
11
- &--label-position-none {
12
- align-items: center !important;
70
+ &:focus-visible {
71
+ opacity: 1;
72
+ outline:
73
+ var(--wpds-border-width-focus) solid
74
+ var(--wp-admin-theme-color);
75
+ }
76
+ }
77
+
78
+ .dataforms-layouts-panel__field-dropdown-anchor {
79
+ width: 100%;
80
+
81
+ .components-dropdown {
82
+ width: 100%;
13
83
  }
14
84
  }
15
85
 
16
86
  .dataforms-layouts-panel__field-label {
17
87
  width: 38%;
18
88
  flex-shrink: 0;
19
- min-height: $grid-unit-40;
89
+ min-height: $grid-unit-30;
20
90
  display: flex;
21
91
  align-items: center;
22
92
  line-height: $grid-unit-05 * 5;
23
93
  hyphens: auto;
94
+ color: $gray-700;
24
95
 
25
- &--label-position-side {
26
- align-self: center;
96
+ .components-base-control__label {
97
+ display: inline;
98
+ margin-bottom: 0;
99
+ line-height: inherit;
27
100
  }
28
101
 
29
102
  &.has-error {
@@ -32,8 +105,14 @@
32
105
  }
33
106
 
34
107
  .dataforms-layouts-panel__field-label-error-content {
108
+ position: relative;
109
+ z-index: 1;
35
110
  cursor: help;
36
111
  fill: $alert-red;
112
+ display: inline-flex;
113
+ flex-direction: row;
114
+ align-items: center;
115
+ gap: $grid-unit-05;
37
116
  svg {
38
117
  fill: currentColor;
39
118
  }
@@ -41,26 +120,33 @@
41
120
 
42
121
  .dataforms-layouts-panel__field-control {
43
122
  flex-grow: 1;
44
- min-height: $grid-unit-40;
123
+ min-width: 0;
124
+ min-height: $grid-unit-30;
125
+ line-height: var(--wpds-font-line-height-md);
45
126
  display: flex;
46
127
  align-items: center;
128
+ overflow: hidden;
129
+ font-weight: var(--wpds-font-weight-medium);
47
130
 
48
- .components-button {
49
- max-width: 100%;
50
- text-align: left;
51
- white-space: normal;
52
- text-wrap: balance; // Fallback for Safari.
53
- text-wrap: pretty;
54
- min-height: $button-size-compact;
131
+ > * {
132
+ min-width: 0;
55
133
  }
134
+ }
56
135
 
57
- &.components-button.is-link[aria-disabled="true"] {
58
- text-decoration: none;
59
- }
136
+ .dataforms-layouts-panel__field-trigger--label-top
137
+ .dataforms-layouts-panel__field-label {
138
+ width: 100%;
139
+ }
60
140
 
61
- .components-dropdown {
62
- max-width: 100%;
63
- }
141
+ .dataforms-layouts-panel__field-trigger--label-top
142
+ .dataforms-layouts-panel__field-control {
143
+ grid-column: 1 / -1;
144
+ }
145
+
146
+ .dataforms-layouts-panel__field-trigger--label-top
147
+ .dataforms-layouts-panel__field-trigger-icon {
148
+ grid-row: 1;
149
+ grid-column: 2;
64
150
  }
65
151
 
66
152
  .dataforms-layouts-panel__field-dropdown .components-popover__content {
@@ -79,7 +165,3 @@
79
165
  .components-popover.components-dropdown__content.dataforms-layouts-panel__field-dropdown {
80
166
  z-index: z-index(".components-popover.components-dropdown__content.dataforms-layouts-panel__field-dropdown");
81
167
  }
82
-
83
- .dataforms-layouts-panel__summary-button:empty {
84
- min-width: $admin-sidebar-width;
85
- }
@@ -1,92 +1,170 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import clsx from 'clsx';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
4
- import { Button } from '@wordpress/components';
9
+ import { Button, Icon, Tooltip } from '@wordpress/components';
5
10
  import { sprintf, _x } from '@wordpress/i18n';
11
+ import { error as errorIcon, pencil } from '@wordpress/icons';
12
+ import { useInstanceId } from '@wordpress/compose';
13
+ import { useRef } from '@wordpress/element';
6
14
 
7
15
  /**
8
16
  * Internal dependencies
9
17
  */
10
- import type { NormalizedField } from '../../../types';
18
+ import type {
19
+ FieldValidity,
20
+ NormalizedField,
21
+ NormalizedFormField,
22
+ NormalizedPanelLayout,
23
+ } from '../../../types';
24
+ import getLabelClassName from './utils/get-label-classname';
25
+ import getLabelContent from './utils/get-label-content';
26
+ import getFirstValidationError from './utils/get-first-validation-error';
11
27
 
12
- function SummaryButton< Item >( {
13
- summaryFields,
28
+ export default function SummaryButton< Item >( {
14
29
  data,
15
- labelPosition,
30
+ field,
16
31
  fieldLabel,
32
+ summaryFields,
33
+ validity,
34
+ touched,
17
35
  disabled,
18
36
  onClick,
19
37
  'aria-expanded': ariaExpanded,
20
38
  }: {
21
- summaryFields: NormalizedField< Item >[];
22
39
  data: Item;
23
- labelPosition: 'side' | 'top' | 'none';
40
+ field: NormalizedFormField;
24
41
  fieldLabel?: string;
42
+ summaryFields: NormalizedField< Item >[];
43
+ validity?: FieldValidity;
44
+ touched: boolean;
25
45
  disabled?: boolean;
26
46
  onClick: () => void;
27
47
  'aria-expanded'?: boolean;
28
48
  } ) {
29
- return (
30
- <Button
31
- className="dataforms-layouts-panel__summary-button"
32
- size="compact"
33
- variant={
34
- [ 'none', 'top' ].includes( labelPosition )
35
- ? 'link'
36
- : 'tertiary'
37
- }
38
- aria-expanded={ ariaExpanded }
39
- aria-label={ sprintf(
49
+ const { labelPosition, editVisibility } =
50
+ field.layout as NormalizedPanelLayout;
51
+ const errorMessage = getFirstValidationError( validity );
52
+ const showError = touched && !! errorMessage;
53
+ const labelClassName = getLabelClassName( labelPosition, showError );
54
+ const labelContent = getLabelContent( showError, errorMessage, fieldLabel );
55
+ const className = clsx(
56
+ 'dataforms-layouts-panel__field-trigger',
57
+ `dataforms-layouts-panel__field-trigger--label-${ labelPosition }`,
58
+ {
59
+ 'is-disabled': disabled,
60
+ 'dataforms-layouts-panel__field-trigger--edit-always':
61
+ editVisibility === 'always',
62
+ }
63
+ );
64
+
65
+ const controlId = useInstanceId(
66
+ SummaryButton,
67
+ 'dataforms-layouts-panel__field-control'
68
+ );
69
+
70
+ const ariaLabel = showError
71
+ ? sprintf(
72
+ // translators: %s: Field name.
73
+ _x( 'Edit %s (has errors)', 'field' ),
74
+ fieldLabel || ''
75
+ )
76
+ : sprintf(
40
77
  // translators: %s: Field name.
41
78
  _x( 'Edit %s', 'field' ),
42
79
  fieldLabel || ''
80
+ );
81
+
82
+ const rowRef = useRef< HTMLDivElement >( null );
83
+
84
+ const handleRowClick = () => {
85
+ const selection =
86
+ rowRef.current?.ownerDocument.defaultView?.getSelection();
87
+ if ( selection && selection.toString().length > 0 ) {
88
+ return;
89
+ }
90
+ onClick();
91
+ };
92
+
93
+ const handleKeyDown = ( event: React.KeyboardEvent ) => {
94
+ if (
95
+ event.target === event.currentTarget &&
96
+ ( event.key === 'Enter' || event.key === ' ' )
97
+ ) {
98
+ event.preventDefault();
99
+ onClick();
100
+ }
101
+ };
102
+
103
+ return (
104
+ <div
105
+ ref={ rowRef }
106
+ className={ className }
107
+ onClick={ ! disabled ? handleRowClick : undefined }
108
+ onKeyDown={ ! disabled ? handleKeyDown : undefined }
109
+ >
110
+ { labelPosition !== 'none' && (
111
+ <span className={ labelClassName }>{ labelContent }</span>
112
+ ) }
113
+ { labelPosition === 'none' && showError && (
114
+ <Tooltip text={ errorMessage } placement="top">
115
+ <span className="dataforms-layouts-panel__field-label-error-content">
116
+ <Icon icon={ errorIcon } size={ 16 } />
117
+ </span>
118
+ </Tooltip>
43
119
  ) }
44
- onClick={ onClick }
45
- disabled={ disabled }
46
- accessibleWhenDisabled
47
- style={
48
- summaryFields.length > 1
49
- ? {
50
- minHeight: 'auto',
51
- height: 'auto',
120
+ <span
121
+ id={ `${ controlId }` }
122
+ className="dataforms-layouts-panel__field-control"
123
+ >
124
+ { summaryFields.length > 1 ? (
125
+ <span
126
+ style={ {
127
+ display: 'flex',
128
+ flexDirection: 'column',
52
129
  alignItems: 'flex-start',
53
- }
54
- : undefined
55
- }
56
- >
57
- { summaryFields.length > 1 ? (
58
- <div
59
- style={ {
60
- display: 'flex',
61
- flexDirection: 'column',
62
- alignItems: 'flex-start',
63
- width: '100%',
64
- gap: '2px',
65
- } }
66
- >
67
- { summaryFields.map( ( summaryField ) => (
68
- <div
130
+ width: '100%',
131
+ gap: '2px',
132
+ } }
133
+ >
134
+ { summaryFields.map( ( summaryField ) => (
135
+ <span
136
+ key={ summaryField.id }
137
+ style={ { width: '100%' } }
138
+ >
139
+ <summaryField.render
140
+ item={ data }
141
+ field={ summaryField }
142
+ />
143
+ </span>
144
+ ) ) }
145
+ </span>
146
+ ) : (
147
+ summaryFields.map( ( summaryField ) => (
148
+ <summaryField.render
69
149
  key={ summaryField.id }
70
- style={ { width: '100%' } }
71
- >
72
- <summaryField.render
73
- item={ data }
74
- field={ summaryField }
75
- />
76
- </div>
77
- ) ) }
78
- </div>
79
- ) : (
80
- summaryFields.map( ( summaryField ) => (
81
- <summaryField.render
82
- key={ summaryField.id }
83
- item={ data }
84
- field={ summaryField }
85
- />
86
- ) )
150
+ item={ data }
151
+ field={ summaryField }
152
+ />
153
+ ) )
154
+ ) }
155
+ </span>
156
+ { ! disabled && (
157
+ <Button
158
+ className="dataforms-layouts-panel__field-trigger-icon"
159
+ label={ ariaLabel }
160
+ showTooltip={ false }
161
+ icon={ pencil }
162
+ size="small"
163
+ aria-expanded={ ariaExpanded }
164
+ aria-haspopup="dialog"
165
+ aria-describedby={ `${ controlId }` }
166
+ />
87
167
  ) }
88
- </Button>
168
+ </div>
89
169
  );
90
170
  }
91
-
92
- export default SummaryButton;
@@ -0,0 +1,47 @@
1
+ import type { FieldValidity } from '../../../../types';
2
+
3
+ function getFirstValidationError(
4
+ validity: FieldValidity | undefined
5
+ ): string | undefined {
6
+ if ( ! validity ) {
7
+ return undefined;
8
+ }
9
+
10
+ const validityRules = Object.keys( validity ).filter(
11
+ ( key ) => key !== 'children'
12
+ );
13
+
14
+ for ( const key of validityRules ) {
15
+ const rule = validity[ key as keyof Omit< FieldValidity, 'children' > ];
16
+ if ( rule === undefined ) {
17
+ continue;
18
+ }
19
+
20
+ if ( rule.type === 'invalid' ) {
21
+ if ( rule.message ) {
22
+ return rule.message;
23
+ }
24
+
25
+ // Provide default message for required validation (message is optional)
26
+ if ( key === 'required' ) {
27
+ return 'A required field is empty';
28
+ }
29
+
30
+ return 'Unidentified validation error';
31
+ }
32
+ }
33
+
34
+ // Check children recursively
35
+ if ( validity.children ) {
36
+ for ( const childValidity of Object.values( validity.children ) ) {
37
+ const childError = getFirstValidationError( childValidity );
38
+ if ( childError ) {
39
+ return childError;
40
+ }
41
+ }
42
+ }
43
+
44
+ return undefined;
45
+ }
46
+
47
+ export default getFirstValidationError;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import clsx from 'clsx';
5
+ import type { LabelPosition } from '../../../../types';
6
+
7
+ function getLabelClassName(
8
+ labelPosition: LabelPosition,
9
+ showError?: boolean
10
+ ) {
11
+ return clsx(
12
+ 'dataforms-layouts-panel__field-label',
13
+ `dataforms-layouts-panel__field-label--label-position-${ labelPosition }`,
14
+ { 'has-error': showError }
15
+ );
16
+ }
17
+
18
+ export default getLabelClassName;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { BaseControl, Icon, Tooltip } from '@wordpress/components';
5
+ import { error as errorIcon } from '@wordpress/icons';
6
+
7
+ function getLabelContent(
8
+ showError?: boolean,
9
+ errorMessage?: string,
10
+ fieldLabel?: string
11
+ ) {
12
+ return showError ? (
13
+ <Tooltip text={ errorMessage } placement="top">
14
+ <span className="dataforms-layouts-panel__field-label-error-content">
15
+ <Icon icon={ errorIcon } size={ 16 } />
16
+ <BaseControl.VisualLabel>
17
+ { fieldLabel }
18
+ </BaseControl.VisualLabel>
19
+ </span>
20
+ </Tooltip>
21
+ ) : (
22
+ <BaseControl.VisualLabel>{ fieldLabel }</BaseControl.VisualLabel>
23
+ );
24
+ }
25
+
26
+ export default getLabelContent;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useContext } from '@wordpress/element';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type {
10
+ NormalizedFormField,
11
+ NormalizedField,
12
+ NormalizedPanelLayout,
13
+ } from '../../../../types';
14
+ import { getSummaryFields } from '../../get-summary-fields';
15
+ import DataFormContext from '../../../dataform-context';
16
+
17
+ const getFieldDefinition = < Item >(
18
+ field: NormalizedFormField,
19
+ fields: NormalizedField< Item >[]
20
+ ) => {
21
+ const fieldDefinition = fields.find( ( _field ) => _field.id === field.id );
22
+
23
+ if ( ! fieldDefinition ) {
24
+ return fields.find( ( _field ) => {
25
+ if ( !! field.children ) {
26
+ const simpleChildren = field.children.filter(
27
+ ( child ) => ! child.children
28
+ );
29
+
30
+ if ( simpleChildren.length === 0 ) {
31
+ return false;
32
+ }
33
+
34
+ return _field.id === simpleChildren[ 0 ].id;
35
+ }
36
+
37
+ return _field.id === field.id;
38
+ } );
39
+ }
40
+
41
+ return fieldDefinition;
42
+ };
43
+
44
+ /**
45
+ * Determines the field definition and summary fields for a panel layout.
46
+ *
47
+ * Summary fields are determined with the following priority:
48
+ * 1. Use layout.summary fields if they exist
49
+ * 2. Fall back to the field definition that matches the form field's id
50
+ * 3. If the form field id doesn't exist, pick the first child field
51
+ * 4. If no field definition is found, return empty summary fields
52
+ *
53
+ * @param field The form field to get definition for
54
+ * @return Object containing fieldDefinition, fieldLabel, and summaryFields
55
+ */
56
+ function useFieldFromFormField( field: NormalizedFormField ) {
57
+ const { fields } = useContext( DataFormContext );
58
+ const layout = field.layout as NormalizedPanelLayout;
59
+ const summaryFields = getSummaryFields( layout.summary, fields );
60
+ const fieldDefinition = getFieldDefinition( field, fields );
61
+ const fieldLabel = !! field.children ? field.label : fieldDefinition?.label;
62
+
63
+ if ( summaryFields.length === 0 ) {
64
+ return {
65
+ summaryFields: fieldDefinition ? [ fieldDefinition ] : [],
66
+ fieldDefinition,
67
+ fieldLabel,
68
+ };
69
+ }
70
+
71
+ return {
72
+ summaryFields,
73
+ fieldDefinition,
74
+ fieldLabel,
75
+ };
76
+ }
77
+
78
+ export default useFieldFromFormField;