UNPKG

react-messagebox

Version:
132 lines (98 loc) 3.05 kB
'use strict'; var React = require('react') var Window = require('react-window/src') var Button = require('react-button/src') var Toolbar = require('react-toolbar/src') var assign = require('object-assign') var normalize = require('react-style-normalizer') var cloneWithProps = require('react-clonewithprops') var ToolbarFactory = React.createFactory(Toolbar) function toUpperFirst(str){ return str.charAt(0).toUpperCase() + str.substr(1) } var MessageBox = React.createClass({ displayName: 'ReactMessageBox', getDefaultProps: function(){ return { renderOnVisible: false, centered : true, resizable: true, constrainTo: true, toolbarPosition: 'bottom', toolbarBorderColor: 'gray', defaultToolbarStyle: { }, toolbarPadding: 5 } }, render: function(){ var props = this.prepareProps(this.props) return React.createElement(Window, React.__spread({}, props), props.children ) }, prepareProps: function(thisProps) { var props = assign({}, thisProps) props.toolbarStyle = this.prepareToolbarStyle(props) props.toolbar = this.prepareToolbar(props) props.bodyFactory = this.bodyFactory.bind(this, props) return props }, prepareToolbar: function(props) { var toolbar var children = React.Children.map(props.children, function(child){ if (child && child.props && child.props.isReactToolbar){ toolbar = child return false } return child }) props.children = children if (toolbar){ var style = assign({}, props.toolbarStyle, toolbar.props.style) toolbar = cloneWithProps(toolbar, { style: style }) } return toolbar }, prepareToolbarStyle: function(props) { var toolbarBorder = props.toolbarBorder var toolbarBorderColor = props.toolbarBorderColor || 'gray' var toolbarBorderWidth = parseInt(props.toolbarBorderWidth || 1) + 'px' if (!toolbarBorder){ toolbarBorder = {} toolbarBorder[props.toolbarPosition == 'top'? 'bottom': 'top'] = toolbarBorderWidth + ' solid ' + toolbarBorderColor } var defaultStyle = { margin : props.toolbarMargin, padding: props.toolbarPadding, border : toolbarBorder } if (defaultStyle.border && typeof defaultStyle.border == 'object'){ var border = defaultStyle.border delete defaultStyle.border Object.keys(border).forEach(function(key){ var name = 'border' + toUpperFirst(key) defaultStyle[name] = border[key] }) } var style = assign({}, props.defaultToolbarStyle, defaultStyle, props.toolbarStyle) return normalize(style) }, bodyFactory: function(props, bodyProps) { var style = normalize({ flex : 1, display : 'flex', flexFlow: 'column' }) var bodyFactory = this.props.bodyFactory || React.DOM.div var body = bodyFactory(bodyProps) var toolbar = props.toolbar var children = props.toolbarPosition == 'top'? [toolbar, body]: [body, toolbar] return React.createElement("div", {style: style, children: children}) } }) MessageBox.Toolbar = Toolbar MessageBox.Button = Button module.exports = MessageBox