UNPKG

15.8 kBJavaScriptView Raw
1/**
2 * Dialog component.
3 * @constructor ApDialog
4 */
5
6'use strict';
7
8var _react = require('react');
9
10var _react2 = _interopRequireDefault(_react);
11
12var _classnames = require('classnames');
13
14var _classnames2 = _interopRequireDefault(_classnames);
15
16var _apemanReactTouchable = require('apeman-react-touchable');
17
18var _apemanReactIcon = require('apeman-react-icon');
19
20var _apemanReactSpinner = require('apeman-react-spinner');
21
22var _ap_dialog_header = require('./ap_dialog_header');
23
24var _ap_dialog_header2 = _interopRequireDefault(_ap_dialog_header);
25
26var _ap_dialog_body = require('./ap_dialog_body');
27
28var _ap_dialog_body2 = _interopRequireDefault(_ap_dialog_body);
29
30function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
32var DEFAULT_CLOSE_ICON = 'fa fa-close';
33
34/** @lends ApDialog */
35var ApDialog = _react2.default.createClass({
36 displayName: 'ApDialog',
37
38 // --------------------
39 // Specs
40 // --------------------
41
42 propTypes: {
43 present: _react.PropTypes.bool.isRequired,
44 onClose: _react.PropTypes.func,
45 spinning: _react.PropTypes.bool,
46 spinner: _react.PropTypes.string,
47 title: _react.PropTypes.string,
48 closeIcon: _react.PropTypes.string
49 },
50
51 mixins: [],
52
53 statics: {
54 DEFAULT_CLOSE_ICON: DEFAULT_CLOSE_ICON
55 },
56
57 getInitialState: function getInitialState() {
58 return {};
59 },
60 getDefaultProps: function getDefaultProps() {
61 return {
62 present: false,
63 onClose: null,
64 spinning: false,
65 spinner: _apemanReactSpinner.ApSpinner.DEFAULT_THEME,
66 title: null,
67 closeIcon: DEFAULT_CLOSE_ICON
68 };
69 },
70 render: function render() {
71 var s = this;
72 var props = s.props;
73
74 if (!props.present) {
75 return null;
76 }
77 return _react2.default.createElement(
78 'div',
79 { className: (0, _classnames2.default)('ap-dialog', props.className, {
80 'ap-dialog-present': props.present
81 }),
82 style: Object.assign({}, props.style) },
83 _react2.default.createElement(_apemanReactSpinner.ApSpinner, { theme: props.spinner,
84 className: 'ap-dialog-spinner',
85 enabled: props.spinning }),
86 _react2.default.createElement(
87 'div',
88 { className: 'ap-dialog-inner' },
89 s._renderBack(),
90 _react2.default.createElement(
91 'div',
92 { className: 'ap-dialog-content' },
93 _react2.default.createElement(
94 _ap_dialog_header2.default,
95 null,
96 s._renderTitle(),
97 s._renderCloseButton()
98 ),
99 _react2.default.createElement(
100 _ap_dialog_body2.default,
101 null,
102 props.children
103 )
104 )
105 )
106 );
107 },
108
109 // --------------------
110 // Lifecycle
111 // --------------------
112
113 componentWillMount: function componentWillMount() {
114 var s = this;
115 },
116 componentDidMount: function componentDidMount() {
117 var s = this;
118 var props = s.props;
119
120 s.toggleDocumentScroll(props.present);
121 },
122 componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
123 var s = this;
124
125 s.toggleDocumentScroll(nextProps.present);
126 },
127 shouldComponentUpdate: function shouldComponentUpdate(nextProps, nextState) {
128 var s = this;
129 return true;
130 },
131 componentWillUpdate: function componentWillUpdate(nextProps, nextState) {
132 var s = this;
133 },
134 componentDidUpdate: function componentDidUpdate(prevProps, prevState) {
135 var s = this;
136 },
137 componentWillUnmount: function componentWillUnmount() {
138 var s = this;
139 s.toggleDocumentScroll(false);
140 },
141
142 // ------------------
143 // Helper
144 // ------------------
145
146 handleClose: function handleClose(e) {
147 var s = this;
148 var props = s.props;
149
150 if (props.onClose) {
151 props.onClose(e);
152 }
153 },
154 toggleDocumentScroll: function toggleDocumentScroll(enabled) {
155 var s = false;
156
157 var body = document.body;
158 if (enabled) {
159 body.classList.add('ap-dialog-fix');
160 } else {
161 body.classList.remove('ap-dialog-fix');
162 }
163 },
164
165 // ------------------
166 // Private
167 // ------------------
168
169 _renderBack: function _renderBack() {
170 var s = this;
171 var props = s.props;
172
173 return _react2.default.createElement(
174 'div',
175 { className: 'ap-dialog-back' },
176 _react2.default.createElement(
177 _apemanReactTouchable.ApTouchable,
178 { onTap: s.handleClose },
179 _react2.default.createElement('div', { className: 'ap-dialog-back-inner' })
180 )
181 );
182 },
183 _renderCloseButton: function _renderCloseButton() {
184 var s = this;
185 var props = s.props;
186
187 return _react2.default.createElement(
188 'a',
189 { className: 'ap-dialog-close-button' },
190 _react2.default.createElement(
191 _apemanReactTouchable.ApTouchable,
192 { onTap: s.handleClose },
193 _react2.default.createElement(
194 'span',
195 null,
196 _react2.default.createElement(_apemanReactIcon.ApIcon, { className: (0, _classnames2.default)('ap-dialog-close-button-icon', props.closeIcon) })
197 )
198 )
199 );
200 },
201 _renderTitle: function _renderTitle() {
202 var s = this;
203 var props = s.props;
204
205 return _react2.default.createElement(
206 'h3',
207 { className: 'ap-dialog-title' },
208 props.title
209 );
210 }
211});
212
213module.exports = ApDialog;
214//# sourceMappingURL=data:application/json;base64,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QUFKLENBRHNCOztBQUcxQixZQUFJLE9BQU8sU0FBUyxJQUFULENBSGU7QUFJMUIsWUFBSSxPQUFKLEVBQWE7QUFDVCxpQkFBSyxTQUFMLENBQWUsR0FBZixDQUFtQixlQUFuQixFQURTO1NBQWIsTUFFTztBQUNILGlCQUFLLFNBQUwsQ0FBZSxNQUFmLENBQXNCLGVBQXRCLEVBREc7U0FGUDtLQTFIeUI7Ozs7OztBQXNJN0Isd0NBQWM7QUFDSixnQkFBSSxJQUFKLENBREk7WUFFTCxRQUFTLEVBQVQsTUFGSzs7QUFHVixlQUNJOztjQUFLLFdBQVUsZ0JBQVYsRUFBTDtZQUNJOztrQkFBYSxPQUFRLEVBQUUsV0FBRixFQUFyQjtnQkFDSSx1Q0FBSyxXQUFVLHNCQUFWLEVBQUwsQ0FESjthQURKO1NBREosQ0FIVTtLQXRJZTtBQWtKN0Isc0RBQXFCO0FBQ1gsZ0JBQUksSUFBSixDQURXO1lBRVosUUFBUyxFQUFULE1BRlk7O0FBR2pCLGVBQ0k7O2NBQUcsV0FBVSx3QkFBVixFQUFIO1lBQ0k7O2tCQUFhLE9BQVEsRUFBRSxXQUFGLEVBQXJCO2dCQUNBOzs7b0JBQ0kseURBQVEsV0FBWSwwQkFBVyw2QkFBWCxFQUEwQyxNQUFNLFNBQU4sQ0FBdEQsRUFBUixDQURKO2lCQURBO2FBREo7U0FESixDQUhpQjtLQWxKUTtBQWdLN0IsMENBQWU7QUFDTCxnQkFBSSxJQUFKLENBREs7WUFFTixRQUFTLEVBQVQsTUFGTTs7QUFHWCxlQUNJOztjQUFJLFdBQVUsaUJBQVYsRUFBSjtZQUFrQyxNQUFNLEtBQU47U0FEdEMsQ0FIVztLQWhLYztDQUFsQixDQUFYOztBQXlLSixPQUFPLE9BQVAsR0FBaUIsUUFBakIiLCJmaWxlIjoiYXBfZGlhbG9nLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9va3VuaXNoaW5pc2hpL1Byb2plY3RzL2FwZW1hbi1wcm9qZWN0cy9hcGVtYW4tcmVhY3QtZGlhbG9nL2xpYiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGlhbG9nIGNvbXBvbmVudC5cbiAqIEBjb25zdHJ1Y3RvciBBcERpYWxvZ1xuICovXG5cbid1c2Ugc3RyaWN0J1xuXG5cbmltcG9ydCBSZWFjdCwge1Byb3BUeXBlcyBhcyB0eXBlc30gZnJvbSAncmVhY3QnXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJ1xuXG5pbXBvcnQge0FwVG91Y2hhYmxlfSBmcm9tICdhcGVtYW4tcmVhY3QtdG91Y2hhYmxlJ1xuaW1wb3J0IHtBcEljb259IGZyb20gJ2FwZW1hbi1yZWFjdC1pY29uJ1xuaW1wb3J0IHtBcFNwaW5uZXJ9IGZyb20gJ2FwZW1hbi1yZWFjdC1zcGlubmVyJ1xuaW1wb3J0IEFwRGlhbG9nSGVhZGVyIGZyb20gJy4vYXBfZGlhbG9nX2hlYWRlcidcbmltcG9ydCBBcERpYWxvZ0JvZHkgZnJvbSAnLi9hcF9kaWFsb2dfYm9keSdcblxuXG5jb25zdCBERUZBVUxUX0NMT1NFX0lDT04gPSAnZmEgZmEtY2xvc2UnXG5cbi8qKiBAbGVuZHMgQXBEaWFsb2cgKi9cbmxldCBBcERpYWxvZyA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU3BlY3NcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIHByZXNlbnQ6IHR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICAgICAgb25DbG9zZTogdHlwZXMuZnVuYyxcbiAgICAgICAgc3Bpbm5pbmc6IHR5cGVzLmJvb2wsXG4gICAgICAgIHNwaW5uZXI6IHR5cGVzLnN0cmluZyxcbiAgICAgICAgdGl0bGU6IHR5cGVzLnN0cmluZyxcbiAgICAgICAgY2xvc2VJY29uOiB0eXBlcy5zdHJpbmdcbiAgICB9LFxuXG4gICAgbWl4aW5zOiBbXSxcblxuICAgIHN0YXRpY3M6IHtcbiAgICAgICAgREVGQVVMVF9DTE9TRV9JQ09OXG4gICAgfSxcblxuICAgIGdldEluaXRpYWxTdGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgIH0sXG5cbiAgICBnZXREZWZhdWx0UHJvcHMgKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJlc2VudDogZmFsc2UsXG4gICAgICAgICAgICBvbkNsb3NlOiBudWxsLFxuICAgICAgICAgICAgc3Bpbm5pbmc6IGZhbHNlLFxuICAgICAgICAgICAgc3Bpbm5lcjogQXBTcGlubmVyLkRFRkFVTFRfVEhFTUUsXG4gICAgICAgICAgICB0aXRsZTogbnVsbCxcbiAgICAgICAgICAgIGNsb3NlSWNvbjogREVGQVVMVF9DTE9TRV9JQ09OXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMsXG4gICAgICAgICAgICB7cHJvcHN9ID0gcztcbiAgICAgICAgaWYgKCFwcm9wcy5wcmVzZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9eyBjbGFzc25hbWVzKCdhcC1kaWFsb2cnLCBwcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgICAgICAnYXAtZGlhbG9nLXByZXNlbnQnOnByb3BzLnByZXNlbnRcbiAgICAgICAgICAgIH0pIH1cbiAgICAgICAgICAgICAgICAgc3R5bGU9eyBPYmplY3QuYXNzaWduKHt9LCBwcm9wcy5zdHlsZSkgfT5cbiAgICAgICAgICAgICAgICA8QXBTcGlubmVyIHRoZW1lPXsgcHJvcHMuc3Bpbm5lciB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhcC1kaWFsb2ctc3Bpbm5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkPXsgcHJvcHMuc3Bpbm5pbmcgfS8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcC1kaWFsb2ctaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgeyBzLl9yZW5kZXJCYWNrKCkgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFwLWRpYWxvZy1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QXBEaWFsb2dIZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzLl9yZW5kZXJUaXRsZSgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHMuX3JlbmRlckNsb3NlQnV0dG9uKCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9BcERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxBcERpYWxvZ0JvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcm9wcy5jaGlsZHJlbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0FwRGlhbG9nQm9keT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKVxuICAgIH0sXG5cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gTGlmZWN5Y2xlXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXNcblxuICAgIH0sXG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMsXG4gICAgICAgICAgICB7cHJvcHN9ID0gcztcbiAgICAgICAgcy50b2dnbGVEb2N1bWVudFNjcm9sbChwcm9wcy5wcmVzZW50KVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICBjb25zdCBzID0gdGhpc1xuXG4gICAgICAgIHMudG9nZ2xlRG9jdW1lbnRTY3JvbGwobmV4dFByb3BzLnByZXNlbnQpXG4gICAgfSxcblxuICAgIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgICBjb25zdCBzID0gdGhpc1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgfSxcblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBjb25zdCBzID0gdGhpc1xuICAgIH0sXG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXNcbiAgICAgICAgcy50b2dnbGVEb2N1bWVudFNjcm9sbChmYWxzZSlcbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gSGVscGVyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBoYW5kbGVDbG9zZShlKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLFxuICAgICAgICAgICAge3Byb3BzfSA9IHM7XG4gICAgICAgIGlmIChwcm9wcy5vbkNsb3NlKSB7XG4gICAgICAgICAgICBwcm9wcy5vbkNsb3NlKGUpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdG9nZ2xlRG9jdW1lbnRTY3JvbGwoZW5hYmxlZCkge1xuICAgICAgICBsZXQgcyA9IGZhbHNlXG5cbiAgICAgICAgbGV0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdhcC1kaWFsb2ctZml4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYXAtZGlhbG9nLWZpeCcpXG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcml2YXRlXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBfcmVuZGVyQmFjaygpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMsXG4gICAgICAgICAgICB7cHJvcHN9ID0gcztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXAtZGlhbG9nLWJhY2tcIj5cbiAgICAgICAgICAgICAgICA8QXBUb3VjaGFibGUgb25UYXA9eyBzLmhhbmRsZUNsb3NlIH0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXAtZGlhbG9nLWJhY2staW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L0FwVG91Y2hhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICB9LFxuXG4gICAgX3JlbmRlckNsb3NlQnV0dG9uKCkge1xuICAgICAgICBjb25zdCBzID0gdGhpcyxcbiAgICAgICAgICAgIHtwcm9wc30gPSBzO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGEgY2xhc3NOYW1lPVwiYXAtZGlhbG9nLWNsb3NlLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgIDxBcFRvdWNoYWJsZSBvblRhcD17IHMuaGFuZGxlQ2xvc2UgfT5cbiAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPEFwSWNvbiBjbGFzc05hbWU9eyBjbGFzc25hbWVzKCdhcC1kaWFsb2ctY2xvc2UtYnV0dG9uLWljb24nLCBwcm9wcy5jbG9zZUljb24pIH0vPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L0FwVG91Y2hhYmxlPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICApXG4gICAgfSxcblxuICAgIF9yZW5kZXJUaXRsZSgpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMsXG4gICAgICAgICAgICB7cHJvcHN9ID0gcztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJhcC1kaWFsb2ctdGl0bGVcIj57IHByb3BzLnRpdGxlIH08L2gzPlxuICAgICAgICApXG4gICAgfVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSBBcERpYWxvZzsiXX0=
\No newline at end of file