http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/sidebar/sidebar.component.css
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/sidebar/sidebar.component.css 
b/ui/angular/src/app/sidebar/sidebar.component.css
new file mode 100644
index 0000000..5c74f3a
--- /dev/null
+++ b/ui/angular/src/app/sidebar/sidebar.component.css
@@ -0,0 +1,219 @@
+/*
+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.
+*/
+.sidebar-stat-center{
+       padding:10px 0;
+       display: flex;
+       align-items: center
+}
+
+.sidebar-stat-center>img{
+       max-width:24px;
+       margin-right:5px;
+}
+
+.sidebar-stat-center>span{
+       font-size:18px;
+       color:#fff
+}
+
+.well{
+       padding:0px;
+       background:transparent;
+       border:0px;
+       position:relative;
+}
+
+.well .faChevron{
+       color: white;
+}
+
+.panel-group{
+       margin-bottom:0px;
+       background:transparent;
+}
+
+.panel-default{
+       position:relative;
+       background:transparent;
+       border-color: #262626;
+}
+
+.side-bar-scroll{
+       padding:0px;
+       background:transparent;
+       border:0px;
+}
+
+.sideBar{
+       overflow:scroll;
+       height:650px;
+       overflow-x: hidden;
+}
+
+.sideBar::-webkit-scrollbar-track
+{
+       -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
+       border-radius: 10px;
+       background-color: #F5F5F5;
+}
+
+.sideBar::-webkit-scrollbar
+{
+       width: 12px;
+       border-radius: 10px;
+       background-color: #F5F5F5;
+}
+
+.sideBar::-webkit-scrollbar-thumb
+{
+       border-radius: 10px;
+       -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
+       background-color: #D62929;
+}
+
+.well .side-metrics{
+  font-size: 14px;
+}
+.well .faArrows{
+       background:#ff5c33;
+       color:black;
+}
+
+.well .side-date{
+       color: white;
+       /*position: absolute;*/
+       /*left: 80px;*/
+       /*margin-left: 10px;*/
+}
+
+.well .side-name{
+       color: #999966;
+       /*position: absolute;*/
+       /*left: 210px;*/
+       /*margin-left: 20px;*/
+}
+
+a>.side-name:hover{
+       color: #b2c831;
+       /*position: absolute;*/
+       /*left: 210px;*/
+       /*margin-left: 20px;*/
+}
+
+.well .side-percent{
+       color: #40bf80;
+       /*position: absolute;*/
+       /*left: 390px;*/
+}
+
+.well .side-percent-red{
+       color: #f00;
+}
+
+#gprs{
+  position: absolute;
+  top:5px;
+  clip: rect(0, 50px, 50px, 0);
+  top: -8px;
+  /* clip: shape(top, right, bottom, left); NB 'rect' is the only available 
option */
+}
+
+.well-next{
+       padding:0px;
+       background:#262626;
+       border:0px;
+       position:relative;
+}
+
+.vcenter {
+    display: inline-block;
+    vertical-align: middle;
+    float: none;
+}
+
+/*side-bar end*/
+
+/* led start */
+.led-red {
+    /*margin: 20px auto;*/
+    margin-top: -26px;
+    margin-left: 180px;
+    width: 12px;
+    height: 12px;
+    background-color: #940;
+    border-radius: 50%;
+    box-shadow: #000 0 -1px 7px 1px, inset #600 0 -1px 9px, #F00 0 2px 12px;
+}
+
+.led-yellow {
+    /*margin: 20px auto;*/
+    /*margin-top: -26px;
+    margin-left: 180px;*/
+    width: 12px;
+    height: 12px;
+    background-color: #A90;
+    border-radius: 50%;
+    box-shadow: #000 0 -1px 7px 1px, inset #660 0 -1px 9px, #DD0 0 2px 12px;
+}
+
+.led-green {
+    /*margin: 20px auto;*/
+    /*margin-top: -26px;
+    margin-left: 180px;*/
+    width: 12px;
+    height: 12px;
+    background-color: #690;
+    border-radius: 50%;
+    box-shadow: #000 0 -1px 7px 1px, inset #460 0 -1px 9px, #7D0 0 2px 12px;
+}
+/* led end   */
+
+@media (max-width: 1200px) {
+       #sidebar-option {
+               height: auto;
+               display: block;
+       }
+}
+
+@media (min-width: 1200px) {
+       #sidebar-option {
+               height: 180px;
+               display: flex;
+               align-items: center;
+       }
+}
+
+.bark-link{
+       cursor: pointer;
+       text-decoration: none;
+       color:white;
+}
+
+.bark-link:hover{
+       color:white;
+}
+
+#side-bar-metrics{
+       margin-top:20px;
+       overflow-y:auto;
+       overflow-x:hidden;
+       margin-left:0;
+       margin-right:0;
+       height:auto;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/sidebar/sidebar.component.html
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/sidebar/sidebar.component.html 
b/ui/angular/src/app/sidebar/sidebar.component.html
new file mode 100644
index 0000000..deeb94f
--- /dev/null
+++ b/ui/angular/src/app/sidebar/sidebar.component.html
@@ -0,0 +1,84 @@
+<!--
+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 id="rightbar" (window:resize)="onResize($event)" class="" 
style="background-color:#262626;">
+    <div id="side-bar-stats" class="row" style="border-bottom:5px solid 
#060606;margin-left:0;margin-right:0">
+        <div class="col-xs-15 col-md-15 col-lg-6 " id="sidebar-option">
+            <div>
+                <div class="sidebar-stat-center">
+                    <i class="fa fa-table" aria-hidden="true"></i>
+                    <span><a class="bark-link" routerLink="/dataassets">
+                    &nbsp;DataAssets</a></span>
+                </div>
+                <div class="sidebar-stat-center">
+                       <i class="fa fa-line-chart" aria-hidden="true"></i>
+                    <span><a class="bark-link" routerLink="/metrics" >
+                    &nbsp;DQ Metrics</a></span>
+                </div>
+            </div>
+        </div>
+        <div class="col-xs-12 col-md-12 col-lg-6">
+            <div id="data-asset-pie"></div>
+        </div>
+    </div>
+    <div id="side-bar-metrics" class="row">
+        <div *ngFor="let outerItems of finalData;let parent=index">
+            <div class="well">
+                <div class="col-sm-4 col-lg-4 col-md-4 ">
+                <h4 >
+                <a routerLink="/metrics/{{outerItems.name}}"> 
{{outerItems.name}}</a>
+                </h4>
+                </div>
+                <div class="col-sm-3 col-lg-3 col-md-3 " style="display: 
flex;justify-content: center;height:46px;">
+                <!-- <div [ngClass]="outerItems.dq >=90 ? 
'led-green':'led-yellow'" style="align-self: center;"></div> -->
+                </div>
+                <!-- <div class="col-sm-5 col-lg-5 col-md-5 " style="display: 
flex;justify-content: center;height:46px;"><a style="align-self: center;" 
class="btn btn-primary" href="https://github.com/eBay/DQSolution/issues"; 
target="_blank">Report&nbsp;issue</a></div> -->
+            </div>
+            <br/>
+            <div class="well side-bar-scroll">
+                <div class="panel-group" *ngFor="let items of 
outerItems.metrics;let i=index;">
+                    <div class="panel panel-default" style="margin-right: 
10px;">
+                        <div class="panel-heading" 
style="background:transparent;">
+                            <h4 class="panel-title side-metrics">
+                                <a style="cursor: pointer;" 
+                                 (click)="draw(items,parent, i);" 
+                                >
+                                    <!-- <i class="faChevron" 
+                                    [ngClass]="items.tag ? 'fa 
fa-caret-right':'fa fa-caret-down'" style="width:10px"></i> -->
+                                    <i class="fa fa-line-chart faArrows"></i>
+                                    <span class="side-date">{{items.timestamp 
| date:'short' }}</span>
+                                    &nbsp;&nbsp;
+                                    <span class="side-name" 
title="{{items.name}}">{{items.name }}</span>
+                                    <!-- <span ng-if="items.dq <= 100" 
class="pull-right" 
[ngClass]="items.dqfail?'side-percent-red':'side-percent'">{{items.dq}}%</span> 
-->
+                                    <!-- <span ng-if="items.dq > 100" 
class="pull-right" 
[ngClass]="items.dqfail?'side-percent-red':''">{{items.dq/1000}}K</span> -->
+                                </a>
+                            </h4>
+                        </div>
+                        <div id={{outerItems.name+i}} class="panel-collapse 
collapse" >
+                            <div class="panel-body" 
style="cursor:pointer;padding:0px 15px;border-top-width: 0;">
+                                <div id="chart{{parent}}-{{i}}" 
class="side-chart" echarts [options]="getOption(parent,i)" 
+                                ></div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/app/sidebar/sidebar.component.spec.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/sidebar/sidebar.component.spec.ts 
b/ui/angular/src/app/sidebar/sidebar.component.spec.ts
new file mode 100644
index 0000000..528bab2
--- /dev/null
+++ b/ui/angular/src/app/sidebar/sidebar.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 { SidebarComponent } from './sidebar.component';
+
+describe('SidebarComponent', () => {
+  let component: SidebarComponent;
+  let fixture: ComponentFixture<SidebarComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ SidebarComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(SidebarComponent);
+    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/sidebar/sidebar.component.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/app/sidebar/sidebar.component.ts 
b/ui/angular/src/app/sidebar/sidebar.component.ts
new file mode 100644
index 0000000..b0c2211
--- /dev/null
+++ b/ui/angular/src/app/sidebar/sidebar.component.ts
@@ -0,0 +1,178 @@
+/*
+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 {ChartService} from '../service/chart.service';
+import  {DatePipe} from '@angular/common';
+import {ServiceService} from '../service/service.service';
+// import {GetMetricService} from '../service/get-metric.service';
+import * as $ from 'jquery';
+
+@Component({
+  selector: 'app-sidebar',
+  templateUrl: './sidebar.component.html',
+  styleUrls: ['./sidebar.component.css'],
+  providers:[ChartService,ServiceService]
+})
+export class SidebarComponent implements OnInit {
+
+  constructor(private http: HttpClient,
+       private router:Router,
+    public servicecService:ServiceService,
+       public chartService:ChartService) {
+  }
+
+  orgs = [];
+  finalData = [];
+  originalOrgs = [];
+  status:{
+       'health':number,
+       'invalid':number
+  };
+  metricData = [];
+  originalData :any;
+  metricName = [];
+  metricNameUnique = [];
+  myData = [];
+  chartOption = new Map();
+  // var formatUtil = echarts.format;
+
+  pageInit() {
+    // var allDataassets = this.servicecService.config.uri.dataassetlist;
+    var health_url = this.servicecService.config.uri.statistics;
+        this.http.get(health_url).subscribe(data => {
+          // this.status.health = data.healthyJobCount;
+          // this.status.invalid = data.jobCount - data.healthyJobCount;
+          // renderDataAssetPie(this.status);
+          this.sideBarList(null);
+        },err => {});
+  }
+  
+  onResize(event){
+    console.log('sidebar resize');
+    if(window.innerWidth < 992) {
+      $('#rightbar').css('display', 'none');
+    } else {
+      $('#rightbar').css('display', 'block');
+      this.resizeSideChart();
+    }
+  }
+
+  resizeSideChart(){
+    $('#side-bar-metrics').css({
+           height: 
$('#mainContent').height()-$('#side-bar-stats').outerHeight()+70
+    });
+    for(let i=0;i<this.finalData.length;i++){
+      for(let j=0;j<this.finalData[i].metrics.length;j++){
+        if (!this.finalData[i].metrics[j].tag) {
+          this.draw(this.finalData[i].metrics[j], i, j);
+        }
+      }
+    }
+  }
+
+   draw (metric, parentIndex, index) {
+               
$('#'+this.finalData[parentIndex].name+index).toggleClass('collapse');
+       var chartId = 'chart' + parentIndex + '-' + index;
+       document.getElementById(chartId).style.width = 
($('.panel-heading').innerWidth()-40)+'px';
+       document.getElementById(chartId).style.height = '200px';
+       this.chartOption.set(chartId,this.chartService.getOptionSide(metric));
+       var self = this;
+       $('#'+chartId).unbind('click');
+       $('#'+chartId).click(function(e) {
+         
self.router.navigate(['/detailed/'+self.finalData[parentIndex].metrics[index].name])
 ;
+       });
+   };
+
+   getOption(parent,i){
+       return this.chartOption.get('chart'+parent+'-'+i);
+   }
+
+    sideBarList(sysName){
+       // this.finalData = this.getMetricService.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.originalData = 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);
+            // return JSON.parse(JSON.stringify(this.finalData));
+            return this.finalData;
+      });
+    });
+    }
+
+  ngOnInit() {
+       this.sideBarList(null);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/.gitkeep
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/.gitkeep b/ui/angular/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/1.PNG
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/1.PNG b/ui/angular/src/assets/img/1.PNG
new file mode 100644
index 0000000..e9a3063
Binary files /dev/null and b/ui/angular/src/assets/img/1.PNG differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/2.PNG
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/2.PNG b/ui/angular/src/assets/img/2.PNG
new file mode 100644
index 0000000..af12dc4
Binary files /dev/null and b/ui/angular/src/assets/img/2.PNG differ

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

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/bollinger.png
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/bollinger.png 
b/ui/angular/src/assets/img/bollinger.png
new file mode 100644
index 0000000..efb1f49
Binary files /dev/null and b/ui/angular/src/assets/img/bollinger.png differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/construction.gif
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/construction.gif 
b/ui/angular/src/assets/img/construction.gif
new file mode 100644
index 0000000..7d03450
Binary files /dev/null and b/ui/angular/src/assets/img/construction.gif differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/favicon.ico
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/favicon.ico 
b/ui/angular/src/assets/img/favicon.ico
new file mode 100644
index 0000000..c5ccacf
Binary files /dev/null and b/ui/angular/src/assets/img/favicon.ico differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/logo.gif
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/logo.gif 
b/ui/angular/src/assets/img/logo.gif
new file mode 100644
index 0000000..bf26825
Binary files /dev/null and b/ui/angular/src/assets/img/logo.gif differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/logo.png
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/logo.png 
b/ui/angular/src/assets/img/logo.png
new file mode 100644
index 0000000..ee1a9e6
Binary files /dev/null and b/ui/angular/src/assets/img/logo.png differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/mad.png
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/mad.png 
b/ui/angular/src/assets/img/mad.png
new file mode 100644
index 0000000..aa85a76
Binary files /dev/null and b/ui/angular/src/assets/img/mad.png differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/sidebar1.png
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/sidebar1.png 
b/ui/angular/src/assets/img/sidebar1.png
new file mode 100644
index 0000000..6a64412
Binary files /dev/null and b/ui/angular/src/assets/img/sidebar1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/sidebar2.png
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/sidebar2.png 
b/ui/angular/src/assets/img/sidebar2.png
new file mode 100644
index 0000000..425b863
Binary files /dev/null and b/ui/angular/src/assets/img/sidebar2.png differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/assets/img/yoy.png
----------------------------------------------------------------------
diff --git a/ui/angular/src/assets/img/yoy.png 
b/ui/angular/src/assets/img/yoy.png
new file mode 100644
index 0000000..2f071ac
Binary files /dev/null and b/ui/angular/src/assets/img/yoy.png differ

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/environments/environment.js
----------------------------------------------------------------------
diff --git a/ui/angular/src/environments/environment.js 
b/ui/angular/src/environments/environment.js
new file mode 100644
index 0000000..d107811
--- /dev/null
+++ b/ui/angular/src/environments/environment.js
@@ -0,0 +1,27 @@
+/*
+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";
+// The file contents for the current environment will overwrite these during 
build.
+// The build system defaults to the dev environment which uses 
`environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in 
`.angular-cli.json`.
+exports.__esModule = true;
+exports.environment = {
+    production: false
+};

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/environments/environment.prod.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/environments/environment.prod.ts 
b/ui/angular/src/environments/environment.prod.ts
new file mode 100644
index 0000000..c14cbe9
--- /dev/null
+++ b/ui/angular/src/environments/environment.prod.ts
@@ -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.
+*/
+export const environment = {
+  production: true
+};

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/environments/environment.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/environments/environment.ts 
b/ui/angular/src/environments/environment.ts
new file mode 100644
index 0000000..0fd1aad
--- /dev/null
+++ b/ui/angular/src/environments/environment.ts
@@ -0,0 +1,26 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+// The file contents for the current environment will overwrite these during 
build.
+// The build system defaults to the dev environment which uses 
`environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in 
`.angular-cli.json`.
+
+export const environment = {
+  production: false
+};

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

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/index.html
----------------------------------------------------------------------
diff --git a/ui/angular/src/index.html b/ui/angular/src/index.html
new file mode 100644
index 0000000..0cd5c79
--- /dev/null
+++ b/ui/angular/src/index.html
@@ -0,0 +1,41 @@
+<!--
+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.
+-->
+<!doctype html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <meta name="description" content="">
+  <meta name="author" content="">
+  <link rel="icon" href="/favicon.ico">
+  <title>Griffin - Data Quality Service</title>
+  <base href="/">
+  <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media 
queries -->
+  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+  <!--[if lt IE 9]>
+  <script 
src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js";></script>
+  <script 
src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js";></script>
+  <![endif]-->
+</head>
+<body>
+
+<app-root></app-root>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/main.js
----------------------------------------------------------------------
diff --git a/ui/angular/src/main.js b/ui/angular/src/main.js
new file mode 100644
index 0000000..7000f8e
--- /dev/null
+++ b/ui/angular/src/main.js
@@ -0,0 +1,32 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+"use strict";
+exports.__esModule = true;
+var core_1 = require("@angular/core");
+var platform_browser_dynamic_1 = require("@angular/platform-browser-dynamic");
+var app_module_1 = require("./app/app.module");
+var environment_1 = require("./environments/environment");
+require("jquery");
+// import  'bootstrap';
+// import 'bootstrap/dist/css/bootstrap.css';
+require("bootstrap/dist/css/bootstrap.css");
+if (environment_1.environment.production) {
+    core_1.enableProdMode();
+}
+platform_browser_dynamic_1.platformBrowserDynamic().bootstrapModule(app_module_1.AppModule);

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/main.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/main.ts b/ui/angular/src/main.ts
new file mode 100644
index 0000000..a1450f6
--- /dev/null
+++ b/ui/angular/src/main.ts
@@ -0,0 +1,35 @@
+/*
+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 { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+import { RouterModule, Routes } from '@angular/router';
+import {HttpClientModule} from '@angular/common/http';
+import { Ng2SmartTableModule } from 'ng2-smart-table';
+import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
+
+import 'bootstrap/dist/css/bootstrap.css';
+
+if (environment.production) {
+  enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule);

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/polyfills.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/polyfills.ts b/ui/angular/src/polyfills.ts
new file mode 100644
index 0000000..3ab322a
--- /dev/null
+++ b/ui/angular/src/polyfills.ts
@@ -0,0 +1,90 @@
+/*
+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.
+*/
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ *   1. Browser polyfills. These are applied before loading ZoneJS and are 
sorted by browsers.
+ *   2. Application imports. Files imported after ZoneJS that should be loaded 
before your main
+ *      file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions 
of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 
(including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+// import 'core-js/es6/symbol';
+// import 'core-js/es6/object';
+// import 'core-js/es6/function';
+// import 'core-js/es6/parse-int';
+// import 'core-js/es6/parse-float';
+// import 'core-js/es6/number';
+// import 'core-js/es6/math';
+// import 'core-js/es6/string';
+// import 'core-js/es6/date';
+// import 'core-js/es6/array';
+// import 'core-js/es6/regexp';
+// import 'core-js/es6/map';
+// import 'core-js/es6/weak-map';
+// import 'core-js/es6/set';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js';  // Run `npm install --save classlist.js`.
+
+/** Evergreen browsers require these. **/
+import 'core-js/es6/reflect';
+import 'core-js/es7/reflect';
+
+
+/**
+ * Required to support Web Animations `@angular/animation`.
+ * Needed for: All but Chrome, Firefox and Opera. 
http://caniuse.com/#feat=web-animation
+ **/
+// import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+
+
+/***************************************************************************************************
+ * Zone JS is required by Angular itself.
+ */
+import 'zone.js/dist/zone';  // Included with Angular CLI.
+
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
+
+/**
+ * Date, currency, decimal and percent pipes.
+ * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
+ */
+// import 'intl';  // Run `npm install --save intl`.
+/**
+ * Need to import at least one locale-data with intl.
+ */
+// import 'intl/locale-data/jsonp/en';

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/styles.css
----------------------------------------------------------------------
diff --git a/ui/angular/src/styles.css b/ui/angular/src/styles.css
new file mode 100644
index 0000000..6e85b67
--- /dev/null
+++ b/ui/angular/src/styles.css
@@ -0,0 +1,1134 @@
+/* You can add global styles to this file, and also import other style files */
+/*
+ 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');
+@import url('../node_modules/font-awesome/css/font-awesome.css');
+@import "~@angular/material/prebuilt-themes/indigo-pink.css";
+@import url('../node_modules/angular2-toaster/toaster.css');
+
+
+/*@import 
url('https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css');*/
+/**********BASE CONFIGURATIONS**********/
+body {
+  background:#1f1f1f;
+    font-family: 'Open Sans', sans-serif;
+    height: 100%;
+}
+
+html{
+  height: 100%;
+}
+
+h1 {
+font-family: 'Raleway', sans-serif;}
+
+h3,h4 , h5 {
+  font-family: 'Open Sans', sans-serif;
+  font-weight:lighter;
+}
+
+h2{
+  font-size:22px;
+}
+
+h3 {
+  font-size:46px;
+  color:#b2c831
+}
+
+h5 {
+  color:#b2c831;
+  margin-left:5px;
+}
+
+/***********BLOCKS & WRAPS***********/
+
+/*--- Dash Unit / Used in Dashboard page ---*/
+.dash-unit {
+  margin-bottom: 30px;
+  padding-bottom:10px;
+  border: 1px solid #383737;
+  /*background-image:url('../img/sep-half.png');*/
+  background-color: #3d3d3d;
+  color:white;
+  height:290px;
+}
+
+.dash-unit:hover {
+  background-color: #4f4f4f;
+  -moz-box-shadow:    3px 3px 2px 0px #151515;
+    -webkit-box-shadow: 3px 3px 2px 0px #151515;
+    box-shadow:         3px 3px 2px 0px #151515;
+
+}
+
+.dash-unit dtitle {
+  font-size:11px;
+  text-transform:uppercase;
+  color:#ffffff;
+  margin:8px;
+  padding:0px;
+  height:inherit
+  }
+
+.dash-unit hr {
+    border: 0;
+    border-top: 1px solid #151515;
+    border-top-style: dashed;
+  margin-top:3px;
+}
+
+.dash-unit h1 {
+  font-family: 'Raleway', sans-serif;
+  font-weight:300;
+  font-size: 20px;
+  line-height: 2px;
+  letter-spacing: 0px;
+  color: #ffffff;
+  padding-top:10px;
+  padding-left:5px;
+  margin-top:2px;
+  text-align:center;
+}
+
+.dash-unit h2 {
+  font-family: 'Open Sans', sans-serif;
+  font-weight: bold;
+  font-size: 30px;
+  line-height: 26px;
+  letter-spacing: 0px;
+  color: #ffffff;
+  padding-top:10px;
+  padding-left:5px;
+  margin-top:2px;
+  text-align:center;
+}
+
+
+.dash-unit h3 {
+  font-weight:300;
+  font-size: 15px;
+  line-height: 2px;
+  letter-spacing: 0px;
+  color: #b2c831;
+  padding-top:10px;
+  padding-left:5px;
+  margin-top:2px;
+  text-align:center;
+}
+
+
+.dash-unit p {
+  font-size: 14px;
+  font-weight: 200;
+  line-height: 16px;
+  color: inherit;
+  margin: 0 0 10px;
+  padding:5px;
+ }
+
+.dash-unit h4 {
+  padding-left:5px;
+  margin-top:2px;
+  font-size: 13px;
+  font-weight:lighter;
+  line-height: 1;
+  letter-spacing: 0px;
+  color: #fff;
+}
+
+.dash-unit bold{
+  font-family: 'Open Sans', sans-serif;
+  font-size:26px;
+  font-weight:bold;
+  color:#fff;
+  vertical-align:middle;
+}
+
+
+/**********Half-Unit / Used in index.html**********/
+.half-unit {
+  margin-bottom: 30px;
+  padding-bottom: 4px;
+  border: 1px solid #383737;
+  /*background-image:url('../img/sep-half.png');*/
+  background-color: #3d3d3d;
+  color:white;
+  height:130px;
+}
+
+.half-unit:hover {
+  background-color: #4f4f4f;
+  -moz-box-shadow:    3px 3px 2px 0px #151515;
+    -webkit-box-shadow: 3px 3px 2px 0px #151515;
+    box-shadow:         3px 3px 2px 0px #151515;
+
+}
+
+.half-unit dtitle {
+  font-size:10px;
+  text-transform:uppercase;
+  color:#ffffff;
+  margin:8px;
+  padding:0px;
+  height:inherit
+  }
+
+.half-unit hr {
+    border: 0;
+    border-top: 1px solid #151515;
+    border-top-style: dashed;
+  margin-top:3px;
+}
+
+.half-unit h1 {
+  font-family: 'Raleway', sans-serif;
+  font-weight:300;
+  font-size: 20px;
+  line-height: 1;
+  letter-spacing: 0px;
+  color: #ffffff;
+  padding-top:10px;
+  padding-left:5px;
+  margin-top:2px;
+  text-align:center;
+}
+
+.half-unit h4 {
+  padding-left:5px;
+  margin-top:2px;
+  font-size: 13px;
+  font-weight:lighter;
+  line-height: 1;
+  letter-spacing: 0px;
+  color: #fff;
+}
+
+
+.half-unit bold{
+  font-family: 'Open Sans', sans-serif;
+  font-size:26px;
+  font-weight:bold;
+  color:#fff;
+  vertical-align:middle;
+}
+
+/**********Styling Elements**********/
+.cont {
+  text-align:center;
+  margin-top:30px;
+}
+
+.cont ok {
+  color:#b2c831;
+}
+
+.cont bad {
+  color:#fa1d2d;
+}
+
+.cont2 {
+  text-align:center;
+  margin-top:-15px;
+  font-size:12px;
+  line-height:7px;
+}
+
+.cont2 bold{
+  font-size:10px;
+  font-weight:bold;
+  color:#b2c831
+}
+
+.text p {
+  font-family: 'Open Sans', sans-serif;
+  margin-left:8px;
+  font-size:14px;
+  line-height:18px;
+}
+
+.text grey {
+  font-size:11px;
+  color:silver
+}
+
+
+/***********Bootstrap Default Modifications***********/
+
+.thumbnail {
+  border:0px;
+  text-align:center;
+  -webkit-box-shadow: 0px;
+     -moz-box-shadow: 0px;
+          box-shadow: 0px;
+    background: none;
+    text-align: center;
+
+}
+.modal {
+  background: rgba(0,0,0,0.6);
+}
+
+.modal-header {
+  /*background-image:url('../img/sep-half.png');*/
+  background-color: #4f4f4f;
+  color:#fff;
+}
+.modal-body{
+  background-color: #1f1f1f;
+}
+.modal-footer{
+  background-color: #1f1f1f;
+
+}
+
+.btn-circle {
+  width: 60px;
+  height: 30px;
+  padding: 4px 8px;
+  font-size: 16px;
+  line-height: 1.33;
+  border-radius: 15px 15px 15px 15px;
+
+  border-width:2px;
+  border-color:#2A9FD6;
+  cursor:pointer;
+}
+
+.btn-circle:hover{
+    /*background: #b2c831;
+    color:#000;*/
+}
+
+/*input[type=submit] {
+  font-family: 'Open Sans', sans-serif;
+  font-size: 15px;
+  background: #b2c831;
+  color: #fff;
+  border: none;
+  padding: 8px 28px 10px 26px;
+    *-webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+input[type=text], textarea {
+  background: #cdcbcc;
+  font-size: 13px;
+  display: block;
+  width: 100%;
+  border: none;
+  box-shadow: none;
+  height: 30px;
+  line-height: 18px;
+  padding: 0;
+  text-indent: 18px;
+  margin: 0 0 18px;
+}*/
+textarea {
+  line-height: 18px;
+  padding: 18px;
+  width: 100%;
+  text-indent: 0;
+}
+.textarea-container { margin: 0 18px; }
+.textarea-container textarea { margin-left: -18px; }
+#contact textarea { width: 100%; height: 45px; }
+
+
+.progress-bar {
+  background-color: #b2c831;
+}
+
+
+
+
+/***********LineIcons Styles***********/
+
+
+.info-user {
+  text-align:center;
+  font-size: 24px;
+  color: #b2c831;
+  }
+
+.fs1 {
+  padding:5px 5px 5px 5px;
+  position:relative;
+}
+
+.fs1:hover {
+  position:relative;
+  color: #fff;
+  cursor:pointer
+}
+
+.fs2 {
+  padding:5px 5px 5px 5px;
+  position:relative;
+  font-size:35px;
+  vertical-align: text-bottom
+}
+
+/**********Clock Configuration**********/
+
+digiclock {
+  font-size: 30px;
+  color: #fff;
+  text-align: center;
+  line-height: 60px;
+  margin-left: auto
+}
+
+.clockcenter {
+  text-align:center;
+}
+
+
+/**********Mail Style Configuration**********/
+
+.framemail {
+    cursor: default;
+}
+.framemail .window {
+    font-size: 0;
+    margin-top: -1px;
+    overflow: hidden;
+    margin-left: -18px;
+}
+.framemail .window .mail li {
+    background-color:#3d3d3d;
+    background-image: -webkit-linear-gradient(hsla(0,0%,100%,.05), 
hsla(0,0%,0%,.05));
+    background-image:    -moz-linear-gradient(hsla(0,0%,100%,.05), 
hsla(0,0%,0%,.05));
+    background-image:     -ms-linear-gradient(hsla(0,0%,100%,.05), 
hsla(0,0%,0%,.05));
+    background-image:      -o-linear-gradient(hsla(0,0%,100%,.05), 
hsla(0,0%,0%,.05));
+    background-image:         linear-gradient(hsla(0,0%,100%,.05), 
hsla(0,0%,0%,.05));
+    border-top: 1px solid #888;
+    position: relative;
+    margin-left:-18px;
+}
+.framemail .window .mail li:first-child {
+    border-top: none;
+}
+.framemail .window .mail li:hover {
+    background-color: #5d5b5b;
+}
+.framemail .window .mail li:after,
+.framemail .window .mail li:before {
+    border-left: 8px solid transparent;
+    border-top: 8px solid #df6;
+    content: '';
+    height: 0;
+    position: absolute;
+    right: 0;
+    top: 0;
+    width: 0;
+}
+.framemail .window .mail li:before {
+    border-top-color: #bbb;
+    border-width: 9px;
+}
+.framemail .window .mail li:nth-child(1):after,
+.framemail .window .mail li:nth-child(1):before {
+    border: none;
+}
+.framemail .window .mail li:nth-child(2):after {
+    border-top-color: #fa1d2d;
+}
+.framemail .window .mail li i {
+    display: inline-block;
+    height: 48px;
+    width: 6px;
+}
+.framemail .window .mail li .read {
+    background-color: #ddd;
+}
+.framemail .window .mail li .unread {
+    background: #b2c831;
+}
+.framemail .window .mail li img {
+    background: #819da2;
+    border-radius: 2px;
+    height: 36px;
+    left: 12px;
+    position: absolute;
+    top: 6px;
+    width: 36px;
+}
+.framemail .window .mail li p {
+    font: 13px/24px sans-serif;
+    left: 56px;
+    position: absolute;
+    top: 3px;
+}
+.framemail .window .mail li .sender {
+    color: #e9e8e8;
+    font-weight: bold;
+    text-shadow: 0 1px 1px hsla(0,0%,100%,.5);
+}
+.framemail .window .mail li .message {
+    color: #999;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    top: 21px;
+    white-space: nowrap;
+}
+.framemail .window .mail li .message strong {
+    color: #999;
+}
+.framemail .window .mail li .actions {
+    height: 16px;
+    position: absolute;
+    right: 19px;
+    text-align: right;
+    top: 0;
+    width: 96px;
+}
+.framemail .window .mail li .actions img {
+    background: none;
+    display: inline-block;
+    height: 16px;
+    margin-left: 6px;
+    opacity: .1;
+    position: relative;
+    width: 16px;
+}
+.framemail .window .mail li:hover .actions img {
+    opacity: .25;
+}
+.framemail .window .mail li .actions img:hover {
+    opacity: .75;
+}
+
+
+/**********DONUT CHARTS STYLES**********/
+#load {
+  width: 11.313em;
+  height: 11.313em;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  margin-bottom: 1.063em;
+  background-position: center center;
+  margin:auto;
+}
+
+#space {
+  width: 11.313em;
+  height: 11.313em;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  margin-bottom: 1.063em;
+  background-position: center center;
+  margin:auto;
+}
+
+
+/**********LINE AND BARS**********/
+
+.section-graph {
+  position: relative;
+  height: 130px;
+  color: #fff;
+  background-image: linear-gradient(color-stops(#b2c831, #b2c831 50%, #b2c831 
50%));
+  margin-bottom:20px;
+}
+.section-graph .graph-info {
+  z-index: 99;
+  position: absolute;
+  font-weight: bold;
+  margin-top: 12px;
+  margin-left: 21px;
+  width: 100px;
+}
+.section-graph .graph-info .graph-arrow {
+  width: 0;
+  height: 0;
+  margin-top: 18px;
+  border-left: 4px solid transparent;
+  border-right: 4px solid transparent;
+  border-bottom: 4px solid white;
+  float: left;
+}
+.section-graph .graph-info .graph-info-big {
+  font-size: 24px;
+  float: left;
+  margin-left: 3px;
+}
+.section-graph .graph-info .graph-info-small {
+  margin-left: 3px;
+  font-size: 12px;
+  font-weight: normal;
+  color: rgba(255, 255, 255, 0.5);
+  clear: left;
+  margin-left: 8px;
+}
+/*
+ * Info Section
+ */
+.info-aapl {
+  text-align: center;
+
+}
+.info-aapl ul {
+  margin-left:30%;
+
+}
+.info-aapl li {
+  margin: 0;
+  display: block;
+  width: 9px;
+  height: 40px;
+  margin-right: 6px;
+  background-color: #f5f0ec;
+  float:left;
+  position: relative;
+}
+.info-aapl li span {
+  display: block;
+  width: 9px;
+  height: 40px;
+  position: absolute;
+  bottom: 0;
+}
+.info-aapl li span.orange {
+  background-color: #fa1d2d;
+}
+.info-aapl li span.green {
+  background-color: #b2c831;
+}
+
+/**********TWITTER WIDGET **********/
+#jstwitter ul li{
+  color:#bdbdbd;
+  padding:.5em .75em;
+}
+
+#jstwitter ul{
+  margin-left:0;
+  list-style:none
+}
+
+#jstwitter:first-child{
+  border-top:0
+}
+
+ul#jstwitter li a{
+  font-size:10px;
+  font-style:italic;
+  color:#666;
+  text-decoration:none
+}
+
+/********** CUSTOMIZED BUTTON **********/
+.btnnew {
+  display: inline-block;
+  *border-left: 0 none #707070;
+  border-right: 0 none #707070;
+  border-top: 0 none #707070;
+  border-bottom: 0 none #707070;
+  display: inline;
+    padding: 4px 12px;
+    margin-bottom: 0;
+  *margin-left: .3em;
+    font-size: 14px;
+    line-height: 20px;
+    color: #b2c831;
+    text-align: center;
+    vertical-align: middle;
+    cursor: pointer;
+  background-color: #5a5a5a;
+  *background-color: #5a5a5a;
+    background-repeat: repeat-x;
+  *-webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+    zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px 
rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 
0, 0, 0.05);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 
0.05);
+  background-image: linear-gradient(to bottom, #707070, #707070);
+}
+
+/********** SWITCH BUTTON **********/
+.switch {
+  position: relative;
+  margin: 20px auto;
+  height: 26px;
+  width: 120px;
+  background: rgba(0, 0, 0, 0.25);
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px rgba(255, 255, 
255, 0.1);
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px rgba(255, 255, 255, 
0.1);
+}
+
+.switch-label {
+  position: relative;
+  z-index: 2;
+  float: left;
+  width: 58px;
+  line-height: 26px;
+  font-size: 11px;
+  color: rgba(255, 255, 255, 0.35);
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.45);
+  cursor: pointer;
+}
+.switch-label:active {
+  font-weight: bold;
+}
+
+.switch-label-off {
+  padding-left: 2px;
+}
+
+.switch-label-on {
+  padding-right: 2px;
+}
+
+/*
+ * Note: using adjacent or general sibling selectors combined with
+ *       pseudo classes doesn't work in Safari 5.0 and Chrome 12.
+ *       See this article for more info and a potential fix:
+ *       http://css-tricks.com/webkit-sibling-bug/
+ */
+.switch-input {
+  display: none;
+}
+.switch-input:checked + .switch-label {
+  font-weight: bold;
+  color: rgba(0, 0, 0, 0.65);
+  text-shadow: 0 1px rgba(255, 255, 255, 0.25);
+  -webkit-transition: 0.15s ease-out;
+  -moz-transition: 0.15s ease-out;
+  -o-transition: 0.15s ease-out;
+  transition: 0.15s ease-out;
+}
+.switch-input:checked + .switch-label-on ~ .switch-selection {
+  left: 60px;
+  /* Note: left: 50% doesn't transition in WebKit */
+}
+
+.switch-selection {
+  display: block;
+  position: absolute;
+  z-index: 1;
+  top: 2px;
+  left: 2px;
+  width: 58px;
+  height: 22px;
+  background: #b2c831;
+  border-radius: 3px;
+  background-image: -webkit-linear-gradient(top, #b6c753, #b2c831);
+  background-image: -moz-linear-gradient(top, #b6c753, #b2c831);
+  background-image: -o-linear-gradient(top, #b6c753, #b2c831);
+  background-image: linear-gradient(to bottom, #b6c753, #b2c831);
+  -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 
0, 0.2);
+  box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
+  -webkit-transition: left 0.15s ease-out;
+  -moz-transition: left 0.15s ease-out;
+  -o-transition: left 0.15s ease-out;
+  transition: left 0.15s ease-out;
+}
+.switch-blue .switch-selection {
+  background: #3aa2d0;
+  background-image: -webkit-linear-gradient(top, #4fc9ee, #3aa2d0);
+  background-image: -moz-linear-gradient(top, #4fc9ee, #3aa2d0);
+  background-image: -o-linear-gradient(top, #4fc9ee, #3aa2d0);
+  background-image: linear-gradient(to bottom, #4fc9ee, #3aa2d0);
+}
+.switch-yellow .switch-selection {
+  background: #fa1d2d;
+  background-image: -webkit-linear-gradient(top, #f93e4b, #fa1d2d);
+  background-image: -moz-linear-gradient(top, #f93e4b, #fa1d2d);
+  background-image: -o-linear-gradient(top, #f93e4b, #fa1d2d);
+  background-image: linear-gradient(to bottom, #f93e4b, #fa1d2d);
+}
+
+
+/**********Gauge Chart**********/
+#canvas {
+  display: block;
+  width: 150px;
+  margin: 30px auto;
+}
+
+/**********Accordion Styling**********/
+
+.accordion-group {
+  border: 1px solid #222;
+}
+.accordion-heading {
+  background-color: #5a5a5a;
+  *background-color: #5a5a5a;
+    background-repeat: repeat-x;
+  *-webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+    zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px 
rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 
0, 0, 0.05);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 
0.05);
+  background-image: linear-gradient(to bottom, #707070, #707070);
+}
+
+/**********Link Styling**********/
+a {
+  color: #b2c831;
+  text-decoration: none;
+}
+
+a:hover {
+  color: #dff948;
+  text-decoration: none;
+}
+
+.bark-link {
+  color: #b2c831;
+  text-decoration: underline;
+}
+
+.bark-link:hover {
+  color: #dff948;
+  text-decoration: none;
+}
+
+/**navigation bar**/
+.docs-search{
+  margin:10px 0;
+  border-radius:20px;
+  background:#626262;
+  vertical-align:middle;
+  padding:4px 0 4px 10px;
+}
+
+.docs-search input{
+  background:#626262;
+  border:0
+}
+
+.docs-search input:focus{
+  outline:none;
+  color:#fff;
+}
+
+.navbar-search {
+    position: relative;
+    float: left;
+    margin-top: 14px;
+    margin-bottom: 0;
+}
+
+.navbar-search .search-query {
+    padding: 4px 9px;
+    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
+    font-size: 13px;
+    font-weight: normal;
+    line-height: 1;
+    color: #ffffff;
+    background-color: #848484;
+    border: 1px solid #151515;
+    border-radius:14px;
+    -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 
255, 255, 0.15);
+    -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 
255, 255, 0.15);
+    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 
255, 0.15);
+    -webkit-transition: none;
+    -moz-transition: none;
+    -ms-transition: none;
+    -o-transition: none;
+    transition: none;
+}
+
+.navbar-search .search-query:disabled{
+    background-color: #626262;
+    cursor: not-allowed;
+}
+
+.navbar-search .search-query:-moz-placeholder {
+    color: #cccccc;
+}
+.navbar-search .search-query::-webkit-input-placeholder {
+    color: #cccccc;
+}
+.navbar-search .search-query:focus,.navbar-search .search-query.focused {
+    padding: 5px 10px;
+    color: #333333;
+    text-shadow: 0 1px 0 #ffffff;
+    background-color: #ffffff;
+    border: 0;
+    -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+    -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+    box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+    outline: 0;
+}
+
+
+
+/**********FooterWrap Section**********/
+@media (min-width: 992px) {
+    #footerwrap {
+      width: 75%;
+    }
+}
+
+@media (max-width: 991px) { 
+    #footerwrap {
+      width: 100%
+    }
+}
+
+#footerwrap {
+    padding-left: 30px;
+    height: 90px;
+    background:#1f1f1f;
+    padding-top:10px;
+    padding-bottom: 10px;
+    border-top-style: solid;
+    border-top-width:8px;
+    border-top-color:#1d1d1d;
+    /*overflow-y:auto;*/
+    z-index:200;
+
+}
+
+#footerwrap p {
+  color:white;
+  font-size:12px;
+  margin:0;
+}
+
+/*#footerwrap>.container-fluid{
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  transform:translateY(100%);
+  animation: scrolling 2s linear infinite;
+}
+
+@keyframes scrolling {
+ 0%   {
+ transform: translateY(0%);
+ }
+ 100% {
+ transform: translateY(-100%);
+ }
+}*/
+
+
+/***********FULLCALENDAR STYLE***********/
+
+#external-events {
+  padding: 0 10px;
+  border: 1px solid #8b8b8a;
+    background-color: #8b8b8a;
+    -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+            border-radius: 4px;
+  text-align: left;
+  }
+
+#external-events h4 {
+  font-size: 16px;
+  margin-top: 0;
+  padding-top: 1em;
+  }
+
+.external-event { /* try to mimick the look of a real event */
+  margin: 10px 0;
+  padding: 2px 4px;
+  background: #b2c831;
+  color: #fff;
+  font-size: .85em;
+  cursor: pointer;
+  }
+
+#external-events p {
+  margin: 1.5em 0;
+  font-size: 11px;
+  color: #b2c831;
+  }
+
+#external-events p input {
+  margin: 0;
+  vertical-align: middle;
+  }
+
+#calendar {
+  width:100%;
+  }
+
+.symbol.required:before {
+    content: "*";
+    display: inline;
+    color: #E6674A;
+}
+
+.has-success .symbol:before {
+    content: "\f00c";
+    display: inline;
+    font-family: FontAwesome;
+    color: #468847
+}
+
+.has-error .symbol:before {
+    content: "\f00d";
+    display: inline;
+    font-family: FontAwesome;
+    color: #C82E29
+}
+
+.text-small {
+    font-size: 12px!important
+}
+
+.has-error .error {
+    color: #a94442;
+}
+
+/**********Media Styles**********/
+
+@media (max-width: 360px){
+/*Calendar Adsjustments*/
+.fc-header {margin-top:15px;}
+.fc-header-title h2{font-size:10px; }
+.fc-header-right {display:none}
+}
+/* portrait tablet */
+@media (min-width: 767px) and (max-width: 768px) {
+  .info-aapl ul {
+      margin-left:10px;
+      float:left;
+}
+
+#load {
+  margin-left:5px;
+  margin-right:10px;
+}
+
+#space {
+  margin-left:5px;
+  margin-right:10px;
+}
+
+}
+
+/* Landscape iphone 5 and samsung galaxy */
+@media (min-width: 560px) and (max-width: 685px) {
+  .info-aapl ul {
+      margin-left:40%;
+  }
+
+}
+
+@media (min-width: 1024px) {
+  .modal-xg {
+    width: 1024px;
+  }
+}
+
+.form-control {
+  color: #000000;
+}
+
+tbody {
+  word-break:break-all;
+}
+
+
+/*style of job*/
+.page{
+  cursor: pointer;
+  float: left;
+  border-bottom-left-radius: 4px;
+  border-top-left-radius: 4px;
+  color: #fff;
+  text-decoration: underline;
+}
+
+.page-active{
+  background-color: #2a9fd6;
+  border-color: transparent;
+  cursor: default;
+}
+
+.normal{
+  background-color: #00C853;
+  border-radius: 5px; 
+  padding:3px 4px;
+}
+
+.unnormal{
+  background-color: #EF5350;
+  border-radius: 5px; 
+  padding:3px 4px;
+}
+
+#timePopup{
+  position: absolute;
+  z-index:1;
+  height:100px;
+  background-color:white; 
+  /*width:80%;*/
+  text-align: center;
+  border: 5px solid #c5c5c5;
+  border-radius: 3px;
+}
+
+#hourSelector{
+  width: 20%;
+  height: 100%;
+  display: inline-block;
+}
+
+#minuteSelector{
+  width:20%;
+  height:100%;
+  display: inline-block;
+  
+}
+
+
+#secondSelector{
+  width:20%;
+  height:100%;
+  display: inline-block;
+  
+}
+
+#pmam{
+  width:30%;
+  height:100%;
+  display: inline-block;
+}
+
+.division{
+  display: inline-block;
+  width:10%;
+  height:100%;
+  position:relative;
+  top: -30px;
+}
+
+.mask{
+  width:100%;
+  height:100%;
+  position:fixed;
+  top:0;
+  left:0;
+  z-index:1;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/test.html
----------------------------------------------------------------------
diff --git a/ui/angular/src/test.html b/ui/angular/src/test.html
new file mode 100644
index 0000000..201b5c0
--- /dev/null
+++ b/ui/angular/src/test.html
@@ -0,0 +1,41 @@
+<!--
+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.
+-->
+<!doctype html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <meta name="description" content="">
+  <meta name="author" content="">
+  <link rel="icon" href="/favicon.ico">
+  <title>Griffin - Data Quality Service</title>
+  <base href="/">
+  <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media 
queries -->
+  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+  <!--[if lt IE 9]>
+  <script 
src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js";></script>
+  <script 
src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js";></script>
+  <![endif]-->
+</head>
+<body>
+This is for test
+</body>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/test.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/test.ts b/ui/angular/src/test.ts
new file mode 100644
index 0000000..da41e46
--- /dev/null
+++ b/ui/angular/src/test.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.
+*/
+// This file is required by karma.conf.js and loads recursively all the .spec 
and framework files
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+import { getTestBed } from '@angular/core/testing';
+import {
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+// Unfortunately there's no typing for the `__karma__` variable. Just declare 
it as any.
+declare const __karma__: any;
+declare const require: any;
+
+// Prevent Karma from running prematurely.
+__karma__.loaded = function () {};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
+// Finally, start Karma to run the tests.
+__karma__.start();

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/tsconfig.app.json
----------------------------------------------------------------------
diff --git a/ui/angular/src/tsconfig.app.json b/ui/angular/src/tsconfig.app.json
new file mode 100644
index 0000000..39ba8db
--- /dev/null
+++ b/ui/angular/src/tsconfig.app.json
@@ -0,0 +1,13 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/app",
+    "baseUrl": "./",
+    "module": "es2015",
+    "types": []
+  },
+  "exclude": [
+    "test.ts",
+    "**/*.spec.ts"
+  ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/tsconfig.spec.json
----------------------------------------------------------------------
diff --git a/ui/angular/src/tsconfig.spec.json 
b/ui/angular/src/tsconfig.spec.json
new file mode 100644
index 0000000..63d89ff
--- /dev/null
+++ b/ui/angular/src/tsconfig.spec.json
@@ -0,0 +1,20 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/spec",
+    "baseUrl": "./",
+    "module": "commonjs",
+    "target": "es5",
+    "types": [
+      "jasmine",
+      "node"
+    ]
+  },
+  "files": [
+    "test.ts"
+  ],
+  "include": [
+    "**/*.spec.ts",
+    "**/*.d.ts"
+  ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/typings.d.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/typings.d.ts b/ui/angular/src/typings.d.ts
new file mode 100644
index 0000000..b0f9eed
--- /dev/null
+++ b/ui/angular/src/typings.d.ts
@@ -0,0 +1,23 @@
+/*
+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.
+*/
+/* SystemJS module definition */
+declare var module: NodeModule;
+interface NodeModule {
+  id: string;
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/src/vendor.ts
----------------------------------------------------------------------
diff --git a/ui/angular/src/vendor.ts b/ui/angular/src/vendor.ts
new file mode 100644
index 0000000..c777916
--- /dev/null
+++ b/ui/angular/src/vendor.ts
@@ -0,0 +1,33 @@
+/*
+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 '@angular/platform-browser';
+import '@angular/platform-browser-dynamic';
+import '@angular/core';
+import '@angular/common';
+import '@angular/http';
+import '@angular/router';
+
+
+
+// RxJS
+import 'rxjs';
+
+import 'jquery';
+import 'bootstrap/dist/js/bootstrap';
+import 'bootstrap-loader';
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/tsconfig.json
----------------------------------------------------------------------
diff --git a/ui/angular/tsconfig.json b/ui/angular/tsconfig.json
new file mode 100644
index 0000000..a6c016b
--- /dev/null
+++ b/ui/angular/tsconfig.json
@@ -0,0 +1,19 @@
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "outDir": "./dist/out-tsc",
+    "sourceMap": true,
+    "declaration": false,
+    "moduleResolution": "node",
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "target": "es5",
+    "typeRoots": [
+      "node_modules/@types"
+    ],
+    "lib": [
+      "es2017",
+      "dom"
+    ]
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/tslint.json
----------------------------------------------------------------------
diff --git a/ui/angular/tslint.json b/ui/angular/tslint.json
new file mode 100644
index 0000000..0db5751
--- /dev/null
+++ b/ui/angular/tslint.json
@@ -0,0 +1,142 @@
+{
+  "rulesDirectory": [
+    "node_modules/codelyzer"
+  ],
+  "rules": {
+    "arrow-return-shorthand": true,
+    "callable-types": true,
+    "class-name": true,
+    "comment-format": [
+      true,
+      "check-space"
+    ],
+    "curly": true,
+    "eofline": true,
+    "forin": true,
+    "import-blacklist": [
+      true,
+      "rxjs"
+    ],
+    "import-spacing": true,
+    "indent": [
+      true,
+      "spaces"
+    ],
+    "interface-over-type-literal": true,
+    "label-position": true,
+    "max-line-length": [
+      true,
+      140
+    ],
+    "member-access": false,
+    "member-ordering": [
+      true,
+      {
+        "order": [
+          "static-field",
+          "instance-field",
+          "static-method",
+          "instance-method"
+        ]
+      }
+    ],
+    "no-arg": true,
+    "no-bitwise": true,
+    "no-console": [
+      true,
+      "debug",
+      "info",
+      "time",
+      "timeEnd",
+      "trace"
+    ],
+    "no-construct": true,
+    "no-debugger": true,
+    "no-duplicate-super": true,
+    "no-empty": false,
+    "no-empty-interface": true,
+    "no-eval": true,
+    "no-inferrable-types": [
+      true,
+      "ignore-params"
+    ],
+    "no-misused-new": true,
+    "no-non-null-assertion": true,
+    "no-shadowed-variable": true,
+    "no-string-literal": false,
+    "no-string-throw": true,
+    "no-switch-case-fall-through": true,
+    "no-trailing-whitespace": true,
+    "no-unnecessary-initializer": true,
+    "no-unused-expression": true,
+    "no-use-before-declare": true,
+    "no-var-keyword": true,
+    "object-literal-sort-keys": false,
+    "one-line": [
+      true,
+      "check-open-brace",
+      "check-catch",
+      "check-else",
+      "check-whitespace"
+    ],
+    "prefer-const": true,
+    "quotemark": [
+      true,
+      "single"
+    ],
+    "radix": true,
+    "semicolon": [
+      true,
+      "always"
+    ],
+    "triple-equals": [
+      true,
+      "allow-null-check"
+    ],
+    "typedef-whitespace": [
+      true,
+      {
+        "call-signature": "nospace",
+        "index-signature": "nospace",
+        "parameter": "nospace",
+        "property-declaration": "nospace",
+        "variable-declaration": "nospace"
+      }
+    ],
+    "typeof-compare": true,
+    "unified-signatures": true,
+    "variable-name": false,
+    "whitespace": [
+      true,
+      "check-branch",
+      "check-decl",
+      "check-operator",
+      "check-separator",
+      "check-type"
+    ],
+    "directive-selector": [
+      true,
+      "attribute",
+      "app",
+      "camelCase"
+    ],
+    "component-selector": [
+      true,
+      "element",
+      "app",
+      "kebab-case"
+    ],
+    "use-input-property-decorator": true,
+    "use-output-property-decorator": true,
+    "use-host-property-decorator": true,
+    "no-input-rename": true,
+    "no-output-rename": true,
+    "use-life-cycle-interface": true,
+    "use-pipe-transform-interface": true,
+    "component-class-suffix": true,
+    "directive-class-suffix": true,
+    "no-access-missing-member": true,
+    "templates-use-public": true,
+    "invoke-injectable": true
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/angular/webpack.config.js
----------------------------------------------------------------------
diff --git a/ui/angular/webpack.config.js b/ui/angular/webpack.config.js
new file mode 100644
index 0000000..ad230c1
--- /dev/null
+++ b/ui/angular/webpack.config.js
@@ -0,0 +1,82 @@
+/*
+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.
+*/
+var webpack = require('webpack');
+var HtmlWebpackPlugin = require('html-webpack-plugin');
+module.exports = {
+
+    entry: {
+        'app':'./src/main.ts',
+        'vendor':'./src/vendor.ts',
+        'polyfills':'./src/polyfills.ts'
+    },
+    output: {
+        // path: '/dist',
+        filename: '[name].js'
+    },
+    module: {
+        rules: [
+          {
+            test: /\.ts$/,
+            loader: 'ts-loader'
+          },
+          {
+            test: /\.html$/,
+            loader: 'html-loader'
+          },
+          {
+            test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
+            loader: 'file-loader?name=assets/[name].[hash].[ext]'
+          },
+          {
+            test: /\.css$/,
+            loaders: 'style-loader!css-loader' 
+          },
+          {
+            test: /\.css$/,
+            loader: 'raw-loader'
+          }
+        ]
+    },
+
+    resolve: {
+        extensions: ['.js', '.ts']
+    },
+    plugins: [
+        new webpack.optimize.CommonsChunkPlugin({
+          name: ['app', 'vendor', 'polyfills','vendor.js']
+        }),
+    
+        new HtmlWebpackPlugin({
+          template: 'src/index.html'
+        }),
+
+        new webpack.ProvidePlugin({
+        $: 'jquery',
+        jQuery: 'jquery',
+        'window.jQuery': 'jquery',
+        jquery :'jquery',
+        Popper: ['popper.js', 'default'],
+        // In case you imported plugins individually, you must also require 
them here:
+        Util: "exports-loader?Util!bootstrap/js/dist/util",
+        Dropdown: "exports-loader?Dropdown!bootstrap/js/dist/dropdown",
+        echarts: "echarts"
+      })
+    ],
+    
+};

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/bower.json
----------------------------------------------------------------------
diff --git a/ui/bower.json b/ui/bower.json
deleted file mode 100644
index 1b77945..0000000
--- a/ui/bower.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "name": "griffin",
-  "version": "0.1.0",
-  "private": true,
-  "dependencies": {
-    "jquery": "2.1.4",
-    "jquery-ui":"1.12.1",
-    "bootswatch": "3.3.6",
-    "font-awesome": "4.7.0",
-    "angular": "1.6.4",
-    "angular-route": "1.6.4",
-    "angular-smart-table": "2.1.7",
-    "angular-cookies": "1.6.4",
-    "AngularJS-Toaster": "1.2.0",
-    "requirejs": "2.1.22",
-    "domReady": "2.0.1",
-    "angular-spinner": "0.8.0",
-    "echarts": "3.2.2",
-    "angular-animate": "1.6.4"
-  },
-  "resolutions": {
-    "angular": "1.6.4"
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/42ee8863/ui/build.xml
----------------------------------------------------------------------
diff --git a/ui/build.xml b/ui/build.xml
deleted file mode 100644
index 6e50575..0000000
--- a/ui/build.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-
-<assembly 
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
 http://maven.apache.org/xsd/assembly-1.1.2.xsd";>
-       <id>resources</id>
-       <formats>
-               <format>zip</format>
-       </formats>
-       <fileSets>
-               <fileSet>
-                       <directory>${project.basedir}</directory><!--
-                       <includes>
-
-                               <include>apidocs/**</include>
-                               <include>bower_components/**</include>
-                       
-                               <include>**/**</include>
-                       </includes>
-                       -->     
-                       <excludes>
-                               <exclude>**/node_modules/**</exclude>
-                               <exclude>**/tests/**</exclude>
-                               <exclude>target/**</exclude>
-                               <exclude>pom.xml</exclude>
-                               <exclude>build.xml</exclude>
-                       </excludes>
-                       <useDefaultExcludes>true</useDefaultExcludes>
-               </fileSet>
-
-       </fileSets>
-</assembly>
\ No newline at end of file

Reply via email to