forked from dbeaver/cloudbeaver
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathSqlAuditPanel.tsx
More file actions
126 lines (114 loc) · 3.7 KB
/
SqlAuditPanel.tsx
File metadata and controls
126 lines (114 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import { observer } from 'mobx-react-lite';
import { useState } from 'react';
import styled, { css } from 'reshadow';
import {
ExportOutlined,
} from '@ant-design/icons';
import {
Loader,
Pane,
ResizerControls,
Split,
splitStyles,
useSplitUserState,
Table,
TableBody,
TableColumnHeader,
TableHeader,
Textarea,
TextPlaceholder,
TableItem,
TableColumnValue
} from '@cloudbeaver/core-blocks';
import { useService } from '@cloudbeaver/core-di';
import type { IAuditTab, IExecutionPlanTab } from '../../ISqlEditorTabState';
import { SqlAuditService } from './SqlAuditService';
import { useSqlAuditState } from './SqlAuditState'
import { SqlAuditLevel } from './SqlAuditLevel'
const styles = css`
Pane:first-child {
overflow: hidden;
}
Split {
height: 100%;
}
ResizerControls {
height: 100%;
width: 2px;
}
Textarea > :global(textarea) {
border: none !important;
}
`;
interface Props {
auditTab: IAuditTab;
}
export const SqlAuditPanel = observer<Props>(function SqlAuditPanel({ auditTab }) {
const sqlAuditService = useService(SqlAuditService);
const data = sqlAuditService.auditData.get(auditTab.tabId);
const [selectedNode, setSelectedNode] = useState<number | null>(null);
const splitState = useSplitUserState('sql-audit');
if (!data || !data.taskInfo || !data.taskDesc || !data.taskDesc.length) {
return styled(
styles,
splitStyles,
)(
<TextPlaceholder>"no data"</TextPlaceholder>
)
}
const state = useSqlAuditState(data, setSelectedNode);
var number = 0
if (selectedNode) {
number = selectedNode - 1
}
const taskDesc = data.taskDesc[number];
console.log(taskDesc)
return styled(
styles,
splitStyles,
)(
<Split {...splitState} sticky={30} split="vertical" keepRatio>
<Pane>
{data && data.taskDesc && data.taskDesc.length ? (
<Table selectedItems={state.selectedNodes} onSelect={state.selectNode}>
<TableHeader fixed>
<TableColumnHeader>序号</TableColumnHeader>
<TableColumnHeader>审核等级</TableColumnHeader>
<TableColumnHeader>SQL</TableColumnHeader>
</TableHeader>
<TableBody>
{data.taskDesc.map(node => (
<TableItem item={node.number} selectOnItem>
<TableColumnValue align = "center">{node.number}</TableColumnValue>
<TableColumnValue align = "center"><SqlAuditLevel level = {node.audit_level}/></TableColumnValue>
<TableColumnValue>{node.exec_sql}</TableColumnValue>
</TableItem>
))}
</TableBody>
</Table>
) : (
<TextPlaceholder>"no data"</TextPlaceholder>
)}
</Pane>
<ResizerControls />
<Pane basis="30%" main>
<Table>
<TableHeader fixed>
<TableColumnHeader>等级</TableColumnHeader>
<TableColumnHeader>规则</TableColumnHeader>
<TableColumnHeader>知识库</TableColumnHeader>
</TableHeader>
<TableBody>
{taskDesc && taskDesc.audit_result && taskDesc.audit_result.map(node => (
<TableItem item="auditDesc" selectOnItem>
<TableColumnValue align = "center" ><SqlAuditLevel level = {node.level}/></TableColumnValue>
<TableColumnValue>{node.message}</TableColumnValue>
{ node.rule_name && <TableColumnValue onClick={ () =>(window.open("/sqle/rule/knowledge/"+ node.rule_name + "/"+ data.taskInfo?.instance_db_type))} ><ExportOutlined/></TableColumnValue> }
</TableItem>
))}
</TableBody>
</Table>
</Pane>
</Split>,
);
});