From b6c88d7b65360646d208f29670307a3b64f4ae0a Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Thu, 14 May 2026 21:52:06 +0800 Subject: [PATCH] feat: add persistent selected node highlight in sidebar tree - Track selectedTreeNodeId in connection store - Highlight any clicked tree node with focused (blue) / unfocused (gray) styles - Use CSS :focus-within for automatic focus state switching --- crates/dbx-core/src/db/clickhouse_driver.rs | 3 +++ crates/dbx-core/src/schema.rs | 1 + src-tauri/src/commands/connection.rs | 1 + src/components/sidebar/ConnectionTree.vue | 4 +-- src/components/sidebar/TreeItem.vue | 28 ++++++++++++++++++--- src/stores/connectionStore.ts | 2 ++ 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/crates/dbx-core/src/db/clickhouse_driver.rs b/crates/dbx-core/src/db/clickhouse_driver.rs index d19410cd26..aa603505ed 100644 --- a/crates/dbx-core/src/db/clickhouse_driver.rs +++ b/crates/dbx-core/src/db/clickhouse_driver.rs @@ -61,10 +61,13 @@ async fn ch_query(client: &ChClient, sql: &str, database: Option<&str>) -> Resul if let Some(db) = database { url.push_str(&format!("&database={}", db)); } + log::info!("[clickhouse] query url={url} user={:?} has_pass={}", client.username, client.password.is_some()); let req = build_request(client, client.http.post(&url).body(sql.to_string())); let resp = req.send().await.map_err(|e| format!("ClickHouse request failed: {e}"))?; + log::info!("[clickhouse] response status={}", resp.status()); if !resp.status().is_success() { let body = resp.text().await.unwrap_or_default(); + log::error!("[clickhouse] error body: {body}"); return Err(format!("ClickHouse error: {body}")); } resp.json::().await.map_err(|e| format!("ClickHouse parse error: {e}")) diff --git a/crates/dbx-core/src/schema.rs b/crates/dbx-core/src/schema.rs index eae0bb2f89..3d4d5f8515 100644 --- a/crates/dbx-core/src/schema.rs +++ b/crates/dbx-core/src/schema.rs @@ -114,6 +114,7 @@ pub fn extract_agent( } pub async fn list_databases_core(state: &AppState, connection_id: &str) -> Result, String> { + log::info!("[list_databases] connection_id={connection_id}"); { let connections = state.connections.read().await; if extract_external(&connections, connection_id).is_some() { diff --git a/src-tauri/src/commands/connection.rs b/src-tauri/src/commands/connection.rs index 66e77cf8c5..393cd0f02a 100644 --- a/src-tauri/src/commands/connection.rs +++ b/src-tauri/src/commands/connection.rs @@ -216,6 +216,7 @@ pub async fn connect_db(state: State<'_, Arc>, config: ConnectionConfi DatabaseType::ClickHouse => { let username = if db_config.username.is_empty() { None } else { Some(db_config.username.clone()) }; let password = if db_config.password.is_empty() { None } else { Some(db_config.password.clone()) }; + log::info!("[connect_db] ClickHouse url={url} user={:?} has_pass={}", username, password.is_some()); let client = db::clickhouse_driver::ChClient::new(&url, username, password); db::clickhouse_driver::test_connection(&client).await?; PoolKind::ClickHouse(client) diff --git a/src/components/sidebar/ConnectionTree.vue b/src/components/sidebar/ConnectionTree.vue index 784105f455..94560ebd56 100644 --- a/src/components/sidebar/ConnectionTree.vue +++ b/src/components/sidebar/ConnectionTree.vue @@ -273,7 +273,7 @@ defineExpose({ focusSearch }); -
+