Skip to content

Commit 50a9f05

Browse files
committed
feat: create table
1 parent 4ad3c9a commit 50a9f05

9 files changed

Lines changed: 110 additions & 45 deletions

File tree

chat2db-client/src/blocks/DatabaseTableEditor/index.tsx

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import classnames from 'classnames';
55
import IndexList, { IIndexListRef } from './IndexList';
66
import ColumnList, { IColumnListRef } from './ColumnList';
77
import BaseInfo, { IBaseInfoRef } from './BaseInfo';
8-
import sqlService from '@/service/sql';
8+
import sqlService, { IModifyTableSqlParams } from '@/service/sql';
99
import { IEditTableInfo } from '@/typings';
1010

1111
interface IProps {
1212
dataSourceId: number,
1313
databaseName: string,
1414
schemaName: string | undefined,
15-
tableName: string
15+
tableName?: string
1616
}
1717

1818
interface ITabItem {
@@ -56,24 +56,26 @@ export default memo<IProps>(function DatabaseTableEditor(props) {
5656
},
5757
]
5858
}, [])
59-
const [currentTab, setCurrentTab] = useState<ITabItem>(tabList[1]);
59+
const [currentTab, setCurrentTab] = useState<ITabItem>(tabList[0]);
6060

6161
function changeTab(item: ITabItem) {
6262
setCurrentTab(item)
6363
}
6464

