You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by zh...@apache.org on 2016/07/12 12:25:39 UTC

[1/5] kylin git commit: KYLIN-1786 UI for extended columns as measure

Repository: kylin
Updated Branches:
  refs/heads/master 95eb2ff7a -> 2b1f997e0


KYLIN-1786 UI for extended columns as measure


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/2b1f997e
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/2b1f997e
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/2b1f997e

Branch: refs/heads/master
Commit: 2b1f997e084b1f4153a3345971fe87a27380c3c0
Parents: e3b8be3
Author: Jason <ji...@163.com>
Authored: Tue Jul 12 20:25:05 2016 +0800
Committer: Jason <ji...@163.com>
Committed: Tue Jul 12 20:25:25 2016 +0800

----------------------------------------------------------------------
 webapp/app/js/controllers/cubeEdit.js          |  52 +++++++++
 webapp/app/js/controllers/cubeMeasures.js      |  60 +++++++----
 webapp/app/partials/cubeDesigner/measures.html | 111 +++++++++++++-------
 3 files changed, 165 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/2b1f997e/webapp/app/js/controllers/cubeEdit.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeEdit.js b/webapp/app/js/controllers/cubeEdit.js
index b6fc875..8475025 100755
--- a/webapp/app/js/controllers/cubeEdit.js
+++ b/webapp/app/js/controllers/cubeEdit.js
@@ -119,6 +119,58 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
   };
 
 
