From eb2d6c9b389e05eeccc880d449d2fc93e6640f12 Mon Sep 17 00:00:00 2001 From: Wroud Date: Wed, 9 Feb 2022 10:44:55 +0300 Subject: [PATCH] feat(core-app): CB-1635 nav tree filter behaviour --- .../src/NavigationTree/ElementsTree.tsx | 3 ++- .../NavigationTree/NavNodeFilterCompareFn.ts | 17 +++++++++++++++++ .../elementsTreeLimitFilter.ts | 2 -- .../NavigationTree/elementsTreeNameFilter.ts | 18 ++++++++++++------ webapp/packages/core-app/src/index.ts | 1 + 5 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 webapp/packages/core-app/src/NavigationTree/NavNodeFilterCompareFn.ts diff --git a/webapp/packages/core-app/src/NavigationTree/ElementsTree.tsx b/webapp/packages/core-app/src/NavigationTree/ElementsTree.tsx index d44e25a7ca..801eafddfe 100644 --- a/webapp/packages/core-app/src/NavigationTree/ElementsTree.tsx +++ b/webapp/packages/core-app/src/NavigationTree/ElementsTree.tsx @@ -21,11 +21,12 @@ import { EObjectFeature } from '../shared/NodesManager/EObjectFeature'; import { NavNodeInfoResource, ROOT_NODE_PATH } from '../shared/NodesManager/NavNodeInfoResource'; import { NavTreeResource } from '../shared/NodesManager/NavTreeResource'; import { ElementsTreeLoader } from './ElementsTreeLoader'; -import { elementsTreeNameFilter, NavNodeFilterCompareFn } from './elementsTreeNameFilter'; +import { elementsTreeNameFilter } from './elementsTreeNameFilter'; import type { NavTreeControlComponent } from './NavigationNodeComponent'; import { NavigationNodeNested } from './NavigationTreeNode/NavigationNode/NavigationNodeNested'; import { NavigationNodeElement } from './NavigationTreeNode/NavigationNodeElement'; import { NavigationTreeService } from './NavigationTreeService'; +import type { NavNodeFilterCompareFn } from './NavNodeFilterCompareFn'; import { elementsTreeLimitFilter } from './NavTreeLimitFilter/elementsTreeLimitFilter'; import { elementsTreeLimitRenderer } from './NavTreeLimitFilter/elementsTreeLimitRenderer'; import { ITreeContext, TreeContext } from './TreeContext'; diff --git a/webapp/packages/core-app/src/NavigationTree/NavNodeFilterCompareFn.ts b/webapp/packages/core-app/src/NavigationTree/NavNodeFilterCompareFn.ts new file mode 100644 index 0000000000..23c2a7d829 --- /dev/null +++ b/webapp/packages/core-app/src/NavigationTree/NavNodeFilterCompareFn.ts @@ -0,0 +1,17 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2022 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 type { NavNode } from '../shared/NodesManager/EntityTypes'; + +export enum EEquality { + none, + partially, + full +} + +export type NavNodeFilterCompareFn = (node: NavNode, filter: string)=> EEquality; \ No newline at end of file diff --git a/webapp/packages/core-app/src/NavigationTree/NavTreeLimitFilter/elementsTreeLimitFilter.ts b/webapp/packages/core-app/src/NavigationTree/NavTreeLimitFilter/elementsTreeLimitFilter.ts index 551a81badc..544138836e 100644 --- a/webapp/packages/core-app/src/NavigationTree/NavTreeLimitFilter/elementsTreeLimitFilter.ts +++ b/webapp/packages/core-app/src/NavigationTree/NavTreeLimitFilter/elementsTreeLimitFilter.ts @@ -10,8 +10,6 @@ import type { NavNode } from '../../shared/NodesManager/EntityTypes'; import type { NavTreeResource } from '../../shared/NodesManager/NavTreeResource'; import type { IElementsTreeFilter } from '../useElementsTree'; -export type NavNodeFilterCompareFn = (node: NavNode, filter: string)=> boolean; - export const NAVIGATION_TREE_LIMIT = { limit: 'nav-tree://limit', }; diff --git a/webapp/packages/core-app/src/NavigationTree/elementsTreeNameFilter.ts b/webapp/packages/core-app/src/NavigationTree/elementsTreeNameFilter.ts index 481bcc29cb..77a66c7bf9 100644 --- a/webapp/packages/core-app/src/NavigationTree/elementsTreeNameFilter.ts +++ b/webapp/packages/core-app/src/NavigationTree/elementsTreeNameFilter.ts @@ -12,10 +12,9 @@ import type { MetadataMap } from '@cloudbeaver/core-utils'; import type { NavNode } from '../shared/NodesManager/EntityTypes'; import type { NavNodeInfoResource } from '../shared/NodesManager/NavNodeInfoResource'; import type { NavTreeResource } from '../shared/NodesManager/NavTreeResource'; +import { EEquality, NavNodeFilterCompareFn } from './NavNodeFilterCompareFn'; import type { IElementsTreeFilter, ITreeNodeState } from './useElementsTree'; -export type NavNodeFilterCompareFn = (node: NavNode, filter: string)=> boolean; - function isDefined(val: T | undefined | null): val is T { return val !== undefined && val !== null; } @@ -26,7 +25,7 @@ export function elementsTreeNameFilter( compare: NavNodeFilterCompareFn = compareNodes ): IElementsTreeFilter { return (filter: string, node: NavNode, children: string[], state: MetadataMap) => { - if (filter === '' || compare(node, filter)) { + if (filter === '' || compare(node, filter) === EEquality.full) { return children; } @@ -57,7 +56,7 @@ function filterNode( // const nodeState = state.get(node.id); - if (compare(node, filter)) { + if (compare(node, filter) !== EEquality.none) { return true; } @@ -80,6 +79,13 @@ function filterNode( // return false; } -function compareNodes(node: NavNode, filter: string): boolean { - return node.name?.toLowerCase().includes(filter.toLowerCase()) ?? false; +function compareNodes(node: NavNode, filter: string): EEquality { + const nodeName = node.name?.toLowerCase().trim(); + const filterToLower = filter.toLowerCase().trim(); + + if (nodeName === filterToLower) { + return EEquality.full; + } + + return nodeName?.includes(filterToLower) ? EEquality.partially : EEquality.none; } diff --git a/webapp/packages/core-app/src/index.ts b/webapp/packages/core-app/src/index.ts index 2b1dbd5f2f..df6f76f06f 100644 --- a/webapp/packages/core-app/src/index.ts +++ b/webapp/packages/core-app/src/index.ts @@ -37,6 +37,7 @@ export * from './NavigationTree/MENU_NAV_TREE'; export * from './NavigationTree/NavigationNodeComponent'; export * from './NavigationTree/NavigationTreeBootstrap'; export * from './NavigationTree/NavigationTreeService'; +export * from './NavigationTree/NavNodeFilterCompareFn'; export * from './NavigationTree/TreeContext'; export * from './NavigationTree/useElementsTree'; export * from './AppLocaleService';