@wordpress/dataviews 9.0.1-next.6870dfe5b.0 → 9.0.1-next.a730c9c8c.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 (255) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/README.md +107 -12
  3. package/build/components/dataviews-filters/input-widget.js +48 -4
  4. package/build/components/dataviews-filters/input-widget.js.map +1 -1
  5. package/build/components/dataviews-layout/index.js +3 -1
  6. package/build/components/dataviews-layout/index.js.map +1 -1
  7. package/build/dataform-controls/array.js +9 -7
  8. package/build/dataform-controls/array.js.map +1 -1
  9. package/build/dataform-controls/checkbox.js +31 -20
  10. package/build/dataform-controls/checkbox.js.map +1 -1
  11. package/build/dataform-controls/color.js +29 -24
  12. package/build/dataform-controls/color.js.map +1 -1
  13. package/build/dataform-controls/date.js +32 -24
  14. package/build/dataform-controls/date.js.map +1 -1
  15. package/build/dataform-controls/datetime.js +133 -19
  16. package/build/dataform-controls/datetime.js.map +1 -1
  17. package/build/dataform-controls/email.js +9 -3
  18. package/build/dataform-controls/email.js.map +1 -1
  19. package/build/dataform-controls/index.js +27 -0
  20. package/build/dataform-controls/index.js.map +1 -1
  21. package/build/dataform-controls/integer.js +47 -34
  22. package/build/dataform-controls/integer.js.map +1 -1
  23. package/build/dataform-controls/password.js +47 -0
  24. package/build/dataform-controls/password.js.map +1 -0
  25. package/build/dataform-controls/radio.js +42 -9
  26. package/build/dataform-controls/radio.js.map +1 -1
  27. package/build/dataform-controls/relative-date-control.js +6 -10
  28. package/build/dataform-controls/relative-date-control.js.map +1 -1
  29. package/build/dataform-controls/select.js +41 -10
  30. package/build/dataform-controls/select.js.map +1 -1
  31. package/build/dataform-controls/telephone.js +9 -3
  32. package/build/dataform-controls/telephone.js.map +1 -1
  33. package/build/dataform-controls/text.js +16 -4
  34. package/build/dataform-controls/text.js.map +1 -1
  35. package/build/dataform-controls/textarea.js +81 -0
  36. package/build/dataform-controls/textarea.js.map +1 -0
  37. package/build/dataform-controls/toggle-group.js +36 -6
  38. package/build/dataform-controls/toggle-group.js.map +1 -1
  39. package/build/dataform-controls/toggle.js +33 -22
  40. package/build/dataform-controls/toggle.js.map +1 -1
  41. package/build/dataform-controls/url.js +9 -3
  42. package/build/dataform-controls/url.js.map +1 -1
  43. package/build/dataform-controls/utils/{validated-text.js → validated-input.js} +36 -29
  44. package/build/dataform-controls/utils/validated-input.js.map +1 -0
  45. package/build/dataforms-layouts/panel/dropdown.js +10 -14
  46. package/build/dataforms-layouts/panel/dropdown.js.map +1 -1
  47. package/build/dataforms-layouts/panel/index.js +24 -11
  48. package/build/dataforms-layouts/panel/index.js.map +1 -1
  49. package/build/dataforms-layouts/panel/modal.js +22 -27
  50. package/build/dataforms-layouts/panel/modal.js.map +1 -1
  51. package/build/dataforms-layouts/panel/summary-button.js +67 -0
  52. package/build/dataforms-layouts/panel/summary-button.js.map +1 -0
  53. package/build/dataforms-layouts/regular/index.js +7 -9
  54. package/build/dataforms-layouts/regular/index.js.map +1 -1
  55. package/build/dataviews-layouts/grid/index.js +5 -15
  56. package/build/dataviews-layouts/grid/index.js.map +1 -1
  57. package/build/dataviews-layouts/list/index.js +47 -2
  58. package/build/dataviews-layouts/list/index.js.map +1 -1
  59. package/build/dataviews-layouts/picker-grid/index.js +5 -15
  60. package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
  61. package/build/dataviews-layouts/table/index.js +5 -17
  62. package/build/dataviews-layouts/table/index.js.map +1 -1
  63. package/build/dataviews-layouts/utils/get-data-by-group.js +23 -0
  64. package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  65. package/build/field-types/index.js +4 -0
  66. package/build/field-types/index.js.map +1 -1
  67. package/build/field-types/password.js +51 -0
  68. package/build/field-types/password.js.map +1 -0
  69. package/build/normalize-fields.js +17 -0
  70. package/build/normalize-fields.js.map +1 -1
  71. package/build/types.js.map +1 -1
  72. package/build/validation.js +1 -1
  73. package/build/validation.js.map +1 -1
  74. package/build-module/components/dataviews-filters/input-widget.js +48 -4
  75. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  76. package/build-module/components/dataviews-layout/index.js +3 -1
  77. package/build-module/components/dataviews-layout/index.js.map +1 -1
  78. package/build-module/dataform-controls/array.js +9 -7
  79. package/build-module/dataform-controls/array.js.map +1 -1
  80. package/build-module/dataform-controls/checkbox.js +31 -21
  81. package/build-module/dataform-controls/checkbox.js.map +1 -1
  82. package/build-module/dataform-controls/color.js +28 -24
  83. package/build-module/dataform-controls/color.js.map +1 -1
  84. package/build-module/dataform-controls/date.js +32 -24
  85. package/build-module/dataform-controls/date.js.map +1 -1
  86. package/build-module/dataform-controls/datetime.js +135 -21
  87. package/build-module/dataform-controls/datetime.js.map +1 -1
  88. package/build-module/dataform-controls/email.js +8 -2
  89. package/build-module/dataform-controls/email.js.map +1 -1
  90. package/build-module/dataform-controls/index.js +27 -0
  91. package/build-module/dataform-controls/index.js.map +1 -1
  92. package/build-module/dataform-controls/integer.js +46 -34
  93. package/build-module/dataform-controls/integer.js.map +1 -1
  94. package/build-module/dataform-controls/password.js +38 -0
  95. package/build-module/dataform-controls/password.js.map +1 -0
  96. package/build-module/dataform-controls/radio.js +44 -11
  97. package/build-module/dataform-controls/radio.js.map +1 -1
  98. package/build-module/dataform-controls/relative-date-control.js +6 -10
  99. package/build-module/dataform-controls/relative-date-control.js.map +1 -1
  100. package/build-module/dataform-controls/select.js +43 -12
  101. package/build-module/dataform-controls/select.js.map +1 -1
  102. package/build-module/dataform-controls/telephone.js +8 -2
  103. package/build-module/dataform-controls/telephone.js.map +1 -1
  104. package/build-module/dataform-controls/text.js +15 -3
  105. package/build-module/dataform-controls/text.js.map +1 -1
  106. package/build-module/dataform-controls/textarea.js +74 -0
  107. package/build-module/dataform-controls/textarea.js.map +1 -0
  108. package/build-module/dataform-controls/toggle-group.js +38 -8
  109. package/build-module/dataform-controls/toggle-group.js.map +1 -1
  110. package/build-module/dataform-controls/toggle.js +33 -23
  111. package/build-module/dataform-controls/toggle.js.map +1 -1
  112. package/build-module/dataform-controls/url.js +8 -2
  113. package/build-module/dataform-controls/url.js.map +1 -1
  114. package/build-module/dataform-controls/utils/validated-input.js +76 -0
  115. package/build-module/dataform-controls/utils/validated-input.js.map +1 -0
  116. package/build-module/dataforms-layouts/panel/dropdown.js +10 -15
  117. package/build-module/dataforms-layouts/panel/dropdown.js.map +1 -1
  118. package/build-module/dataforms-layouts/panel/index.js +24 -11
  119. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  120. package/build-module/dataforms-layouts/panel/modal.js +22 -28
  121. package/build-module/dataforms-layouts/panel/modal.js.map +1 -1
  122. package/build-module/dataforms-layouts/panel/summary-button.js +60 -0
  123. package/build-module/dataforms-layouts/panel/summary-button.js.map +1 -0
  124. package/build-module/dataforms-layouts/regular/index.js +8 -10
  125. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  126. package/build-module/dataviews-layouts/grid/index.js +6 -16
  127. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  128. package/build-module/dataviews-layouts/list/index.js +48 -3
  129. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  130. package/build-module/dataviews-layouts/picker-grid/index.js +6 -16
  131. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
  132. package/build-module/dataviews-layouts/table/index.js +5 -17
  133. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  134. package/build-module/dataviews-layouts/utils/get-data-by-group.js +17 -0
  135. package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  136. package/build-module/field-types/index.js +4 -0
  137. package/build-module/field-types/index.js.map +1 -1
  138. package/build-module/field-types/password.js +46 -0
  139. package/build-module/field-types/password.js.map +1 -0
  140. package/build-module/normalize-fields.js +15 -0
  141. package/build-module/normalize-fields.js.map +1 -1
  142. package/build-module/types.js.map +1 -1
  143. package/build-module/validation.js +1 -1
  144. package/build-module/validation.js.map +1 -1
  145. package/build-style/style-rtl.css +9 -6
  146. package/build-style/style.css +9 -6
  147. package/build-types/components/dataform/stories/index.story.d.ts +3 -14
  148. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  149. package/build-types/components/dataviews/stories/fixtures.d.ts +4 -2
  150. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  151. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  152. package/build-types/dataform-controls/array.d.ts.map +1 -1
  153. package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
  154. package/build-types/dataform-controls/color.d.ts.map +1 -1
  155. package/build-types/dataform-controls/date.d.ts.map +1 -1
  156. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  157. package/build-types/dataform-controls/email.d.ts.map +1 -1
  158. package/build-types/dataform-controls/index.d.ts +1 -1
  159. package/build-types/dataform-controls/index.d.ts.map +1 -1
  160. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  161. package/build-types/dataform-controls/password.d.ts +3 -0
  162. package/build-types/dataform-controls/password.d.ts.map +1 -0
  163. package/build-types/dataform-controls/radio.d.ts.map +1 -1
  164. package/build-types/dataform-controls/relative-date-control.d.ts +6 -5
  165. package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -1
  166. package/build-types/dataform-controls/select.d.ts.map +1 -1
  167. package/build-types/dataform-controls/telephone.d.ts.map +1 -1
  168. package/build-types/dataform-controls/text.d.ts +1 -1
  169. package/build-types/dataform-controls/text.d.ts.map +1 -1
  170. package/build-types/dataform-controls/textarea.d.ts +6 -0
  171. package/build-types/dataform-controls/textarea.d.ts.map +1 -0
  172. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
  173. package/build-types/dataform-controls/toggle.d.ts.map +1 -1
  174. package/build-types/dataform-controls/url.d.ts.map +1 -1
  175. package/build-types/dataform-controls/utils/validated-input.d.ts +20 -0
  176. package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -0
  177. package/build-types/dataforms-layouts/panel/dropdown.d.ts +2 -1
  178. package/build-types/dataforms-layouts/panel/dropdown.d.ts.map +1 -1
  179. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  180. package/build-types/dataforms-layouts/panel/modal.d.ts +2 -1
  181. package/build-types/dataforms-layouts/panel/modal.d.ts.map +1 -1
  182. package/build-types/dataforms-layouts/panel/summary-button.d.ts +15 -0
  183. package/build-types/dataforms-layouts/panel/summary-button.d.ts.map +1 -0
  184. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  185. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  186. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  187. package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  188. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  189. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts +6 -0
  190. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts.map +1 -0
  191. package/build-types/field-types/index.d.ts.map +1 -1
  192. package/build-types/field-types/password.d.ts +17 -0
  193. package/build-types/field-types/password.d.ts.map +1 -0
  194. package/build-types/field-types/stories/index.story.d.ts +5 -1
  195. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  196. package/build-types/normalize-fields.d.ts +3 -0
  197. package/build-types/normalize-fields.d.ts.map +1 -1
  198. package/build-types/types.d.ts +67 -4
  199. package/build-types/types.d.ts.map +1 -1
  200. package/build-types/validation.d.ts.map +1 -1
  201. package/build-wp/index.js +1670 -1350
  202. package/package.json +16 -15
  203. package/src/components/dataform/stories/index.story.tsx +489 -17
  204. package/src/components/dataviews/stories/fixtures.tsx +99 -41
  205. package/src/components/dataviews/stories/index.story.tsx +2 -2
  206. package/src/components/dataviews-filters/input-widget.tsx +44 -5
  207. package/src/components/dataviews-layout/index.tsx +1 -1
  208. package/src/components/dataviews-picker/stories/index.story.tsx +1 -1
  209. package/src/dataform-controls/array.tsx +4 -6
  210. package/src/dataform-controls/checkbox.tsx +41 -24
  211. package/src/dataform-controls/color.tsx +33 -24
  212. package/src/dataform-controls/date.tsx +47 -21
  213. package/src/dataform-controls/datetime.tsx +171 -23
  214. package/src/dataform-controls/email.tsx +10 -2
  215. package/src/dataform-controls/index.tsx +30 -0
  216. package/src/dataform-controls/integer.tsx +82 -49
  217. package/src/dataform-controls/password.tsx +50 -0
  218. package/src/dataform-controls/radio.tsx +53 -11
  219. package/src/dataform-controls/relative-date-control.tsx +11 -10
  220. package/src/dataform-controls/select.tsx +53 -10
  221. package/src/dataform-controls/telephone.tsx +10 -2
  222. package/src/dataform-controls/text.tsx +19 -2
  223. package/src/dataform-controls/textarea.tsx +85 -0
  224. package/src/dataform-controls/toggle-group.tsx +50 -10
  225. package/src/dataform-controls/toggle.tsx +41 -24
  226. package/src/dataform-controls/url.tsx +10 -2
  227. package/src/dataform-controls/utils/validated-input.tsx +109 -0
  228. package/src/dataforms-layouts/panel/dropdown.tsx +12 -23
  229. package/src/dataforms-layouts/panel/index.tsx +39 -16
  230. package/src/dataforms-layouts/panel/modal.tsx +24 -30
  231. package/src/dataforms-layouts/panel/summary-button.tsx +92 -0
  232. package/src/dataforms-layouts/regular/index.tsx +9 -7
  233. package/src/dataforms-layouts/regular/style.scss +0 -6
  234. package/src/dataviews-layouts/grid/index.tsx +9 -14
  235. package/src/dataviews-layouts/grid/style.scss +1 -0
  236. package/src/dataviews-layouts/list/index.tsx +74 -2
  237. package/src/dataviews-layouts/list/style.scss +8 -0
  238. package/src/dataviews-layouts/picker-grid/index.tsx +9 -13
  239. package/src/dataviews-layouts/table/index.tsx +10 -14
  240. package/src/dataviews-layouts/utils/get-data-by-group.ts +18 -0
  241. package/src/field-types/index.tsx +5 -0
  242. package/src/field-types/password.tsx +46 -0
  243. package/src/field-types/stories/index.story.tsx +138 -1
  244. package/src/normalize-fields.ts +18 -0
  245. package/src/test/filter-and-sort-data-view.js +148 -138
  246. package/src/test/normalize-fields.ts +114 -0
  247. package/src/types.ts +74 -3
  248. package/src/validation.ts +2 -0
  249. package/tsconfig.tsbuildinfo +1 -1
  250. package/build/dataform-controls/utils/validated-text.js.map +0 -1
  251. package/build-module/dataform-controls/utils/validated-text.js +0 -70
  252. package/build-module/dataform-controls/utils/validated-text.js.map +0 -1
  253. package/build-types/dataform-controls/utils/validated-text.d.ts +0 -16
  254. package/build-types/dataform-controls/utils/validated-text.d.ts.map +0 -1
  255. package/src/dataform-controls/utils/validated-text.tsx +0 -96
