From a3882b4410020dda5e2a7d335aede5cfb41f3cdf Mon Sep 17 00:00:00 2001
From: Antoine Detailleur <detailleur@fortiss.org>
Date: Wed, 7 Apr 2021 16:17:11 +0200
Subject: [PATCH] [NRRPLT-8136] synchronize with other part of the code, rsuite

---
 package-lock.json                             | 188 ++++++++++++++++++
 package.json                                  |   1 +
 src/services/error-handler-service.js         |  19 +-
 .../running-simulation-service.test.js        |  14 +-
 .../server-resources-service.test.js          |   4 +-
 .../execution/experiment-execution-service.js |   6 +-
 .../execution/running-simulation-service.js   |   6 +-
 .../execution/server-resources-service.js     |   2 +-
 .../files/experiment-storage-service.js       |   2 +-
 .../files/import-experiment-service.js        |  14 +-
 10 files changed, 229 insertions(+), 27 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3e6f31c..0f5597d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1952,6 +1952,22 @@
         }
       }
     },
+    "@rsuite/icon-font": {
+      "version": "4.0.0-alpha.2",
+      "resolved": "https://registry.npmjs.org/@rsuite/icon-font/-/icon-font-4.0.0-alpha.2.tgz",
+      "integrity": "sha512-U7jy6W5kDQJXRMPoYzA9TxQfoLA6xR2IWm1O3BE/k4xg9l9xgin1qL6SBrI13bLJJCb3yzOX1tlbNN/BsO7Uww=="
+    },
+    "@rsuite/icons": {
+      "version": "1.0.0-alpha.3",
+      "resolved": "https://registry.npmjs.org/@rsuite/icons/-/icons-1.0.0-alpha.3.tgz",
+      "integrity": "sha512-MPWq1GZ0wEntb08qkFhdxaMQOGpCV06knoP1sg4GPtpiNSmaTW3S12Y7M4KnaSl0a4gHvH3kOd7NXUefJqoScQ==",
+      "requires": {
+        "@rsuite/icon-font": "^4.0.0-alpha.2",
+        "classnames": "^2.2.5",
+        "insert-css": "^2.0.0",
+        "lodash": "^4.17.20"
+      }
+    },
     "@sinonjs/commons": {
       "version": "1.8.1",
       "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz",
@@ -4174,6 +4190,11 @@
         "supports-color": "^5.3.0"
       }
     },
+    "change-emitter": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz",
+      "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU="
+    },
     "char-regex": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
@@ -5096,6 +5117,11 @@
         "whatwg-url": "^8.0.0"
       }
     },
+    "date-fns": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
+      "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw=="
+    },
     "debug": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
@@ -5401,6 +5427,11 @@
         "csstype": "^3.0.2"
       }
     },
+    "dom-lib": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/dom-lib/-/dom-lib-1.3.1.tgz",
+      "integrity": "sha512-rITCKgbLkF0MX4zk0+N6PDIJwKb3tZ5r8qClvD23On3RUgUtnBRSnpSb/7PbY+1gjl1IMVvfZCbRtyAE4oWA2Q=="
+    },
     "dom-serializer": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
@@ -5550,6 +5581,11 @@
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.610.tgz",
       "integrity": "sha512-eFDC+yVQpEhtlapk4CYDPfV9ajF9cEof5TBcO49L1ETO+aYogrKWDmYpZyxBScMNe8Bo/gJamH4amQ4yyvXg4g=="
     },
+    "element-resize-event": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/element-resize-event/-/element-resize-event-3.0.3.tgz",
+      "integrity": "sha512-vhGNxT87PdZA6Ak4E0QhArwGzNcSPUwSN7n9wCFLeBlY2NNuuiwguQuQIp7P5oB65PLJ892yKcHiqz1xLWeiug=="
+    },
     "elliptic": {
       "version": "6.5.3",
       "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
@@ -5591,6 +5627,24 @@
       "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
       "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
     },
+    "encoding": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+      "requires": {
+        "iconv-lite": "^0.6.2"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.6.2",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
+          "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
+          }
+        }
+      }
+    },
     "end-of-stream": {
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -6807,6 +6861,35 @@
         "bser": "2.1.1"
       }
     },
