Skip to content

Commit dcde362

Browse files
committed
fix: deep-link export workflows into data masking approvals
Route Dashboard export entries to Approvals when an unmasking workflow exists; add DATA_MASKING route query support for workflowId.
1 parent 44a6b5d commit dcde362

6 files changed

Lines changed: 91 additions & 50 deletions

File tree

packages/dms-kit/src/data/routePaths.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,13 @@ export const ROUTE_PATHS = {
120120
query: OPEN_CLOUD_BEAVER_URL_PARAM_NAME
121121
}
122122
},
123+
DATA_MASKING: {
124+
index: {
125+
prefix: '/project',
126+
path: ':projectID/data-masking',
127+
query: 'active&dbServiceUid&maskingStatus&workflowId'
128+
}
129+
},
123130
RESOURCE_OVERVIEW: '/resource-overview',
124131
USER_ACTIVITY: '/user-activity',
125132
AVAILABILITY_ZONE: '/availability-zone'

packages/sqle/src/page/GlobalDashboard/__tests__/__snapshots__/index.sqle.test.tsx.snap

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -971,8 +971,7 @@ exports[`GlobalDashboard should render workflow tab by default 1`] = `
971971
class="ant-table-cell ellipsis-column-width"
972972
>
973973
<a
974-
href="/project/2/data/export/workflow-2"
975-
target="__blank"
974+
class="ant-typography"
976975
>
977976
Data Export Workflow
978977
</a>
@@ -1349,8 +1348,7 @@ exports[`GlobalDashboard should render workflow tab by default 1`] = `
13491348
class="ant-table-cell ellipsis-column-width"
13501349
>
13511350
<a
1352-
href="/project/2/data/export/workflow-5"
1353-
target="__blank"
1351+
class="ant-typography"
13541352
>
13551353
Workflow Exporting
13561354
</a>

