Skip to content

Commit 076c3e0

Browse files
fix: Added FocusTrap to Modal component (#349)
* fix: Added FocusTrap to Modal component * add startTabIndex span * changed initialFocus selector * Moved focus-trap-react to dependencies
1 parent 548ec08 commit 076c3e0

File tree

3 files changed

+82
-48
lines changed

3 files changed

+82
-48
lines changed

package-lock.json

Lines changed: 38 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"dependencies": {
4141
"classnames": "^2.2.6",
4242
"fiori-fundamentals": "^1.4.0",
43+
"focus-trap-react": "^6.0.0",
4344
"react-router": "^4.3.1",
4445
"react-router-dom": "^4.3.1"
4546
},

src/Modal/Modal.js

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import classnames from 'classnames';
2+
import FocusTrap from 'focus-trap-react';
23
import PropTypes from 'prop-types';
34
import ReactDOM from 'react-dom';
45
import React, { Component } from 'react';
@@ -43,43 +44,53 @@ export class Modal extends Component {
4344
}
4445

4546
return ReactDOM.createPortal(
46-
<div
47-
{...rest}
48-
className={modalClasses}>
49-
<div className='modal-demo-bg'>
50-
<div className='fd-modal'>
47+
<FocusTrap
48+
focusTrapOptions={{
49+
initialFocus: 'div.modal-demo-bg > span'
50+
}}>
51+
<div
52+
{...rest}
53+
className={modalClasses}>
54+
<div className='modal-demo-bg'>
55+
<span tabIndex='-1' />
5156
<div
52-
{...contentProps}
53-
className='fd-modal__content'
54-
role='document'>
55-
<div {...headerProps} className='fd-modal__header'>
56-
<h1 {...titleProps} className='fd-modal__title'>
57-
{title}
58-
</h1>
59-
<button
60-
{...closeProps}
61-
aria-label='close'
62-
className='fd-button--light fd-modal__close'
63-
onClick={this.handleCloseClick} />
57+
aria-label={title}
58+
aria-modal='true'
59+
className='fd-modal'
60+
role='dialog'>
61+
<div
62+
{...contentProps}
63+
className='fd-modal__content'
64+
role='document'>
65+
<div {...headerProps} className='fd-modal__header'>
66+
<h1 {...titleProps} className='fd-modal__title'>
67+
{title}
68+
</h1>
69+
<button
70+
{...closeProps}
71+
aria-label='close'
72+
className='fd-button--light fd-modal__close'
73+
onClick={this.handleCloseClick} />
74+
</div>
75+
<div {...bodyProps} className='fd-modal__body'>
76+
{children}
77+
</div>
78+
{actions ? (
79+
<footer
80+
{...footerProps}
81+
className='fd-modal__footer'>
82+
<div className='fd-modal__actions'>
83+
{actions}
84+
</div>
85+
</footer>
86+
) : (
87+
''
88+
)}
6489
</div>
65-
<div {...bodyProps} className='fd-modal__body'>
66-
{children}
67-
</div>
68-
{actions ? (
69-
<footer
70-
{...footerProps}
71-
className='fd-modal__footer'>
72-
<div className='fd-modal__actions'>
73-
{actions}
74-
</div>
75-
</footer>
76-
) : (
77-
''
78-
)}
7990
</div>
8091
</div>
8192
</div>
82-
</div>,
93+
</FocusTrap >,
8394
this.bodyElm
8495
);
8596
}

0 commit comments

Comments
 (0)