You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by ri...@apache.org on 2020/02/17 09:32:30 UTC

[incubator-streampipes] 03/03: STREAMPIPES-53: Update UI to Angular 9, clean up build system and refactor old AngularJS code to support build optimization

This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-streampipes.git

commit bbe92c33f06eb6dd1b0bdbcae457576ba3edd714
Author: Dominik Riemer <ri...@fzi.de>
AuthorDate: Mon Feb 17 10:31:17 2020 +0100

    STREAMPIPES-53: Update UI to Angular 9, clean up build system and refactor old AngularJS code to support build optimization
---
 ui/.angular-cli.json                               | 23 ------
 ui/Dockerfile                                      | 31 ++++----
 ui/angular.json                                    | 86 ++++++++++++++++++++++
 ui/browserslist                                    | 12 +++
 ui/deployment/app.module.mst                       | 72 +++---------------
 ui/deployment/appng5.module.mst                    |  4 +-
 ui/deployment/dev/config.yml                       |  2 +-
 ui/deployment/state.config.mst                     |  3 +-
 ui/deployment/toolbar.controller.mst               |  4 +-
 ui/karma.conf.js                                   | 10 +--
 ui/package.json                                    | 64 +++++++++-------
 .../app/CustomMaterial/custom-material.module.ts   | 38 +++++-----
 .../app-asset-monitoring.module.ts                 |  4 +-
 .../create-asset/create-asset.component.ts         |  2 +-
 .../add-pipeline/add-pipeline-dialog.component.ts  |  2 +-
 .../save-dashboard-dialog.component.ts             |  2 +-
 ui/src/app/app-container/app-container.module.ts   |  2 +-
 ui/src/app/app-container/view/view.component.ts    |  4 +-
 ui/src/app/app-overview/app-overview.module.ts     |  4 +-
 .../app-transport-monitoring.module.ts             |  4 +-
 .../transport-selection.component.ts               |  3 +-
 .../app/configuration/configuration.component.ts   |  3 +-
 ui/src/app/configuration/configuration.module.ts   | 14 ++--
 .../pipeline-element-configuration.component.ts    |  3 +-
 ui/src/app/connect/connect.module.ts               |  8 +-
 .../adapter-description.component.ts               |  2 +-
 .../adapter-export-dialog.component.ts             |  2 +-
 .../adapter-upload-dialog.component.ts             |  2 +-
 .../data-marketplace/data-marketplace.component.ts |  2 +-
 .../file-management/file-management.component.ts   |  2 +-
 .../component/adapter-started-dialog.component.ts  |  2 +-
 .../connect/new-adapter/new-adapter.component.ts   |  4 +-
 .../event-property-row.component.ts                |  4 +-
 .../event-schema/event-schema.component.html       |  2 +-
 ui/src/app/core-ui/core-ui.module.ts               | 13 ++--
 ui/src/app/core-ui/table/table.component.ts        |  2 +-
 ui/src/app/core/http-provider.config.ts            |  4 +-
 ui/src/app/core/icon-provider.config.ts            |  3 +-
 ui/src/app/core/md-theming-provider.config.ts      | 70 ++++++++++++++++++
 ui/src/app/core/root-scope-delegate.decorator.ts   | 28 +++++++
 ui/src/app/dashboard-v2/dashboard.module.ts        |  2 +-
 .../add-visualization-dialog.component.ts          |  2 +-
 .../edit-dashboard-dialog.component.ts             |  2 +-
 .../app/data-explorer/data-explorer.component.ts   |  2 +-
 ui/src/app/data-explorer/data-explorer.module.ts   |  7 +-
 .../datadownloadDialog/dataDownload.dialog.ts      |  3 +-
 .../data-explorer/explorer/explorer.component.ts   |  5 +-
 .../components/freetext/freetext.controller.ts     |  3 +
 .../customize.controller.ts                        | 11 +--
 ui/src/app/editor/editor.module.ts                 |  3 +-
 ui/src/app/home/home.module.ts                     |  3 +-
 ui/src/app/info/info.component.ts                  |  2 +-
 ui/src/app/info/info.module.ts                     | 16 ++--
 ui/src/app/layout/app.controller.ts                |  3 +
 ui/src/app/login/login.controller.ts               |  6 +-
 ui/src/app/login/startup/startup.controller.ts     |  5 +-
 .../dialog/pipeline-status-dialog.controller.ts    |  6 +-
 .../dialog/pipeline-status-dialog.tmpl.html        |  2 +-
 ui/src/app/pipelines/pipelines.module.ts           |  5 +-
 ui/src/app/services/auth.service.ts                |  5 +-
 ui/src/app/services/jsplumb.service.ts             | 13 ++--
 ui/src/app/services/object-provider.service.ts     |  2 +-
 ui/src/app/services/pipeline-editor.service.ts     |  2 +-
 .../app/services/pipeline-positioning.service.ts   |  6 +-
 ui/src/app/services/rest-api.service.ts            |  2 +-
 .../route-transition-interceptor.service.ts        |  5 +-
 ui/src/app/services/tour/shepherd.service.ts       |  5 +-
 ui/src/app/services/tour/tour-provider.service.ts  |  7 +-
 ui/src/app/services/transition.service.ts          |  3 +-
 ui/src/index.html                                  |  2 +
 ui/src/polyfills.ts                                | 68 ++++++-----------
 ui/src/scss/sp/main.scss                           |  4 +
 ui/src/tsconfig.app.json                           | 14 ++--
 ui/src/tsconfig.spec.json                          |  3 +-
 ui/tsconfig.json                                   | 10 ++-
 ui/tslint.json                                     |  2 +-
 ui/webpack.config.base.js                          | 26 ++++---
 ui/webpack.config.prod.js                          |  6 +-
 ui/webpack.partial.base.js                         | 32 ++++++++
 ui/webpack.partial.dev.js                          | 58 +++++++++++++++
 .../http-provider.config.ts => webpack.partial.js} |  8 +-
 ui/webpack.partial.prod.js                         | 26 +++++++
 82 files changed, 608 insertions(+), 335 deletions(-)

diff --git a/ui/.angular-cli.json b/ui/.angular-cli.json
deleted file mode 100644
index b2e5873..0000000
--- a/ui/.angular-cli.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
-  "apps": [
-    {
-      "root": "src",
-      "outDir": "",
-      "assets": [
-        "assets"
-      ],
-      "index": "index.html",
-      "main": "main.ts",
-      "polyfills": "polyfills.ts",
-      "test": "test.ts",
-      "tsconfig": "tsconfig.app.json",
-      "testTsconfig": "tsconfig.spec.json",
-      "prefix": "sp",
-      "styles": [
-        "styles.css"
-      ],
-      "scripts": []
-    }
-  ]
-}
diff --git a/ui/Dockerfile b/ui/Dockerfile
index 13bd1a4..173aea2 100644
--- a/ui/Dockerfile
+++ b/ui/Dockerfile
@@ -16,21 +16,22 @@
 ARG BASE_IMAGE=nginx
 FROM $BASE_IMAGE
 
-COPY dist/assets/img/ /usr/share/nginx/html/assets/img/
-COPY dist/assets/css/ /usr/share/nginx/html/assets/css/
-COPY dist/assets/lib/ /usr/share/nginx/html/assets/lib/
-COPY dist/assets/templates/ /usr/share/nginx/html/assets/templates/
-COPY dist/assets/fonts/ /usr/share/nginx/html/assets/fonts/
-COPY dist/index.html /usr/share/nginx/html/
-COPY dist/main.bundle.js /usr/share/nginx/html/
-COPY dist/main.bundle.js.gz /usr/share/nginx/html/
-COPY dist/polyfills.bundle.js /usr/share/nginx/html/
-COPY dist/polyfills.bundle.js.gz /usr/share/nginx/html/
-#COPY dist/runtime.bundle.js /usr/share/nginx/html/
-COPY dist/style.bundle.js /usr/share/nginx/html/
-COPY dist/style.bundle.js.gz /usr/share/nginx/html/
-COPY dist/style.css /usr/share/nginx/html/
-COPY dist/style.css.gz /usr/share/nginx/html/
+COPY dist/ /usr/share/nginx/html/
+#COPY dist/assets/img/ /usr/share/nginx/html/assets/img/
+#COPY dist/assets/css/ /usr/share/nginx/html/assets/css/
+#COPY dist/assets/lib/ /usr/share/nginx/html/assets/lib/
+#COPY dist/assets/templates/ /usr/share/nginx/html/assets/templates/
+#COPY dist/assets/fonts/ /usr/share/nginx/html/assets/fonts/
+#COPY dist/index.html /usr/share/nginx/html/
+#COPY dist/main.bundle.js /usr/share/nginx/html/
+#COPY dist/main.bundle.js.gz /usr/share/nginx/html/
+#COPY dist/polyfills.bundle.js /usr/share/nginx/html/
+#COPY dist/polyfills.bundle.js.gz /usr/share/nginx/html/
+##COPY dist/runtime.bundle.js /usr/share/nginx/html/
+#COPY dist/style.bundle.js /usr/share/nginx/html/
+#COPY dist/style.bundle.js.gz /usr/share/nginx/html/
+#COPY dist/style.css /usr/share/nginx/html/
+#COPY dist/style.css.gz /usr/share/nginx/html/
 
 #COPY javadoc/ /usr/share/nginx/html/javadoc
 
diff --git a/ui/angular.json b/ui/angular.json
new file mode 100644
index 0000000..aff1003
--- /dev/null
+++ b/ui/angular.json
@@ -0,0 +1,86 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "newProjectRoot": "projects",
+  "projects": {
+    "app": {
+      "root": "",
+      "sourceRoot": "src",
+      "projectType": "application",
+      "architect": {
+        "build": {
+          "builder": "@angular-builders/custom-webpack:browser",
+          "options": {
+            "aot": true,
+            "outputPath": "dist/",
+            "index": "src/index.html",
+            "main": "src/main.ts",
+            "tsConfig": "src/tsconfig.app.json",
+            "polyfills": "src/polyfills.ts",
+            "assets": [
+              "src/assets"
+            ],
+            "styles": [
+              "src/scss/main.scss"
+            ],
+            "scripts": []
+          },
+          "configurations": {
+            "production": {
+              "budgets": [
+                {
+                  "type": "anyComponentStyle",
+                  "maximumWarning": "6kb"
+                }
+              ],
+              "optimization": true,
+              "outputHashing": "all",
+              "sourceMap": false,
+              "extractCss": true,
+              "namedChunks": false,
+              "aot": true,
+              "extractLicenses": true,
+              "vendorChunk": false,
+              "buildOptimizer": true,
+              "customWebpackConfig": {
+                "path": "./webpack.partial.prod.js"
+              }
+            },
+            "development": {
+              "customWebpackConfig": {
+                "path": "./webpack.partial.dev.js"
+              }
+            }
+          }
+        },
+        "serve": {
+          "builder": "@angular-builders/custom-webpack:dev-server",
+          "options": {
+            "browserTarget": "app:build:development"
+          },
+          "configurations": {
+          }
+        },
+        "extract-i18n": {
+          "builder": "@angular-devkit/build-angular:extract-i18n",
+          "options": {
+            "browserTarget": "app:build"
+          }
+        },
+        "lint": {
+          "builder": "@angular-devkit/build-angular:tslint",
+          "options": {
+            "tsConfig": [],
+            "exclude": []
+          }
+        }
+      }
+    },
+    "app-e2e": {
+      "root": "e2e",
+      "sourceRoot": "e2e",
+      "projectType": "application"
+    }
+  },
+  "defaultProject": "app"
+}
\ No newline at end of file
diff --git a/ui/browserslist b/ui/browserslist
new file mode 100644
index 0000000..8084853
--- /dev/null
+++ b/ui/browserslist
@@ -0,0 +1,12 @@
+# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
+# For additional information regarding the format and rule options, please see:
+# https://github.com/browserslist/browserslist#queries
+
+# You can see what browsers were selected by your queries by running:
+#   npx browserslist
+
+> 0.5%
+last 2 versions
+Firefox ESR
+not dead
+not IE 9-11 # For IE 9-11 support, remove 'not'.
\ No newline at end of file
diff --git a/ui/deployment/app.module.mst b/ui/deployment/app.module.mst
index cd4c173..88977eb 100644
--- a/ui/deployment/app.module.mst
+++ b/ui/deployment/app.module.mst
@@ -34,6 +34,9 @@ import spNotifications from './notifications/notifications.module';
 import spAppLinks from './applinks/applinks.module';
 import spPipelineDetails from './pipeline-details/pipeline-details.module';
 import { SpButtonDirective } from "./core/button/button.directive";