+  $scope.getExtendedColumns = function (measure) {
+    //metric from model
+    var me_columns = [];
+    if($scope.metaModel.model.metrics){
+      angular.forEach($scope.metaModel.model.metrics,function(metric,index){
+        me_columns.push(metric);
+      })
+    }
+    angular.forEach($scope.metaModel.model.dimensions,function(dimension,index){
+        if(dimension.columns){
+          me_columns = me_columns.concat(dimension.columns);
+        }
+    })
+
+    return me_columns;
+
+  };
+
+  $scope.getExtendedFactColumns = function (measure) {
+    var me_columns = [];
+    angular.forEach($scope.metaModel.model.dimensions,function(dimension,index){
+      if($scope.metaModel.model.fact_table !== dimension.table){
+        return;
+      }
+
+      if(dimension.columns){
+        me_columns = me_columns.concat(dimension.columns);
+      }
+    })
+
+    return me_columns;
+
+  };
+
+
+  $scope.getFactColumns = function () {
+    var me_columns = [];
+    angular.forEach($scope.cubeMetaFrame.dimensions,function(dimension,index){
+      if($scope.metaModel.model.fact_table !== dimension.table){
+        return;
+      }
+      if(dimension.column && dimension.derived == null){
+        me_columns.push(dimension.column);
+      }
+
+    });
+
+    return me_columns;
+
+  };
+
+
 
   $scope.getColumnType = function (_column, table) {
     var columns = $scope.getColumnsByTable(table);

http://git-wip-us.apache.org/repos/asf/kylin/blob/2b1f997e/webapp/app/js/controllers/cubeMeasures.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeMeasures.js b/webapp/app/js/controllers/cubeMeasures.js
index fb9d292..bb22a42 100644
--- a/webapp/app/js/controllers/cubeMeasures.js
+++ b/webapp/app/js/controllers/cubeMeasures.js
@@ -24,27 +24,30 @@ KylinApp.controller('CubeMeasuresCtrl', function ($scope, $modal,MetaModel,cubes
   $scope.addNewMeasure = function (measure) {
     $scope.nextParameters = [];
     $scope.newMeasure = (!!measure)? measure:CubeDescModel.createMeasure();
-    if(!!measure){
-      $scope.convertNextParameters();
+    //if(!!measure){
+    //  $scope.convertNextParameters();
+    //}
+    if(!!measure && measure.function.parameter.next_parameter){
+      $scope.nextPara.value = measure.function.parameter.next_parameter.value;
     }
   };
-  $scope.convertNextParameters = function(){
-    $scope.nextParameters = [];
-    var paramater = jQuery.extend(true, {}, $scope.newMeasure.function.parameter);
-    while(paramater.next_parameter){
-      var paraMeter =
-      {
-       "type": paramater.next_parameter.type,
-       "value":paramater.next_parameter.value,
-        "next_parameter":null
-      }
-      $scope.nextParameters.push(paraMeter);
-
-      paramater = paramater.next_parameter;
-
-    }
-
-  }
+  //$scope.convertNextParameters = function(){
+  //  $scope.nextParameters = [];
+  //  var paramater = jQuery.extend(true, {}, $scope.newMeasure.function.parameter);
+  //  while(paramater.next_parameter){
+  //    var paraMeter =
+  //    {
+  //     "type": paramater.next_parameter.type,
+  //     "value":paramater.next_parameter.value,
+  //      "next_parameter":null
+  //    }
+  //    $scope.nextParameters.push(paraMeter);
+  //
+  //    paramater = paramater.next_parameter;
+  //
+  //  }
+  //
+  //}
 
   $scope.updateNextParameter = function(){
     //jQuery.extend(true, {},$scope.newMeasure.function.parameter.next_parameter)
@@ -70,6 +73,14 @@ KylinApp.controller('CubeMeasuresCtrl', function ($scope, $modal,MetaModel,cubes
     }
     $scope.updateNextParameter();
   }
+
+
+  $scope.nextPara = {
+    "type":"column",
+    "value":"",
+    "next_parameter":null
+  }
+
   $scope.openParameterModal = function (parameter) {
     $modal.open({
       templateUrl: 'nextParameter.html',
@@ -95,13 +106,19 @@ KylinApp.controller('CubeMeasuresCtrl', function ($scope, $modal,MetaModel,cubes
 
   $scope.clearNewMeasure = function () {
     $scope.newMeasure = null;
+    $scope.nextPara.value = "";
   };
 
   $scope.saveNewMeasure = function () {
-    if ($scope.newMeasure.function.expression === 'TOP_N' && $scope.nextParameters.length == 0) {
+
+    if ($scope.newMeasure.function.expression === 'TOP_N' && $scope.nextPara.value == "") {
       SweetAlert.swal('', '[TOP_N] Group by Column is required', 'warning');
       return false;
     }
+    if($scope.nextPara.value!=="" && ($scope.newMeasure.function.expression == 'EXTENDED_COLUMN' || $scope.newMeasure.function.expression == 'TOP_N')){
+      $scope.newMeasure.function.parameter.next_parameter = $scope.nextPara;
+    }
+
     if ($scope.cubeMetaFrame.measures.indexOf($scope.newMeasure) === -1) {
       $scope.cubeMetaFrame.measures.push($scope.newMeasure);
     }
@@ -112,7 +129,8 @@ KylinApp.controller('CubeMeasuresCtrl', function ($scope, $modal,MetaModel,cubes
   //map right return type for param
   $scope.measureReturnTypeUpdate = function(){
 
-    if($scope.newMeasure.function.expression == 'TOP_N'){
+    if($scope.newMeasure.function.expression == 'TOP_N'||$scope.newMeasure.function.expression == 'EXTENDED_COLUMN'){
+      $scope.newMeasure.function.parameter.type= 'column';
       return;
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2b1f997e/webapp/app/partials/cubeDesigner/measures.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/cubeDesigner/measures.html b/webapp/app/partials/cubeDesigner/measures.html
index 8fcefe3..469f69e 100755
--- a/webapp/app/partials/cubeDesigner/measures.html
+++ b/webapp/app/partials/cubeDesigner/measures.html
@@ -112,7 +112,7 @@
                           </div>
                       </div>
                       <!--Param Type-->
-                      <div class="form-group">
+                      <div class="form-group" ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN' && newMeasure.function.expression !== 'TOP_N'">
                           <div class="row">
                               <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Param Type</b></label>
                               <div class="col-xs-12 col-sm-6">
@@ -134,10 +134,11 @@
                       <div class="form-group middle-popover">
                           <div class="row">
                               <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default">
-                                <b ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'">Host Column On Fact Table</b>
-                                <b ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN'">Param Value</b>  <i class="fa fa-info-circle" kylinpopover placement="right" title="Param Value" template="paramvalueTip.html"></i>
+                                <b ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'">Host column On Fact Table</b>  <i ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" title="Host Column" class="fa fa-info-circle" kylinpopover placement="right" template="hostTableTip.html"></i>
+                                <b ng-if="newMeasure.function.expression == 'TOP_N'">ORDER|SUM by Column</b>  <i ng-if="newMeasure.function.expression == 'TOP_N'" class="fa fa-info-circle" title="ORDER|SUM by Column" kylinpopover placement="right" template="topnTip.html"></i>
+                                <b ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN' && newMeasure.function.expression !== 'TOP_N' ">Param Value</b>  <i ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN' && newMeasure.function.expression !== 'TOP_N' " class="fa fa-info-circle" kylinpopover placement="right" title="Param Value" template="paramvalueTip.html"></i>
                                 <!--tip for top_n-->
-                                <small ng-if="newMeasure.function.expression == 'TOP_N'" class="help-block" style="color:#3a87ad">(SUM|ORDER BY Column for TOP_N)</small>
+                                <!--<small ng-if="newMeasure.function.expression == 'TOP_N'" class="help-block" style="color:#3a87ad">(SUM|ORDER BY Column for TOP_N)</small>-->
                               </label>
 
 
@@ -148,20 +149,28 @@
                                       ng-init="newMeasure.function.parameter.value = 1"><b>&nbsp;&nbsp;1</b></span>
                                 <!--!COUNT_DISTINCT-->
                                 <select class="form-control" chosen
-                                        ng-if="newMeasure.function.parameter.type == 'column'"
+                                        ng-if="newMeasure.function.parameter.type == 'column' && newMeasure.function.expression !== 'EXTENDED_COLUMN'"
                                         ng-model="newMeasure.function.parameter.value"
                                         ng-change="measureReturnTypeUpdate();"
                                         ng-options="column as column for column in getCommonMetricColumns(newMeasure)" >
                                   <option value="">-- Select a Column --</option>
                                 </select>
+                                <select class="form-control" chosen
+                                        ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'"
+                                        ng-model="newMeasure.function.parameter.value"
+                                        ng-change="measureReturnTypeUpdate();"
+                                        ng-options="column as column for column in getFactColumns()" >
+                                  <option value="">-- Select a Column --</option>
+                                </select>
                               </div>
                           </div>
                       </div>
                       <!--Return Type-->
-                      <div class="form-group">
+                      <div class="form-group middle-popover">
                           <div class="row">
                               <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default">
-                                <b>Return Type</b>  <i ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" class="fa fa-info-circle" kylinpopover placement="right" title="Return Type" template="returnTypeTip.html"></i>
+                                <b ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN'">Return Type</b>
+                                <b ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'">Maximum length of extended column</b>  <i ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" title="Maximum Length" class="fa fa-info-circle" kylinpopover placement="right" template="extendedTypeTip.html"></i>
                               </label>
                               <div class="col-xs-12 col-sm-6">
                                   <select class="form-control"
@@ -181,7 +190,7 @@
 
                                 <input extended-column-return
                                   ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'"
-                                  type="text" placeholder="Return type.." class="form-control"
+                                  type="text" placeholder="Kylin won\u2019t save more than this number of bytes" class="form-control"
                                         tooltip-trigger="focus"
                                         ng-init=""
                                        ng-model="newMeasure.function.returntype" required />
@@ -193,6 +202,38 @@
                               </div>
                           </div>
                       </div>
+
+
+                      <div class="form-group middle-popover" ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'">
+                        <div class="row">
+                          <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default">
+                            <b>Extended column on fact table</b>    <i ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" title="Extended Column" class="fa fa-info-circle" kylinpopover placement="right" template="extendedColumnTip.html"></i>
+                          </label>
+                          <div class="col-xs-12 col-sm-6">
+                            <select class="form-control" chosen ng-if="nextPara.type !== 'constant'" required
+                                    ng-model="nextPara.value"
+                                    ng-options="column as column for column in getExtendedFactColumns()" >
+                              <option value=""></option>
+                            </select>
+                          </div>
+                        </div>
+                      </div>
+
+                      <div class="form-group" ng-if="newMeasure.function.expression == 'TOP_N'">
+                        <div class="row">
+                          <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default">
+                            <b>Group by Column</b>
+                          </label>
+                          <div class="col-xs-12 col-sm-6">
+                            <select class="form-control" chosen ng-if="nextPara.type !== 'constant'" required
+                                    ng-model="nextPara.value"
+                                    ng-options="column as column for column in getExtendedColumns(newMeasure)" >
+                              <option value=""></option>
+                            </select>
+                          </div>
+                        </div>
+                      </div>
+
                       <!--Name-->
                       <div class="form-group">
                         <div class="row">
@@ -219,29 +260,14 @@
                               </tr>
                             </table>
 
-                            <table class="table table-hover table-bordered list" ng-if="nextParameters.length" ng-show="newMeasure.function.expression == 'TOP_N'">
-                              <tr ng-repeat="n_parameter in nextParameters track by $index">
-                                <td><b>Group By Column</b></td>
-                                <td>{{n_parameter.value}}</td>
-                                <td>
-                                  <button class="btn btn-xs btn-info" ng-click="editNextParameter(n_parameter)">
-                                    <i class="fa fa-pencil"></i>
-                                  </button>
-                                  <button class="btn btn-xs btn-info" ng-click="removeParameter(nextParameters, $index)"><i class="fa fa-minus"></i>
-                                  </button>
-
-                                </td>
-
-                              </tr>
-                            </table>
 
 
-                            <button class="btn btn-sm btn-info" ng-click="addNextParameter()" ng-show="newMeasure.function.expression == 'TOP_N' && nextParameters.length==0"
-                                    ng-show="state.mode=='edit'"><i class="fa fa-plus"> Group by Column</i>
-                            </button>
-                            <button class="btn btn-sm btn-info" ng-click="addNextParameter()" ng-show="newMeasure.function.expression == 'EXTENDED_COLUMN' && nextParameters.length==0"
-                                    ng-show="state.mode=='edit'"><i class="fa fa-plus"> Extended Column On Fact Table</i>
-                            </button>
+                            <!--<button class="btn btn-sm btn-info" ng-click="addNextParameter()" ng-show="newMeasure.function.expression == 'TOP_N' && nextParameters.length==0"-->
+                                    <!--ng-show="state.mode=='edit'"><i class="fa fa-plus"> Group by Column</i>-->
+                            <!--</button>-->
+                            <!--<button class="btn btn-sm btn-info" ng-click="addNextParameter()" ng-show="newMeasure.function.expression == 'EXTENDED_COLUMN' && nextParameters.length==0"-->
+                                    <!--ng-show="state.mode=='edit'"><i class="fa fa-plus"> Extended Column On Fact Table</i>-->
+                            <!--</button>-->
                           </div>
                         </div>
                       </div>
@@ -316,7 +342,7 @@
               <div class="col-xs-12 col-sm-6">
                 <select class="form-control" chosen
                         ng-model="nextPara.value"
-                        ng-options="column as column for column in getCommonMetricColumns(newmea.measure)" >
+                        ng-options="column as column for column in getExtendedColumns(newmea.measure)" >
                   <option value=""></option>
                 </select>
               </div>
@@ -328,7 +354,7 @@
               <div class="col-xs-12 col-sm-6">
                 <select class="form-control" chosen
                         ng-model="nextPara.value"
-                        ng-options="column as column for column in getCommonMetricColumns(newmea.measure)" >
+                        ng-options="column as column for column in getExtendedColumns(newmea.measure)" >
                   <option value=""></option>
                 </select>
               </div>
@@ -351,16 +377,27 @@
 </script>
 <script type="text/ng-template" id="paramvalueTip.html">
   <ol>
-    <li>Only accept single column in param
     <li>Only accept single column in param value with "Column" type</li>
     <li>Distinct Count is approximate, please indicate Error Rate, higher accuracy degree accompanied with larger storage size and longer build time</li>
-    value with "Column" type</li>
-    <li>Distinct Count is approximate, please indicate Error Rate, higher accuracy degree accompanied with larger storage size and longer build time</li>
   </ol>
 </script>
 
-<script type="text/ng-template" id="returnTypeTip.html">
-  <ol>
+<script type="text/ng-template" id="extendedTypeTip.html">
+  <p>
+    Kylin won\u2019t save more than this number of bytes for each extended column. If exceeded it will be truncated.
+  </p>
+</script>
 
-  </ol>
+<script type="text/ng-template" id="topnTip.html">
+  <p>Will use this column for SUM and Order by</p>
+</script>
+
+<script type="text/ng-template" id="hostTableTip.html">
+  <p>Host column is the dimension to derive from, e.g. page_id</p>
 </script>
+<script type="text/ng-template" id="extendedColumnTip.html">
+  <p>
+    Extended column is derived from host, e.g. page_url. No filters on extended column!
+  </p>
+</script>
+


[2/5] kylin git commit: reformat code

Posted by zh...@apache.org.
http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/index.html
----------------------------------------------------------------------
diff --git a/webapp/app/index.html b/webapp/app/index.html
index 36245f1..282567c 100644
--- a/webapp/app/index.html
+++ b/webapp/app/index.html
@@ -20,54 +20,54 @@
 <!doctype html>
 <html id="ng-app">
 <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <base href="/kylin/">
-    <link rel="icon" href="image/favicon.ico" type="image/x-icon">
-    <link rel="shortcut icon" href="image/favicon.ico" type="image/x-icon">
-    <title>Kylin</title>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <base href="/kylin/">
+  <link rel="icon" href="image/favicon.ico" type="image/x-icon">
+  <link rel="shortcut icon" href="image/favicon.ico" type="image/x-icon">
+  <title>Kylin</title>
 
-    <!-- ref:css css/styles.min.<%= buildNumber %>.css -->
-    <link rel="stylesheet" type="text/css" href="components/bootstrap/dist/css/bootstrap.min.css">
-    <link rel="stylesheet" type="text/css" href="components/components-font-awesome/css/font-awesome.css">
+  <!-- ref:css css/styles.min.<%= buildNumber %>.css -->
+  <link rel="stylesheet" type="text/css" href="components/bootstrap/dist/css/bootstrap.min.css">
+  <link rel="stylesheet" type="text/css" href="components/components-font-awesome/css/font-awesome.css">
 
-    <link rel="stylesheet" type="text/css" href="components/angular-tree-control/css/tree-control.css">
-    <link rel="stylesheet" type="text/css" href="components/angular-tree-control/css/tree-control-attribute.css">
-    <link rel="stylesheet" type="text/css" href="components/messenger/build/css/messenger.css">
-    <link rel="stylesheet" type="text/css" href="components/messenger/build/css/messenger-theme-ice.css">
-    <link rel="stylesheet" type="text/css" href="components/ng-grid/ng-grid.css">
-    <link rel="stylesheet" type="text/css" href="components/angular-ui-grid/ui-grid.min.css">
-    <link rel="stylesheet" type="text/css" href="components/chosen/chosen.css">
-    <link rel="stylesheet" type="text/css" href="components/angular-chosen-localytics/chosen-spinner.css">
-    <link rel="stylesheet" type="text/css" href="components/animate.css/animate.css">
-    <link rel="stylesheet" type="text/css" href="components/nvd3/nv.d3.min.css">
+  <link rel="stylesheet" type="text/css" href="components/angular-tree-control/css/tree-control.css">
+  <link rel="stylesheet" type="text/css" href="components/angular-tree-control/css/tree-control-attribute.css">
+  <link rel="stylesheet" type="text/css" href="components/messenger/build/css/messenger.css">
+  <link rel="stylesheet" type="text/css" href="components/messenger/build/css/messenger-theme-ice.css">
+  <link rel="stylesheet" type="text/css" href="components/ng-grid/ng-grid.css">
+  <link rel="stylesheet" type="text/css" href="components/angular-ui-grid/ui-grid.min.css">
+  <link rel="stylesheet" type="text/css" href="components/chosen/chosen.css">
+  <link rel="stylesheet" type="text/css" href="components/angular-chosen-localytics/chosen-spinner.css">
+  <link rel="stylesheet" type="text/css" href="components/animate.css/animate.css">
+  <link rel="stylesheet" type="text/css" href="components/nvd3/nv.d3.min.css">
 
-    <link rel="stylesheet" type="text/css" href="css/AdminLTE.css">
-    <link rel="stylesheet" type="text/css" href="components/bootstrap-sweetalert/lib/sweet-alert.css">
-    <link rel="stylesheet" type="text/css" href="components/angular-bootstrap-nav-tree/dist/abn_tree.css">
-    <link rel="stylesheet" type="text/css" href="components/angular-toggle-switch/angular-toggle-switch.css">
-    <link rel="stylesheet" type="text/css" href="components/angular-ui-select/dist/select.css">
-    <link rel="stylesheet" type="text/css" href="components/angular-bootstrap-datetimepicker/src/css/datetimepicker.css">
+  <link rel="stylesheet" type="text/css" href="css/AdminLTE.css">
+  <link rel="stylesheet" type="text/css" href="components/bootstrap-sweetalert/lib/sweet-alert.css">
+  <link rel="stylesheet" type="text/css" href="components/angular-bootstrap-nav-tree/dist/abn_tree.css">
+  <link rel="stylesheet" type="text/css" href="components/angular-toggle-switch/angular-toggle-switch.css">
+  <link rel="stylesheet" type="text/css" href="components/angular-ui-select/dist/select.css">
+  <link rel="stylesheet" type="text/css" href="components/angular-bootstrap-datetimepicker/src/css/datetimepicker.css">
 
-    <link rel="stylesheet/less" href="less/build.less">
-    <!-- endref -->
+  <link rel="stylesheet/less" href="less/build.less">
+  <!-- endref -->
 
-    <!-- This has to be at the top to make it works in IE   -->
-    <!--[if lte IE 8]>
-    <script>
-        document.createElement('loading');
-        document.createElement('pagination');
-    </script>
-    <![endif]-->
+  <!-- This has to be at the top to make it works in IE   -->
+  <!--[if lte IE 8]>
+  <script>
+    document.createElement('loading');
+    document.createElement('pagination');
+  </script>
+  <![endif]-->
 </head>
 
 <body ng-controller="PageCtrl">
 
 <div class="navbar navbar-default navbar-fixed-top" ng-include="'partials/header.html'"></div>
 <div id="main" class="main-container">
-    <div class="main-content">
-        <div class="page-content" ng-view></div>
-    </div>
+  <div class="main-content">
+    <div class="page-content" ng-view></div>
+  </div>
 </div>
 <footer class="navbar-fixed-bottom navbar-footer" ng-include="'partials/footer.html'"></footer>
 
@@ -205,39 +205,39 @@
 <!--template-->
 <!-- static template for cube save/update result notification -->
 <script type="text/ng-template" id="cubeResultError.html">
-    <div class="callout">
-        <h4>Error Message</h4>
-        <p>{{text}}</p>
-    </div>
-    <div class="callout callout-danger">
-        <h4>Cube Schema</h4>
-        <pre>{{schema}}</pre>
-    </div>
+  <div class="callout">
+    <h4>Error Message</h4>
+    <p>{{text}}</p>
+  </div>
+  <div class="callout callout-danger">
+    <h4>Cube Schema</h4>
+    <pre>{{schema}}</pre>
+  </div>
 </script>
 
 <script type="text/ng-template" id="cubeResultSuccess.html">
-    <div class="callout callout-info">
-        <p>{{text}}</p>
-    </div>
+  <div class="callout callout-info">
+    <p>{{text}}</p>
+  </div>
 </script>
 
 <!--template-->
 <!-- static template for cube save/update result notification -->
 <script type="text/ng-template" id=" modelResultError.html">
-    <div class="callout callout-info">
-        <h4>Error Message</h4>
-        <p>{{text}}</p>
-    </div>
-    <div class="callout callout-danger">
-        <h4>Model Schema</h4>
-        <pre>{{schema}}</pre>
-    </div>
+  <div class="callout callout-info">
+    <h4>Error Message</h4>
+    <p>{{text}}</p>
+  </div>
+  <div class="callout callout-danger">
+    <h4>Model Schema</h4>
+    <pre>{{schema}}</pre>
+  </div>
 </script>
 
 <script type="text/ng-template" id="modelResultSuccess.html">
-    <div class="callout callout-info">
-        <p>{{text}}</p>
-    </div>
+  <div class="callout callout-info">
+    <p>{{text}}</p>
+  </div>
 </script>
 
 <!-- static template for cube save/update result notification -->

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/js/app.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/app.js b/webapp/app/js/app.js
index 3691b82..3708037 100644
--- a/webapp/app/js/app.js
+++ b/webapp/app/js/app.js
@@ -14,7 +14,7 @@
  * 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.
-*/
+ */
 
 //Kylin Application Module
-KylinApp = angular.module('kylin', ['ngRoute', 'ngResource', 'ngGrid', 'ui.grid', 'ui.grid.resizeColumns', 'ui.bootstrap', 'ui.ace', 'base64', 'angularLocalStorage', 'localytics.directives', 'treeControl', 'nvd3ChartDirectives','ngLoadingRequest','oitozero.ngSweetAlert','ngCookies','angular-underscore', 'ngAnimate', 'ui.sortable','angularBootstrapNavTree','toggle-switch','ngSanitize','ui.select','ui.bootstrap.datetimepicker']);
+KylinApp = angular.module('kylin', ['ngRoute', 'ngResource', 'ngGrid', 'ui.grid', 'ui.grid.resizeColumns', 'ui.bootstrap', 'ui.ace', 'base64', 'angularLocalStorage', 'localytics.directives', 'treeControl', 'nvd3ChartDirectives', 'ngLoadingRequest', 'oitozero.ngSweetAlert', 'ngCookies', 'angular-underscore', 'ngAnimate', 'ui.sortable', 'angularBootstrapNavTree', 'toggle-switch', 'ngSanitize', 'ui.select', 'ui.bootstrap.datetimepicker']);

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/js/config.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/config.js b/webapp/app/js/config.js
index 46fdecd..ce4531e 100644
--- a/webapp/app/js/config.js
+++ b/webapp/app/js/config.js
@@ -39,61 +39,61 @@ var Config = {
 // Angular module to load routes.
 KylinApp.config(function ($routeProvider, $httpProvider, $locationProvider, $logProvider) {
 
-  // Set debug to true by default.
-  if (angular.isUndefined(Config.debug) || Config.debug !== false) {
-    Config.debug = true;
-  }
-
-  // Set development to true by default.
-  if (angular.isUndefined(Config.development) || Config.development !== false) {
-    Config.development = true;
-  }
-
-  // Disable logging if debug is off.
-  if (Config.debug === false) {
-    $logProvider.debugEnabled(false);
-  }
+    // Set debug to true by default.
+    if (angular.isUndefined(Config.debug) || Config.debug !== false) {
+      Config.debug = true;
+    }
 
-  // Loop over routes and add to router.
-  angular.forEach(Config.routes, function (route) {
-    $routeProvider.when(route.url, route.params).otherwise({redirectTo:'/'});
-  });
+    // Set development to true by default.
+    if (angular.isUndefined(Config.development) || Config.development !== false) {
+      Config.development = true;
+    }
 
-  // Set to use HTML5 mode, which removes the #! from modern browsers.
-  $locationProvider.html5Mode(true);
-
-  //configure $http to view a login whenever a 401 unauthorized response arrives
-  $httpProvider.responseInterceptors.push(function ($rootScope, $q) {
-    return function (promise) {
-      return promise.then(
-        //success -> don't intercept
-        function (response) {
-          return response;
-        },
-        //error -> if 401 save the request and broadcast an event
-        function (response) {
-          if (response.status === 401 && !(response.config.url.indexOf("user/authentication") !== -1 && response.config.method === 'POST')) {
-            var deferred = $q.defer(),
-              req = {
-                config: response.config,
-                deferred: deferred
-              };
-            $rootScope.requests401.push(req);
-            $rootScope.$broadcast('event:loginRequired');
-            return deferred.promise;
-          }
+    // Disable logging if debug is off.
+    if (Config.debug === false) {
+      $logProvider.debugEnabled(false);
+    }
 
-          if (response.status === 403) {
-            $rootScope.$broadcast('event:forbidden', response.data.exception);
+    // Loop over routes and add to router.
+    angular.forEach(Config.routes, function (route) {
+      $routeProvider.when(route.url, route.params).otherwise({redirectTo: '/'});
+    });
+
+    // Set to use HTML5 mode, which removes the #! from modern browsers.
+    $locationProvider.html5Mode(true);
+
+    //configure $http to view a login whenever a 401 unauthorized response arrives
+    $httpProvider.responseInterceptors.push(function ($rootScope, $q) {
+      return function (promise) {
+        return promise.then(
+          //success -> don't intercept
+          function (response) {
+            return response;
+          },
+          //error -> if 401 save the request and broadcast an event
+          function (response) {
+            if (response.status === 401 && !(response.config.url.indexOf("user/authentication") !== -1 && response.config.method === 'POST')) {
+              var deferred = $q.defer(),
+                req = {
+                  config: response.config,
+                  deferred: deferred
+                };
+              $rootScope.requests401.push(req);
+              $rootScope.$broadcast('event:loginRequired');
+              return deferred.promise;
+            }
+
+            if (response.status === 403) {
+              $rootScope.$broadcast('event:forbidden', response.data.exception);
+            }
+
+            return $q.reject(response);
           }
-
-          return $q.reject(response);
-        }
-      );
-    };
-  });
-  httpHeaders = $httpProvider.defaults.headers;
-})
+        );
+      };
+    });
+    httpHeaders = $httpProvider.defaults.headers;
+  })
   .run(function ($location) {
 
     if (angular.isUndefined(Config.uri)) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/js/listeners.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/listeners.js b/webapp/app/js/listeners.js
index ab32a0d..e5c40fb 100644
--- a/webapp/app/js/listeners.js
+++ b/webapp/app/js/listeners.js
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-KylinApp.run(function ($rootScope, $http, $location, UserService, AuthenticationService, MessageService, $cookieStore,ProjectService,ProjectModel,AccessService,SweetAlert,loadingRequest) {
+KylinApp.run(function ($rootScope, $http, $location, UserService, AuthenticationService, MessageService, $cookieStore, ProjectService, ProjectModel, AccessService, SweetAlert, loadingRequest) {
 
   $rootScope.permissions = {
     READ: {name: 'CUBE QUERY', value: 'READ', mask: 1},
@@ -28,17 +28,17 @@ KylinApp.run(function ($rootScope, $http, $location, UserService, Authentication
   $rootScope.$on("$routeChangeStart", function () {
     AuthenticationService.ping(function (data) {
       UserService.setCurUser(data);
-      if(!data.userDetails){
+      if (!data.userDetails) {
         $location.path(UserService.getHomePage());
-      }else{
+      } else {
         //get project info when login
-        if (!ProjectModel.projects.length&&!$rootScope.userAction.islogout) {
+        if (!ProjectModel.projects.length && !$rootScope.userAction.islogout) {
 
           loadingRequest.show();
           ProjectService.listReadable({}, function (projects) {
             loadingRequest.hide();
 
-            if(!projects.length){
+            if (!projects.length) {
               return;
             }
 
@@ -48,15 +48,15 @@ KylinApp.run(function ($rootScope, $http, $location, UserService, Authentication
             });
             ProjectModel.setProjects(_projects);
             var projectInCookie = $cookieStore.get("project");
-            if(projectInCookie&&ProjectModel.getIndex(projectInCookie)==-1){
+            if (projectInCookie && ProjectModel.getIndex(projectInCookie) == -1) {
               projectInCookie = null;
             }
             var selectedProject = projectInCookie != null ? projectInCookie : null;
-            if(projectInCookie!=null){
+            if (projectInCookie != null) {
               selectedProject = projectInCookie;
-            }else if(UserService.hasRole('ROLE_ADMIN')){
+            } else if (UserService.hasRole('ROLE_ADMIN')) {
               selectedProject = null;
-            }else{
+            } else {
               selectedProject = ProjectModel.projects[0].name
             }
 
@@ -70,7 +70,7 @@ KylinApp.run(function ($rootScope, $http, $location, UserService, Authentication
               });
             });
 
-          },function(e){
+          }, function (e) {
             loadingRequest.hide();
             $location.path(UserService.getHomePage());
           });

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/less/app.less
----------------------------------------------------------------------
diff --git a/webapp/app/less/app.less b/webapp/app/less/app.less
index cc52b41..5aa2a25 100644
--- a/webapp/app/less/app.less
+++ b/webapp/app/less/app.less
@@ -785,25 +785,25 @@ input:-moz-placeholder {
   text-overflow: ellipsis;
 }
 
-.dropdown-menu{
-  z-index:9999;
+.dropdown-menu {
+  z-index: 9999;
 }
 
-.panel-group .panel{
+.panel-group .panel {
   overflow: auto !important;
 }
 
-.middle-popover .popover{
+.middle-popover .popover {
   width: 360px;
   max-width: 360px;
   font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
   font-size: 14px;
   line-height: 1.428571429;
-  color:#808080;
+  color: #808080;
   background-color: #ffffff;
 }
 
-.middle-popover .popover-content, .large-popover .popover-content{
+.middle-popover .popover-content, .large-popover .popover-content {
   font-size: 13px;
   font-weight: normal;
   line-height: 18px;
@@ -812,19 +812,21 @@ input:-moz-placeholder {
   word-break: normal;
 }
 
-.middle-popover .popover-content ol, .large-popover .popover-content ol{
+.middle-popover .popover-content ol, .large-popover .popover-content ol {
   -webkit-padding-start: 20px;
   padding-start: 20px;
 }
-.large-popover .popover{
+
+.large-popover .popover {
   width: 600px;
   max-width: 600px;
   font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
   font-size: 14px;
-  color:#808080;
+  color: #808080;
   line-height: 1.428571429;
   background-color: #ffffff;
 }
+
 pre {
   white-space: pre-wrap;
   white-space: -moz-pre-wrap;

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/less/build.less
----------------------------------------------------------------------
diff --git a/webapp/app/less/build.less b/webapp/app/less/build.less
index be8f7df..4271bac 100644
--- a/webapp/app/less/build.less
+++ b/webapp/app/less/build.less
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 @import 'layout.less';
 @import 'navbar.less';
 @import 'home.less';

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/less/component.less
----------------------------------------------------------------------
diff --git a/webapp/app/less/component.less b/webapp/app/less/component.less
index 929006f..e23859d 100644
--- a/webapp/app/less/component.less
+++ b/webapp/app/less/component.less
@@ -16,278 +16,365 @@
  */
 
 /** table related **/
-.dataTables_wrapper>.row:first-child {
+.dataTables_wrapper > .row:first-child {
   padding-top: 12px;
   padding-bottom: 12px;
   background-color: #EFF3F8;
 }
 
-.dataTables_wrapper>.row {
-  margin: 0!important;
+.dataTables_wrapper > .row {
+  margin: 0 !important;
 }
 
 /** utilities **/
 .dark {
   color: #333333 !important;
 }
+
 .white {
   color: #ffffff !important;
 }
+
 .red {
   color: #dd5a43 !important;
 }
+
 .red2 {
   color: #e08374 !important;
 }
+
 .light-red {
   color: #ff7777 !important;
 }
+
 .blue {
   color: #478fca !important;
 }
+
 .light-blue {
   color: #93cbf9 !important;
 }
+
 .green {
   color: #69aa46 !important;
 }
+
 .light-green {
   color: #b0d877 !important;
 }
+
 .orange {
   color: #ff892a !important;
 }
+
 .orange2 {
   color: #feb902 !important;
 }
+
 .light-orange {
   color: #fcac6f !important;
 }
+
 .purple {
   color: #a069c3 !important;
 }
+
 .pink {
   color: #c6699f !important;
 }
+
 .pink2 {
   color: #d6487e !important;
 }
+
 .brown {
   color: #a52a2a !important;
 }
+
 .grey {
   color: #777777 !important;
 }
+
 .light-grey {
   color: #bbbbbb !important;
 }
+
 .bigger-110 {
   font-size: 110% !important;
 }
+
 .bigger-120 {
   font-size: 120% !important;
 }
+
 .bigger-130 {
   font-size: 130% !important;
 }
+
 .bigger-140 {
   font-size: 140% !important;
 }
+
 .bigger-150 {
   font-size: 150% !important;
 }
+
 .bigger-160 {
   font-size: 160% !important;
 }
+
 .bigger-170 {
   font-size: 170% !important;
 }
+
 .bigger-180 {
   font-size: 180% !important;
 }
+
 .bigger-190 {
   font-size: 190% !important;
 }
+
 .bigger-200 {
   font-size: 200% !important;
 }
+
 .bigger-210 {
   font-size: 210% !important;
 }
+
 .bigger-220 {
   font-size: 220% !important;
 }
+
 .bigger-230 {
   font-size: 230% !important;
 }
+
 .bigger-240 {
   font-size: 240% !important;
 }
+
 .bigger-250 {
   font-size: 250% !important;
 }
+
 .bigger-260 {
   font-size: 260% !important;
 }
+
 .bigger-270 {
   font-size: 270% !important;
 }
+
 .bigger-280 {
   font-size: 280% !important;
 }
+
 .bigger-290 {
   font-size: 290% !important;
 }
+
 .bigger-300 {
   font-size: 300% !important;
 }
+
 .bigger-115 {
   font-size: 115% !important;
 }
+
 .bigger-125 {
   font-size: 125% !important;
 }
+
 .bigger-175 {
   font-size: 175% !important;
 }
+
 .bigger-225 {
   font-size: 225% !important;
 }
+
 .bigger-275 {
   font-size: 275% !important;
 }
+
 .smaller-90 {
   font-size: 90% !important;
 }
+
 .smaller-80 {
   font-size: 80% !important;
 }
+
 .smaller-70 {
   font-size: 70% !important;
 }
+
 .smaller-60 {
   font-size: 60% !important;
 }
+
 .smaller-50 {
   font-size: 50% !important;
 }
+
 .smaller-40 {
   font-size: 40% !important;
 }
+
 .smaller-30 {
   font-size: 30% !important;
 }
+
 .smaller-20 {
   font-size: 20% !important;
 }
+
 .smaller-75 {
   font-size: 75% !important;
 }
+
 .width-20 {
   width: 20% !important;
 }
+
 .width-25 {
   width: 25% !important;
 }
+
 .width-30 {
   width: 30% !important;
 }
+
 .width-35 {
   width: 35% !important;
 }
+
 .width-40 {
   width: 40% !important;
 }
+
 .width-45 {
   width: 45% !important;
 }
+
 .width-50 {
   width: 50% !important;
 }
+
 .width-55 {
   width: 55% !important;
 }
+
 .width-60 {
   width: 60% !important;
 }
+
 .width-65 {
   width: 65% !important;
 }
+
 .width-70 {
   width: 70% !important;
 }
+
 .width-75 {
   width: 75% !important;
 }
+
 .width-80 {
   width: 80% !important;
 }
+
 .width-85 {
   width: 85% !important;
 }
+
 .width-90 {
   width: 90% !important;
 }
+
 .width-95 {
   width: 95% !important;
 }
+
 .width-100 {
   width: 100% !important;
 }
+
 .width-75 {
   width: 75% !important;
 }
+
 .width-25 {
   width: 25% !important;
 }
+
 .width-auto {
   width: auto !important;
 }
+
 .height-auto {
   height: auto !important;
 }
+
 .no-padding {
   padding: 0 !important;
 }
+
 .no-padding-bottom {
   padding-bottom: 0 !important;
 }
+
 .no-padding-top {
   padding-top: 0 !important;
 }
+
 .no-padding-left {
   padding-left: 0 !important;
 }
+
 .no-padding-right {
   padding-right: 0 !important;
 }
+
 .no-margin {
   margin: 0 !important;
 }
+
 .no-margin-bottom {
   margin-bottom: 0 !important;
 }
+
 .no-margin-top {
   margin-top: 0 !important;
 }
+
 .no-margin-left {
   margin-left: 0 !important;
 }
+
 .no-margin-right {
   margin-right: 0 !important;
 }
+
 .no-border {
   border-width: 0;
 }
+
 .no-border-bottom {
   border-bottom-width: 0;
 }
+
 .no-border-top {
   border-top-width: 0;
 }
+
 .no-border-left {
   border-left-width: 0;
 }
+
 .no-border-right {
   border-right-width: 0;
 }
@@ -304,25 +391,25 @@ span.input-icon {
 .nav-search .nav-search-input {
   border: 1px solid #6fb3e0;
   width: 152px;
-  height: 28px!important;
+  height: 28px !important;
   padding-top: 2px;
   padding-bottom: 2px;
-  border-radius: 4px!important;
+  border-radius: 4px !important;
   font-size: 13px;
   line-height: 1.3;
-  color: #666!important;
+  color: #666 !important;
   z-index: 11;
   -webkit-transition: width ease .15s;
   -o-transition: width ease .15s;
   transition: width ease .15s;
 }
 
-.input-icon>input {
+.input-icon > input {
   padding-left: 24px;
   padding-right: 6px;
 }
 
-.input-icon.input-icon-right>input {
+.input-icon.input-icon-right > input {
   padding-left: 6px;
   padding-right: 24px;
 }
@@ -331,7 +418,7 @@ span.input-icon {
   text-align: center;
 }
 
-.input-icon>.ace-icon {
+.input-icon > .ace-icon {
   padding: 0 3px;
   z-index: 2;
   position: absolute;
@@ -344,7 +431,7 @@ span.input-icon {
   font-size: 16px;
 }
 
-.input-icon.input-icon-right>.ace-icon {
+.input-icon.input-icon-right > .ace-icon {
   left: auto;
   right: 3px;
 }
@@ -360,6 +447,7 @@ span.input-icon {
   margin: 12px 0;
   border-top-color: rgba(0, 0, 0, 0.11);
 }
+
 .hr-double {
   height: 3px;
   border-top: 1px solid #E3E3E3;
@@ -367,83 +455,103 @@ span.input-icon {
   border-top-color: rgba(0, 0, 0, 0.11);
   border-bottom-color: rgba(0, 0, 0, 0.11);
 }
+
 .hr.dotted,
 .hr-dotted {
   border-style: dotted;
 }
+
 .hr-32,
 .hr32 {
   margin: 32px 0;
 }
+
 .hr-30,
 .hr30 {
   margin: 30px 0;
 }
+
 .hr-28,
 .hr28 {
   margin: 28px 0;
 }
+
 .hr-26,
 .hr26 {
   margin: 26px 0;
 }
+
 .hr-24,
 .hr24 {
   margin: 24px 0;
 }
+
 .hr-22,
 .hr22 {
   margin: 22px 0;
 }
+
 .hr-20,
 .hr20 {
   margin: 20px 0;
 }
+
 .hr-18,
 .hr18 {
   margin: 18px 0;
 }
+
 .hr-16,
 .hr16 {
   margin: 16px 0;
 }
+
 .hr-14,
 .hr14 {
   margin: 14px 0;
 }
+
 .hr-12,
 .hr12 {
   margin: 12px 0;
 }
+
 .hr-10,
 .hr10 {
   margin: 10px 0;
 }
+
 .hr-8,
 .hr8 {
   margin: 8px 0;
 }
+
 .hr-6,
 .hr6 {
   margin: 6px 0;
 }
+
 .hr-4,
 .hr4 {
   margin: 4px 0;
 }
+
 .hr-2,
 .hr2 {
   margin: 2px 0;
 }
+
 .space {
   max-height: 1px;
   min-height: 1px;
   overflow: hidden;
   margin: 12px 0;
 }
+
 [class*="vspace-"] {
   display: none;
 }
+
 .space-32 {
   max-height: 1px;
   min-height: 1px;
@@ -451,6 +559,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 32px 0 31px;
 }
+
 [class*="vspace-32"] {
   max-height: 1px;
   min-height: 1px;
@@ -458,6 +567,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 32px 0 31px 0;
 }
+
 .space-30 {
   max-height: 1px;
   min-height: 1px;
@@ -465,6 +575,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 30px 0 29px;
 }
+
 [class*="vspace-30"] {
   max-height: 1px;
   min-height: 1px;
@@ -472,6 +583,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 30px 0 29px 0;
 }
+
 .space-28 {
   max-height: 1px;
   min-height: 1px;
@@ -479,6 +591,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 28px 0 27px;
 }
+
 [class*="vspace-28"] {
   max-height: 1px;
   min-height: 1px;
@@ -486,6 +599,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 28px 0 27px 0;
 }
+
 .space-26 {
   max-height: 1px;
   min-height: 1px;
@@ -493,6 +607,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 26px 0 25px;
 }
+
 [class*="vspace-26"] {
   max-height: 1px;
   min-height: 1px;
@@ -500,6 +615,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 26px 0 25px 0;
 }
+
 .space-24 {
   max-height: 1px;
   min-height: 1px;
@@ -507,6 +623,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 24px 0 23px;
 }
+
 [class*="vspace-24"] {
   max-height: 1px;
   min-height: 1px;
@@ -514,6 +631,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 24px 0 23px 0;
 }
+
 .space-22 {
   max-height: 1px;
   min-height: 1px;
@@ -521,6 +639,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 22px 0 21px;
 }
+
 [class*="vspace-22"] {
   max-height: 1px;
   min-height: 1px;
@@ -528,6 +647,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 22px 0 21px 0;
 }
+
 .space-20 {
   max-height: 1px;
   min-height: 1px;
@@ -535,6 +655,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 20px 0 19px;
 }
+
 [class*="vspace-20"] {
   max-height: 1px;
   min-height: 1px;
@@ -542,6 +663,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 20px 0 19px 0;
 }
+
 .space-18 {
   max-height: 1px;
   min-height: 1px;
@@ -549,6 +671,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 18px 0 17px;
 }
+
 [class*="vspace-18"] {
   max-height: 1px;
   min-height: 1px;
@@ -556,6 +679,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 18px 0 17px 0;
 }
+
 .space-16 {
   max-height: 1px;
   min-height: 1px;
@@ -563,6 +687,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 16px 0 15px;
 }
+
 [class*="vspace-16"] {
   max-height: 1px;
   min-height: 1px;
@@ -570,6 +695,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 16px 0 15px 0;
 }
+
 .space-14 {
   max-height: 1px;
   min-height: 1px;
@@ -577,6 +703,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 14px 0 13px;
 }
+
 [class*="vspace-14"] {
   max-height: 1px;
   min-height: 1px;
@@ -584,6 +711,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 14px 0 13px 0;
 }
+
 .space-12 {
   max-height: 1px;
   min-height: 1px;
@@ -591,6 +719,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 12px 0 11px;
 }
+
 [class*="vspace-12"] {
   max-height: 1px;
   min-height: 1px;
@@ -598,6 +727,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 12px 0 11px 0;
 }
+
 .space-10 {
   max-height: 1px;
   min-height: 1px;
@@ -605,6 +735,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 10px 0 9px;
 }
+
 [class*="vspace-10"] {
   max-height: 1px;
   min-height: 1px;
@@ -612,6 +743,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 10px 0 9px 0;
 }
+
 .space-8 {
   max-height: 1px;
   min-height: 1px;
@@ -619,6 +751,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 8px 0 7px;
 }
+
 [class*="vspace-8"] {
   max-height: 1px;
   min-height: 1px;
@@ -626,6 +759,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 8px 0 7px 0;
 }
+
 .space-6 {
   max-height: 1px;
   min-height: 1px;
@@ -633,6 +767,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 6px 0 5px;
 }
+
 [class*="vspace-6"] {
   max-height: 1px;
   min-height: 1px;
@@ -640,6 +775,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 6px 0 5px 0;
 }
+
 .space-4 {
   max-height: 1px;
   min-height: 1px;
@@ -647,6 +783,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 4px 0 3px;
 }
+
 [class*="vspace-4"] {
   max-height: 1px;
   min-height: 1px;
@@ -654,6 +791,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 4px 0 3px 0;
 }
+
 .space-2 {
   max-height: 1px;
   min-height: 1px;
@@ -661,6 +799,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 2px 0 1px;
 }
+
 [class*="vspace-2"] {
   max-height: 1px;
   min-height: 1px;
@@ -668,6 +807,7 @@ span.input-icon {
   margin: 12px 0;
   margin: 2px 0 1px 0;
 }
+
 .space-0,
 [class*="vspace-0"] {
   max-height: 1px;
@@ -676,21 +816,25 @@ span.input-icon {
   margin: 12px 0;
   margin: 0;
 }
+
 @media only screen and (max-width: 479px) {
   [class*="vspace-"][class*="-xs"] {
     display: block;
   }
 }
+
 @media only screen and (max-width: 767px) {
   [class*="vspace-"][class*="-sm"] {
     display: block;
   }
 }
+
 @media only screen and (max-width: 991px) {
   [class*="vspace-"][class*="-md"] {
     display: block;
   }
 }
+
 @media only screen and (max-width: 1199px) {
   [class*="vspace-"][class*="-lg"] {
     display: block;
@@ -706,11 +850,13 @@ span.input-icon {
   margin: 0;
   position: relative;
 }
+
 .wizard-steps li {
   display: table-cell;
   text-align: center;
   width: 1%;
 }
+
 .wizard-steps li .step {
   border: 5px solid #ced1d6;
   color: #546474;
@@ -725,6 +871,7 @@ span.input-icon {
   line-height: 30px;
   text-align: center;
 }
+
 .wizard-steps li:before {
   display: block;
   content: "";
@@ -737,20 +884,24 @@ span.input-icon {
   top: 21px;
   z-index: 1;
 }
+
 .wizard-steps li:last-child:before {
   max-width: 50%;
   width: 50%;
 }
+
 .wizard-steps li:first-child:before {
   max-width: 51%;
   left: 50%;
 }
+
 .wizard-steps li.active:before,
 .wizard-steps li.complete:before,
 .wizard-steps li.active .step,
 .wizard-steps li.complete .step {
   border-color: #5293c4;
 }
+
 .wizard-steps li.complete .step {
   cursor: default;
   color: #FFF;
@@ -758,6 +909,7 @@ span.input-icon {
   -o-transition: transform ease 0.1s;
   transition: transform ease 0.1s;
 }
+
 .wizard-steps li.complete .step:before {
   display: block;
   position: absolute;
@@ -775,6 +927,7 @@ span.input-icon {
   font-size: 17px;
   color: #87ba21;
 }
+
 .wizard-steps li.complete:hover .step {
   -moz-transform: scale(1.1);
   -webkit-transform: scale(1.1);
@@ -783,9 +936,11 @@ span.input-icon {
   transform: scale(1.1);
   border-color: #80afd4;
 }
+
 .wizard-steps li.complete:hover:before {
   border-color: #80afd4;
 }
+
 .wizard-steps li .title {
   display: block;
   margin-top: 4px;
@@ -797,24 +952,30 @@ span.input-icon {
   table-layout: fixed;
   word-wrap: break-word;
 }
+
 .wizard-steps li.complete .title,
 .wizard-steps li.active .title {
   color: #2b3d53;
 }
+
 .step-content {
   position: relative;
 }
+
 .step-content .step-pane {
   display: none;
   min-height: 200px;
   padding: 4px 8px 12px;
 }
+
 .step-content .step-pane.active {
   display: block;
 }
+
 .wizard-actions {
   text-align: right;
 }
+
 @media only screen and (max-width: 767px) {
   .wizard-steps li .step {
     width: 30px;
@@ -822,37 +983,43 @@ span.input-icon {
     line-height: 24px;
     border-width: 3px;
   }
+
   .wizard-steps li:before,
   .wizard-steps li:after {
     border-width: 3px;
   }
+
   .wizard-steps li.complete .step:before {
     line-height: 24px;
     font-size: 13px;
   }
+
   .wizard-steps li:before {
     top: 16px;
   }
+
   .step-content .step-pane {
     padding: 4px 4px 6px;
     min-height: 150px;
   }
 }
-.progress-bar-inverse{
+
+.progress-bar-inverse {
   background-color: #000000;
 }
-.progress-bar-pending{
+
+.progress-bar-pending {
   background-color: #C6C41D;
 }
 
 .sort-item {
-    padding: 2px;
-    width: 50px;
-    height: 20px;
-    cursor: move;
+  padding: 2px;
+  width: 50px;
+  height: 20px;
+  cursor: move;
 }
 
-.cube-dimension .dl-horizontal{
+.cube-dimension .dl-horizontal {
   margin-top: 0px !important;
   margin-bottom: 0px !important;
 }
@@ -863,12 +1030,15 @@ span.input-icon {
   border-radius: 3px;
   border: 1px solid #CCCCCC;
 }
+
 .chosen-container-single .chosen-single span {
   padding-top: 2px;
 }
+
 .chosen-container-single .chosen-single div b {
   margin-top: 2px;
 }
+
 .chosen-container-active .chosen-single,
 .chosen-container-active.chosen-with-drop .chosen-single {
   border-color: #ccc;
@@ -879,14 +1049,13 @@ span.input-icon {
   box-shadow: 0 0 8px rgba(82, 168, 236, .6)
 }
 
-
 //override callout info in AdinLTE.css
 .callout {
-   margin: 0 0 20px 0 !important;
-   padding: 15px 30px 15px 15px !important;
-   border-left: 5px solid #eee !important;
-   color: black !important;
- }
+  margin: 0 0 20px 0 !important;
+  padding: 15px 30px 15px 15px !important;
+  border-left: 5px solid #eee !important;
+  color: black !important;
+}
 
 .callout.callout-info {
   background-color: #f0f7fd !important;
@@ -895,8 +1064,8 @@ span.input-icon {
 }
 
 .callout.callout-danger {
-  background-color: #fcf2f2  !important;
-  border-color: #dFb5b4  !important;
+  background-color: #fcf2f2 !important;
+  border-color: #dFb5b4 !important;
   color: black !important;
 }
 
@@ -906,18 +1075,18 @@ span.input-icon {
   color: black !important;
 }
 
-ul.messenger-theme-ice .messenger-message{
-  color:#666667 !important;
+ul.messenger-theme-ice .messenger-message {
+  color: #666667 !important;
 }
-.messenger-message.alert{
+
+.messenger-message.alert {
   background-color: #f6f6f6 !important;
 }
 
-.model-dimension-edit .chosen-container{
-  width:100% !important;
+.model-dimension-edit .chosen-container {
+  width: 100% !important;
 }
 
-
 //overwrite style for abn-tree
 .abn-tree-animate-enter,
 li.abn-tree-row.ng-enter {
@@ -925,12 +1094,13 @@ li.abn-tree-row.ng-enter {
   position: relative;
   display: block;
   opacity: 0;
-  max-height:0px;
+  max-height: 0px;
 }
+
 .abn-tree-animate-enter.abn-tree-animate-enter-active,
-li.abn-tree-row.ng-enter-active{
+li.abn-tree-row.ng-enter-active {
   opacity: 1;
-  max-height:30px;
+  max-height: 30px;
 }
 
 .abn-tree-animate-leave,
@@ -938,65 +1108,69 @@ li.abn-tree-row.ng-leave {
   transition: 200ms linear all;
   position: relative;
   display: block;
-  height:30px;
+  height: 30px;
   max-height: 30px;
   opacity: 1;
 }
+
 .abn-tree-animate-leave.abn-tree-animate-leave-active,
 li.abn-tree-row.ng-leave-active {
   height: 0px;
-  max-height:0px;
+  max-height: 0px;
   opacity: 0;
 }
 
-
 /*
 ------------------------------------------
 Angular 1.2.0 Animation
 */
 
-
-.abn-tree-animate.ng-enter{
+.abn-tree-animate.ng-enter {
 
 }
-.abn-tree-animate.ng-enter{
+
+.abn-tree-animate.ng-enter {
 
 }
 
-.abn-tree .indented  {
+.abn-tree .indented {
   font-size: 13px;
   color: #3a87ad;
 }
-ul.abn-tree li.abn-tree-row a{
- word-break: break-all;
+
+ul.abn-tree li.abn-tree-row a {
+  word-break: break-all;
 }
-.model-design .btn-box-tool{
+
+.model-design .btn-box-tool {
   font-size: 13px !important;
 }
-.dropdown-menu a{
+
+.dropdown-menu a {
   cursor: pointer;
 }
 
-.box-2px{
-  border-top:solid 2px #3c8dbc !important;
+.box-2px {
+  border-top: solid 2px #3c8dbc !important;
 }
 
-.abn-tree i.indented{
-  font-size:14px !important;
+.abn-tree i.indented {
+  font-size: 14px !important;
 }
 
 //form validate
-.has-feedback{
+.has-feedback {
 
 }
-.highlight-bule{
-  color:#428bca !important;
+
+.highlight-bule {
+  color: #428bca !important;
 }
 
-.sweet-alert .lead.text-muted{
-  word-break:break-all;
+.sweet-alert .lead.text-muted {
+  word-break: break-all;
 }
 
-.modal-body.streaming-source .ace_editor{
+.modal-body.streaming-source .ace_editor {
   height: 600px !important;
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/less/home.less
----------------------------------------------------------------------
diff --git a/webapp/app/less/home.less b/webapp/app/less/home.less
index ed7a0a4..e123976 100644
--- a/webapp/app/less/home.less
+++ b/webapp/app/less/home.less
@@ -18,7 +18,7 @@
 /** Home page style **/
 .bg-holder {
   position: absolute;
-  top:0;
+  top: 0;
   left: 0;
   width: 100%;
 }
@@ -80,7 +80,7 @@
 }
 
 /** Login page **/
-.login-backgroud{
+.login-backgroud {
   background-color: #FFF;
 }
 
@@ -89,7 +89,7 @@
   margin: 0 auto;
 }
 
-.mylogin-body{
+.mylogin-body {
   margin-top: 100px;
 }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/less/layout.less
----------------------------------------------------------------------
diff --git a/webapp/app/less/layout.less b/webapp/app/less/layout.less
index 2553ab2..d9501f2 100644
--- a/webapp/app/less/layout.less
+++ b/webapp/app/less/layout.less
@@ -15,15 +15,16 @@
  * limitations under the License.
  */
 
-.navbar-fixed-top+.main-container {
+.navbar-fixed-top + .main-container {
   padding-top: 45px;
 }
 
-body{
+body {
   overflow: auto !important;
   min-width: 960px;
 
 }
+
 .main-container {
   padding-bottom: 45px;
   min-width: 960px;

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/less/navbar.less
----------------------------------------------------------------------
diff --git a/webapp/app/less/navbar.less b/webapp/app/less/navbar.less
index d56b98a..b3e4eeb 100644
--- a/webapp/app/less/navbar.less
+++ b/webapp/app/less/navbar.less
@@ -46,48 +46,49 @@
   padding-right: 12px;
 }
 
-@media only screen and (max-height: 320px){
+@media only screen and (max-height: 320px) {
   .navbar-fixed-top .navbar-collapse {
     max-height: 200px;
   }
 }
 
-@media only screen and (max-height: 360px){
+@media only screen and (max-height: 360px) {
   .navbar-fixed-top .navbar-collapse {
     max-height: 240px;
   }
 }
 
-@media only screen and (max-height: 400px){
+@media only screen and (max-height: 400px) {
   .navbar-fixed-top .navbar-collapse {
     max-height: 280px;
   }
 }
 
-@media only screen and (max-width: 991px){
+@media only screen and (max-width: 991px) {
   .navbar .navbar-nav {
     margin: 0 -6px;
   }
 }
 
-@media only screen and (max-width: 991px){
-  .navbar .navbar-nav>li:first-child {
+@media only screen and (max-width: 991px) {
+  .navbar .navbar-nav > li:first-child {
     border-top-width: 0;
   }
 }
-@media only screen and (max-width: 991px){
-  .navbar .navbar-nav>li, .navbar .navbar-nav>li:first-child {
+
+@media only screen and (max-width: 991px) {
+  .navbar .navbar-nav > li, .navbar .navbar-nav > li:first-child {
     border-width: 1px 0 0;
   }
 }
 
-@media only screen and (max-width: 991px){
-  .navbar .navbar-nav .dropdown-menu>li>a {
-    color: #FFF!important;
+@media only screen and (max-width: 991px) {
+  .navbar .navbar-nav .dropdown-menu > li > a {
+    color: #FFF !important;
   }
 }
 
-@media only screen and (max-width: 991px){
+@media only screen and (max-width: 991px) {
   .navbar .navbar-nav .dropdown-menu {
     float: none;
     position: relative;
@@ -97,24 +98,24 @@
   }
 }
 
-@media only screen and (max-width: 767px){
+@media only screen and (max-width: 767px) {
   .user-menu.dropdown-close.dropdown-menu-right {
-    right: 0!important;
+    right: 0 !important;
   }
 }
 
-.navbar .navbar-nav>li:first-child {
+.navbar .navbar-nav > li:first-child {
   border-width: 0 1px;
 }
 
-.navbar .navbar-nav>li {
-  border: 1px solid rgba(0,0,0,.2);
+.navbar .navbar-nav > li {
+  border: 1px solid rgba(0, 0, 0, .2);
   border-width: 0 1px 0 0;
 }
 
-.navbar .navbar-nav>li.open>a, .navbar .navbar-nav>li>a:focus, .navbar .navbar-nav>li>a:hover {
-  background-color: rgba(0,0,0,.1)!important;
-  color: #fff!important;
+.navbar .navbar-nav > li.open > a, .navbar .navbar-nav > li > a:focus, .navbar .navbar-nav > li > a:hover {
+  background-color: rgba(0, 0, 0, .1) !important;
+  color: #fff !important;
 }
 
 .navbar .navbar-brand:focus, .navbar .navbar-brand:hover {
@@ -130,38 +131,42 @@
   height: auto;
 }
 
-.navbar .navbar-nav>li>a {
+.navbar .navbar-nav > li > a {
   padding-top: 12px;
   padding-bottom: 11px;
   height: 45px;
   background-color: transparent;
   font-size: 13px;
   color: #fff;
-  text-shadow: 0 1px 0 rgba(0,0,0,.25);
+  text-shadow: 0 1px 0 rgba(0, 0, 0, .25);
 }
 
-.navbar-nav:not(.navbar-right)> li > a {
+.navbar-nav:not(.navbar-right) > li > a {
   font-size: 16px !important;
 }
-.navbar-nav> li.purple > a {
+
+.navbar-nav > li.purple > a {
   background-color: #892e65;
 }
-.navbar-nav> li.purple > a:link {
+
+.navbar-nav > li.purple > a:link {
+  background-color: #892e65 !important;
+}
+
+.navbar-nav > li.purple > a:visited {
   background-color: #892e65 !important;
- }
-.navbar-nav> li.purple > a:visited {
-  background-color: #892e65  !important;
 }
-.navbar-nav>li.purple>a:hover {
-  background-color: #762c59  !important;
+
+.navbar-nav > li.purple > a:hover {
+  background-color: #762c59 !important;
 }
 
-.navbar-nav> li.green > a {
+.navbar-nav > li.green > a {
   background-color: #2e8965;
 }
 
-.navbar-nav>li.green>a:hover {
-  background-color: #2c7659  !important;
+.navbar-nav > li.green > a:hover {
+  background-color: #2c7659 !important;
 }
 
 .user-info {
@@ -195,11 +200,11 @@
   margin-left: 7px;
 }
 
-.navbar .navbar-nav>li>.dropdown-menu>li>a {
+.navbar .navbar-nav > li > .dropdown-menu > li > a {
   line-height: 2;
 }
 
-.dropdown-menu>li>a {
+.dropdown-menu > li > a {
   font-size: 13px;
   padding-left: 11px;
   padding-right: 11px;
@@ -207,7 +212,7 @@
   margin-top: 1px;
 }
 
-.user-menu>li>a {
+.user-menu > li > a {
   padding: 4px 12px;
 }
 
@@ -215,7 +220,8 @@
   left: auto;
   right: -5px;
 }
-.navbar-nav>li>.dropdown-menu {
+
+.navbar-nav > li > .dropdown-menu {
   z-index: 1033;
 }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/partials/footer.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/footer.html b/webapp/app/partials/footer.html
index d0a513a..ca42ed0 100644
--- a/webapp/app/partials/footer.html
+++ b/webapp/app/partials/footer.html
@@ -17,12 +17,13 @@
 -->
 
 <nav class="navbar-inner">
-    <div class="container">
-        <div class="copyright">
+  <div class="container">
+    <div class="copyright">
             <span>
                 <a href="http://kylin.apache.org" style="color:#808080;"><i class="fa fa-home"></i> Apache Kylin</a> |
-                <a href="http://kylin.apache.org/community/" style="color:#808080;"><i class="fa fa-users"></i> Apache Kylin Community</a>
+                <a href="http://kylin.apache.org/community/" style="color:#808080;"><i class="fa fa-users"></i> Apache
+                  Kylin Community</a>
             </span>
-        </div>
     </div>
+  </div>
 </nav>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/partials/header.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/header.html b/webapp/app/partials/header.html
index b87fea1..6249f51 100644
--- a/webapp/app/partials/header.html
+++ b/webapp/app/partials/header.html
@@ -17,61 +17,68 @@
 -->
 
 <div class="navbar-container" id="navbar-container">
-    <div class="navbar navbar-default" role="navigation">
-        <div class="container-fluid">
-            <div class="navbar-header">
-                <a class="navbar-brand" href="query" style="padding: 2px 10px 0px 0px"><img src="image/logo.png" height="40px" width="40px"/><small> Kylin </small></a>
-            </div>
+  <div class="navbar navbar-default" role="navigation">
+    <div class="container-fluid">
+      <div class="navbar-header">
+        <a class="navbar-brand" href="query" style="padding: 2px 10px 0px 0px"><img src="image/logo.png" height="40px"
+                                                                                    width="40px"/>
+          <small> Kylin</small>
+        </a>
+      </div>
 
-            <div class="navbar-collapse collapse" collapse="isCollapsed">
-                <ul class="nav navbar-nav">
-                    <li class="project-cntnr"  style="padding:7px 15px;background-color:#2e8965;" ng-if="userService.isAuthorized()">
-                        <select chosen ng-model="projectModel.selectedProject" ng-init="newAccess.permission=permissions.READ.value;"
-                                ng-options="project.name as project.name for project in projectModel.projects"
-                                style="width: 180px"
-                                data-placeholder="select a project"
-                                class="chosen-select">
-                            <option ng-if="userService.hasRole('ROLE_ADMIN')" ng-selected="projectModel.selectedProject==null"  value=""> -- Choose Project -- </option>
-                        </select>
-                    </li>
-                    <li class="{{activeTab=='query'?'purple':'green'}}" ng-if="userService.isAuthorized()">
-                        <a href="query">Insight</a>
-                    </li>
-                    <li class="{{activeTab=='models'?'purple':'green'}}" ng-if="userService.isAuthorized()">
-                        <a href="models">Model</a>
-                    </li>
-                    <li class="{{activeTab=='jobs'?'purple':'green'}}" ng-if="userService.isAuthorized()">
-                        <a href="jobs">Monitor</a>
-                    </li>
-                    <li class="{{activeTab=='admin'?'purple':'green'}}" ng-if="userService.isAuthorized()">
-                        <a href="admin">System</a>
-                    </li>
-                </ul>
-                <ul class="nav navbar-nav navbar-right">
-                    <li class="dropdown light-blue" ng-if="config.documents.length > 0">
-                        <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-book"></i> Help <i class="ace-icon fa fa-caret-down"></i></a>
-                        <ul class="user-menu dropdown-menu-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
-                            <li ng-repeat="document in config.documents" ng-if="document.link">
-                                <a target="_blank" href="{{document.link}}" >{{document.displayName}}</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="purple" ng-if="!userService.isAuthorized()"><a href="login">Login</a></li>
-                    <li class="dropdown light-blue" ng-if="userService.isAuthorized()">
-                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">
-                            <span class="user-info"><small>Welcome,</small> {{userService.getCurUser().userDetails.username}}</span>
-                            <i class="ace-icon fa fa-caret-down"></i>
-                        </a>
-                        <ul class="user-menu dropdown-menu-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close" role="menu">
-                            <li> <a ng-click="logout()"><i class="ace-icon fa fa-power-off"></i> Logout</a> </li>
-                        </ul>
-                    </li>
-                </ul>
-            </div>
-        </div>
+      <div class="navbar-collapse collapse" collapse="isCollapsed">
+        <ul class="nav navbar-nav">
+          <li class="project-cntnr" style="padding:7px 15px;background-color:#2e8965;"
+              ng-if="userService.isAuthorized()">
+            <select chosen ng-model="projectModel.selectedProject"
+                    ng-init="newAccess.permission=permissions.READ.value;"
+                    ng-options="project.name as project.name for project in projectModel.projects"
+                    style="width: 180px"
+                    data-placeholder="select a project"
+                    class="chosen-select">
+              <option ng-if="userService.hasRole('ROLE_ADMIN')" ng-selected="projectModel.selectedProject==null"
+                      value=""> -- Choose Project --
+              </option>
+            </select>
+          </li>
+          <li class="{{activeTab=='query'?'purple':'green'}}" ng-if="userService.isAuthorized()">
+            <a href="query">Insight</a>
+          </li>
+          <li class="{{activeTab=='models'?'purple':'green'}}" ng-if="userService.isAuthorized()">
+            <a href="models">Model</a>
+          </li>
+          <li class="{{activeTab=='jobs'?'purple':'green'}}" ng-if="userService.isAuthorized()">
+            <a href="jobs">Monitor</a>
+          </li>
+          <li class="{{activeTab=='admin'?'purple':'green'}}" ng-if="userService.isAuthorized()">
+            <a href="admin">System</a>
+          </li>
+        </ul>
+        <ul class="nav navbar-nav navbar-right">
+          <li class="dropdown light-blue" ng-if="config.documents.length > 0">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-book"></i> Help <i
+              class="ace-icon fa fa-caret-down"></i></a>
+            <ul class="user-menu dropdown-menu-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
+              <li ng-repeat="document in config.documents" ng-if="document.link">
+                <a target="_blank" href="{{document.link}}">{{document.displayName}}</a>
+              </li>
+            </ul>
+          </li>
+          <li class="purple" ng-if="!userService.isAuthorized()"><a href="login">Login</a></li>
+          <li class="dropdown light-blue" ng-if="userService.isAuthorized()">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+              <span class="user-info"><small>Welcome,</small> {{userService.getCurUser().userDetails.username}}</span>
+              <i class="ace-icon fa fa-caret-down"></i>
+            </a>
+            <ul class="user-menu dropdown-menu-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close"
+                role="menu">
+              <li><a ng-click="logout()"><i class="ace-icon fa fa-power-off"></i> Logout</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
     </div>
-
-
+  </div>
 
 
 </div>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/partials/home.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/home.html b/webapp/app/partials/home.html
index f6c63d0..1e5cf02 100644
--- a/webapp/app/partials/home.html
+++ b/webapp/app/partials/home.html
@@ -18,48 +18,48 @@
 
 <!--Big Background Image-->
 <div class="bg-holder">
-    <img src="image/Himg.png" />
+  <img src="image/Himg.png"/>
 </div>
 
 <!--Carousel Part-->
 <div style="height: 442px;">
-    <carousel interval="myInterval">
-        <slide ng-repeat="slide in slides" active="slide.active">
-            <img ng-src="{{slide.image}}" />
-            <div class="carousel-caption">
-                <h1>{{slide.caption}}</h1>
-                <p>{{slide.text}}</p>
-            </div>
-        </slide>
-    </carousel>
+  <carousel interval="myInterval">
+    <slide ng-repeat="slide in slides" active="slide.active">
+      <img ng-src="{{slide.image}}"/>
+      <div class="carousel-caption">
+        <h1>{{slide.caption}}</h1>
+        <p>{{slide.text}}</p>
+      </div>
+    </slide>
+  </carousel>
 </div>
 
 <!--Features Part-->
 <div id="features" class="container marketing">
-    <div class="row">
-        <div class="col-xs-12 col-sm-4 feature">
-            <a><i class="fa fa-cubes fa-5x"></i></a>
-            <h2>Create Cube</h2>
-            <p>Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies
-                vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo
-                cursus magna.</p>
-            <p><a class="btn btn-default" href="cubes" role="button">View details �</a></p>
-        </div>
-        <div class="col-xs-12 col-sm-4 feature">
-            <a><i class="fa fa-tasks fa-5x"></i></a>
-            <h2>Query Online</h2>
-            <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras
-                mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris
-                condimentum nibh.</p>
-            <p><a class="btn btn-default" href="query" role="button">View details �</a></p>
-        </div>
-        <div class="col-xs-12 col-sm-4 feature">
-            <a><i class="fa fa-sort-amount-asc fa-5x"></i></a>
-            <h2>Jobs</h2>
-            <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula
-                porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh,
-                ut fermentum massa justo sit amet risus.</p>
-            <p><a class="btn btn-default" href="jobs" role="button">View details �</a></p>
-        </div>
+  <div class="row">
+    <div class="col-xs-12 col-sm-4 feature">
+      <a><i class="fa fa-cubes fa-5x"></i></a>
+      <h2>Create Cube</h2>
+      <p>Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies
+        vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo
+        cursus magna.</p>
+      <p><a class="btn btn-default" href="cubes" role="button">View details �</a></p>
     </div>
+    <div class="col-xs-12 col-sm-4 feature">
+      <a><i class="fa fa-tasks fa-5x"></i></a>
+      <h2>Query Online</h2>
+      <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras
+        mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris
+        condimentum nibh.</p>
+      <p><a class="btn btn-default" href="query" role="button">View details �</a></p>
+    </div>
+    <div class="col-xs-12 col-sm-4 feature">
+      <a><i class="fa fa-sort-amount-asc fa-5x"></i></a>
+      <h2>Jobs</h2>
+      <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula
+        porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh,
+        ut fermentum massa justo sit amet risus.</p>
+      <p><a class="btn btn-default" href="jobs" role="button">View details �</a></p>
+    </div>
+  </div>
 </div>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/partials/login.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/login.html b/webapp/app/partials/login.html
index 452257b..faffb87 100644
--- a/webapp/app/partials/login.html
+++ b/webapp/app/partials/login.html
@@ -17,45 +17,47 @@
 -->
 
 <div class="my-light-login login-layout login-backgroud">
-    <div class="main-container ">
-        <div class="main-content row">
-            <div class="col-sm-10 col-sm-offset-1">
-                <div class="login-container mylogin-body">
-                    <div class="login-box box box-solid">
-                        <div class="box-header">
-                            <div class="box-title">
-                                <h4 class="header blue lighter bigger"> <i class="ace-icon fa fa-coffee green"></i> Sign in </h4>
-                            </div>
-                        </div>
-                        <div class="box-body">
-                            <div class="alert alert-danger animated fadeIn" ng-if="error">{{error}}</div>
-                            <form name="login_form" ng-submit="login()">
-                                <div class="form-group">
+  <div class="main-container ">
+    <div class="main-content row">
+      <div class="col-sm-10 col-sm-offset-1">
+        <div class="login-container mylogin-body">
+          <div class="login-box box box-solid">
+            <div class="box-header">
+              <div class="box-title">
+                <h4 class="header blue lighter bigger"><i class="ace-icon fa fa-coffee green"></i> Sign in </h4>
+              </div>
+            </div>
+            <div class="box-body">
+              <div class="alert alert-danger animated fadeIn" ng-if="error">{{error}}</div>
+              <form name="login_form" ng-submit="login()">
+                <div class="form-group">
                                     <span class="width-100 input-icon input-icon-right">
-                                        <input id="username" class="form-control" ng-model="username" type="text" autofocus="autofocus" ng-required placeholder="Username" auto-fill-sync />
+                                        <input id="username" class="form-control" ng-model="username" type="text"
+                                               autofocus="autofocus" ng-required placeholder="Username" auto-fill-sync/>
                                         <i class="ace-icon fa fa-user"></i>
                                     </span>
-                                </div>
-                                <div class="form-group">
+                </div>
+                <div class="form-group">
                                     <span class="width-100 input-icon input-icon-right">
-                                        <input id="password" class="form-control" ng-model="password" type="password" ng-required placeholder="Password" auto-fill-sync />
+                                        <input id="password" class="form-control" ng-model="password" type="password"
+                                               ng-required placeholder="Password" auto-fill-sync/>
                                         <i class="ace-icon fa fa-lock"></i>
                                     </span>
-                                </div>
-                                <div class="space"></div>
-                                <div class="form-group">
-                                    <a href="http://kylin.apache.org/community/" target="_blank" class="text-muted">Login Issue?</a>
-                                    <button class="pull-right btn btn-sm btn-primary" type="submit" ng-disabled="login_form.$invalid">
-                                        <i class="ace-icon fa fa-key"></i>
-                                        <span class="bigger-110">{{loading? 'Logging In...': 'Log In'}}</span>
-                                    </button>
-                                </div>
-                                <div class="space-4"></div>
-                            </form>
-                        </div>
-                    </div>
                 </div>
+                <div class="space"></div>
+                <div class="form-group">
+                  <a href="http://kylin.apache.org/community/" target="_blank" class="text-muted">Login Issue?</a>
+                  <button class="pull-right btn btn-sm btn-primary" type="submit" ng-disabled="login_form.$invalid">
+                    <i class="ace-icon fa fa-key"></i>
+                    <span class="bigger-110">{{loading? 'Logging In...': 'Log In'}}</span>
+                  </button>
+                </div>
+                <div class="space-4"></div>
+              </form>
             </div>
+          </div>
         </div>
+      </div>
     </div>
+  </div>
 </div>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/routes.json
----------------------------------------------------------------------
diff --git a/webapp/app/routes.json b/webapp/app/routes.json
index f4a2e91..75be448 100644
--- a/webapp/app/routes.json
+++ b/webapp/app/routes.json
@@ -1,100 +1,100 @@
 [
-    {
-        "url": "/jobs",
-        "params": {
-            "templateUrl": "partials/jobs/jobs.html",
-            "tab": "jobs",
-            "controller": "JobCtrl"
-        }
-    },
-    {
-        "url": "/projects",
-        "params": {
-            "templateUrl": "partials/projects/projects.html",
-            "tab": "query",
-            "controller": "ProjectCtrl"
-        }
-    },
-    {
-        "url": "/cubes/add/",
-        "params": {
-            "templateUrl": "partials/cubes/cube_edit.html",
-            "tab": "models",
-            "controller": "CubeEditCtrl"
-        }
-    },
-    {
-        "url": "/cubes/edit/:cubeName/json",
-        "params": {
-            "templateUrl": "partials/cubes/cube_json_edit.html",
-            "tab": "models",
-            "controller": "CubeEditCtrl"
-        }
-    },
-    {
-        "url": "/cubes/edit/:cubeName",
-        "params": {
-            "templateUrl": "partials/cubes/cube_edit.html",
-            "tab": "models",
-            "controller": "CubeEditCtrl"
-        }
-    },
-    {
-        "url": "/sourceMeta",
-        "params": {
-            "templateUrl": "partials/tables/source_metadata.html",
-            "tab": "sourceMeta",
-            "controller": "SourceMetaCtrl"
-        }
-    },
-    {
-        "url": "/query",
-        "params": {
-            "templateUrl": "partials/query/query.html",
-            "tab": "query",
-            "controller": "QueryCtrl",
-            "reloadOnSearch": false
-        }
-    },
-    {
-        "url": "/admin",
-        "params": {
-            "templateUrl": "partials/admin/admin.html",
-            "tab": "admin",
-            "controller": "AdminCtrl",
-            "reloadOnSearch": false
-        }
-    },
-    {
-        "url": "/login",
-        "params": {
-            "templateUrl": "partials/login.html",
-            "controller": "LoginCtrl",
-            "reloadOnSearch": false
-        }
-    },
-    {
-        "url": "/models",
-        "params": {
-            "templateUrl": "partials/models/models.html",
-            "tab": "models",
-            "controller": "ModelsCtrl"
-        }
-    },
-    {
-        "url": "/models/add",
-        "params": {
-            "templateUrl": "partials/models/model_edit.html",
-            "tab": "models",
-            "controller": "ModelEditCtrl"
-        }
-    },
-    {
-        "url": "/models/edit/:modelName",
-        "params": {
-            "templateUrl": "partials/models/model_edit.html",
-            "tab": "models",
-            "controller": "ModelEditCtrl"
-        }
+  {
+    "url": "/jobs",
+    "params": {
+      "templateUrl": "partials/jobs/jobs.html",
+      "tab": "jobs",
+      "controller": "JobCtrl"
     }
+  },
+  {
+    "url": "/projects",
+    "params": {
+      "templateUrl": "partials/projects/projects.html",
+      "tab": "query",
+      "controller": "ProjectCtrl"
+    }
+  },
+  {
+    "url": "/cubes/add/",
+    "params": {
+      "templateUrl": "partials/cubes/cube_edit.html",
+      "tab": "models",
+      "controller": "CubeEditCtrl"
+    }
+  },
+  {
+    "url": "/cubes/edit/:cubeName/json",
+    "params": {
+      "templateUrl": "partials/cubes/cube_json_edit.html",
+      "tab": "models",
+      "controller": "CubeEditCtrl"
+    }
+  },
+  {
+    "url": "/cubes/edit/:cubeName",
+    "params": {
+      "templateUrl": "partials/cubes/cube_edit.html",
+      "tab": "models",
+      "controller": "CubeEditCtrl"
+    }
+  },
+  {
+    "url": "/sourceMeta",
+    "params": {
+      "templateUrl": "partials/tables/source_metadata.html",
+      "tab": "sourceMeta",
+      "controller": "SourceMetaCtrl"
+    }
+  },
+  {
+    "url": "/query",
+    "params": {
+      "templateUrl": "partials/query/query.html",
+      "tab": "query",
+      "controller": "QueryCtrl",
+      "reloadOnSearch": false
+    }
+  },
+  {
+    "url": "/admin",
+    "params": {
+      "templateUrl": "partials/admin/admin.html",
+      "tab": "admin",
+      "controller": "AdminCtrl",
+      "reloadOnSearch": false
+    }
+  },
+  {
+    "url": "/login",
+    "params": {
+      "templateUrl": "partials/login.html",
+      "controller": "LoginCtrl",
+      "reloadOnSearch": false
+    }
+  },
+  {
+    "url": "/models",
+    "params": {
+      "templateUrl": "partials/models/models.html",
+      "tab": "models",
+      "controller": "ModelsCtrl"
+    }
+  },
+  {
+    "url": "/models/add",
+    "params": {
+      "templateUrl": "partials/models/model_edit.html",
+      "tab": "models",
+      "controller": "ModelEditCtrl"
+    }
+  },
+  {
+    "url": "/models/edit/:modelName",
+    "params": {
+      "templateUrl": "partials/models/model_edit.html",
+      "tab": "models",
+      "controller": "ModelEditCtrl"
+    }
+  }
 ]

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/bower.json
----------------------------------------------------------------------
diff --git a/webapp/bower.json b/webapp/bower.json
index 9fd080f..4d5a311 100755
--- a/webapp/bower.json
+++ b/webapp/bower.json
@@ -31,7 +31,7 @@
     "angular-bootstrap-nav-tree": "*",
     "components-font-awesome": "~4.3.0",
     "bootstrap-sweetalert": "~0.4.3",
-    "angular-toggle-switch":"1.3.0",
+    "angular-toggle-switch": "1.3.0",
     "angular-ui-select": "0.13.2",
     "angular-sanitize": "1.2.18",
     "angular-tree-control": "0.2.8",

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/grunt.json
----------------------------------------------------------------------
diff --git a/webapp/grunt.json b/webapp/grunt.json
index 7a7e4c8..3c2cbf8 100755
--- a/webapp/grunt.json
+++ b/webapp/grunt.json
@@ -1,75 +1,81 @@
 {
-    "bump": {
-        "options": {
-            "files": ["package.json"],
-            "commitFiles": ["package.json", "bower.json",  "CHANGELOG.md"]
-        }
+  "bump": {
+    "options": {
+      "files": [
+        "package.json"
+      ],
+      "commitFiles": [
+        "package.json",
+        "bower.json",
+        "CHANGELOG.md"
+      ]
+    }
+  },
+  "concat": {
+    "components": {
+      "src": [
+        "app/components/jquery/dist/jquery.min.js",
+        "app/components/bootstrap/dist/js/bootstrap.min.js",
+        "app/components/angular/angular.js",
+        "app/components/angular-animate/angular-animate.min.js",
+        "app/components/angular-route/angular-route.min.js",
+        "app/components/angular-resource/angular-resource.js",
+        "app/components/angular-bootstrap/ui-bootstrap-tpls.min.js",
+        "app/components/angular-cookies/angular-cookies.js",
+        "app/components/angularLocalStorage/src/angularLocalStorage.js",
+        "app/components/angular-base64/angular-base64.min.js",
+        "app/components/ng-grid/build/ng-grid.js",
+        "app/components/ace-builds/src-min-noconflict/ace.js",
+        "app/components/ace-builds/src-min-noconflict/ext-language_tools.js",
+        "app/components/ace-builds/src-min-noconflict/mode-json.js",
+        "app/components/ace-builds/src-min-noconflict/mode-sql.js",
+        "app/components/ace-builds/src-min-noconflict/theme-chrome.js",
+        "app/components/angular-ui-ace/ui-ace.min.js",
+        "app/components/messenger/build/js/messenger.min.js",
+        "app/components/messenger/build/js/messenger-theme-future.js",
+        "app/components/chosen/chosen.jquery.min.js",
+        "app/components/angular-chosen-localytics/chosen.js",
+        "app/components/moment/min/moment.min.js",
+        "app/components/d3/d3.min.js",
+        "app/components/nvd3/nv.d3.min.js",
+        "app/components/angularjs-nvd3-directives/dist/angularjs-nvd3-directives.js",
+        "app/components/bootstrap-sweetalert/lib/sweet-alert.js",
+        "app/components/angular-sweetalert/SweetAlert.js",
+        "app/components/underscore/underscore.js",
+        "app/components/angular-underscore/angular-underscore.js",
+        "app/components/jquery-ui/jquery-ui.min.js",
+        "app/components/angular-ui-sortable/sortable.js",
+        "app/components/angular-toggle-switch/angular-toggle-switch.js",
+        "app/components/angular-ui-select/dist/select.js",
+        "app/components/angular-sanitize/angular-sanitize.js",
+        "tmp/js/scripts.js"
+      ],
+      "dest": "tmp/js/scripts.min.js"
     },
-    "concat": {
-        "components": {
-            "src": [
-                "app/components/jquery/dist/jquery.min.js",
-                "app/components/bootstrap/dist/js/bootstrap.min.js",
-                "app/components/angular/angular.js",
-                "app/components/angular-animate/angular-animate.min.js",
-                "app/components/angular-route/angular-route.min.js",
-                "app/components/angular-resource/angular-resource.js",
-                "app/components/angular-bootstrap/ui-bootstrap-tpls.min.js",
-                "app/components/angular-cookies/angular-cookies.js",
-                "app/components/angularLocalStorage/src/angularLocalStorage.js",
-                "app/components/angular-base64/angular-base64.min.js",
-                "app/components/ng-grid/build/ng-grid.js",
-                "app/components/ace-builds/src-min-noconflict/ace.js",
-                "app/components/ace-builds/src-min-noconflict/ext-language_tools.js",
-                "app/components/ace-builds/src-min-noconflict/mode-json.js",
-                "app/components/ace-builds/src-min-noconflict/mode-sql.js",
-                "app/components/ace-builds/src-min-noconflict/theme-chrome.js",
-                "app/components/angular-ui-ace/ui-ace.min.js",
-                "app/components/messenger/build/js/messenger.min.js",
-                "app/components/messenger/build/js/messenger-theme-future.js",
-                "app/components/chosen/chosen.jquery.min.js",
-                "app/components/angular-chosen-localytics/chosen.js",
-                "app/components/moment/min/moment.min.js",
-                "app/components/d3/d3.min.js",
-                "app/components/nvd3/nv.d3.min.js",
-                "app/components/angularjs-nvd3-directives/dist/angularjs-nvd3-directives.js",
-                "app/components/bootstrap-sweetalert/lib/sweet-alert.js",
-                "app/components/angular-sweetalert/SweetAlert.js",
-                "app/components/underscore/underscore.js",
-                "app/components/angular-underscore/angular-underscore.js",
-                "app/components/jquery-ui/jquery-ui.min.js",
-                "app/components/angular-ui-sortable/sortable.js",
-                "app/components/angular-toggle-switch/angular-toggle-switch.js",
-                "app/components/angular-ui-select/dist/select.js",
-                "app/components/angular-sanitize/angular-sanitize.js",
-                "tmp/js/scripts.js"
-            ],
-            "dest": "tmp/js/scripts.min.js"
-        },
-        "css": {
-            "src": [
-                "app/components/bootstrap/dist/css/bootstrap.min.css",
-                "app/components/components-font-awesome/css/font-awesome.css",
-                "app/components/ng-grid/ng-grid.css",
-                "app/components/angular-tree-control/css/tree-control.css",
-                "app/components/angular-tree-control/css/tree-control-attribute.css",
-                "app/components/angular-ui-grid/ui-grid.min.css",
-                "app/components/animate.css/animate.min.css",
-                "app/components/messenger/build/css/messenger.css",
-                "app/components/messenger/build/css/messenger-theme-ice.css",
-                "app/components/chosen/chosen.css",
-                "app/components/angular-chosen-localytics/chosen-spinner.css",
-                "app/components/nvd3/nv.d3.min.css",
-                "app/css/AdminLTE.css",
-                "app/css/skins/_all-skins.min.css",
-                "app/components/bootstrap-sweetalert/lib/sweet-alert.css",
-                "app/components/angular-bootstrap-nav-tree/dist/abn_tree.css",
-                "app/components/angular-toggle-switch/angular-toggle-switch.css",
-                "app/components/angular-ui-select/dist/select.css",
-                "app/components/angular-bootstrap-datetimepicker/src/css/datetimepicker.css",
-                "tmp/css/styles.css"
-            ],
-            "dest": "tmp/css/styles.min.css"
-        }
+    "css": {
+      "src": [
+        "app/components/bootstrap/dist/css/bootstrap.min.css",
+        "app/components/components-font-awesome/css/font-awesome.css",
+        "app/components/ng-grid/ng-grid.css",
+        "app/components/angular-tree-control/css/tree-control.css",
+        "app/components/angular-tree-control/css/tree-control-attribute.css",
+        "app/components/angular-ui-grid/ui-grid.min.css",
+        "app/components/animate.css/animate.min.css",
+        "app/components/messenger/build/css/messenger.css",
+        "app/components/messenger/build/css/messenger-theme-ice.css",
+        "app/components/chosen/chosen.css",
+        "app/components/angular-chosen-localytics/chosen-spinner.css",
+        "app/components/nvd3/nv.d3.min.css",
+        "app/css/AdminLTE.css",
+        "app/css/skins/_all-skins.min.css",
+        "app/components/bootstrap-sweetalert/lib/sweet-alert.css",
+        "app/components/angular-bootstrap-nav-tree/dist/abn_tree.css",
+        "app/components/angular-toggle-switch/angular-toggle-switch.css",
+        "app/components/angular-ui-select/dist/select.css",
+        "app/components/angular-bootstrap-datetimepicker/src/css/datetimepicker.css",
+        "tmp/css/styles.css"
+      ],
+      "dest": "tmp/css/styles.min.css"
     }
+  }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/package.json
----------------------------------------------------------------------
diff --git a/webapp/package.json b/webapp/package.json
index a588a75..b11a162 100644
--- a/webapp/package.json
+++ b/webapp/package.json
@@ -1,22 +1,22 @@
 {
-    "name": "base",
-    "version": "0.0.1",
-    "description": "Client Base Applicaion",
-    "author": "DataHub",
-    "repository": {
-        "type:": "git",
-        "url": "https://github.com/KylinOLAP/Kylin.git"
-    },
-    "devDependencies": {
-        "grunt": "~0.4.x",
-        "grunt-cli": "~0.1.13",
-        "grunt-contrib": "~0.7.0",
-        "grunt-html2js": "~0.1.3",
-        "grunt-bump": "0.0.6",
-        "grunt-htmlrefs": "~0.4.1",
-        "grunt-regex-replace": "~0.2.5",
-        "grunt-lesslint": "~0.8.0",
-        "grunt-manifest": "~0.4.0",
-        "grunt-conventional-changelog": "~0.1.2"
-    }
+  "name": "base",
+  "version": "0.0.1",
+  "description": "Client Base Applicaion",
+  "author": "DataHub",
+  "repository": {
+    "type:": "git",
+    "url": "https://github.com/KylinOLAP/Kylin.git"
+  },
+  "devDependencies": {
+    "grunt": "~0.4.x",
+    "grunt-cli": "~0.1.13",
+    "grunt-contrib": "~0.7.0",
+    "grunt-html2js": "~0.1.3",
+    "grunt-bump": "0.0.6",
+    "grunt-htmlrefs": "~0.4.1",
+    "grunt-regex-replace": "~0.2.5",
+    "grunt-lesslint": "~0.8.0",
+    "grunt-manifest": "~0.4.0",
+    "grunt-conventional-changelog": "~0.1.2"
+  }
 }


[5/5] kylin git commit: KYLIN-1786 UI for extended column

Posted by zh...@apache.org.
KYLIN-1786 UI for extended column


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/48180ec5
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/48180ec5
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/48180ec5

Branch: refs/heads/master
Commit: 48180ec5f1d1315e952fd719ba0b640b2eab312a
Parents: 95eb2ff
Author: Jason <ji...@163.com>
Authored: Mon Jul 11 23:53:53 2016 +0800
Committer: Jason <ji...@163.com>
Committed: Tue Jul 12 20:25:25 2016 +0800

----------------------------------------------------------------------
 webapp/app/js/directives/directives.js         | 43 ++++++++++++++++++
 webapp/app/js/model/cubeConfig.js              |  2 +-
 webapp/app/partials/cubeDesigner/measures.html | 49 ++++++++++++++++++---
 3 files changed, 86 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/48180ec5/webapp/app/js/directives/directives.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/directives/directives.js b/webapp/app/js/directives/directives.js
index ae90c82..4b83865 100644
--- a/webapp/app/js/directives/directives.js
+++ b/webapp/app/js/directives/directives.js
@@ -332,6 +332,29 @@ KylinApp.directive('kylinPagination', function ($parse, $q) {
       };
     }
   };
+}).directive("extendedcolumntree", function($compile) {
+  return {
+    restrict: "E",
+    transclude: true,
+    scope: {
+      nextpara: '='
+    },
+    template:
+    '<li class="parent_li">Host Column:<b>{{nextpara.value}}</b></b></li>' +
+    '<li class="parent_li">Extended Column:<b>{{nextpara.next_parameter.value}}</b></li>',
+    compile: function(tElement, tAttr, transclude) {
+      var contents = tElement.contents().remove();
+      var compiledContents;
+      return function(scope, iElement, iAttr) {
+        if(!compiledContents) {
+          compiledContents = $compile(contents, transclude);
+        }
+        compiledContents(scope, function(clone, scope) {
+          iElement.append(clone);
+        });
+      };
+    }
+  };
 }).directive('kylinpopover', function ($compile,$templateCache) {
   return {
     restrict: "A",
@@ -355,4 +378,24 @@ KylinApp.directive('kylinPagination', function ($parse, $q) {
       $(element).popover(options);
     }
   };
+}).directive('extendedColumnReturn', function() {
+  return {
+    require: 'ngModel',
+    link: function(scope, element, attrs, ngModelController) {
+
+      var prefix = "extendedcolumn(";
+      var suffix = ")";
+      ngModelController.$parsers.push(function(data) {
+        //convert data from view format to model format
+        return prefix +data+suffix; //converted
+      });
+
+      ngModelController.$formatters.push(function(data) {
+        //convert data from model format to view format
+        var prefixIndex = data.indexOf("(")+1;
+        var suffixIndex = data.indexOf(")");
+        return data.substring(prefixIndex,suffixIndex); //converted
+      });
+    }
+  }
 });

http://git-wip-us.apache.org/repos/asf/kylin/blob/48180ec5/webapp/app/js/model/cubeConfig.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/model/cubeConfig.js b/webapp/app/js/model/cubeConfig.js
index 82dfca4..88e2133 100644
--- a/webapp/app/js/model/cubeConfig.js
+++ b/webapp/app/js/model/cubeConfig.js
@@ -20,7 +20,7 @@ KylinApp.constant('cubeConfig', {
 
   //~ Define metadata & class
   measureParamType: ['column', 'constant'],
-  measureExpressions: ['SUM', 'MIN', 'MAX', 'COUNT', 'COUNT_DISTINCT',"TOP_N", 'RAW'],
+  measureExpressions: ['SUM', 'MIN', 'MAX', 'COUNT', 'COUNT_DISTINCT',"TOP_N", 'RAW','EXTENDED_COLUMN'],
   dimensionDataTypes: ["string", "tinyint", "int", "bigint", "date"],
   cubePartitionTypes: ['APPEND'],
   joinTypes: [

http://git-wip-us.apache.org/repos/asf/kylin/blob/48180ec5/webapp/app/partials/cubeDesigner/measures.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/cubeDesigner/measures.html b/webapp/app/partials/cubeDesigner/measures.html
index 5778003..8fcefe3 100755
--- a/webapp/app/partials/cubeDesigner/measures.html
+++ b/webapp/app/partials/cubeDesigner/measures.html
@@ -43,8 +43,9 @@
                           <td>
                             <div class="paraTree">
                               <ul>
-                                <parametertree ng-if="measure.function.parameter!=null && measure.function.expression!=='TOP_N'" nextpara="measure.function.parameter"></parametertree>
+                                <parametertree ng-if="measure.function.parameter!=null && measure.function.expression!=='TOP_N' && measure.function.expression!=='EXTENDED_COLUMN'" nextpara="measure.function.parameter"></parametertree>
                                 <topntree ng-if="measure.function.parameter!=null && measure.function.expression=='TOP_N'" nextpara="measure.function.parameter"></topntree>
+                                <extendedcolumntree ng-if="measure.function.parameter!=null && measure.function.expression=='EXTENDED_COLUMN'" nextpara="measure.function.parameter"></extendedcolumntree>
                               </ul>
                             </div>
                         <!--<span ng-if="measure.function.parameter.next_parameter!=null">{{measure.function.parameter.next_parameter |json}}</span>-->
@@ -133,7 +134,8 @@
                       <div class="form-group middle-popover">
                           <div class="row">
                               <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default">
-                                <b>Param Value</b>  <i class="fa fa-info-circle" kylinpopover placement="right" title="Param Value" template="paramvalueTip.html"></i>
+                                <b ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'">Host Column On Fact Table</b>
+                                <b ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN'">Param Value</b>  <i class="fa fa-info-circle" kylinpopover placement="right" title="Param Value" template="paramvalueTip.html"></i>
                                 <!--tip for top_n-->
                                 <small ng-if="newMeasure.function.expression == 'TOP_N'" class="help-block" style="color:#3a87ad">(SUM|ORDER BY Column for TOP_N)</small>
                               </label>
@@ -158,7 +160,9 @@
                       <!--Return Type-->
                       <div class="form-group">
                           <div class="row">
-                              <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Return Type</b></label>
+                              <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default">
+                                <b>Return Type</b>  <i ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" class="fa fa-info-circle" kylinpopover placement="right" title="Return Type" template="returnTypeTip.html"></i>
+                              </label>
                               <div class="col-xs-12 col-sm-6">
                                   <select class="form-control"
                                       ng-if="newMeasure.function.expression == 'COUNT_DISTINCT'"
@@ -174,8 +178,16 @@
                                         ng-options="ddt.value as ddt.name for ddt in cubeConfig.topNTypes">
                                   <option value=""></option>
                                 </select>
+
+                                <input extended-column-return
+                                  ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'"
+                                  type="text" placeholder="Return type.." class="form-control"
+                                        tooltip-trigger="focus"
+                                        ng-init=""
+                                       ng-model="newMeasure.function.returntype" required />
+
                                   <span class="font-color-default"
-                                        ng-if="newMeasure.function.expression != 'COUNT_DISTINCT' && newMeasure.function.expression != 'TOP_N'"
+                                        ng-if="newMeasure.function.expression != 'COUNT_DISTINCT' && newMeasure.function.expression != 'TOP_N' && newMeasure.function.expression != 'EXTENDED_COLUMN' "
                                        ><b>&nbsp;&nbsp;{{newMeasure.function.returntype | uppercase}}</b>
                                   </span>
                               </div>
@@ -227,6 +239,9 @@
                             <button class="btn btn-sm btn-info" ng-click="addNextParameter()" ng-show="newMeasure.function.expression == 'TOP_N' && nextParameters.length==0"
                                     ng-show="state.mode=='edit'"><i class="fa fa-plus"> Group by Column</i>
                             </button>
+                            <button class="btn btn-sm btn-info" ng-click="addNextParameter()" ng-show="newMeasure.function.expression == 'EXTENDED_COLUMN' && nextParameters.length==0"
+                                    ng-show="state.mode=='edit'"><i class="fa fa-plus"> Extended Column On Fact Table</i>
+                            </button>
                           </div>
                         </div>
                       </div>
@@ -248,7 +263,7 @@
 
 <script type="text/ng-template" id="nextParameter.html">
   <div class="modal-header">
-    <h4 tooltip="submit" ng-if="newmea.measure&&newmea.measure.function.expression !== 'TOP_N'">Add Parameter</h4>
+    <h4 tooltip="submit" ng-if="newmea.measure&&newmea.measure.function.expression == 'EXTENDED_COLUMN'">Add Extended Column</h4>
     <h4 tooltip="submit" ng-if="newmea.measure&&newmea.measure.function.expression == 'TOP_N'">Select Group By Column</h4>
   </div>
   <div class="modal-body" style="background-color: white">
@@ -258,7 +273,7 @@
       <div class="col-md-8">
         <div class="row">
           <div class="form-group">
-            <div class="row" ng-if="newmea.measure&&newmea.measure.function.expression !== 'TOP_N'">
+            <div class="row" ng-if="newmea.measure&&newmea.measure.function.expression !== 'TOP_N' && newmea.measure.function.expression !== 'EXTENDED_COLUMN'">
               <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Param Type</b></label>
               <div class="col-xs-12 col-sm-6">
                 <select class="form-control"
@@ -280,7 +295,7 @@
         <div class="row">
           <div class="form-group">
 
-            <div ng-if="newmea.measure&&newmea.measure.function.expression !== 'TOP_N'" class="row">
+            <div ng-if="newmea.measure&&newmea.measure.function.expression !== 'TOP_N' && newmea.measure.function.expression !== 'EXTENDED_COLUMN" class="row">
               <label  class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Param Value</b></label>
                 <!--COUNT_DISTINCT-->
               <div class="col-xs-12 col-sm-6">
@@ -307,6 +322,17 @@
               </div>
             </div>
 
+            <div ng-if="newmea.measure&&newmea.measure.function.expression == 'EXTENDED_COLUMN'" ng-init="nextPara.type='column'" class="row">
+              <label  class="col-xs-12 col-sm-4 control-label no-padding-right font-color-default"><b>Extended Column On Fact Table</b></label>
+              <!--COUNT_DISTINCT-->
+              <div class="col-xs-12 col-sm-6">
+                <select class="form-control" chosen
+                        ng-model="nextPara.value"
+                        ng-options="column as column for column in getCommonMetricColumns(newmea.measure)" >
+                  <option value=""></option>
+                </select>
+              </div>
+            </div>
 
             </div>
           </div>
@@ -325,7 +351,16 @@
 </script>
 <script type="text/ng-template" id="paramvalueTip.html">
   <ol>
+    <li>Only accept single column in param
     <li>Only accept single column in param value with "Column" type</li>
     <li>Distinct Count is approximate, please indicate Error Rate, higher accuracy degree accompanied with larger storage size and longer build time</li>
+    value with "Column" type</li>
+    <li>Distinct Count is approximate, please indicate Error Rate, higher accuracy degree accompanied with larger storage size and longer build time</li>
+  </ol>
+</script>
+
+<script type="text/ng-template" id="returnTypeTip.html">
+  <ol>
+
   </ol>
 </script>


[3/5] kylin git commit: reformat code

Posted by zh...@apache.org.
http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/app/css/AdminLTE.css
----------------------------------------------------------------------
diff --git a/webapp/app/css/AdminLTE.css b/webapp/app/css/AdminLTE.css
index 4254ab8..e772ae5 100644
--- a/webapp/app/css/AdminLTE.css
+++ b/webapp/app/css/AdminLTE.css
@@ -14,10 +14,12 @@ html,
 body {
   min-height: 100%;
 }
+
 .layout-boxed html,
 .layout-boxed body {
   height: 100%;
 }
+
 body {
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
@@ -26,20 +28,24 @@ body {
   overflow-x: hidden;
   overflow-y: auto;
 }
+
 /* Layout */
 .wrapper {
   min-height: 100%;
   position: static;
   overflow: hidden;
 }
+
 .wrapper:before,
 .wrapper:after {
   content: " ";
   display: table;
 }
+
 .wrapper:after {
   clear: both;
 }
+
 .layout-boxed .wrapper {
   max-width: 1250px;
   margin: 0 auto;
@@ -47,9 +53,11 @@ body {
   box-shadow: 0 0 8px rgba(0, 0, 0, 0.5);
   position: relative;
 }
+
 .layout-boxed {
   background: url('../img/boxed-bg.jpg') repeat fixed;
 }
+
 /*
  * Content Wrapper - contins main content
  * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper  ```
@@ -67,11 +75,13 @@ body {
   margin-left: 230px;
   z-index: 820;
 }
+
 .layout-top-nav .content-wrapper,
 .layout-top-nav .right-side,
 .layout-top-nav .main-footer {
   margin-left: 0;
 }
+
 @media (max-width: 767px) {
   .content-wrapper,
   .right-side,
@@ -79,6 +89,7 @@ body {
     margin-left: 0;
   }
 }
+
 @media (min-width: 768px) {
   .sidebar-collapse .content-wrapper,
   .sidebar-collapse .right-side,
@@ -86,6 +97,7 @@ body {
     margin-left: 0;
   }
 }
+
 @media (max-width: 767px) {
   .sidebar-open .content-wrapper,
   .sidebar-open .right-side,
@@ -96,42 +108,50 @@ body {
     transform: translate(230px, 0);
   }
 }
+
 .content-wrapper,
 .right-side {
   min-height: 100%;
   background-color: #ecf0f5;
   z-index: 800;
 }
+
 .main-footer {
   background: #fff;
   padding: 15px;
   color: #444;
   border-top: 1px solid #eee;
 }
+
 /* Fixed layout */
 .fixed .main-header,
 .fixed .main-sidebar,
 .fixed .left-side {
   position: fixed;
 }
+
 .fixed .main-header {
   top: 0;
   right: 0;
   left: 0;
 }
+
 .fixed .content-wrapper,
 .fixed .right-side {
   padding-top: 50px;
 }
+
 @media (max-width: 767px) {
   .fixed .content-wrapper,
   .fixed .right-side {
     padding-top: 100px;
   }
 }
+
 .fixed.layout-boxed .wrapper {
   max-width: 100%;
 }
+
 /* Content */
 .content {
   min-height: 250px;
@@ -141,6 +161,7 @@ body {
   padding-left: 15px;
   padding-right: 15px;
 }
+
 /* H1 - H6 font */
 h1,
 h2,
@@ -156,10 +177,12 @@ h6,
 .h6 {
   font-family: sans-serif;
 }
+
 /* General Links */
 a {
   color: #3c8dbc;
 }
+
 a:hover,
 a:active,
 a:focus {
@@ -167,16 +190,19 @@ a:focus {
   text-decoration: none;
   color: #72afd2;
 }
+
 /* Page Header */
 .page-header {
   margin: 10px 0 20px 0;
   font-size: 22px;
 }
+
 .page-header > small {
   color: #666;
   display: block;
   margin-top: 5px;
 }
+
 /*
  * Component: Main Header
  * ----------------------
@@ -186,6 +212,7 @@ a:focus {
   max-height: 100px;
   z-index: 1030;
 }
+
 .main-header > .navbar {
   margin-bottom: 0;
   margin-left: 230px;
@@ -193,33 +220,41 @@ a:focus {
   min-height: 50px;
   border-radius: 0;
 }
+
 .layout-top-nav .main-header > .navbar {
-  margin-left: 0!important;
+  margin-left: 0 !important;
 }
+
 .main-header #navbar-search-input {
   background: rgba(255, 255, 255, 0.2);
   border-color: transparent;
 }
+
 .main-header #navbar-search-input:focus,
 .main-header #navbar-search-input:active {
   border-color: rgba(0, 0, 0, 0.1) !important;
   background: rgba(255, 255, 255, 0.9);
 }
+
 .main-header #navbar-search-input::-moz-placeholder {
   color: #ccc;
   opacity: 1;
 }
+
 .main-header #navbar-search-input:-ms-input-placeholder {
   color: #ccc;
 }
+
 .main-header #navbar-search-input::-webkit-input-placeholder {
   color: #ccc;
 }
+
 .main-header .navbar-custom-menu,
 .main-header .navbar-right {
   margin-right: 5px;
   float: right;
 }
+
 @media (max-width: 991px) {
   .main-header .navbar-custom-menu a,
   .main-header .navbar-right a {
@@ -227,18 +262,22 @@ a:focus {
     background: transparent;
   }
 }
+
 @media (max-width: 767px) {
   .main-header .navbar-right {
     float: none;
   }
+
   .navbar-collapse .main-header .navbar-right {
     margin: 7.5px -15px;
   }
+
   .main-header .navbar-right > li {
     color: inherit;
     border: 0;
   }
 }
+
 .main-header .sidebar-toggle {
   float: left;
   background-color: transparent;
@@ -246,20 +285,25 @@ a:focus {
   padding: 15px 15px;
   font-family: fontAwesome;
 }
+
 .main-header .sidebar-toggle:before {
   content: "\f0c9";
 }
+
 .main-header .sidebar-toggle:hover {
   color: #fff;
 }
+
 .main-header .sidebar-toggle .icon-bar {
   display: none;
 }
+
 .main-header .navbar .nav > li.user > a > .fa,
 .main-header .navbar .nav > li.user > a > .glyphicon,
 .main-header .navbar .nav > li.user > a > .ion {
   margin-right: 5px;
 }
+
 .main-header .navbar .nav > li > a > .label {
   position: absolute;
   top: 9px;
@@ -269,6 +313,7 @@ a:focus {
   padding: 2px 3px;
   line-height: .9;
 }
+
 .main-header .logo {
   display: block;
   float: left;
@@ -281,23 +326,28 @@ a:focus {
   padding: 0 15px;
   font-weight: 300;
 }
+
 .main-header .navbar-brand {
   color: #fff;
 }
+
 .content-header {
   position: relative;
   padding: 15px 15px 0 15px;
 }
+
 .content-header > h1 {
   margin: 0;
   font-size: 24px;
 }
+
 .content-header > h1 > small {
   font-size: 15px;
   display: inline-block;
   padding-left: 4px;
   font-weight: 300;
 }
+
 .content-header > .breadcrumb {
   float: right;
   background: transparent;
@@ -310,19 +360,23 @@ a:focus {
   right: 10px;
   border-radius: 2px;
 }
+
 .content-header > .breadcrumb > li > a {
   color: #444;
   text-decoration: none;
   display: inline-block;
 }
+
 .content-header > .breadcrumb > li > a > .fa,
 .content-header > .breadcrumb > li > a > .glyphicon,
 .content-header > .breadcrumb > li > a > .ion {
   margin-right: 5px;
 }
+
 .content-header > .breadcrumb > li + li:before {
   content: '>\00a0';
 }
+
 @media (max-width: 991px) {
   .content-header > .breadcrumb {
     position: relative;
@@ -333,51 +387,62 @@ a:focus {
     background: #d2d6de;
     padding-left: 10px;
   }
+
   .content-header > .breadcrumb li:before {
     color: #97a0b3;
   }
 }
+
 .navbar-toggle {
   color: #fff;
   border: 0;
   margin: 0;
   padding: 15px 15px;
 }
+
 @media (max-width: 991px) {
   .navbar-custom-menu .navbar-nav > li {
     float: left;
   }
+
   .navbar-custom-menu .navbar-nav {
     margin: 0;
     float: left;
   }
+
   .navbar-custom-menu .navbar-nav > li > a {
     padding-top: 15px;
     padding-bottom: 15px;
     line-height: 20px;
   }
 }
+
 @media (max-width: 767px) {
   .main-header {
     position: relative;
   }
+
   .main-header .logo,
   .main-header .navbar {
     width: 100%;
     float: none;
-    position: relative!important;
+    position: relative !important;
   }
+
   .main-header .navbar {
     margin: 0;
   }
+
   .main-header .navbar-custom-menu {
     float: right;
   }
+
   .main-sidebar,
   .left-side {
-    padding-top: 100px!important;
+    padding-top: 100px !important;
   }
 }
+
 /*
  * Component: Sidebar
  * ------------------
@@ -396,6 +461,7 @@ a:focus {
   -o-transition: -o-transform 0.3s cubic-bezier(0.32, 1.25, 0.375, 1.15);
   transition: transform 0.3s cubic-bezier(0.32, 1.25, 0.375, 1.15);
 }
+
 @media (max-width: 767px) {
   .main-sidebar,
   .left-side {
@@ -405,6 +471,7 @@ a:focus {
     transform: translate(-230px, 0);
   }
 }
+
 @media (min-width: 768px) {
   .sidebar-collapse .main-sidebar,
   .sidebar-collapse .left-side {
@@ -414,6 +481,7 @@ a:focus {
     transform: translate(-230px, 0);
   }
 }
+
 @media (max-width: 767px) {
   .sidebar-open .main-sidebar,
   .sidebar-open .left-side {
@@ -423,40 +491,50 @@ a:focus {
     transform: translate(0, 0);
   }
 }
+
 .sidebar {
   padding-bottom: 10px;
 }
+
 .fixed .sidebar {
   overflow: auto;
   height: 100%;
 }
+
 .sidebar-form input:focus {
-  border-color: transparent!important;
+  border-color: transparent !important;
 }
+
 .user-panel {
   padding: 10px;
 }
+
 .user-panel:before,
 .user-panel:after {
   content: " ";
   display: table;
 }
+
 .user-panel:after {
   clear: both;
 }
+
 .user-panel > .image > img {
   width: 45px;
   height: 45px;
 }
+
 .user-panel > .info {
   font-weight: 600;
   padding: 5px 5px 5px 15px;
   font-size: 14px;
   line-height: 1;
 }
+
 .user-panel > .info > p {
   margin-bottom: 9px;
 }
+
 .user-panel > .info > a {
   text-decoration: none;
   padding-right: 5px;
@@ -464,39 +542,47 @@ a:focus {
   font-size: 11px;
   font-weight: normal;
 }
+
 .user-panel > .info > a > .fa,
 .user-panel > .info > a > .ion,
 .user-panel > .info > a > .glyphicon {
   margin-right: 3px;
 }
+
 .sidebar-menu {
   list-style: none;
   margin: 0;
   padding: 0;
 }
+
 .sidebar-menu > li {
   position: relative;
   margin: 0;
   padding: 0;
 }
+
 .sidebar-menu > li > a {
   padding: 12px 5px 12px 15px;
   display: block;
 }
+
 .sidebar-menu > li > a > .fa,
 .sidebar-menu > li > a > .glyphicon,
 .sidebar-menu > li > a > .ion {
   width: 20px;
 }
+
 .sidebar-menu > li .label,
 .sidebar-menu > li .badge {
   margin-top: 3px;
   margin-right: 5px;
 }
+
 .sidebar-menu li.header {
   padding: 10px 25px 10px 15px;
   font-size: 12px;
 }
+
 .sidebar-menu li > a > .fa-angle-left {
   width: auto;
   height: auto;
@@ -504,15 +590,18 @@ a:focus {
   margin-right: 10px;
   margin-top: 3px;
 }
+
 .sidebar-menu li.active > a > .fa-angle-left {
   -webkit-transform: rotate(-90deg);
   -ms-transform: rotate(-90deg);
   -o-transform: rotate(-90deg);
   transform: rotate(-90deg);
 }
+
 .sidebar-menu li.active > .treeview-menu {
   display: block;
 }
+
 .sidebar-menu .treeview-menu {
   display: none;
   list-style: none;
@@ -520,26 +609,32 @@ a:focus {
   margin: 0;
   padding-left: 5px;
 }
+
 .sidebar-menu .treeview-menu .treeview-menu {
   padding-left: 20px;
 }
+
 .sidebar-menu .treeview-menu > li {
   margin: 0;
 }
+
 .sidebar-menu .treeview-menu > li > a {
   padding: 5px 5px 5px 15px;
   display: block;
   font-size: 14px;
 }
+
 .sidebar-menu .treeview-menu > li > a > .fa,
 .sidebar-menu .treeview-menu > li > a > .glyphicon,
 .sidebar-menu .treeview-menu > li > a > .ion {
   width: 20px;
 }
+
 .sidebar-menu .treeview-menu > li > a > .fa-angle-left,
 .sidebar-menu .treeview-menu > li > a > .fa-angle-down {
   width: auto;
 }
+
 /*
  * Component: Dropdown menus
  * -------------------------
@@ -549,21 +644,26 @@ a:focus {
   box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
   border-color: #eee;
 }
+
 .dropdown-menu > li > a {
   color: #777;
 }
+
 .dropdown-menu > li > a > .glyphicon,
 .dropdown-menu > li > a > .fa,
 .dropdown-menu > li > a > .ion {
   margin-right: 10px;
 }
+
 .dropdown-menu > li > a:hover {
   background-color: #e1e3e9;
   color: #333;
 }
+
 .dropdown-menu > .divider {
   background-color: #eee;
 }
+
 /*
     Navbar custom dropdown menu
 ------------------------------------
@@ -573,19 +673,22 @@ a:focus {
 .navbar-nav > .tasks-menu {
   position: relative;
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu,
 .navbar-nav > .messages-menu > .dropdown-menu,
 .navbar-nav > .tasks-menu > .dropdown-menu {
   width: 280px;
-  padding: 0 0 0 0!important;
-  margin: 0!important;
+  padding: 0 0 0 0 !important;
+  margin: 0 !important;
   top: 100%;
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu > li,
 .navbar-nav > .messages-menu > .dropdown-menu > li,
 .navbar-nav > .tasks-menu > .dropdown-menu > li {
   position: relative;
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu > li.header,
 .navbar-nav > .messages-menu > .dropdown-menu > li.header,
 .navbar-nav > .tasks-menu > .dropdown-menu > li.header {
@@ -599,6 +702,7 @@ a:focus {
   color: #444444;
   font-size: 14px;
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,
 .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,
 .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {
@@ -610,23 +714,26 @@ a:focus {
   background-color: #fff;
   padding: 7px 10px;
   border-bottom: 1px solid #eeeeee;
-  color: #444!important;
+  color: #444 !important;
   text-align: center;
 }
+
 @media (max-width: 991px) {
   .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,
   .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,
   .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {
-    background: #fff!important;
-    color: #444!important;
+    background: #fff !important;
+    color: #444 !important;
   }
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover,
 .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover,
 .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover {
   text-decoration: none;
   font-weight: normal;
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu > li .menu,
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu,
 .navbar-nav > .tasks-menu > .dropdown-menu > li .menu {
@@ -636,6 +743,7 @@ a:focus {
   list-style: none;
   overflow-x: hidden;
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a,
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a,
 .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {
@@ -644,12 +752,14 @@ a:focus {
   /* Prevent text from breaking */
   border-bottom: 1px solid #f4f4f4;
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover,
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover,
 .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover {
   background: #f4f4f4;
   text-decoration: none;
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a {
   color: #444444;
   overflow: hidden;
@@ -657,20 +767,24 @@ a:focus {
   white-space: nowrap;
   padding: 10px;
 }
+
 .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon,
 .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa,
 .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion {
   width: 20px;
 }
+
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a {
   margin: 0px;
   padding: 10px 10px;
 }
+
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img {
   margin: auto 10px auto auto;
   width: 40px;
   height: 40px;
 }
+
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 {
   padding: 0;
   margin: 0 0 0 45px;
@@ -678,6 +792,7 @@ a:focus {
   font-size: 15px;
   position: relative;
 }
+
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small {
   color: #999999;
   font-size: 10px;
@@ -685,32 +800,39 @@ a:focus {
   top: 0px;
   right: 0px;
 }
+
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p {
   margin: 0 0 0 45px;
   font-size: 12px;
   color: #888888;
 }
+
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before,
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {
   content: " ";
   display: table;
 }
+
 .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {
   clear: both;
 }
+
 .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {
   padding: 10px;
 }
+
 .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 {
   font-size: 14px;
   padding: 0;
   margin: 0 0 10px 0;
   color: #666666;
 }
+
 .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress {
   padding: 0;
   margin: 0;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu {
   border-top-right-radius: 0;
   border-top-left-radius: 0;
@@ -718,16 +840,19 @@ a:focus {
   border-top-width: 0;
   width: 280px;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu,
 .navbar-nav > .user-menu > .dropdown-menu > .user-body {
   border-bottom-right-radius: 4px;
   border-bottom-left-radius: 4px;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > li.user-header {
   height: 175px;
   padding: 10px;
   text-align: center;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > li.user-header > img {
   z-index: 5;
   height: 90px;
@@ -736,6 +861,7 @@ a:focus {
   border-color: transparent;
   border-color: rgba(255, 255, 255, 0.2);
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > li.user-header > p {
   z-index: 5;
   color: #fff;
@@ -743,47 +869,58 @@ a:focus {
   font-size: 17px;
   margin-top: 10px;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small {
   display: block;
   font-size: 12px;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > .user-body {
   padding: 15px;
   border-bottom: 1px solid #f4f4f4;
   border-top: 1px solid #dddddd;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > .user-body:before,
 .navbar-nav > .user-menu > .dropdown-menu > .user-body:after {
   content: " ";
   display: table;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > .user-body:after {
   clear: both;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > .user-body a {
   color: #444 !important;
 }
+
 @media (max-width: 991px) {
   .navbar-nav > .user-menu > .dropdown-menu > .user-body a {
     background: #fff !important;
     color: #444 !important;
   }
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > .user-footer {
   background-color: #f9f9f9;
   padding: 10px;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > .user-footer:before,
 .navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {
   content: " ";
   display: table;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {
   clear: both;
 }
+
 .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default {
   color: #666666;
 }
+
 .navbar-nav > .user-menu .user-image {
   float: left;
   width: 25px;
@@ -792,6 +929,7 @@ a:focus {
   margin-right: 10px;
   margin-top: -2px;
 }
+
 @media (max-width: 767px) {
   .navbar-nav > .user-menu .user-image {
     float: none;
@@ -800,6 +938,7 @@ a:focus {
     line-height: 10px;
   }
 }
+
 /* Add fade animation to dropdown menus by appending
  the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/
 .open:not(.dropup) > .animated-dropdown-menu {
@@ -808,6 +947,7 @@ a:focus {
   -o-animation: flipInX 0.7s both;
   animation: flipInX 0.7s both;
 }
+
 @keyframes flipInX {
   0% {
     transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
@@ -829,6 +969,7 @@ a:focus {
     transform: perspective(400px);
   }
 }
+
 @-webkit-keyframes flipInX {
   0% {
     transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
@@ -850,22 +991,27 @@ a:focus {
     transform: perspective(400px);
   }
 }
+
 /* Fix dropdown menu in navbars */
 .navbar-custom-menu > .navbar-nav > li {
   position: relative;
 }
+
 .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {
   position: absolute;
   right: 0;
   left: auto;
 }
+
 @media (max-width: 991px) {
   .navbar-custom-menu > .navbar-nav {
     float: right;
   }
+
   .navbar-custom-menu > .navbar-nav > li {
     position: static;
   }
+
   .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {
     position: absolute;
     right: 5%;
@@ -874,6 +1020,7 @@ a:focus {
     background: #fff;
   }
 }
+
 /*
  * Component: Form
  * ---------------
@@ -883,60 +1030,75 @@ a:focus {
   box-shadow: none;
   border-color: #d2d6de;
 }
+
 .form-control:focus {
   border-color: #3c8dbc !important;
   box-shadow: none;
 }
+
 .form-control::-moz-placeholder {
   color: #bbb;
   opacity: 1;
 }
+
 .form-control:-ms-input-placeholder {
   color: #bbb;
 }
+
 .form-control::-webkit-input-placeholder {
   color: #bbb;
 }
+
 .form-control:not(select) {
   -webkit-appearance: none;
   -moz-appearance: none;
   appearance: none;
 }
+
 .form-group.has-success label {
   color: #00a65a;
 }
+
 .form-group.has-success .form-control {
   border-color: #00a65a !important;
   box-shadow: none;
 }
+
 .form-group.has-warning label {
   color: #f39c12;
 }
+
 .form-group.has-warning .form-control {
   border-color: #f39c12 !important;
   box-shadow: none;
 }
+
 .form-group.has-error label {
   color: #dd4b39;
 }
+
 .form-group.has-error .form-control {
   border-color: #dd4b39 !important;
   box-shadow: none;
 }
+
 /* Input group */
 .input-group .input-group-addon {
   border-radius: 0px;
   border-color: #d2d6de;
   background-color: #fff;
 }
+
 /* button groups */
 .btn-group-vertical .btn.btn-flat:first-of-type,
 .btn-group-vertical .btn.btn-flat:last-of-type {
   border-radius: 0;
 }
+
 .icheck > label {
   padding-left: 0;
 }
+
 /*
  * Component: Progress Bar
  * -----------------------
@@ -946,43 +1108,51 @@ a:focus {
   -webkit-box-shadow: none;
   box-shadow: none;
 }
+
 .progress,
 .progress > .progress-bar,
 .progress .progress-bar,
 .progress > .progress-bar .progress-bar {
   border-radius: 1px;
 }
+
 /* size variation */
 .progress.sm,
 .progress-sm {
   height: 10px;
 }
+
 .progress.sm,
 .progress-sm,
 .progress.sm .progress-bar,
 .progress-sm .progress-bar {
   border-radius: 1px;
 }
+
 .progress.xs,
 .progress-xs {
   height: 7px;
 }
+
 .progress.xs,
 .progress-xs,
 .progress.xs .progress-bar,
 .progress-xs .progress-bar {
   border-radius: 1px;
 }
+
 .progress.xxs,
 .progress-xxs {
   height: 3px;
 }
+
 .progress.xxs,
 .progress-xxs,
 .progress.xxs .progress-bar,
 .progress-xxs .progress-bar {
   border-radius: 1px;
 }
+
 /* Vertical bars */
 .progress.vertical {
   position: relative;
@@ -991,83 +1161,101 @@ a:focus {
   display: inline-block;
   margin-right: 10px;
 }
+
 .progress.vertical > .progress-bar {
-  width: 100%!important;
+  width: 100% !important;
   position: absolute;
   bottom: 0;
 }
+
 .progress.vertical.sm,
 .progress.vertical.progress-sm {
   width: 20px;
 }
+
 .progress.vertical.xs,
 .progress.vertical.progress-xs {
   width: 10px;
 }
+
 .progress.vertical.xxs,
 .progress.vertical.progress-xxs {
   width: 3px;
 }
+
 .progress-group .progress-text {
   font-weight: 600;
 }
+
 .progress-group .progress-number {
   float: right;
 }
+
 /* Remove margins from progress bars when put in a table */
 .table tr > td .progress {
   margin: 0;
 }
+
 .progress-bar-light-blue,
 .progress-bar-primary {
   background-color: #3c8dbc;
 }
+
 .progress-striped .progress-bar-light-blue,
 .progress-striped .progress-bar-primary {
   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
 }
+
 .progress-bar-green,
 .progress-bar-success {
   background-color: #00a65a;
 }
+
 .progress-striped .progress-bar-green,
 .progress-striped .progress-bar-success {
   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
 }
+
 .progress-bar-aqua,
 .progress-bar-info {
   background-color: #00c0ef;
 }
+
 .progress-striped .progress-bar-aqua,
 .progress-striped .progress-bar-info {
   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
 }
+
 .progress-bar-yellow,
 .progress-bar-warning {
   background-color: #f39c12;
 }
+
 .progress-striped .progress-bar-yellow,
 .progress-striped .progress-bar-warning {
   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
 }
+
 .progress-bar-red,
 .progress-bar-danger {
   background-color: #dd4b39;
 }
+
 .progress-striped .progress-bar-red,
 .progress-striped .progress-bar-danger {
   background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
   background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
 }
+
 /*
  * Component: Small Box
  * --------------------
@@ -1079,9 +1267,11 @@ a:focus {
   margin-bottom: 20px;
   box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
 }
+
 .small-box > .inner {
   padding: 10px;
 }
+
 .small-box > .small-box-footer {
   position: relative;
   text-align: center;
@@ -1093,10 +1283,12 @@ a:focus {
   background: rgba(0, 0, 0, 0.1);
   text-decoration: none;
 }
+
 .small-box > .small-box-footer:hover {
   color: #fff;
   background: rgba(0, 0, 0, 0.15);
 }
+
 .small-box h3 {
   font-size: 38px;
   font-weight: bold;
@@ -1104,19 +1296,23 @@ a:focus {
   white-space: nowrap;
   padding: 0;
 }
+
 .small-box p {
   font-size: 15px;
 }
+
 .small-box p > small {
   display: block;
   color: #f9f9f9;
   font-size: 13px;
   margin-top: 5px;
 }
+
 .small-box h3,
 .small-box p {
   z-index: 5px;
 }
+
 .small-box .icon {
   -webkit-transition: all 0.3s linear;
   -o-transition: all 0.3s linear;
@@ -1128,24 +1324,30 @@ a:focus {
   font-size: 90px;
   color: rgba(0, 0, 0, 0.15);
 }
+
 .small-box:hover {
   text-decoration: none;
   color: #f9f9f9;
 }
+
 .small-box:hover .icon {
   font-size: 95px;
 }
+
 @media (max-width: 767px) {
   .small-box {
     text-align: center;
   }
+
   .small-box .icon {
     display: none;
   }
+
   .small-box p {
     font-size: 12px;
   }
 }
+
 /*
  * Component: Box
  * --------------
@@ -1159,137 +1361,174 @@ a:focus {
   width: 100%;
   box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
 }
+
 .box.box-primary {
   border-top-color: #3c8dbc;
 }
+
 .box.box-info {
   border-top-color: #00c0ef;
 }
+
 .box.box-danger {
   border-top-color: #dd4b39;
 }
+
 .box.box-warning {
   border-top-color: #f39c12;
 }
+
 .box.box-success {
   border-top-color: #00a65a;
 }
+
 .box.box-default {
   border-top-color: #d2d6de;
 }
+
 .box.collapsed-box .box-body,
 .box.collapsed-box .box-footer {
   display: none;
 }
+
 .box .nav-stacked > li {
   border-bottom: 1px solid #f4f4f4;
   margin: 0;
 }
+
 .box .nav-stacked > li:last-of-type {
   border-bottom: none;
 }
+
 .box.height-control .box-body {
   max-height: 300px;
   overflow: auto;
 }
+
 .box .border-right {
   border-right: 1px solid #f4f4f4;
 }
+
 .box .border-left {
   border-left: 1px solid #f4f4f4;
 }
+
 .box.box-solid {
   border-top: 0px;
 }
+
 .box.box-solid > .box-header .btn.btn-default {
   background: transparent;
 }
+
 .box.box-solid > .box-header .btn:hover,
 .box.box-solid > .box-header a:hover {
   background: rgba(0, 0, 0, 0.1) !important;
 }
+
 .box.box-solid.box-default {
   border: 1px solid #d2d6de;
 }
+
 .box.box-solid.box-default > .box-header {
   color: #444444;
   background: #d2d6de;
   background-color: #d2d6de;
 }
+
 .box.box-solid.box-default > .box-header a,
 .box.box-solid.box-default > .box-header .btn {
   color: #444444;
 }
+
 .box.box-solid.box-primary {
   border: 1px solid #3c8dbc;
 }
+
 .box.box-solid.box-primary > .box-header {
   color: #ffffff;
   background: #3c8dbc;
   background-color: #3c8dbc;
 }
+
 .box.box-solid.box-primary > .box-header a,
 .box.box-solid.box-primary > .box-header .btn {
   color: #ffffff;
 }
+
 .box.box-solid.box-info {
   border: 1px solid #00c0ef;
 }
+
 .box.box-solid.box-info > .box-header {
   color: #ffffff;
   background: #00c0ef;
   background-color: #00c0ef;
 }
+
 .box.box-solid.box-info > .box-header a,
 .box.box-solid.box-info > .box-header .btn {
   color: #ffffff;
 }
+
 .box.box-solid.box-danger {
   border: 1px solid #dd4b39;
 }
+
 .box.box-solid.box-danger > .box-header {
   color: #ffffff;
   background: #dd4b39;
   background-color: #dd4b39;
 }
+
 .box.box-solid.box-danger > .box-header a,
 .box.box-solid.box-danger > .box-header .btn {
   color: #ffffff;
 }
+
 .box.box-solid.box-warning {
   border: 1px solid #f39c12;
 }
+
 .box.box-solid.box-warning > .box-header {
   color: #ffffff;
   background: #f39c12;
   background-color: #f39c12;
 }
+
 .box.box-solid.box-warning > .box-header a,
 .box.box-solid.box-warning > .box-header .btn {
   color: #ffffff;
 }
+
 .box.box-solid.box-success {
   border: 1px solid #00a65a;
 }
+
 .box.box-solid.box-success > .box-header {
   color: #ffffff;
   background: #00a65a;
   background-color: #00a65a;
 }
+
 .box.box-solid.box-success > .box-header a,
 .box.box-solid.box-success > .box-header .btn {
   color: #ffffff;
 }
+
 .box.box-solid > .box-header > .box-tools .btn {
   border: 0;
   box-shadow: none;
 }
+
 .box.box-solid[class*='bg'] > .box-header {
   color: #fff;
 }
+
 .box .box-group > .box {
   margin-bottom: 5px;
 }
+
 .box .knob-label {
   text-align: center;
   color: #333;
@@ -1297,6 +1536,7 @@ a:focus {
   font-size: 12px;
   margin-bottom: 0.3em;
 }
+
 .box > .overlay,
 .box > .loading-img {
   position: absolute;
@@ -1305,11 +1545,13 @@ a:focus {
   width: 100%;
   height: 100%;
 }
+
 .box .overlay {
   z-index: 1010;
   background: rgba(255, 255, 255, 0.7);
   border-radius: 3px;
 }
+
 .box .overlay > .fa {
   position: absolute;
   top: 50%;
@@ -1319,29 +1561,36 @@ a:focus {
   color: #000;
   font-size: 30px;
 }
+
 .box .overlay.dark {
   background: rgba(0, 0, 0, 0.5);
 }
+
 .box-header {
   color: #444;
   display: block;
   padding: 10px;
   position: relative;
 }
+
 .box-header:before,
 .box-header:after {
   content: " ";
   display: table;
 }
+
 .box-header:after {
   clear: both;
 }
+
 .box-header.with-border {
   border-bottom: 1px solid #f4f4f4;
 }
+
 .collapsed-box .box-header.with-border {
   border-bottom: none;
 }
+
 .box-header > .fa,
 .box-header > .glyphicon,
 .box-header > .ion,
@@ -1351,37 +1600,45 @@ a:focus {
   margin: 0;
   line-height: 1;
 }
+
 .box-header > .fa,
 .box-header > .glyphicon,
 .box-header > .ion {
   margin-right: 5px;
 }
+
 .box-header > .box-tools {
   position: absolute;
   right: 10px;
   top: 5px;
 }
+
 .box-header > .box-tools [data-toggle="tooltip"] {
   position: relative;
 }
+
 .box-header > .box-tools.pull-right .dropdown-menu {
   right: 0;
   left: auto;
 }
+
 .btn-box-tool {
   padding: 5px;
   font-size: 12px;
   background: transparent;
-  box-shadow: none!important;
+  box-shadow: none !important;
   color: #97a0b3;
 }
+
 .open .btn-box-tool,
 .btn-box-tool:hover {
   color: #606c84;
 }
+
 .btn-box-tool:active {
-  outline: none!important;
+  outline: none !important;
 }
+
 .box-body {
   border-top-left-radius: 0;
   border-top-right-radius: 0;
@@ -1389,43 +1646,53 @@ a:focus {
   border-bottom-left-radius: 3px;
   padding: 10px;
 }
+
 .no-header .box-body {
   border-top-right-radius: 3px;
   border-top-left-radius: 3px;
 }
+
 .box-body > .table {
   margin-bottom: 0;
 }
+
 .box-body > .chart {
   position: relative;
   overflow: hidden;
   width: 100%;
 }
+
 .box-body > .chart svg,
 .box-body > .chart canvas {
-  width: 100%!important;
+  width: 100% !important;
 }
+
 .box-body .fc {
   margin-top: 5px;
 }
+
 .box-body .full-width-chart {
   margin: -19px;
 }
+
 .box-body.no-padding .full-width-chart {
   margin: -9px;
 }
+
 .box-body .box-pane {
   border-top-left-radius: 0;
   border-top-right-radius: 0;
   border-bottom-right-radius: 0;
   border-bottom-left-radius: 3px;
 }
+
 .box-body .box-pane-right {
   border-top-left-radius: 0;
   border-top-right-radius: 0;
   border-bottom-right-radius: 3px;
   border-bottom-left-radius: 0;
 }
+
 .box-footer {
   border-top-left-radius: 0;
   border-top-right-radius: 0;
@@ -1435,15 +1702,18 @@ a:focus {
   padding: 10px;
   background-color: #ffffff;
 }
+
 .chart-legend {
   margin: 10px 0;
 }
+
 @media (max-width: 991px) {
   .chart-legend > li {
     float: left;
     margin-right: 10px;
   }
 }
+
 /* Widget: TODO LIST */
 .todo-list {
   margin: 0;
@@ -1451,6 +1721,7 @@ a:focus {
   list-style: none;
   overflow: auto;
 }
+
 .todo-list > li {
   border-radius: 2px;
   padding: 10px;
@@ -1459,100 +1730,126 @@ a:focus {
   border-left: 2px solid #e6e7e8;
   color: #444;
 }
+
 .todo-list > li:last-of-type {
   margin-bottom: 0;
 }
+
 .todo-list > li.danger {
   border-left-color: #dd4b39;
 }
+
 .todo-list > li.warning {
   border-left-color: #f39c12;
 }
+
 .todo-list > li.info {
   border-left-color: #00c0ef;
 }
+
 .todo-list > li.success {
   border-left-color: #00a65a;
 }
+
 .todo-list > li.primary {
   border-left-color: #3c8dbc;
 }
+
 .todo-list > li > input[type='checkbox'] {
   margin: 0 10px 0 5px;
 }
+
 .todo-list > li .text {
   display: inline-block;
   margin-left: 5px;
   font-weight: 600;
 }
+
 .todo-list > li .label {
   margin-left: 10px;
   font-size: 9px;
 }
+
 .todo-list > li .tools {
   display: none;
   float: right;
   color: #dd4b39;
 }
+
 .todo-list > li .tools > .fa,
 .todo-list > li .tools > .glyphicon,
 .todo-list > li .tools > .ion {
   margin-right: 5px;
   cursor: pointer;
 }
+
 .todo-list > li:hover .tools {
   display: inline-block;
 }
+
 .todo-list > li.done {
   color: #999;
 }
+
 .todo-list > li.done .text {
   text-decoration: line-through;
   font-weight: 500;
 }
+
 .todo-list > li.done .label {
   background: #d2d6de !important;
 }
+
 .todo-list .handle {
   display: inline-block;
   cursor: move;
   margin: 0 5px;
 }
+
 /* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/
 .chat {
   padding: 5px 20px 5px 10px;
 }
+
 .chat .item {
   margin-bottom: 10px;
 }
+
 .chat .item:before,
 .chat .item:after {
   content: " ";
   display: table;
 }
+
 .chat .item:after {
   clear: both;
 }
+
 .chat .item > img {
   width: 40px;
   height: 40px;
   border: 2px solid transparent;
   border-radius: 50% !important;
 }
+
 .chat .item > img.online {
   border: 2px solid #00a65a;
 }
+
 .chat .item > img.offline {
   border: 2px solid #dd4b39;
 }
+
 .chat .item > .message {
   margin-left: 55px;
   margin-top: -40px;
 }
+
 .chat .item > .message > .name {
   display: block;
   font-weight: 600;
 }
+
 .chat .item > .attachment {
   border-radius: 3px;
   background: #f4f4f4;
@@ -1560,11 +1857,13 @@ a:focus {
   margin-right: 15px;
   padding: 10px;
 }
+
 .chat .item > .attachment > h4 {
   margin: 0 0 5px 0;
   font-weight: 600;
   font-size: 14px;
 }
+
 .chat .item > .attachment > p,
 .chat .item > .attachment > .filename {
   font-weight: 600;
@@ -1572,17 +1871,21 @@ a:focus {
   font-style: italic;
   margin: 0;
 }
+
 .chat .item > .attachment:before,
 .chat .item > .attachment:after {
   content: " ";
   display: table;
 }
+
 .chat .item > .attachment:after {
   clear: both;
 }
+
 .box-input {
   max-width: 200px;
 }
+
 /*
  * Component: Info Box
  * -------------------
@@ -1596,21 +1899,26 @@ a:focus {
   border-radius: 2px;
   margin-bottom: 15px;
 }
+
 .info-box small {
   font-size: 14px;
 }
+
 .info-box .progress {
   background: rgba(0, 0, 0, 0.2);
   margin: 5px -10px 5px -10px;
   height: 2px;
 }
+
 .info-box .progress,
 .info-box .progress .progress-bar {
   border-radius: 0;
 }
+
 .info-box .progress .progress-bar {
   background: #fff;
 }
+
 .info-box-icon {
   border-top-left-radius: 2px;
   border-top-right-radius: 0;
@@ -1625,15 +1933,18 @@ a:focus {
   line-height: 90px;
   background: rgba(0, 0, 0, 0.2);
 }
+
 .info-box-content {
   padding: 5px 10px;
   margin-left: 90px;
 }
+
 .info-box-number {
   display: block;
   font-weight: bold;
   font-size: 18px;
 }
+
 .progress-description,
 .info-box-text {
   display: block;
@@ -1642,15 +1953,19 @@ a:focus {
   overflow: hidden;
   text-overflow: ellipsis;
 }
+
 .info-box-text {
   text-transform: uppercase;
 }
+
 .info-box-more {
   display: block;
 }
+
 .progress-description {
   margin: 0;
 }
+
 /*
  * Component: Timeline
  * -------------------
@@ -1661,6 +1976,7 @@ a:focus {
   padding: 0;
   list-style: none;
 }
+
 .timeline:before {
   content: '';
   position: absolute;
@@ -1672,19 +1988,23 @@ a:focus {
   margin: 0;
   border-radius: 2px;
 }
+
 .timeline > li {
   position: relative;
   margin-right: 10px;
   margin-bottom: 15px;
 }
+
 .timeline > li:before,
 .timeline > li:after {
   content: " ";
   display: table;
 }
+
 .timeline > li:after {
   clear: both;
 }
+
 .timeline > li > .timeline-item {
   -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
   box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
@@ -1697,12 +2017,14 @@ a:focus {
   padding: 0;
   position: relative;
 }
+
 .timeline > li > .timeline-item > .time {
   color: #999;
   float: right;
   padding: 10px;
   font-size: 12px;
 }
+
 .timeline > li > .timeline-item > .timeline-header {
   margin: 0;
   color: #555;
@@ -1711,13 +2033,16 @@ a:focus {
   font-size: 16px;
   line-height: 1.1;
 }
+
 .timeline > li > .timeline-item > .timeline-header > a {
   font-weight: 600;
 }
+
 .timeline > li > .timeline-item > .timeline-body,
 .timeline > li > .timeline-item > .timeline-footer {
   padding: 10px;
 }
+
 .timeline > li.time-label > span {
   font-weight: 600;
   padding: 5px;
@@ -1725,6 +2050,7 @@ a:focus {
   background-color: #fff;
   border-radius: 4px;
 }
+
 .timeline > li > .fa,
 .timeline > li > .glyphicon,
 .timeline > li > .ion {
@@ -1740,6 +2066,7 @@ a:focus {
   left: 18px;
   top: 0;
 }
+
 /*
  * Component: Button
  * -----------------
@@ -1750,9 +2077,11 @@ a:focus {
   box-shadow: none;
   border: 1px solid transparent;
 }
+
 .btn.uppercase {
   text-transform: uppercase;
 }
+
 .btn.btn-flat {
   border-radius: 0;
   -webkit-box-shadow: none;
@@ -1760,18 +2089,22 @@ a:focus {
   box-shadow: none;
   border-width: 1px;
 }
+
 .btn:active {
   -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
   -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
   box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
 }
+
 .btn:focus {
   outline: none;
 }
+
 .btn.btn-file {
   position: relative;
   overflow: hidden;
 }
+
 .btn.btn-file > input[type='file'] {
   position: absolute;
   top: 0;
@@ -1787,80 +2120,97 @@ a:focus {
   cursor: inherit;
   display: block;
 }
+
 .btn-default {
   background-color: #f4f4f4;
   color: #444;
   border-color: #ddd;
 }
+
 .btn-default:hover,
 .btn-default:active,
 .btn-default.hover {
   background-color: #e7e7e7 !important;
 }
+
 .btn-primary {
   background-color: #3c8dbc;
   border-color: #367fa9;
 }
+
 .btn-primary:hover,
 .btn-primary:active,
 .btn-primary.hover {
   background-color: #367fa9;
 }
+
 .btn-success {
   background-color: #00a65a;
   border-color: #008d4c;
 }
+
 .btn-success:hover,
 .btn-success:active,
 .btn-success.hover {
   background-color: #008d4c;
 }
+
 .btn-info {
   background-color: #00c0ef;
   border-color: #00acd6;
 }
+
 .btn-info:hover,
 .btn-info:active,
 .btn-info.hover {
   background-color: #00acd6;
 }
+
 .btn-danger {
   background-color: #dd4b39;
   border-color: #d73925;
 }
+
 .btn-danger:hover,
 .btn-danger:active,
 .btn-danger.hover {
   background-color: #d73925;
 }
+
 .btn-warning {
   background-color: #f39c12;
   border-color: #e08e0b;
 }
+
 .btn-warning:hover,
 .btn-warning:active,
 .btn-warning.hover {
   background-color: #e08e0b;
 }
+
 .btn-outline {
   border: 1px solid #fff;
   background: transparent;
   color: #fff;
 }
+
 .btn-outline:hover,
 .btn-outline:focus,
 .btn-outline:active {
   color: rgba(255, 255, 255, 0.7);
   border-color: rgba(255, 255, 255, 0.7);
 }
+
 .btn-link {
   -webkit-box-shadow: none;
   box-shadow: none;
 }
+
 .btn[class*='bg-']:hover {
   -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);
   box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);
 }
+
 .btn-app {
   border-radius: 3px;
   position: relative;
@@ -1874,23 +2224,27 @@ a:focus {
   background-color: #f4f4f4;
   font-size: 12px;
 }
+
 .btn-app > .fa,
 .btn-app > .glyphicon,
 .btn-app > .ion {
   font-size: 20px;
   display: block;
 }
+
 .btn-app:hover {
   background: #f4f4f4;
   color: #444;
   border-color: #aaa;
 }
+
 .btn-app:active,
 .btn-app:focus {
   -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
   -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
   box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
 }
+
 .btn-app > .badge {
   position: absolute;
   top: -3px;
@@ -1898,6 +2252,7 @@ a:focus {
   font-size: 10px;
   font-weight: 400;
 }
+
 /*
  * Component: Callout
  * ------------------
@@ -1908,36 +2263,46 @@ a:focus {
   padding: 15px 30px 15px 15px;
   border-left: 5px solid #eee;
 }
+
 .callout a {
   color: #fff;
   text-decoration: underline;
 }
+
 .callout a:hover {
   color: #eee;
 }
+
 .callout h4 {
   margin-top: 0;
   font-weight: 600;
 }
+
 .callout p:last-child {
   margin-bottom: 0;
 }
+
 .callout code,
 .callout .highlight {
   background-color: #fff;
 }
+
 .callout.callout-danger {
   border-color: #c23321;
 }
+
 .callout.callout-warning {
   border-color: #c87f0a;
 }
+
 .callout.callout-info {
   border-color: #0097bc;
 }
+
 .callout.callout-success {
   border-color: #00733e;
 }
+
 /*
  * Component: alert
  * ----------------
@@ -1945,38 +2310,48 @@ a:focus {
 .alert {
   border-radius: 3px;
 }
+
 .alert h4 {
   font-weight: 600;
 }
+
 .alert .icon {
   margin-right: 10px;
 }
+
 .alert .close {
   color: #000;
   opacity: 0.2;
   filter: alpha(opacity=20);
 }
+
 .alert .close:hover {
   opacity: 0.5;
   filter: alpha(opacity=50);
 }
+
 .alert a {
   color: #fff;
   text-decoration: underline;
 }
+
 .alert-success {
   border-color: #008d4c;
 }
+
 .alert-danger,
 .alert-error {
   border-color: #d73925;
 }
+
 .alert-warning {
   border-color: #e08e0b;
 }
+
 .alert-info {
   border-color: #00acd6;
 }
+
 /*
  * Component: Nav
  * --------------
@@ -1987,23 +2362,28 @@ a:focus {
   border-top: 3px solid transparent;
   color: #444;
 }
+
 .nav-pills > li > a > .fa,
 .nav-pills > li > a > .glyphicon,
 .nav-pills > li > a > .ion {
   margin-right: 5px;
 }
+
 .nav-pills > li.active > a,
 .nav-pills > li.active > a:hover {
   background-color: #f4f4f4;
   border-top-color: #3c8dbc;
   color: #444;
 }
+
 .nav-pills > li.active > a {
   font-weight: 600;
 }
+
 .nav-pills > li > a:hover {
   background-color: #f6f6f6;
 }
+
 /* NAV STACKED */
 .nav-stacked > li > a {
   border-radius: 0;
@@ -2011,6 +2391,7 @@ a:focus {
   border-left: 3px solid transparent;
   color: #444;
 }
+
 .nav-stacked > li.active > a,
 .nav-stacked > li.active > a:hover {
   background-color: #f4f4f4;
@@ -2018,6 +2399,7 @@ a:focus {
   border-left-color: #3c8dbc;
   color: #444;
 }
+
 .nav-stacked > li.header {
   border-bottom: 1px solid #ddd;
   color: #777;
@@ -2025,6 +2407,7 @@ a:focus {
   padding: 5px 10px;
   text-transform: uppercase;
 }
+
 /* NAV TABS */
 .nav-tabs-custom {
   margin-bottom: 20px;
@@ -2032,94 +2415,116 @@ a:focus {
   box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
   border-radius: 3px;
 }
+
 .nav-tabs-custom > .nav-tabs {
   margin: 0;
   border-bottom-color: #f4f4f4;
   border-top-right-radius: 3px;
   border-top-left-radius: 3px;
 }
+
 .nav-tabs-custom > .nav-tabs > li {
   border-top: 3px solid transparent;
   margin-bottom: -2px;
   margin-right: 5px;
 }
+
 .nav-tabs-custom > .nav-tabs > li > a {
   border-radius: 0 !important;
 }
+
 .nav-tabs-custom > .nav-tabs > li > a,
 .nav-tabs-custom > .nav-tabs > li > a:hover {
   background: transparent;
   margin: 0;
 }
+
 .nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover,
 .nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus,
 .nav-tabs-custom > .nav-tabs > li:not(.active) > a:active {
   border-color: transparent;
 }
+
 .nav-tabs-custom > .nav-tabs > li.active {
   border-top-color: #3c8dbc;
 }
+
 .nav-tabs-custom > .nav-tabs > li.active > a,
 .nav-tabs-custom > .nav-tabs > li.active:hover > a {
   background-color: #fff;
 }
+
 .nav-tabs-custom > .nav-tabs > li.active > a {
   border-top: 0;
   border-left-color: #f4f4f4;
   border-right-color: #f4f4f4;
 }
+
 .nav-tabs-custom > .nav-tabs > li:first-of-type {
   margin-left: 0;
 }
+
 .nav-tabs-custom > .nav-tabs > li:first-of-type.active > a {
   border-left-width: 0;
 }
+
 .nav-tabs-custom > .nav-tabs.pull-right {
-  float: none!important;
+  float: none !important;
 }
+
 .nav-tabs-custom > .nav-tabs.pull-right > li {
   float: right;
 }
+
 .nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type {
   margin-right: 0;
 }
+
 .nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a {
   border-left-width: 1px;
   border-right-width: 0;
 }
+
 .nav-tabs-custom > .nav-tabs > li.header {
   line-height: 35px;
   padding: 0 10px;
   font-size: 20px;
   color: #444;
 }
+
 .nav-tabs-custom > .nav-tabs > li.header > .fa,
 .nav-tabs-custom > .nav-tabs > li.header > .glyphicon,
 .nav-tabs-custom > .nav-tabs > li.header > .ion {
   margin-right: 5px;
 }
+
 .nav-tabs-custom > .tab-content {
   background: #fff;
   padding: 10px;
   border-bottom-right-radius: 3px;
   border-bottom-left-radius: 3px;
 }
+
 /* Nav tabs bottom */
 .tabs-bottom.nav-3 li a {
   width: 3333.33333333% !important;
 }
+
 .tabs-bottom li a {
   border: 0;
 }
+
 /* PAGINATION */
 .pagination > li > a {
   background: #fafafa;
   color: #666;
 }
+
 .pagination > li:first-of-type a,
 .pagination > li:last-of-type a {
   border-radius: 0;
 }
+
 /*
  * Component: Products List
  * ------------------------
@@ -2129,6 +2534,7 @@ a:focus {
   margin: 0;
   padding: 0;
 }
+
 .products-list > .item {
   border-radius: 3px;
   -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
@@ -2136,27 +2542,34 @@ a:focus {
   padding: 10px 0;
   background: #fff;
 }
+
 .products-list > .item:before,
 .products-list > .item:after {
   content: " ";
   display: table;
 }
+
 .products-list > .item:after {
   clear: both;
 }
+
 .products-list .product-img {
   float: left;
 }
+
 .products-list .product-img img {
   width: 50px;
   height: 50px;
 }
+
 .products-list .product-info {
   margin-left: 60px;
 }
+
 .products-list .product-title {
   font-weight: 600;
 }
+
 .products-list .product-description {
   display: block;
   color: #999;
@@ -2164,15 +2577,18 @@ a:focus {
   white-space: nowrap;
   text-overflow: ellipsis;
 }
+
 .product-list-in-box > .item {
   -webkit-box-shadow: none;
   box-shadow: none;
   border-radius: 0;
   border-bottom: 1px solid #f4f4f4;
 }
+
 .product-list-in-box > .item:last-of-type {
   border-bottom-width: 0;
 }
+
 /*
  * Component: Table
  * ----------------
@@ -2185,15 +2601,19 @@ a:focus {
 .table > tfoot > tr > td {
   border-top: 1px solid #f4f4f4;
 }
+
 .table > thead > tr > th {
   border-bottom: 2px solid #f4f4f4;
 }
+
 .table tr td .progress {
   margin-top: 5px;
 }
+
 .table-bordered {
   border: 1px solid #f4f4f4;
 }
+
 .table-bordered > thead > tr > th,
 .table-bordered > tbody > tr > th,
 .table-bordered > tfoot > tr > th,
@@ -2202,27 +2622,33 @@ a:focus {
 .table-bordered > tfoot > tr > td {
   border: 1px solid #f4f4f4;
 }
+
 .table-bordered > thead > tr > th,
 .table-bordered > thead > tr > td {
   border-bottom-width: 2px;
 }
+
 .table.no-border,
 .table.no-border td,
 .table.no-border th {
   border: 0;
 }
+
 /* .text-center in tables */
 table.text-center,
 table.text-center td,
 table.text-center th {
   text-align: center;
 }
+
 .table.align th {
   text-align: left;
 }
+
 .table.align td {
   text-align: right;
 }
+
 /*
  * Component: Label
  * ----------------
@@ -2231,6 +2657,7 @@ table.text-center th {
   background-color: #d2d6de;
   color: #444;
 }
+
 /*
  * Component: Direct Chat
  * ----------------------
@@ -2242,12 +2669,14 @@ table.text-center th {
   overflow-x: hidden;
   padding: 0;
 }
+
 .direct-chat.chat-pane-open .direct-chat-contacts {
   -webkit-transform: translate(0, 0);
   -ms-transform: translate(0, 0);
   -o-transform: translate(0, 0);
   transform: translate(0, 0);
 }
+
 .direct-chat-messages {
   -webkit-transform: translate(0, 0);
   -ms-transform: translate(0, 0);
@@ -2257,21 +2686,26 @@ table.text-center th {
   height: 250px;
   overflow: auto;
 }
+
 .direct-chat-msg,
 .direct-chat-text {
   display: block;
 }
+
 .direct-chat-msg {
   margin-bottom: 10px;
 }
+
 .direct-chat-msg:before,
 .direct-chat-msg:after {
   content: " ";
   display: table;
 }
+
 .direct-chat-msg:after {
   clear: both;
 }
+
 .direct-chat-messages,
 .direct-chat-contacts {
   -webkit-transition: -webkit-transform 0.5s ease-in-out;
@@ -2279,6 +2713,7 @@ table.text-center th {
   -o-transition: -o-transform 0.5s ease-in-out;
   transition: transform 0.5s ease-in-out;
 }
+
 .direct-chat-text {
   border-radius: 5px;
   position: relative;
@@ -2288,6 +2723,7 @@ table.text-center th {
   margin: 5px 0 0 50px;
   color: #444444;
 }
+
 .direct-chat-text:after,
 .direct-chat-text:before {
   position: absolute;
@@ -2300,18 +2736,22 @@ table.text-center th {
   width: 0;
   pointer-events: none;
 }
+
 .direct-chat-text:after {
   border-width: 5px;
   margin-top: -5px;
 }
+
 .direct-chat-text:before {
   border-width: 6px;
   margin-top: -6px;
 }
+
 .right .direct-chat-text {
   margin-right: 50px;
   margin-left: 0;
 }
+
 .right .direct-chat-text:after,
 .right .direct-chat-text:before {
   right: auto;
@@ -2319,32 +2759,39 @@ table.text-center th {
   border-right-color: transparent;
   border-left-color: #d2d6de;
 }
+
 .direct-chat-img {
   border-radius: 50%;
   float: left;
   width: 40px;
   height: 40px;
 }
+
 .right .direct-chat-img {
   float: right;
 }
+
 .direct-chat-info {
   display: block;
   margin-bottom: 2px;
   font-size: 12px;
 }
+
 .direct-chat-name {
   font-weight: 600;
 }
+
 .direct-chat-timestamp {
   color: #999;
 }
+
 .direct-chat-contacts-open .direct-chat-contacts {
   -webkit-transform: translate(0, 0);
   -ms-transform: translate(0, 0);
   -o-transform: translate(0, 0);
   transform: translate(0, 0);
 }
+
 .direct-chat-contacts {
   -webkit-transform: translate(100%, 0);
   -ms-transform: translate(100%, 0);
@@ -2359,93 +2806,115 @@ table.text-center th {
   color: #fff;
   overflow: auto;
 }
+
 .contacts-list > li {
   border-bottom: 1px solid rgba(0, 0, 0, 0.2);
   padding: 10px;
   margin: 0;
 }
+
 .contacts-list > li:before,
 .contacts-list > li:after {
   content: " ";
   display: table;
 }
+
 .contacts-list > li:after {
   clear: both;
 }
+
 .contacts-list > li:last-of-type {
   border-bottom: none;
 }
+
 .contacts-list-img {
   border-radius: 50%;
   width: 40px;
   float: left;
 }
+
 .contacts-list-info {
   margin-left: 45px;
   color: #fff;
 }
+
 .contacts-list-name,
 .contacts-list-status {
   display: block;
 }
+
 .contacts-list-name {
   font-weight: 600;
 }
+
 .contacts-list-status {
   font-size: 12px;
 }
+
 .contacts-list-date {
   color: #aaa;
   font-weight: normal;
 }
+
 .contacts-list-msg {
   color: #999;
 }
+
 .direct-chat-danger .right > .direct-chat-text {
   background: #dd4b39;
   border-color: #dd4b39;
   color: #ffffff;
 }
+
 .direct-chat-danger .right > .direct-chat-text:after,
 .direct-chat-danger .right > .direct-chat-text:before {
   border-left-color: #dd4b39;
 }
+
 .direct-chat-primary .right > .direct-chat-text {
   background: #3c8dbc;
   border-color: #3c8dbc;
   color: #ffffff;
 }
+
 .direct-chat-primary .right > .direct-chat-text:after,
 .direct-chat-primary .right > .direct-chat-text:before {
   border-left-color: #3c8dbc;
 }
+
 .direct-chat-warning .right > .direct-chat-text {
   background: #f39c12;
   border-color: #f39c12;
   color: #ffffff;
 }
+
 .direct-chat-warning .right > .direct-chat-text:after,
 .direct-chat-warning .right > .direct-chat-text:before {
   border-left-color: #f39c12;
 }
+
 .direct-chat-info .right > .direct-chat-text {
   background: #00c0ef;
   border-color: #00c0ef;
   color: #ffffff;
 }
+
 .direct-chat-info .right > .direct-chat-text:after,
 .direct-chat-info .right > .direct-chat-text:before {
   border-left-color: #00c0ef;
 }
+
 .direct-chat-success .right > .direct-chat-text {
   background: #00a65a;
   border-color: #00a65a;
   color: #ffffff;
 }
+
 .direct-chat-success .right > .direct-chat-text:after,
 .direct-chat-success .right > .direct-chat-text:before {
   border-left-color: #00a65a;
 }
+
 /*
  * Component: Users List
  * ---------------------
@@ -2456,15 +2925,18 @@ table.text-center th {
   padding: 10px;
   text-align: center;
 }
+
 .users-list > li > img {
   border-radius: 50%;
   max-width: 100%;
   height: auto;
 }
+
 .users-list-name,
 .users-list-date {
   display: block;
 }
+
 .users-list-name {
   font-weight: 600;
   color: #444;
@@ -2472,20 +2944,24 @@ table.text-center th {
   white-space: nowrap;
   text-overflow: ellipsis;
 }
+
 .users-list-name:hover {
   color: #999;
 }
+
 .users-list-date {
   color: #999;
   font-size: 12px;
 }
+
 /*
  * Component: Carousel
  * -------------------
  */
 .carousel-control {
-  background-image: none!important;
+  background-image: none !important;
 }
+
 .carousel-control > .fa {
   font-size: 40px;
   position: absolute;
@@ -2494,6 +2970,7 @@ table.text-center th {
   display: inline-block;
   margin-top: -20px;
 }
+
 /*
  * Component: modal
  * ----------------
@@ -2501,44 +2978,54 @@ table.text-center th {
 .modal {
   background: rgba(0, 0, 0, 0.3);
 }
+
 .modal-content {
   border-radius: 0;
   -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125) !important;
   box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125) !important;
   border: 0;
 }
+
 @media (min-width: 768px) {
   .modal-content {
     -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125) !important;
     box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125) !important;
   }
 }
+
 .modal-header {
   border-bottom-color: #f4f4f4;
 }
+
 .modal-footer {
   border-top-color: #f4f4f4;
 }
+
 .modal-primary .modal-header,
 .modal-primary .modal-footer {
   border-color: #307095;
 }
+
 .modal-warning .modal-header,
 .modal-warning .modal-footer {
   border-color: #c87f0a;
 }
+
 .modal-info .modal-header,
 .modal-info .modal-footer {
   border-color: #0097bc;
 }
+
 .modal-success .modal-header,
 .modal-success .modal-footer {
   border-color: #00733e;
 }
+
 .modal-danger .modal-header,
 .modal-danger .modal-footer {
   border-color: #c23321;
 }
+
 /*
  * Page: Mailbox
  * -------------
@@ -2546,31 +3033,39 @@ table.text-center th {
 .mailbox-messages > .table {
   margin: 0;
 }
+
 .mailbox-controls {
   padding: 5px;
 }
+
 .mailbox-controls.with-border {
   border-bottom: 1px solid #f4f4f4;
 }
+
 .mailbox-read-info {
   border-bottom: 1px solid #f4f4f4;
   padding: 10px;
 }
+
 .mailbox-read-info h3 {
   font-size: 20px;
   margin: 0;
 }
+
 .mailbox-read-info h5 {
   margin: 0;
   padding: 5px 0 0 0;
 }
+
 .mailbox-read-time {
   color: #999;
   font-size: 13px;
 }
+
 .mailbox-read-message {
   padding: 10px;
 }
+
 .mailbox-attachments li {
   float: left;
   width: 200px;
@@ -2578,46 +3073,56 @@ table.text-center th {
   margin-bottom: 10px;
   margin-right: 10px;
 }
+
 .mailbox-attachment-name {
   font-weight: bold;
   color: #666;
 }
+
 .mailbox-attachment-icon,
 .mailbox-attachment-info,
 .mailbox-attachment-size {
   display: block;
 }
+
 .mailbox-attachment-info {
   padding: 10px;
   background: #f4f4f4;
 }
+
 .mailbox-attachment-size {
   color: #999;
   font-size: 12px;
 }
+
 .mailbox-attachment-icon {
   text-align: center;
   font-size: 65px;
   color: #666;
   padding: 20px 10px;
 }
+
 .mailbox-attachment-icon.has-img {
   padding: 0;
 }
+
 .mailbox-attachment-icon.has-img > img {
   max-width: 100%;
   height: auto;
 }
+
 .mailbox .table-mailbox {
   border-left: 1px solid #f4f4f4;
   border-right: 1px solid #f4f4f4;
   border-bottom: 1px solid #f4f4f4;
 }
+
 .mailbox .table-mailbox tr.unread > td {
   background-color: rgba(0, 0, 0, 0.05);
   color: #000;
   font-weight: 600;
 }
+
 .mailbox .table-mailbox tr > td > .fa.fa-star,
 .mailbox .table-mailbox tr > td > .fa.fa-star-o,
 .mailbox .table-mailbox tr > td > .glyphicon.glyphicon-star,
@@ -2625,35 +3130,44 @@ table.text-center th {
   color: #f39c12;
   cursor: pointer;
 }
+
 .mailbox .table-mailbox tr > td.small-col {
   width: 30px;
 }
+
 .mailbox .table-mailbox tr > td.name {
   width: 150px;
   font-weight: 600;
 }
+
 .mailbox .table-mailbox tr > td.time {
   text-align: right;
   width: 100px;
 }
+
 .mailbox .table-mailbox tr > td {
   white-space: nowrap;
 }
+
 .mailbox .table-mailbox tr > td > a {
   color: #444;
 }
+
 @media (max-width: 991px) {
   .mailbox .nav-stacked > li:not(.header) {
     float: left;
     width: 50%;
   }
+
   .mailbox .nav-stacked > li:not(.header).header {
-    border: 0!important;
+    border: 0 !important;
   }
+
   .mailbox .search-form {
     margin-top: 10px;
   }
 }
+
 /*
  * Page: Lock Screen
  * -----------------
@@ -2662,25 +3176,30 @@ table.text-center th {
 .lockscreen {
   background: #d2d6de;
 }
+
 .lockscreen-logo {
   font-size: 35px;
   text-align: center;
   margin-bottom: 25px;
   font-weight: 300;
 }
+
 .lockscreen-logo a {
   color: #444;
 }
+
 .lockscreen-wrapper {
   max-width: 400px;
   margin: 0 auto;
   margin-top: 10%;
 }
+
 /* User name [optional] */
 .lockscreen .lockscreen-name {
   text-align: center;
   font-weight: 600;
 }
+
 /* Will contain the image and the sign in form */
 .lockscreen-item {
   border-radius: 4px;
@@ -2690,6 +3209,7 @@ table.text-center th {
   margin: 10px auto 30px auto;
   width: 290px;
 }
+
 /* User image */
 .lockscreen-image {
   border-radius: 50%;
@@ -2700,26 +3220,32 @@ table.text-center th {
   padding: 5px;
   z-index: 10;
 }
+
 .lockscreen-image > img {
   border-radius: 50%;
   width: 70px;
   height: 70px;
 }
+
 /* Contains the password input and the login button */
 .lockscreen-credentials {
   margin-left: 70px;
 }
+
 .lockscreen-credentials .form-control {
   border: 0 !important;
 }
+
 .lockscreen-credentials .btn {
   background-color: #fff;
   border: 0;
   padding: 0 10px;
 }
+
 .lockscreen-footer {
   margin-top: 10px;
 }
+
 /*
  * Page: Login & Register
  * ----------------------
@@ -2731,19 +3257,23 @@ table.text-center th {
   margin-bottom: 25px;
   font-weight: 300;
 }
+
 .login-logo a,
 .register-logo a {
   color: #444;
 }
+
 .login-page,
 .register-page {
   background: #d2d6de;
 }
+
 .login-box,
 .register-box {
   width: 360px;
   margin: 7% auto;
 }
+
 @media (max-width: 768px) {
   .login-box,
   .register-box {
@@ -2751,6 +3281,7 @@ table.text-center th {
     margin-top: 20px;
   }
 }
+
 .login-box-body,
 .register-box-body {
   background: #fff;
@@ -2759,19 +3290,23 @@ table.text-center th {
   border-top: 0;
   color: #666;
 }
+
 .login-box-body .form-control-feedback,
 .register-box-body .form-control-feedback {
   color: #777;
 }
+
 .login-box-msg,
 .register-box-msg {
   margin: 0;
   text-align: center;
   padding: 0 20px 20px 20px;
 }
+
 .social-auth-links {
   margin: 10px 0;
 }
+
 /*
  * Page: 400 and 500 error pages
  * ------------------------------
@@ -2780,40 +3315,48 @@ table.text-center th {
   width: 600px;
   margin: 20px auto 0 auto;
 }
+
 @media (max-width: 991px) {
   .error-page {
     width: 100%;
   }
 }
+
 .error-page > .headline {
   float: left;
   font-size: 100px;
   font-weight: 300;
 }
+
 @media (max-width: 991px) {
   .error-page > .headline {
     float: none;
     text-align: center;
   }
 }
+
 .error-page > .error-content {
   margin-left: 190px;
   display: block;
 }
+
 @media (max-width: 991px) {
   .error-page > .error-content {
     margin-left: 0;
   }
 }
+
 .error-page > .error-content > h3 {
   font-weight: 300;
   font-size: 25px;
 }
+
 @media (max-width: 991px) {
   .error-page > .error-content > h3 {
     text-align: center;
   }
 }
+
 /*
  * Page: Invoice
  * -------------
@@ -2825,9 +3368,11 @@ table.text-center th {
   padding: 20px;
   margin: 10px 25px;
 }
+
 .invoice-title {
   margin-top: 0;
 }
+
 /*
  * Plugin: Social Buttons
  * ----------------------
@@ -2840,6 +3385,7 @@ table.text-center th {
   overflow: hidden;
   text-overflow: ellipsis;
 }
+
 .btn-social :first-child {
   position: absolute;
   left: 0;
@@ -2847,34 +3393,41 @@ table.text-center th {
   bottom: 0;
   width: 32px !important;
   line-height: 34px !important;
-  font-size: 1.6em!important;
+  font-size: 1.6em !important;
   text-align: center;
   border-right: 1px solid rgba(0, 0, 0, 0.2);
 }
+
 .btn-social.btn-lg {
   padding-left: 61px !important;
 }
+
 .btn-social.btn-lg :first-child {
   line-height: 45px;
   width: 45px;
   font-size: 1.8em;
 }
+
 .btn-social.btn-sm {
   padding-left: 38px !important;
 }
+
 .btn-social.btn-sm :first-child {
   line-height: 28px;
   width: 28px;
   font-size: 1.4em;
 }
+
 .btn-social.btn-xs {
   padding-left: 30px !important;
 }
+
 .btn-social.btn-xs :first-child {
   line-height: 20px;
   width: 20px;
   font-size: 1.2em;
 }
+
 .btn-social-icon {
   position: relative;
   padding-left: 44px !important;
@@ -2886,6 +3439,7 @@ table.text-center th {
   width: 34px;
   padding: 0;
 }
+
 .btn-social-icon :first-child {
   position: absolute;
   left: 0;
@@ -2893,62 +3447,74 @@ table.text-center th {
   bottom: 0;
   width: 32px !important;
   line-height: 34px !important;
-  font-size: 1.6em!important;
+  font-size: 1.6em !important;
   text-align: center;
   border-right: 1px solid rgba(0, 0, 0, 0.2);
 }
+
 .btn-social-icon.btn-lg {
   padding-left: 61px !important;
 }
+
 .btn-social-icon.btn-lg :first-child {
   line-height: 45px;
   width: 45px;
   font-size: 1.8em;
 }
+
 .btn-social-icon.btn-sm {
   padding-left: 38px !important;
 }
+
 .btn-social-icon.btn-sm :first-child {
   line-height: 28px;
   width: 28px;
   font-size: 1.4em;
 }
+
 .btn-social-icon.btn-xs {
   padding-left: 30px !important;
 }
+
 .btn-social-icon.btn-xs :first-child {
   line-height: 20px;
   width: 20px;
   font-size: 1.2em;
 }
+
 .btn-social-icon :first-child {
   border: none;
   text-align: center;
-  width: 100%!important;
+  width: 100% !important;
 }
+
 .btn-social-icon.btn-lg {
   height: 45px;
   width: 45px;
   padding-left: 0;
   padding-right: 0;
 }
+
 .btn-social-icon.btn-sm {
   height: 30px;
   width: 30px;
   padding-left: 0;
   padding-right: 0;
 }
+
 .btn-social-icon.btn-xs {
   height: 22px;
   width: 22px;
   padding-left: 0;
   padding-right: 0;
 }
+
 .btn-bitbucket {
   color: #ffffff;
   background-color: #205081;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-bitbucket:hover,
 .btn-bitbucket:focus,
 .btn-bitbucket.focus,
@@ -2959,11 +3525,13 @@ table.text-center th {
   background-color: #163758;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-bitbucket:active,
 .btn-bitbucket.active,
 .open > .dropdown-toggle.btn-bitbucket {
   background-image: none;
 }
+
 .btn-bitbucket.disabled,
 .btn-bitbucket[disabled],
 fieldset[disabled] .btn-bitbucket,
@@ -2985,15 +3553,18 @@ fieldset[disabled] .btn-bitbucket.active {
   background-color: #205081;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-bitbucket .badge {
   color: #205081;
   background-color: #ffffff;
 }
+
 .btn-dropbox {
   color: #ffffff;
   background-color: #1087dd;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-dropbox:hover,
 .btn-dropbox:focus,
 .btn-dropbox.focus,
@@ -3004,11 +3575,13 @@ fieldset[disabled] .btn-bitbucket.active {
   background-color: #0d6aad;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-dropbox:active,
 .btn-dropbox.active,
 .open > .dropdown-toggle.btn-dropbox {
   background-image: none;
 }
+
 .btn-dropbox.disabled,
 .btn-dropbox[disabled],
 fieldset[disabled] .btn-dropbox,
@@ -3030,15 +3603,18 @@ fieldset[disabled] .btn-dropbox.active {
   background-color: #1087dd;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-dropbox .badge {
   color: #1087dd;
   background-color: #ffffff;
 }
+
 .btn-facebook {
   color: #ffffff;
   background-color: #3b5998;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-facebook:hover,
 .btn-facebook:focus,
 .btn-facebook.focus,
@@ -3049,11 +3625,13 @@ fieldset[disabled] .btn-dropbox.active {
   background-color: #2d4373;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-facebook:active,
 .btn-facebook.active,
 .open > .dropdown-toggle.btn-facebook {
   background-image: none;
 }
+
 .btn-facebook.disabled,
 .btn-facebook[disabled],
 fieldset[disabled] .btn-facebook,
@@ -3075,15 +3653,18 @@ fieldset[disabled] .btn-facebook.active {
   background-color: #3b5998;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-facebook .badge {
   color: #3b5998;
   background-color: #ffffff;
 }
+
 .btn-flickr {
   color: #ffffff;
   background-color: #ff0084;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-flickr:hover,
 .btn-flickr:focus,
 .btn-flickr.focus,
@@ -3094,11 +3675,13 @@ fieldset[disabled] .btn-facebook.active {
   background-color: #cc006a;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-flickr:active,
 .btn-flickr.active,
 .open > .dropdown-toggle.btn-flickr {
   background-image: none;
 }
+
 .btn-flickr.disabled,
 .btn-flickr[disabled],
 fieldset[disabled] .btn-flickr,
@@ -3120,15 +3703,18 @@ fieldset[disabled] .btn-flickr.active {
   background-color: #ff0084;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-flickr .badge {
   color: #ff0084;
   background-color: #ffffff;
 }
+
 .btn-foursquare {
   color: #ffffff;
   background-color: #0072b1;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-foursquare:hover,
 .btn-foursquare:focus,
 .btn-foursquare.focus,
@@ -3139,11 +3725,13 @@ fieldset[disabled] .btn-flickr.active {
   background-color: #00517e;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-foursquare:active,
 .btn-foursquare.active,
 .open > .dropdown-toggle.btn-foursquare {
   background-image: none;
 }
+
 .btn-foursquare.disabled,
 .btn-foursquare[disabled],
 fieldset[disabled] .btn-foursquare,
@@ -3165,15 +3753,18 @@ fieldset[disabled] .btn-foursquare.active {
   background-color: #0072b1;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-foursquare .badge {
   color: #0072b1;
   background-color: #ffffff;
 }
+
 .btn-github {
   color: #ffffff;
   background-color: #444444;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-github:hover,
 .btn-github:focus,
 .btn-github.focus,
@@ -3184,11 +3775,13 @@ fieldset[disabled] .btn-foursquare.active {
   background-color: #2b2b2b;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-github:active,
 .btn-github.active,
 .open > .dropdown-toggle.btn-github {
   background-image: none;
 }
+
 .btn-github.disabled,
 .btn-github[disabled],
 fieldset[disabled] .btn-github,
@@ -3210,15 +3803,18 @@ fieldset[disabled] .btn-github.active {
   background-color: #444444;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-github .badge {
   color: #444444;
   background-color: #ffffff;
 }
+
 .btn-google-plus {
   color: #ffffff;
   background-color: #dd4b39;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-google-plus:hover,
 .btn-google-plus:focus,
 .btn-google-plus.focus,
@@ -3229,11 +3825,13 @@ fieldset[disabled] .btn-github.active {
   background-color: #c23321;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-google-plus:active,
 .btn-google-plus.active,
 .open > .dropdown-toggle.btn-google-plus {
   background-image: none;
 }
+
 .btn-google-plus.disabled,
 .btn-google-plus[disabled],
 fieldset[disabled] .btn-google-plus,
@@ -3255,15 +3853,18 @@ fieldset[disabled] .btn-google-plus.active {
   background-color: #dd4b39;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-google-plus .badge {
   color: #dd4b39;
   background-color: #ffffff;
 }
+
 .btn-instagram {
   color: #ffffff;
   background-color: #3f729b;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-instagram:hover,
 .btn-instagram:focus,
 .btn-instagram.focus,
@@ -3274,11 +3875,13 @@ fieldset[disabled] .btn-google-plus.active {
   background-color: #305777;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-instagram:active,
 .btn-instagram.active,
 .open > .dropdown-toggle.btn-instagram {
   background-image: none;
 }
+
 .btn-instagram.disabled,
 .btn-instagram[disabled],
 fieldset[disabled] .btn-instagram,
@@ -3300,15 +3903,18 @@ fieldset[disabled] .btn-instagram.active {
   background-color: #3f729b;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-instagram .badge {
   color: #3f729b;
   background-color: #ffffff;
 }
+
 .btn-linkedin {
   color: #ffffff;
   background-color: #007bb6;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-linkedin:hover,
 .btn-linkedin:focus,
 .btn-linkedin.focus,
@@ -3319,11 +3925,13 @@ fieldset[disabled] .btn-instagram.active {
   background-color: #005983;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-linkedin:active,
 .btn-linkedin.active,
 .open > .dropdown-toggle.btn-linkedin {
   background-image: none;
 }
+
 .btn-linkedin.disabled,
 .btn-linkedin[disabled],
 fieldset[disabled] .btn-linkedin,
@@ -3345,15 +3953,18 @@ fieldset[disabled] .btn-linkedin.active {
   background-color: #007bb6;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-linkedin .badge {
   color: #007bb6;
   background-color: #ffffff;
 }
+
 .btn-tumblr {
   color: #ffffff;
   background-color: #2c4762;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-tumblr:hover,
 .btn-tumblr:focus,
 .btn-tumblr.focus,
@@ -3364,11 +3975,13 @@ fieldset[disabled] .btn-linkedin.active {
   background-color: #1c2d3f;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-tumblr:active,
 .btn-tumblr.active,
 .open > .dropdown-toggle.btn-tumblr {
   background-image: none;
 }
+
 .btn-tumblr.disabled,
 .btn-tumblr[disabled],
 fieldset[disabled] .btn-tumblr,
@@ -3390,15 +4003,18 @@ fieldset[disabled] .btn-tumblr.active {
   background-color: #2c4762;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-tumblr .badge {
   color: #2c4762;
   background-color: #ffffff;
 }
+
 .btn-twitter {
   color: #ffffff;
   background-color: #55acee;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-twitter:hover,
 .btn-twitter:focus,
 .btn-twitter.focus,
@@ -3409,11 +4025,13 @@ fieldset[disabled] .btn-tumblr.active {
   background-color: #2795e9;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-twitter:active,
 .btn-twitter.active,
 .open > .dropdown-toggle.btn-twitter {
   background-image: none;
 }
+
 .btn-twitter.disabled,
 .btn-twitter[disabled],
 fieldset[disabled] .btn-twitter,
@@ -3435,15 +4053,18 @@ fieldset[disabled] .btn-twitter.active {
   background-color: #55acee;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-twitter .badge {
   color: #55acee;
   background-color: #ffffff;
 }
+
 .btn-vk {
   color: #ffffff;
   background-color: #587ea3;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-vk:hover,
 .btn-vk:focus,
 .btn-vk.focus,
@@ -3454,11 +4075,13 @@ fieldset[disabled] .btn-twitter.active {
   background-color: #466482;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-vk:active,
 .btn-vk.active,
 .open > .dropdown-toggle.btn-vk {
   background-image: none;
 }
+
 .btn-vk.disabled,
 .btn-vk[disabled],
 fieldset[disabled] .btn-vk,
@@ -3480,10 +4103,12 @@ fieldset[disabled] .btn-vk.active {
   background-color: #587ea3;
   border-color: rgba(0, 0, 0, 0.2);
 }
+
 .btn-vk .badge {
   color: #587ea3;
   background-color: #ffffff;
 }
+
 /*
  * Plugin: Full Calendar
  * ---------------------
@@ -3495,76 +4120,92 @@ fieldset[disabled] .btn-vk.active {
   border-color: #ddd;
   border-bottom-color: #ddd;
 }
+
 .fc-button:hover,
 .fc-button:active,
 .fc-button.hover {
   background-color: #e9e9e9;
 }
+
 .fc-header-title h2 {
   font-size: 15px;
   line-height: 1.6em;
   color: #666;
   margin-left: 10px;
 }
+
 .fc-header-right {
   padding-right: 10px;
 }
+
 .fc-header-left {
   padding-left: 10px;
 }
+
 .fc-widget-header {
   background: #fafafa;
 }
+
 .fc-grid {
   width: 100%;
   border: 0;
 }
+
 .fc-widget-header:first-of-type,
 .fc-widget-content:first-of-type {
   border-left: 0;
   border-right: 0;
 }
+
 .fc-widget-header:last-of-type,
 .fc-widget-content:last-of-type {
   border-right: 0;
 }
+
 .fc-toolbar {
   padding: 10px;
   margin: 0;
 }
+
 .fc-day-number {
   font-size: 20px;
   font-weight: 300;
   padding-right: 10px;
 }
+
 .fc-color-picker {
   list-style: none;
   margin: 0;
   padding: 0;
 }
+
 .fc-color-picker > li {
   float: left;
   font-size: 30px;
   margin-right: 5px;
   line-height: 30px;
 }
+
 .fc-color-picker > li .fa {
   -webkit-transition: -webkit-transform linear 0.3s;
   -moz-transition: -moz-transform linear 0.3s;
   -o-transition: -o-transform linear 0.3s;
   transition: transform linear 0.3s;
 }
+
 .fc-color-picker > li .fa:hover {
   -webkit-transform: rotate(30deg);
   -ms-transform: rotate(30deg);
   -o-transform: rotate(30deg);
   transform: rotate(30deg);
 }
+
 #add-new-event {
   -webkit-transition: all linear 0.3s;
   -o-transition: all linear 0.3s;
   transition: all linear 0.3s;
 }
+
 .external-event {
   padding: 5px 10px;
   font-weight: bold;
@@ -3574,9 +4215,11 @@ fieldset[disabled] .btn-vk.active {
   border-radius: 3px;
   cursor: move;
 }
+
 .external-event:hover {
   box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2);
 }
+
 /*
  * General: Miscellaneous
  * ----------------------
@@ -3585,35 +4228,43 @@ fieldset[disabled] .btn-vk.active {
 .pad {
   padding: 10px;
 }
+
 .margin {
   margin: 10px;
 }
+
 .margin-bottom {
   margin-bottom: 20px;
 }
+
 /* Display inline */
 .inline {
   display: inline;
   width: auto;
 }
+
 /* Description Blocks */
 .description-block {
   display: block;
   margin: 10px 0;
   text-align: center;
 }
+
 .description-block.margin-bottom {
   margin-bottom: 25px;
 }
+
 .description-block > .description-header {
   margin: 0;
   padding: 0;
   font-weight: 600;
   font-size: 16px;
 }
+
 .description-block > .description-text {
   text-transform: uppercase;
 }
+
 /* Background colors */
 .bg-red,
 .bg-yellow,
@@ -3676,13 +4327,16 @@ fieldset[disabled] .btn-vk.active {
 .modal-danger .modal-footer {
   color: #fff !important;
 }
+
 .bg-gray {
   color: #000;
   background-color: #d2d6de !important;
 }
+
 .bg-black {
   background-color: #111111 !important;
 }
+
 .bg-red,
 .callout.callout-danger,
 .alert-danger,
@@ -3691,6 +4345,7 @@ fieldset[disabled] .btn-vk.active {
 .modal-danger .modal-body {
   background-color: #dd4b39 !important;
 }
+
 .bg-yellow,
 .callout.callout-warning,
 .alert-warning,
@@ -3698,6 +4353,7 @@ fieldset[disabled] .btn-vk.active {
 .modal-warning .modal-body {
   background-color: #f39c12 !important;
 }
+
 .bg-aqua,
 .callout.callout-info,
 .alert-info,
@@ -3705,14 +4361,17 @@ fieldset[disabled] .btn-vk.active {
 .modal-info .modal-body {
   background-color: #00c0ef !important;
 }
+
 .bg-blue {
   background-color: #0073b7 !important;
 }
+
 .bg-light-blue,
 .label-primary,
 .modal-primary .modal-body {
   background-color: #3c8dbc !important;
 }
+
 .bg-green,
 .callout.callout-success,
 .alert-success,
@@ -3720,162 +4379,209 @@ fieldset[disabled] .btn-vk.active {
 .modal-success .modal-body {
   background-color: #00a65a !important;
 }
+
 .bg-navy {
   background-color: #001f3f !important;
 }
+
 .bg-teal {
   background-color: #39cccc !important;
 }
+
 .bg-olive {
   background-color: #3d9970 !important;
 }
+
 .bg-lime {
   background-color: #01ff70 !important;
 }
+
 .bg-orange {
   background-color: #ff851b !important;
 }
+
 .bg-fuchsia {
   background-color: #f012be !important;
 }
+
 .bg-purple {
   background-color: #605ca8 !important;
 }
+
 .bg-maroon {
   background-color: #d81b60 !important;
 }
+
 .bg-gray-active {
   color: #000;
   background-color: #b5bbc8 !important;
 }
+
 .bg-black-active {
   background-color: #000000 !important;
 }
+
 .bg-red-active,
 .modal-danger .modal-header,
 .modal-danger .modal-footer {
   background-color: #d33724 !important;
 }
+
 .bg-yellow-active,
 .modal-warning .modal-header,
 .modal-warning .modal-footer {
   background-color: #db8b0b !important;
 }
+
 .bg-aqua-active,
 .modal-info .modal-header,
 .modal-info .modal-footer {
   background-color: #00a7d0 !important;
 }
+
 .bg-blue-active {
   background-color: #005384 !important;
 }
+
 .bg-light-blue-active,
 .modal-primary .modal-header,
 .modal-primary .modal-footer {
   background-color: #357ca5 !important;
 }
+
 .bg-green-active,
 .modal-success .modal-header,
 .modal-success .modal-footer {
   background-color: #008d4c !important;
 }
+
 .bg-navy-active {
   background-color: #001a35 !important;
 }
+
 .bg-teal-active {
   background-color: #30bbbb !important;
 }
+
 .bg-olive-active {
   background-color: #368763 !important;
 }
+
 .bg-lime-active {
   background-color: #00e765 !important;
 }
+
 .bg-orange-active {
   background-color: #ff7701 !important;
 }
+
 .bg-fuchsia-active {
   background-color: #db0ead !important;
 }
+
 .bg-purple-active {
   background-color: #555299 !important;
 }
+
 .bg-maroon-active {
   background-color: #ca195a !important;
 }
+
 [class^="bg-"].disabled {
   opacity: 0.65;
   filter: alpha(opacity=65);
 }
+
 /* Text colors */
 .text-red {
   color: #dd4b39 !important;
 }
+
 .text-yellow {
   color: #f39c12 !important;
 }
+
 .text-aqua {
   color: #00c0ef !important;
 }
+
 .text-blue {
   color: #0073b7 !important;
 }
+
 .text-black {
   color: #111111 !important;
 }
+
 .text-light-blue {
   color: #3c8dbc !important;
 }
+
 .text-green {
   color: #00a65a !important;
 }
+
 .text-gray {
   color: #d2d6de !important;
 }
+
 .text-navy {
   color: #001f3f !important;
 }
+
 .text-teal {
   color: #39cccc !important;
 }
+
 .text-olive {
   color: #3d9970 !important;
 }
+
 .text-lime {
   color: #01ff70 !important;
 }
+
 .text-orange {
   color: #ff851b !important;
 }
+
 .text-fuchsia {
   color: #f012be !important;
 }
+
 .text-purple {
   color: #605ca8 !important;
 }
+
 .text-maroon {
   color: #d81b60 !important;
 }
+
 /*Hide elements by display none only*/
 .hide {
   display: none !important;
 }
+
 /* Remove borders */
 .no-border {
   border: 0px !important;
 }
+
 /* Remove padding */
 .no-padding {
   padding: 0px !important;
 }
+
 /* Remove margins */
 .no-margin {
   margin: 0px !important;
 }
+
 /* Remove box shadow */
 .no-shadow {
-  box-shadow: none!important;
+  box-shadow: none !important;
 }
+
 /* Unstyled List */
 .list-unstyled,
 .chart-legend,
@@ -3886,21 +4592,25 @@ fieldset[disabled] .btn-vk.active {
   margin: 0;
   padding: 0;
 }
+
 /* Remove border radius */
 .flat {
   border-radius: 0 !important;
 }
+
 .text-bold,
 .text-bold.table td,
 .text-bold.table th {
   font-weight: 700;
 }
+
 /* _fix for sparkline tooltip */
 .jqstooltip {
-  padding: 5px!important;
-  width: auto!important;
-  height: auto!important;
+  padding: 5px !important;
+  width: auto !important;
+  height: auto !important;
 }
+
 /*
 Gradient Background colors
 */
@@ -3913,6 +4623,7 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;
   color: #fff;
 }
+
 .bg-light-blue-gradient {
   background: #3c8dbc !important;
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;
@@ -3922,6 +4633,7 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;
   color: #fff;
 }
+
 .bg-blue-gradient {
   background: #0073b7 !important;
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;
@@ -3931,6 +4643,7 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;
   color: #fff;
 }
+
 .bg-aqua-gradient {
   background: #00c0ef !important;
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;
@@ -3940,6 +4653,7 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;
   color: #fff;
 }
+
 .bg-yellow-gradient {
   background: #f39c12 !important;
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;
@@ -3949,6 +4663,7 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;
   color: #fff;
 }
+
 .bg-purple-gradient {
   background: #605ca8 !important;
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;
@@ -3958,6 +4673,7 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;
   color: #fff;
 }
+
 .bg-green-gradient {
   background: #00a65a !important;
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;
@@ -3967,6 +4683,7 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;
   color: #fff;
 }
+
 .bg-red-gradient {
   background: #dd4b39 !important;
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;
@@ -3976,6 +4693,7 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;
   color: #fff;
 }
+
 .bg-black-gradient {
   background: #111111 !important;
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111111), color-stop(1, #2b2b2b)) !important;
@@ -3985,6 +4703,7 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;
   color: #fff;
 }
+
 .bg-maroon-gradient {
   background: #d81b60 !important;
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;
@@ -3994,9 +4713,11 @@ Gradient Background colors
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;
   color: #fff;
 }
+
 .connectedSortable {
   min-height: 100px;
 }
+
 .ui-helper-hidden-accessible {
   border: 0;
   clip: rect(0 0 0 0);
@@ -4007,19 +4728,23 @@ Gradient Background colors
   position: absolute;
   width: 1px;
 }
+
 .sort-highlight {
   background: #f4f4f4;
   border: 1px dashed #ddd;
   margin-bottom: 10px;
 }
+
 .full-opacity-hover {
   opacity: 0.65;
   filter: alpha(opacity=65);
 }
+
 .full-opacity-hover:hover {
   opacity: 1;
   filter: alpha(opacity=100);
 }
+
 /*
  * Misc: print
  * -----------
@@ -4030,37 +4755,43 @@ Gradient Background colors
   .left-side,
   .main-header,
   .content-header {
-    display: none!important;
+    display: none !important;
   }
+
   .content-wrapper,
   .right-side,
   .main-footer {
-    margin-left: 0!important;
-    min-height: 0!important;
+    margin-left: 0 !important;
+    min-height: 0 !important;
     -webkit-transform: translate(0, 0) !important;
     -ms-transform: translate(0, 0) !important;
     -o-transform: translate(0, 0) !important;
     transform: translate(0, 0) !important;
   }
+
   .fixed .content-wrapper,
   .fixed .right-side {
-    padding-top: 0!important;
+    padding-top: 0 !important;
   }
+
   .invoice {
     width: 100%;
     border: 0;
     margin: 0;
     padding: 0;
   }
+
   .invoice-col {
     float: left;
     width: 33.3333333%;
   }
+
   .table-responsive {
     overflow: auto;
   }
+
   .table-responsive > .table tr th,
   .table-responsive > .table tr td {
-    white-space: normal!important;
+    white-space: normal !important;
   }
 }


[4/5] kylin git commit: reformat code

Posted by zh...@apache.org.
reformat code


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/e3b8be38
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/e3b8be38
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/e3b8be38

Branch: refs/heads/master
Commit: e3b8be38c855ee1395fd4765462702215efe76bb
Parents: 48180ec
Author: Jason <ji...@163.com>
Authored: Tue Jul 12 16:28:29 2016 +0800
Committer: Jason <ji...@163.com>
Committed: Tue Jul 12 20:25:25 2016 +0800

----------------------------------------------------------------------
 assembly/pom.xml                    |   5 +-
 atopcalcite/pom.xml                 |   5 +-
 build/conf/kylin_job_conf.xml       |  54 +--
 build/conf/kylin_job_conf_inmem.xml |  98 ++--
 build/deploy/server.xml             |  20 +-
 checkstyle-suppressions.xml         |  10 +-
 checkstyle.xml                      |   6 +-
 core-common/pom.xml                 |   9 +-
 core-cube/pom.xml                   |   3 +-
 core-dictionary/pom.xml             |   5 +-
 core-job/pom.xml                    |   5 +-
 core-metadata/pom.xml               |   7 +-
 core-storage/pom.xml                |   5 +-
 engine-mr/pom.xml                   |   3 +-
 engine-spark/pom.xml                |   9 +-
 engine-streaming/pom.xml            |   4 +-
 jdbc/pom.xml                        |   3 +-
 pom.xml                             |  25 +-
 query/pom.xml                       |   5 +-
 server-base/pom.xml                 |   5 +-
 server/pom.xml                      |   9 +-
 source-hive/pom.xml                 |   5 +-
 source-kafka/pom.xml                |   3 +-
 storage-hbase/pom.xml               |   6 +-
 webapp/.jshintrc                    |   1 -
 webapp/Gruntfile.js                 | 524 ++++++++++----------
 webapp/app/css/AdminLTE.css         | 787 +++++++++++++++++++++++++++++--
 webapp/app/index.html               | 118 ++---
 webapp/app/js/app.js                |   4 +-
 webapp/app/js/config.js             | 102 ++--
 webapp/app/js/listeners.js          |  20 +-
 webapp/app/less/app.less            |  20 +-
 webapp/app/less/build.less          |   1 -
 webapp/app/less/component.less      | 284 ++++++++---
 webapp/app/less/home.less           |   6 +-
 webapp/app/less/layout.less         |   5 +-
 webapp/app/less/navbar.less         |  80 ++--
 webapp/app/partials/footer.html     |   9 +-
 webapp/app/partials/header.html     | 113 ++---
 webapp/app/partials/home.html       |  70 +--
 webapp/app/partials/login.html      |  64 +--
 webapp/app/routes.json              | 194 ++++----
 webapp/bower.json                   |   2 +-
 webapp/grunt.json                   | 148 +++---
 webapp/package.json                 |  40 +-
 45 files changed, 1923 insertions(+), 978 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/assembly/pom.xml
----------------------------------------------------------------------
diff --git a/assembly/pom.xml b/assembly/pom.xml
index fc1ef63..4442e14 100644
--- a/assembly/pom.xml
+++ b/assembly/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>kylin</artifactId>
         <groupId>org.apache.kylin</groupId>
@@ -220,7 +221,7 @@
             </activation>
             <build>
                 <plugins>
-                    
+
                 </plugins>
             </build>
         </profile>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/atopcalcite/pom.xml
----------------------------------------------------------------------
diff --git a/atopcalcite/pom.xml b/atopcalcite/pom.xml
index be28f1c..b208ea1 100644
--- a/atopcalcite/pom.xml
+++ b/atopcalcite/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>atopcalcite</artifactId>
@@ -32,7 +33,7 @@
 
     <properties>
     </properties>
-    
+
     <dependencies>
         <dependency>
             <groupId>org.apache.calcite</groupId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/build/conf/kylin_job_conf.xml
----------------------------------------------------------------------
diff --git a/build/conf/kylin_job_conf.xml b/build/conf/kylin_job_conf.xml
index 19c8847..877e82f 100644
--- a/build/conf/kylin_job_conf.xml
+++ b/build/conf/kylin_job_conf.xml
@@ -25,37 +25,37 @@
         </description>
     </property>
 
-	<property>
-		<name>mapred.compress.map.output</name>
-		<value>true</value>
-		<description>Compress map outputs</description>
-	</property>
+    <property>
+        <name>mapred.compress.map.output</name>
+        <value>true</value>
+        <description>Compress map outputs</description>
+    </property>
 
-	<property>
-		<name>mapred.map.output.compression.codec</name>
-		<value>org.apache.hadoop.io.compress.SnappyCodec</value>
-		<description>The compression codec to use for map outputs
-		</description>
-	</property>
+    <property>
+        <name>mapred.map.output.compression.codec</name>
+        <value>org.apache.hadoop.io.compress.SnappyCodec</value>
+        <description>The compression codec to use for map outputs
+        </description>
+    </property>
 
-	<property>
-		<name>mapred.output.compress</name>
-		<value>true</value>
-		<description>Compress the output of a MapReduce job</description>
-	</property>
+    <property>
+        <name>mapred.output.compress</name>
+        <value>true</value>
+        <description>Compress the output of a MapReduce job</description>
+    </property>
 
-	<property>
-		<name>mapred.output.compression.codec</name>
-		<value>org.apache.hadoop.io.compress.SnappyCodec</value>
-		<description>The compression codec to use for job outputs
-		</description>
-	</property>
+    <property>
+        <name>mapred.output.compression.codec</name>
+        <value>org.apache.hadoop.io.compress.SnappyCodec</value>
+        <description>The compression codec to use for job outputs
+        </description>
+    </property>
 
-	<property>
-		<name>mapred.output.compression.type</name>
-		<value>BLOCK</value>
-		<description>The compression type to use for job outputs</description>
-	</property>
+    <property>
+        <name>mapred.output.compression.type</name>
+        <value>BLOCK</value>
+        <description>The compression type to use for job outputs</description>
+    </property>
 
 
     <property>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/build/conf/kylin_job_conf_inmem.xml
----------------------------------------------------------------------
diff --git a/build/conf/kylin_job_conf_inmem.xml b/build/conf/kylin_job_conf_inmem.xml
index 55bf9ed..1cd809d 100644
--- a/build/conf/kylin_job_conf_inmem.xml
+++ b/build/conf/kylin_job_conf_inmem.xml
@@ -25,37 +25,37 @@
         </description>
     </property>
 
-	<property>
-		<name>mapred.compress.map.output</name>
-		<value>true</value>
-		<description>Compress map outputs</description>
-	</property>
-
-	<property>
-		<name>mapred.map.output.compression.codec</name>
-		<value>org.apache.hadoop.io.compress.SnappyCodec</value>
-		<description>The compression codec to use for map outputs
-		</description>
-	</property>
-
-	<property>
-		<name>mapred.output.compress</name>
-		<value>true</value>
-		<description>Compress the output of a MapReduce job</description>
-	</property>
-
-	<property>
-		<name>mapred.output.compression.codec</name>
-		<value>org.apache.hadoop.io.compress.SnappyCodec</value>
-		<description>The compression codec to use for job outputs
-		</description>
-	</property>
-
-	<property>
-		<name>mapred.output.compression.type</name>
-		<value>BLOCK</value>
-		<description>The compression type to use for job outputs</description>
-	</property>
+    <property>
+        <name>mapred.compress.map.output</name>
+        <value>true</value>
+        <description>Compress map outputs</description>
+    </property>
+
+    <property>
+        <name>mapred.map.output.compression.codec</name>
+        <value>org.apache.hadoop.io.compress.SnappyCodec</value>
+        <description>The compression codec to use for map outputs
+        </description>
+    </property>
+
+    <property>
+        <name>mapred.output.compress</name>
+        <value>true</value>
+        <description>Compress the output of a MapReduce job</description>
+    </property>
+
+    <property>
+        <name>mapred.output.compression.codec</name>
+        <value>org.apache.hadoop.io.compress.SnappyCodec</value>
+        <description>The compression codec to use for job outputs
+        </description>
+    </property>
+
+    <property>
+        <name>mapred.output.compression.type</name>
+        <value>BLOCK</value>
+        <description>The compression type to use for job outputs</description>
+    </property>
 
 
     <property>
@@ -76,23 +76,23 @@
         <description>Set task timeout to 1 hour</description>
     </property>
 
-	<!--Additional config for in-mem cubing, giving mapper more memory -->
-	<property>
-		<name>mapreduce.map.memory.mb</name>
-		<value>3072</value>
-		<description></description>
-	</property>
-
-	<property>
-		<name>mapreduce.map.java.opts</name>
-		<value>-Xmx2700m</value>
-		<description></description>
-	</property>
-
-	<property>
-		<name>mapreduce.task.io.sort.mb</name>
-		<value>200</value>
-		<description></description>
-	</property>
+    <!--Additional config for in-mem cubing, giving mapper more memory -->
+    <property>
+        <name>mapreduce.map.memory.mb</name>
+        <value>3072</value>
+        <description></description>
+    </property>
+
+    <property>
+        <name>mapreduce.map.java.opts</name>
+        <value>-Xmx2700m</value>
+        <description></description>
+    </property>
+
+    <property>
+        <name>mapreduce.task.io.sort.mb</name>
+        <value>200</value>
+        <description></description>
+    </property>
 
 </configuration>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/build/deploy/server.xml
----------------------------------------------------------------------
diff --git a/build/deploy/server.xml b/build/deploy/server.xml
index 2a78368..72a87d0 100644
--- a/build/deploy/server.xml
+++ b/build/deploy/server.xml
@@ -24,13 +24,13 @@
     <Listener className="org.apache.catalina.security.SecurityListener" />
     -->
     <!--APR library loader. Documentation at /docs/apr.html -->
-    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>
     <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
-    <Listener className="org.apache.catalina.core.JasperListener" />
+    <Listener className="org.apache.catalina.core.JasperListener"/>
     <!-- Prevent memory leaks due to use of particular java/javax APIs-->
-    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
-    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
-    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
+    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
+    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
 
     <!-- Global JNDI resources
          Documentation at /docs/jndi-resources-howto.html
@@ -43,7 +43,7 @@
                   type="org.apache.catalina.UserDatabase"
                   description="User database that can be updated and saved"
                   factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
-                  pathname="conf/tomcat-users.xml" />
+                  pathname="conf/tomcat-users.xml"/>
     </GlobalNamingResources>
 
     <!-- A "Service" is a collection of one or more "Connectors" that share
@@ -74,7 +74,7 @@
                    compressionMinSize="2048"
                    noCompressionUserAgents="gozilla,traviata"
                    compressableMimeType="text/html,text/xml,text/javascript,application/javascript,application/json,text/css,text/plain"
-                />
+        />
         <!-- A "Connector" using the shared thread pool-->
         <!--
         <Connector executor="tomcatThreadPool"
@@ -96,7 +96,7 @@
         -->
 
         <!-- Define an AJP 1.3 Connector on port 8009 -->
-        <Connector port="9009" protocol="AJP/1.3" redirectPort="9443" />
+        <Connector port="9009" protocol="AJP/1.3" redirectPort="9443"/>
 
 
         <!-- An Engine represents the entry point (within Catalina) that processes
@@ -128,7 +128,7 @@
                        resourceName="UserDatabase"/>
             </Realm>
 
-            <Host name="localhost"  appBase="webapps"
+            <Host name="localhost" appBase="webapps"
                   unpackWARs="true" autoDeploy="true">
 
                 <!-- SingleSignOn valve, share authentication between web applications
@@ -142,7 +142,7 @@
                      Note: The pattern used is equivalent to using pattern="common" -->
                 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                        prefix="localhost_access_log." suffix=".txt"
-                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
+                       pattern="%h %l %u %t &quot;%r&quot; %s %b"/>
 
             </Host>
         </Engine>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/checkstyle-suppressions.xml
----------------------------------------------------------------------
diff --git a/checkstyle-suppressions.xml b/checkstyle-suppressions.xml
index fbb8667..06de625 100644
--- a/checkstyle-suppressions.xml
+++ b/checkstyle-suppressions.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <!DOCTYPE suppressions PUBLIC
-    "-//Puppy Crawl//DTD Suppressions 1.0//EN"
-    "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd">
+        "-//Puppy Crawl//DTD Suppressions 1.0//EN"
+        "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd">
 <!--
 /**
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -22,7 +22,7 @@
  */
 -->
 <suppressions>
-	<suppress checks="." files=".*[/\\]generated[/\\].*\.java"/>
-	<suppress checks="." files=".*[/\\]org[/\\]apache[/\\]calcite[/\\].*\.java"/>
-	<suppress checks="MagicNumberCheck" files=".*Test\.java"/>
+    <suppress checks="." files=".*[/\\]generated[/\\].*\.java"/>
+    <suppress checks="." files=".*[/\\]org[/\\]apache[/\\]calcite[/\\].*\.java"/>
+    <suppress checks="MagicNumberCheck" files=".*Test\.java"/>
 </suppressions>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/checkstyle.xml
----------------------------------------------------------------------
diff --git a/checkstyle.xml b/checkstyle.xml
index 682186f..3c5b83f 100644
--- a/checkstyle.xml
+++ b/checkstyle.xml
@@ -21,12 +21,12 @@
         "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
 <module name="Checker">
     <module name="FileTabCharacter"/>
-    <module name="SuppressWarningsFilter" />
+    <module name="SuppressWarningsFilter"/>
     <module name="TreeWalker">
         <module name="AvoidStarImport"/>
         <module name="RedundantImport"/>
         <module name="UnusedImports">
-                <property name="processJavadoc" value="true"/>
+            <property name="processJavadoc" value="true"/>
         </module>
         <module name="LineLength">
             <property name="max" value="1000"/>
@@ -57,6 +57,6 @@
         <module name="WhitespaceAfter">
             <property name="tokens" value="COMMA"/>
         </module>
-        <module name="SuppressWarningsHolder" />
+        <module name="SuppressWarningsHolder"/>
     </module>
 </module>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/core-common/pom.xml
----------------------------------------------------------------------
diff --git a/core-common/pom.xml b/core-common/pom.xml
index ca4c7a9..8f3fcbc 100644
--- a/core-common/pom.xml
+++ b/core-common/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-core-common</artifactId>
@@ -65,8 +66,8 @@
             <artifactId>commons-email</artifactId>
         </dependency>
         <dependency>
-	        <groupId>org.apache.httpcomponents</groupId>
-	        <artifactId>httpclient</artifactId>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
         </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
@@ -100,7 +101,7 @@
         </dependency>
 
         <!-- Env & Test -->
-       
+
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/core-cube/pom.xml
----------------------------------------------------------------------
diff --git a/core-cube/pom.xml b/core-cube/pom.xml
index 0fc2875..cd65237 100644
--- a/core-cube/pom.xml
+++ b/core-cube/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-core-cube</artifactId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/core-dictionary/pom.xml
----------------------------------------------------------------------
diff --git a/core-dictionary/pom.xml b/core-dictionary/pom.xml
index b0f400e..69209d0 100644
--- a/core-dictionary/pom.xml
+++ b/core-dictionary/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-core-dictionary</artifactId>
@@ -60,7 +61,7 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
-        
+
     </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/core-job/pom.xml
----------------------------------------------------------------------
diff --git a/core-job/pom.xml b/core-job/pom.xml
index 8a1211f..a3c1d82 100644
--- a/core-job/pom.xml
+++ b/core-job/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-core-job</artifactId>
@@ -35,7 +36,7 @@
     </properties>
 
     <dependencies>
-    
+
         <dependency>
             <groupId>org.apache.kylin</groupId>
             <artifactId>kylin-core-cube</artifactId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/core-metadata/pom.xml
----------------------------------------------------------------------
diff --git a/core-metadata/pom.xml b/core-metadata/pom.xml
index 0a7cb40..6f0d91e 100644
--- a/core-metadata/pom.xml
+++ b/core-metadata/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-core-metadata</artifactId>
@@ -28,14 +29,14 @@
         <groupId>org.apache.kylin</groupId>
         <artifactId>kylin</artifactId>
         <version>1.5.3-SNAPSHOT</version>
-        
+
     </parent>
 
     <properties>
     </properties>
 
     <dependencies>
-    
+
         <dependency>
             <groupId>org.apache.kylin</groupId>
             <artifactId>kylin-core-common</artifactId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/core-storage/pom.xml
----------------------------------------------------------------------
diff --git a/core-storage/pom.xml b/core-storage/pom.xml
index 27ee61c..d8c1a29 100644
--- a/core-storage/pom.xml
+++ b/core-storage/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-core-storage</artifactId>
@@ -35,7 +36,7 @@
     </properties>
 
     <dependencies>
-    
+
         <dependency>
             <groupId>org.apache.kylin</groupId>
             <artifactId>kylin-core-cube</artifactId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/engine-mr/pom.xml
----------------------------------------------------------------------
diff --git a/engine-mr/pom.xml b/engine-mr/pom.xml
index 12a6b73..2f6ca79 100644
--- a/engine-mr/pom.xml
+++ b/engine-mr/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-engine-mr</artifactId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/engine-spark/pom.xml
----------------------------------------------------------------------
diff --git a/engine-spark/pom.xml b/engine-spark/pom.xml
index 207fc4d..004549d 100644
--- a/engine-spark/pom.xml
+++ b/engine-spark/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.kylin</groupId>
@@ -41,7 +42,7 @@
             <artifactId>kylin-storage-hbase</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
-        
+
         <dependency>
             <groupId>org.apache.kylin</groupId>
             <artifactId>kylin-core-job</artifactId>
@@ -98,7 +99,7 @@
             <scope>test</scope>
             <version>${project.parent.version}</version>
         </dependency>
-        
+
         <dependency>
             <groupId>org.apache.kylin</groupId>
             <artifactId>kylin-core-common</artifactId>
@@ -120,7 +121,6 @@
         </dependency>
 
 
-
     </dependencies>
 
     <build>
@@ -158,5 +158,4 @@
     </build>
 
 
-
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/engine-streaming/pom.xml
----------------------------------------------------------------------
diff --git a/engine-streaming/pom.xml b/engine-streaming/pom.xml
index 7110377..85f2750 100644
--- a/engine-streaming/pom.xml
+++ b/engine-streaming/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-engine-streaming</artifactId>
@@ -116,5 +117,4 @@
     </dependencies>
 
 
-
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/jdbc/pom.xml
----------------------------------------------------------------------
diff --git a/jdbc/pom.xml b/jdbc/pom.xml
index a663fb3..890a4c0 100644
--- a/jdbc/pom.xml
+++ b/jdbc/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <artifactId>kylin-jdbc</artifactId>
     <packaging>jar</packaging>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 4b9c7c0..806c16b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,14 +17,15 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
         <groupId>org.apache</groupId>
         <artifactId>apache</artifactId>
         <version>16</version>
-        <relativePath />
+        <relativePath/>
         <!-- no parent resolution -->
     </parent>
 
@@ -168,8 +169,8 @@
         <connection>scm:git:https://git-wip-us.apache.org/repos/asf/kylin.git</connection>
         <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/kylin.git</developerConnection>
         <url>https://git-wip-us.apache.org/repos/asf/kylin.git</url>
-      <tag>HEAD</tag>
-  </scm>
+        <tag>HEAD</tag>
+    </scm>
 
     <dependencyManagement>
         <dependencies>
@@ -486,12 +487,12 @@
     </repositories>
 
     <build>
-        
+
         <pluginManagement>
-            
+
             <plugins>
-               
-              
+
+
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-compiler-plugin</artifactId>
@@ -803,12 +804,12 @@
                                 <exclude>lib/**</exclude>
                                 <exclude>dist/**</exclude>
                                 <exclude>website/**</exclude>
-                                
+
                                 <!-- text files without comments -->
                                 <exclude>**/*.csv</exclude>
                                 <exclude>**/*.json</exclude>
                                 <exclude>**/*.md</exclude>
-                                
+
                                 <!-- binary files -->
                                 <exclude>**/*.dict</exclude>
                                 <exclude>**/*.dic</exclude>
@@ -818,13 +819,13 @@
                                 <exclude>**/*.doc</exclude>
                                 <exclude>**/*.txt</exclude>
                                 <exclude>**/.checkstyle</exclude>
-                                
+
                                 <!-- Kylin's website content -->
                                 <exclude>**/.sass-cache/**</exclude>
 
                                 <!-- tomcat package -->
                                 <exclude>tomcat/**</exclude>
-                                
+
                                 <!-- front end libary and generated files -->
                                 <exclude>webapp/node_modules/**</exclude>
                                 <exclude>webapp/dist/**</exclude>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/query/pom.xml
----------------------------------------------------------------------
diff --git a/query/pom.xml b/query/pom.xml
index a0b8d94..0dff0c3 100644
--- a/query/pom.xml
+++ b/query/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <!-- The basics. -->
     <artifactId>kylin-query</artifactId>
@@ -245,5 +246,5 @@
             </build>
         </profile>
     </profiles>
-  
+
 </project>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/server-base/pom.xml
----------------------------------------------------------------------
diff --git a/server-base/pom.xml b/server-base/pom.xml
index e6a4cc5..c0d48c9 100644
--- a/server-base/pom.xml
+++ b/server-base/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-server-base</artifactId>
@@ -141,7 +142,7 @@
             <artifactId>spring-test</artifactId>
             <version>${spring.framework.version}</version>
         </dependency>
-        
+
         <!-- Spring Security -->
         <dependency>
             <groupId>org.springframework.security</groupId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/server/pom.xml
----------------------------------------------------------------------
diff --git a/server/pom.xml b/server/pom.xml
index e662909..602dcad 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-server</artifactId>
@@ -105,7 +106,7 @@
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-log4j12</artifactId>
         </dependency>
-        
+
         <!-- Test & Env -->
         <dependency>
             <groupId>org.apache.kylin</groupId>
@@ -128,7 +129,7 @@
             <scope>test</scope>
             <version>${project.parent.version}</version>
         </dependency>
-        
+
         <!-- depends on kylin-jdbc just for running jdbc test cases in server module -->
         <dependency>
             <groupId>org.apache.kylin</groupId>
@@ -266,7 +267,7 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        
+
         <!-- Tomcat Env -->
         <dependency>
             <groupId>org.apache.tomcat</groupId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/source-hive/pom.xml
----------------------------------------------------------------------
diff --git a/source-hive/pom.xml b/source-hive/pom.xml
index a7c68eb..631e43e 100644
--- a/source-hive/pom.xml
+++ b/source-hive/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-source-hive</artifactId>
@@ -35,7 +36,7 @@
     </properties>
 
     <dependencies>
-    
+
         <dependency>
             <groupId>org.apache.kylin</groupId>
             <artifactId>kylin-engine-mr</artifactId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/source-kafka/pom.xml
----------------------------------------------------------------------
diff --git a/source-kafka/pom.xml b/source-kafka/pom.xml
index cf92762..228b956 100644
--- a/source-kafka/pom.xml
+++ b/source-kafka/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-source-kafka</artifactId>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/storage-hbase/pom.xml
----------------------------------------------------------------------
diff --git a/storage-hbase/pom.xml b/storage-hbase/pom.xml
index 0cb42db..4c1cfdc 100644
--- a/storage-hbase/pom.xml
+++ b/storage-hbase/pom.xml
@@ -17,7 +17,8 @@
  limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kylin-storage-hbase</artifactId>
@@ -122,7 +123,8 @@
                             <shadedArtifactAttached>true</shadedArtifactAttached>
                             <shadedClassifierName>coprocessor</shadedClassifierName>
                             <transformers>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                             </transformers>
                             <artifactSet>
                                 <includes>

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/.jshintrc
----------------------------------------------------------------------
diff --git a/webapp/.jshintrc b/webapp/.jshintrc
index 0839b6b..2963d51 100644
--- a/webapp/.jshintrc
+++ b/webapp/.jshintrc
@@ -14,7 +14,6 @@
   "strict": false,
   "trailing": true,
   "undef": true,
-
   "globals": {
     "angular": true,
     "Config": true

http://git-wip-us.apache.org/repos/asf/kylin/blob/e3b8be38/webapp/Gruntfile.js
----------------------------------------------------------------------
diff --git a/webapp/Gruntfile.js b/webapp/Gruntfile.js
index fc45b91..d871f4f 100644
--- a/webapp/Gruntfile.js
+++ b/webapp/Gruntfile.js
@@ -14,284 +14,284 @@
  * 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';
 
 module.exports = function (grunt) {
 
-    // Project configuration.
-    grunt.config.init({
-        buildEnv: grunt.option('buildEnv') || 'prod',
-        buildNumber: grunt.option('buildNumber') || '0',
-        pkg: grunt.file.readJSON('package.json'),
-        config: grunt.file.readJSON('grunt.json'),
-        bump: {
-            options: {
-                files: '<%= config.bump.options.files %>',
-                commit: true,
-                commitFiles: '<%= config.bump.options.commitFiles %>',
-                commitMessage: 'Release v%VERSION%',
-                createTag: false,
-                tagName: 'v%VERSION%',
-                tagMessage: 'Version %VERSION%',
-                push: false
+  // Project configuration.
+  grunt.config.init({
+    buildEnv: grunt.option('buildEnv') || 'prod',
+    buildNumber: grunt.option('buildNumber') || '0',
+    pkg: grunt.file.readJSON('package.json'),
+    config: grunt.file.readJSON('grunt.json'),
+    bump: {
+      options: {
+        files: '<%= config.bump.options.files %>',
+        commit: true,
+        commitFiles: '<%= config.bump.options.commitFiles %>',
+        commitMessage: 'Release v%VERSION%',
+        createTag: false,
+        tagName: 'v%VERSION%',
+        tagMessage: 'Version %VERSION%',
+        push: false
+      }
+    },
+    changelog: {
+      options: {
+        dest: 'CHANGELOG.md',
+        prepend: true
+      }
+    },
+    clean: {
+      build: ['dist/', 'tmp/'],
+      tmp: ['tmp/']
+    },
+    concat: {
+      app: {
+        src: [
+          'tmp/js/templates.js',
+          'app/js/**/*.js'
+        ],
+        dest: 'tmp/js/scripts.js'
+      },
+      components: '<%= config.concat.components %>',
+      css: '<%= config.concat.css %>'
+    },
+    copy: {
+      tmp: {
+        files: [
+          {
+            expand: true,
+            cwd: 'app/',
+            src: ['**'],
+            dest: 'tmp/'
+          }
+        ]
+      },
+      build: {
+        files: [
+          {
+            expand: true,
+            cwd: 'tmp/',
+            src: ['index.html', 'js/scripts.min.js', 'image/**', 'css/styles.min.css', 'routes.json'],
+            dest: 'dist/',
+            rename: function (desc, src) {
+              return desc + src.replace('min.', 'min.<%= buildNumber %>.')
             }
-        },
-        changelog: {
-            options: {
-                dest: 'CHANGELOG.md',
-                prepend: true
-            }
-        },
-        clean: {
-            build: ['dist/', 'tmp/'],
-            tmp: ['tmp/']
-        },
-        concat: {
-            app: {
-                src: [
-                    'tmp/js/templates.js',
-                    'app/js/**/*.js'
-                ],
-                dest: 'tmp/js/scripts.js'
-            },
-            components: '<%= config.concat.components %>',
-            css: '<%= config.concat.css %>'
-        },
-        copy: {
-            tmp: {
-                files: [
-                    {
-                        expand: true,
-                        cwd: 'app/',
-                        src: ['**'],
-                        dest: 'tmp/'
-                    }
-                ]
-            },
-            build: {
-                files: [
-                    {
-                        expand: true,
-                        cwd: 'tmp/',
-                        src: ['index.html', 'js/scripts.min.js', 'image/**', 'css/styles.min.css', 'routes.json'],
-                        dest: 'dist/',
-                        rename: function (desc, src) {
-                            return desc + src.replace('min.', 'min.<%= buildNumber %>.')
-                        }
-                    },
-                    {
-                        expand: true,
-                        cwd: 'tmp/',
-                        src: ['htaccess.dist'],
-                        dest: 'dist/',
-                        rename: function (dest, src) {
-                            console.log(src);
-                            if (src == 'htaccess.dist') {
-                                return dest + '.htaccess';
-                            }
-                        }
-                    },
-                    {
-                        expand: true,
-                        cwd: 'app/components/font-awesome/',
-                        src: ['fonts/*'],
-                        dest: 'dist/'
-                    },
-                    {
-                        expand: true,
-                        cwd: 'app/components/bootstrap/dist/',
-                        src: ['fonts/*'],
-                        dest: 'dist/'
-                    },
-                    {
-                        expand: true,
-                        cwd: 'app/components/ace/',
-                        src: ['fonts/*'],
-                        dest: 'dist/'
-                    },
-                    {
-                        expand: true,
-                        cwd: 'app/components/angular-tree-control/images/',
-                        src: ['*'],
-                        dest: 'dist/images'
-                    },
-                    {
-                        expand: true,
-                        cwd: 'app/components/chosen/',
-                        src: ['*.png'],
-                        dest: 'dist/css'
-                    },
-                    {
-                        expand: true,
-                        cwd: 'app/components/angular-ui-grid/',
-                        src: ['ui-grid.eot', 'ui-grid.svg', 'ui-grid.ttf', 'ui-grid.woff'],
-                        dest: 'dist/css'
-                    },
-                    {
-                        expand: true,
-                        cwd: 'app/components/ace-builds/',
-                        src: ['src-min-noconflict/worker-json.js'],
-                        flatten: true,
-                        dest: 'dist/'
-                    }
-                ]
-            }
-        },
-        html2js: {
-            partials: {
-                src: ['app/partials/**/*.html'],
-                dest: 'tmp/js/templates.js',
-                module: 'templates',
-                options: {
-                    base: 'app/'
-                }
-            }
-        },
-        htmlrefs: {
-            dist: {
-                src: 'tmp/index.html',
-                dest: 'tmp/'
-            },
-            options: {
-                buildNumber: '<%= buildNumber %>'
-            }
-        },
-        jshint: {
-            files: ['app/js/**/*.js', '!app/components/**'],
-            options: {
-                jshintrc: '.jshintrc'
-            }
-        },
-        less: {
-            prod: {
-                options: {
-                    compress: true,
-                    yuicompress: true
-                },
-                files: {
-                    'tmp/css/styles.css': 'tmp/less/build.less'
-                }
-            }
-        },
-        lesslint: {
-            src: ['app/less/**.less']
-        },
-        manifest: {
-            build: {
-                options: {
-                    basePath: 'dist/',
-                    timestamp: true
-                },
-                src: ['**/**.**'],
-                dest: 'dist/manifest.appcache'
+          },
+          {
+            expand: true,
+            cwd: 'tmp/',
+            src: ['htaccess.dist'],
+            dest: 'dist/',
+            rename: function (dest, src) {
+              console.log(src);
+              if (src == 'htaccess.dist') {
+                return dest + '.htaccess';
+              }
             }
+          },
+          {
+            expand: true,
+            cwd: 'app/components/font-awesome/',
+            src: ['fonts/*'],
+            dest: 'dist/'
+          },
+          {
+            expand: true,
+            cwd: 'app/components/bootstrap/dist/',
+            src: ['fonts/*'],
+            dest: 'dist/'
+          },
+          {
+            expand: true,
+            cwd: 'app/components/ace/',
+            src: ['fonts/*'],
+            dest: 'dist/'
+          },
+          {
+            expand: true,
+            cwd: 'app/components/angular-tree-control/images/',
+            src: ['*'],
+            dest: 'dist/images'
+          },
+          {
+            expand: true,
+            cwd: 'app/components/chosen/',
+            src: ['*.png'],
+            dest: 'dist/css'
+          },
+          {
+            expand: true,
+            cwd: 'app/components/angular-ui-grid/',
+            src: ['ui-grid.eot', 'ui-grid.svg', 'ui-grid.ttf', 'ui-grid.woff'],
+            dest: 'dist/css'
+          },
+          {
+            expand: true,
+            cwd: 'app/components/ace-builds/',
+            src: ['src-min-noconflict/worker-json.js'],
+            flatten: true,
+            dest: 'dist/'
+          }
+        ]
+      }
+    },
+    html2js: {
+      partials: {
+        src: ['app/partials/**/*.html'],
+        dest: 'tmp/js/templates.js',
+        module: 'templates',
+        options: {
+          base: 'app/'
+        }
+      }
+    },
+    htmlrefs: {
+      dist: {
+        src: 'tmp/index.html',
+        dest: 'tmp/'
+      },
+      options: {
+        buildNumber: '<%= buildNumber %>'
+      }
+    },
+    jshint: {
+      files: ['app/js/**/*.js', '!app/components/**'],
+      options: {
+        jshintrc: '.jshintrc'
+      }
+    },
+    less: {
+      prod: {
+        options: {
+          compress: true,
+          yuicompress: true
         },
-        'regex-replace': {
-            strict: {
-                src: ['tmp/js/scripts.js'],
-                actions: [
-                    {
-                        name: 'use strict',
-                        search: '\\\'use strict\\\';',
-                        replace: '',
-                        flags: 'gmi'
-                    }
-                ]
-            },
-            manifest: {
-                src: ['tmp/index.html'],
-                actions: [
-                    {
-                        name: 'manifest',
-                        search: '<html>',
-                        replace: '<html manifest="manifest.appcache">'
-                    }
-                ]
-            },
-            templates: {
-                src: ['tmp/js/scripts.js'],
-                actions: [
-                    {
-                        name: 'templates',
-                        search: /kylin\', \[/,
-                        replace: 'kylin\', [\'templates\',',
-                        flags: 'gmi'
-                    }
-                ]
-            }
+        files: {
+          'tmp/css/styles.css': 'tmp/less/build.less'
+        }
+      }
+    },
+    lesslint: {
+      src: ['app/less/**.less']
+    },
+    manifest: {
+      build: {
+        options: {
+          basePath: 'dist/',
+          timestamp: true
         },
-        uglify: {
-            app: {
-                options: {
-                    mangle: false
-                },
-                files: {
-                    'tmp/js/scripts.js': 'tmp/js/scripts.js'
-                }
-            }
+        src: ['**/**.**'],
+        dest: 'dist/manifest.appcache'
+      }
+    },
+    'regex-replace': {
+      strict: {
+        src: ['tmp/js/scripts.js'],
+        actions: [
+          {
+            name: 'use strict',
+            search: '\\\'use strict\\\';',
+            replace: '',
+            flags: 'gmi'
+          }
+        ]
+      },
+      manifest: {
+        src: ['tmp/index.html'],
+        actions: [
+          {
+            name: 'manifest',
+            search: '<html>',
+            replace: '<html manifest="manifest.appcache">'
+          }
+        ]
+      },
+      templates: {
+        src: ['tmp/js/scripts.js'],
+        actions: [
+          {
+            name: 'templates',
+            search: /kylin\', \[/,
+            replace: 'kylin\', [\'templates\',',
+            flags: 'gmi'
+          }
+        ]
+      }
+    },
+    uglify: {
+      app: {
+        options: {
+          mangle: false
         },
-        karma: {
-            unit: {
-                configFile: 'karma.unit.conf.js'
-            },
-            e2e: {
-                configFile: 'karma.e2e.conf.js'
-            }
+        files: {
+          'tmp/js/scripts.js': 'tmp/js/scripts.js'
         }
-    });
+      }
+    },
+    karma: {
+      unit: {
+        configFile: 'karma.unit.conf.js'
+      },
+      e2e: {
+        configFile: 'karma.e2e.conf.js'
+      }
+    }
+  });
 
-    // Additional task plugins
-    grunt.loadNpmTasks('grunt-contrib');
-    grunt.loadNpmTasks('grunt-conventional-changelog');
-    grunt.loadNpmTasks('grunt-bump');
-    grunt.loadNpmTasks('grunt-html2js');
-    grunt.loadNpmTasks('grunt-htmlrefs');
-    grunt.loadNpmTasks('grunt-lesslint');
-    grunt.loadNpmTasks('grunt-manifest');
-    grunt.loadNpmTasks('grunt-regex-replace');
-    grunt.loadNpmTasks('grunt-karma');
+  // Additional task plugins
+  grunt.loadNpmTasks('grunt-contrib');
+  grunt.loadNpmTasks('grunt-conventional-changelog');
+  grunt.loadNpmTasks('grunt-bump');
+  grunt.loadNpmTasks('grunt-html2js');
+  grunt.loadNpmTasks('grunt-htmlrefs');
+  grunt.loadNpmTasks('grunt-lesslint');
+  grunt.loadNpmTasks('grunt-manifest');
+  grunt.loadNpmTasks('grunt-regex-replace');
+  grunt.loadNpmTasks('grunt-karma');
 
-    grunt.registerTask('test', ['jshint', 'lesslint']);
+  grunt.registerTask('test', ['jshint', 'lesslint']);
 
-    grunt.registerTask('prod', [
+  grunt.registerTask('prod', [
 //    'test',
-        'clean:build',
-        'copy:tmp',
-        'html2js',
-        'concat:app',
-        'regex-replace:strict',
-        'regex-replace:templates',
-        'uglify',
-        'regex-replace:manifest',
-        'concat:components',
-        'less',
-        'concat:css',
-        'htmlrefs',
-        'copy:build',
-        'clean:tmp',
-        'manifest',
-        'changelog'
-    ]);
+    'clean:build',
+    'copy:tmp',
+    'html2js',
+    'concat:app',
+    'regex-replace:strict',
+    'regex-replace:templates',
+    'uglify',
+    'regex-replace:manifest',
+    'concat:components',
+    'less',
+    'concat:css',
+    'htmlrefs',
+    'copy:build',
+    'clean:tmp',
+    'manifest',
+    'changelog'
+  ]);
 
-    grunt.registerTask('dev', [
+  grunt.registerTask('dev', [
 //    'test',
-        'clean:build',
-        'copy:tmp',
-        'html2js',
-        'concat:app',
-        'regex-replace:strict',
-        'regex-replace:templates',
+    'clean:build',
+    'copy:tmp',
+    'html2js',
+    'concat:app',
+    'regex-replace:strict',
+    'regex-replace:templates',
 //        'uglify',
-        'regex-replace:manifest',
-        'concat:components',
-        'less',
-        'concat:css',
-        'htmlrefs',
-        'copy:build',
-        'clean:tmp',
-        'manifest',
-        'changelog'
-    ]);
+    'regex-replace:manifest',
+    'concat:components',
+    'less',
+    'concat:css',
+    'htmlrefs',
+    'copy:build',
+    'clean:tmp',
+    'manifest',
+    'changelog'
+  ]);
 };