tripleo-ui/src/js/components/ui/Modals/ModalPanel.js

110 lines
3.1 KiB
JavaScript

/**
* Copyright 2017 Red Hat Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
import cx from 'classnames';
import { Modal } from 'react-overlays';
import PropTypes from 'prop-types';
import React from 'react';
import { Fade } from 'react-bootstrap';
// TODO(jtomasek): use this as transition and backdropTransition props once react-bootstrap is
// updated to version which uses react-overlays ^0.8.3
// We could use latest react-overlays for ModalPanel now but that causes ModalPanel and Modal
// nesting issues as Modal is not correctly registered by ModalManager
//
// import Transition, {
// ENTERED,
// ENTERING
// } from 'react-transition-group/Transition';
//
// const Fade = ({ children, ...props }) => {
// const fadeStyles = {
// [ENTERING]: 'in',
// [ENTERED]: 'in'
// };
//
// return (
// <Transition {...props} timeout={400}>
// {(status, innerProps) =>
// React.cloneElement(children, {
// ...innerProps,
// className: `fade ${fadeStyles[status]} ${children.props.className}`
// })}
// </Transition>
// );
// };
// Fade.propTypes = {
// children: PropTypes.node
// };
class ModalPanel extends React.Component {
// provide onHide via context, so child buttons (close/cancel) can access it
// see https://github.com/react-bootstrap/react-bootstrap/blob/master/src/Modal.js#L152
getChildContext() {
return {
$bs_modal: {
onHide: this.props.onHide
}
};
}
render() {
const { children, modalPanelClassName, style, ...props } = this.props;
return (
<Modal
backdropClassName="modal-panel-backdrop modal-backdrop"
backdropStyle={style}
containerClassName="modal-open"
// backdropTransition={Fade}
transition={Fade}
className="fixed-container"
style={style}
{...props}
>
<div className="container-fluid modal-panel-wrapper">
<div className="row">
<div
className={cx('modal-panel', modalPanelClassName)}
style={style}
>
<div className="row flex-container">{children}</div>
</div>
</div>
</div>
</Modal>
);
}
}
ModalPanel.childContextTypes = {
$bs_modal: PropTypes.shape({
onHide: PropTypes.func
})
};
ModalPanel.propTypes = {
...Modal.propTypes,
children: PropTypes.node,
modalPanelClassName: PropTypes.string.isRequired,
style: PropTypes.object.isRequired
};
ModalPanel.defaultProps = {
...Modal.defaultProps,
modalPanelClassName: 'col-xs-12 col-sm-11 col-sm-offset-1',
style: { top: 86 }
};
export default ModalPanel;