+import mdThemingProviderConfig from "./core/md-theming-provider.config";
+import rootScopeDelegate from "./core/root-scope-delegate.decorator";
+
 {{#modulesActive}}
 {{^ng5}}
 import {{module}} from '{{{path}}}';
@@ -60,74 +63,17 @@ export const Ng1AppModule = angular
         {{/ng5}}
         {{/modulesActive}}
     ])
- .decorator('$rootScope', $delegate => {
-    const originalDigest = $delegate.$digest;
-    $delegate.$digest = () => {
-      if (!$delegate.$$phase) {
-        originalDigest.call($delegate);
-      }
-    };
-    return $delegate;
-  })
+    .decorator('$rootScope', rootScopeDelegate)
     .config(['$urlServiceProvider', ($urlService) => $urlService.deferIntercept()])
-    .run(["$rootScope", "$transitions", "ObjectProvider", "TransitionService", "RouteTransitionInterceptorService",
-        function ($rootScope, $transitions, ObjectProvider, TransitionService, RouteTransitionInterceptorService) {
+    .run(["$rootScope", "$transitions", "TransitionService", "RouteTransitionInterceptorService",
+        function ($rootScope, $transitions, TransitionService, RouteTransitionInterceptorService) {
             $transitions.onBefore({}, transition => {
               return RouteTransitionInterceptorService.onTransitionStarted(transition);
             });
             $transitions.onStart({}, transition => {
                 return TransitionService.onTransitionStarted(transition);
             });
-            $rootScope.state = new ObjectProvider.State();
             window['loading_screen'].finish();
-    }]).config(function($mdThemingProvider) {
-
-        $mdThemingProvider.definePalette('streamPipesPrimary', {
-            '50': '304269',
-            '100': '304269',
-            '200': '304269',
-            '300': '304269',
-            '400': '304269',
-            '500': '304269',
-            '600': '304269',
-            '700': '003B3D',
-            '800': '39b54a',
-            '900': '39b54a',
-            'A100': '39b54a',
-            'A200': '39b54a',
-            'A400': '39b54a',
-            'A700': '39b54a',
-            'contrastDefaultColor': 'light',    // whether, by default, text (contrast)
-                                                // on this palette should be dark or light
-
-            'contrastDarkColors': ['50', '100', //hues which contrast should be 'dark' by default
-                '200', '300', '400', 'A100'],
-        });
-
-        $mdThemingProvider.definePalette('streamPipesAccent', {
-            '50': 'DF5A49',
-            '100': 'DF5A49',
-            '200': '007F54',
-            '300': '007F54',
-            '400': '39B54A',
-            '500': '45DA59',
-            '600': '45DA59',
-            '700': '45DA59',
-            '800': '45DA59',
-            '900': '1B1464',
-            'A100': '1B1464',
-            'A200': '1B1464',
-            'A400': '1B1464',
-            'A700': '1B1464',
-            'contrastDefaultColor': 'light',    // whether, by default, text (contrast)
-                                                // on this palette should be dark or light
-
-            'contrastDarkColors': ['50', '100', //hues which contrast should be 'dark' by default
-                '200', '300', '400', 'A100'],
-        });
-
-        $mdThemingProvider.theme('default')
-            .primaryPalette('streamPipesPrimary')
-            .accentPalette('streamPipesAccent')
-
-    }).directive("spButton", ['$mdButtonInkRipple', '$mdTheming', '$mdAria', '$mdInteraction', ($mdButtonInkRipple, $mdTheming, $mdAria, $mdInteraction) => new SpButtonDirective($mdButtonInkRipple, $mdTheming, $mdAria, $mdInteraction)]);
\ No newline at end of file
+    }])
+    .config(mdThemingProviderConfig)
+    .directive("spButton", ['$mdButtonInkRipple', '$mdTheming', '$mdAria', '$mdInteraction', ($mdButtonInkRipple, $mdTheming, $mdAria, $mdInteraction) => new SpButtonDirective($mdButtonInkRipple, $mdTheming, $mdAria, $mdInteraction)]);
\ No newline at end of file
diff --git a/ui/deployment/appng5.module.mst b/ui/deployment/appng5.module.mst
index c50e241..54be583 100644
--- a/ui/deployment/appng5.module.mst
+++ b/ui/deployment/appng5.module.mst
@@ -24,7 +24,7 @@ import { MatGridListModule } from '@angular/material/grid-list';
 import { FlexLayoutModule } from '@angular/flex-layout';
 import { UIRouterUpgradeModule } from '@uirouter/angular-hybrid';
 import { HttpClientModule } from '@angular/common/http';
-import { MatIconModule } from '@angular/material';
+import { MatIconModule } from '@angular/material/icon';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { FormsModule } from '@angular/forms';
 
@@ -82,6 +82,6 @@ export class AppModule {
     }
 
     ngDoBootstrap() {
-        this.upgrade.bootstrap(document.body, ['streamPipesApp']);
+        this.upgrade.bootstrap(document.body, ['streamPipesApp'], {strictDi: true});
     }
 }
\ No newline at end of file
diff --git a/ui/deployment/dev/config.yml b/ui/deployment/dev/config.yml
index cf79df7..0424e05 100644
--- a/ui/deployment/dev/config.yml
+++ b/ui/deployment/dev/config.yml
@@ -21,7 +21,7 @@ modules:
   - spEditor
   - spPipelines
   - spConnect
-  - spDashboard
+#  - spDashboard
   - spAppOverview
   - spAdd
   - spMyElements
diff --git a/ui/deployment/state.config.mst b/ui/deployment/state.config.mst
index 3ebd9ed..8b3c086 100644
--- a/ui/deployment/state.config.mst
+++ b/ui/deployment/state.config.mst
@@ -16,7 +16,6 @@
  *
  */
 
