Skip to content

Commit

Permalink
Merge pull request #930 from chat2db/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
shanhexi committed Dec 7, 2023
2 parents e93e54b + 4b11dd8 commit 32e5698
Show file tree
Hide file tree
Showing 12 changed files with 914 additions and 303 deletions.
2 changes: 1 addition & 1 deletion chat2db-client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"@dnd-kit/modifiers": "^6.0.1",
"ahooks": "^3.7.8",
"ali-react-table": "^2.6.1",
"antd": "^5.6.0",
"antd": "^5.12.1",
"copy-to-clipboard": "^3.3.3",
"echarts": "^5.4.2",
"echarts-for-react": "^3.0.2",
Expand Down
298 changes: 297 additions & 1 deletion chat2db-client/src/blocks/Tree/hooks/useGetRightClickMenu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,11 @@ export const useGetRightClickMenu = (props: IProps) => {
type: WorkspaceTabType.ViewAllTable,
title: `${treeNodeData.extraParams!.databaseName!}-tables`,
uniqueData: {

dataSourceId: treeNodeData.extraParams!.dataSourceId!,
dataSourceName: treeNodeData.extraParams!.dataSourceName!,
databaseType: treeNodeData.extraParams!.databaseType!,
databaseName: treeNodeData.extraParams?.databaseName,
schemaName: treeNodeData.extraParams?.schemaName,
},
})

Expand Down Expand Up @@ -343,3 +347,295 @@ export const useGetRightClickMenu = (props: IProps) => {

return rightClickMenu;
};

