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:
parent
02ab34ef0e
commit
7785e2c717
@ -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}
|
||||||
/>
|
/>
|
||||||
|
@ -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 />
|
||||||
|
@ -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}
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user