@wordpress/dataviews 8.0.1-next.e256d081a.0 → 9.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 +40 -1
  2. package/README.md +203 -13
  3. package/build/components/dataform-context/index.js +1 -0
  4. package/build/components/dataform-context/index.js.map +1 -1
  5. package/build/components/dataviews/index.js +11 -1
  6. package/build/components/dataviews/index.js.map +1 -1
  7. package/build/components/dataviews-context/index.js +1 -0
  8. package/build/components/dataviews-context/index.js.map +1 -1
  9. package/build/components/dataviews-filters/input-widget.js +48 -4
  10. package/build/components/dataviews-filters/input-widget.js.map +1 -1
  11. package/build/components/dataviews-layout/index.js +5 -2
  12. package/build/components/dataviews-layout/index.js.map +1 -1
  13. package/build/components/dataviews-picker/footer.js +145 -0
  14. package/build/components/dataviews-picker/footer.js.map +1 -0
  15. package/build/components/dataviews-picker/index.js +201 -0
  16. package/build/components/dataviews-picker/index.js.map +1 -0
  17. package/build/components/dataviews-selection-checkbox/index.js +4 -2
  18. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  19. package/build/components/dataviews-view-config/index.js +1 -0
  20. package/build/components/dataviews-view-config/index.js.map +1 -1
  21. package/build/constants.js +4 -1
  22. package/build/constants.js.map +1 -1
  23. package/build/dataform-controls/array.js +9 -7
  24. package/build/dataform-controls/array.js.map +1 -1
  25. package/build/dataform-controls/checkbox.js +40 -8
  26. package/build/dataform-controls/checkbox.js.map +1 -1
  27. package/build/dataform-controls/color.js +133 -0
  28. package/build/dataform-controls/color.js.map +1 -0
  29. package/build/dataform-controls/date.js +32 -24
  30. package/build/dataform-controls/date.js.map +1 -1
  31. package/build/dataform-controls/datetime.js +133 -19
  32. package/build/dataform-controls/datetime.js.map +1 -1
  33. package/build/dataform-controls/email.js +15 -44
  34. package/build/dataform-controls/email.js.map +1 -1
  35. package/build/dataform-controls/index.js +35 -2
  36. package/build/dataform-controls/index.js.map +1 -1
  37. package/build/dataform-controls/integer.js +47 -34
  38. package/build/dataform-controls/integer.js.map +1 -1
  39. package/build/dataform-controls/password.js +47 -0
  40. package/build/dataform-controls/password.js.map +1 -0
  41. package/build/dataform-controls/radio.js +42 -9
  42. package/build/dataform-controls/radio.js.map +1 -1
  43. package/build/dataform-controls/relative-date-control.js +6 -10
  44. package/build/dataform-controls/relative-date-control.js.map +1 -1
  45. package/build/dataform-controls/select.js +41 -10
  46. package/build/dataform-controls/select.js.map +1 -1
  47. package/build/dataform-controls/telephone.js +40 -0
  48. package/build/dataform-controls/telephone.js.map +1 -0
  49. package/build/dataform-controls/text.js +14 -43
  50. package/build/dataform-controls/text.js.map +1 -1
  51. package/build/dataform-controls/textarea.js +81 -0
  52. package/build/dataform-controls/textarea.js.map +1 -0
  53. package/build/dataform-controls/toggle-group.js +36 -6
  54. package/build/dataform-controls/toggle-group.js.map +1 -1
  55. package/build/dataform-controls/toggle.js +77 -0
  56. package/build/dataform-controls/toggle.js.map +1 -0
  57. package/build/dataform-controls/url.js +40 -0
  58. package/build/dataform-controls/url.js.map +1 -0
  59. package/build/dataform-controls/utils/validated-input.js +83 -0
  60. package/build/dataform-controls/utils/validated-input.js.map +1 -0
  61. package/build/dataforms-layouts/card/index.js +6 -7
  62. package/build/dataforms-layouts/card/index.js.map +1 -1
  63. package/build/dataforms-layouts/data-form-layout.js +16 -4
  64. package/build/dataforms-layouts/data-form-layout.js.map +1 -1
  65. package/build/dataforms-layouts/index.js +31 -1
  66. package/build/dataforms-layouts/index.js.map +1 -1
  67. package/build/dataforms-layouts/panel/dropdown.js +10 -14
  68. package/build/dataforms-layouts/panel/dropdown.js.map +1 -1
  69. package/build/dataforms-layouts/panel/index.js +24 -11
  70. package/build/dataforms-layouts/panel/index.js.map +1 -1
  71. package/build/dataforms-layouts/panel/modal.js +22 -27
  72. package/build/dataforms-layouts/panel/modal.js.map +1 -1
  73. package/build/dataforms-layouts/panel/summary-button.js +67 -0
  74. package/build/dataforms-layouts/panel/summary-button.js.map +1 -0
  75. package/build/dataforms-layouts/regular/index.js +7 -9
  76. package/build/dataforms-layouts/regular/index.js.map +1 -1
  77. package/build/dataforms-layouts/row/index.js +113 -0
  78. package/build/dataforms-layouts/row/index.js.map +1 -0
  79. package/build/dataviews-layouts/grid/index.js +21 -26
  80. package/build/dataviews-layouts/grid/index.js.map +1 -1
  81. package/build/dataviews-layouts/index.js +9 -1
  82. package/build/dataviews-layouts/index.js.map +1 -1
  83. package/build/dataviews-layouts/list/index.js +47 -2
  84. package/build/dataviews-layouts/list/index.js.map +1 -1
  85. package/build/dataviews-layouts/picker-grid/index.js +347 -0
  86. package/build/dataviews-layouts/picker-grid/index.js.map +1 -0
  87. package/build/dataviews-layouts/table/index.js +5 -17
  88. package/build/dataviews-layouts/table/index.js.map +1 -1
  89. package/build/dataviews-layouts/utils/get-data-by-group.js +23 -0
  90. package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  91. package/build/dataviews-layouts/utils/grid-items.js +37 -0
  92. package/build/dataviews-layouts/utils/grid-items.js.map +1 -0
  93. package/build/dataviews-layouts/utils/preview-size-picker.js +81 -0
  94. package/build/dataviews-layouts/utils/preview-size-picker.js.map +1 -0
  95. package/build/field-types/boolean.js +1 -1
  96. package/build/field-types/boolean.js.map +1 -1
  97. package/build/field-types/color.js +113 -0
  98. package/build/field-types/color.js.map +1 -0
  99. package/build/field-types/index.js +16 -0
  100. package/build/field-types/index.js.map +1 -1
  101. package/build/field-types/password.js +51 -0
  102. package/build/field-types/password.js.map +1 -0
  103. package/build/field-types/telephone.js +57 -0
  104. package/build/field-types/telephone.js.map +1 -0
  105. package/build/field-types/url.js +57 -0
  106. package/build/field-types/url.js.map +1 -0
  107. package/build/normalize-fields.js +17 -0
  108. package/build/normalize-fields.js.map +1 -1
  109. package/build/normalize-form-fields.js +6 -0
  110. package/build/normalize-form-fields.js.map +1 -1
  111. package/build/types.js.map +1 -1
  112. package/build/validation.js +1 -1
  113. package/build/validation.js.map +1 -1
  114. package/build-module/components/dataform-context/index.js +1 -0
  115. package/build-module/components/dataform-context/index.js.map +1 -1
  116. package/build-module/components/dataviews/index.js +11 -1
  117. package/build-module/components/dataviews/index.js.map +1 -1
  118. package/build-module/components/dataviews-context/index.js +1 -0
  119. package/build-module/components/dataviews-context/index.js.map +1 -1
  120. package/build-module/components/dataviews-filters/input-widget.js +48 -4
  121. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  122. package/build-module/components/dataviews-layout/index.js +5 -2
  123. package/build-module/components/dataviews-layout/index.js.map +1 -1
  124. package/build-module/components/dataviews-picker/footer.js +136 -0
  125. package/build-module/components/dataviews-picker/footer.js.map +1 -0
  126. package/build-module/components/dataviews-picker/index.js +191 -0
  127. package/build-module/components/dataviews-picker/index.js.map +1 -0
  128. package/build-module/components/dataviews-selection-checkbox/index.js +4 -2
  129. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  130. package/build-module/components/dataviews-view-config/index.js +1 -0
  131. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  132. package/build-module/constants.js +3 -0
  133. package/build-module/constants.js.map +1 -1
  134. package/build-module/dataform-controls/array.js +9 -7
  135. package/build-module/dataform-controls/array.js.map +1 -1
  136. package/build-module/dataform-controls/checkbox.js +41 -9
  137. package/build-module/dataform-controls/checkbox.js.map +1 -1
  138. package/build-module/dataform-controls/color.js +126 -0
  139. package/build-module/dataform-controls/color.js.map +1 -0
  140. package/build-module/dataform-controls/date.js +32 -24
  141. package/build-module/dataform-controls/date.js.map +1 -1
  142. package/build-module/dataform-controls/datetime.js +135 -21
  143. package/build-module/dataform-controls/datetime.js.map +1 -1
  144. package/build-module/dataform-controls/email.js +15 -45
  145. package/build-module/dataform-controls/email.js.map +1 -1
  146. package/build-module/dataform-controls/index.js +35 -2
  147. package/build-module/dataform-controls/index.js.map +1 -1
  148. package/build-module/dataform-controls/integer.js +46 -34
  149. package/build-module/dataform-controls/integer.js.map +1 -1
  150. package/build-module/dataform-controls/password.js +38 -0
  151. package/build-module/dataform-controls/password.js.map +1 -0
  152. package/build-module/dataform-controls/radio.js +44 -11
  153. package/build-module/dataform-controls/radio.js.map +1 -1
  154. package/build-module/dataform-controls/relative-date-control.js +6 -10
  155. package/build-module/dataform-controls/relative-date-control.js.map +1 -1
  156. package/build-module/dataform-controls/select.js +43 -12
  157. package/build-module/dataform-controls/select.js.map +1 -1
  158. package/build-module/dataform-controls/telephone.js +33 -0
  159. package/build-module/dataform-controls/telephone.js.map +1 -0
  160. package/build-module/dataform-controls/text.js +14 -44
  161. package/build-module/dataform-controls/text.js.map +1 -1
  162. package/build-module/dataform-controls/textarea.js +74 -0
  163. package/build-module/dataform-controls/textarea.js.map +1 -0
  164. package/build-module/dataform-controls/toggle-group.js +38 -8
  165. package/build-module/dataform-controls/toggle-group.js.map +1 -1
  166. package/build-module/dataform-controls/toggle.js +70 -0
  167. package/build-module/dataform-controls/toggle.js.map +1 -0
  168. package/build-module/dataform-controls/url.js +33 -0
  169. package/build-module/dataform-controls/url.js.map +1 -0
  170. package/build-module/dataform-controls/utils/validated-input.js +76 -0
  171. package/build-module/dataform-controls/utils/validated-input.js.map +1 -0
  172. package/build-module/dataforms-layouts/card/index.js +6 -7
  173. package/build-module/dataforms-layouts/card/index.js.map +1 -1
  174. package/build-module/dataforms-layouts/data-form-layout.js +14 -4
  175. package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
  176. package/build-module/dataforms-layouts/index.js +32 -1
  177. package/build-module/dataforms-layouts/index.js.map +1 -1
  178. package/build-module/dataforms-layouts/panel/dropdown.js +10 -15
  179. package/build-module/dataforms-layouts/panel/dropdown.js.map +1 -1
  180. package/build-module/dataforms-layouts/panel/index.js +24 -11
  181. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  182. package/build-module/dataforms-layouts/panel/modal.js +22 -28
  183. package/build-module/dataforms-layouts/panel/modal.js.map +1 -1
  184. package/build-module/dataforms-layouts/panel/summary-button.js +60 -0
  185. package/build-module/dataforms-layouts/panel/summary-button.js.map +1 -0
  186. package/build-module/dataforms-layouts/regular/index.js +8 -10
  187. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  188. package/build-module/dataforms-layouts/row/index.js +106 -0
  189. package/build-module/dataforms-layouts/row/index.js.map +1 -0
  190. package/build-module/dataviews-layouts/grid/index.js +22 -27
  191. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  192. package/build-module/dataviews-layouts/index.js +10 -2
  193. package/build-module/dataviews-layouts/index.js.map +1 -1
  194. package/build-module/dataviews-layouts/list/index.js +48 -3
  195. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  196. package/build-module/dataviews-layouts/picker-grid/index.js +338 -0
  197. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -0
  198. package/build-module/dataviews-layouts/table/index.js +5 -17
  199. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  200. package/build-module/dataviews-layouts/utils/get-data-by-group.js +17 -0
  201. package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  202. package/build-module/dataviews-layouts/utils/grid-items.js +29 -0
  203. package/build-module/dataviews-layouts/utils/grid-items.js.map +1 -0
  204. package/build-module/dataviews-layouts/utils/preview-size-picker.js +73 -0
  205. package/build-module/dataviews-layouts/utils/preview-size-picker.js.map +1 -0
  206. package/build-module/field-types/boolean.js +1 -1
  207. package/build-module/field-types/boolean.js.map +1 -1
  208. package/build-module/field-types/color.js +107 -0
  209. package/build-module/field-types/color.js.map +1 -0
  210. package/build-module/field-types/index.js +16 -0
  211. package/build-module/field-types/index.js.map +1 -1
  212. package/build-module/field-types/password.js +46 -0
  213. package/build-module/field-types/password.js.map +1 -0
  214. package/build-module/field-types/telephone.js +51 -0
  215. package/build-module/field-types/telephone.js.map +1 -0
  216. package/build-module/field-types/url.js +51 -0
  217. package/build-module/field-types/url.js.map +1 -0
  218. package/build-module/normalize-fields.js +15 -0
  219. package/build-module/normalize-fields.js.map +1 -1
  220. package/build-module/normalize-form-fields.js +6 -0
  221. package/build-module/normalize-form-fields.js.map +1 -1
  222. package/build-module/types.js.map +1 -1
  223. package/build-module/validation.js +1 -1
  224. package/build-module/validation.js.map +1 -1
  225. package/build-style/style-rtl.css +261 -18
  226. package/build-style/style.css +261 -18
  227. package/build-types/components/dataform/stories/index.story.d.ts +21 -17
  228. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  229. package/build-types/components/dataform-context/index.d.ts.map +1 -1
  230. package/build-types/components/dataviews/index.d.ts +1 -1
  231. package/build-types/components/dataviews/index.d.ts.map +1 -1
  232. package/build-types/components/dataviews/stories/fixtures.d.ts +4 -2
  233. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  234. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  235. package/build-types/components/dataviews-context/index.d.ts +1 -0
  236. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  237. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  238. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  239. package/build-types/components/dataviews-picker/footer.d.ts +4 -0
  240. package/build-types/components/dataviews-picker/footer.d.ts.map +1 -0
  241. package/build-types/components/dataviews-picker/index.d.ts +55 -0
  242. package/build-types/components/dataviews-picker/index.d.ts.map +1 -0
  243. package/build-types/components/dataviews-picker/stories/index.story.d.ts +42 -0
  244. package/build-types/components/dataviews-picker/stories/index.story.d.ts.map +1 -0
  245. package/build-types/components/dataviews-selection-checkbox/index.d.ts +2 -1
  246. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  247. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  248. package/build-types/constants.d.ts +1 -0
  249. package/build-types/constants.d.ts.map +1 -1
  250. package/build-types/dataform-controls/array.d.ts.map +1 -1
  251. package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
  252. package/build-types/dataform-controls/color.d.ts +6 -0
  253. package/build-types/dataform-controls/color.d.ts.map +1 -0
  254. package/build-types/dataform-controls/date.d.ts.map +1 -1
  255. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  256. package/build-types/dataform-controls/email.d.ts.map +1 -1
  257. package/build-types/dataform-controls/index.d.ts +1 -1
  258. package/build-types/dataform-controls/index.d.ts.map +1 -1
  259. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  260. package/build-types/dataform-controls/password.d.ts +3 -0
  261. package/build-types/dataform-controls/password.d.ts.map +1 -0
  262. package/build-types/dataform-controls/radio.d.ts.map +1 -1
  263. package/build-types/dataform-controls/relative-date-control.d.ts +6 -5
  264. package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -1
  265. package/build-types/dataform-controls/select.d.ts.map +1 -1
  266. package/build-types/dataform-controls/telephone.d.ts +6 -0
  267. package/build-types/dataform-controls/telephone.d.ts.map +1 -0
  268. package/build-types/dataform-controls/text.d.ts +1 -1
  269. package/build-types/dataform-controls/text.d.ts.map +1 -1
  270. package/build-types/dataform-controls/textarea.d.ts +6 -0
  271. package/build-types/dataform-controls/textarea.d.ts.map +1 -0
  272. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
  273. package/build-types/dataform-controls/toggle.d.ts +6 -0
  274. package/build-types/dataform-controls/toggle.d.ts.map +1 -0
  275. package/build-types/dataform-controls/url.d.ts +6 -0
  276. package/build-types/dataform-controls/url.d.ts.map +1 -0
  277. package/build-types/dataform-controls/utils/validated-input.d.ts +20 -0
  278. package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -0
  279. package/build-types/dataforms-layouts/card/index.d.ts +0 -3
  280. package/build-types/dataforms-layouts/card/index.d.ts.map +1 -1
  281. package/build-types/dataforms-layouts/data-form-layout.d.ts +4 -1
  282. package/build-types/dataforms-layouts/data-form-layout.d.ts.map +1 -1
  283. package/build-types/dataforms-layouts/index.d.ts +10 -0
  284. package/build-types/dataforms-layouts/index.d.ts.map +1 -1
  285. package/build-types/dataforms-layouts/panel/dropdown.d.ts +2 -1
  286. package/build-types/dataforms-layouts/panel/dropdown.d.ts.map +1 -1
  287. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  288. package/build-types/dataforms-layouts/panel/modal.d.ts +2 -1
  289. package/build-types/dataforms-layouts/panel/modal.d.ts.map +1 -1
  290. package/build-types/dataforms-layouts/panel/summary-button.d.ts +15 -0
  291. package/build-types/dataforms-layouts/panel/summary-button.d.ts.map +1 -0
  292. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  293. package/build-types/dataforms-layouts/row/index.d.ts +6 -0
  294. package/build-types/dataforms-layouts/row/index.d.ts.map +1 -0
  295. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  296. package/build-types/dataviews-layouts/index.d.ts +12 -1
  297. package/build-types/dataviews-layouts/index.d.ts.map +1 -1
  298. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  299. package/build-types/dataviews-layouts/picker-grid/index.d.ts +4 -0
  300. package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -0
  301. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  302. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts +6 -0
  303. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts.map +1 -0
  304. package/build-types/dataviews-layouts/utils/grid-items.d.ts +5 -0
  305. package/build-types/dataviews-layouts/utils/grid-items.d.ts.map +1 -0
  306. package/build-types/dataviews-layouts/utils/preview-size-picker.d.ts +2 -0
  307. package/build-types/dataviews-layouts/utils/preview-size-picker.d.ts.map +1 -0
  308. package/build-types/field-types/color.d.ts +20 -0
  309. package/build-types/field-types/color.d.ts.map +1 -0
  310. package/build-types/field-types/index.d.ts.map +1 -1
  311. package/build-types/field-types/password.d.ts +17 -0
  312. package/build-types/field-types/password.d.ts.map +1 -0
  313. package/build-types/field-types/stories/index.story.d.ts +85 -0
  314. package/build-types/field-types/stories/index.story.d.ts.map +1 -0
  315. package/build-types/field-types/telephone.d.ts +20 -0
  316. package/build-types/field-types/telephone.d.ts.map +1 -0
  317. package/build-types/field-types/url.d.ts +20 -0
  318. package/build-types/field-types/url.d.ts.map +1 -0
  319. package/build-types/normalize-fields.d.ts +3 -0
  320. package/build-types/normalize-fields.d.ts.map +1 -1
  321. package/build-types/normalize-form-fields.d.ts.map +1 -1
  322. package/build-types/test/dataviews-picker.d.ts +2 -0
  323. package/build-types/test/dataviews-picker.d.ts.map +1 -0
  324. package/build-types/types.d.ts +102 -8
  325. package/build-types/types.d.ts.map +1 -1
  326. package/build-types/validation.d.ts.map +1 -1
  327. package/build-wp/index.js +6380 -5012
  328. package/package.json +17 -15
  329. package/src/components/dataform/stories/index.story.tsx +822 -28
  330. package/src/components/dataform-context/index.tsx +1 -0
  331. package/src/components/dataviews/index.tsx +25 -1
  332. package/src/components/dataviews/stories/fixtures.tsx +100 -42
  333. package/src/components/dataviews/stories/index.story.tsx +16 -2
  334. package/src/components/dataviews/style.scss +4 -2
  335. package/src/components/dataviews-context/index.ts +3 -0
  336. package/src/components/dataviews-filters/input-widget.tsx +44 -5
  337. package/src/components/dataviews-layout/index.tsx +5 -3
  338. package/src/components/dataviews-picker/footer.tsx +207 -0
  339. package/src/components/dataviews-picker/index.tsx +284 -0
  340. package/src/components/dataviews-picker/stories/index.story.tsx +251 -0
  341. package/src/components/dataviews-picker/style.scss +10 -0
  342. package/src/components/dataviews-selection-checkbox/index.tsx +3 -0
  343. package/src/components/dataviews-view-config/index.tsx +1 -0
  344. package/src/constants.ts +3 -0
  345. package/src/dataform-controls/array.tsx +4 -6
  346. package/src/dataform-controls/checkbox.tsx +54 -7
  347. package/src/dataform-controls/color.tsx +148 -0
  348. package/src/dataform-controls/date.tsx +47 -21
  349. package/src/dataform-controls/datetime.tsx +171 -23
  350. package/src/dataform-controls/email.tsx +18 -52
  351. package/src/dataform-controls/index.tsx +38 -2
  352. package/src/dataform-controls/integer.tsx +82 -49
  353. package/src/dataform-controls/password.tsx +50 -0
  354. package/src/dataform-controls/radio.tsx +53 -11
  355. package/src/dataform-controls/relative-date-control.tsx +11 -10
  356. package/src/dataform-controls/select.tsx +53 -10
  357. package/src/dataform-controls/telephone.tsx +38 -0
  358. package/src/dataform-controls/text.tsx +12 -50
  359. package/src/dataform-controls/textarea.tsx +85 -0
  360. package/src/dataform-controls/toggle-group.tsx +50 -10
  361. package/src/dataform-controls/toggle.tsx +79 -0
  362. package/src/dataform-controls/url.tsx +38 -0
  363. package/src/dataform-controls/utils/validated-input.tsx +109 -0
  364. package/src/dataforms-layouts/card/index.tsx +5 -4
  365. package/src/dataforms-layouts/card/style.scss +7 -0
  366. package/src/dataforms-layouts/data-form-layout.tsx +15 -3
  367. package/src/dataforms-layouts/index.tsx +35 -0
  368. package/src/dataforms-layouts/panel/dropdown.tsx +12 -23
  369. package/src/dataforms-layouts/panel/index.tsx +39 -16
  370. package/src/dataforms-layouts/panel/modal.tsx +24 -30
  371. package/src/dataforms-layouts/panel/summary-button.tsx +92 -0
  372. package/src/dataforms-layouts/regular/index.tsx +9 -7
  373. package/src/dataforms-layouts/regular/style.scss +0 -6
  374. package/src/dataforms-layouts/row/index.tsx +115 -0
  375. package/src/dataforms-layouts/row/style.scss +3 -0
  376. package/src/dataviews-layouts/grid/index.tsx +47 -47
  377. package/src/dataviews-layouts/grid/style.scss +43 -20
  378. package/src/dataviews-layouts/index.ts +16 -2
  379. package/src/dataviews-layouts/list/index.tsx +74 -2
  380. package/src/dataviews-layouts/list/style.scss +8 -0
  381. package/src/dataviews-layouts/picker-grid/index.tsx +486 -0
  382. package/src/dataviews-layouts/picker-grid/style.scss +171 -0
  383. package/src/dataviews-layouts/table/index.tsx +10 -14
  384. package/src/dataviews-layouts/utils/get-data-by-group.ts +18 -0
  385. package/src/dataviews-layouts/utils/grid-items.scss +21 -0
  386. package/src/dataviews-layouts/utils/grid-items.tsx +35 -0
  387. package/src/dataviews-layouts/utils/preview-size-picker.tsx +87 -0
  388. package/src/field-types/boolean.tsx +1 -1
  389. package/src/field-types/color.tsx +115 -0
  390. package/src/field-types/index.tsx +20 -0
  391. package/src/field-types/password.tsx +46 -0
  392. package/src/field-types/stories/index.story.tsx +856 -0
  393. package/src/field-types/telephone.tsx +71 -0
  394. package/src/field-types/url.tsx +71 -0
  395. package/src/normalize-fields.ts +18 -0
  396. package/src/normalize-form-fields.ts +6 -0
  397. package/src/style.scss +4 -0
  398. package/src/test/dataform.tsx +2 -2
  399. package/src/test/dataviews-picker.tsx +478 -0
  400. package/src/test/dataviews.tsx +86 -0
  401. package/src/test/filter-and-sort-data-view.js +148 -138
  402. package/src/test/normalize-fields.ts +114 -0
  403. package/src/types.ts +130 -7
  404. package/src/validation.ts +5 -0
  405. package/tsconfig.tsbuildinfo +1 -1
  406. package/build/dataform-controls/boolean.js +0 -64
  407. package/build/dataform-controls/boolean.js.map +0 -1
  408. package/build-module/dataform-controls/boolean.js +0 -58
  409. package/build-module/dataform-controls/boolean.js.map +0 -1
  410. package/build-types/components/stories/index.story.d.ts +0 -63
  411. package/build-types/components/stories/index.story.d.ts.map +0 -1
  412. package/build-types/dataform-controls/boolean.d.ts +0 -6
  413. package/build-types/dataform-controls/boolean.d.ts.map +0 -1
  414. package/src/components/stories/index.story.tsx +0 -372
  415. package/src/dataform-controls/boolean.tsx +0 -61
