diff --git a/src/components/layout/AppSidebar.vue b/src/components/layout/AppSidebar.vue index 8383f83754..0cbff9faa8 100644 --- a/src/components/layout/AppSidebar.vue +++ b/src/components/layout/AppSidebar.vue @@ -85,7 +85,7 @@ async function refreshTree() { {{ t("sidebar.export") }} -
+
diff --git a/src/components/sidebar/ConnectionTree.vue b/src/components/sidebar/ConnectionTree.vue index 7dc5d5fb3d..350f1d5399 100644 --- a/src/components/sidebar/ConnectionTree.vue +++ b/src/components/sidebar/ConnectionTree.vue @@ -5,8 +5,11 @@ import { Search, X, ListFilter, Check, FolderPlus } from "lucide-vue-next"; import { useConnectionStore } from "@/stores/connectionStore"; import type { TreeNode } from "@/types/database"; import { matchSidebarLabel } from "@/lib/sidebarSearch"; +import { flattenTree, shouldVirtualizeFlatTree, type FlatTreeNode } from "@/composables/useFlatTree"; import TreeItem from "./TreeItem.vue"; import DatabaseIcon from "@/components/icons/DatabaseIcon.vue"; +import { RecycleScroller } from "vue-virtual-scroller"; +import "vue-virtual-scroller/dist/vue-virtual-scroller.css"; import { DropdownMenu, DropdownMenuTrigger, @@ -145,22 +148,8 @@ const filteredNodes = computed(() => { return nodes; }); -const TOP_LEVEL_PAGE_SIZE = 50; -const topLevelDisplayLimit = ref(TOP_LEVEL_PAGE_SIZE); - -const visibleFilteredNodes = computed(() => filteredNodes.value.slice(0, topLevelDisplayLimit.value)); - -const hasMoreTopLevel = computed(() => filteredNodes.value.length > topLevelDisplayLimit.value); - -const remainingTopLevelCount = computed(() => filteredNodes.value.length - topLevelDisplayLimit.value); - -function showMoreTopLevel() { - topLevelDisplayLimit.value += TOP_LEVEL_PAGE_SIZE; -} - -watch(filteredNodes, () => { - topLevelDisplayLimit.value = TOP_LEVEL_PAGE_SIZE; -}); +const flatNodes = computed(() => flattenTree(filteredNodes.value)); +const useVirtualTree = computed(() => shouldVirtualizeFlatTree(flatNodes.value.length)); const pendingRenameGroupId = ref(null); @@ -179,7 +168,7 @@ function onSearchToggle(node: TreeNode) {