1 import React from 'react';
2 import {connect} from 'react-redux';
3 import Button from 'react-bootstrap/lib/Button.js';
4 import Dropzone from 'react-dropzone';
5 import i18n from 'nfvo-utils/i18n/i18n.js';
6 import ProgressBar from 'nfvo-components/progressBar/ProgressBar.jsx';
7 import Modal from 'nfvo-components/modal/Modal.jsx';
8 import UploadScreenActionHelper from './UploadScreenActionHelper.js';
9 import Attachments from './attachments/Attachments.js';
11 const mapStateToProps = ({uploadScreen}) => {
12 let {upload} = uploadScreen;
13 return {uploadScreen: upload};
17 const mapActionsToProps = dispatch => {
19 onUpload: (formData) => UploadScreenActionHelper.uploadFile(dispatch, formData),
20 openMainScreen: () => UploadScreenActionHelper.openMainScreen(dispatch)
25 class UploadScreen extends React.Component {
38 let {uploadScreen} = this.props;
39 let {showAttachments} = uploadScreen;
41 <div className='heat-validation-stand-alone'>
42 {showAttachments ? this.renderTree() : this.renderUploadScreen()}
48 let {complete, showModal, fileName} = this.state;
50 <Modal show={showModal} animation={true}>
52 <Modal.Title>{i18n('Uploading attachments')}</Modal.Title>
55 <div className='upload-modal-body-content'>
57 <span className='title'>{i18n('File:')}</span>
58 <span className='file-name'>{fileName}</span>
60 <ProgressBar now={complete} label={`${complete}%`}/>
61 <div>{i18n('Upload in progress')}</div>
64 <Button bsStyle='primary' onClick={() => this.onRunBackground()}>
65 {i18n('Run in Background')}
67 <Button bsStyle='primary' onClick={() => this.onCancel()}>{i18n('Cancel')}</Button>
74 renderUploadScreen() {
76 <div className='upload-screen'>
78 <div className='title'>
79 <h1>HEAT VALIDATION APPLICATION</h1>
83 <div className='col-md-2 col-md-offset-5'>
85 className={`upload-screen-drop-zone ${this.state.dragging ? 'active-dragging' : ''}`}
86 onDrop={files => this.handleImportSubmit(files)}
87 onDragEnter={() => this.setState({dragging:true})}
88 onDragLeave={() => this.setState({dragging:false})}
95 className='upload-screen-upload-block'>
96 <div className='drag-text'>{i18n('Drag & drop for upload')}</div>
97 <div className='or-text'>{i18n('or')}</div>
98 <div className='upload-btn primary-btn' onClick={() => this.refs.fileInput.open()}>
99 <span className='primary-btn-text'>{i18n('Select file')}</span>
104 {this.renderUploadModal()}
111 let {openMainScreen} = this.props;
113 <div className='attachments-screen'>
115 <div className='back-button'>
116 <div className='upload-btn primary-btn' onClick={() => openMainScreen()}>
117 <span className='primary-btn-text'>{i18n('Back')}</span>
124 handleImportSubmit(files) {
127 fileName: files[0].name,
134 this.interval = setInterval(() => {
135 if (this.state.complete >= 90) {
136 clearInterval(this.interval);
141 this.startUploading(files);
144 complete: (parseInt(this.state.complete) + 10).toString()
152 let {files} = this.state;
153 clearInterval(this.interval);
154 this.startUploading(files);
155 this.setState({showModal: false, files: []});
159 clearInterval(this.interval);
168 startUploading(files) {
169 let {onUpload} = this.props;
170 if (!(files && files.length)) {
174 let formData = new FormData();
175 formData.append('upload', file);
176 this.refs.fileInput.value = '';
182 export default connect(mapStateToProps, mapActionsToProps)(UploadScreen);