1- import { Children , isValidElement , cloneElement , useMemo , useState , useRef , useEffect , ReactElement , ReactNode } from 'react' ;
1+ import { Children , isValidElement , cloneElement , useMemo , useCallback , useState , useRef , useEffect , ReactElement , ReactNode } from 'react' ;
22import {
33 Menu , MenuContent , MenuItem , MenuList , MenuToggle , Popper , ToolbarGroup , ToolbarToggleGroup , ToolbarToggleGroupProps ,
44} from '@patternfly/react-core' ;
@@ -31,6 +31,8 @@ export interface DataViewFiltersProps<T extends object> extends Omit<ToolbarTogg
3131 breakpoint ?: ToolbarToggleGroupProps [ 'breakpoint' ] ;
3232 /** Custom OUIA ID */
3333 ouiaId ?: string ;
34+ /** Optional filterId to use as the default active filter. Falls back to the first filter when not specified. The active filter resets to this value when all filter values are cleared. */
35+ defaultActiveFilter ?: string ;
3436} ;
3537
3638
@@ -41,6 +43,7 @@ export const DataViewFilters = <T extends object>({
4143 breakpoint = 'xl' ,
4244 onChange,
4345 values,
46+ defaultActiveFilter,
4447 ...props
4548} : DataViewFiltersProps < T > ) => {
4649 const [ activeAttributeMenu , setActiveAttributeMenu ] = useState < string > ( '' ) ;
@@ -60,9 +63,25 @@ export const DataViewFilters = <T extends object>({
6063 isValidElement ( child ) ? { filterId : String ( ( child . props as any ) . filterId ) , title : String ( ( child . props as any ) . title ) } : undefined
6164 ) . filter ( ( item ) : item is DataViewFilterIdentifiers => ! ! item ) , [ childrenHash ] ) ; // eslint-disable-line react-hooks/exhaustive-deps
6265
66+ const getDefaultTitle = useCallback ( ( ) => {
67+ if ( defaultActiveFilter ) {
68+ const match = filterItems . find ( item => item . filterId === defaultActiveFilter ) ;
69+ if ( match ) {
70+ return match . title ;
71+ }
72+ }
73+ return filterItems . length > 0 ? filterItems [ 0 ] . title : '' ;
74+ } , [ defaultActiveFilter , filterItems ] ) ;
75+
76+ useEffect ( ( ) => {
77+ setActiveAttributeMenu ( getDefaultTitle ( ) ) ;
78+ } , [ filterItems , getDefaultTitle ] ) ;
79+
6380 useEffect ( ( ) => {
64- filterItems . length > 0 && setActiveAttributeMenu ( filterItems [ 0 ] . title ) ;
65- } , [ filterItems ] ) ;
81+ if ( values && Object . values ( values ) . every ( v => v === '' || v === undefined || ( Array . isArray ( v ) && v . length === 0 ) ) ) {
82+ setActiveAttributeMenu ( getDefaultTitle ( ) ) ;
83+ }
84+ } , [ values , getDefaultTitle ] ) ;
6685
6786 const handleClickOutside = ( event : MouseEvent ) =>
6887 isAttributeMenuOpen &&
0 commit comments