@wordpress/dataviews 5.0.1-next.719a03cbe.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -4
- package/README.md +55 -26
- package/build/components/dataviews/index.js +13 -4
- package/build/components/dataviews/index.js.map +1 -1
- package/build/components/dataviews-context/index.js +3 -1
- package/build/components/dataviews-context/index.js.map +1 -1
- package/build/components/dataviews-filters/filter.js +15 -8
- package/build/components/dataviews-filters/filter.js.map +1 -1
- package/build/components/dataviews-filters/index.js +16 -5
- package/build/components/dataviews-filters/index.js.map +1 -1
- package/build/components/dataviews-filters/input-widget.js +7 -1
- package/build/components/dataviews-filters/input-widget.js.map +1 -1
- package/build/components/dataviews-filters/reset-filters.js +2 -2
- package/build/components/dataviews-filters/reset-filters.js.map +1 -1
- package/build/components/dataviews-layout/index.js +5 -2
- package/build/components/dataviews-layout/index.js.map +1 -1
- package/build/components/dataviews-view-config/index.js +4 -3
- package/build/components/dataviews-view-config/index.js.map +1 -1
- package/build/dataform-controls/boolean.js +15 -1
- package/build/dataform-controls/boolean.js.map +1 -1
- package/build/dataform-controls/date.js +385 -0
- package/build/dataform-controls/date.js.map +1 -0
- package/build/dataform-controls/datetime.js +5 -84
- package/build/dataform-controls/datetime.js.map +1 -1
- package/build/dataform-controls/email.js +15 -1
- package/build/dataform-controls/email.js.map +1 -1
- package/build/dataform-controls/index.js +2 -0
- package/build/dataform-controls/index.js.map +1 -1
- package/build/dataform-controls/integer.js +23 -4
- package/build/dataform-controls/integer.js.map +1 -1
- package/build/dataform-controls/relative-date-control.js +109 -0
- package/build/dataform-controls/relative-date-control.js.map +1 -0
- package/build/dataform-controls/select.js +12 -5
- package/build/dataform-controls/select.js.map +1 -1
- package/build/dataform-controls/text.js +15 -1
- package/build/dataform-controls/text.js.map +1 -1
- package/build/dataviews-layouts/grid/index.js +91 -18
- package/build/dataviews-layouts/grid/index.js.map +1 -1
- package/build/dataviews-layouts/grid/preview-size-picker.js +39 -85
- package/build/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
- package/build/dataviews-layouts/list/index.js +7 -3
- package/build/dataviews-layouts/list/index.js.map +1 -1
- package/build/dataviews-layouts/table/column-primary.js +18 -3
- package/build/dataviews-layouts/table/column-primary.js.map +1 -1
- package/build/dataviews-layouts/table/index.js +57 -5
- package/build/dataviews-layouts/table/index.js.map +1 -1
- package/build/field-types/array.js +27 -18
- package/build/field-types/array.js.map +1 -1
- package/build/field-types/boolean.js +11 -7
- package/build/field-types/boolean.js.map +1 -1
- package/build/field-types/date.js +66 -0
- package/build/field-types/date.js.map +1 -0
- package/build/field-types/datetime.js +19 -10
- package/build/field-types/datetime.js.map +1 -1
- package/build/field-types/email.js +22 -18
- package/build/field-types/email.js.map +1 -1
- package/build/field-types/index.js +20 -6
- package/build/field-types/index.js.map +1 -1
- package/build/field-types/integer.js +22 -17
- package/build/field-types/integer.js.map +1 -1
- package/build/field-types/media.js +19 -10
- package/build/field-types/media.js.map +1 -1
- package/build/field-types/text.js +19 -10
- package/build/field-types/text.js.map +1 -1
- package/build/filter-and-sort-data-view.js +28 -14
- package/build/filter-and-sort-data-view.js.map +1 -1
- package/build/normalize-fields.js +4 -5
- package/build/normalize-fields.js.map +1 -1
- package/build/types.js.map +1 -1
- package/build/validation.js +15 -2
- package/build/validation.js.map +1 -1
- package/build-module/components/dataviews/index.js +15 -6
- package/build-module/components/dataviews/index.js.map +1 -1
- package/build-module/components/dataviews-context/index.js +3 -1
- package/build-module/components/dataviews-context/index.js.map +1 -1
- package/build-module/components/dataviews-filters/filter.js +15 -8
- package/build-module/components/dataviews-filters/filter.js.map +1 -1
- package/build-module/components/dataviews-filters/index.js +16 -5
- package/build-module/components/dataviews-filters/index.js.map +1 -1
- package/build-module/components/dataviews-filters/input-widget.js +7 -1
- package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
- package/build-module/components/dataviews-filters/reset-filters.js +2 -2
- package/build-module/components/dataviews-filters/reset-filters.js.map +1 -1
- package/build-module/components/dataviews-layout/index.js +5 -2
- package/build-module/components/dataviews-layout/index.js.map +1 -1
- package/build-module/components/dataviews-view-config/index.js +4 -3
- package/build-module/components/dataviews-view-config/index.js.map +1 -1
- package/build-module/dataform-controls/boolean.js +17 -2
- package/build-module/dataform-controls/boolean.js.map +1 -1
- package/build-module/dataform-controls/date.js +376 -0
- package/build-module/dataform-controls/date.js.map +1 -0
- package/build-module/dataform-controls/datetime.js +3 -84
- package/build-module/dataform-controls/datetime.js.map +1 -1
- package/build-module/dataform-controls/email.js +17 -2
- package/build-module/dataform-controls/email.js.map +1 -1
- package/build-module/dataform-controls/index.js +2 -0
- package/build-module/dataform-controls/index.js.map +1 -1
- package/build-module/dataform-controls/integer.js +24 -5
- package/build-module/dataform-controls/integer.js.map +1 -1
- package/build-module/dataform-controls/relative-date-control.js +100 -0
- package/build-module/dataform-controls/relative-date-control.js.map +1 -0
- package/build-module/dataform-controls/select.js +12 -5
- package/build-module/dataform-controls/select.js.map +1 -1
- package/build-module/dataform-controls/text.js +17 -2
- package/build-module/dataform-controls/text.js.map +1 -1
- package/build-module/dataviews-layouts/grid/index.js +93 -20
- package/build-module/dataviews-layouts/grid/index.js.map +1 -1
- package/build-module/dataviews-layouts/grid/preview-size-picker.js +40 -85
- package/build-module/dataviews-layouts/grid/preview-size-picker.js.map +1 -1
- package/build-module/dataviews-layouts/list/index.js +7 -3
- package/build-module/dataviews-layouts/list/index.js.map +1 -1
- package/build-module/dataviews-layouts/table/column-primary.js +18 -3
- package/build-module/dataviews-layouts/table/column-primary.js.map +1 -1
- package/build-module/dataviews-layouts/table/index.js +58 -6
- package/build-module/dataviews-layouts/table/index.js.map +1 -1
- package/build-module/field-types/array.js +27 -18
- package/build-module/field-types/array.js.map +1 -1
- package/build-module/field-types/boolean.js +11 -7
- package/build-module/field-types/boolean.js.map +1 -1
- package/build-module/field-types/date.js +60 -0
- package/build-module/field-types/date.js.map +1 -0
- package/build-module/field-types/datetime.js +19 -10
- package/build-module/field-types/datetime.js.map +1 -1
- package/build-module/field-types/email.js +22 -18
- package/build-module/field-types/email.js.map +1 -1
- package/build-module/field-types/index.js +20 -6
- package/build-module/field-types/index.js.map +1 -1
- package/build-module/field-types/integer.js +22 -17
- package/build-module/field-types/integer.js.map +1 -1
- package/build-module/field-types/media.js +19 -10
- package/build-module/field-types/media.js.map +1 -1
- package/build-module/field-types/text.js +19 -10
- package/build-module/field-types/text.js.map +1 -1
- package/build-module/filter-and-sort-data-view.js +28 -14
- package/build-module/filter-and-sort-data-view.js.map +1 -1
- package/build-module/normalize-fields.js +4 -5
- package/build-module/normalize-fields.js.map +1 -1
- package/build-module/types.js.map +1 -1
- package/build-module/validation.js +15 -2
- package/build-module/validation.js.map +1 -1
- package/build-style/style-rtl.css +84 -41
- package/build-style/style.css +84 -41
- package/build-types/components/dataform/stories/index.story.d.ts +21 -0
- package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataviews/index.d.ts +3 -2
- package/build-types/components/dataviews/index.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/fixtures.d.ts +1 -0
- package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/index.story.d.ts +16 -2
- package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataviews-context/index.d.ts +4 -2
- package/build-types/components/dataviews-context/index.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/index.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/reset-filters.d.ts.map +1 -1
- package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
- package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
- package/build-types/components/stories/index.story.d.ts +4 -0
- package/build-types/components/stories/index.story.d.ts.map +1 -1
- package/build-types/constants.d.ts +2 -2
- package/build-types/dataform-controls/boolean.d.ts.map +1 -1
- package/build-types/dataform-controls/date.d.ts +3 -0
- package/build-types/dataform-controls/date.d.ts.map +1 -0
- 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.map +1 -1
- package/build-types/dataform-controls/integer.d.ts.map +1 -1
- package/build-types/dataform-controls/relative-date-control.d.ts +46 -0
- package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -0
- package/build-types/dataform-controls/select.d.ts.map +1 -1
- package/build-types/dataform-controls/text.d.ts.map +1 -1
- package/build-types/dataviews-layouts/grid/index.d.ts +1 -1
- package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/grid/preview-size-picker.d.ts +0 -1
- package/build-types/dataviews-layouts/grid/preview-size-picker.d.ts.map +1 -1
- package/build-types/dataviews-layouts/index.d.ts +3 -3
- package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/index.d.ts +1 -1
- package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
- package/build-types/field-types/array.d.ts.map +1 -1
- package/build-types/field-types/boolean.d.ts +5 -4
- package/build-types/field-types/boolean.d.ts.map +1 -1
- package/build-types/field-types/date.d.ts +20 -0
- package/build-types/field-types/date.d.ts.map +1 -0
- package/build-types/field-types/datetime.d.ts +4 -3
- package/build-types/field-types/datetime.d.ts.map +1 -1
- package/build-types/field-types/email.d.ts +4 -3
- package/build-types/field-types/email.d.ts.map +1 -1
- package/build-types/field-types/index.d.ts.map +1 -1
- package/build-types/field-types/integer.d.ts +4 -3
- package/build-types/field-types/integer.d.ts.map +1 -1
- package/build-types/field-types/media.d.ts +4 -3
- package/build-types/field-types/media.d.ts.map +1 -1
- package/build-types/field-types/text.d.ts +4 -3
- package/build-types/field-types/text.d.ts.map +1 -1
- package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
- package/build-types/normalize-fields.d.ts.map +1 -1
- package/build-types/types.d.ts +25 -8
- package/build-types/types.d.ts.map +1 -1
- package/build-types/validation.d.ts.map +1 -1
- package/build-wp/index.js +2196 -739
- package/package.json +15 -14
- package/src/components/dataform/stories/index.story.tsx +229 -2
- package/src/components/dataviews/index.tsx +30 -10
- package/src/components/dataviews/stories/fixtures.tsx +82 -59
- package/src/components/dataviews/stories/index.story.tsx +65 -8
- package/src/components/dataviews/stories/style.css +6 -0
- package/src/components/dataviews-context/index.ts +8 -2
- package/src/components/dataviews-filters/filter.tsx +17 -7
- package/src/components/dataviews-filters/index.tsx +17 -2
- package/src/components/dataviews-filters/input-widget.tsx +7 -1
- package/src/components/dataviews-filters/reset-filters.tsx +4 -2
- package/src/components/dataviews-filters/style.scss +8 -2
- package/src/components/dataviews-layout/index.tsx +3 -0
- package/src/components/dataviews-view-config/index.tsx +5 -3
- package/src/components/stories/index.story.tsx +21 -0
- package/src/dataform-controls/boolean.tsx +19 -2
- package/src/dataform-controls/date.tsx +499 -0
- package/src/dataform-controls/datetime.tsx +5 -91
- package/src/dataform-controls/email.tsx +19 -2
- package/src/dataform-controls/index.tsx +2 -0
- package/src/dataform-controls/integer.tsx +30 -4
- package/src/dataform-controls/relative-date-control.tsx +106 -0
- package/src/dataform-controls/select.tsx +23 -13
- package/src/dataform-controls/style.scss +19 -2
- package/src/dataform-controls/text.tsx +19 -2
- package/src/dataviews-layouts/grid/index.tsx +168 -55
- package/src/dataviews-layouts/grid/preview-size-picker.tsx +48 -73
- package/src/dataviews-layouts/grid/style.scss +21 -26
- package/src/dataviews-layouts/list/index.tsx +7 -4
- package/src/dataviews-layouts/list/style.scss +3 -3
- package/src/dataviews-layouts/table/column-primary.tsx +29 -5
- package/src/dataviews-layouts/table/index.tsx +134 -42
- package/src/dataviews-layouts/table/style.scss +45 -1
- package/src/field-types/array.tsx +33 -21
- package/src/field-types/boolean.tsx +15 -9
- package/src/field-types/date.ts +92 -0
- package/src/field-types/datetime.tsx +19 -13
- package/src/field-types/email.tsx +26 -21
- package/src/field-types/index.tsx +23 -8
- package/src/field-types/integer.tsx +26 -22
- package/src/field-types/media.tsx +19 -13
- package/src/field-types/text.tsx +19 -13
- package/src/filter-and-sort-data-view.ts +38 -13
- package/src/normalize-fields.ts +4 -8
- package/src/test/dataviews.tsx +129 -0
- package/src/test/filter-and-sort-data-view.js +150 -31
- package/src/test/validation.ts +4 -15
- package/src/types.ts +34 -8
- package/src/validation.ts +30 -1
- package/tsconfig.json +1 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { __ } from '@wordpress/i18n';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
7
|
* Internal dependencies
|
|
3
8
|
*/
|
|
4
9
|
import type {
|
|
5
10
|
DataViewRenderFieldProps,
|
|
6
11
|
SortDirection,
|
|
7
|
-
ValidationContext,
|
|
8
12
|
FieldTypeDefinition,
|
|
13
|
+
NormalizedField,
|
|
9
14
|
} from '../types';
|
|
10
15
|
import {
|
|
11
16
|
OPERATOR_IS_ALL,
|
|
@@ -31,25 +36,6 @@ function sort( valueA: any, valueB: any, direction: SortDirection ) {
|
|
|
31
36
|
: joinedB.localeCompare( joinedA );
|
|
32
37
|
}
|
|
33
38
|
|
|
34
|
-
function isValid( value: any, context?: ValidationContext ) {
|
|
35
|
-
if ( ! Array.isArray( value ) ) {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Only allow strings for now. Can be extended to other types in the future.
|
|
40
|
-
if ( ! value.every( ( v ) => typeof v === 'string' ) ) {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if ( context?.elements ) {
|
|
45
|
-
const validValues = context.elements.map( ( f ) => f.value );
|
|
46
|
-
if ( ! value.every( ( v ) => validValues.includes( v ) ) ) {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
39
|
function render( { item, field }: DataViewRenderFieldProps< any > ) {
|
|
54
40
|
const value = field.getValue( { item } ) || [];
|
|
55
41
|
return value.join( ', ' );
|
|
@@ -57,7 +43,33 @@ function render( { item, field }: DataViewRenderFieldProps< any > ) {
|
|
|
57
43
|
|
|
58
44
|
const arrayFieldType: FieldTypeDefinition< any > = {
|
|
59
45
|
sort,
|
|
60
|
-
isValid
|
|
46
|
+
isValid: {
|
|
47
|
+
custom: ( item: any, field: NormalizedField< any > ) => {
|
|
48
|
+
const value = field.getValue( { item } );
|
|
49
|
+
|
|
50
|
+
if (
|
|
51
|
+
! [ undefined, '', null ].includes( value ) &&
|
|
52
|
+
! Array.isArray( value )
|
|
53
|
+
) {
|
|
54
|
+
return __( 'Value must be an array.' );
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Only allow strings for now. Can be extended to other types in the future.
|
|
58
|
+
if ( ! value.every( ( v: any ) => typeof v === 'string' ) ) {
|
|
59
|
+
return __( 'Every value must be a string.' );
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if ( field?.elements ) {
|
|
63
|
+
const validValues = field.elements.map( ( f ) => f.value );
|
|
64
|
+
if (
|
|
65
|
+
! value.every( ( v: any ) => validValues.includes( v ) )
|
|
66
|
+
) {
|
|
67
|
+
return __( 'Value must be one of the elements.' );
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
},
|
|
72
|
+
},
|
|
61
73
|
Edit: null, // Not implemented yet
|
|
62
74
|
render,
|
|
63
75
|
enableSorting: true,
|
|
@@ -10,6 +10,7 @@ import type {
|
|
|
10
10
|
DataViewRenderFieldProps,
|
|
11
11
|
SortDirection,
|
|
12
12
|
FieldTypeDefinition,
|
|
13
|
+
NormalizedField,
|
|
13
14
|
} from '../types';
|
|
14
15
|
import { renderFromElements } from '../utils';
|
|
15
16
|
import { OPERATOR_IS, OPERATOR_IS_NOT } from '../constants';
|
|
@@ -31,17 +32,22 @@ function sort( a: any, b: any, direction: SortDirection ) {
|
|
|
31
32
|
return boolA ? -1 : 1;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
function isValid( value: any ) {
|
|
35
|
-
if ( ! [ true, false, undefined ].includes( value ) ) {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
35
|
export default {
|
|
43
36
|
sort,
|
|
44
|
-
isValid
|
|
37
|
+
isValid: {
|
|
38
|
+
custom: ( item: any, field: NormalizedField< any > ) => {
|
|
39
|
+
const value = field.getValue( { item } );
|
|
40
|
+
|
|
41
|
+
if (
|
|
42
|
+
! [ undefined, '', null ].includes( value ) &&
|
|
43
|
+
! [ true, false ].includes( value )
|
|
44
|
+
) {
|
|
45
|
+
return __( 'Value must be true, false, or undefined' );
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return null;
|
|
49
|
+
},
|
|
50
|
+
},
|
|
45
51
|
Edit: 'boolean',
|
|
46
52
|
render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
|
|
47
53
|
if ( field.elements ) {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { dateI18n, getDate, getSettings } from '@wordpress/date';
|
|
5
|
+
import { __ } from '@wordpress/i18n';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Internal dependencies
|
|
9
|
+
*/
|
|
10
|
+
import type {
|
|
11
|
+
DataViewRenderFieldProps,
|
|
12
|
+
SortDirection,
|
|
13
|
+
NormalizedField,
|
|
14
|
+
FieldTypeDefinition,
|
|
15
|
+
} from '../types';
|
|
16
|
+
import { renderFromElements } from '../utils';
|
|
17
|
+
import {
|
|
18
|
+
OPERATOR_ON,
|
|
19
|
+
OPERATOR_NOT_ON,
|
|
20
|
+
OPERATOR_BEFORE,
|
|
21
|
+
OPERATOR_AFTER,
|
|
22
|
+
OPERATOR_BEFORE_INC,
|
|
23
|
+
OPERATOR_AFTER_INC,
|
|
24
|
+
OPERATOR_IN_THE_PAST,
|
|
25
|
+
OPERATOR_OVER,
|
|
26
|
+
OPERATOR_BETWEEN,
|
|
27
|
+
} from '../constants';
|
|
28
|
+
|
|
29
|
+
const getFormattedDate = ( dateToDisplay: string | null ) =>
|
|
30
|
+
dateI18n( getSettings().formats.date, getDate( dateToDisplay ) );
|
|
31
|
+
|
|
32
|
+
function sort( a: any, b: any, direction: SortDirection ) {
|
|
33
|
+
const timeA = new Date( a ).getTime();
|
|
34
|
+
const timeB = new Date( b ).getTime();
|
|
35
|
+
|
|
36
|
+
return direction === 'asc' ? timeA - timeB : timeB - timeA;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default {
|
|
40
|
+
sort,
|
|
41
|
+
Edit: 'date',
|
|
42
|
+
isValid: {
|
|
43
|
+
custom: ( item: any, field: NormalizedField< any > ) => {
|
|
44
|
+
const value = field.getValue( { item } );
|
|
45
|
+
if ( field?.elements ) {
|
|
46
|
+
const validValues = field.elements.map( ( f ) => f.value );
|
|
47
|
+
if ( ! validValues.includes( value ) ) {
|
|
48
|
+
return __( 'Value must be one of the elements.' );
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return null;
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
|
|
56
|
+
if ( field.elements ) {
|
|
57
|
+
return renderFromElements( { item, field } );
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const value = field.getValue( { item } );
|
|
61
|
+
if ( ! value ) {
|
|
62
|
+
return '';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return getFormattedDate( value );
|
|
66
|
+
},
|
|
67
|
+
enableSorting: true,
|
|
68
|
+
filterBy: {
|
|
69
|
+
defaultOperators: [
|
|
70
|
+
OPERATOR_ON,
|
|
71
|
+
OPERATOR_NOT_ON,
|
|
72
|
+
OPERATOR_BEFORE,
|
|
73
|
+
OPERATOR_AFTER,
|
|
74
|
+
OPERATOR_BEFORE_INC,
|
|
75
|
+
OPERATOR_AFTER_INC,
|
|
76
|
+
OPERATOR_IN_THE_PAST,
|
|
77
|
+
OPERATOR_OVER,
|
|
78
|
+
OPERATOR_BETWEEN,
|
|
79
|
+
],
|
|
80
|
+
validOperators: [
|
|
81
|
+
OPERATOR_ON,
|
|
82
|
+
OPERATOR_NOT_ON,
|
|
83
|
+
OPERATOR_BEFORE,
|
|
84
|
+
OPERATOR_AFTER,
|
|
85
|
+
OPERATOR_BEFORE_INC,
|
|
86
|
+
OPERATOR_AFTER_INC,
|
|
87
|
+
OPERATOR_IN_THE_PAST,
|
|
88
|
+
OPERATOR_OVER,
|
|
89
|
+
OPERATOR_BETWEEN,
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
} satisfies FieldTypeDefinition< any >;
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { __ } from '@wordpress/i18n';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
7
|
* Internal dependencies
|
|
3
8
|
*/
|
|
4
9
|
import type {
|
|
5
10
|
DataViewRenderFieldProps,
|
|
6
11
|
SortDirection,
|
|
7
|
-
|
|
12
|
+
NormalizedField,
|
|
8
13
|
FieldTypeDefinition,
|
|
9
14
|
} from '../types';
|
|
10
15
|
import { renderFromElements } from '../utils';
|
|
@@ -26,20 +31,21 @@ function sort( a: any, b: any, direction: SortDirection ) {
|
|
|
26
31
|
return direction === 'asc' ? timeA - timeB : timeB - timeA;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
|
-
function isValid( value: any, context?: ValidationContext ) {
|
|
30
|
-
if ( context?.elements ) {
|
|
31
|
-
const validValues = context?.elements.map( ( f ) => f.value );
|
|
32
|
-
if ( ! validValues.includes( value ) ) {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
34
|
export default {
|
|
41
35
|
sort,
|
|
42
|
-
isValid
|
|
36
|
+
isValid: {
|
|
37
|
+
custom: ( item: any, field: NormalizedField< any > ) => {
|
|
38
|
+
const value = field.getValue( { item } );
|
|
39
|
+
if ( field?.elements ) {
|
|
40
|
+
const validValues = field.elements.map( ( f ) => f.value );
|
|
41
|
+
if ( ! validValues.includes( value ) ) {
|
|
42
|
+
return __( 'Value must be one of the elements.' );
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return null;
|
|
47
|
+
},
|
|
48
|
+
},
|
|
43
49
|
Edit: 'datetime',
|
|
44
50
|
render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
|
|
45
51
|
return field.elements
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WordPress dependencies
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { __ } from '@wordpress/i18n';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Internal dependencies
|
|
@@ -9,7 +9,7 @@ import { isEmail } from '@wordpress/url';
|
|
|
9
9
|
import type {
|
|
10
10
|
DataViewRenderFieldProps,
|
|
11
11
|
SortDirection,
|
|
12
|
-
|
|
12
|
+
NormalizedField,
|
|
13
13
|
FieldTypeDefinition,
|
|
14
14
|
} from '../types';
|
|
15
15
|
import { renderFromElements } from '../utils';
|
|
@@ -31,29 +31,34 @@ function sort( valueA: any, valueB: any, direction: SortDirection ) {
|
|
|
31
31
|
: valueB.localeCompare( valueA );
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
34
|
+
// Email validation regex based on HTML5 spec
|
|
35
|
+
// https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
|
|
36
|
+
const emailRegex =
|
|
37
|
+
/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
|
39
38
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
export default {
|
|
40
|
+
sort,
|
|
41
|
+
isValid: {
|
|
42
|
+
custom: ( item: any, field: NormalizedField< any > ) => {
|
|
43
|
+
const value = field.getValue( { item } );
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
if (
|
|
46
|
+
! [ undefined, '', null ].includes( value ) &&
|
|
47
|
+
! emailRegex.test( value )
|
|
48
|
+
) {
|
|
49
|
+
return __( 'Value must be a valid email address.' );
|
|
50
|
+
}
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
if ( field.elements ) {
|
|
53
|
+
const validValues = field.elements.map( ( f ) => f.value );
|
|
54
|
+
if ( ! validValues.includes( value ) ) {
|
|
55
|
+
return __( 'Value must be one of the elements.' );
|
|
56
|
+
}
|
|
57
|
+
}
|
|
53
58
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
59
|
+
return null;
|
|
60
|
+
},
|
|
61
|
+
},
|
|
57
62
|
Edit: 'email',
|
|
58
63
|
render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
|
|
59
64
|
return field.elements
|
|
@@ -1,17 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { __ } from '@wordpress/i18n';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
7
|
* Internal dependencies
|
|
3
8
|
*/
|
|
4
9
|
import type {
|
|
5
10
|
DataViewRenderFieldProps,
|
|
11
|
+
NormalizedField,
|
|
6
12
|
FieldType,
|
|
7
13
|
FieldTypeDefinition,
|
|
8
14
|
SortDirection,
|
|
9
|
-
ValidationContext,
|
|
10
15
|
} from '../types';
|
|
11
16
|
import { default as email } from './email';
|
|
12
17
|
import { default as integer } from './integer';
|
|
13
18
|
import { default as text } from './text';
|
|
14
19
|
import { default as datetime } from './datetime';
|
|
20
|
+
import { default as date } from './date';
|
|
15
21
|
import { default as boolean } from './boolean';
|
|
16
22
|
import { default as media } from './media';
|
|
17
23
|
import { default as array } from './array';
|
|
@@ -43,6 +49,10 @@ export default function getFieldTypeDefinition< Item >(
|
|
|
43
49
|
return datetime;
|
|
44
50
|
}
|
|
45
51
|
|
|
52
|
+
if ( 'date' === type ) {
|
|
53
|
+
return date;
|
|
54
|
+
}
|
|
55
|
+
|
|
46
56
|
if ( 'boolean' === type ) {
|
|
47
57
|
return boolean;
|
|
48
58
|
}
|
|
@@ -67,15 +77,20 @@ export default function getFieldTypeDefinition< Item >(
|
|
|
67
77
|
? a.localeCompare( b )
|
|
68
78
|
: b.localeCompare( a );
|
|
69
79
|
},
|
|
70
|
-
isValid:
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
80
|
+
isValid: {
|
|
81
|
+
custom: ( item: any, field: NormalizedField< any > ) => {
|
|
82
|
+
if ( field?.elements ) {
|
|
83
|
+
const value = field.getValue( { item } );
|
|
84
|
+
const validValues = field?.elements?.map(
|
|
85
|
+
( f ) => f.value
|
|
86
|
+
);
|
|
87
|
+
if ( ! validValues.includes( value ) ) {
|
|
88
|
+
return __( 'Value must be one of the elements.' );
|
|
89
|
+
}
|
|
75
90
|
}
|
|
76
|
-
}
|
|
77
91
|
|
|
78
|
-
|
|
92
|
+
return null;
|
|
93
|
+
},
|
|
79
94
|
},
|
|
80
95
|
Edit: null,
|
|
81
96
|
render: ( { item, field }: DataViewRenderFieldProps< Item > ) => {
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { __ } from '@wordpress/i18n';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
7
|
* Internal dependencies
|
|
3
8
|
*/
|
|
4
9
|
import type {
|
|
5
10
|
DataViewRenderFieldProps,
|
|
6
11
|
SortDirection,
|
|
7
|
-
|
|
12
|
+
NormalizedField,
|
|
8
13
|
FieldTypeDefinition,
|
|
9
14
|
} from '../types';
|
|
10
15
|
import { renderFromElements } from '../utils';
|
|
@@ -26,29 +31,28 @@ function sort( a: any, b: any, direction: SortDirection ) {
|
|
|
26
31
|
return direction === 'asc' ? a - b : b - a;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
|
-
function isValid( value: any, context?: ValidationContext ) {
|
|
30
|
-
// TODO: this implicitly means the value is required.
|
|
31
|
-
if ( value === '' ) {
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if ( ! Number.isInteger( Number( value ) ) ) {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if ( context?.elements ) {
|
|
40
|
-
const validValues = context?.elements.map( ( f ) => f.value );
|
|
41
|
-
if ( ! validValues.includes( Number( value ) ) ) {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
34
|
export default {
|
|
50
35
|
sort,
|
|
51
|
-
isValid
|
|
36
|
+
isValid: {
|
|
37
|
+
custom: ( item: any, field: NormalizedField< any > ) => {
|
|
38
|
+
const value = field.getValue( { item } );
|
|
39
|
+
if (
|
|
40
|
+
! [ undefined, '', null ].includes( value ) &&
|
|
41
|
+
! Number.isInteger( value )
|
|
42
|
+
) {
|
|
43
|
+
return __( 'Value must be an integer.' );
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if ( field?.elements ) {
|
|
47
|
+
const validValues = field.elements.map( ( f ) => f.value );
|
|
48
|
+
if ( ! validValues.includes( Number( value ) ) ) {
|
|
49
|
+
return __( 'Value must be one of the elements.' );
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return null;
|
|
54
|
+
},
|
|
55
|
+
},
|
|
52
56
|
Edit: 'integer',
|
|
53
57
|
render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
|
|
54
58
|
return field.elements
|
|
@@ -1,26 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { __ } from '@wordpress/i18n';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
7
|
* Internal dependencies
|
|
3
8
|
*/
|
|
4
|
-
import type {
|
|
9
|
+
import type { NormalizedField, FieldTypeDefinition } from '../types';
|
|
5
10
|
|
|
6
11
|
function sort() {
|
|
7
12
|
return 0;
|
|
8
13
|
}
|
|
9
14
|
|
|
10
|
-
function isValid( value: any, context?: ValidationContext ) {
|
|
11
|
-
if ( context?.elements ) {
|
|
12
|
-
const validValues = context?.elements.map( ( f ) => f.value );
|
|
13
|
-
if ( ! validValues.includes( value ) ) {
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
15
|
export default {
|
|
22
16
|
sort,
|
|
23
|
-
isValid
|
|
17
|
+
isValid: {
|
|
18
|
+
custom: ( item: any, field: NormalizedField< any > ) => {
|
|
19
|
+
const value = field.getValue( { item } );
|
|
20
|
+
if ( field?.elements ) {
|
|
21
|
+
const validValues = field.elements.map( ( f ) => f.value );
|
|
22
|
+
if ( ! validValues.includes( value ) ) {
|
|
23
|
+
return __( 'Value must be one of the elements.' );
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return null;
|
|
28
|
+
},
|
|
29
|
+
},
|
|
24
30
|
Edit: null,
|
|
25
31
|
render: () => null,
|
|
26
32
|
enableSorting: false,
|
package/src/field-types/text.tsx
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { __ } from '@wordpress/i18n';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
7
|
* Internal dependencies
|
|
3
8
|
*/
|
|
4
9
|
import type {
|
|
5
10
|
DataViewRenderFieldProps,
|
|
6
11
|
SortDirection,
|
|
7
|
-
|
|
12
|
+
NormalizedField,
|
|
8
13
|
FieldTypeDefinition,
|
|
9
14
|
} from '../types';
|
|
10
15
|
import { renderFromElements } from '../utils';
|
|
@@ -26,20 +31,21 @@ function sort( valueA: any, valueB: any, direction: SortDirection ) {
|
|
|
26
31
|
: valueB.localeCompare( valueA );
|
|
27
32
|
}
|
|
28
33
|
|
|
29
|
-
function isValid( value: any, context?: ValidationContext ) {
|
|
30
|
-
if ( context?.elements ) {
|
|
31
|
-
const validValues = context?.elements?.map( ( f ) => f.value );
|
|
32
|
-
if ( ! validValues.includes( value ) ) {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
34
|
export default {
|
|
41
35
|
sort,
|
|
42
|
-
isValid
|
|
36
|
+
isValid: {
|
|
37
|
+
custom: ( item: any, field: NormalizedField< any > ) => {
|
|
38
|
+
const value = field.getValue( { item } );
|
|
39
|
+
if ( field?.elements ) {
|
|
40
|
+
const validValues = field.elements.map( ( f ) => f.value );
|
|
41
|
+
if ( ! validValues.includes( value ) ) {
|
|
42
|
+
return __( 'Value must be one of the elements.' );
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return null;
|
|
47
|
+
},
|
|
48
|
+
},
|
|
43
49
|
Edit: 'text',
|
|
44
50
|
render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
|
|
45
51
|
return field.elements
|
|
@@ -98,10 +98,17 @@ export function filterSortAndPaginate< Item >(
|
|
|
98
98
|
filteredData = filteredData.filter( ( item ) => {
|
|
99
99
|
return _fields
|
|
100
100
|
.filter( ( field ) => field.enableGlobalSearch )
|
|
101
|
-
.
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
101
|
+
.some( ( field ) => {
|
|
102
|
+
const fieldValue = field.getValue( { item } );
|
|
103
|
+
const values = Array.isArray( fieldValue )
|
|
104
|
+
? fieldValue
|
|
105
|
+
: [ fieldValue ];
|
|
106
|
+
return values.some( ( value ) =>
|
|
107
|
+
normalizeSearchInput( String( value ) ).includes(
|
|
108
|
+
normalizedSearch
|
|
109
|
+
)
|
|
110
|
+
);
|
|
111
|
+
} );
|
|
105
112
|
} );
|
|
106
113
|
}
|
|
107
114
|
|
|
@@ -375,16 +382,34 @@ export function filterSortAndPaginate< Item >(
|
|
|
375
382
|
}
|
|
376
383
|
|
|
377
384
|
// Handle sorting.
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
385
|
+
const sortByField = view.sort?.field
|
|
386
|
+
? _fields.find( ( field ) => {
|
|
387
|
+
return field.id === view.sort?.field;
|
|
388
|
+
} )
|
|
389
|
+
: null;
|
|
390
|
+
const groupByField = view.groupByField
|
|
391
|
+
? _fields.find( ( field ) => {
|
|
392
|
+
return field.id === view.groupByField;
|
|
393
|
+
} )
|
|
394
|
+
: null;
|
|
395
|
+
if ( sortByField || groupByField ) {
|
|
396
|
+
filteredData.sort( ( a, b ) => {
|
|
397
|
+
if ( groupByField ) {
|
|
398
|
+
const groupCompare = groupByField.sort( a, b, 'asc' );
|
|
399
|
+
|
|
400
|
+
// If items are in different groups, return the group comparison result.
|
|
401
|
+
// Otherwise, fall back to sorting by the sort field.
|
|
402
|
+
if ( groupCompare !== 0 ) {
|
|
403
|
+
return groupCompare;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if ( sortByField ) {
|
|
408
|
+
return sortByField.sort( a, b, view.sort?.direction ?? 'desc' );
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
return 0;
|
|
382
412
|
} );
|
|
383
|
-
if ( fieldToSort ) {
|
|
384
|
-
filteredData.sort( ( a, b ) => {
|
|
385
|
-
return fieldToSort.sort( a, b, view.sort?.direction ?? 'desc' );
|
|
386
|
-
} );
|
|
387
|
-
}
|
|
388
413
|
}
|
|
389
414
|
|
|
390
415
|
// Handle pagination.
|
package/src/normalize-fields.ts
CHANGED
|
@@ -139,14 +139,10 @@ export function normalizeFields< Item >(
|
|
|
139
139
|
);
|
|
140
140
|
};
|
|
141
141
|
|
|
142
|
-
const isValid =
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
getValue( { item } ),
|
|
147
|
-
context
|
|
148
|
-
);
|
|
149
|
-
};
|
|
142
|
+
const isValid = {
|
|
143
|
+
...fieldTypeDefinition.isValid,
|
|
144
|
+
...field.isValid,
|
|
145
|
+
};
|
|
150
146
|
|
|
151
147
|
const Edit = getControl( field, fieldTypeDefinition );
|
|
152
148
|
|