@ -73,6 +73,19 @@ class PrivacyDropdownMenu extends React.PureComponent {
this . props . onChange ( element . getAttribute ( 'data-index' ) ) ;
this . props . onChange ( element . getAttribute ( 'data-index' ) ) ;
}
}
break ;
break ;
case 'Tab' :
if ( e . shiftKey ) {
element = this . node . childNodes [ index - 1 ] || this . node . lastChild ;
} else {
element = this . node . childNodes [ index + 1 ] || this . node . firstChild ;
}
if ( element ) {
element . focus ( ) ;
this . props . onChange ( element . getAttribute ( 'data-index' ) ) ;
e . preventDefault ( ) ;
e . stopPropagation ( ) ;
}
break ;
case 'Home' :
case 'Home' :
element = this . node . firstChild ;
element = this . node . firstChild ;
if ( element ) {
if ( element ) {
@ -180,6 +193,9 @@ class PrivacyDropdown extends React.PureComponent {
}
}
} else {
} else {
const { top } = target . getBoundingClientRect ( ) ;
const { top } = target . getBoundingClientRect ( ) ;
if ( this . state . open && this . activeElement ) {
this . activeElement . focus ( ) ;
}
this . setState ( { placement : top * 2 < innerHeight ? 'bottom' : 'top' } ) ;
this . setState ( { placement : top * 2 < innerHeight ? 'bottom' : 'top' } ) ;
this . setState ( { open : ! this . state . open } ) ;
this . setState ( { open : ! this . state . open } ) ;
}
}
@ -202,7 +218,25 @@ class PrivacyDropdown extends React.PureComponent {
}
}
}
}
handleMouseDown = ( ) => {
if ( ! this . state . open ) {
this . activeElement = document . activeElement ;
}
}
handleButtonKeyDown = ( e ) => {
switch ( e . key ) {
case ' ' :
case 'Enter' :
this . handleMouseDown ( ) ;
break ;
}
}
handleClose = ( ) => {
handleClose = ( ) => {
if ( this . state . open && this . activeElement ) {
this . activeElement . focus ( ) ;
}
this . setState ( { open : false } ) ;
this . setState ( { open : false } ) ;
}
}
@ -239,6 +273,8 @@ class PrivacyDropdown extends React.PureComponent {
active = { open }
active = { open }
inverted
inverted
onClick = { this . handleToggle }
onClick = { this . handleToggle }
onMouseDown = { this . handleMouseDown }
onKeyDown = { this . handleButtonKeyDown }
style = { { height : null , lineHeight : '27px' } }
style = { { height : null , lineHeight : '27px' } }
/ >
/ >
< / d i v >
< / d i v >