fix(connection): move query timeout into per-connection settings

This commit is contained in:
t8y2 committed 2026-05-28 18:18:45 +08:00
1 parent 9f72c38253
commit 486d9bb3a6
20 files changed
+97 -60

No files matched your search

@@ -40,7 +40,7 @@ type DbOption = { value: string; label: string };
type DbCategory = { key: string; title: string; options: DbOption[] };
type DialogStep = "select" | "config";
type DbPickerView = "icon" | "list";
type ConfigTab = "connection" | "tls" | "ssh" | "proxy";
type ConfigTab = "connection" | "advanced" | "tls" | "ssh" | "proxy";
const { t } = useI18n();
const { toast } = useToast();
@@ -88,6 +88,7 @@ const defaultForm = (): Omit<ConnectionConfig, "id"> => ({
ssh_expose_lan: false,
ssh_connect_timeout_secs: 5,
connect_timeout_secs: 5,
query_timeout_secs: 30,
proxy_enabled: false,
proxy_type: "socks5",
proxy_host: "",
@@ -347,6 +348,7 @@ watch(
ssh_expose_lan: config.ssh_expose_lan || false,
ssh_connect_timeout_secs: config.ssh_connect_timeout_secs || 5,
connect_timeout_secs: config.connect_timeout_secs || 5,
query_timeout_secs: config.query_timeout_secs ?? 30,
proxy_enabled: config.proxy_enabled || false,
proxy_type: config.proxy_type || "socks5",
proxy_host: config.proxy_host || "",
@@ -741,6 +743,8 @@ function connectionConfigForSubmit(id: string): ConnectionConfig {
config.ssh_connect_timeout_secs = Number.isFinite(sshTimeout) && sshTimeout > 0 ? sshTimeout : 5;
const connectTimeout = Number(config.connect_timeout_secs);
config.connect_timeout_secs = Number.isFinite(connectTimeout) && connectTimeout > 0 ? connectTimeout : 5;
const queryTimeout = Number(config.query_timeout_secs);
config.query_timeout_secs = Number.isFinite(queryTimeout) && queryTimeout >= 0 ? queryTimeout : 30;
const proxyPort = Number(config.proxy_port);
config.proxy_port = Number.isFinite(proxyPort) && proxyPort > 0 ? proxyPort : 1080;
if (!config.one_time) config.one_time = undefined;
@@ -1440,15 +1444,13 @@ function openExternalUrl(url: string) {
<template v-else>
<div class="space-y-3">
<Tabs v-model="configTab" class="min-h-0">
<div
v-if="supportsTlsToggle || canUseSsh || canUseProxy"
class="flex items-center justify-between border-b pb-2"
>
<div class="flex items-center justify-between border-b pb-2">
<TabsList>
<TabsTrigger value="connection">{{ t("connection.basicTab") }}</TabsTrigger>
<TabsTrigger v-if="supportsTlsToggle" value="tls">{{ t("connection.tlsTab") }}</TabsTrigger>
<TabsTrigger v-if="canUseSsh" value="ssh">{{ t("connection.sshTunnel") }}</TabsTrigger>
<TabsTrigger v-if="canUseProxy" value="proxy">{{ t("connection.proxy") }}</TabsTrigger>
<TabsTrigger value="advanced">{{ t("connection.advancedTab") }}</TabsTrigger>
</TabsList>
</div>
@@ -2223,6 +2225,33 @@ function openExternalUrl(url: string) {
</div>
</TabsContent>
<TabsContent value="advanced" class="m-0">
<div class="grid gap-4 py-4 pr-2 max-h-[65vh] overflow-y-auto">
<div class="grid grid-cols-4 items-center gap-4">
<Label class="text-right text-xs">{{ t("connection.connectTimeout") }}</Label>
<Input
v-model.number="form.connect_timeout_secs"
type="number"
min="1"
max="300"
step="1"
class="col-span-3"
/>
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label class="text-right text-xs">{{ t("connection.queryTimeout") }}</Label>
<Input
v-model.number="form.query_timeout_secs"
type="number"
min="0"
max="300"
step="1"
class="col-span-3"
/>
</div>
</div>
</TabsContent>
<TabsContent v-if="canUseSsh" value="ssh" class="m-0">
<div class="grid gap-4 py-4 pr-2 max-h-[65vh] overflow-y-auto">
<div class="grid grid-cols-4 items-center gap-4">
@@ -2318,17 +2347,6 @@ function openExternalUrl(url: string) {
:disabled="!form.ssh_enabled"
/>
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label class="text-right text-xs">{{ t("connection.connectTimeout") }}</Label>
<Input
v-model.number="form.connect_timeout_secs"
type="number"
min="1"
max="300"
step="1"
class="col-span-3"
/>
</div>
</div>
</TabsContent>
@@ -96,7 +96,6 @@ const editShowTrayIcon = ref(settingsStore.desktopSettings.show_tray_icon);
const editShowColumnCommentsInHeader = ref(settingsStore.editorSettings.showColumnCommentsInHeader);
const editCompactColumnHeaderActions = ref(settingsStore.editorSettings.compactColumnHeaderActions);
const editRedisScanPageSize = ref(settingsStore.editorSettings.redisScanPageSize);
const editQueryTimeoutSecs = ref(settingsStore.editorSettings.queryTimeoutSecs);
const editShortcuts = ref(normalizeShortcutSettings(settingsStore.editorSettings.shortcuts));
const editSidebarActivation = ref(settingsStore.editorSettings.sidebarActivation);
const editAutoSelectActiveSidebarNode = ref(settingsStore.editorSettings.autoSelectActiveSidebarNode);
@@ -230,7 +229,6 @@ watch(
editShowColumnCommentsInHeader.value = settingsStore.editorSettings.showColumnCommentsInHeader;
editCompactColumnHeaderActions.value = settingsStore.editorSettings.compactColumnHeaderActions;
editRedisScanPageSize.value = settingsStore.editorSettings.redisScanPageSize;
editQueryTimeoutSecs.value = settingsStore.editorSettings.queryTimeoutSecs;
editShortcuts.value = normalizeShortcutSettings(settingsStore.editorSettings.shortcuts);
editSidebarActivation.value = settingsStore.editorSettings.sidebarActivation;
editAutoSelectActiveSidebarNode.value = settingsStore.editorSettings.autoSelectActiveSidebarNode;
@@ -268,7 +266,6 @@ function hasChanges(): boolean {
editShowColumnCommentsInHeader.value !== settingsStore.editorSettings.showColumnCommentsInHeader ||
editCompactColumnHeaderActions.value !== settingsStore.editorSettings.compactColumnHeaderActions ||
editRedisScanPageSize.value !== settingsStore.editorSettings.redisScanPageSize ||
editQueryTimeoutSecs.value !== settingsStore.editorSettings.queryTimeoutSecs ||
JSON.stringify(editShortcuts.value) !== JSON.stringify(settingsStore.editorSettings.shortcuts) ||
editSidebarActivation.value !== settingsStore.editorSettings.sidebarActivation ||
editAutoSelectActiveSidebarNode.value !== settingsStore.editorSettings.autoSelectActiveSidebarNode ||
@@ -292,7 +289,6 @@ async function applySettings() {
showColumnCommentsInHeader: editShowColumnCommentsInHeader.value,
compactColumnHeaderActions: editCompactColumnHeaderActions.value,
redisScanPageSize: editRedisScanPageSize.value,
queryTimeoutSecs: editQueryTimeoutSecs.value,
shortcuts: editShortcuts.value,
sidebarActivation: editSidebarActivation.value,
autoSelectActiveSidebarNode: editAutoSelectActiveSidebarNode.value,
@@ -318,7 +314,6 @@ function resetDefaults() {
editShowColumnCommentsInHeader.value = DEFAULT_EDITOR_SETTINGS.showColumnCommentsInHeader;
editCompactColumnHeaderActions.value = DEFAULT_EDITOR_SETTINGS.compactColumnHeaderActions;
editRedisScanPageSize.value = DEFAULT_EDITOR_SETTINGS.redisScanPageSize;
editQueryTimeoutSecs.value = DEFAULT_EDITOR_SETTINGS.queryTimeoutSecs;
editShortcuts.value = normalizeShortcutSettings(DEFAULT_EDITOR_SETTINGS.shortcuts);
editSidebarActivation.value = DEFAULT_EDITOR_SETTINGS.sidebarActivation;
editAutoSelectActiveSidebarNode.value = DEFAULT_EDITOR_SETTINGS.autoSelectActiveSidebarNode;
@@ -1075,26 +1070,6 @@ watch(
<Separator />
<div class="space-y-2">
<Label for="query-timeout-secs">{{ t("settings.queryTimeoutSecs") }}</Label>
<Input
id="query-timeout-secs"
type="number"
min="0"
:model-value="String(editQueryTimeoutSecs)"
@update:model-value="
(v: any) => {
const n = Number(v);
if (Number.isFinite(n) && n >= 0) editQueryTimeoutSecs = n;
}
"
class="h-9 w-28"
/>
<p class="text-xs text-muted-foreground">{{ t("settings.queryTimeoutSecsDescription") }}</p>
</div>
<Separator />
<!-- Live Preview -->
<div class="space-y-2">
<Label>{{ t("settings.preview") }}</Label>