@@ -0,0 +1,478 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen, within } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+ import { useMemo, useState } from '@wordpress/element';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import DataViewsPicker from '../components/dataviews-picker';
16
+ import { LAYOUT_PICKER_GRID } from '../constants';
17
+ import type { ActionButton, View, ViewPickerGrid } from '../types';
18
+ import { filterSortAndPaginate } from '../filter-and-sort-data-view';
19
+
20
+ type Data = {
21
+ id: number;
22
+ title: string;
23
+ author?: number;
24
+ order?: number;
25
+ };
26
+
27
+ const onChangeSelection = jest.fn();
28
+
29
+ const data: Data[] = [
30
+ {
31
+ id: 1,
32
+ title: 'Hello World',
33
+ author: 1,
34
+ order: 1,
35
+ },
36
+ {
37
+ id: 2,
38
+ title: 'Homepage',
39
+ author: 2,
40
+ order: 1,
41
+ },
42
+ {
43
+ id: 3,
44
+ title: 'Posts',
45
+ author: 2,
46
+ order: 1,
47
+ },
48
+ ];
49
+
50
+ const singleSelectCallback = jest.fn();
51
+ const singleSelectActions: ActionButton< Data >[] = [
52
+ {
53
+ id: 'confirm',
54
+ label: 'Confirm',
55
+ supportsBulk: false,
56
+ isPrimary: true,
57
+ callback: singleSelectCallback,
58
+ },
59
+ ];
60
+
61
+ const multiSelectCallback = jest.fn();
62
+ const multiSelectActions: ActionButton< Data >[] = [
63
+ {
64
+ id: 'confirm',
65
+ label: 'Confirm',
66
+ supportsBulk: true,
67
+ isPrimary: true,
68
+ icon: 'check',
69
+ callback: multiSelectCallback,
70
+ },
71
+ ];
72
+
73
+ function Picker( {
74
+ view: additionalView,
75
+ actions,
76
+ label,
77
+ multiselect,
78
+ ...props
79
+ }: {
80
+ actions?: ActionButton< Data >[];
81
+ view?: Partial< View >;
82
+ label?: string;
83
+ multiselect?: boolean;
84
+ } ) {
85
+ const [ view, setView ] = useState< View >( {
86
+ type: LAYOUT_PICKER_GRID,
87
+ fields: [],
88
+ titleField: 'title',
89
+ mediaField: 'image',
90
+ search: '',
91
+ page: 1,
92
+ perPage: 10,
93
+ filters: [],
94
+ ...additionalView,
95
+ } as ViewPickerGrid );
96
+
97
+ const [ selection, setSelection ] = useState< string[] >( [] );
98
+
99
+ const { data: shownData, paginationInfo } = useMemo( () => {
100
+ return filterSortAndPaginate( data, view, [] );
101
+ }, [ view ] );
102
+
103
+ const dataViewProps = {
104
+ actions,
105
+ picker: true,
106
+ getItemId: ( item: Data ) => item.id.toString(),
107
+ paginationInfo,
108
+ data: shownData,
109
+ view,
110
+ defaultLayouts: { [ LAYOUT_PICKER_GRID ]: {} },
111
+ fields: [],
112
+ onChangeView: setView,
113
+ multiselect,
114
+ selection,
115
+ itemListLabel: label,
116
+ onChangeSelection: ( newSelection: string[] ) => {
117
+ onChangeSelection( newSelection );
118
+ setSelection( newSelection );
119
+ },
120
+ ...props,
121
+ };
122
+
123
+ return <DataViewsPicker { ...dataViewProps } />;
124
+ }
125
+ describe( 'DataViews Picker', () => {
126
+ describe( 'Grid layout', () => {
127
+ it( 'renders the grid as a `listbox` role, with items as `option` roles', () => {
128
+ render( <Picker /> );
129
+
130
+ // Grid should have listbox role
131
+ expect( screen.getByRole( 'listbox' ) ).toBeInTheDocument();
132
+
133
+ // Each data item should have option role
134
+ const options = screen.getAllByRole( 'option' );
135
+ expect( options ).toHaveLength( data.length );
136
+ } );
137
+
138
+ it( 'supports specifying a `label` which is rendered as an aria-label', () => {
139
+ const testLabel = 'Select an item from the grid';
140
+ render( <Picker label={ testLabel } /> );
141
+
142
+ // Grid should have the specified aria-label
143
+ expect(
144
+ screen.getByRole( 'listbox', { name: testLabel } )
145
+ ).toBeInTheDocument();
146
+ } );
147
+
148
+ it( 'implements single tab-stop composite pattern with aria-activedescendant', async () => {
149
+ render( <Picker /> );
150
+
151
+ // Grid should be tabbable as the main composite widget
152
+ const grid = screen.getByRole( 'listbox' );
153
+ expect( grid ).toHaveAttribute( 'tabindex', '0' );
154
+
155
+ // Individual options exist but are managed by composite pattern
156
+ const options = screen.getAllByRole( 'option' );
157
+ expect( options.length ).toBeGreaterThan( 0 );
158
+
159
+ const user = userEvent.setup();
160
+
161
+ const viewOptionsButton = screen.getByRole( 'button', {
162
+ name: 'View options',
163
+ } );
164
+
165
+ // Focus the viewOptions button, which is just before the grid.
166
+ viewOptionsButton.focus();
167
+ expect( viewOptionsButton ).toHaveFocus();
168
+
169
+ // Tab to the grid (single tab-stop for the entire grid)
170
+ await user.keyboard( '{Tab}' );
171
+ expect( grid ).toHaveFocus();
172
+
173
+ // Test aria-activedescendant behavior
174
+ // Trigger navigation to establish aria-activedescendant
175
+ await user.keyboard( '{ArrowRight}' );
176
+ await user.keyboard( '{ArrowLeft}' );
177
+ const firstActiveDescendant = grid.getAttribute(
178
+ 'aria-activedescendant'
179
+ );
180
+
181
+ expect( firstActiveDescendant ).toBeTruthy();
182
+ expect( firstActiveDescendant ).toBe( options[ 0 ].id );
183
+
184
+ // Navigate with arrow keys to test aria-activedescendant changes
185
+ await user.keyboard( '{ArrowRight}' );
186
+ expect( grid ).toHaveFocus();
187
+
188
+ // Check that aria-activedescendant changed after navigation
189
+ const secondActiveDescendant = grid.getAttribute(
190
+ 'aria-activedescendant'
191
+ );
192
+ expect( secondActiveDescendant ).toBeTruthy();
193
+ expect( secondActiveDescendant ).toBe( options[ 1 ].id );
194
+ expect( secondActiveDescendant ).not.toBe( firstActiveDescendant );
195
+
196
+ // Navigate to third option
197
+ await user.keyboard( '{ArrowRight}' );
198
+ expect( grid ).toHaveFocus();
199
+
200
+ const thirdActiveDescendant = grid.getAttribute(
201
+ 'aria-activedescendant'
202
+ );
203
+ expect( thirdActiveDescendant ).toBeTruthy();
204
+ expect( thirdActiveDescendant ).toBe( options[ 2 ].id );
205
+ expect( thirdActiveDescendant ).not.toBe( firstActiveDescendant );
206
+ expect( thirdActiveDescendant ).not.toBe( secondActiveDescendant );
207
+
208
+ // Navigate back to first option
209
+ await user.keyboard( '{ArrowLeft}' );
210
+ expect( grid ).toHaveFocus();
211
+
212
+ await user.keyboard( '{ArrowLeft}' );
213
+ expect( grid ).toHaveFocus();
214
+
215
+ // Verify aria-activedescendant is back to first option
216
+ const backToFirstActiveDescendant = grid.getAttribute(
217
+ 'aria-activedescendant'
218
+ );
219
+ expect( backToFirstActiveDescendant ).toBe( firstActiveDescendant );
220
+ expect( backToFirstActiveDescendant ).toBe( options[ 0 ].id );
221
+
222
+ // Tab should move focus away from the grid entirely
223
+ await user.keyboard( '{Tab}' );
224
+ expect( grid ).not.toHaveFocus();
225
+
226
+ // Shift+Tab should move back to the grid
227
+ await user.keyboard( '{Shift>}{Tab}{/Shift}' );
228
+ expect( grid ).toHaveFocus();
229
+
230
+ // aria-activedescendant should be maintained when returning to grid
231
+ expect( grid.getAttribute( 'aria-activedescendant' ) ).toBeTruthy();
232
+ } );
233
+
234
+ describe( 'Single selection', () => {
235
+ it( 'maintains only a single selected item and calls the `onChangeSelection` callback when the selection changes', async () => {
236
+ render( <Picker actions={ singleSelectActions } /> );
237
+
238
+ const user = userEvent.setup();
239
+ const listbox = screen.getByRole( 'listbox' );
240
+ const options = within( listbox ).getAllByRole( 'option' );
241
+
242
+ // Click first item
243
+ await user.click( options[ 0 ] );
244
+ expect( options[ 0 ] ).toHaveAttribute(
245
+ 'aria-selected',
246
+ 'true'
247
+ );
248
+ expect( options[ 1 ] ).toHaveAttribute(
249
+ 'aria-selected',
250
+ 'false'
251
+ );
252
+ expect( options[ 2 ] ).toHaveAttribute(
253
+ 'aria-selected',
254
+ 'false'
255
+ );
256
+ expect( onChangeSelection ).toHaveBeenCalledWith( [
257
+ data[ 0 ].id.toString(),
258
+ ] );
259
+
260
+ // Click second item - should deselect first
261
+ await user.click( options[ 1 ] );
262
+ expect( options[ 0 ] ).toHaveAttribute(
263
+ 'aria-selected',
264
+ 'false'
265
+ );
266
+ expect( options[ 1 ] ).toHaveAttribute(
267
+ 'aria-selected',
268
+ 'true'
269
+ );
270
+ expect( options[ 2 ] ).toHaveAttribute(
271
+ 'aria-selected',
272
+ 'false'
273
+ );
274
+ expect( onChangeSelection ).toHaveBeenCalledWith( [
275
+ data[ 1 ].id.toString(),
276
+ ] );
277
+ } );
278
+
279
+ it( 'calls the action callback when the action button is clicked', async () => {
280
+ render( <Picker actions={ singleSelectActions } /> );
281
+
282
+ const user = userEvent.setup();
283
+ const options = screen.getAllByRole( 'option' );
284
+
285
+ // Select first item
286
+ await user.click( options[ 0 ] );
287
+ expect( options[ 0 ] ).toHaveAttribute(
288
+ 'aria-selected',
289
+ 'true'
290
+ );
291
+
292
+ // Find the action button with correct label within the action buttons container
293
+ const confirmButton = screen.getByRole( 'button', {
294
+ name: 'Confirm',
295
+ } );
296
+ expect( confirmButton ).toBeInTheDocument();
297
+
298
+ // Clear any previous calls and click the action button
299
+ singleSelectCallback.mockClear();
300
+ await user.click( confirmButton );
301
+
302
+ // Verify the callback was called with correct parameters
303
+ expect( singleSelectCallback ).toHaveBeenCalledTimes( 1 );
304
+ } );
305
+ } );
306
+
307
+ describe( 'Multi selection', () => {
308
+ it( 'adds the `aria-multiselectable` attribute to the listbox', () => {
309
+ render( <Picker actions={ multiSelectActions } /> );
310
+
311
+ const listbox = screen.getByRole( 'listbox' );
312
+ expect( listbox ).toHaveAttribute(
313
+ 'aria-multiselectable',
314
+ 'true'
315
+ );
316
+ } );
317
+
318
+ it( 'supports multiple selected items and calls the `onChangeSelection` callback when the selection changes', async () => {
319
+ // Test multi-selection by clicking multiple items
320
+ render( <Picker actions={ multiSelectActions } /> );
321
+
322
+ const user = userEvent.setup();
323
+ const listbox = screen.getByRole( 'listbox' );
324
+ const options = within( listbox ).getAllByRole( 'option' );
325
+
326
+ // Click first item
327
+ await user.click( options[ 0 ] );
328
+ expect( options[ 0 ] ).toHaveAttribute(
329
+ 'aria-selected',
330
+ 'true'
331
+ );
332
+ expect( options[ 1 ] ).toHaveAttribute(
333
+ 'aria-selected',
334
+ 'false'
335
+ );
336
+ expect( onChangeSelection ).toHaveBeenCalledWith( [
337
+ data[ 0 ].id.toString(),
338
+ ] );
339
+
340
+ // Click second item - both should remain selected in multi-select mode
341
+ await user.click( options[ 1 ] );
342
+ expect( options[ 0 ] ).toHaveAttribute(
343
+ 'aria-selected',
344
+ 'true'
345
+ );
346
+ expect( options[ 1 ] ).toHaveAttribute(
347
+ 'aria-selected',
348
+ 'true'
349
+ );
350
+ expect( onChangeSelection ).toHaveBeenCalledWith( [
351
+ data[ 0 ].id.toString(),
352
+ data[ 1 ].id.toString(),
353
+ ] );
354
+
355
+ // Click first item again to deselect it
356
+ await user.click( options[ 0 ] );
357
+ expect( options[ 0 ] ).toHaveAttribute(
358
+ 'aria-selected',
359
+ 'false'
360
+ );
361
+ expect( options[ 1 ] ).toHaveAttribute(
362
+ 'aria-selected',
363
+ 'true'
364
+ );
365
+ expect( onChangeSelection ).toHaveBeenCalledWith( [
366
+ data[ 1 ].id.toString(),
367
+ ] );
368
+ } );
369
+
370
+ it( 'calls the action callback when the action button is clicked', async () => {
371
+ render( <Picker actions={ multiSelectActions } /> );
372
+
373
+ const user = userEvent.setup();
374
+ const options = screen.getAllByRole( 'option' );
375
+
376
+ // Select multiple items
377
+ await user.click( options[ 0 ] );
378
+ await user.click( options[ 1 ] );
379
+
380
+ expect( options[ 0 ] ).toHaveAttribute(
381
+ 'aria-selected',
382
+ 'true'
383
+ );
384
+ expect( options[ 1 ] ).toHaveAttribute(
385
+ 'aria-selected',
386
+ 'true'
387
+ );
388
+
389
+ // Third item should remain unselected
390
+ expect( options[ 2 ] ).toHaveAttribute(
391
+ 'aria-selected',
392
+ 'false'
393
+ );
394
+
395
+ // Find the action button with correct label within the action buttons container
396
+ const confirmButton = screen.getByRole( 'button', {
397
+ name: 'Confirm',
398
+ } );
399
+ expect( confirmButton ).toBeInTheDocument();
400
+
401
+ // Clear any previous calls and click the action button
402
+ multiSelectCallback.mockClear();
403
+ await user.click( confirmButton );
404
+
405
+ // Verify the callback was called with correct parameters for multi-selection
406
+ expect( multiSelectCallback ).toHaveBeenCalledTimes( 1 );
407
+ } );
408
+
409
+ it( 'maintains the selected items when navigating between pages for a paginated view', async () => {
410
+ // Create a component with pagination (2 items per page)
411
+ render(
412
+ <Picker
413
+ actions={ multiSelectActions }
414
+ view={ {
415
+ type: LAYOUT_PICKER_GRID,
416
+ fields: [],
417
+ titleField: 'title',
418
+ mediaField: 'image',
419
+ search: '',
420
+ page: 1,
421
+ perPage: 2, // Only 2 items per page to force pagination
422
+ filters: [],
423
+ } }
424
+ />
425
+ );
426
+
427
+ const user = userEvent.setup();
428
+ const listbox = screen.getByRole( 'listbox' );
429
+
430
+ // Page 1: Select first item
431
+ let options = within( listbox ).getAllByRole( 'option' );
432
+ expect( options ).toHaveLength( 2 ); // Should show 2 items per page
433
+
434
+ await user.click( options[ 0 ] );
435
+ expect( options[ 0 ] ).toHaveAttribute(
436
+ 'aria-selected',
437
+ 'true'
438
+ );
439
+ expect( onChangeSelection ).toHaveBeenCalledWith( [
440
+ data[ 0 ].id.toString(),
441
+ ] );
442
+
443
+ // Navigate to page 2
444
+ const nextButton = screen.getByRole( 'button', {
445
+ name: /next/i,
446
+ } );
447
+ await user.click( nextButton );
448
+
449
+ // Page 2: Select another item
450
+ options = within( listbox ).getAllByRole( 'option' );
451
+ expect( options ).toHaveLength( 1 ); // Page 2 should have 1 item (item 3)
452
+
453
+ await user.click( options[ 0 ] );
454
+ expect( options[ 0 ] ).toHaveAttribute(
455
+ 'aria-selected',
456
+ 'true'
457
+ );
458
+ expect( onChangeSelection ).toHaveBeenCalledWith( [
459
+ data[ 0 ].id.toString(),
460
+ data[ 2 ].id.toString(),
461
+ ] );
462
+
463
+ // Go back to page 1
464
+ const prevButton = screen.getByRole( 'button', {
465
+ name: /previous/i,
466
+ } );
467
+ await user.click( prevButton );
468
+
469
+ // Verify first item is still selected
470
+ options = within( listbox ).getAllByRole( 'option' );
471
+ expect( options[ 0 ] ).toHaveAttribute(
472
+ 'aria-selected',
473
+ 'true'
474
+ );
475
+ } );
476
+ } );
477
+ } );
478
+ } );
@@ -510,6 +510,92 @@ describe( 'DataViews component', () => {
510
510
  await user.keyboard( '{/Control}' );
511
511
  } );
