diff --git a/src/components/sidebar/ConnectionTree.vue b/src/components/sidebar/ConnectionTree.vue index 128657d7b4..dfd32f3e39 100644 --- a/src/components/sidebar/ConnectionTree.vue +++ b/src/components/sidebar/ConnectionTree.vue @@ -21,6 +21,7 @@ const store = useConnectionStore(); const searchQuery = ref(""); const deferredSearchQuery = ref(""); const selectedTypes = ref([]); +const searchCollapsedIds = ref>(new Set()); let searchTimer: number | undefined; watch( @@ -41,6 +42,7 @@ watch( { flush: "sync" }, ); +const isSearching = computed(() => !!deferredSearchQuery.value); const isFiltering = computed(() => !!searchQuery.value.trim() || hasTypeFilter.value); const typeStats = computed(() => { @@ -100,7 +102,11 @@ function filterTree(nodes: TreeNode[], q: string): TreeNode[] { filteredNodes.push(node); } else { const children = filteredChildren ?? []; - filteredNodes.push({ ...node, children, isExpanded: children.length > 0 }); + filteredNodes.push({ + ...node, + children, + isExpanded: children.length > 0 && !searchCollapsedIds.value.has(node.id), + }); } } } @@ -145,6 +151,14 @@ function createNewGroup() { const groupId = store.createConnectionGroup(t("connectionGroup.newGroupDefault")); pendingRenameGroupId.value = groupId; } + +function onSearchToggle(node: TreeNode) { + if (!isSearching.value || !node.children) return; + const next = new Set(searchCollapsedIds.value); + if (node.isExpanded) next.add(node.id); + else next.delete(node.id); + searchCollapsedIds.value = next; +}