You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@griffin.apache.org by gu...@apache.org on 2017/10/11 04:31:13 UTC

[13/13] incubator-griffin git commit: refactor ui with angular2

refactor ui with angular2

 Update front-end from angularJS to angular2 and modify pom.xml

Author: dodobel <12...@qq.com>

Closes #130 from dodobel/master.


Project: http://git-wip-us.apache.org/repos/asf/incubator-griffin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-griffin/commit/42ee8863
Tree: http://git-wip-us.apache.org/repos/asf/incubator-griffin/tree/42ee8863
Diff: http://git-wip-us.apache.org/repos/asf/incubator-griffin/diff/42ee8863

Branch: refs/heads/master
Commit: 42ee886343a300eb6ea50465e1c8df38d5bc458c
Parents: 460e2fd
Author: dodobel <12...@qq.com>
Authored: Wed Oct 11 12:30:45 2017 +0800
Committer: Lionel Liu <bh...@163.com>
Committed: Wed Oct 11 12:30:45 2017 +0800

----------------------------------------------------------------------
 ui/.bowerrc                                     |    4 -
 ui/angular/.angular-cli.json                    |   60 +
 ui/angular/.editorconfig                        |   13 +
 ui/angular/.gitignore                           |   43 +
 ui/angular/README.md                            |   28 +
 ui/angular/b3vHigh.jpg                          |  Bin 0 -> 555201 bytes
 ui/angular/karma.conf.js                        |   52 +
 ui/angular/package.json                         |   66 +
 ui/angular/protractor.conf.js                   |   46 +
 ui/angular/src/app/app.component.css            |  142 +++
 ui/angular/src/app/app.component.html           |  163 +++
 ui/angular/src/app/app.component.js             |   43 +
 ui/angular/src/app/app.component.spec.ts        |   50 +
 ui/angular/src/app/app.component.ts             |  151 +++
 ui/angular/src/app/app.module.js                |   65 +
 ui/angular/src/app/app.module.ts                |  158 +++
 .../src/app/dataasset/dataasset.component.css   |   32 +
 .../src/app/dataasset/dataasset.component.html  |  107 ++
 .../app/dataasset/dataasset.component.spec.ts   |   43 +
 .../src/app/dataasset/dataasset.component.ts    |   85 ++
 ui/angular/src/app/health/health.component.css  |   21 +
 ui/angular/src/app/health/health.component.html |   24 +
 .../src/app/health/health.component.spec.ts     |   43 +
 ui/angular/src/app/health/health.component.ts   |  345 ++++++
 .../app/job/create-job/create-job.component.css |   66 +
 .../job/create-job/create-job.component.html    |  252 ++++
 .../job/create-job/create-job.component.spec.ts |   43 +
 .../app/job/create-job/create-job.component.ts  |  229 ++++
 ui/angular/src/app/job/job.component.css        |   29 +
 ui/angular/src/app/job/job.component.html       |  192 +++
 ui/angular/src/app/job/job.component.spec.ts    |   43 +
 ui/angular/src/app/job/job.component.ts         |  165 +++
 ui/angular/src/app/login/login.component.css    |   83 ++
 ui/angular/src/app/login/login.component.html   |   88 ++
 .../src/app/login/login.component.spec.ts       |   43 +
 ui/angular/src/app/login/login.component.ts     |   31 +
 .../measure/create-measure/ac/ac.component.css  |  119 ++
 .../measure/create-measure/ac/ac.component.html |  467 ++++++++
 .../create-measure/ac/ac.component.spec.ts      |   43 +
 .../measure/create-measure/ac/ac.component.ts   |  594 +++++++++
 .../create-measure/create-measure.component.css |  123 ++
 .../create-measure.component.html               |  134 +++
 .../create-measure.component.spec.ts            |   43 +
 .../create-measure/create-measure.component.ts  |   52 +
 .../measure/create-measure/pr/pr.component.css  |  156 +++
 .../measure/create-measure/pr/pr.component.html |  392 ++++++
 .../create-measure/pr/pr.component.spec.ts      |   43 +
 .../measure/create-measure/pr/pr.component.ts   |  580 +++++++++
 .../measure-detail/measure-detail.component.css |   18 +
 .../measure-detail.component.html               |  105 ++
 .../measure-detail.component.spec.ts            |   43 +
 .../measure-detail/measure-detail.component.ts  |   70 ++
 .../src/app/measure/measure.component.css       |  367 ++++++
 .../src/app/measure/measure.component.html      |  149 +++
 .../src/app/measure/measure.component.spec.ts   |   44 +
 ui/angular/src/app/measure/measure.component.ts |  108 ++
 .../detail-metric/detail-metric.component.css   |   18 +
 .../detail-metric/detail-metric.component.html  |   28 +
 .../detail-metric.component.spec.ts             |   43 +
 .../detail-metric/detail-metric.component.ts    |  264 ++++
 ui/angular/src/app/metric/metric.component.css  |   36 +
 ui/angular/src/app/metric/metric.component.html |   60 +
 .../src/app/metric/metric.component.spec.ts     |   43 +
 ui/angular/src/app/metric/metric.component.ts   |  367 ++++++
 .../app/mydashboard/mydashboard.component.css   |   18 +
 .../app/mydashboard/mydashboard.component.html  |   18 +
 .../mydashboard/mydashboard.component.spec.ts   |   43 +
 .../app/mydashboard/mydashboard.component.ts    |   34 +
 .../src/app/service/chart.service.spec.ts       |   33 +
 ui/angular/src/app/service/chart.service.ts     |  333 +++++
 .../src/app/service/service.service.spec.ts     |   33 +
 ui/angular/src/app/service/service.service.ts   |  103 ++
 .../src/app/sidebar/sidebar.component.css       |  219 ++++
 .../src/app/sidebar/sidebar.component.html      |   84 ++
 .../src/app/sidebar/sidebar.component.spec.ts   |   43 +
 ui/angular/src/app/sidebar/sidebar.component.ts |  178 +++
 ui/angular/src/assets/.gitkeep                  |    0
 ui/angular/src/assets/img/1.PNG                 |  Bin 0 -> 13855 bytes
 ui/angular/src/assets/img/2.PNG                 |  Bin 0 -> 8562 bytes
 ui/angular/src/assets/img/b3vHigh.jpg           |  Bin 0 -> 555201 bytes
 ui/angular/src/assets/img/bollinger.png         |  Bin 0 -> 145323 bytes
 ui/angular/src/assets/img/construction.gif      |  Bin 0 -> 4853 bytes
 ui/angular/src/assets/img/favicon.ico           |  Bin 0 -> 9920 bytes
 ui/angular/src/assets/img/logo.gif              |  Bin 0 -> 5764 bytes
 ui/angular/src/assets/img/logo.png              |  Bin 0 -> 20582 bytes
 ui/angular/src/assets/img/mad.png               |  Bin 0 -> 47922 bytes
 ui/angular/src/assets/img/sidebar1.png          |  Bin 0 -> 1536 bytes
 ui/angular/src/assets/img/sidebar2.png          |  Bin 0 -> 1617 bytes
 ui/angular/src/assets/img/yoy.png               |  Bin 0 -> 28400 bytes
 ui/angular/src/environments/environment.js      |   27 +
 ui/angular/src/environments/environment.prod.ts |   21 +
 ui/angular/src/environments/environment.ts      |   26 +
 ui/angular/src/favicon.ico                      |  Bin 0 -> 9920 bytes
 ui/angular/src/index.html                       |   41 +
 ui/angular/src/main.js                          |   32 +
 ui/angular/src/main.ts                          |   35 +
 ui/angular/src/polyfills.ts                     |   90 ++
 ui/angular/src/styles.css                       | 1134 ++++++++++++++++++
 ui/angular/src/test.html                        |   41 +
 ui/angular/src/test.ts                          |   50 +
 ui/angular/src/tsconfig.app.json                |   13 +
 ui/angular/src/tsconfig.spec.json               |   20 +
 ui/angular/src/typings.d.ts                     |   23 +
 ui/angular/src/vendor.ts                        |   33 +
 ui/angular/tsconfig.json                        |   19 +
 ui/angular/tslint.json                          |  142 +++
 ui/angular/webpack.config.js                    |   82 ++
 ui/bower.json                                   |   24 -
 ui/build.xml                                    |   48 -
 ui/css/main.css                                 | 1124 -----------------
 ui/css/sidebar.css                              |  183 ---
 ui/css/treeview-check.css                       |   85 --
 ui/css/treeview.css                             |   85 --
 ui/img/1.PNG                                    |  Bin 13855 -> 0 bytes
 ui/img/2.PNG                                    |  Bin 8562 -> 0 bytes
 ui/img/bollinger.png                            |  Bin 145323 -> 0 bytes
 ui/img/construction.gif                         |  Bin 4853 -> 0 bytes
 ui/img/favicon.ico                              |  Bin 9920 -> 0 bytes
 ui/img/logo.gif                                 |  Bin 5764 -> 0 bytes
 ui/img/logo.png                                 |  Bin 20582 -> 0 bytes
 ui/img/mad.png                                  |  Bin 47922 -> 0 bytes
 ui/img/sidebar1.png                             |  Bin 1536 -> 0 bytes
 ui/img/sidebar2.png                             |  Bin 1617 -> 0 bytes
 ui/img/spinner.gif                              |  Bin 5860 -> 0 bytes
 ui/img/yoy.png                                  |  Bin 28400 -> 0 bytes
 ui/index.html                                   |  194 ---
 ui/js/app.js                                    |   47 -
 ui/js/bs.js                                     |   37 -
 ui/js/controllers/bigChart-ctrl.js              |   74 --
 ui/js/controllers/createdataasset-ctrl.js       |  185 ---
 ui/js/controllers/createjob-ac-ctrl.js          |  210 ----
 ui/js/controllers/createjob0.js                 |   47 -
 ui/js/controllers/createrule-ac-ctrl.js         |  459 -------
 ui/js/controllers/createrule-an-ctrl.js         |  303 -----
 ui/js/controllers/createrule-pu-ctrl.js         |  166 ---
 ui/js/controllers/createrule-va-ctrl.js         |  336 ------
 ui/js/controllers/createrule0-ctrl.js           |   46 -
 ui/js/controllers/dataassets-ctrl.js            |  144 ---
 ui/js/controllers/detail-ctrl.js                |   81 --
 ui/js/controllers/downloadSample-ctrl.js        |   41 -
 ui/js/controllers/editdataasset-ctrl.js         |  219 ----
 ui/js/controllers/footer-ctrl.js                |   61 -
 ui/js/controllers/health-ctrl.js                |  266 ----
 ui/js/controllers/index.js                      |   48 -
 ui/js/controllers/job-ctrl.js                   |  151 ---
 ui/js/controllers/main-ctrl.js                  |   41 -
 ui/js/controllers/metrics-ctrl.js               |  208 ----
 ui/js/controllers/module.js                     |   23 -
 ui/js/controllers/mydashboard-ctrl.js           |   89 --
 ui/js/controllers/nav-ctrl.js                   |   70 --
 ui/js/controllers/rule-ctrl.js                  |  176 ---
 ui/js/controllers/sidebar-ctrl.js               |  191 ---
 ui/js/controllers/subscribemodel-ctrl.js        |  411 -------
 ui/js/controllers/viewrule-ctrl.js              |  114 --
 ui/js/directives/bigchart.js                    |   97 --
 ui/js/directives/index.js                       |   20 -
 ui/js/directives/module.js                      |   23 -
 ui/js/directives/treeview.js                    |  252 ----
 ui/js/filters/index.js                          |   20 -
 ui/js/filters/module.js                         |   25 -
 ui/js/filters/strmap.js                         |   71 --
 ui/js/filters/strshorten.js                     |   50 -
 ui/js/main.js                                   |   97 --
 ui/js/routes.js                                 |  245 ----
 ui/js/services/bark-chart.js                    |  302 -----
 ui/js/services/index.js                         |   19 -
 ui/js/services/module.js                        |   23 -
 ui/js/services/services.js                      |  110 --
 ui/login/b3vHigh.jpg                            |  Bin 555201 -> 0 bytes
 ui/login/login.css                              |   90 --
 ui/login/login.html                             |  120 --
 ui/login/login.js                               |  111 --
 ui/login/logo.gif                               |  Bin 59985 -> 0 bytes
 ui/login/pad.png                                |  Bin 140342 -> 0 bytes
 ui/package.json                                 |   27 -
 ui/pages/dataassets/confirmation-dataasset.html |  125 --
 .../confirmation-delete-dataasset.html          |  104 --
 ui/pages/dataassets/createdataasset.html        |  241 ----
 ui/pages/dataassets/dataassets.html             |  108 --
 ui/pages/dataassets/editdataasset.html          |  223 ----
 ui/pages/health/health.html                     |   49 -
 ui/pages/jobs/confirmation-ac.html              |   86 --
 ui/pages/jobs/createjob-ac.html                 |  182 ---
 ui/pages/jobs/createjob0.html                   |   29 -
 ui/pages/jobs/delete-confirm.html               |   95 --
 ui/pages/jobs/jobs.html                         |  135 ---
 ui/pages/measures/confirmation-ac.html          |  122 --
 ui/pages/measures/confirmation-an.html          |  147 ---
 ui/pages/measures/confirmation-pu.html          |  161 ---
 ui/pages/measures/confirmation-va.html          |  161 ---
 ui/pages/measures/createrule-ac.html            |  436 -------
 ui/pages/measures/createrule-an.html            |  410 -------
 ui/pages/measures/createrule-pu.html            |  238 ----
 ui/pages/measures/createrule-va.html            |  407 -------
 ui/pages/measures/createrule0.html              |  259 ----
 ui/pages/measures/delete-confirm.html           |   95 --
 ui/pages/measures/detail.html                   |   80 --
 ui/pages/measures/measure.css                   |  347 ------
 ui/pages/measures/measures.html                 |  106 --
 ui/pages/measures/va-explaination.html          |  771 ------------
 ui/pages/measures/viewrule.html                 |  214 ----
 ui/pages/metrics/dashboard.html                 |   63 -
 ui/pages/metrics/download-sample.html           |   52 -
 ui/pages/metrics/metrics.css                    |   28 -
 .../mydashboard/confirmation-subscribe.html     |   42 -
 ui/pages/mydashboard/mydashboard.html           |   48 -
 ui/pages/mydashboard/subscribemodel.html        |  118 --
 ui/pages/template/bigchart.css                  |   95 --
 ui/pages/template/bigchart.html                 |   35 -
 ui/pages/template/undercons.html                |   22 -
 ui/pom.xml                                      |   48 +-
 ui/sidebar.html                                 |   92 --
 ui/src/main/java/jar/App.java                   |   33 -
 ui/src/test/java/jar/AppTest.java               |   58 -
 ui/tests/ut/karma.conf.js                       |  107 --
 .../specs/controllers/createjob-ac-ctrl.spec.js |   63 -
 .../controllers/createrule-ac-ctrl.spec.js      |  134 ---
 .../controllers/createrule-pu-ctrl.spec.js      |  110 --
 .../controllers/createrule-va-ctrl.spec.js      |  115 --
 .../specs/controllers/createrule0-ctrl.spec.js  |   67 --
 .../ut/specs/controllers/health-ctrl.spec.js    |   78 --
 ui/tests/ut/specs/controllers/job-ctrl.spec.js  |   62 -
 .../ut/specs/controllers/metrics-ctrl.spec.js   |   81 --
 ui/tests/ut/specs/controllers/nav-ctrl_spec.js  |   52 -
 ui/tests/ut/specs/controllers/rule-ctrl.spec.js |   62 -
 .../ut/specs/controllers/sidebar-ctrl_spec.js   |   94 --
 .../ut/specs/controllers/viewrule-ctrl.spec.js  |   77 --
 ui/tests/ut/specs/filters/strmap_spec.js        |   38 -
 ui/tests/ut/specs/filters/strshorten_spec.js    |   43 -
 ui/tests/ut/specs/services/services_spec.js     |   42 -
 ui/tests/ut/test-main.js                        |  102 --
 231 files changed, 10558 insertions(+), 15048 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/.bowerrc
