diff --git a/app/assets/javascripts/components/features/ui/containers/modal_container.jsx b/app/assets/javascripts/components/features/ui/containers/modal_container.jsx index cd7d63a4a9c..abc419c7452 100644 --- a/app/assets/javascripts/components/features/ui/containers/modal_container.jsx +++ b/app/assets/javascripts/components/features/ui/containers/modal_container.jsx @@ -29,7 +29,19 @@ const Modal = React.createClass({ url: React.PropTypes.string, isVisible: React.PropTypes.bool, onCloseClicked: React.PropTypes.func, - onOverlayClicked: React.PropTypes.func + onOverlayClicked: React.PropTypes.func, + registerOnKeyDownHandler: React.PropTypes.func + }, + + componentDidMount() { + this.props.registerOnKeyDownHandler(this.onKeyDown); + }, + + onKeyDown (e) { + if (e.keyCode == 27 /* Escape key */) { + this.props.onCloseClicked(); + e.preventDefault(); + } }, render () { diff --git a/app/assets/javascripts/components/features/ui/index.jsx b/app/assets/javascripts/components/features/ui/index.jsx index 9b5469bbd75..c354ccabe87 100644 --- a/app/assets/javascripts/components/features/ui/index.jsx +++ b/app/assets/javascripts/components/features/ui/index.jsx @@ -17,8 +17,20 @@ const UI = React.createClass({ render () { const layoutBreakpoint = 1024; + let onKeyDownHandler = null; + + const dispatchKeyDown = (e) => { + if (onKeyDownHandler != null) { + onKeyDownHandler(e); + } + }; + + const registerOnKeyDownHandler = (cb) => { + onKeyDownHandler = cb; + }; + return ( -
+
@@ -38,7 +50,7 @@ const UI = React.createClass({ - +
); }