@wordpress/dataviews 8.0.1-next.e256d081a.0 → 9.0.1-next.6870dfe5b.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 (269) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/README.md +96 -1
  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-layout/index.js +2 -1
  10. package/build/components/dataviews-layout/index.js.map +1 -1
  11. package/build/components/dataviews-picker/footer.js +145 -0
  12. package/build/components/dataviews-picker/footer.js.map +1 -0
  13. package/build/components/dataviews-picker/index.js +201 -0
  14. package/build/components/dataviews-picker/index.js.map +1 -0
  15. package/build/components/dataviews-selection-checkbox/index.js +4 -2
  16. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  17. package/build/components/dataviews-view-config/index.js +1 -0
  18. package/build/components/dataviews-view-config/index.js.map +1 -1
  19. package/build/constants.js +4 -1
  20. package/build/constants.js.map +1 -1
  21. package/build/dataform-controls/checkbox.js +23 -2
  22. package/build/dataform-controls/checkbox.js.map +1 -1
  23. package/build/dataform-controls/color.js +128 -0
  24. package/build/dataform-controls/color.js.map +1 -0
  25. package/build/dataform-controls/email.js +10 -45
  26. package/build/dataform-controls/email.js.map +1 -1
  27. package/build/dataform-controls/index.js +8 -2
  28. package/build/dataform-controls/index.js.map +1 -1
  29. package/build/dataform-controls/telephone.js +34 -0
  30. package/build/dataform-controls/telephone.js.map +1 -0
  31. package/build/dataform-controls/text.js +7 -48
  32. package/build/dataform-controls/text.js.map +1 -1
  33. package/build/dataform-controls/{boolean.js → toggle.js} +6 -4
  34. package/build/dataform-controls/toggle.js.map +1 -0
  35. package/build/dataform-controls/url.js +34 -0
  36. package/build/dataform-controls/url.js.map +1 -0
  37. package/build/dataform-controls/utils/validated-text.js +76 -0
  38. package/build/dataform-controls/utils/validated-text.js.map +1 -0
  39. package/build/dataforms-layouts/card/index.js +6 -7
  40. package/build/dataforms-layouts/card/index.js.map +1 -1
  41. package/build/dataforms-layouts/data-form-layout.js +16 -4
  42. package/build/dataforms-layouts/data-form-layout.js.map +1 -1
  43. package/build/dataforms-layouts/index.js +31 -1
  44. package/build/dataforms-layouts/index.js.map +1 -1
  45. package/build/dataforms-layouts/row/index.js +113 -0
  46. package/build/dataforms-layouts/row/index.js.map +1 -0
  47. package/build/dataviews-layouts/grid/index.js +16 -11
  48. package/build/dataviews-layouts/grid/index.js.map +1 -1
  49. package/build/dataviews-layouts/index.js +9 -1
  50. package/build/dataviews-layouts/index.js.map +1 -1
  51. package/build/dataviews-layouts/picker-grid/index.js +357 -0
  52. package/build/dataviews-layouts/picker-grid/index.js.map +1 -0
  53. package/build/dataviews-layouts/utils/grid-items.js +37 -0
  54. package/build/dataviews-layouts/utils/grid-items.js.map +1 -0
  55. package/build/dataviews-layouts/utils/preview-size-picker.js +81 -0
  56. package/build/dataviews-layouts/utils/preview-size-picker.js.map +1 -0
  57. package/build/field-types/boolean.js +1 -1
  58. package/build/field-types/boolean.js.map +1 -1
  59. package/build/field-types/color.js +113 -0
  60. package/build/field-types/color.js.map +1 -0
  61. package/build/field-types/index.js +12 -0
  62. package/build/field-types/index.js.map +1 -1
  63. package/build/field-types/telephone.js +57 -0
  64. package/build/field-types/telephone.js.map +1 -0
  65. package/build/field-types/url.js +57 -0
  66. package/build/field-types/url.js.map +1 -0
  67. package/build/normalize-form-fields.js +6 -0
  68. package/build/normalize-form-fields.js.map +1 -1
  69. package/build/types.js.map +1 -1
  70. package/build/validation.js +1 -1
  71. package/build/validation.js.map +1 -1
  72. package/build-module/components/dataform-context/index.js +1 -0
  73. package/build-module/components/dataform-context/index.js.map +1 -1
  74. package/build-module/components/dataviews/index.js +11 -1
  75. package/build-module/components/dataviews/index.js.map +1 -1
  76. package/build-module/components/dataviews-context/index.js +1 -0
  77. package/build-module/components/dataviews-context/index.js.map +1 -1
  78. package/build-module/components/dataviews-layout/index.js +2 -1
  79. package/build-module/components/dataviews-layout/index.js.map +1 -1
  80. package/build-module/components/dataviews-picker/footer.js +136 -0
  81. package/build-module/components/dataviews-picker/footer.js.map +1 -0
  82. package/build-module/components/dataviews-picker/index.js +191 -0
  83. package/build-module/components/dataviews-picker/index.js.map +1 -0
  84. package/build-module/components/dataviews-selection-checkbox/index.js +4 -2
  85. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  86. package/build-module/components/dataviews-view-config/index.js +1 -0
  87. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  88. package/build-module/constants.js +3 -0
  89. package/build-module/constants.js.map +1 -1
  90. package/build-module/dataform-controls/checkbox.js +25 -3
  91. package/build-module/dataform-controls/checkbox.js.map +1 -1
  92. package/build-module/dataform-controls/color.js +122 -0
  93. package/build-module/dataform-controls/color.js.map +1 -0
  94. package/build-module/dataform-controls/email.js +9 -45
  95. package/build-module/dataform-controls/email.js.map +1 -1
  96. package/build-module/dataform-controls/index.js +8 -2
  97. package/build-module/dataform-controls/index.js.map +1 -1
  98. package/build-module/dataform-controls/telephone.js +27 -0
  99. package/build-module/dataform-controls/telephone.js.map +1 -0
  100. package/build-module/dataform-controls/text.js +6 -48
  101. package/build-module/dataform-controls/text.js.map +1 -1
  102. package/build-module/dataform-controls/{boolean.js → toggle.js} +5 -3
  103. package/build-module/dataform-controls/toggle.js.map +1 -0
  104. package/build-module/dataform-controls/url.js +27 -0
  105. package/build-module/dataform-controls/url.js.map +1 -0
  106. package/build-module/dataform-controls/utils/validated-text.js +70 -0
  107. package/build-module/dataform-controls/utils/validated-text.js.map +1 -0
  108. package/build-module/dataforms-layouts/card/index.js +6 -7
  109. package/build-module/dataforms-layouts/card/index.js.map +1 -1
  110. package/build-module/dataforms-layouts/data-form-layout.js +14 -4
  111. package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
  112. package/build-module/dataforms-layouts/index.js +32 -1
  113. package/build-module/dataforms-layouts/index.js.map +1 -1
  114. package/build-module/dataforms-layouts/row/index.js +106 -0
  115. package/build-module/dataforms-layouts/row/index.js.map +1 -0
  116. package/build-module/dataviews-layouts/grid/index.js +16 -11
  117. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  118. package/build-module/dataviews-layouts/index.js +10 -2
  119. package/build-module/dataviews-layouts/index.js.map +1 -1
  120. package/build-module/dataviews-layouts/picker-grid/index.js +348 -0
  121. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -0
  122. package/build-module/dataviews-layouts/utils/grid-items.js +29 -0
  123. package/build-module/dataviews-layouts/utils/grid-items.js.map +1 -0
  124. package/build-module/dataviews-layouts/utils/preview-size-picker.js +73 -0
  125. package/build-module/dataviews-layouts/utils/preview-size-picker.js.map +1 -0
  126. package/build-module/field-types/boolean.js +1 -1
  127. package/build-module/field-types/boolean.js.map +1 -1
  128. package/build-module/field-types/color.js +107 -0
  129. package/build-module/field-types/color.js.map +1 -0
  130. package/build-module/field-types/index.js +12 -0
  131. package/build-module/field-types/index.js.map +1 -1
  132. package/build-module/field-types/telephone.js +51 -0
  133. package/build-module/field-types/telephone.js.map +1 -0
  134. package/build-module/field-types/url.js +51 -0
  135. package/build-module/field-types/url.js.map +1 -0
  136. package/build-module/normalize-form-fields.js +6 -0
  137. package/build-module/normalize-form-fields.js.map +1 -1
  138. package/build-module/types.js.map +1 -1
  139. package/build-module/validation.js +1 -1
  140. package/build-module/validation.js.map +1 -1
  141. package/build-style/style-rtl.css +252 -12
  142. package/build-style/style.css +252 -12
  143. package/build-types/components/dataform/stories/index.story.d.ts +19 -4
  144. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  145. package/build-types/components/dataform-context/index.d.ts.map +1 -1
  146. package/build-types/components/dataviews/index.d.ts +1 -1
  147. package/build-types/components/dataviews/index.d.ts.map +1 -1
  148. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  149. package/build-types/components/dataviews-context/index.d.ts +1 -0
  150. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  151. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  152. package/build-types/components/dataviews-picker/footer.d.ts +4 -0
  153. package/build-types/components/dataviews-picker/footer.d.ts.map +1 -0
  154. package/build-types/components/dataviews-picker/index.d.ts +55 -0
  155. package/build-types/components/dataviews-picker/index.d.ts.map +1 -0
  156. package/build-types/components/dataviews-picker/stories/index.story.d.ts +42 -0
  157. package/build-types/components/dataviews-picker/stories/index.story.d.ts.map +1 -0
  158. package/build-types/components/dataviews-selection-checkbox/index.d.ts +2 -1
  159. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  160. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  161. package/build-types/constants.d.ts +1 -0
  162. package/build-types/constants.d.ts.map +1 -1
  163. package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
  164. package/build-types/dataform-controls/color.d.ts +6 -0
  165. package/build-types/dataform-controls/color.d.ts.map +1 -0
  166. package/build-types/dataform-controls/email.d.ts.map +1 -1
  167. package/build-types/dataform-controls/index.d.ts.map +1 -1
  168. package/build-types/dataform-controls/telephone.d.ts +6 -0
  169. package/build-types/dataform-controls/telephone.d.ts.map +1 -0
  170. package/build-types/dataform-controls/text.d.ts.map +1 -1
  171. package/build-types/dataform-controls/toggle.d.ts +6 -0
  172. package/build-types/dataform-controls/toggle.d.ts.map +1 -0
  173. package/build-types/dataform-controls/url.d.ts +6 -0
  174. package/build-types/dataform-controls/url.d.ts.map +1 -0
  175. package/build-types/dataform-controls/utils/validated-text.d.ts +16 -0
  176. package/build-types/dataform-controls/utils/validated-text.d.ts.map +1 -0
  177. package/build-types/dataforms-layouts/card/index.d.ts +0 -3
  178. package/build-types/dataforms-layouts/card/index.d.ts.map +1 -1
  179. package/build-types/dataforms-layouts/data-form-layout.d.ts +4 -1
  180. package/build-types/dataforms-layouts/data-form-layout.d.ts.map +1 -1
  181. package/build-types/dataforms-layouts/index.d.ts +10 -0
  182. package/build-types/dataforms-layouts/index.d.ts.map +1 -1
  183. package/build-types/dataforms-layouts/row/index.d.ts +6 -0
  184. package/build-types/dataforms-layouts/row/index.d.ts.map +1 -0
  185. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  186. package/build-types/dataviews-layouts/index.d.ts +12 -1
  187. package/build-types/dataviews-layouts/index.d.ts.map +1 -1
  188. package/build-types/dataviews-layouts/picker-grid/index.d.ts +4 -0
  189. package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -0
  190. package/build-types/dataviews-layouts/utils/grid-items.d.ts +5 -0
  191. package/build-types/dataviews-layouts/utils/grid-items.d.ts.map +1 -0
  192. package/build-types/dataviews-layouts/utils/preview-size-picker.d.ts +2 -0
  193. package/build-types/dataviews-layouts/utils/preview-size-picker.d.ts.map +1 -0
  194. package/build-types/field-types/color.d.ts +20 -0
  195. package/build-types/field-types/color.d.ts.map +1 -0
  196. package/build-types/field-types/index.d.ts.map +1 -1
  197. package/build-types/field-types/stories/index.story.d.ts +81 -0
  198. package/build-types/field-types/stories/index.story.d.ts.map +1 -0
  199. package/build-types/field-types/telephone.d.ts +20 -0
  200. package/build-types/field-types/telephone.d.ts.map +1 -0
  201. package/build-types/field-types/url.d.ts +20 -0
  202. package/build-types/field-types/url.d.ts.map +1 -0
  203. package/build-types/normalize-form-fields.d.ts.map +1 -1
  204. package/build-types/test/dataviews-picker.d.ts +2 -0
  205. package/build-types/test/dataviews-picker.d.ts.map +1 -0
  206. package/build-types/types.d.ts +36 -5
  207. package/build-types/types.d.ts.map +1 -1
  208. package/build-types/validation.d.ts.map +1 -1
  209. package/build-wp/index.js +5061 -4013
  210. package/package.json +16 -15
  211. package/src/components/dataform/stories/index.story.tsx +333 -11
  212. package/src/components/dataform-context/index.tsx +1 -0
  213. package/src/components/dataviews/index.tsx +25 -1
  214. package/src/components/dataviews/stories/fixtures.tsx +1 -1
  215. package/src/components/dataviews/stories/index.story.tsx +14 -0
  216. package/src/components/dataviews/style.scss +4 -2
  217. package/src/components/dataviews-context/index.ts +3 -0
  218. package/src/components/dataviews-layout/index.tsx +4 -2
  219. package/src/components/dataviews-picker/footer.tsx +207 -0
  220. package/src/components/dataviews-picker/index.tsx +284 -0
  221. package/src/components/dataviews-picker/stories/index.story.tsx +251 -0
  222. package/src/components/dataviews-picker/style.scss +10 -0
  223. package/src/components/dataviews-selection-checkbox/index.tsx +3 -0
  224. package/src/components/dataviews-view-config/index.tsx +1 -0
  225. package/src/constants.ts +3 -0
  226. package/src/dataform-controls/checkbox.tsx +33 -3
  227. package/src/dataform-controls/color.tsx +139 -0
  228. package/src/dataform-controls/email.tsx +10 -52
  229. package/src/dataform-controls/index.tsx +8 -2
  230. package/src/dataform-controls/telephone.tsx +30 -0
  231. package/src/dataform-controls/text.tsx +2 -57
  232. package/src/dataform-controls/{boolean.tsx → toggle.tsx} +3 -2
  233. package/src/dataform-controls/url.tsx +30 -0
  234. package/src/dataform-controls/utils/validated-text.tsx +96 -0
  235. package/src/dataforms-layouts/card/index.tsx +5 -4
  236. package/src/dataforms-layouts/card/style.scss +7 -0
  237. package/src/dataforms-layouts/data-form-layout.tsx +15 -3
  238. package/src/dataforms-layouts/index.tsx +35 -0
  239. package/src/dataforms-layouts/row/index.tsx +115 -0
  240. package/src/dataforms-layouts/row/style.scss +3 -0
  241. package/src/dataviews-layouts/grid/index.tsx +38 -33
  242. package/src/dataviews-layouts/grid/style.scss +42 -20
  243. package/src/dataviews-layouts/index.ts +16 -2
  244. package/src/dataviews-layouts/picker-grid/index.tsx +490 -0
  245. package/src/dataviews-layouts/picker-grid/style.scss +171 -0
  246. package/src/dataviews-layouts/utils/grid-items.scss +21 -0
  247. package/src/dataviews-layouts/utils/grid-items.tsx +35 -0
  248. package/src/dataviews-layouts/utils/preview-size-picker.tsx +87 -0
  249. package/src/field-types/boolean.tsx +1 -1
  250. package/src/field-types/color.tsx +115 -0
  251. package/src/field-types/index.tsx +15 -0
  252. package/src/field-types/stories/index.story.tsx +719 -0
  253. package/src/field-types/telephone.tsx +71 -0
  254. package/src/field-types/url.tsx +71 -0
  255. package/src/normalize-form-fields.ts +6 -0
  256. package/src/style.scss +4 -0
  257. package/src/test/dataform.tsx +2 -2
  258. package/src/test/dataviews-picker.tsx +478 -0
  259. package/src/test/dataviews.tsx +86 -0
  260. package/src/types.ts +56 -4
  261. package/src/validation.ts +3 -0
  262. package/tsconfig.tsbuildinfo +1 -1
  263. package/build/dataform-controls/boolean.js.map +0 -1
  264. package/build-module/dataform-controls/boolean.js.map +0 -1
  265. package/build-types/components/stories/index.story.d.ts +0 -63
  266. package/build-types/components/stories/index.story.d.ts.map +0 -1
  267. package/build-types/dataform-controls/boolean.d.ts +0 -6
  268. package/build-types/dataform-controls/boolean.d.ts.map +0 -1
  269. package/src/components/stories/index.story.tsx +0 -372
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/dataviews",
3
- "version": "8.0.1-next.e256d081a.0",
3
+ "version": "9.0.1-next.6870dfe5b.0",
4
4
  "description": "DataViews is a component that provides an API to render datasets using different types of layouts (table, grid, list, etc.).",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -46,20 +46,21 @@