packages/sqle/src/page/GlobalDashboard/components/WorkflowPanel/__tests__/__snapshots__/index.test.tsx.snap

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -726,8 +726,7 @@ exports[`GlobalDashboard/WorkflowPanel should render workflow panel and request
726726
class="ant-table-cell ellipsis-column-width"
727727
>
728728
<a
729-
href="/project/2/data/export/workflow-2"
730-
target="__blank"
729+
class="ant-typography"
731730
>
732731
Data Export Workflow
733732
</a>
@@ -1104,8 +1103,7 @@ exports[`GlobalDashboard/WorkflowPanel should render workflow panel and request
11041103
class="ant-table-cell ellipsis-column-width"
11051104
>
11061105
<a
1107-
href="/project/2/data/export/workflow-5"
1108-
target="__blank"
1106+
class="ant-typography"
11091107
>
11101108
Workflow Exporting
11111109
</a>

packages/sqle/src/page/GlobalDashboard/components/WorkflowPanel/__tests__/index.test.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ describe('GlobalDashboard/WorkflowPanel', () => {
2929
let getGlobalWorkflowStatisticsSpy: jest.SpyInstance;
3030
let getGlobalWorkflowListSpy: jest.SpyInstance;
3131
let getUserListSpy: jest.SpyInstance;
32+
let getDataExportWorkflowSpy: jest.SpyInstance;
3233

3334
beforeEach(() => {
3435
jest.useFakeTimers();
@@ -39,6 +40,7 @@ describe('GlobalDashboard/WorkflowPanel', () => {
3940
getGlobalWorkflowListSpy =
4041
sqleMockApi.globalDashboard.getGlobalWorkflowList();
4142
getUserListSpy = baseMockApi.userCenter.getUserList();
43+
getDataExportWorkflowSpy = baseMockApi.dataExport.GetDataExportWorkflow();
4244
});
4345

4446
afterEach(() => {
@@ -99,7 +101,9 @@ describe('GlobalDashboard/WorkflowPanel', () => {
99101
await act(async () => jest.advanceTimersByTime(3000));
100102

101103
fireEvent.click(screen.getAllByText('去处理')[1]);
104+
await act(async () => jest.advanceTimersByTime(3000));
102105

106+
expect(getDataExportWorkflowSpy).toHaveBeenCalled();
103107
expect(openSpy).toHaveBeenCalledWith(
104108
expect.stringContaining('/data/export/'),
105109
'_blank'

packages/sqle/src/page/GlobalDashboard/components/WorkflowPanel/column.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
ROUTE_PATHS
77
} from '@actiontech/dms-kit';
88
import { TypedLink } from '@actiontech/shared';
9+
import { Typography } from 'antd';
910
import { IGlobalWorkflowListItem } from '@actiontech/shared/lib/api/sqle/service/common';
1011
import { ActiontechTableColumn } from '@actiontech/dms-kit/es/components/ActiontechTable';
1112
import { GlobalDashboardWorkflowTableFilterParam } from './index.type';
@@ -122,7 +123,9 @@ const getWorkflowTypeColor = (
122123
return 'default';
123124
};
124125

125-
export const workflowPanelColumns = (): ActiontechTableColumn<
126+
export const workflowPanelColumns = (
127+
onOpenWorkflow?: (record: IGlobalWorkflowListItem) => void
128+
): ActiontechTableColumn<
126129
IGlobalWorkflowListItem,
127130
GlobalDashboardWorkflowTableFilterParam
128131
> => {
@@ -139,16 +142,14 @@ export const workflowPanelColumns = (): ActiontechTableColumn<
139142
GlobalWorkflowListItemWorkflowTypeEnum.data_export
140143
) {
141144
return (
142-
<TypedLink
143-
to={ROUTE_PATHS.BASE.DATA_EXPORT.detail}
144-
params={{
145-
projectID,
146-
workflowID: workflowId
145+
<Typography.Link
146+
onClick={(e) => {
147+
e.preventDefault();
148+
onOpenWorkflow?.(record);
147149
}}
148-
target="__blank"
149150
>
150151
{name}
151-
</TypedLink>
152+
</Typography.Link>
152153
);
153154
}
154155
return (

packages/sqle/src/page/GlobalDashboard/components/WorkflowPanel/index.tsx

Lines changed: 67 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {
3939
workflowFilterStatusOptions,
4040
workflowTypeLabelDictionary
4141
} from './data';
42+
import DataExportWorkflows from '@actiontech/shared/lib/api/base/service/DataExportWorkflows';
4243
import { UserService } from '@actiontech/shared/lib/api/base';
4344
import { DmsApi } from '@actiontech/shared/lib/api';
4445
import type { IOpsType } from '@actiontech/shared/lib/api/base/service/common';
@@ -47,6 +48,8 @@ import { useCurrentUser } from '@actiontech/shared/lib/features';
4748
import ExportGlobalWorkflowButton from './ExportGlobalWorkflowButton';
4849
// #endif
4950

51+
const DATA_MASKING_APPROVALS_TAB = 'Approvals';
52+
5053
type WorkflowPanelProps = {
5154
projectId?: string;
5255
instanceId?: string;
@@ -223,7 +226,70 @@ const WorkflowPanel: React.FC<WorkflowPanelProps> = ({
223226
[opsTypeList]
224227
);
225228

226-
const columns = useMemo(() => workflowPanelColumns(), []);
229+
const openWorkflow = useCallback(
230+
async (record: IGlobalWorkflowListItem) => {
231+
const projectID = record.project_uid?.trim();
232+
const workflowId = record.workflow_id?.trim();
233+
if (!projectID || !workflowId) {
234+
messageApi.warning(t('globalDashboard.common.missingProject'));
235+
return;
236+
}
237+
238+
if (
239+
record.workflow_type ===
240+
GlobalWorkflowListItemWorkflowTypeEnum.data_export
241+
) {
242+
try {
243+
const res = await DataExportWorkflows.GetDataExportWorkflow({
244+
project_uid: projectID,
245+
data_export_workflow_uid: workflowId
246+
});
247+
const unmaskingWorkflowUid =
248+
res?.data?.data?.unmasking_workflow?.unmasking_workflow_uid?.trim();
249+
if (
250+
res?.data?.code === ResponseCode.SUCCESS &&
251+
unmaskingWorkflowUid
252+
) {
253+
const approvalsPath = parse2ReactRouterPath(
254+
ROUTE_PATHS.BASE.DATA_MASKING.index,
255+
{
256+
params: { projectID },
257+
queries: {
258+
active: DATA_MASKING_APPROVALS_TAB,
259+
workflowId: unmaskingWorkflowUid
260+
}
261+
}
262+
);
263+
window.open(approvalsPath, '_blank');
264+
return;
265+
}
266+
} catch {
267+
// 解析失败时回落导出详情,避免阻断原有打开路径
268+
}
269+
270+
window.open(
271+
parse2ReactRouterPath(ROUTE_PATHS.BASE.DATA_EXPORT.detail, {
272+
params: { projectID, workflowID: workflowId }
273+
}),
274+
'_blank'
275+
);
276+
return;
277+
}
278+
279+
window.open(
280+
parse2ReactRouterPath(ROUTE_PATHS.SQLE.SQL_EXEC_WORKFLOW.detail, {
281+
params: { projectID, workflowId }
282+
}),
283+
'_blank'
284+
);
285+
},
286+
[t, messageApi]
287+
);
288+
289+
const columns = useMemo(
290+
() => workflowPanelColumns(openWorkflow),
291+
[openWorkflow]
292+
);
227293

228294
const { filterButtonMeta, filterContainerMeta, updateAllSelectedFilterItem } =
229295
useTableFilterContainer<
@@ -243,39 +309,6 @@ const WorkflowPanel: React.FC<WorkflowPanelProps> = ({
243309
[userOptions, opsTypeOptions]
244310
);
245311

246-
const openWorkflow = useCallback(
247-
(record: IGlobalWorkflowListItem) => {
248-
const getGlobalWorkflowDetailPath = (): string | null => {
249-
const projectID = record.project_uid?.trim();
250-
const workflowId = record.workflow_id?.trim();
251-
if (!projectID || !workflowId) {
252-
return null;
253-
}
254-
if (
255-
record.workflow_type ===
256-
GlobalWorkflowListItemWorkflowTypeEnum.data_export
257-
) {
258-
return parse2ReactRouterPath(ROUTE_PATHS.BASE.DATA_EXPORT.detail, {
259-
params: { projectID, workflowID: workflowId }
260-
});
261-
}
262-
return parse2ReactRouterPath(
263-
ROUTE_PATHS.SQLE.SQL_EXEC_WORKFLOW.detail,
264-
{
265-
params: { projectID, workflowId }
266-
}
267-
);
268-
};
269-
const path = getGlobalWorkflowDetailPath();
270-
if (!path) {
271-
messageApi.warning(t('globalDashboard.common.missingProject'));
272-
return;
273-
}
274-
window.open(path, '_blank');
275-
},
276-
[t, messageApi]
277-
);
278-
279312
const actions = useMemo(
280313
() => workflowPanelTableActions(workflowCard, openWorkflow),
281314
[workflowCard, openWorkflow]

0 commit comments

Comments
 (0)