----------------------------------------------------------------------
diff --git a/ui/.bowerrc b/ui/.bowerrc
deleted file mode 100644
index 959e169..0000000
--- a/ui/.bowerrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "directory": "bower_components",
-  "analytics": false
-}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/.angular-cli.json
----------------------------------------------------------------------
diff --git a/ui/angular/.angular-cli.json b/ui/angular/.angular-cli.json
new file mode 100644
index 0000000..f887426
--- /dev/null
+++ b/ui/angular/.angular-cli.json
@@ -0,0 +1,60 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "project": {
+    "name": "griffin"
+  },
+  "apps": [
+    {
+      "root": "src",
+      "outDir": "dist",
+      "assets": [
+        "assets",
+        "favicon.ico"
+      ],
+      "index": "index.html",
+      "main": "main.ts",
+      "polyfills": "polyfills.ts",
+      "test": "test.ts",
+      "tsconfig": "tsconfig.app.json",
+      "testTsconfig": "tsconfig.spec.json",
+      "prefix": "app",
+      "styles": [
+        "styles.css"
+      ],
+      "scripts": [ "../node_modules/echarts/dist/echarts.min.js", "../node_modules/jquery/dist/jquery.min.js", "../node_modules/bootstrap/dist/js/bootstrap.min.js" ],
+      "environmentSource": "environments/environment.ts",
+      "environments": {
+        "dev": "environments/environment.ts",
+        "prod": "environments/environment.prod.ts"
+      }
+    }
+  ],
+  "e2e": {
+    "protractor": {
+      "config": "./protractor.conf.js"
+    }
+  },
+  "lint": [
+    {
+      "project": "src/tsconfig.app.json",
+      "exclude": "**/node_modules/**"
+    },
+    {
+      "project": "src/tsconfig.spec.json",
+      "exclude": "**/node_modules/**"
+    },
+    {
+      "project": "e2e/tsconfig.e2e.json",
+      "exclude": "**/node_modules/**"
+    }
+  ],
+  "test": {
+    "karma": {
+      "config": "./karma.conf.js"
+    }
+  },
+  "defaults": {
+    "styleExt": "css",
+    "component": {}
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/.editorconfig
----------------------------------------------------------------------
diff --git a/ui/angular/.editorconfig b/ui/angular/.editorconfig
new file mode 100644
index 0000000..6e87a00
--- /dev/null
+++ b/ui/angular/.editorconfig
@@ -0,0 +1,13 @@
+# Editor configuration, see http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/.gitignore
----------------------------------------------------------------------
diff --git a/ui/angular/.gitignore b/ui/angular/.gitignore
new file mode 100644
index 0000000..6b66814
--- /dev/null
+++ b/ui/angular/.gitignore
@@ -0,0 +1,43 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/out-tsc
+
+# dependencies
+/node_modules
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+testem.log
+/typings
+yarn-error.log
+
+# e2e
+/e2e/*.js
+/e2e/*.map
+
+# System Files
+.DS_Store
+Thumbs.db

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/README.md
----------------------------------------------------------------------
diff --git a/ui/angular/README.md b/ui/angular/README.md
new file mode 100644
index 0000000..301832c
--- /dev/null
+++ b/ui/angular/README.md
@@ -0,0 +1,28 @@
+# Griffin
+
+This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.3.0.
+
+## Development server
+
+Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+
+## Code scaffolding
+
+Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
+
+## Build
+
+Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
+
+## Running unit tests
+
+Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+
+## Running end-to-end tests
+
+Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
+Before running the tests make sure you are serving the app via `ng serve`.
+
+## Further help
+
+To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/b3vHigh.jpg
----------------------------------------------------------------------
diff --git a/ui/angular/b3vHigh.jpg b/ui/angular/b3vHigh.jpg
new file mode 100644
index 0000000..0d6949d
Binary files /dev/null and b/ui/angular/b3vHigh.jpg differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/karma.conf.js
----------------------------------------------------------------------
diff --git a/ui/angular/karma.conf.js b/ui/angular/karma.conf.js
new file mode 100644
index 0000000..25b36fb
--- /dev/null
+++ b/ui/angular/karma.conf.js
@@ -0,0 +1,52 @@
+/*
+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.
+*/
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/1.0/config/configuration-file.html
+
+
+module.exports = function (config) {
+  config.set({
+    basePath: '',
+    frameworks: ['jasmine', '@angular/cli'],
+    plugins: [
+      require('karma-jasmine'),
+      require('karma-chrome-launcher'),
+      require('karma-jasmine-html-reporter'),
+      require('karma-coverage-istanbul-reporter'),
+      require('@angular/cli/plugins/karma')
+    ],
+    client:{
+      clearContext: false // leave Jasmine Spec Runner output visible in browser
+    },
+    coverageIstanbulReporter: {
+      reports: [ 'html', 'lcovonly' ],
+      fixWebpackSourcePaths: true
+    },
+    angularCli: {
+      environment: 'dev'
+    },
+    reporters: ['progress', 'kjhtml'],
+    port: 9876,
+    colors: true,
+    logLevel: config.LOG_INFO,
+    autoWatch: true,
+    browsers: ['Chrome'],
+    singleRun: false
+  });
+};

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/package.json
----------------------------------------------------------------------
diff --git a/ui/angular/package.json b/ui/angular/package.json
new file mode 100644
index 0000000..8c6e5de
--- /dev/null
+++ b/ui/angular/package.json
@@ -0,0 +1,66 @@
+{
+  "name": "griffin",
+  "version": "0.0.0",
+  "license": "MIT",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "test": "ng test",
+    "lint": "ng lint",
+    "e2e": "ng e2e"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "4.4.4",
+    "@angular/cdk": "2.0.0-beta.12",
+    "@angular/common": "4.4.4",
+    "@angular/compiler": "4.4.4",
+    "@angular/core": "4.4.4",
+    "@angular/forms": "4.4.4",
+    "@angular/http": "4.4.4",
+    "@angular/material": "2.0.0-beta.12",
+    "@angular/platform-browser": "4.4.4",
+    "@angular/platform-browser-dynamic": "4.4.4",
+    "@angular/router": "4.4.4",
+    "angular2-datatable": "0.6.0",
+    "angular2-toaster": "4.0.1",
+    "bootstrap": "^3.3.7",
+    "core-js": "^2.4.1",
+    "echarts": "^3.7.0",
+    "font-awesome": "^4.7.0",
+    "ng2-bootstrap": "1.6.3",
+    "ngx-echarts": "1.2.4",
+    "rxjs": "5.4.2",
+    "zone.js": "^0.8.14"
+  },
+  "devDependencies": {
+    "@angular/cli": "1.3.0",
+    "@angular/compiler-cli": "4.4.4",
+    "@angular/language-service": "4.4.4",
+    "@types/jasmine": "~2.5.53",
+    "@types/jasminewd2": "~2.0.2",
+    "@types/jquery": "^3.2.12",
+    "@types/node": "~6.0.60",
+    "angular-tree-component": "^4.1.0",
+    "codelyzer": "~3.1.1",
+    "font-awesome": "^4.7.0",
+    "fontawesome": "^4.7.2",
+    "jasmine-core": "~2.6.2",
+    "jasmine-spec-reporter": "~4.1.0",
+    "jquery": "^3.2.1",
+    "karma": "~1.7.0",
+    "karma-chrome-launcher": "~2.1.1",
+    "karma-cli": "~1.0.1",
+    "karma-coverage-istanbul-reporter": "^1.2.1",
+    "karma-jasmine": "~1.1.0",
+    "karma-jasmine-html-reporter": "^0.2.2",
+    "ng2-smart-table": "^1.2.1",
+    "protractor": "~5.1.2",
+    "ts-node": "~3.2.0",
+    "tslint": "~5.3.2",
+    "typescript": "~2.3.3",
+    "typings": "^2.1.1",
+    "webpack": "^3.5.4"
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/protractor.conf.js
----------------------------------------------------------------------
diff --git a/ui/angular/protractor.conf.js b/ui/angular/protractor.conf.js
new file mode 100644
index 0000000..bf3c9a3
--- /dev/null
+++ b/ui/angular/protractor.conf.js
@@ -0,0 +1,46 @@
+/*
+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.
+*/
+// Protractor configuration file, see link for more information
+// https://github.com/angular/protractor/blob/master/lib/config.ts
+
+const { SpecReporter } = require('jasmine-spec-reporter');
+
+exports.config = {
+  allScriptsTimeout: 11000,
+  specs: [
+    './e2e/**/*.e2e-spec.ts'
+  ],
+  capabilities: {
+    'browserName': 'chrome'
+  },
+  directConnect: true,
+  baseUrl: 'http://localhost:4200/',
+  framework: 'jasmine',
+  jasmineNodeOpts: {
+    showColors: true,
+    defaultTimeoutInterval: 30000,
+    print: function() {}
+  },
+  onPrepare() {
+    require('ts-node').register({
+      project: 'e2e/tsconfig.e2e.json'
+    });
+    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
+  }
+};

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/app.component.css
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/app.component.css b/ui/angular/src/app/app.component.css
new file mode 100644
index 0000000..cd5974f
--- /dev/null
+++ b/ui/angular/src/app/app.component.css
@@ -0,0 +1,142 @@
+/*
+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.
+*/
+@import url('../../node_modules/bootstrap/dist/css/bootstrap.css');
+*{
+	color:white;
+}
+
+.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
+    color: #ffffff;
+    background-color: transparent;
+}
+.navbar-default{
+	background-color: #060606;
+	border-color: #282828;
+}
+#toggle{
+    background: #060606;
+    color:#fff;
+}
+#toggle:hover{
+    color: #fff;
+    background-color: #060606;
+}
+.re:hover{
+    cursor: pointer;
+}
+
+
+h3{
+    font-size: 34px;
+}
+input{
+    margin: 12px;
+}
+
+
+
+.dropdown-menu{
+    background-color: #222222;
+}
+.dropdown-menu > li > a{
+    color: #ffffff;
+}
+.dropdown-menu > li > a:hover{
+    text-decoration: none;
+    color: #ffffff;
+    background-color: #2a9fd6;
+}
+.navbar-default .navbar-nav > .open > a {
+    background-color: #333;
+}
+.btn-circle{
+    font-size: 16px;
+    border-radius: 15px 15px 15px 15px;
+}
+.btn-primary{
+    background-color: #2a9fd6;
+}
+
+#content {
+    background-color: #1A237E;
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-attachment: fixed;
+    background-size: cover;
+    height: 100vh;
+}
+hr {
+    margin-bottom: 30px;
+}
+
+@media (min-width: 992px) {
+
+    #content-row {
+        margin-top:12em;
+        margin-bottom:7em;
+    }
+
+    #bark-description {
+        display: block;
+    }
+
+    #bark-description-2 {
+        display: none;
+    }
+}
+
+@media (max-width:991px) {
+
+    #content-row {
+        margin-top:0em;
+        margin-bottom:0em;
+    }
+
+    #bark-description {
+        display: none;
+    }
+
+    #bark-description-2 {
+        margin-top: 3em;
+        display: block;
+    }
+}
+
+#bark-description p, #bark-description-2 p {
+    margin-left: 100px;
+    color: #ffffff;
+    font-size: 20px;
+}
+
+#content-row {
+    padding: 3em 0;
+    background-color: rgba(255, 255, 255, 0.2);
+}
+
+#loginMsg {
+    display: none;
+    background-color: #F1D7D7;
+    color: #A95252;
+    padding: 8px 12px;
+    border-radius: 4px;
+    text-align:center;
+}
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/app.component.html
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/app.component.html b/ui/angular/src/app/app.component.html
new file mode 100644
index 0000000..28f11d1
--- /dev/null
+++ b/ui/angular/src/app/app.component.html
@@ -0,0 +1,163 @@
+<!--
+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.
+-->
+
+<!--The content below is only a placeholder and can be replaced.-->
+<div *ngIf="ntAccount">
+  <nav class="navbar navbar-default navbar-fixed-top" ng-controller="NavCtrl">
+    <div class="container-fluid">
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse" aria-expanded="false">
+                <span class="sr-only">Toggle navigation</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a routerLink="/" class="navbar-brand" style="padding-top:5px;padding-bottom:0;"><img src="/assets/img/logo.png" title="Data Quality Service" style="max-height:40px;"/></a>
+        </div>
+
+        <div class="collapse navbar-collapse" id="navbar-collapse">
+            <ul class="nav navbar-nav">
+                <li><a routerLink="/health" routerLinkActive="active" class="changecolor">Health</a></li>
+                <li><a routerLink="/measures">Measures</a></li>
+                <li><a routerLink="/jobs">Jobs</a></li>
+                <li><a routerLink="/mydashboard">My Dashboard</a></li>
+            </ul>
+
+            <ul class="nav navbar-nav navbar-right">
+                <li class="dropdown">
+                    <a  class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" id="toggle">{{fullName}} <i class="fa fa-user fa-fw"></i><span class="caret"></span></a>
+                    <ul class="dropdown-menu dropdown-user">
+                        <li><a href="#!/undercons"><i class="fa fa-user fa-fw"></i> User Profile</a></li>
+                        <li><a href="#!/undercons"><i class="fa fa-gear fa-fw"></i> Settings</a></li>
+                        <li class="divider"></li>
+                        <li><a href="/apidocs/index.html" target="_blank"><i class="fa fa-book fa-fw"></i> API DOCs</a></li>
+                        <li><a href="https://github.com/eBay/griffin/blob/master/griffin-doc/userguide.md" target="_blank"><i class="fa fa-question-circle fa-fw"></i> User Guide</a></li>
+                        <li><a href="mailto://ebay-griffin-devs@googlegroups.com" ><i class="fa fa-envelope fa-fw"></i> Contact us</a></li>
+                        <li class="divider"></li>
+                        <li><a (click)="logout()" class="re"><i class="fa fa-sign-out fa-fw"></i> Logout</a>
+                        </li>
+                    </ul>
+                </li>
+            </ul>
+
+            <form class="navbar-search navbar-right nav navbar-nav" >
+                <input id="searchBox" type="text" class="search-query" placeholder="Search..." ng-disabled="!isActive('/measures')&&!isActive('/dataassets')">
+            </form>
+        </div>
+    </div>
+  </nav>
+
+  <div class="container-fluid"  us-spinner="{color:'#ffffff', lines:13, width:14, length:28, radius:42, shadow:true, hwaccel:true, speed:0.8}" spinner-on="false" style="padding-top:56px;padding-bottom:90px;height:100%;padding-right:0;" id="mainContent">
+
+
+    <div class="col-md-9 col-xs-12" >
+        <button type="button" class="btn btn-primary btn-circle" style="position: absolute; top: 0px; right: 30px; z-index:99" (click)="history.back();"><span style="margin-bottom:20px;">Back</span></button>
+        <!-- main content goes here-->
+        <div id="mainWindow" (window:resize)="onResize($event)" class="row" ng-view style="overflow-y: auto;overflow-x:hidden; padding-right: 10px;" >
+        <router-outlet></router-outlet>
+        </div>
+    </div>
+
+    <div  class="col-xs-12 col-md-3" style="padding-right:0;">
+        <app-sidebar></app-sidebar>
+    </div>
+
+    <div id="footerwrap" class="navbar-fixed-bottom">
+        <div class="container-fluid" class="ng-cloak">
+            <div class="row " *ngIf="timestamp|date:'short'">
+                <p *ngIf="!notifications">{{timestamp|date:'short'}} - Welcome <label>{{fullName}}</label>!</p>
+                <p *ngFor="let r of notifications">
+                    {{r.timestamp|date:'short'}} - <label>{{r.owner}}</label> {{r.operation}}d a {{r.target}} named
+                    <a *ngIf="r.target=='model'" routerLink="/viewrule/{{r.name}}">{{r.name}}</a>
+                    <label *ngIf="r.target=='dataasset'">"{{r.name}}"</label>
+                </p>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+<!-- <app-login></app-login> -->
+<div *ngIf="!ntAccount" id="content" class="container-fluid">
+        <div class="row" id="content-row">
+
+            <div class="col-md-6 col-md-offset-1 col-xs-12">
+                <div id="bark-description">
+                    <h3>
+                        Data Quality Service Platform on eBay Cloud.
+                    </h3><br>
+                    <p>
+                        Automates your data quality validation
+                    </p><br>
+                    <p>
+                        Health monitoring, Profiling and detection
+                    </p><br>
+                    <p>
+                        Unified Visualization
+                    </p><br>
+                    <p>
+                        One set of tools to build data quality pipelines
+                    </p>
+                </div>
+            </div>
+
+            <div class="col-md-3 col-md-offset-1 col-xs-12">
+                <div id="login-form">
+                    <div style="text-align:center;margin-bottom:30px;">
+                        <img src="../assets/img/logo.png" class="img-rounded" style="width:80%;">
+                    </div>
+
+                    <input type="input" class="form-control" placeholder="username" autocomplete="on" style="margin-bottom:20px;" (focus)="focus($event)">
+
+                    <input type="password" class="form-control" placeholder="password" autocomplete="on" (keyup)="submit($event)" (focus)="focus($event)">
+
+                    <div class="checkbox">
+                    <label style="color:white;">
+                        <input type="checkbox" value="remember-me" checked>Remember me
+                    </label>
+                    </div>
+
+                    <button class="btn btn-default btn-large btn-block" id="login-btn" (click)="login()" style="margin-bottom: 20px;">Log in</button>
+
+                    <div id="loginMsg">Login failed. Try again.</div>
+                </div>
+            </div>
+
+            <div class="col-xs-12">
+                <div id="bark-description-2">
+                    <h3>
+                        Data Quality Service Platform on the eBay Cloud.
+                    </h3><br>
+                    <p>
+                        Automates your data quality validation
+                    </p><br>
+                    <p>
+                        Health monitoring, Profiling and detection
+                    </p><br>
+                    <p>
+                        Unified Visualization
+                    </p><br>
+                    <p>
+                        One set of tools to build data quality pipelines
+                    </p>
+                </div>
+            </div>
+        </div>
+
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/app.component.js
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/app.component.js b/ui/angular/src/app/app.component.js
new file mode 100644
index 0000000..a7fbf35
--- /dev/null
+++ b/ui/angular/src/app/app.component.js
@@ -0,0 +1,43 @@
+/*
+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.
+*/
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+exports.__esModule = true;
+var core_1 = require("@angular/core");
+// import 'bootstrap/dist/css/bootstrap.css';
+var AppComponent = (function () {
+    function AppComponent() {
+        this.title = 'app';
+    }
+    AppComponent = __decorate([
+        core_1.Component({
+            selector: 'app-root',
+            template: "\n    <h1>Angular Router</h1>\n    <nav>\n      <a routerLink=\"/measures\" routerLinkActive=\"active\"> Measures</a>\n      <a routerLink=\"/jobs\">jobs</a>\n    </nav>\n    <router-outlet></router-outlet>\n  ",
+            templateUrl: './app.component.html',
+            styleUrls: ['./app.component.css']
+        })
+    ], AppComponent);
+    return AppComponent;
+}());
+exports.AppComponent = AppComponent;

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/app.component.spec.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/app.component.spec.ts b/ui/angular/src/app/app.component.spec.ts
new file mode 100644
index 0000000..7e62354
--- /dev/null
+++ b/ui/angular/src/app/app.component.spec.ts
@@ -0,0 +1,50 @@
+/*
+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.
+*/
+import { TestBed, async } from '@angular/core/testing';
+
+import { AppComponent } from './app.component';
+
+describe('AppComponent', () => {
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [
+        AppComponent
+      ],
+    }).compileComponents();
+  }));
+
+  it('should create the app', async(() => {
+    const fixture = TestBed.createComponent(AppComponent);
+    const app = fixture.debugElement.componentInstance;
+    expect(app).toBeTruthy();
+  }));
+
+  it(`should have as title 'app'`, async(() => {
+    const fixture = TestBed.createComponent(AppComponent);
+    const app = fixture.debugElement.componentInstance;
+    expect(app.title).toEqual('app');
+  }));
+
+  it('should render title in a h1 tag', async(() => {
+    const fixture = TestBed.createComponent(AppComponent);
+    fixture.detectChanges();
+    const compiled = fixture.debugElement.nativeElement;
+    expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!');
+  }));
+});

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/app.component.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/app.component.ts b/ui/angular/src/app/app.component.ts
new file mode 100644
index 0000000..b36d3b2
--- /dev/null
+++ b/ui/angular/src/app/app.component.ts
@@ -0,0 +1,151 @@
+/*
+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.
+*/
+import { Component ,Directive,ViewContainerRef} from '@angular/core';
+// import { RouterModule, Routes } from '@angular/router';
+import { Router} from "@angular/router";
+import { HttpClient} from '@angular/common/http';
+import * as $ from 'jquery';
+import {ServiceService} from './service/service.service';
+
+// import jQuery from 'jquery';
+
+// import  'bootstrap/dist/js/bootstrap.min.js';
+
+
+@Component({
+  selector: 'app-root',
+  templateUrl: './app.component.html',
+  styleUrls: ['./app.component.css'],
+  providers:[ServiceService]
+})
+export class AppComponent {
+  title = 'app';
+  ntAccount : string;
+  // ntAccount = "test";
+  timestamp:Date;
+  onResize(event){
+   this.resizeMainWindow();
+
+  }
+  results:any;
+  fullName ="hello";
+  ngOnInit(){
+    this.ntAccount = this.getCookie("ntAccount");
+    this.fullName = this.getCookie("fullName");
+    this.timestamp = new Date();
+  }
+  constructor(private router:Router,private http:HttpClient,public serviceService:ServiceService){
+
+  }
+  setCookie(name, value, days){
+    
+    let expires;
+        if (days) {
+            var date = new Date();
+            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+            console.log(date);
+            expires = "; expires=" + date.toUTCString();
+      } else {
+          expires = "";
+      }
+      // document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + expires + "; path=/";
+      document.cookie = name + "=" + value + expires + "; path=/";
+  }
+
+  getCookie(key) {
+        console.log(document.cookie);
+        var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)');
+        return keyValue ? keyValue[2] : null;
+    }
+
+  loginBtnWait() {
+      $('#login-btn').addClass('disabled')
+        .text('Logging in......');
+    }
+
+  loginBtnActive() {
+        $('#login-btn').removeClass('disabled')
+        .text('Log in');
+    }
+
+  showLoginFailed() {
+      $('#loginMsg').show()
+        .text('Login failed. Try again.');
+    }
+  resizeMainWindow(){
+    $('#mainWindow').height(window.innerHeight-56-90);
+  }
+  logout(){
+      this.ntAccount = undefined;
+      this.setCookie('ntAccount', undefined, -1);
+      this.setCookie('fullName', undefined, -1);
+    // this.router.navigate(['/login']) ;
+    // window.location.replace ('login.html');
+
+   }
+  submit(event){
+    if(event.which == 13){//enter
+        event.preventDefault();
+        $('#login-btn').click();
+        $('#login-btn').focus();
+      }
+  }
+  focus($event){
+    $('#loginMsg').hide();
+  }
+
+  login(){
+      var name = $('input:eq(0)').val();
+      var password = $('input:eq(1)').val();
+      console.log(name);
+      var loginUrl = 'http://localhost:8080/api/v1/login/authenticate';
+      this.loginBtnWait();
+
+      this.http   
+      .post(loginUrl,{username:name, password:password})
+      .subscribe(data => {
+        this.results = data;
+        if(this.results.status == 0)
+          {//logon success
+           if($('input:eq(2)').prop('checked')){
+            this.setCookie('ntAccount', this.results.ntAccount, 30);
+            this.setCookie('fullName', this.results.fullName, 30);
+           }else
+           {
+              this.setCookie('ntAccount', this.results.ntAccount,0);
+              this.setCookie('fullName', this.results.fullName,0);
+           }
+            this.loginBtnActive()
+            window.location.replace('/');
+          }
+          else{
+              this.showLoginFailed();
+              this.loginBtnActive();
+          };
+      
+    },
+    err => {
+          this.showLoginFailed();
+          this.loginBtnActive();
+    });
+
+  }
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/app.module.js
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/app.module.js b/ui/angular/src/app/app.module.js
new file mode 100644
index 0000000..1ce697c
--- /dev/null
+++ b/ui/angular/src/app/app.module.js
@@ -0,0 +1,65 @@
+/*
+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.
+*/
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+exports.__esModule = true;
+var platform_browser_1 = require("@angular/platform-browser");
+var core_1 = require("@angular/core");
+var router_1 = require("@angular/router");
+var app_component_1 = require("./app.component");
+var appRoutes = [
+    { path: 'health', component: app_component_1.AppComponent },
+    { path: 'measures', component: app_component_1.AppComponent },
+    { path: 'hero/:id', component: app_component_1.AppComponent },
+    { path: 'mydashboard', component: app_component_1.AppComponent },
+    {
+        path: 'jobs', component: app_component_1.AppComponent,
+        data: { title: 'Heroes List' }
+    },
+    { path: '',
+        redirectTo: 'health',
+        pathMatch: 'full'
+    },
+    { path: '**', component: app_component_1.AppComponent }
+];
+var AppModule = (function () {
+    function AppModule() {
+    }
+    AppModule = __decorate([
+        core_1.NgModule({
+            declarations: [
+                app_component_1.AppComponent
+            ],
+            imports: [
+                platform_browser_1.BrowserModule,
+                router_1.RouterModule.forRoot(appRoutes, { enableTracing: true } // <-- debugging purposes only
+                )
+            ],
+            providers: [],
+            bootstrap: [app_component_1.AppComponent]
+        })
+    ], AppModule);
+    return AppModule;
+}());
+exports.AppModule = AppModule;

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/app.module.ts b/ui/angular/src/app/app.module.ts
new file mode 100644
index 0000000..c7a3022
--- /dev/null
+++ b/ui/angular/src/app/app.module.ts
@@ -0,0 +1,158 @@
+/*
+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.
+*/
+import { BrowserModule } from '@angular/platform-browser';
+import {NgModule} from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { HttpClientModule} from '@angular/common/http';
+
+import { Ng2SmartTableModule } from 'ng2-smart-table';
+import {DataTableModule} from "angular2-datatable";
+import { TreeModule } from 'angular-tree-component';
+import { BrowserAnimationsModule} from '@angular/platform-browser/animations';
+import { AngularEchartsModule } from 'ngx-echarts';
+// import { MdDatepickerModule, MdNativeDateModule} from '@angular/material';
+import { MatDatepickerModule, MatNativeDateModule} from '@angular/material';
+
+import {ToasterModule, ToasterService} from 'angular2-toaster';
+import { FormsModule } from '@angular/forms';
+import { AppComponent } from './app.component';
+import { MeasureComponent } from './measure/measure.component';
+import { JobComponent } from './job/job.component';
+import { SidebarComponent } from './sidebar/sidebar.component';
+import { HealthComponent } from './health/health.component';
+import { MydashboardComponent } from './mydashboard/mydashboard.component';
+import { CreateMeasureComponent } from './measure/create-measure/create-measure.component';
+import { MeasureDetailComponent } from './measure/measure-detail/measure-detail.component';
+import { MetricComponent } from './metric/metric.component';
+import { DetailMetricComponent } from './metric/detail-metric/detail-metric.component';
+import { DataassetComponent } from './dataasset/dataasset.component';
+import { CreateJobComponent } from './job/create-job/create-job.component';
+import { AcComponent} from './measure/create-measure/ac/ac.component';
+import { PrComponent } from './measure/create-measure/pr/pr.component';
+import { LoginComponent } from './login/login.component';
+
+
+
+const appRoutes: Routes = [
+  {
+    path: 'health',
+    component: HealthComponent
+  },
+  {
+    path: 'measures',
+    component: MeasureComponent
+  },
+  {
+    path: 'measure/:id',
+    component: MeasureDetailComponent
+  },
+  {
+    path: 'mydashboard',
+    component: MetricComponent
+  },
+  {
+    path: 'jobs',
+    component: JobComponent,
+  },
+  {
+    path: 'createjob',
+    component: CreateJobComponent,
+
+  },
+  {
+    path: 'createmeasure',
+    component:CreateMeasureComponent
+  },
+  {
+    path: 'createmeasureac',
+    component:AcComponent
+  },
+    {
+    path: 'createmeasurepr',
+    component:PrComponent
+  },
+  {
+    path: 'detailed/:name',
+    component:DetailMetricComponent
+  },
+  {
+    path: 'dataassets',
+    component:DataassetComponent
+  },
+  {
+    path: 'metrics',
+    component:MetricComponent
+  },
+  {
+    path: '',
+    redirectTo: 'health',
+    pathMatch: 'full'
+  },
+  {
+    path: 'login',
+    component:LoginComponent
+  },
+  // {
+  //   path: '**',
+  //   component: AppComponent
+  // }
+
+];
+
+@NgModule({
+  declarations: [
+    AppComponent,
+    MeasureComponent,
+    JobComponent,
+    SidebarComponent,
+    HealthComponent,
+    MydashboardComponent,
+    CreateMeasureComponent,
+    MeasureDetailComponent,
+    MetricComponent,
+    DetailMetricComponent,
+    DataassetComponent,
+    CreateJobComponent,
+    AcComponent,
+    PrComponent,
+    LoginComponent,
+  ],
+  imports: [
+    BrowserModule,
+    HttpClientModule,
+    Ng2SmartTableModule,
+    TreeModule,
+    BrowserAnimationsModule,
+    ToasterModule,
+    FormsModule,
+    AngularEchartsModule,
+    DataTableModule,
+    RouterModule.forRoot(
+      appRoutes,
+      { enableTracing: false } // <-- debugging purposes only
+    ),
+    MatNativeDateModule,
+    MatDatepickerModule
+
+
+  ],
+  providers: [],
+  bootstrap: [AppComponent]
+})
+export class AppModule { }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/dataasset/dataasset.component.css
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/dataasset/dataasset.component.css b/ui/angular/src/app/dataasset/dataasset.component.css
new file mode 100644
index 0000000..8f58e22
--- /dev/null
+++ b/ui/angular/src/app/dataasset/dataasset.component.css
@@ -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.
+*/
+.icon{
+  color: #fff;
+  position: absolute;
+  left: 50%;
+  top: 80%;
+}
+
+
+.table-striped > tbody > tr{
+     background-color: #1f1f1f; 
+}
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/dataasset/dataasset.component.html
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/dataasset/dataasset.component.html b/ui/angular/src/app/dataasset/dataasset.component.html
new file mode 100644
index 0000000..7dfcc16
--- /dev/null
+++ b/ui/angular/src/app/dataasset/dataasset.component.html
@@ -0,0 +1,107 @@
+<!--
+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.
+-->
+
+<div  class="bs-component" >
+	<div id="assetContainer" style="margin-top:40px">
+    <table>
+        <tr>
+		  <td colspan="7" style="text-align:center;display: none" id="message">
+		     No content.
+		  </td>
+		  <td class="icon">
+			<span class="fa fa-spinner fa-spin fa-3x fa-fw"></span>
+		  </td>
+		</tr>
+    </table>
+    <table class="table table-striped" [mfData]="results" #mf="mfDataTable" [mfRowsOnPage]="5">
+	  	<thead>
+	    	<tr style="background-color:#7D95CC">
+				<th st-ratio="10">Table Name</th>
+				<th st-ratio="10">DB Name</th>
+				<th st-ratio="20">Owner</th>
+				<th st-ratio="10">Creation Time</th>
+				<th st-ratio="20">Last Access Time</th>
+				<th st-ratio="20">Location</th>
+
+			</tr>
+	  	</thead>
+	  	<tbody>
+		    <tr *ngIf="!results">
+		     <td *ngIf="!results" colspan="7" style="text-align:center">
+		     No content.
+		     </td>
+		     <td class="icon">
+				 <span class="fa fa-spinner fa-spin fa-3x fa-fw"></span>
+			 </td>
+		    </tr>
+		</tbody>
+	  	<tbody *ngFor="let row of mf.data" style="word-break:break-all;">
+	    	<tr>
+	    		<td [ngClass]="{accordion:true}" (click)="row.showDetail=!(row.showDetail)" style="cursor: pointer;">
+                    <i *ngIf="!row.showDetail" class="fa fa-chevron-circle-right blue"></i>
+                    <i *ngIf="row.showDetail" class="fa fa-chevron-circle-down blue"></i>
+                    {{row.tableName}}</td>
+	    		<td>{{row.dbName || 'N/A'}}</td>
+	        	<td>{{row.owner || 'N/A'}}</td>
+	    		<td>{{(row.createTime * 1000 | date: 'short') ||  'N/A'}}</td>
+	    		<td>{{(row.lastAccessTime * 1000 | date: 'short') || 'N/A' }}</td>
+	    		<td>{{row.sd.location || 'N/A'}}</td>
+	    	</tr>
+	    	<tr *ngIf="row.showDetail">
+	    		<td colspan="7" style="padding:20px 30px 10px 30px;">
+				    <table class="table table-striped" [mfData]="row.sd.cols" #mf2="mfDataTable">
+					  	<thead>
+					    	<tr style="background-color:#7D95CC">
+								<th st-ratio="15">Name</th>
+								<th st-ratio="15">Type</th>
+								<th st-ratio="15">Comment</th>
+					    	</tr>
+					  	</thead>
+					  	<tbody>
+					      <tr *ngIf="!row.sd.cols">
+					        <td colspan="7" style="text-align:center">No content.</td>
+					      </tr>
+					    	<tr *ngFor="let item of mf2.data">
+					    		<td>{{item.name}}</td>
+					    		<td>{{item.type}}</td>
+						        <td>{{item.comment || 'N/A'}}</td>
+					    	</tr>
+					  	</tbody>
+					  	<!-- <tfoot>
+	                      <tr>
+	                        <td colspan="8" class="text-right">
+	                           <mfBootstrapPaginator></mfBootstrapPaginator>
+	                        </td>
+	                      </tr>
+	                    </tfoot> -->
+				    </table>
+				</td>
+	    	</tr>
+	  	</tbody>
+	    <tfoot>
+	      <tr>
+	        <td colspan="8" class="text-right">
+	          <mfBootstrapPaginator></mfBootstrapPaginator>
+	        </td>
+	      </tr>
+	    </tfoot>
+    </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/dataasset/dataasset.component.spec.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/dataasset/dataasset.component.spec.ts b/ui/angular/src/app/dataasset/dataasset.component.spec.ts
new file mode 100644
index 0000000..65c9b57
--- /dev/null
+++ b/ui/angular/src/app/dataasset/dataasset.component.spec.ts
@@ -0,0 +1,43 @@
+/*
+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.
+*/
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DataassetComponent } from './dataasset.component';
+
+describe('DataassetComponent', () => {
+  let component: DataassetComponent;
+  let fixture: ComponentFixture<DataassetComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ DataassetComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(DataassetComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should be created', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/dataasset/dataasset.component.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/dataasset/dataasset.component.ts b/ui/angular/src/app/dataasset/dataasset.component.ts
new file mode 100644
index 0000000..f18e818
--- /dev/null
+++ b/ui/angular/src/app/dataasset/dataasset.component.ts
@@ -0,0 +1,85 @@
+/*
+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.
+*/
+import { Component, OnInit } from '@angular/core';
+import {HttpClient} from '@angular/common/http';
+import { Ng2SmartTableModule ,LocalDataSource} from 'ng2-smart-table';
+import * as $ from 'jquery';
+import {ServiceService} from '../service/service.service';
+
+@Component({
+  selector: 'app-dataasset',
+  templateUrl: './dataasset.component.html',
+  providers:[ServiceService],
+  styleUrls: ['./dataasset.component.css']
+})
+export class DataassetComponent implements OnInit {
+  public results = [];
+  source:LocalDataSource;
+  public visible = false;
+  public visibleAnimate = false;
+  sourceTable :string;
+  targetTable :string;
+  data:object;
+
+  public hide(): void {
+    this.visibleAnimate = false;
+    setTimeout(() => this.visible = false, 300);
+  }
+
+  public onContainerClicked(event: MouseEvent): void {
+    if ((<HTMLElement>event.target).classList.contains('modal')) {
+      this.hide();
+    }
+  }
+  constructor(private http:HttpClient,public servicecService:ServiceService) { }
+  parseDate(time){
+    time = new Date(time);
+    var year = time.getFullYear();
+    var month = time.getMonth() + 1;
+    var day = time.getDate();
+    var hour = time.getHours();
+    if(hour<10)
+      hour = '0' + hour;
+    var minute = time.getMinutes();
+    if(minute<10)
+      minute = '0' + minute;
+    var second = time.getSeconds();
+    if(second<10)
+      second = '0' + second;
+    return  ( year +'/'+ month + '/'+ day + ' '+ hour + ':' + minute + ':' + second);
+  }
+
+
+  ngOnInit() {
+    var allDataassets = this.servicecService.config.uri.dataassetlist;
+    this.http.get(allDataassets).subscribe(data =>{
+        for (let db in data) {
+            for(let table of data[db]){           
+            table.location = table.sd.location;
+            this.results.push(table);
+            }       
+        }
+        this.source = new LocalDataSource(this.results);
+        this.source.load(this.results);
+        $('.icon').hide();
+    },err =>{
+      
+    });
+  };
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/health/health.component.css
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/health/health.component.css b/ui/angular/src/app/health/health.component.css
new file mode 100644
index 0000000..8f31b07
--- /dev/null
+++ b/ui/angular/src/app/health/health.component.css
@@ -0,0 +1,21 @@
+/*
+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.
+*/
+.demo-chart {
+  height: 400px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/health/health.component.html
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/health/health.component.html b/ui/angular/src/app/health/health.component.html
new file mode 100644
index 0000000..f45e831
--- /dev/null
+++ b/ui/angular/src/app/health/health.component.html
@@ -0,0 +1,24 @@
+<!--
+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.
+-->
+
+<div class="tab-content" style='margin-top: '>
+  <div class="tab-pane fade active in" id="heatmap" >
+    <div echarts [options]="chartOption" class="demo-chart" id="chart1" (chartClick)="onChartClick($event)" style="margin-top: 50px;"></div>
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/health/health.component.spec.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/health/health.component.spec.ts b/ui/angular/src/app/health/health.component.spec.ts
new file mode 100644
index 0000000..d50be5a
--- /dev/null
+++ b/ui/angular/src/app/health/health.component.spec.ts
@@ -0,0 +1,43 @@
+/*
+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.
+*/
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { HealthComponent } from './health.component';
+
+describe('HealthComponent', () => {
+  let component: HealthComponent;
+  let fixture: ComponentFixture<HealthComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ HealthComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(HealthComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should be created', () => {
+    expect(component).toBeTruthy();
+  });
+});

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/health/health.component.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/health/health.component.ts b/ui/angular/src/app/health/health.component.ts
new file mode 100644
index 0000000..dcb5c8c
--- /dev/null
+++ b/ui/angular/src/app/health/health.component.ts
@@ -0,0 +1,345 @@
+/*
+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.
+*/
+import { Component, OnInit } from '@angular/core';
+import  {HttpClient} from '@angular/common/http';
+import  {Router} from "@angular/router";
+// import {GetMetricService} from '../service/get-metric.service'
+import {ServiceService} from '../service/service.service';
+
+import * as $ from 'jquery';
+
+@Component({
+  selector: 'app-health',
+  templateUrl: './health.component.html',
+  styleUrls: ['./health.component.css'],
+  // providers:[GetMetricService]
+})
+export class HealthComponent implements OnInit {
+
+  constructor(private http: HttpClient,private router:Router,public servicecService:ServiceService) { };
+  chartOption:object;
+  // var formatUtil = echarts.format;
+  orgs = [];
+  dataData = [];
+  finalData = [];
+  // originalData = [];
+  originalData:any;
+  metricName = [];
+  metricNameUnique = [];
+  myData = [];
+  originalOrgs = [];
+
+
+  status:{
+    'health':number,
+    'invalid':number
+  };
+  // var formatUtil = echarts.format;
+  metricData = [];
+
+
+//   metricData = {
+//   "hits" : {
+//     "hits" : [
+//       {
+//         "_source" : {
+//           "name" : "xixi",
+//           "tmst" : 1493962623461,
+//           "total" : 8043288,
+//           "matched" : 8034775
+//         }
+//       },
+//       {
+//         "_source" : {
+//           "name" : "xixi",
+//           "tmst" : 1493973423461,
+//           "total" : 9479698,
+//           "matched" : 9476094
+//         }
+//       },
+//       {
+//         "_source" : {
+//           "name" : "xixi",
+//           "tmst" : 1493987823461,
+//           "total" : 9194117,
+//           "matched" : 9164237
+//         }
+//       },
+//       {
+//         "_source" : {
+//           "name" : "xixi",
+//           "tmst" : 1493995023461,
+//           "total" : 9429018,
+//           "matched" : 9375324
+//         }
+//       },
+//       {
+//         "_source" : {
+//           "name" : "xixi",
+//           "tmst" : 1494009423461,
+//           "total" : 8029660,
+//           "matched" : 7979653
+//         }
+//       },
+//       {
+//         "_source" : {
+//           "name" : "haha",
+//           "tmst" : 1493959023461,
+//           "total" : 1086389,
+//           "matched" : 1083336
+//         }
+//       },
+//       {
+//         "_source" : {
+//           "name" : "haha",
+//           "tmst" : 1493973423461,
+//           "total" : 1090650,
+//           "matched" : 1090445
+//         }
+//       },
+//       {
+//         "_source" : {
+//           "name" : "haha",
+//           "tmst" : 1493980623461,
+//           "total" : 1088940,
+//           "matched" : 1079003
+//         }
+//       },
+//       {
+//         "_source" : {
+//           "name" : "haha",
+//           "tmst" : 1493995023461,
+//           "total" : 1048833,
+//           "matched" : 1047890
+//         }
+//       },
+//       {
+//         "_source" : {
+//           "name" : "haha",
+//           "tmst" : 1494013023461,
+//           "total" : 1063349,
+//           "matched" : 1055783
+//         }
+//       }
+//     ]
+//   }
+// };
+  
+  onChartClick($event){
+    if($event.data.name){
+        // this.router.navigate(['/detailed/'+$event.data.name]);
+        window.location.href = '/detailed/'+$event.data.name;
+    }
+  }
+
+  resizeTreeMap() {
+    $('#chart1').height( $('#mainWindow').height() - $('.bs-component').outerHeight() );
+  };
+
+  parseData(data) {
+    var sysId = 0;
+    var metricId = 0;
+    var result = [];
+    	for(let sys of data){
+        var item = {
+            'id':'',
+            'name':'',
+            children:[]
+        };
+        item.id = 'id_'+sysId;
+        item.name = sys.name;
+        if (sys.metrics != undefined) {
+            item.children = [];
+            	for(let metric of sys.metrics){
+                var itemChild = {
+                    id: 'id_' + sysId + '_' + metricId,
+                    name: metric.name,
+                    value: 1,
+                    dq: metric.dq,
+                    sysName: sys.name,
+                    itemStyle: {
+                        normal: {
+                            color: '#4c8c6f'
+                        }
+                    },
+                };
+                if (metric.dqfail == 1) {
+                    itemChild.itemStyle.normal.color = '#ae5732';
+                } else {
+                    itemChild.itemStyle.normal.color = '#005732';
+                }
+                item.children.push(itemChild);
+                metricId++;
+            }
+        }
+        result.push(item);
+        sysId ++;
+    }
+    return result;
+   };
+
+   getLevelOption() {
+       return [
+           {
+               itemStyle: {
+                   normal: {
+                       borderWidth: 0,
+                       gapWidth: 6,
+                       borderColor: '#000'
+                   }
+               }
+           },
+           {
+               itemStyle: {
+                   normal: {
+                       gapWidth: 1,
+                       borderColor: '#fff'
+                   }
+               }
+           }
+       ];
+   };
+
+  renderTreeMap(res) {
+    var data = this.parseData(res);
+    var option = {
+        title: {
+            text: 'Data Quality Metrics Heatmap',
+            left: 'center',
+            textStyle:{
+                color:'white'
+            }
+        },
+        backgroundColor: 'transparent',
+        tooltip: {
+            formatter: function(info) {
+                var dqFormat = info.data.dq>100?'':'%';
+                if(info.data.dq)
+                return [
+                    '<span style="font-size:1.8em;">' + info.data.sysName + ' &gt; </span>',
+                    '<span style="font-size:1.5em;">' + info.data.name+'</span><br>',
+                    '<span style="font-size:1.5em;">dq : ' + info.data.dq.toFixed(2) + dqFormat + '</span>'
+                ].join('');
+            }
+        },
+        series: [
+            {
+                name:'System',
+                type:'treemap',
+                itemStyle: {
+                    normal: {
+                        borderColor: '#fff'
+                    }
+                },
+                levels: this.getLevelOption(),
+                breadcrumb: {
+                    show: false
+                },
+                roam: false,
+                nodeClick: 'link',
+                data: data,
+                width: '95%',
+                bottom : 0
+            }
+        ]
+    };
+    this.resizeTreeMap();
+    this.chartOption = option;
+  };
+  
+
+  renderData(){
+    var url_organization = this.servicecService.config.uri.organization;
+    this.http.get(url_organization).subscribe(data => {
+      let orgWithMeasure = data;
+      var orgNode = null;
+      for(let orgName in orgWithMeasure){
+        orgNode = new Object();
+        orgNode.name = orgName;
+        orgNode.measureMap = orgWithMeasure[orgName];
+        this.orgs.push(orgNode);
+      }
+      this.originalOrgs = this.orgs;
+      let url_dashboard = this.servicecService.config.uri.dashboard;
+      this.http.post(url_dashboard, {"query": {"match_all":{}},  "sort": [{"tmst": {"order": "asc"}}],"size":1000}).subscribe(data => {
+            this.originalData = JSON.parse(JSON.stringify(data));
+            this.myData = JSON.parse(JSON.stringify(this.originalData.hits.hits));
+            this.metricName = [];
+            for(var i = 0;i<this.myData.length;i++){
+                this.metricName.push(this.myData[i]._source.name);
+            }
+            this.metricNameUnique = [];
+            for(let name of this.metricName){
+                if(this.metricNameUnique.indexOf(name) === -1){
+                    this.metricData[this.metricNameUnique.length] = new Array();
+                    this.metricNameUnique.push(name);
+                }
+            };
+            for(var i = 0;i<this.myData.length;i++){
+                for(var j = 0 ;j<this.metricNameUnique.length;j++){
+                    if(this.myData[i]._source.name==this.metricNameUnique[j]){
+                        this.metricData[j].push(this.myData[i]);
+                    }
+                }
+            }
+            for(let sys of this.originalOrgs){
+                var node = null;
+                node = new Object();
+                node.name = sys.name;
+                node.dq = 0;
+                node.metrics = new Array();
+                for (let metric of this.metricData){
+                    if(sys.measureMap.indexOf(metric[metric.length-1]._source.name)!= -1){
+                        var metricNode = {
+                            'name':'',
+                            'timestamp':'',
+                            'dq':0,
+                            'details':[]
+                        }
+                        metricNode.name = metric[metric.length-1]._source.name;
+                        metricNode.timestamp = metric[metric.length-1]._source.tmst;
+                        metricNode.dq = metric[metric.length-1]._source.matched/metric[metric.length-1]._source.total*100;
+                        metricNode.details = metric;
+                        node.metrics.push(metricNode);
+                    }
+                }
+                this.finalData.push(node);
+            }
+            console.log(this.finalData);
+            var self = this;
+            setTimeout(function function_name(argument) {
+              // body...
+              self.renderTreeMap(self.finalData);
+            })
+            return JSON.parse(JSON.stringify(this.finalData));
+      });
+    });
+  };
+
+  ngOnInit() {
+    var self = this;
+    this.renderData();
+       // this.renderTreeMap(this.getMetricService.renderData());
+       // setTimeout(function function_name(argument) {
+       //   // body...
+       //     self.renderTreeMap(self.renderData());
+
+       // })
+  };
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/job/create-job/create-job.component.css
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/job/create-job/create-job.component.css b/ui/angular/src/app/job/create-job/create-job.component.css
new file mode 100644
index 0000000..0bfb175
--- /dev/null
+++ b/ui/angular/src/app/job/create-job/create-job.component.css
@@ -0,0 +1,66 @@
+/*
+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.
+*/
+.job{
+	font-size: 20px;
+}
+
+.info{
+	color: #b2c831;
+}
+
+legend{
+    background-color: #1f1f1f;
+     color: #007AFF; 
+    left: 10px;
+    padding: 0 10px;
+    position: absolute;
+    top: -12px;
+    font-weight: 400;
+    color: #fff;
+    margin-bottom: 20px;
+    font-size: 21px;
+    width: auto!important;
+    border: none!important;
+}
+fieldset {
+    border: 1px solid #e6e8e8;
+    border-radius: 5px;
+    margin: 20px 0;
+    padding: 25px;
+    position: relative;
+    min-width: 0;
+    display: block;
+    height: 320px;
+}
+.setcolor{
+	color: #b2c831;
+}
+.setgrey{
+	color: #888888;
+}
+.mat-calendar-table{
+	height: 400px;
+}
+.mat-datepicker-content{
+	overflow-y: auto;
+}
+
+#md-datepicker-0{
+	height:250px;
+}
\ No newline at end of file