Skip to content

Commit

Permalink
add search to the services tree in ISV and CSP view (#1073)
Browse files Browse the repository at this point in the history
  • Loading branch information
WangLiNaruto committed Aug 19, 2024
1 parent 881ecd7 commit d4c8fc4
Show file tree
Hide file tree
Showing 6 changed files with 124 additions and 63 deletions.
25 changes: 23 additions & 2 deletions src/components/content/catalog/services/tree/CatalogFullView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
serviceVersionKeyQuery,
} from '../../../../utils/constants';
import { getAllKeysFromCatalogTree } from '../../../common/catalog/catalogProps';
import { filterNodes } from '../../../common/tree/filterTreeData';
import ServiceProvider from '../details/ServiceProvider';
import { ServiceTree } from './ServiceTree';

Expand All @@ -30,6 +31,8 @@ export function CatalogFullView({
category: category;
}): React.JSX.Element {
const [urlParams] = useSearchParams();
const [searchValue, setSearchValue] = useState('');

const serviceNameInQuery = useMemo(() => {
const queryInUri = decodeURI(urlParams.get(serviceNameKeyQuery) ?? '');
if (queryInUri.length > 0) {
Expand Down Expand Up @@ -102,6 +105,23 @@ export function CatalogFullView({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [selectKey]);

function isParentTreeSelected(selectedKeyInTree: React.Key): boolean {
let isParentNode: boolean = false;
treeData.forEach((dataNode: DataNode) => {
if (dataNode.key === selectedKeyInTree) {
isParentNode = true;
}
});
return isParentNode;
}

const onSelect = (selectedKeys: React.Key[]) => {
if (selectedKeys.length === 0 || isParentTreeSelected(selectedKeys[0])) {
return;
}
setSelectKey(selectedKeys[0]);
};

return (
<>
<div className={catalogStyles.leftClass}>
Expand All @@ -110,9 +130,10 @@ export function CatalogFullView({
&nbsp;Service Tree
</div>
<ServiceTree
treeData={treeData}
treeData={filterNodes(treeData, searchValue)}
selectKey={selectKey}
setSelectKey={setSelectKey}
onSelect={onSelect}
setSearchValue={setSearchValue}
isViewDisabled={isViewDisabled}
/>
</div>
Expand Down
58 changes: 29 additions & 29 deletions src/components/content/catalog/services/tree/ServiceTree.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,47 +3,47 @@
* SPDX-FileCopyrightText: Huawei Inc.
*/

import { Tree } from 'antd';
import { Input, Tree } from 'antd';
import { DataNode } from 'antd/es/tree';
import React from 'react';

const { Search } = Input;

export function ServiceTree({
treeData,
selectKey,
setSelectKey,
onSelect,
setSearchValue,
isViewDisabled,
}: {
treeData: DataNode[];
selectKey: React.Key;
setSelectKey: (selectedKey: React.Key) => void;
onSelect: (selectedKey: React.Key[]) => void;
setSearchValue: (searchValue: string) => void;
isViewDisabled: boolean;
}): React.JSX.Element {
function isParentTreeSelected(selectKey: React.Key): boolean {
let isParentNode: boolean = false;
treeData.forEach((dataNode: DataNode) => {
if (dataNode.key === selectKey) {
isParentNode = true;
}
});
return isParentNode;
}

const onSelect = (selectedKeys: React.Key[]) => {
if (selectedKeys.length === 0 || isParentTreeSelected(selectedKeys[0])) {
return;
}
setSelectKey(selectedKeys[0]);
};

return (
<Tree
showIcon={true}
defaultExpandAll={true}
autoExpandParent={true}
onSelect={onSelect}
selectedKeys={[selectKey]}
treeData={treeData}
disabled={isViewDisabled}
/>
<>
<Search
style={{ marginBottom: 8 }}
placeholder={'Search by name or version'}
title={'Search by name or version'}
onChange={(e) => {
setSearchValue(e.target.value);
}}
onSearch={(e) => {
setSearchValue(e);
}}
/>
<Tree
showIcon={true}
defaultExpandAll={true}
autoExpandParent={true}
onSelect={onSelect}
selectedKeys={[selectKey]}
treeData={treeData}
disabled={isViewDisabled}
/>
</>
);
}
20 changes: 20 additions & 0 deletions src/components/content/common/tree/filterTreeData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* SPDX-License-Identifier: Apache-2.0
* SPDX-FileCopyrightText: Huawei Inc.
*/

import { DataNode } from 'antd/es/tree';

export function filterNodes(nodes: DataNode[], searchValue: string): DataNode[] {
return nodes
.map((node) => {
const matches = node.key.toString().toLowerCase().includes(searchValue.toLowerCase());

if (!node.children) {
return matches ? node : null;
}
const filteredChildren = filterNodes(node.children, searchValue);
return filteredChildren.length > 0 || matches ? { ...node, children: filteredChildren } : null;
})
.filter(Boolean) as DataNode[];
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
serviceVersionKeyQuery,
} from '../../../utils/constants.tsx';
import { getFourthLevelKeysFromAvailableServicesTree } from '../../common/registeredServices/registeredServiceProps.ts';
import { filterNodes } from '../../common/tree/filterTreeData';
import { RegisteredServicesTree } from './RegisteredServicesTree.tsx';
import ServiceContent from './ServiceContent.tsx';

Expand All @@ -28,6 +29,7 @@ export function RegisteredServicesFullView({
availableServiceList: ServiceTemplateDetailVo[];
}): React.JSX.Element {
const [urlParams] = useSearchParams();
const [searchValue, setSearchValue] = useState('');

const serviceNamespaceInQuery = useMemo(() => {
const queryInUri = decodeURI(urlParams.get(serviceNamespaceQuery) ?? '');
Expand Down Expand Up @@ -121,6 +123,23 @@ export function RegisteredServicesFullView({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [selectedKeyInTree]);

function isParentTreeSelected(selectedKeyInTree: React.Key): boolean {
let isParentNode: boolean = false;
treeData.forEach((dataNode: DataNode) => {
if (dataNode.key === selectedKeyInTree) {
isParentNode = true;
}
});
return isParentNode;
}

const onSelect = (selectedKeys: React.Key[]) => {
if (selectedKeys.length === 0 || isParentTreeSelected(selectedKeys[0])) {
return;
}
setSelectedKeyInTree(selectedKeys[0]);
};

return (
<>
<div className={catalogStyles.leftClass}>
Expand All @@ -129,9 +148,10 @@ export function RegisteredServicesFullView({
&nbsp;Services
</div>
<RegisteredServicesTree
treeData={treeData}
treeData={filterNodes(treeData, searchValue)}
selectedKeyInTree={selectedKeyInTree}
setSelectedKeyInTree={setSelectedKeyInTree}
onSelect={onSelect}
setSearchValue={setSearchValue}
/>
</div>
<div className={catalogStyles.middleClass} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,44 @@
* SPDX-FileCopyrightText: Huawei Inc.
*/

import { Tree } from 'antd';
import { Input, Tree } from 'antd';
import { DataNode } from 'antd/es/tree';
import React from 'react';

const { Search } = Input;

export function RegisteredServicesTree({
treeData,
selectedKeyInTree,
setSelectedKeyInTree,
onSelect,
setSearchValue,
}: {
treeData: DataNode[];
selectedKeyInTree: React.Key;
setSelectedKeyInTree: (selectedKey: React.Key) => void;
onSelect: (selectedKey: React.Key[]) => void;
setSearchValue: (searchValue: string) => void;
}): React.JSX.Element {
function isParentTreeSelected(selectedKeyInTree: React.Key): boolean {
let isParentNode: boolean = false;
treeData.forEach((dataNode: DataNode) => {
if (dataNode.key === selectedKeyInTree) {
isParentNode = true;
}
});
return isParentNode;
}

const onSelect = (selectedKeys: React.Key[]) => {
if (selectedKeys.length === 0 || isParentTreeSelected(selectedKeys[0])) {
return;
}
setSelectedKeyInTree(selectedKeys[0]);
};

return (
<Tree
showIcon={true}
defaultExpandAll={true}
autoExpandParent={true}
onSelect={onSelect}
selectedKeys={[selectedKeyInTree]}
treeData={treeData}
/>
<>
<Search
style={{ marginBottom: 8 }}
placeholder={'Search by category,name,version'}
title={'Search by category, service name or version'}
onChange={(e) => {
setSearchValue(e.target.value);
}}
onSearch={(e) => {
setSearchValue(e);
}}
/>
<Tree
showIcon={true}
defaultExpandAll={true}
autoExpandParent={true}
onSelect={onSelect}
selectedKeys={[selectedKeyInTree]}
treeData={treeData}
/>
</>
);
}
4 changes: 2 additions & 2 deletions src/styles/catalog.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@

.catalog-middleware .left-class {
height: 100%;
padding: 24px;
width: 300px;
padding: 8px;
width: 18%;
}

.catalog-middleware .left-title-class {
Expand Down

0 comments on commit d4c8fc4

Please sign in to comment.