diff --git a/package.json b/package.json index 3ae595f1..c5028014 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "babel-core": "^6.21.0", "babel-eslint": "^7.1.1", "babel-loader": "^6.2.10", + "babel-plugin-transform-object-rest-spread": "^6.22.0", "babel-preset-react": "^6.16.0", "chai": "^3.5.0", "chai-as-promised": "^6.0.0", @@ -77,7 +78,10 @@ }, { "from": "resources/linux", - "filter": ["create_desktop_file.sh", "README.md"] + "filter": [ + "create_desktop_file.sh", + "README.md" + ] } ] }, diff --git a/src/browser/components/DestructiveConfirmModal.jsx b/src/browser/components/DestructiveConfirmModal.jsx new file mode 100644 index 00000000..8a878692 --- /dev/null +++ b/src/browser/components/DestructiveConfirmModal.jsx @@ -0,0 +1,42 @@ +const React = require('react'); +const {Button, Modal} = require('react-bootstrap'); + +function DestructiveConfirmationModal(props) { + const { + title, + body, + acceptLabel, + cancelLabel, + onAccept, + onCancel, + ...rest} = props; + return ( + + + {title} + + {body} + + + + + + ); +} + +DestructiveConfirmationModal.propTypes = { + title: React.PropTypes.string.isRequired, + body: React.PropTypes.node.isRequired, + acceptLabel: React.PropTypes.string.isRequired, + cancelLabel: React.PropTypes.string.isRequired, + onAccept: React.PropTypes.func.isRequired, + onCancel: React.PropTypes.func.isRequired +}; + +module.exports = DestructiveConfirmationModal; diff --git a/src/browser/components/RemoveServerModal.jsx b/src/browser/components/RemoveServerModal.jsx new file mode 100644 index 00000000..37d56fa1 --- /dev/null +++ b/src/browser/components/RemoveServerModal.jsx @@ -0,0 +1,32 @@ +const React = require('react'); +const {Modal} = require('react-bootstrap'); +const DestructiveConfirmationModal = require('./DestructiveConfirmModal.jsx'); + +function RemoveServerModal(props) { + const {serverName, ...rest} = props; + return ( + +

+ {'This will remove the server from your Desktop App but will not delete any of its data' + + ' - you can add the server back to the app at any time.'} +

+

+ {'Confirm you wish to remove the '}{serverName}{' server?'} +

+ + )} + /> + ); +} + +RemoveServerModal.propTypes = { + serverName: React.PropTypes.string.isRequired +}; + +module.exports = RemoveServerModal; diff --git a/src/browser/components/TeamList.jsx b/src/browser/components/TeamList.jsx index fa64a014..99ff8dc4 100644 --- a/src/browser/components/TeamList.jsx +++ b/src/browser/components/TeamList.jsx @@ -2,6 +2,7 @@ const React = require('react'); const {ListGroup} = require('react-bootstrap'); const TeamListItem = require('./TeamListItem.jsx'); const TeamListItemNew = require('./TeamListItemNew.jsx'); +const RemoveServerModal = require('./RemoveServerModal.jsx'); const TeamList = React.createClass({ propTypes: { @@ -13,6 +14,7 @@ const TeamList = React.createClass({ getInitialState() { return { showTeamListItemNew: false, + indexToRemoveServer: -1, team: { url: '', name: '', @@ -58,11 +60,20 @@ const TeamList = React.createClass({ } }); }, + + openServerRemoveModal(indexForServer) { + this.setState({indexToRemoveServer: indexForServer}); + }, + + closeServerRemoveModal() { + this.setState({indexToRemoveServer: -1}); + }, + render() { var self = this; var teamNodes = this.props.teams.map((team, i) => { function handleTeamRemove() { - self.handleTeamRemove(i); + self.openServerRemoveModal(i); } function handleTeamEditing() { @@ -95,10 +106,25 @@ const TeamList = React.createClass({ addTeamForm = ''; } + const removeServer = this.props.teams[this.state.indexToRemoveServer]; + const removeServerModal = ( + { + this.handleTeamRemove(this.state.indexToRemoveServer); + this.closeServerRemoveModal(); + }} + /> + ); + return ( { teamNodes } { addTeamForm } + { removeServerModal} ); } diff --git a/webpack.config.renderer.js b/webpack.config.renderer.js index d3062719..1b6827f6 100644 --- a/webpack.config.renderer.js +++ b/webpack.config.renderer.js @@ -21,7 +21,8 @@ module.exports = merge(base, { test: /\.jsx$/, loader: 'babel', query: { - presets: ['react'] + presets: ['react'], + plugins: ['transform-object-rest-spread'] } }] },