@@ -64,15 +64,57 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
6464
6565 const [ searchInputValue , setSearchInputValue ] = React . useState ( '' ) ;
6666
67- const [ direction , setDirection ] = React . useState < Direction > ( ) ;
68- const [ filter , setFilter ] = React . useState < FilterDefinition | null > (
69- findFilter ( filterDefinitions , 'src_namespace' ) || filterDefinitions . length ? filterDefinitions [ 0 ] : null
67+ const getDefaultFilter = React . useCallback ( ( defs : FilterDefinition [ ] ) : FilterDefinition => {
68+ // Parent guarantees non-empty definitions
69+ return findFilter ( defs , 'src_namespace' ) || defs [ 0 ] ;
70+ } , [ ] ) ;
71+
72+ const getDefaultDirection = React . useCallback ( ( filter : FilterDefinition ) : Direction => {
73+ // Set direction based on filter's category or id prefix
74+ if ( filter . category === 'source' || filter . id . startsWith ( 'src_' ) ) {
75+ return 'source' ;
76+ } else if ( filter . category === 'destination' || filter . id . startsWith ( 'dst_' ) ) {
77+ return 'destination' ;
78+ }
79+ return undefined ;
80+ } , [ ] ) ;
81+
82+ const [ filter , setFilter ] = React . useState < FilterDefinition > ( ( ) => getDefaultFilter ( filterDefinitions ) ) ;
83+ const [ direction , setDirection ] = React . useState < Direction > ( ( ) =>
84+ getDefaultDirection ( getDefaultFilter ( filterDefinitions ) )
7085 ) ;
7186 const [ compare , setCompare ] = React . useState < FilterCompare > ( FilterCompare . equal ) ;
7287 const [ value , setValue ] = React . useState < string > ( '' ) ;
7388
7489 const [ showFilters , setShowFilters ] = useLocalStorage < boolean > ( localStorageShowFiltersKey , true ) ;
7590
91+ // Safe filter setter that validates the filter exists in filterDefinitions
92+ const setSafeFilter = React . useCallback (
93+ ( f : FilterDefinition | null | undefined ) => {
94+ if ( ! f ) {
95+ // If null/undefined, use default filter
96+ setFilter ( getDefaultFilter ( filterDefinitions ) ) ;
97+ } else if ( filterDefinitions . find ( fd => fd . id === f . id ) ) {
98+ // If filter exists in definitions, use it
99+ setFilter ( f ) ;
100+ } else {
101+ // If filter doesn't exist, fallback to default
102+ setFilter ( getDefaultFilter ( filterDefinitions ) ) ;
103+ }
104+ } ,
105+ [ filterDefinitions , getDefaultFilter ]
106+ ) ;
107+
108+ // Update filter if filterDefinitions changes and current filter is no longer valid
109+ React . useEffect ( ( ) => {
110+ if ( ! filterDefinitions . find ( fd => fd . id === filter . id ) ) {
111+ const newFilter = getDefaultFilter ( filterDefinitions ) ;
112+ setFilter ( newFilter ) ;
113+ // Sync direction with the new filter
114+ setDirection ( getDefaultDirection ( newFilter ) ) ;
115+ }
116+ } , [ filterDefinitions , filter , getDefaultFilter , getDefaultDirection ] ) ;
117+
76118 // reset and delay message state to trigger tooltip properly
77119 const setMessageWithDelay = React . useCallback (
78120 ( m : string | undefined ) => {
@@ -93,9 +135,6 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
93135 } , [ ] ) ;
94136
95137 const getFilterToolbar = React . useCallback ( ( ) => {
96- if ( ! filter ) {
97- return < > </ > ;
98- }
99138 return (
100139 < ToolbarItem className = "flex-start" >
101140 < Tooltip
@@ -118,7 +157,7 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
118157 value = { value }
119158 setValue = { setValue }
120159 setCompare = { setCompare }
121- setFilter = { setFilter }
160+ setFilter = { setSafeFilter }
122161 setDirection = { setDirection }
123162 setIndicator = { setIndicator }
124163 searchInputValue = { searchInputValue }
@@ -141,6 +180,7 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
141180 searchInputValue ,
142181 setFilters ,
143182 setMessageWithDelay ,
183+ setSafeFilter ,
144184 value
145185 ] ) ;
146186
0 commit comments