@@ -35,6 +35,7 @@ import type {
35
35
  import type { SetSelection } from '../../private-types';
36
36
  import { GridItems } from '../utils/grid-items';
37
37
  const { Badge } = unlock( componentsPrivateApis );
38
+ import getDataByGroup from '../utils/get-data-by-group';
38
39
 
39
40
  interface GridItemProps< Item > {
40
41
  view: ViewPickerGridType;
@@ -301,18 +302,7 @@ function ViewPickerGrid< Item >( {
301
302
  const groupField = view.groupByField
302
303
  ? fields.find( ( f ) => f.id === view.groupByField )
303
304
  : null;
304
-
305
- // Group data by groupByField if specified
306
- const dataByGroup = groupField
307
- ? data.reduce( ( groups: Map< string, typeof data >, item ) => {
308
- const groupName = groupField.getValue( { item } );
309
- if ( ! groups.has( groupName ) ) {
310
- groups.set( groupName, [] );
311
- }
312
- groups.get( groupName )?.push( item );
313
- return groups;
314
- }, new Map< string, typeof data >() )
315
- : null;
305
+ const dataByGroup = groupField ? getDataByGroup( data, groupField ) : null;
316
306
 
317
307
  const isInfiniteScroll = view.infiniteScrollEnabled && ! dataByGroup;
318
308
 
@@ -474,7 +464,13 @@ function ViewPickerGrid< Item >( {
474
464
  'dataviews-no-results': ! isLoading,
475
465
  } ) }
476
466
  >
477
- <p>{ isLoading ? <Spinner /> : empty }</p>
467
+ { isLoading ? (
468
+ <p>
469
+ <Spinner />
470
+ </p>
471
+ ) : (
472
+ empty
473
+ ) }
478
474
  </div>
479
475
  )
480
476
  }
@@ -40,6 +40,7 @@ import type { SetSelection } from '../../private-types';
40
40
  import ColumnHeaderMenu from './column-header-menu';
41
41
  import ColumnPrimary from './column-primary';
42
42
  import { useIsHorizontalScrollEnd } from './use-is-horizontal-scroll-end';
43
+ import getDataByGroup from '../utils/get-data-by-group';
43
44
 
44
45
  interface TableColumnFieldProps< Item > {
45
46
  fields: NormalizedField< Item >[];
@@ -336,22 +337,10 @@ function ViewTable< Item >( {
336
337
  ( field ) => field.id === view.descriptionField
337
338
  );
338
339
 
339
- // Get group field if groupByField is specified
340
340
  const groupField = view.groupByField
341
341
  ? fields.find( ( f ) => f.id === view.groupByField )
342
342
  : null;
343
-
344
- // Group data by groupByField if specified
345
- const dataByGroup = groupField
346
- ? data.reduce( ( groups: Map< string, typeof data >, item ) => {
347
- const groupName = groupField.getValue( { item } );
348
- if ( ! groups.has( groupName ) ) {
349
- groups.set( groupName, [] );
350
- }
351
- groups.get( groupName )?.push( item );
352
- return groups;
353
- }, new Map< string, typeof data >() )
354
- : null;
343
+ const dataByGroup = groupField ? getDataByGroup( data, groupField ) : null;
355
344
  const { showTitle = true, showMedia = true, showDescription = true } = view;
356
345
  const hasPrimaryColumn =
357
346
  ( titleField && showTitle ) ||
@@ -578,7 +567,14 @@ function ViewTable< Item >( {
578
567
  } ) }
579
568
  id={ tableNoticeId }
580
569
  >
581
- { ! hasData && <p>{ isLoading ? <Spinner /> : empty }</p> }
570
+ { ! hasData &&
571
+ ( isLoading ? (
572
+ <p>
573
+ <Spinner />
574
+ </p>
575
+ ) : (
576
+ empty
577
+ ) ) }
582
578
  { hasData && isLoading && (
583
579
  <p className="dataviews-loading-more">
584
580
  <Spinner />
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import type { NormalizedField } from '../../types';
5
+
6
+ export default function getDataByGroup< Item >(
7
+ data: any[],
8
+ groupByField: NormalizedField< Item >
9
+ ): Map< string, any[] > {
10
+ return data.reduce( ( groups: Map< string, typeof data >, item ) => {
11
+ const groupName = groupByField.getValue( { item } );
12
+ if ( ! groups.has( groupName ) ) {
13
+ groups.set( groupName, [] );
14
+ }
15
+ groups.get( groupName )?.push( item );
16
+ return groups;
17
+ }, new Map< string, typeof data >() );
18
+ }
@@ -21,6 +21,7 @@ import { default as date } from './date';
21
21
  import { default as boolean } from './boolean';
22
22
  import { default as media } from './media';
23
23
  import { default as array } from './array';
24
+ import { default as password } from './password';
24
25
  import { default as telephone } from './telephone';
25
26
  import { default as color } from './color';
26
27
  import { default as url } from './url';
@@ -68,6 +69,10 @@ export default function getFieldTypeDefinition< Item >(
68
69
  return array;
69
70
  }
70
71
 
72
+ if ( 'password' === type ) {
73
+ return password;
74
+ }
75
+
71
76
  if ( 'telephone' === type ) {
72
77
  return telephone;
73
78
  }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import type {
10
+ DataViewRenderFieldProps,
11
+ SortDirection,
12
+ NormalizedField,
13
+ FieldTypeDefinition,
14
+ } from '../types';
15
+ import { renderFromElements } from '../utils';
16
+
17
+ /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
18
+ function sort( valueA: any, valueB: any, direction: SortDirection ) {
19
+ // Passwords should not be sortable for security reasons
20
+ return 0;
21
+ }
22
+
23
+ export default {
24
+ sort,
25
+ isValid: {
26
+ custom: ( item: any, field: NormalizedField< any > ) => {
27
+ const value = field.getValue( { item } );
28
+ if ( field?.elements ) {
29
+ const validValues = field.elements.map( ( f ) => f.value );
30
+ if ( ! validValues.includes( value ) ) {
31
+ return __( 'Value must be one of the elements.' );
32
+ }
33
+ }
34
+
35
+ return null;
36
+ },
37
+ },
38
+ Edit: 'password',
39
+ render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
40
+ return field.elements
41
+ ? renderFromElements( { item, field } )
42
+ : '••••••••';
43
+ },
44
+ enableSorting: false,
45
+ filterBy: false,
46
+ } satisfies FieldTypeDefinition< any >;
@@ -5,7 +5,11 @@ import { useState, useMemo } from '@wordpress/element';
5
5
  import {
6
6
  __experimentalHStack as HStack,
7
7
  __experimentalVStack as VStack,
8
+ Icon,
9
+ __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
10
+ __experimentalInputControlSuffixWrapper as InputControlSuffixWrapper,
8
11
  } from '@wordpress/components';
12
+ import { starFilled } from '@wordpress/icons';
9
13
 
10
14
  /**
11
15
  * Internal dependencies
@@ -38,6 +42,7 @@ const meta = {
38
42
  'datetime',
39
43
  'email',
40
44
  'integer',
45
+ 'password',
41
46
  'radio',
42
47
  'select',
43
48
  'telephone',
@@ -55,10 +60,33 @@ const meta = {
55
60
  };
56
61
  export default meta;
57
62
 
63
+ const DollarPrefix = () => (
64
+ <InputControlPrefixWrapper>
65
+ <span>$</span>
66
+ </InputControlPrefixWrapper>
67
+ );
68
+ const StarIconPrefix = () => (
69
+ <InputControlPrefixWrapper variant="icon">
70
+ <Icon icon={ starFilled } />
71
+ </InputControlPrefixWrapper>
72
+ );
73
+ const PercentSuffix = () => (
74
+ <InputControlSuffixWrapper>
75
+ <span>%</span>
76
+ </InputControlSuffixWrapper>
77
+ );
78
+ const USDSuffix = () => (
79
+ <InputControlSuffixWrapper>
80
+ <span>USD</span>
81
+ </InputControlSuffixWrapper>
82
+ );
83
+
58
84
  type DataType = {
59
85
  id: number;
60
86
  text: string;
61
87
  textWithElements: string;
88
+ textWithRadio: string;
89
+ textWithTextarea: string;
62
90
  integer: number;
63
91
  integerWithElements: number;
64
92
  boolean: boolean;
@@ -76,19 +104,27 @@ type DataType = {
76
104
  colorWithElements: string;
77
105
  url: string;
78
106
  urlWithElements: string;
107
+ password: string;
108
+ passwordWithElements: string;
79
109
  media: string;
80
110
  mediaWithElements: string;
81
111
  array: string[];
82
112
  arrayWithElements: string[];
83
113
  notype: string;
84
114
  notypeWithElements: string;
115
+ priceWithPrefix?: string;
116
+ ratingWithIcon?: string;
117
+ percentageWithSuffix?: string;
118
+ priceWithBoth?: string;
85
119
  };
86
120
 
87
121
  const data: DataType[] = [
88
122
  {
89
123
  id: 1,
90
124
  text: 'Text',
91
- textWithElements: 'Item 1',
125
+ textWithElements: 'item1',
126
+ textWithRadio: 'item2',
127
+ textWithTextarea: 'Textarea',
92
128
  integer: 1,
93
129
  integerWithElements: 1,
94
130
  boolean: true,
@@ -106,6 +142,8 @@ const data: DataType[] = [
106
142
  colorWithElements: 'rgba(255, 165, 0, 0.8)',
107
143
  url: 'https://example.com',
108
144
  urlWithElements: 'https://example.com',
145
+ password: 'secretpassword123',
146
+ passwordWithElements: 'secretpassword123',
109
147
  media: 'https://live.staticflickr.com/7398/9458193857_e1256123e3_z.jpg',
110
148
  mediaWithElements:
111
149
  'https://live.staticflickr.com/7398/9458193857_e1256123e3_z.jpg',
@@ -113,6 +151,10 @@ const data: DataType[] = [
113
151
  arrayWithElements: [ 'item1', 'item2', 'item3' ],
114
152
  notype: 'No type',
115
153
  notypeWithElements: 'No type',
154
+ priceWithPrefix: '25.99',
155
+ ratingWithIcon: '4.5',
156
+ percentageWithSuffix: '85',
157
+ priceWithBoth: '199.99',
116
158
  },
117
159
  ];
118
160
 
@@ -134,6 +176,25 @@ const fields: Field< DataType >[] = [
134
176
  { value: 'item3', label: 'Item 3' },
135
177
  ],
136
178
  },
179
+ {
180
+ id: 'textWithRadio',
181
+ type: 'text',
182
+ label: 'Text (with radio)',
183
+ description: 'Help for text with radio.',
184
+ Edit: 'radio',
185
+ elements: [
186
+ { value: 'item1', label: 'Item 1' },
187
+ { value: 'item2', label: 'Item 2' },
188
+ { value: 'item3', label: 'Item 3' },
189
+ ],
190
+ },
191
+ {
192
+ id: 'textWithTextarea',
193
+ type: 'text',
194
+ label: 'Textarea',
195
+ description: 'Help for textarea.',
196
+ Edit: 'textarea',
197
+ },
137
198
  {
138
199
  id: 'integer',
139
200
  type: 'integer',
@@ -292,6 +353,23 @@ const fields: Field< DataType >[] = [
292
353
  },
293
354
  ],
294
355
  },
356
+ {
357
+ id: 'password',
358
+ type: 'password',
359
+ label: 'Password',
360
+ description: 'Help for password.',
361
+ },
362
+ {
363
+ id: 'passwordWithElements',
364
+ type: 'password',
365
+ label: 'Password (with elements)',
366
+ description: 'Help for password with elements.',
367
+ elements: [
368
+ { value: 'secretpassword123', label: 'Secret Password' },
369
+ { value: 'adminpass456', label: 'Admin Password' },
370
+ { value: 'userpass789', label: 'User Password' },
371
+ ],
372
+ },
295
373
  {
296
374
  id: 'media',
297
375
  type: 'media',
@@ -364,6 +442,47 @@ const fields: Field< DataType >[] = [
364
442
  { value: 'item3', label: 'Item 3' },
365
443
  ],
366
444
  },
445
+ {
446
+ id: 'priceWithPrefix',
447
+ label: 'Text with Prefix',
448
+ type: 'text',
449
+ description: 'Text field with dollar sign prefix.',
450
+ Edit: {
451
+ control: 'text',
452
+ prefix: DollarPrefix,
453
+ },
454
+ },
455
+ {
456
+ id: 'ratingWithIcon',
457
+ label: 'Text with Icon Prefix',
458
+ type: 'text',
459
+ description: 'Text field with star icon prefix.',
460
+ Edit: {
461
+ control: 'text',
462
+ prefix: StarIconPrefix,
463
+ },
464
+ },
465
+ {
466
+ id: 'percentageWithSuffix',
467
+ label: 'Text with Suffix',
468
+ type: 'text',
469
+ description: 'Text field with percent sign suffix.',
470
+ Edit: {
471
+ control: 'text',
472
+ suffix: PercentSuffix,
473
+ },
474
+ },
475
+ {
476
+ id: 'priceWithBoth',
477
+ label: 'Text with Prefix and Suffix',
478
+ type: 'text',
479
+ description: 'Text field with both dollar prefix and USD suffix.',
480
+ Edit: {
481
+ control: 'text',
482
+ prefix: DollarPrefix,
483
+ suffix: USDSuffix,
484
+ },
485
+ },
367
486
  ];
368
487
 
369
488
  type PanelTypes = 'regular' | 'panel';
@@ -376,6 +495,7 @@ type ControlTypes =
376
495
  | 'datetime'
377
496
  | 'email'
378
497
  | 'integer'
498
+ | 'password'
379
499
  | 'radio'
380
500
  | 'select'
381
501
  | 'telephone'
@@ -701,6 +821,23 @@ export const Array = ( {
701
821
  );
702
822
  };
703
823
 
824
+ export const Password = ( {
825
+ type,
826
+ Edit,
827
+ }: {
828
+ type: PanelTypes;
829
+ Edit: ControlTypes;
830
+ } ) => {
831
+ const passwordFields = useMemo(
832
+ () => fields.filter( ( field ) => field.type === 'password' ),
833
+ []
834
+ );
835
+
836
+ return (
837
+ <FieldTypeStory fields={ passwordFields } type={ type } Edit={ Edit } />
838
+ );
839
+ };
840
+
704
841
  export const NoType = ( {
705
842
  type,
706
843
  Edit,
@@ -37,6 +37,22 @@ const getValueFromId =
37
37
  return value;
38
38
  };
39
39
 
40
+ export const setValueFromId =
41
+ ( id: string ) =>
42
+ ( { value }: { value: any } ) => {
43
+ const path = id.split( '.' );
44
+ const result: any = {};
45
+ let current = result;
46
+
47
+ for ( const segment of path.slice( 0, -1 ) ) {
48
+ current[ segment ] = {};
49
+ current = current[ segment ];
50
+ }
51
+
52
+ current[ path.at( -1 )! ] = value;
53
+ return result;
54
+ };
55
+
40
56
  function getFilterBy< Item >(
41
57
  field: Field< Item >,
42
58
  fieldTypeDefinition: FieldTypeDefinition< Item >
@@ -128,6 +144,7 @@ export function normalizeFields< Item >(
128
144
  field.type
129
145
  );
130
146
  const getValue = field.getValue || getValueFromId( field.id );
147
+ const setValue = field.setValue || setValueFromId( field.id );
131
148
 
132
149
  const sort =
133
150
  field.sort ??
@@ -166,6 +183,7 @@ export function normalizeFields< Item >(
166
183
  label: field.label || field.id,
167
184
  header: field.header || field.label || field.id,
168
185
  getValue,
186
+ setValue,
169
187
  render,
170
188
  sort,
171
189
  isValid,