react-messagebox
Version:
132 lines (98 loc) • 3 kB
JSX
;
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 <Window {...props}>
{props.children}
</Window>
},
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 <div style={style} children={children} />
}
})
MessageBox.Toolbar = Toolbar
MessageBox.Button = Button
module.exports = MessageBox