ffr-components
Version:
Fiori styled UI components
186 lines (164 loc) • 7.67 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
import _createClass from "@babel/runtime/helpers/esm/createClass";
import _possibleConstructorReturn from "@babel/runtime/helpers/esm/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime/helpers/esm/getPrototypeOf";
import _inherits from "@babel/runtime/helpers/esm/inherits";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
// Import React Framework
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import classnames from 'classnames';
import FocusTrap from 'focus-trap-react';
import Loading from '../loading';
var _React$createContext = React.createContext(),
Consumer = _React$createContext.Consumer,
Provider = _React$createContext.Provider;
export var FocusConsumer = Consumer;
export var Modal =
/*#__PURE__*/
function (_Component) {
_inherits(Modal, _Component);
// select body element to add Modal component too
function Modal(props) {
var _this;
_classCallCheck(this, Modal);
_this = _possibleConstructorReturn(this, _getPrototypeOf(Modal).call(this, props));
_this.bodyElm = document.querySelector('body');
_this.handleCloseClick = function (e) {
_this.props.onClose(e);
};
_this.handleKeyPress = function (event) {
if (event.key === 'Escape' || event.key === 'Esc') {
_this.handleCloseClick();
}
};
_this.pauseTrap = function (status) {
_this.setState({
pauseTrap: !!status
});
};
_this.__mergePropWithClass = function () {
var prop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
var tc = prop.className || '';
return _objectSpread({}, prop, {
className: "".concat(className, " ").concat(tc)
});
};
_this.state = {
pauseTrap: false
};
return _this;
}
_createClass(Modal, [{
key: "componentDidMount",
// add event listener for escape key
value: function componentDidMount() {
document.addEventListener('keydown', this.handleKeyPress, false);
} // remove event listener for escape key
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
document.removeEventListener('keydown', this.handleKeyPress, false);
}
}, {
key: "render",
value: function render() {
var _this$props = this.props,
onClose = _this$props.onClose,
localizedText = _this$props.localizedText,
children = _this$props.children,
title = _this$props.title,
actions = _this$props.actions,
className = _this$props.className,
headingLevel = _this$props.headingLevel,
show = _this$props.show,
titleProps = _this$props.titleProps,
closeProps = _this$props.closeProps,
contentProps = _this$props.contentProps,
headerProps = _this$props.headerProps,
footerProps = _this$props.footerProps,
bodyProps = _this$props.bodyProps,
activeTrap = _this$props.activeTrap,
pauseTrap = _this$props.pauseTrap,
showClose = _this$props.showClose,
loading = _this$props.loading,
rest = _objectWithoutProperties(_this$props, ["onClose", "localizedText", "children", "title", "actions", "className", "headingLevel", "show", "titleProps", "closeProps", "contentProps", "headerProps", "footerProps", "bodyProps", "activeTrap", "pauseTrap", "showClose", "loading"]);
var modalClasses = classnames('fd-ui__overlay', 'fd-overlay', 'fd-overlay--modal', 'modal-dialog', {
'modal-dialog__hide': showClose
}, className);
var HeadingTag = "h".concat(headingLevel);
if (!show) {
return null;
}
var tp = this.__mergePropWithClass(titleProps, 'fd-modal__title');
var hp = this.__mergePropWithClass(headerProps, 'fd-modal__header');
var cp = this.__mergePropWithClass(contentProps, 'fd-modal__content');
return ReactDOM.createPortal(React.createElement(Provider, {
value: {
pauseTrap: this.pauseTrap
}
}, React.createElement(FocusTrap, {
active: activeTrap,
paused: this.state.pauseTrap,
focusTrapOptions: {
initialFocus: 'div.modal-demo-bg > span'
}
}, React.createElement("div", _extends({}, rest, {
className: modalClasses
}), React.createElement("div", {
className: "modal-demo-bg"
}, React.createElement("span", {
tabIndex: "-1"
}), React.createElement("div", {
"aria-label": title,
"aria-modal": "true",
className: "fd-modal",
role: "dialog"
}, loading ? React.createElement(Loading, {
title: localizedText.loadingTitle
}) : null, React.createElement("div", _extends({}, cp, {
role: "document"
}), React.createElement("div", hp, React.createElement(HeadingTag, tp, title), React.createElement("button", _extends({}, closeProps, {
"aria-label": localizedText.closeButton,
className: "fd-button--light fd-modal__close",
onClick: this.handleCloseClick
}))), React.createElement("div", _extends({}, bodyProps, {
className: "fd-modal__body"
}), children), actions ? React.createElement("footer", _extends({}, footerProps, {
className: "fd-modal__footer"
}), React.createElement("div", {
className: "fd-modal__actions"
}, actions)) : '')))))), this.bodyElm);
}
}]);
return Modal;
}(Component);
Modal.displayName = 'Modal';
Modal.defaultProps = {
headingLevel: 3,
localizedText: {
closeButton: 'Close',
loadingTitle: 'Please wait'
},
loading: false,
onClose: function onClose() {}
};
Modal.propDescriptions = {
actions: 'Node(s) to render within the footer of the dialog.',
bodyProps: 'Additional props to be spread to the body section of the dialog.',
closeProps: 'Additional props to be spread to the close `<button>` element.',
contentProps: 'Additional props to be spread to the content section of the dialog.',
footerProps: 'Additional props to be spread to the footer of the dialog.',
headerProps: 'Additional props to be spread to the header of the dialog.',
localizedTextShape: {
closeButton: 'Aria-label for <button> element.',
loadingTitle: 'Text shown when hover on loading modal'
},
onClose: 'Callback function passing event when close button is clicked.',
show: 'Set to **true** to make the dialog visible.'
};