diff --git a/webapp/packages/plugin-navigation-tree-rm/src/Tree/ResourceManagerTree.tsx b/webapp/packages/plugin-navigation-tree-rm/src/Tree/ResourceManagerTree.tsx index 6faa7b66bb..cdb22cbcba 100644 --- a/webapp/packages/plugin-navigation-tree-rm/src/Tree/ResourceManagerTree.tsx +++ b/webapp/packages/plugin-navigation-tree-rm/src/Tree/ResourceManagerTree.tsx @@ -22,6 +22,7 @@ import { getNavigationTreeUserSettingsId, type IElementsTreeSettings, NavigationTreeService, + useElementsTreeLimit, validateElementsTreeSettings, } from '@cloudbeaver/plugin-navigation-tree'; import { ResourceManagerService } from '@cloudbeaver/plugin-resource-manager'; @@ -111,6 +112,8 @@ export const ResourceManagerTree: React.FC = observer(function ResourceMa return navTreeService.loadNestedNodes(nodeId, manual); } + const [limit] = useElementsTreeLimit(root); + return ( @@ -131,6 +134,7 @@ export const ResourceManagerTree: React.FC = observer(function ResourceMa
{children}
)} + limit={limit} onOpen={node => navTreeService.navToNode(node.uri, node.parentId)} />
diff --git a/webapp/packages/plugin-navigation-tree/package.json b/webapp/packages/plugin-navigation-tree/package.json index 1e84347fdc..f371da9588 100644 --- a/webapp/packages/plugin-navigation-tree/package.json +++ b/webapp/packages/plugin-navigation-tree/package.json @@ -34,6 +34,7 @@ "@cloudbeaver/core-navigation-tree": "workspace:*", "@cloudbeaver/core-projects": "workspace:*", "@cloudbeaver/core-resource": "workspace:*", + "@cloudbeaver/core-resource-manager": "workspace:*", "@cloudbeaver/core-settings": "workspace:*", "@cloudbeaver/core-ui": "workspace:*", "@cloudbeaver/core-utils": "workspace:*", diff --git a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTree.tsx b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTree.tsx index f3fd978e58..09d87c42e8 100644 --- a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTree.tsx +++ b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTree.tsx @@ -54,6 +54,7 @@ export interface ElementsTreeProps extends IElementsTreeOptions, React.PropsWith emptyPlaceholder?: React.FC; className?: string; settingsElements?: PlaceholderElement[]; + limit?: (nodeId: string) => number; navNodeFilterCompare?: NavNodeFilterCompareFn; onClick?: (node: NavNode) => Promise | void; onOpen?: (node: NavNode, folder: boolean) => Promise | void; @@ -75,6 +76,7 @@ export const ElementsTree = observer( renderers = [], expandStateGetters, settingsElements, + limit, className, getChildren, loadChildren, @@ -121,6 +123,7 @@ export const ElementsTree = observer( filters: [nameFilter, ...filters, limitFilter], renderers: [...renderers, elementsTreeLimitRenderer], expandStateGetters, + limit, getChildren, loadChildren, isGroup, diff --git a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTree.ts b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTree.ts index 5c686dbf56..1d1c8ad612 100644 --- a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTree.ts +++ b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTree.ts @@ -99,6 +99,7 @@ interface IOptions extends IElementsTreeOptions { baseRoot: string; root: string; folderExplorer: IFolderExplorerContext; + limit?: (nodeId: string) => number; } export interface IElementsTree extends ILoadableState { @@ -236,10 +237,9 @@ export function useElementsTree(options: IOptions): IElementsTree { if (pageInfo) { const lastOffset = getNextPageOffset(pageInfo); - for (let offset = 0; offset < lastOffset; offset += navTreeResource.childrenLimit) { - await navTreeResource.load( - CachedResourceOffsetPageKey(offset, navTreeResource.childrenLimit).setParent(CachedResourceOffsetPageTargetKey(nodeId)), - ); + const limit = options.limit ? options.limit(nodeId) : navTreeResource.childrenLimit; + for (let offset = 0; offset < lastOffset; offset += limit) { + await navTreeResource.load(CachedResourceOffsetPageKey(offset, limit).setParent(CachedResourceOffsetPageTargetKey(nodeId))); } } diff --git a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTreeLimit.ts b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTreeLimit.ts new file mode 100644 index 0000000000..ab951f4096 --- /dev/null +++ b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTreeLimit.ts @@ -0,0 +1,39 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { useCallback } from 'react'; + +import { useResource } from '@cloudbeaver/core-blocks'; +import { useService } from '@cloudbeaver/core-di'; +import { NavTreeResource } from '@cloudbeaver/core-navigation-tree'; +import { ProjectInfoResource } from '@cloudbeaver/core-projects'; +import { CachedMapAllKey } from '@cloudbeaver/core-resource'; + +//@TODO probably backend should filter out these nodes and only return projects for the root node cause we dont show them anyway +const NON_PROJECT_NODES_COUNT = 3; + +export function useElementsTreeLimit(root: string) { + const navTreeResource = useService(NavTreeResource); + + const projectInfoResource = useResource(useElementsTreeLimit, ProjectInfoResource, CachedMapAllKey); + const projects = projectInfoResource.data; + + const getLimit = useCallback( + (nodeId: string) => { + const count = projects.length + NON_PROJECT_NODES_COUNT + 1; + if (nodeId === root && count > navTreeResource.childrenLimit) { + return count; + } + + return navTreeResource.childrenLimit; + }, + [navTreeResource.childrenLimit, projects.length, root], + ); + + return [getLimit]; +} diff --git a/webapp/packages/plugin-navigation-tree/src/NavigationTree/NavigationTree.tsx b/webapp/packages/plugin-navigation-tree/src/NavigationTree/NavigationTree.tsx index d6ba8fc5d8..b539328fc8 100644 --- a/webapp/packages/plugin-navigation-tree/src/NavigationTree/NavigationTree.tsx +++ b/webapp/packages/plugin-navigation-tree/src/NavigationTree/NavigationTree.tsx @@ -40,6 +40,7 @@ import { navigationTreeProjectsRendererRenderer } from './ProjectsRenderer/navig import { ProjectsSettingsPlaceholderElement } from './ProjectsRenderer/ProjectsSettingsForm.js'; import { useNavigationTree } from './useNavigationTree.js'; import { TableContentsSettingsPlaceholderElement } from './ElementsTree/ElementsTreeTools/NavigationTreeSettings/TableContentsSettingsForm.js'; +import { useElementsTreeLimit } from './ElementsTree/useElementsTreeLimit.js'; const registry: StyleRegistry = [ [ @@ -63,6 +64,7 @@ export const NavigationTree = observer(function NavigationTree() { const root = ROOT_NODE_PATH; const { handleOpen, handleSelect, handleSelectReset } = useNavigationTree(); + const [limit] = useElementsTreeLimit(root); const connectionGroupFilter = useMemo(() => navigationTreeConnectionGroupFilter(navNodeInfoResource), [navNodeInfoResource]); @@ -129,6 +131,7 @@ export const NavigationTree = observer(function NavigationTree() { settings={settings} getChildren={navTreeService.getChildren} loadChildren={navTreeService.loadNestedNodes} + limit={limit} onOpen={handleOpen} /> diff --git a/webapp/packages/plugin-navigation-tree/src/index.ts b/webapp/packages/plugin-navigation-tree/src/index.ts index 45365db177..bfcac48486 100644 --- a/webapp/packages/plugin-navigation-tree/src/index.ts +++ b/webapp/packages/plugin-navigation-tree/src/index.ts @@ -88,6 +88,7 @@ export * from './TreeNew/useTreeMenu.js'; export type { ITreeDnD } from './TreeNew/useTreeDnD.js'; export type { INodeDnD } from './TreeNew/useNodeDnD.js'; export { useTreeDnD } from './TreeNew/useTreeDnD.js'; +export { useElementsTreeLimit } from './NavigationTree/ElementsTree/useElementsTreeLimit.js'; export * from './NodesManager/NodeLinkLoader.js'; diff --git a/webapp/packages/plugin-navigation-tree/tsconfig.json b/webapp/packages/plugin-navigation-tree/tsconfig.json index 00671b5b16..de1ca102ce 100644 --- a/webapp/packages/plugin-navigation-tree/tsconfig.json +++ b/webapp/packages/plugin-navigation-tree/tsconfig.json @@ -58,6 +58,9 @@ { "path": "../core-resource" }, + { + "path": "../core-resource-manager" + }, { "path": "../core-settings" },