Skip to content

Commit e42a23a

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

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

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

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
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 {
6+
Icon, OverlayTrigger, Tooltip, IconButton,
7+
} from '@openedx/paragon';
58
import { Blocked, InfoOutline } from '@openedx/paragon/icons';
69
import { useContextId } from '../../../../data/hooks';
710

@@ -14,6 +17,13 @@ const GradeSummaryHeader = ({ allOfSomeAssignmentTypeIsLocked }) => {
1417
const {
1518
gradesFeatureIsFullyLocked,
1619
} = useModel('progress', courseId);
20+
const [showTooltip, setShowTooltip] = useState(false);
21+
22+
const handleKeyDown = (event) => {
23+
if (event.key === 'Escape') {
24+
setShowTooltip(false);
25+
}
26+
};
1727

1828
return (
1929
<div className="row w-100 m-0 align-items-center">
@@ -27,7 +37,10 @@ const GradeSummaryHeader = ({ allOfSomeAssignmentTypeIsLocked }) => {
2737
</Tooltip>
2838
)}
2939
>
30-
<Icon
40+
<IconButton
41+
onClick={() => { setShowTooltip(!showTooltip); }}
42+
onBlur={() => { setShowTooltip(false); }}
43+
onKeyDown={handleKeyDown}
3144
alt={intl.formatMessage(messages.gradeSummaryTooltipAlt)}
3245
src={InfoOutline}
3346
className="mb-3"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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('visible 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+
});

0 commit comments

Comments
 (0)