export const getRightClickMenu = (props: IProps) => {
const { treeNodeData, loadData } = props;

const openCreateDatabaseModal = useWorkspaceStore.getState().openCreateDatabaseModal;
const currentConnectionDetails = useWorkspaceStore.getState().currentConnectionDetails;

const handelOpenCreateDatabaseModal = (type: 'database' | 'schema') => {

const relyOnParams = {
databaseType: treeNodeData.extraParams!.databaseType,
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
databaseName: treeNodeData.name,
}

openCreateDatabaseModal?.({
type,
relyOnParams,
executedCallback: () => {
loadData({
refresh: true,
});
},
});
};

// 拿出当前节点的配置
const treeNodeConfig: ITreeConfigItem = treeConfig[treeNodeData.treeNodeType];
const { operationColumn } = treeNodeConfig;

const dataSourceFormConfig = dataSourceFormConfigs.find((t: IConnectionConfig) => {
return t.type === treeNodeData.extraParams?.databaseType;
})!;

// 有些数据库不支持的操作,需要排除掉
function excludeSomeOperation() {
const excludes = dataSourceFormConfig.baseInfo.excludes;
const newOperationColumn: OperationColumn[] = [];
operationColumn?.map((item: OperationColumn) => {
let flag = false;
excludes?.map((t) => {
if (item === t) {
flag = true;
}
});
if (!flag) {
newOperationColumn.push(item);
}
});
return newOperationColumn;
}

const operationColumnConfig: { [key in string]: IOperationColumnConfigItem } = {
// 刷新
[OperationColumn.Refresh]: {
text: i18n('common.button.refresh'),
icon: '\uec08',
handle: () => {
treeNodeData.loadData?.({
refresh: true,
});
},
},

// 创建console
[OperationColumn.CreateConsole]: {
text: i18n('workspace.menu.queryConsole'),
icon: '\ue619',
handle: () => {
createConsole({
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
dataSourceName: treeNodeData.extraParams!.dataSourceName!,
databaseType: treeNodeData.extraParams!.databaseType!,
databaseName: treeNodeData.extraParams?.databaseName,
schemaName: treeNodeData.extraParams?.schemaName,
});
},
},

// 查看所有表
[OperationColumn.ViewAllTable]: {
text: i18n('workspace.menu.viewAllTable'),
icon: '\ue611',
handle: () => {
addWorkspaceTab({
id: uuid(),
type: WorkspaceTabType.ViewAllTable,
title: `${treeNodeData.extraParams!.databaseName!}-tables`,
uniqueData: {
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
dataSourceName: treeNodeData.extraParams!.dataSourceName!,
databaseType: treeNodeData.extraParams!.databaseType!,
databaseName: treeNodeData.extraParams?.databaseName,
schemaName: treeNodeData.extraParams?.schemaName,
},
})

},
},

// 创建表
[OperationColumn.CreateTable]: {
text: i18n('editTable.button.createTable'),
icon: '\ue792',
handle: () => {
addWorkspaceTab({
id: uuid(),
title: i18n('editTable.button.createTable'),
type: WorkspaceTabType.CreateTable,
uniqueData: {
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
databaseType: treeNodeData.extraParams!.databaseType!,
databaseName: treeNodeData.extraParams?.databaseName,
schemaName: treeNodeData.extraParams?.schemaName,
submitCallback: () => {treeNodeData.loadData?.({refresh: true})},
},
});
},
discard: (treeNodeData.treeNodeType === TreeNodeType.DATABASE && currentConnectionDetails?.supportSchema),
},

// 删除表
[OperationColumn.DeleteTable]: {
text: i18n('workspace.menu.deleteTable'),
icon: '\ue6a7',
handle: () => {
deleteTable(treeNodeData);
},
},

// 查看ddl
[OperationColumn.ViewDDL]: {
text: i18n('workspace.menu.ViewDDL'),
icon: '\ue665',
handle: () => {
viewDDL(treeNodeData)
},
},

// 置顶
[OperationColumn.Pin]: {
text: treeNodeData.pinned ? i18n('workspace.menu.unPin') : i18n('workspace.menu.pin'),
icon: treeNodeData.pinned ? '\ue61d' : '\ue627',
handle: () => {
handelPinTable({treeNodeData, loadData: treeNodeData.parentNode!.loadData!});
},
},

// 编辑表
[OperationColumn.EditTable]: {
text: i18n('workspace.menu.editTable'),
icon: '\ue602',
handle: () => {
addWorkspaceTab({
id: `${OperationColumn.EditTable}-${treeNodeData.uuid}`,
title: treeNodeData?.name,
type: WorkspaceTabType.EditTable,
uniqueData: {
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
databaseType: treeNodeData.extraParams!.databaseType!,
databaseName: treeNodeData.extraParams?.databaseName,
schemaName: treeNodeData.extraParams?.schemaName,
tableName: treeNodeData?.name,
submitCallback: () => {treeNodeData.parentNode?.loadData?.({refresh: true})},
},
});
},
},

// 复制名称
[OperationColumn.CopyName]: {
text: i18n('common.button.copyName'),
icon: '\uec7a',
handle: () => {
navigator.clipboard.writeText(treeNodeData.name);
},
},

// 打开表
[OperationColumn.OpenTable]: {
text: i18n('workspace.menu.openTable'),
icon: '\ue618',
doubleClickTrigger: true,
handle: () => {
const databaseName = compatibleDataBaseName(treeNodeData.name!, treeNodeData.extraParams!.databaseType);
addWorkspaceTab({
id: `${OperationColumn.OpenTable}-${treeNodeData.uuid}`,
title: treeNodeData.name,
type: WorkspaceTabType.EditTableData,
uniqueData: {
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
databaseType: treeNodeData.extraParams!.databaseType!,
databaseName: treeNodeData.extraParams?.databaseName,
schemaName: treeNodeData.extraParams?.schemaName,
tableName: treeNodeData.name,
sql: 'select * from ' + databaseName,
},
});
},
},

// 打开视图
[OperationColumn.OpenView]: {
text: i18n('workspace.menu.view'),
icon: '\ue651',
doubleClickTrigger: true,
handle: () => {
openView({
addWorkspaceTab,
treeNodeData,
});
},
},

// 打开函数
[OperationColumn.OpenFunction]: {
text: i18n('workspace.menu.view'),
icon: '\ue651',
doubleClickTrigger: true,
handle: () => {
openFunction({
addWorkspaceTab,
treeNodeData,
});
},
},

// 打开存储过程
[OperationColumn.OpenProcedure]: {
text: i18n('workspace.menu.view'),
icon: '\ue651',
doubleClickTrigger: true,
handle: () => {
openProcedure({
addWorkspaceTab,
treeNodeData,
});
},
},

// 打开触发器
[OperationColumn.OpenTrigger]: {
text: i18n('workspace.menu.view'),
icon: '\ue651',
doubleClickTrigger: true,
handle: () => {
openTrigger({
addWorkspaceTab,
treeNodeData,
});
},
},

// 创建数据库
[OperationColumn.CreateDatabase]: {
text: i18n('workspace.menu.createDatabase'),
icon: '\ue816',
handle: () => {
handelOpenCreateDatabaseModal('database');
},
},

// 创建schema
[OperationColumn.CreateSchema]: {
text: i18n('workspace.menu.createSchema'),
icon: '\ue696',
handle: () => {
handelOpenCreateDatabaseModal('schema');
},
discard: !currentConnectionDetails?.supportSchema,
},
};

// 根据配置生成右键菜单
const finalList: IRightClickMenu[] = [];
excludeSomeOperation().forEach((t,i) => {
const concrete = operationColumnConfig[t];
if (!concrete.discard) {
finalList.push({
key: i,
onClick: concrete?.handle,
type: t,
doubleClickTrigger: concrete.doubleClickTrigger,
labelProps: {
icon: concrete?.icon,
label: concrete?.text,
},
});
}
});
return finalList;
};
34 changes: 13 additions & 21 deletions chat2db-client/src/blocks/Tree/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,10 @@ const TreeNode = memo((props: TreeNodeIProps) => {
.then((res: any) => {
if (res.length || res.data) {
setTimeout(() => {
console.log(res);
if (res.data) {
// res.data每次只插入50条数据,间隔50ms
const count = res.data.length / 50;
for (let i = 0; i < count; i++) {
for (let i = 0; i <= count; i++) {
setTimeout(() => {
setTreeNodeData({
...treeNodeData,
Expand All @@ -101,12 +100,6 @@ const TreeNode = memo((props: TreeNodeIProps) => {
});
}, 100 * i);
}

// setTreeNodeData({
// ...treeNodeData,
// children: res.data,
// total: res.total,
// });
} else {
setTreeNodeData({
...treeNodeData,
Expand Down Expand Up @@ -152,9 +145,7 @@ const TreeNode = memo((props: TreeNodeIProps) => {
}, [searchValue]);

useEffect(() => {
if (showTreeNode) {
_setShowParentNode?.(true);
}
_setShowParentNode?.(showTreeNode);
}, [showTreeNode]);

useEffect(() => {
Expand Down Expand Up @@ -199,7 +190,17 @@ const TreeNode = memo((props: TreeNodeIProps) => {

// 双击节点
const handelDoubleClickTreeNode = () => {
rightClickMenu.find((item) => item.doubleClickTrigger)?.onClick(treeNodeData);
if (
treeNodeData.treeNodeType === TreeNodeType.TABLE ||
treeNodeData.treeNodeType === TreeNodeType.VIEW ||
treeNodeData.treeNodeType === TreeNodeType.PROCEDURE ||
treeNodeData.treeNodeType === TreeNodeType.FUNCTION ||
treeNodeData.treeNodeType === TreeNodeType.TRIGGER
) {
rightClickMenu.find((item) => item.doubleClickTrigger)?.onClick(treeNodeData);
} else {
handleClick();
}
};

// 递归渲染
Expand Down Expand Up @@ -295,16 +296,7 @@ const TreeNode = memo((props: TreeNodeIProps) => {
);
}, [isFocus, isLoading, rightClickMenu]);

// const sectionHeight = useMemo(() => {
// if (treeNodeData.total && treeNodeData.children) {
// return `${treeNodeData.total * 26}px`;
// } else {
// return 'auto';
// }
// }, [treeNodeData.total, treeNodeData.children]);

return (
// style={{ height: sectionHeight }}
<div>
{(showTreeNode || showParentNode) && treeNodeDom}
{treeNodes}
Expand Down
2 changes: 1 addition & 1 deletion chat2db-client/src/blocks/Tree/treeConfig.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ export const treeConfig: { [key in TreeNodeType]: ITreeConfigItem } = {
},
operationColumn: [
OperationColumn.CreateConsole,
// OperationColumn.ViewAllTable,
OperationColumn.ViewAllTable,
OperationColumn.CreateTable,
OperationColumn.Refresh,
],
Expand Down

0 comments on commit 32e5698

Please sign in to comment.