Skip to content

Commit fbbb293

Browse files
authored
feat: Add data source search (#3449)
add data source search Signed-off-by: hao-affirm <[email protected]> Signed-off-by: hao-affirm <[email protected]>
1 parent 1475373 commit fbbb293

File tree

1 file changed

+47
-5
lines changed

1 file changed

+47
-5
lines changed

ui/src/pages/data-sources/Index.tsx

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import React, { useContext } from "react";
22

33
import {
4-
EuiPageHeader,
5-
EuiPageContent,
6-
EuiPageContentBody,
7-
EuiLoadingSpinner,
4+
EuiPageHeader,
5+
EuiPageContent,
6+
EuiPageContentBody,
7+
EuiLoadingSpinner, EuiFlexGroup, EuiFlexItem, EuiTitle, EuiFieldSearch, EuiSpacer,
88
} from "@elastic/eui";
99

1010
import useLoadRegistry from "../../queries/useLoadRegistry";
@@ -13,6 +13,8 @@ import { useDocumentTitle } from "../../hooks/useDocumentTitle";
1313
import RegistryPathContext from "../../contexts/RegistryPathContext";
1414
import DataSourceIndexEmptyState from "./DataSourceIndexEmptyState";
1515
import { DataSourceIcon32 } from "../../graphics/DataSourceIcon";
16+
import { useSearchQuery} from "../../hooks/useSearchInputWithTags";
17+
import { feast } from "../../protos";
1618

1719
const useLoadDatasources = () => {
1820
const registryUrl = useContext(RegistryPathContext);
@@ -29,11 +31,32 @@ const useLoadDatasources = () => {
2931
};
3032
};
3133

34+
const filterFn = (data: feast.core.IDataSource[], searchTokens: string[]) => {
35+
let filteredByTags = data;
36+
37+
if (searchTokens.length) {
38+
return filteredByTags.filter((entry) => {
39+
return searchTokens.find((token) => {
40+
return token.length >= 3 && entry.name && entry.name.indexOf(token) >= 0;
41+
});
42+
});
43+
}
44+
45+
return filteredByTags;
46+
};
47+
3248
const Index = () => {
3349
const { isLoading, isSuccess, isError, data } = useLoadDatasources();
3450

3551
useDocumentTitle(`Data Sources | Feast`);
3652

53+
const { searchString, searchTokens, setSearchString } = useSearchQuery();
54+
55+
const filterResult = data
56+
? filterFn(data, searchTokens)
57+
: data;
58+
59+
3760
return (
3861
<React.Fragment>
3962
<EuiPageHeader
@@ -56,7 +79,26 @@ const Index = () => {
5679
)}
5780
{isError && <p>We encountered an error while loading.</p>}
5881
{isSuccess && !data && <DataSourceIndexEmptyState />}
59-
{isSuccess && data && <DatasourcesListingTable dataSources={data} />}
82+
{isSuccess && data && data.length > 0 && filterResult && (
83+
<React.Fragment>
84+
<EuiFlexGroup>
85+
<EuiFlexItem grow={2}>
86+
<EuiTitle size="xs">
87+
<h2>Search</h2>
88+
</EuiTitle>
89+
<EuiFieldSearch
90+
value={searchString}
91+
fullWidth={true}
92+
onChange={(e) => {
93+
setSearchString(e.target.value);
94+
}}
95+
/>
96+
</EuiFlexItem>
97+
</EuiFlexGroup>
98+
<EuiSpacer size="m" />
99+
<DatasourcesListingTable dataSources={filterResult} />
100+
</React.Fragment>
101+
)}
60102
</EuiPageContentBody>
61103
</EuiPageContent>
62104
</React.Fragment>

0 commit comments

Comments
 (0)