Skip to content

Commit e17a2c8

Browse files
committed
Use full item for custom validation functions
1 parent 9b7f0a1 commit e17a2c8

File tree

8 files changed

+90
-38
lines changed

8 files changed

+90
-38
lines changed

packages/dataviews/src/components/dataform/stories/index.story.tsx

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import type {
2626
RegularLayout,
2727
PanelLayout,
2828
CardLayout,
29-
DeepPartial,
3029
} from '../../../types';
3130
import { unlock } from '../../../lock-unlock';
3231

@@ -427,75 +426,72 @@ const ValidationComponent = ( {
427426
password: 'secretpassword123',
428427
} );
429428

430-
const customTextRule = ( value: DeepPartial< ValidatedItem > ) => {
431-
if ( value.text && ! /^[a-zA-Z ]+$/.test( value.text ) ) {
429+
const customTextRule = ( value: ValidatedItem ) => {
430+
if ( ! /^[a-zA-Z ]+$/.test( value.text ) ) {
432431
return 'Value must only contain letters and spaces.';
433432
}
434433

435434
return null;
436435
};
437-
const customTextareaRule = ( value: DeepPartial< ValidatedItem > ) => {
438-
if ( value.textarea && ! /^[a-zA-Z ]+$/.test( value.textarea ) ) {
436+
const customTextareaRule = ( value: ValidatedItem ) => {
437+
if ( ! /^[a-zA-Z ]+$/.test( value.textarea ) ) {
439438
return 'Value must only contain letters and spaces.';
440439
}
441440

442441
return null;
443442
};
444-
const customEmailRule = ( value: DeepPartial< ValidatedItem > ) => {
445-
if (
446-
value.email &&
447-
! /^[a-zA-Z0-9._%+-]+@example\.com$/.test( value.email )
448-
) {
443+
const customEmailRule = ( value: ValidatedItem ) => {
444+
if ( ! /^[a-zA-Z0-9._%+-]+@example\.com$/.test( value.email ) ) {
449445
return 'Email address must be from @example.com domain.';
450446
}
451447

452448
return null;
453449
};
454-
const customTelephoneRule = ( value: DeepPartial< ValidatedItem > ) => {
455-
if ( value.telephone && ! /^\+30\d{10}$/.test( value.telephone ) ) {
450+
const customTelephoneRule = ( value: ValidatedItem ) => {
451+
if ( ! /^\+30\d{10}$/.test( value.telephone ) ) {
456452
return 'Telephone number must start with +30 and have 10 digits after.';
457453
}
458454

459455
return null;
460456
};
461-
const customUrlRule = ( value: DeepPartial< ValidatedItem > ) => {
462-
if ( value.url && ! /^https:\/\/example\.com$/.test( value.url ) ) {
457+
const customUrlRule = ( value: ValidatedItem ) => {
458+
if ( ! /^https:\/\/example\.com$/.test( value.url ) ) {
463459
return 'URL must be from https://example.com domain.';
464460
}
465461

466462
return null;
467463
};
468-
const customColorRule = ( value: DeepPartial< ValidatedItem > ) => {
469-
if ( value.color && ! /^#[0-9A-Fa-f]{6}$/.test( value.color ) ) {
464+
const customColorRule = ( value: ValidatedItem ) => {
465+
if ( ! /^#[0-9A-Fa-f]{6}$/.test( value.color ) ) {
470466
return 'Color must be a valid hex format (e.g., #ff6600).';
471467
}
472468

473469
return null;
474470
};
475-
const customIntegerRule = ( value: DeepPartial< ValidatedItem > ) => {
476-
if ( value.integer && value.integer % 2 !== 0 ) {
471+
const customIntegerRule = ( value: ValidatedItem ) => {
472+
if ( value.integer % 2 !== 0 ) {
477473
return 'Integer must be an even number.';
478474
}
479475

480476
return null;
481477
};
482478

483-
const customPasswordRule = ( value: DeepPartial< ValidatedItem > ) => {
484-
if ( value.password && value.password.length < 8 ) {
479+
const customPasswordRule = ( value: ValidatedItem ) => {
480+
if ( value.password.length < 8 ) {
485481
return 'Password must be at least 8 characters long.';
486482
}
487-
if ( value.password && ! /[A-Z]/.test( value.password ) ) {
483+
if ( ! /[A-Z]/.test( value.password ) ) {
488484
return 'Password must contain at least one uppercase letter.';
489485
}
490-
if ( value.password && ! /[0-9]/.test( value.password ) ) {
486+
if ( ! /[0-9]/.test( value.password ) ) {
491487
return 'Password must contain at least one number.';
492488
}
493489

494490
return null;
495491
};
496492

497493
const maybeCustomRule = (
498-
rule: ( item: DeepPartial< ValidatedItem > ) => null | string
494+
rule: ( item: ValidatedItem ) => null | string
499495
) => {
500496
return custom ? rule : undefined;
501497
};

packages/dataviews/src/dataform-controls/checkbox.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* External dependencies
3+
*/
4+
import deepMerge from 'deepmerge';
5+
16
/**
27
* WordPress dependencies
38
*/
@@ -35,7 +40,13 @@ export default function Checkbox< Item >( {
3540
const onValidateControl = useCallback(
3641
( newValue: any ) => {
3742
const message = field.isValid?.custom?.(
38-
setValue( { item: data, value: newValue } ),
43+
deepMerge(
44+
data,
45+
setValue( {
46+
item: data,
47+
value: newValue,
48+
} ) as Partial< Item >
49+
),
3950
field
4051
);
4152

packages/dataviews/src/dataform-controls/color.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* External dependencies
33
*/
44
import { colord } from 'colord';
5+
import deepMerge from 'deepmerge';
56

67
/**
78
* WordPress dependencies
@@ -101,7 +102,13 @@ export default function Color< Item >( {
101102
const onValidateControl = useCallback(
102103
( newValue: any ) => {
103104
const message = field.isValid?.custom?.(
104-
setValue( { item: data, value: newValue } ),
105+
deepMerge(
106+
data,
107+
setValue( {
108+
item: data,
109+
value: newValue,
110+
} ) as Partial< Item >
111+
),
105112
field
106113
);
107114

packages/dataviews/src/dataform-controls/integer.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* External dependencies
3+
*/
4+
import deepMerge from 'deepmerge';
5+
16
/**
27
* WordPress dependencies
38
*/
@@ -121,12 +126,15 @@ export default function Integer< Item >( {
121126
const onValidateControl = useCallback(
122127
( newValue: any ) => {
123128
const message = field.isValid?.custom?.(
124-
setValue( {
125-
item: data,
126-
value: [ undefined, '', null ].includes( newValue )
127-
? undefined
128-
: Number( newValue ),
129-
} ),
129+
deepMerge(
130+
data,
131+
setValue( {
132+
item: data,
133+
value: [ undefined, '', null ].includes( newValue )
134+
? undefined
135+
: Number( newValue ),
136+
} ) as Partial< Item >
137+
),
130138
field
131139
);
132140

packages/dataviews/src/dataform-controls/textarea.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* External dependencies
3+
*/
4+
import deepMerge from 'deepmerge';
5+
16
/**
27
* WordPress dependencies
38
*/
@@ -36,7 +41,13 @@ export default function Textarea< Item >( {
3641
const onValidateControl = useCallback(
3742
( newValue: any ) => {
3843
const message = field.isValid?.custom?.(
39-
setValue( { item: data, value: newValue } ),
44+
deepMerge(
45+
data,
46+
setValue( {
47+
item: data,
48+
value: newValue,
49+
} ) as Partial< Item >
50+
),
4051
field
4152
);
4253

packages/dataviews/src/dataform-controls/toggle.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* External dependencies
3+
*/
4+
import deepMerge from 'deepmerge';
5+
16
/**
27
* WordPress dependencies
38
*/
@@ -35,7 +40,13 @@ export default function Toggle< Item >( {
3540
const onValidateControl = useCallback(
3641
( newValue: any ) => {
3742
const message = field.isValid?.custom?.(
38-
setValue( { item: data, value: newValue } ),
43+
deepMerge(
44+
data,
45+
setValue( {
46+
item: data,
47+
value: newValue,
48+
} ) as Partial< Item >
49+
),
3950
field
4051
);
4152

packages/dataviews/src/dataform-controls/utils/validated-input.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* External dependencies
3+
*/
4+
import deepMerge from 'deepmerge';
5+
16
/**
27
* WordPress dependencies
38
*/
@@ -66,7 +71,13 @@ export default function ValidatedText< Item >( {
6671
const onValidateControl = useCallback(
6772
( newValue: any ) => {
6873
const message = isValid?.custom?.(
69-
setValue( { item: data, value: newValue } ),
74+
deepMerge(
75+
data,
76+
setValue( {
77+
item: data,
78+
value: newValue,
79+
} ) as Partial< Item >
80+
),
7081
field
7182
);
7283

packages/dataviews/src/types.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,7 @@ export type FieldTypeDefinition< Item > = {
160160

161161
export type Rules< Item > = {
162162
required?: boolean;
163-
custom?: (
164-
item: DeepPartial< Item >,
165-
field: NormalizedField< Item >
166-
) => null | string;
163+
custom?: ( item: Item, field: NormalizedField< Item > ) => null | string;
167164
};
168165

169166
/**

0 commit comments

Comments
 (0)