[MM-61646]: Added logic to correctly give accessible name to channel header button (#29788)
* [MA-32]: Added logic to correctly give accessible name to channel header button * [MA-32]: Fixed id name * [MA-32]: Fixed failing e2e test case * [MA-32]: Updated the aria-label attribute
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
49948891ce
Коммит
ca2b3fd528
@@ -30,7 +30,7 @@ describe('Channel Settings - Channel Header', () => {
|
|||||||
cy.visit(`/${testTeam.name}/channels/${channel.name}`);
|
cy.visit(`/${testTeam.name}/channels/${channel.name}`);
|
||||||
|
|
||||||
// # Click on the channel name in the channel header to open the channel menu options
|
// # Click on the channel name in the channel header to open the channel menu options
|
||||||
cy.get('[aria-label="channel menu"]').click();
|
cy.get(`[aria-label="${channel.name.split('-').join(' ')} channel menu"]`).click();
|
||||||
|
|
||||||
// # Select the "Edit Channel Header" option from the dropdown
|
// # Select the "Edit Channel Header" option from the dropdown
|
||||||
cy.findByText('Edit Channel Header').click();
|
cy.findByText('Edit Channel Header').click();
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import type {UserProfile} from '@mattermost/types/users';
|
|||||||
|
|
||||||
import {Client4} from 'mattermost-redux/client';
|
import {Client4} from 'mattermost-redux/client';
|
||||||
import {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';
|
import {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';
|
||||||
|
import {getCurrentUser} from 'mattermost-redux/selectors/entities/users';
|
||||||
|
|
||||||
import {getIsRhsOpen} from 'selectors/rhs';
|
import {getIsRhsOpen} from 'selectors/rhs';
|
||||||
|
|
||||||
@@ -41,6 +42,7 @@ const ChannelHeaderTitle = ({
|
|||||||
const [showTooltip, setShowTooltip] = useState(false);
|
const [showTooltip, setShowTooltip] = useState(false);
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const channel = useSelector(getCurrentChannel);
|
const channel = useSelector(getCurrentChannel);
|
||||||
|
const currentUser = useSelector(getCurrentUser);
|
||||||
|
|
||||||
const headerItemRef = useRef<HTMLElement | null>(null);
|
const headerItemRef = useRef<HTMLElement | null>(null);
|
||||||
const isRHSOpen = useSelector(getIsRhsOpen);
|
const isRHSOpen = useSelector(getIsRhsOpen);
|
||||||
@@ -118,6 +120,20 @@ const ChannelHeaderTitle = ({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const personalChannelHeaderAriaLabel = intl.formatMessage({
|
||||||
|
id: 'channel_header.directchannel',
|
||||||
|
defaultMessage: '{displayName} (you) Channel Menu',
|
||||||
|
}, {
|
||||||
|
displayName: channel.display_name,
|
||||||
|
});
|
||||||
|
|
||||||
|
const othersChannelHeaderAriaLabel = intl.formatMessage({
|
||||||
|
id: 'channel_header.otherchannel',
|
||||||
|
defaultMessage: '{displayName} Channel Menu',
|
||||||
|
}, {
|
||||||
|
displayName: channel.display_name,
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='channel-header__top'>
|
<div className='channel-header__top'>
|
||||||
<ChannelHeaderTitleFavorite/>
|
<ChannelHeaderTitleFavorite/>
|
||||||
@@ -142,7 +158,9 @@ const ChannelHeaderTitle = ({
|
|||||||
<button
|
<button
|
||||||
id='channel_header.menuAriaLabel'
|
id='channel_header.menuAriaLabel'
|
||||||
className={classNames('channel-header__trigger style--none', {active: titleMenuOpen})}
|
className={classNames('channel-header__trigger style--none', {active: titleMenuOpen})}
|
||||||
aria-label={intl.formatMessage({id: 'channel_header.menuAriaLabel', defaultMessage: 'Channel Menu'}).toLowerCase()}
|
aria-label={
|
||||||
|
(isDirect && currentUser.id === dmUser?.id) ? personalChannelHeaderAriaLabel.toLowerCase() : othersChannelHeaderAriaLabel.toLowerCase()
|
||||||
|
}
|
||||||
aria-expanded={titleMenuOpen}
|
aria-expanded={titleMenuOpen}
|
||||||
aria-controls='channelHeaderDropdownMenu'
|
aria-controls='channelHeaderDropdownMenu'
|
||||||
>
|
>
|
||||||
@@ -166,11 +184,15 @@ const ChannelHeaderTitle = ({
|
|||||||
<span
|
<span
|
||||||
id='channelHeaderDropdownIcon'
|
id='channelHeaderDropdownIcon'
|
||||||
className='icon icon-chevron-down header-dropdown-chevron-icon'
|
className='icon icon-chevron-down header-dropdown-chevron-icon'
|
||||||
|
aria-hidden='true'
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
</strong>
|
</strong>
|
||||||
</div>
|
</div>
|
||||||
<ChannelHeaderDropdown/>
|
<ChannelHeaderDropdown
|
||||||
|
ariaLabel={
|
||||||
|
(isDirect && currentUser.id === dmUser?.id) ? personalChannelHeaderAriaLabel.toLowerCase() : othersChannelHeaderAriaLabel.toLowerCase()}
|
||||||
|
/>
|
||||||
</MenuWrapper>
|
</MenuWrapper>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,22 +2,20 @@
|
|||||||
// See LICENSE.txt for license information.
|
// See LICENSE.txt for license information.
|
||||||
|
|
||||||
import React, {memo} from 'react';
|
import React, {memo} from 'react';
|
||||||
import {useIntl} from 'react-intl';
|
|
||||||
|
|
||||||
import {ChannelHeaderDropdownItems} from 'components/channel_header_dropdown';
|
import {ChannelHeaderDropdownItems} from 'components/channel_header_dropdown';
|
||||||
import Menu from 'components/widgets/menu/menu';
|
import Menu from 'components/widgets/menu/menu';
|
||||||
|
|
||||||
const ChannelHeaderDropdown = () => {
|
const ChannelHeaderDropdown = ({ariaLabel}: {
|
||||||
const intl = useIntl();
|
ariaLabel: string;
|
||||||
|
}) =>
|
||||||
return (
|
(
|
||||||
<Menu
|
<Menu
|
||||||
id='channelHeaderDropdownMenu'
|
id='channelHeaderDropdownMenu'
|
||||||
ariaLabel={intl.formatMessage({id: 'channel_header.menuAriaLabel', defaultMessage: 'Channel Menu'}).toLowerCase()}
|
ariaLabel={ariaLabel}
|
||||||
>
|
>
|
||||||
<ChannelHeaderDropdownItems isMobile={false}/>
|
<ChannelHeaderDropdownItems isMobile={false}/>
|
||||||
</Menu>
|
</Menu>
|
||||||
);
|
);
|
||||||
};
|
|
||||||
|
|
||||||
export default memo(ChannelHeaderDropdown);
|
export default memo(ChannelHeaderDropdown);
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import menuItem from './menu_item';
|
|||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
onClick: (e: React.MouseEvent) => void;
|
onClick: (e: React.MouseEvent) => void;
|
||||||
ariaLabel?: string;
|
|
||||||
text: React.ReactNode;
|
text: React.ReactNode;
|
||||||
extraText?: string;
|
extraText?: string;
|
||||||
id?: string;
|
id?: string;
|
||||||
@@ -21,7 +20,6 @@ type Props = {
|
|||||||
}
|
}
|
||||||
export const MenuItemActionImpl = ({
|
export const MenuItemActionImpl = ({
|
||||||
onClick,
|
onClick,
|
||||||
ariaLabel,
|
|
||||||
text,
|
text,
|
||||||
extraText,
|
extraText,
|
||||||
id,
|
id,
|
||||||
@@ -36,7 +34,6 @@ export const MenuItemActionImpl = ({
|
|||||||
<button
|
<button
|
||||||
data-testid={id}
|
data-testid={id}
|
||||||
id={id}
|
id={id}
|
||||||
aria-label={ariaLabel}
|
|
||||||
className={classNames('style--none', buttonClass, {
|
className={classNames('style--none', buttonClass, {
|
||||||
'MenuItem__with-help': extraText,
|
'MenuItem__with-help': extraText,
|
||||||
'MenuItem__with-sibling': sibling,
|
'MenuItem__with-sibling': sibling,
|
||||||
|
|||||||
@@ -3208,6 +3208,7 @@
|
|||||||
"channel_header.closeChannelInfo": "Close Info",
|
"channel_header.closeChannelInfo": "Close Info",
|
||||||
"channel_header.convert": "Convert to Private Channel",
|
"channel_header.convert": "Convert to Private Channel",
|
||||||
"channel_header.delete": "Archive Channel",
|
"channel_header.delete": "Archive Channel",
|
||||||
|
"channel_header.directchannel": "{displayName} (you) Channel Menu",
|
||||||
"channel_header.directchannel.you": "{displayname} (you) ",
|
"channel_header.directchannel.you": "{displayname} (you) ",
|
||||||
"channel_header.flagged": "Saved messages",
|
"channel_header.flagged": "Saved messages",
|
||||||
"channel_header.groupMessageHasGuests": "This group message has guests",
|
"channel_header.groupMessageHasGuests": "This group message has guests",
|
||||||
@@ -3220,6 +3221,7 @@
|
|||||||
"channel_header.mute": "Mute Channel",
|
"channel_header.mute": "Mute Channel",
|
||||||
"channel_header.muteConversation": "Mute Conversation",
|
"channel_header.muteConversation": "Mute Conversation",
|
||||||
"channel_header.openChannelInfo": "View Info",
|
"channel_header.openChannelInfo": "View Info",
|
||||||
|
"channel_header.otherchannel": "{displayName} Channel Menu",
|
||||||
"channel_header.pinnedPosts": "Pinned messages",
|
"channel_header.pinnedPosts": "Pinned messages",
|
||||||
"channel_header.recentMentions": "Recent mentions",
|
"channel_header.recentMentions": "Recent mentions",
|
||||||
"channel_header.rename": "Rename Channel",
|
"channel_header.rename": "Rename Channel",
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user