512
512
 
513
+ it( 'supports tabbing to selection and actions when title is visible', async () => {
514
+ render(
515
+ <DataViewWrapper
516
+ view={ {
517
+ ...DEFAULT_VIEW,
518
+ type: 'grid',
519
+ fields: [],
520
+ mediaField: 'image',
521
+ titleField: 'title',
522
+ } }
523
+ isItemClickable={ () => true }
524
+ actions={ actions }
525
+ />
526
+ );
527
+
528
+ // Double check that the title is being rendered.
529
+ expect( screen.getByText( data[ 0 ].title ) ).toBeInTheDocument();
530
+
531
+ const viewOptionsButton = screen.getByRole( 'button', {
532
+ name: 'View options',
533
+ } );
534
+
535
+ const user = userEvent.setup();
536
+
537
+ // Double click to open and then close view options. This is performed
538
+ // instead of a direct .focus() so that effects have time to complete.
539
+ await user.click( viewOptionsButton );
540
+ await user.click( viewOptionsButton );
541
+
542
+ await user.tab();
543
+
544
+ expect(
545
+ screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
546
+ ).toHaveFocus();
547
+
548
+ await user.tab();
549
+
550
+ expect(
551
+ screen.getAllByRole( 'button', { name: 'Actions' } )[ 0 ]
552
+ ).toHaveFocus();
553
+ } );
554
+
555
+ it( 'supports tabbing to selection and actions when title is not visible', async () => {
556
+ render(
557
+ <DataViewWrapper
558
+ view={ {
559
+ ...DEFAULT_VIEW,
560
+ type: 'grid',
561
+ fields: [],
562
+ mediaField: 'image',
563
+ titleField: 'title',
564
+ showTitle: false,
565
+ } }
566
+ isItemClickable={ () => true }
567
+ actions={ actions }
568
+ />
569
+ );
570
+
571
+ // Double check that the title is not being rendered.
572
+ expect(
573
+ screen.queryByText( data[ 0 ].title )
574
+ ).not.toBeInTheDocument();
575
+
576
+ const viewOptionsButton = screen.getByRole( 'button', {
577
+ name: 'View options',
578
+ } );
579
+
580
+ const user = userEvent.setup();
581
+
582
+ // Double click to open and then close view options. This is performed
583
+ // instead of a direct .focus() so that effects have time to complete.
584
+ await user.click( viewOptionsButton );
585
+ await user.click( viewOptionsButton );
586
+ await user.tab();
587
+
588
+ expect(
589
+ screen.getByRole( 'checkbox', { name: data[ 0 ].title } )
590
+ ).toHaveFocus();
591
+
592
+ await user.tab();
593
+
594
+ expect(
595
+ screen.getAllByRole( 'button', { name: 'Actions' } )[ 0 ]
596
+ ).toHaveFocus();
597
+ } );
598
+
513
599
  it( 'accepts an invalid previewSize and the preview size picker falls back to another size', async () => {
514
600
  render(
515
601
  <DataViewWrapper