6565
useEffect(() => {
66-
let params = {
67-
databaseName,
68-
dataSourceId,
69-
tableName,
70-
schemaName,
71-
refresh: true
66+
if (tableName) {
67+
let params = {
68+
databaseName,
69+
dataSourceId,
70+
tableName,
71+
schemaName,
72+
refresh: true
73+
}
74+
sqlService.getTableDetails(params).then(res => {
75+
setTableDetails(res || {})
76+
setOldTableDetails(res)
77+
})
7278
}
73-
sqlService.getTableDetails(params).then(res => {
74-
setTableDetails(res || {})
75-
setOldTableDetails(res)
76-
})
7779
}, [])
7880

7981
function submit() {
@@ -83,14 +85,18 @@ export default memo<IProps>(function DatabaseTableEditor(props) {
8385
columnList: columnListRef.current.getColumnListInfo()!,
8486
indexList: indexListRef.current.getIndexListInfo()!
8587
}
86-
let params = {
88+
89+
let params: IModifyTableSqlParams = {
8790
databaseName,
8891
dataSourceId,
89-
tableName,
9092
schemaName,
9193
refresh: true,
9294
newTable: JSON.stringify(newTable),
93-
oldTable: JSON.stringify(oldTableDetails)
95+
}
96+
97+
if (tableName) {
98+
params.tableName = tableName;
99+
params.oldTable = JSON.stringify(oldTableDetails);
94100
}
95101
console.log(newTable);
96102
sqlService.getModifyTableSql(params).then(res => {

chat2db-client/src/components/TabsNew/index.tsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ interface IProps {
1919
className?: string;
2020
items: ITabItem[] | undefined;
2121
activeKey?: number | string;
22-
onChange?: (key: ITabItem['key']) => void;
22+
onChange?: (key: string | number | undefined) => void;
2323
onEdit?: (action: 'add' | 'remove', data?: ITabItem) => void;
2424
hideAdd?: boolean;
2525
type?: 'line';
@@ -34,8 +34,7 @@ export default memo<IProps>(function Tabs(props) {
3434
const [editingTab, setEditingTab] = useState<ITabItem['key'] | undefined>();
3535

3636
useEffect(() => {
37-
// 这里如果id为0就会有问题等待改造
38-
if (activeKey) {
37+
if (activeKey !== null && activeKey !== undefined) {
3938
setInternalActiveTab(activeKey);
4039
}
4140
}, [activeKey])
@@ -59,14 +58,14 @@ export default memo<IProps>(function Tabs(props) {
5958
activeKey = internalTabs[index - 1]?.key
6059
}
6160
}
62-
setInternalActiveTab(activeKey);
61+
changeTab(activeKey);
6362
setInternalTabs(newInternalTabs);
6463
onEdit?.('remove', data)
6564
}
6665

67-
function changeTab(data: ITabItem) {
68-
setInternalActiveTab(data.key);
69-
onChange?.(data.key);
66+
function changeTab(key: string | number | undefined) {
67+
setInternalActiveTab(key);
68+
onChange?.(key);
7069
}
7170

7271
function handelAdd() {
@@ -106,7 +105,7 @@ export default memo<IProps>(function Tabs(props) {
106105
t.key === editingTab ?
107106
<input value={t.label as string} onChange={(e) => { inputOnChange(e.target.value) }} className={styles.input} autoFocus onBlur={onBlur} type="text" />
108107
:
109-
<div className={styles.textBox} key={t.key} onClick={changeTab.bind(null, t)}>
108+
<div className={styles.textBox} key={t.key} onClick={changeTab.bind(null, t.key)}>
110109
{t.prefixIcon && <Iconfont className={styles.prefixIcon} code={t.prefixIcon} />}
111110
<div className={styles.text}>
112111
{t.label}

chat2db-client/src/pages/main/workspace/components/SaveList/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ const SaveList = dvaModel(function (props: any) {
5454
});
5555
}, [curWorkspaceParams]);
5656

57-
5857
useEffect(() => {
5958
if (searching) {
6059
inputRef.current!.focus({

chat2db-client/src/pages/main/workspace/components/TableList/index.less

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,15 @@
2525
.iconBox {
2626
display: flex;
2727
align-items: center;
28+
margin: 0px -5px;
29+
}
30+
.itemIcon {
31+
margin: 0px 5px;
2832
}
2933
.refreshIcon {
30-
margin-right: 10px;
34+
}
35+
.moreIcon {
36+
transform: rotate(90deg);
3137
}
3238
.refreshIcon,
3339
.searchIcon {
@@ -49,16 +55,16 @@
4955
margin: 0px -10px;
5056
}
5157

52-
.refreshIconBox{
58+
.refreshIconBox {
5359
cursor: pointer;
54-
&:hover{
55-
color: var(--color-primary)
60+
&:hover {
61+
color: var(--color-primary);
5662
}
5763
}
5864

59-
.cascaderPopup{
60-
:global{
61-
.ant-cascader-menu{
65+
.cascaderPopup {
66+
:global {
67+
.ant-cascader-menu {
6268
height: auto;
6369
}
6470
}

chat2db-client/src/pages/main/workspace/components/TableList/index.tsx

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ import { IWorkspaceModelType } from '@/models/workspace';
1010
import Tree from '../Tree';
1111
import { treeConfig } from '../Tree/treeConfig';
1212
import { ITreeNode } from '@/typings';
13-
import { TreeNodeType } from '@/constants';
13+
import { TreeNodeType, CreateTabIntroType, WorkspaceTabType } from '@/constants';
1414
import styles from './index.less';
1515
import { approximateTreeNode } from '@/utils';
1616
import { useUpdateEffect } from '@/hooks/useUpdateEffect';
17+
import { v4 as uuidV4 } from 'uuid';
1718

1819
interface IOption {
1920
value: TreeNodeType;
@@ -32,12 +33,18 @@ const optionsList: IOption[] = [
3233
]
3334

3435
const dvaModel = connect(
35-
({ connection, workspace, loading }: { connection: IConnectionModelType; workspace: IWorkspaceModelType, loading: any }) => ({
36+
({ connection, workspace }: { connection: IConnectionModelType; workspace: IWorkspaceModelType }) => ({
3637
connectionModel: connection,
3738
workspaceModel: workspace,
3839
}),
3940
);
4041

42+
interface Option {
43+
value: string;
44+
label: string;
45+
children?: Option[];
46+
}
47+
4148
const TableList = dvaModel(function (props: any) {
4249
const { workspaceModel, dispatch } = props;
4350
const { curWorkspaceParams } = workspaceModel;
@@ -113,6 +120,27 @@ const TableList = dvaModel(function (props: any) {
113120
setCurType(selectedOptions[0]);
114121
}
115122

123+
const cascaderOnChange: any = (_: string[], selectedOptions: Option[]) => {
124+
dispatch({
125+
type: 'workspace/setCreateConsoleIntro',
126+
payload: {
127+
id: uuidV4(),
128+
type: WorkspaceTabType.EditTable,
129+
title: 'create-table',
130+
uniqueData: {
131+
132+
}
133+
},
134+
})
135+
};
136+
137+
const options = [
138+
{
139+
value: 'createTable',
140+
label: '新建表',
141+
}
142+
]
143+
116144
return (
117145
<div className={styles.tableModule}>
118146
<div className={styles.leftModuleTitle}>
@@ -143,20 +171,28 @@ const TableList = dvaModel(function (props: any) {
143171
</div>
144172
</Cascader>
145173
<div className={styles.iconBox} >
146-
<div className={styles.refreshIcon} onClick={() => refreshTableList()}>
174+
<div className={classnames(styles.refreshIcon, styles.itemIcon)} onClick={() => refreshTableList()}>
147175
<Iconfont code="&#xec08;" />
148176
</div>
149-
<div className={styles.searchIcon} onClick={() => openSearch()}>
177+
<div className={classnames(styles.searchIcon, styles.itemIcon)} onClick={() => openSearch()}>
150178
<Iconfont code="&#xe600;" />
151179
</div>
180+
{
181+
curType.value === TreeNodeType.TABLES &&
182+
<Cascader options={options} onChange={cascaderOnChange}>
183+
<div className={classnames(styles.moreIcon, styles.itemIcon)}>
184+
<Iconfont code="&#xe601;" />
185+
</div>
186+
</Cascader>
187+
}
152188
</div>
153189
</div>
154190
}
155191
</div>
156192
<LoadingContent className={styles.treeBox} isLoading={tableLoading}>
157193
<Tree className={styles.tree} initialData={searchedTableList || curList}></Tree>
158194
</LoadingContent>
159-
</div>
195+
</div >
160196
);
161197
});
162198

chat2db-client/src/pages/main/workspace/components/WorkspaceLeft/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ const WorkspaceLeft = memo<IProps>(function (props) {
3333
const addConsole = () => {
3434
const { dataSourceId, databaseName, schemaName, databaseType } = curWorkspaceParams
3535
let params = {
36-
name: `new console${openConsoleList?.length || ''}`,
36+
name: `new console`,
3737
ddl: '',
3838
dataSourceId: dataSourceId!,
3939
databaseName: databaseName!,

chat2db-client/src/pages/main/workspace/components/WorkspaceRightNew/index.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ const WorkspaceRight = memo<IProps>(function (props) {
6363
// 监听编辑表事件
6464
useEffect(() => {
6565
if (createTabIntro) {
66+
// 如果已经打开了这个表的编辑页面,那么就切换到这个页面
67+
const flag = workspaceTabList?.find(t => t.uniqueData?.tableName === createTabIntro.treeNodeData.name);
68+
if (flag) {
69+
setActiveConsoleId(flag.id);
70+
return
71+
}
72+
6673
const id = uuidV4();
6774
const newData = {
6875
id,
@@ -231,7 +238,12 @@ const WorkspaceRight = memo<IProps>(function (props) {
231238
});
232239
}
233240

234-
if (doubleClickTreeNodeData.treeNodeType === TreeNodeType.TABLE && !workspaceTabList?.length) {
241+
if (doubleClickTreeNodeData.treeNodeType === TreeNodeType.TABLE) {
242+
// 如果workspaceTabList没有可以添加select * from table的地方那么才需要创建
243+
const flag = workspaceTabList.some(t => [WorkspaceTabType.CONSOLE, WorkspaceTabType.FUNCTION, WorkspaceTabType.PROCEDURE, WorkspaceTabType.TRIGGER, WorkspaceTabType.VIEW].includes(t.type))
244+
if (flag) {
245+
return
246+
}
235247
const { extraParams } = doubleClickTreeNodeData;
236248
const { databaseName, schemaName, tableName, } = extraParams || {};
237249
const ddl = `SELECT * FROM ${tableName};\n`;
@@ -349,7 +361,7 @@ const WorkspaceRight = memo<IProps>(function (props) {
349361
}
350362

351363
// 切换tab
352-
function onTabChange(key: string | number) {
364+
function onTabChange(key: string | number | undefined) {
353365
setActiveConsoleId(key);
354366
}
355367

chat2db-client/src/service/sql.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,16 +194,18 @@ const getTableDetails = createRequest<{
194194
refresh: boolean;
195195
}, IEditTableInfo>('/api/rdb/table/query', { method: 'get' });
196196

197-
/** 数据库支持的数据类型 */
198-
const getModifyTableSql = createRequest<{
197+
export interface IModifyTableSqlParams {
199198
dataSourceId: number;
200199
databaseName: string;
201200
schemaName?: string;
202-
tableName: string;
203-
oldTable: string;
201+
tableName?: string;
202+
oldTable?: string;
204203
newTable: string;
205204
refresh: boolean;
206-
}, string>('/api/rdb/table/modify/sql', { method: 'post' });
205+
}
206+
207+
/** 数据库支持的数据类型 */
208+
const getModifyTableSql = createRequest<IModifyTableSqlParams, string>('/api/rdb/table/modify/sql', { method: 'post' });
207209

208210
export default {
209211
getModifyTableSql,

chat2db-client/src/styles/antd.less

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,10 @@
5656
// top: 10px !important;
5757
// }
5858
// }
59+
60+
.ant-cascader-dropdown .ant-cascader-menu {
61+
height: auto;
62+
max-height: 80vh;
63+
}
5964
}
6065
}

0 commit comments

Comments
 (0)