1- import React , { forwardRef , useEffect , useImperativeHandle , useRef } from 'react' ;
2- import { types } from "sass" ;
3- import Boolean = types . Boolean ;
1+ import React , { useEffect , useRef } from 'react' ;
42
53
6- const DropDownMenu = forwardRef ( ( props : any , forwardedRef ) => {
4+ export default function DropDownMenu ( props ) {
75 const ref = useRef ( null ) ;
86 const Wrapper = props . wrapperElement ?? 'li' ;
97
108 useEffect ( ( ) => {
11- const closeSubmenu = ( event ) => {
12- if ( ! ref . current ?. parentElement ?. contains ( event . target ) ) {
13- ref . current . setAttribute ( 'aria-expanded' , 'false' ) ;
9+ const handleClick = ( event ) => {
10+ const current = ref . current as HTMLElement ;
11+ let target = event . target ;
12+ if ( ! current . contains ( target ) ) {
13+ current . setAttribute ( 'aria-expanded' , 'false' ) ;
14+ return ;
15+ }
16+ if ( current . ariaExpanded === 'false' ) {
17+ for ( let target = event . target ; target ; target = target . parentElement ) {
18+ if ( target . role === 'listbox' ) {
19+ return ;
20+ }
21+ }
22+ current . setAttribute ( 'aria-expanded' , 'true' ) ;
23+ } else {
24+ for ( let target = event . target ; target ; target = target . parentElement ) {
25+ if ( target . ariaMultiSelectable ) {
26+ return ;
27+ }
28+ if ( target === current ) {
29+ current . setAttribute ( 'aria-expanded' , 'false' ) ;
30+ break ;
31+ }
32+ }
1433 }
1534 } ;
1635 const rootNode = ref . current . getRootNode ( ) ;
17- rootNode . addEventListener ( 'click' , closeSubmenu ) ;
18- return ( ) => rootNode . removeEventListener ( 'click' , closeSubmenu ) ;
36+ rootNode . addEventListener ( 'click' , handleClick ) ;
37+ return ( ) => rootNode . removeEventListener ( 'click' , handleClick ) ;
1938 } , [ ] ) ;
2039
21- useImperativeHandle ( forwardedRef , ( ) => ( { toggleSubmenu} ) ) ;
22-
23- function toggleSubmenu ( force ?: boolean ) {
24- if ( force === undefined ) {
25- ref . current . setAttribute ( 'aria-expanded' , ref . current . ariaExpanded === 'true' ? 'false' : 'true' ) ;
26- } else {
27- ref . current . setAttribute ( 'aria-expanded' , ( ! force ) . toString ( ) ) ;
28- }
29- }
30-
3140 return (
3241 < Wrapper
3342 ref = { ref }
3443 role = { props . role ? `combobox ${ props . role } ` : 'combobox' }
3544 aria-haspopup = "listbox"
3645 aria-expanded = "false"
37- onClick = { ( ) => toggleSubmenu ( ) }
3846 className = { props . className }
3947 data-tooltip-id = "django-finder-tooltip"
4048 data-tooltip-content = { props . tooltip }
@@ -45,7 +53,4 @@ const DropDownMenu = forwardRef((props: any, forwardedRef)=> {
4553 </ ul >
4654 </ Wrapper >
4755 )
48- } ) ;
49-
50-
51- export default DropDownMenu ;
56+ }
0 commit comments