1- import React , { useMemo , useState , useRef , useEffect , ReactElement } from 'react' ;
1+ import React , { useMemo , useState , useRef , useEffect , ReactElement , ReactNode } from 'react' ;
22import {
33 Menu , MenuContent , MenuItem , MenuList , MenuToggle , Popper , ToolbarGroup , ToolbarToggleGroup , ToolbarToggleGroupProps ,
44} from '@patternfly/react-core' ;
55import { FilterIcon } from '@patternfly/react-icons' ;
66
7+ export interface DataViewFilterOption {
8+ /** Filter option label */
9+ label : ReactNode ;
10+ /** Filter option value */
11+ value : string ;
12+ }
13+
714// helper interface to generate attribute menu
815interface DataViewFilterIdentifiers {
916 filterId : string ;
@@ -57,6 +64,19 @@ export const DataViewFilters = <T extends object>({
5764 filterItems . length > 0 && setActiveAttributeMenu ( filterItems [ 0 ] . title ) ;
5865 } , [ filterItems ] ) ;
5966
67+ const handleClickOutside = ( event : MouseEvent ) =>
68+ isAttributeMenuOpen &&
69+ ! attributeMenuRef . current ?. contains ( event . target as Node ) &&
70+ ! attributeToggleRef . current ?. contains ( event . target as Node )
71+ && setIsAttributeMenuOpen ( false ) ;
72+
73+ useEffect ( ( ) => {
74+ window . addEventListener ( 'click' , handleClickOutside ) ;
75+ return ( ) => {
76+ window . removeEventListener ( 'click' , handleClickOutside ) ;
77+ } ;
78+ } , [ isAttributeMenuOpen ] ) ; // eslint-disable-line react-hooks/exhaustive-deps
79+
6080 const attributeToggle = (
6181 < MenuToggle
6282 ref = { attributeToggleRef }
@@ -102,9 +122,9 @@ export const DataViewFilters = <T extends object>({
102122 isVisible = { isAttributeMenuOpen }
103123 />
104124 </ div >
105- { React . Children . map ( children , ( child ) => (
106- React . isValidElement ( child ) ? (
107- React . cloneElement ( child as ReactElement < {
125+ { React . Children . map ( children , ( child ) =>
126+ React . isValidElement ( child )
127+ ? React . cloneElement ( child as ReactElement < {
108128 showToolbarItem : boolean ;
109129 onChange : ( _e : unknown , values : unknown ) => void ;
110130 value : unknown ;
@@ -114,9 +134,8 @@ export const DataViewFilters = <T extends object>({
114134 value : values ?. [ child . props . filterId ] ,
115135 ...child . props
116136 } )
117- ) : child
118- ) ) }
119-
137+ : child
138+ ) }
120139 </ ToolbarGroup >
121140 </ ToolbarToggleGroup >
122141 ) ;
0 commit comments