@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.
- package/CHANGELOG.md +17 -1
- package/README.md +107 -12
- package/build/components/dataviews-filters/input-widget.js +48 -4
- package/build/components/dataviews-filters/input-widget.js.map +1 -1
- package/build/components/dataviews-layout/index.js +3 -1
- package/build/components/dataviews-layout/index.js.map +1 -1
- package/build/dataform-controls/array.js +9 -7
- package/build/dataform-controls/array.js.map +1 -1
- package/build/dataform-controls/checkbox.js +31 -20
- package/build/dataform-controls/checkbox.js.map +1 -1
- package/build/dataform-controls/color.js +29 -24
- package/build/dataform-controls/color.js.map +1 -1
- package/build/dataform-controls/date.js +32 -24
- package/build/dataform-controls/date.js.map +1 -1
- package/build/dataform-controls/datetime.js +133 -19
- package/build/dataform-controls/datetime.js.map +1 -1
- package/build/dataform-controls/email.js +9 -3
- package/build/dataform-controls/email.js.map +1 -1
- package/build/dataform-controls/index.js +27 -0
- package/build/dataform-controls/index.js.map +1 -1
- package/build/dataform-controls/integer.js +47 -34
- package/build/dataform-controls/integer.js.map +1 -1
- package/build/dataform-controls/password.js +47 -0
- package/build/dataform-controls/password.js.map +1 -0
- package/build/dataform-controls/radio.js +42 -9
- package/build/dataform-controls/radio.js.map +1 -1
- package/build/dataform-controls/relative-date-control.js +6 -10
- package/build/dataform-controls/relative-date-control.js.map +1 -1
- package/build/dataform-controls/select.js +41 -10
- package/build/dataform-controls/select.js.map +1 -1
- package/build/dataform-controls/telephone.js +9 -3
- package/build/dataform-controls/telephone.js.map +1 -1
- package/build/dataform-controls/text.js +16 -4
- package/build/dataform-controls/text.js.map +1 -1
- package/build/dataform-controls/textarea.js +81 -0
- package/build/dataform-controls/textarea.js.map +1 -0
- package/build/dataform-controls/toggle-group.js +36 -6
- package/build/dataform-controls/toggle-group.js.map +1 -1
- package/build/dataform-controls/toggle.js +33 -22
- package/build/dataform-controls/toggle.js.map +1 -1
- package/build/dataform-controls/url.js +9 -3
- package/build/dataform-controls/url.js.map +1 -1
- package/build/dataform-controls/utils/{validated-text.js → validated-input.js} +36 -29
- package/build/dataform-controls/utils/validated-input.js.map +1 -0
- package/build/dataforms-layouts/panel/dropdown.js +10 -14
- package/build/dataforms-layouts/panel/dropdown.js.map +1 -1
- package/build/dataforms-layouts/panel/index.js +24 -11
- package/build/dataforms-layouts/panel/index.js.map +1 -1
- package/build/dataforms-layouts/panel/modal.js +22 -27
- package/build/dataforms-layouts/panel/modal.js.map +1 -1
- package/build/dataforms-layouts/panel/summary-button.js +67 -0
- package/build/dataforms-layouts/panel/summary-button.js.map +1 -0
- package/build/dataforms-layouts/regular/index.js +7 -9
- package/build/dataforms-layouts/regular/index.js.map +1 -1
- package/build/dataviews-layouts/grid/index.js +5 -15
- package/build/dataviews-layouts/grid/index.js.map +1 -1
- package/build/dataviews-layouts/list/index.js +47 -2
- package/build/dataviews-layouts/list/index.js.map +1 -1
- package/build/dataviews-layouts/picker-grid/index.js +5 -15
- package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
- package/build/dataviews-layouts/table/index.js +5 -17
- package/build/dataviews-layouts/table/index.js.map +1 -1
- package/build/dataviews-layouts/utils/get-data-by-group.js +23 -0
- package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
- package/build/field-types/index.js +4 -0
- package/build/field-types/index.js.map +1 -1
- package/build/field-types/password.js +51 -0
- package/build/field-types/password.js.map +1 -0
- package/build/normalize-fields.js +17 -0
- package/build/normalize-fields.js.map +1 -1
- package/build/types.js.map +1 -1
- package/build/validation.js +1 -1
- package/build/validation.js.map +1 -1
- package/build-module/components/dataviews-filters/input-widget.js +48 -4
- package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
- package/build-module/components/dataviews-layout/index.js +3 -1
- package/build-module/components/dataviews-layout/index.js.map +1 -1
- package/build-module/dataform-controls/array.js +9 -7
- package/build-module/dataform-controls/array.js.map +1 -1
- package/build-module/dataform-controls/checkbox.js +31 -21
- package/build-module/dataform-controls/checkbox.js.map +1 -1
- package/build-module/dataform-controls/color.js +28 -24
- package/build-module/dataform-controls/color.js.map +1 -1
- package/build-module/dataform-controls/date.js +32 -24
- package/build-module/dataform-controls/date.js.map +1 -1
- package/build-module/dataform-controls/datetime.js +135 -21
- package/build-module/dataform-controls/datetime.js.map +1 -1
- package/build-module/dataform-controls/email.js +8 -2
- package/build-module/dataform-controls/email.js.map +1 -1
- package/build-module/dataform-controls/index.js +27 -0
- package/build-module/dataform-controls/index.js.map +1 -1
- package/build-module/dataform-controls/integer.js +46 -34
- package/build-module/dataform-controls/integer.js.map +1 -1
- package/build-module/dataform-controls/password.js +38 -0
- package/build-module/dataform-controls/password.js.map +1 -0
- package/build-module/dataform-controls/radio.js +44 -11
- package/build-module/dataform-controls/radio.js.map +1 -1
- package/build-module/dataform-controls/relative-date-control.js +6 -10
- package/build-module/dataform-controls/relative-date-control.js.map +1 -1
- package/build-module/dataform-controls/select.js +43 -12
- package/build-module/dataform-controls/select.js.map +1 -1
- package/build-module/dataform-controls/telephone.js +8 -2
- package/build-module/dataform-controls/telephone.js.map +1 -1
- package/build-module/dataform-controls/text.js +15 -3
- package/build-module/dataform-controls/text.js.map +1 -1
- package/build-module/dataform-controls/textarea.js +74 -0
- package/build-module/dataform-controls/textarea.js.map +1 -0
- package/build-module/dataform-controls/toggle-group.js +38 -8
- package/build-module/dataform-controls/toggle-group.js.map +1 -1
- package/build-module/dataform-controls/toggle.js +33 -23
- package/build-module/dataform-controls/toggle.js.map +1 -1
- package/build-module/dataform-controls/url.js +8 -2
- package/build-module/dataform-controls/url.js.map +1 -1
- package/build-module/dataform-controls/utils/validated-input.js +76 -0
- package/build-module/dataform-controls/utils/validated-input.js.map +1 -0
- package/build-module/dataforms-layouts/panel/dropdown.js +10 -15
- package/build-module/dataforms-layouts/panel/dropdown.js.map +1 -1
- package/build-module/dataforms-layouts/panel/index.js +24 -11
- package/build-module/dataforms-layouts/panel/index.js.map +1 -1
- package/build-module/dataforms-layouts/panel/modal.js +22 -28
- package/build-module/dataforms-layouts/panel/modal.js.map +1 -1
- package/build-module/dataforms-layouts/panel/summary-button.js +60 -0
- package/build-module/dataforms-layouts/panel/summary-button.js.map +1 -0
- package/build-module/dataforms-layouts/regular/index.js +8 -10
- package/build-module/dataforms-layouts/regular/index.js.map +1 -1
- package/build-module/dataviews-layouts/grid/index.js +6 -16
- package/build-module/dataviews-layouts/grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/list/index.js +48 -3
- package/build-module/dataviews-layouts/list/index.js.map +1 -1
- package/build-module/dataviews-layouts/picker-grid/index.js +6 -16
- package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/table/index.js +5 -17
- package/build-module/dataviews-layouts/table/index.js.map +1 -1
- package/build-module/dataviews-layouts/utils/get-data-by-group.js +17 -0
- package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
- package/build-module/field-types/index.js +4 -0
- package/build-module/field-types/index.js.map +1 -1
- package/build-module/field-types/password.js +46 -0
- package/build-module/field-types/password.js.map +1 -0
- package/build-module/normalize-fields.js +15 -0
- package/build-module/normalize-fields.js.map +1 -1
- package/build-module/types.js.map +1 -1
- package/build-module/validation.js +1 -1
- package/build-module/validation.js.map +1 -1
- package/build-style/style-rtl.css +9 -6
- package/build-style/style.css +9 -6
- package/build-types/components/dataform/stories/index.story.d.ts +3 -14
- package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/fixtures.d.ts +4 -2
- package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
- package/build-types/dataform-controls/array.d.ts.map +1 -1
- package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
- package/build-types/dataform-controls/color.d.ts.map +1 -1
- package/build-types/dataform-controls/date.d.ts.map +1 -1
- package/build-types/dataform-controls/datetime.d.ts.map +1 -1
- package/build-types/dataform-controls/email.d.ts.map +1 -1
- package/build-types/dataform-controls/index.d.ts +1 -1
- package/build-types/dataform-controls/index.d.ts.map +1 -1
- package/build-types/dataform-controls/integer.d.ts.map +1 -1
- package/build-types/dataform-controls/password.d.ts +3 -0
- package/build-types/dataform-controls/password.d.ts.map +1 -0
- package/build-types/dataform-controls/radio.d.ts.map +1 -1
- package/build-types/dataform-controls/relative-date-control.d.ts +6 -5
- package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -1
- package/build-types/dataform-controls/select.d.ts.map +1 -1
- package/build-types/dataform-controls/telephone.d.ts.map +1 -1
- package/build-types/dataform-controls/text.d.ts +1 -1
- package/build-types/dataform-controls/text.d.ts.map +1 -1
- package/build-types/dataform-controls/textarea.d.ts +6 -0
- package/build-types/dataform-controls/textarea.d.ts.map +1 -0
- package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
- package/build-types/dataform-controls/toggle.d.ts.map +1 -1
- package/build-types/dataform-controls/url.d.ts.map +1 -1
- package/build-types/dataform-controls/utils/validated-input.d.ts +20 -0
- package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -0
- package/build-types/dataforms-layouts/panel/dropdown.d.ts +2 -1
- package/build-types/dataforms-layouts/panel/dropdown.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/modal.d.ts +2 -1
- package/build-types/dataforms-layouts/panel/modal.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/summary-button.d.ts +15 -0
- package/build-types/dataforms-layouts/panel/summary-button.d.ts.map +1 -0
- package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts +6 -0
- package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts.map +1 -0
- package/build-types/field-types/index.d.ts.map +1 -1
- package/build-types/field-types/password.d.ts +17 -0
- package/build-types/field-types/password.d.ts.map +1 -0
- package/build-types/field-types/stories/index.story.d.ts +5 -1
- package/build-types/field-types/stories/index.story.d.ts.map +1 -1
- package/build-types/normalize-fields.d.ts +3 -0
- package/build-types/normalize-fields.d.ts.map +1 -1
- package/build-types/types.d.ts +67 -4
- package/build-types/types.d.ts.map +1 -1
- package/build-types/validation.d.ts.map +1 -1
- package/build-wp/index.js +1670 -1350
- package/package.json +16 -15
- package/src/components/dataform/stories/index.story.tsx +489 -17
- package/src/components/dataviews/stories/fixtures.tsx +99 -41
- package/src/components/dataviews/stories/index.story.tsx +2 -2
- package/src/components/dataviews-filters/input-widget.tsx +44 -5
- package/src/components/dataviews-layout/index.tsx +1 -1
- package/src/components/dataviews-picker/stories/index.story.tsx +1 -1
- package/src/dataform-controls/array.tsx +4 -6
- package/src/dataform-controls/checkbox.tsx +41 -24
- package/src/dataform-controls/color.tsx +33 -24
- package/src/dataform-controls/date.tsx +47 -21
- package/src/dataform-controls/datetime.tsx +171 -23
- package/src/dataform-controls/email.tsx +10 -2
- package/src/dataform-controls/index.tsx +30 -0
- package/src/dataform-controls/integer.tsx +82 -49
- package/src/dataform-controls/password.tsx +50 -0
- package/src/dataform-controls/radio.tsx +53 -11
- package/src/dataform-controls/relative-date-control.tsx +11 -10
- package/src/dataform-controls/select.tsx +53 -10
- package/src/dataform-controls/telephone.tsx +10 -2
- package/src/dataform-controls/text.tsx +19 -2
- package/src/dataform-controls/textarea.tsx +85 -0
- package/src/dataform-controls/toggle-group.tsx +50 -10
- package/src/dataform-controls/toggle.tsx +41 -24
- package/src/dataform-controls/url.tsx +10 -2
- package/src/dataform-controls/utils/validated-input.tsx +109 -0
- package/src/dataforms-layouts/panel/dropdown.tsx +12 -23
- package/src/dataforms-layouts/panel/index.tsx +39 -16
- package/src/dataforms-layouts/panel/modal.tsx +24 -30
- package/src/dataforms-layouts/panel/summary-button.tsx +92 -0
- package/src/dataforms-layouts/regular/index.tsx +9 -7
- package/src/dataforms-layouts/regular/style.scss +0 -6
- package/src/dataviews-layouts/grid/index.tsx +9 -14
- package/src/dataviews-layouts/grid/style.scss +1 -0
- package/src/dataviews-layouts/list/index.tsx +74 -2
- package/src/dataviews-layouts/list/style.scss +8 -0
- package/src/dataviews-layouts/picker-grid/index.tsx +9 -13
- package/src/dataviews-layouts/table/index.tsx +10 -14
- package/src/dataviews-layouts/utils/get-data-by-group.ts +18 -0
- package/src/field-types/index.tsx +5 -0
- package/src/field-types/password.tsx +46 -0
- package/src/field-types/stories/index.story.tsx +138 -1
- package/src/normalize-fields.ts +18 -0
- package/src/test/filter-and-sort-data-view.js +148 -138
- package/src/test/normalize-fields.ts +114 -0
- package/src/types.ts +74 -3
- package/src/validation.ts +2 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/build/dataform-controls/utils/validated-text.js.map +0 -1
- package/build-module/dataform-controls/utils/validated-text.js +0 -70
- package/build-module/dataform-controls/utils/validated-text.js.map +0 -1
- package/build-types/dataform-controls/utils/validated-text.d.ts +0 -16
- package/build-types/dataform-controls/utils/validated-text.d.ts.map +0 -1
- 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
|
-
|
|
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 &&
|
|
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: '
|
|
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,
|
package/src/normalize-fields.ts
CHANGED
|
@@ -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,
|