11import React , { useContext } from "react" ;
22
33import {
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
1010import useLoadRegistry from "../../queries/useLoadRegistry" ;
@@ -13,6 +13,8 @@ import { useDocumentTitle } from "../../hooks/useDocumentTitle";
1313import RegistryPathContext from "../../contexts/RegistryPathContext" ;
1414import DataSourceIndexEmptyState from "./DataSourceIndexEmptyState" ;
1515import { DataSourceIcon32 } from "../../graphics/DataSourceIcon" ;
16+ import { useSearchQuery } from "../../hooks/useSearchInputWithTags" ;
17+ import { feast } from "../../protos" ;
1618
1719const 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+
3248const 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