From 61318075a69a85fafe41d705dab1e9c017ad800b Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Mon, 18 Nov 2024 17:19:10 +0800
Subject: [PATCH 01/20] [chore]: Update Api
---
.../shared/lib/api/sqle/service/common.d.ts | 10 ++++++----
.../lib/api/sqle/service/task/index.d.ts | 8 --------
.../lib/api/sqle/service/task/index.enum.ts | 8 ++++++--
.../shared/lib/api/sqle/service/task/index.ts | 17 -----------------
.../lib/api/sqle/service/workflow/index.d.ts | 8 ++++++++
.../api/sqle/service/workflow/index.enum.ts | 4 +++-
.../lib/api/sqle/service/workflow/index.ts | 19 ++++++++++++++++++-
7 files changed, 41 insertions(+), 33 deletions(-)
diff --git a/packages/shared/lib/api/sqle/service/common.d.ts b/packages/shared/lib/api/sqle/service/common.d.ts
index ae90425ff..41d85a881 100644
--- a/packages/shared/lib/api/sqle/service/common.d.ts
+++ b/packages/shared/lib/api/sqle/service/common.d.ts
@@ -447,6 +447,8 @@ export interface IBackupSqlData {
instance_name?: string;
origin_sql?: string;
+
+ origin_task_id?: number;
}
export interface IBackupSqlListRes {
@@ -2092,6 +2094,8 @@ export interface IInstanceTableMeta {
}
export interface IInstanceTipResV1 {
+ enable_backup?: boolean;
+
host?: string;
instance_id?: string;
@@ -2550,18 +2554,16 @@ export interface IRuleTemplateResV1 {
desc?: string;
- is_default_rule_template?: boolean;
-
rule_template_name?: string;
}
export interface IRuleTemplateTipResV1 {
db_type?: string;
- rule_template_id?: string;
-
is_default_rule_template?: boolean;
+ rule_template_id?: string;
+
rule_template_name?: string;
}
diff --git a/packages/shared/lib/api/sqle/service/task/index.d.ts b/packages/shared/lib/api/sqle/service/task/index.d.ts
index 3ee6ed4f8..1d74a10eb 100644
--- a/packages/shared/lib/api/sqle/service/task/index.d.ts
+++ b/packages/shared/lib/api/sqle/service/task/index.d.ts
@@ -6,7 +6,6 @@ import {
IUpdateSqlFileOrderV1Req,
IGetSqlFileOrderMethodResV1,
IAuditTaskGroupResV1,
- IUpdateTaskBackupStrategyReq,
IBaseRes,
IGetAuditTaskSQLContentResV1,
IGetAuditTaskSQLsResV1,
@@ -101,13 +100,6 @@ export interface IGetAuditTaskV1Params {
export interface IGetAuditTaskV1Return extends IGetAuditTaskResV1 {}
-export interface IUpdateTaskBackupStrategyV1Params
- extends IUpdateTaskBackupStrategyReq {
- task_id: string;
-}
-
-export interface IUpdateTaskBackupStrategyV1Return extends IBaseRes {}
-
export interface IDownloadAuditFileParams {
task_id: string;
}
diff --git a/packages/shared/lib/api/sqle/service/task/index.enum.ts b/packages/shared/lib/api/sqle/service/task/index.enum.ts
index f8978ebd5..e2bb4f552 100644
--- a/packages/shared/lib/api/sqle/service/task/index.enum.ts
+++ b/packages/shared/lib/api/sqle/service/task/index.enum.ts
@@ -9,7 +9,9 @@ export enum getAuditTaskSQLsV1FilterExecStatusEnum {
'failed' = 'failed',
- 'manually_executed' = 'manually_executed'
+ 'manually_executed' = 'manually_executed',
+
+ 'execute_rollback' = 'execute_rollback'
}
export enum getAuditTaskSQLsV1FilterAuditStatusEnum {
@@ -45,7 +47,9 @@ export enum getAuditTaskSQLsV2FilterExecStatusEnum {
'terminate_succeeded' = 'terminate_succeeded',
- 'terminate_failed' = 'terminate_failed'
+ 'terminate_failed' = 'terminate_failed',
+
+ 'execute_rollback' = 'execute_rollback'
}
export enum getAuditTaskSQLsV2FilterAuditStatusEnum {
diff --git a/packages/shared/lib/api/sqle/service/task/index.ts b/packages/shared/lib/api/sqle/service/task/index.ts
index 06ee4f0eb..9da771583 100644
--- a/packages/shared/lib/api/sqle/service/task/index.ts
+++ b/packages/shared/lib/api/sqle/service/task/index.ts
@@ -18,8 +18,6 @@ import {
IAuditTaskGroupIdV1Return,
IGetAuditTaskV1Params,
IGetAuditTaskV1Return,
- IUpdateTaskBackupStrategyV1Params,
- IUpdateTaskBackupStrategyV1Return,
IDownloadAuditFileParams,
IDownloadAuditFileReturn,
IGetAuditTaskSQLContentV1Params,
@@ -230,21 +228,6 @@ class TaskService extends ServiceBase {
);
}
- public UpdateTaskBackupStrategyV1(
- params: IUpdateTaskBackupStrategyV1Params,
- options?: AxiosRequestConfig
- ) {
- const paramsData = this.cloneDeep(params);
- const task_id = paramsData.task_id;
- delete paramsData.task_id;
-
- return this.patch(
- `/v1/tasks/audits/${task_id}/`,
- paramsData,
- options
- );
- }
-
public DownloadAuditFile(
params: IDownloadAuditFileParams,
options?: AxiosRequestConfig
diff --git a/packages/shared/lib/api/sqle/service/workflow/index.d.ts b/packages/shared/lib/api/sqle/service/workflow/index.d.ts
index 4239c324a..a9c47ac0e 100644
--- a/packages/shared/lib/api/sqle/service/workflow/index.d.ts
+++ b/packages/shared/lib/api/sqle/service/workflow/index.d.ts
@@ -16,6 +16,7 @@ import {
IRejectWorkflowReqV1,
IGetWorkflowTasksResV1,
IUpdateWorkflowScheduleReqV1,
+ IUpdateTaskBackupStrategyReq,
IUpdateSqlBackupStrategyReq,
IGetWorkflowStatisticOfInstancesResV1,
ICreateWorkflowReqV2,
@@ -306,6 +307,13 @@ export interface IUpdateWorkflowScheduleV1Params
export interface IUpdateWorkflowScheduleV1Return extends IBaseRes {}
+export interface IUpdateTaskBackupStrategyV1Params
+ extends IUpdateTaskBackupStrategyReq {
+ task_id: string;
+}
+
+export interface IUpdateTaskBackupStrategyV1Return extends IBaseRes {}
+
export interface IUpdateSqlBackupStrategyV1Params
extends IUpdateSqlBackupStrategyReq {
task_id: string;
diff --git a/packages/shared/lib/api/sqle/service/workflow/index.enum.ts b/packages/shared/lib/api/sqle/service/workflow/index.enum.ts
index 22d6c4a78..b75be7f07 100644
--- a/packages/shared/lib/api/sqle/service/workflow/index.enum.ts
+++ b/packages/shared/lib/api/sqle/service/workflow/index.enum.ts
@@ -95,5 +95,7 @@ export enum GetBackupSqlListV1FilterExecStatusEnum {
'terminate_succeeded' = 'terminate_succeeded',
- 'terminate_failed' = 'terminate_failed'
+ 'terminate_failed' = 'terminate_failed',
+
+ 'execute_rollback' = 'execute_rollback'
}
diff --git a/packages/shared/lib/api/sqle/service/workflow/index.ts b/packages/shared/lib/api/sqle/service/workflow/index.ts
index ea36c516d..80a58545c 100644
--- a/packages/shared/lib/api/sqle/service/workflow/index.ts
+++ b/packages/shared/lib/api/sqle/service/workflow/index.ts
@@ -52,6 +52,8 @@ import {
IExecuteOneTaskOnWorkflowV1Return,
IUpdateWorkflowScheduleV1Params,
IUpdateWorkflowScheduleV1Return,
+ IUpdateTaskBackupStrategyV1Params,
+ IUpdateTaskBackupStrategyV1Return,
IUpdateSqlBackupStrategyV1Params,
IUpdateSqlBackupStrategyV1Return,
IGetWorkflowStatisticOfInstancesParams,
@@ -492,6 +494,21 @@ class WorkflowService extends ServiceBase {
);
}
+ public UpdateTaskBackupStrategyV1(
+ params: IUpdateTaskBackupStrategyV1Params,
+ options?: AxiosRequestConfig
+ ) {
+ const paramsData = this.cloneDeep(params);
+ const task_id = paramsData.task_id;
+ delete paramsData.task_id;
+
+ return this.patch(
+ `/v1/tasks/audits/${task_id}/backup_strategy`,
+ paramsData,
+ options
+ );
+ }
+
public UpdateSqlBackupStrategyV1(
params: IUpdateSqlBackupStrategyV1Params,
options?: AxiosRequestConfig
@@ -504,7 +521,7 @@ class WorkflowService extends ServiceBase {
delete paramsData.sql_id;
return this.patch(
- `/v1/tasks/audits/${task_id}/sqls/${sql_id}/`,
+ `/v1/tasks/audits/${task_id}/sqls/${sql_id}/backup_strategy`,
paramsData,
options
);
From 0450b911f74668283451280322efd675d61f1e17 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Tue, 19 Nov 2024 14:19:52 +0800
Subject: [PATCH 02/20] [feature](SqlExecWorkflow): Add support configuration
backup
---
packages/shared/lib/data/routePaths.ts | 2 +-
packages/sqle/src/data/EmitterKey.ts | 4 +-
packages/sqle/src/locale/zh-CN/audit.ts | 3 +-
.../sqle/src/locale/zh-CN/execWorkflow.ts | 44 +++++++++--
.../components/SqlBackupSwitcher.tsx | 79 +++++++++++++++++++
.../components/SwitchField.tsx | 44 +++++++++++
.../SqlStatementFormItem/index.tsx | 8 +-
.../hooks/useRenderDatabaseSelectionItems.tsx | 15 ++--
.../DatabaseSelectionItems/index.tsx | 16 ++--
.../SqlAuditInfoFormItem/index.tsx | 4 +-
.../Create/hooks/useAuditWorkflow.tsx | 2 +
.../Create/hooks/useCreationMode.ts | 38 +++++----
.../src/page/SqlExecWorkflow/Create/index.tsx | 47 +++++++++--
.../page/SqlExecWorkflow/Create/index.type.ts | 3 +
14 files changed, 265 insertions(+), 44 deletions(-)
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
diff --git a/packages/shared/lib/data/routePaths.ts b/packages/shared/lib/data/routePaths.ts
index 864f5220a..3492923ee 100644
--- a/packages/shared/lib/data/routePaths.ts
+++ b/packages/shared/lib/data/routePaths.ts
@@ -179,7 +179,7 @@ export const ROUTE_PATHS = {
prefix: '/sqle/project/:projectID/exec-workflow',
path: 'create',
query:
- 'sourceWorkflowId&versionId&versionName&compression_data&from&gen_modified_sql_params'
+ 'sourceWorkflowId&versionId&versionName&compression_data&from&gen_modified_sql_params&rollbackWorkflowId'
},
detail: {
prefix: '/sqle/project/:projectID/exec-workflow',
diff --git a/packages/sqle/src/data/EmitterKey.ts b/packages/sqle/src/data/EmitterKey.ts
index 5a6560461..dcf8263a3 100644
--- a/packages/sqle/src/data/EmitterKey.ts
+++ b/packages/sqle/src/data/EmitterKey.ts
@@ -39,7 +39,9 @@ enum EmitterKey {
Refresh_Global_Dashboard_Pending_Work_Order = 'Refresh_Global_Dashboard_Pending_Work_Order',
Refresh_Global_Dashboard_Pending_Sql = 'Refresh_Global_Dashboard_Pending_Work_Order',
- Refresh_Global_Dashboard_Initiated_Work_Order = 'Refresh_Global_Dashboard_Initiated_Work_Order'
+ Refresh_Global_Dashboard_Initiated_Work_Order = 'Refresh_Global_Dashboard_Initiated_Work_Order',
+
+ Refresh_Sql_Exec_workflow_Audit_Result_List = 'Refresh_Sql_Exec_workflow_Audit_Result_List'
}
export default EmitterKey;
diff --git a/packages/sqle/src/locale/zh-CN/audit.ts b/packages/sqle/src/locale/zh-CN/audit.ts
index 9d4457bc6..caa0137e2 100644
--- a/packages/sqle/src/locale/zh-CN/audit.ts
+++ b/packages/sqle/src/locale/zh-CN/audit.ts
@@ -40,7 +40,8 @@ export default {
terminate_fail: '中止失败',
terminate_succ: '中止成功',
terminating: '正在中止',
- allStatus: '全部状态'
+ allStatus: '全部状态',
+ rollback: '执行回滚'
},
auditStatus: {
diff --git a/packages/sqle/src/locale/zh-CN/execWorkflow.ts b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
index 74be07a53..d44ceebb5 100644
--- a/packages/sqle/src/locale/zh-CN/execWorkflow.ts
+++ b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
@@ -104,7 +104,12 @@ export default {
'当前支持MySQL、Oracle、PG类型数据源按文件模式上线',
executeSqlMode: 'SQL模式',
executeFileMode: '文件模式',
- selectFileSortMethod: '选择文件排序方式'
+ selectFileSortMethod: '选择文件排序方式',
+ switchSqlBackup: '是否选择开启备份',
+ cancelSwitchSqlBackupTips:
+ '当前应用的数据源已开启备份需求,是否确认关闭备份?',
+ cancelSwitchSqlBackupTipsWithInstanceName:
+ '{instanceName}已开启备份需求,是否确认关闭备份?'
},
tour: {
modifyName: '修改工单名称',
@@ -121,7 +126,17 @@ export default {
submitWorkflowConfirmationMessage:
'项目 {{currentProject}} 创建工单时最高只能允许有 {{allowAuditLevel}} 等级的审核错误,但是当前审核结果中最高包含 {{currentAuditLevel}} 等级的审核结果。',
mustHaveAuditResultTips: '不能对审核结果为空的SQL进行创建工单',
- leaveTip: '是否离开本页面?当前工单暂未提交!'
+ leaveTip: '是否离开本页面?当前工单暂未提交!',
+ switchDatabaseBackupPolicy: '切换数据源备份策略',
+ switchDatabaseBackupPolicyTips: '统一变更当前数据源上SQL的备份回滚策略为',
+ editBackupStrategy: '切换SQL备份回滚策略',
+ editBackupStrategySuccessTips: '切换SQL备份回滚策略成功'
+ },
+ backupStrategy: {
+ reverseSql: '基于反向SQL回滚',
+ originRow: '基于行级备份回滚',
+ manual: '自行手工备份回滚',
+ none: '无'
},
createResult: {
success: '工单创建成功',
@@ -174,6 +189,8 @@ export default {
unknown: '未知步骤',
refreshWorkflow: '刷新工单',
backToDetail: '返回工单详情',
+ retry: '重试',
+ rollback: '回滚',
maintenanceTime:
'定时上线的时间点必须在运维时间之内,当前数据源的运维时间为: \n',
@@ -237,7 +254,18 @@ export default {
'当前操作将立即执行该数据源上的SQL语句, 是否确认立即上线'
}
},
- taskResult: {}
+ taskResult: {},
+
+ rollback: {
+ allSql: '全部SQL',
+ selectedRollbackSql: '被选中回滚SQL',
+ backupStrategy: '备份策略',
+ instance: '数据源',
+ execStatus: '执行状态',
+ remark: '备注',
+ addRemark: '添加备注',
+ originSql: '原始SQL'
+ }
},
audit: {
@@ -247,6 +275,7 @@ export default {
duplicate: '是否去重',
downloadSql: '下载SQL语句',
downloadReport: '下载审核报告',
+ downloadRollbackSql: '下载回滚语句',
table: {
number: '序号',
auditLevel: '规则等级',
@@ -260,7 +289,11 @@ export default {
describe: '说明',
analyze: '分析',
addDescribe: '添加说明',
- createWhitelist: '添加为审核SQL例外'
+ createWhitelist: '添加为审核SQL例外',
+ backupPolicy: '备份回滚策略',
+ backupPolicyTips:
+ '平台将综合评估数据丢失风险及备份成本后,推荐每条SQL适用的备份回滚策略',
+ backupConflictTips: '当前SQL未按预期开启备份'
},
filterForm: {
@@ -336,7 +369,8 @@ export default {
terminate_fail: '中止失败',
terminate_succ: '中止成功',
terminating: '正在中止',
- allStatus: '全部状态'
+ allStatus: '全部状态',
+ rollback: '执行回滚'
}
}
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
new file mode 100644
index 000000000..9608bc0e4
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
@@ -0,0 +1,79 @@
+import { FormItemLabel } from '@actiontech/shared/lib/components/FormCom';
+import { useTranslation } from 'react-i18next';
+import { EmptyBox } from '@actiontech/shared';
+import { Form } from 'antd';
+import { SqlAuditInfoFormFields } from '../../../../Create/index.type';
+import { SqlBackupSwitcherProps } from './index.type';
+import { CreateAuditTasksGroupReqV1ExecModeEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+import { useMemo } from 'react';
+
+import SwitchField from './SwitchField';
+
+const SqlBackupSwitcher: React.FC = ({
+ fieldPrefixPath,
+ databaseInfo
+}) => {
+ const { t } = useTranslation();
+
+ const form = Form.useFormInstance();
+
+ const currentExecuteMode = Form.useWatch(
+ [fieldPrefixPath, 'exec_mode'],
+ form
+ );
+ const isSameSqlForAll = Form.useWatch('isSameSqlForAll', form);
+
+ const getInitValue = () => {
+ if (isSameSqlForAll) {
+ return databaseInfo.some((item) => item.enableBackup);
+ }
+ return (
+ databaseInfo.find((item) => item.key === fieldPrefixPath)?.enableBackup ??
+ false
+ );
+ };
+
+ const enableBackupInstanceName = useMemo(() => {
+ let nameStr = '';
+ databaseInfo.forEach((item, index) => {
+ if (item.enableBackup) {
+ nameStr += `${item.instanceName}${
+ index === databaseInfo.length - 1 ? '' : ','
+ }`;
+ }
+ });
+ return nameStr;
+ }, [databaseInfo]);
+
+ return (
+
+
+
+
+
+ );
+};
+
+export default SqlBackupSwitcher;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
new file mode 100644
index 000000000..569c5911c
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
@@ -0,0 +1,44 @@
+import { BasicSwitch } from '@actiontech/shared';
+import { Popconfirm } from 'antd';
+import { useTranslation } from 'react-i18next';
+import { useBoolean } from 'ahooks';
+
+const SwitchField: React.FC<{
+ checked?: boolean;
+ onChange?: (v: boolean) => void;
+ title?: string;
+}> = ({ checked, onChange }) => {
+ const { t } = useTranslation();
+
+ const [
+ popconfirmOpen,
+ { setTrue: showPopconfirm, setFalse: hidePopconfirm }
+ ] = useBoolean();
+
+ return (
+ {
+ onChange?.(false);
+ hidePopconfirm();
+ }}
+ onCancel={hidePopconfirm}
+ >
+ {
+ if (!checked) {
+ onChange?.(true);
+ } else {
+ showPopconfirm();
+ }
+ }}
+ />
+
+ );
+};
+
+export default SwitchField;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
index 3440dabcf..fa5cee03e 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
@@ -14,6 +14,7 @@ import { SqlAuditInfoFormProps } from '../../../Create/components/FormStep/SqlAu
import SqlExecModeSelector from './components/SqlExecModeSelector';
import SqlFormatterAndSubmitter from './components/SqlFormatterAndSubmitter';
import { RingPieFilled } from '@actiontech/icons';
+import SqlBackupSwitcher from './components/SqlBackupSwitcher';
const SqlStatementFormItem: React.FC = ({
fieldPrefixPath,
@@ -83,7 +84,12 @@ const SqlStatementFormItem: React.FC = ({
isSupportFileModeExecuteSql={isSupportFileModeExecuteSql}
isAtRejectStep={isAtRejectStep}
/>
-
+ {/* #if [ee] */}
+
+ {/* #endif */}
) => {
+> & { instanceList: IInstanceTipResV1[] }) => {
const { t } = useTranslation();
const { projectName, projectID } = useCurrentProject();
const { sqleTheme } = useThemeStyleData();
- const { isCloneMode } = useCreationMode();
+ const { isCloneMode, isRollbackMode } = useCreationMode();
const sqlExecWorkflowReduxState = useSelector((state: IReduxState) => {
return {
@@ -39,7 +41,7 @@ const useRenderDatabaseSelectionItems = ({
});
useEffect(() => {
- if (isCloneMode) {
+ if (isCloneMode || isRollbackMode) {
sqlExecWorkflowReduxState.clonedExecWorkflowSqlAuditInfo?.databaseInfo?.forEach(
(database, index) => {
const key = `${index}`;
@@ -114,7 +116,10 @@ const useRenderDatabaseSelectionItems = ({
ruleTemplate: undefined,
dbType: undefined,
testConnectResult: undefined,
- isSupportFileModeExecuteSql: true
+ isSupportFileModeExecuteSql: true,
+ enableBackup:
+ instanceList.find((i) => i.instance_name === instanceName)
+ ?.enable_backup ?? false
});
updateSchemaList(key, instanceName);
updateRuleTemplateNameAndDbType(key, instanceName);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/index.tsx
index dfbf37246..cbdb14693 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/index.tsx
@@ -64,6 +64,13 @@ const DatabaseSelectionItem: React.FC = ({
instanceTestConnectResults: sharedStepDetail.instanceTestConnectResults
});
+ const {
+ loading: instanceTipsLoading,
+ updateInstanceList,
+ instanceOptions,
+ instanceList
+ } = useInstance();
+
const {
handleInstanceChange,
handleInstanceSchemaChange,
@@ -74,7 +81,8 @@ const DatabaseSelectionItem: React.FC = ({
renderAddItemButton
} = useRenderDatabaseSelectionItems({
dbSourceInfoCollection: sharedStepDetail.dbSourceInfoCollection,
- sqlStatementTabActiveKey: sharedStepDetail.sqlStatementTabActiveKey
+ sqlStatementTabActiveKey: sharedStepDetail.sqlStatementTabActiveKey,
+ instanceList
});
useSetFormValuesWithGenModifiedSqlParams({
@@ -85,12 +93,6 @@ const DatabaseSelectionItem: React.FC = ({
setGetModifiedSQLsPending: sharedStepDetail.getModifiedSQLsPending.set
});
- const {
- loading: instanceTipsLoading,
- updateInstanceList,
- instanceOptions
- } = useInstance();
-
const versionFirstStageInstanceOptions = useMemo(() => {
const newOptions: SelectProps['options'] = [];
instanceOptions.forEach((item) => {
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/index.tsx
index 595ee4e32..b9280714f 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/index.tsx
@@ -31,7 +31,9 @@ const SqlAuditInfoFormItem = forwardRef(
sharedStepDetail.dbSourceInfoCollection.value?.[key]
?.instanceName,
schemaName:
- sharedStepDetail.dbSourceInfoCollection.value?.[key]?.schemaName
+ sharedStepDetail.dbSourceInfoCollection.value?.[key]?.schemaName,
+ enableBackup:
+ sharedStepDetail.dbSourceInfoCollection.value?.[key]?.enableBackup
};
})
.filter((v) => !!v.instanceName);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx
index 392b298d3..ed1f5e06a 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx
@@ -140,6 +140,7 @@ const useAuditWorkflow = () => {
) {
const auditTaskPrams: IAuditTaskGroupIdV1Params = {
task_group_id: taskGroupInfo.data.data?.task_group_id,
+ enable_backup: sqlStatementInfo.backup,
...getSqlSourceWithUploadType(sqlStatementInfo)
};
const res = await task.auditTaskGroupIdV1(auditTaskPrams);
@@ -191,6 +192,7 @@ const useAuditWorkflow = () => {
...getSqlSourceWithUploadType(sqlStatementInfo),
exec_mode:
sqlStatementInfo.exec_mode as unknown as CreateAuditTaskReqV1ExecModeEnum,
+ enable_backup: sqlStatementInfo.backup,
// #if [ee]
file_order_method: sqlStatementInfo.file_sort_method
// #endif
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useCreationMode.ts b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useCreationMode.ts
index 0f7e5054a..65a3216eb 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useCreationMode.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useCreationMode.ts
@@ -5,25 +5,35 @@ import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths';
const useCreationMode = () => {
const extraQueries = useTypedQuery();
- const { isAssociationVersionMode, versionId, versionName, isCloneMode } =
- useMemo(() => {
- const searchParams = extraQueries(
- ROUTE_PATHS.SQLE.SQL_EXEC_WORKFLOW.create
- );
- return {
- isAssociationVersionMode:
- !!searchParams?.versionId && !!searchParams?.versionName,
- versionId: searchParams?.versionId,
- versionName: searchParams?.versionName,
- isCloneMode: !!searchParams?.sourceWorkflowId
- };
- }, [extraQueries]);
+ const {
+ isAssociationVersionMode,
+ versionId,
+ versionName,
+ isCloneMode,
+ isRollbackMode,
+ rollbackWorkflowId
+ } = useMemo(() => {
+ const searchParams = extraQueries(
+ ROUTE_PATHS.SQLE.SQL_EXEC_WORKFLOW.create
+ );
+ return {
+ isAssociationVersionMode:
+ !!searchParams?.versionId && !!searchParams?.versionName,
+ versionId: searchParams?.versionId,
+ versionName: searchParams?.versionName,
+ isCloneMode: !!searchParams?.sourceWorkflowId,
+ isRollbackMode: !!searchParams?.rollbackWorkflowId,
+ rollbackWorkflowId: searchParams?.rollbackWorkflowId
+ };
+ }, [extraQueries]);
return {
isCloneMode,
isAssociationVersionMode,
versionId,
- versionName
+ versionName,
+ isRollbackMode,
+ rollbackWorkflowId
};
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/index.tsx
index 57bd38677..a85a40f56 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/index.tsx
@@ -16,7 +16,10 @@ import { useTranslation } from 'react-i18next';
import workflow from '@actiontech/shared/lib/api/sqle/service/workflow';
import { useCurrentProject } from '@actiontech/shared/lib/global';
import { ResponseCode } from '@actiontech/shared/lib/enum';
-import { ICreateWorkflowV2Params } from '@actiontech/shared/lib/api/sqle/service/workflow/index.d';
+import {
+ ICreateWorkflowV2Params,
+ ICreateRollbackWorkflowParams
+} from '@actiontech/shared/lib/api/sqle/service/workflow/index.d';
import useCheckTaskAuditSqlCount from './hooks/useCheckTaskAuditSqlCount';
import { LazyLoadComponent } from '@actiontech/shared';
import { useSelector } from 'react-redux';
@@ -33,20 +36,26 @@ const CreateSqlExecWorkflow: React.FC = () => {
const { updateTaskRecordCount, checkTaskCountIsEmpty } =
useCheckTaskAuditSqlCount();
- const { isCloneMode, isAssociationVersionMode, versionId } =
- useCreationMode();
+ const {
+ isCloneMode,
+ isAssociationVersionMode,
+ versionId,
+ isRollbackMode,
+ rollbackWorkflowId
+ } = useCreationMode();
const sqlExecWorkflowReduxState = useSelector((state: IReduxState) => {
return {
clonedExecWorkflowSqlAuditInfo:
state.sqlExecWorkflow.clonedExecWorkflowSqlAuditInfo,
clonedExecWorkflowBaseInfo:
- state.sqlExecWorkflow.clonedExecWorkflowBaseInfo
+ state.sqlExecWorkflow.clonedExecWorkflowBaseInfo,
+ workflowRollbackSqlIds: state.sqlExecWorkflow.workflowRollbackSqlIds
};
});
useEffect(() => {
- if (isCloneMode) {
+ if (isCloneMode || isRollbackMode) {
baseInfoForm.setFieldsValue({
workflow_subject:
sqlExecWorkflowReduxState.clonedExecWorkflowBaseInfo
@@ -152,11 +161,30 @@ const CreateSqlExecWorkflow: React.FC = () => {
return;
}
- const createWorkflowParam: ICreateWorkflowV2Params = {
+ const commonParams = {
task_ids: taskInfos.map((v) => v.task_id!),
desc: baseInfo?.desc,
workflow_subject: baseInfo?.workflow_subject,
- project_name: projectName,
+ project_name: projectName
+ };
+
+ if (isRollbackMode) {
+ const params: ICreateRollbackWorkflowParams = {
+ ...commonParams,
+ rollback_sql_ids:
+ sqlExecWorkflowReduxState.workflowRollbackSqlIds ?? [],
+ workflow_id: rollbackWorkflowId ?? ''
+ };
+ return workflow.CreateRollbackWorkflow(params).then((res) => {
+ if (res.data.code === ResponseCode.SUCCESS) {
+ goToCreateResultStep();
+ createdWorkflowID.current = res.data.data?.workflow_id ?? '';
+ }
+ });
+ }
+
+ const createWorkflowParam: ICreateWorkflowV2Params = {
+ ...commonParams,
sql_version_id: isAssociationVersionMode ? Number(versionId) : undefined
};
return workflow.createWorkflowV2(createWorkflowParam).then((res) => {
@@ -174,7 +202,10 @@ const CreateSqlExecWorkflow: React.FC = () => {
t,
taskInfos,
isAssociationVersionMode,
- versionId
+ versionId,
+ isRollbackMode,
+ rollbackWorkflowId,
+ sqlExecWorkflowReduxState
]);
usePrompt(t('execWorkflow.create.auditResult.leaveTip'), isAtAuditResultStep);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts
index 536238ab3..e7277e5c8 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts
@@ -26,12 +26,14 @@ export type SqlStatementFields = Record<
exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum;
file_sort_method: string;
currentUploadType: AuditTaskResV1SqlSourceEnum;
+ backup?: boolean;
};
export type CreateWorkflowDatabaseInfo = Array<{
key: string;
instanceName?: string;
schemaName?: string;
+ enableBackup?: boolean;
}>;
export type SqlAuditInfoFormFields = {
@@ -60,6 +62,7 @@ export type DataSourceSchemaCollection = Record<
ruleTemplate?: IRuleTemplateV2;
testConnectResult?: IInstanceConnectionResV1;
isSupportFileModeExecuteSql?: boolean;
+ enableBackup?: boolean;
}
>;
From 12e866d609f3361249b34f2007a210549ded6232 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Tue, 19 Nov 2024 14:22:41 +0800
Subject: [PATCH 03/20] [feature](SqlExecWorkflow): Add support for switching
backup strategies[skip ci]
---
.../Table/SwitchSqlBackupStrategyModal.tsx | 73 ++++++++++
.../Common/AuditResultList/Table/column.tsx | 38 +++++-
.../AuditResultList/Table/index.data.ts | 49 +++++++
.../Common/AuditResultList/Table/index.tsx | 127 +++++++++++++-----
.../AuditResultList/Table/index.type.ts | 1 +
.../Common/AuditResultList/Table/style.ts | 20 +++
.../Common/AuditResultList/index.tsx | 19 ++-
.../Common/AuditResultList/index.type.ts | 2 +
.../Common/AuditResultList/style.ts | 6 +
.../components/index.type.ts | 5 +
.../BatchSwitchBackupStrategyModal/index.tsx | 82 +++++++++++
.../components/AuditResultStep/index.tsx | 27 ++++
12 files changed, 416 insertions(+), 33 deletions(-)
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/SwitchSqlBackupStrategyModal.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.data.ts
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/BatchSwitchBackupStrategyModal/index.tsx
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/SwitchSqlBackupStrategyModal.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/SwitchSqlBackupStrategyModal.tsx
new file mode 100644
index 000000000..4185b71d0
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/SwitchSqlBackupStrategyModal.tsx
@@ -0,0 +1,73 @@
+import { BasicModal, BasicButton, BasicSelect } from '@actiontech/shared';
+import { Form, message } from 'antd';
+import { useTranslation } from 'react-i18next';
+import workflow from '@actiontech/shared/lib/api/sqle/service/workflow';
+import { ResponseCode } from '@actiontech/shared/lib/enum';
+import { UpdateSqlBackupStrategyReqStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+import { BackupStrategyOptions } from './index.data';
+
+const SwitchSqlBackupStrategyModal: React.FC<{
+ sqlID?: number;
+ open: boolean;
+ onCancel: () => void;
+ taskID?: string;
+ refresh: () => void;
+}> = ({ open, onCancel, taskID, sqlID, refresh }) => {
+ const { t } = useTranslation();
+
+ const [messageApi, contextHolder] = message.useMessage();
+
+ const [form] = Form.useForm<{
+ strategy: UpdateSqlBackupStrategyReqStrategyEnum;
+ }>();
+
+ const onSubmit = async () => {
+ const values = await form.validateFields();
+ workflow
+ .UpdateSqlBackupStrategyV1({
+ task_id: taskID ?? '',
+ sql_id: `${sqlID}`,
+ strategy: values.strategy
+ })
+ .then((res) => {
+ if (res.data.code === ResponseCode.SUCCESS) {
+ messageApi.success(
+ t('execWorkflow.create.auditResult.editBackupStrategySuccessTips')
+ );
+ refresh();
+ onClose();
+ }
+ });
+ };
+
+ const onClose = () => {
+ form.resetFields();
+ onCancel();
+ };
+
+ return (
+
+ {t('common.cancel')}
+
+ {t('common.ok')}
+
+ >
+ }
+ centered
+ closable={false}
+ >
+ {contextHolder}
+
+
+
+
+
+ );
+};
+
+export default SwitchSqlBackupStrategyModal;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx
index a95b0c000..8cb19e2d8 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx
@@ -4,10 +4,15 @@ import { EditText, SQLRenderer } from '@actiontech/shared';
import { tooltipsCommonProps } from '@actiontech/shared/lib/components/BasicToolTips';
import { t } from '../../../../../locale';
import ResultIconRender from '../../../../../components/AuditResultMessage/ResultIconRender';
+import { BasicToolTips, BasicTag } from '@actiontech/shared';
+import { AuditResultBackupPolicyColumnStyleWrapper } from './style';
+import { EditFilled } from '@actiontech/icons';
+import { BackupStrategyDictionary } from './index.data';
export const AuditResultForCreateWorkflowColumn = (
updateSqlDescribe: (sqlNum: number, sqlDescribe: string) => void,
- onClickAuditResult: (record: IAuditTaskSQLResV2) => void
+ onClickAuditResult: (record: IAuditTaskSQLResV2) => void,
+ onSwitchSqlBackupPolicy: (sqlID?: number) => void
): ActiontechTableColumn => {
return [
{
@@ -48,6 +53,37 @@ export const AuditResultForCreateWorkflowColumn = (
);
}
},
+ // #if [ee]
+ {
+ dataIndex: 'backup_strategy',
+ title: () => (
+
+ {t('execWorkflow.audit.table.backupPolicy')}
+
+ ),
+ className: 'backup-policy-column',
+ render: (backupStrategy, record) => {
+ if (!backupStrategy) {
+ return '-';
+ }
+ return (
+
+ {BackupStrategyDictionary[backupStrategy]}
+ {
+ onSwitchSqlBackupPolicy(record.exec_sql_id);
+ }}
+ />
+
+ );
+ }
+ },
+ // #endif
{
dataIndex: 'description',
title: () => t('execWorkflow.audit.table.describe'),
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.data.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.data.ts
new file mode 100644
index 000000000..295da5c76
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.data.ts
@@ -0,0 +1,49 @@
+import { UpdateSqlBackupStrategyReqStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+import { t } from '../../../../../locale/index';
+
+export const BackupStrategyDictionary: {
+ [key in UpdateSqlBackupStrategyReqStrategyEnum]: string;
+} = {
+ [UpdateSqlBackupStrategyReqStrategyEnum.reverse_sql]: t(
+ 'execWorkflow.create.backupStrategy.reverseSql'
+ ),
+ [UpdateSqlBackupStrategyReqStrategyEnum.origin_row]: t(
+ 'execWorkflow.create.backupStrategy.originRow'
+ ),
+ [UpdateSqlBackupStrategyReqStrategyEnum.manual]: t(
+ 'execWorkflow.create.backupStrategy.manual'
+ ),
+ [UpdateSqlBackupStrategyReqStrategyEnum.none]: t(
+ 'execWorkflow.create.backupStrategy.none'
+ )
+};
+
+export const BackupStrategyOptions: Array<{
+ label: string;
+ value: UpdateSqlBackupStrategyReqStrategyEnum;
+}> = [
+ {
+ label:
+ BackupStrategyDictionary[
+ UpdateSqlBackupStrategyReqStrategyEnum.reverse_sql
+ ],
+ value: UpdateSqlBackupStrategyReqStrategyEnum.reverse_sql
+ },
+ {
+ label:
+ BackupStrategyDictionary[
+ UpdateSqlBackupStrategyReqStrategyEnum.origin_row
+ ],
+ value: UpdateSqlBackupStrategyReqStrategyEnum.origin_row
+ },
+ {
+ label:
+ BackupStrategyDictionary[UpdateSqlBackupStrategyReqStrategyEnum.manual],
+ value: UpdateSqlBackupStrategyReqStrategyEnum.manual
+ },
+ {
+ label:
+ BackupStrategyDictionary[UpdateSqlBackupStrategyReqStrategyEnum.none],
+ value: UpdateSqlBackupStrategyReqStrategyEnum.none
+ }
+];
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.tsx
index 7ef4b0d90..1afc8cdfb 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.tsx
@@ -17,6 +17,10 @@ import { AuditResultForCreateWorkflowActions } from './actions';
import { usePermission } from '@actiontech/shared/lib/global';
import { parse2ReactRouterPath } from '@actiontech/shared/lib/components/TypedRouter/utils';
import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths';
+import SwitchSqlBackupStrategyModal from './SwitchSqlBackupStrategyModal';
+import { EmptyBox } from '@actiontech/shared';
+import EventEmitter from '../../../../../utils/EventEmitter';
+import EmitterKey from '../../../../../data/EmitterKey';
const AuditResultTable: React.FC = ({
noDuplicate,
@@ -24,7 +28,8 @@ const AuditResultTable: React.FC = ({
auditLevelFilterValue,
projectID,
updateTaskRecordCount,
- dbType
+ dbType,
+ allowSwitchBackupPolicy = false
}) => {
const [currentAuditResultRecord, setCurrentAuditResultRecord] =
useState();
@@ -32,6 +37,8 @@ const AuditResultTable: React.FC = ({
auditResultDrawerVisibility,
{ setFalse: closeAuditResultDrawer, setTrue: openAuditResultDrawer }
] = useBoolean();
+ const [execSqlID, setExecSqlID] = useState();
+
const { pagination, tableChange, setPagination } = useTableRequestParams();
const { requestErrorMessage, handleTableRequestError } =
useTableRequestError();
@@ -41,6 +48,14 @@ const AuditResultTable: React.FC = ({
const { openCreateWhitelistModal, updateSelectWhitelistRecord } =
useWhitelistRedux();
+ const [
+ switchBackupPolicyOpen,
+ {
+ setTrue: openSwitchBackupPolicyModal,
+ setFalse: closeSwitchBackupPolicyModal
+ }
+ ] = useBoolean();
+
const handleClickAnalyze = useCallback(
(sqlNum?: number) => {
if (typeof sqlNum === 'undefined') {
@@ -55,31 +70,6 @@ const AuditResultTable: React.FC = ({
[projectID, taskID]
);
const updateSqlDescribeProtect = useRef(false);
- const updateSqlDescribe = (sqlNum: number, sqlDescribe: string) => {
- if (updateSqlDescribeProtect.current) {
- return;
- }
- updateSqlDescribeProtect.current = true;
- task
- .updateAuditTaskSQLsV1({
- number: `${sqlNum}`,
- description: sqlDescribe,
- task_id: taskID!
- })
- .then((res) => {
- if (res.data.code === ResponseCode.SUCCESS) {
- refresh();
- }
- })
- .finally(() => {
- updateSqlDescribeProtect.current = false;
- });
- };
-
- const onClickAuditResult = (record: IAuditTaskSQLResV2) => {
- openAuditResultDrawer();
- setCurrentAuditResultRecord(record);
- };
const { data, loading, refresh } = useRequest(
() =>
@@ -106,6 +96,38 @@ const AuditResultTable: React.FC = ({
}
);
+ const updateSqlDescribe = useCallback(
+ (sqlNum: number, sqlDescribe: string) => {
+ if (updateSqlDescribeProtect.current) {
+ return;
+ }
+ updateSqlDescribeProtect.current = true;
+ task
+ .updateAuditTaskSQLsV1({
+ number: `${sqlNum}`,
+ description: sqlDescribe,
+ task_id: taskID!
+ })
+ .then((res) => {
+ if (res.data.code === ResponseCode.SUCCESS) {
+ refresh();
+ }
+ })
+ .finally(() => {
+ updateSqlDescribeProtect.current = false;
+ });
+ },
+ [refresh, taskID]
+ );
+
+ const onClickAuditResult = useCallback(
+ (record: IAuditTaskSQLResV2) => {
+ openAuditResultDrawer();
+ setCurrentAuditResultRecord(record);
+ },
+ [openAuditResultDrawer]
+ );
+
// @feature: useTableRequestParams 整合自定义filter info
useEffect(() => {
setPagination({
@@ -131,15 +153,49 @@ const AuditResultTable: React.FC = ({
);
}, [parse2TableActionPermissions, handleClickAnalyze, onCreateWhitelist]);
+ const onSwitchSqlBackupPolicy = useCallback(
+ (sqlId?: number) => {
+ openSwitchBackupPolicyModal();
+ setExecSqlID(sqlId);
+ },
+ [openSwitchBackupPolicyModal]
+ );
+
+ const columns = useMemo(() => {
+ const tableColumns = AuditResultForCreateWorkflowColumn(
+ updateSqlDescribe,
+ onClickAuditResult,
+ onSwitchSqlBackupPolicy
+ );
+ // #if [ee]
+ if (!allowSwitchBackupPolicy) {
+ return tableColumns.filter((v) => v.dataIndex !== 'backup_strategy');
+ }
+ // #endif
+ return tableColumns;
+ }, [
+ onSwitchSqlBackupPolicy,
+ updateSqlDescribe,
+ onClickAuditResult,
+ allowSwitchBackupPolicy
+ ]);
+
+ useEffect(() => {
+ if (allowSwitchBackupPolicy) {
+ const { unsubscribe } = EventEmitter.subscribe(
+ EmitterKey.Refresh_Sql_Exec_workflow_Audit_Result_List,
+ refresh
+ );
+ return unsubscribe;
+ }
+ }, [allowSwitchBackupPolicy, refresh]);
+
return (
<>
= ({
clickAnalyze={handleClickAnalyze}
/>
+ {/* #if [ee] */}
+
+
+
+ {/* #endif */}
>
);
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.type.ts
index 2f2d06a4a..0be296324 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.type.ts
@@ -8,6 +8,7 @@ export type AuditResultTableProps = {
projectID: string;
updateTaskRecordCount?: (taskId: string, sqlNumber: number) => void;
dbType?: string;
+ allowSwitchBackupPolicy?: boolean;
};
export type AuditResultDrawerProps = {
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/style.ts
index 6e24d22e9..35f854822 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/style.ts
@@ -1,4 +1,5 @@
import { styled } from '@mui/material/styles';
+import { Space } from 'antd';
export const AuditResultDrawerTitleStyleWrapper = styled(`div`)`
display: flex;
@@ -14,3 +15,22 @@ export const AuditResultDrawerTitleStyleWrapper = styled(`div`)`
line-height: 21px;
}
`;
+
+export const AuditResultBackupPolicyColumnStyleWrapper = styled(Space)`
+ & .ant-space-item {
+ display: flex;
+ align-items: center;
+ }
+
+ .backup-policy-editor {
+ cursor: pointer;
+ color: ${({ theme }) => theme.sharedTheme.uiToken.colorPrimary};
+ }
+`;
+
+export const AuditResultBackupPolicyPopoverContentStyleWrapper = styled(Space)`
+ & .ant-space-item:last-of-type {
+ display: flex;
+ justify-content: end;
+ }
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/index.tsx
index 3f5b8168e..6e5aa03d8 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/index.tsx
@@ -1,4 +1,4 @@
-import { BasicSegmented, EmptyBox } from '@actiontech/shared';
+import { BasicSegmented, EmptyBox, BasicButton } from '@actiontech/shared';
import { SegmentedRowStyleWrapper } from '@actiontech/shared/lib/styleWrapper/element';
import { Divider, Space } from 'antd';
import { useTranslation } from 'react-i18next';
@@ -22,7 +22,9 @@ import {
const AuditResultList: React.FC = ({
tasks,
updateTaskRecordCount,
- showTaskTab = true
+ showTaskTab = true,
+ allowSwitchBackupPolicy = false,
+ onBatchSwitchBackupPolicy
}) => {
const { t } = useTranslation();
const { projectID } = useCurrentProject();
@@ -86,6 +88,18 @@ const AuditResultList: React.FC = ({
)}
+ {/* #if [ee] */}
+
+ {
+ onBatchSwitchBackupPolicy?.(currentTaskID);
+ }}
+ >
+ {t('execWorkflow.create.auditResult.switchDatabaseBackupPolicy')}
+
+
+
+ {/* #endif */}
{
@@ -125,6 +139,7 @@ const AuditResultList: React.FC = ({
projectID={projectID}
updateTaskRecordCount={updateTaskRecordCount}
dbType={currentTask?.instance_db_type}
+ allowSwitchBackupPolicy={allowSwitchBackupPolicy}
/>
);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/index.type.ts
index bedf27eb8..bd7dcfa8f 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/index.type.ts
@@ -4,4 +4,6 @@ export type AuditResultListProps = {
tasks: IAuditTaskResV1[];
updateTaskRecordCount?: (taskId: string, sqlNumber: number) => void;
showTaskTab?: boolean;
+ allowSwitchBackupPolicy?: boolean;
+ onBatchSwitchBackupPolicy?: (currentTaskID?: string) => void;
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/style.ts
index 049d34036..225147123 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/style.ts
@@ -11,6 +11,12 @@ export const AuditResultForCreateWorkflowStyleWrapper = styled('section')`
cursor: pointer;
}
+ .backup-policy-column {
+ .ant-tag {
+ width: max-content;
+ }
+ }
+
.instance-segmented-label {
display: flex;
align-items: center;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
index 6e54b6839..166e4d9ec 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
@@ -22,3 +22,8 @@ export type SqlFormatterAndSubmitterProps = {
| 'databaseInfo'
| 'isSameSqlForAll'
>;
+
+export type SqlBackupSwitcherProps = Pick<
+ SqlStatementFormItemProps,
+ 'fieldPrefixPath' | 'databaseInfo'
+>;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/BatchSwitchBackupStrategyModal/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/BatchSwitchBackupStrategyModal/index.tsx
new file mode 100644
index 000000000..13002ba17
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/BatchSwitchBackupStrategyModal/index.tsx
@@ -0,0 +1,82 @@
+import { BasicModal, BasicButton, BasicSelect } from '@actiontech/shared';
+import { Space, Form, Typography, message } from 'antd';
+import { useTranslation } from 'react-i18next';
+import workflow from '@actiontech/shared/lib/api/sqle/service/workflow';
+import { ResponseCode } from '@actiontech/shared/lib/enum';
+import { UpdateTaskBackupStrategyReqStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+import { BackupStrategyOptions } from '../../../../Common/AuditResultList/Table/index.data';
+import EventEmitter from '../../../../../../utils/EventEmitter';
+import EmitterKey from '../../../../../../data/EmitterKey';
+
+const BatchSwitchBackupStrategyModal: React.FC<{
+ taskID?: string;
+ open: boolean;
+ onCancel: () => void;
+}> = ({ taskID, open, onCancel }) => {
+ const { t } = useTranslation();
+
+ const [messageApi, contextHolder] = message.useMessage();
+
+ const [form] = Form.useForm<{
+ strategy: UpdateTaskBackupStrategyReqStrategyEnum;
+ }>();
+
+ const onSubmit = async () => {
+ const values = await form.validateFields();
+ onClose();
+ workflow
+ .UpdateTaskBackupStrategyV1({
+ task_id: taskID ?? '',
+ strategy: values.strategy
+ })
+ .then((res) => {
+ if (res.data.code === ResponseCode.SUCCESS) {
+ messageApi.success(
+ t(
+ 'execWorkflow.create.auditResult.switchDatabaseBackupPolicySuccessTips'
+ )
+ );
+ EventEmitter.emit(
+ EmitterKey.Refresh_Sql_Exec_workflow_Audit_Result_List
+ );
+ onClose();
+ }
+ });
+ };
+
+ const onClose = () => {
+ form.resetFields();
+ onCancel();
+ };
+
+ return (
+
+ {t('common.cancel')}
+
+ {t('common.ok')}
+
+ >
+ }
+ centered
+ closable={false}
+ >
+ {contextHolder}
+
+
+ {t('execWorkflow.create.auditResult.switchDatabaseBackupPolicyTips')}
+
+
+
+
+
+
+
+ );
+};
+
+export default BatchSwitchBackupStrategyModal;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/index.tsx
index 071a42708..ea65d987b 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/index.tsx
@@ -8,6 +8,8 @@ import { useBoolean } from 'ahooks';
import AuditResultList from '../../../Common/AuditResultList';
import UpdateFormDrawer from './UpdateFormDrawer';
import SubmitWorkflowButton from '../../../Common/SubmitWorkflowButton';
+import BatchSwitchBackupStrategyModal from './BatchSwitchBackupStrategyModal';
+import { useState } from 'react';
const AuditResultStep: React.FC = ({
tasks,
@@ -31,6 +33,16 @@ const AuditResultStep: React.FC = ({
}
] = useBoolean(false);
+ const [
+ switchBackupPolicyOpen,
+ {
+ setTrue: openSwitchBackupPolicyModal,
+ setFalse: closeSwitchBackupPolicyModal
+ }
+ ] = useBoolean();
+
+ const [taskID, setTaskID] = useState();
+
const internalCreateWorkflow = () => {
startCreate();
@@ -39,6 +51,11 @@ const AuditResultStep: React.FC = ({
});
};
+ const onBatchSwitchBackupPolicy = (currentTaskID?: string) => {
+ openSwitchBackupPolicyModal();
+ setTaskID(currentTaskID);
+ };
+
return (
<>
= ({
= ({
auditAction={auditAction}
{...sharedStepDetail}
/>
+
+ {/* #if [ee] */}
+
+ {/* #endif */}
>
);
};
From c113f0c36184a6f787f9b0477329dfabb0d32519 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Tue, 19 Nov 2024 15:22:02 +0800
Subject: [PATCH 04/20] [fix]: Code optimization[skip ci]
---
.../sqle/src/locale/zh-CN/execWorkflow.ts | 1 +
.../Common/AuditResultList/Table/column.tsx | 4 ++-
.../Common/AuditResultList/Table/index.tsx | 9 ++++--
.../components/SqlBackupSwitcher.tsx | 30 +++++++++++--------
.../components/SwitchField.tsx | 7 ++---
.../components/index.type.ts | 6 ++++
6 files changed, 36 insertions(+), 21 deletions(-)
diff --git a/packages/sqle/src/locale/zh-CN/execWorkflow.ts b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
index d44ceebb5..7825dc4e5 100644
--- a/packages/sqle/src/locale/zh-CN/execWorkflow.ts
+++ b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
@@ -106,6 +106,7 @@ export default {
executeFileMode: '文件模式',
selectFileSortMethod: '选择文件排序方式',
switchSqlBackup: '是否选择开启备份',
+ switchSqlBackupTips: '开启后,数据源上创建的工单将默认开启备份能力',
cancelSwitchSqlBackupTips:
'当前应用的数据源已开启备份需求,是否确认关闭备份?',
cancelSwitchSqlBackupTipsWithInstanceName:
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx
index 8cb19e2d8..8a25c6bf0 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx
@@ -9,6 +9,8 @@ import { AuditResultBackupPolicyColumnStyleWrapper } from './style';
import { EditFilled } from '@actiontech/icons';
import { BackupStrategyDictionary } from './index.data';
+export const BACKUP_STRATEGY_DATA_INDEX = 'backup_strategy';
+
export const AuditResultForCreateWorkflowColumn = (
updateSqlDescribe: (sqlNum: number, sqlDescribe: string) => void,
onClickAuditResult: (record: IAuditTaskSQLResV2) => void,
@@ -55,7 +57,7 @@ export const AuditResultForCreateWorkflowColumn = (
},
// #if [ee]
{
- dataIndex: 'backup_strategy',
+ dataIndex: BACKUP_STRATEGY_DATA_INDEX,
title: () => (
= ({
);
// #if [ee]
if (!allowSwitchBackupPolicy) {
- return tableColumns.filter((v) => v.dataIndex !== 'backup_strategy');
+ return tableColumns.filter(
+ (v) => v.dataIndex !== BACKUP_STRATEGY_DATA_INDEX
+ );
}
// #endif
return tableColumns;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
index 9608bc0e4..eb33f13c2 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
@@ -1,4 +1,7 @@
-import { FormItemLabel } from '@actiontech/shared/lib/components/FormCom';
+import {
+ FormItemLabel,
+ CustomLabelContent
+} from '@actiontech/shared/lib/components/FormCom';
import { useTranslation } from 'react-i18next';
import { EmptyBox } from '@actiontech/shared';
import { Form } from 'antd';
@@ -23,7 +26,7 @@ const SqlBackupSwitcher: React.FC = ({
);
const isSameSqlForAll = Form.useWatch('isSameSqlForAll', form);
- const getInitValue = () => {
+ const getInstanceEnableBackup = () => {
if (isSameSqlForAll) {
return databaseInfo.some((item) => item.enableBackup);
}
@@ -34,15 +37,10 @@ const SqlBackupSwitcher: React.FC = ({
};
const enableBackupInstanceName = useMemo(() => {
- let nameStr = '';
- databaseInfo.forEach((item, index) => {
- if (item.enableBackup) {
- nameStr += `${item.instanceName}${
- index === databaseInfo.length - 1 ? '' : ','
- }`;
- }
- });
- return nameStr;
+ return databaseInfo
+ .filter((i) => i.enableBackup)
+ .map((i) => i.instanceName)
+ .join(',');
}, [databaseInfo]);
return (
@@ -52,12 +50,18 @@ const SqlBackupSwitcher: React.FC = ({
}
>
+ }
labelCol={{ span: 22 }}
wrapperCol={{ span: 2 }}
name={[fieldPrefixPath, 'backup']}
valuePropName="checked"
- initialValue={getInitValue()}
+ initialValue={getInstanceEnableBackup()}
>
void;
- title?: string;
-}> = ({ checked, onChange }) => {
+const SwitchField: React.FC = ({ checked, onChange }) => {
const { t } = useTranslation();
const [
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
index 166e4d9ec..8ed5b7d6a 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
@@ -27,3 +27,9 @@ export type SqlBackupSwitcherProps = Pick<
SqlStatementFormItemProps,
'fieldPrefixPath' | 'databaseInfo'
>;
+
+export type SwitcherField = {
+ checked?: boolean;
+ onChange?: (v: boolean) => void;
+ title?: string;
+};
From 55933851a503fec88c34597ec7be7922387125ff Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Tue, 19 Nov 2024 16:31:50 +0800
Subject: [PATCH 05/20] [fix]: Code Optimization
---
.../Table/SwitchSqlBackupStrategyModal.tsx | 11 ++++-------
.../Common/AuditResultList/Table/column.tsx | 10 +++++-----
.../Common/AuditResultList/Table/index.tsx | 18 ++++--------------
.../Common/AuditResultList/Table/index.type.ts | 8 ++++++++
.../components/SwitchField.tsx | 4 ++--
.../components/index.type.ts | 2 +-
.../BatchSwitchBackupStrategyModal/index.tsx | 8 ++++++--
7 files changed, 30 insertions(+), 31 deletions(-)
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/SwitchSqlBackupStrategyModal.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/SwitchSqlBackupStrategyModal.tsx
index 4185b71d0..8d63f987f 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/SwitchSqlBackupStrategyModal.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/SwitchSqlBackupStrategyModal.tsx
@@ -5,14 +5,11 @@ import workflow from '@actiontech/shared/lib/api/sqle/service/workflow';
import { ResponseCode } from '@actiontech/shared/lib/enum';
import { UpdateSqlBackupStrategyReqStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
import { BackupStrategyOptions } from './index.data';
+import { SwitchSqlBackupStrategyModalProps } from './index.type';
-const SwitchSqlBackupStrategyModal: React.FC<{
- sqlID?: number;
- open: boolean;
- onCancel: () => void;
- taskID?: string;
- refresh: () => void;
-}> = ({ open, onCancel, taskID, sqlID, refresh }) => {
+const SwitchSqlBackupStrategyModal: React.FC<
+ SwitchSqlBackupStrategyModalProps
+> = ({ open, onCancel, taskID, sqlID, refresh }) => {
const { t } = useTranslation();
const [messageApi, contextHolder] = message.useMessage();
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx
index 8a25c6bf0..b58c31eb1 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/column.tsx
@@ -9,12 +9,11 @@ import { AuditResultBackupPolicyColumnStyleWrapper } from './style';
import { EditFilled } from '@actiontech/icons';
import { BackupStrategyDictionary } from './index.data';
-export const BACKUP_STRATEGY_DATA_INDEX = 'backup_strategy';
-
export const AuditResultForCreateWorkflowColumn = (
updateSqlDescribe: (sqlNum: number, sqlDescribe: string) => void,
onClickAuditResult: (record: IAuditTaskSQLResV2) => void,
- onSwitchSqlBackupPolicy: (sqlID?: number) => void
+ onSwitchSqlBackupPolicy: (sqlID?: number) => void,
+ showBackupStrategy?: boolean
): ActiontechTableColumn => {
return [
{
@@ -57,7 +56,7 @@ export const AuditResultForCreateWorkflowColumn = (
},
// #if [ee]
{
- dataIndex: BACKUP_STRATEGY_DATA_INDEX,
+ dataIndex: 'backup_strategy',
title: () => (
);
- }
+ },
+ show: showBackupStrategy
},
// #endif
{
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.tsx
index 714ddc45c..aea09a3ca 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.tsx
@@ -9,10 +9,7 @@ import {
useTableRequestParams
} from '@actiontech/shared/lib/components/ActiontechTable';
import { AuditResultTableProps } from './index.type';
-import {
- AuditResultForCreateWorkflowColumn,
- BACKUP_STRATEGY_DATA_INDEX
-} from './column';
+import { AuditResultForCreateWorkflowColumn } from './column';
import AuditResultDrawer from './AuditResultDrawer';
import useWhitelistRedux from '../../../../Whitelist/hooks/useWhitelistRedux';
import AddWhitelistModal from '../../../../Whitelist/Drawer/AddWhitelist';
@@ -165,19 +162,12 @@ const AuditResultTable: React.FC = ({
);
const columns = useMemo(() => {
- const tableColumns = AuditResultForCreateWorkflowColumn(
+ return AuditResultForCreateWorkflowColumn(
updateSqlDescribe,
onClickAuditResult,
- onSwitchSqlBackupPolicy
+ onSwitchSqlBackupPolicy,
+ allowSwitchBackupPolicy
);
- // #if [ee]
- if (!allowSwitchBackupPolicy) {
- return tableColumns.filter(
- (v) => v.dataIndex !== BACKUP_STRATEGY_DATA_INDEX
- );
- }
- // #endif
- return tableColumns;
}, [
onSwitchSqlBackupPolicy,
updateSqlDescribe,
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.type.ts
index 0be296324..27f7f017a 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.type.ts
@@ -18,3 +18,11 @@ export type AuditResultDrawerProps = {
dbType?: string;
clickAnalyze: (sqlNum?: number) => void;
};
+
+export type SwitchSqlBackupStrategyModalProps = {
+ sqlID?: number;
+ open: boolean;
+ onCancel: () => void;
+ taskID?: string;
+ refresh: () => void;
+};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
index 09561ffd9..fa159e314 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
@@ -2,9 +2,9 @@ import { BasicSwitch } from '@actiontech/shared';
import { Popconfirm } from 'antd';
import { useTranslation } from 'react-i18next';
import { useBoolean } from 'ahooks';
-import { SwitcherField } from './index.type';
+import { SwitcherFieldProps } from './index.type';
-const SwitchField: React.FC = ({ checked, onChange }) => {
+const SwitchField: React.FC = ({ checked, onChange }) => {
const { t } = useTranslation();
const [
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
index 8ed5b7d6a..959830945 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
@@ -28,7 +28,7 @@ export type SqlBackupSwitcherProps = Pick<
'fieldPrefixPath' | 'databaseInfo'
>;
-export type SwitcherField = {
+export type SwitcherFieldProps = {
checked?: boolean;
onChange?: (v: boolean) => void;
title?: string;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/BatchSwitchBackupStrategyModal/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/BatchSwitchBackupStrategyModal/index.tsx
index 13002ba17..d69df1576 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/BatchSwitchBackupStrategyModal/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/BatchSwitchBackupStrategyModal/index.tsx
@@ -8,11 +8,15 @@ import { BackupStrategyOptions } from '../../../../Common/AuditResultList/Table/
import EventEmitter from '../../../../../../utils/EventEmitter';
import EmitterKey from '../../../../../../data/EmitterKey';
-const BatchSwitchBackupStrategyModal: React.FC<{
+type BatchSwitchBackupStrategyModalProps = {
taskID?: string;
open: boolean;
onCancel: () => void;
-}> = ({ taskID, open, onCancel }) => {
+};
+
+const BatchSwitchBackupStrategyModal: React.FC<
+ BatchSwitchBackupStrategyModalProps
+> = ({ taskID, open, onCancel }) => {
const { t } = useTranslation();
const [messageApi, contextHolder] = message.useMessage();
From 24ff25b3d03943afa1acb3d37b8572a55c76d0a6 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Tue, 19 Nov 2024 16:33:15 +0800
Subject: [PATCH 06/20] [fix](ActiontechTable): Filter columns by show
attribute[skip ci]
---
.../lib/components/ActiontechTable/Table.tsx | 4 +-
.../__snapshots__/index.test.tsx.snap | 92 +++++++++++++++++++
.../components/ActiontechTable/index.test.tsx | 25 +++++
3 files changed, 120 insertions(+), 1 deletion(-)
diff --git a/packages/shared/lib/components/ActiontechTable/Table.tsx b/packages/shared/lib/components/ActiontechTable/Table.tsx
index ad43b3af8..e58b4a22b 100644
--- a/packages/shared/lib/components/ActiontechTable/Table.tsx
+++ b/packages/shared/lib/components/ActiontechTable/Table.tsx
@@ -37,8 +37,10 @@ const ActiontechTable = <
const mergerColumns = useMemo(() => {
const operatorColumn = renderActionInTable(props.actions);
+ const extractedColumns = columns.filter((v) => v.show !== false);
+
return (
- operatorColumn ? [...columns, operatorColumn] : columns
+ operatorColumn ? [...extractedColumns, operatorColumn] : extractedColumns
) as ActiontechTableColumn;
}, [columns, props.actions, renderActionInTable]);
diff --git a/packages/shared/lib/components/ActiontechTable/__snapshots__/index.test.tsx.snap b/packages/shared/lib/components/ActiontechTable/__snapshots__/index.test.tsx.snap
index 59f82dd90..59bcdd38b 100644
--- a/packages/shared/lib/components/ActiontechTable/__snapshots__/index.test.tsx.snap
+++ b/packages/shared/lib/components/ActiontechTable/__snapshots__/index.test.tsx.snap
@@ -1420,6 +1420,98 @@ exports[`lib/ActiontechTable -composite table render table with filter 1`] = `
+
+
diff --git a/packages/shared/lib/components/ActiontechTable/index.test.tsx b/packages/shared/lib/components/ActiontechTable/index.test.tsx
index e86ed9d6d..7287b3f49 100644
--- a/packages/shared/lib/components/ActiontechTable/index.test.tsx
+++ b/packages/shared/lib/components/ActiontechTable/index.test.tsx
@@ -97,6 +97,31 @@ describe('lib/ActiontechTable', () => {
expect(onChangeFn).toHaveBeenCalledTimes(1);
expect(baseElement).toMatchSnapshot();
});
+
+ it('render filter columns by show attribute', async () => {
+ const { baseElement } = customRender({
+ pagination: false,
+ dataSource: [
+ { name: 'a', age: 11 },
+ { name: 'b', age: 18 },
+ { name: 'c', age: 19 }
+ ],
+ rowKey: 'name',
+ columns: [
+ {
+ dataIndex: 'a',
+ title: '名称'
+ },
+ {
+ dataIndex: 'b',
+ title: '年龄',
+ show: false
+ }
+ ]
+ });
+ expect(baseElement).toMatchSnapshot();
+ expect(screen.queryByText('年龄')).not.toBeInTheDocument();
+ });
});
describe('-composite table', () => {
From 1838140d6fdf72fcf9e98448913c67636ebea0f5 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Wed, 20 Nov 2024 18:20:39 +0800
Subject: [PATCH 07/20] [feature](SqlExecWorkflow): Backup strategy display and
rollback workflow[skip ci]
---
.../base/src/locale/zh-CN/dmsDataSource.ts | 5 +-
.../usePermission/permissionManifest.ts | 10 +
.../lib/global/usePermission/permissions.ts | 4 +-
.../src/hooks/useStaticStatus/index.data.ts | 4 +-
.../sqle/src/locale/zh-CN/execWorkflow.ts | 5 +-
.../Common/DownloadRecord/index.tsx | 26 +-
.../Common/DownloadRecord/index.type.ts | 1 +
.../components/SqlBackupSwitcher.tsx | 9 +-
.../components/SwitchField.tsx | 9 +-
.../components/index.type.ts | 2 +-
.../SqlStatementFormItem/index.tsx | 1 +
.../hooks/useRenderDatabaseSelectionItems.tsx | 4 +-
.../Create/hooks/useAuditWorkflow.tsx | 6 +-
.../Common/ResultCard/SqlMode.tsx | 231 +++++++------
.../ResultCard/components/ExecStatusTag.tsx | 7 +-
.../Common/ResultCard/index.data.ts | 7 +
.../Common/ResultCard/index.type.ts | 1 +
.../TaskResultList/Common/ResultCard/style.ts | 33 ++
.../PaginationList/SqlExecuteMode/index.tsx | 4 +-
.../TaskResultList/index.type.ts | 1 +
.../components/AuditExecResultPanel/index.tsx | 7 +-
.../components/PageHeaderExtra/action.tsx | 34 ++
.../hooks/useWorkflowDetailAction.tsx | 46 ++-
.../components/PageHeaderExtra/index.tsx | 11 +-
.../components/PageHeaderExtra/index.type.ts | 2 +
.../components/SqlRollback/TableTransfer.tsx | 67 ++++
.../Detail/components/SqlRollback/columns.tsx | 124 +++++++
.../components/SqlRollback/index.data.ts | 63 ++++
.../Detail/components/SqlRollback/index.tsx | 327 ++++++++++++++++++
.../components/SqlRollback/index.type.ts | 37 ++
.../Detail/components/SqlRollback/style.ts | 51 +++
.../Detail/hooks/useCloneExecWorkflowInfo.ts | 18 +-
.../src/page/SqlExecWorkflow/Detail/index.tsx | 16 +-
.../sqle/src/store/sqlExecWorkflow/index.ts | 17 +-
34 files changed, 1052 insertions(+), 138 deletions(-)
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.data.ts
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.data.ts
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts
diff --git a/packages/base/src/locale/zh-CN/dmsDataSource.ts b/packages/base/src/locale/zh-CN/dmsDataSource.ts
index c23a69ebf..3e45a1c69 100644
--- a/packages/base/src/locale/zh-CN/dmsDataSource.ts
+++ b/packages/base/src/locale/zh-CN/dmsDataSource.ts
@@ -72,7 +72,10 @@ export default {
dataMaskConfig: '数据脱敏配置',
dataMaskConfigLabel: 'SQL工作台是否开启脱敏配置',
dataMaskConfigTips: '开启后,将对SQL工作台的查询结果进行脱敏',
- checkDataMaskButton: '查看脱敏规则'
+ checkDataMaskButton: '查看脱敏规则',
+ sqlBackupConfiguration: 'SQL备份配置',
+ enableDataSourceBackup: '是否开启数据源上的SQL备份能力',
+ enableDataSourceBackupTips: '是否开启数据源上的SQL备份能力'
},
testConnectModal: {
diff --git a/packages/shared/lib/global/usePermission/permissionManifest.ts b/packages/shared/lib/global/usePermission/permissionManifest.ts
index d7811df62..3c33bcaef 100644
--- a/packages/shared/lib/global/usePermission/permissionManifest.ts
+++ b/packages/shared/lib/global/usePermission/permissionManifest.ts
@@ -563,6 +563,16 @@ export const PERMISSION_MANIFEST: Record<
type: 'action',
role: [SystemRole.admin, SystemRole.globalManager]
},
+ [PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.RETRY]: {
+ id: PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.RETRY,
+ type: 'action',
+ projectArchived: false
+ },
+ [PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.ROLLBACK]: {
+ id: PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.ROLLBACK,
+ type: 'action',
+ projectArchived: false
+ },
// SQL 管控
[PERMISSIONS.ACTIONS.SQLE.SQL_MANAGEMENT.ASSIGNMENT]: {
diff --git a/packages/shared/lib/global/usePermission/permissions.ts b/packages/shared/lib/global/usePermission/permissions.ts
index 0bb86ccd1..75e5f2507 100644
--- a/packages/shared/lib/global/usePermission/permissions.ts
+++ b/packages/shared/lib/global/usePermission/permissions.ts
@@ -151,7 +151,9 @@ export const PERMISSIONS = {
SCHEDULE_TIME_EXEC_TASK: 'action:schedule_time_exec_task',
CANCEL_SCHEDULE_TIME_EXEC_TASK: 'action:cancel_schedule_time_exec_task',
CREATE_WHITE_LIST: 'action:workflow_sql_audit_result_create_white_list',
- BATCH_CLOSE: 'action:batch_close_workflow'
+ BATCH_CLOSE: 'action:batch_close_workflow',
+ RETRY: 'action:retry_workflow',
+ ROLLBACK: 'action:rollback_workflow'
},
SQL_MANAGEMENT: {
ASSIGNMENT: 'action:sql_assignment',
diff --git a/packages/sqle/src/hooks/useStaticStatus/index.data.ts b/packages/sqle/src/hooks/useStaticStatus/index.data.ts
index 5df594a45..08811db6f 100644
--- a/packages/sqle/src/hooks/useStaticStatus/index.data.ts
+++ b/packages/sqle/src/hooks/useStaticStatus/index.data.ts
@@ -37,7 +37,9 @@ export const execStatusDictionary: StaticEnumDictionary
=
diff --git a/packages/sqle/src/locale/zh-CN/execWorkflow.ts b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
index 7825dc4e5..1dc5ae319 100644
--- a/packages/sqle/src/locale/zh-CN/execWorkflow.ts
+++ b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
@@ -110,7 +110,7 @@ export default {
cancelSwitchSqlBackupTips:
'当前应用的数据源已开启备份需求,是否确认关闭备份?',
cancelSwitchSqlBackupTipsWithInstanceName:
- '{instanceName}已开启备份需求,是否确认关闭备份?'
+ '{{instanceName}}已开启备份需求,是否确认关闭备份?'
},
tour: {
modifyName: '修改工单名称',
@@ -131,7 +131,8 @@ export default {
switchDatabaseBackupPolicy: '切换数据源备份策略',
switchDatabaseBackupPolicyTips: '统一变更当前数据源上SQL的备份回滚策略为',
editBackupStrategy: '切换SQL备份回滚策略',
- editBackupStrategySuccessTips: '切换SQL备份回滚策略成功'
+ editBackupStrategySuccessTips: '切换SQL备份回滚策略成功',
+ switchDatabaseBackupPolicySuccessTips: '切换数据源备份策略成功'
},
backupStrategy: {
reverseSql: '基于反向SQL回滚',
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/index.tsx
index 9849f6bf6..fdbb00959 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/index.tsx
@@ -13,14 +13,18 @@ import {
DownArrowLineOutlined
} from '@actiontech/icons';
import { CommonIconStyleWrapper } from '@actiontech/shared/lib/styleWrapper/element';
+import { useCurrentProject } from '@actiontech/shared/lib/global';
const DownloadRecord: React.FC = ({
noDuplicate,
- taskId
+ taskId,
+ workflowId
}) => {
const { t } = useTranslation();
const [open, setOpen] = useState(false);
+ const { projectName } = useCurrentProject();
+
const downloadSql = () => {
task.downloadAuditTaskSQLFileV1(
{
@@ -42,6 +46,20 @@ const DownloadRecord: React.FC = ({
setOpen(false);
};
+ // #if [ee]
+ const downloadRollbackSql = () => {
+ task.downloadBackupFileV1(
+ {
+ task_id: taskId,
+ workflow_id: workflowId ?? '',
+ project_name: projectName
+ },
+ { responseType: 'blob' }
+ );
+ setOpen(false);
+ };
+ // #endif
+
const renderDownloadDropdown = () => {
return (
@@ -57,6 +75,12 @@ const DownloadRecord: React.FC = ({
{t('execWorkflow.audit.downloadSql')}
+ {/* #if [ee] */}
+
+
+ {t('execWorkflow.audit.downloadRollbackSql')}
+
+ {/* #endif */}
);
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/index.type.ts
index f4dc049d1..c1add7071 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/index.type.ts
@@ -1,4 +1,5 @@
export type DownloadRecordProps = {
noDuplicate: boolean;
taskId: string;
+ workflowId?: string;
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
index eb33f13c2..42096207a 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
@@ -14,7 +14,8 @@ import SwitchField from './SwitchField';
const SqlBackupSwitcher: React.FC = ({
fieldPrefixPath,
- databaseInfo
+ databaseInfo,
+ isSameSqlForAll
}) => {
const { t } = useTranslation();
@@ -24,8 +25,6 @@ const SqlBackupSwitcher: React.FC = ({
[fieldPrefixPath, 'exec_mode'],
form
);
- const isSameSqlForAll = Form.useWatch('isSameSqlForAll', form);
-
const getInstanceEnableBackup = () => {
if (isSameSqlForAll) {
return databaseInfo.some((item) => item.enableBackup);
@@ -66,13 +65,13 @@ const SqlBackupSwitcher: React.FC = ({
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
index fa159e314..bbb92923e 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
@@ -4,7 +4,11 @@ import { useTranslation } from 'react-i18next';
import { useBoolean } from 'ahooks';
import { SwitcherFieldProps } from './index.type';
-const SwitchField: React.FC = ({ checked, onChange }) => {
+const SwitchField: React.FC = ({
+ checked,
+ onChange,
+ title
+}) => {
const { t } = useTranslation();
const [
@@ -14,7 +18,7 @@ const SwitchField: React.FC = ({ checked, onChange }) => {
return (
= ({ checked, onChange }) => {
>
{
if (!checked) {
onChange?.(true);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
index 959830945..fd5726e33 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
@@ -25,7 +25,7 @@ export type SqlFormatterAndSubmitterProps = {
export type SqlBackupSwitcherProps = Pick<
SqlStatementFormItemProps,
- 'fieldPrefixPath' | 'databaseInfo'
+ 'fieldPrefixPath' | 'databaseInfo' | 'isSameSqlForAll'
>;
export type SwitcherFieldProps = {
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
index fa5cee03e..58b471eb3 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
@@ -88,6 +88,7 @@ const SqlStatementFormItem: React.FC = ({
{/* #endif */}
& { instanceList: IInstanceTipResV1[] }) => {
+> & { instanceList?: IInstanceTipResV1[] }) => {
const { t } = useTranslation();
const { projectName, projectID } = useCurrentProject();
const { sqleTheme } = useThemeStyleData();
@@ -118,7 +118,7 @@ const useRenderDatabaseSelectionItems = ({
testConnectResult: undefined,
isSupportFileModeExecuteSql: true,
enableBackup:
- instanceList.find((i) => i.instance_name === instanceName)
+ instanceList?.find((i) => i.instance_name === instanceName)
?.enable_backup ?? false
});
updateSchemaList(key, instanceName);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx
index ed1f5e06a..4c2e08f3e 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx
@@ -140,7 +140,9 @@ const useAuditWorkflow = () => {
) {
const auditTaskPrams: IAuditTaskGroupIdV1Params = {
task_group_id: taskGroupInfo.data.data?.task_group_id,
+ // #if [ee]
enable_backup: sqlStatementInfo.backup,
+ // #endif
...getSqlSourceWithUploadType(sqlStatementInfo)
};
const res = await task.auditTaskGroupIdV1(auditTaskPrams);
@@ -192,9 +194,9 @@ const useAuditWorkflow = () => {
...getSqlSourceWithUploadType(sqlStatementInfo),
exec_mode:
sqlStatementInfo.exec_mode as unknown as CreateAuditTaskReqV1ExecModeEnum,
- enable_backup: sqlStatementInfo.backup,
// #if [ee]
- file_order_method: sqlStatementInfo.file_sort_method
+ file_order_method: sqlStatementInfo.file_sort_method,
+ enable_backup: sqlStatementInfo.backup
// #endif
};
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx
index 991b8cb96..6a16ab9f3 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx
@@ -4,13 +4,14 @@ import {
BasicToolTips,
Copy,
EmptyBox,
- SQLRenderer
+ SQLRenderer,
+ SegmentedTabs
} from '@actiontech/shared';
import task from '@actiontech/shared/lib/api/sqle/service/task';
import { ResponseCode } from '@actiontech/shared/lib/enum';
import { useBoolean } from 'ahooks';
import { Divider, Space, Spin, message } from 'antd';
-import { useMemo } from 'react';
+import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { getAuditTaskSQLsV2FilterExecStatusEnum } from '@actiontech/shared/lib/api/sqle/service/task/index.enum';
import { SqlExecuteResultCardProps } from './index.type';
@@ -18,20 +19,15 @@ import ExecStatusTag from './components/ExecStatusTag';
import AuditResultTag from './components/AuditResultTag';
import AuditResultTree from './components/AuditResultTree';
import ResultDescribe from './components/ResultDescribe';
-import {
- TaskResultSqlOptionsStyleWrapper,
- TasksResultCardStyleWrapper
-} from './style';
-import { TaskAuditResultTreeStyleWrapper } from './components/style';
-import {
- ProfileSquareFilled,
- DownOutlined,
- EnvironmentFilled
-} from '@actiontech/icons';
+import { TasksResultCardStyleWrapper } from './style';
+import { ProfileSquareFilled, EnvironmentFilled } from '@actiontech/icons';
import useThemeStyleData from '../../../../../../../../hooks/useThemeStyleData';
-import { CommonIconStyleWrapper } from '@actiontech/shared/lib/styleWrapper/element';
import { parse2ReactRouterPath } from '@actiontech/shared/lib/components/TypedRouter/utils';
import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths';
+import { TaskResultContentTypeEnum } from './index.data';
+import { BackupStrategyDictionary } from '../../../../../../Common/AuditResultList/Table/index.data';
+import { UpdateSqlBackupStrategyReqStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+import { WarningFilled } from '@actiontech/icons';
const SqlMode: React.FC = ({
projectID,
@@ -43,11 +39,13 @@ const SqlMode: React.FC = ({
const [messageApi, contextHolder] = message.useMessage();
- const [showExecSql, { setTrue, setFalse }] = useBoolean(true);
-
const { sqleTheme } = useThemeStyleData();
- const [loading, { set }] = useBoolean();
+ const [loading, { setTrue: updateDescPending, setFalse: updateDescDone }] =
+ useBoolean();
+
+ const [currentContentKey, setCurrentContentKey] =
+ useState(TaskResultContentTypeEnum.exec_sql);
const onCopyExecSql = () => {
Copy.copyTextByTextarea(props.exec_sql ?? '');
@@ -67,7 +65,7 @@ const SqlMode: React.FC = ({
};
const updateSqlDescribe = (sqlDescribe: string) => {
- set(true);
+ updateDescPending();
task
.updateAuditTaskSQLsV1({
number: `${props.number}`,
@@ -80,15 +78,10 @@ const SqlMode: React.FC = ({
}
})
.finally(() => {
- set(false);
+ updateDescDone();
});
};
- const sqlTemplate = useMemo(() => {
- const renderSql = (showExecSql ? props.exec_sql : props.rollback_sql) || '';
- return renderSql;
- }, [props.exec_sql, props.rollback_sql, showExecSql]);
-
return (
{contextHolder}
@@ -116,91 +109,121 @@ const SqlMode: React.FC = ({
-
-
- {t('execWorkflow.audit.table.execSql')}
-
-
- {t('execWorkflow.audit.table.rollback')}
-
-
-
-
-
-
-
- }
- >
-
- {t('execWorkflow.audit.sqlFileSource.source')}
-
- -
-
+ {
+ setCurrentContentKey(v as TaskResultContentTypeEnum);
+ }}
+ items={[
+ {
+ value: TaskResultContentTypeEnum.exec_sql,
+ label: t('execWorkflow.audit.table.execSql'),
+ children:
+ },
+ {
+ value: TaskResultContentTypeEnum.rollback_sql,
+ label: t('execWorkflow.audit.table.rollback'),
+ children: (
+
+
+
+
+ {props.backup_strategy_tip}
+
+
+
+ {/* #if [ee] */}
+
+
+ {
+ BackupStrategyDictionary[
+ props.backup_strategy as unknown as UpdateSqlBackupStrategyReqStrategyEnum
+ ]
+ }
+
+
+ }
+ >
+
+
+ {t('execWorkflow.audit.table.backupConflictTips')}
+
+
+
+ {/* #endif */}
+
+
-
+ )
+ },
+ {
+ value: TaskResultContentTypeEnum.exec_result,
+ label: t('execWorkflow.audit.table.execResult'),
+ children: props.exec_result || '-'
}
- >
-
- }
- >
-
- {t('execWorkflow.audit.sqlFileSource.source')}
-
- {props?.sql_source_file}
-
-
-
}>
-
- {t('execWorkflow.audit.sqlFileSource.fileLine')}
-
- {props?.sql_start_line || '-'}
-
-
+ ]}
+ segmentedRowExtraContent={
+
+
+
+
+ }
+ >
+
+ {t('execWorkflow.audit.sqlFileSource.source')}
+
+ -
+
+
+
+ }
+ >
+
+ }
+ >
+
+ {t('execWorkflow.audit.sqlFileSource.source')}
+
+ {props?.sql_source_file}
+
+
+ }>
+
+ {t('execWorkflow.audit.sqlFileSource.fileLine')}
+
+ {props?.sql_start_line || '-'}
+
+
+ }
+ />
-
-
-
-
- }
- />
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag.tsx
index e77414a82..9a56c52c4 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag.tsx
@@ -5,7 +5,9 @@ import { useTranslation } from 'react-i18next';
import { execStatusDictionary } from '../../../../../../../../../hooks/useStaticStatus/index.data';
const execStatusMap: {
- [key in getAuditTaskSQLsV2FilterExecStatusEnum]?: BasicTagColor;
+ [key in
+ | getAuditTaskSQLsV2FilterExecStatusEnum
+ | 'execute_rollback']?: BasicTagColor;
} = {
[getAuditTaskSQLsV2FilterExecStatusEnum.initialized]: 'default',
[getAuditTaskSQLsV2FilterExecStatusEnum.failed]: 'red',
@@ -14,7 +16,8 @@ const execStatusMap: {
[getAuditTaskSQLsV2FilterExecStatusEnum.manually_executed]: 'orange',
[getAuditTaskSQLsV2FilterExecStatusEnum.terminate_failed]: 'red',
[getAuditTaskSQLsV2FilterExecStatusEnum.terminate_succeeded]: 'green',
- [getAuditTaskSQLsV2FilterExecStatusEnum.terminating]: 'geekblue'
+ [getAuditTaskSQLsV2FilterExecStatusEnum.terminating]: 'geekblue',
+ [getAuditTaskSQLsV2FilterExecStatusEnum.execute_rollback]: 'orange'
};
export interface ExecStatusTagProps {
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.data.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.data.ts
new file mode 100644
index 000000000..26cc59e86
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.data.ts
@@ -0,0 +1,7 @@
+export enum TaskResultContentTypeEnum {
+ exec_sql = 'exec_sql',
+ rollback_sql = 'rollback_sql',
+ // 执行预览 暂不处理
+ exec_preview = 'exec_preview',
+ exec_result = 'exec_result'
+}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.type.ts
index c28011ff3..a1bd3e3d9 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.type.ts
@@ -12,6 +12,7 @@ export type SqlExecuteResultCardProps = BaseProps &
IAuditTaskSQLResV2 & {
onUpdateDescription?: () => void;
projectID: string;
+ backupConflict?: boolean;
};
export type FileExecuteResultCardProps = BaseProps &
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/style.ts
index 03e6d31f9..915ad4c1a 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/style.ts
@@ -39,6 +39,39 @@ export const TasksResultCardStyleWrapper = styled('div')`
.result-card-content-options {
display: flex;
justify-content: space-between;
+ margin-bottom: 16px;
+
+ .segmented-tabs-wrapper {
+ width: 100%;
+
+ .segmented-row-wrapper {
+ padding: 0;
+ border: none;
+ justify-content: space-between;
+ margin-bottom: 12px;
+ }
+
+ pre {
+ margin-bottom: 0;
+ }
+ }
+
+ .backup-conflict-tips {
+ .ant-space-item {
+ display: flex;
+ }
+ }
+
+ .result-card-content-rollback {
+ display: flex !important;
+ width: 100%;
+ align-items: start;
+
+ .ant-space-item:last-of-type {
+ flex: 1;
+ overflow: hidden;
+ }
+ }
}
& .ant-collapse.result-record-collapse .ant-collapse-header {
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/PaginationList/SqlExecuteMode/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/PaginationList/SqlExecuteMode/index.tsx
index a9b49ecd6..06c42e90a 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/PaginationList/SqlExecuteMode/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/PaginationList/SqlExecuteMode/index.tsx
@@ -18,7 +18,8 @@ const SqlExecuteMode: React.FC = ({
noDuplicate,
currentListLayout,
workflowStatus,
- auditResultActiveKey
+ auditResultActiveKey,
+ backupConflict
}) => {
const { t } = useTranslation();
@@ -79,6 +80,7 @@ const SqlExecuteMode: React.FC = ({
taskId={auditResultActiveKey}
onUpdateDescription={refresh}
executeMode={WorkflowResV2ExecModeEnum.sqls}
+ backupConflict={backupConflict}
/>
);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/index.type.ts
index 083479c59..0b5d1c592 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/index.type.ts
@@ -16,4 +16,5 @@ export type TasksResultListBaseProps = {
workflowStatus?: WorkflowRecordResV2StatusEnum;
assigneeUserNames: string[];
executeMode: WorkflowResV2ExecModeEnum;
+ backupConflict?: boolean;
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/index.tsx
index 8f20fb19c..86802b39a 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/index.tsx
@@ -130,7 +130,11 @@ const AuditExecResultPanel: React.FC = ({
>
{t('execWorkflow.create.auditResult.clearDuplicate')}
-
+
@@ -196,6 +200,7 @@ const AuditExecResultPanel: React.FC = ({
(currentTask?.exec_mode as WorkflowResV2ExecModeEnum) ??
WorkflowResV2ExecModeEnum.sqls
}
+ backupConflict={currentTask?.backup_conflict_with_instance}
/>
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/action.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/action.tsx
index 68630d696..262daa6d3 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/action.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/action.tsx
@@ -171,3 +171,37 @@ export const RefreshWorkflowAction = (refreshWorkflow: () => void) => {
/>
);
};
+
+export const RollbackWorkflowAction = (
+ rollbackWorkflowButtonMeta: WorkflowDetailActionMeta
+) => {
+ return (
+
+ rollbackWorkflowButtonMeta.action()}
+ loading={rollbackWorkflowButtonMeta.loading}
+ />
+
+ );
+};
+
+export const RetryWorkflowAction = (
+ retryWorkflowButtonMeta: WorkflowDetailActionMeta
+) => {
+ return (
+
+ retryWorkflowButtonMeta.action()}
+ loading={retryWorkflowButtonMeta.loading}
+ />
+
+ );
+};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/hooks/useWorkflowDetailAction.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/hooks/useWorkflowDetailAction.tsx
index 770a97be1..61f48d6cc 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/hooks/useWorkflowDetailAction.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/hooks/useWorkflowDetailAction.tsx
@@ -27,7 +27,9 @@ const useWorkflowDetailAction = ({
terminateAction,
completeAction,
maintenanceTimeInfo,
- executeInOtherInstanceAction
+ executeInOtherInstanceAction,
+ startRollback,
+ showModifySqlStatementStep
}: WorkflowDetailPageHeaderExtraProps & {
projectName: string;
}): {
@@ -39,6 +41,8 @@ const useWorkflowDetailAction = ({
manualExecuteWorkflowButtonMeta: WorkflowDetailActionMeta;
terminateWorkflowButtonMeta: WorkflowDetailActionMeta;
executeInOtherInstanceMeta: WorkflowDetailActionMeta;
+ rollbackWorkflowButtonMeta: WorkflowDetailActionMeta;
+ retryWorkflowButtonMeta: WorkflowDetailActionMeta;
executable?: boolean;
executable_reason?: string;
} => {
@@ -263,6 +267,36 @@ const useWorkflowDetailAction = ({
return executeInOtherInstanceAction().finally(executeInOtherInstanceFinish);
};
+ const rollbackButtonVisibility = useMemo(() => {
+ if (!workflowInfo?.record?.status) {
+ return false;
+ }
+ return [
+ WorkflowRecordResV2StatusEnum.finished,
+ WorkflowRecordResV2StatusEnum.exec_failed,
+ WorkflowRecordResV2StatusEnum.canceled
+ ].includes(workflowInfo.record.status);
+ }, [workflowInfo?.record?.status]);
+
+ const rollbackWorkflow = () => {
+ startRollback();
+ return undefined;
+ };
+
+ const retryButtonVisibility = useMemo(() => {
+ if (!workflowInfo?.record?.status) {
+ return false;
+ }
+ return (
+ workflowInfo.record.status === WorkflowRecordResV2StatusEnum.exec_failed
+ );
+ }, [workflowInfo?.record?.status]);
+
+ const retryWorkflow = () => {
+ showModifySqlStatementStep();
+ return undefined;
+ };
+
return {
messageContextHolder,
@@ -301,6 +335,16 @@ const useWorkflowDetailAction = ({
loading: executeInOtherInstanceLoading,
hidden: false
},
+ rollbackWorkflowButtonMeta: {
+ action: rollbackWorkflow,
+ loading: false,
+ hidden: !rollbackButtonVisibility
+ },
+ retryWorkflowButtonMeta: {
+ action: retryWorkflow,
+ loading: false,
+ hidden: !retryButtonVisibility
+ },
executable: workflowInfo?.record?.executable,
executable_reason: workflowInfo?.record?.executable_reason
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.tsx
index f8d4817de..f7fca62e5 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.tsx
@@ -15,7 +15,9 @@ import {
CloseWorkflowAction,
MarkManuallyExecWorkflowAction,
RefreshWorkflowAction,
- TerminateWorkflowAction
+ TerminateWorkflowAction,
+ RollbackWorkflowAction,
+ RetryWorkflowAction
} from './action';
const WorkflowDetailPageHeaderExtra: React.FC<
@@ -38,6 +40,8 @@ const WorkflowDetailPageHeaderExtra: React.FC<
manualExecuteWorkflowButtonMeta,
terminateWorkflowButtonMeta,
executeInOtherInstanceMeta,
+ rollbackWorkflowButtonMeta,
+ retryWorkflowButtonMeta,
executable,
executable_reason
} = useWorkflowDetailAction({ projectName, ...props });
@@ -54,7 +58,10 @@ const WorkflowDetailPageHeaderExtra: React.FC<
className="workflow-detail-page-header-divider"
/>
-
+ {RetryWorkflowAction(retryWorkflowButtonMeta)}
+ {/* #if [ee] */}
+ {RollbackWorkflowAction(rollbackWorkflowButtonMeta)}
+ {/* #endif */}
{CloneWorkflowAction(executeInOtherInstanceMeta)}
{BatchRejectWorkflowAction(rejectWorkflowButtonMeta, openRejectModal)}
{ApproveWorkflowAction(auditPassWorkflowButtonMeta)}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.type.ts
index 86aa7fbb2..17abdd7fe 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.type.ts
@@ -21,6 +21,8 @@ export type WorkflowDetailPageHeaderExtraProps = {
showWorkflowSteps: () => void;
workflowStepsVisibility: boolean;
executeInOtherInstanceAction: () => Promise;
+ startRollback: () => void;
+ showModifySqlStatementStep: () => void;
};
export type WorkflowDetailActionMeta = {
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
new file mode 100644
index 000000000..8c85d5bbb
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
@@ -0,0 +1,67 @@
+import { BasicTable } from '@actiontech/shared';
+import { Transfer } from 'antd';
+import {
+ TableTransferProps,
+ TableRowSelection,
+ BackupSqlType
+} from './index.type';
+
+const TableTransfer: React.FC = (props) => {
+ const {
+ leftColumns,
+ rightColumns,
+ loading,
+ leftDataSource,
+ rightDataSource,
+ leftPagination,
+ onTableChange,
+ ...restProps
+ } = props;
+ return (
+
+ {({
+ direction,
+ onItemSelect,
+ onItemSelectAll,
+ selectedKeys: listSelectedKeys
+ }) => {
+ const isLeftTable = direction === 'left';
+ const columns = isLeftTable ? leftColumns : rightColumns;
+ const rowSelection: TableRowSelection = {
+ getCheckboxProps: isLeftTable
+ ? (item) => ({ disabled: item.disabled })
+ : undefined,
+ onChange(selectedRowKeys) {
+ onItemSelectAll(selectedRowKeys as string[], 'replace');
+ },
+ selectedRowKeys: listSelectedKeys,
+ columnWidth: 60
+ };
+
+ return (
+ record.id ?? ''}
+ columns={columns}
+ dataSource={isLeftTable ? leftDataSource : rightDataSource}
+ size="small"
+ loading={loading}
+ onRow={({ id = '', disabled: itemDisabled }) => ({
+ onClick: () => {
+ if (itemDisabled) {
+ return;
+ }
+ onItemSelect(id, !listSelectedKeys.includes(id));
+ }
+ })}
+ pagination={isLeftTable ? leftPagination : undefined}
+ onChange={isLeftTable ? onTableChange : undefined}
+ scroll={{ y: '700px' }}
+ />
+ );
+ }}
+
+ );
+};
+
+export default TableTransfer;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx
new file mode 100644
index 000000000..098cdf315
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx
@@ -0,0 +1,124 @@
+import { t } from '../../../../../locale';
+import {
+ ActiontechTableColumn,
+ PageInfoWithoutIndexAndSize
+} from '@actiontech/shared/lib/components/ActiontechTable';
+import { SQLRenderer, EditText, BasicTag } from '@actiontech/shared';
+import { BackupSqlType } from './index.type';
+import { IGetBackupSqlListV1Params } from '@actiontech/shared/lib/api/sqle/service/workflow/index.d';
+import ExecStatusTag from '../AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag';
+import { tooltipsCommonProps } from '@actiontech/shared/lib/components/BasicToolTips';
+import { getAuditTaskSQLsV2FilterExecStatusEnum } from '@actiontech/shared/lib/api/sqle/service/task/index.enum';
+import { BackupStrategyDictionary } from '../../../Common/AuditResultList/Table/index.data';
+import { UpdateSqlBackupStrategyReqStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+
+export type WorkflowRollbackSqlTableFilterParamType =
+ PageInfoWithoutIndexAndSize<
+ IGetBackupSqlListV1Params & {
+ page_index: number;
+ page_size: number;
+ },
+ 'project_name' | 'workflow_id'
+ >;
+
+export const WorkflowRollbackSqlTableColumn: () => ActiontechTableColumn<
+ BackupSqlType,
+ WorkflowRollbackSqlTableFilterParamType
+> = () => {
+ return [
+ {
+ dataIndex: 'origin_sql',
+ title: 'SQL',
+ className: 'ellipsis-column-width',
+ width: 350,
+ render: (sql_fingerprint, record) => {
+ if (!sql_fingerprint) return null;
+ return (
+
+ );
+ }
+ },
+ {
+ dataIndex: 'backup_strategy',
+ title: t('execWorkflow.detail.rollback.backupStrategy'),
+ width: 150,
+ render: (strategy) => {
+ return strategy ? (
+
+ {
+ BackupStrategyDictionary[
+ strategy as unknown as UpdateSqlBackupStrategyReqStrategyEnum
+ ]
+ }
+
+ ) : (
+ '-'
+ );
+ }
+ },
+ {
+ dataIndex: 'instance_name',
+ title: t('execWorkflow.detail.rollback.instance'),
+ filterCustomType: 'select',
+ filterKey: 'filter_instance_id'
+ },
+ {
+ dataIndex: 'exec_status',
+ title: t('execWorkflow.detail.rollback.execStatus'),
+ filterCustomType: 'select',
+ filterKey: 'filter_exec_status',
+ render: (status) => {
+ return (
+
+ );
+ }
+ }
+ ];
+};
+
+export const WorkflowRollbackSelectedSqlTableColumn: (
+ onUpdateSqlRemake: (id: string, remake?: string) => void
+) => ActiontechTableColumn = (onUpdateSqlRemake) => {
+ const baseColumns = WorkflowRollbackSqlTableColumn();
+ return [
+ ...baseColumns,
+ {
+ dataIndex: 'remark',
+ title: t('execWorkflow.detail.rollback.remark'),
+ width: 150,
+ render: (remark, record) => {
+ return (
+ {
+ onUpdateSqlRemake(record.id ?? '', val);
+ }
+ }}
+ ellipsis={{
+ expandable: false,
+ tooltip: {
+ arrow: false,
+ ...tooltipsCommonProps(remark, 500)
+ },
+ rows: 1
+ }}
+ value={remark ?? ''}
+ />
+ );
+ }
+ }
+ ];
+};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.data.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.data.ts
new file mode 100644
index 000000000..516189526
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.data.ts
@@ -0,0 +1,63 @@
+import { execStatusDictionary } from '../../../../../hooks/useStaticStatus/index.data';
+import { getAuditTaskSQLsV2FilterExecStatusEnum } from '@actiontech/shared/lib/api/sqle/service/task/index.enum';
+import { t } from '../../../../../locale';
+
+export const SqlExecStatusOptions: Array<{
+ label: string;
+ value: getAuditTaskSQLsV2FilterExecStatusEnum;
+}> = [
+ {
+ label: t(
+ execStatusDictionary[getAuditTaskSQLsV2FilterExecStatusEnum.doing]
+ ),
+ value: getAuditTaskSQLsV2FilterExecStatusEnum.doing
+ },
+ {
+ label: t(
+ execStatusDictionary[getAuditTaskSQLsV2FilterExecStatusEnum.failed]
+ ),
+ value: getAuditTaskSQLsV2FilterExecStatusEnum.failed
+ },
+ {
+ label: t(
+ execStatusDictionary[getAuditTaskSQLsV2FilterExecStatusEnum.initialized]
+ ),
+ value: getAuditTaskSQLsV2FilterExecStatusEnum.initialized
+ },
+ {
+ label: t(
+ execStatusDictionary[
+ getAuditTaskSQLsV2FilterExecStatusEnum.manually_executed
+ ]
+ ),
+ value: getAuditTaskSQLsV2FilterExecStatusEnum.manually_executed
+ },
+ {
+ label: t(
+ execStatusDictionary[getAuditTaskSQLsV2FilterExecStatusEnum.succeeded]
+ ),
+ value: getAuditTaskSQLsV2FilterExecStatusEnum.succeeded
+ },
+ {
+ label: t(
+ execStatusDictionary[
+ getAuditTaskSQLsV2FilterExecStatusEnum.terminate_failed
+ ]
+ ),
+ value: getAuditTaskSQLsV2FilterExecStatusEnum.terminate_failed
+ },
+ {
+ label: t(
+ execStatusDictionary[
+ getAuditTaskSQLsV2FilterExecStatusEnum.terminate_succeeded
+ ]
+ ),
+ value: getAuditTaskSQLsV2FilterExecStatusEnum.terminate_succeeded
+ },
+ {
+ label: t(
+ execStatusDictionary[getAuditTaskSQLsV2FilterExecStatusEnum.terminating]
+ ),
+ value: getAuditTaskSQLsV2FilterExecStatusEnum.terminating
+ }
+];
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx
new file mode 100644
index 000000000..18750057d
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx
@@ -0,0 +1,327 @@
+import { SqlRollbackProps } from './index.type';
+import {
+ EmptyBox,
+ PageHeader,
+ BasicButton,
+ useTypedNavigate
+} from '@actiontech/shared';
+import { LeftArrowOutlined } from '@actiontech/icons';
+import { useTranslation } from 'react-i18next';
+import { useEffect, useState, useMemo } from 'react';
+import {
+ WorkflowRollbackSqlTableColumn,
+ WorkflowRollbackSelectedSqlTableColumn,
+ WorkflowRollbackSqlTableFilterParamType
+} from './columns';
+import { useRequest } from 'ahooks';
+import { ResponseCode } from '@actiontech/shared/lib/enum';
+import { SqlRollbackTableStyleWrapper } from './style';
+import { TransferDirection } from 'antd/es/transfer';
+import { cloneDeep } from 'lodash';
+import {
+ TableFilterContainer,
+ useTableFilterContainer,
+ useTableRequestParams,
+ FilterCustomProps
+} from '@actiontech/shared/lib/components/ActiontechTable';
+import TableTransfer from './TableTransfer';
+import { BackupSqlType, TableTransferProps } from './index.type';
+import workflow from '@actiontech/shared/lib/api/sqle/service/workflow';
+import { useCurrentProject } from '@actiontech/shared/lib/global';
+import { useParams } from 'react-router-dom';
+import { SqlExecStatusOptions } from './index.data';
+import useInstance from '../../../../../hooks/useInstance';
+import { getInstanceTipListV1FunctionalModuleEnum } from '@actiontech/shared/lib/api/sqle/service/instance/index.enum';
+import { groupBy } from 'lodash';
+import { SqlStatementFields } from '../../../Create/index.type';
+import { AuditTaskResV1SqlSourceEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+import { useDispatch } from 'react-redux';
+import {
+ updateClonedExecWorkflowSqlAuditInfo,
+ updateClonedExecWorkflowBaseInfo,
+ updateWorkflowRollbackSqlIds
+} from '../../../../../store/sqlExecWorkflow';
+import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths';
+import { Space, SelectProps } from 'antd';
+
+const SqlRollback: React.FC = ({
+ isAtRollbackStep,
+ backToWorkflowDetail,
+ taskInfos,
+ workflowInfo
+}) => {
+ const { t } = useTranslation();
+
+ const dispatch = useDispatch();
+
+ const navigate = useTypedNavigate();
+
+ const [targetKeys, setTargetKeys] = useState([]);
+
+ const [selectedList, setSelectedList] = useState([]);
+
+ const { pagination, tableChange, updateTableFilterInfo, tableFilterInfo } =
+ useTableRequestParams<
+ BackupSqlType,
+ WorkflowRollbackSqlTableFilterParamType
+ >();
+
+ const { updateAllSelectedFilterItem, filterContainerMeta } =
+ useTableFilterContainer(
+ WorkflowRollbackSqlTableColumn(),
+ updateTableFilterInfo
+ );
+
+ const { projectName, projectID } = useCurrentProject();
+
+ const { updateInstanceList, instanceIDOptions, instanceList } = useInstance();
+
+ const urlParams = useParams<{ workflowId: string }>();
+
+ const { data, loading, mutate } = useRequest(
+ () => {
+ return workflow
+ .GetBackupSqlListV1({
+ ...tableFilterInfo,
+ page_index: pagination.page_index.toString(),
+ page_size: pagination.page_size.toString(),
+ project_name: projectName,
+ workflow_id: urlParams.workflowId ?? ''
+ })
+ .then((res) => {
+ if (res.data.code === ResponseCode.SUCCESS) {
+ return {
+ list:
+ res.data.data?.map((item) => ({
+ ...item,
+ id: item.exec_sql_id?.toString(),
+ disabled: selectedList.some(
+ (i) => i.id === item.exec_sql_id?.toString()
+ )
+ })) || [],
+ total: res.data.total_nums || 0
+ };
+ }
+ });
+ },
+ {
+ refreshDeps: [pagination, tableFilterInfo],
+ ready: isAtRollbackStep
+ }
+ );
+
+ const onChange: TableTransferProps['onChange'] = (
+ nextTargetKeys: string[],
+ direction: TransferDirection,
+ moveKeys: string[]
+ ) => {
+ if (direction === 'left') {
+ const selected = selectedList.filter((i) => {
+ return !moveKeys.includes(i.id ?? '');
+ });
+ const clonedData = cloneDeep(data?.list ?? []);
+ clonedData.forEach((i) => {
+ if (moveKeys.includes(i.id ?? '')) {
+ i.disabled = false;
+ }
+ });
+ setSelectedList(selected);
+ mutate({
+ list: clonedData,
+ total: data?.total ?? 0
+ });
+ } else {
+ const selected: BackupSqlType[] = [];
+ const clonedData = cloneDeep(data?.list ?? []);
+ moveKeys.forEach((key) => {
+ const dataSource = clonedData.find((i) => {
+ if (i.id === key) {
+ i.disabled = true;
+ return true;
+ }
+ return false;
+ });
+ if (dataSource) {
+ selected.push(dataSource);
+ }
+ });
+ setSelectedList(selectedList.concat(selected));
+ mutate({
+ list: clonedData,
+ total: data?.total ?? 0
+ });
+ }
+ setTargetKeys(nextTargetKeys);
+ };
+
+ const taskInstanceIdOptions = useMemo(() => {
+ const instanceNames = taskInfos?.map((i) => i.instance_name);
+ const instanceIds = instanceNames?.map(
+ (name) => instanceList.find((i) => i.instance_name === name)?.instance_id
+ );
+ const instanceOptions: SelectProps['options'] = [];
+ instanceIDOptions.forEach((instance) => {
+ if (instance.options.some((i) => instanceIds?.includes(i.value))) {
+ instanceOptions.push({
+ ...instance,
+ options: instance.options.filter((i) =>
+ instanceIds?.includes(i.value)
+ )
+ });
+ }
+ });
+ return instanceOptions;
+ }, [taskInfos, instanceIDOptions, instanceList]);
+
+ const filterCustomProps = useMemo(() => {
+ return new Map([
+ ['instance_name', { options: taskInstanceIdOptions }],
+ ['exec_status', { options: SqlExecStatusOptions }]
+ ]);
+ }, [taskInstanceIdOptions]);
+
+ const onUpdateSqlRemake = (id: string, remark?: string) => {
+ const clonedSelectedList = cloneDeep(selectedList);
+ const editItemIndex = clonedSelectedList.findIndex((i) => i.id === id) ?? 0;
+ clonedSelectedList[editItemIndex].remark = remark;
+ setSelectedList(clonedSelectedList);
+ };
+
+ const onCreateWorkflow = () => {
+ const sqlStatement: { [key: string]: SqlStatementFields } = {};
+ let description = '';
+ selectedList.forEach((i) => {
+ if (i.remark) {
+ description += `${i.remark};`;
+ }
+ });
+ const sqlIds = selectedList.map((i) => i.exec_sql_id ?? 0);
+ const taskSqlGroup = groupBy(selectedList, 'origin_task_id');
+ const taskIds = Object.keys(taskSqlGroup);
+ const databaseInfo = taskIds?.map((id) => {
+ const taskInfo = taskInfos?.find((i) => `${i.task_id}` === id) ?? {};
+ return {
+ instanceName: taskInfo.instance_name,
+ instanceSchema: taskInfo.instance_schema
+ };
+ });
+
+ taskIds.forEach((id, index) => {
+ let sqlFormData = '';
+ const sortedBackupSqlList = taskSqlGroup[id].sort(
+ (a, b) => (a.exec_order ?? 0) - (b.exec_order ?? 0)
+ );
+ sortedBackupSqlList.forEach((item) => {
+ let backupSqlStatement = '';
+ backupSqlStatement += `-- ${t(
+ 'execWorkflow.detail.rollback.originSql'
+ )}: ${item.origin_sql} \n`;
+ item.backup_sqls?.forEach((i) => (backupSqlStatement += `${i}\n`));
+ sqlFormData += backupSqlStatement;
+ });
+ sqlStatement[`${index}`] = {
+ currentUploadType: AuditTaskResV1SqlSourceEnum.form_data,
+ form_data: sqlFormData
+ } as SqlStatementFields;
+ });
+ dispatch(
+ updateClonedExecWorkflowBaseInfo({
+ workflow_subject: `${workflowInfo?.workflow_name}_Rollback`,
+ desc: description
+ })
+ );
+
+ dispatch(
+ updateClonedExecWorkflowSqlAuditInfo({
+ isSameSqlForAll: false,
+ databaseInfo,
+ ...sqlStatement
+ })
+ );
+ dispatch(
+ updateWorkflowRollbackSqlIds({
+ workflowRollbackSqlIds: sqlIds
+ })
+ );
+
+ navigate(ROUTE_PATHS.SQLE.SQL_EXEC_WORKFLOW.create, {
+ params: { projectID },
+ queries: {
+ rollbackWorkflowId: workflowInfo?.workflow_id
+ }
+ });
+ };
+
+ const onBack = () => {
+ setSelectedList([]);
+ backToWorkflowDetail();
+ };
+
+ useEffect(() => {
+ updateInstanceList({
+ project_name: projectName,
+ functional_module:
+ getInstanceTipListV1FunctionalModuleEnum.create_workflow
+ });
+ }, [updateInstanceList, projectName]);
+
+ useEffect(() => {
+ updateAllSelectedFilterItem(true);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ return (
+
+ } onClick={onBack}>
+ {t('execWorkflow.detail.operator.backToDetail')}
+
+ }
+ extra={
+
+ {t('execWorkflow.list.createButtonText')}
+
+ }
+ />
+
+
+
+ {t('execWorkflow.detail.rollback.allSql')}
+
+ ,
+ t('execWorkflow.detail.rollback.selectedRollbackSql')
+ ]}
+ loading={loading}
+ leftDataSource={data?.list ?? []}
+ rightDataSource={selectedList}
+ leftPagination={{
+ total: data?.total || 0,
+ current: pagination.page_index
+ }}
+ onTableChange={tableChange}
+ />
+
+
+ );
+};
+
+export default SqlRollback;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts
new file mode 100644
index 000000000..0e7466ad0
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts
@@ -0,0 +1,37 @@
+import {
+ IBackupSqlData,
+ IWorkflowResV2,
+ IAuditTaskResV1
+} from '@actiontech/shared/lib/api/sqle/service/common';
+import type {
+ TableColumnsType,
+ TableProps,
+ TransferProps,
+ TablePaginationConfig
+} from 'antd';
+
+export type SqlRollbackProps = {
+ isAtRollbackStep: boolean;
+ backToWorkflowDetail: () => void;
+ workflowInfo?: IWorkflowResV2;
+ taskInfos?: IAuditTaskResV1[];
+};
+
+export type BackupSqlType = IBackupSqlData & {
+ id?: string;
+ disabled?: boolean;
+ remark?: string;
+};
+
+export type TableRowSelection = TableProps['rowSelection'];
+
+export interface TableTransferProps extends TransferProps {
+ dataSource: BackupSqlType[];
+ leftColumns: TableColumnsType;
+ rightColumns: TableColumnsType;
+ loading: boolean;
+ leftDataSource?: BackupSqlType[];
+ rightDataSource?: BackupSqlType[];
+ leftPagination: TablePaginationConfig;
+ onTableChange: TableProps['onChange'];
+}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts
new file mode 100644
index 000000000..8e96185a3
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts
@@ -0,0 +1,51 @@
+import { styled } from '@mui/material';
+
+export const SqlRollbackTableStyleWrapper = styled('section')`
+ & .ant-transfer.ant-transfer-customize-list .ant-transfer-list {
+ border: none;
+
+ &:first-of-type {
+ border: 1px solid
+ ${({ theme }) => theme.sharedTheme.uiToken.colorBorderSecondary};
+ border-top: none;
+ border-left: none;
+ }
+
+ &:last-of-type {
+ border: 1px solid
+ ${({ theme }) => theme.sharedTheme.uiToken.colorBorderSecondary};
+ border-top: none;
+ border-right: none;
+ }
+
+ .ant-transfer-list-header-selected {
+ display: none;
+ }
+
+ .ant-transfer-list-header-title {
+ text-align: start;
+ padding: 0 28px;
+ }
+
+ & .ant-table-wrapper {
+ padding-bottom: 0px;
+ }
+
+ & .ant-table-container .ant-table-body {
+ max-height: calc(100vh - 250px) !important;
+ }
+
+ .ant-tag {
+ width: max-content;
+ }
+
+ .audit-result-describe-column {
+ max-width: 600px;
+ }
+
+ .actiontech-table-filter-container-namespace {
+ padding: 0 !important;
+ border: none !important;
+ }
+ }
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/hooks/useCloneExecWorkflowInfo.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/hooks/useCloneExecWorkflowInfo.ts
index 91f383bb2..117033d91 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/hooks/useCloneExecWorkflowInfo.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/hooks/useCloneExecWorkflowInfo.ts
@@ -95,7 +95,8 @@ const useCloneExecWorkflowInfo = (
await getTaskAllSql(defaultTask.task_id).then((res) => {
sqlStatement['0'] = {
currentUploadType: AuditTaskResV1SqlSourceEnum.form_data,
- form_data: res
+ form_data: res,
+ backup: defaultTask.enable_backup
} as SqlStatementFields;
});
} else if (isSqlFileUploadType) {
@@ -103,7 +104,8 @@ const useCloneExecWorkflowInfo = (
sqlStatement['0'] = {
currentUploadType: AuditTaskResV1SqlSourceEnum.sql_file,
sql_file: res ? [new File([res], fileName)] : undefined,
- exec_mode: defaultTask.exec_mode
+ exec_mode: defaultTask.exec_mode,
+ backup: defaultTask.enable_backup
} as SqlStatementFields;
});
} else if (isZipFileUploadType) {
@@ -112,7 +114,8 @@ const useCloneExecWorkflowInfo = (
currentUploadType: AuditTaskResV1SqlSourceEnum.zip_file,
zip_file: res ? [new File([res], fileName)] : undefined,
exec_mode: defaultTask.exec_mode,
- file_sort_method: defaultTask.file_order_method
+ file_sort_method: defaultTask.file_order_method,
+ backup: defaultTask.enable_backup
} as SqlStatementFields;
});
}
@@ -131,7 +134,8 @@ const useCloneExecWorkflowInfo = (
return getTaskAllSql(taskInfo.task_id).then((res) => {
return {
currentUploadType: AuditTaskResV1SqlSourceEnum.form_data,
- form_data: res
+ form_data: res,
+ backup: taskInfo.enable_backup
} as SqlStatementFields;
});
} else if (isSqlFileUploadType) {
@@ -139,7 +143,8 @@ const useCloneExecWorkflowInfo = (
return {
currentUploadType: AuditTaskResV1SqlSourceEnum.sql_file,
sql_file: res ? [new File([res], fileName)] : undefined,
- exec_mode: taskInfo.exec_mode
+ exec_mode: taskInfo.exec_mode,
+ backup: taskInfo.enable_backup
} as SqlStatementFields;
});
} else if (isZipFileUploadType) {
@@ -148,7 +153,8 @@ const useCloneExecWorkflowInfo = (
currentUploadType: AuditTaskResV1SqlSourceEnum.zip_file,
zip_file: res ? [new File([res], fileName)] : undefined,
exec_mode: taskInfo.exec_mode,
- file_sort_method: taskInfo.file_order_method
+ file_sort_method: taskInfo.file_order_method,
+ backup: taskInfo.enable_backup
} as SqlStatementFields;
});
}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/index.tsx
index 164e61591..0ceb96c6d 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/index.tsx
@@ -20,6 +20,7 @@ import WorkflowRecordInfo from './components/RecordInfo';
import ModifySqlStatement from './components/ModifySqlStatement';
import useAuditExecResultPanelSetup from './hooks/useAuditExecResultPanelSetup';
import AuditExecResultPanel from './components/AuditExecResultPanel';
+import SqlRollback from './components/SqlRollback';
const SqlWorkflowDetail: React.FC = () => {
const { username } = useCurrentUser();
@@ -29,6 +30,9 @@ const SqlWorkflowDetail: React.FC = () => {
{ setFalse: closeWorkflowSteps, setTrue: showWorkflowSteps }
] = useBoolean(false);
+ const [isAtRollbackStep, { setTrue: startRollback, setFalse: stopRollback }] =
+ useBoolean();
+
const { taskInfos, workflowInfo, refreshWorkflowInfo, initLoading } =
useInitDataWithRequest();
@@ -81,7 +85,7 @@ const SqlWorkflowDetail: React.FC = () => {
{messageContextHolder}
{
workflowStepsVisibility={workflowStepsVisibility}
showWorkflowSteps={showWorkflowSteps}
executeInOtherInstanceAction={executeInOtherInstanceAction}
+ startRollback={startRollback}
+ showModifySqlStatementStep={showModifySqlStatementStep}
/>
}
/>
@@ -166,6 +172,14 @@ const SqlWorkflowDetail: React.FC = () => {
refreshOverviewAction={refreshOverviewAction}
auditExecPanelTabChangeEvent={changeActiveTabKey}
/>
+ {/* #if [ee] */}
+
+ {/* #endif */}
);
};
diff --git a/packages/sqle/src/store/sqlExecWorkflow/index.ts b/packages/sqle/src/store/sqlExecWorkflow/index.ts
index 2627b55ce..3b2510c57 100644
--- a/packages/sqle/src/store/sqlExecWorkflow/index.ts
+++ b/packages/sqle/src/store/sqlExecWorkflow/index.ts
@@ -9,12 +9,14 @@ type SqlExecWorkflowReduxState = {
clonedExecWorkflowSqlAuditInfo: SqlAuditInfoFormFields | null;
clonedExecWorkflowBaseInfo: WorkflowBaseInfoFormFields | null;
versionFirstStageInstances: IVersionStageInstance[] | null;
+ workflowRollbackSqlIds: number[] | null;
};
const initialState: SqlExecWorkflowReduxState = {
clonedExecWorkflowSqlAuditInfo: null,
clonedExecWorkflowBaseInfo: null,
- versionFirstStageInstances: null
+ versionFirstStageInstances: null,
+ workflowRollbackSqlIds: null
};
const sqlExecWorkflow = createSlice({
name: 'sqlExecWorkflow',
@@ -41,13 +43,24 @@ const sqlExecWorkflow = createSlice({
}>
) => {
state.versionFirstStageInstances = versionFirstStageInstances;
+ },
+ updateWorkflowRollbackSqlIds: (
+ state,
+ {
+ payload: { workflowRollbackSqlIds }
+ }: PayloadAction<{
+ workflowRollbackSqlIds: number[] | null;
+ }>
+ ) => {
+ state.workflowRollbackSqlIds = workflowRollbackSqlIds;
}
}
});
export const {
updateClonedExecWorkflowSqlAuditInfo,
updateClonedExecWorkflowBaseInfo,
- updateVersionFirstStageInstances
+ updateVersionFirstStageInstances,
+ updateWorkflowRollbackSqlIds
} = sqlExecWorkflow.actions;
export default sqlExecWorkflow.reducer;
From e805baaaaa687a431ce3b2680b730a3bb13b1f94 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Thu, 21 Nov 2024 13:45:53 +0800
Subject: [PATCH 08/20] [fix]: Code Optimization[skip ci]
---
.../ResultCard/components/ExecStatusTag.tsx | 4 +---
.../components/SqlRollback/TableTransfer.tsx | 4 ++--
.../Detail/components/SqlRollback/columns.tsx | 6 +++---
.../Detail/components/SqlRollback/index.tsx | 15 ++++++---------
.../Detail/components/SqlRollback/index.type.ts | 17 +++++++++--------
5 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag.tsx
index 9a56c52c4..a9cfa663e 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag.tsx
@@ -5,9 +5,7 @@ import { useTranslation } from 'react-i18next';
import { execStatusDictionary } from '../../../../../../../../../hooks/useStaticStatus/index.data';
const execStatusMap: {
- [key in
- | getAuditTaskSQLsV2FilterExecStatusEnum
- | 'execute_rollback']?: BasicTagColor;
+ [key in getAuditTaskSQLsV2FilterExecStatusEnum]?: BasicTagColor;
} = {
[getAuditTaskSQLsV2FilterExecStatusEnum.initialized]: 'default',
[getAuditTaskSQLsV2FilterExecStatusEnum.failed]: 'red',
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
index 8c85d5bbb..0b33f20d9 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
@@ -3,7 +3,7 @@ import { Transfer } from 'antd';
import {
TableTransferProps,
TableRowSelection,
- BackupSqlType
+ ExpandedBackupSqlType
} from './index.type';
const TableTransfer: React.FC = (props) => {
@@ -27,7 +27,7 @@ const TableTransfer: React.FC = (props) => {
}) => {
const isLeftTable = direction === 'left';
const columns = isLeftTable ? leftColumns : rightColumns;
- const rowSelection: TableRowSelection = {
+ const rowSelection: TableRowSelection = {
getCheckboxProps: isLeftTable
? (item) => ({ disabled: item.disabled })
: undefined,
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx
index 098cdf315..c2bc521ee 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx
@@ -4,7 +4,7 @@ import {
PageInfoWithoutIndexAndSize
} from '@actiontech/shared/lib/components/ActiontechTable';
import { SQLRenderer, EditText, BasicTag } from '@actiontech/shared';
-import { BackupSqlType } from './index.type';
+import { ExpandedBackupSqlType } from './index.type';
import { IGetBackupSqlListV1Params } from '@actiontech/shared/lib/api/sqle/service/workflow/index.d';
import ExecStatusTag from '../AuditExecResultPanel/TaskResultList/Common/ResultCard/components/ExecStatusTag';
import { tooltipsCommonProps } from '@actiontech/shared/lib/components/BasicToolTips';
@@ -22,7 +22,7 @@ export type WorkflowRollbackSqlTableFilterParamType =
>;
export const WorkflowRollbackSqlTableColumn: () => ActiontechTableColumn<
- BackupSqlType,
+ ExpandedBackupSqlType,
WorkflowRollbackSqlTableFilterParamType
> = () => {
return [
@@ -86,7 +86,7 @@ export const WorkflowRollbackSqlTableColumn: () => ActiontechTableColumn<
export const WorkflowRollbackSelectedSqlTableColumn: (
onUpdateSqlRemake: (id: string, remake?: string) => void
-) => ActiontechTableColumn = (onUpdateSqlRemake) => {
+) => ActiontechTableColumn = (onUpdateSqlRemake) => {
const baseColumns = WorkflowRollbackSqlTableColumn();
return [
...baseColumns,
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx
index 18750057d..6c803641e 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx
@@ -25,10 +25,9 @@ import {
FilterCustomProps
} from '@actiontech/shared/lib/components/ActiontechTable';
import TableTransfer from './TableTransfer';
-import { BackupSqlType, TableTransferProps } from './index.type';
+import { ExpandedBackupSqlType, TableTransferProps } from './index.type';
import workflow from '@actiontech/shared/lib/api/sqle/service/workflow';
import { useCurrentProject } from '@actiontech/shared/lib/global';
-import { useParams } from 'react-router-dom';
import { SqlExecStatusOptions } from './index.data';
import useInstance from '../../../../../hooks/useInstance';
import { getInstanceTipListV1FunctionalModuleEnum } from '@actiontech/shared/lib/api/sqle/service/instance/index.enum';
@@ -58,11 +57,11 @@ const SqlRollback: React.FC = ({
const [targetKeys, setTargetKeys] = useState([]);
- const [selectedList, setSelectedList] = useState([]);
+ const [selectedList, setSelectedList] = useState([]);
const { pagination, tableChange, updateTableFilterInfo, tableFilterInfo } =
useTableRequestParams<
- BackupSqlType,
+ ExpandedBackupSqlType,
WorkflowRollbackSqlTableFilterParamType
>();
@@ -76,8 +75,6 @@ const SqlRollback: React.FC = ({
const { updateInstanceList, instanceIDOptions, instanceList } = useInstance();
- const urlParams = useParams<{ workflowId: string }>();
-
const { data, loading, mutate } = useRequest(
() => {
return workflow
@@ -86,7 +83,7 @@ const SqlRollback: React.FC = ({
page_index: pagination.page_index.toString(),
page_size: pagination.page_size.toString(),
project_name: projectName,
- workflow_id: urlParams.workflowId ?? ''
+ workflow_id: workflowInfo?.workflow_id ?? ''
})
.then((res) => {
if (res.data.code === ResponseCode.SUCCESS) {
@@ -131,7 +128,7 @@ const SqlRollback: React.FC = ({
total: data?.total ?? 0
});
} else {
- const selected: BackupSqlType[] = [];
+ const selected: ExpandedBackupSqlType[] = [];
const clonedData = cloneDeep(data?.list ?? []);
moveKeys.forEach((key) => {
const dataSource = clonedData.find((i) => {
@@ -174,7 +171,7 @@ const SqlRollback: React.FC = ({
}, [taskInfos, instanceIDOptions, instanceList]);
const filterCustomProps = useMemo(() => {
- return new Map([
+ return new Map([
['instance_name', { options: taskInstanceIdOptions }],
['exec_status', { options: SqlExecStatusOptions }]
]);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts
index 0e7466ad0..48274d1e1 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts
@@ -17,7 +17,7 @@ export type SqlRollbackProps = {
taskInfos?: IAuditTaskResV1[];
};
-export type BackupSqlType = IBackupSqlData & {
+export type ExpandedBackupSqlType = IBackupSqlData & {
id?: string;
disabled?: boolean;
remark?: string;
@@ -25,13 +25,14 @@ export type BackupSqlType = IBackupSqlData & {
export type TableRowSelection = TableProps['rowSelection'];
-export interface TableTransferProps extends TransferProps {
- dataSource: BackupSqlType[];
- leftColumns: TableColumnsType;
- rightColumns: TableColumnsType;
+export interface TableTransferProps
+ extends TransferProps {
+ dataSource: ExpandedBackupSqlType[];
+ leftColumns: TableColumnsType;
+ rightColumns: TableColumnsType;
loading: boolean;
- leftDataSource?: BackupSqlType[];
- rightDataSource?: BackupSqlType[];
+ leftDataSource?: ExpandedBackupSqlType[];
+ rightDataSource?: ExpandedBackupSqlType[];
leftPagination: TablePaginationConfig;
- onTableChange: TableProps['onChange'];
+ onTableChange: TableProps['onChange'];
}
From 3bd16a304d17a5bde2b5663dcb8b673a7a3b1027 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Fri, 22 Nov 2024 15:38:26 +0800
Subject: [PATCH 09/20] [feature](SqlExecWrokflow): Add associated rollback
ticket link
---
.../shared/lib/api/sqle/service/common.d.ts | 12 ++++-
.../sqle/src/locale/zh-CN/execWorkflow.ts | 3 +-
.../components/SqlBackupSwitcher.tsx | 4 +-
.../components/SwitchField.tsx | 4 +-
.../components/index.type.ts | 3 +-
.../SqlStatementFormItem/index.tsx | 1 +
.../Common/ResultCard/SqlMode.tsx | 12 ++++-
.../components/RollbackWorkflowEntry.tsx | 50 +++++++++++++++++++
.../Common/ResultCard/components/style.ts | 7 +++
.../Common/ResultCard/index.type.ts | 7 ++-
.../components/ModifySqlStatement/index.tsx | 6 ++-
.../hooks/useWorkflowDetailAction.tsx | 22 +++++---
12 files changed, 115 insertions(+), 16 deletions(-)
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/RollbackWorkflowEntry.tsx
diff --git a/packages/shared/lib/api/sqle/service/common.d.ts b/packages/shared/lib/api/sqle/service/common.d.ts
index 41d85a881..23629e969 100644
--- a/packages/shared/lib/api/sqle/service/common.d.ts
+++ b/packages/shared/lib/api/sqle/service/common.d.ts
@@ -3531,6 +3531,12 @@ export interface IUpdatePipelineNode {
type?: updatePipelineNodeTypeEnum;
}
+export interface IAssociatedRollbackWorkflow {
+ workflow_id?: string;
+
+ workflow_name?: string;
+}
+
export interface IAssociatedStageWorkflows {
sql_version_stage_id?: number;
@@ -3646,7 +3652,7 @@ export interface IAuditSQLResV2 {
}
export interface IAuditTaskSQLResV2 {
- associate_workflow_ids?: string[];
+ associated_rollback_workflows?: IAssociatedRollbackWorkflow[];
audit_level?: string;
@@ -3670,7 +3676,7 @@ export interface IAuditTaskSQLResV2 {
number?: number;
- rollback_sql?: string;
+ rollback_sqls?: string[];
sql_source_file?: string;
@@ -3974,6 +3980,8 @@ export interface IWorkflowRecordResV2 {
}
export interface IWorkflowResV2 {
+ associated_rollback_workflows?: IAssociatedRollbackWorkflow[];
+
associated_stage_workflows?: IAssociatedStageWorkflows[];
create_time?: string;
diff --git a/packages/sqle/src/locale/zh-CN/execWorkflow.ts b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
index 1dc5ae319..ad60c0bd9 100644
--- a/packages/sqle/src/locale/zh-CN/execWorkflow.ts
+++ b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
@@ -267,7 +267,8 @@ export default {
remark: '备注',
addRemark: '添加备注',
originSql: '原始SQL'
- }
+ },
+ associatedRollbackWorkflow: '关联回滚工单'
},
audit: {
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
index 42096207a..665800539 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
@@ -15,7 +15,8 @@ import SwitchField from './SwitchField';
const SqlBackupSwitcher: React.FC = ({
fieldPrefixPath,
databaseInfo,
- isSameSqlForAll
+ isSameSqlForAll,
+ isAtRejectStep
}) => {
const { t } = useTranslation();
@@ -73,6 +74,7 @@ const SqlBackupSwitcher: React.FC = ({
)
: t('execWorkflow.create.form.sqlInfo.cancelSwitchSqlBackupTips')
}
+ disabled={isAtRejectStep}
/>
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
index bbb92923e..a02d6aafe 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SwitchField.tsx
@@ -7,7 +7,8 @@ import { SwitcherFieldProps } from './index.type';
const SwitchField: React.FC = ({
checked,
onChange,
- title
+ title,
+ disabled = false
}) => {
const { t } = useTranslation();
@@ -29,6 +30,7 @@ const SwitchField: React.FC = ({
onCancel={hidePopconfirm}
>
{
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
index fd5726e33..70edef2d4 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts
@@ -25,11 +25,12 @@ export type SqlFormatterAndSubmitterProps = {
export type SqlBackupSwitcherProps = Pick<
SqlStatementFormItemProps,
- 'fieldPrefixPath' | 'databaseInfo' | 'isSameSqlForAll'
+ 'fieldPrefixPath' | 'databaseInfo' | 'isSameSqlForAll' | 'isAtRejectStep'
>;
export type SwitcherFieldProps = {
checked?: boolean;
onChange?: (v: boolean) => void;
title?: string;
+ disabled?: boolean;
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
index 58b471eb3..d9b952ac5 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
@@ -89,6 +89,7 @@ const SqlStatementFormItem: React.FC = ({
fieldPrefixPath={fieldPrefixPath}
databaseInfo={databaseInfo}
isSameSqlForAll={isSameSqlForAll}
+ isAtRejectStep={isAtRejectStep}
/>
{/* #endif */}
= ({
projectID,
@@ -99,6 +100,13 @@ const SqlMode: React.FC = ({
+ {/* #if [ee] */}
+
+
+
+ {/* #endif */}
{t('execWorkflow.audit.copyExecSql')}
@@ -125,12 +133,14 @@ const SqlMode: React.FC = ({
label: t('execWorkflow.audit.table.rollback'),
children: (
+ {/* #if [ee] */}
{props.backup_strategy_tip}
+ {/* #endif */}
{/* #if [ee] */}
= ({
/>
{/* #endif */}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/RollbackWorkflowEntry.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/RollbackWorkflowEntry.tsx
new file mode 100644
index 000000000..32978d239
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/RollbackWorkflowEntry.tsx
@@ -0,0 +1,50 @@
+import { RollbackWorkflowEntryProps } from '../index.type';
+import { Dropdown, MenuProps } from 'antd';
+import { BasicButton, TypedLink } from '@actiontech/shared';
+import { DownOutlined } from '@actiontech/icons';
+import { useMemo } from 'react';
+import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths';
+import { useCurrentProject } from '@actiontech/shared/lib/global';
+import { useTranslation } from 'react-i18next';
+import { RollbackWorkflowItemStyleWrapper } from './style';
+
+const RollbackWorkflowEntry: React.FC = ({
+ workflows
+}) => {
+ const { t } = useTranslation();
+
+ const { projectID } = useCurrentProject();
+
+ const menuItems: MenuProps['items'] = useMemo(() => {
+ return (
+ workflows?.map((item) => {
+ return {
+ key: item.workflow_id,
+ label: (
+
+
+ {item.workflow_name}
+
+
+ ),
+ type: 'group'
+ };
+ }) ?? []
+ );
+ }, [workflows, projectID]);
+
+ return (
+
+
+ {t('execWorkflow.detail.associatedRollbackWorkflow')}
+
+
+
+ );
+};
+
+export default RollbackWorkflowEntry;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/style.ts
index d5688c18f..c21548150 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/style.ts
@@ -58,3 +58,10 @@ export const TaskResultDescribeStyleWrapper = styled('div')`
font-size: 13px;
}
`;
+
+export const RollbackWorkflowItemStyleWrapper = styled('div')`
+ max-width: 300px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.type.ts
index a1bd3e3d9..dde8b2270 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/index.type.ts
@@ -1,6 +1,7 @@
import {
IAuditTaskSQLResV2,
- IAuditFileStatistic
+ IAuditFileStatistic,
+ IAssociatedRollbackWorkflow
} from '@actiontech/shared/lib/api/sqle/service/common';
import { WorkflowResV2ExecModeEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
@@ -27,3 +28,7 @@ export type ResultCardProps =
| (FileExecuteResultCardProps & {
executeMode: WorkflowResV2ExecModeEnum.sql_file;
});
+
+export type RollbackWorkflowEntryProps = {
+ workflows?: IAssociatedRollbackWorkflow[];
+};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/index.tsx
index 514e65cc5..269e5466c 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/index.tsx
@@ -193,7 +193,8 @@ const ModifySqlStatement: React.FC = ({
form.setFieldValue(SAME_SQL_MODE_DEFAULT_FIELD_KEY, {
currentUploadType: currentTasks?.[0]?.sql_source,
exec_mode: currentTasks?.[0]?.exec_mode,
- file_sort_method: currentTasks?.[0]?.file_order_method
+ file_sort_method: currentTasks?.[0]?.file_order_method,
+ backup: currentTasks?.[0]?.enable_backup
});
} else {
sqlStatementTabActiveKey.set(
@@ -204,7 +205,8 @@ const ModifySqlStatement: React.FC = ({
form.setFieldValue(item.task_id?.toString() ?? '', {
currentUploadType: item.sql_source,
exec_mode: item.exec_mode,
- file_sort_method: item.file_order_method
+ file_sort_method: item.file_order_method,
+ backup: item.enable_backup
});
});
}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/hooks/useWorkflowDetailAction.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/hooks/useWorkflowDetailAction.tsx
index 61f48d6cc..6a8cb7217 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/hooks/useWorkflowDetailAction.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/hooks/useWorkflowDetailAction.tsx
@@ -271,12 +271,22 @@ const useWorkflowDetailAction = ({
if (!workflowInfo?.record?.status) {
return false;
}
- return [
- WorkflowRecordResV2StatusEnum.finished,
- WorkflowRecordResV2StatusEnum.exec_failed,
- WorkflowRecordResV2StatusEnum.canceled
- ].includes(workflowInfo.record.status);
- }, [workflowInfo?.record?.status]);
+
+ return (
+ [
+ WorkflowRecordResV2StatusEnum.finished,
+ WorkflowRecordResV2StatusEnum.exec_failed,
+ WorkflowRecordResV2StatusEnum.canceled
+ ].includes(workflowInfo.record.status) &&
+ workflowInfo.record.workflow_step_list
+ ?.find((v) => v.type === WorkflowStepResV2TypeEnum.sql_execute)
+ ?.assignee_user_name_list?.includes(username)
+ );
+ }, [
+ workflowInfo?.record?.status,
+ username,
+ workflowInfo?.record?.workflow_step_list
+ ]);
const rollbackWorkflow = () => {
startRollback();
From a8f19664c0a25a5084a80a08b3a62193c5f2c808 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Fri, 22 Nov 2024 15:39:33 +0800
Subject: [PATCH 10/20] [feature](DataSource): Add backup rollback
configuration[skip ci]
---
.../components/AddDataSource/index.tsx | 5 ++-
.../page/DataSource/components/Form/index.tsx | 33 +++++++++++++++++--
.../DataSource/components/Form/index.type.ts | 1 +
.../components/UpdateDataSource/index.tsx | 5 ++-
4 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/packages/base/src/page/DataSource/components/AddDataSource/index.tsx b/packages/base/src/page/DataSource/components/AddDataSource/index.tsx
index 17e92f592..ed4b90ddc 100644
--- a/packages/base/src/page/DataSource/components/AddDataSource/index.tsx
+++ b/packages/base/src/page/DataSource/components/AddDataSource/index.tsx
@@ -61,7 +61,10 @@ const AddDataSource = () => {
// #endif
additional_params: values.asyncParams,
// #if [dms]
- is_enable_masking: values.is_enable_masking
+ is_enable_masking: values.is_enable_masking,
+ // #endif
+ // #if [sqle && ee]
+ enable_backup: values.enableBackup
// #endif
};
return DBService.AddDBService({
diff --git a/packages/base/src/page/DataSource/components/Form/index.tsx b/packages/base/src/page/DataSource/components/Form/index.tsx
index cc9c8df92..58cc9de42 100644
--- a/packages/base/src/page/DataSource/components/Form/index.tsx
+++ b/packages/base/src/page/DataSource/components/Form/index.tsx
@@ -27,7 +27,8 @@ import {
FormItemBigTitle,
FormItemLabel,
FormItemNoLabel,
- FormItemSubTitle
+ FormItemSubTitle,
+ CustomLabelContent
} from '@actiontech/shared/lib/components/FormCom';
import { nameRule } from '@actiontech/shared/lib/utils/FormRule';
import DatabaseFormItem from './FormItem';
@@ -193,7 +194,10 @@ const DataSourceForm: React.FC = (props) => {
business: props.defaultData.business,
password: props.defaultData.password,
// #if [dms]
- is_enable_masking: props.defaultData.is_enable_masking
+ is_enable_masking: props.defaultData.is_enable_masking,
+ // #endif
+ // #if [sqle && ee]
+ enableBackup: props.defaultData.enable_backup
// #endif
});
setDatabaseType(props.defaultData.db_type ?? '');
@@ -481,6 +485,31 @@ const DataSourceForm: React.FC = (props) => {
{/* #endif */}
+ {/* #if [sqle && ee] */}
+
+
+
+ {t('dmsDataSource.dataSourceForm.sqlBackupConfiguration')}
+
+
+ }
+ name="enableBackup"
+ valuePropName="checked"
+ >
+
+
+
+
+ {/* #endif */}
+
{/* #if [dms] */}
diff --git a/packages/base/src/page/DataSource/components/Form/index.type.ts b/packages/base/src/page/DataSource/components/Form/index.type.ts
index 873b298c1..a93ddeeed 100644
--- a/packages/base/src/page/DataSource/components/Form/index.type.ts
+++ b/packages/base/src/page/DataSource/components/Form/index.type.ts
@@ -27,6 +27,7 @@ export type DataSourceFormField = {
asyncParams?: BackendFormRequestParams[];
needUpdatePassword?: boolean;
is_enable_masking?: boolean;
+ enableBackup?: boolean;
};
export type IDataSourceFormProps = {
diff --git a/packages/base/src/page/DataSource/components/UpdateDataSource/index.tsx b/packages/base/src/page/DataSource/components/UpdateDataSource/index.tsx
index ba4147a81..7460602b0 100644
--- a/packages/base/src/page/DataSource/components/UpdateDataSource/index.tsx
+++ b/packages/base/src/page/DataSource/components/UpdateDataSource/index.tsx
@@ -75,7 +75,10 @@ const UpdateDataSource = () => {
additional_params: values.asyncParams,
user: values.user,
// #if [dms]
- is_enable_masking: values.is_enable_masking
+ is_enable_masking: values.is_enable_masking,
+ // #endif
+ // #if [sqle && ee]
+ enable_backup: values.enableBackup
// #endif
},
project_uid: projectID
From 2e3ae576ae5681d238101c34b5af9163bea32030 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Fri, 22 Nov 2024 17:38:55 +0800
Subject: [PATCH 11/20] [feature](SqlExecWorkflow): Add associated workflow
information[skip ci]
---
.../shared/lib/api/sqle/service/common.d.ts | 3 +
.../lib/api/sqle/service/common.enum.ts | 24 +++++--
.../sqle/src/locale/zh-CN/execWorkflow.ts | 3 +-
.../AuditResultList/Table/index.data.ts | 6 +-
.../AssociatedRollbackWorkflows.tsx | 63 +++++++++++++++++++
.../components/AssociatedWorkflows.tsx | 39 +++++++-----
.../Detail/components/RecordInfo/index.tsx | 7 +++
.../components/RecordInfo/index.type.ts | 13 ++++
.../components/SqlRollback/TableTransfer.tsx | 1 +
.../Detail/components/SqlRollback/columns.tsx | 1 +
.../Detail/components/SqlRollback/index.tsx | 8 ++-
.../Detail/components/SqlRollback/style.ts | 2 +-
12 files changed, 142 insertions(+), 28 deletions(-)
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedRollbackWorkflows.tsx
diff --git a/packages/shared/lib/api/sqle/service/common.d.ts b/packages/shared/lib/api/sqle/service/common.d.ts
index 23629e969..a58bbad74 100644
--- a/packages/shared/lib/api/sqle/service/common.d.ts
+++ b/packages/shared/lib/api/sqle/service/common.d.ts
@@ -77,6 +77,7 @@ import {
updatePipelineNodeAuditMethodEnum,
updatePipelineNodeObjectTypeEnum,
updatePipelineNodeTypeEnum,
+ AssociatedRollbackWorkflowStatusEnum,
AssociatedStageWorkflowsStatusEnum,
AuditResDataV2AuditLevelEnum,
AuditTaskSQLResV2BackupStrategyEnum,
@@ -3532,6 +3533,8 @@ export interface IUpdatePipelineNode {
}
export interface IAssociatedRollbackWorkflow {
+ status?: AssociatedRollbackWorkflowStatusEnum;
+
workflow_id?: string;
workflow_name?: string;
diff --git a/packages/shared/lib/api/sqle/service/common.enum.ts b/packages/shared/lib/api/sqle/service/common.enum.ts
index f7bb0f8b4..621e8749d 100644
--- a/packages/shared/lib/api/sqle/service/common.enum.ts
+++ b/packages/shared/lib/api/sqle/service/common.enum.ts
@@ -111,7 +111,7 @@ export enum BackupSqlDataBackupStrategyEnum {
'reverse_sql' = 'reverse_sql',
- 'origin_row' = 'origin_row'
+ 'original_row' = 'original_row'
}
export enum BatchUpdateSqlManageReqPriorityEnum {
@@ -499,7 +499,7 @@ export enum UpdateSqlBackupStrategyReqStrategyEnum {
'reverse_sql' = 'reverse_sql',
- 'origin_row' = 'origin_row'
+ 'original_row' = 'original_row'
}
export enum UpdateTaskBackupStrategyReqStrategyEnum {
@@ -509,7 +509,7 @@ export enum UpdateTaskBackupStrategyReqStrategyEnum {
'reverse_sql' = 'reverse_sql',
- 'origin_row' = 'origin_row'
+ 'original_row' = 'original_row'
}
export enum UpdateWorkflowTemplateReqV1AllowSubmitWhenLessAuditLevelEnum {
@@ -678,6 +678,22 @@ export enum updatePipelineNodeTypeEnum {
'release' = 'release'
}
+export enum AssociatedRollbackWorkflowStatusEnum {
+ 'wait_for_audit' = 'wait_for_audit',
+
+ 'wait_for_execution' = 'wait_for_execution',
+
+ 'rejected' = 'rejected',
+
+ 'canceled' = 'canceled',
+
+ 'exec_failed' = 'exec_failed',
+
+ 'executing' = 'executing',
+
+ 'finished' = 'finished'
+}
+
export enum AssociatedStageWorkflowsStatusEnum {
'wait_for_audit' = 'wait_for_audit',
@@ -713,7 +729,7 @@ export enum AuditTaskSQLResV2BackupStrategyEnum {
'reverse_sql' = 'reverse_sql',
- 'origin_row' = 'origin_row'
+ 'original_row' = 'original_row'
}
export enum DirectAuditFileReqV2SqlTypeEnum {
diff --git a/packages/sqle/src/locale/zh-CN/execWorkflow.ts b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
index ad60c0bd9..c40dbeb3e 100644
--- a/packages/sqle/src/locale/zh-CN/execWorkflow.ts
+++ b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
@@ -230,7 +230,8 @@ export default {
'工单关闭后将无法再对工单执行任何操作,是否确认关闭当前工单?',
closeWorkflowSuccessTips: '工单关闭成功',
cloneExecWorkflow: '上线到其他实例',
- associatedWorkflowInfo: '关联工单信息'
+ associatedWorkflowInfo: '关联工单信息',
+ associatedRollbackWorkflowInfo: '关联回滚工单信息'
},
paginationDisplay: '分页展示',
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.data.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.data.ts
index 295da5c76..6dce8f958 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.data.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/index.data.ts
@@ -7,7 +7,7 @@ export const BackupStrategyDictionary: {
[UpdateSqlBackupStrategyReqStrategyEnum.reverse_sql]: t(
'execWorkflow.create.backupStrategy.reverseSql'
),
- [UpdateSqlBackupStrategyReqStrategyEnum.origin_row]: t(
+ [UpdateSqlBackupStrategyReqStrategyEnum.original_row]: t(
'execWorkflow.create.backupStrategy.originRow'
),
[UpdateSqlBackupStrategyReqStrategyEnum.manual]: t(
@@ -32,9 +32,9 @@ export const BackupStrategyOptions: Array<{
{
label:
BackupStrategyDictionary[
- UpdateSqlBackupStrategyReqStrategyEnum.origin_row
+ UpdateSqlBackupStrategyReqStrategyEnum.original_row
],
- value: UpdateSqlBackupStrategyReqStrategyEnum.origin_row
+ value: UpdateSqlBackupStrategyReqStrategyEnum.original_row
},
{
label:
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedRollbackWorkflows.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedRollbackWorkflows.tsx
new file mode 100644
index 000000000..2a3ba18b8
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedRollbackWorkflows.tsx
@@ -0,0 +1,63 @@
+import { Timeline, TimelineProps, Space, Typography } from 'antd';
+import { useMemo } from 'react';
+import WorkflowStatus from '../../../../List/components/WorkflowStatus';
+import { WorkflowDetailResV1StatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+import { useCurrentProject } from '@actiontech/shared/lib/global';
+import { useTranslation } from 'react-i18next';
+import { TypedLink } from '@actiontech/shared';
+import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths';
+import { AssociatedRollbackWorkflowsProps } from '../index.type';
+
+const AssociatedRollbackWorkflows: React.FC<
+ AssociatedRollbackWorkflowsProps
+> = ({ associatedWorkflows }) => {
+ const { t } = useTranslation();
+
+ const { projectID } = useCurrentProject();
+
+ const timelineItems: TimelineProps['items'] = useMemo(() => {
+ return associatedWorkflows?.map((workflow) => {
+ return {
+ color: 'gray',
+ children: (
+
+
+
+ {workflow.workflow_name}
+
+
+
+
+
+ {t('execWorkflow.list.status')}
+
+
+
+
+ )
+ };
+ });
+ }, [associatedWorkflows, t, projectID]);
+
+ return (
+
+
+ {t('execWorkflow.detail.operator.associatedRollbackWorkflowInfo')}
+
+
+
+ );
+};
+
+export default AssociatedRollbackWorkflows;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedWorkflows.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedWorkflows.tsx
index 1828aacb4..c0bceeedf 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedWorkflows.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedWorkflows.tsx
@@ -1,5 +1,4 @@
-import { Timeline, TimelineProps, Space } from 'antd';
-import { IAssociatedStageWorkflows } from '@actiontech/shared/lib/api/sqle/service/common.d';
+import { Timeline, TimelineProps, Space, Typography } from 'antd';
import { useMemo } from 'react';
import WorkflowStatus from '../../../../List/components/WorkflowStatus';
import { WorkflowDetailResV1StatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
@@ -9,11 +8,12 @@ import { useTranslation } from 'react-i18next';
import { EnvironmentFilled } from '@actiontech/icons';
import { TypedLink } from '@actiontech/shared';
import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths';
+import { AssociatedVersionStageWorkflowsProps } from '../index.type';
-const AssociatedWorkflows: React.FC<{
- associatedWorkflows?: IAssociatedStageWorkflows[];
- workflowId?: string;
-}> = ({ workflowId, associatedWorkflows }) => {
+const AssociatedWorkflows: React.FC = ({
+ workflowId,
+ associatedWorkflows
+}) => {
const { t } = useTranslation();
const { projectID } = useCurrentProject();
@@ -35,17 +35,22 @@ const AssociatedWorkflows: React.FC<{
'associated-workflows-wrap-item-highlight': isCurrentWorkflow
})}
>
- {isCurrentWorkflow ? (
- workflow.workflow_name
- ) : (
-
- {workflow.workflow_name}
-
- )}
+
+ {isCurrentWorkflow ? (
+ workflow.workflow_name
+ ) : (
+
+ {workflow.workflow_name}
+
+ )}
+
{t('execWorkflow.list.status')}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.tsx
index eeb912de9..5fb5f0ddc 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.tsx
@@ -8,6 +8,7 @@ import { EmptyBox, LazyLoadComponent } from '@actiontech/shared';
import WorkflowHistorySteps from './components/WorkflowHistorySteps';
import { CloseOutlined } from '@actiontech/icons';
import AssociatedWorkflows from './components/AssociatedWorkflows';
+import AssociatedRollbackWorkflows from './components/AssociatedRollbackWorkflows';
const WorkflowRecordInfo: React.FC = ({
visibility,
@@ -52,6 +53,12 @@ const WorkflowRecordInfo: React.FC = ({
/>
+
+
+
+
void;
@@ -29,3 +33,12 @@ export type WorkflowStepsProps = {
export type WorkflowHistoryStepsProps = {
recordHistoryList?: IWorkflowRecordResV2[];
};
+
+export type AssociatedVersionStageWorkflowsProps = {
+ associatedWorkflows?: IAssociatedStageWorkflows[];
+ workflowId?: string;
+};
+
+export type AssociatedRollbackWorkflowsProps = {
+ associatedWorkflows?: IAssociatedRollbackWorkflow[];
+};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
index 0b33f20d9..4e0dee680 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
@@ -57,6 +57,7 @@ const TableTransfer: React.FC = (props) => {
pagination={isLeftTable ? leftPagination : undefined}
onChange={isLeftTable ? onTableChange : undefined}
scroll={{ y: '700px' }}
+ className={isLeftTable ? 'left-table' : 'right-table'}
/>
);
}}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx
index c2bc521ee..3c0eefbc5 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/columns.tsx
@@ -94,6 +94,7 @@ export const WorkflowRollbackSelectedSqlTableColumn: (
dataIndex: 'remark',
title: t('execWorkflow.detail.rollback.remark'),
width: 150,
+ className: 'rollback-remark-column',
render: (remark, record) => {
return (
= ({
setSelectedList(clonedSelectedList);
};
+ const removeMultilineComments = (sql: string) => {
+ return sql.replace(/\/\*/g, '--').replace(/\*\//g, '');
+ };
+
const onCreateWorkflow = () => {
const sqlStatement: { [key: string]: SqlStatementFields } = {};
let description = '';
@@ -210,9 +214,9 @@ const SqlRollback: React.FC = ({
);
sortedBackupSqlList.forEach((item) => {
let backupSqlStatement = '';
- backupSqlStatement += `-- ${t(
+ backupSqlStatement += `/*${t(
'execWorkflow.detail.rollback.originSql'
- )}: ${item.origin_sql} \n`;
+ )}: ${removeMultilineComments(item.origin_sql ?? '')}*/ \n`;
item.backup_sqls?.forEach((i) => (backupSqlStatement += `${i}\n`));
sqlFormData += backupSqlStatement;
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts
index 8e96185a3..38fee39f4 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts
@@ -28,7 +28,7 @@ export const SqlRollbackTableStyleWrapper = styled('section')`
}
& .ant-table-wrapper {
- padding-bottom: 0px;
+ padding-bottom: 0;
}
& .ant-table-container .ant-table-body {
From caec7d3794ef92d84b05c011d6069103e014094d Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Fri, 22 Nov 2024 18:41:48 +0800
Subject: [PATCH 12/20] [test](SqlExecWorkflow): Update unit testing[skip ci]
---
.../__tests__/AuditResultDrawer.test.tsx | 2 +-
.../__snapshots__/index.test.tsx.snap | 1206 ++++
.../Table/__tests__/index.test.tsx | 83 +
.../__snapshots__/index.ce.test.tsx.snap | 414 ++
.../__snapshots__/index.test.tsx.snap | 512 +-
.../__tests__/index.ce.test.tsx | 72 +
.../AuditResultList/__tests__/index.test.tsx | 57 +-
.../__snapshots__/index.ce.test.tsx.snap | 118 +
.../__snapshots__/index.test.tsx.snap | 184 +
.../__tests__/index.ce.test.tsx | 39 +
.../DownloadRecord/__tests__/index.test.tsx | 31 +
.../__tests__/SqlBackupSwitcher.test.tsx | 110 +
.../SqlBackupSwitcher.test.tsx.snap | 298 +
.../__snapshots__/index.test.tsx.snap | 124 +
.../__tests__/index.test.tsx | 9 +
.../__snapshots__/index.test.tsx.snap | 186 +
.../__snapshots__/index.test.tsx.snap | 5250 ++++++++++++++++-
.../Create/__tests__/index.test.tsx | 113 +-
.../__snapshots__/index.ce.test.tsx.snap | 504 ++
.../__snapshots__/index.test.tsx.snap | 1425 ++++-
.../__tests__/index.ce.test.tsx | 74 +
.../AuditResultStep/__tests__/index.test.tsx | 48 +-
.../BaseInfoForm/__tests__/index.test.tsx | 8 +-
.../useRenderDatabaseSelectionItems.test.tsx | 72 +-
.../FormStep/__tests__/index.test.tsx | 4 +-
.../hooks/__tests__/useAuditWorkflow.test.ts | 12 +-
.../__snapshots__/index.test.tsx.snap | 88 +
.../Detail/__tests__/index.test.tsx | 4 +
.../ResultCard/__tests__/SqlMode.ce.test.tsx | 68 +
.../ResultCard/__tests__/SqlMode.test.tsx | 64 +-
.../__snapshots__/FileMode.test.tsx.snap | 8 +-
.../__snapshots__/SqlMode.ce.test.tsx.snap | 414 ++
.../__snapshots__/SqlMode.test.tsx.snap | 4243 ++++++++-----
.../__tests__/RollbackWorkflowEntry.test.tsx | 41 +
.../RollbackWorkflowEntry.test.tsx.snap | 55 +
.../__snapshots__/index.test.tsx.snap | 12 +-
.../__snapshots__/index.test.tsx.snap | 332 +-
.../__snapshots__/index.test.tsx.snap | 10 +
.../__snapshots__/index.test.tsx.snap | 12 +-
.../__snapshots__/index.test.tsx.snap | 664 +--
.../SqlExecuteMode/__tests__/index.test.tsx | 2 +-
.../__snapshots__/index.test.tsx.snap | 679 ++-
.../__snapshots__/index.test.tsx.snap | 276 +-
.../__tests__/index.test.tsx | 3 +-
.../__snapshots__/index.ce.test.tsx.snap | 130 +
.../__snapshots__/index.test.tsx.snap | 90 +
.../__test__/index.ce.test.tsx | 71 +
.../PageHeaderExtra/__test__/index.test.tsx | 43 +
.../__test__/useWorkflowDetailAction.test.ts | 4 +
.../AssociatedRollbackWorkflows.test.tsx | 31 +
.../AssociatedRollbackWorkflows.test.tsx.snap | 204 +
.../AssociatedWorkflows.test.tsx.snap | 37 +-
.../__snapshots__/index.test.tsx.snap | 216 +-
.../RecordInfo/__tests__/index.test.tsx | 2 +-
.../__snapshots__/index.test.tsx.snap | 2286 +++++++
.../SqlRollback/__tests__/index.test.tsx | 222 +
.../useCloneExecWorkflowInfo.test.ts | 25 +-
.../src/store/sqlExecWorkflow/index.test.ts | 9 +-
.../testUtils/mockApi/execWorkflow/data.ts | 80 +-
.../testUtils/mockApi/execWorkflow/index.ts | 40 +-
.../sqle/src/testUtils/mockApi/task/data.ts | 12 +-
61 files changed, 19059 insertions(+), 2373 deletions(-)
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/__snapshots__/index.ce.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/index.ce.test.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/__snapshots__/index.ce.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/index.ce.test.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlBackupSwitcher.test.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/SqlBackupSwitcher.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/__snapshots__/index.ce.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/index.ce.test.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.ce.test.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.ce.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/__tests__/RollbackWorkflowEntry.test.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/components/__tests__/__snapshots__/RollbackWorkflowEntry.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/__test__/__snapshots__/index.ce.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/__test__/index.ce.test.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/__tests__/AssociatedRollbackWorkflows.test.tsx
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/__tests__/__snapshots__/AssociatedRollbackWorkflows.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/__tests__/__snapshots__/index.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/__tests__/index.test.tsx
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/AuditResultDrawer.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/AuditResultDrawer.test.tsx
index e3b5001d8..6bdc25d41 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/AuditResultDrawer.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/AuditResultDrawer.test.tsx
@@ -62,7 +62,7 @@ describe('sqle/ExecWorkflow/Common/AuditResultList/AuditResultDrawer', () => {
exec_sql: 'exec sql',
exec_status: '',
number: 30,
- rollback_sql: 'rollback sql',
+ rollback_sqls: ['rollback sql'],
sql_source_file: 'sql file'
}
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/__snapshots__/index.test.tsx.snap
index 665a39661..537e2b720 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/__snapshots__/index.test.tsx.snap
@@ -1,5 +1,1211 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`sqle/ExecWorkflow/Common/AuditResultList/List render allowSwitchBackupPolicy is true 1`] = `
+
+
+
+
+`;
+
+exports[`sqle/ExecWorkflow/Common/AuditResultList/List render allowSwitchBackupPolicy is true 2`] = `
+
+
+
+
+
+`;
+
exports[`sqle/ExecWorkflow/Common/AuditResultList/List render snap when add note 1`] = `
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/index.test.tsx
index 9908e9026..a529df173 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/Table/__tests__/index.test.tsx
@@ -14,6 +14,9 @@ import execWorkflow from '../../../../../../testUtils/mockApi/execWorkflow';
import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
import { useDispatch, useSelector } from 'react-redux';
import { ModalName } from '../../../../../../data/ModalName';
+import { AuditTaskSQLResV2BackupStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+import EventEmitter from '../../../../../../utils/EventEmitter';
+import EmitterKey from '../../../../../../data/EmitterKey';
jest.mock('react-redux', () => {
return {
@@ -26,6 +29,7 @@ jest.mock('react-redux', () => {
describe('sqle/ExecWorkflow/Common/AuditResultList/List', () => {
let requestUpdateAuditTaskSQLs: jest.SpyInstance;
let requestGetAuditTaskSQLs: jest.SpyInstance;
+ let updateSqlBackupStrategySpy: jest.SpyInstance;
const dispatchSpy = jest.fn();
const customRender = (params: AuditResultTableProps) => {
@@ -37,6 +41,7 @@ describe('sqle/ExecWorkflow/Common/AuditResultList/List', () => {
jest.useFakeTimers();
requestUpdateAuditTaskSQLs = execWorkflow.updateAuditTaskSQLs();
requestGetAuditTaskSQLs = execWorkflow.getAuditTaskSQLs();
+ updateSqlBackupStrategySpy = execWorkflow.updateSqlBackupStrategy();
execWorkflow.mockAllApi();
rule_template.getRuleList();
(useSelector as jest.Mock).mockImplementation((e) =>
@@ -287,4 +292,82 @@ describe('sqle/ExecWorkflow/Common/AuditResultList/List', () => {
type: 'whitelist/updateSelectWhitelist'
});
});
+
+ it('render allowSwitchBackupPolicy is true', async () => {
+ requestGetAuditTaskSQLs.mockClear();
+ requestGetAuditTaskSQLs.mockImplementation(() =>
+ createSpySuccessResponse({
+ data: [
+ {
+ number: 1,
+ exec_sql: 'SELECT * ',
+ sql_source_file: '',
+ audit_level: '',
+ audit_status: 'finished',
+ exec_result: '',
+ exec_status: 'initialized',
+ description: '',
+ audit_result: [
+ {
+ level: 'error',
+ message: '除了自增列及大字段列之外,每个列都必须添加默认值',
+ rule_name: 'ddl_check_column_without_default',
+ db_type: ''
+ }
+ ],
+ backup_strategy: AuditTaskSQLResV2BackupStrategyEnum.reverse_sql,
+ exec_sql_id: 1
+ }
+ ]
+ })
+ );
+ const { baseElement } = customRender({
+ noDuplicate: true,
+ taskID: 'taskID',
+ projectID: 'projectID',
+ auditLevelFilterValue: getAuditTaskSQLsV2FilterAuditLevelEnum.normal,
+ allowSwitchBackupPolicy: true
+ });
+
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(baseElement).toMatchSnapshot();
+ expect(screen.getByText('备份回滚策略')).toBeInTheDocument();
+ fireEvent.click(getBySelector('.backup-policy-editor'));
+ await act(async () => jest.advanceTimersByTime(0));
+ expect(screen.getByText('切换SQL备份回滚策略')).toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ fireEvent.mouseDown(getBySelector('#strategy'));
+ await act(async () => jest.advanceTimersByTime(0));
+ fireEvent.click(screen.getByText('基于行级备份回滚'));
+ await act(async () => jest.advanceTimersByTime(0));
+ fireEvent.click(screen.getByText('确 认'));
+ await act(async () => jest.advanceTimersByTime(0));
+ expect(updateSqlBackupStrategySpy).toHaveBeenCalledTimes(1);
+ expect(updateSqlBackupStrategySpy).toHaveBeenCalledWith({
+ task_id: 'taskID',
+ sql_id: '1',
+ strategy: 'original_row'
+ });
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(screen.getByText('切换SQL备份回滚策略成功')).toBeInTheDocument();
+ expect(requestGetAuditTaskSQLs).toHaveBeenCalledTimes(3);
+ });
+
+ it('render refresh list when emit Refresh_Sql_Exec_workflow_Audit_Result_List event', async () => {
+ customRender({
+ noDuplicate: true,
+ taskID: 'taskID',
+ projectID: 'projectID',
+ auditLevelFilterValue: getAuditTaskSQLsV2FilterAuditLevelEnum.normal,
+ allowSwitchBackupPolicy: true
+ });
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(requestGetAuditTaskSQLs).toHaveBeenCalledTimes(2);
+
+ await act(async () => {
+ EventEmitter.emit(EmitterKey.Refresh_Sql_Exec_workflow_Audit_Result_List);
+ await jest.advanceTimersByTime(3000);
+ });
+ expect(requestGetAuditTaskSQLs).toHaveBeenCalledTimes(3);
+ });
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/__snapshots__/index.ce.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/__snapshots__/index.ce.test.tsx.snap
new file mode 100644
index 000000000..3b229764b
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/__snapshots__/index.ce.test.tsx.snap
@@ -0,0 +1,414 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/ExecWorkflow/Common/AuditResultList ce render init snap 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+ instance a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ instance a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全部等级
+
+
+ 普通(Normal)
+
+
+ 提示(Notice)
+
+
+ 告警(Warning)
+
+
+ 错误(Error)
+
+
+
+
+
+
+ 1000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 30
+
+
+ 审核结果评分
+
+
+
+
+
+
+ schema a
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/__snapshots__/index.test.tsx.snap
index 3be5fca61..5b90d0218 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/__snapshots__/index.test.tsx.snap
@@ -1,10 +1,498 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`sqle/ExecWorkflow/Common/AuditResultList render allowSwitchBackupPolicy is true 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+ instance a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ instance a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全部等级
+
+
+ 普通(Normal)
+
+
+ 提示(Notice)
+
+
+ 告警(Warning)
+
+
+ 错误(Error)
+
+
+
+
+
+
+ 1000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 30
+
+
+ 审核结果评分
+
+
+
+
+
+
+ schema a
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/ExecWorkflow/Common/AuditResultList render allowSwitchBackupPolicy is true 2`] = `
+
+ 切换数据源备份策略
+
+`;
+
exports[`sqle/ExecWorkflow/Common/AuditResultList render snap 1`] = `
+
+
+
+
{
+ return {
+ ...jest.requireActual('react-redux'),
+ useSelector: jest.fn()
+ };
+});
+
+describe('sqle/ExecWorkflow/Common/AuditResultList ce', () => {
+ const updateTaskRecordCountSpy = jest.fn();
+ let requestGetAuditTaskSQLs: jest.SpyInstance;
+ const customRender = (params: AuditResultListProps) => {
+ return superRender(
+
+ );
+ };
+
+ ignoreConsoleErrors([UtilsConsoleErrorStringsEnum.UNIQUE_KEY_REQUIRED]);
+
+ beforeEach(() => {
+ mockUseCurrentUser();
+ jest.useFakeTimers();
+ execWorkflow.mockAllApi();
+ requestGetAuditTaskSQLs = execWorkflow.getAuditTaskSQLs();
+ mockUseCurrentProject();
+ (useSelector as jest.Mock).mockImplementation((e) =>
+ e({
+ whitelist: { modalStatus: { [ModalName.Add_Whitelist]: false } },
+ permission: {
+ moduleFeatureSupport: { sqlOptimization: false },
+ userOperationPermissions: null
+ }
+ })
+ );
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render init snap', async () => {
+ const { baseElement } = customRender({
+ tasks: mockSqlExecWorkflowTasksData,
+ allowSwitchBackupPolicy: true
+ });
+ expect(baseElement).toMatchSnapshot();
+ expect(requestGetAuditTaskSQLs).toHaveBeenCalledTimes(1);
+ });
+});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/index.test.tsx
index 8f3647f87..6d633f960 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/AuditResultList/__tests__/index.test.tsx
@@ -2,11 +2,6 @@ import AuditResultList from '..';
import { AuditResultListProps } from '../index.type';
import { superRender } from '../../../../../testUtils/customRender';
import { act, cleanup, fireEvent, screen } from '@testing-library/react';
-import {
- AuditTaskResV1AuditLevelEnum,
- AuditTaskResV1SqlSourceEnum,
- AuditTaskResV1StatusEnum
-} from '@actiontech/shared/lib/api/sqle/service/common.enum';
import { IAuditTaskSQLResV2 } from '@actiontech/shared/lib/api/sqle/service/common';
import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi';
import { getAllBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
@@ -19,6 +14,7 @@ import {
import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
import { useSelector } from 'react-redux';
import { ModalName } from '../../../../../data/ModalName';
+import { mockSqlExecWorkflowTasksData } from '../../../../../testUtils/mockApi/execWorkflow/data';
jest.mock('react-redux', () => {
return {
@@ -27,39 +23,10 @@ jest.mock('react-redux', () => {
};
});
-const tasksData = [
- {
- audit_level: AuditTaskResV1AuditLevelEnum.warn,
- exec_end_time: '1970-12-31 00:00:00',
- exec_start_time: '1970-01-01 00:00:00',
- instance_db_type: 'mysql',
- instance_name: 'instance a',
- instance_schema: 'schema a',
- pass_rate: 10,
- score: 30,
- sql_source: AuditTaskResV1SqlSourceEnum.form_data,
- status: AuditTaskResV1StatusEnum.audited,
- task_id: 1
- },
- {
- audit_level: AuditTaskResV1AuditLevelEnum.error,
- exec_end_time: '1970-12-31 00:00:00',
- exec_start_time: '1970-01-01 00:00:00',
- instance_db_type: 'mysql',
- instance_name: 'instance a',
- instance_schema: 'schema a',
- pass_rate: 10,
- score: 30,
- sql_source: AuditTaskResV1SqlSourceEnum.sql_file,
- status: AuditTaskResV1StatusEnum.exec_failed,
- task_id: 2
- }
-];
-
describe('sqle/ExecWorkflow/Common/AuditResultList', () => {
const updateTaskRecordCountSpy = jest.fn();
let requestGetAuditTaskSQLs: jest.SpyInstance;
- const customRender = (params: Pick
) => {
+ const customRender = (params: AuditResultListProps) => {
return superRender(
{
it('render snap has task', async () => {
const { baseElement } = customRender({
- tasks: tasksData
+ tasks: mockSqlExecWorkflowTasksData
});
expect(baseElement).toMatchSnapshot();
await act(async () => jest.advanceTimersByTime(3200));
@@ -133,7 +100,7 @@ describe('sqle/ExecWorkflow/Common/AuditResultList', () => {
})
);
const { baseElement } = customRender({
- tasks: tasksData
+ tasks: mockSqlExecWorkflowTasksData
});
await act(async () => jest.advanceTimersByTime(3200));
expect(requestGetAuditTaskSQLs).toHaveBeenCalledWith({
@@ -189,4 +156,20 @@ describe('sqle/ExecWorkflow/Common/AuditResultList', () => {
task_id: '1'
});
});
+
+ it('render allowSwitchBackupPolicy is true', async () => {
+ const onBatchSwitchBackupPolicySpy = jest.fn();
+ const { baseElement } = customRender({
+ tasks: mockSqlExecWorkflowTasksData,
+ allowSwitchBackupPolicy: true,
+ onBatchSwitchBackupPolicy: onBatchSwitchBackupPolicySpy
+ });
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(screen.getByText('切换数据源备份策略')).toMatchSnapshot();
+
+ fireEvent.click(screen.getByText('切换数据源备份策略'));
+ await act(async () => jest.advanceTimersByTime(0));
+ expect(onBatchSwitchBackupPolicySpy).toHaveBeenCalledTimes(1);
+ });
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/__snapshots__/index.ce.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/__snapshots__/index.ce.test.tsx.snap
new file mode 100644
index 000000000..05feb6215
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/__snapshots__/index.ce.test.tsx.snap
@@ -0,0 +1,118 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/ExecWorkflow/Common/DownloadRecord ce render snap when click down show dropdown 1`] = `
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/__snapshots__/index.test.tsx.snap
index 7674b5cb0..e8a11810b 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/__snapshots__/index.test.tsx.snap
@@ -56,6 +56,139 @@ exports[`sqle/ExecWorkflow/Common/DownloadRecord render snap download btn 1`] =
`;
+exports[`sqle/ExecWorkflow/Common/DownloadRecord render snap when click down backup sql 1`] = `
+
+
+
+
+`;
+
exports[`sqle/ExecWorkflow/Common/DownloadRecord render snap when click down file 1`] = `
@@ -163,6 +296,23 @@ exports[`sqle/ExecWorkflow/Common/DownloadRecord render snap when click down fil
下载SQL语句
+
@@ -279,6 +429,23 @@ exports[`sqle/ExecWorkflow/Common/DownloadRecord render snap when click down rep
下载SQL语句
+
@@ -396,6 +563,23 @@ exports[`sqle/ExecWorkflow/Common/DownloadRecord render snap when click down sho
下载SQL语句
+
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/index.ce.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/index.ce.test.tsx
new file mode 100644
index 000000000..129cd79bc
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/index.ce.test.tsx
@@ -0,0 +1,39 @@
+/**
+ * @test_version ce
+ */
+import DownloadRecord from '..';
+import { superRender } from '../../../../../testUtils/customRender';
+import { DownloadRecordProps } from '../index.type';
+import { fireEvent, act, cleanup, screen } from '@testing-library/react';
+import { mockUseCurrentProject } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentProject';
+
+describe('sqle/ExecWorkflow/Common/DownloadRecord ce', () => {
+ const customRender = (params: DownloadRecordProps) => {
+ return superRender( );
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ mockUseCurrentProject();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render snap when click down show dropdown', async () => {
+ const { baseElement } = customRender({
+ taskId: 'task Id',
+ noDuplicate: true
+ });
+
+ fireEvent.click(screen.getByText('下载'));
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(screen.getByText('下载审核报告')).toBeInTheDocument();
+ expect(screen.getByText('下载SQL语句')).toBeInTheDocument();
+ expect(screen.queryByText('下载回滚语句')).not.toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/index.test.tsx
index c01095e68..8d6cdd408 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/DownloadRecord/__tests__/index.test.tsx
@@ -3,10 +3,13 @@ import { superRender } from '../../../../../testUtils/customRender';
import execWorkflow from '../../../../../testUtils/mockApi/execWorkflow';
import { DownloadRecordProps } from '../index.type';
import { fireEvent, act, cleanup, screen } from '@testing-library/react';
+import { mockUseCurrentProject } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentProject';
+import { mockProjectInfo } from '@actiontech/shared/lib/testUtil/mockHook/data';
describe('sqle/ExecWorkflow/Common/DownloadRecord', () => {
let requestDownloadFile: jest.SpyInstance;
let requestDownloadReport: jest.SpyInstance;
+ let downloadBackupFileSpy: jest.SpyInstance;
const customRender = (params: DownloadRecordProps) => {
return superRender( );
};
@@ -15,6 +18,8 @@ describe('sqle/ExecWorkflow/Common/DownloadRecord', () => {
jest.useFakeTimers();
requestDownloadFile = execWorkflow.downloadAuditTaskSQLFile();
requestDownloadReport = execWorkflow.downloadAuditTaskSQLReport();
+ downloadBackupFileSpy = execWorkflow.downloadBackupFile();
+ mockUseCurrentProject();
});
afterEach(() => {
@@ -42,6 +47,7 @@ describe('sqle/ExecWorkflow/Common/DownloadRecord', () => {
await act(async () => jest.advanceTimersByTime(300));
expect(screen.getByText('下载审核报告')).toBeInTheDocument();
expect(screen.getByText('下载SQL语句')).toBeInTheDocument();
+ expect(screen.getByText('下载回滚语句')).toBeInTheDocument();
expect(baseElement).toMatchSnapshot();
});
@@ -108,4 +114,29 @@ describe('sqle/ExecWorkflow/Common/DownloadRecord', () => {
{ responseType: 'blob' }
);
});
+
+ it('render snap when click down backup sql', async () => {
+ const { baseElement } = customRender({
+ taskId: 'task Id',
+ noDuplicate: true,
+ workflowId: 'workflow id'
+ });
+ fireEvent.click(screen.getByText('下载'));
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(screen.getByText('下载回滚语句')).toBeInTheDocument();
+
+ fireEvent.click(screen.getByText('下载回滚语句'));
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2800));
+ expect(downloadBackupFileSpy).toHaveBeenCalled();
+ expect(downloadBackupFileSpy).toHaveBeenCalledWith(
+ {
+ task_id: 'task Id',
+ project_name: mockProjectInfo.projectName,
+ workflow_id: 'workflow id'
+ },
+ { responseType: 'blob' }
+ );
+ });
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlBackupSwitcher.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlBackupSwitcher.test.tsx
new file mode 100644
index 000000000..41b1c9708
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlBackupSwitcher.test.tsx
@@ -0,0 +1,110 @@
+import SqlBackupSwitcher from '../components/SqlBackupSwitcher';
+import { fireEvent, renderHook, screen, act } from '@testing-library/react';
+import { Form } from 'antd';
+import { SqlBackupSwitcherProps } from '../components/index.type';
+import { superRender } from '../../../../../../testUtils/customRender';
+import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
+
+describe('test SqlBackupSwitcher', () => {
+ beforeEach(() => {
+ jest.useFakeTimers();
+ });
+
+ afterEach(() => {
+ jest.useFakeTimers();
+ });
+
+ const customRender = (
+ databaseInfo: SqlBackupSwitcherProps['databaseInfo'],
+ isSameSqlForAll = false,
+ isAtRejectStep = false
+ ) => {
+ const { result } = renderHook(() => Form.useForm());
+ return superRender(
+
+ );
+ };
+
+ it('render init snap', () => {
+ const { baseElement } = customRender([]);
+ expect(baseElement).toMatchSnapshot();
+ expect(screen.getByText('是否选择开启备份')).toBeInTheDocument();
+ expect(screen.getByRole('switch').getAttribute('aria-checked')).toBe(
+ 'false'
+ );
+ });
+
+ it('render switch when isAtRejectStep is true', () => {
+ const { baseElement } = customRender([], false, true);
+ expect(baseElement).toMatchSnapshot();
+ expect(screen.getByRole('switch')).toHaveAttribute('disabled');
+ });
+
+ it('render default checked when isSameSqlForAll is true', async () => {
+ const { baseElement } = customRender(
+ [
+ {
+ key: '1',
+ instanceName: 'mysql-1',
+ schemaName: 'test',
+ enableBackup: true
+ },
+ {
+ key: '2',
+ instanceName: 'mysql-2',
+ schemaName: 'test2',
+ enableBackup: false
+ }
+ ],
+ true
+ );
+ expect(screen.getByRole('switch').getAttribute('aria-checked')).toBe(
+ 'true'
+ );
+ expect(baseElement).toMatchSnapshot();
+ fireEvent.click(getBySelector('button'));
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(screen.getByText('mysql-1已开启备份需求,是否确认关闭备份?'));
+ fireEvent.click(screen.getByText('确 认'));
+ expect(screen.getByRole('switch').getAttribute('aria-checked')).toBe(
+ 'false'
+ );
+ });
+
+ it('render default checked when isSameSqlForAll is false', async () => {
+ const { baseElement } = customRender([
+ {
+ key: '1',
+ instanceName: 'mysql-1',
+ schemaName: 'test',
+ enableBackup: true
+ },
+ {
+ key: '2',
+ instanceName: 'mysql-2',
+ schemaName: 'test2',
+ enableBackup: false
+ }
+ ]);
+ expect(screen.getByRole('switch').getAttribute('aria-checked')).toBe(
+ 'true'
+ );
+ expect(baseElement).toMatchSnapshot();
+ fireEvent.click(getBySelector('button'));
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(
+ screen.getByText('当前应用的数据源已开启备份需求,是否确认关闭备份?')
+ );
+ fireEvent.click(screen.getByText('确 认'));
+ expect(screen.getByRole('switch').getAttribute('aria-checked')).toBe(
+ 'false'
+ );
+ });
+});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/SqlBackupSwitcher.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/SqlBackupSwitcher.test.tsx.snap
new file mode 100644
index 000000000..bdc0c96ff
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/SqlBackupSwitcher.test.tsx.snap
@@ -0,0 +1,298 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`test SqlBackupSwitcher render default checked when isSameSqlForAll is false 1`] = `
+
+
+
+
+`;
+
+exports[`test SqlBackupSwitcher render default checked when isSameSqlForAll is true 1`] = `
+
+
+
+
+`;
+
+exports[`test SqlBackupSwitcher render init snap 1`] = `
+
+
+
+
+`;
+
+exports[`test SqlBackupSwitcher render switch when isAtRejectStep is true 1`] = `
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.test.tsx.snap
index fe6bf9a36..afb01c350 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.test.tsx.snap
@@ -307,6 +307,68 @@ exports[`test SqlStatementFormItem renders SqlStatementFormItem component 1`] =
+
@@ -1005,6 +1067,68 @@ exports[`test SqlStatementFormItem renders SqlStatementFormItem component 2`] =
+
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx
index bd26d45f8..2f7856e93 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx
@@ -67,4 +67,13 @@ describe('test SqlStatementFormItem', () => {
SQL_EDITOR_PLACEHOLDER_VALUE
);
});
+
+ it('render backup switcher', () => {
+ customRender({});
+ expect(screen.getByText('是否选择开启备份')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('上传SQL文件'));
+ expect(screen.getByText('是否选择开启备份')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('文件模式'));
+ expect(screen.queryByText('是否选择开启备份')).not.toBeInTheDocument();
+ });
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/__snapshots__/index.test.tsx.snap
index 472d14eb5..067956a26 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/__snapshots__/index.test.tsx.snap
@@ -348,6 +348,68 @@ exports[`test SqlStatementFormController matches snapshot with different SQL mod
+
@@ -744,6 +806,68 @@ exports[`test SqlStatementFormController matches snapshot with different SQL mod
+
@@ -1202,6 +1326,68 @@ exports[`test SqlStatementFormController matches snapshot with same SQL mode ena
+
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/__snapshots__/index.test.tsx.snap
index c9221e95e..6f32ad199 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/__snapshots__/index.test.tsx.snap
@@ -1082,6 +1082,68 @@ exports[`sqle/SqlExecWorkflow/Create render associated version when create workf
+
@@ -2554,6 +2616,68 @@ from
+
@@ -4026,6 +4150,68 @@ from
+
@@ -4216,7 +4402,7 @@ from
+
+
@@ -4530,6 +4735,47 @@ from
>
审核结果
+
+
+
+
+
+
+
+
`;
-exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit action for different SQLs 1`] = `
+exports[`sqle/SqlExecWorkflow/Create render create rollback workflow 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mysql-1-test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ workflow-name-Rollback
+
+
+
+
+ test desc
+
+
+
+
+
+
+
+ 全部等级
+
+
+ 普通(Normal)
+
+
+ 提示(Notice)
+
+
+ 告警(Warning)
+
+
+ 错误(Error)
+
+
+
+
+
+
+ 100
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 100
+
+
+ 审核结果评分
+
+
+
+
+
+
+ dms
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/SqlExecWorkflow/Create render create rollback workflow 2`] = `
+
+
+
+
+
+
+
+
+
+
+
+ workflow-name-Rollback
+
+
+
+
+ test desc
+
+
+
+
+
+
+
+ 全部等级
+
+
+ 普通(Normal)
+
+
+ 提示(Notice)
+
+
+ 告警(Warning)
+
+
+ 错误(Error)
+
+
+
+
+
+
+ 100
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 100
+
+
+ 审核结果评分
+
+
+
+
+
+
+ dms
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit action for different SQLs 1`] = `
+
+
+
+
+
+
+
+
+
+ -
+
@@ -8385,7 +12666,69 @@ exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit act
value="select * from user"
width="100%"
/>
-
+
+
+
+
+
+
+
+
+
@@ -8847,6 +13195,47 @@ exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit act
>
审核结果
+
+
+
+
+
+
+
+
+
+ -
+
@@ -10771,6 +15174,68 @@ exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit act
+
@@ -11991,6 +16456,68 @@ exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit act
+
@@ -12182,7 +16709,7 @@ exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit act
+
+
@@ -12447,6 +16979,47 @@ exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit act
>
审核结果
+
+
+
+
+
+
+
+
+
+ -
+
@@ -15233,6 +19820,68 @@ exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit act
+
@@ -16423,6 +21072,68 @@ exports[`sqle/SqlExecWorkflow/Create should reset form fields and snapshot UI af
+
@@ -17607,6 +22318,68 @@ exports[`sqle/SqlExecWorkflow/Create should snapshot UI and perform SQL audit in
+
@@ -19175,6 +23948,68 @@ from
+
@@ -20743,6 +25578,68 @@ from
+
@@ -20933,7 +25830,7 @@ from
+
+
@@ -21247,6 +26163,47 @@ from
>
审核结果
+
+
+
+
+
+
+
+
+
@@ -24710,6 +29738,68 @@ exports[`sqle/SqlExecWorkflow/Create should snapshot render initial workflow cre
+
@@ -25433,6 +30523,68 @@ exports[`sqle/SqlExecWorkflow/Create should snapshot render initial workflow cre
+
@@ -27879,6 +33031,68 @@ exports[`sqle/SqlExecWorkflow/Create should validate "workflow_subject" and prev
+
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx
index 5f0290b11..ad038c349 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx
@@ -53,6 +53,7 @@ describe('sqle/SqlExecWorkflow/Create', () => {
let batchCheckInstanceIsConnectableByName: jest.SpyInstance;
let getSqlFileOrderMethodV1Spy: jest.SpyInstance;
let requestGetWorkflowTemplateSpy: jest.SpyInstance;
+ let createRollbackWorkflowSpy: jest.SpyInstance;
const dispatchSpy = jest.fn();
const customRender = () => {
@@ -85,6 +86,7 @@ describe('sqle/SqlExecWorkflow/Create', () => {
batchCheckInstanceIsConnectableByName =
instance.batchCheckInstanceIsConnectableByName();
requestGetWorkflowTemplateSpy = execWorkflow.getWorkflowTemplate();
+ createRollbackWorkflowSpy = execWorkflow.createRollbackWorkflow();
(useDispatch as jest.Mock).mockImplementation(() => dispatchSpy);
(useSelector as jest.Mock).mockImplementation((e) =>
@@ -132,7 +134,8 @@ describe('sqle/SqlExecWorkflow/Create', () => {
instances_name: instanceTipsMockData[0].instance_name,
instances_id: instanceTipsMockData[0].instance_id
}
- ]
+ ],
+ workflowRollbackSqlIds: [1, 2]
},
permission: {
moduleFeatureSupport: { sqlOptimization: false },
@@ -317,6 +320,9 @@ describe('sqle/SqlExecWorkflow/Create', () => {
value: 'select * from user.list join in all'
}
});
+ await act(async () => jest.advanceTimersByTime(0));
+ fireEvent.click(getBySelector('.backup-switcher'));
+ await act(async () => jest.advanceTimersByTime(0));
fireEvent.click(screen.getByText('SQL美化'));
await act(async () => jest.advanceTimersByTime(3000));
expect(requestInstance).toHaveBeenCalledTimes(2);
@@ -339,6 +345,7 @@ describe('sqle/SqlExecWorkflow/Create', () => {
expect(auditTaskGroupId).toHaveBeenCalledTimes(1);
expect(auditTaskGroupId).toHaveBeenCalledWith({
task_group_id: 99,
+ enable_backup: true,
sql: formatterSQL('select * from user.list join in all', 'MySQL')
});
@@ -398,7 +405,8 @@ describe('sqle/SqlExecWorkflow/Create', () => {
target: { value: 'select * from user' }
});
await act(async () => jest.advanceTimersByTime(0));
-
+ fireEvent.click(getBySelector('.backup-switcher'));
+ await act(async () => jest.advanceTimersByTime(0));
// audit btn
await act(async () => {
fireEvent.click(screen.getByText('审 核'));
@@ -414,7 +422,8 @@ describe('sqle/SqlExecWorkflow/Create', () => {
instance_name: 'mysql-2',
instance_schema: 'sqle',
project_name: 'default',
- sql: 'select * from user'
+ sql: 'select * from user',
+ enable_backup: true
});
await act(async () => jest.advanceTimersByTime(3000));
expect(getAuditTaskSQLsSpy).toHaveBeenCalledTimes(1);
@@ -452,7 +461,8 @@ describe('sqle/SqlExecWorkflow/Create', () => {
input_sql_file: sqlFile,
instance_name: 'mysql-2',
instance_schema: 'sqle',
- project_name: 'default'
+ project_name: 'default',
+ enable_backup: true
});
// 提交工单
@@ -545,7 +555,8 @@ describe('sqle/SqlExecWorkflow/Create', () => {
instance_name: 'mysql-2',
instance_schema: 'sqle',
project_name: 'default',
- sql: 'select * from user'
+ sql: 'select * from user',
+ enable_backup: false
});
await act(async () => jest.advanceTimersByTime(3000));
@@ -634,7 +645,8 @@ describe('sqle/SqlExecWorkflow/Create', () => {
instance_name: 'mysql-2',
instance_schema: 'sqle',
project_name: 'default',
- sql: 'select * from user'
+ sql: 'select * from user',
+ enable_backup: false
});
await act(async () => jest.advanceTimersByTime(3000));
expect(getAuditTaskSQLsSpy).toHaveBeenCalledTimes(1);
@@ -846,6 +858,7 @@ describe('sqle/SqlExecWorkflow/Create', () => {
await act(async () => jest.advanceTimersByTime(3000));
expect(auditTaskGroupId).toHaveBeenCalledTimes(1);
expect(auditTaskGroupId).toHaveBeenCalledWith({
+ enable_backup: false,
task_group_id: 99,
sql: 'select * from user'
});
@@ -928,6 +941,7 @@ describe('sqle/SqlExecWorkflow/Create', () => {
expect(auditTaskGroupId).toHaveBeenCalledTimes(1);
expect(auditTaskGroupId).toHaveBeenCalledWith({
task_group_id: 99,
+ enable_backup: false,
sql: formatterSQL('select * from user.list join in all', 'MySQL')
});
@@ -1042,4 +1056,91 @@ describe('sqle/SqlExecWorkflow/Create', () => {
'ant-btn-loading'
);
});
+
+ it('render create rollback workflow', async () => {
+ (useSelector as jest.Mock).mockImplementation((e) =>
+ e({
+ whitelist: { modalStatus: { [ModalName.Add_Whitelist]: false } },
+ sqlExecWorkflow: {
+ clonedExecWorkflowSqlAuditInfo: {
+ isSameSqlForAll: false,
+ databaseInfo: [
+ {
+ instanceName: 'mysql-1',
+ instanceSchema: 'test'
+ }
+ ],
+ '0': {
+ currentUploadType: AuditTaskResV1SqlSourceEnum.form_data,
+ form_data: 'SELECT * ',
+ backup: true
+ }
+ },
+ clonedExecWorkflowBaseInfo: {
+ workflow_subject: 'workflow-name-Rollback',
+ desc: 'test desc'
+ },
+ versionFirstStageInstances: [
+ {
+ instances_name: instanceTipsMockData[0].instance_name,
+ instances_id: instanceTipsMockData[0].instance_id
+ }
+ ],
+ workflowRollbackSqlIds: [1, 2]
+ },
+ permission: {
+ moduleFeatureSupport: { sqlOptimization: false },
+ userOperationPermissions: null
+ }
+ })
+ );
+ const { baseElement } = superRender(
, undefined, {
+ routerProps: {
+ initialEntries: [
+ `/sqle/project/700300/exec-workflow/create?rollbackWorkflowId=1`
+ ]
+ }
+ });
+
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(requestInstanceTip).toHaveBeenCalledTimes(1);
+ expect(requestInstanceTip).toHaveBeenCalledWith({
+ functional_module:
+ getInstanceTipListV1FunctionalModuleEnum.create_workflow,
+ project_name: projectName
+ });
+
+ fireEvent.click(screen.getByText('审 核'));
+ await act(async () => jest.advanceTimersByTime(0));
+ expect(requestAudit).toHaveBeenCalledTimes(1);
+ expect(requestAudit).toHaveBeenNthCalledWith(1, {
+ exec_mode: undefined,
+ instance_name: 'mysql-1',
+ instance_schema: 'test',
+ project_name: 'default',
+ sql: 'SELECT * ',
+ enable_backup: true
+ });
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(getAuditTaskSQLsSpy).toHaveBeenCalledTimes(1);
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(baseElement).toMatchSnapshot();
+ fireEvent.click(screen.getByText('提交工单'));
+ await act(async () => jest.advanceTimersByTime(0));
+
+ await act(async () => jest.advanceTimersByTime(3000));
+
+ expect(createRollbackWorkflowSpy).toHaveBeenCalled();
+ expect(createRollbackWorkflowSpy).toHaveBeenCalledWith({
+ project_name: projectName,
+ task_ids: [18],
+ workflow_subject: 'workflow-name-Rollback',
+ desc: 'test desc',
+ rollback_sql_ids: [1, 2],
+ workflow_id: '1'
+ });
+ });
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/__snapshots__/index.ce.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/__snapshots__/index.ce.test.tsx.snap
new file mode 100644
index 000000000..8551185d9
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/__snapshots__/index.ce.test.tsx.snap
@@ -0,0 +1,504 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`test AuditResultStep ce render init snap 1`] = `
+
+
+
+
+
+
+ workflow_subject
+
+
+
+
+ desc
+
+
+
+
+
+
+
+
+
+
+
+ instance_name b
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ instance_name a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全部等级
+
+
+ 普通(Normal)
+
+
+ 提示(Notice)
+
+
+ 告警(Warning)
+
+
+ 错误(Error)
+
+
+
+
+
+
+ 2000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 30
+
+
+ 审核结果评分
+
+
+
+
+
+
+ instance_schema
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/__snapshots__/index.test.tsx.snap
index 8b23a4210..cc9126913 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/__snapshots__/index.test.tsx.snap
@@ -1,5 +1,1357 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`test AuditResultStep render switch backup policy button 1`] = `
+
+
+
+
+
+
+ workflow_subject
+
+
+
+
+ desc
+
+
+
+
+
+
+
+
+
+
+
+ instance_name b
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ instance_name a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全部等级
+
+
+ 普通(Normal)
+
+
+ 提示(Notice)
+
+
+ 告警(Warning)
+
+
+ 错误(Error)
+
+
+
+
+
+
+ 3000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 40
+
+
+ 审核结果评分
+
+
+
+
+
+
+ instance_schema 1
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`test AuditResultStep render switch data source backup policy 1`] = `
+
+
+
+
+
+
+ workflow_subject
+
+
+
+
+ desc
+
+
+
+
+
+
+
+
+
+
+
+ instance_name b
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ instance_name a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全部等级
+
+
+ 普通(Normal)
+
+
+ 提示(Notice)
+
+
+ 告警(Warning)
+
+
+ 错误(Error)
+
+
+
+
+
+
+ 2000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 30
+
+
+ 审核结果评分
+
+
+
+
+
+
+ instance_schema
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 统一变更当前数据源上SQL的备份回滚策略为
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
exports[`test AuditResultStep should match snapshot 1`] = `
+
+
@@ -407,6 +1778,47 @@ exports[`test AuditResultStep should match snapshot 1`] = `
>
审核结果
+
+
+
+
+
+
+
+
({
+ ...jest.requireActual('react-redux'),
+ useSelector: jest.fn()
+}));
+
+describe('test AuditResultStep ce', () => {
+ const customRender = (createAction: () => Promise
) => {
+ return superRender(
+
+ );
+ };
+
+ ignoreConsoleErrors([
+ UtilsConsoleErrorStringsEnum.UNIQUE_KEY_REQUIRED,
+ UtilsConsoleErrorStringsEnum.INVALID_CSS_VALUE
+ ]);
+
+ beforeEach(() => {
+ mockUseCurrentUser();
+ mockUseCurrentProject();
+ jest.useFakeTimers();
+ execWorkflow.mockAllApi();
+ (useSelector as jest.Mock).mockImplementation((e) =>
+ e({
+ whitelist: { modalStatus: { [ModalName.Add_Whitelist]: false } },
+ permission: {
+ moduleFeatureSupport: { sqlOptimization: false },
+ userOperationPermissions: null
+ }
+ })
+ );
+ });
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ });
+
+ it('render init snap', async () => {
+ const { baseElement } = customRender(jest.fn());
+ expect(screen.queryByText('切换数据源备份策略')).not.toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/index.test.tsx
index df7afd392..1ba5648ba 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/index.test.tsx
@@ -4,7 +4,7 @@ import { superRender } from '../../../../../../testUtils/customRender';
import execWorkflow from '../../../../../../testUtils/mockApi/execWorkflow';
import { AuditTaskResData } from '../../../../../../testUtils/mockApi/execWorkflow/data';
import { MockSharedStepDetail } from '../../../hooks/mockData';
-import { act } from '@testing-library/react';
+import { act, screen } from '@testing-library/react';
import { mockUseCurrentProject } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentProject';
import {
ignoreConsoleErrors,
@@ -14,6 +14,9 @@ import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockAp
import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
import { useSelector } from 'react-redux';
import { ModalName } from '../../../../../../data/ModalName';
+import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
+import EventEmitter from '../../../../../../utils/EventEmitter';
+import EmitterKey from '../../../../../../data/EmitterKey';
jest.mock('react-redux', () => ({
...jest.requireActual('react-redux'),
@@ -45,10 +48,13 @@ describe('test AuditResultStep', () => {
UtilsConsoleErrorStringsEnum.INVALID_CSS_VALUE
]);
+ let updateTaskBackupStrategySpy: jest.SpyInstance;
+
beforeEach(() => {
mockUseCurrentUser();
mockUseCurrentProject();
jest.useFakeTimers();
+ updateTaskBackupStrategySpy = execWorkflow.updateTaskBackupStrategy();
execWorkflow.mockAllApi();
(useSelector as jest.Mock).mockImplementation((e) =>
e({
@@ -76,4 +82,44 @@ describe('test AuditResultStep', () => {
fireEvent.click(getByText('提交工单'));
expect(createActionSpy).toHaveBeenCalledTimes(1);
});
+
+ it('render switch data source backup policy', async () => {
+ const emitSpy = jest.spyOn(EventEmitter, 'emit');
+ const { baseElement } = customRender(jest.fn());
+ expect(screen.getByText('切换数据源备份策略')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('切换数据源备份策略'));
+ await act(async () => jest.advanceTimersByTime(0));
+ expect(
+ screen.getByText('统一变更当前数据源上SQL的备份回滚策略为')
+ ).toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+
+ fireEvent.mouseDown(getBySelector('#strategy'));
+ await act(async () => jest.advanceTimersByTime(0));
+ fireEvent.click(screen.getByText('基于行级备份回滚'));
+ await act(async () => jest.advanceTimersByTime(0));
+ fireEvent.click(screen.getByText('确 认'));
+ await act(async () => jest.advanceTimersByTime(0));
+ expect(updateTaskBackupStrategySpy).toHaveBeenCalledTimes(1);
+ expect(updateTaskBackupStrategySpy).toHaveBeenCalledWith({
+ task_id: '1',
+ strategy: 'origin_row'
+ });
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(screen.getByText('切换数据源备份策略成功')).toBeInTheDocument();
+ expect(emitSpy).toHaveBeenCalledTimes(1);
+ expect(emitSpy).toHaveBeenCalledWith(
+ EmitterKey.Refresh_Sql_Exec_workflow_Audit_Result_List
+ );
+ });
+
+ it('render switch backup policy button', async () => {
+ const { baseElement } = customRender(jest.fn());
+
+ expect(screen.getByText('切换数据源备份策略')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('instance_name a'));
+ await act(async () => jest.advanceTimersByTime(0));
+ expect(screen.queryByText('切换数据源备份策略')).not.toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ });
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/BaseInfoForm/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/BaseInfoForm/__tests__/index.test.tsx
index bff990b54..51b2e8b40 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/BaseInfoForm/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/BaseInfoForm/__tests__/index.test.tsx
@@ -10,7 +10,9 @@ describe('test BaseInfoForm', () => {
isCloneMode: false,
isAssociationVersionMode: false,
versionId: undefined,
- versionName: undefined
+ versionName: undefined,
+ isRollbackMode: false,
+ rollbackWorkflowId: undefined
}));
});
it('should match snapshot', () => {
@@ -24,7 +26,9 @@ describe('test BaseInfoForm', () => {
isCloneMode: false,
isAssociationVersionMode: true,
versionId: '1',
- versionName: 'v1-test'
+ versionName: 'v1-test',
+ isRollbackMode: false,
+ rollbackWorkflowId: undefined
}));
mockThemeStyleData();
const wrapper = shallow( );
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/__tests__/useRenderDatabaseSelectionItems.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/__tests__/useRenderDatabaseSelectionItems.test.tsx
index 91353736c..21faa29fe 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/__tests__/useRenderDatabaseSelectionItems.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/__tests__/useRenderDatabaseSelectionItems.test.tsx
@@ -54,7 +54,9 @@ describe('test useRenderDatabaseSelectionItems', () => {
isCloneMode: false,
isAssociationVersionMode: false,
versionId: undefined,
- versionName: undefined
+ versionName: undefined,
+ rollbackWorkflowId: undefined,
+ isRollbackMode: false
}));
});
afterEach(() => {
@@ -104,7 +106,8 @@ describe('test useRenderDatabaseSelectionItems', () => {
ruleTemplate: undefined,
dbType: undefined,
testConnectResult: undefined,
- isSupportFileModeExecuteSql: true
+ isSupportFileModeExecuteSql: true,
+ enableBackup: false
});
await act(() => jest.advanceTimersByTime(3000));
@@ -361,7 +364,9 @@ describe('test useRenderDatabaseSelectionItems', () => {
isCloneMode: true,
isAssociationVersionMode: false,
versionId: undefined,
- versionName: undefined
+ versionName: undefined,
+ rollbackWorkflowId: undefined,
+ isRollbackMode: false
}));
renderHook(() =>
useRenderDatabaseSelectionItems({
@@ -374,4 +379,65 @@ describe('test useRenderDatabaseSelectionItems', () => {
expect(mockGetInstance).toHaveBeenCalledTimes(2);
expect(mockGetSystemModuleStatus).toHaveBeenCalledTimes(2);
});
+
+ it('should get instance info when isRollbackMode is true and instanceList not undefined', async () => {
+ (useSelector as jest.Mock).mockImplementation((e) =>
+ e({
+ sqlExecWorkflow: {
+ clonedExecWorkflowSqlAuditInfo: {
+ databaseInfo: [
+ {
+ instanceName: 'mysql-1',
+ instanceSchema: 'test'
+ }
+ ]
+ }
+ }
+ })
+ );
+ const mockGetInstanceSchemas = instance.getInstanceSchemas();
+ const mockGetInstance = instance.getInstance();
+ const mockGetSystemModuleStatus = system.getSystemModuleStatus();
+ const spy = jest.spyOn(useCreationMode, 'default');
+ spy.mockImplementation(() => ({
+ isCloneMode: false,
+ isAssociationVersionMode: false,
+ versionId: undefined,
+ versionName: undefined,
+ rollbackWorkflowId: undefined,
+ isRollbackMode: true
+ }));
+ renderHook(() =>
+ useRenderDatabaseSelectionItems({
+ dbSourceInfoCollection: MockSharedStepDetail.dbSourceInfoCollection,
+ sqlStatementTabActiveKey: MockSharedStepDetail.sqlStatementTabActiveKey,
+ instanceList: [
+ {
+ instance_name: 'mysql-1',
+ enable_backup: true
+ }
+ ]
+ })
+ );
+ expect(
+ MockSharedStepDetail.dbSourceInfoCollection.set
+ ).toHaveBeenCalledTimes(2);
+ expect(
+ MockSharedStepDetail.dbSourceInfoCollection.set
+ ).toHaveBeenCalledWith('0', {
+ instanceName: 'mysql-1',
+ schemaName: undefined,
+ getSchemaLoading: true,
+ schemaList: [],
+ ruleTemplate: undefined,
+ dbType: undefined,
+ testConnectResult: undefined,
+ isSupportFileModeExecuteSql: true,
+ enableBackup: true
+ });
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(mockGetInstanceSchemas).toHaveBeenCalledTimes(1);
+ expect(mockGetInstance).toHaveBeenCalledTimes(1);
+ expect(mockGetSystemModuleStatus).toHaveBeenCalledTimes(1);
+ });
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/__tests__/index.test.tsx
index 42c2c6644..1f6a6b6e2 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/__tests__/index.test.tsx
@@ -12,7 +12,9 @@ describe('test FormStep', () => {
isCloneMode: false,
isAssociationVersionMode: false,
versionId: undefined,
- versionName: undefined
+ versionName: undefined,
+ rollbackWorkflowId: undefined,
+ isRollbackMode: false
}));
const { result: baseInfoFormResult } = renderHook(() => useForm());
const { result: sqlAuditInfoFormResult } = renderHook(() => useForm());
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.test.ts b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.test.ts
index ec3eb8864..81fb52f16 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.test.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.test.ts
@@ -56,7 +56,8 @@ describe('test useAuditWorkflow', () => {
exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sqls,
sql_file: [sqlFile],
zip_file: [zipFile],
- file_sort_method: 'desc'
+ file_sort_method: 'desc',
+ backup: true
} as SqlStatementFields,
databaseInfo: [{ instanceName: 'instance1', instanceSchema: 'schema1' }]
};
@@ -77,7 +78,8 @@ describe('test useAuditWorkflow', () => {
expect(mockAuditTaskGroupId).toHaveBeenCalledTimes(1);
expect(mockAuditTaskGroupId).toHaveBeenNthCalledWith(1, {
task_group_id: 99,
- sql: 'SELECT * FROM table'
+ sql: 'SELECT * FROM table',
+ enable_backup: true
});
await act(async () => jest.advanceTimersByTime(3000));
@@ -188,7 +190,8 @@ describe('test useAuditWorkflow', () => {
2: {
exec_mode: 'sqls',
form_data: 'SELECT * FROM table',
- currentUploadType: AuditTaskResV1SqlSourceEnum.form_data
+ currentUploadType: AuditTaskResV1SqlSourceEnum.form_data,
+ backup: true
} as SqlStatementFields,
databaseInfo: [
{ instanceName: 'instance1', instanceSchema: 'schema1' },
@@ -232,7 +235,8 @@ describe('test useAuditWorkflow', () => {
instance_name: 'instance3',
instance_schema: 'schema3',
sql: 'SELECT * FROM table',
- exec_mode: 'sqls'
+ exec_mode: 'sqls',
+ enable_backup: true
});
await act(async () => jest.advanceTimersByTime(3000));
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Detail/__tests__/__snapshots__/index.test.tsx.snap
index 45d18fbe3..d39381644 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/__tests__/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/__tests__/__snapshots__/index.test.tsx.snap
@@ -69,6 +69,24 @@ exports[`sqle/ExecWorkflow/Detail render current workflow status is wait for exe
role="separator"
/>
+
+
+ 重 试
+
+
+
+
+ 回 滚
+
+
+
+
+ 重 试
+
+
+
+
+ 回 滚
+
+
+
+
+ 重 试
+
+
+
+
+ 回 滚
+
+
+
+
+ 重 试
+
+
+
+
+ 回 滚
+
+
+
+
+ 重 试
+
+
+
+
+ 回 滚
+
+
{
return {
@@ -52,6 +54,7 @@ describe('sqle/ExecWorkflow/Detail', () => {
jest.useFakeTimers();
mockUseCurrentUser();
mockUseCurrentProject();
+ mockUseDbServiceDriver();
execWorkflow.mockAllApi();
task.mockAllApi();
requestWorkflowInfo = execWorkflow.getWorkflow();
@@ -61,6 +64,7 @@ describe('sqle/ExecWorkflow/Detail', () => {
getSummaryOfInstanceTasksSpy = execWorkflow.getSummaryOfInstanceTasks();
executeTasksOnWorkflow = execWorkflow.executeTasksOnWorkflow();
batchCompleteWorkflowsSpy = execWorkflow.batchCompleteWorkflows();
+ instance.getInstanceTipList();
terminateMultipleTaskByWorkflowSpy =
execWorkflow.terminateMultipleTaskByWorkflow();
getSummaryOfInstanceTasksSpy.mockClear();
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.ce.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.ce.test.tsx
new file mode 100644
index 000000000..df1e85234
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.ce.test.tsx
@@ -0,0 +1,68 @@
+/**
+ * @test_version ce
+ */
+
+import { act, cleanup, fireEvent, screen } from '@testing-library/react';
+import SQLMode from '../SqlMode';
+import { SqlExecuteResultCardProps } from '../index.type';
+import { superRender } from '../../../../../../../../../testUtils/customRender';
+import rule_template from '../../../../../../../../../testUtils/mockApi/rule_template';
+import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
+import { AuditTaskSQLResV2BackupStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+
+const projectID = '700300';
+const taskId = 'task_id_1234';
+
+describe('sqle/ExecWorkflow/AuditDetail/SqlMode ce', () => {
+ const onUpdateDescriptionFn = jest.fn();
+
+ const customRender = (
+ params: Omit<
+ SqlExecuteResultCardProps,
+ 'projectID' | 'taskId' | 'onUpdateDescription'
+ >
+ ) => {
+ const someParams: Pick<
+ SqlExecuteResultCardProps,
+ 'projectID' | 'taskId' | 'onUpdateDescription'
+ > = {
+ projectID,
+ taskId,
+ onUpdateDescription: onUpdateDescriptionFn
+ };
+ return superRender( );
+ };
+
+ beforeEach(() => {
+ mockUseCurrentUser();
+ jest.useFakeTimers();
+ rule_template.getRuleList();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render init snap', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_sql: 'exec_sql cont',
+ rollback_sqls: ['rollback_sql cont'],
+ backup_strategy_tip: 'test tips',
+ backup_strategy: AuditTaskSQLResV2BackupStrategyEnum.reverse_sql,
+ associated_rollback_workflows: [
+ {
+ workflow_name: 'test_workflow_name',
+ workflow_id: '1'
+ }
+ ]
+ });
+ fireEvent.click(screen.getByText('回滚语句'));
+ await act(async () => jest.advanceTimersByTime(0));
+ expect(screen.queryByText('基于反向SQL回滚')).not.toBeInTheDocument();
+ expect(screen.queryByText('test tips')).not.toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx
index e8ac34860..e0f7016aa 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx
@@ -11,6 +11,7 @@ import { superRender } from '../../../../../../../../../testUtils/customRender';
import task from '../../../../../../../../../testUtils/mockApi/task';
import rule_template from '../../../../../../../../../testUtils/mockApi/rule_template';
import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
+import { AuditTaskSQLResV2BackupStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
const projectID = '700300';
const taskId = 'task_id_1234';
@@ -96,14 +97,11 @@ describe('sqle/ExecWorkflow/AuditDetail/SqlMode', () => {
});
const iconArrows = getAllBySelector('.custom-icon-arrow-down', baseElement);
- expect(iconArrows.length).toBe(2);
+ expect(iconArrows.length).toBe(1);
fireEvent.click(iconArrows[0]);
await act(async () => jest.advanceTimersByTime(500));
- fireEvent.click(iconArrows[1]);
- await act(async () => jest.advanceTimersByTime(500));
-
expect(baseElement).toMatchSnapshot();
});
@@ -113,22 +111,21 @@ describe('sqle/ExecWorkflow/AuditDetail/SqlMode', () => {
});
const iconArrows = getAllBySelector('.custom-icon-arrow-down', baseElement);
- expect(iconArrows.length).toBe(2);
+ expect(iconArrows.length).toBe(1);
fireEvent.click(iconArrows[0]);
await act(async () => jest.advanceTimersByTime(500));
- fireEvent.click(iconArrows[1]);
- await act(async () => jest.advanceTimersByTime(500));
-
expect(baseElement).toMatchSnapshot();
});
- it('render change exec_sql & rollback_sql', async () => {
+ it('render change exec_sql & rollback_sql & exec_result', async () => {
const { baseElement } = customRender({
number: 1,
exec_sql: 'exec_sql cont',
- rollback_sql: 'rollback_sql cont'
+ rollback_sqls: ['rollback_sql cont'],
+ backup_strategy: AuditTaskSQLResV2BackupStrategyEnum.reverse_sql,
+ exec_result: 'success'
});
expect(screen.getByText('执行语句')).toBeInTheDocument();
@@ -140,6 +137,9 @@ describe('sqle/ExecWorkflow/AuditDetail/SqlMode', () => {
fireEvent.click(screen.getByText('执行语句'));
await act(async () => jest.advanceTimersByTime(500));
expect(baseElement).toMatchSnapshot();
+ fireEvent.click(screen.getByText('执行结果'));
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
});
it('render skip analyze page', async () => {
@@ -172,4 +172,48 @@ describe('sqle/ExecWorkflow/AuditDetail/SqlMode', () => {
expect(mockCopyTextByTextarea).toHaveBeenCalled();
expect(screen.getByText('复制成功')).toBeInTheDocument();
});
+
+ it('render has backup conflict', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_sql: 'exec_sql cont',
+ rollback_sqls: ['rollback_sql cont'],
+ backupConflict: true
+ });
+ fireEvent.click(screen.getByText('回滚语句'));
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(screen.getByText('当前SQL未按预期开启备份')).toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render backup strategy tip', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_sql: 'exec_sql cont',
+ rollback_sqls: ['rollback_sql cont'],
+ backup_strategy_tip: 'test tips'
+ });
+ fireEvent.click(screen.getByText('回滚语句'));
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(screen.getByText('test tips')).toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render associated rollback workflows', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_sql: 'exec_sql cont',
+ rollback_sqls: ['rollback_sql cont'],
+ backup_strategy_tip: 'test tips',
+ backup_strategy: AuditTaskSQLResV2BackupStrategyEnum.reverse_sql,
+ associated_rollback_workflows: [
+ {
+ workflow_name: 'test_workflow_name',
+ workflow_id: '1'
+ }
+ ]
+ });
+ expect(screen.getByText('关联回滚工单')).toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ });
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/FileMode.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/FileMode.test.tsx.snap
index d1340e097..62363c9a4 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/FileMode.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/FileMode.test.tsx.snap
@@ -3,7 +3,7 @@
exports[`test TaskResultList/Result/FileMode should match snapshot 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 所在行
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ rollback_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap
index ebe57a40a..8b0b175a9 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap
@@ -1,10 +1,10 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql 1`] = `
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render associated rollback workflows 1`] = `
-
-
-
-
-
-
- 1
-
- exec_sql cont
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+ 所在行
+ -
-
+
+
+
+
+
+
+
+
-
- 审核结果
-
+ 1
-
-
-
+ exec_sql cont
+
+
+
@@ -363,12 +343,16 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback
- 执行结果
+
+ 审核结果
+
@@ -416,11 +400,11 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback
`;
-exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql 2`] = `
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render backup strategy tip 1`] = `
-
-
-
-
-
-
- 1
-
- rollback_sql cont
-
-
-
-
-
-
-
-
-
+ class="actiontech-sql-renderer-wrapper css-dz7fl9"
+ >
+
+
+
+
+ 1
+
+ exec_sql cont
+
+
+
+
-
-
-
+
+
+
+
+
+
+
-
- 审核结果
-
-
-
+
+
+
+
+ 1
+
+ rollback_sql cont
+
+
+
+
+
@@ -713,7 +738,7 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback
@@ -779,12 +804,16 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback
- 执行结果
+
+ 审核结果
+
@@ -832,11 +861,11 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback
`;
-exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql 3`] = `
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 1`] = `
-
-
-
-
+
-
- 1
-
- exec_sql cont
+
+
+
+
+ 1
+
+ exec_sql cont
+
+
+
-
-
+
+
+
+
+
+
+`;
+
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 2`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 所在行
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+ 基于反向SQL回滚
+
+
+
+
+
+
+
+
+
+ 1
+
+ rollback_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1195,12 +1623,16 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback
- 执行结果
+
+ 审核结果
+
@@ -1248,11 +1680,11 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback
`;
-exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 1`] = `
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 3`] = `
+
+`;
+
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 4`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 所在行
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+ 基于反向SQL回滚
+
+
+
+
+
+
+
+
+
+ 1
+
+ rollback_sql cont
+
+
+
+
+
+
+
+
+
+
+ success
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 所在行
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 2`] = `
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+ 所在行
+
+ -
+
+
+
-
-
-
-
-
-
- 所在行
-
-
-
+
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 执行结果
-
-
-
-
-
-
-
-
@@ -1655,11 +3329,11 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 1`] = `
`;
-exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 2`] = `
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click icon arrow when has result cont 1`] = `
+
-
-
+
+
+
+
+
+
+
+ 所在行
+
+ -
+
+
+
-
-
-
-
-
-
- 所在行
-
-
-
+
-
-
-
-
- -
-
+
+
@@ -1937,84 +3647,34 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 2`] = `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ >
+
+
-
-
-
-
+ class="ant-tree-switcher-leaf-line"
+ />
- 执行结果
+ -
@@ -2030,32 +3690,8 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 2`] = `
@@ -2086,11 +3722,11 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 2`] = `
`;
-exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click icon arrow when has result cont 1`] = `
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click icon arrow when no cont 1`] = `
+
-
-
-
-
-
-
-
-
+
- 所在行
-
- -
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
+
+
+ 回滚语句
+
+
+
+
+
+ 执行结果
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
- 审核结果
-
-
-
+
+
+
+
+
+
+ 所在文件
+
+ -
+
+
+
+
+
-
+
+
-
-
-
-
-
-
-
+
+
- -
+ 所在行
+ -
-
+
+
@@ -2463,18 +4035,22 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click icon arrow when has
- 执行结果
+
+ 审核结果
+
+ >
+
+
- exec_result cont
+ -
@@ -2543,11 +4123,11 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click icon arrow when has
`;
-exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click icon arrow when no cont 1`] = `
+exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render has backup conflict 1`] = `
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+ 所在行
+ -
-
+
+
+
+
+
+
+
+
-
- 审核结果
-
+ 1
-
-
+ exec_sql cont
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+ 当前SQL未按预期开启备份
+
+
+
+
-
-
-
+
-
- -
-
-
+
+
+
+
+ 1
+
+ rollback_sql cont
+
+
+
+
+
@@ -2862,7 +4461,7 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click icon arrow when no c
@@ -2900,7 +4499,7 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click icon arrow when no c
>
-
- 执行结果
-
-
-
-
-
-
-
-
-
- -
+
+ 审核结果
+
@@ -3012,7 +4588,7 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render snap when data is empty 1`
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 执行结果
-
-
-
-
-
-
-
-
+
+
+
+
+
+
@@ -748,6 +765,12 @@ exports[`page/DataSource/DataSourceList render list snap 1`] = `
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
+
@@ -1436,6 +1469,12 @@ exports[`page/DataSource/DataSourceList render table by filter enable masking 1`
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
已启用
+
+ 已启用
+
@@ -1784,6 +1837,11 @@ exports[`page/DataSource/DataSourceList render table by filter enable masking 1`
>
未启用
+
+ 未启用
+
@@ -2489,6 +2547,7 @@ exports[`page/DataSource/DataSourceList render table filter option val 1`] = `
+
@@ -2551,6 +2610,12 @@ exports[`page/DataSource/DataSourceList render table filter option val 1`] = `
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
已启用
+
+ 已启用
+
@@ -2899,6 +2978,11 @@ exports[`page/DataSource/DataSourceList render table filter option val 1`] = `
>
未启用
+
+ 未启用
+
@@ -3312,6 +3396,7 @@ exports[`page/DataSource/DataSourceList render table for action btn render table
+
@@ -3374,6 +3459,12 @@ exports[`page/DataSource/DataSourceList render table for action btn render table
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
已启用
+
+ 已启用
+
@@ -3680,6 +3785,11 @@ exports[`page/DataSource/DataSourceList render table for action btn render table
>
未启用
+
+ 未启用
+
@@ -4105,6 +4215,7 @@ exports[`page/DataSource/DataSourceList render table for action btn render table
+
@@ -4167,6 +4278,12 @@ exports[`page/DataSource/DataSourceList render table for action btn render table
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
已启用
+
+ 已启用
+
@@ -4984,6 +5115,7 @@ exports[`page/DataSource/DataSourceList render table for action btn render table
+
@@ -5046,6 +5178,12 @@ exports[`page/DataSource/DataSourceList render table for action btn render table
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
已启用
+
+ 已启用
+
@@ -5863,6 +6015,7 @@ exports[`page/DataSource/DataSourceList render table for api has data 1`] = `
+
@@ -5925,6 +6078,12 @@ exports[`page/DataSource/DataSourceList render table for api has data 1`] = `
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
已启用
+
+ 已启用
+
@@ -6273,6 +6446,11 @@ exports[`page/DataSource/DataSourceList render table for api has data 1`] = `
>
未启用
+
+ 未启用
+
@@ -6765,6 +6943,7 @@ exports[`page/DataSource/DataSourceList render table for api has data 2`] = `
+
@@ -6827,6 +7006,12 @@ exports[`page/DataSource/DataSourceList render table for api has data 2`] = `
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
已启用
+
+ 已启用
+
@@ -7175,6 +7374,11 @@ exports[`page/DataSource/DataSourceList render table for api has data 2`] = `
>
未启用
+
+ 未启用
+
@@ -7642,6 +7846,7 @@ exports[`page/DataSource/DataSourceList render table for api return no data 1`]
+
@@ -7704,6 +7909,12 @@ exports[`page/DataSource/DataSourceList render table for api return no data 1`]
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
+
@@ -8154,6 +8375,12 @@ exports[`page/DataSource/DataSourceList render table for api return no data 2`]
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
+
@@ -8604,6 +8841,12 @@ exports[`page/DataSource/DataSourceList render table for column val 1`] = `
>
数据查询脱敏
+
+ SQL备份
+
+
+
+
+
+
未启用
+
+ 未启用
+
diff --git a/packages/base/src/page/DataSource/components/UpdateDataSource/__snapshots__/index.test.tsx.snap b/packages/base/src/page/DataSource/components/UpdateDataSource/__snapshots__/index.test.tsx.snap
index bdd35c0e1..7dcddee9c 100644
--- a/packages/base/src/page/DataSource/components/UpdateDataSource/__snapshots__/index.test.tsx.snap
+++ b/packages/base/src/page/DataSource/components/UpdateDataSource/__snapshots__/index.test.tsx.snap
@@ -1279,6 +1279,82 @@ exports[`page/DataSource/UpdateDataSource render edit data when has all value 1`
+
@@ -2661,6 +2737,82 @@ exports[`page/DataSource/UpdateDataSource render edit data when has all value 2`
+
@@ -4029,6 +4181,82 @@ exports[`page/DataSource/UpdateDataSource render edit data when has all value 3`
+
@@ -5319,6 +5547,82 @@ exports[`page/DataSource/UpdateDataSource render edit database snap 1`] = `
+
@@ -6888,6 +7192,82 @@ exports[`page/DataSource/UpdateDataSource render prepare api 1`] = `
+
@@ -8070,6 +8450,82 @@ exports[`page/DataSource/UpdateDataSource return list by click return button 1`]
+
diff --git a/packages/base/src/page/DataSource/components/UpdateDataSource/index.test.tsx b/packages/base/src/page/DataSource/components/UpdateDataSource/index.test.tsx
index ff682e034..66bbcbe97 100644
--- a/packages/base/src/page/DataSource/components/UpdateDataSource/index.test.tsx
+++ b/packages/base/src/page/DataSource/components/UpdateDataSource/index.test.tsx
@@ -130,7 +130,8 @@ describe('page/DataSource/UpdateDataSource', () => {
type: 'string',
value: 'test'
}
- ]
+ ],
+ enable_backup: true
}
]
})
diff --git a/packages/base/src/testUtils/mockApi/global/data.ts b/packages/base/src/testUtils/mockApi/global/data.ts
index 6dfa76cf2..454445836 100644
--- a/packages/base/src/testUtils/mockApi/global/data.ts
+++ b/packages/base/src/testUtils/mockApi/global/data.ts
@@ -80,7 +80,8 @@ export const DBServicesList: IListDBService[] = [
last_connection_test_error_message: '',
last_connection_test_status:
ListDBServiceLastConnectionTestStatusEnum.connect_success,
- last_connection_test_time: '2024-11-15T15:05:10.175+08:00'
+ last_connection_test_time: '2024-11-15T15:05:10.175+08:00',
+ enable_backup: true
},
{
uid: '1739531942258282496',
@@ -108,6 +109,7 @@ export const DBServicesList: IListDBService[] = [
last_connection_test_error_message: 'error message',
last_connection_test_status:
ListDBServiceLastConnectionTestStatusEnum.connect_failed,
- last_connection_test_time: '2024-11-15T15:05:10.175+08:00'
+ last_connection_test_time: '2024-11-15T15:05:10.175+08:00',
+ enable_backup: false
}
];
diff --git a/packages/shared/lib/global/usePermission/__tests__/__snapshots__/index.test.ts.snap b/packages/shared/lib/global/usePermission/__tests__/__snapshots__/index.test.ts.snap
index df7521e72..05b10c123 100644
--- a/packages/shared/lib/global/usePermission/__tests__/__snapshots__/index.test.ts.snap
+++ b/packages/shared/lib/global/usePermission/__tests__/__snapshots__/index.test.ts.snap
@@ -162,6 +162,8 @@ exports[`usePermission should match snapshot 1`] = `
"EXEC_TASK": "action:exec_task",
"EXPORT": "action:export_workflow",
"MANUALLY_EXEC": "action:manually_exec_workflow",
+ "RETRY": "action:retry_workflow",
+ "ROLLBACK": "action:rollback_workflow",
"SCHEDULE_TIME_EXEC_TASK": "action:schedule_time_exec_task",
"TERMINATE_EXEC": "action:terminate_exec_workflow",
"TERMINATE_EXEC_TASK": "action:terminate_exec_task",
@@ -1061,6 +1063,16 @@ exports[`usePermission should match snapshot 2`] = `
"projectArchived": false,
"type": "action",
},
+ "action:retry_workflow": {
+ "id": "action:retry_workflow",
+ "projectArchived": false,
+ "type": "action",
+ },
+ "action:rollback_workflow": {
+ "id": "action:rollback_workflow",
+ "projectArchived": false,
+ "type": "action",
+ },
"action:rule_create_rule_template": {
"id": "action:rule_create_rule_template",
"projectArchived": false,
diff --git a/packages/sqle/src/page/SqlAudit/Detail/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlAudit/Detail/__snapshots__/index.test.tsx.snap
index 8f5440d0f..dd30f7e39 100644
--- a/packages/sqle/src/page/SqlAudit/Detail/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlAudit/Detail/__snapshots__/index.test.tsx.snap
@@ -121,7 +121,7 @@ exports[`sqle/SqlAudit/Detail should match snap shot 1`] = `
+
Date: Wed, 27 Nov 2024 17:37:46 +0800
Subject: [PATCH 15/20] [fix](SqlExecWorkflow): Default value for backup field
---
.../components/SqlBackupSwitcher.tsx | 30 +++++++++++++++----
.../components/index.type.ts | 7 ++++-
.../SqlStatementFormItem/index.tsx | 5 +++-
.../SqlStatementFormItem/index.type.ts | 2 +-
.../hooks/useRenderDatabaseSelectionItems.tsx | 15 ++++++++++
.../SqlAuditInfoFormItem/index.tsx | 1 +
.../src/page/SqlExecWorkflow/Create/index.tsx | 2 +-
.../page/SqlExecWorkflow/Create/index.type.ts | 1 +
8 files changed, 53 insertions(+), 10 deletions(-)
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
index 665800539..453e87f96 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlBackupSwitcher.tsx
@@ -8,25 +8,29 @@ import { Form } from 'antd';
import { SqlAuditInfoFormFields } from '../../../../Create/index.type';
import { SqlBackupSwitcherProps } from './index.type';
import { CreateAuditTasksGroupReqV1ExecModeEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
-import { useMemo } from 'react';
-
+import { useEffect, useMemo, useCallback } from 'react';
+import useCreationMode from '../../../../Create/hooks/useCreationMode';
import SwitchField from './SwitchField';
const SqlBackupSwitcher: React.FC
= ({
fieldPrefixPath,
databaseInfo,
isSameSqlForAll,
- isAtRejectStep
+ isAtRejectStep,
+ isAtFormStep,
+ isAuditing
}) => {
const { t } = useTranslation();
const form = Form.useFormInstance();
+ const { isCloneMode } = useCreationMode();
+
const currentExecuteMode = Form.useWatch(
[fieldPrefixPath, 'exec_mode'],
form
);
- const getInstanceEnableBackup = () => {
+ const getInstanceEnableBackup = useCallback(() => {
if (isSameSqlForAll) {
return databaseInfo.some((item) => item.enableBackup);
}
@@ -34,7 +38,7 @@ const SqlBackupSwitcher: React.FC = ({
databaseInfo.find((item) => item.key === fieldPrefixPath)?.enableBackup ??
false
);
- };
+ }, [databaseInfo, fieldPrefixPath, isSameSqlForAll]);
const enableBackupInstanceName = useMemo(() => {
return databaseInfo
@@ -43,6 +47,21 @@ const SqlBackupSwitcher: React.FC = ({
.join(',');
}, [databaseInfo]);
+ useEffect(() => {
+ if (isAtFormStep && !isAuditing.value && !isCloneMode) {
+ const currentEnableBackup = getInstanceEnableBackup();
+
+ form.setFieldValue([fieldPrefixPath, 'backup'], currentEnableBackup);
+ }
+ }, [
+ fieldPrefixPath,
+ getInstanceEnableBackup,
+ form,
+ isCloneMode,
+ isAtFormStep,
+ isAuditing
+ ]);
+
return (
= ({
wrapperCol={{ span: 2 }}
name={[fieldPrefixPath, 'backup']}
valuePropName="checked"
- initialValue={getInstanceEnableBackup()}
>
;
export type SwitcherFieldProps = {
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
index d9b952ac5..6334bd9be 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx
@@ -25,7 +25,8 @@ const SqlStatementFormItem: React.FC = ({
databaseInfo,
isSameSqlForAll,
isSupportFileModeExecuteSql,
- isAtRejectStep
+ isAtRejectStep,
+ isAtFormStep
}) => {
const { t } = useTranslation();
const form = Form.useFormInstance();
@@ -90,6 +91,8 @@ const SqlStatementFormItem: React.FC = ({
databaseInfo={databaseInfo}
isSameSqlForAll={isSameSqlForAll}
isAtRejectStep={isAtRejectStep}
+ isAtFormStep={isAtFormStep}
+ isAuditing={isAuditing}
/>
{/* #endif */}
;
+} & Pick;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/hooks/useRenderDatabaseSelectionItems.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/hooks/useRenderDatabaseSelectionItems.tsx
index 258c21700..c698da101 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/hooks/useRenderDatabaseSelectionItems.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/hooks/useRenderDatabaseSelectionItems.tsx
@@ -127,6 +127,21 @@ const useRenderDatabaseSelectionItems = ({
}
};
+ useEffect(() => {
+ // 克隆或者回滚时,因为是从store中取instanceName ,此时可能instance list接口还未结束
+ // 导致enableBackup被赋予了默认值false,所以需要在instance list接口完成后,重新设置enableBackup
+ Object.keys(dbSourceInfoCollection.value).forEach((key) => {
+ dbSourceInfoCollection.set(key, {
+ enableBackup:
+ instanceList?.find(
+ (i) =>
+ i.instance_name === dbSourceInfoCollection.value[key].instanceName
+ )?.enable_backup ?? false
+ });
+ });
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [instanceList]);
+
const handleInstanceSchemaChange = (key: string, schemaName?: string) => {
dbSourceInfoCollection.set(key, {
schemaName
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/index.tsx
index b9280714f..4e7c0a2d8 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/index.tsx
@@ -132,6 +132,7 @@ const SqlAuditInfoFormItem = forwardRef(
databaseInfo={databaseInfo}
isAuditing={sharedStepDetail.isAuditing}
isSupportFileModeExecuteSqlRecord={isSupportFileModeExecuteSqlRecord}
+ isAtFormStep={sharedStepDetail.isAtFormStep}
/>
>
);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/index.tsx
index a85a40f56..dfb0aae7a 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/index.tsx
@@ -222,7 +222,7 @@ const CreateSqlExecWorkflow: React.FC = () => {
baseInfoForm={baseInfoForm}
sqlAuditInfoForm={sqlAuditInfoForm}
auditAction={auditAction}
- {...sharedStepDetail}
+ {...{ ...sharedStepDetail, isAtFormStep }}
/>
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts
index e7277e5c8..c044796ef 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts
@@ -78,4 +78,5 @@ export type SharedStepDetails = {
getModifiedSQLsPending: Stateful;
resetAllSharedData: () => void;
+ isAtFormStep?: boolean;
};
From 8a599bc8145abac3ce98d5052fefc7d46b96254b Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Wed, 27 Nov 2024 17:38:58 +0800
Subject: [PATCH 16/20] [test](SqlExecWorkflow): Update unit testing[skip ci]
---
.../__tests__/SqlBackupSwitcher.test.tsx | 97 +++++-
.../__tests__/index.ce.test.tsx | 1 +
.../__tests__/index.test.tsx | 1 +
.../__tests__/index.ce.test.tsx | 1 +
.../__tests__/index.test.tsx | 1 +
.../__snapshots__/index.test.tsx.snap | 320 +++++++++++++++++-
.../Create/__tests__/index.test.tsx | 2 +-
.../AuditResultStep/__tests__/index.test.tsx | 2 +-
.../useRenderDatabaseSelectionItems.test.tsx | 24 +-
.../src/store/sqlExecWorkflow/index.test.ts | 36 +-
.../src/testUtils/mockApi/instance/data.ts | 3 +-
11 files changed, 454 insertions(+), 34 deletions(-)
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlBackupSwitcher.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlBackupSwitcher.test.tsx
index 41b1c9708..b9eb77da2 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlBackupSwitcher.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlBackupSwitcher.test.tsx
@@ -17,7 +17,10 @@ describe('test SqlBackupSwitcher', () => {
const customRender = (
databaseInfo: SqlBackupSwitcherProps['databaseInfo'],
isSameSqlForAll = false,
- isAtRejectStep = false
+ isAtRejectStep = false,
+ isAuditing = false,
+ isAtFormStep = true,
+ search = ''
) => {
const { result } = renderHook(() => Form.useForm());
return superRender(
@@ -27,8 +30,20 @@ describe('test SqlBackupSwitcher', () => {
databaseInfo={databaseInfo}
isSameSqlForAll={isSameSqlForAll}
isAtRejectStep={isAtRejectStep}
+ isAuditing={{ set: jest.fn(), value: isAuditing }}
+ isAtFormStep={isAtFormStep}
/>
-
+ ,
+ undefined,
+ {
+ routerProps: {
+ initialEntries: [
+ {
+ search
+ }
+ ]
+ }
+ }
);
};
@@ -78,6 +93,84 @@ describe('test SqlBackupSwitcher', () => {
);
});
+ it('render default checked when isAtFormStep is false', async () => {
+ customRender(
+ [
+ {
+ key: '1',
+ instanceName: 'mysql-1',
+ schemaName: 'test',
+ enableBackup: true
+ },
+ {
+ key: '2',
+ instanceName: 'mysql-2',
+ schemaName: 'test2',
+ enableBackup: false
+ }
+ ],
+ true,
+ false,
+ false,
+ false
+ );
+ expect(screen.getByRole('switch').getAttribute('aria-checked')).toBe(
+ 'false'
+ );
+ });
+
+ it('render default checked when isSameSqlForAll is true and isAuditing is true', async () => {
+ customRender(
+ [
+ {
+ key: '1',
+ instanceName: 'mysql-1',
+ schemaName: 'test',
+ enableBackup: true
+ },
+ {
+ key: '2',
+ instanceName: 'mysql-2',
+ schemaName: 'test2',
+ enableBackup: false
+ }
+ ],
+ true,
+ false,
+ true
+ );
+ expect(screen.getByRole('switch').getAttribute('aria-checked')).toBe(
+ 'false'
+ );
+ });
+
+ it('render default checked when isSameSqlForAll is true and isCloneMode is true', async () => {
+ customRender(
+ [
+ {
+ key: '1',
+ instanceName: 'mysql-1',
+ schemaName: 'test',
+ enableBackup: true
+ },
+ {
+ key: '2',
+ instanceName: 'mysql-2',
+ schemaName: 'test2',
+ enableBackup: false
+ }
+ ],
+ true,
+ false,
+ false,
+ true,
+ '?sourceWorkflowId=111'
+ );
+ expect(screen.getByRole('switch').getAttribute('aria-checked')).toBe(
+ 'false'
+ );
+ });
+
it('render default checked when isSameSqlForAll is false', async () => {
const { baseElement } = customRender([
{
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.ce.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.ce.test.tsx
index 60b338c85..09e1cf679 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.ce.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.ce.test.tsx
@@ -32,6 +32,7 @@ describe('test SqlStatementFormItem', () => {
databaseInfo={[
{ key: '1', instanceName: 'mysql-1', schemaName: 'test' }
]}
+ isAtFormStep
{...params}
/>
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx
index 2f7856e93..7d14160bb 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx
@@ -30,6 +30,7 @@ describe('test SqlStatementFormItem', () => {
databaseInfo={[
{ key: '1', instanceName: 'mysql-1', schemaName: 'test' }
]}
+ isAtFormStep
{...params}
/>
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.ce.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.ce.test.tsx
index d02006ba3..96160dd21 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.ce.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.ce.test.tsx
@@ -24,6 +24,7 @@ describe('test SqlStatementFormController ce', () => {
databaseInfo={[
{ key: '1', instanceName: 'mysql-1', schemaName: 'test' }
]}
+ isAtFormStep
/>
);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.test.tsx
index dda898361..0fd75629d 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.test.tsx
@@ -21,6 +21,7 @@ describe('test SqlStatementFormController', () => {
databaseInfo={[
{ key: '1', instanceName: 'mysql-1', schemaName: 'test' }
]}
+ isAtFormStep
{...params}
/>
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/__snapshots__/index.test.tsx.snap
index 6f32ad199..4a41f463c 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/__snapshots__/index.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/__snapshots__/index.test.tsx.snap
@@ -1120,8 +1120,8 @@ exports[`sqle/SqlExecWorkflow/Create render associated version when create workf
class="ant-form-item-control-input-content"
>
@@ -2654,8 +2654,8 @@ from
class="ant-form-item-control-input-content"
>
@@ -4188,8 +4188,8 @@ from
class="ant-form-item-control-input-content"
>
@@ -8796,7 +8796,37 @@ exports[`sqle/SqlExecWorkflow/Create render create rollback workflow 2`] = `
- -
+
- -
+
- -
+
- -
+
@@ -23949,7 +24069,7 @@ from
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mysql-1已开启备份需求,是否确认关闭备份?
+
+
+
+
+
+
+ Cancel
+
+
+
+
+ 确 认
+
+
+
+
+
+
+
+
+
`;
@@ -25579,7 +25783,7 @@ from
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mysql-1已开启备份需求,是否确认关闭备份?
+
+
+
+
+
+
+ Cancel
+
+
+
+
+ 确 认
+
+
+
+
+
+
+
+
+
`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx
index ad038c349..3023914f3 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx
@@ -941,7 +941,7 @@ describe('sqle/SqlExecWorkflow/Create', () => {
expect(auditTaskGroupId).toHaveBeenCalledTimes(1);
expect(auditTaskGroupId).toHaveBeenCalledWith({
task_group_id: 99,
- enable_backup: false,
+ enable_backup: true,
sql: formatterSQL('select * from user.list join in all', 'MySQL')
});
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/index.test.tsx
index 1ba5648ba..9a1b17dcd 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/AuditResultStep/__tests__/index.test.tsx
@@ -103,7 +103,7 @@ describe('test AuditResultStep', () => {
expect(updateTaskBackupStrategySpy).toHaveBeenCalledTimes(1);
expect(updateTaskBackupStrategySpy).toHaveBeenCalledWith({
task_id: '1',
- strategy: 'origin_row'
+ strategy: 'original_row'
});
await act(async () => jest.advanceTimersByTime(3000));
expect(screen.getByText('切换数据源备份策略成功')).toBeInTheDocument();
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/__tests__/useRenderDatabaseSelectionItems.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/__tests__/useRenderDatabaseSelectionItems.test.tsx
index 21faa29fe..9a53581f3 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/__tests__/useRenderDatabaseSelectionItems.test.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Create/components/FormStep/SqlAuditInfoForm/SqlAuditInfoFormItem/DatabaseSelectionItems/__tests__/useRenderDatabaseSelectionItems.test.tsx
@@ -73,7 +73,13 @@ describe('test useRenderDatabaseSelectionItems', () => {
const { result } = renderHook(() =>
useRenderDatabaseSelectionItems({
dbSourceInfoCollection: MockSharedStepDetail.dbSourceInfoCollection,
- sqlStatementTabActiveKey: MockSharedStepDetail.sqlStatementTabActiveKey
+ sqlStatementTabActiveKey: MockSharedStepDetail.sqlStatementTabActiveKey,
+ instanceList: [
+ {
+ instance_name: 'instance1',
+ enable_backup: true
+ }
+ ]
})
);
@@ -95,7 +101,7 @@ describe('test useRenderDatabaseSelectionItems', () => {
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
- ).toHaveBeenCalledTimes(1);
+ ).toHaveBeenCalledTimes(2);
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
).toHaveBeenCalledWith('key1', {
@@ -107,14 +113,14 @@ describe('test useRenderDatabaseSelectionItems', () => {
dbType: undefined,
testConnectResult: undefined,
isSupportFileModeExecuteSql: true,
- enableBackup: false
+ enableBackup: true
});
await act(() => jest.advanceTimersByTime(3000));
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
- ).toHaveBeenCalledTimes(4);
+ ).toHaveBeenCalledTimes(5);
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
).toHaveBeenCalledWith('key1', {
@@ -148,7 +154,7 @@ describe('test useRenderDatabaseSelectionItems', () => {
await act(() => jest.advanceTimersByTime(3000));
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
- ).toHaveBeenCalledTimes(5);
+ ).toHaveBeenCalledTimes(6);
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
@@ -169,7 +175,7 @@ describe('test useRenderDatabaseSelectionItems', () => {
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
- ).toHaveBeenCalledTimes(1);
+ ).toHaveBeenCalledTimes(2);
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
).toHaveBeenCalledWith('key1', {
@@ -267,7 +273,7 @@ describe('test useRenderDatabaseSelectionItems', () => {
expect(handleClickSpy).not.toHaveBeenCalled();
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
- ).not.toHaveBeenCalled();
+ ).toHaveBeenCalledTimes(1);
expect(
MockSharedStepDetail.sqlStatementTabActiveKey.set
).not.toHaveBeenCalled();
@@ -298,7 +304,7 @@ describe('test useRenderDatabaseSelectionItems', () => {
expect(handleClickSpy).toHaveBeenCalledTimes(1);
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
- ).toHaveBeenCalledTimes(1);
+ ).toHaveBeenCalledTimes(2);
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
).toHaveBeenCalledWith('1', undefined);
@@ -421,7 +427,7 @@ describe('test useRenderDatabaseSelectionItems', () => {
);
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
- ).toHaveBeenCalledTimes(2);
+ ).toHaveBeenCalledTimes(3);
expect(
MockSharedStepDetail.dbSourceInfoCollection.set
).toHaveBeenCalledWith('0', {
diff --git a/packages/sqle/src/store/sqlExecWorkflow/index.test.ts b/packages/sqle/src/store/sqlExecWorkflow/index.test.ts
index a3e018d13..52573edee 100644
--- a/packages/sqle/src/store/sqlExecWorkflow/index.test.ts
+++ b/packages/sqle/src/store/sqlExecWorkflow/index.test.ts
@@ -1,7 +1,8 @@
import reducers, {
updateClonedExecWorkflowSqlAuditInfo,
updateClonedExecWorkflowBaseInfo,
- updateVersionFirstStageInstances
+ updateVersionFirstStageInstances,
+ updateWorkflowRollbackSqlIds
} from '.';
import {
AuditTaskResV1SqlSourceEnum,
@@ -56,7 +57,8 @@ describe('store/sqlExecWorkflow', () => {
expect(state).toEqual({
clonedExecWorkflowSqlAuditInfo: mockWorkflowSqlAuditInfo,
clonedExecWorkflowBaseInfo: null,
- versionFirstStageInstances: null
+ versionFirstStageInstances: null,
+ workflowRollbackSqlIds: null
});
});
@@ -82,7 +84,8 @@ describe('store/sqlExecWorkflow', () => {
expect(state).toEqual({
clonedExecWorkflowSqlAuditInfo: null,
clonedExecWorkflowBaseInfo: mockWorkflowBaseInfo,
- versionFirstStageInstances: null
+ versionFirstStageInstances: null,
+ workflowRollbackSqlIds: null
});
});
@@ -112,7 +115,32 @@ describe('store/sqlExecWorkflow', () => {
expect(state).toEqual({
clonedExecWorkflowSqlAuditInfo: null,
clonedExecWorkflowBaseInfo: null,
- versionFirstStageInstances: versionFirstStageInstances
+ versionFirstStageInstances: versionFirstStageInstances,
+ workflowRollbackSqlIds: null
+ });
+ });
+
+ test('should create action when call updateWorkflowRollbackSqlIds', () => {
+ const workflowRollbackSqlIds = [1];
+ expect(updateWorkflowRollbackSqlIds({ workflowRollbackSqlIds })).toEqual({
+ payload: { workflowRollbackSqlIds },
+ type: 'sqlExecWorkflow/updateWorkflowRollbackSqlIds'
+ });
+
+ const state = reducers(
+ {
+ clonedExecWorkflowSqlAuditInfo: null,
+ clonedExecWorkflowBaseInfo: null,
+ versionFirstStageInstances: null,
+ workflowRollbackSqlIds: null
+ },
+ updateWorkflowRollbackSqlIds({ workflowRollbackSqlIds })
+ );
+ expect(state).toEqual({
+ clonedExecWorkflowSqlAuditInfo: null,
+ clonedExecWorkflowBaseInfo: null,
+ versionFirstStageInstances: null,
+ workflowRollbackSqlIds: workflowRollbackSqlIds
});
});
});
diff --git a/packages/sqle/src/testUtils/mockApi/instance/data.ts b/packages/sqle/src/testUtils/mockApi/instance/data.ts
index eefdaec84..f6449b595 100644
--- a/packages/sqle/src/testUtils/mockApi/instance/data.ts
+++ b/packages/sqle/src/testUtils/mockApi/instance/data.ts
@@ -7,7 +7,8 @@ export const instanceTipsMockData: IInstanceTipResV1[] = [
instance_type: 'MySQL',
workflow_template_id: 1,
host: '10.186.62.13',
- port: '33061'
+ port: '33061',
+ enable_backup: true
},
{
instance_id: '1739531942258282496',
From 82284a277bd487ea69b833b6cf3141b14036e5f5 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Thu, 28 Nov 2024 16:38:26 +0800
Subject: [PATCH 17/20] [feature](SqlExecWorkflow): Rollback capability
modification
---
.../List/ConnectionResultColumn.tsx | 2 +-
.../sqle/src/locale/zh-CN/execWorkflow.ts | 4 ++-
.../Common/ResultCard/SqlMode.tsx | 28 +++++++++-------
.../TaskResultList/Common/ResultCard/style.ts | 9 ++---
.../AssociatedRollbackWorkflows.tsx | 2 +-
.../Detail/components/RecordInfo/index.tsx | 4 +--
.../Detail/components/SqlRollback/columns.tsx | 4 ++-
.../Detail/components/SqlRollback/index.tsx | 33 ++++++++++++++-----
.../components/SqlRollback/index.type.ts | 1 +
9 files changed, 55 insertions(+), 32 deletions(-)
diff --git a/packages/base/src/page/DataSource/components/List/ConnectionResultColumn.tsx b/packages/base/src/page/DataSource/components/List/ConnectionResultColumn.tsx
index 4a94e60dc..44a1621ad 100644
--- a/packages/base/src/page/DataSource/components/List/ConnectionResultColumn.tsx
+++ b/packages/base/src/page/DataSource/components/List/ConnectionResultColumn.tsx
@@ -1,7 +1,7 @@
import { useTranslation } from 'react-i18next';
import { BasicTag, BasicToolTips } from '@actiontech/shared';
import { formatTime } from '@actiontech/shared/lib/utils/Common';
-import { Space, Tag, Typography } from 'antd';
+import { Space, Typography } from 'antd';
import { ListDBServiceLastConnectionTestStatusEnum } from '@actiontech/shared/lib/api/base/service/common.enum';
type Props = {
diff --git a/packages/sqle/src/locale/zh-CN/execWorkflow.ts b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
index c40dbeb3e..e5f6b47e1 100644
--- a/packages/sqle/src/locale/zh-CN/execWorkflow.ts
+++ b/packages/sqle/src/locale/zh-CN/execWorkflow.ts
@@ -267,7 +267,9 @@ export default {
execStatus: '执行状态',
remark: '备注',
addRemark: '添加备注',
- originSql: '原始SQL'
+ originSql: '原始SQL',
+ rollbackOrder: '回滚次序',
+ sourceOrder: '原始次序'
},
associatedRollbackWorkflow: '关联回滚工单'
},
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx
index c62256f9a..a208b1c23 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx
@@ -11,7 +11,7 @@ import task from '@actiontech/shared/lib/api/sqle/service/task';
import { ResponseCode } from '@actiontech/shared/lib/enum';
import { useBoolean } from 'ahooks';
import { Divider, Space, Spin, message } from 'antd';
-import { useState } from 'react';
+import { useState, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { getAuditTaskSQLsV2FilterExecStatusEnum } from '@actiontech/shared/lib/api/sqle/service/task/index.enum';
import { SqlExecuteResultCardProps } from './index.type';
@@ -29,6 +29,7 @@ import { BackupStrategyDictionary } from '../../../../../../Common/AuditResultLi
import { UpdateSqlBackupStrategyReqStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
import { WarningFilled } from '@actiontech/icons';
import RollbackWorkflowEntry from './components/RollbackWorkflowEntry';
+import { formatterSQL } from '@actiontech/shared/lib/utils/FormatterSQL';
const SqlMode: React.FC = ({
projectID,
@@ -83,6 +84,10 @@ const SqlMode: React.FC = ({
});
};
+ const formattedRollbackSql = useMemo(() => {
+ return props.rollback_sqls?.map((v) => formatterSQL(v))?.join('\n');
+ }, [props.rollback_sqls]);
+
return (
{contextHolder}
@@ -132,7 +137,10 @@ const SqlMode: React.FC = ({
value: TaskResultContentTypeEnum.rollback_sql,
label: t('execWorkflow.audit.table.rollback'),
children: (
-
+
{/* #if [ee] */}
@@ -140,9 +148,7 @@ const SqlMode: React.FC = ({
{props.backup_strategy_tip}
- {/* #endif */}
-
- {/* #if [ee] */}
+
= ({
{t('execWorkflow.audit.table.backupConflictTips')}
-
- {/* #endif */}
-
+ /> */}
+ {/* todo 等后端补充 备份结果字段 */}
+ {/* #endif */}
+
)
},
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/style.ts
index 915ad4c1a..2671aa5c9 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/style.ts
@@ -62,14 +62,11 @@ export const TasksResultCardStyleWrapper = styled('div')`
}
}
- .result-card-content-rollback {
- display: flex !important;
+ .rollback-sql-container {
width: 100%;
- align-items: start;
- .ant-space-item:last-of-type {
- flex: 1;
- overflow: hidden;
+ .ant-tag {
+ width: max-content;
}
}
}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedRollbackWorkflows.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedRollbackWorkflows.tsx
index 2a3ba18b8..9ae4daa9d 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedRollbackWorkflows.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/components/AssociatedRollbackWorkflows.tsx
@@ -22,7 +22,7 @@ const AssociatedRollbackWorkflows: React.FC<
children: (
= ({
associatedWorkflows={workflowInfo?.associated_stage_workflows}
/>
-
+ {/* #if [ee] */}
-
+ {/* #endif */}
ActiontechTableColumn<
dataIndex: 'instance_name',
title: t('execWorkflow.detail.rollback.instance'),
filterCustomType: 'select',
- filterKey: 'filter_instance_id'
+ filterKey: 'filter_instance_id',
+ width: 120
},
{
dataIndex: 'exec_status',
title: t('execWorkflow.detail.rollback.execStatus'),
filterCustomType: 'select',
filterKey: 'filter_exec_status',
+ width: 100,
render: (status) => {
return (
= ({
const selected = selectedList.filter((i) => {
return !moveKeys.includes(i.id ?? '');
});
+
const clonedData = cloneDeep(data?.list ?? []);
clonedData.forEach((i) => {
if (moveKeys.includes(i.id ?? '')) {
@@ -142,7 +143,20 @@ const SqlRollback: React.FC = ({
selected.push(dataSource);
}
});
- setSelectedList(selectedList.concat(selected));
+ const taskSqlGroup = groupBy(
+ selectedList.concat(selected),
+ 'origin_task_id'
+ );
+ let sortedTaskSql: ExpandedBackupSqlType[] = [];
+ Object.keys(taskSqlGroup).forEach((key) => {
+ sortedTaskSql = [
+ ...sortedTaskSql,
+ ...taskSqlGroup[key]
+ .sort((a, b) => (b?.exec_order ?? 0) - (a?.exec_order ?? 0))
+ .map((item, index) => ({ ...item, rollbackOrder: index + 1 }))
+ ];
+ });
+ setSelectedList(sortedTaskSql);
mutate({
list: clonedData,
total: data?.total ?? 0
@@ -209,14 +223,15 @@ const SqlRollback: React.FC = ({
taskIds.forEach((id, index) => {
let sqlFormData = '';
- const sortedBackupSqlList = taskSqlGroup[id].sort(
- (a, b) => (a.exec_order ?? 0) - (b.exec_order ?? 0)
- );
- sortedBackupSqlList.forEach((item) => {
+ taskSqlGroup[id]?.forEach((item) => {
let backupSqlStatement = '';
- backupSqlStatement += `/*${t(
+ backupSqlStatement += `/*\n${t(
+ 'execWorkflow.detail.rollback.rollbackOrder'
+ )}: ${item.rollbackOrder}\n${t(
+ 'execWorkflow.detail.rollback.sourceOrder'
+ )}: ${item.exec_order}\n${t(
'execWorkflow.detail.rollback.originSql'
- )}: ${removeMultilineComments(item.origin_sql ?? '')}*/ \n`;
+ )}: ${removeMultilineComments(item.origin_sql ?? '')}\n*/\n`;
item.backup_sqls?.forEach((i) => (backupSqlStatement += `${i}\n`));
sqlFormData += backupSqlStatement;
});
@@ -227,7 +242,9 @@ const SqlRollback: React.FC = ({
});
dispatch(
updateClonedExecWorkflowBaseInfo({
- workflow_subject: `${workflowInfo?.workflow_name}_Rollback`,
+ workflow_subject: `${workflowInfo?.workflow_name}_Rollback_${
+ (workflowInfo?.associated_rollback_workflows?.length ?? 0) + 1
+ }`,
desc: description
})
);
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts
index 48274d1e1..c66d39d0c 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.type.ts
@@ -21,6 +21,7 @@ export type ExpandedBackupSqlType = IBackupSqlData & {
id?: string;
disabled?: boolean;
remark?: string;
+ rollbackOrder?: number;
};
export type TableRowSelection = TableProps['rowSelection'];
From feb671616c60fd16d018a80a570a31daa21a9a5e Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Thu, 28 Nov 2024 16:38:56 +0800
Subject: [PATCH 18/20] [test](SqlExecWorkflow): Update unit testing
---
.../__snapshots__/FileMode.test.tsx.snap | 8 +-
.../__snapshots__/SqlMode.ce.test.tsx.snap | 42 +-
.../__snapshots__/SqlMode.test.tsx.snap | 319 ++++----
.../__snapshots__/index.test.tsx.snap | 12 +-
.../__snapshots__/index.test.tsx.snap | 2 +-
.../__snapshots__/index.test.tsx.snap | 12 +-
.../__snapshots__/index.test.tsx.snap | 4 +-
.../__snapshots__/index.test.tsx.snap | 4 +-
.../AssociatedRollbackWorkflows.test.tsx.snap | 4 +-
.../__snapshots__/index.ce.test.tsx.snap | 697 ++++++++++++++++++
.../__snapshots__/index.test.tsx.snap | 4 +-
.../RecordInfo/__tests__/index.ce.test.tsx | 45 ++
.../__snapshots__/index.test.tsx.snap | 28 +-
.../SqlRollback/__tests__/index.test.tsx | 16 +-
.../__snapshots__/index.test.tsx.snap | 130 +++-
15 files changed, 1086 insertions(+), 241 deletions(-)
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/__tests__/__snapshots__/index.ce.test.tsx.snap
create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/__tests__/index.ce.test.tsx
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/FileMode.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/FileMode.test.tsx.snap
index 62363c9a4..1621ad9f7 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/FileMode.test.tsx.snap
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/FileMode.test.tsx.snap
@@ -3,7 +3,7 @@
exports[`test TaskResultList/Result/FileMode should match snapshot 1`] = `