From 267768ecbd0265770d5e8868294461bda2f0db3c Mon Sep 17 00:00:00 2001 From: zipg Date: Tue, 30 Jun 2026 00:08:41 +0800 Subject: [PATCH] Fix: keep simple sidebar table pagination bounded (#2092) --- .../src/components/sidebar/ConnectionTree.vue | 22 +++++++++++---- apps/desktop/src/lib/tableTree.ts | 7 +++++ apps/desktop/src/stores/connectionStore.ts | 3 +- packages/app-tests/tableTree.test.ts | 28 ++++++++++++++++++- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/apps/desktop/src/components/sidebar/ConnectionTree.vue b/apps/desktop/src/components/sidebar/ConnectionTree.vue index 777c6a0bc1..05d3824fa8 100644 --- a/apps/desktop/src/components/sidebar/ConnectionTree.vue +++ b/apps/desktop/src/components/sidebar/ConnectionTree.vue @@ -208,10 +208,12 @@ const activeTab = computed(() => queryStore.tabs.find((tab) => tab.id === queryS // ancestor. The overlay reuses , so collapse/expand comes for free. const stickyScrollTop = ref(0); const sidebarScrollMetrics = ref({ scrollTop: 0, clientHeight: 0, scrollHeight: 0 }); +const isScrollingSidebar = ref(false); const isDraggingSidebarScrollbar = ref(false); let sidebarScrollbarResizeObserver: ResizeObserver | null = null; let sidebarScrollbarAnimationFrame = 0; let sidebarScrollbarDragOffset = 0; +let sidebarScrollingTimer = 0; function updateSidebarScrollMetrics() { const scroller = currentTreeScroller(); @@ -234,6 +236,11 @@ function scheduleSidebarScrollMetricsUpdate() { } function onTreeScroll() { + isScrollingSidebar.value = true; + window.clearTimeout(sidebarScrollingTimer); + sidebarScrollingTimer = window.setTimeout(() => { + isScrollingSidebar.value = false; + }, 700); scheduleSidebarScrollMetricsUpdate(); } @@ -780,6 +787,7 @@ onUnmounted(() => { stopSidebarScrollbarDrag(); sidebarScrollbarResizeObserver?.disconnect(); window.cancelAnimationFrame(sidebarScrollbarAnimationFrame); + window.clearTimeout(sidebarScrollingTimer); }); defineExpose({ focusSearch, createNewGroup }); @@ -853,7 +861,7 @@ defineExpose({ focusSearch, createNewGroup });
- -