apeman-react-dialog
Version:
apeman react package for dialog component.
222 lines (182 loc) • 14.6 kB
JavaScript
/**
* 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=