diff --git a/src/components/dialog/error-dialog.css b/src/components/dialog/error-dialog.css
index a1d4be9f996233bf947d6d5ad9629b2c75bb9c6e..bc4f8cccb70699dbcaf8573ebf0c1b6b76948de4 100644
--- a/src/components/dialog/error-dialog.css
+++ b/src/components/dialog/error-dialog.css
@@ -7,6 +7,9 @@
}
.modal-dialog {
- position: fixed;
+ position: absolute;
margin: 50px;
+ left: 50%;
+ -ms-transform: translateX(-50%);
+ transform: translateX(-50%);
}
\ No newline at end of file
diff --git a/src/components/dialog/error-dialog.js b/src/components/dialog/error-dialog.js
index 9c9489e8397779a1218a29fec6db2b57e9eaa55f..54c459295a3c426750a2a7c099ef80855da1bcba 100644
--- a/src/components/dialog/error-dialog.js
+++ b/src/components/dialog/error-dialog.js
@@ -13,12 +13,11 @@ class ErrorDialog extends React.Component{
super(props);
this.state = {
error: undefined,
- open: false,
isErrorSourceDisplayed: false
};
}
- componentDidMount() {
+ async componentDidMount() {
ErrorHandlerService.instance.addListener(
ErrorHandlerService.EVENTS.ERROR, (error) => {
this.onError(error);
@@ -26,52 +25,63 @@ class ErrorDialog extends React.Component{
}
onError(error) {
- console.info(error);
- this.setState({error: error});
+ this.setState({
+ error: error
+ });
}
- handleClose() {}
+ handleClose() {
+ this.setState({
+ error: undefined,
+ isErrorSourceDisplayed: false
+ });
+ }
sourceDisplay() {
this.setState({
- isErrorSourceDisplayed: true
+ isErrorSourceDisplayed: !this.state.isErrorSourceDisplayed
});
}
render(){
- let error = this.state.error;
+ const error = this.state.error;
return (
<div>
- { this.state.error ?
- <div className="modal-dialog-wrapper" onClick={event => event.stopPropagation()}>
+ {error?
+ <div className="modal-dialog-wrapper">
<Modal.Dialog className="modal-dialog">
<Modal.Header>
<h4>{error.type}</h4>
</Modal.Header>
<Modal.Body>
- <p>{error.message}</p>
+ <h5>Details</h5><pre>{error.message}</pre>
+ {this.state.isErrorSourceDisplayed
+ ?<div>
+ {!error.code && !error.data && !error.stack
+ ? <h6>No scary details</h6>
+ : null}
+ {this.state.error.code
+ ? <div><h6>Code</h6><pre>{this.state.error.code}</pre></div>
+ : null}
+ {this.state.error.data
+ ? <div><h6>Data</h6><pre>{this.state.error.data}</pre></div>
+ : null}
+ {this.state.error.stack
+ ? <div><h6>Stack Trace</h6><pre>{this.state.error.stack}</pre></div>
+ : null}
+ </div>
+ : null
+ }
</Modal.Body>
<Modal.Footer>
<div>
- <Button variant="outline-dark" onClick={this.handleClose()}>
+ <Button variant="outline-dark" onClick={() => this.handleClose()}>
<span className="glyphicon glyphicon-remove"></span> Close
</Button>
- <Button variant="outline-dark" className="pull-right" /*onClick={this.sourceDisplay()}*/>
+ <Button variant="outline-dark" className="pull-right" onClick={() => this.sourceDisplay()}>
{this.state.isErrorSourceDisplayed ? 'Hide' : 'Show'} scary details <span className="caret"></span>
</Button>
</div>
- {!this.state.isErrorSourceDisplayed
- ?<div>
- <h5>Error Type</h5><pre>{error.type}</pre>
- <h6>Error Code</h6><pre>{error.code}</pre>
- <h6>Message</h6><pre>{error.message}</pre>
- {error.data
- ? <div><h6>Data</h6><pre>{error.data}</pre></div>
- : null}
- <div><h6>Stack Trace</h6><pre>{error.stack}</pre></div>
- </div>
- : null
- }
</Modal.Footer>
</Modal.Dialog>
</div>
diff --git a/src/components/experiment-list/import-experiment-buttons.js b/src/components/experiment-list/import-experiment-buttons.js
index dec34221748c436d91f01f58e3508bd387a7f5cc..eca33e362e276d16b5cfd364bfdcf0aab7cfcbd4 100644
--- a/src/components/experiment-list/import-experiment-buttons.js
+++ b/src/components/experiment-list/import-experiment-buttons.js
@@ -7,7 +7,6 @@ import ImportExperimentService from '../../services/experiments/files/import-exp
import ExperimentStorageService from '../../services/experiments/files/experiment-storage-service.js';
import './experiment-list-element.css';
import './import-experiment-buttons.css';
-import ErrorHandlerService from '../../services/error-handler-service.js';
export default class ImportExperimentButtons extends React.Component {
constructor(props) {
super(props);
@@ -170,12 +169,6 @@ export default class ImportExperimentButtons extends React.Component {
</ButtonGroup>
: null}
</div>
-
- {/* DEBUG error emitting */}
- <button
- onClick={() => ErrorHandlerService.instance.emit(ErrorHandlerService.EVENTS.ERROR, new Error('test'))}>
- TEST emit error
- </button>
</div>
);
}
diff --git a/src/services/error-handler-service.js b/src/services/error-handler-service.js
index 98879b8b8cc66c85f736f4341a698830930dec85..9809a81f237d7bb9a2beef64e58c93a30b88f043 100644
--- a/src/services/error-handler-service.js
+++ b/src/services/error-handler-service.js
@@ -5,6 +5,12 @@ const SINGLETON_ENFORCER = Symbol();
/**
* Service that handles error retrieving from http and opening error dialog in App.js
+ * An Error object has 5 attributes among which 2 are required:
+ * - type: category (network ...) | required
+ * - message: details | required
+ * - code: error line | optional
+ * - data: related content | optional
+ * - stack: call stack | optional
*/
class ErrorHandlerService extends EventEmitter {
constructor(enforcer) {
@@ -22,8 +28,8 @@ class ErrorHandlerService extends EventEmitter {
return _instance;
}
- emitError(message) {
- let error = new Error(message);
+ emitNetworkError(error) {
+ error.type = 'Network Error';
this.emit(ErrorHandlerService.EVENTS.ERROR, error);
}
}
@@ -32,9 +38,4 @@ ErrorHandlerService.EVENTS = Object.freeze({
ERROR: 'ERROR'
});
-ErrorHandlerService.CONSTANTS = Object.freeze({
- INTERVAL_POLL_ERROR: 1000
-});
-
-
export default ErrorHandlerService;
\ No newline at end of file
diff --git a/src/services/experiments/files/import-experiment-service.js b/src/services/experiments/files/import-experiment-service.js
index c597dfbe08f93582217886e502af2005ea256b7d..c0a3181a79ccdf0b59b8e7db5f5e4ebc7536ac0f 100644
--- a/src/services/experiments/files/import-experiment-service.js
+++ b/src/services/experiments/files/import-experiment-service.js
@@ -42,8 +42,8 @@ export default class ImportExperimentService extends HttpService {
return _instance;
}
- createImportErrorPopup(error) {
- ErrorHandlerService.instance.emitError(error);
+ async createImportErrorPopup(error) {
+ ErrorHandlerService.instance.emitNetworkError(error);
}
getImportZipResponses(responses) {