Skip to content

Commit f27df10

Browse files
PKulkoRaccoonGangvladislavkeblysh
authored andcommitted
feat: [AsPu-651] added the ability to close the hint using the keyboard
1 parent 3cbbb02 commit f27df10

2 files changed

Lines changed: 73 additions & 2 deletions

File tree

src/course-home/progress-tab/grades/grade-summary/GradeSummaryHeader.jsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import React, { useState } from 'react';
12
import PropTypes from 'prop-types';
23

34
import { useIntl } from '@edx/frontend-platform/i18n';
4-
import { Icon, OverlayTrigger, Tooltip } from '@openedx/paragon';
5+
import { Icon, OverlayTrigger, Tooltip, IconButton } from '@openedx/paragon';
56
import { Blocked, InfoOutline } from '@openedx/paragon/icons';
67
import { useContextId } from '../../../../data/hooks';
78

@@ -14,6 +15,13 @@ const GradeSummaryHeader = ({ allOfSomeAssignmentTypeIsLocked }) => {
1415
const {
1516
gradesFeatureIsFullyLocked,
1617
} = useModel('progress', courseId);
18+
const [showTooltip, setShowTooltip] = useState(false);
19+
20+
const handleKeyDown = (event) => {
21+
if (event.key === 'Escape') {
22+
setShowTooltip(false);
23+
}
24+
};
1725

1826
return (
1927
<div className="row w-100 m-0 align-items-center">
@@ -27,7 +35,10 @@ const GradeSummaryHeader = ({ allOfSomeAssignmentTypeIsLocked }) => {
2735
</Tooltip>
2836
)}
2937
>
30-
<Icon
38+
<IconButton
39+
onClick={() => { setShowTooltip(!showTooltip); }}
40+
onBlur={() => { setShowTooltip(false); }}
41+
onKeyDown={handleKeyDown}
3142
alt={intl.formatMessage(messages.gradeSummaryTooltipAlt)}
3243
src={InfoOutline}
3344
className="mb-3"
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import React from 'react';
2+
import {
3+
render, screen, waitFor,
4+
} from '@testing-library/react';
5+
import userEvent from '@testing-library/user-event';
6+
import { useSelector } from 'react-redux';
7+
import { IntlProvider } from 'react-intl';
8+
9+
import GradeSummaryHeader from './GradeSummaryHeader';
10+
import { useModel } from '../../../../generic/model-store';
11+
import messages from '../messages';
12+
13+
jest.mock('react-redux', () => ({
14+
useSelector: jest.fn(),
15+
}));
16+
17+
jest.mock('../../../../generic/model-store', () => ({
18+
useModel: jest.fn(),
19+
}));
20+
21+
describe('GradeSummaryHeader', () => {
22+
beforeEach(() => {
23+
useSelector.mockImplementation((selector) => selector({
24+
courseHome: { courseId: 'test-course-id' },
25+
}));
26+
useModel.mockReturnValue({ gradesFeatureIsFullyLocked: false });
27+
});
28+
29+
const renderComponent = (props = {}) => {
30+
render(
31+
<IntlProvider locale="en" messages={messages}>
32+
<GradeSummaryHeader
33+
intl={{ formatMessage: jest.fn((msg) => msg.defaultMessage) }}
34+
allOfSomeAssignmentTypeIsLocked={false}
35+
{...props}
36+
/>
37+
</IntlProvider>,
38+
);
39+
};
40+
41+
it('opens and closes the tooltip when Escape is pressed', async () => {
42+
renderComponent();
43+
44+
const iconButton = screen.getByRole('button', {
45+
name: messages.gradeSummaryTooltipAlt.defaultMessage,
46+
});
47+
48+
userEvent.click(iconButton);
49+
50+
await waitFor(() => {
51+
expect(screen.getByText(messages.gradeSummaryTooltipBody.defaultMessage)).toBeVisible();
52+
});
53+
54+
userEvent.keyboard('{Escape}');
55+
56+
await waitFor(() => {
57+
expect(screen.queryByText(messages.gradeSummaryTooltipBody.defaultMessage)).not.toBeInTheDocument();
58+
});
59+
});
60+
});

0 commit comments

Comments
 (0)