1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-09 00:18:00 +01:00

refactor: improve header button ARIA attrs (#957)

* refactor: fix header docs icon color

* refactor: improve header button ARIA attrs
This commit is contained in:
olav 2022-05-06 11:38:11 +02:00 committed by GitHub
parent 02ab34ef0e
commit 7785e2c717
4 changed files with 31 additions and 15 deletions

View File

@ -55,7 +55,7 @@ const DropdownMenu: VFC<IDropdownMenuProps> = ({
onClick={handleOpen} onClick={handleOpen}
style={style} style={style}
aria-controls={id} aria-controls={id}
aria-haspopup="true" aria-expanded={Boolean(anchor)}
icon={icon} icon={icon}
{...rest} {...rest}
/> />

View File

@ -22,12 +22,14 @@ import { filterByFlags } from 'component/common/util';
import { useAuthPermissions } from 'hooks/api/getters/useAuth/useAuthPermissions'; import { useAuthPermissions } from 'hooks/api/getters/useAuth/useAuthPermissions';
import { useStyles } from './Header.styles'; import { useStyles } from './Header.styles';
import classNames from 'classnames'; import classNames from 'classnames';
import { useId } from 'hooks/useId';
const Header: VFC = () => { const Header: VFC = () => {
const theme = useTheme(); const theme = useTheme();
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null); const adminId = useId();
const [anchorElAdvanced, setAnchorElAdvanced] = const configId = useId();
useState<HTMLButtonElement | null>(null); const [adminRef, setAdminRef] = useState<HTMLButtonElement | null>(null);
const [configRef, setConfigRef] = useState<HTMLButtonElement | null>(null);
const [admin, setAdmin] = useState(false); const [admin, setAdmin] = useState(false);
const { permissions } = useAuthPermissions(); const { permissions } = useAuthPermissions();
@ -40,8 +42,8 @@ const Header: VFC = () => {
const [openDrawer, setOpenDrawer] = useState(false); const [openDrawer, setOpenDrawer] = useState(false);
const toggleDrawer = () => setOpenDrawer(prev => !prev); const toggleDrawer = () => setOpenDrawer(prev => !prev);
const handleClose = () => setAnchorEl(null); const onAdminClose = () => setAdminRef(null);
const handleCloseAdvanced = () => setAnchorElAdvanced(null); const onConfigureClose = () => setConfigRef(null);
useEffect(() => { useEffect(() => {
const admin = permissions?.find( const admin = permissions?.find(
@ -119,16 +121,18 @@ const Header: VFC = () => {
</Link> </Link>
<button <button
className={styles.advancedNavButton} className={styles.advancedNavButton}
onClick={e => setAnchorElAdvanced(e.currentTarget)} onClick={e => setConfigRef(e.currentTarget)}
aria-controls={configRef ? configId : undefined}
aria-expanded={Boolean(configRef)}
> >
Configure Configure
<KeyboardArrowDown className={styles.icon} /> <KeyboardArrowDown className={styles.icon} />
</button> </button>
<NavigationMenu <NavigationMenu
id="settings-navigation" id={configId}
options={filteredMainRoutes.mainNavRoutes} options={filteredMainRoutes.mainNavRoutes}
anchorEl={anchorElAdvanced} anchorEl={configRef}
handleClose={handleCloseAdvanced} handleClose={onConfigureClose}
style={{ top: 10 }} style={{ top: 10 }}
/> />
</div> </div>
@ -142,7 +146,7 @@ const Header: VFC = () => {
disableRipple disableRipple
className={themeStyles.focusable} className={themeStyles.focusable}
> >
<MenuBookIcon className={styles.icon} /> <MenuBookIcon />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
<ConditionallyRender <ConditionallyRender
@ -151,12 +155,16 @@ const Header: VFC = () => {
<Tooltip title="Settings"> <Tooltip title="Settings">
<IconButton <IconButton
onClick={e => onClick={e =>
setAnchorEl(e.currentTarget) setAdminRef(e.currentTarget)
} }
className={classNames( className={classNames(
styles.wideButton, styles.wideButton,
themeStyles.focusable themeStyles.focusable
)} )}
aria-controls={
adminRef ? adminId : undefined
}
aria-expanded={Boolean(adminRef)}
size="large" size="large"
disableRipple disableRipple
> >
@ -169,10 +177,10 @@ const Header: VFC = () => {
} }
/> />
<NavigationMenu <NavigationMenu
id="admin-navigation" id={adminId}
options={filteredMainRoutes.adminRoutes} options={filteredMainRoutes.adminRoutes}
anchorEl={anchorEl} anchorEl={adminRef}
handleClose={handleClose} handleClose={onAdminClose}
style={{ top: 5, left: -100 }} style={{ top: 5, left: -100 }}
/>{' '} />{' '}
<UserProfile /> <UserProfile />

View File

@ -9,6 +9,7 @@ import { IUser } from 'interfaces/user';
import { ILocationSettings } from 'hooks/useLocationSettings'; import { ILocationSettings } from 'hooks/useLocationSettings';
import { HEADER_USER_AVATAR } from 'utils/testIds'; import { HEADER_USER_AVATAR } from 'utils/testIds';
import unknownUser from 'assets/icons/unknownUser.png'; import unknownUser from 'assets/icons/unknownUser.png';
import { useId } from 'hooks/useId';
interface IUserProfileProps { interface IUserProfileProps {
profile: IUser; profile: IUser;
@ -25,6 +26,7 @@ const UserProfile = ({
}: IUserProfileProps) => { }: IUserProfileProps) => {
const [showProfile, setShowProfile] = useState(false); const [showProfile, setShowProfile] = useState(false);
const [currentLocale, setCurrentLocale] = useState<string>(); const [currentLocale, setCurrentLocale] = useState<string>();
const modalId = useId();
const { classes: styles } = useStyles(); const { classes: styles } = useStyles();
const { classes: themeStyles } = useThemeStyles(); const { classes: themeStyles } = useThemeStyles();
@ -67,6 +69,8 @@ const UserProfile = ({
styles.button styles.button
)} )}
onClick={() => setShowProfile(prev => !prev)} onClick={() => setShowProfile(prev => !prev)}
aria-controls={showProfile ? modalId : undefined}
aria-expanded={showProfile}
color="secondary" color="secondary"
disableRipple disableRipple
> >
@ -78,6 +82,7 @@ const UserProfile = ({
<KeyboardArrowDownIcon className={styles.icon} /> <KeyboardArrowDownIcon className={styles.icon} />
</Button> </Button>
<UserProfileContent <UserProfileContent
id={modalId}
showProfile={showProfile} showProfile={showProfile}
imageUrl={imageUrl} imageUrl={imageUrl}
profile={profile} profile={profile}

View File

@ -22,6 +22,7 @@ import { IUser } from 'interfaces/user';
import { ILocationSettings } from 'hooks/useLocationSettings'; import { ILocationSettings } from 'hooks/useLocationSettings';
interface IUserProfileContentProps { interface IUserProfileContentProps {
id: string;
showProfile: boolean; showProfile: boolean;
profile: IUser; profile: IUser;
possibleLocales: string[]; possibleLocales: string[];
@ -34,6 +35,7 @@ interface IUserProfileContentProps {
} }
const UserProfileContent = ({ const UserProfileContent = ({
id,
showProfile, showProfile,
profile, profile,
possibleLocales, possibleLocales,
@ -67,6 +69,7 @@ const UserProfileContent = ({
condition={showProfile} condition={showProfile}
show={ show={
<Paper <Paper
id={id}
className={classnames( className={classnames(
styles.profile, styles.profile,
themeStyles.flexColumn, themeStyles.flexColumn,