Skip to content

Commit 515d7cf

Browse files
authored
feat: support validated status when trigger validate (#579)
* feat: support validated status when trigger validate * feat: support validated status when trigger validate * feat: update test case * feat: update test case
1 parent 7bd75b5 commit 515d7cf

File tree

5 files changed

+76
-3
lines changed

5 files changed

+76
-3
lines changed

src/Field.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ class Field extends React.Component<InternalFieldProps, FieldState> implements F
133133
*/
134134
private dirty: boolean = false;
135135

136-
private validatePromise: Promise<string[]> | null = null;
136+
private validatePromise: Promise<string[]> | null;
137137

138138
private prevValidating: boolean;
139139

@@ -475,6 +475,7 @@ class Field extends React.Component<InternalFieldProps, FieldState> implements F
475475
errors: this.errors,
476476
warnings: this.warnings,
477477
name: this.getNamePath(),
478+
validated: this.validatePromise === null,
478479
};
479480

480481
return meta;

src/interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface Meta {
1313
errors: string[];
1414
warnings: string[];
1515
name: InternalNamePath;
16+
validated: boolean;
1617
}
1718

1819
export interface InternalFieldData extends Meta {

tests/context.test.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,26 @@ describe('Form.Context', () => {
4444
touched: true,
4545
validating: false,
4646
value: 'Light',
47+
validated: false,
48+
},
49+
],
50+
forms: {
51+
form1: expect.objectContaining({}),
52+
},
53+
}),
54+
);
55+
expect(onFormChange).toHaveBeenCalledWith(
56+
'form1',
57+
expect.objectContaining({
58+
changedFields: [
59+
{
60+
errors: [],
61+
warnings: [],
62+
name: ['username'],
63+
touched: true,
64+
validating: false,
65+
value: 'Light',
66+
validated: true,
4767
},
4868
],
4969
forms: {

tests/index.test.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,14 @@ describe('Form.Basic', () => {
655655

656656
expect(
657657
form.current?.getFieldsValue(null, meta => {
658-
expect(Object.keys(meta)).toEqual(['touched', 'validating', 'errors', 'warnings', 'name']);
658+
expect(Object.keys(meta)).toEqual([
659+
'touched',
660+
'validating',
661+
'errors',
662+
'warnings',
663+
'name',
664+
'validated',
665+
]);
659666
return false;
660667
}),
661668
).toEqual({});

tests/validate.test.tsx

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { useEffect } from 'react';
22
import { mount } from 'enzyme';
33
import { act } from 'react-dom/test-utils';
44
import Form, { Field, useForm } from '../src';
@@ -750,4 +750,48 @@ describe('Form.Validate', () => {
750750
await changeValue(wrapper, '');
751751
matchError(wrapper, true);
752752
});
753+
it('validated status should be true when trigger validate', async () => {
754+
const validateTrigger = jest.fn();
755+
const validateNoTrigger = jest.fn();
756+
const App = ({ trigger = true }) => {
757+
const ref = React.useRef(null);
758+
useEffect(() => {
759+
if (!trigger) return;
760+
ref.current!.validateFields();
761+
}, [trigger]);
762+
return (
763+
<div>
764+
<Form ref={ref}>
765+
<InfoField
766+
initialValue="[email protected]"
767+
name="email"
768+
onMetaChange={meta => {
769+
if (trigger) {
770+
validateTrigger(meta.validated);
771+
} else {
772+
validateNoTrigger(meta.validated);
773+
}
774+
}}
775+
rules={[
776+
{
777+
type: 'email',
778+
message: 'Please input your e-mail',
779+
},
780+
{
781+
required: true,
782+
message: 'Please input your value',
783+
},
784+
]}
785+
/>
786+
</Form>
787+
</div>
788+
);
789+
};
790+
const wrapper = mount(<App trigger={false} />);
791+
await timeout();
792+
expect(validateNoTrigger).not.toHaveBeenCalled();
793+
wrapper.setProps({ trigger: true });
794+
await timeout();
795+
expect(validateTrigger).toBeCalledWith(true);
796+
});
753797
});

0 commit comments

Comments
 (0)