From d78ebab108942058a100e0f607771c4addafb698 Mon Sep 17 00:00:00 2001 From: Christopher Speller Date: Tue, 7 Jul 2015 09:16:13 -0400 Subject: Implemention of slack import feature. --- web/react/components/setting_upload.jsx | 79 ++++++++++++++++++++++++++++ web/react/components/team_settings.jsx | 72 ++++++++++++++++++++++++- web/react/components/team_settings_modal.jsx | 1 + 3 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 web/react/components/setting_upload.jsx (limited to 'web/react/components') diff --git a/web/react/components/setting_upload.jsx b/web/react/components/setting_upload.jsx new file mode 100644 index 000000000..870710850 --- /dev/null +++ b/web/react/components/setting_upload.jsx @@ -0,0 +1,79 @@ +// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// See License.txt for license information. + +module.exports = React.createClass({ + displayName: 'Setting Upload', + propTypes: { + title: React.PropTypes.string.isRequired, + submit: React.PropTypes.func.isRequired, + fileTypesAccepted: React.PropTypes.string.isRequired, + clientError: React.PropTypes.string, + serverError: React.PropTypes.string + }, + getInitialState: function() { + return { + clientError: this.props.clientError, + serverError: this.props.serverError + }; + }, + componentWillReceiveProps: function() { + this.setState({ + clientError: this.props.clientError, + serverError: this.props.serverError + }); + }, + doFileSelect: function(e) { + e.preventDefault(); + this.setState({ + clientError: '', + serverError: '' + }); + }, + doSubmit: function(e) { + e.preventDefault(); + var inputnode = this.refs.uploadinput.getDOMNode(); + if (inputnode.files && inputnode.files[0]) { + this.props.submit(inputnode.files[0]); + } else { + this.setState({clientError: 'No file selected.'}); + } + }, + doCancel: function(e) { + e.preventDefault(); + this.refs.uploadinput.getDOMNode().value = ''; + this.setState({ + clientError: '', + serverError: '' + }); + }, + render: function() { + var clientError = null; + if (this.state.clientError) { + clientError = ( +
+ ); + } + var serverError = null; + if (this.state.serverError) { + serverError = ( +
+ ); + } + return ( + + ); + } +}); diff --git a/web/react/components/team_settings.jsx b/web/react/components/team_settings.jsx index 3bbb5e892..433ec9177 100644 --- a/web/react/components/team_settings.jsx +++ b/web/react/components/team_settings.jsx @@ -6,6 +6,7 @@ var TeamStore = require('../stores/team_store.jsx'); var SettingItemMin = require('./setting_item_min.jsx'); var SettingItemMax = require('./setting_item_max.jsx'); var SettingPicture = require('./setting_picture.jsx'); +var SettingUpload = require('./setting_upload.jsx'); var utils = require('../utils/utils.jsx'); var client = require('../utils/client.jsx'); @@ -126,6 +127,69 @@ var FeatureTab = React.createClass({ } }); +var ImportTab = React.createClass({ + getInitialState: function() { + return {status: 'ready'}; + }, + onImportFailure: function() { + this.setState({status: 'fail'}); + }, + onImportSuccess: function(data) { + this.setState({status: 'done'}); + }, + doImportSlack: function(file) { + this.setState({status: 'in-progress'}); + utils.importSlack(file, this.onImportSuccess, this.onImportFailure); + }, + render: function() { + + uploadSection = ( + + ); + + var messageSection; + switch (this.state.status) { + case 'ready': + messageSection = ''; + break; + case 'in-progress': + messageSection = ( +

Importing...

+ ); + break; + case 'done': + messageSection = ( +

Import sucessfull: View Summery

+ ); + break; + case 'fail': + messageSection = ( +

Import failure: View Summery

+ ); + break; + } + + return ( +
+
+ +

Import

+
+
+

Import

+
+ {uploadSection} + {messageSection} +
+
+
+ ); + } +}); + module.exports = React.createClass({ componentDidMount: function() { TeamStore.addChangeListener(this._onChange); @@ -154,7 +218,13 @@ module.exports = React.createClass({
); - } else { + } else if (this.props.activeTab === 'import') { + return ( +
+ +
+ ); + } else { return
; } } diff --git a/web/react/components/team_settings_modal.jsx b/web/react/components/team_settings_modal.jsx index b1c38fd16..f935daf82 100644 --- a/web/react/components/team_settings_modal.jsx +++ b/web/react/components/team_settings_modal.jsx @@ -27,6 +27,7 @@ module.exports = React.createClass({ render: function() { var tabs = []; tabs.push({name: "feature", ui_name: "Features", icon: "glyphicon glyphicon-wrench"}); + tabs.push({name: "import", ui_name: "Import", icon: "glyphicon glyphicon-upload"}); return (