fix(tabs): hide database label for connection-only targets

This commit is contained in:
二丫讲梵
2026-09-23 14:43:43 +08:00
committed by GitHub
parent 13d2db6191
commit ebb2c1006e
4 changed files with 43 additions and 3 deletions
@@ -322,6 +322,24 @@ describe("tab group presentation", () => {
]);
});
it("omits the database row from tooltips for connections without a database target", () => {
const store = useConnectionStore();
store.sidebarLayout = {
groups: [],
order: [{ type: "connection", id: "conn-1" }],
};
for (const dbType of ["dynamodb", "elasticsearch", "easysearch", "meilisearch", "solr", "qdrant", "weaviate", "chromadb", "etcd", "zookeeper", "nacos", "consul", "mq", "mqtt", "victoriametrics"] as const) {
store.connections = [{ id: "conn-1", name: "Local", db_type: dbType, database: "default" } as ConnectionConfig];
const lines = tabTooltipLines(queryTab({ database: "default" }), translate);
expect(lines, dbType).toContainEqual({ label: "Connection:", value: "Local" });
expect(lines, dbType).toContainEqual({ label: "Group:", value: "Ungrouped" });
expect(lines, dbType).not.toContainEqual({ label: "Database:", value: "default" });
}
});
it("labels a top-level connection as ungrouped", () => {
const store = useConnectionStore();
store.connections = [{ id: "conn-1", name: "PostgreSQL", db_type: "postgres", database: "app" } as ConnectionConfig];
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
import type { ConnectionConfig } from "@/types/database";
import { connectionConfigFingerprint, databaseInfoCopyText, databaseInfoRows, isTauriCommandUnavailable, normalizeConnectionTestResult } from "@/lib/connection/connectionDatabaseInfo";
import { connectionConfigFingerprint, databaseInfoCopyText, databaseInfoRows, isTauriCommandUnavailable, normalizeConnectionTestResult, supportsConnectionDatabaseInfo } from "@/lib/connection/connectionDatabaseInfo";
function config(overrides: Partial<ConnectionConfig> = {}): ConnectionConfig {
return {
@@ -17,6 +17,15 @@ function config(overrides: Partial<ConnectionConfig> = {}): ConnectionConfig {
}
describe("connectionDatabaseInfo", () => {
it("hides database information for connections without database metadata", () => {
for (const dbType of ["dynamodb", "elasticsearch", "easysearch", "meilisearch", "solr", "qdrant", "weaviate", "chromadb", "etcd", "zookeeper", "nacos", "consul", "mq", "mqtt", "victoriametrics"] as const) {
expect(supportsConnectionDatabaseInfo(dbType)).toBe(false);
}
for (const dbType of ["mysql", "redis", "mongodb", "milvus", "turso", "cloudflare-d1", "plugin"] as const) {
expect(supportsConnectionDatabaseInfo(dbType)).toBe(true);
}
});
it("normalizes structured and legacy responses with a configured product fallback", () => {
expect(normalizeConnectionTestResult("Connection successful", config())).toEqual({
message: "Connection successful",
@@ -7,6 +7,14 @@ export interface DatabaseInfoRow {
value: string;
}
// These connections have no real database metadata. VictoriaMetrics exposes a
// configured label as a synthetic database node, not a server database.
const DATABASE_INFO_UNSUPPORTED_TYPES = new Set<ConnectionConfig["db_type"]>(["dynamodb", "elasticsearch", "easysearch", "meilisearch", "solr", "qdrant", "weaviate", "chromadb", "etcd", "zookeeper", "nacos", "consul", "mq", "mqtt", "victoriametrics"]);
export function supportsConnectionDatabaseInfo(dbType: ConnectionConfig["db_type"]): boolean {
return !DATABASE_INFO_UNSUPPORTED_TYPES.has(dbType);
}
const DATABASE_INFO_FIELDS: readonly DatabaseInfoField[] = ["productName", "productVersion", "currentDatabase", "serverComment", "serverCharset", "serverCollation", "unquotedIdentifierCase", "quotedIdentifierCase", "driverName", "driverVersion", "jdbcVersion"];
const IDENTIFIER_CASES = new Set<IdentifierCase>(["lower", "upper", "mixed"]);
+7 -2
View File
@@ -3,6 +3,7 @@ import { useSettingsStore } from "@/stores/settingsStore";
import { hexToRgba } from "@/lib/common/color";
import type { CSSProperties } from "vue";
import { findConnectionGroupPath } from "@/lib/sidebar/sidebarLayout";
import { supportsConnectionDatabaseInfo } from "@/lib/connection/connectionDatabaseInfo";
import { splitMongoCommandRanges } from "@/lib/mongo/mongoShellCommand";
import { executableStatementRanges, splitSqlStatementRanges, sqlStatementParameterOptionsForCompatibility, type SqlTextRange } from "@/lib/sql/sqlStatementRanges";
import type { SqlParameterOptions } from "@/lib/sql/sqlParameters";
@@ -259,8 +260,12 @@ export function tabDisplayTitle(tab: QueryTab, t: Translate): string {
export function tabTooltipLines(tab: QueryTab, t: Translate): { label: string; value: string }[] {
const connName = connectionDisplayName(tab.connectionId);
const groupName = connectionGroupDisplayName(tab.connectionId, t);
const database = databaseDisplayNameForTab(tab.connectionId, tab.database, t);
const lines: { label: string; value: string }[] = [{ label: t("tabs.tooltipConnection"), value: connName }, ...(groupName ? [{ label: t("tabs.tooltipGroup"), value: groupName }] : []), { label: t("tabs.tooltipDatabase"), value: database }];
const connection = useConnectionStore().getConfig(tab.connectionId);
const lines: { label: string; value: string }[] = [
{ label: t("tabs.tooltipConnection"), value: connName },
...(groupName ? [{ label: t("tabs.tooltipGroup"), value: groupName }] : []),
...(!connection || supportsConnectionDatabaseInfo(connection.db_type) ? [{ label: t("tabs.tooltipDatabase"), value: databaseDisplayNameForTab(tab.connectionId, tab.database, t) }] : []),
];
if (tab.mode === "query" && queryTitle(tab)) {
lines.unshift({ label: t("tabs.tooltipTitle"), value: tab.title });
}