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 + ' > </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