1
1
import React , { useContext } from "react" ;
2
2
3
3
import {
4
- EuiPageHeader ,
5
- EuiPageContent ,
6
- EuiPageContentBody ,
7
- EuiLoadingSpinner ,
4
+ EuiPageHeader ,
5
+ EuiPageContent ,
6
+ EuiPageContentBody ,
7
+ EuiLoadingSpinner , EuiFlexGroup , EuiFlexItem , EuiTitle , EuiFieldSearch , EuiSpacer ,
8
8
} from "@elastic/eui" ;
9
9
10
10
import useLoadRegistry from "../../queries/useLoadRegistry" ;
@@ -13,6 +13,8 @@ import { useDocumentTitle } from "../../hooks/useDocumentTitle";
13
13
import RegistryPathContext from "../../contexts/RegistryPathContext" ;
14
14
import DataSourceIndexEmptyState from "./DataSourceIndexEmptyState" ;
15
15
import { DataSourceIcon32 } from "../../graphics/DataSourceIcon" ;
16
+ import { useSearchQuery } from "../../hooks/useSearchInputWithTags" ;
17
+ import { feast } from "../../protos" ;
16
18
17
19
const useLoadDatasources = ( ) => {
18
20
const registryUrl = useContext ( RegistryPathContext ) ;
@@ -29,11 +31,32 @@ const useLoadDatasources = () => {
29
31
} ;
30
32
} ;
31
33
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
+
32
48
const Index = ( ) => {
33
49
const { isLoading, isSuccess, isError, data } = useLoadDatasources ( ) ;
34
50
35
51
useDocumentTitle ( `Data Sources | Feast` ) ;
36
52
53
+ const { searchString, searchTokens, setSearchString } = useSearchQuery ( ) ;
54
+
55
+ const filterResult = data
56
+ ? filterFn ( data , searchTokens )
57
+ : data ;
58
+
59
+
37
60
return (
38
61
< React . Fragment >
39
62
< EuiPageHeader
@@ -56,7 +79,26 @@ const Index = () => {
56
79
) }
57
80
{ isError && < p > We encountered an error while loading.</ p > }
58
81
{ 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
+ ) }
60
102
</ EuiPageContentBody >
61
103
</ EuiPageContent >
62
104
</ React . Fragment >
0 commit comments