+    "fbjs": {
+      "version": "0.8.17",
+      "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
+      "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
+      "requires": {
+        "core-js": "^1.0.0",
+        "isomorphic-fetch": "^2.1.1",
+        "loose-envify": "^1.0.0",
+        "object-assign": "^4.1.0",
+        "promise": "^7.1.1",
+        "setimmediate": "^1.0.5",
+        "ua-parser-js": "^0.7.18"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+          "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+        },
+        "promise": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+          "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+          "requires": {
+            "asap": "~2.0.3"
+          }
+        }
+      }
+    },
     "figgy-pudding": {
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
@@ -8120,6 +8203,11 @@
         }
       }
     },
+    "insert-css": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz",
+      "integrity": "sha1-610Ql7dUL0x56jBg067gfQU4gPQ="
+    },
     "internal-ip": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
@@ -8461,6 +8549,26 @@
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
       "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
     },
+    "isomorphic-fetch": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+      "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
+      "requires": {
+        "node-fetch": "^1.0.1",
+        "whatwg-fetch": ">=0.10.0"
+      },
+      "dependencies": {
+        "node-fetch": {
+          "version": "1.7.3",
+          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+          "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+          "requires": {
+            "encoding": "^0.1.11",
+            "is-stream": "^1.0.1"
+          }
+        }
+      }
+    },
     "isstream": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -13562,6 +13670,19 @@
         "prop-types": "^15.6.2"
       }
     },
+    "react-virtualized": {
+      "version": "9.22.3",
+      "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz",
+      "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==",
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "clsx": "^1.0.4",
+        "dom-helpers": "^5.1.3",
+        "loose-envify": "^1.4.0",
+        "prop-types": "^15.7.2",
+        "react-lifecycles-compat": "^3.0.4"
+      }
+    },
     "read-pkg": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
@@ -13659,6 +13780,26 @@
         "picomatch": "^2.2.1"
       }
     },
+    "recompose": {
+      "version": "0.30.0",
+      "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz",
+      "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==",
+      "requires": {
+        "@babel/runtime": "^7.0.0",
+        "change-emitter": "^0.1.2",
+        "fbjs": "^0.8.1",
+        "hoist-non-react-statics": "^2.3.1",
+        "react-lifecycles-compat": "^3.0.2",
+        "symbol-observable": "^1.0.4"
+      },
+      "dependencies": {
+        "hoist-non-react-statics": {
+          "version": "2.5.5",
+          "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
+          "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
+        }
+      }
+    },
     "recursive-readdir": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
@@ -14217,6 +14358,38 @@
         "xmldom": "^0.1.19"
       }
     },
+    "rsuite": {
+      "version": "4.9.3",
+      "resolved": "https://registry.npmjs.org/rsuite/-/rsuite-4.9.3.tgz",
+      "integrity": "sha512-OpUsnrMhrE7nSDKiVfUUbwG4AhK2lgbe7sAGYk0GnFgDeD3rtznKrukhQNi9T1W/MBuTib0BGzCHq1k1MoD6PQ==",
+      "requires": {
+        "@babel/runtime": "^7.8.4",
+        "classnames": ">=2.0.0",
+        "date-fns": "^1.30.1",
+        "dom-lib": "^1.2.1",
+        "element-resize-event": "^3.0.3",
+        "lodash": "^4.17.11",
+        "prop-types": "^15.7.2",
+        "react-lifecycles-compat": "^3.0.4",
+        "react-virtualized": "^9.21.0",
+        "recompose": "^0.30.0",
+        "rsuite-table": "^3.14.4",
+        "schema-typed": "^1.5.1"
+      }
+    },
+    "rsuite-table": {
+      "version": "3.14.5",
+      "resolved": "https://registry.npmjs.org/rsuite-table/-/rsuite-table-3.14.5.tgz",
+      "integrity": "sha512-WlBHrijN2vNk/mlEtBGNjbLhKXVurzY/GWuiyNVTOvhtBp7y3CyLWxPVm48ZwBCyhrhA39urTDZaEjaPI8FP/Q==",
+      "requires": {
+        "@babel/runtime": "^7.12.5",
+        "@rsuite/icons": "^1.0.0-12",
+        "classnames": "^2.2.5",
+        "dom-lib": "^1.2.1",
+        "element-resize-event": "^3.0.2",
+        "lodash": "^4.17.20"
+      }
+    },
     "rsvp": {
       "version": "4.8.5",
       "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
@@ -14465,6 +14638,11 @@
         "object-assign": "^4.1.1"
       }
     },
