ldx-widgets
Version:
widgets
182 lines (152 loc) • 4.73 kB
text/coffeescript
React = require 'react'
createClass = require 'create-react-class'
PropTypes = require 'prop-types'
NoAccess = React.createFactory require('./no_access')
Modal = React.createFactory require('./modal')
Icons = require './alert_icons'
{StyleSheet, css} = require 'aphrodite'
{div, button} = require 'react-dom-factories'
###&
.close - REQUIRED - [Function]
Function that closes the modal
.cancelText - OPTIONAL - [String]
Default to 'Cancel'. The title of the 'Cancel' or 'Dismiss' button.
Note: If the props.cb method is NOT passed this button is not rendered.
.okText - OPTIONAL - [String]
Default to 'OK'. The title of the 'okay' or 'confirm' button.
Note: This functions as the cancel or close button if th props.cb method is not passed
.okColor - OPTIONAL - [String]
Default to the primary blue. The color of the 'okay' or 'confirm' button.
.cb - REQUIRED - [Function]
Function that gets called when the 'OK' button is clicked. Presumably this executes some sort of action like navigating the user or deleting an item.
.alertTitle - OPTIONAL - [String]
The main point of the alert modal, eg 'Delete Item' or 'Unsaved Changes'
If alertTitle is not provided, only the message will be rendered
.alertIcon - OPTIONAL - [Enum] - 'WARNING', 'DELETE'
Defaults to 'WARNING'. The icon to show next to the alert title.
Note: will not show if no alertTitle is passed.
.message - OPTIONAL - [String]
Can be a string that is the detail text of the alert modal, rendering on the the title.
Can be a react element that is the entire body of the modal. This will cause the title, icon, and message above to not be rendered.
If message is not provied the generic NoAccess widget will be rendered.
&###
modalStyles = StyleSheet.create
modal:
position: 'absolute'
top: '30%'
left: '50%'
width: '460px'
height: 'auto'
marginLeft: '-230px'
marginTop: '-90px'
boxShadow: '0px 2px 10px rgba(0, 0, 0, 0.5)'
styles = StyleSheet.create
titleWrap:
position: 'static'
margin: '0'
fontSize: '18px'
height: '30px'
lineHeight: '30px'
padding: '20px'
icon:
display: 'inline-block'
position: 'relative'
height: '30px'
width: '30px'
top: '4px'
title:
display: 'inline-block'
height: '30px'
marginLeft: '20px'
message:
fontSize: '13px'
margin: '20px 20px 25px 20px'
color: 'rgb(115,115,115)'
indent:
margin: '0 60px 25px 72px'
AlertModal = createClass
displayName: 'AlertModal'
propTypes:
close: PropTypes.func.isRequired
okText: PropTypes.string
okColor: PropTypes.string
cancelText: PropTypes.string
cb: PropTypes.func
alertTitle: PropTypes.string
alertIcon: PropTypes.string
message: PropTypes.oneOfType([
PropTypes.string
PropTypes.element
]).isRequired
getDefaultProps: ->
okText: 'OK'
cancelText: 'Cancel'
alertTitle: null
alertIcon: 'WARNING'
message: null
handleClick: (e) ->
e.stopPropagation()
close: -> .close()
confirm: ->
# Fire a callback if present
.cb?()
.close()
render: ->
{message, okText, okColor, cancelText, cb, alertIcon, alertTitle} =
okStyles = {}
if okColor?
okStyles.color = okColor
else if alertIcon is 'DELETE'
okStyles.color = 'rgb(236,26,35)'
content = []
if alertTitle?
content.push(div {
key: 'titleWrap'
className: css(styles.titleWrap)
}, [
div {
key: 'icon'
className: css(styles.icon)
}, Icons[alertIcon]?() if alertTitle?
div {
key: 'title'
className: css(styles.title)
}, alertTitle
]) if alertTitle?
content.push div {
key: 'message'
className: css(styles.message, if alertTitle? then styles.indent)
}, message
else if message?
content.push message
else
content.push NoAccess {
styleOverrides:
fontSize: '14px'
background: 'none'
paddingTop: 10
}
content.push div {
key: 'ok'
className: 'okay-buttons'
}, [
button {
className: 'okay-cancel cancel'
key: 'cancel'
onClick:
}, cancelText if cb?
button {
className: if cb? then 'okay-cancel okay' else 'okay-cancel just-ok'
key: 'ok'
onClick:
style: okStyles
}, okText
]
Modal {
title: null
close:
showClose: no
styleOverride: modalStyles
draggable: no
}, content
module.exports = AlertModal