Skip to content

Commit 541ed78

Browse files
committed
fix: close filter dropdown after click outside
1 parent 7ba746b commit 541ed78

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

packages/module/src/DataViewFilters/DataViewFilters.tsx

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
import React, { useMemo, useState, useRef, useEffect, ReactElement } from 'react';
1+
import React, { useMemo, useState, useRef, useEffect, ReactElement, ReactNode } from 'react';
22
import {
33
Menu, MenuContent, MenuItem, MenuList, MenuToggle, Popper, ToolbarGroup, ToolbarToggleGroup, ToolbarToggleGroupProps,
44
} from '@patternfly/react-core';
55
import { 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
815
interface 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
);

packages/module/src/DataViewTextFilter/DataViewTextFilter.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export const DataViewTextFilter: React.FC<DataViewTextFilterProps> = ({
3131
...props
3232
}: DataViewTextFilterProps) => (
3333
<ToolbarFilter
34+
key={ouiaId}
3435
data-ouia-component-id={ouiaId}
3536
chips={value.length > 0 ? [ { key: title, node: value } ] : []}
3637
deleteChip={() => onChange?.(undefined, '')}

0 commit comments

Comments
 (0)