@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
@@ -0,0 +1,719 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useState, useMemo } from '@wordpress/element';
5
+ import {
6
+ __experimentalHStack as HStack,
7
+ __experimentalVStack as VStack,
8
+ } from '@wordpress/components';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import DataViews from '../../components/dataviews/index';
14
+ import DataForm from '../../components/dataform/index';
15
+ import { filterSortAndPaginate } from '../../filter-and-sort-data-view';
16
+ import type { View, Form, Field } from '../../types';
17
+
18
+ const meta = {
19
+ title: 'DataViews/FieldTypes',
20
+ component: DataForm,
21
+ argTypes: {
22
+ type: {
23
+ control: { type: 'select' },
24
+ description:
25
+ 'Chooses the default layout of each field. "regular" is the default layout.',
26
+ options: [ 'regular', 'panel' ],
27
+ },
28
+ Edit: {
29
+ control: { type: 'select' },
30
+ description:
31
+ 'Chooses the Edit function for the field. "Default" means use the default Edit function for the field type.',
32
+ options: [
33
+ 'default',
34
+ 'array',
35
+ 'checkbox',
36
+ 'color',
37
+ 'date',
38
+ 'datetime',
39
+ 'email',
40
+ 'integer',
41
+ 'radio',
42
+ 'select',
43
+ 'telephone',
44
+ 'url',
45
+ 'text',
46
+ 'toggle',
47
+ 'toggleGroup',
48
+ ],
49
+ },
50
+ },
51
+ args: {
52
+ type: 'regular',
53
+ Edit: 'default',
54
+ },
55
+ };
56
+ export default meta;
57
+
58
+ type DataType = {
59
+ id: number;
60
+ text: string;
61
+ textWithElements: string;
62
+ integer: number;
63
+ integerWithElements: number;
64
+ boolean: boolean;
65
+ booleanWithToggle: boolean;
66
+ booleanWithElements: boolean;
67
+ datetime: string;
68
+ datetimeWithElements: string;
69
+ date: string;
70
+ dateWithElements: string;
71
+ email: string;
72
+ emailWithElements: string;
73
+ telephone: string;
74
+ telephoneWithElements: string;
75
+ color: string;
76
+ colorWithElements: string;
77
+ url: string;
78
+ urlWithElements: string;
79
+ media: string;
80
+ mediaWithElements: string;
81
+ array: string[];
82
+ arrayWithElements: string[];
83
+ notype: string;
84
+ notypeWithElements: string;
85
+ };
86
+
87
+ const data: DataType[] = [
88
+ {
89
+ id: 1,
90
+ text: 'Text',
91
+ textWithElements: 'Item 1',
92
+ integer: 1,
93
+ integerWithElements: 1,
94
+ boolean: true,
95
+ booleanWithToggle: true,
96
+ booleanWithElements: true,
97
+ datetime: '2021-01-01T14:30:00Z',
98
+ datetimeWithElements: '2021-01-01T14:30:00Z',
99
+ date: '2021-01-01',
100
+ dateWithElements: '2021-01-01',
101
+ email: 'hi@example.com',
102
+ emailWithElements: 'hi@example.com',
103
+ telephone: '+1-555-123-4567',
104
+ telephoneWithElements: '+1-555-123-4567',
105
+ color: '#ff6600',
106
+ colorWithElements: 'rgba(255, 165, 0, 0.8)',
107
+ url: 'https://example.com',
108
+ urlWithElements: 'https://example.com',
109
+ media: 'https://live.staticflickr.com/7398/9458193857_e1256123e3_z.jpg',
110
+ mediaWithElements:
111
+ 'https://live.staticflickr.com/7398/9458193857_e1256123e3_z.jpg',
112
+ array: [ 'item1', 'item2', 'item3' ],
113
+ arrayWithElements: [ 'item1', 'item2', 'item3' ],
114
+ notype: 'No type',
115
+ notypeWithElements: 'No type',
116
+ },
117
+ ];
118
+
119
+ const fields: Field< DataType >[] = [
120
+ {
121
+ id: 'text',
122
+ type: 'text',
123
+ label: 'Text',
124
+ description: 'Help for text.',
125
+ },
126
+ {
127
+ id: 'textWithElements',
128
+ type: 'text',
129
+ label: 'Text (with elements)',
130
+ description: 'Help for text with elements.',
131
+ elements: [
132
+ { value: 'item1', label: 'Item 1' },
133
+ { value: 'item2', label: 'Item 2' },
134
+ { value: 'item3', label: 'Item 3' },
135
+ ],
136
+ },
137
+ {
138
+ id: 'integer',
139
+ type: 'integer',
140
+ label: 'Integer',
141
+ description: 'Help for integer.',
142
+ },
143
+ {
144
+ id: 'integerWithElements',
145
+ type: 'integer',
146
+ label: 'Integer (with elements)',
147
+ description: 'Help for integer with elements.',
148
+ elements: [
149
+ { value: 1, label: 'One' },
150
+ { value: 2, label: 'Two' },
151
+ { value: 3, label: 'Three' },
152
+ ],
153
+ },
154
+ {
155
+ id: 'boolean',
156
+ type: 'boolean',
157
+ label: 'Boolean',
158
+ description: 'Help for boolean.',
159
+ },
160
+ {
161
+ id: 'booleanWithToggle',
162
+ type: 'boolean',
163
+ label: 'Boolean (with toggle)',
164
+ description: 'Help for boolean with toggle control.',
165
+ Edit: 'toggle',
166
+ },
167
+ {
168
+ id: 'booleanWithElements',
169
+ type: 'boolean',
170
+ label: 'Boolean (with elements)',
171
+ description: 'Help for boolean with elements.',
172
+ elements: [
173
+ { value: true, label: 'It is true' },
174
+ { value: false, label: 'It is false' },
175
+ ],
176
+ },
177
+ {
178
+ id: 'datetime',
179
+ type: 'datetime',
180
+ label: 'Datetime',
181
+ description: 'Help for datetime.',
182
+ },
183
+ {
184
+ id: 'datetimeWithElements',
185
+ type: 'datetime',
186
+ label: 'Datetime (with elements)',
187
+ description: 'Help for datetime with elements.',
188
+ elements: [
189
+ {
190
+ value: '2021-01-01T14:30:00Z',
191
+ label: 'January 1st, 2021. 14:30UTC',
192
+ },
193
+ {
194
+ value: '2021-02-01T14:30:00Z',
195
+ label: 'February 1st, 2021. 14:30UTC',
196
+ },
197
+ {
198
+ value: '2021-03-01T14:30:00Z',
199
+ label: 'March 1st, 2021. 14:30UTC',
200
+ },
201
+ ],
202
+ },
203
+ {
204
+ id: 'date',
205
+ type: 'date',
206
+ label: 'Date',
207
+ description: 'Help for date.',
208
+ },
209
+ {
210
+ id: 'dateWithElements',
211
+ type: 'date',
212
+ label: 'Date (with elements)',
213
+ description: 'Help for date with elements.',
214
+ elements: [
215
+ { value: '2021-01-01', label: 'January 1st, 2021' },
216
+ { value: '2021-02-01', label: 'February 1st, 2021' },
217
+ { value: '2021-03-01', label: 'March 1st, 2021' },
218
+ ],
219
+ },
220
+ {
221
+ id: 'email',
222
+ type: 'email',
223
+ label: 'Email',
224
+ description: 'Help for email.',
225
+ },
226
+ {
227
+ id: 'emailWithElements',
228
+ type: 'email',
229
+ label: 'Email (with elements)',
230
+ description: 'Help for email with elements.',
231
+ elements: [
232
+ { value: 'john@example.com', label: 'John Doe' },
233
+ { value: 'jane@example.com', label: 'Jane Doe' },
234
+ { value: 'bob@example.com', label: 'Bob Smith' },
235
+ ],
236
+ },
237
+ {
238
+ id: 'telephone',
239
+ type: 'telephone',
240
+ label: 'Telephone',
241
+ description: 'Help for telephone.',
242
+ },
243
+ {
244
+ id: 'telephoneWithElements',
245
+ type: 'telephone',
246
+ label: 'Telephone (with elements)',
247
+ description: 'Help for telephone with elements.',
248
+ elements: [
249
+ { value: '+1-555-123-4567', label: '+1-555-123-4567' },
250
+ { value: '+44-20-7946-0958', label: '+44-20-7946-0958' },
251
+ { value: '+81-3-1234-5678', label: '+81-3-1234-5678' },
252
+ ],
253
+ },
254
+ {
255
+ id: 'url',
256
+ type: 'url',
257
+ label: 'URL',
258
+ description: 'Help for URL.',
259
+ },
260
+ {
261
+ id: 'urlWithElements',
262
+ type: 'url',
263
+ label: 'URL (with elements)',
264
+ description: 'Help for URL with elements.',
265
+ elements: [
266
+ { value: 'https://example.com', label: 'https://example.com' },
267
+ { value: 'https://wordpress.org', label: 'https://wordpress.org' },
268
+ { value: 'https://github.com', label: 'https://github.com' },
269
+ ],
270
+ },
271
+ {
272
+ id: 'color',
273
+ type: 'color',
274
+ label: 'Color',
275
+ description:
276
+ 'Help for color. Supports hex, rgb, hsl formats with alpha channel.',
277
+ },
278
+ {
279
+ id: 'colorWithElements',
280
+ type: 'color',
281
+ label: 'Color (with elements)',
282
+ description: 'Help for color with predefined color options.',
283
+ elements: [
284
+ { value: '#ff0000', label: 'Red' },
285
+ { value: '#00ff00', label: 'Green' },
286
+ { value: '#0000ff', label: 'Blue' },
287
+ { value: 'rgba(255, 165, 0, 0.8)', label: 'Orange (80% opacity)' },
288
+ { value: 'hsl(300, 100%, 50%)', label: 'Magenta' },
289
+ {
290
+ value: 'hsla(120, 100%, 25%, 0.6)',
291
+ label: 'Dark Green (60% opacity)',
292
+ },
293
+ ],
294
+ },
295
+ {
296
+ id: 'media',
297
+ type: 'media',
298
+ label: 'Media',
299
+ description: 'Help for media.',
300
+ render: ( { item } ) => {
301
+ return (
302
+ <img src={ item.media } alt="" style={ { width: '100%' } } />
303
+ );
304
+ },
305
+ },
306
+ {
307
+ id: 'mediaWithElements',
308
+ type: 'media',
309
+ label: 'Media (with elements)',
310
+ description: 'Help for media with elements.',
311
+ elements: [
312
+ {
313
+ value: 'https://live.staticflickr.com/7398/9458193857_e1256123e3_z.jpg',
314
+ label: 'Moon',
315
+ },
316
+ {
317
+ value: 'https://live.staticflickr.com/8151/7651156426_e047f4d219_z.jpg',
318
+ label: 'Mars',
319
+ },
320
+ {
321
+ value: 'https://live.staticflickr.com/3762/9460163562_964fe6af07_z.jpg',
322
+ label: 'Earth',
323
+ },
324
+ ],
325
+ render: ( { item } ) => {
326
+ return (
327
+ <img
328
+ src={ item.mediaWithElements }
329
+ alt=""
330
+ style={ { width: '100%' } }
331
+ />
332
+ );
333
+ },
334
+ },
335
+ {
336
+ id: 'array',
337
+ type: 'array',
338
+ label: 'Array',
339
+ description: 'Help for array.',
340
+ },
341
+ {
342
+ id: 'arrayWithElements',
343
+ type: 'array',
344
+ label: 'Array (with elements)',
345
+ description: 'Help for array with elements.',
346
+ elements: [
347
+ { value: 'item1', label: 'Item 1' },
348
+ { value: 'item2', label: 'Item 2' },
349
+ { value: 'item3', label: 'Item 3' },
350
+ ],
351
+ },
352
+ {
353
+ id: 'notype',
354
+ label: 'No type',
355
+ description: 'Help for notype.',
356
+ },
357
+ {
358
+ id: 'notypeWithElements',
359
+ label: 'No type (with elements)',
360
+ description: 'Help for notype with elements.',
361
+ elements: [
362
+ { value: 'item1', label: 'Item 1' },
363
+ { value: 'item2', label: 'Item 2' },
364
+ { value: 'item3', label: 'Item 3' },
365
+ ],
366
+ },
367
+ ];
368
+
369
+ type PanelTypes = 'regular' | 'panel';
370
+ type ControlTypes =
371
+ | 'default'
372
+ | 'array'
373
+ | 'checkbox'
374
+ | 'color'
375
+ | 'date'
376
+ | 'datetime'
377
+ | 'email'
378
+ | 'integer'
379
+ | 'radio'
380
+ | 'select'
381
+ | 'telephone'
382
+ | 'url'
383
+ | 'text'
384
+ | 'toggle'
385
+ | 'toggleGroup';
386
+
387
+ interface FieldTypeStoryProps {
388
+ fields: Field< DataType >[];
389
+ type: PanelTypes;
390
+ Edit: ControlTypes;
391
+ }
392
+
393
+ const FieldTypeStory = ( {
394
+ fields: _fields,
395
+ type,
396
+ Edit,
397
+ }: FieldTypeStoryProps ) => {
398
+ const storyFields = useMemo( () => {
399
+ if ( Edit === 'default' ) {
400
+ return _fields;
401
+ }
402
+
403
+ return _fields.map( ( field: Field< DataType > ) => ( {
404
+ ...field,
405
+ Edit,
406
+ } ) );
407
+ }, [ _fields, Edit ] );
408
+ const form = useMemo(
409
+ () => ( {
410
+ layout: { type },
411
+ fields: storyFields.map( ( field ) => field.id ),
412
+ } ),
413
+ [ type, storyFields ]
414
+ ) as Form;
415
+
416
+ const [ view, setView ] = useState< View >( {
417
+ type: 'table' as const,
418
+ search: '',
419
+ page: 1,
420
+ perPage: 10,
421
+ layout: {},
422
+ filters: [],
423
+ fields: storyFields.map( ( field ) => field.id ),
424
+ } );
425
+
426
+ const [ selectedIds, setSelectedIds ] = useState< number[] >( [] );
427
+ const [ modifiedData, setModifiedData ] = useState< DataType[] >( data );
428
+
429
+ const { data: shownData, paginationInfo } = useMemo( () => {
430
+ return filterSortAndPaginate( modifiedData, view, storyFields );
431
+ }, [ modifiedData, view, storyFields ] );
432
+
433
+ const selectedItem =
434
+ ( selectedIds.length === 1 &&
435
+ shownData.find( ( item ) => item.id === selectedIds[ 0 ] ) ) ||
436
+ null;
437
+
438
+ return (
439
+ <HStack alignment="stretch">
440
+ <div style={ { flex: 2 } }>
441
+ <DataViews
442
+ getItemId={ ( item ) => item.id.toString() }
443
+ data={ shownData }
444
+ paginationInfo={ paginationInfo }
445
+ view={ view }
446
+ fields={ storyFields }
447
+ onChangeView={ setView }
448
+ actions={ [
449
+ {
450
+ id: 'edit',
451
+ label: 'Edit',
452
+ callback: () => {},
453
+ disabled: true,
454
+ supportsBulk: true,
455
+ },
456
+ ] }
457
+ defaultLayouts={ {
458
+ table: {},
459
+ } }
460
+ selection={ selectedIds.map( ( id ) => id.toString() ) }
461
+ onChangeSelection={ ( newSelection ) =>
462
+ setSelectedIds(
463
+ newSelection.map( ( id ) => parseInt( id, 10 ) )
464
+ )
465
+ }
466
+ />
467
+ </div>
468
+ { selectedItem ? (
469
+ <VStack alignment="top">
470
+ <DataForm
471
+ data={ selectedItem }
472
+ form={ form }
473
+ fields={ storyFields }
474
+ onChange={ ( updatedValues ) => {
475
+ const updatedItem = {
476
+ ...selectedItem,
477
+ ...updatedValues,
478
+ };
479
+
480
+ setModifiedData(
481
+ modifiedData.map( ( item ) =>
482
+ item.id === selectedItem.id
483
+ ? updatedItem
484
+ : item
485
+ )
486
+ );
487
+ } }
488
+ />
489
+ </VStack>
490
+ ) : (
491
+ <VStack alignment="center">
492
+ <span
493
+ style={ {
494
+ color: '#888',
495
+ } }
496
+ >
497
+ Please, select a single item.
498
+ </span>
499
+ </VStack>
500
+ ) }
501
+ </HStack>
502
+ );
503
+ };
504
+
505
+ export const All = ( {
506
+ type,
507
+ Edit,
508
+ }: {
509
+ type: PanelTypes;
510
+ Edit: ControlTypes;
511
+ } ) => {
512
+ return <FieldTypeStory fields={ fields } type={ type } Edit={ Edit } />;
513
+ };
514
+
515
+ export const Text = ( {
516
+ type,
517
+ Edit,
518
+ }: {
519
+ type: PanelTypes;
520
+ Edit: ControlTypes;
521
+ } ) => {
522
+ const textFields = useMemo(
523
+ () => fields.filter( ( field ) => field.type === 'text' ),
524
+ []
525
+ );
526
+
527
+ return <FieldTypeStory fields={ textFields } type={ type } Edit={ Edit } />;
528
+ };
529
+
530
+ export const Integer = ( {
531
+ type,
532
+ Edit,
533
+ }: {
534
+ type: PanelTypes;
535
+ Edit: ControlTypes;
536
+ } ) => {
537
+ const integerFields = useMemo(
538
+ () => fields.filter( ( field ) => field.type === 'integer' ),
539
+ []
540
+ );
541
+
542
+ return (
543
+ <FieldTypeStory fields={ integerFields } type={ type } Edit={ Edit } />
544
+ );
545
+ };
546
+
547
+ export const Boolean = ( {
548
+ type,
549
+ Edit,
550
+ }: {
551
+ type: PanelTypes;
552
+ Edit: ControlTypes;
553
+ } ) => {
554
+ const booleanFields = useMemo(
555
+ () => fields.filter( ( field ) => field.type === 'boolean' ),
556
+ []
557
+ );
558
+
559
+ return (
560
+ <FieldTypeStory fields={ booleanFields } type={ type } Edit={ Edit } />
561
+ );
562
+ };
563
+
564
+ export const DateTime = ( {
565
+ type,
566
+ Edit,
567
+ }: {
568
+ type: PanelTypes;
569
+ Edit: ControlTypes;
570
+ } ) => {
571
+ const dateTimeFields = useMemo(
572
+ () => fields.filter( ( field ) => field.type === 'datetime' ),
573
+ []
574
+ );
575
+
576
+ return (
577
+ <FieldTypeStory fields={ dateTimeFields } type={ type } Edit={ Edit } />
578
+ );
579
+ };
580
+
581
+ export const Date = ( {
582
+ type,
583
+ Edit,
584
+ }: {
585
+ type: PanelTypes;
586
+ Edit: ControlTypes;
587
+ } ) => {
588
+ const dateFields = useMemo(
589
+ () => fields.filter( ( field ) => field.type === 'date' ),
590
+ []
591
+ );
592
+
593
+ return <FieldTypeStory fields={ dateFields } type={ type } Edit={ Edit } />;
594
+ };
595
+
596
+ export const Email = ( {
597
+ type,
598
+ Edit,
599
+ }: {
600
+ type: PanelTypes;
601
+ Edit: ControlTypes;
602
+ } ) => {
603
+ const emailFields = useMemo(
604
+ () => fields.filter( ( field ) => field.type === 'email' ),
605
+ []
606
+ );
607
+
608
+ return (
609
+ <FieldTypeStory fields={ emailFields } type={ type } Edit={ Edit } />
610
+ );
611
+ };
612
+
613
+ export const Telephone = ( {
614
+ type,
615
+ Edit,
616
+ }: {
617
+ type: PanelTypes;
618
+ Edit: ControlTypes;
619
+ } ) => {
620
+ const telephoneFields = useMemo(
621
+ () => fields.filter( ( field ) => field.type === 'telephone' ),
622
+ []
623
+ );
624
+
625
+ return (
626
+ <FieldTypeStory
627
+ fields={ telephoneFields }
628
+ type={ type }
629
+ Edit={ Edit }
630
+ />
631
+ );
632
+ };
633
+
634
+ export const Url = ( {
635
+ type,
636
+ Edit,
637
+ }: {
638
+ type: PanelTypes;
639
+ Edit: ControlTypes;
640
+ } ) => {
641
+ const urlFields = useMemo(
642
+ () => fields.filter( ( field ) => field.type === 'url' ),
643
+ []
644
+ );
645
+
646
+ return <FieldTypeStory fields={ urlFields } type={ type } Edit={ Edit } />;
647
+ };
648
+
649
+ export const Color = ( {
650
+ type,
651
+ Edit,
652
+ }: {
653
+ type: PanelTypes;
654
+ Edit: ControlTypes;
655
+ } ) => {
656
+ const colorFields = useMemo(
657
+ () => fields.filter( ( field ) => field.type === 'color' ),
658
+ []
659
+ );
660
+
661
+ return (
662
+ <FieldTypeStory fields={ colorFields } type={ type } Edit={ Edit } />
663
+ );
664
+ };
665
+
666
+ export const Media = ( {
667
+ type,
668
+ Edit,
669
+ }: {
670
+ type: PanelTypes;
671
+ Edit: ControlTypes;
672
+ } ) => {
673
+ const mediaFields = useMemo(
674
+ () => fields.filter( ( field ) => field.type === 'media' ),
675
+ []
676
+ );
677
+
678
+ return (
679
+ <FieldTypeStory fields={ mediaFields } type={ type } Edit={ Edit } />
680
+ );
681
+ };
682
+
683
+ export const Array = ( {
684
+ type,
685
+ Edit,
686
+ }: {
687
+ type: PanelTypes;
688
+ Edit: ControlTypes;
689
+ } ) => {
690
+ const arrayTextFields = useMemo(
691
+ () => fields.filter( ( field ) => field.type === 'array' ),
692
+ []
693
+ );
694
+
695
+ return (
696
+ <FieldTypeStory
697
+ fields={ arrayTextFields }
698
+ type={ type }
699
+ Edit={ Edit }
700
+ />
701
+ );
702
+ };
703
+
704
+ export const NoType = ( {
705
+ type,
706
+ Edit,
707
+ }: {
708
+ type: PanelTypes;
709
+ Edit: ControlTypes;
710
+ } ) => {
711
+ const noTypeFields = useMemo(
712
+ () => fields.filter( ( field ) => field.type === undefined ),
713
+ []
714
+ );
715
+
716
+ return (
717
+ <FieldTypeStory fields={ noTypeFields } type={ type } Edit={ Edit } />
718
+ );
719
+ };