+    "schema-typed": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/schema-typed/-/schema-typed-1.5.1.tgz",
+      "integrity": "sha512-sx34fDSv08ubC9fTPKr3ba8YYs6nwqqRAITj6BXaxEaudJdjqtH7ZCe5wZQnQhbAGjKF4LcEwH15Oxf00pcSeg=="
+    },
     "schema-utils": {
       "version": "2.7.1",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
@@ -15547,6 +15725,11 @@
         "util.promisify": "~1.0.0"
       }
     },
+    "symbol-observable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
+      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
+    },
     "symbol-tree": {
       "version": "3.2.4",
       "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
@@ -16064,6 +16247,11 @@
       "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==",
       "dev": true
     },
+    "ua-parser-js": {
+      "version": "0.7.27",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.27.tgz",
+      "integrity": "sha512-eXMaRYK2skomGocoX0x9sBXzx5A1ZVQgXfrW4mTc8dT0zS7olEcyfudAzRC5tIIRgLxQ69B6jut3DI+n5hslPA=="
+    },
     "uncontrollable": {
       "version": "7.2.1",
       "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz",
diff --git a/package.json b/package.json
index fef55b1..9a5f08d 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
     "react-scripts": "4.0.0",
     "react-tabs": "3.1.2",
     "roslib": "1.1.0",
+    "rsuite": "4.9.3",
     "rxjs": "6.6.3",
     "web-vitals": "^0.2.4"
   },
diff --git a/src/services/error-handler-service.js b/src/services/error-handler-service.js
index 9809a81..026e939 100644
--- a/src/services/error-handler-service.js
+++ b/src/services/error-handler-service.js
@@ -28,10 +28,27 @@ class ErrorHandlerService extends EventEmitter {
     return _instance;
   }
 
