UNPKG

apeman-react-dialog

Version:
222 lines (182 loc) 14.6 kB
/** * Dialog component. * @class ApDialog */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _apemanReactTouchable = require('apeman-react-touchable'); var _apemanReactIcon = require('apeman-react-icon'); var _apemanReactSpinner = require('apeman-react-spinner'); var _ap_dialog_header = require('./ap_dialog_header'); var _ap_dialog_header2 = _interopRequireDefault(_ap_dialog_header); var _ap_dialog_body = require('./ap_dialog_body'); var _ap_dialog_body2 = _interopRequireDefault(_ap_dialog_body); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var DEFAULT_CLOSE_ICON = 'fa fa-close'; /** @lends ApDialog */ var ApDialog = _react2.default.createClass({ displayName: 'ApDialog', // -------------------- // Specs // -------------------- propTypes: { present: _react.PropTypes.bool.isRequired, onClose: _react.PropTypes.func, spinning: _react.PropTypes.bool, spinner: _react.PropTypes.string, title: _react.PropTypes.string, closeIcon: _react.PropTypes.string }, statics: { DEFAULT_CLOSE_ICON: DEFAULT_CLOSE_ICON }, getInitialState: function getInitialState() { return {}; }, getDefaultProps: function getDefaultProps() { return { present: false, onClose: null, spinning: false, spinner: _apemanReactSpinner.ApSpinner.DEFAULT_THEME, title: null, closeIcon: DEFAULT_CLOSE_ICON }; }, render: function render() { var s = this; var props = s.props; if (!props.present) { return null; } return _react2.default.createElement( 'div', { className: (0, _classnames2.default)('ap-dialog', props.className, { 'ap-dialog-present': props.present }), style: Object.assign({}, props.style) }, _react2.default.createElement(_apemanReactSpinner.ApSpinner, { theme: props.spinner, className: 'ap-dialog-spinner', enabled: props.spinning }), _react2.default.createElement( 'div', { className: 'ap-dialog-inner' }, s.renderBack(), _react2.default.createElement( 'div', { className: 'ap-dialog-content' }, _react2.default.createElement( _ap_dialog_header2.default, null, s.renderTitle(), s.renderCloseButton() ), _react2.default.createElement( _ap_dialog_body2.default, null, props.children ) ) ) ); }, // -------------------- // Lifecycle // -------------------- componentWillMount: function componentWillMount() { var s = this; }, componentDidMount: function componentDidMount() { var s = this; var props = s.props; s.toggleDocumentScroll(props.present); }, componentWillReceiveProps: function componentWillReceiveProps(nextProps) { var s = this; s.toggleDocumentScroll(nextProps.present); }, shouldComponentUpdate: function shouldComponentUpdate(nextProps, nextState) { var s = this; return true; }, componentWillUpdate: function componentWillUpdate(nextProps, nextState) { var s = this; }, componentDidUpdate: function componentDidUpdate(prevProps, prevState) { var s = this; }, componentWillUnmount: function componentWillUnmount() { var s = this; s.toggleDocumentScroll(false); }, // ------------------ // Helper // ------------------ handleClose: function handleClose(e) { var s = this; var props = s.props; if (props.onClose) { props.onClose(e); } }, toggleDocumentScroll: function toggleDocumentScroll(enabled) { var s = this; var _document = document; var body = _document.body; if (enabled) { body.classList.add('ap-dialog-fix'); } else { body.classList.remove('ap-dialog-fix'); } }, // ------------------ // Private // ------------------ renderBack: function renderBack() { var s = this; var props = s.props; return _react2.default.createElement( 'div', { className: 'ap-dialog-back' }, _react2.default.createElement( _apemanReactTouchable.ApTouchable, { onTap: s.handleClose }, _react2.default.createElement('div', { className: 'ap-dialog-back-inner' }) ) ); }, renderCloseButton: function renderCloseButton() { var s = this; var props = s.props; return _react2.default.createElement( 'a', { className: 'ap-dialog-close-button' }, _react2.default.createElement( _apemanReactTouchable.ApTouchable, { onTap: s.handleClose }, _react2.default.createElement( 'span', null, _react2.default.createElement(_apemanReactIcon.ApIcon, { className: (0, _classnames2.default)('ap-dialog-close-button-icon', props.closeIcon) }) ) ) ); }, renderTitle: function renderTitle() { var s = this; var props = s.props; return _react2.default.createElement( 'h3', { className: 'ap-dialog-title' }, props.title ); } }); exports.default = ApDialog; //# sourceMappingURL=data:application/json;base64,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QUFNLElBQUksSUFBVjtBQURhLFFBRVAsS0FGTyxHQUVHLENBRkgsQ0FFUCxLQUZPOztBQUdiLFdBQ0U7QUFBQTtBQUFBLFFBQUksV0FBVSxpQkFBZDtBQUFrQyxZQUFNO0FBQXhDLEtBREY7QUFHRDtBQWpLZ0MsQ0FBbEIsQ0FBakI7O2tCQW9LZSxRIiwiZmlsZSI6ImFwX2RpYWxvZy5qc3giLCJzb3VyY2VSb290IjoibGliIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEaWFsb2cgY29tcG9uZW50LlxuICogQGNsYXNzIEFwRGlhbG9nXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBSZWFjdCwge1Byb3BUeXBlcyBhcyB0eXBlc30gZnJvbSAncmVhY3QnXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJ1xuXG5pbXBvcnQge0FwVG91Y2hhYmxlfSBmcm9tICdhcGVtYW4tcmVhY3QtdG91Y2hhYmxlJ1xuaW1wb3J0IHtBcEljb259IGZyb20gJ2FwZW1hbi1yZWFjdC1pY29uJ1xuaW1wb3J0IHtBcFNwaW5uZXJ9IGZyb20gJ2FwZW1hbi1yZWFjdC1zcGlubmVyJ1xuaW1wb3J0IEFwRGlhbG9nSGVhZGVyIGZyb20gJy4vYXBfZGlhbG9nX2hlYWRlcidcbmltcG9ydCBBcERpYWxvZ0JvZHkgZnJvbSAnLi9hcF9kaWFsb2dfYm9keSdcblxuY29uc3QgREVGQVVMVF9DTE9TRV9JQ09OID0gJ2ZhIGZhLWNsb3NlJ1xuXG4vKiogQGxlbmRzIEFwRGlhbG9nICovXG5jb25zdCBBcERpYWxvZyA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTcGVjc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByb3BUeXBlczoge1xuICAgIHByZXNlbnQ6IHR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICBvbkNsb3NlOiB0eXBlcy5mdW5jLFxuICAgIHNwaW5uaW5nOiB0eXBlcy5ib29sLFxuICAgIHNwaW5uZXI6IHR5cGVzLnN0cmluZyxcbiAgICB0aXRsZTogdHlwZXMuc3RyaW5nLFxuICAgIGNsb3NlSWNvbjogdHlwZXMuc3RyaW5nXG4gIH0sXG5cbiAgc3RhdGljczoge1xuICAgIERFRkFVTFRfQ0xPU0VfSUNPTlxuICB9LFxuXG4gIGdldEluaXRpYWxTdGF0ZSAoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdFByb3BzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJlc2VudDogZmFsc2UsXG4gICAgICBvbkNsb3NlOiBudWxsLFxuICAgICAgc3Bpbm5pbmc6IGZhbHNlLFxuICAgICAgc3Bpbm5lcjogQXBTcGlubmVyLkRFRkFVTFRfVEhFTUUsXG4gICAgICB0aXRsZTogbnVsbCxcbiAgICAgIGNsb3NlSWNvbjogREVGQVVMVF9DTE9TRV9JQ09OXG4gICAgfVxuICB9LFxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgIGlmICghcHJvcHMucHJlc2VudCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXsgY2xhc3NuYW1lcygnYXAtZGlhbG9nJywgcHJvcHMuY2xhc3NOYW1lLCB7XG4gICAgICAgICdhcC1kaWFsb2ctcHJlc2VudCc6IHByb3BzLnByZXNlbnRcbiAgICAgIH0pIH1cbiAgICAgICAgICAgc3R5bGU9eyBPYmplY3QuYXNzaWduKHt9LCBwcm9wcy5zdHlsZSkgfT5cbiAgICAgICAgPEFwU3Bpbm5lciB0aGVtZT17IHByb3BzLnNwaW5uZXIgfVxuICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFwLWRpYWxvZy1zcGlubmVyXCJcbiAgICAgICAgICAgICAgICAgICBlbmFibGVkPXsgcHJvcHMuc3Bpbm5pbmcgfS8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXAtZGlhbG9nLWlubmVyXCI+XG4gICAgICAgICAgeyBzLnJlbmRlckJhY2soKSB9XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcC1kaWFsb2ctY29udGVudFwiPlxuICAgICAgICAgICAgPEFwRGlhbG9nSGVhZGVyPlxuICAgICAgICAgICAgICB7IHMucmVuZGVyVGl0bGUoKSB9XG4gICAgICAgICAgICAgIHsgcy5yZW5kZXJDbG9zZUJ1dHRvbigpIH1cbiAgICAgICAgICAgIDwvQXBEaWFsb2dIZWFkZXI+XG4gICAgICAgICAgICA8QXBEaWFsb2dCb2R5PlxuICAgICAgICAgICAgICB7IHByb3BzLmNoaWxkcmVuIH1cbiAgICAgICAgICAgIDwvQXBEaWFsb2dCb2R5PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb21wb25lbnRXaWxsTW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gIH0sXG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IHsgcHJvcHMgfSA9IHNcbiAgICBzLnRvZ2dsZURvY3VtZW50U2Nyb2xsKHByb3BzLnByZXNlbnQpXG4gIH0sXG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAobmV4dFByb3BzKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcblxuICAgIHMudG9nZ2xlRG9jdW1lbnRTY3JvbGwobmV4dFByb3BzLnByZXNlbnQpXG4gIH0sXG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlIChuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgcmV0dXJuIHRydWVcbiAgfSxcblxuICBjb21wb25lbnRXaWxsVXBkYXRlIChuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gIH0sXG5cbiAgY29tcG9uZW50RGlkVXBkYXRlIChwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gIH0sXG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgcy50b2dnbGVEb2N1bWVudFNjcm9sbChmYWxzZSlcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gSGVscGVyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGhhbmRsZUNsb3NlIChlKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgIGlmIChwcm9wcy5vbkNsb3NlKSB7XG4gICAgICBwcm9wcy5vbkNsb3NlKGUpXG4gICAgfVxuICB9LFxuXG4gIHRvZ2dsZURvY3VtZW50U2Nyb2xsIChlbmFibGVkKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcblxuICAgIGxldCB7IGJvZHkgfSA9IGRvY3VtZW50XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnYXAtZGlhbG9nLWZpeCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYXAtZGlhbG9nLWZpeCcpXG4gICAgfVxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQcml2YXRlXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHJlbmRlckJhY2sgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IHsgcHJvcHMgfSA9IHNcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcC1kaWFsb2ctYmFja1wiPlxuICAgICAgICA8QXBUb3VjaGFibGUgb25UYXA9eyBzLmhhbmRsZUNsb3NlIH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcC1kaWFsb2ctYmFjay1pbm5lclwiPjwvZGl2PlxuICAgICAgICA8L0FwVG91Y2hhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9LFxuXG4gIHJlbmRlckNsb3NlQnV0dG9uICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHByb3BzIH0gPSBzXG4gICAgcmV0dXJuIChcbiAgICAgIDxhIGNsYXNzTmFtZT1cImFwLWRpYWxvZy1jbG9zZS1idXR0b25cIj5cbiAgICAgICAgPEFwVG91Y2hhYmxlIG9uVGFwPXsgcy5oYW5kbGVDbG9zZSB9PlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICA8QXBJY29uIGNsYXNzTmFtZT17IGNsYXNzbmFtZXMoJ2FwLWRpYWxvZy1jbG9zZS1idXR0b24taWNvbicsIHByb3BzLmNsb3NlSWNvbikgfS8+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L0FwVG91Y2hhYmxlPlxuICAgICAgPC9hPlxuICAgIClcbiAgfSxcblxuICByZW5kZXJUaXRsZSAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgIHJldHVybiAoXG4gICAgICA8aDMgY2xhc3NOYW1lPVwiYXAtZGlhbG9nLXRpdGxlXCI+eyBwcm9wcy50aXRsZSB9PC9oMz5cbiAgICApXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IEFwRGlhbG9nXG4iXX0=