fix(tabs): close dropped table tabs

This commit is contained in:
t8y2 committed 2026-07-04 12:21:44 +08:00
1 parent 90d2ede740
commit 32a9496d2a
4 files changed
+192

No files matched your search

@@ -602,6 +602,7 @@ async function confirmDrop() {
await api.executeQuery(props.connection.id, props.database, sql);
const successKey = row.type === "VIEW" ? "contextMenu.dropViewSuccess" : row.type === "PROCEDURE" ? "contextMenu.dropProcedureSuccess" : row.type === "FUNCTION" ? "contextMenu.dropFunctionSuccess" : "contextMenu.dropTableSuccess";
toast(t(successKey, { name: row.name }));
closeDroppedTableObjectTabsForRow(row);
await reload();
await connectionStore.refreshObjectListTreeNode(props.connection.id, props.database, row.schema || selectedSchema.value);
} catch (e: any) {
@@ -668,6 +669,25 @@ function openStructureEditor(row: ObjectBrowserRow) {
queryStore.openTableStructure(props.connection.id, props.database, row.schema || selectedSchema.value, row.name);
}
function droppedTableObjectTypeForRow(row: ObjectBrowserRow): "TABLE" | "VIEW" | "MATERIALIZED_VIEW" | null {
if (row.type === "TABLE") return "TABLE";
if (row.type === "VIEW") return "VIEW";
if (row.type === "MATERIALIZED_VIEW") return "MATERIALIZED_VIEW";
return null;
}
function closeDroppedTableObjectTabsForRow(row: ObjectBrowserRow) {
const objectType = droppedTableObjectTypeForRow(row);
if (!objectType) return;
queryStore.closeDroppedTableObjectTabs({
connectionId: props.connection.id,
database: props.database,
schema: row.schema || selectedSchema.value,
name: row.name,
objectType,
});
}
function openDiagram(row: ObjectBrowserRow) {
connectionStore.diagramSource = {
connectionId: props.connection.id,
@@ -796,6 +816,7 @@ async function confirmBatchDropTables() {
name: row.name,
});
await api.executeQuery(props.connection.id, props.database, sql);
closeDroppedTableObjectTabsForRow(row);
}
toast(t("objects.batchDropSuccess", { count: targets.length }));
clearTableSelection();
@@ -1963,6 +1963,28 @@ function canDropTreeNode(node: TreeNode): boolean {
return canDropTableChildObjectNode(node);
}
function droppedTableObjectTypeForNode(node: TreeNode): "TABLE" | "VIEW" | "MATERIALIZED_VIEW" | null {
if (node.type === "table") return "TABLE";
if (node.type === "view") return "VIEW";
if (node.type === "materialized_view") return "MATERIALIZED_VIEW";
return null;
}
function closeDroppedTableObjectTabsForNode(node: TreeNode) {
const objectType = droppedTableObjectTypeForNode(node);
if (!objectType || !node.connectionId || !node.database) return;
const config = connectionStore.getConfig(node.connectionId);
const dataTabSchema = connectionObjectTreeNodeSchema(config, node.database, node.schema);
queryStore.closeDroppedTableObjectTabs({
connectionId: node.connectionId,
database: node.database,
schema: dataTabSchema,
schemaCandidates: [node.schema, dataTabSchema],
name: node.label,
objectType,
});
}
function selectedBatchDropTargets(): TreeNode[] {
const selected = selectedTreeNodesInVisibleOrder();
if (selected.length <= 1 || !selected.some((node) => node.id === props.node.id)) return [];
@@ -2185,6 +2207,7 @@ async function confirmDropObject() {
await api.executeQuery(node.connectionId, node.database, sql, node.schema);
const msgKey = node.type === "view" ? "contextMenu.dropViewSuccess" : node.type === "materialized_view" ? "contextMenu.dropViewSuccess" : node.type === "procedure" ? "contextMenu.dropProcedureSuccess" : "contextMenu.dropFunctionSuccess";
toast(t(msgKey, { name: node.label }), 3000);
closeDroppedTableObjectTabsForNode(node);
if (node.type === "view" || node.type === "materialized_view") {
connectionStore.removeTreeNode(node.id);
} else {
@@ -2247,6 +2270,7 @@ async function confirmBatchDrop() {
const sql = await dropSqlForTreeNode(target);
if (!sql) continue;
await api.executeQuery(target.connectionId, target.database, sql, target.schema);
closeDroppedTableObjectTabsForNode(target);
connectionStore.removeTreeNode(target.id);
}
toast(t("contextMenu.batchDropSuccess", { count: targets.length }), 3000);
@@ -2390,6 +2414,7 @@ async function confirmDropTable() {
const sql = dropTablePreviewSql.value || (await buildDropTableSql(tableAdminSqlOptions()));
await api.executeQuery(node.connectionId, node.database, sql, node.schema);
toast(t("contextMenu.dropTableSuccess", { name: node.label }), 3000);
closeDroppedTableObjectTabsForNode(node);
connectionStore.removeTreeNode(node.id);
} catch (e: any) {
toast(t("contextMenu.tableOperationFailed", { message: e?.message || String(e) }), 5000);