Skip to content

Commit 4993b4e

Browse files
eatoncnsPhil MeierTomdango
authored
Update ErrorSummary component to forward refs (#135)
This allows for things like programmatic keyboard focus in order to fulfil accessibility requirements. Co-authored-by: Phil Meier <[email protected]> Co-authored-by: Thomas Judd-Cooper <[email protected]>
1 parent af74fdf commit 4993b4e

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

src/components/error-summary/ErrorSummary.tsx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { HTMLProps } from 'react';
1+
import React, {forwardRef, HTMLProps, PropsWithoutRef, RefAttributes} from 'react';
22
import classNames from 'classnames';
33

44
const ErrorSummaryTitle: React.FC<HTMLProps<HTMLHeadingElement>> = ({ className, ...rest }) => (
@@ -19,20 +19,23 @@ const ErrorSummaryListItem: React.FC<HTMLProps<HTMLAnchorElement>> = (props) =>
1919
</li>
2020
);
2121

22-
interface ErrorSummary extends React.FC<HTMLProps<HTMLDivElement>> {
22+
interface ErrorSummary extends React.ForwardRefExoticComponent<PropsWithoutRef<HTMLProps<HTMLDivElement>> & RefAttributes<HTMLDivElement>> {
2323
Title: React.FC<HTMLProps<HTMLHeadingElement>>;
2424
Body: React.FC<HTMLProps<HTMLDivElement>>;
2525
List: React.FC<HTMLProps<HTMLUListElement>>;
2626
Item: React.FC<HTMLProps<HTMLAnchorElement>>;
2727
}
2828

29-
const ErrorSummary: ErrorSummary = ({ className, ...rest }) => (
30-
<div className={classNames('nhsuk-error-summary', className)} {...rest} />
31-
);
32-
33-
ErrorSummary.Title = ErrorSummaryTitle;
34-
ErrorSummary.Body = ErrorSummaryBody;
35-
ErrorSummary.List = ErrorSummaryList;
36-
ErrorSummary.Item = ErrorSummaryListItem;
29+
const ErrorSummaryDiv = forwardRef<HTMLDivElement, HTMLProps<HTMLDivElement>>(({className, ...rest}, ref) =>
30+
<div className={classNames('nhsuk-error-summary', className)} ref={ref} {...rest} />
31+
)
32+
ErrorSummaryDiv.displayName = "ErrorSummary"
33+
34+
const ErrorSummary: ErrorSummary = Object.assign(ErrorSummaryDiv, {
35+
Title: ErrorSummaryTitle,
36+
Body: ErrorSummaryBody,
37+
List: ErrorSummaryList,
38+
Item: ErrorSummaryListItem,
39+
})
3740

3841
export default ErrorSummary;

src/components/error-summary/__tests__/ErrorSummary.test.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import { shallow } from 'enzyme';
2+
import { mount, shallow } from 'enzyme';
33
import ErrorSummary from '..';
44

55
describe('ErrorSummary', () => {
@@ -9,6 +9,13 @@ describe('ErrorSummary', () => {
99
element.unmount();
1010
});
1111

12+
it('forwards refs', () => {
13+
const ref = React.createRef<HTMLDivElement>();
14+
const element = mount(<ErrorSummary ref={ref}/>);
15+
expect(ref.current).not.toBeNull();
16+
element.unmount();
17+
});
18+
1219
describe('ErrorSummary.Title', () => {
1320
it('matches snapshot', () => {
1421
const element = shallow(<ErrorSummary.Title>Title</ErrorSummary.Title>);

0 commit comments

Comments
 (0)