1- import React , { useContext } from "react" ;
2- import { EuiEmptyPrompt , EuiLoadingSpinner , EuiSpacer } from "@elastic/eui" ;
1+ import React , { useContext , useState } from "react" ;
2+ import {
3+ EuiEmptyPrompt ,
4+ EuiLoadingSpinner ,
5+ EuiSpacer ,
6+ EuiSelect ,
7+ EuiFormRow ,
8+ EuiFlexGroup ,
9+ EuiFlexItem ,
10+ } from "@elastic/eui" ;
311import useLoadRegistry from "../queries/useLoadRegistry" ;
412import RegistryPathContext from "../contexts/RegistryPathContext" ;
513import RegistryVisualization from "./RegistryVisualization" ;
14+ import { FEAST_FCO_TYPES } from "../parsers/types" ;
615
716const RegistryVisualizationTab = ( ) => {
817 const registryUrl = useContext ( RegistryPathContext ) ;
918 const { isLoading, isSuccess, isError, data } = useLoadRegistry ( registryUrl ) ;
19+ const [ selectedObjectType , setSelectedObjectType ] = useState ( "" ) ;
20+ const [ selectedObjectName , setSelectedObjectName ] = useState ( "" ) ;
21+
22+ const getObjectOptions = ( objects : any , type : string ) => {
23+ switch ( type ) {
24+ case "dataSource" :
25+ const dataSources = new Set < string > ( ) ;
26+ objects . featureViews ?. forEach ( ( fv : any ) => {
27+ if ( fv . spec ?. batchSource ?. name )
28+ dataSources . add ( fv . spec . batchSource . name ) ;
29+ } ) ;
30+ objects . streamFeatureViews ?. forEach ( ( sfv : any ) => {
31+ if ( sfv . spec ?. batchSource ?. name )
32+ dataSources . add ( sfv . spec . batchSource . name ) ;
33+ if ( sfv . spec ?. streamSource ?. name )
34+ dataSources . add ( sfv . spec . streamSource . name ) ;
35+ } ) ;
36+ return Array . from ( dataSources ) ;
37+ case "entity" :
38+ return objects . entities ?. map ( ( entity : any ) => entity . spec ?. name ) || [ ] ;
39+ case "featureView" :
40+ return [
41+ ...( objects . featureViews ?. map ( ( fv : any ) => fv . spec ?. name ) || [ ] ) ,
42+ ...( objects . onDemandFeatureViews ?. map (
43+ ( odfv : any ) => odfv . spec ?. name ,
44+ ) || [ ] ) ,
45+ ...( objects . streamFeatureViews ?. map ( ( sfv : any ) => sfv . spec ?. name ) ||
46+ [ ] ) ,
47+ ] ;
48+ case "featureService" :
49+ return objects . featureServices ?. map ( ( fs : any ) => fs . spec ?. name ) || [ ] ;
50+ default :
51+ return [ ] ;
52+ }
53+ } ;
1054
1155 return (
1256 < >
@@ -31,10 +75,58 @@ const RegistryVisualizationTab = () => {
3175 { isSuccess && data && (
3276 < >
3377 < EuiSpacer size = "l" />
78+ < EuiFlexGroup style = { { marginBottom : 16 } } >
79+ < EuiFlexItem grow = { false } style = { { width : 200 } } >
80+ < EuiFormRow label = "Filter by type" >
81+ < EuiSelect
82+ options = { [
83+ { value : "" , text : "All" } ,
84+ { value : "dataSource" , text : "Data Source" } ,
85+ { value : "entity" , text : "Entity" } ,
86+ { value : "featureView" , text : "Feature View" } ,
87+ { value : "featureService" , text : "Feature Service" } ,
88+ ] }
89+ value = { selectedObjectType }
90+ onChange = { ( e ) => {
91+ setSelectedObjectType ( e . target . value ) ;
92+ setSelectedObjectName ( "" ) ; // Reset name when type changes
93+ } }
94+ aria-label = "Select object type"
95+ />
96+ </ EuiFormRow >
97+ </ EuiFlexItem >
98+ < EuiFlexItem grow = { false } style = { { width : 300 } } >
99+ < EuiFormRow label = "Select object" >
100+ < EuiSelect
101+ options = { [
102+ { value : "" , text : "All" } ,
103+ ...getObjectOptions ( data . objects , selectedObjectType ) . map (
104+ ( name : string ) => ( {
105+ value : name ,
106+ text : name ,
107+ } ) ,
108+ ) ,
109+ ] }
110+ value = { selectedObjectName }
111+ onChange = { ( e ) => setSelectedObjectName ( e . target . value ) }
112+ aria-label = "Select object"
113+ disabled = { selectedObjectType === "" }
114+ />
115+ </ EuiFormRow >
116+ </ EuiFlexItem >
117+ </ EuiFlexGroup >
34118 < RegistryVisualization
35119 registryData = { data . objects }
36120 relationships = { data . relationships }
37121 indirectRelationships = { data . indirectRelationships }
122+ filterNode = {
123+ selectedObjectType && selectedObjectName
124+ ? {
125+ type : selectedObjectType as FEAST_FCO_TYPES ,
126+ name : selectedObjectName ,
127+ }
128+ : undefined
129+ }
38130 />
39131 </ >
40132 ) }
0 commit comments