-//stateConfig.$inject = ['$stateProvider', '$urlRouterProvider'];
 declare const require: any;
 {{#modulesActive}}
 {{#ng5}}
@@ -169,3 +168,5 @@ export default function stateConfig($stateProvider, $urlRouterProvider) {
         {{/ng5}}
         {{/modulesActive}};
 };
+
+stateConfig.$inject = ['$stateProvider', '$urlRouterProvider'];
\ No newline at end of file
diff --git a/ui/deployment/toolbar.controller.mst b/ui/deployment/toolbar.controller.mst
index f5905c7..88430c4 100644
--- a/ui/deployment/toolbar.controller.mst
+++ b/ui/deployment/toolbar.controller.mst
@@ -250,4 +250,6 @@ export class ToolbarController {
         this.feedbackOpen = false;
     }
 
-};
\ No newline at end of file
+};
+
+ToolbarController.$inject = ['$mdSidenav', '$mdUtil', 'RestApi', '$state', '$window', '$location', 'AuthStatusService', '$scope'];
\ No newline at end of file
diff --git a/ui/karma.conf.js b/ui/karma.conf.js
index 6af4774..4cb07db 100644
--- a/ui/karma.conf.js
+++ b/ui/karma.conf.js
@@ -22,7 +22,7 @@
 module.exports = function (config) {
     config.set({
         basePath: '',
-        frameworks: ['jasmine', '@angular/cli'],
+        frameworks: ['jasmine', '@angular-devkit/build-angular'],
         plugins: [
             require('karma-jasmine'),
             require('karma-chrome-launcher'),
@@ -30,18 +30,16 @@ module.exports = function (config) {
             require('karma-jasmine-html-reporter'),
             require('karma-verbose-reporter'),
             require('karma-coverage-istanbul-reporter'),
-            require('@angular/cli/plugins/karma')
+            require('@angular-devkit/build-angular/plugins/karma')
         ],
         client: {
             clearContext: false // leave Jasmine Spec Runner output visible in browser
         },
         coverageIstanbulReporter: {
-            reports: ['html', 'lcovonly'],
+            dir: require('path').join(__dirname, 'coverage'), reports: ['html', 'lcovonly'],
             fixWebpackSourcePaths: true
         },
-        angularCli: {
-            environment: 'dev'
-        },
+        
         customLaunchers: {
             ChromeHeadless: {
                 base: 'Chrome',
diff --git a/ui/package.json b/ui/package.json
index 8eb1a20..4f22097 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -1,6 +1,6 @@
 {
   "name": "apache-streampipes",
-  "version": "0.0.1",
+  "version": "0.65.1-SNAPSHOT",
   "description": "Apache StreamPipes (incubating) user interface",
   "homepage": "http://streampipes.apache.org",
   "repository": {
@@ -8,43 +8,49 @@
     "url": "https://github.com/apache/incubator-streampipes"
   },
   "scripts": {
-    "start": "node ./deployment/prebuild.js && webpack-dev-server -d --env=dev",
+    "start": "node ./deployment/prebuild.js && ng serve",
+    "start-webpack": "node ./deployment/prebuild.js && webpack-dev-server -d --env=dev",
     "watchtest": "node ./deployment/prebuild.js && karma start ./karma.conf.js --no-auto-watch --single-run",
     "test": "node ./deployment/prebuild.js && karma start ./karma.conf.js",
-    "build": "node ./deployment/prebuild.js && webpack --display-modules --progress --env=prod",
+    "build": "node ./deployment/prebuild.js && set NODE_OPTIONS=--max-old-space-size=10192 && ng build --prod --stats-json",
+    "build-webpack": "node ./deployment/prebuild.js && webpack --display-modules --progress --env=prod",
     "lint": "tslint -c tslint.json 'src/**/*.ts*"
   },
   "dependencies": {
-    "@angular/animations": "8.2.14",
-    "@angular/cdk": "7.3.7",
-    "@angular/common": "8.2.14",
-    "@angular/compiler": "8.2.14",
-    "@angular/core": "8.2.14",
-    "@angular/flex-layout": "7.0.0-beta.23",
-    "@angular/forms": "8.2.14",
-    "@angular/material": "7.3.7",
-    "@angular/platform-browser": "8.2.14",
-    "@angular/platform-browser-dynamic": "8.2.14",
-    "@angular/router": "8.2.14",
-    "@angular/upgrade": "8.2.14",
+    "@angular/animations": "9.0.1",
+    "@angular/cdk": "9.0.0",
+    "@angular/common": "9.0.1",
+    "@angular/compiler": "9.0.1",
+    "@angular/core": "9.0.1",
+    "@angular/flex-layout": "9.0.0-beta.29",
+    "@angular/forms": "9.0.1",
+    "@angular/material": "9.0.0",
+    "@angular/platform-browser": "9.0.1",
+    "@angular/platform-browser-dynamic": "9.0.1",
+    "@angular/router": "9.0.1",
+    "@angular/upgrade": "9.0.1",
     "@ngui/datetime-picker": "0.16.2",
     "@stomp/ng2-stompjs": "^7.2.0",
     "@swimlane/ngx-charts": "^13.0.2",
-    "@uirouter/angular-hybrid": "7.0.0",
+    "@uirouter/angular-hybrid": "10.0.1",
+    "@uirouter/core": "6.0.4",
+    "@uirouter/angular": "^6.0.1",
+    "@uirouter/angularjs":  "^1.0.25",
+    "@uirouter/rx": "^0.6.5",
     "angular": "1.7.7",
     "angular-animate": "1.7.7",
     "angular-aria": "1.7.7",
     "angular-clipboard": "1.4.2",
     "angular-cookies": "1.7.7",
     "angular-datatables": "0.6.2",
-    "angular-gridster2": "7.2.0",
+    "angular-gridster2": "8.3.0",
     "angular-loading-bar": "0.8.0",
     "angular-markdown-directive": "0.3.1",
     "angular-material": "1.1.18",
     "angular-material-icons": "0.4.0",
     "angular-messages": "1.7.7",
     "angular-notification-icons": "0.4.4",
-    "angular-plotly.js": "1.3.2",
+    "angular-plotly.js": "1.5.0",
     "angular-resource": "1.7.7",
     "angular-route": "1.7.7",
     "angular-rt-popup": "1.0.6",
@@ -72,7 +78,7 @@
     "lodash": "3.10.1",
     "ng-dynamic-component": "4.0.3",
     "ng-file-upload": "9.0.13",
-    "ng-pick-datetime": "7.0.0",
+    "@danielmoncada/angular-datetime-picker": "^9.2.0",
     "ng-prettyjson": "0.1.8",
     "ng-showdown": "^1.1.0",
     "ng-simple-slideshow": "^1.2.9",
@@ -80,24 +86,26 @@
     "ng2-dragula": "^1.5.0",
     "ngmap": "1.18.0",
     "ngx-color-picker": "^7.5.0",
-    "plotly.js": "1.49.3",
     "prismjs": "^1.16.0",
     "rxjs": "^6.3.3",
     "rxjs-compat": "^6.3.3",
     "shepherd.js": "2.4.0",
     "slick-carousel": "1.6.0",
-    "zone.js": "~0.9.1"
+    "tslib": "^1.10.0",
+    "zone.js": "~0.10.2"
   },
   "devDependencies": {
-    "@angular/cli": "8.3.25",
-    "@angular/compiler-cli": "8.2.14",
-    "@ngtools/webpack": "8.3.25",
+    "@angular-builders/custom-webpack": "^8.4.1",
+    "@angular-devkit/build-angular": "~0.900.2",
+    "@angular/cli": "9.0.2",
+    "@angular/compiler-cli": "9.0.1",
+    "@ngtools/webpack": "9.0.2",
     "@types/angular": "^1.6.43",
     "@types/jasmine": "~2.8.3",
     "@types/jqueryui": "^1.12.7",
-    "@types/node": "11.11.3",
+    "@types/node": "^12.11.1",
     "@types/rx": "^4.1.1",
-    "codelyzer": "^5.0.1",
+    "codelyzer": "^5.1.2",
     "copy-webpack-plugin": "^5.0.2",
     "compression-webpack-plugin": "^3.0.0",
     "css-loader": "^0.28.11",
@@ -113,7 +121,7 @@
     "karma-jasmine": "~1.1.0",
     "karma-jasmine-html-reporter": "^0.2.2",
     "karma-verbose-reporter": "0.0.6",
-    "mini-css-extract-plugin": "^0.5.0",
+    "mini-css-extract-plugin": "^0.9.0",
     "mustache": "^2.3.0",
     "node-sass": "^4.8.3",
     "prettier": "1.14.2",
@@ -123,7 +131,7 @@
     "to-string-loader": "^1.1.5",
     "tslint": "^5.15.0",
     "tslint-config-prettier": "^1.15.0",
-    "typescript": "3.5.3",
+    "typescript": "3.7.5",
     "uglifyjs-webpack-plugin": "^2.1.2",
     "webpack": "^4.29.6",
     "webpack-cli": "^3.2.3",
diff --git a/ui/src/app/CustomMaterial/custom-material.module.ts b/ui/src/app/CustomMaterial/custom-material.module.ts
index cc6eaec..a52f651 100644
--- a/ui/src/app/CustomMaterial/custom-material.module.ts
+++ b/ui/src/app/CustomMaterial/custom-material.module.ts
@@ -18,26 +18,24 @@
 
 import {NgModule} from '@angular/core';
 
-import {
-    MatButtonModule,
-    MatCardModule,
-    MatCheckboxModule,
-    MatExpansionModule,
-    MatIconModule,
-    MatInputModule,
-    MatListModule,
-    MatMenuModule,
-    MatSelectModule,
-    MatSidenavModule,
-    MatSlideToggleModule,
-    MatTabsModule,
-    MatToolbarModule,
-    MatPaginatorModule,
-    MatSortModule,
-    MatDividerModule,
-    MatProgressBarModule, MatButtonToggleModule,
-
-} from '@angular/material';
+import { MatButtonModule } from '@angular/material/button';
+import { MatButtonToggleModule } from '@angular/material/button-toggle';
+import { MatCardModule } from '@angular/material/card';
+import { MatCheckboxModule } from '@angular/material/checkbox';
+import { MatDividerModule } from '@angular/material/divider';
+import { MatExpansionModule } from '@angular/material/expansion';
+import { MatIconModule } from '@angular/material/icon';
+import { MatInputModule } from '@angular/material/input';
+import { MatListModule } from '@angular/material/list';
+import { MatMenuModule } from '@angular/material/menu';
+import { MatPaginatorModule } from '@angular/material/paginator';
+import { MatProgressBarModule } from '@angular/material/progress-bar';
+import { MatSelectModule } from '@angular/material/select';
+import { MatSidenavModule } from '@angular/material/sidenav';
+import { MatSlideToggleModule } from '@angular/material/slide-toggle';
+import { MatSortModule } from '@angular/material/sort';
+import { MatTabsModule } from '@angular/material/tabs';
+import { MatToolbarModule } from '@angular/material/toolbar';
 import {MatStepperModule} from '@angular/material/stepper';
 import {MatRadioModule} from '@angular/material/radio';
 import {MatTableModule} from '@angular/material/table';
diff --git a/ui/src/app/app-asset-monitoring/app-asset-monitoring.module.ts b/ui/src/app/app-asset-monitoring/app-asset-monitoring.module.ts
index 822cdc7..21c309b 100644
--- a/ui/src/app/app-asset-monitoring/app-asset-monitoring.module.ts
+++ b/ui/src/app/app-asset-monitoring/app-asset-monitoring.module.ts
@@ -29,7 +29,9 @@ import {CreateAssetComponent} from "./components/create-asset/create-asset.compo
 import {WebsocketService} from "./services/websocket.service";
 import {AddPipelineDialogComponent} from "./dialog/add-pipeline/add-pipeline-dialog.component";
 import {RestService} from './services/rest.service';
-import {MatFormFieldModule, MatGridListModule, MatInputModule} from "@angular/material";
+import { MatFormFieldModule } from "@angular/material/form-field";
+import { MatGridListModule } from "@angular/material/grid-list";
+import { MatInputModule } from "@angular/material/input";
 import {ElementIconText} from "../services/get-element-icon-text.service";
 import {FormsModule} from "@angular/forms";
 import {ColorPickerModule} from "ngx-color-picker";
diff --git a/ui/src/app/app-asset-monitoring/components/create-asset/create-asset.component.ts b/ui/src/app/app-asset-monitoring/components/create-asset/create-asset.component.ts
index e23e6ae..29bd5f4 100644
--- a/ui/src/app/app-asset-monitoring/components/create-asset/create-asset.component.ts
+++ b/ui/src/app/app-asset-monitoring/components/create-asset/create-asset.component.ts
@@ -19,7 +19,7 @@
 import {Component, HostListener} from "@angular/core";
 import Konva from "konva";
 import {AddPipelineDialogComponent} from "../../dialog/add-pipeline/add-pipeline-dialog.component";
-import {MatDialog} from "@angular/material";
+import { MatDialog } from "@angular/material/dialog";
 import {ShapeService} from "../../services/shape.service";
 import {SelectedVisualizationData} from "../../model/selected-visualization-data.model";
 import {SaveDashboardDialogComponent} from "../../dialog/save-dashboard/save-dashboard-dialog.component";
diff --git a/ui/src/app/app-asset-monitoring/dialog/add-pipeline/add-pipeline-dialog.component.ts b/ui/src/app/app-asset-monitoring/dialog/add-pipeline/add-pipeline-dialog.component.ts
index c795d76..993cb27 100644
--- a/ui/src/app/app-asset-monitoring/dialog/add-pipeline/add-pipeline-dialog.component.ts
+++ b/ui/src/app/app-asset-monitoring/dialog/add-pipeline/add-pipeline-dialog.component.ts
@@ -17,7 +17,7 @@
  */
 
 import {Component, Inject} from "@angular/core";
-import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material";
+import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog";
 import {RestApi} from "../../../services/rest-api.service";
 import {RestService} from "../../services/rest.service";
 import {ElementIconText} from "../../../services/get-element-icon-text.service";
diff --git a/ui/src/app/app-asset-monitoring/dialog/save-dashboard/save-dashboard-dialog.component.ts b/ui/src/app/app-asset-monitoring/dialog/save-dashboard/save-dashboard-dialog.component.ts
index adac641..e260140 100644
--- a/ui/src/app/app-asset-monitoring/dialog/save-dashboard/save-dashboard-dialog.component.ts
+++ b/ui/src/app/app-asset-monitoring/dialog/save-dashboard/save-dashboard-dialog.component.ts
@@ -18,7 +18,7 @@
 
 import {Component, Inject} from "@angular/core";
 import {RestService} from "../../services/rest.service";
-import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material";
+import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog";
 import {CanvasConfiguration} from "../../model/canvas-configuration.model";
 import {DashboardConfiguration} from "../../model/dashboard-configuration.model";
 import {ImageInfo} from "../../model/image-info.model";
diff --git a/ui/src/app/app-container/app-container.module.ts b/ui/src/app/app-container/app-container.module.ts
index ede095a..2c1dce9 100644
--- a/ui/src/app/app-container/app-container.module.ts
+++ b/ui/src/app/app-container/app-container.module.ts
@@ -25,7 +25,7 @@ import { AppContainerService } from './shared/app-container.service';
 import { ViewComponent } from './view/view.component';
 
 import { JitCompilerFactory } from '@angular/platform-browser-dynamic';
-import { MatDialogModule } from '@angular/material';
+import { MatDialogModule } from '@angular/material/dialog';
 import { CustomMaterialModule } from '../CustomMaterial/custom-material.module';
 
 @NgModule({
diff --git a/ui/src/app/app-container/view/view.component.ts b/ui/src/app/app-container/view/view.component.ts
index ae3ccfb..3a2af81 100644
--- a/ui/src/app/app-container/view/view.component.ts
+++ b/ui/src/app/app-container/view/view.component.ts
@@ -42,7 +42,7 @@ import * as angularPlatformBrowserAnimations from '@angular/platform-browser/ani
 import * as angularCdk from '@angular/cdk';
 import * as angularCdkObservers from '@angular/cdk/observers';
 import * as angularCommonHttp from '@angular/common/http';
-import * as angularMaterial from '@angular/material';
+//import * as angularMaterial from '@angular/material';
 import * as angularFlexLayout from '@angular/flex-layout';
 import * as angularForms from '@angular/forms';
 import * as angularMaterialDialog from '@angular/material/dialog';
@@ -74,7 +74,7 @@ SystemJS.set('@angular/platform-browser/animations', SystemJS.newModule(angularP
 SystemJS.set('@angular/cdk', SystemJS.newModule(angularCdk));
 SystemJS.set('@angular/cdk/observers', SystemJS.newModule(angularCdkObservers));
 SystemJS.set('@angular/common/http', SystemJS.newModule(angularCommonHttp));
-SystemJS.set('@angular/material', SystemJS.newModule(angularMaterial));
+//SystemJS.set('@angular/material', SystemJS.newModule(angularMaterial));
 SystemJS.set('@angular/flex-layout', SystemJS.newModule(angularFlexLayout));
 SystemJS.set('@angular/forms', SystemJS.newModule(angularForms));
 SystemJS.set('@angular/material/dialog', SystemJS.newModule(angularMaterialDialog));
diff --git a/ui/src/app/app-overview/app-overview.module.ts b/ui/src/app/app-overview/app-overview.module.ts
index f1246ca..7aa2185 100644
--- a/ui/src/app/app-overview/app-overview.module.ts
+++ b/ui/src/app/app-overview/app-overview.module.ts
@@ -21,7 +21,9 @@ import { FlexLayoutModule } from '@angular/flex-layout';
 import { CommonModule } from '@angular/common';
 import { CustomMaterialModule } from '../CustomMaterial/custom-material.module';
 
-import {MatFormFieldModule, MatGridListModule, MatInputModule} from "@angular/material";
+import { MatFormFieldModule } from "@angular/material/form-field";
+import { MatGridListModule } from "@angular/material/grid-list";
+import { MatInputModule } from "@angular/material/input";
 import {FormsModule} from "@angular/forms";
 import {AppOverviewComponent} from "./app-overview.component";
 import {AppAssetMonitoringModule} from "../app-asset-monitoring/app-asset-monitoring.module";
diff --git a/ui/src/app/app-transport-monitoring/app-transport-monitoring.module.ts b/ui/src/app/app-transport-monitoring/app-transport-monitoring.module.ts
index 607199e..618acf1 100644
--- a/ui/src/app/app-transport-monitoring/app-transport-monitoring.module.ts
+++ b/ui/src/app/app-transport-monitoring/app-transport-monitoring.module.ts
@@ -21,7 +21,9 @@ import { FlexLayoutModule } from '@angular/flex-layout';
 import { CommonModule } from '@angular/common';
 import { CustomMaterialModule } from '../CustomMaterial/custom-material.module';
 
-import {MatFormFieldModule, MatGridListModule, MatInputModule} from "@angular/material";
+import { MatFormFieldModule } from "@angular/material/form-field";
+import { MatGridListModule } from "@angular/material/grid-list";
+import { MatInputModule } from "@angular/material/input";
 import {FormsModule} from "@angular/forms";
 import {AppTransportMonitoringComponent} from "./app-transport-monitoring.component";
 import {IncomingViewComponent} from "./components/incoming/incoming-view.component";
diff --git a/ui/src/app/app-transport-monitoring/components/transport-selection/transport-selection.component.ts b/ui/src/app/app-transport-monitoring/components/transport-selection/transport-selection.component.ts
index 109eb38..4966cf1 100644
--- a/ui/src/app/app-transport-monitoring/components/transport-selection/transport-selection.component.ts
+++ b/ui/src/app/app-transport-monitoring/components/transport-selection/transport-selection.component.ts
@@ -20,7 +20,8 @@ import {Component, EventEmitter, Output, ViewChild} from '@angular/core';
 import {AppTransportMonitoringRestService} from "../../services/app-transport-monitoring-rest.service";
 import {TransportProcessEventModel} from "../../model/transport-process-event.model";
 import {TimestampConverterService} from "../../services/timestamp-converter.service";
-import {MatPaginator, MatTableDataSource} from '@angular/material';
+import { MatPaginator } from '@angular/material/paginator';
+import { MatTableDataSource } from '@angular/material/table';
 
 @Component({
     selector: 'transport-selection',
diff --git a/ui/src/app/configuration/configuration.component.ts b/ui/src/app/configuration/configuration.component.ts
index 133cccb..6d2822c 100644
--- a/ui/src/app/configuration/configuration.component.ts
+++ b/ui/src/app/configuration/configuration.component.ts
@@ -21,7 +21,8 @@ import {Component, ViewChild} from '@angular/core';
 import { ConfigurationService } from './shared/configuration.service';
 import { StreampipesPeContainer } from "./shared/streampipes-pe-container.model";
 import { StreampipesPeContainerConifgs } from "./shared/streampipes-pe-container-configs";
-import {MatPaginator, MatTableDataSource} from "@angular/material";
+import { MatPaginator } from "@angular/material/paginator";
+import { MatTableDataSource } from "@angular/material/table";
 import {animate, state, style, transition, trigger} from '@angular/animations';
 
 @Component({
diff --git a/ui/src/app/configuration/configuration.module.ts b/ui/src/app/configuration/configuration.module.ts
index d581f27..58c352c 100644
--- a/ui/src/app/configuration/configuration.module.ts
+++ b/ui/src/app/configuration/configuration.module.ts
@@ -17,14 +17,12 @@
  */
 
 import {NgModule} from '@angular/core';
-import {
-    MatButtonModule,
-    MatCheckboxModule,
-    MatGridListModule,
-    MatIconModule,
-    MatInputModule,
-    MatTooltipModule,
-} from '@angular/material';
+import { MatButtonModule } from '@angular/material/button';
+import { MatCheckboxModule } from '@angular/material/checkbox';
+import { MatGridListModule } from '@angular/material/grid-list';
+import { MatIconModule } from '@angular/material/icon';
+import { MatInputModule } from '@angular/material/input';
+import { MatTooltipModule } from '@angular/material/tooltip';
 import {FlexLayoutModule} from '@angular/flex-layout';
 import {CommonModule} from '@angular/common';
 import {FormsModule} from '@angular/forms';
diff --git a/ui/src/app/configuration/pipeline-element-configuration/pipeline-element-configuration.component.ts b/ui/src/app/configuration/pipeline-element-configuration/pipeline-element-configuration.component.ts
index 9c297d1..9bf994c 100644
--- a/ui/src/app/configuration/pipeline-element-configuration/pipeline-element-configuration.component.ts
+++ b/ui/src/app/configuration/pipeline-element-configuration/pipeline-element-configuration.component.ts
@@ -21,7 +21,8 @@ import {animate, state, style, transition, trigger} from "@angular/animations";
 import {ConfigurationService} from "../shared/configuration.service";
 import {StreampipesPeContainer} from "../shared/streampipes-pe-container.model";
 import {StreampipesPeContainerConifgs} from "../shared/streampipes-pe-container-configs";
-import {MatPaginator, MatTableDataSource} from "@angular/material";
+import { MatPaginator } from "@angular/material/paginator";
+import { MatTableDataSource } from "@angular/material/table";
 
 @Component({
     selector: 'pipeline-element-configuration',
diff --git a/ui/src/app/connect/connect.module.ts b/ui/src/app/connect/connect.module.ts
index 22030c3..43dabb9 100644
--- a/ui/src/app/connect/connect.module.ts
+++ b/ui/src/app/connect/connect.module.ts
@@ -20,10 +20,8 @@ import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
 import { FlexLayoutModule } from '@angular/flex-layout';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import {
-    MatFormFieldModule,
-    MatGridListModule,
-} from '@angular/material';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatGridListModule } from '@angular/material/grid-list';
 import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
 import { BrowserModule } from '@angular/platform-browser';
 
@@ -43,7 +41,7 @@ import { CustomMaterialModule } from '../CustomMaterial/custom-material.module';
 
 import { RestService } from './rest.service';
 
-import { MatInputModule } from '@angular/material';
+import { MatInputModule } from '@angular/material/input';
 import { DragulaModule } from 'ng2-dragula';
 import { AdapterStartedDialog } from './new-adapter/component/adapter-started-dialog.component';
 import { DataTypesService } from './schema-editor/data-type.service';
diff --git a/ui/src/app/connect/data-marketplace/adapter-description/adapter-description.component.ts b/ui/src/app/connect/data-marketplace/adapter-description/adapter-description.component.ts
index 151e3d7..f85d264 100644
--- a/ui/src/app/connect/data-marketplace/adapter-description/adapter-description.component.ts
+++ b/ui/src/app/connect/data-marketplace/adapter-description/adapter-description.component.ts
@@ -21,7 +21,7 @@ import { AdapterDescription } from '../../model/connect/AdapterDescription';
 import { ConnectService } from '../../connect.service';
 import {DataMarketplaceService} from "../data-marketplace.service";
 import {AdapterExportDialog} from '../adapter-export/adapter-export-dialog.component';
-import {MatDialog} from '@angular/material';
+import { MatDialog } from '@angular/material/dialog';
 
 @Component({
   selector: 'sp-adapter-description',
diff --git a/ui/src/app/connect/data-marketplace/adapter-export/adapter-export-dialog.component.ts b/ui/src/app/connect/data-marketplace/adapter-export/adapter-export-dialog.component.ts
index 0cec183..a5d0c25 100644
--- a/ui/src/app/connect/data-marketplace/adapter-export/adapter-export-dialog.component.ts
+++ b/ui/src/app/connect/data-marketplace/adapter-export/adapter-export-dialog.component.ts
@@ -17,7 +17,7 @@
  */
 
 import {Component, Inject} from '@angular/core';
-import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
 import {ShepherdService} from '../../../services/tour/shepherd.service';
 import {RestService} from "../../rest.service";
 import {TsonLdSerializerService} from '../../../platform-services/tsonld-serializer.service';
diff --git a/ui/src/app/connect/data-marketplace/adapter-upload/adapter-upload-dialog.component.ts b/ui/src/app/connect/data-marketplace/adapter-upload/adapter-upload-dialog.component.ts
index 061d5bf..bb9edb2 100644
--- a/ui/src/app/connect/data-marketplace/adapter-upload/adapter-upload-dialog.component.ts
+++ b/ui/src/app/connect/data-marketplace/adapter-upload/adapter-upload-dialog.component.ts
@@ -17,7 +17,7 @@
  */
 
 import {Component, Inject} from '@angular/core';
-import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
 import {RestService} from "../../rest.service";
 import {TsonLdSerializerService} from '../../../platform-services/tsonld-serializer.service';
 import {AdapterDescriptionList} from '../../model/connect/AdapterDescriptionList';
diff --git a/ui/src/app/connect/data-marketplace/data-marketplace.component.ts b/ui/src/app/connect/data-marketplace/data-marketplace.component.ts
index 8cb584b..a24f398 100644
--- a/ui/src/app/connect/data-marketplace/data-marketplace.component.ts
+++ b/ui/src/app/connect/data-marketplace/data-marketplace.component.ts
@@ -23,7 +23,7 @@ import { ShepherdService } from "../../services/tour/shepherd.service";
 import { ConnectService } from '../connect.service';
 import { FilterPipe } from './filter.pipe';
 import {AdapterUploadDialog} from './adapter-upload/adapter-upload-dialog.component';
-import {MatDialog} from '@angular/material';
+import { MatDialog } from '@angular/material/dialog';
 import {AdapterDescriptionList} from '../model/connect/AdapterDescriptionList';
 import {TsonLdSerializerService} from '../../platform-services/tsonld-serializer.service';
 
diff --git a/ui/src/app/connect/file-management/file-management.component.ts b/ui/src/app/connect/file-management/file-management.component.ts
index b8b2589..6513cd1 100644
--- a/ui/src/app/connect/file-management/file-management.component.ts
+++ b/ui/src/app/connect/file-management/file-management.component.ts
@@ -18,7 +18,7 @@
 
 import { Component, OnInit } from '@angular/core';
 import { FileRestService}  from './service/filerest.service';
-import { MatSnackBar } from '@angular/material';
+import { MatSnackBar } from '@angular/material/snack-bar';
 
 @Component({
   selector: 'sp-file-management',
diff --git a/ui/src/app/connect/new-adapter/component/adapter-started-dialog.component.ts b/ui/src/app/connect/new-adapter/component/adapter-started-dialog.component.ts
index 8c6b392..537e880 100644
--- a/ui/src/app/connect/new-adapter/component/adapter-started-dialog.component.ts
+++ b/ui/src/app/connect/new-adapter/component/adapter-started-dialog.component.ts
@@ -17,7 +17,7 @@
  */
 
 import {Component, Inject} from '@angular/core';
-import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
 import {ShepherdService} from '../../../services/tour/shepherd.service';
 import {RestService} from "../../rest.service";
 import {StatusMessage} from "../../model/message/StatusMessage";
diff --git a/ui/src/app/connect/new-adapter/new-adapter.component.ts b/ui/src/app/connect/new-adapter/new-adapter.component.ts
index af95b93..b285de3 100644
--- a/ui/src/app/connect/new-adapter/new-adapter.component.ts
+++ b/ui/src/app/connect/new-adapter/new-adapter.component.ts
@@ -22,8 +22,8 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
 import { RestService } from '../rest.service';
 import { FormatDescription } from '../model/connect/grounding/FormatDescription';
 import { AdapterDescription } from '../model/connect/AdapterDescription';
-import { MatDialog } from '@angular/material';
-import { MatStepper } from '@angular/material';
+import { MatDialog } from '@angular/material/dialog';
+import { MatStepper } from '@angular/material/stepper';
 import { AdapterStartedDialog } from './component/adapter-started-dialog.component';
 import { Logger } from '../../shared/logger/default-log.service';
 import { GenericAdapterSetDescription } from '../model/connect/GenericAdapterSetDescription';
diff --git a/ui/src/app/connect/schema-editor/event-property-row/event-property-row.component.ts b/ui/src/app/connect/schema-editor/event-property-row/event-property-row.component.ts
index db8fd91..747d3db 100644
--- a/ui/src/app/connect/schema-editor/event-property-row/event-property-row.component.ts
+++ b/ui/src/app/connect/schema-editor/event-property-row/event-property-row.component.ts
@@ -28,7 +28,7 @@ import {EventPropertyComponent} from "../event-property/event-property.component
 import {DomainPropertyProbabilityList} from "../model/DomainPropertyProbabilityList";
 import {TreeNode} from "angular-tree-component";
 import {DataTypesService} from "../data-type.service";
-import {MatDialog} from "@angular/material";
+import { MatDialog } from "@angular/material/dialog";
 
 @Component({
     selector: 'event-property-row',
@@ -43,7 +43,7 @@ export class EventPropertyRowComponent implements OnChanges {
     @Input() eventSchema: EventSchema = new EventSchema();
     @Input() countSelected: number;
 
-    @Output() nodeChange = new EventEmitter<TreeNode>();
+    //@Output() nodeChange = new EventEmitter<TreeNode>();
     @Output() isEditableChange = new EventEmitter<boolean>();
     @Output() eventSchemaChange = new EventEmitter<EventSchema>();
     @Output() refreshTreeEmitter = new EventEmitter<void>();
diff --git a/ui/src/app/connect/schema-editor/event-schema/event-schema.component.html b/ui/src/app/connect/schema-editor/event-schema/event-schema.component.html
index 7f07267..cf0fe17 100644
--- a/ui/src/app/connect/schema-editor/event-schema/event-schema.component.html
+++ b/ui/src/app/connect/schema-editor/event-schema/event-schema.component.html
@@ -87,7 +87,7 @@
             <div fxLayout="column" fxLayoutAlign="space-evenly stretched" class="drag-drop-tree">
                 <tree-root #tree [nodes]="nodes" [options]="options" (updateData)="onUpdateData(tree)">
                     <ng-template #treeNodeTemplate let-node let-index="index">
-                        <event-property-row [(node)]="node"  [(isEditable)]="isEditable"
+                        <event-property-row [node]="node"  [(isEditable)]="isEditable"
                                             [(eventSchema)]="eventSchema"
                                             (refreshTreeEmitter)="refreshTree()" [(countSelected)]="countSelected"></event-property-row>
                     </ng-template>
diff --git a/ui/src/app/core-ui/core-ui.module.ts b/ui/src/app/core-ui/core-ui.module.ts
index 275bf4f..9c4f049 100644
--- a/ui/src/app/core-ui/core-ui.module.ts
+++ b/ui/src/app/core-ui/core-ui.module.ts
@@ -23,13 +23,16 @@ import {CommonModule} from '@angular/common';
 import {CustomMaterialModule} from '../CustomMaterial/custom-material.module';
 import {FormsModule, ReactiveFormsModule} from '@angular/forms';
 import {CdkTableModule} from '@angular/cdk/table';
-import {MatDatepickerModule, MatNativeDateModule, MatProgressSpinnerModule, MatSnackBarModule} from '@angular/material';
+import { MatNativeDateModule } from '@angular/material/core';
+import { MatDatepickerModule } from '@angular/material/datepicker';
+import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
+import { MatSnackBarModule } from '@angular/material/snack-bar';
 import {TableComponent} from './table/table.component';
 import {LineChartComponent} from './linechart/lineChart.component';
 
-import * as PlotlyJS from 'plotly.js/dist/plotly.js';
-import { PlotlyModule } from 'angular-plotly.js';
-PlotlyModule.plotlyjs = PlotlyJS;
+//import * as PlotlyJS from 'plotly.js/dist/plotly.js';
+import { PlotlyViaCDNModule } from 'angular-plotly.js';
+//PlotlyViaCDNModule.plotlyjs = PlotlyJS;
 
 @NgModule({
     imports: [
@@ -43,7 +46,7 @@ PlotlyModule.plotlyjs = PlotlyJS;
         MatProgressSpinnerModule,
         MatDatepickerModule,
         MatNativeDateModule,
-        PlotlyModule,
+        PlotlyViaCDNModule,
     ],
     declarations: [
         TableComponent,
diff --git a/ui/src/app/core-ui/table/table.component.ts b/ui/src/app/core-ui/table/table.component.ts
index 7ee5ad1..1493eb3 100644
--- a/ui/src/app/core-ui/table/table.component.ts
+++ b/ui/src/app/core-ui/table/table.component.ts
@@ -17,7 +17,7 @@
  */
 
 import {Component, EventEmitter, Input, Output} from '@angular/core';
-import {MatTableDataSource} from '@angular/material';
+import { MatTableDataSource } from '@angular/material/table';
 import {BaseChartComponent} from '../chart/baseChart.component';
 import {DataResult} from '../../core-model/datalake/DataResult';
 import {GroupedDataResult} from '../../core-model/datalake/GroupedDataResult';
diff --git a/ui/src/app/core/http-provider.config.ts b/ui/src/app/core/http-provider.config.ts
index 7449f22..03018c4 100644
--- a/ui/src/app/core/http-provider.config.ts
+++ b/ui/src/app/core/http-provider.config.ts
@@ -16,8 +16,10 @@
  *
  */
 
-//httpProviderConfig.$inject = ['$httpProvider'];
+
 export default function httpProviderConfig($httpProvider) {
 	$httpProvider.defaults.withCredentials = true;
 	//$httpProvider.interceptors.push('httpInterceptor');
 };
+
+httpProviderConfig.$inject = ['$httpProvider'];
diff --git a/ui/src/app/core/icon-provider.config.ts b/ui/src/app/core/icon-provider.config.ts
index 2963701..1fa632b 100644
--- a/ui/src/app/core/icon-provider.config.ts
+++ b/ui/src/app/core/icon-provider.config.ts
@@ -16,7 +16,6 @@
  *
  */
 
-//iconProviderConfig.$inject = ['$mdIconProvider'];
 export default function iconProviderConfig($mdIconProvider, apiConstants) {
 	const getServerUrl = () => {
 		return apiConstants.contextPath + apiConstants.api;
@@ -42,3 +41,5 @@ export default function iconProviderConfig($mdIconProvider, apiConstants) {
 		.iconSet('avatars', 'assets/img/svg/avatar-icons.svg', 24)
 		.defaultIconSet('assets/img/svg/svg-sprite-action.svg', 24);
 };
+
+iconProviderConfig.$inject = ['$mdIconProvider', 'apiConstants'];
diff --git a/ui/src/app/core/md-theming-provider.config.ts b/ui/src/app/core/md-theming-provider.config.ts
new file mode 100644
index 0000000..0127197
--- /dev/null
+++ b/ui/src/app/core/md-theming-provider.config.ts
@@ -0,0 +1,70 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements.  See the NOTICE file distributed with
+ *   this work for additional information regarding copyright ownership.
+ *   The ASF licenses this file to You under the Apache License, Version 2.0
+ *   (the "License"); you may not use this file except in compliance with
+ *   the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ */
+
+export default function mdThemingProviderConfig($mdThemingProvider) {
+
+    $mdThemingProvider.definePalette('streamPipesPrimary', {
+        '50': '304269',
+        '100': '304269',
+        '200': '304269',
+        '300': '304269',
+        '400': '304269',
+        '500': '304269',
+        '600': '304269',
+        '700': '003B3D',
+        '800': '39b54a',
+        '900': '39b54a',
+        'A100': '39b54a',
+        'A200': '39b54a',
+        'A400': '39b54a',
+        'A700': '39b54a',
+        'contrastDefaultColor': 'light',    // whether, by default, text (contrast)
+                                            // on this palette should be dark or light
+
+        'contrastDarkColors': ['50', '100', //hues which contrast should be 'dark' by default
+            '200', '300', '400', 'A100'],
+    });
+
+    $mdThemingProvider.definePalette('streamPipesAccent', {
+        '50': 'DF5A49',
+        '100': 'DF5A49',
+        '200': '007F54',
+        '300': '007F54',
+        '400': '39B54A',
+        '500': '45DA59',
+        '600': '45DA59',
+        '700': '45DA59',
+        '800': '45DA59',
+        '900': '1B1464',
+        'A100': '1B1464',
+        'A200': '1B1464',
+        'A400': '1B1464',
+        'A700': '1B1464',
+        'contrastDefaultColor': 'light',    // whether, by default, text (contrast)
+                                            // on this palette should be dark or light
+
+        'contrastDarkColors': ['50', '100', //hues which contrast should be 'dark' by default
+            '200', '300', '400', 'A100'],
+    });
+
+    $mdThemingProvider.theme('default')
+        .primaryPalette('streamPipesPrimary')
+        .accentPalette('streamPipesAccent')
+
+}
+
+mdThemingProviderConfig.$inject = ['$mdThemingProvider'];
\ No newline at end of file
diff --git a/ui/src/app/core/root-scope-delegate.decorator.ts b/ui/src/app/core/root-scope-delegate.decorator.ts
new file mode 100644
index 0000000..b9ef018
--- /dev/null
+++ b/ui/src/app/core/root-scope-delegate.decorator.ts
@@ -0,0 +1,28 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements.  See the NOTICE file distributed with
+ *   this work for additional information regarding copyright ownership.
+ *   The ASF licenses this file to You under the Apache License, Version 2.0
+ *   (the "License"); you may not use this file except in compliance with
+ *   the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ */
+
+export default function rootScopeDelegate($delegate) {
+    const originalDigest = $delegate.$digest;
+    $delegate.$digest = () => {
+        if (!$delegate.$$phase) {
+            originalDigest.call($delegate);
+        }
+    };
+    return $delegate;
+}
+
+rootScopeDelegate.$inject = ['$delegate'];
\ No newline at end of file
diff --git a/ui/src/app/dashboard-v2/dashboard.module.ts b/ui/src/app/dashboard-v2/dashboard.module.ts
index 9a48afd..9d66167 100644
--- a/ui/src/app/dashboard-v2/dashboard.module.ts
+++ b/ui/src/app/dashboard-v2/dashboard.module.ts
@@ -6,7 +6,7 @@ import { GridsterModule } from 'angular-gridster2';
 import { DashboardComponent } from './dashboard.component';
 import { DynamicModule } from 'ng-dynamic-component';
 import { DashboardPanelComponent } from "./components/panel/dashboard-panel.component";
-import {MatTabsModule} from "@angular/material";
+import { MatTabsModule } from "@angular/material/tabs";
 import {DashboardWidgetComponent} from "./components/widget/dashboard-widget.component";
 import {CustomMaterialModule} from "../CustomMaterial/custom-material.module";
 import {FormsModule} from "@angular/forms";
diff --git a/ui/src/app/dashboard-v2/dialogs/add-widget/add-visualization-dialog.component.ts b/ui/src/app/dashboard-v2/dialogs/add-widget/add-visualization-dialog.component.ts
index b55d71c..aba7102 100644
--- a/ui/src/app/dashboard-v2/dialogs/add-widget/add-visualization-dialog.component.ts
+++ b/ui/src/app/dashboard-v2/dialogs/add-widget/add-visualization-dialog.component.ts
@@ -17,7 +17,7 @@
  */
 
 import {Component} from "@angular/core";
-import {MatDialogRef} from "@angular/material";
+import { MatDialogRef } from "@angular/material/dialog";
 import {DashboardService} from "../../services/dashboard.service";
 import {ElementIconText} from "../../../services/get-element-icon-text.service";
 import {WidgetRegistry} from "../../registry/widget-registry";
diff --git a/ui/src/app/dashboard-v2/dialogs/edit-dashboard/edit-dashboard-dialog.component.ts b/ui/src/app/dashboard-v2/dialogs/edit-dashboard/edit-dashboard-dialog.component.ts
index 5319491..72d9433 100644
--- a/ui/src/app/dashboard-v2/dialogs/edit-dashboard/edit-dashboard-dialog.component.ts
+++ b/ui/src/app/dashboard-v2/dialogs/edit-dashboard/edit-dashboard-dialog.component.ts
@@ -17,7 +17,7 @@
  */
 
 import {Component, Inject} from "@angular/core";
-import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material";
+import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog";
 import {DashboardService} from "../../services/dashboard.service";
 import {DashboardWidgetSettings} from "../../../core-model/dashboard/DashboardWidgetSettings";
 import {VisualizablePipeline} from "../../../core-model/dashboard/VisualizablePipeline";
diff --git a/ui/src/app/data-explorer/data-explorer.component.ts b/ui/src/app/data-explorer/data-explorer.component.ts
index 82ddc4a..0474b03 100644
--- a/ui/src/app/data-explorer/data-explorer.component.ts
+++ b/ui/src/app/data-explorer/data-explorer.component.ts
@@ -22,7 +22,7 @@ import {InfoResult} from '../core-model/datalake/InfoResult';
 import {Observable} from 'rxjs/Observable';
 import {FormControl} from '@angular/forms';
 import {map, startWith} from 'rxjs/operators';
-import {MatSnackBar} from '@angular/material';
+import { MatSnackBar } from '@angular/material/snack-bar';
 
 @Component({
     selector: 'sp-data-explorer',
diff --git a/ui/src/app/data-explorer/data-explorer.module.ts b/ui/src/app/data-explorer/data-explorer.module.ts
index 2d07e9a..c21ce7d 100644
--- a/ui/src/app/data-explorer/data-explorer.module.ts
+++ b/ui/src/app/data-explorer/data-explorer.module.ts
@@ -23,16 +23,16 @@ import {CommonModule} from '@angular/common';
 import {DataExplorerComponent} from './data-explorer.component';
 
 import {CustomMaterialModule} from '../CustomMaterial/custom-material.module';
-import {NguiDatetimePickerModule} from '@ngui/datetime-picker';
 import {DatalakeRestService} from '../core-services/datalake/datalake-rest.service';
 import {FormsModule, ReactiveFormsModule} from '@angular/forms';
 import {CdkTableModule} from '@angular/cdk/table';
-import {MatProgressSpinnerModule, MatSnackBarModule} from '@angular/material';
+import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
+import { MatSnackBarModule } from '@angular/material/snack-bar';
 import {CoreUiModule} from '../core-ui/core-ui.module';
 import {ExplorerComponent} from './explorer/explorer.component';
 import {DataDownloadDialog} from './explorer/datadownloadDialog/dataDownload.dialog';
 
-import {OWL_DATE_TIME_FORMATS, OwlDateTimeModule, OwlNativeDateTimeModule} from 'ng-pick-datetime';
+import {OWL_DATE_TIME_FORMATS, OwlDateTimeModule, OwlNativeDateTimeModule} from '@danielmoncada/angular-datetime-picker';
 
 export const MY_NATIVE_FORMATS = {
     fullPickerInput: {year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: false},
@@ -48,7 +48,6 @@ export const MY_NATIVE_FORMATS = {
         CommonModule,
         FlexLayoutModule,
         CustomMaterialModule,
-        NguiDatetimePickerModule,
         ReactiveFormsModule,
         FormsModule,
         CdkTableModule,
diff --git a/ui/src/app/data-explorer/explorer/datadownloadDialog/dataDownload.dialog.ts b/ui/src/app/data-explorer/explorer/datadownloadDialog/dataDownload.dialog.ts
index 73eedf1..f768202 100644
--- a/ui/src/app/data-explorer/explorer/datadownloadDialog/dataDownload.dialog.ts
+++ b/ui/src/app/data-explorer/explorer/datadownloadDialog/dataDownload.dialog.ts
@@ -17,7 +17,8 @@
  */
 
 import {Component, Inject, ViewChild} from '@angular/core';
-import {MAT_DIALOG_DATA, MatDialogRef, MatStepper} from '@angular/material';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { MatStepper } from '@angular/material/stepper';
 import {HttpEventType} from '@angular/common/http';
 import {DatalakeRestService} from '../../../core-services/datalake/datalake-rest.service';
 
diff --git a/ui/src/app/data-explorer/explorer/explorer.component.ts b/ui/src/app/data-explorer/explorer/explorer.component.ts
index ae9baec..86174d0 100644
--- a/ui/src/app/data-explorer/explorer/explorer.component.ts
+++ b/ui/src/app/data-explorer/explorer/explorer.component.ts
@@ -22,7 +22,8 @@ import {InfoResult} from '../../core-model/datalake/InfoResult';
 import {Observable} from 'rxjs/Observable';
 import {FormControl, FormGroup} from '@angular/forms';
 import {map, startWith} from 'rxjs/operators';
-import {MatDialog, MatSnackBar} from '@angular/material';
+import { MatDialog } from '@angular/material/dialog';
+import { MatSnackBar } from '@angular/material/snack-bar';
 import {DataDownloadDialog} from './datadownloadDialog/dataDownload.dialog';
 import {timer} from 'rxjs/internal/observable/timer';
 import {DataResult} from '../../core-model/datalake/DataResult';
@@ -128,7 +129,7 @@ export class ExplorerComponent implements OnInit {
      this.loadData(false);
     }
 
-    loadData(silentLoading) {
+    loadData(silentLoading?) {
         this.isLoadingData = true;
         this.noDateFoundinTimeRange = false;
         this.noIndexSelection = false;
diff --git a/ui/src/app/editor/components/freetext/freetext.controller.ts b/ui/src/app/editor/components/freetext/freetext.controller.ts
index 599d49d..e4c7279 100644
--- a/ui/src/app/editor/components/freetext/freetext.controller.ts
+++ b/ui/src/app/editor/components/freetext/freetext.controller.ts
@@ -17,6 +17,7 @@
  */
 
 import * as angular from 'angular';
+import {AnyRemoteController} from "../any-remote/any-remote.controller";
 
 export class FreeTextController {
 
@@ -92,3 +93,5 @@ export class FreeTextController {
     }
 
 }
+
+FreeTextController.$inject = ['$scope', '$rootScope'];
diff --git a/ui/src/app/editor/dialog/customize-pipeline-element/customize.controller.ts b/ui/src/app/editor/dialog/customize-pipeline-element/customize.controller.ts
index 6ef80b4..b0b340c 100644
--- a/ui/src/app/editor/dialog/customize-pipeline-element/customize.controller.ts
+++ b/ui/src/app/editor/dialog/customize-pipeline-element/customize.controller.ts
@@ -57,7 +57,7 @@ export class CustomizeController {
 
     $onInit() {
         if (this.ShepherdService.isTourActive()) {
-            this.ShepherdService.trigger("customize-" +this.sepa.type);
+            this.ShepherdService.trigger("customize-" +this.selectedElement.type);
         }
     }
 
@@ -90,14 +90,14 @@ export class CustomizeController {
     saveProperties() {
         if (this.validate()) {
             this.selectedElement.uncompleted = false;
-            this.$rootScope.$broadcast("SepaElementConfigured", this.sepa.DOM);
+            this.$rootScope.$broadcast("SepaElementConfigured", this.selectedElement.DOM);
             this.selectedElement.configured = true;
             this.hide();
             if (this.sourceEndpoint) {
                 this.sourceEndpoint.setType("token");
             }
             if (this.ShepherdService.isTourActive()) {
-                this.ShepherdService.trigger("save-" +this.sepa.type);
+                this.ShepherdService.trigger("save-" +this.selectedElement.type);
             }
         }
         else this.invalid = true;
@@ -143,11 +143,6 @@ export class CustomizeController {
 
         return valid;
     }
-
-
-
-
-
 }
 
 CustomizeController.$inject = ['$rootScope', '$mdDialog', 'elementData', 'sourceEndpoint', 'sepa', 'ShepherdService'];
\ No newline at end of file
diff --git a/ui/src/app/editor/editor.module.ts b/ui/src/app/editor/editor.module.ts
index 327a65a..86a3a74 100644
--- a/ui/src/app/editor/editor.module.ts
+++ b/ui/src/app/editor/editor.module.ts
@@ -29,6 +29,7 @@ import 'jquery.panzoom';
 import 'npm/bootstrap';
 import 'npm/angular-trix';
 import 'npm/angular-datatables';
+import 'npm/angular-sanitize';
 import 'npm/ng-showdown';
 
 import {EditorCtrl} from './editor.controller';
@@ -76,7 +77,7 @@ import {FileUploadComponent} from "./components/fileupload/fileupload.component"
 import {AnyRemoteComponent} from "./components/any-remote/any-remote.component";
 
 
-export default angular.module('sp.editor', [spServices, 'angularTrix', 'ngAnimate', 'datatables', 'ng-showdown'])
+export default angular.module('sp.editor', [spServices, 'ngSanitize', 'angularTrix', 'ngAnimate', 'datatables', 'ng-showdown'])
     .controller('EditorCtrl', EditorCtrl)
     .directive('myDataBind', myDataBind)
     .directive('imageBind', imageBind)
diff --git a/ui/src/app/home/home.module.ts b/ui/src/app/home/home.module.ts
index 8624675..6eb4492 100644
--- a/ui/src/app/home/home.module.ts
+++ b/ui/src/app/home/home.module.ts
@@ -19,7 +19,8 @@
 import { NgModule } from '@angular/core';
 import { HomeComponent } from './home.component';
 import { HomeService } from './home.service';
-import { MatGridListModule, MatIconModule } from '@angular/material';
+import { MatGridListModule } from '@angular/material/grid-list';
+import { MatIconModule } from '@angular/material/icon';
 import { FlexLayoutModule } from '@angular/flex-layout';
 import { CommonModule } from '@angular/common';
 import { StatusComponent } from "./components/status.component";
diff --git a/ui/src/app/info/info.component.ts b/ui/src/app/info/info.component.ts
index be7e471..c0f5d3c 100644
--- a/ui/src/app/info/info.component.ts
+++ b/ui/src/app/info/info.component.ts
@@ -17,7 +17,7 @@
  */
 
 import { Component } from '@angular/core';
-import {MatTabChangeEvent} from "@angular/material";
+import { MatTabChangeEvent } from "@angular/material/tabs";
 
 @Component({
     templateUrl: './info.component.html',
diff --git a/ui/src/app/info/info.module.ts b/ui/src/app/info/info.module.ts
index 96be602..9dbeb75 100644
--- a/ui/src/app/info/info.module.ts
+++ b/ui/src/app/info/info.module.ts
@@ -17,15 +17,13 @@
  */
 
 import { NgModule } from '@angular/core';
-import {
-    MatButtonModule,
-    MatCheckboxModule,
-    MatDividerModule,
-    MatGridListModule,
-    MatIconModule,
-    MatInputModule,
-    MatTooltipModule
-} from '@angular/material';
+import { MatButtonModule } from '@angular/material/button';
+import { MatCheckboxModule } from '@angular/material/checkbox';
+import { MatDividerModule } from '@angular/material/divider';
+import { MatGridListModule } from '@angular/material/grid-list';
+import { MatIconModule } from '@angular/material/icon';
+import { MatInputModule } from '@angular/material/input';
+import { MatTooltipModule } from '@angular/material/tooltip';
 
 import { FlexLayoutModule } from '@angular/flex-layout';
 import { CommonModule } from '@angular/common';
diff --git a/ui/src/app/layout/app.controller.ts b/ui/src/app/layout/app.controller.ts
index 75ed7fd..67713fd 100644
--- a/ui/src/app/layout/app.controller.ts
+++ b/ui/src/app/layout/app.controller.ts
@@ -17,6 +17,7 @@
  */
 
 import 'legacy/stomp';
+import {AuthService} from "../services/auth.service";
 
 declare const Stomp: any;
 
@@ -38,4 +39,6 @@ export class AppCtrl {
     }
 };
 
+AppCtrl.$inject = ['$state'];
+
 
diff --git a/ui/src/app/login/login.controller.ts b/ui/src/app/login/login.controller.ts
index c714c84..69ec220 100644
--- a/ui/src/app/login/login.controller.ts
+++ b/ui/src/app/login/login.controller.ts
@@ -17,6 +17,8 @@
  *
  */
 
+import {ShepherdService} from "../services/tour/shepherd.service";
+
 export class LoginCtrl {
 
     $timeout: any;
@@ -30,7 +32,7 @@ export class LoginCtrl {
     loading: any;
     authenticationFailed: any;
     credentials: any;
-    ShepherdService: any;
+    ShepherdService: ShepherdService;
 
     constructor($timeout, $log, $location, $state, $stateParams, RestApi, $window, AuthStatusService, ShepherdService) {
         this.$timeout = $timeout;
@@ -84,4 +86,4 @@ export class LoginCtrl {
     }
 };
 
-//LoginCtrl.$inject = ['$timeout', '$log', '$location', '$state', '$stateParams', 'RestApi', '$window', 'AuthStatusService'];
+LoginCtrl.$inject = ['$timeout', '$log', '$location', '$state', '$stateParams', 'RestApi', '$window', 'AuthStatusService', 'ShepherdService'];
diff --git a/ui/src/app/login/startup/startup.controller.ts b/ui/src/app/login/startup/startup.controller.ts
index 0942b77..5faee23 100644
--- a/ui/src/app/login/startup/startup.controller.ts
+++ b/ui/src/app/login/startup/startup.controller.ts
@@ -18,6 +18,7 @@
 
 import {AuthService} from "../../services/auth.service";
 import {AuthStatusService} from "../../services/auth-status.service";
+import {LoginCtrl} from "../login.controller";
 
 export class StartupCtrl {
 
@@ -56,4 +57,6 @@ export class StartupCtrl {
         });
     }
 
-}
\ No newline at end of file
+}
+
+StartupCtrl.$inject = ['AuthService', 'AuthStatusService', '$state', '$timeout'];
\ No newline at end of file
diff --git a/ui/src/app/pipelines/dialog/pipeline-status-dialog.controller.ts b/ui/src/app/pipelines/dialog/pipeline-status-dialog.controller.ts
index 2a14438..c0e5fee 100644
--- a/ui/src/app/pipelines/dialog/pipeline-status-dialog.controller.ts
+++ b/ui/src/app/pipelines/dialog/pipeline-status-dialog.controller.ts
@@ -20,10 +20,12 @@ export class PipelineStatusDialogController {
 
     $mdDialog: any;
     statusDetailsVisible: any;
+    data: any;
 
-    constructor($mdDialog) {
+    constructor($mdDialog, data) {
         this.$mdDialog = $mdDialog;
         this.statusDetailsVisible = false;
+        this.data = data;
     }
 
     hide() {
@@ -39,4 +41,4 @@ export class PipelineStatusDialogController {
     }
 }
 
-PipelineStatusDialogController.$inject = ['$mdDialog'];
\ No newline at end of file
+PipelineStatusDialogController.$inject = ['$mdDialog', 'data'];
\ No newline at end of file
diff --git a/ui/src/app/pipelines/dialog/pipeline-status-dialog.tmpl.html b/ui/src/app/pipelines/dialog/pipeline-status-dialog.tmpl.html
index 38164ed..973709d 100644
--- a/ui/src/app/pipelines/dialog/pipeline-status-dialog.tmpl.html
+++ b/ui/src/app/pipelines/dialog/pipeline-status-dialog.tmpl.html
@@ -56,7 +56,7 @@
                                     <b>More Details:</b>
                                     <div class="md-padding">
                                         <pre class="language" nag-prism source="{{msg.optionalMessage}}"
-                                             style="margin-top:0px;border-radius:0px;"></pre>
+                                             style="margin-top:0px;border-radius:0px;max-width:100%;"></pre>
                                     </div>
                                 </div>
                             </div>
diff --git a/ui/src/app/pipelines/pipelines.module.ts b/ui/src/app/pipelines/pipelines.module.ts
index b4e5fe5..9805231 100644
--- a/ui/src/app/pipelines/pipelines.module.ts
+++ b/ui/src/app/pipelines/pipelines.module.ts
@@ -18,6 +18,9 @@
 
 import * as angular from 'angular';
 
+import 'npm/angular-datatables';
+import 'npm/angular-sanitize';
+
 import spServices from '../services/services.module';
 
 import { PipelineCtrl } from './pipelines.controller';
@@ -28,7 +31,7 @@ import { PipelineOperationsService } from "./services/pipeline-operations.servic
 
 import ngFileUpload from 'ng-file-upload';
 
-export default angular.module('sp.pipeline', [spServices, ngFileUpload])
+export default angular.module('sp.pipeline', [spServices, ngFileUpload, 'ngSanitize', 'datatables'])
 	.controller('PipelineCtrl', PipelineCtrl)
 	.component('pipelineDetails', PipelineDetailsComponent)
 	.filter('pipelineCategoryFilter', PipelineCategoryFilter)
diff --git a/ui/src/app/services/auth.service.ts b/ui/src/app/services/auth.service.ts
index fef0784..90c2aea 100644
--- a/ui/src/app/services/auth.service.ts
+++ b/ui/src/app/services/auth.service.ts
@@ -18,6 +18,7 @@
 
 import {RestApi} from "./rest-api.service";
 import {AuthStatusService} from "./auth-status.service";
+import {TransitionService} from "./transition.service";
 
 export class AuthService {
 
@@ -64,4 +65,6 @@ export class AuthService {
             }
         })
     }
-}
\ No newline at end of file
+}
+
+AuthService.$inject = ['$rootScope', '$location', '$state', 'RestApi', 'AuthStatusService'];
\ No newline at end of file
diff --git a/ui/src/app/services/jsplumb.service.ts b/ui/src/app/services/jsplumb.service.ts
index 36502b6..0dfa60d 100644
--- a/ui/src/app/services/jsplumb.service.ts
+++ b/ui/src/app/services/jsplumb.service.ts
@@ -17,13 +17,16 @@
  */
 
 import * as angular from 'angular';
+import {ObjectProvider} from "./object-provider.service";
+import {JsplumbConfigService} from "./jsplumb-config.service";
+import {JsplumbBridge} from "./jsplumb-bridge.service";
 
 export class JsplumbService {
 
-    objectProvider: any;
+    objectProvider: ObjectProvider;
     apiConstants: any;
-    JsplumbConfigService: any;
-    JsplumbBridge: any;
+    JsplumbConfigService: JsplumbConfigService;
+    JsplumbBridge: JsplumbBridge;
     $timeout: any;
     idCounter: any;
     RestApi: any;
@@ -218,7 +221,7 @@ export class JsplumbService {
         return pipelineElementDomId;
     };
 
-    getJsplumbConfig(preview) {
+    getJsplumbConfig(preview): any {
         return preview ? this.JsplumbConfigService.getPreviewConfig() : this.JsplumbConfigService.getEditorConfig();
     }
 
@@ -253,4 +256,4 @@ export class JsplumbService {
     }
 }
 
-//JsplumbService.$inject = ['ObjectProvider', 'JsplumbConfigService', 'JsplumbBridge', '$timeout'];
+JsplumbService.$inject = ['ObjectProvider', 'JsplumbConfigService', 'JsplumbBridge', '$timeout', 'RestApi'];
diff --git a/ui/src/app/services/object-provider.service.ts b/ui/src/app/services/object-provider.service.ts
index 781fa98..18d84ad 100644
--- a/ui/src/app/services/object-provider.service.ts
+++ b/ui/src/app/services/object-provider.service.ts
@@ -121,4 +121,4 @@ export class ObjectProvider {
 
 }
 
-//ObjectProvider.$inject = ['RestApi', 'JsplumbBridge'];
+ObjectProvider.$inject = ['RestApi', 'JsplumbBridge'];
diff --git a/ui/src/app/services/pipeline-editor.service.ts b/ui/src/app/services/pipeline-editor.service.ts
index e97d100..3a2ed21 100644
--- a/ui/src/app/services/pipeline-editor.service.ts
+++ b/ui/src/app/services/pipeline-editor.service.ts
@@ -64,4 +64,4 @@ export class PipelineEditorService {
 
 }
 
-//PipelineEditorService.$inject = ['JsplumbBridge'];
\ No newline at end of file
+PipelineEditorService.$inject = ['JsplumbBridge'];
\ No newline at end of file
diff --git a/ui/src/app/services/pipeline-positioning.service.ts b/ui/src/app/services/pipeline-positioning.service.ts
index c1c2366..8123f50 100644
--- a/ui/src/app/services/pipeline-positioning.service.ts
+++ b/ui/src/app/services/pipeline-positioning.service.ts
@@ -18,7 +18,6 @@
 
 //import * from 'lodash';
 import * as dagre from "dagre";
-import {PipelineValidationService} from "../editor/services/pipeline-validation.service";
 import {JsplumbBridge} from "./jsplumb-bridge.service";
 import {JsplumbConfigService} from "./jsplumb-config.service";
 import {JsplumbService} from "./jsplumb.service";
@@ -30,9 +29,8 @@ export class PipelinePositioningService {
     JsplumbService: JsplumbService;
     JsplumbConfigService: JsplumbConfigService;
     JsplumbBridge: JsplumbBridge;
-    PipelineValidationService: PipelineValidationService;
 
-    constructor(JsplumbService, JsplumbConfigService, JsplumbBridge, PipelineValidationService) {
+    constructor(JsplumbService, JsplumbConfigService, JsplumbBridge) {
         this.JsplumbService = JsplumbService;
         this.JsplumbConfigService = JsplumbConfigService;
         this.JsplumbBridge = JsplumbBridge;
@@ -134,4 +132,4 @@ export class PipelinePositioningService {
 
 }
 
-//PipelinePositioningService.$inject = ['JsplumbService', 'JsplumbConfigService', 'JsplumbBridge'];
\ No newline at end of file
+PipelinePositioningService.$inject = ['JsplumbService', 'JsplumbConfigService', 'JsplumbBridge'];
\ No newline at end of file
diff --git a/ui/src/app/services/rest-api.service.ts b/ui/src/app/services/rest-api.service.ts
index 122aeff..de46178 100644
--- a/ui/src/app/services/rest-api.service.ts
+++ b/ui/src/app/services/rest-api.service.ts
@@ -579,4 +579,4 @@ export class RestApi {
     }
 }
 
-//RestApi.$inject = ['$http', 'apiConstants', 'AuthStatusService'];
+RestApi.$inject = ['$http', 'apiConstants', 'AuthStatusService'];
diff --git a/ui/src/app/services/route-transition-interceptor.service.ts b/ui/src/app/services/route-transition-interceptor.service.ts
index f1298ca..1a1dbe2 100644
--- a/ui/src/app/services/route-transition-interceptor.service.ts
+++ b/ui/src/app/services/route-transition-interceptor.service.ts
@@ -18,6 +18,7 @@
 
 import {AuthService} from "./auth.service";
 import {AuthStatusService} from "./auth-status.service";
+import {RestApi} from "./rest-api.service";
 
 export class RouteTransitionInterceptorService {
 
@@ -75,5 +76,5 @@ export class RouteTransitionInterceptorService {
     isProtectedPage(target) {
         return !(this.publicPages.some(p => p === target));
     }
-
-}
\ No newline at end of file
+}
+RouteTransitionInterceptorService.$inject = ['AuthService', 'AuthStatusService', '$q'];
\ No newline at end of file
diff --git a/ui/src/app/services/tour/shepherd.service.ts b/ui/src/app/services/tour/shepherd.service.ts
index 7f118c1..ba085f6 100644
--- a/ui/src/app/services/tour/shepherd.service.ts
+++ b/ui/src/app/services/tour/shepherd.service.ts
@@ -19,6 +19,7 @@
 import Shepherd from 'shepherd.js';
 //import "shepherd.js/dist/css/shepherd-theme-arrows.css";
 import {Inject, Injectable} from "@angular/core";
+import {LoginCtrl} from "../../login/login.controller";
 
 @Injectable()
 export class ShepherdService {
@@ -182,4 +183,6 @@ export class ShepherdService {
     getTimeWaitMillies() {
        return this.TourProviderService.getTime();
     }
-}
\ No newline at end of file
+}
+
+ShepherdService.$inject = ['$timeout', '$state', 'TourProviderService'];
\ No newline at end of file
diff --git a/ui/src/app/services/tour/tour-provider.service.ts b/ui/src/app/services/tour/tour-provider.service.ts
index 843aa52..4508a65 100644
--- a/ui/src/app/services/tour/tour-provider.service.ts
+++ b/ui/src/app/services/tour/tour-provider.service.ts
@@ -17,6 +17,8 @@
  *
  */
 
+import {AppCtrl} from "../../layout/app.controller";
+
 export class TourProviderService {
 
     guidedTours: any;
@@ -52,4 +54,7 @@ export class TourProviderService {
     getTime() {
         return this.time;
     }
-}
\ No newline at end of file
+}
+
+TourProviderService.$inject = ['createPipelineTourConstants', 'dashboardTourConstants',
+    'adapterTourConstants', 'adapterTour2Constants', 'adapterTour3Constants'];
\ No newline at end of file
diff --git a/ui/src/app/services/transition.service.ts b/ui/src/app/services/transition.service.ts
index b8f9991..3415db6 100644
--- a/ui/src/app/services/transition.service.ts
+++ b/ui/src/app/services/transition.service.ts
@@ -54,4 +54,5 @@ export class TransitionService {
             .cancel('Cancel');
         return this.$mdDialog.show(confirm);
     }
-}
\ No newline at end of file
+}
+TransitionService.$inject = ['AuthService', '$mdDialog'];
\ No newline at end of file
diff --git a/ui/src/index.html b/ui/src/index.html
index 289a024..24a0cf6 100644
--- a/ui/src/index.html
+++ b/ui/src/index.html
@@ -70,6 +70,8 @@
     <meta name="msapplication-wide310x150logo" content="assets/img/favicon/mstile-310x150.png?v=2"/>
     <meta name="msapplication-square310x310logo" content="assets/img/favicon/mstile-310x310.png?v=2"/>
 
+    <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
+
     <script type="text/javascript">
         var domain = "";
         var standardUrl = window.location.protocol + "//" + window.location.host + "/semantic-epa-backend/api/";
diff --git a/ui/src/polyfills.ts b/ui/src/polyfills.ts
index 2f2510a..38e6322 100644
--- a/ui/src/polyfills.ts
+++ b/ui/src/polyfills.ts
@@ -1,3 +1,22 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ *      file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/guide/browser-support
+ */
+
+/***************************************************************************************************
+* BROWSER POLYFILLS
+*/
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -19,53 +38,6 @@
 let __zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mouseenter', 'mouseleave', 'mousemove', 'mouseover', 'mouseout', 'mousewheel', 'pointermove', 'keypress', 'keyup'];
 let __Zone_disable_PromiseRejectionEvent = true;
 
-/**
- * This file includes polyfills needed by Angular and is loaded before the app.
- * You can add your own extra polyfills to this file.
- *
- * This file is divided into 2 sections:
- *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
- *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
- *      file.
- *
- * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
- * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
- * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
- *
- * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
- */
-
-/***************************************************************************************************
- * BROWSER POLYFILLS
- */
-
-/** IE9, IE10 and IE11 requires all of the following polyfills. **/
-import 'core-js/es6/symbol';
-import 'core-js/es6/object';
-// import 'core-js/es6/function';
-// import 'core-js/es6/parse-int';
-// import 'core-js/es6/parse-float';
-// import 'core-js/es6/number';
-// import 'core-js/es6/math';
-import 'core-js/es6/string';
-// import 'core-js/es6/date';
-import 'core-js/es6/array';
-// import 'core-js/es6/regexp';
-// import 'core-js/es6/map';
-// import 'core-js/es6/weak-map';
-// import 'core-js/es6/set';
-
-/** IE10 and IE11 requires the following for NgClass support on SVG elements */
-// import 'classlist.js';  // Run `npm install --save classlist.js`.
-
-/** IE10 and IE11 requires the following for the Reflect API. */
-// import 'core-js/es6/reflect';
-
-
-/** Evergreen browsers require these. **/
-// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
-import 'core-js/es7/reflect';
-
 
 /**
  * Required to support Web Animations `@angular/platform-browser/animations`.
@@ -85,3 +57,5 @@ import 'zone.js/dist/zone';  // Included with Angular CLI.
 /***************************************************************************************************
  * APPLICATION IMPORTS
  */
+import 'reflect-metadata';
+(window as any).global = window;
\ No newline at end of file
diff --git a/ui/src/scss/sp/main.scss b/ui/src/scss/sp/main.scss
index c5d7f76..69409e8 100644
--- a/ui/src/scss/sp/main.scss
+++ b/ui/src/scss/sp/main.scss
@@ -55,6 +55,10 @@ body {
   background-attachment: fixed;
 }
 
+code[class*="language-"], pre[class*="language-"] {
+  white-space:pre-wrap;
+}
+
 .editor-error-notifications {
   position: absolute;
   left: -226px;
diff --git a/ui/src/tsconfig.app.json b/ui/src/tsconfig.app.json
index 08692bc..7928203 100644
--- a/ui/src/tsconfig.app.json
+++ b/ui/src/tsconfig.app.json
@@ -3,11 +3,13 @@
   "compilerOptions": {
     "outDir": "../out-tsc/app",
     "baseUrl": "./",
-    "module": "es2015",
     "types": []
-  },
-  "exclude": [
-    "test.ts",
-    "**/*.spec.ts"
-  ]
+  },
+  "files": [
+    "main.ts",
+    "polyfills.ts"
+  ],
+  "include": [
+    "src/**/*.d.ts"
+  ]
 }
\ No newline at end of file
diff --git a/ui/src/tsconfig.spec.json b/ui/src/tsconfig.spec.json
index 5353377..5bbe9f1 100644
--- a/ui/src/tsconfig.spec.json
+++ b/ui/src/tsconfig.spec.json
@@ -10,7 +10,8 @@
     ]
   },
   "files": [
-    "test.ts"
+    "test.ts",
+    "polyfills.ts"
   ],
   "include": [
     "**/*.spec.ts",
diff --git a/ui/tsconfig.json b/ui/tsconfig.json
index 10b43f6..1c1aaca 100644
--- a/ui/tsconfig.json
+++ b/ui/tsconfig.json
@@ -2,6 +2,7 @@
   "compileOnSave": false,
   "compilerOptions": {
     "downlevelIteration": true,
+    "importHelpers": true,
     "module": "esnext",
     "outDir": "./dist/out-tsc",
     "sourceMap": true,
@@ -13,10 +14,13 @@
     "typeRoots": [
       "node_modules/@types"
     ],
-    "types": ["node"],
+    "types": [
+      "node"
+    ],
     "lib": [
       "es2017",
       "dom"
-    ]
+    ],
+    "baseUrl": "./"
   }
-}
+}
\ No newline at end of file
diff --git a/ui/tslint.json b/ui/tslint.json
index 38f302b..0110a9b 100644
--- a/ui/tslint.json
+++ b/ui/tslint.json
@@ -11,7 +11,7 @@
     },
     "eofline": true,
     "forin": true,
-    "import-blacklist": [true, "rxjs", "rxjs/Rx"],
+    "import-blacklist": [true, "rxjs/Rx"],
     "import-spacing": true,
     "indent": [true, "spaces"],
     "interface-over-type-literal": true,
diff --git a/ui/webpack.config.base.js b/ui/webpack.config.base.js
index b0aeee3..503e71c 100644
--- a/ui/webpack.config.base.js
+++ b/ui/webpack.config.base.js
@@ -54,15 +54,23 @@ module.exports = {
                 loader: 'file-loader?name=assets/[name].[hash].[ext]',
             },
             {
-                test: /\.(sass|scss)$/,
+                test: /\.(scss|sass)$/,
                 use: [
-                    "to-string-loader",
-                    "style-loader",
-                    MiniCssExtractPlugin.loader,
-                    "css-loader",
-                    "sass-loader"
-                ]
+                    { loader: 'style-loader' },
+                    { loader: 'css-loader', options: { sourceMap: true } },
+                    { loader: 'sass-loader', options: { sourceMap: true } }
+                ],
+                include: path.join(__dirname, 'src',  'scss')
             },
+            {
+                test: /\.(scss|sass)$/,
+                use: [
+                    'to-string-loader',
+                    { loader: 'css-loader', options: { sourceMap: true } },
+                    { loader: 'sass-loader', options: { sourceMap: true } }
+                ],
+                include: path.join(__dirname, 'src', 'app')
+            }
         ],
     },
     resolve: {
@@ -83,9 +91,9 @@ module.exports = {
         new AngularCompilerPlugin({
             mainPath: 'main.ts',
             platform: 0,
-            sourceMap: true,
+            sourceMap: false,
             tsConfigPath: path.join(__dirname, 'src', 'tsconfig.app.json'),
-            skipCodeGeneration: true,
+            skipCodeGeneration: false,
             compilerOptions: {},
         }),
         new CopyWebpackPlugin(
diff --git a/ui/webpack.config.prod.js b/ui/webpack.config.prod.js
index f4ad750..46cf734 100644
--- a/ui/webpack.config.prod.js
+++ b/ui/webpack.config.prod.js
@@ -58,14 +58,14 @@ module.exports = merge(baseConfig, {
                     warnings: false,
                     parse: {},
                     compress: {},
-                    mangle: false, // Note `mangle.properties` is `false` by default.
+                    mangle: true, // Note `mangle.properties` is `false` by default.
                     module: false,
                     output: null,
                     toplevel: false,
                     nameCache: null,
                     ie8: false,
-                    keep_classnames: true,
-                    keep_fnames: true,
+                    keep_classnames: false,
+                    keep_fnames: false,
                     safari10: false,
                 },
             }),
diff --git a/ui/webpack.partial.base.js b/ui/webpack.partial.base.js
new file mode 100644
index 0000000..ec5ad0a
--- /dev/null
+++ b/ui/webpack.partial.base.js
@@ -0,0 +1,32 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements.  See the NOTICE file distributed with
+ *   this work for additional information regarding copyright ownership.
+ *   The ASF licenses this file to You under the Apache License, Version 2.0
+ *   (the "License"); you may not use this file except in compliance with
+ *   the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ */
+
+const path = require('path');
+
+module.exports = {
+    module: {
+        rules: [
+            { test: /\.html$/, loader: 'raw-loader' }
+        ],
+    },
+    resolve: {
+        alias: {
+            npm: path.join(__dirname, 'node_modules'),
+            legacy: path.join(__dirname, 'src', 'assets', 'lib'),
+        }
+    }
+};
\ No newline at end of file
diff --git a/ui/webpack.partial.dev.js b/ui/webpack.partial.dev.js
new file mode 100644
index 0000000..149748d
--- /dev/null
+++ b/ui/webpack.partial.dev.js
@@ -0,0 +1,58 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements.  See the NOTICE file distributed with
+ *   this work for additional information regarding copyright ownership.
+ *   The ASF licenses this file to You under the Apache License, Version 2.0
+ *   (the "License"); you may not use this file except in compliance with
+ *   the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ */
+
+const merge = require('webpack-merge');
+const baseConfig = require('./webpack.partial.base.js');
+
+module.exports = merge(baseConfig, {
+    devServer: {
+        compress: true,
+        port: 8082,
+        proxy: {
+            '/streampipes-connect': {
+                target: 'http://localhost:8099',
+                pathRewrite: { '^/streampipes-connect': '' },
+                secure: false,
+            },
+            '/streampipes-backend': {
+                target: 'http://localhost:8030',
+                secure: false,
+            },
+            '/visualizablepipeline': {
+                target: 'http://localhost:5984',
+                secure: false,
+            },
+            '/dashboard': {
+                target: 'http://localhost:5984',
+                secure: false,
+            },
+            '/widget': {
+                target: 'http://localhost:5984',
+                secure: false,
+            },
+            '/pipeline': {
+                target: 'http://localhost:5984',
+                secure: false,
+            },
+            '/streampipes/ws': {
+                target: 'ws://localhost:61614',
+                ws: true,
+                secure: false,
+            },
+        },
+    },
+});
\ No newline at end of file
diff --git a/ui/src/app/core/http-provider.config.ts b/ui/webpack.partial.js
similarity index 78%
copy from ui/src/app/core/http-provider.config.ts
copy to ui/webpack.partial.js
index 7449f22..9243d5f 100644
--- a/ui/src/app/core/http-provider.config.ts
+++ b/ui/webpack.partial.js
@@ -16,8 +16,6 @@
  *
  */
 
-//httpProviderConfig.$inject = ['$httpProvider'];
-export default function httpProviderConfig($httpProvider) {
-	$httpProvider.defaults.withCredentials = true;
-	//$httpProvider.interceptors.push('httpInterceptor');
-};
+module.exports = (env) => {
+    return require(`./webpack.partial.${env}.js`)
+}
\ No newline at end of file
diff --git a/ui/webpack.partial.prod.js b/ui/webpack.partial.prod.js
new file mode 100644
index 0000000..d4446e9
--- /dev/null
+++ b/ui/webpack.partial.prod.js
@@ -0,0 +1,26 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements.  See the NOTICE file distributed with
+ *   this work for additional information regarding copyright ownership.
+ *   The ASF licenses this file to You under the Apache License, Version 2.0
+ *   (the "License"); you may not use this file except in compliance with
+ *   the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ */
+
+const CompressionPlugin = require('compression-webpack-plugin');
+const merge = require('webpack-merge');
+const baseConfig = require('./webpack.partial.base.js');
+
+module.exports = merge(baseConfig, {
+    plugins: [
+        new CompressionPlugin
+    ],
+});
\ No newline at end of file