46
46
  "dependencies": {
47
47
  "@ariakit/react": "^0.4.15",
48
48
  "@babel/runtime": "7.25.7",
49
- "@wordpress/base-styles": "^6.5.1-next.e256d081a.0",
50
- "@wordpress/components": "^30.2.2-next.e256d081a.0",
51
- "@wordpress/compose": "^7.29.1-next.e256d081a.0",
52
- "@wordpress/data": "^10.29.1-next.e256d081a.0",
53
- "@wordpress/date": "^5.30.1-next.e256d081a.0",
54
- "@wordpress/element": "^6.29.1-next.e256d081a.0",
55
- "@wordpress/i18n": "^6.2.1-next.e256d081a.0",
56
- "@wordpress/icons": "^10.29.1-next.e256d081a.0",
57
- "@wordpress/keycodes": "^4.29.1-next.e256d081a.0",
58
- "@wordpress/primitives": "^4.29.1-next.e256d081a.0",
59
- "@wordpress/private-apis": "^1.29.1-next.e256d081a.0",
60
- "@wordpress/url": "^4.29.1-next.e256d081a.0",
61
- "@wordpress/warning": "^3.29.1-next.e256d081a.0",
49
+ "@wordpress/base-styles": "^6.6.1-next.6870dfe5b.0",
50
+ "@wordpress/components": "^30.3.2-next.6870dfe5b.0",
51
+ "@wordpress/compose": "^7.30.1-next.6870dfe5b.0",
52
+ "@wordpress/data": "^10.30.1-next.6870dfe5b.0",
53
+ "@wordpress/date": "^5.30.1-next.6870dfe5b.0",
54
+ "@wordpress/element": "^6.30.1-next.6870dfe5b.0",
55
+ "@wordpress/i18n": "^6.3.1-next.6870dfe5b.0",
56
+ "@wordpress/icons": "^10.30.1-next.6870dfe5b.0",
57
+ "@wordpress/keycodes": "^4.30.1-next.6870dfe5b.0",
58
+ "@wordpress/primitives": "^4.30.1-next.6870dfe5b.0",
59
+ "@wordpress/private-apis": "^1.30.1-next.6870dfe5b.0",
60
+ "@wordpress/url": "^4.30.1-next.6870dfe5b.0",
61
+ "@wordpress/warning": "^3.30.1-next.6870dfe5b.0",
62
62
  "clsx": "^2.1.1",
63
+ "colord": "^2.7.0",
63
64
  "date-fns": "^4.1.0",
64
65
  "fast-deep-equal": "^3.1.3",
65
66
  "remove-accents": "^0.5.0"
@@ -74,5 +75,5 @@
74
75
  "scripts": {
75
76
  "build:wp": "node build"
76
77
  },
77
- "gitHead": "7d529ba9a461795d5f1572d3856de33f744287c2"
78
+ "gitHead": "c8637da9df499cd7b6b07c9fad918f6d45f4de3d"
78
79
  }
