mirror of
				https://github.com/Azure/cosmos-explorer.git
				synced 2025-10-31 07:01:19 +00:00 
			
		
		
		
	Fix expand/collapse tree button of Data Explorer page is not accessible through keyboard (#1067)
* Fix ally issues for newCollection panel's advanced section * Resolved test snapshot issue * Fix a11y data explorer expand/collapse using keyboard issue
This commit is contained in:
		
							parent
							
								
									4cbbef9574
								
							
						
					
					
						commit
						c28593b752
					
				| @ -1,6 +1,7 @@ | |||||||
| import React, { FunctionComponent } from "react"; | import React, { FunctionComponent, MutableRefObject, useEffect, useRef } from "react"; | ||||||
| import arrowLeftImg from "../../images/imgarrowlefticon.svg"; | import arrowLeftImg from "../../images/imgarrowlefticon.svg"; | ||||||
| import { userContext } from "../UserContext"; | import { userContext } from "../UserContext"; | ||||||
|  | import { NormalizedEventKey } from "./Constants"; | ||||||
| 
 | 
 | ||||||
| export interface CollapsedResourceTreeProps { | export interface CollapsedResourceTreeProps { | ||||||
|   toggleLeftPaneExpanded: () => void; |   toggleLeftPaneExpanded: () => void; | ||||||
| @ -11,6 +12,21 @@ export const CollapsedResourceTree: FunctionComponent<CollapsedResourceTreeProps | |||||||
|   toggleLeftPaneExpanded, |   toggleLeftPaneExpanded, | ||||||
|   isLeftPaneExpanded, |   isLeftPaneExpanded, | ||||||
| }: CollapsedResourceTreeProps): JSX.Element => { | }: CollapsedResourceTreeProps): JSX.Element => { | ||||||
|  |   const focusButton = useRef<HTMLLIElement>() as MutableRefObject<HTMLLIElement>; | ||||||
|  | 
 | ||||||
|  |   useEffect(() => { | ||||||
|  |     if (focusButton.current) { | ||||||
|  |       focusButton.current.focus(); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   const onKeyPressToggleLeftPaneExpanded = (event: React.KeyboardEvent) => { | ||||||
|  |     if (event.key === NormalizedEventKey.Space || event.key === NormalizedEventKey.Enter) { | ||||||
|  |       toggleLeftPaneExpanded(); | ||||||
|  |       event.stopPropagation(); | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|   return ( |   return ( | ||||||
|     <div id="mini" className={!isLeftPaneExpanded ? "mini toggle-mini" : "hiddenMain"}> |     <div id="mini" className={!isLeftPaneExpanded ? "mini toggle-mini" : "hiddenMain"}> | ||||||
|       <div className="main-nav nav"> |       <div className="main-nav nav"> | ||||||
| @ -21,11 +37,14 @@ export const CollapsedResourceTree: FunctionComponent<CollapsedResourceTreeProps | |||||||
|             role="button" |             role="button" | ||||||
|             tabIndex={0} |             tabIndex={0} | ||||||
|             aria-label="Expand Tree" |             aria-label="Expand Tree" | ||||||
|  |             onClick={toggleLeftPaneExpanded} | ||||||
|  |             onKeyPress={onKeyPressToggleLeftPaneExpanded} | ||||||
|  |             ref={focusButton} | ||||||
|           > |           > | ||||||
|             <span className="leftarrowCollapsed" onClick={toggleLeftPaneExpanded}> |             <span className="leftarrowCollapsed"> | ||||||
|               <img className="arrowCollapsed" src={arrowLeftImg} alt="Expand" /> |               <img className="arrowCollapsed" src={arrowLeftImg} alt="Expand" /> | ||||||
|             </span> |             </span> | ||||||
|             <span className="collectionCollapsed" onClick={toggleLeftPaneExpanded}> |             <span className="collectionCollapsed"> | ||||||
|               <span>{userContext.apiType} API</span> |               <span>{userContext.apiType} API</span> | ||||||
|             </span> |             </span> | ||||||
|           </li> |           </li> | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| import React, { FunctionComponent } from "react"; | import React, { FunctionComponent, MutableRefObject, useEffect, useRef } from "react"; | ||||||
| import arrowLeftImg from "../../images/imgarrowlefticon.svg"; | import arrowLeftImg from "../../images/imgarrowlefticon.svg"; | ||||||
| import refreshImg from "../../images/refresh-cosmos.svg"; | import refreshImg from "../../images/refresh-cosmos.svg"; | ||||||
| import { AuthType } from "../AuthType"; | import { AuthType } from "../AuthType"; | ||||||
| @ -6,6 +6,7 @@ import Explorer from "../Explorer/Explorer"; | |||||||
| import { ResourceTokenTree } from "../Explorer/Tree/ResourceTokenTree"; | import { ResourceTokenTree } from "../Explorer/Tree/ResourceTokenTree"; | ||||||
| import { ResourceTree } from "../Explorer/Tree/ResourceTree"; | import { ResourceTree } from "../Explorer/Tree/ResourceTree"; | ||||||
| import { userContext } from "../UserContext"; | import { userContext } from "../UserContext"; | ||||||
|  | import { NormalizedEventKey } from "./Constants"; | ||||||
| 
 | 
 | ||||||
| export interface ResourceTreeContainerProps { | export interface ResourceTreeContainerProps { | ||||||
|   toggleLeftPaneExpanded: () => void; |   toggleLeftPaneExpanded: () => void; | ||||||
| @ -18,6 +19,22 @@ export const ResourceTreeContainer: FunctionComponent<ResourceTreeContainerProps | |||||||
|   isLeftPaneExpanded, |   isLeftPaneExpanded, | ||||||
|   container, |   container, | ||||||
| }: ResourceTreeContainerProps): JSX.Element => { | }: ResourceTreeContainerProps): JSX.Element => { | ||||||
|  |   const focusButton = useRef<HTMLLIElement>() as MutableRefObject<HTMLLIElement>; | ||||||
|  | 
 | ||||||
|  |   useEffect(() => { | ||||||
|  |     if (isLeftPaneExpanded) { | ||||||
|  |       if (focusButton.current) { | ||||||
|  |         focusButton.current.focus(); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   const onKeyPressToggleLeftPaneExpanded = (event: React.KeyboardEvent) => { | ||||||
|  |     if (event.key === NormalizedEventKey.Space || event.key === NormalizedEventKey.Enter) { | ||||||
|  |       toggleLeftPaneExpanded(); | ||||||
|  |       event.stopPropagation(); | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|   return ( |   return ( | ||||||
|     <div id="main" className={isLeftPaneExpanded ? "main" : "hiddenMain"}> |     <div id="main" className={isLeftPaneExpanded ? "main" : "hiddenMain"}> | ||||||
|       {/* Collections Window - - Start */} |       {/* Collections Window - - Start */} | ||||||
| @ -43,9 +60,11 @@ export const ResourceTreeContainer: FunctionComponent<ResourceTreeContainerProps | |||||||
|                 id="expandToggleLeftPaneButton" |                 id="expandToggleLeftPaneButton" | ||||||
|                 role="button" |                 role="button" | ||||||
|                 onClick={toggleLeftPaneExpanded} |                 onClick={toggleLeftPaneExpanded} | ||||||
|  |                 onKeyPress={onKeyPressToggleLeftPaneExpanded} | ||||||
|                 tabIndex={0} |                 tabIndex={0} | ||||||
|                 aria-label="Collapse Tree" |                 aria-label="Collapse Tree" | ||||||
|                 title="Collapse Tree" |                 title="Collapse Tree" | ||||||
|  |                 ref={focusButton} | ||||||
|               > |               > | ||||||
|                 <img className="refreshcol1" src={arrowLeftImg} alt="Hide" /> |                 <img className="refreshcol1" src={arrowLeftImg} alt="Hide" /> | ||||||
|               </span> |               </span> | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| import { Icon, Label, Stack } from "@fluentui/react"; | import { Icon, Label, Stack } from "@fluentui/react"; | ||||||
| import * as React from "react"; | import * as React from "react"; | ||||||
|  | import { NormalizedEventKey } from "../../../Common/Constants"; | ||||||
| import { accordionStackTokens } from "../Settings/SettingsRenderUtils"; | import { accordionStackTokens } from "../Settings/SettingsRenderUtils"; | ||||||
| 
 | 
 | ||||||
| export interface CollapsibleSectionProps { | export interface CollapsibleSectionProps { | ||||||
| @ -30,6 +31,13 @@ export class CollapsibleSectionComponent extends React.Component<CollapsibleSect | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   private onKeyPress = (event: React.KeyboardEvent) => { | ||||||
|  |     if (event.key === NormalizedEventKey.Space || event.key === NormalizedEventKey.Enter) { | ||||||
|  |       this.toggleCollapsed(); | ||||||
|  |       event.stopPropagation(); | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|   public render(): JSX.Element { |   public render(): JSX.Element { | ||||||
|     return ( |     return ( | ||||||
|       <> |       <> | ||||||
| @ -39,6 +47,11 @@ export class CollapsibleSectionComponent extends React.Component<CollapsibleSect | |||||||
|           verticalAlign="center" |           verticalAlign="center" | ||||||
|           tokens={accordionStackTokens} |           tokens={accordionStackTokens} | ||||||
|           onClick={this.toggleCollapsed} |           onClick={this.toggleCollapsed} | ||||||
|  |           onKeyPress={this.onKeyPress} | ||||||
|  |           tabIndex={0} | ||||||
|  |           aria-name="Advanced" | ||||||
|  |           role="button" | ||||||
|  |           aria-expanded={this.state.isExpanded} | ||||||
|         > |         > | ||||||
|           <Icon iconName={this.state.isExpanded ? "ChevronDown" : "ChevronRight"} /> |           <Icon iconName={this.state.isExpanded ? "ChevronDown" : "ChevronRight"} /> | ||||||
|           <Label>{this.props.title}</Label> |           <Label>{this.props.title}</Label> | ||||||
|  | |||||||
| @ -3,9 +3,14 @@ | |||||||
| exports[`CollapsibleSectionComponent renders 1`] = ` | exports[`CollapsibleSectionComponent renders 1`] = ` | ||||||
| <Fragment> | <Fragment> | ||||||
|   <Stack |   <Stack | ||||||
|  |     aria-expanded={true} | ||||||
|  |     aria-name="Advanced" | ||||||
|     className="collapsibleSection" |     className="collapsibleSection" | ||||||
|     horizontal={true} |     horizontal={true} | ||||||
|     onClick={[Function]} |     onClick={[Function]} | ||||||
|  |     onKeyPress={[Function]} | ||||||
|  |     role="button" | ||||||
|  |     tabIndex={0} | ||||||
|     tokens={ |     tokens={ | ||||||
|       Object { |       Object { | ||||||
|         "childrenGap": 10, |         "childrenGap": 10, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user