From e2be97dcd382a69c76eab322eac8cded1719fcae Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 May 2017 10:55:21 +0200 Subject: [PATCH 1/4] default edit image option and no images msg --- .../dialog/edit-widget-image-control.js | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/components/dialog/edit-widget-image-control.js b/src/components/dialog/edit-widget-image-control.js index 199a331..56ae8f0 100644 --- a/src/components/dialog/edit-widget-image-control.js +++ b/src/components/dialog/edit-widget-image-control.js @@ -49,11 +49,12 @@ class EditImageWidgetControl extends Component { formData.append(key, this.state.fileList[key]); } } - + // upload files AppDispatcher.dispatch({ type: 'files/start-upload', - data: formData + data: formData, + token: this.props.sessionToken }); } @@ -63,9 +64,18 @@ class EditImageWidgetControl extends Component { Image this.props.handleChange(e)}> - {this.props.files.map((file, index) => ( - - ))} + { + this.props.files.length === 0? ( + + ) : ( + this.props.files.reduce( (entries, file, index) => { + entries.push(); + return entries; + }, [ + + ]) + ) + } From e0c5ffbd8fb158959ee46a18c14244232af1df5c Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 May 2017 12:24:52 +0200 Subject: [PATCH 2/4] authenticated upload --- src/components/dialog/edit-widget.js | 3 ++- src/containers/visualization.js | 6 ++++-- src/data-managers/files-data-manager.js | 11 +++++++---- src/stores/file-store.js | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/components/dialog/edit-widget.js b/src/components/dialog/edit-widget.js index a6a1523..eeabba3 100644 --- a/src/components/dialog/edit-widget.js +++ b/src/components/dialog/edit-widget.js @@ -35,6 +35,7 @@ import EditWidgetOrientation from './edit-widget-orientation'; class EditWidgetDialog extends Component { static propTypes = { + sessionToken: PropTypes.string.isRequired, show: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired }; @@ -109,7 +110,7 @@ class EditWidgetDialog extends Component { ) } else if (this.props.widget.type === 'Image') { dialogControls.push( - this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} /> + this.validateForm(id)} simulation={this.props.simulation} handleChange={(e, index) => this.handleChange(e, index)} /> ) } else if (this.props.widget.type === 'Gauge') { dialogControls.push( diff --git a/src/containers/visualization.js b/src/containers/visualization.js index 00fc336..a526df3 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -30,6 +30,7 @@ import Dropzone from '../components/dropzone'; import Widget from './widget'; import EditWidget from '../components/dialog/edit-widget'; +import UserStore from '../stores/user-store'; import VisualizationStore from '../stores/visualization-store'; import ProjectStore from '../stores/project-store'; import SimulationStore from '../stores/simulation-store'; @@ -40,7 +41,7 @@ import NotificationsFactory from '../data-managers/notifications-factory'; class Visualization extends Component { static getStores() { - return [ VisualizationStore, ProjectStore, SimulationStore, FileStore ]; + return [ VisualizationStore, ProjectStore, SimulationStore, FileStore, UserStore ]; } static calculateState(prevState) { @@ -49,6 +50,7 @@ class Visualization extends Component { } return { + sessionToken: UserStore.getState().token, visualizations: VisualizationStore.getState(), projects: ProjectStore.getState(), simulations: SimulationStore.getState(), @@ -384,7 +386,7 @@ class Visualization extends Component { ))} - this.closeEdit(data)} widget={this.state.modalData} simulation={this.state.simulation} files={this.state.files} /> + this.closeEdit(data)} widget={this.state.modalData} simulation={this.state.simulation} files={this.state.files} /> ); diff --git a/src/data-managers/files-data-manager.js b/src/data-managers/files-data-manager.js index 5f7e1c0..f5edb37 100644 --- a/src/data-managers/files-data-manager.js +++ b/src/data-managers/files-data-manager.js @@ -28,13 +28,16 @@ class FilesDataManager extends RestDataManager { super('file', '/files'); } - upload(file) { - RestAPI.upload(this.makeURL('/upload'), file).then(response => { + upload(file, token = null) { + RestAPI.upload(this.makeURL('/upload'), file, token).then(response => { AppDispatcher.dispatch({ type: 'files/uploaded' }); - - console.log(response); + // Trigger a files reload + AppDispatcher.dispatch({ + type: 'files/start-load', + token: token + }); }).catch(error => { AppDispatcher.dispatch({ type: 'files/upload-error', diff --git a/src/stores/file-store.js b/src/stores/file-store.js index 104d16b..09266dd 100644 --- a/src/stores/file-store.js +++ b/src/stores/file-store.js @@ -30,7 +30,7 @@ class FileStore extends ArrayStore { reduce(state, action) { switch (action.type) { case 'files/start-upload': - FilesDataManager.upload(action.data); + FilesDataManager.upload(action.data, action.token); return state; case 'files/uploaded': From e395b65fc17547c5c8a416ae7033e1d2628c0bb1 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 May 2017 12:27:36 +0200 Subject: [PATCH 3/4] fixed imaged widget, load image by id --- src/components/widget-image.js | 40 +++++++++++++++------------------- src/config.js | 6 +++++ 2 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 src/config.js diff --git a/src/components/widget-image.js b/src/components/widget-image.js index aeb9642..2bbba8c 100644 --- a/src/components/widget-image.js +++ b/src/components/widget-image.js @@ -21,37 +21,33 @@ import React, { Component } from 'react'; -const API_URL = 'http://localhost:4000/'; +import AppDispatcher from '../app-dispatcher'; +import config from '../config'; class WidgetImage extends Component { - constructor(props) { - super(props); - - this.state = { - file: null - }; - } componentWillReceiveProps(nextProps) { - // check if file is set - if (nextProps.widget.file == null) { - this.setState({ file: null }); - return; - } - // get file by id - nextProps.files.forEach(file => { - if (file._id === nextProps.widget.file) { - this.setState({ file: file }); - } - }); + // Query the image referenced by the widget (public request, no token required) + let widgetFile = nextProps.widget.file; + if (widgetFile && !nextProps.files.find( file => file._id === widgetFile ) ) { + + AppDispatcher.dispatch({ + type: 'files/start-load', + data: widgetFile + }); + + } } render() { + + let file = this.props.files.find( (file) => file._id === this.props.widget.file ); + return ( -
- {this.state.file && - {this.state.file.name} +
+ {file && + {file.name} e.preventDefault() } /> }
); diff --git a/src/config.js b/src/config.js new file mode 100644 index 0000000..4ade8ce --- /dev/null +++ b/src/config.js @@ -0,0 +1,6 @@ + +const config = { + publicPathBase: 'public/' +} + +export default config \ No newline at end of file From 503560dbbee562b66da28ac67eb73e0c3d48f3a7 Mon Sep 17 00:00:00 2001 From: Ricardo Hernandez-Montoya Date: Mon, 8 May 2017 12:28:16 +0200 Subject: [PATCH 4/4] authenticated (all) files query --- src/containers/widget.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/containers/widget.js b/src/containers/widget.js index 1f61e9b..18e3d12 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -26,6 +26,7 @@ import Rnd from 'react-rnd'; import classNames from 'classnames'; import AppDispatcher from '../app-dispatcher'; +import UserStore from '../stores/user-store'; import SimulatorDataStore from '../stores/simulator-data-store'; import FileStore from '../stores/file-store'; @@ -45,12 +46,16 @@ import '../styles/widgets.css'; class Widget extends Component { static getStores() { - return [ SimulatorDataStore, FileStore ]; + return [ SimulatorDataStore, FileStore, UserStore ]; } static calculateState(prevState) { + + let tokenState = UserStore.getState().token; + if (prevState) { return { + sessionToken: tokenState, simulatorData: SimulatorDataStore.getState(), files: FileStore.getState(), @@ -58,6 +63,7 @@ class Widget extends Component { } } else { return { + sessionToken: tokenState, simulatorData: SimulatorDataStore.getState(), files: FileStore.getState(), @@ -72,11 +78,15 @@ class Widget extends Component { // Reference to the context menu element this.contextMenuTriggerViaDraggable = null; } - + componentWillMount() { - AppDispatcher.dispatch({ - type: 'files/start-load' - }); + // If loading for the first time + if (this.state.sessionToken) { + AppDispatcher.dispatch({ + type: 'files/start-load', + token: this.state.sessionToken + }); + } } dragStop(event, ui) { @@ -150,7 +160,6 @@ class Widget extends Component { borderedWidget = true; } else if (widget.type === 'Image') { element = - borderedWidget = true; } else if (widget.type === 'Button') { element = } else if (widget.type === 'NumberInput') {