@@ -171,10 +171,8 @@ const fields: Field< SamplePost >[] = [
171
171
  ];
172
172
 
173
173
  const LayoutRegularComponent = ( {
174
- type = 'default',
175
174
  labelPosition,
176
175
  }: {
177
- type?: 'default' | 'regular' | 'panel' | 'card';
178
176
  labelPosition: 'default' | 'top' | 'side' | 'none';
179
177
  } ) => {
180
178
  const [ post, setPost ] = useState( {
@@ -196,7 +194,7 @@ const LayoutRegularComponent = ( {
196
194
  const form: Form = useMemo(
197
195
  () => ( {
198
196
  layout: getLayoutFromStoryArgs( {
199
- type,
197
+ type: 'regular',
200
198
  labelPosition,
201
199
  } ),
202
200
  fields: [
@@ -216,7 +214,7 @@ const LayoutRegularComponent = ( {
216
214
  'tags',
217
215
  ],
218
216
  } ),
219
- [ type, labelPosition ]
217
+ [ labelPosition ]
220
218
  );
221
219
 
222
220
  return (
@@ -240,7 +238,7 @@ const getLayoutFromStoryArgs = ( {
240
238
  openAs,
241
239
  withHeader,
242
240
  }: {
243
- type: 'default' | 'regular' | 'panel' | 'card';
241
+ type: 'default' | 'regular' | 'panel' | 'card' | 'row';
244
242
  labelPosition?: 'default' | 'top' | 'side' | 'none';
245
243
  openAs?: 'default' | 'dropdown' | 'modal';
246
244
  withHeader?: boolean;
@@ -391,6 +389,9 @@ const ValidationComponent = ( {
391
389
  type ValidatedItem = {
392
390
  text: string;
393
391
  email: string;
392
+ telephone: string;
393
+ url: string;
394
+ color: string;
394
395
  integer: number;
395
396
  boolean: boolean;
396
397
  customEdit: string;
@@ -399,6 +400,9 @@ const ValidationComponent = ( {
399
400
  const [ post, setPost ] = useState< ValidatedItem >( {
400
401
  text: 'Can have letters and spaces',
401
402
  email: 'hi@example.com',
403
+ telephone: '+306978241796',
404
+ url: 'https://example.com',
405
+ color: '#ff6600',
402
406
  integer: 2,
403
407
  boolean: true,
404
408
  customEdit: 'custom control',
@@ -418,6 +422,27 @@ const ValidationComponent = ( {
418
422
 
419
423
  return null;
420
424
  };
425
+ const customTelephoneRule = ( value: ValidatedItem ) => {
426
+ if ( ! /^\+30\d{10}$/.test( value.telephone ) ) {
427
+ return 'Telephone number must start with +30 and have 10 digits after.';
428
+ }
429
+
430
+ return null;
431
+ };
432
+ const customUrlRule = ( value: ValidatedItem ) => {
433
+ if ( ! /^https:\/\/example\.com$/.test( value.url ) ) {
434
+ return 'URL must be from https://example.com domain.';
435
+ }
436
+
437
+ return null;
438
+ };
439
+ const customColorRule = ( value: ValidatedItem ) => {
440
+ if ( ! /^#[0-9A-Fa-f]{6}$/.test( value.color ) ) {
441
+ return 'Color must be a valid hex format (e.g., #ff6600).';
442
+ }
443
+
444
+ return null;
445
+ };
421
446
  const customIntegerRule = ( value: ValidatedItem ) => {
422
447
  if ( value.integer % 2 !== 0 ) {
423
448
  return 'Integer must be an even number.';
@@ -451,6 +476,33 @@ const ValidationComponent = ( {
451
476
  custom: maybeCustomRule( customEmailRule ),
452
477
  },
453
478
  },
479
+ {
480
+ id: 'telephone',
481
+ type: 'telephone',
482
+ label: 'telephone',
483
+ isValid: {
484
+ required,
485
+ custom: maybeCustomRule( customTelephoneRule ),
486
+ },
487
+ },
488
+ {
489
+ id: 'url',
490
+ type: 'url',
491
+ label: 'URL',
492
+ isValid: {
493
+ required,
494
+ custom: maybeCustomRule( customUrlRule ),
495
+ },
496
+ },
497
+ {
498
+ id: 'color',
499
+ type: 'color',
500
+ label: 'Color',
501
+ isValid: {
502
+ required,
503
+ custom: maybeCustomRule( customColorRule ),
504
+ },
505
+ },
454
506
  {
455
507
  id: 'integer',
456
508
  type: 'integer',
@@ -480,7 +532,16 @@ const ValidationComponent = ( {
480
532
 
481
533
  const form = {
482
534
  layout: { type },
483
- fields: [ 'text', 'email', 'integer', 'boolean', 'customEdit' ],
535
+ fields: [
536
+ 'text',
537
+ 'email',
538
+ 'telephone',
539
+ 'url',
540
+ 'color',
541
+ 'integer',
542
+ 'boolean',
543
+ 'customEdit',
544
+ ],
484
545
  };
485
546
 
486
547
  const canSave = isItemValid( post, _fields, form );
@@ -671,6 +732,8 @@ const LayoutCardComponent = ( { withHeader }: { withHeader: boolean } ) => {
671
732
  {
672
733
  id: 'customerCard',
673
734
  label: 'Customer',
735
+ description:
736
+ 'Enter your contact details, plan type, and addresses to complete your customer information.',
674
737
  children: [
675
738
  {
676
739
  id: 'customerContact',
@@ -751,6 +814,247 @@ const LayoutCardComponent = ( { withHeader }: { withHeader: boolean } ) => {
751
814
  );
752
815
  };
753
816
 
817
+ const LayoutRowComponent = ( {
818
+ alignment,
819
+ }: {
820
+ alignment: 'start' | 'center' | 'end';
821
+ } ) => {
822
+ type Customer = {
823
+ name: string;
824
+ email: string;
825
+ phone: string;
826
+ plan: string;
827
+ shippingAddress: string;
828
+ shippingCity: string;
829
+ shippingPostalCode: string;
830
+ shippingCountry: string;
831
+ billingAddress: string;
832
+ billingCity: string;
833
+ billingPostalCode: string;
834
+ totalOrders: number;
835
+ totalRevenue: number;
836
+ averageOrderValue: number;
837
+ hasVat: boolean;
838
+ hasDiscount: boolean;
839
+ vat: number;
840
+ commission: number;
841
+ };
842
+
843
+ const customerFields: Field< Customer >[] = [
844
+ {
845
+ id: 'name',
846
+ label: 'Customer Name',
847
+ type: 'text',
848
+ },
849
+ {
850
+ id: 'phone',
851
+ label: 'Phone',
852
+ type: 'text',
853
+ },
854
+ {
855
+ id: 'email',
856
+ label: 'Email',
857
+ type: 'email',
858
+ },
859
+ {
860
+ id: 'shippingAddress',
861
+ label: 'Shipping Address',
862
+ type: 'text',
863
+ },
864
+ {
865
+ id: 'shippingCity',
866
+ label: 'Shipping City',
867
+ type: 'text',
868
+ },
869
+ {
870
+ id: 'shippingPostalCode',
871
+ label: 'Shipping Postal Code',
872
+ type: 'text',
873
+ },
874
+ {
875
+ id: 'shippingCountry',
876
+ label: 'Shipping Country',
877
+ type: 'text',
878
+ },
879
+ {
880
+ id: 'billingAddress',
881
+ label: 'Billing Address',
882
+ type: 'text',
883
+ },
884
+ {
885
+ id: 'billingCity',
886
+ label: 'Billing City',
887
+ type: 'text',
888
+ },
889
+ {
890
+ id: 'billingPostalCode',
891
+ label: 'Billing Postal Code',
892
+ type: 'text',
893
+ },
894
+ {
895
+ id: 'vat',
896
+ label: 'VAT',
897
+ type: 'integer',
898
+ },
899
+ {
900
+ id: 'commission',
901
+ label: 'Commission',
902
+ type: 'integer',
903
+ },
904
+ {
905
+ id: 'hasDiscount',
906
+ label: 'Has Discount?',
907
+ type: 'boolean',
908
+ },
909
+ {
910
+ id: 'plan',
911
+ label: 'Plan',
912
+ type: 'text',
913
+ Edit: 'toggleGroup',
914
+ elements: [
915
+ { value: 'basic', label: 'Basic' },
916
+ { value: 'business', label: 'Business' },
917
+ { value: 'vip', label: 'VIP' },
918
+ ],
919
+ },
920
+ {
921
+ id: 'renewal',
922
+ label: 'Renewal',
923
+ type: 'text',
924
+ Edit: 'radio',
925
+ elements: [
926
+ { value: 'weekly', label: 'Weekly' },
927
+ { value: 'monthly', label: 'Monthly' },
928
+ { value: 'yearly', label: 'Yearly' },
929
+ ],
930
+ },
931
+ ];
932
+
933
+ const [ customer, setCustomer ] = useState< Customer >( {
934
+ name: 'Danyka Romaguera',
935
+ email: 'aromaguera@example.org',
936
+ phone: '1-828-352-1250',
937
+ plan: 'Business',
938
+ shippingAddress: 'N/A',
939
+ shippingCity: 'N/A',
940
+ shippingPostalCode: 'N/A',
941
+ shippingCountry: 'N/A',
942
+ billingAddress: 'Danyka Romaguera, West Myrtiehaven, 80240-4282, BI',
943
+ billingCity: 'City',
944
+ billingPostalCode: 'PC',
945
+ totalOrders: 2,
946
+ totalRevenue: 1430,
947
+ averageOrderValue: 715,
948
+ hasVat: true,
949
+ vat: 10,
950
+ commission: 5,
951
+ hasDiscount: true,
952
+ } );
953
+
954
+ const form: Form = useMemo(
955
+ () => ( {
956
+ fields: [
957
+ {
958
+ id: 'customer',
959
+ label: 'Customer',
960
+ layout: {
961
+ type: 'row',
962
+ alignment,
963
+ },
964
+ children: [ 'name', 'phone', 'email' ],
965
+ },
966
+ {
967
+ id: 'addressRow',
968
+ label: 'Billing & Shipping Addresses',
969
+ layout: {
970
+ type: 'row',
971
+ alignment,
972
+ },
973
+ children: [
974
+ {
975
+ id: 'billingAddress',
976
+ children: [
977
+ 'billingAddress',
978
+ 'billingCity',
979
+ 'billingPostalCode',
980
+ ],
981
+ },
982
+ {
983
+ id: 'shippingAddress',
984
+ children: [
985
+ 'shippingAddress',
986
+ 'shippingCity',
987
+ 'shippingPostalCode',
988
+ 'shippingCountry',
989
+ ],
990
+ },
991
+ ],
992
+ },
993
+ {
994
+ id: 'payments-and-tax',
995
+ label: 'Payments & Taxes',
996
+ layout: {
997
+ type: 'row',
998
+ alignment,
999
+ },
1000
+ children: [ 'vat', 'commission', 'hasDiscount' ],
1001
+ },
1002
+ {
1003
+ id: 'planRow',
1004
+ label: 'Subscription',
1005
+ layout: {
1006
+ type: 'row',
1007
+ alignment,
1008
+ },
1009
+ children: [ 'plan', 'renewal' ],
1010
+ },
1011
+ ],
1012
+ } ),
1013
+ [ alignment ]
1014
+ );
1015
+
1016
+ const topLevelLayout: Form = useMemo(
1017
+ () => ( {
1018
+ layout: {
1019
+ type: 'row',
1020
+ alignment,
1021
+ },
1022
+ fields: [ 'name', 'phone', 'email' ],
1023
+ } ),
1024
+ [ alignment ]
1025
+ );
1026
+
1027
+ return (
1028
+ <>
1029
+ <h1>Row Layout</h1>
1030
+ <h2>As top-level layout</h2>
1031
+ <DataForm
1032
+ data={ customer }
1033
+ fields={ customerFields }
1034
+ form={ topLevelLayout }
1035
+ onChange={ ( edits ) =>
1036
+ setCustomer( ( prev ) => ( {
1037
+ ...prev,
1038
+ ...edits,
1039
+ } ) )
1040
+ }
1041
+ />
1042
+ <h2>Per field layout</h2>
1043
+ <DataForm
1044
+ data={ customer }
1045
+ fields={ customerFields }
1046
+ form={ form }
1047
+ onChange={ ( edits ) =>
1048
+ setCustomer( ( prev ) => ( {
1049
+ ...prev,
1050
+ ...edits,
1051
+ } ) )
1052
+ }
1053
+ />
1054
+ </>
1055
+ );
1056
+ };
1057
+
754
1058
  const LayoutMixedComponent = () => {
755
1059
  const [ post, setPost ] = useState< SamplePost >( {
756
1060
  title: 'Hello, World!',
@@ -767,14 +1071,18 @@ const LayoutMixedComponent = () => {
767
1071
  const form: Form = {
768
1072
  fields: [
769
1073
  {
770
- id: 'title',
1074
+ id: 'title-and-status',
1075
+ children: [
1076
+ {
1077
+ id: 'title',
1078
+ layout: { type: 'panel' },
1079
+ },
1080
+ 'status',
1081
+ ],
771
1082
  layout: {
772
- type: 'panel',
773
- labelPosition: 'top',
774
- openAs: 'dropdown',
1083
+ type: 'row',
775
1084
  },
776
1085
  },
777
- 'status',
778
1086
  {
779
1087
  id: 'order',
780
1088
  layout: {
@@ -865,6 +1173,20 @@ export const LayoutRegular = {
865
1173
  },
866
1174
  };
867
1175
 
1176
+ export const LayoutRow = {
1177
+ render: LayoutRowComponent,
1178
+ argTypes: {
1179
+ alignment: {
1180
+ control: { type: 'select' },
1181
+ description: 'The alignment of the fields.',
1182
+ options: [ 'start', 'center', 'end' ],
1183
+ },
1184
+ },
1185
+ args: {
1186
+ alignment: 'center',
1187
+ },
1188
+ };
1189
+
868
1190
  export const LayoutMixed = {
869
1191
  render: LayoutMixedComponent,
870
1192
  };
@@ -15,6 +15,7 @@ type DataFormContextType< Item > = {
15
15
  const DataFormContext = createContext< DataFormContextType< any > >( {
16
16
  fields: [],
17
17
  } );
18
+ DataFormContext.displayName = 'DataFormContext';
18
19
 
19
20
  export function DataFormProvider< Item >( {
20
21
  fields,
@@ -20,6 +20,7 @@ import { useResizeObserver, throttle } from '@wordpress/compose';
20
20
  * Internal dependencies
21
21
  */
22
22
  import DataViewsContext from '../dataviews-context';
23
+ import { VIEW_LAYOUTS } from '../../dataviews-layouts';
23
24
  import {
24
25
  default as DataViewsFilters,
25
26
  useFilters,
@@ -78,6 +79,10 @@ const defaultGetItemId = ( item: ItemWithId ) => item.id;
78
79
  const defaultIsItemClickable = () => true;
79
80
  const EMPTY_ARRAY: any[] = [];
80
81
 
82
+ const dataViewsLayouts = VIEW_LAYOUTS.filter(
83
+ ( viewLayout ) => ! viewLayout.isPicker
84
+ );
85
+
81
86
  type DefaultUIProps = Pick<
82
87
  DataViewsProps< any >,
83
88
  'header' | 'search' | 'searchLabel'
@@ -135,7 +140,7 @@ function DataViews< Item >( {
135
140
  getItemLevel,
136
141
  isLoading = false,
137
142
  paginationInfo,
138
- defaultLayouts,
143
+ defaultLayouts: defaultLayoutsProperty,
139
144
  selection: selectionProperty,
140
145
  onChangeSelection,
141
146
  onClickItem,
@@ -224,6 +229,25 @@ function DataViews< Item >( {
224
229
  };
225
230
  }, [ infiniteScrollHandler, view.infiniteScrollEnabled ] );
226
231
 
232
+ // Filter out DataViewsPicker layouts.
233
+ const defaultLayouts = useMemo(
234
+ () =>
235
+ Object.fromEntries(
236
+ Object.entries( defaultLayoutsProperty ).filter(
237
+ ( [ layoutType ] ) => {
238
+ return dataViewsLayouts.some(
239
+ ( viewLayout ) => viewLayout.type === layoutType
240
+ );
241
+ }
242
+ )
243
+ ),
244
+ [ defaultLayoutsProperty ]
245
+ );
246
+
247
+ if ( ! defaultLayouts[ view.type ] ) {
248
+ return null;
249
+ }
250
+
227
251
  return (
228
252
  <DataViewsContext.Provider
229
253
  value={ {
@@ -772,7 +772,7 @@ export const fields: Field< SpaceObject >[] = [
772
772
  label: 'Title',
773
773
  id: 'title',
774
774
  type: 'text',
775
- enableHiding: false,
775
+ enableHiding: true,
776
776
  enableGlobalSearch: true,
777
777
  filterBy: {
778
778
  operators: [ 'contains', 'notContains', 'startsWith' ],
@@ -46,6 +46,20 @@ import './style.css';
46
46
  const meta = {
47
47
  title: 'DataViews/DataViews',
48
48
  component: DataViews,
49
+ // Use fullscreen layout and a wrapper div with padding to resolve conflicts
50
+ // between Ariakit's Dialog (usePreventBodyScroll) and Storybook's body padding
51
+ // (sb-main-padding class). This ensures consistent layout in DataViews stories
52
+ // when clicking actions menus. Without this the padding on the body will jump.
53
+ parameters: {
54
+ layout: 'fullscreen',
55
+ },
56
+ decorators: [
57
+ ( Story ) => (
58
+ <div style={ { padding: '1rem' } }>
59
+ <Story />
60
+ </div>
61
+ ),
62
+ ],
49
63
  } as Meta< typeof DataViews >;
50
64
 
51
65
  export default meta;
@@ -1,4 +1,5 @@
1
- .dataviews-wrapper {
1
+ .dataviews-wrapper,
2
+ .dataviews-picker-wrapper {
2
3
  height: 100%;
3
4
  overflow: auto;
4
5
  box-sizing: border-box;
@@ -104,7 +105,8 @@
104
105
  /**
105
106
  * Applying a consistent 24px padding when DataViews are placed within cards.
106
107
  */
107
- .components-card__body:has(> .dataviews-wrapper) {
108
+ .components-card__body:has(> .dataviews-wrapper),
109
+ .components-card__body:has(> .dataviews-picker-wrapper) {
108
110
  padding: $grid-unit-10 0 0;
109
111
  overflow: hidden; // Prevent cells with white backgrounds overflowing the card
110
112
 
@@ -57,6 +57,7 @@ type DataViewsContextType< Item > = {
57
57
  config: { perPageSizes: number[] };
58
58
  empty?: ReactNode;
59
59
  hasInfiniteScrollHandler: boolean;
60
+ itemListLabel?: string;
60
61
  };
61
62
 
62
63
  const DataViewsContext = createContext< DataViewsContextType< any > >( {
@@ -88,4 +89,6 @@ const DataViewsContext = createContext< DataViewsContextType< any > >( {
88
89
  },
89
90
  } );
90
91
 
92
+ DataViewsContext.displayName = 'DataViewsContext';
93
+
91
94
  export default DataViewsContext;
@@ -36,11 +36,13 @@ export default function DataViewsLayout( { className }: DataViewsLayoutProps ) {
36
36
  onClickItem,
37
37
  isItemClickable,
38
38
  renderItemLink,
39
+ defaultLayouts,
39
40
  empty = __( 'No results' ),
40
41
  } = useContext( DataViewsContext );
41
42
 
42
- const ViewComponent = VIEW_LAYOUTS.find( ( v ) => v.type === view.type )
43
- ?.component as ComponentType< ViewBaseProps< any > >;
43
+ const ViewComponent = VIEW_LAYOUTS.find(
44
+ ( v ) => v.type === view.type && defaultLayouts[ v.type ]
45
+ )?.component as ComponentType< ViewBaseProps< any > >;
44
46
 
45
47
  return (
46
48
  <ViewComponent