Skip to content

Commit 5ad9cd5

Browse files
committed
feat: Added the ability to import data sources from Navciat and DBEver
1 parent ebbc1fd commit 5ad9cd5

3 files changed

Lines changed: 82 additions & 44 deletions

File tree

Lines changed: 59 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,82 @@
1-
import React from 'react';
1+
import React, { useEffect, useState } from 'react';
22
import { Modal, Upload, Button, message } from 'antd';
33
import { UploadOutlined } from '@ant-design/icons';
44

5-
interface FileUploadModalProps {
5+
const uploadFileType = {
6+
ncx: {
7+
accept: '.ncx',
8+
uploadUrl: '/api/converter/ncx/upload',
9+
},
10+
dbp: {
11+
accept: '.dbp',
12+
uploadUrl: '/api/converter/dbp/upload',
13+
},
14+
};
15+
interface IImportConnectionProps {
616
open: boolean;
717
onClose: () => void;
8-
onUploaded?: (file: File) => void;
918
onConfirm?: () => void;
1019
}
1120

12-
const FileUploadModal: React.FC<FileUploadModalProps> = ({ open, onClose, onUploaded, onConfirm }) => {
13-
const beforeUpload = (file: File) => {
14-
const fileName = file.name.toLowerCase();
15-
if (fileName.includes('navicat')) {
16-
message.success('Navicat file detected');
17-
onUploaded && onUploaded(file);
18-
} else if (fileName.includes('dbeaver')) {
19-
message.success('DBeaver file detected');
20-
onUploaded && onUploaded(file);
21-
} else if (fileName.includes('datagrip')) {
22-
message.success('DataGrip file detected');
23-
onUploaded && onUploaded(file);
24-
} else {
25-
message.error('File type not recognized');
26-
return false;
21+
const ImportConnection: React.FC<IImportConnectionProps> = ({ open, onClose, onConfirm }) => {
22+
const [selectedFile, setSelectedFile] = useState<File | null>(null);
23+
const [uploading, setUploading] = useState(false);
24+
25+
useEffect(() => {
26+
if (open) {
27+
setSelectedFile(null);
2728
}
28-
return false; // Prevent auto-upload for the sake of this demo
29+
}, [open]);
30+
31+
const handleBeforeUpload = (file: File) => {
32+
setSelectedFile(file);
33+
return false; // 停止自动上传
2934
};
3035

31-
const renderSelect = () => {
32-
// 下拉框 选择Navciat、dbever、datagrip
36+
const handleConfirmUpload = async () => {
37+
if (!selectedFile) return;
38+
39+
const formData = new FormData();
40+
formData.append('file', selectedFile);
41+
42+
const fileExtension = selectedFile.name.split('.').pop() || '';
43+
console.log('fileExtension', fileExtension);
44+
45+
const { uploadUrl } = uploadFileType[fileExtension] || {};
46+
47+
try {
48+
setUploading(true);
49+
50+
const response = await fetch(uploadUrl, {
51+
method: 'POST',
52+
body: formData,
53+
});
54+
if (response.ok) {
55+
message.success(`${selectedFile.name} 导入数据源成功`);
56+
onConfirm && onConfirm();
57+
} else {
58+
message.error(`${selectedFile.name} 导入数据源是吧`);
59+
}
60+
} catch (error) {
61+
message.error(`Error: ${error}`);
62+
} finally {
63+
setUploading(false);
64+
}
3365
};
66+
3467
return (
3568
<Modal
36-
title="Upload your file"
69+
title="导入文件, .ncx(navicat) 或 .dbp(dbever)"
3770
open={open}
3871
onCancel={onClose}
39-
onOk={onConfirm}
40-
footer={[
41-
<Button key="back" onClick={onClose}>
42-
Cancel
43-
</Button>,
44-
<Button key="submit" type="primary" onClick={onConfirm}>
45-
Confirm
46-
</Button>,
47-
]}
72+
onOk={handleConfirmUpload}
73+
confirmLoading={uploading}
4874
>
49-
<Upload
50-
action="/api/converter/ncx/upload"
51-
name="file"
52-
accept=".ncx"
53-
beforeUpload={beforeUpload}
54-
onChange={(info) => {
55-
console.log(info);
56-
}}
57-
>
75+
<Upload name="file" accept=".ncx,.dbp" beforeUpload={handleBeforeUpload} maxCount={1}>
5876
<Button icon={<UploadOutlined />}>Select File</Button>
5977
</Upload>
6078
</Modal>
6179
);
6280
};
6381

64-
export default FileUploadModal;
82+
export default ImportConnection;

chat2db-client/src/pages/main/connection/index.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,10 @@ function Connections(props: IProps) {
308308
onClose={() => {
309309
setIsFileUploadModalOpen(false);
310310
}}
311+
onConfirm={() => {
312+
setIsFileUploadModalOpen(false);
313+
handleEnvRefresh(ConnectionKind.Private);
314+
}}
311315
/>
312316
</>
313317
);

chat2db-client/src/service/connection.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,14 @@ const remove = createRequest<{ id: number }, void>('/api/connection/datasource/:
4242

4343
const clone = createRequest<{ id: number }, void>('/api/connection/datasource/clone', { method: 'post' });
4444

45-
const getDBList = createRequest<{ dataSourceId: number, refresh?: boolean }, any>('/api/rdb/database/list', { method: 'get' });
45+
const getDBList = createRequest<{ dataSourceId: number; refresh?: boolean }, any>('/api/rdb/database/list', {
46+
method: 'get',
47+
});
4648

47-
const getSchemaList = createRequest<{ dataSourceId: number, databaseName: string; refresh?: boolean }, any>('/api/rdb/schema/list', { method: 'get' });
49+
const getSchemaList = createRequest<{ dataSourceId: number; databaseName: string; refresh?: boolean }, any>(
50+
'/api/rdb/schema/list',
51+
{ method: 'get' },
52+
);
4853

4954
export interface IDriverResponse {
5055
driverConfigList: {
@@ -77,7 +82,17 @@ const downloadDriver = createRequest<{ dbType: string }, void>('/api/jdbc/driver
7782

7883
const saveDriver = createRequest<IUploadDriver, void>('/api/jdbc/driver/save', { errorLevel: false, method: 'post' });
7984

80-
const getEnvList = createRequest<void, IConnectionEnv[]>('/api/common/environment/list_all', { errorLevel: false});
85+
const getEnvList = createRequest<void, IConnectionEnv[]>('/api/common/environment/list_all', { errorLevel: false });
86+
87+
/** 导入Navicat链接 */
88+
// const importNavicatConnection = createRequest<
89+
// {
90+
// formData: FormData;
91+
// },
92+
// void
93+
// >('/api/converter/ncx/upload', {
94+
// method: 'post',
95+
// });
8196

8297
export default {
8398
getEnvList,
@@ -95,4 +110,5 @@ export default {
95110
getDriverList,
96111
downloadDriver,
97112
saveDriver,
113+
// importNavicatConnection,
98114
};

0 commit comments

Comments
 (0)