-  emitNetworkError(error) {
+  // HTTP request error
+  networkError(error) {
     error.type = 'Network Error';
     this.emit(ErrorHandlerService.EVENTS.ERROR, error);
   }
+
+  // Handling data error
+  dataError(error){
+    error.type = 'Data Error';
+    this.emit(ErrorHandlerService.EVENTS.ERROR, error);
+  }
+
+  startSimulationError(error) {
+    error.type = 'Start Simulation Error';
+    this.emit(ErrorHandlerService.EVENTS.ERROR, error);
+  }
+
+  updateSimulationError(error) {
+    error.type = 'Update Simulation Error';
+    this.emit(ErrorHandlerService.EVENTS.ERROR, error);
+  }
 }
 
 ErrorHandlerService.EVENTS = Object.freeze({
diff --git a/src/services/experiments/execution/__tests__/running-simulation-service.test.js b/src/services/experiments/execution/__tests__/running-simulation-service.test.js
index ad13ee9..9492c9f 100644
--- a/src/services/experiments/execution/__tests__/running-simulation-service.test.js
+++ b/src/services/experiments/execution/__tests__/running-simulation-service.test.js
@@ -41,11 +41,11 @@ test('initializes and gets the simulation resources', async () => {
   expect(resources).toBeDefined();
 
   // failure case
-  jest.spyOn(ErrorHandlerService.instance, 'displayServerHTTPError').mockImplementation(() => { });
+  jest.spyOn(ErrorHandlerService.instance, 'networkError').mockImplementation(() => { });
   let simIDFailure = 0;
-  expect(ErrorHandlerService.instance.displayServerHTTPError).not.toHaveBeenCalled();
+  expect(ErrorHandlerService.instance.networkError).not.toHaveBeenCalled();
   resources = await RunningSimulationService.instance.initConfigFiles(serverBaseURL, simIDFailure);
-  expect(ErrorHandlerService.instance.displayServerHTTPError).toHaveBeenCalled();
+  expect(ErrorHandlerService.instance.networkError).toHaveBeenCalled();
 });
 
 test('verifies whether a simulation is ready', async () => {
@@ -139,7 +139,7 @@ test('register for ROS status information', () => {
 
 test('can retrieve the state of a simulation', async () => {
   let returnValueGET = undefined;
-  jest.spyOn(ErrorHandlerService.instance, 'displayServerHTTPError').mockImplementation();
+  jest.spyOn(ErrorHandlerService.instance, 'networkError').mockImplementation();
   jest.spyOn(RunningSimulationService.instance, 'httpRequestGET').mockImplementation(() => {
     if (RunningSimulationService.instance.httpRequestGET.mock.calls.length === 1) {
       returnValueGET = { state: EXPERIMENT_STATE.PAUSED }; // proper state msg
@@ -161,12 +161,12 @@ test('can retrieve the state of a simulation', async () => {
 
   // call 2 => rejected
   simSate = await RunningSimulationService.instance.getState('test-url', 1);
-  expect(ErrorHandlerService.instance.displayServerHTTPError).toHaveBeenCalled();
+  expect(ErrorHandlerService.instance.networkError).toHaveBeenCalled();
 });
 
 test('can set the state of a simulation', async () => {
   let returnValuePUT = undefined;
-  jest.spyOn(ErrorHandlerService.instance, 'onErrorSimulationUpdate').mockImplementation();
+  jest.spyOn(ErrorHandlerService.instance, 'updateSimuationError').mockImplementation();
   jest.spyOn(RunningSimulationService.instance, 'httpRequestPUT').mockImplementation(() => {
     if (RunningSimulationService.instance.httpRequestGET.mock.calls.length === 1) {
       returnValuePUT = {};
@@ -184,5 +184,5 @@ test('can set the state of a simulation', async () => {
 
   // call 2 => rejected
   returnValue = await RunningSimulationService.instance.updateState('test-url', 1, EXPERIMENT_STATE.PAUSED);
-  expect(ErrorHandlerService.instance.onErrorSimulationUpdate).toHaveBeenCalled();
+  expect(ErrorHandlerService.instance.updateSimulationError).toHaveBeenCalled();
 });
\ No newline at end of file
diff --git a/src/services/experiments/execution/__tests__/server-resources-service.test.js b/src/services/experiments/execution/__tests__/server-resources-service.test.js
index 2345da7..92ecf5b 100644
--- a/src/services/experiments/execution/__tests__/server-resources-service.test.js
+++ b/src/services/experiments/execution/__tests__/server-resources-service.test.js
@@ -67,9 +67,9 @@ test('can get a server config', async () => {
   jest.spyOn(ServerResourcesService.instance, 'httpRequestGET').mockImplementation(() => {
     return Promise.reject();
   });
-  jest.spyOn(ErrorHandlerService.instance, 'displayServerHTTPError').mockImplementation();
+  jest.spyOn(ErrorHandlerService.instance, 'networkError').mockImplementation();
   config = await ServerResourcesService.instance.getServerConfig('test-server-id');
-  expect(ErrorHandlerService.instance.displayServerHTTPError).toHaveBeenCalled();
+  expect(ErrorHandlerService.instance.networkError).toHaveBeenCalled();
 });
 
 test('should stop polling updates when window is unloaded', async () => {
diff --git a/src/services/experiments/execution/experiment-execution-service.js b/src/services/experiments/execution/experiment-execution-service.js
index 924c608..0076fbf 100644
--- a/src/services/experiments/execution/experiment-execution-service.js
+++ b/src/services/experiments/execution/experiment-execution-service.js
@@ -3,6 +3,7 @@ import _ from 'lodash';
 //import NrpAnalyticsService from '../../nrp-analytics-service.js';
 import ServerResourcesService from './server-resources-service.js';
 import SimulationService from './running-simulation-service.js';
+import ErrorHandlerService from '../../error-handler-service';
 import { HttpService } from '../../http-service.js';
 import { EXPERIMENT_STATE } from '../experiment-constants.js';
 
@@ -88,9 +89,8 @@ class ExperimentExecutionService extends HttpService {
         profiler,
         progressCallback
       ).catch((failure) => {
-        if (failure.error && failure.error.data) {
-          //TODO: proper ErrorHandlerService callback
-          console.error('Failed to start simulation: ' + JSON.stringify(failure.error.data));
+        if (failure.error) {
+          ErrorHandlerService.instance.startSimulationError(failure.error);
         }
         fatalErrorOccurred = fatalErrorOccurred || failure.isFatal;
 
diff --git a/src/services/experiments/execution/running-simulation-service.js b/src/services/experiments/execution/running-simulation-service.js
index caa3a1c..754ccc8 100644
--- a/src/services/experiments/execution/running-simulation-service.js
+++ b/src/services/experiments/execution/running-simulation-service.js
@@ -44,7 +44,7 @@ class SimulationService extends HttpService {
       cachedConfigFiles = response.resources;
     }
     catch (error) {
-      ErrorHandlerService.instance.displayServerHTTPError(error);
+      ErrorHandlerService.instance.networkError(error);
     }
 
     return cachedConfigFiles;
@@ -151,7 +151,7 @@ class SimulationService extends HttpService {
       return response;
     }
     catch (error) {
-      ErrorHandlerService.instance.displayServerHTTPError(error);
+      ErrorHandlerService.instance.networkError(error);
     }
   }
 
@@ -168,7 +168,7 @@ class SimulationService extends HttpService {
       return response;
     }
     catch (error) {
-      ErrorHandlerService.instance.onErrorSimulationUpdate(error);
+      ErrorHandlerService.instance.updateSimulationError(error);
     }
   }
 }
diff --git a/src/services/experiments/execution/server-resources-service.js b/src/services/experiments/execution/server-resources-service.js
index 708a46b..8a2eb78 100644
--- a/src/services/experiments/execution/server-resources-service.js
+++ b/src/services/experiments/execution/server-resources-service.js
@@ -79,7 +79,7 @@ class ServerResourcesService extends HttpService {
       .then(async (response) => {
         return await response.json();
       })
-      .catch(ErrorHandlerService.instance.displayServerHTTPError);
+      .catch(ErrorHandlerService.instance.networkError);
   }
 }
 
diff --git a/src/services/experiments/files/experiment-storage-service.js b/src/services/experiments/files/experiment-storage-service.js
index 4b17699..a02538e 100644
--- a/src/services/experiments/files/experiment-storage-service.js
+++ b/src/services/experiments/files/experiment-storage-service.js
@@ -79,7 +79,7 @@ class ExperimentStorageService extends HttpService {
         this.emit(ExperimentStorageService.EVENTS.UPDATE_EXPERIMENTS, this.experiments);
       }
       catch (error) {
-        ErrorHandlerService.instance.emit(ErrorHandlerService.EVENTS.ERROR, error);
+        ErrorHandlerService.instance.networkError(error);
       }
     }
 
diff --git a/src/services/experiments/files/import-experiment-service.js b/src/services/experiments/files/import-experiment-service.js
index c0a3181..4570938 100644
--- a/src/services/experiments/files/import-experiment-service.js
+++ b/src/services/experiments/files/import-experiment-service.js
@@ -42,10 +42,6 @@ export default class ImportExperimentService extends HttpService {
     return _instance;
   }
 
-  async createImportErrorPopup(error) {
-    ErrorHandlerService.instance.emitNetworkError(error);
-  }
-
   getImportZipResponses(responses) {
     let importZipResponses = {
       zipBaseFolderName: [],
@@ -73,7 +69,7 @@ export default class ImportExperimentService extends HttpService {
   async scanStorage() {
     return this.httpRequestPOST(scanStorageURL)
       .then(response => this.getScanStorageResponse(response))
-      .catch(error => this.createImportErrorPopup(error));
+      .catch(error => ErrorHandlerService.instance.networkError(error));
   }
 
   async zipExperimentFolder(event) {
@@ -110,7 +106,7 @@ export default class ImportExperimentService extends HttpService {
             )
           )
           .catch(error => {
-            this.createImportErrorPopup(error);
+            ErrorHandlerService.instance.dataError(error);
             return Promise.reject(error);
           })
       );
@@ -119,7 +115,7 @@ export default class ImportExperimentService extends HttpService {
     return Promise.all(promises)
       .then(() => zip.generateAsync({ type: 'blob' }))
       .catch(error => {
-        this.createImportErrorPopup(error);
+        ErrorHandlerService.instance.dataError(error);
         return Promise.reject(error);
       });
   }
@@ -128,7 +124,7 @@ export default class ImportExperimentService extends HttpService {
     return this.zipExperimentFolder(event).then(async zipContent => {
       return this.httpRequestPOST(importExperimentURL, zipContent, options)
         .then(response => response.json())
-        .catch(error => this.createImportErrorPopup(error)
+        .catch(error => ErrorHandlerService.instance.networkError(error)
         );
     });
   }
@@ -155,7 +151,7 @@ export default class ImportExperimentService extends HttpService {
         zipContents.map(zipContent =>
           this.httpRequestPOST(importExperimentURL, zipContent, options)
             .catch(error => {
-              this.createImportErrorPopup(error);
+              ErrorHandlerService.instance.networkError(error);
               return Promise.reject(error);
             })
         )
-- 
GitLab