Skip to content

Commit 832ea2f

Browse files
authored
Merge pull request #613 from actiontech/fix/workflow-sql-audit-error
[fix](SqlExecWorkflow): Optimize the verification of audit forms
2 parents fd090e1 + 20a54b6 commit 832ea2f

File tree

8 files changed

+71
-7
lines changed

8 files changed

+71
-7
lines changed

packages/shared/lib/types/common.type.ts

+10
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,13 @@ export type RouterConfigItem =
5151
});
5252

5353
export type ExcludeSymbol<T> = T extends symbol ? never : T;
54+
55+
export type FormValidateError<T> = {
56+
values: T;
57+
errorFields: Array<{
58+
name: string[];
59+
errors: string[];
60+
warnings: string[];
61+
}>;
62+
outOfDate: boolean;
63+
};

packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlFormatterAndSubmitter.test.tsx

+36-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { act, fireEvent, renderHook, screen } from '@testing-library/react';
2-
import { Form, Input } from 'antd';
2+
import { Form, FormInstance, Input } from 'antd';
33
import SqlFormatterAndSubmitter from '../components/SqlFormatterAndSubmitter';
44
import { SqlFormatterAndSubmitterProps } from '../components/index.type';
55
import instance from '../../../../../../testUtils/mockApi/instance';
@@ -24,11 +24,14 @@ describe('test SqlFormatterAndSubmitter', () => {
2424
jest.clearAllTimers();
2525
});
2626

27-
const customRender = (params: Partial<SqlFormatterAndSubmitterProps>) => {
27+
const customRender = (
28+
params: Partial<SqlFormatterAndSubmitterProps>,
29+
form?: FormInstance
30+
) => {
2831
const { result } = renderHook(() => Form.useForm());
2932

3033
return superRender(
31-
<Form form={result.current[0]}>
34+
<Form form={form ?? result.current[0]}>
3235
<SqlFormatterAndSubmitter
3336
isAuditing={{ set: jest.fn(), value: false }}
3437
auditAction={auditActionSpy}
@@ -163,4 +166,34 @@ describe('test SqlFormatterAndSubmitter', () => {
163166
SQL_EDITOR_PLACEHOLDER_VALUE
164167
);
165168
});
169+
170+
it('form validateFields return errorFields on submit button click', async () => {
171+
const { result } = renderHook(() => Form.useForm());
172+
const form = result.current[0];
173+
jest.spyOn(form, 'validateFields').mockReturnValue(
174+
Promise.reject({
175+
values: {},
176+
errorFields: [
177+
{
178+
name: ['1', AuditTaskResV1SqlSourceEnum.form_data],
179+
errors: ['请输入SQL']
180+
}
181+
],
182+
outOfDate: false
183+
})
184+
);
185+
const setActiveKeySpy = jest.fn();
186+
customRender(
187+
{
188+
fieldPrefixPath: '1',
189+
setActiveKey: setActiveKeySpy
190+
},
191+
form
192+
);
193+
194+
fireEvent.click(screen.getByText('审 核'));
195+
await act(async () => jest.advanceTimersByTime(0));
196+
expect(setActiveKeySpy).toHaveBeenCalledTimes(1);
197+
expect(setActiveKeySpy).toHaveBeenCalledWith('1');
198+
});
166199
});

packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ describe('test SqlStatementFormItem', () => {
3030
databaseInfo={[
3131
{ key: '1', instanceName: 'mysql-1', schemaName: 'test' }
3232
]}
33+
setActiveKey={jest.fn()}
3334
isAtFormStep
3435
{...params}
3536
/>

packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlFormatterAndSubmitter.tsx

+18-3
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@ import instance from '@actiontech/shared/lib/api/sqle/service/instance';
1313
import { useCurrentProject } from '@actiontech/shared/lib/features';
1414
import { useBoolean } from 'ahooks';
1515
import { SQL_EDITOR_PLACEHOLDER_VALUE } from '@actiontech/shared/lib/data/common';
16+
import { FormValidateError } from '@actiontech/shared/lib/types/common.type';
1617

1718
const SqlFormatterAndSubmitter: React.FC<SqlFormatterAndSubmitterProps> = ({
1819
fieldPrefixPath,
1920
isAuditing,
2021
auditAction,
2122
databaseInfo,
2223
isSameSqlForAll,
23-
currentSqlUploadType
24+
currentSqlUploadType,
25+
setActiveKey
2426
}) => {
2527
const { t } = useTranslation();
2628
const { projectName } = useCurrentProject();
@@ -32,8 +34,21 @@ const SqlFormatterAndSubmitter: React.FC<SqlFormatterAndSubmitterProps> = ({
3234
] = useBoolean();
3335

3436
const internalSubmit = async () => {
35-
const values = await form.validateFields();
36-
auditAction(values);
37+
form
38+
.validateFields()
39+
.then((values) => {
40+
auditAction(values);
41+
})
42+
.catch((error: FormValidateError<SqlAuditInfoFormFields>) => {
43+
const errorField = error.errorFields.filter((i) => {
44+
return Object.keys(AuditTaskResV1SqlSourceEnum).some((v) => {
45+
return i.name.includes(v);
46+
});
47+
});
48+
if (!!errorField.length) {
49+
setActiveKey?.(errorField[0].name?.[0]);
50+
}
51+
});
3752
};
3853

3954
const formatSql = async () => {

packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export type SqlFormatterAndSubmitterProps = {
2121
| 'auditAction'
2222
| 'databaseInfo'
2323
| 'isSameSqlForAll'
24+
| 'setActiveKey'
2425
>;
2526

2627
export type SqlBackupSwitcherProps = Pick<

packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ const SqlStatementFormItem: React.FC<SqlStatementFormItemProps> = ({
2626
isSameSqlForAll,
2727
isSupportFileModeExecuteSql,
2828
isAtRejectStep,
29-
isAtFormStep
29+
isAtFormStep,
30+
setActiveKey
3031
}) => {
3132
const { t } = useTranslation();
3233
const form = Form.useFormInstance<SqlAuditInfoFormProps>();
@@ -102,6 +103,7 @@ const SqlStatementFormItem: React.FC<SqlStatementFormItemProps> = ({
102103
auditAction={auditAction}
103104
databaseInfo={databaseInfo}
104105
isSameSqlForAll={isSameSqlForAll}
106+
setActiveKey={setActiveKey}
105107
/>
106108
</>
107109
);

packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.type.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ export type SqlStatementFormItemProps = {
99
isSameSqlForAll: boolean;
1010
isSupportFileModeExecuteSql: boolean;
1111
isAtRejectStep?: boolean;
12+
setActiveKey?: (key: string) => void;
1213
} & Pick<SqlAuditInfoFormProps, 'isAuditing' | 'auditAction' | 'isAtFormStep'>;

packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/index.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ const SqlStatementFormController: React.FC<SqlStatementFormControllerProps> = ({
7474
isSupportFileModeExecuteSql={
7575
!!isSupportFileModeExecuteSqlRecord?.[v.key]
7676
}
77+
setActiveKey={setActiveKey}
7778
{...props}
7879
/>
7980
</div>

0 commit comments

Comments
 (0)