You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by pr...@apache.org on 2018/02/23 04:54:41 UTC

[01/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Repository: zeppelin
Updated Branches:
  refs/heads/master f6ef64f84 -> ea2c94474


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/index.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/index.js b/zeppelin-web/src/index.js
index 4c41336..55d6155 100644
--- a/zeppelin-web/src/index.js
+++ b/zeppelin-web/src/index.js
@@ -13,65 +13,65 @@
  */
 
 // import globally uses css here
-import 'github-markdown-css/github-markdown.css'
+import 'github-markdown-css/github-markdown.css';
 
-import './app/app.js'
-import './app/app.controller.js'
-import './app/home/home.controller.js'
-import './app/notebook/notebook.controller.js'
+import './app/app.js';
+import './app/app.controller.js';
+import './app/home/home.controller.js';
+import './app/notebook/notebook.controller.js';
 
-import './app/tabledata/tabledata.js'
-import './app/tabledata/transformation.js'
-import './app/tabledata/pivot.js'
-import './app/tabledata/passthrough.js'
-import './app/tabledata/columnselector.js'
-import './app/tabledata/advanced-transformation.js'
-import './app/visualization/visualization.js'
-import './app/visualization/builtins/visualization-table.js'
-import './app/visualization/builtins/visualization-nvd3chart.js'
-import './app/visualization/builtins/visualization-barchart.js'
-import './app/visualization/builtins/visualization-piechart.js'
-import './app/visualization/builtins/visualization-areachart.js'
-import './app/visualization/builtins/visualization-linechart.js'
-import './app/visualization/builtins/visualization-scatterchart.js'
+import './app/tabledata/tabledata.js';
+import './app/tabledata/transformation.js';
+import './app/tabledata/pivot.js';
+import './app/tabledata/passthrough.js';
+import './app/tabledata/columnselector.js';
+import './app/tabledata/advanced-transformation.js';
+import './app/visualization/visualization.js';
+import './app/visualization/builtins/visualization-table.js';
+import './app/visualization/builtins/visualization-nvd3chart.js';
+import './app/visualization/builtins/visualization-barchart.js';
+import './app/visualization/builtins/visualization-piechart.js';
+import './app/visualization/builtins/visualization-areachart.js';
+import './app/visualization/builtins/visualization-linechart.js';
+import './app/visualization/builtins/visualization-scatterchart.js';
 
-import './app/jobmanager/jobmanager.component.js'
-import './app/interpreter/interpreter.controller.js'
-import './app/interpreter/interpreter.filter.js'
-import './app/interpreter/interpreter-item.directive.js'
-import './app/interpreter/widget/number-widget.directive.js'
-import './app/credential/credential.controller.js'
-import './app/configuration/configuration.controller.js'
-import './app/notebook/revisions-comparator/revisions-comparator.component.js'
-import './app/notebook/paragraph/paragraph.controller.js'
-import './app/notebook/paragraph/clipboard.controller.js'
-import './app/notebook/paragraph/resizable.directive.js'
-import './app/notebook/paragraph/result/result.controller.js'
-import './app/notebook/paragraph/code-editor/code-editor.directive.js'
-import './app/notebook/save-as/save-as.service.js'
-import './app/notebook/save-as/browser-detect.service.js'
-import './app/notebook/elastic-input/elastic-input.controller.js'
-import './app/notebook/dropdown-input/dropdown-input.directive.js'
-import './app/notebook/note-var-share.service.js'
-import './app/notebook-repository/notebook-repository.controller.js'
-import './app/search/result-list.controller.js'
-import './app/search/search.service.js'
-import './app/helium'
-import './app/helium/helium.service.js'
-import './app/notebook/dynamic-forms/dynamic-forms.directive.js'
-import './components/array-ordering/array-ordering.service.js'
-import './components/navbar/navbar.controller.js'
-import './components/navbar/expand-collapse/expand-collapse.directive.js'
-import './components/note-create/note-create.controller.js'
-import './components/note-create/visible.directive.js'
-import './components/note-import/note-import.controller.js'
-import './components/ng-enter/ng-enter.directive.js'
-import './components/ng-escape/ng-escape.directive.js'
-import './components/websocket/websocket-message.service.js'
-import './components/websocket/websocket-event.factory.js'
-import './components/note-list/note-list.factory.js'
-import './components/base-url/base-url.service.js'
-import './components/login/login.controller.js'
-import './components/note-action/note-action.service.js'
-import './components/note-rename/note-rename.controller.js'
-import './components/note-rename/note-rename.service.js'
+import './app/jobmanager/jobmanager.component.js';
+import './app/interpreter/interpreter.controller.js';
+import './app/interpreter/interpreter.filter.js';
+import './app/interpreter/interpreter-item.directive.js';
+import './app/interpreter/widget/number-widget.directive.js';
+import './app/credential/credential.controller.js';
+import './app/configuration/configuration.controller.js';
+import './app/notebook/revisions-comparator/revisions-comparator.component.js';
+import './app/notebook/paragraph/paragraph.controller.js';
+import './app/notebook/paragraph/clipboard.controller.js';
+import './app/notebook/paragraph/resizable.directive.js';
+import './app/notebook/paragraph/result/result.controller.js';
+import './app/notebook/paragraph/code-editor/code-editor.directive.js';
+import './app/notebook/save-as/save-as.service.js';
+import './app/notebook/save-as/browser-detect.service.js';
+import './app/notebook/elastic-input/elastic-input.controller.js';
+import './app/notebook/dropdown-input/dropdown-input.directive.js';
+import './app/notebook/note-var-share.service.js';
+import './app/notebook-repository/notebook-repository.controller.js';
+import './app/search/result-list.controller.js';
+import './app/search/search.service.js';
+import './app/helium';
+import './app/helium/helium.service.js';
+import './app/notebook/dynamic-forms/dynamic-forms.directive.js';
+import './components/array-ordering/array-ordering.service.js';
+import './components/navbar/navbar.controller.js';
+import './components/navbar/expand-collapse/expand-collapse.directive.js';
+import './components/note-create/note-create.controller.js';
+import './components/note-create/visible.directive.js';
+import './components/note-import/note-import.controller.js';
+import './components/ng-enter/ng-enter.directive.js';
+import './components/ng-escape/ng-escape.directive.js';
+import './components/websocket/websocket-message.service.js';
+import './components/websocket/websocket-event.factory.js';
+import './components/note-list/note-list.factory.js';
+import './components/base-url/base-url.service.js';
+import './components/login/login.controller.js';
+import './components/note-action/note-action.service.js';
+import './components/note-rename/note-rename.controller.js';
+import './components/note-rename/note-rename.service.js';


[04/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/advanced-transformation.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/advanced-transformation.js b/zeppelin-web/src/app/tabledata/advanced-transformation.js
index 8650de5..7420bed 100644
--- a/zeppelin-web/src/app/tabledata/advanced-transformation.js
+++ b/zeppelin-web/src/app/tabledata/advanced-transformation.js
@@ -12,7 +12,7 @@
  * limitations under the License.
  */
 
-import Transformation from './transformation'
+import Transformation from './transformation';
 
 import {
   getCurrentChart, getCurrentChartAxis, getCurrentChartParam,
@@ -23,46 +23,46 @@ import {
   removeDuplicatedColumnsInMultiDimensionAxis, applyMaxAxisCount,
   isInputWidget, isOptionWidget, isCheckboxWidget, isTextareaWidget, parseParameter,
   getTransformer,
-} from './advanced-transformation-util'
+} from './advanced-transformation-util';
 
-const SETTING_TEMPLATE = 'app/tabledata/advanced-transformation-setting.html'
+const SETTING_TEMPLATE = 'app/tabledata/advanced-transformation-setting.html';
 
 export default class AdvancedTransformation extends Transformation {
   constructor(config, spec) {
-    super(config)
+    super(config);
 
-    this.columns = [] /** [{ name, index, comment }] */
-    this.props = {}
-    this.spec = spec
+    this.columns = []; /** [{ name, index, comment }] */
+    this.props = {};
+    this.spec = spec;
 
-    initializeConfig(config, spec)
+    initializeConfig(config, spec);
   }
 
   emitConfigChange(conf) {
-    conf.chartChanged = false
-    conf.parameterChanged = false
-    this.emitConfig(conf)
+    conf.chartChanged = false;
+    conf.parameterChanged = false;
+    this.emitConfig(conf);
   }
 
   emitChartChange(conf) {
-    conf.chartChanged = true
-    conf.parameterChanged = false
-    this.emitConfig(conf)
+    conf.chartChanged = true;
+    conf.parameterChanged = false;
+    this.emitConfig(conf);
   }
 
   emitParameterChange(conf) {
-    conf.chartChanged = false
-    conf.parameterChanged = true
-    this.emitConfig(conf)
+    conf.chartChanged = false;
+    conf.parameterChanged = true;
+    this.emitConfig(conf);
   }
 
   getSetting() {
-    const self = this /** for closure */
-    const configInstance = self.config /** for closure */
+    const self = this; /** for closure */
+    const configInstance = self.config; /** for closure */
 
     if (self.spec.initialized) {
-      self.spec.initialized = false
-      self.emitConfig(configInstance)
+      self.spec.initialized = false;
+      self.emitConfig(configInstance);
     }
 
     return {
@@ -71,148 +71,174 @@ export default class AdvancedTransformation extends Transformation {
         config: configInstance,
         columns: self.columns,
         resetAxisConfig: () => {
-          resetAxisConfig(configInstance)
-          self.emitChartChange(configInstance)
+          resetAxisConfig(configInstance);
+          self.emitChartChange(configInstance);
         },
 
         resetParameterConfig: () => {
-          resetParameterConfig(configInstance)
-          self.emitParameterChange(configInstance)
+          resetParameterConfig(configInstance);
+          self.emitParameterChange(configInstance);
         },
 
         toggleColumnPanel: () => {
-          configInstance.panel.columnPanelOpened = !configInstance.panel.columnPanelOpened
-          self.emitConfigChange(configInstance)
+          configInstance.panel.columnPanelOpened = !configInstance.panel.columnPanelOpened;
+          self.emitConfigChange(configInstance);
         },
 
         toggleParameterPanel: () => {
-          configInstance.panel.parameterPanelOpened = !configInstance.panel.parameterPanelOpened
-          self.emitConfigChange(configInstance)
+          configInstance.panel.parameterPanelOpened = !configInstance.panel.parameterPanelOpened;
+          self.emitConfigChange(configInstance);
         },
 
         getAxisAnnotation: (axisSpec) => {
-          let anno = `${axisSpec.name}`
+          let anno = `${axisSpec.name}`;
           if (axisSpec.valueType) {
-            anno = `${anno} (${axisSpec.valueType})`
+            anno = `${anno} (${axisSpec.valueType})`;
           }
 
-          return anno
+          return anno;
         },
 
         getAxisTypeAnnotation: (axisSpec) => {
-          let anno = ''
+          let anno = '';
 
-          let minAxisCount = axisSpec.minAxisCount
-          let maxAxisCount = axisSpec.maxAxisCount
+          let minAxisCount = axisSpec.minAxisCount;
+          let maxAxisCount = axisSpec.maxAxisCount;
 
           if (isSingleDimensionAxis(axisSpec)) {
-            maxAxisCount = 1
+            maxAxisCount = 1;
           }
 
-          let comment = ''
-          if (minAxisCount) { comment = `min: ${minAxisCount}` }
-          if (minAxisCount && maxAxisCount) { comment = `${comment}, ` }
-          if (maxAxisCount) { comment = `${comment}max: ${maxAxisCount}` }
+          let comment = '';
+          if (minAxisCount) {
+            comment = `min: ${minAxisCount}`;
+          }
+          if (minAxisCount && maxAxisCount) {
+            comment = `${comment}, `;
+          }
+          if (maxAxisCount) {
+            comment = `${comment}max: ${maxAxisCount}`;
+          }
 
           if (comment !== '') {
-            anno = `${anno} (${comment})`
+            anno = `${anno} (${comment})`;
           }
 
-          return anno
+          return anno;
         },
 
         getAxisAnnotationColor: (axisSpec) => {
           if (isAggregatorAxis(axisSpec)) {
-            return { 'background-color': '#5782bd' }
+            return {'background-color': '#5782bd'};
           } else if (isGroupAxis(axisSpec)) {
-            return { 'background-color': '#cd5c5c' }
+            return {'background-color': '#cd5c5c'};
           } else if (isKeyAxis(axisSpec)) {
-            return { 'background-color': '#906ebd' }
+            return {'background-color': '#906ebd'};
           } else {
-            return { 'background-color': '#62bda9' }
+            return {'background-color': '#62bda9'};
           }
         },
 
-        useSharedAxis: (chartName) => { return useSharedAxis(configInstance, chartName) },
-        isGroupAxis: (axisSpec) => { return isGroupAxis(axisSpec) },
-        isKeyAxis: (axisSpec) => { return isKeyAxis(axisSpec) },
-        isAggregatorAxis: (axisSpec) => { return isAggregatorAxis(axisSpec) },
-        isSingleDimensionAxis: (axisSpec) => { return isSingleDimensionAxis(axisSpec) },
-        getSingleDimensionAxis: (axisSpec) => { return getCurrentChartAxis(configInstance)[axisSpec.name] },
+        useSharedAxis: (chartName) => {
+          return useSharedAxis(configInstance, chartName);
+        },
+        isGroupAxis: (axisSpec) => {
+          return isGroupAxis(axisSpec);
+        },
+        isKeyAxis: (axisSpec) => {
+          return isKeyAxis(axisSpec);
+        },
+        isAggregatorAxis: (axisSpec) => {
+          return isAggregatorAxis(axisSpec);
+        },
+        isSingleDimensionAxis: (axisSpec) => {
+          return isSingleDimensionAxis(axisSpec);
+        },
+        getSingleDimensionAxis: (axisSpec) => {
+          return getCurrentChartAxis(configInstance)[axisSpec.name];
+        },
 
         chartChanged: (selected) => {
-          configInstance.chart.current = selected
-          self.emitChartChange(configInstance)
+          configInstance.chart.current = selected;
+          self.emitChartChange(configInstance);
         },
 
         axisChanged: function(e, ui, axisSpec) {
-          removeDuplicatedColumnsInMultiDimensionAxis(configInstance, axisSpec)
-          applyMaxAxisCount(configInstance, axisSpec)
+          removeDuplicatedColumnsInMultiDimensionAxis(configInstance, axisSpec);
+          applyMaxAxisCount(configInstance, axisSpec);
 
-          self.emitChartChange(configInstance)
+          self.emitChartChange(configInstance);
         },
 
         aggregatorChanged: (colIndex, axisSpec, aggregator) => {
           if (isSingleDimensionAxis(axisSpec)) {
-            getCurrentChartAxis(configInstance)[axisSpec.name].aggr = aggregator
+            getCurrentChartAxis(configInstance)[axisSpec.name].aggr = aggregator;
           } else {
-            getCurrentChartAxis(configInstance)[axisSpec.name][colIndex].aggr = aggregator
-            removeDuplicatedColumnsInMultiDimensionAxis(configInstance, axisSpec)
+            getCurrentChartAxis(configInstance)[axisSpec.name][colIndex].aggr = aggregator;
+            removeDuplicatedColumnsInMultiDimensionAxis(configInstance, axisSpec);
           }
 
-          self.emitChartChange(configInstance)
+          self.emitChartChange(configInstance);
         },
 
         removeFromAxis: function(colIndex, axisSpec) {
           if (isSingleDimensionAxis(axisSpec)) {
-            getCurrentChartAxis(configInstance)[axisSpec.name] = null
+            getCurrentChartAxis(configInstance)[axisSpec.name] = null;
           } else {
-            getCurrentChartAxis(configInstance)[axisSpec.name].splice(colIndex, 1)
+            getCurrentChartAxis(configInstance)[axisSpec.name].splice(colIndex, 1);
           }
 
-          self.emitChartChange(configInstance)
+          self.emitChartChange(configInstance);
         },
 
-        isInputWidget: function(paramSpec) { return isInputWidget(paramSpec) },
-        isCheckboxWidget: function(paramSpec) { return isCheckboxWidget(paramSpec) },
-        isOptionWidget: function(paramSpec) { return isOptionWidget(paramSpec) },
-        isTextareaWidget: function(paramSpec) { return isTextareaWidget(paramSpec) },
+        isInputWidget: function(paramSpec) {
+          return isInputWidget(paramSpec);
+        },
+        isCheckboxWidget: function(paramSpec) {
+          return isCheckboxWidget(paramSpec);
+        },
+        isOptionWidget: function(paramSpec) {
+          return isOptionWidget(paramSpec);
+        },
+        isTextareaWidget: function(paramSpec) {
+          return isTextareaWidget(paramSpec);
+        },
 
         parameterChanged: (paramSpec) => {
-          configInstance.chartChanged = false
-          configInstance.parameterChanged = true
-          self.emitParameterChange(configInstance)
+          configInstance.chartChanged = false;
+          configInstance.parameterChanged = true;
+          self.emitParameterChange(configInstance);
         },
 
         parameterOnKeyDown: function(event, paramSpec) {
-          const code = event.keyCode || event.which
+          const code = event.keyCode || event.which;
           if (code === 13 && isInputWidget(paramSpec)) {
-            self.emitParameterChange(configInstance)
+            self.emitParameterChange(configInstance);
           } else if (code === 13 && event.shiftKey && isTextareaWidget(paramSpec)) {
-            self.emitParameterChange(configInstance)
+            self.emitParameterChange(configInstance);
           }
 
-          event.stopPropagation() /** avoid to conflict with paragraph shortcuts */
+          event.stopPropagation(); /** avoid to conflict with paragraph shortcuts */
         },
 
-      }
-    }
+      },
+    };
   }
 
   transform(tableData) {
-    this.columns = tableData.columns /** used in `getSetting` */
+    this.columns = tableData.columns; /** used in `getSetting` */
     /** initialize in `transform` instead of `getSetting` because this method is called before */
-    serializeSharedAxes(this.config)
+    serializeSharedAxes(this.config);
 
-    const conf = this.config
-    const chart = getCurrentChart(conf)
-    const axis = getCurrentChartAxis(conf)
-    const axisSpecs = getCurrentChartAxisSpecs(conf)
-    const param = getCurrentChartParam(conf)
-    const paramSpecs = getCurrentChartParamSpecs(conf)
-    const parsedParam = parseParameter(paramSpecs, param)
+    const conf = this.config;
+    const chart = getCurrentChart(conf);
+    const axis = getCurrentChartAxis(conf);
+    const axisSpecs = getCurrentChartAxisSpecs(conf);
+    const param = getCurrentChartParam(conf);
+    const paramSpecs = getCurrentChartParamSpecs(conf);
+    const parsedParam = parseParameter(paramSpecs, param);
 
-    let { transformer, column, } = getTransformer(conf, tableData.rows, axisSpecs, axis)
+    let {transformer, column} = getTransformer(conf, tableData.rows, axisSpecs, axis);
 
     return {
       chartChanged: conf.chartChanged,
@@ -224,6 +250,6 @@ export default class AdvancedTransformation extends Transformation {
       column: column,
 
       transformer: transformer,
-    }
+    };
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/columnselector.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/columnselector.js b/zeppelin-web/src/app/tabledata/columnselector.js
index 9fcf2f1..1998f06 100644
--- a/zeppelin-web/src/app/tabledata/columnselector.js
+++ b/zeppelin-web/src/app/tabledata/columnselector.js
@@ -12,7 +12,7 @@
  * limitations under the License.
  */
 
-import Transformation from './transformation'
+import Transformation from './transformation';
 
 /**
  * select columns
@@ -26,55 +26,55 @@ import Transformation from './transformation'
  *   ]
  */
 export default class ColumnselectorTransformation extends Transformation {
-  constructor (config, columnSelectorProp) {
-    super(config)
-    this.props = columnSelectorProp
+  constructor(config, columnSelectorProp) {
+    super(config);
+    this.props = columnSelectorProp;
   }
 
-  getSetting () {
-    let self = this
-    let configObj = self.config
+  getSetting() {
+    let self = this;
+    let configObj = self.config;
     return {
       template: 'app/tabledata/columnselector_settings.html',
       scope: {
         config: self.config,
         props: self.props,
         tableDataColumns: self.tableDataColumns,
-        save: function () {
-          self.emitConfig(configObj)
+        save: function() {
+          self.emitConfig(configObj);
         },
-        remove: function (selectorName) {
-          configObj[selectorName] = null
-          self.emitConfig(configObj)
-        }
-      }
-    }
+        remove: function(selectorName) {
+          configObj[selectorName] = null;
+          self.emitConfig(configObj);
+        },
+      },
+    };
   }
 
   /**
    * Method will be invoked when tableData or config changes
    */
-  transform (tableData) {
-    this.tableDataColumns = tableData.columns
-    this.removeUnknown()
-    return tableData
+  transform(tableData) {
+    this.tableDataColumns = tableData.columns;
+    this.removeUnknown();
+    return tableData;
   }
 
-  removeUnknown () {
-    let fields = this.config
+  removeUnknown() {
+    let fields = this.config;
     for (let f in fields) {
       if (fields[f]) {
-        let found = false
+        let found = false;
         for (let i = 0; i < this.tableDataColumns.length; i++) {
-          let a = fields[f]
-          let b = this.tableDataColumns[i]
+          let a = fields[f];
+          let b = this.tableDataColumns[i];
           if (a.index === b.index && a.name === b.name) {
-            found = true
-            break
+            found = true;
+            break;
           }
         }
         if (!found && (fields[f] instanceof Object) && !(fields[f] instanceof Array)) {
-          fields[f] = null
+          fields[f] = null;
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/dataset.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/dataset.js b/zeppelin-web/src/app/tabledata/dataset.js
index 762e300..ba3ee7d 100644
--- a/zeppelin-web/src/app/tabledata/dataset.js
+++ b/zeppelin-web/src/app/tabledata/dataset.js
@@ -30,7 +30,7 @@ class Dataset {
  */
 const DatasetType = Object.freeze({
   NETWORK: 'NETWORK',
-  TABLE: 'TABLE'
-})
+  TABLE: 'TABLE',
+});
 
-export {Dataset, DatasetType}
+export {Dataset, DatasetType};

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/datasetfactory.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/datasetfactory.js b/zeppelin-web/src/app/tabledata/datasetfactory.js
index f2f69c9..6d19a98 100644
--- a/zeppelin-web/src/app/tabledata/datasetfactory.js
+++ b/zeppelin-web/src/app/tabledata/datasetfactory.js
@@ -12,9 +12,9 @@
  * limitations under the License.
  */
 
-import TableData from './tabledata'
-import NetworkData from './networkdata'
-import {DatasetType} from './dataset'
+import TableData from './tabledata';
+import NetworkData from './networkdata';
+import {DatasetType} from './dataset';
 
 /**
  * Create table data object from paragraph table type result
@@ -23,11 +23,11 @@ export default class DatasetFactory {
   createDataset(datasetType) {
     switch (datasetType) {
       case DatasetType.NETWORK:
-        return new NetworkData()
+        return new NetworkData();
       case DatasetType.TABLE:
-        return new TableData()
+        return new TableData();
       default:
-        throw new Error('Dataset type not found')
+        throw new Error('Dataset type not found');
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/datasetfactory.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/datasetfactory.test.js b/zeppelin-web/src/app/tabledata/datasetfactory.test.js
index 0beb137..807456a 100644
--- a/zeppelin-web/src/app/tabledata/datasetfactory.test.js
+++ b/zeppelin-web/src/app/tabledata/datasetfactory.test.js
@@ -12,35 +12,37 @@
  * limitations under the License.
  */
 
-import NetworkData from './networkdata.js'
-import TableData from './tabledata.js'
-import {DatasetType} from './dataset.js'
-import DatasetFactory from './datasetfactory.js'
+import NetworkData from './networkdata.js';
+import TableData from './tabledata.js';
+import {DatasetType} from './dataset.js';
+import DatasetFactory from './datasetfactory.js';
 
 describe('DatasetFactory build', function() {
-  let df
+  let df;
 
   beforeAll(function() {
-    df = new DatasetFactory()
-  })
+    df = new DatasetFactory();
+  });
 
   it('should create a TableData instance', function() {
-    let td = df.createDataset(DatasetType.TABLE)
-    expect(td instanceof TableData).toBeTruthy()
-    expect(td.columns.length).toBe(0)
-    expect(td.rows.length).toBe(0)
-  })
+    let td = df.createDataset(DatasetType.TABLE);
+    expect(td instanceof TableData).toBeTruthy();
+    expect(td.columns.length).toBe(0);
+    expect(td.rows.length).toBe(0);
+  });
 
   it('should create a NetworkData instance', function() {
-    let nd = df.createDataset(DatasetType.NETWORK)
-    expect(nd instanceof NetworkData).toBeTruthy()
-    expect(nd.columns.length).toBe(0)
-    expect(nd.rows.length).toBe(0)
-    expect(nd.graph).toEqual({})
-  })
+    let nd = df.createDataset(DatasetType.NETWORK);
+    expect(nd instanceof NetworkData).toBeTruthy();
+    expect(nd.columns.length).toBe(0);
+    expect(nd.rows.length).toBe(0);
+    expect(nd.graph).toEqual({});
+  });
 
   it('should thrown an Error', function() {
-    expect(function() { df.createDataset('text') })
-        .toThrow(new Error('Dataset type not found'))
-  })
-})
+    expect(function() {
+      df.createDataset('text');
+    })
+    .toThrow(new Error('Dataset type not found'));
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/network.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/network.js b/zeppelin-web/src/app/tabledata/network.js
index 403ea5b..3566722 100644
--- a/zeppelin-web/src/app/tabledata/network.js
+++ b/zeppelin-web/src/app/tabledata/network.js
@@ -12,37 +12,37 @@
  * limitations under the License.
  */
 
-import Transformation from './transformation'
+import Transformation from './transformation';
 
 /**
  * trasformation settings for network visualization
  */
 export default class NetworkTransformation extends Transformation {
   getSetting() {
-    let self = this
-    let configObj = self.config
+    let self = this;
+    let configObj = self.config;
     return {
       template: 'app/tabledata/network_settings.html',
       scope: {
         config: configObj,
         isEmptyObject: function(obj) {
-          obj = obj || {}
-          return angular.equals(obj, {})
+          obj = obj || {};
+          return angular.equals(obj, {});
         },
         setNetworkLabel: function(label, value) {
-          configObj.properties[label].selected = value
+          configObj.properties[label].selected = value;
         },
         saveConfig: function() {
-          self.emitConfig(configObj)
-        }
-      }
-    }
+          self.emitConfig(configObj);
+        },
+      },
+    };
   }
 
   setConfig(config) {
   }
 
   transform(networkData) {
-    return networkData
+    return networkData;
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/networkdata.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/networkdata.js b/zeppelin-web/src/app/tabledata/networkdata.js
index 70cd86b..368254d 100644
--- a/zeppelin-web/src/app/tabledata/networkdata.js
+++ b/zeppelin-web/src/app/tabledata/networkdata.js
@@ -12,74 +12,74 @@
  * limitations under the License.
  */
 
-import TableData from './tabledata'
-import {DatasetType} from './dataset'
+import TableData from './tabledata';
+import {DatasetType} from './dataset';
 
 /**
  * Create network data object from paragraph graph type result
  */
 export default class NetworkData extends TableData {
   constructor(graph) {
-    super()
-    this.graph = graph || {}
+    super();
+    this.graph = graph || {};
     if (this.graph.nodes) {
-      this.loadParagraphResult({msg: JSON.stringify(graph), type: DatasetType.NETWORK})
+      this.loadParagraphResult({msg: JSON.stringify(graph), type: DatasetType.NETWORK});
     }
   }
 
   loadParagraphResult(paragraphResult) {
     if (!paragraphResult || paragraphResult.type !== DatasetType.NETWORK) {
-      console.log('Can not load paragraph result')
-      return
+      console.log('Can not load paragraph result');
+      return;
     }
 
-    this.graph = JSON.parse(paragraphResult.msg.trim() || '{}')
+    this.graph = JSON.parse(paragraphResult.msg.trim() || '{}');
 
     if (!this.graph.nodes) {
-      console.log('Graph result is empty')
-      return
+      console.log('Graph result is empty');
+      return;
     }
 
-    this.graph.edges = this.graph.edges || []
+    this.graph.edges = this.graph.edges || [];
     this.networkNodes = angular.equals({}, this.graph.labels || {})
-            ? null : {count: this.graph.nodes.length, labels: this.graph.labels}
+      ? null : {count: this.graph.nodes.length, labels: this.graph.labels};
     this.networkRelationships = angular.equals([], this.graph.types || [])
-            ? null : {count: this.graph.edges.length, types: this.graph.types}
+      ? null : {count: this.graph.edges.length, types: this.graph.types};
 
-    const rows = []
-    const comment = ''
-    const entities = this.graph.nodes.concat(this.graph.edges)
-    const baseColumnNames = [{name: 'id', index: 0, aggr: 'sum'}]
-    const containsLabelField = _.find(entities, (entity) => 'label' in entity) != null
+    const rows = [];
+    const comment = '';
+    const entities = this.graph.nodes.concat(this.graph.edges);
+    const baseColumnNames = [{name: 'id', index: 0, aggr: 'sum'}];
+    const containsLabelField = _.find(entities, (entity) => 'label' in entity) !== undefined;
     if (this.graph.labels || this.graph.types || containsLabelField) {
-      baseColumnNames.push({name: 'label', index: 1, aggr: 'sum'})
+      baseColumnNames.push({name: 'label', index: 1, aggr: 'sum'});
     }
     const internalFieldsToJump = ['count', 'size', 'totalCount',
-      'data', 'x', 'y', 'labels', 'source', 'target']
-    const baseCols = _.map(baseColumnNames, (col) => col.name)
-    let keys = _.map(entities, (elem) => Object.keys(elem.data || {}))
-    keys = _.flatten(keys)
-    keys = _.uniq(keys).filter((key) => baseCols.indexOf(key) === -1)
+      'data', 'x', 'y', 'labels', 'source', 'target'];
+    const baseCols = _.map(baseColumnNames, (col) => col.name);
+    let keys = _.map(entities, (elem) => Object.keys(elem.data || {}));
+    keys = _.flatten(keys);
+    keys = _.uniq(keys).filter((key) => baseCols.indexOf(key) === -1);
     const entityColumnNames = _.map(keys, (elem, i) => {
-      return {name: elem, index: i + baseColumnNames.length, aggr: 'sum'}
-    })
-    const columnNames = baseColumnNames.concat(entityColumnNames)
+      return {name: elem, index: i + baseColumnNames.length, aggr: 'sum'};
+    });
+    const columnNames = baseColumnNames.concat(entityColumnNames);
     for (let i = 0; i < entities.length; i++) {
-      const entity = entities[i]
-      const col = []
-      entity.data = entity.data || {}
+      const entity = entities[i];
+      const col = [];
+      entity.data = entity.data || {};
       for (let j = 0; j < columnNames.length; j++) {
-        const name = columnNames[j].name
+        const name = columnNames[j].name;
         const value = name in entity && internalFieldsToJump.indexOf(name) === -1
-            ? entity[name] : entity.data[name]
-        const parsedValue = value === null || value === undefined ? '' : value
-        col.push(parsedValue)
+          ? entity[name] : entity.data[name];
+        const parsedValue = value === null || value === undefined ? '' : value;
+        col.push(parsedValue);
       }
-      rows.push(col)
+      rows.push(col);
     }
 
-    this.comment = comment
-    this.columns = columnNames
-    this.rows = rows
+    this.comment = comment;
+    this.columns = columnNames;
+    this.rows = rows;
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/networkdata.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/networkdata.test.js b/zeppelin-web/src/app/tabledata/networkdata.test.js
index 739ac19..cd3a12f 100644
--- a/zeppelin-web/src/app/tabledata/networkdata.test.js
+++ b/zeppelin-web/src/app/tabledata/networkdata.test.js
@@ -12,56 +12,56 @@
  * limitations under the License.
  */
 
-import NetworkData from './networkdata.js'
-import {DatasetType} from './dataset.js'
+import NetworkData from './networkdata.js';
+import {DatasetType} from './dataset.js';
 
 describe('NetworkData build', function() {
-  let nd
+  let nd;
 
   beforeEach(function() {
-    nd = new NetworkData()
-  })
+    nd = new NetworkData();
+  });
 
   it('should initialize the default value', function() {
-    expect(nd.columns.length).toBe(0)
-    expect(nd.rows.length).toBe(0)
-    expect(nd.graph).toEqual({})
-  })
+    expect(nd.columns.length).toBe(0);
+    expect(nd.rows.length).toBe(0);
+    expect(nd.graph).toEqual({});
+  });
 
   it('should able to create NetowkData from paragraph result', function() {
-    let jsonExpected = {nodes: [{id: 1}, {id: 2}], edges: [{source: 2, target: 1, id: 1}]}
+    let jsonExpected = {nodes: [{id: 1}, {id: 2}], edges: [{source: 2, target: 1, id: 1}]};
     nd.loadParagraphResult({
       type: DatasetType.NETWORK,
-      msg: JSON.stringify(jsonExpected)
-    })
+      msg: JSON.stringify(jsonExpected),
+    });
 
-    expect(nd.columns.length).toBe(1)
-    expect(nd.rows.length).toBe(3)
-    expect(nd.graph.nodes[0].id).toBe(jsonExpected.nodes[0].id)
-    expect(nd.graph.nodes[1].id).toBe(jsonExpected.nodes[1].id)
-    expect(nd.graph.edges[0].id).toBe(jsonExpected.edges[0].id)
-    expect(nd.graph.edges[0].source).toBe(jsonExpected.edges[0].source)
-    expect(nd.graph.edges[0].target).toBe(jsonExpected.edges[0].target)
-  })
+    expect(nd.columns.length).toBe(1);
+    expect(nd.rows.length).toBe(3);
+    expect(nd.graph.nodes[0].id).toBe(jsonExpected.nodes[0].id);
+    expect(nd.graph.nodes[1].id).toBe(jsonExpected.nodes[1].id);
+    expect(nd.graph.edges[0].id).toBe(jsonExpected.edges[0].id);
+    expect(nd.graph.edges[0].source).toBe(jsonExpected.edges[0].source);
+    expect(nd.graph.edges[0].target).toBe(jsonExpected.edges[0].target);
+  });
 
   it('should able to show data fields source and target', function() {
     let jsonExpected = {nodes: [{id: 1, data: {source: 'Source'}}, {id: 2, data: {target: 'Target'}}],
-      edges: [{source: 2, target: 1, id: 1, data: {source: 'Source Edge Data', target: 'Target Edge Data'}}]}
+      edges: [{source: 2, target: 1, id: 1, data: {source: 'Source Edge Data', target: 'Target Edge Data'}}]};
     nd.loadParagraphResult({
       type: DatasetType.NETWORK,
-      msg: JSON.stringify(jsonExpected)
-    })
+      msg: JSON.stringify(jsonExpected),
+    });
 
-    expect(nd.columns.length).toBe(3)
-    expect(nd.rows.length).toBe(3)
-    expect(nd.graph.nodes[0].id).toBe(jsonExpected.nodes[0].id)
-    expect(nd.graph.nodes[1].id).toBe(jsonExpected.nodes[1].id)
-    expect(nd.graph.edges[0].id).toBe(jsonExpected.edges[0].id)
-    expect(nd.graph.edges[0].source).toBe(jsonExpected.edges[0].source)
-    expect(nd.graph.edges[0].target).toBe(jsonExpected.edges[0].target)
-    expect(nd.graph.nodes[0].data.source).toBe(jsonExpected.nodes[0].data.source)
-    expect(nd.graph.nodes[1].data.target).toBe(jsonExpected.nodes[1].data.target)
-    expect(nd.graph.edges[0].data.source).toBe(jsonExpected.edges[0].data.source)
-    expect(nd.graph.edges[0].data.target).toBe(jsonExpected.edges[0].data.target)
-  })
-})
+    expect(nd.columns.length).toBe(3);
+    expect(nd.rows.length).toBe(3);
+    expect(nd.graph.nodes[0].id).toBe(jsonExpected.nodes[0].id);
+    expect(nd.graph.nodes[1].id).toBe(jsonExpected.nodes[1].id);
+    expect(nd.graph.edges[0].id).toBe(jsonExpected.edges[0].id);
+    expect(nd.graph.edges[0].source).toBe(jsonExpected.edges[0].source);
+    expect(nd.graph.edges[0].target).toBe(jsonExpected.edges[0].target);
+    expect(nd.graph.nodes[0].data.source).toBe(jsonExpected.nodes[0].data.source);
+    expect(nd.graph.nodes[1].data.target).toBe(jsonExpected.nodes[1].data.target);
+    expect(nd.graph.edges[0].data.source).toBe(jsonExpected.edges[0].data.source);
+    expect(nd.graph.edges[0].data.target).toBe(jsonExpected.edges[0].data.target);
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/passthrough.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/passthrough.js b/zeppelin-web/src/app/tabledata/passthrough.js
index e376c43..772b7be 100644
--- a/zeppelin-web/src/app/tabledata/passthrough.js
+++ b/zeppelin-web/src/app/tabledata/passthrough.js
@@ -12,21 +12,21 @@
  * limitations under the License.
  */
 
-import Transformation from './transformation'
+import Transformation from './transformation';
 
 /**
  * passthough the data
  */
 export default class PassthroughTransformation extends Transformation {
   // eslint-disable-next-line no-useless-constructor
-  constructor (config) {
-    super(config)
+  constructor(config) {
+    super(config);
   }
 
   /**
    * Method will be invoked when tableData or config changes
    */
-  transform (tableData) {
-    return tableData
+  transform(tableData) {
+    return tableData;
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/pivot.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/pivot.js b/zeppelin-web/src/app/tabledata/pivot.js
index da29900..2baa6b5 100644
--- a/zeppelin-web/src/app/tabledata/pivot.js
+++ b/zeppelin-web/src/app/tabledata/pivot.js
@@ -12,192 +12,192 @@
  * limitations under the License.
  */
 
-import Transformation from './transformation'
+import Transformation from './transformation';
 
 /**
  * pivot table data and return d3 chart data
  */
 export default class PivotTransformation extends Transformation {
   // eslint-disable-next-line no-useless-constructor
-  constructor (config) {
-    super(config)
+  constructor(config) {
+    super(config);
   }
 
-  getSetting () {
-    let self = this
+  getSetting() {
+    let self = this;
 
-    let configObj = self.config
-    console.log('getSetting', configObj)
+    let configObj = self.config;
+    console.log('getSetting', configObj);
     return {
       template: 'app/tabledata/pivot_settings.html',
       scope: {
         config: configObj.common.pivot,
         tableDataColumns: self.tableDataColumns,
-        save: function () {
-          self.emitConfig(configObj)
+        save: function() {
+          self.emitConfig(configObj);
         },
-        removeKey: function (idx) {
-          configObj.common.pivot.keys.splice(idx, 1)
-          self.emitConfig(configObj)
+        removeKey: function(idx) {
+          configObj.common.pivot.keys.splice(idx, 1);
+          self.emitConfig(configObj);
         },
-        removeGroup: function (idx) {
-          configObj.common.pivot.groups.splice(idx, 1)
-          self.emitConfig(configObj)
+        removeGroup: function(idx) {
+          configObj.common.pivot.groups.splice(idx, 1);
+          self.emitConfig(configObj);
         },
-        removeValue: function (idx) {
-          configObj.common.pivot.values.splice(idx, 1)
-          self.emitConfig(configObj)
+        removeValue: function(idx) {
+          configObj.common.pivot.values.splice(idx, 1);
+          self.emitConfig(configObj);
         },
-        setValueAggr: function (idx, aggr) {
-          configObj.common.pivot.values[idx].aggr = aggr
-          self.emitConfig(configObj)
-        }
-      }
-    }
+        setValueAggr: function(idx, aggr) {
+          configObj.common.pivot.values[idx].aggr = aggr;
+          self.emitConfig(configObj);
+        },
+      },
+    };
   }
 
   /**
    * Method will be invoked when tableData or config changes
    */
-  transform (tableData) {
-    this.tableDataColumns = tableData.columns
-    this.config.common = this.config.common || {}
-    this.config.common.pivot = this.config.common.pivot || {}
-    let config = this.config.common.pivot
-    let firstTime = (!config.keys && !config.groups && !config.values)
+  transform(tableData) {
+    this.tableDataColumns = tableData.columns;
+    this.config.common = this.config.common || {};
+    this.config.common.pivot = this.config.common.pivot || {};
+    let config = this.config.common.pivot;
+    let firstTime = (!config.keys && !config.groups && !config.values);
 
-    config.keys = config.keys || []
-    config.groups = config.groups || []
-    config.values = config.values || []
+    config.keys = config.keys || [];
+    config.groups = config.groups || [];
+    config.values = config.values || [];
 
-    this.removeUnknown()
+    this.removeUnknown();
     if (firstTime) {
-      this.selectDefault()
+      this.selectDefault();
     }
     return this.pivot(
       tableData,
       config.keys,
       config.groups,
-      config.values)
+      config.values);
   }
 
-  removeUnknown () {
-    let config = this.config.common.pivot
-    let tableDataColumns = this.tableDataColumns
-    let unique = function (list) {
+  removeUnknown() {
+    let config = this.config.common.pivot;
+    let tableDataColumns = this.tableDataColumns;
+    let unique = function(list) {
       for (let i = 0; i < list.length; i++) {
         for (let j = i + 1; j < list.length; j++) {
           if (angular.equals(list[i], list[j])) {
-            list.splice(j, 1)
-            j--
+            list.splice(j, 1);
+            j--;
           }
         }
       }
-    }
+    };
 
-    let removeUnknown = function (list) {
+    let removeUnknown = function(list) {
       for (let i = 0; i < list.length; i++) {
         // remove non existing column
-        let found = false
+        let found = false;
         for (let j = 0; j < tableDataColumns.length; j++) {
-          let a = list[i]
-          let b = tableDataColumns[j]
+          let a = list[i];
+          let b = tableDataColumns[j];
           if (a.index === b.index && a.name === b.name) {
-            found = true
-            break
+            found = true;
+            break;
           }
         }
         if (!found) {
-          list.splice(i, 1)
+          list.splice(i, 1);
         }
       }
-    }
+    };
 
-    unique(config.keys)
-    removeUnknown(config.keys)
-    unique(config.groups)
-    removeUnknown(config.groups)
-    removeUnknown(config.values)
+    unique(config.keys);
+    removeUnknown(config.keys);
+    unique(config.groups);
+    removeUnknown(config.groups);
+    removeUnknown(config.values);
   }
 
-  selectDefault () {
-    let config = this.config.common.pivot
+  selectDefault() {
+    let config = this.config.common.pivot;
     if (config.keys.length === 0 &&
         config.groups.length === 0 &&
         config.values.length === 0) {
       if (config.keys.length === 0 && this.tableDataColumns.length > 0) {
-        config.keys.push(this.tableDataColumns[0])
+        config.keys.push(this.tableDataColumns[0]);
       }
 
       if (config.values.length === 0 && this.tableDataColumns.length > 1) {
-        config.values.push(this.tableDataColumns[1])
+        config.values.push(this.tableDataColumns[1]);
       }
     }
   }
 
-  pivot (data, keys, groups, values) {
+  pivot(data, keys, groups, values) {
     let aggrFunc = {
-      sum: function (a, b) {
-        let varA = (a !== undefined) ? (isNaN(a) ? 0 : parseFloat(a)) : 0
-        let varB = (b !== undefined) ? (isNaN(b) ? 0 : parseFloat(b)) : 0
-        return varA + varB
+      sum: function(a, b) {
+        let varA = (a !== undefined) ? (isNaN(a) ? 0 : parseFloat(a)) : 0;
+        let varB = (b !== undefined) ? (isNaN(b) ? 0 : parseFloat(b)) : 0;
+        return varA + varB;
       },
-      count: function (a, b) {
-        let varA = (a !== undefined) ? parseInt(a) : 0
-        let varB = (b !== undefined) ? 1 : 0
-        return varA + varB
+      count: function(a, b) {
+        let varA = (a !== undefined) ? parseInt(a) : 0;
+        let varB = (b !== undefined) ? 1 : 0;
+        return varA + varB;
       },
-      min: function (a, b) {
-        let aIsValid = isValidNumber(a)
-        let bIsValid = isValidNumber(b)
+      min: function(a, b) {
+        let aIsValid = isValidNumber(a);
+        let bIsValid = isValidNumber(b);
         if (!aIsValid) {
-          return parseFloat(b)
+          return parseFloat(b);
         } else if (!bIsValid) {
-          return parseFloat(a)
+          return parseFloat(a);
         } else {
-          return Math.min(parseFloat(a), parseFloat(b))
+          return Math.min(parseFloat(a), parseFloat(b));
         }
       },
-      max: function (a, b) {
-        let aIsValid = isValidNumber(a)
-        let bIsValid = isValidNumber(b)
+      max: function(a, b) {
+        let aIsValid = isValidNumber(a);
+        let bIsValid = isValidNumber(b);
         if (!aIsValid) {
-          return parseFloat(b)
+          return parseFloat(b);
         } else if (!bIsValid) {
-          return parseFloat(a)
+          return parseFloat(a);
         } else {
-          return Math.max(parseFloat(a), parseFloat(b))
+          return Math.max(parseFloat(a), parseFloat(b));
         }
       },
-      avg: function (a, b, c) {
-        let varA = (a !== undefined) ? (isNaN(a) ? 0 : parseFloat(a)) : 0
-        let varB = (b !== undefined) ? (isNaN(b) ? 0 : parseFloat(b)) : 0
-        return varA + varB
-      }
-    }
+      avg: function(a, b, c) {
+        let varA = (a !== undefined) ? (isNaN(a) ? 0 : parseFloat(a)) : 0;
+        let varB = (b !== undefined) ? (isNaN(b) ? 0 : parseFloat(b)) : 0;
+        return varA + varB;
+      },
+    };
 
     let isValidNumber = function(num) {
-      return num !== undefined && !isNaN(num)
-    }
+      return num !== undefined && !isNaN(num);
+    };
 
     let aggrFuncDiv = {
       sum: false,
       count: false,
       min: false,
       max: false,
-      avg: true
-    }
+      avg: true,
+    };
 
-    let schema = {}
-    let rows = {}
+    let schema = {};
+    let rows = {};
 
     for (let i = 0; i < data.rows.length; i++) {
-      let row = data.rows[i]
-      let s = schema
-      let p = rows
+      let row = data.rows[i];
+      let s = schema;
+      let p = rows;
 
       for (let k = 0; k < keys.length; k++) {
-        let key = keys[k]
+        let key = keys[k];
 
         // add key to schema
         if (!s[key.name]) {
@@ -205,22 +205,22 @@ export default class PivotTransformation extends Transformation {
             order: k,
             index: key.index,
             type: 'key',
-            children: {}
-          }
+            children: {},
+          };
         }
-        s = s[key.name].children
+        s = s[key.name].children;
 
         // add key to row
-        let keyKey = row[key.index]
+        let keyKey = row[key.index];
         if (!p[keyKey]) {
-          p[keyKey] = {}
+          p[keyKey] = {};
         }
-        p = p[keyKey]
+        p = p[keyKey];
       }
 
       for (let g = 0; g < groups.length; g++) {
-        let group = groups[g]
-        let groupKey = row[group.index]
+        let group = groups[g];
+        let groupKey = row[group.index];
 
         // add group to schema
         if (!s[groupKey]) {
@@ -228,42 +228,42 @@ export default class PivotTransformation extends Transformation {
             order: g,
             index: group.index,
             type: 'group',
-            children: {}
-          }
+            children: {},
+          };
         }
-        s = s[groupKey].children
+        s = s[groupKey].children;
 
         // add key to row
         if (!p[groupKey]) {
-          p[groupKey] = {}
+          p[groupKey] = {};
         }
-        p = p[groupKey]
+        p = p[groupKey];
       }
 
       for (let v = 0; v < values.length; v++) {
-        let value = values[v]
-        let valueKey = value.name + '(' + value.aggr + ')'
+        let value = values[v];
+        let valueKey = value.name + '(' + value.aggr + ')';
 
         // add value to schema
         if (!s[valueKey]) {
           s[valueKey] = {
             type: 'value',
             order: v,
-            index: value.index
-          }
+            index: value.index,
+          };
         }
 
         // add value to row
         if (!p[valueKey]) {
           p[valueKey] = {
             value: (value.aggr !== 'count') ? row[value.index] : 1,
-            count: 1
-          }
+            count: 1,
+          };
         } else {
           p[valueKey] = {
             value: aggrFunc[value.aggr](p[valueKey].value, row[value.index], p[valueKey].count + 1),
-            count: (aggrFuncDiv[value.aggr]) ? p[valueKey].count + 1 : p[valueKey].count
-          }
+            count: (aggrFuncDiv[value.aggr]) ? p[valueKey].count + 1 : p[valueKey].count,
+          };
         }
       }
     }
@@ -274,7 +274,7 @@ export default class PivotTransformation extends Transformation {
       groups: groups,
       values: values,
       schema: schema,
-      rows: rows
-    }
+      rows: rows,
+    };
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/tabledata.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/tabledata.js b/zeppelin-web/src/app/tabledata/tabledata.js
index 3fe01b7..745ab17 100644
--- a/zeppelin-web/src/app/tabledata/tabledata.js
+++ b/zeppelin-web/src/app/tabledata/tabledata.js
@@ -11,65 +11,65 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import {Dataset, DatasetType} from './dataset'
+import {Dataset, DatasetType} from './dataset';
 
 /**
  * Create table data object from paragraph table type result
  */
 export default class TableData extends Dataset {
-  constructor (columns, rows, comment) {
-    super()
-    this.columns = columns || []
-    this.rows = rows || []
-    this.comment = comment || ''
+  constructor(columns, rows, comment) {
+    super();
+    this.columns = columns || [];
+    this.rows = rows || [];
+    this.comment = comment || '';
   }
 
-  loadParagraphResult (paragraphResult) {
+  loadParagraphResult(paragraphResult) {
     if (!paragraphResult || paragraphResult.type !== DatasetType.TABLE) {
-      console.log('Can not load paragraph result')
-      return
+      console.log('Can not load paragraph result');
+      return;
     }
 
-    let columnNames = []
-    let rows = []
-    let array = []
-    let textRows = paragraphResult.msg.split('\n')
-    let comment = ''
-    let commentRow = false
+    let columnNames = [];
+    let rows = [];
+    let array = [];
+    let textRows = paragraphResult.msg.split('\n');
+    let comment = '';
+    let commentRow = false;
 
     for (let i = 0; i < textRows.length; i++) {
-      let textRow = textRows[i]
+      let textRow = textRows[i];
 
       if (commentRow) {
-        comment += textRow
-        continue
+        comment += textRow;
+        continue;
       }
 
       if (textRow === '' || textRow === '<!--TABLE_COMMENT-->') {
         if (rows.length > 0) {
-          commentRow = true
+          commentRow = true;
         }
-        continue
+        continue;
       }
-      let textCols = textRow.split('\t')
-      let cols = []
-      let cols2 = []
+      let textCols = textRow.split('\t');
+      let cols = [];
+      let cols2 = [];
       for (let j = 0; j < textCols.length; j++) {
-        let col = textCols[j]
+        let col = textCols[j];
         if (i === 0) {
-          columnNames.push({name: col, index: j, aggr: 'sum'})
+          columnNames.push({name: col, index: j, aggr: 'sum'});
         } else {
-          cols.push(col)
-          cols2.push({key: (columnNames[i]) ? columnNames[i].name : undefined, value: col})
+          cols.push(col);
+          cols2.push({key: (columnNames[i]) ? columnNames[i].name : undefined, value: col});
         }
       }
       if (i !== 0) {
-        rows.push(cols)
-        array.push(cols2)
+        rows.push(cols);
+        array.push(cols2);
       }
     }
-    this.comment = comment
-    this.columns = columnNames
-    this.rows = rows
+    this.comment = comment;
+    this.columns = columnNames;
+    this.rows = rows;
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/tabledata.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/tabledata.test.js b/zeppelin-web/src/app/tabledata/tabledata.test.js
index e24b073..931cc2d 100644
--- a/zeppelin-web/src/app/tabledata/tabledata.test.js
+++ b/zeppelin-web/src/app/tabledata/tabledata.test.js
@@ -12,42 +12,42 @@
  * limitations under the License.
  */
 
-import TableData from './tabledata.js'
-import PivotTransformation from './pivot.js'
+import TableData from './tabledata.js';
+import PivotTransformation from './pivot.js';
 
-describe('TableData build', function () {
-  let td
+describe('TableData build', function() {
+  let td;
 
-  beforeEach(function () {
-    console.log(TableData)
-    td = new TableData()
-  })
+  beforeEach(function() {
+    console.log(TableData);
+    td = new TableData();
+  });
 
-  it('should initialize the default value', function () {
-    expect(td.columns.length).toBe(0)
-    expect(td.rows.length).toBe(0)
-    expect(td.comment).toBe('')
-  })
+  it('should initialize the default value', function() {
+    expect(td.columns.length).toBe(0);
+    expect(td.rows.length).toBe(0);
+    expect(td.comment).toBe('');
+  });
 
-  it('should able to create Tabledata from paragraph result', function () {
+  it('should able to create Tabledata from paragraph result', function() {
     td.loadParagraphResult({
       type: 'TABLE',
-      msg: 'key\tvalue\na\t10\nb\t20\n\nhello'
-    })
+      msg: 'key\tvalue\na\t10\nb\t20\n\nhello',
+    });
 
-    expect(td.columns.length).toBe(2)
-    expect(td.rows.length).toBe(2)
-    expect(td.comment).toBe('hello')
-  })
-})
+    expect(td.columns.length).toBe(2);
+    expect(td.rows.length).toBe(2);
+    expect(td.comment).toBe('hello');
+  });
+});
 
 describe('PivotTransformation build', function() {
-  let pt
+  let pt;
 
-  beforeEach(function () {
-    console.log(PivotTransformation)
-    pt = new PivotTransformation()
-  })
+  beforeEach(function() {
+    console.log(PivotTransformation);
+    pt = new PivotTransformation();
+  });
 
   it('check the result of keys, groups and values unique', function() {
     // set inited mock data
@@ -63,33 +63,33 @@ describe('PivotTransformation build', function() {
                  {index: 3, name: '3'},
                  {index: 5, name: '5'}],
           groups: [],
-          values: []
-        }
-      }
-    }
+          values: [],
+        },
+      },
+    };
     pt.tableDataColumns = [
         {index: 1, name: '1'},
         {index: 2, name: '2'},
         {index: 3, name: '3'},
         {index: 4, name: '4'},
-        {index: 5, name: '5'}]
+        {index: 5, name: '5'}];
 
-    pt.setConfig(config)
+    pt.setConfig(config);
 
-    pt.removeUnknown()
+    pt.removeUnknown();
 
-    expect(config.common.pivot.keys.length).toBe(3)
-    expect(config.common.pivot.keys[0].index).toBe(4)
-    expect(config.common.pivot.keys[1].index).toBe(3)
-    expect(config.common.pivot.keys[2].index).toBe(5)
-  })
+    expect(config.common.pivot.keys.length).toBe(3);
+    expect(config.common.pivot.keys[0].index).toBe(4);
+    expect(config.common.pivot.keys[1].index).toBe(3);
+    expect(config.common.pivot.keys[2].index).toBe(5);
+  });
 
   it('should aggregate values correctly', function() {
-    let td = new TableData()
+    let td = new TableData();
     td.loadParagraphResult({
       type: 'TABLE',
-      msg: 'key\tvalue\na\t10\na\tnull\na\t0\na\t1\n'
-    })
+      msg: 'key\tvalue\na\t10\na\tnull\na\t0\na\t1\n',
+    });
 
     let config = {
       common: {
@@ -98,34 +98,34 @@ describe('PivotTransformation build', function() {
             {
               'name': 'key',
               'index': 0.0,
-            }
+            },
           ],
           groups: [],
           values: [
             {
               'name': 'value',
               'index': 1.0,
-              'aggr': 'sum'
-            }
-          ]
-        }
-      }
-    }
-
-    pt.setConfig(config)
-    let transformed = pt.transform(td)
-    expect(transformed.rows['a']['value(sum)'].value).toBe(11)
-
-    pt.config.common.pivot.values[0].aggr = 'max'
-    transformed = pt.transform(td)
-    expect(transformed.rows['a']['value(max)'].value).toBe(10)
-
-    pt.config.common.pivot.values[0].aggr = 'min'
-    transformed = pt.transform(td)
-    expect(transformed.rows['a']['value(min)'].value).toBe(0)
-
-    pt.config.common.pivot.values[0].aggr = 'count'
-    transformed = pt.transform(td)
-    expect(transformed.rows['a']['value(count)'].value).toBe(4)
-  })
-})
+              'aggr': 'sum',
+            },
+          ],
+        },
+      },
+    };
+
+    pt.setConfig(config);
+    let transformed = pt.transform(td);
+    expect(transformed.rows['a']['value(sum)'].value).toBe(11);
+
+    pt.config.common.pivot.values[0].aggr = 'max';
+    transformed = pt.transform(td);
+    expect(transformed.rows['a']['value(max)'].value).toBe(10);
+
+    pt.config.common.pivot.values[0].aggr = 'min';
+    transformed = pt.transform(td);
+    expect(transformed.rows['a']['value(min)'].value).toBe(0);
+
+    pt.config.common.pivot.values[0].aggr = 'count';
+    transformed = pt.transform(td);
+    expect(transformed.rows['a']['value(count)'].value).toBe(4);
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/transformation.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/transformation.js b/zeppelin-web/src/app/tabledata/transformation.js
index f142618..a15e12b 100644
--- a/zeppelin-web/src/app/tabledata/transformation.js
+++ b/zeppelin-web/src/app/tabledata/transformation.js
@@ -16,9 +16,9 @@
  * Base class for visualization
  */
 export default class Transformation {
-  constructor (config) {
-    this.config = config
-    this._emitter = () => {}
+  constructor(config) {
+    this.config = config;
+    this._emitter = () => {};
   }
 
   /**
@@ -27,77 +27,81 @@ export default class Transformation {
    *   scope : an object to bind to template scope
    * }
    */
-  getSetting () {
+  getSetting() {
     // override this
   }
 
   /**
    * Method will be invoked when tableData or config changes
    */
-  transform (tableData) {
+  transform(tableData) {
     // override this
   }
 
   /**
    * render setting
    */
-  renderSetting (targetEl) {
-    let setting = this.getSetting()
+  renderSetting(targetEl) {
+    let setting = this.getSetting();
     if (!setting) {
-      return
+      return;
     }
 
     // already readered
     if (this._scope) {
-      let self = this
-      this._scope.$apply(function () {
+      let self = this;
+      this._scope.$apply(function() {
         for (let k in setting.scope) {
-          self._scope[k] = setting.scope[k]
+          if(setting.scope.hasOwnProperty(k)) {
+            self._scope[k] = setting.scope[k];
+          }
         }
 
         for (let k in self._prevSettingScope) {
           if (!setting.scope[k]) {
-            self._scope[k] = setting.scope[k]
+            self._scope[k] = setting.scope[k];
           }
         }
-      })
-      return
+      });
+      return;
     } else {
-      this._prevSettingScope = setting.scope
+      this._prevSettingScope = setting.scope;
     }
 
-    let scope = this._createNewScope()
+    let scope = this._createNewScope();
     for (let k in setting.scope) {
-      scope[k] = setting.scope[k]
+      if(setting.scope.hasOwnProperty(k)) {
+        scope[k] = setting.scope[k];
+      }
     }
-    let template = setting.template
+    let template = setting.template;
 
     if (template.split('\n').length === 1 &&
         template.endsWith('.html')) { // template is url
-      let self = this
-      this._templateRequest(template).then(function (t) {
-        self._render(targetEl, t, scope)
-      })
+      let self = this;
+      this._templateRequest(template).then(function(t) {
+        self._render(targetEl, t, scope);
+      });
     } else {
-      this._render(targetEl, template, scope)
+      this._render(targetEl, template, scope);
     }
   }
 
-  _render (targetEl, template, scope) {
-    this._targetEl = targetEl
-    targetEl.html(template)
-    this._compile(targetEl.contents())(scope)
-    this._scope = scope
+  _render(targetEl, template, scope) {
+    this._targetEl = targetEl;
+    targetEl.html(template);
+    this._compile(targetEl.contents())(scope);
+    this._scope = scope;
   }
 
-  setConfig (config) {
-    this.config = config
+  setConfig(config) {
+    this.config = config;
   }
 
   /**
    * Emit config. config will sent to server and saved.
    */
-  emitConfig (config) {
-    this._emitter(config)
+  emitConfig(config) {
+    this._emitter(config);
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/builtins/visualization-areachart.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/builtins/visualization-areachart.js b/zeppelin-web/src/app/visualization/builtins/visualization-areachart.js
index 494f8ae..886aec9 100644
--- a/zeppelin-web/src/app/visualization/builtins/visualization-areachart.js
+++ b/zeppelin-web/src/app/visualization/builtins/visualization-areachart.js
@@ -12,34 +12,34 @@
  * limitations under the License.
  */
 
-import Nvd3ChartVisualization from './visualization-nvd3chart'
-import PivotTransformation from '../../tabledata/pivot'
+import Nvd3ChartVisualization from './visualization-nvd3chart';
+import PivotTransformation from '../../tabledata/pivot';
 
 /**
  * Visualize data in area chart
  */
 export default class AreachartVisualization extends Nvd3ChartVisualization {
-  constructor (targetEl, config) {
-    super(targetEl, config)
+  constructor(targetEl, config) {
+    super(targetEl, config);
 
-    this.pivot = new PivotTransformation(config)
+    this.pivot = new PivotTransformation(config);
 
     try {
-      this.config.rotate = {degree: config.rotate.degree}
+      this.config.rotate = {degree: config.rotate.degree};
     } catch (e) {
-      this.config.rotate = {degree: '-45'}
+      this.config.rotate = {degree: '-45'};
     }
   }
 
-  type () {
-    return 'stackedAreaChart'
+  type() {
+    return 'stackedAreaChart';
   }
 
-  getTransformation () {
-    return this.pivot
+  getTransformation() {
+    return this.pivot;
   }
 
-  render (pivot) {
+  render(pivot) {
     let d3Data = this.d3DataFromPivot(
       pivot.schema,
       pivot.rows,
@@ -48,108 +48,112 @@ export default class AreachartVisualization extends Nvd3ChartVisualization {
       pivot.values,
       false,
       true,
-      false)
+      false);
 
-    this.xLabels = d3Data.xLabels
-    super.render(d3Data)
-    this.config.changeXLabel(this.config.xLabelStatus)
+    this.xLabels = d3Data.xLabels;
+    super.render(d3Data);
+    this.config.changeXLabel(this.config.xLabelStatus);
   }
 
   /**
    * Set new config
    */
-  setConfig (config) {
-    super.setConfig(config)
-    this.pivot.setConfig(config)
+  setConfig(config) {
+    super.setConfig(config);
+    this.pivot.setConfig(config);
   }
 
-  configureChart (chart) {
-    let self = this
-    let configObj = self.config
+  configureChart(chart) {
+    let self = this;
+    let configObj = self.config;
 
-    chart.xAxis.tickFormat(function (d) { return self.xAxisTickFormat(d, self.xLabels) })
-    chart.yAxis.tickFormat(function (d) { return self.yAxisTickFormat(d) })
-    chart.yAxis.axisLabelDistance(50)
-    chart.useInteractiveGuideline(true) // for better UX and performance issue. (https://github.com/novus/nvd3/issues/691)
+    chart.xAxis.tickFormat(function(d) {
+      return self.xAxisTickFormat(d, self.xLabels);
+    });
+    chart.yAxis.tickFormat(function(d) {
+      return self.yAxisTickFormat(d);
+    });
+    chart.yAxis.axisLabelDistance(50);
+    chart.useInteractiveGuideline(true); // for better UX and performance issue. (https://github.com/novus/nvd3/issues/691)
 
     self.config.changeXLabel = function(type) {
       switch (type) {
         case 'default':
-          self.chart._options['showXAxis'] = true
-          self.chart._options['margin'] = {bottom: 50}
-          self.chart.xAxis.rotateLabels(0)
-          configObj.xLabelStatus = 'default'
-          break
+          self.chart._options['showXAxis'] = true;
+          self.chart._options['margin'] = {bottom: 50};
+          self.chart.xAxis.rotateLabels(0);
+          configObj.xLabelStatus = 'default';
+          break;
         case 'rotate':
-          self.chart._options['showXAxis'] = true
-          self.chart._options['margin'] = {bottom: 140}
-          self.chart.xAxis.rotateLabels(configObj.rotate.degree)
-          configObj.xLabelStatus = 'rotate'
-          break
+          self.chart._options['showXAxis'] = true;
+          self.chart._options['margin'] = {bottom: 140};
+          self.chart.xAxis.rotateLabels(configObj.rotate.degree);
+          configObj.xLabelStatus = 'rotate';
+          break;
         case 'hide':
-          self.chart._options['showXAxis'] = false
-          self.chart._options['margin'] = {bottom: 50}
-          d3.select('#' + self.targetEl[0].id + '> svg').select('g.nv-axis.nv-x').selectAll('*').remove()
-          configObj.xLabelStatus = 'hide'
-          break
+          self.chart._options['showXAxis'] = false;
+          self.chart._options['margin'] = {bottom: 50};
+          d3.select('#' + self.targetEl[0].id + '> svg').select('g.nv-axis.nv-x').selectAll('*').remove();
+          configObj.xLabelStatus = 'hide';
+          break;
       }
-      self.emitConfig(configObj)
-    }
+      self.emitConfig(configObj);
+    };
 
     self.config.isXLabelStatus = function(type) {
       if (configObj.xLabelStatus === type) {
-        return true
+        return true;
       } else {
-        return false
+        return false;
       }
-    }
+    };
 
     self.config.setDegree = function(type) {
-      configObj.rotate.degree = type
-      self.chart.xAxis.rotateLabels(type)
-      self.emitConfig(configObj)
-    }
+      configObj.rotate.degree = type;
+      self.chart.xAxis.rotateLabels(type);
+      self.emitConfig(configObj);
+    };
 
     self.config.isDegreeEmpty = function() {
       if (configObj.rotate.degree.length > 0) {
-        return true
+        return true;
       } else {
-        configObj.rotate.degree = '-45'
-        self.emitConfig(configObj)
-        return false
+        configObj.rotate.degree = '-45';
+        self.emitConfig(configObj);
+        return false;
       }
-    }
+    };
 
-    this.chart.style(this.config.style || 'stack')
+    this.chart.style(this.config.style || 'stack');
 
-    this.chart.dispatch.on('stateChange', function (s) {
-      self.config.style = s.style
+    this.chart.dispatch.on('stateChange', function(s) {
+      self.config.style = s.style;
 
       // give some time to animation finish
-      setTimeout(function () {
-        self.emitConfig(self.config)
-      }, 500)
-    })
+      setTimeout(function() {
+        self.emitConfig(self.config);
+      }, 500);
+    });
   }
   getSetting(chart) {
-    let self = this
-    let configObj = self.config
+    let self = this;
+    let configObj = self.config;
 
     // default to visualize xLabel
     if (typeof (configObj.xLabelStatus) === 'undefined') {
-      configObj.changeXLabel('default')
+      configObj.changeXLabel('default');
     }
 
     if (typeof (configObj.rotate.degree) === 'undefined' || configObj.rotate.degree === '') {
-      configObj.rotate.degree = '-45'
-      self.emitConfig(configObj)
+      configObj.rotate.degree = '-45';
+      self.emitConfig(configObj);
     }
 
     return {
       template: 'app/visualization/builtins/visualization-displayXAxis.html',
       scope: {
-        config: configObj
-      }
-    }
+        config: configObj,
+      },
+    };
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/builtins/visualization-barchart.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/builtins/visualization-barchart.js b/zeppelin-web/src/app/visualization/builtins/visualization-barchart.js
index 2653af2..e0279d9 100644
--- a/zeppelin-web/src/app/visualization/builtins/visualization-barchart.js
+++ b/zeppelin-web/src/app/visualization/builtins/visualization-barchart.js
@@ -12,34 +12,34 @@
  * limitations under the License.
  */
 
-import Nvd3ChartVisualization from './visualization-nvd3chart'
-import PivotTransformation from '../../tabledata/pivot'
+import Nvd3ChartVisualization from './visualization-nvd3chart';
+import PivotTransformation from '../../tabledata/pivot';
 
 /**
  * Visualize data in bar char
  */
 export default class BarchartVisualization extends Nvd3ChartVisualization {
-  constructor (targetEl, config) {
-    super(targetEl, config)
+  constructor(targetEl, config) {
+    super(targetEl, config);
 
-    this.pivot = new PivotTransformation(config)
+    this.pivot = new PivotTransformation(config);
 
     try {
-      this.config.rotate = {degree: config.rotate.degree}
+      this.config.rotate = {degree: config.rotate.degree};
     } catch (e) {
-      this.config.rotate = {degree: '-45'}
+      this.config.rotate = {degree: '-45'};
     }
   }
 
-  type () {
-    return 'multiBarChart'
+  type() {
+    return 'multiBarChart';
   }
 
-  getTransformation () {
-    return this.pivot
+  getTransformation() {
+    return this.pivot;
   }
 
-  render (pivot) {
+  render(pivot) {
     let d3Data = this.d3DataFromPivot(
       pivot.schema,
       pivot.rows,
@@ -48,96 +48,98 @@ export default class BarchartVisualization extends Nvd3ChartVisualization {
       pivot.values,
       true,
       true,
-      true)
+      true);
 
-    super.render(d3Data)
-    this.config.changeXLabel(this.config.xLabelStatus)
+    super.render(d3Data);
+    this.config.changeXLabel(this.config.xLabelStatus);
   }
 
   /**
    * Set new config
    */
-  setConfig (config) {
-    super.setConfig(config)
-    this.pivot.setConfig(config)
+  setConfig(config) {
+    super.setConfig(config);
+    this.pivot.setConfig(config);
   }
 
-  configureChart (chart) {
-    let self = this
-    let configObj = self.config
+  configureChart(chart) {
+    let self = this;
+    let configObj = self.config;
 
-    chart.yAxis.axisLabelDistance(50)
-    chart.yAxis.tickFormat(function (d) { return self.yAxisTickFormat(d) })
+    chart.yAxis.axisLabelDistance(50);
+    chart.yAxis.tickFormat(function(d) {
+      return self.yAxisTickFormat(d);
+    });
 
-    self.chart.stacked(this.config.stacked)
+    self.chart.stacked(this.config.stacked);
 
     self.config.changeXLabel = function(type) {
       switch (type) {
         case 'default':
-          self.chart._options['showXAxis'] = true
-          self.chart._options['margin'] = {bottom: 50}
-          self.chart.xAxis.rotateLabels(0)
-          configObj.xLabelStatus = 'default'
-          break
+          self.chart._options['showXAxis'] = true;
+          self.chart._options['margin'] = {bottom: 50};
+          self.chart.xAxis.rotateLabels(0);
+          configObj.xLabelStatus = 'default';
+          break;
         case 'rotate':
-          self.chart._options['showXAxis'] = true
-          self.chart._options['margin'] = {bottom: 140}
-          self.chart.xAxis.rotateLabels(configObj.rotate.degree)
-          configObj.xLabelStatus = 'rotate'
-          break
+          self.chart._options['showXAxis'] = true;
+          self.chart._options['margin'] = {bottom: 140};
+          self.chart.xAxis.rotateLabels(configObj.rotate.degree);
+          configObj.xLabelStatus = 'rotate';
+          break;
         case 'hide':
-          self.chart._options['showXAxis'] = false
-          self.chart._options['margin'] = {bottom: 50}
-          d3.select('#' + self.targetEl[0].id + '> svg').select('g.nv-axis.nv-x').selectAll('*').remove()
-          configObj.xLabelStatus = 'hide'
-          break
+          self.chart._options['showXAxis'] = false;
+          self.chart._options['margin'] = {bottom: 50};
+          d3.select('#' + self.targetEl[0].id + '> svg').select('g.nv-axis.nv-x').selectAll('*').remove();
+          configObj.xLabelStatus = 'hide';
+          break;
       }
-      self.emitConfig(configObj)
-    }
+      self.emitConfig(configObj);
+    };
 
     self.config.isXLabelStatus = function(type) {
       if (configObj.xLabelStatus === type) {
-        return true
+        return true;
       } else {
-        return false
+        return false;
       }
-    }
+    };
 
     self.config.setDegree = function(type) {
-      configObj.rotate.degree = type
-      self.chart.xAxis.rotateLabels(type)
-      self.emitConfig(configObj)
-    }
+      configObj.rotate.degree = type;
+      self.chart.xAxis.rotateLabels(type);
+      self.emitConfig(configObj);
+    };
 
     this.chart.dispatch.on('stateChange', function(s) {
-      configObj.stacked = s.stacked
+      configObj.stacked = s.stacked;
 
       // give some time to animation finish
       setTimeout(function() {
-        self.emitConfig(configObj)
-      }, 500)
-    })
+        self.emitConfig(configObj);
+      }, 500);
+    });
   }
 
   getSetting(chart) {
-    let self = this
-    let configObj = self.config
+    let self = this;
+    let configObj = self.config;
 
     // default to visualize xLabel
     if (typeof (configObj.xLabelStatus) === 'undefined') {
-      configObj.changeXLabel('default')
+      configObj.changeXLabel('default');
     }
 
     if (typeof (configObj.rotate.degree) === 'undefined' || configObj.rotate.degree === '') {
-      configObj.rotate.degree = '-45'
-      self.emitConfig(configObj)
+      configObj.rotate.degree = '-45';
+      self.emitConfig(configObj);
     }
 
     return {
       template: 'app/visualization/builtins/visualization-displayXAxis.html',
       scope: {
-        config: configObj
-      }
-    }
+        config: configObj,
+      },
+    };
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/builtins/visualization-d3network.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/builtins/visualization-d3network.js b/zeppelin-web/src/app/visualization/builtins/visualization-d3network.js
index 46ee251..749e434 100644
--- a/zeppelin-web/src/app/visualization/builtins/visualization-d3network.js
+++ b/zeppelin-web/src/app/visualization/builtins/visualization-d3network.js
@@ -12,18 +12,18 @@
  * limitations under the License.
  */
 
-import Visualization from '../visualization'
-import NetworkTransformation from '../../tabledata/network'
+import Visualization from '../visualization';
+import NetworkTransformation from '../../tabledata/network';
 
 /**
  * Visualize data in network format
  */
 export default class NetworkVisualization extends Visualization {
   constructor(targetEl, config) {
-    super(targetEl, config)
-    console.log('Init network viz')
+    super(targetEl, config);
+    console.log('Init network viz');
     if (!config.properties) {
-      config.properties = {}
+      config.properties = {};
     }
     if (!config.d3Graph) {
       config.d3Graph = {
@@ -33,101 +33,101 @@ export default class NetworkVisualization extends Visualization {
           linkDistance: 80,
         },
         zoom: {
-          minScale: 1.3
-        }
-      }
+          minScale: 1.3,
+        },
+      };
     }
-    this.targetEl.addClass('network')
-    this.containerId = this.targetEl.prop('id')
-    this.force = null
-    this.svg = null
-    this.$timeout = angular.injector(['ng']).get('$timeout')
-    this.$interpolate = angular.injector(['ng']).get('$interpolate')
-    this.transformation = new NetworkTransformation(config)
+    this.targetEl.addClass('network');
+    this.containerId = this.targetEl.prop('id');
+    this.force = null;
+    this.svg = null;
+    this.$timeout = angular.injector(['ng']).get('$timeout');
+    this.$interpolate = angular.injector(['ng']).get('$interpolate');
+    this.transformation = new NetworkTransformation(config);
   }
 
   refresh() {
-    console.log('refresh')
+    console.log('refresh');
   }
 
   render(networkData) {
     if (!('graph' in networkData)) {
-      console.log('graph not found')
-      return
+      console.log('graph not found');
+      return;
     }
     if (!networkData.isRendered) {
-      networkData.isRendered = true
+      networkData.isRendered = true;
     } else {
-      return
+      return;
     }
-    console.log('Rendering the graph')
+    console.log('Rendering the graph');
 
     if (networkData.graph.edges.length &&
         !networkData.isDefaultSet) {
-      networkData.isDefaultSet = true
-      this._setEdgesDefaults(networkData.graph)
+      networkData.isDefaultSet = true;
+      this._setEdgesDefaults(networkData.graph);
     }
 
-    const transformationConfig = this.transformation.getSetting().scope.config
-    console.log('cfg', transformationConfig)
+    const transformationConfig = this.transformation.getSetting().scope.config;
+    console.log('cfg', transformationConfig);
     if (transformationConfig && angular.equals({}, transformationConfig.properties)) {
-      transformationConfig.properties = this.getNetworkProperties(networkData.graph)
+      transformationConfig.properties = this.getNetworkProperties(networkData.graph);
     }
 
-    this.targetEl.empty().append('<svg></svg>')
+    this.targetEl.empty().append('<svg></svg>');
 
-    const width = this.targetEl.width()
-    const height = this.targetEl.height()
-    const self = this
-    const defaultOpacity = 0
-    const nodeSize = 10
-    const textOffset = 3
-    const linkSize = 10
+    const width = this.targetEl.width();
+    const height = this.targetEl.height();
+    const self = this;
+    const defaultOpacity = 0;
+    const nodeSize = 10;
+    const textOffset = 3;
+    const linkSize = 10;
 
     const arcPath = (leftHand, d) => {
-      let start = leftHand ? d.source : d.target
-      let end = leftHand ? d.target : d.source
-      let dx = end.x - start.x
-      let dy = end.y - start.y
+      let start = leftHand ? d.source : d.target;
+      let end = leftHand ? d.target : d.source;
+      let dx = end.x - start.x;
+      let dy = end.y - start.y;
       let dr = d.totalCount === 1
-              ? 0 : Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)) / (1 + (1 / d.totalCount) * (d.count - 1))
-      let sweep = leftHand ? 0 : 1
-      return `M${start.x},${start.y}A${dr},${dr} 0 0,${sweep} ${end.x},${end.y}`
-    }
+              ? 0 : Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)) / (1 + (1 / d.totalCount) * (d.count - 1));
+      let sweep = leftHand ? 0 : 1;
+      return `M${start.x},${start.y}A${dr},${dr} 0 0,${sweep} ${end.x},${end.y}`;
+    };
     // Use elliptical arc path segments to doubly-encode directionality.
     const tick = () => {
       // Links
       linkPath.attr('d', function(d) {
-        return arcPath(true, d)
-      })
+        return arcPath(true, d);
+      });
       textPath.attr('d', function(d) {
-        return arcPath(d.source.x < d.target.x, d)
-      })
+        return arcPath(d.source.x < d.target.x, d);
+      });
       // Nodes
-      circle.attr('transform', (d) => `translate(${d.x},${d.y})`)
-      text.attr('transform', (d) => `translate(${d.x},${d.y})`)
-    }
+      circle.attr('transform', (d) => `translate(${d.x},${d.y})`);
+      text.attr('transform', (d) => `translate(${d.x},${d.y})`);
+    };
 
     const setOpacity = (scale) => {
-      let opacity = scale >= +transformationConfig.d3Graph.zoom.minScale ? 1 : 0
+      let opacity = scale >= +transformationConfig.d3Graph.zoom.minScale ? 1 : 0;
       this.svg.selectAll('.nodeLabel')
-        .style('opacity', opacity)
+        .style('opacity', opacity);
       this.svg.selectAll('textPath')
-        .style('opacity', opacity)
-    }
+        .style('opacity', opacity);
+    };
 
     const zoom = d3.behavior.zoom()
       .scaleExtent([1, 10])
       .on('zoom', () => {
-        console.log('zoom')
-        setOpacity(d3.event.scale)
-        container.attr('transform', `translate(${d3.event.translate})scale(${d3.event.scale})`)
-      })
+        console.log('zoom');
+        setOpacity(d3.event.scale);
+        container.attr('transform', `translate(${d3.event.translate})scale(${d3.event.scale})`);
+      });
 
     this.svg = d3.select(`#${this.containerId} svg`)
       .attr('width', width)
       .attr('height', height)
-      .call(zoom)
+      .call(zoom);
 
     this.force = d3.layout.force()
       .charge(transformationConfig.d3Graph.forceLayout.charge)
@@ -137,54 +137,56 @@ export default class NetworkVisualization extends Visualization {
       .links(networkData.graph.edges)
       .size([width, height])
       .on('start', () => {
-        console.log('force layout start')
-        this.$timeout(() => { this.force.stop() }, transformationConfig.d3Graph.forceLayout.timeout)
+        console.log('force layout start');
+        this.$timeout(() => {
+          this.force.stop();
+        }, transformationConfig.d3Graph.forceLayout.timeout);
       })
       .on('end', () => {
-        console.log('force layout stop')
-        setOpacity(zoom.scale())
+        console.log('force layout stop');
+        setOpacity(zoom.scale());
       })
-      .start()
+      .start();
 
     const renderFooterOnClick = (entity, type) => {
-      const footerId = this.containerId + '_footer'
-      const obj = {id: entity.id, label: entity.defaultLabel || entity.label, type: type}
-      let html = [`<li><b>${obj.type}_id:</b>&nbsp${obj.id}</li>`]
+      const footerId = this.containerId + '_footer';
+      const obj = {id: entity.id, label: entity.defaultLabel || entity.label, type: type};
+      let html = [`<li><b>${obj.type}_id:</b>&nbsp${obj.id}</li>`];
       if (obj.label) {
-        html.push(`<li><b>${obj.type}_type:</b>&nbsp${obj.label}</li>`)
+        html.push(`<li><b>${obj.type}_type:</b>&nbsp${obj.label}</li>`);
       }
       html = html.concat(_.map(entity.data, (v, k) => {
-        return `<li><b>${k}:</b>&nbsp${v}</li>`
-      }))
+        return `<li><b>${k}:</b>&nbsp${v}</li>`;
+      }));
       angular.element('#' + footerId)
         .find('.list-inline')
         .empty()
-        .append(html.join(''))
-    }
+        .append(html.join(''));
+    };
 
     const drag = d3.behavior.drag()
       .origin((d) => d)
       .on('dragstart', function(d) {
-        console.log('dragstart')
-        d3.event.sourceEvent.stopPropagation()
-        d3.select(this).classed('dragging', true)
-        self.force.stop()
+        console.log('dragstart');
+        d3.event.sourceEvent.stopPropagation();
+        d3.select(this).classed('dragging', true);
+        self.force.stop();
       })
       .on('drag', function(d) {
-        console.log('drag')
-        d.px += d3.event.dx
-        d.py += d3.event.dy
-        d.x += d3.event.dx
-        d.y += d3.event.dy
+        console.log('drag');
+        d.px += d3.event.dx;
+        d.py += d3.event.dy;
+        d.x += d3.event.dx;
+        d.y += d3.event.dy;
       })
       .on('dragend', function(d) {
-        console.log('dragend')
-        d.fixed = true
-        d3.select(this).classed('dragging', false)
-        self.force.resume()
-      })
+        console.log('dragend');
+        d.fixed = true;
+        d3.select(this).classed('dragging', false);
+        self.force.resume();
+      });
 
-    const container = this.svg.append('g')
+    const container = this.svg.append('g');
     if (networkData.graph.directed) {
       container.append('svg:defs').selectAll('marker')
         .data(['arrowMarker-' + this.containerId])
@@ -198,26 +200,26 @@ export default class NetworkVisualization extends Visualization {
         .attr('markerHeight', 4)
         .attr('orient', 'auto')
         .append('svg:path')
-        .attr('d', 'M0,-5L10,0L0,5')
+        .attr('d', 'M0,-5L10,0L0,5');
     }
     // Links
     const link = container.append('svg:g')
       .on('click', () => {
-        renderFooterOnClick(d3.select(d3.event.target).datum(), 'edge')
+        renderFooterOnClick(d3.select(d3.event.target).datum(), 'edge');
       })
       .selectAll('g.link')
       .data(self.force.links())
       .enter()
-      .append('g')
-    const getPathId = (d) => this.containerId + '_' + d.source.index + '_' + d.target.index + '_' + d.count
-    const showLabel = (d) => this._showNodeLabel(d)
+      .append('g');
+    const getPathId = (d) => this.containerId + '_' + d.source.index + '_' + d.target.index + '_' + d.count;
+    const showLabel = (d) => this._showNodeLabel(d);
     const linkPath = link.append('svg:path')
       .attr('class', 'link')
       .attr('size', linkSize)
-      .attr('marker-end', `url(#arrowMarker-${this.containerId})`)
+      .attr('marker-end', `url(#arrowMarker-${this.containerId})`);
     const textPath = link.append('svg:path')
       .attr('id', getPathId)
-      .attr('class', 'textpath')
+      .attr('class', 'textpath');
     container.append('svg:g')
       .selectAll('.pathLabel')
       .data(self.force.links())
@@ -229,11 +231,11 @@ export default class NetworkVisualization extends Visualization {
       .attr('text-anchor', 'middle')
       .attr('xlink:href', (d) => '#' + getPathId(d))
       .text((d) => d.label)
-      .style('opacity', defaultOpacity)
+      .style('opacity', defaultOpacity);
     // Nodes
     const circle = container.append('svg:g')
       .on('click', () => {
-        renderFooterOnClick(d3.select(d3.event.target).datum(), 'node')
+        renderFooterOnClick(d3.select(d3.event.target).datum(), 'node');
       })
       .selectAll('circle')
       .data(self.force.nodes())
@@ -241,37 +243,37 @@ export default class NetworkVisualization extends Visualization {
       .attr('r', (d) => nodeSize)
       .attr('fill', (d) => networkData.graph.labels && d.label in networkData.graph.labels
                   ? networkData.graph.labels[d.label] : '#000000')
-      .call(drag)
+      .call(drag);
     const text = container.append('svg:g').selectAll('g')
       .data(self.force.nodes())
-      .enter().append('svg:g')
+      .enter().append('svg:g');
     text.append('svg:text')
         .attr('x', (d) => nodeSize + textOffset)
         .attr('size', nodeSize)
         .attr('y', '.31em')
         .attr('class', (d) => 'nodeLabel shadow label-' + d.label)
         .text(showLabel)
-        .style('opacity', defaultOpacity)
+        .style('opacity', defaultOpacity);
     text.append('svg:text')
         .attr('x', (d) => nodeSize + textOffset)
         .attr('size', nodeSize)
         .attr('y', '.31em')
         .attr('class', (d) => 'nodeLabel label-' + d.label)
         .text(showLabel)
-        .style('opacity', defaultOpacity)
+        .style('opacity', defaultOpacity);
   }
 
   destroy() {
   }
 
   _showNodeLabel(d) {
-    const transformationConfig = this.transformation.getSetting().scope.config
-    const selectedLabel = (transformationConfig.properties[d.label] || {selected: 'label'}).selected
-    return d.data[selectedLabel] || d[selectedLabel]
+    const transformationConfig = this.transformation.getSetting().scope.config;
+    const selectedLabel = (transformationConfig.properties[d.label] || {selected: 'label'}).selected;
+    return d.data[selectedLabel] || d[selectedLabel];
   }
 
   getTransformation() {
-    return this.transformation
+    return this.transformation;
   }
 
   setNodesDefaults() {
@@ -281,56 +283,56 @@ export default class NetworkVisualization extends Visualization {
     graph.edges
       .sort((a, b) => {
         if (a.source > b.source) {
-          return 1
+          return 1;
         } else if (a.source < b.source) {
-          return -1
+          return -1;
         } else if (a.target > b.target) {
-          return 1
+          return 1;
         } else if (a.target < b.target) {
-          return -1
+          return -1;
         } else {
-          return 0
+          return 0;
         }
-      })
+      });
     graph.edges
       .forEach((edge, index) => {
-        let prevEdge = graph.edges[index - 1]
+        let prevEdge = graph.edges[index - 1];
         edge.count = (index > 0 && +edge.source === +prevEdge.source && +edge.target === +prevEdge.target
-            ? prevEdge.count : 0) + 1
+            ? prevEdge.count : 0) + 1;
         edge.totalCount = graph.edges
           .filter((innerEdge) => +edge.source === +innerEdge.source && +edge.target === +innerEdge.target)
-          .length
-      })
+          .length;
+      });
     graph.edges
       .forEach((edge) => {
         if (typeof +edge.source === 'number') {
           // edge.source = graph.nodes.filter((node) => +edge.source === +node.id)[0] || null
-          edge.source = _.find(graph.nodes, (node) => +edge.source === +node.id)
+          edge.source = _.find(graph.nodes, (node) => +edge.source === +node.id);
         }
         if (typeof +edge.target === 'number') {
           // edge.target = graph.nodes.filter((node) => +edge.target === +node.id)[0] || null
-          edge.target = _.find(graph.nodes, (node) => +edge.target === +node.id)
+          edge.target = _.find(graph.nodes, (node) => +edge.target === +node.id);
         }
-      })
+      });
   }
 
   getNetworkProperties(graph) {
-    const baseCols = ['id', 'label']
-    const properties = {}
+    const baseCols = ['id', 'label'];
+    const properties = {};
     graph.nodes.forEach(function(node) {
-      const hasLabel = 'label' in node && node.label !== ''
+      const hasLabel = 'label' in node && node.label !== '';
       if (!hasLabel) {
-        return
+        return;
       }
-      const label = node.label
-      const hasKey = hasLabel && label in properties
+      const label = node.label;
+      const hasKey = hasLabel && label in properties;
       const keys = _.uniq(Object.keys(node.data || {})
-              .concat(hasKey ? properties[label].keys : baseCols))
+              .concat(hasKey ? properties[label].keys : baseCols));
       if (!hasKey) {
-        properties[label] = {selected: 'label'}
+        properties[label] = {selected: 'label'};
       }
-      properties[label].keys = keys
-    })
-    return properties
+      properties[label].keys = keys;
+    });
+    return properties;
   }
 }


[10/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/jobmanager/jobmanager.component.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/jobmanager/jobmanager.component.js b/zeppelin-web/src/app/jobmanager/jobmanager.component.js
index 364cc45..c883a11 100644
--- a/zeppelin-web/src/app/jobmanager/jobmanager.component.js
+++ b/zeppelin-web/src/app/jobmanager/jobmanager.component.js
@@ -12,129 +12,132 @@
  * limitations under the License.
  */
 
-import './job/job.component'
-import { JobManagerFilter } from './jobmanager.filter'
-import { JobManagerService} from './jobmanager.service'
+import './job/job.component';
+import {JobManagerFilter} from './jobmanager.filter';
+import {JobManagerService} from './jobmanager.service';
 
-import { getJobIconByStatus, getJobColorByStatus } from './job-status'
+import {getJobIconByStatus, getJobColorByStatus} from './job-status';
 
 angular.module('zeppelinWebApp')
   .controller('JobManagerCtrl', JobManagerController)
   .filter('JobManager', JobManagerFilter)
-  .service('JobManagerService', JobManagerService)
+  .service('JobManagerService', JobManagerService);
 
 const JobDateSorter = {
   RECENTLY_UPDATED: 'Recently Update',
   OLDEST_UPDATED: 'Oldest Updated',
-}
+};
 
 function JobManagerController($scope, ngToast, JobManagerFilter, JobManagerService) {
-  'ngInject'
+  'ngInject';
 
-  $scope.isFilterLoaded = false
-  $scope.jobs = []
+  $scope.isFilterLoaded = false;
+  $scope.jobs = [];
   $scope.sorter = {
-    availableDateSorter: Object.keys(JobDateSorter).map(key => { return JobDateSorter[key] }),
+    availableDateSorter: Object.keys(JobDateSorter).map((key) => {
+      return JobDateSorter[key];
+    }),
     currentDateSorter: JobDateSorter.RECENTLY_UPDATED,
-  }
-  $scope.filteredJobs = $scope.jobs
+  };
+  $scope.filteredJobs = $scope.jobs;
   $scope.filterConfig = {
     isRunningAlwaysTop: true,
     noteNameFilterValue: '',
     interpreterFilterValue: '*',
     isSortByAsc: true,
-  }
+  };
 
   $scope.pagination = {
     currentPage: 1,
     itemsPerPage: 10,
     maxPageCount: 5,
-  }
+  };
 
-  ngToast.dismiss()
-  init()
+  ngToast.dismiss();
+  init();
 
   /** functions */
 
   $scope.setJobDateSorter = function(dateSorter) {
-    $scope.sorter.currentDateSorter = dateSorter
-  }
+    $scope.sorter.currentDateSorter = dateSorter;
+  };
 
   $scope.getJobsInCurrentPage = function(jobs) {
-    const cp = $scope.pagination.currentPage
-    const itp = $scope.pagination.itemsPerPage
-    return jobs.slice((cp - 1) * itp, (cp * itp))
-  }
+    const cp = $scope.pagination.currentPage;
+    const itp = $scope.pagination.itemsPerPage;
+    return jobs.slice((cp - 1) * itp, (cp * itp));
+  };
 
-  let asyncNotebookJobFilter = function (jobs, filterConfig) {
+  let asyncNotebookJobFilter = function(jobs, filterConfig) {
     return new Promise((resolve, reject) => {
-      $scope.filteredJobs = JobManagerFilter(jobs, filterConfig)
-      resolve($scope.filteredJobs)
-    })
-  }
+      // eslint-disable-next-line new-cap
+      $scope.filteredJobs = JobManagerFilter(jobs, filterConfig);
+      resolve($scope.filteredJobs);
+    });
+  };
 
   $scope.$watch('sorter.currentDateSorter', function() {
     $scope.filterConfig.isSortByAsc =
-      $scope.sorter.currentDateSorter === JobDateSorter.OLDEST_UPDATED
-    asyncNotebookJobFilter($scope.jobs, $scope.filterConfig)
-  })
+      $scope.sorter.currentDateSorter === JobDateSorter.OLDEST_UPDATED;
+    asyncNotebookJobFilter($scope.jobs, $scope.filterConfig);
+  });
 
-  $scope.getJobIconByStatus = getJobIconByStatus
-  $scope.getJobColorByStatus = getJobColorByStatus
+  $scope.getJobIconByStatus = getJobIconByStatus;
+  $scope.getJobColorByStatus = getJobColorByStatus;
 
-  $scope.filterJobs = function (jobs, filterConfig) {
+  $scope.filterJobs = function(jobs, filterConfig) {
     asyncNotebookJobFilter(jobs, filterConfig)
       .then(() => {
-        $scope.isFilterLoaded = true
-      })
-      .catch(error => {
-        console.error('Failed to search jobs from server', error)
+        $scope.isFilterLoaded = true;
       })
-  }
+      .catch((error) => {
+        console.error('Failed to search jobs from server', error);
+      });
+  };
 
-  $scope.filterValueToName = function (filterValue, maxStringLength) {
+  $scope.filterValueToName = function(filterValue, maxStringLength) {
     if (typeof $scope.defaultInterpreters === 'undefined') {
-      return
+      return;
     }
 
-    let index = $scope.defaultInterpreters.findIndex(intp => intp.value === filterValue)
+    let index = $scope.defaultInterpreters.findIndex((intp) => intp.value === filterValue);
     if (typeof $scope.defaultInterpreters[index].name !== 'undefined') {
       if (typeof maxStringLength !== 'undefined' &&
         maxStringLength > $scope.defaultInterpreters[index].name) {
-        return $scope.defaultInterpreters[index].name.substr(0, maxStringLength - 3) + '...'
+        return $scope.defaultInterpreters[index].name.substr(0, maxStringLength - 3) + '...';
       }
-      return $scope.defaultInterpreters[index].name
+      return $scope.defaultInterpreters[index].name;
     } else {
-      return 'NONE'
+      return 'NONE';
     }
-  }
+  };
 
-  $scope.setFilterValue = function (filterValue) {
-    $scope.filterConfig.interpreterFilterValue = filterValue
-    $scope.filterJobs($scope.jobs, $scope.filterConfig)
-  }
+  $scope.setFilterValue = function(filterValue) {
+    $scope.filterConfig.interpreterFilterValue = filterValue;
+    $scope.filterJobs($scope.jobs, $scope.filterConfig);
+  };
 
   $scope.setJobs = function(jobs) {
-    $scope.jobs = jobs
+    $scope.jobs = jobs;
     let interpreters = $scope.jobs
-      .filter(j => typeof j.interpreter !== 'undefined')
-      .map(j => j.interpreter)
-    interpreters = [...new Set(interpreters)] // remove duplicated interpreters
+      .filter((j) => typeof j.interpreter !== 'undefined')
+      .map((j) => j.interpreter);
+    interpreters = [...new Set(interpreters)]; // remove duplicated interpreters
 
-    $scope.defaultInterpreters = [ { name: 'ALL', value: '*' } ]
+    $scope.defaultInterpreters = [{name: 'ALL', value: '*'}];
     for (let i = 0; i < interpreters.length; i++) {
-      $scope.defaultInterpreters.push({ name: interpreters[i], value: interpreters[i] })
+      $scope.defaultInterpreters.push({name: interpreters[i], value: interpreters[i]});
     }
-  }
+  };
 
   function init() {
-    JobManagerService.getJobs()
-    JobManagerService.subscribeSetJobs($scope, setJobsCallback)
-    JobManagerService.subscribeUpdateJobs($scope, updateJobsCallback)
+    JobManagerService.getJobs();
+    JobManagerService.subscribeSetJobs($scope, setJobsCallback);
+    JobManagerService.subscribeUpdateJobs($scope, updateJobsCallback);
 
-    $scope.$on('$destroy', function () {
-      JobManagerService.disconnect()
-    })
+    $scope.$on('$destroy', function() {
+      JobManagerService.disconnect();
+    });
   }
 
   /*
@@ -142,45 +145,45 @@ function JobManagerController($scope, ngToast, JobManagerFilter, JobManagerServi
    */
 
   function setJobsCallback(event, response) {
-    const jobs = response.jobs
-    $scope.setJobs(jobs)
-    $scope.filterJobs($scope.jobs, $scope.filterConfig)
+    const jobs = response.jobs;
+    $scope.setJobs(jobs);
+    $scope.filterJobs($scope.jobs, $scope.filterConfig);
   }
 
   function updateJobsCallback(event, response) {
-    let jobs = $scope.jobs
+    let jobs = $scope.jobs;
     let jobByNoteId = jobs.reduce((acc, j) => {
-      const noteId = j.noteId
-      acc[noteId] = j
-      return acc
-    }, {})
+      const noteId = j.noteId;
+      acc[noteId] = j;
+      return acc;
+    }, {});
 
-    let updatedJobs = response.jobs
-    updatedJobs.map(updatedJob => {
+    let updatedJobs = response.jobs;
+    updatedJobs.map((updatedJob) => {
       if (typeof jobByNoteId[updatedJob.noteId] === 'undefined') {
-        let newItem = angular.copy(updatedJob)
-        jobs.push(newItem)
-        jobByNoteId[updatedJob.noteId] = newItem
+        let newItem = angular.copy(updatedJob);
+        jobs.push(newItem);
+        jobByNoteId[updatedJob.noteId] = newItem;
       } else {
-        let job = jobByNoteId[updatedJob.noteId]
+        let job = jobByNoteId[updatedJob.noteId];
 
         if (updatedJob.isRemoved === true) {
-          delete jobByNoteId[updatedJob.noteId]
-          let removeIndex = jobs.findIndex(j => j.noteId === updatedJob.noteId)
+          delete jobByNoteId[updatedJob.noteId];
+          let removeIndex = jobs.findIndex((j) => j.noteId === updatedJob.noteId);
           if (removeIndex) {
-            jobs.splice(removeIndex, 1)
+            jobs.splice(removeIndex, 1);
           }
         } else {
           // update the job
-          job.isRunningJob = updatedJob.isRunningJob
-          job.noteName = updatedJob.noteName
-          job.noteType = updatedJob.noteType
-          job.interpreter = updatedJob.interpreter
-          job.unixTimeLastRun = updatedJob.unixTimeLastRun
-          job.paragraphs = updatedJob.paragraphs
+          job.isRunningJob = updatedJob.isRunningJob;
+          job.noteName = updatedJob.noteName;
+          job.noteType = updatedJob.noteType;
+          job.interpreter = updatedJob.interpreter;
+          job.unixTimeLastRun = updatedJob.unixTimeLastRun;
+          job.paragraphs = updatedJob.paragraphs;
         }
       }
-    })
-    $scope.filterJobs(jobs, $scope.filterConfig)
+    });
+    $scope.filterJobs(jobs, $scope.filterConfig);
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/jobmanager/jobmanager.component.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/jobmanager/jobmanager.component.test.js b/zeppelin-web/src/app/jobmanager/jobmanager.component.test.js
index a4b858b..7604142 100644
--- a/zeppelin-web/src/app/jobmanager/jobmanager.component.test.js
+++ b/zeppelin-web/src/app/jobmanager/jobmanager.component.test.js
@@ -1,26 +1,26 @@
 describe('JobManagerComponent', () => {
-  let $scope
-  let $controller
+  let $scope;
+  let $controller;
 
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+  beforeEach(angular.mock.module('zeppelinWebApp'));
   beforeEach(angular.mock.inject((_$rootScope_, _$controller_) => {
-    $scope = _$rootScope_.$new()
-    $controller = _$controller_
-  }))
+    $scope = _$rootScope_.$new();
+    $controller = _$controller_;
+  }));
 
   it('should set jobs using `setJobs`', () => {
-    let ctrl = $controller('JobManagerCtrl', { $scope: $scope, })
-    expect(ctrl).toBeDefined()
+    let ctrl = $controller('JobManagerCtrl', {$scope: $scope});
+    expect(ctrl).toBeDefined();
 
     const mockJobs = [
-      { noteId: 'TN01', interpreter: 'spark', },
-      { noteId: 'TN02', interpreter: 'spark', },
-    ]
+      {noteId: 'TN01', interpreter: 'spark'},
+      {noteId: 'TN02', interpreter: 'spark'},
+    ];
 
-    $scope.setJobs(mockJobs)
+    $scope.setJobs(mockJobs);
     expect($scope.defaultInterpreters).toEqual([
-      { name: 'ALL', value: '*', },
-      { name: 'spark', value: 'spark', },
-    ])
-  })
-})
+      {name: 'ALL', value: '*'},
+      {name: 'spark', value: 'spark'},
+    ]);
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/jobmanager/jobmanager.filter.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/jobmanager/jobmanager.filter.js b/zeppelin-web/src/app/jobmanager/jobmanager.filter.js
index d6c8d69..c4abb1c 100644
--- a/zeppelin-web/src/app/jobmanager/jobmanager.filter.js
+++ b/zeppelin-web/src/app/jobmanager/jobmanager.filter.js
@@ -13,44 +13,44 @@
  */
 
 export function JobManagerFilter() {
-  function filterContext (jobs, filterConfig) {
-    let interpreter = filterConfig.interpreterFilterValue
-    let noteName = filterConfig.noteNameFilterValue
-    let isSortByAsc = filterConfig.isSortByAsc
-    let filteredJobs = jobs
+  function filterContext(jobs, filterConfig) {
+    let interpreter = filterConfig.interpreterFilterValue;
+    let noteName = filterConfig.noteNameFilterValue;
+    let isSortByAsc = filterConfig.isSortByAsc;
+    let filteredJobs = jobs;
 
     if (typeof interpreter === 'undefined') {
       filteredJobs = filteredJobs.filter((jobItem) => {
-        return typeof jobItem.interpreter === 'undefined'
-      })
+        return typeof jobItem.interpreter === 'undefined';
+      });
     } else if (interpreter !== '*') {
-      filteredJobs = filteredJobs.filter(j => j.interpreter === interpreter)
+      filteredJobs = filteredJobs.filter((j) => j.interpreter === interpreter);
     }
 
     // filter by note name
     if (noteName !== '') {
       filteredJobs = filteredJobs.filter((jobItem) => {
-        let lowerFilterValue = noteName.toLocaleLowerCase()
-        let lowerNotebookName = jobItem.noteName.toLocaleLowerCase()
-        return lowerNotebookName.match(new RegExp('.*' + lowerFilterValue + '.*'))
-      })
+        let lowerFilterValue = noteName.toLocaleLowerCase();
+        let lowerNotebookName = jobItem.noteName.toLocaleLowerCase();
+        return lowerNotebookName.match(new RegExp('.*' + lowerFilterValue + '.*'));
+      });
     }
 
     // sort by name
     filteredJobs = filteredJobs.sort((jobItem) => {
-      return jobItem.noteName.toLowerCase()
-    })
+      return jobItem.noteName.toLowerCase();
+    });
 
     // sort by timestamp
     filteredJobs = filteredJobs.sort((x, y) => {
       if (isSortByAsc) {
-        return x.unixTimeLastRun - y.unixTimeLastRun
+        return x.unixTimeLastRun - y.unixTimeLastRun;
       } else {
-        return y.unixTimeLastRun - x.unixTimeLastRun
+        return y.unixTimeLastRun - x.unixTimeLastRun;
       }
-    })
+    });
 
-    return filteredJobs
+    return filteredJobs;
   }
-  return filterContext
+  return filterContext;
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/jobmanager/jobmanager.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/jobmanager/jobmanager.service.js b/zeppelin-web/src/app/jobmanager/jobmanager.service.js
index 603950f..472ac6d 100644
--- a/zeppelin-web/src/app/jobmanager/jobmanager.service.js
+++ b/zeppelin-web/src/app/jobmanager/jobmanager.service.js
@@ -14,51 +14,51 @@
 
 export class JobManagerService {
   constructor($http, $rootScope, baseUrlSrv, websocketMsgSrv) {
-    'ngInject'
+    'ngInject';
 
-    this.$http = $http
-    this.$rootScope = $rootScope
-    this.BaseUrlService = baseUrlSrv
-    this.WebsocketMessageService = websocketMsgSrv
+    this.$http = $http;
+    this.$rootScope = $rootScope;
+    this.BaseUrlService = baseUrlSrv;
+    this.WebsocketMessageService = websocketMsgSrv;
   }
 
   sendStopJobRequest(noteId) {
-    const apiURL = this.BaseUrlService.getRestApiBase() + `/notebook/job/${noteId}`
-    return this.$http({ method: 'DELETE', url: apiURL, })
+    const apiURL = this.BaseUrlService.getRestApiBase() + `/notebook/job/${noteId}`;
+    return this.$http({method: 'DELETE', url: apiURL});
   }
 
   sendRunJobRequest(noteId) {
-    const apiURL = this.BaseUrlService.getRestApiBase() + `/notebook/job/${noteId}`
-    return this.$http({ method: 'POST', url: apiURL, })
+    const apiURL = this.BaseUrlService.getRestApiBase() + `/notebook/job/${noteId}`;
+    return this.$http({method: 'POST', url: apiURL});
   }
 
   getJobs() {
-    this.WebsocketMessageService.getJobs()
+    this.WebsocketMessageService.getJobs();
   }
 
   disconnect() {
-    this.WebsocketMessageService.disconnectJobEvent()
+    this.WebsocketMessageService.disconnectJobEvent();
   }
 
   subscribeSetJobs(controllerScope, receiveCallback) {
-    const event = 'jobmanager:set-jobs'
-    console.log(`(Event) Subscribed: ${event}`)
-    const unsubscribeHandler = this.$rootScope.$on(event, receiveCallback)
+    const event = 'jobmanager:set-jobs';
+    console.log(`(Event) Subscribed: ${event}`);
+    const unsubscribeHandler = this.$rootScope.$on(event, receiveCallback);
 
     controllerScope.$on('$destroy', () => {
-      console.log(`(Event) Unsubscribed: ${event}`)
-      unsubscribeHandler()
-    })
+      console.log(`(Event) Unsubscribed: ${event}`);
+      unsubscribeHandler();
+    });
   }
 
   subscribeUpdateJobs(controllerScope, receiveCallback) {
-    const event = 'jobmanager:update-jobs'
-    console.log(`(Event) Subscribed: ${event}`)
-    const unsubscribeHandler = this.$rootScope.$on(event, receiveCallback)
+    const event = 'jobmanager:update-jobs';
+    console.log(`(Event) Subscribed: ${event}`);
+    const unsubscribeHandler = this.$rootScope.$on(event, receiveCallback);
 
     controllerScope.$on('$destroy', () => {
-      console.log(`(Event) Unsubscribed: ${event}`)
-      unsubscribeHandler()
-    })
+      console.log(`(Event) Unsubscribed: ${event}`);
+      unsubscribeHandler();
+    });
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/jobmanager/jobmanager.service.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/jobmanager/jobmanager.service.test.js b/zeppelin-web/src/app/jobmanager/jobmanager.service.test.js
index fbb0829..be7196d 100644
--- a/zeppelin-web/src/app/jobmanager/jobmanager.service.test.js
+++ b/zeppelin-web/src/app/jobmanager/jobmanager.service.test.js
@@ -1,56 +1,56 @@
-import { ParagraphStatus } from '../notebook/paragraph/paragraph.status'
-import { JobManagerService } from './jobmanager.service'
+import {ParagraphStatus} from '../notebook/paragraph/paragraph.status';
+import {JobManagerService} from './jobmanager.service';
 
 describe('JobManagerService', () => {
-  const baseUrlSrvMock = { getRestApiBase: () => '' }
-  let service
-  let $httpBackend
+  const baseUrlSrvMock = {getRestApiBase: () => ''};
+  let service;
+  let $httpBackend;
 
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+  beforeEach(angular.mock.module('zeppelinWebApp'));
   beforeEach(angular.mock.inject((_$rootScope_, _$httpBackend_, _$http_, _websocketMsgSrv_) => {
-    $httpBackend = _$httpBackend_
-    service = new JobManagerService(_$http_, _$rootScope_, baseUrlSrvMock, _websocketMsgSrv_)
-  }))
+    $httpBackend = _$httpBackend_;
+    service = new JobManagerService(_$http_, _$rootScope_, baseUrlSrvMock, _websocketMsgSrv_);
+  }));
 
   it('should sent valid request to run a job', () => {
-    const paragraphs = [ { status: ParagraphStatus.PENDING }, ]
-    const mockNote = createMockNote(paragraphs)
+    const paragraphs = [{status: ParagraphStatus.PENDING}];
+    const mockNote = createMockNote(paragraphs);
 
-    const noteId = mockNote.noteId
-    service.sendRunJobRequest(noteId)
+    const noteId = mockNote.noteId;
+    service.sendRunJobRequest(noteId);
 
-    const url = `/notebook/job/${noteId}`
+    const url = `/notebook/job/${noteId}`;
 
     $httpBackend
       .when('POST', url)
-      .respond(200, { /** return nothing */ })
-    $httpBackend.expectPOST(url)
-    $httpBackend.flush()
+      .respond(200, { /** return nothing */ });
+    $httpBackend.expectPOST(url);
+    $httpBackend.flush();
 
-    checkUnknownHttpRequests()
-  })
+    checkUnknownHttpRequests();
+  });
 
   it('should sent valid request to stop a job', () => {
-    const paragraphs = [ { status: ParagraphStatus.PENDING }, ]
-    const mockNote = createMockNote(paragraphs)
+    const paragraphs = [{status: ParagraphStatus.PENDING}];
+    const mockNote = createMockNote(paragraphs);
 
-    const noteId = mockNote.noteId
-    service.sendStopJobRequest(noteId)
+    const noteId = mockNote.noteId;
+    service.sendStopJobRequest(noteId);
 
-    const url = `/notebook/job/${noteId}`
+    const url = `/notebook/job/${noteId}`;
 
     $httpBackend
       .when('DELETE', url)
-      .respond(200, { /** return nothing */ })
-    $httpBackend.expectDELETE(url)
-    $httpBackend.flush()
+      .respond(200, { /** return nothing */ });
+    $httpBackend.expectDELETE(url);
+    $httpBackend.flush();
 
-    checkUnknownHttpRequests()
-  })
+    checkUnknownHttpRequests();
+  });
 
   function checkUnknownHttpRequests() {
-    $httpBackend.verifyNoOutstandingExpectation()
-    $httpBackend.verifyNoOutstandingRequest()
+    $httpBackend.verifyNoOutstandingExpectation();
+    $httpBackend.verifyNoOutstandingRequest();
   }
 
   function createMockNote(paragraphs) {
@@ -60,6 +60,6 @@ describe('JobManagerService', () => {
       noteId: 'NT01',
       noteName: 'TestNote01',
       noteType: 'normal',
-    }
+    };
   }
-})
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook-repository/notebook-repository.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook-repository/notebook-repository.controller.js b/zeppelin-web/src/app/notebook-repository/notebook-repository.controller.js
index 0f62bc0..d6d13b3 100644
--- a/zeppelin-web/src/app/notebook-repository/notebook-repository.controller.js
+++ b/zeppelin-web/src/app/notebook-repository/notebook-repository.controller.js
@@ -12,76 +12,76 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').controller('NotebookRepositoryCtrl', NotebookRepositoryCtrl)
+angular.module('zeppelinWebApp').controller('NotebookRepositoryCtrl', NotebookRepositoryCtrl);
 
 function NotebookRepositoryCtrl($http, baseUrlSrv, ngToast) {
-  'ngInject'
+  'ngInject';
 
-  let vm = this
-  vm.notebookRepos = []
-  vm.showDropdownSelected = showDropdownSelected
-  vm.saveNotebookRepo = saveNotebookRepo
+  let vm = this;
+  vm.notebookRepos = [];
+  vm.showDropdownSelected = showDropdownSelected;
+  vm.saveNotebookRepo = saveNotebookRepo;
 
-  _init()
+  _init();
 
   // Public functions
 
-  function saveNotebookRepo (valueform, repo, data) {
-    console.log('data %o', data)
+  function saveNotebookRepo(valueform, repo, data) {
+    console.log('data %o', data);
     $http.put(baseUrlSrv.getRestApiBase() + '/notebook-repositories', {
       'name': repo.className,
-      'settings': data
-    }).success(function (data) {
-      let index = _.findIndex(vm.notebookRepos, {'className': repo.className})
+      'settings': data,
+    }).success(function(data) {
+      let index = _.findIndex(vm.notebookRepos, {'className': repo.className});
       if (index >= 0) {
-        vm.notebookRepos[index] = data.body
-        console.log('repos %o, data %o', vm.notebookRepos, data.body)
+        vm.notebookRepos[index] = data.body;
+        console.log('repos %o, data %o', vm.notebookRepos, data.body);
       }
-      valueform.$show()
-    }).error(function () {
+      valueform.$show();
+    }).error(function() {
       ngToast.danger({
         content: 'We couldn\'t save that NotebookRepo\'s settings',
         verticalPosition: 'bottom',
-        timeout: '3000'
-      })
-      valueform.$show()
-    })
+        timeout: '3000',
+      });
+      valueform.$show();
+    });
 
-    return 'manual'
+    return 'manual';
   }
 
-  function showDropdownSelected (setting) {
-    let index = _.findIndex(setting.value, {'value': setting.selected})
+  function showDropdownSelected(setting) {
+    let index = _.findIndex(setting.value, {'value': setting.selected});
     if (index < 0) {
-      return 'No value'
+      return 'No value';
     } else {
-      return setting.value[index].name
+      return setting.value[index].name;
     }
   }
 
   // Private functions
 
-  function _getInterpreterSettings () {
+  function _getInterpreterSettings() {
     $http.get(baseUrlSrv.getRestApiBase() + '/notebook-repositories')
-      .success(function (data, status, headers, config) {
-        vm.notebookRepos = data.body
-        console.log('ya notebookRepos %o', vm.notebookRepos)
-      }).error(function (data, status, headers, config) {
+      .success(function(data, status, headers, config) {
+        vm.notebookRepos = data.body;
+        console.log('ya notebookRepos %o', vm.notebookRepos);
+      }).error(function(data, status, headers, config) {
         if (status === 401) {
           ngToast.danger({
             content: 'You don\'t have permission on this page',
             verticalPosition: 'bottom',
-            timeout: '3000'
-          })
-          setTimeout(function () {
-            window.location = baseUrlSrv.getBase()
-          }, 3000)
+            timeout: '3000',
+          });
+          setTimeout(function() {
+            window.location = baseUrlSrv.getBase();
+          }, 3000);
         }
-        console.log('Error %o %o', status, data.message)
-      })
+        console.log('Error %o %o', status, data.message);
+      });
   }
 
-  function _init () {
-    _getInterpreterSettings()
+  function _init() {
+    _getInterpreterSettings();
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/dropdown-input/dropdown-input.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/dropdown-input/dropdown-input.directive.js b/zeppelin-web/src/app/notebook/dropdown-input/dropdown-input.directive.js
index a64204a..0fe43f7 100644
--- a/zeppelin-web/src/app/notebook/dropdown-input/dropdown-input.directive.js
+++ b/zeppelin-web/src/app/notebook/dropdown-input/dropdown-input.directive.js
@@ -12,15 +12,15 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').directive('dropdownInput', dropdownInputDirective)
+angular.module('zeppelinWebApp').directive('dropdownInput', dropdownInputDirective);
 
 function dropdownInputDirective() {
   return {
     restrict: 'A',
-    link: function (scope, element) {
-      element.bind('click', function (event) {
-        event.stopPropagation()
-      })
-    }
-  }
+    link: function(scope, element) {
+      element.bind('click', function(event) {
+        event.stopPropagation();
+      });
+    },
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.js b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.js
index 40a70eb..1b1043e 100644
--- a/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.js
+++ b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.js
@@ -12,9 +12,9 @@
  * limitations under the License.
  */
 
-import './dynamic-forms.css'
+import './dynamic-forms.css';
 
-angular.module('zeppelinWebApp').directive('dynamicForms', DynamicFormDirective)
+angular.module('zeppelinWebApp').directive('dynamicForms', DynamicFormDirective);
 
 function DynamicFormDirective($templateRequest, $compile) {
   return {
@@ -27,36 +27,36 @@ function DynamicFormDirective($templateRequest, $compile) {
       forms: '=forms',
       params: '=params',
       action: '=action',
-      removeaction: '=removeaction'
+      removeaction: '=removeaction',
     },
 
-    link: function (scope, element, attrs, controller) {
-      scope.loadForm = this.loadForm
-      scope.toggleCheckbox = this.toggleCheckbox
-      $templateRequest('app/notebook/dynamic-forms/dynamic-forms.directive.html').then(function (formsHtml) {
-        let forms = angular.element(formsHtml)
-        element.append(forms)
-        $compile(forms)(scope)
-      })
+    link: function(scope, element, attrs, controller) {
+      scope.loadForm = this.loadForm;
+      scope.toggleCheckbox = this.toggleCheckbox;
+      $templateRequest('app/notebook/dynamic-forms/dynamic-forms.directive.html').then(function(formsHtml) {
+        let forms = angular.element(formsHtml);
+        element.append(forms);
+        $compile(forms)(scope);
+      });
     },
 
-    loadForm: function (formulaire, params) {
-      let value = formulaire.defaultValue
+    loadForm: function(formulaire, params) {
+      let value = formulaire.defaultValue;
       if (params[formulaire.name]) {
-        value = params[formulaire.name]
+        value = params[formulaire.name];
       }
 
-      params[formulaire.name] = value
+      params[formulaire.name] = value;
     },
 
-    toggleCheckbox: function (formulaire, option, params) {
-      let idx = params[formulaire.name].indexOf(option.value)
+    toggleCheckbox: function(formulaire, option, params) {
+      let idx = params[formulaire.name].indexOf(option.value);
       if (idx > -1) {
-        params[formulaire.name].splice(idx, 1)
+        params[formulaire.name].splice(idx, 1);
       } else {
-        params[formulaire.name].push(option.value)
+        params[formulaire.name].push(option.value);
       }
-    }
+    },
 
-  }
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/elastic-input/elastic-input.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/elastic-input/elastic-input.controller.js b/zeppelin-web/src/app/notebook/elastic-input/elastic-input.controller.js
index 507b2f6..c11f95b 100644
--- a/zeppelin-web/src/app/notebook/elastic-input/elastic-input.controller.js
+++ b/zeppelin-web/src/app/notebook/elastic-input/elastic-input.controller.js
@@ -12,10 +12,10 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').controller('ElasticInputCtrl', ElasticInputCtrl)
+angular.module('zeppelinWebApp').controller('ElasticInputCtrl', ElasticInputCtrl);
 
-function ElasticInputCtrl () {
-  let vm = this
-  vm.showEditor = false
-  vm.value = ''
+function ElasticInputCtrl() {
+  let vm = this;
+  vm.showEditor = false;
+  vm.value = '';
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/note-var-share.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/note-var-share.service.js b/zeppelin-web/src/app/notebook/note-var-share.service.js
index e79f389..a5975ce 100644
--- a/zeppelin-web/src/app/notebook/note-var-share.service.js
+++ b/zeppelin-web/src/app/notebook/note-var-share.service.js
@@ -12,28 +12,28 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').service('noteVarShareService', NoteVarShareService)
+angular.module('zeppelinWebApp').service('noteVarShareService', NoteVarShareService);
 
-function NoteVarShareService () {
-  'ngInject'
+function NoteVarShareService() {
+  'ngInject';
 
-  let store = {}
+  let store = {};
 
-  this.clear = function () {
-    store = {}
-  }
+  this.clear = function() {
+    store = {};
+  };
 
-  this.put = function (key, value) {
-    store[key] = value
-  }
+  this.put = function(key, value) {
+    store[key] = value;
+  };
 
-  this.get = function (key) {
-    return store[key]
-  }
+  this.get = function(key) {
+    return store[key];
+  };
 
-  this.del = function (key) {
-    let v = store[key]
-    delete store[key]
-    return v
-  }
+  this.del = function(key) {
+    let v = store[key];
+    delete store[key];
+    return v;
+  };
 }


[12/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
[ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Have added this PR to add a rule in eslinerc to have semicolons in javascript source

[Improvement | Refactoring]

* [ZEPPELIN-3245](https://issues.apache.org/jira/browse/ZEPPELIN-3245)

```
cd zeppelin-web
npm install (or yarn install if you have yarn)
npm run lint:once
```

Author: Prabhjyot Singh <pr...@gmail.com>

Closes #2804 from prabhjyotsingh/discuss/eslint_semi_rule and squashes the following commits:

4506f243e [Prabhjyot Singh] eslint rule for space
bc43d68a6 [Prabhjyot Singh] merge `[ZEPPELIN-3177]Resize charts on paragaph resize` changes
2d57ba30b [Prabhjyot Singh] fix failing WEB_E2E="true"
f23cb61d4 [Prabhjyot Singh] remove `"linebreak-style": 0,` and `"no-use-before-define": 0,`
39f37fb88 [Prabhjyot Singh] remove "standard" from eslint
6edac44f6 [Prabhjyot Singh] add `"semi": [2, "always"]` rule in eslinerc

Change-Id: I91546ea973c2c9e7540da1586d6329fc93088eb0


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

Branch: refs/heads/master
Commit: ea2c944742cea6e8e37e225d1acc67cdb195056e
Parents: f6ef64f
Author: Prabhjyot Singh <pr...@gmail.com>
Authored: Fri Feb 23 09:35:30 2018 +0530
Committer: Prabhjyot Singh <pr...@gmail.com>
Committed: Fri Feb 23 10:24:33 2018 +0530

----------------------------------------------------------------------
 .../org/apache/zeppelin/AbstractZeppelinIT.java |    2 +-
 zeppelin-web/.eslintrc                          |   24 +-
 zeppelin-web/src/app/app.controller.js          |   52 +-
 zeppelin-web/src/app/app.controller.test.js     |   44 +-
 zeppelin-web/src/app/app.js                     |  162 +-
 .../configuration/configuration.controller.js   |   42 +-
 .../src/app/configuration/configuration.test.js |   92 +-
 .../src/app/credential/credential.controller.js |  236 +-
 .../src/app/credential/credential.test.js       |  132 +-
 zeppelin-web/src/app/helium/helium-conf.js      |   96 +-
 zeppelin-web/src/app/helium/helium-package.js   |   32 +-
 zeppelin-web/src/app/helium/helium-type.js      |    2 +-
 .../src/app/helium/helium.controller.js         |  424 ++--
 zeppelin-web/src/app/helium/helium.service.js   |  334 +--
 zeppelin-web/src/app/helium/index.js            |    4 +-
 zeppelin-web/src/app/home/home.controller.js    |  188 +-
 .../interpreter/interpreter-item.directive.js   |   20 +-
 .../app/interpreter/interpreter.controller.js   |  838 +++----
 .../src/app/interpreter/interpreter.filter.js   |   12 +-
 .../widget/number-widget.directive.js           |   20 +-
 zeppelin-web/src/app/jobmanager/job-status.js   |   26 +-
 .../src/app/jobmanager/job/job.component.js     |  118 +-
 .../app/jobmanager/job/job.component.test.js    |   70 +-
 .../src/app/jobmanager/jobmanager.component.js  |  177 +-
 .../app/jobmanager/jobmanager.component.test.js |   34 +-
 .../src/app/jobmanager/jobmanager.filter.js     |   38 +-
 .../src/app/jobmanager/jobmanager.service.js    |   46 +-
 .../app/jobmanager/jobmanager.service.test.js   |   66 +-
 .../notebook-repository.controller.js           |   78 +-
 .../dropdown-input/dropdown-input.directive.js  |   14 +-
 .../dynamic-forms/dynamic-forms.directive.js    |   42 +-
 .../elastic-input/elastic-input.controller.js   |   10 +-
 .../src/app/notebook/note-var-share.service.js  |   36 +-
 .../src/app/notebook/notebook.controller.js     | 1590 ++++++------
 .../app/notebook/notebook.controller.test.js    |  240 +-
 .../notebook/paragraph/clipboard.controller.js  |   36 +-
 .../code-editor/code-editor.directive.js        |   24 +-
 .../notebook/paragraph/paragraph.controller.js  | 1824 +++++++-------
 .../paragraph/paragraph.controller.test.js      |   68 +-
 .../app/notebook/paragraph/paragraph.status.js  |   16 +-
 .../notebook/paragraph/resizable.directive.js   |   66 +-
 .../paragraph/result/result.controller.js       | 1118 ++++-----
 .../revisions-comparator.component.js           |  162 +-
 .../notebook/save-as/browser-detect.service.js  |   26 +-
 .../src/app/notebook/save-as/save-as.service.js |   60 +-
 .../src/app/search/result-list.controller.js    |  134 +-
 zeppelin-web/src/app/search/search.service.js   |   24 +-
 zeppelin-web/src/app/spell/index.js             |    4 +-
 zeppelin-web/src/app/spell/spell-base.js        |   14 +-
 zeppelin-web/src/app/spell/spell-result.js      |  182 +-
 .../tabledata/advanced-transformation-util.js   | 1010 ++++----
 .../advanced-transformation-util.test.js        | 2288 +++++++++---------
 .../app/tabledata/advanced-transformation.js    |  202 +-
 .../src/app/tabledata/columnselector.js         |   54 +-
 zeppelin-web/src/app/tabledata/dataset.js       |    6 +-
 .../src/app/tabledata/datasetfactory.js         |   12 +-
 .../src/app/tabledata/datasetfactory.test.js    |   46 +-
 zeppelin-web/src/app/tabledata/network.js       |   22 +-
 zeppelin-web/src/app/tabledata/networkdata.js   |   76 +-
 .../src/app/tabledata/networkdata.test.js       |   72 +-
 zeppelin-web/src/app/tabledata/passthrough.js   |   10 +-
 zeppelin-web/src/app/tabledata/pivot.js         |  240 +-
 zeppelin-web/src/app/tabledata/tabledata.js     |   64 +-
 .../src/app/tabledata/tabledata.test.js         |  132 +-
 .../src/app/tabledata/transformation.js         |   68 +-
 .../builtins/visualization-areachart.js         |  144 +-
 .../builtins/visualization-barchart.js          |  122 +-
 .../builtins/visualization-d3network.js         |  256 +-
 .../builtins/visualization-linechart.js         |  162 +-
 .../builtins/visualization-nvd3chart.js         |  242 +-
 .../builtins/visualization-piechart.js          |   66 +-
 .../builtins/visualization-scatterchart.js      |  326 +--
 .../builtins/visualization-table.js             |  318 +--
 .../builtins/visualization-util.js              |  146 +-
 .../src/app/visualization/visualization.js      |  108 +-
 .../array-ordering/array-ordering.service.js    |   44 +-
 .../src/components/base-url/base-url.service.js |   40 +-
 .../src/components/login/login.controller.js    |   88 +-
 .../expand-collapse.directive.js                |   30 +-
 .../src/components/navbar/navbar.controller.js  |  258 +-
 .../components/navbar/navbar.controller.test.js |   28 +-
 .../components/ng-enter/ng-enter.directive.js   |   18 +-
 .../ng-enter/ng-enter.directive.test.js         |   26 +-
 .../components/ng-escape/ng-escape.directive.js |   18 +-
 .../note-action/note-action.service.js          |  144 +-
 .../note-create/note-create.controller.js       |  120 +-
 .../note-create/note-create.controller.test.js  |   54 +-
 .../components/note-create/visible.directive.js |   40 +-
 .../note-import/note-import.controller.js       |  176 +-
 .../components/note-list/note-list.factory.js   |   62 +-
 .../note-list/note-list.factory.test.js         |  122 +-
 .../note-rename/note-rename.controller.js       |   44 +-
 .../note-rename/note-rename.service.js          |   12 +-
 .../websocket/websocket-event.factory.js        |  204 +-
 .../websocket/websocket-message.service.js      |  292 +--
 zeppelin-web/src/index.js                       |  118 +-
 96 files changed, 8777 insertions(+), 8452 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-integration/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java
----------------------------------------------------------------------
diff --git a/zeppelin-integration/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java b/zeppelin-integration/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java
index b4ebfe9..e1992fb 100644
--- a/zeppelin-integration/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java
+++ b/zeppelin-integration/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java
@@ -110,7 +110,7 @@ abstract public class AbstractZeppelinIT {
     WebDriverWait block = new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC);
     block.until(ExpectedConditions.visibilityOfElementLocated(By.id("noteCreateModal")));
     clickAndWait(By.id("createNoteButton"));
-    block.until(ExpectedConditions.invisibilityOfElementLocated(By.className("pull-right")));
+    block.until(ExpectedConditions.invisibilityOfElementLocated(By.id("createNoteButton")));
   }
 
   protected void deleteTestNotebook(final WebDriver driver) {

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/.eslintrc
----------------------------------------------------------------------
diff --git a/zeppelin-web/.eslintrc b/zeppelin-web/.eslintrc
index 6dca5c8..6207bb9 100644
--- a/zeppelin-web/.eslintrc
+++ b/zeppelin-web/.eslintrc
@@ -1,5 +1,5 @@
 {
-  "extends": ["eslint:recommended", "google", "standard"],
+  "extends": ["eslint:recommended", "google"],
   "env": {
     "browser": true,
     "jasmine": true,
@@ -31,26 +31,11 @@
     "process": false
   },
   "rules": {
-    "array-bracket-spacing": 0,
-    "space-before-function-paren": 0,
-    "no-unneeded-ternary": 0,
-    "comma-dangle": 0,
-    "object-curly-spacing": 0,
-    "standard/object-curly-even-spacing": 0,
-    "arrow-parens": 0,
-    "require-jsdoc": 0,
-    "valid-jsdoc": 0,
-    "no-invalid-this": 0,
-    "no-console": 0,
-    "guard-for-in": 0,
-    "no-mixed-operators": 1,
-    "no-useless-escape": 1,
     "no-bitwise": 2,
     "camelcase": 2,
     "curly": 2,
     "eqeqeq": 2,
     "wrap-iife": [2, "any"],
-    "no-use-before-define": 0,
     "new-cap": 2,
     "no-caller": 2,
     "quotes": [2, "single"],
@@ -59,6 +44,11 @@
     "no-unused-vars": [2, { "vars": "local", "args": "none" }],
     "strict": [2, "global"],
     "max-len": [2, {"code": 120, "ignoreComments": true, "ignoreRegExpLiterals": true}],
-	"linebreak-style": 0
+    "require-jsdoc": "off",
+    "no-console": ["off"],
+    "valid-jsdoc": "off",
+    "semi": [2, "always"],
+    "no-invalid-this": 1,
+    "indent": ["error", 2, { "SwitchCase": 1 }]
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/app.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/app.controller.js b/zeppelin-web/src/app/app.controller.js
index 6c64a33..904fbd7 100644
--- a/zeppelin-web/src/app/app.controller.js
+++ b/zeppelin-web/src/app/app.controller.js
@@ -12,48 +12,48 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').controller('MainCtrl', MainCtrl)
+angular.module('zeppelinWebApp').controller('MainCtrl', MainCtrl);
 
-function MainCtrl ($scope, $rootScope, $window, arrayOrderingSrv) {
-  'ngInject'
+function MainCtrl($scope, $rootScope, $window, arrayOrderingSrv) {
+  'ngInject';
 
-  $scope.looknfeel = 'default'
+  $scope.looknfeel = 'default';
 
-  let init = function () {
-    $scope.asIframe = (($window.location.href.indexOf('asIframe') > -1) ? true : false)
-  }
+  let init = function() {
+    $scope.asIframe = (($window.location.href.indexOf('asIframe') > -1) ? true : false);
+  };
 
-  init()
+  init();
 
-  $rootScope.$on('setIframe', function (event, data) {
+  $rootScope.$on('setIframe', function(event, data) {
     if (!event.defaultPrevented) {
-      $scope.asIframe = data
-      event.preventDefault()
+      $scope.asIframe = data;
+      event.preventDefault();
     }
-  })
+  });
 
-  $rootScope.$on('setLookAndFeel', function (event, data) {
+  $rootScope.$on('setLookAndFeel', function(event, data) {
     if (!event.defaultPrevented && data && data !== '' && data !== $scope.looknfeel) {
-      $scope.looknfeel = data
-      event.preventDefault()
+      $scope.looknfeel = data;
+      event.preventDefault();
     }
-  })
+  });
 
   // Set The lookAndFeel to default on every page
-  $rootScope.$on('$routeChangeStart', function (event, next, current) {
-    $rootScope.$broadcast('setLookAndFeel', 'default')
-  })
+  $rootScope.$on('$routeChangeStart', function(event, next, current) {
+    $rootScope.$broadcast('setLookAndFeel', 'default');
+  });
 
-  $rootScope.noteName = function (note) {
+  $rootScope.noteName = function(note) {
     if (!_.isEmpty(note)) {
-      return arrayOrderingSrv.getNoteName(note)
+      return arrayOrderingSrv.getNoteName(note);
     }
-  }
+  };
 
-  BootstrapDialog.defaultOptions.onshown = function () {
-    angular.element('#' + this.id).find('.btn:last').focus()
-  }
+  BootstrapDialog.defaultOptions.onshown = function() {
+    angular.element('#' + this.id).find('.btn:last').focus();
+  };
 
   // Remove BootstrapDialog animation
-  BootstrapDialog.configDefaultOptions({animate: false})
+  BootstrapDialog.configDefaultOptions({animate: false});
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/app.controller.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/app.controller.test.js b/zeppelin-web/src/app/app.controller.test.js
index 67d5034..b6c6261 100644
--- a/zeppelin-web/src/app/app.controller.test.js
+++ b/zeppelin-web/src/app/app.controller.test.js
@@ -1,28 +1,28 @@
-describe('Controller: MainCtrl', function () {
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+describe('Controller: MainCtrl', function() {
+  beforeEach(angular.mock.module('zeppelinWebApp'));
 
-  let scope
-  let rootScope
+  let scope;
+  let rootScope;
 
-  beforeEach(inject(function ($controller, $rootScope) {
-    rootScope = $rootScope
-    scope = $rootScope.$new()
+  beforeEach(inject(function($controller, $rootScope) {
+    rootScope = $rootScope;
+    scope = $rootScope.$new();
     $controller('MainCtrl', {
-      $scope: scope
-    })
-  }))
+      $scope: scope,
+    });
+  }));
 
-  it('should attach "asIframe" to the scope and the default value should be false', function () {
-    expect(scope.asIframe).toBeDefined()
-    expect(scope.asIframe).toEqual(false)
-  })
+  it('should attach "asIframe" to the scope and the default value should be false', function() {
+    expect(scope.asIframe).toBeDefined();
+    expect(scope.asIframe).toEqual(false);
+  });
 
-  it('should set the default value of "looknfeel to "default"', function () {
-    expect(scope.looknfeel).toEqual('default')
-  })
+  it('should set the default value of "looknfeel to "default"', function() {
+    expect(scope.looknfeel).toEqual('default');
+  });
 
-  it('should set "asIframe" flag to true when a controller broadcasts setIframe event', function () {
-    rootScope.$broadcast('setIframe', true)
-    expect(scope.asIframe).toEqual(true)
-  })
-})
+  it('should set "asIframe" flag to true when a controller broadcasts setIframe event', function() {
+    rootScope.$broadcast('setIframe', true);
+    expect(scope.asIframe).toEqual(true);
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/app.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/app.js b/zeppelin-web/src/app/app.js
index ed89dd8..64ceff0 100644
--- a/zeppelin-web/src/app/app.js
+++ b/zeppelin-web/src/app/app.js
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-import 'headroom.js'
-import 'headroom.js/dist/angular.headroom'
+import 'headroom.js';
+import 'headroom.js/dist/angular.headroom';
 
-import 'scrollmonitor/scrollMonitor.js'
-import 'angular-viewport-watch/angular-viewport-watch.js'
+import 'scrollmonitor/scrollMonitor.js';
+import 'angular-viewport-watch/angular-viewport-watch.js';
 
-import 'angular-ui-grid/ui-grid.css'
-import 'angular-ui-grid'
+import 'angular-ui-grid/ui-grid.css';
+import 'angular-ui-grid';
 
 const requiredModules = [
   'ngCookies',
@@ -56,167 +56,169 @@ const requiredModules = [
   'ui.grid.moveColumns',
   'ui.grid.pagination',
   'ui.grid.saveState',
-]
+];
 
 // headroom should not be used for CI, since we have to execute some integration tests.
 // otherwise, they will fail.
-if (!process.env.BUILD_CI) { requiredModules.push('headroom') }
+if (!process.env.BUILD_CI) {
+  requiredModules.push('headroom');
+}
 
 let zeppelinWebApp = angular.module('zeppelinWebApp', requiredModules)
-  .filter('breakFilter', function () {
-    return function (text) {
+  .filter('breakFilter', function() {
+    return function(text) {
       // eslint-disable-next-line no-extra-boolean-cast
       if (!!text) {
-        return text.replace(/\n/g, '<br />')
+        return text.replace(/\n/g, '<br />');
       }
-    }
+    };
   })
-  .config(function ($httpProvider, $routeProvider, ngToastProvider) {
+  .config(function($httpProvider, $routeProvider, ngToastProvider) {
     // withCredentials when running locally via grunt
-    $httpProvider.defaults.withCredentials = true
+    $httpProvider.defaults.withCredentials = true;
 
     let visBundleLoad = {
-      load: ['heliumService', function (heliumService) {
-        return heliumService.load
-      }]
-    }
+      load: ['heliumService', function(heliumService) {
+        return heliumService.load;
+      }],
+    };
 
     $routeProvider
       .when('/', {
-        templateUrl: 'app/home/home.html'
+        templateUrl: 'app/home/home.html',
       })
       .when('/notebook/:noteId', {
         templateUrl: 'app/notebook/notebook.html',
         controller: 'NotebookCtrl',
-        resolve: visBundleLoad
+        resolve: visBundleLoad,
       })
       .when('/notebook/:noteId/paragraph?=:paragraphId', {
         templateUrl: 'app/notebook/notebook.html',
         controller: 'NotebookCtrl',
-        resolve: visBundleLoad
+        resolve: visBundleLoad,
       })
       .when('/notebook/:noteId/paragraph/:paragraphId?', {
         templateUrl: 'app/notebook/notebook.html',
         controller: 'NotebookCtrl',
-        resolve: visBundleLoad
+        resolve: visBundleLoad,
       })
       .when('/notebook/:noteId/revision/:revisionId', {
         templateUrl: 'app/notebook/notebook.html',
         controller: 'NotebookCtrl',
-        resolve: visBundleLoad
+        resolve: visBundleLoad,
       })
       .when('/jobmanager', {
         templateUrl: 'app/jobmanager/jobmanager.html',
-        controller: 'JobManagerCtrl'
+        controller: 'JobManagerCtrl',
       })
       .when('/interpreter', {
         templateUrl: 'app/interpreter/interpreter.html',
-        controller: 'InterpreterCtrl'
+        controller: 'InterpreterCtrl',
       })
       .when('/notebookRepos', {
         templateUrl: 'app/notebook-repository/notebook-repository.html',
         controller: 'NotebookRepositoryCtrl',
-        controllerAs: 'noterepo'
+        controllerAs: 'noterepo',
       })
       .when('/credential', {
         templateUrl: 'app/credential/credential.html',
-        controller: 'CredentialCtrl'
+        controller: 'CredentialCtrl',
       })
       .when('/helium', {
         templateUrl: 'app/helium/helium.html',
-        controller: 'HeliumCtrl'
+        controller: 'HeliumCtrl',
       })
       .when('/configuration', {
         templateUrl: 'app/configuration/configuration.html',
-        controller: 'ConfigurationCtrl'
+        controller: 'ConfigurationCtrl',
       })
       .when('/search/:searchTerm', {
         templateUrl: 'app/search/result-list.html',
-        controller: 'SearchResultCtrl'
+        controller: 'SearchResultCtrl',
       })
       .otherwise({
-        redirectTo: '/'
-      })
+        redirectTo: '/',
+      });
 
     ngToastProvider.configure({
       dismissButton: true,
       dismissOnClick: false,
       combineDuplications: true,
-      timeout: 6000
-    })
+      timeout: 6000,
+    });
   })
 
   // handel logout on API failure
-    .config(function ($httpProvider, $provide) {
+    .config(function($httpProvider, $provide) {
       if (process.env.PROD) {
-        $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'
+        $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
       }
-      $provide.factory('httpInterceptor', function ($q, $rootScope) {
+      $provide.factory('httpInterceptor', function($q, $rootScope) {
         return {
-          'responseError': function (rejection) {
+          'responseError': function(rejection) {
             if (rejection.status === 405) {
-              let data = {}
-              data.info = ''
-              $rootScope.$broadcast('session_logout', data)
+              let data = {};
+              data.info = '';
+              $rootScope.$broadcast('session_logout', data);
             }
-            $rootScope.$broadcast('httpResponseError', rejection)
-            return $q.reject(rejection)
-          }
-        }
-      })
-      $httpProvider.interceptors.push('httpInterceptor')
+            $rootScope.$broadcast('httpResponseError', rejection);
+            return $q.reject(rejection);
+          },
+        };
+      });
+      $httpProvider.interceptors.push('httpInterceptor');
     })
-  .constant('TRASH_FOLDER_ID', '~Trash')
+  .constant('TRASH_FOLDER_ID', '~Trash');
 
-function auth () {
-  let $http = angular.injector(['ng']).get('$http')
-  let baseUrlSrv = angular.injector(['zeppelinWebApp']).get('baseUrlSrv')
+function auth() {
+  let $http = angular.injector(['ng']).get('$http');
+  let baseUrlSrv = angular.injector(['zeppelinWebApp']).get('baseUrlSrv');
   // withCredentials when running locally via grunt
-  $http.defaults.withCredentials = true
+  $http.defaults.withCredentials = true;
   jQuery.ajaxSetup({
     dataType: 'json',
     xhrFields: {
-      withCredentials: true
+      withCredentials: true,
     },
-    crossDomain: true
-  })
-  let config = (process.env.PROD) ? {headers: { 'X-Requested-With': 'XMLHttpRequest' }} : {}
-  return $http.get(baseUrlSrv.getRestApiBase() + '/security/ticket', config).then(function (response) {
-    zeppelinWebApp.run(function ($rootScope) {
-      let res = angular.fromJson(response.data).body
+    crossDomain: true,
+  });
+  let config = (process.env.PROD) ? {headers: {'X-Requested-With': 'XMLHttpRequest'}} : {};
+  return $http.get(baseUrlSrv.getRestApiBase() + '/security/ticket', config).then(function(response) {
+    zeppelinWebApp.run(function($rootScope) {
+      let res = angular.fromJson(response.data).body;
       if (res['redirectURL']) {
-        window.location.href = res['redirectURL'] + window.location.href
+        window.location.href = res['redirectURL'] + window.location.href;
       } else {
-        $rootScope.ticket = res
-        $rootScope.ticket.screenUsername = $rootScope.ticket.principal
+        $rootScope.ticket = res;
+        $rootScope.ticket.screenUsername = $rootScope.ticket.principal;
         if ($rootScope.ticket.principal.indexOf('#Pac4j') === 0) {
-          let re = ', name=(.*?),'
-          $rootScope.ticket.screenUsername = $rootScope.ticket.principal.match(re)[1]
+          let re = ', name=(.*?),';
+          $rootScope.ticket.screenUsername = $rootScope.ticket.principal.match(re)[1];
         }
       }
-    })
-  }, function (errorResponse) {
+    });
+  }, function(errorResponse) {
     // Handle error case
-    let redirect = errorResponse.headers('Location')
+    let redirect = errorResponse.headers('Location');
     if (errorResponse.status === 401 && redirect !== undefined) {
       // Handle page redirect
-      window.location.href = redirect
+      window.location.href = redirect;
     }
-  })
+  });
 }
 
-function bootstrapApplication () {
-  zeppelinWebApp.run(function ($rootScope, $location) {
-    $rootScope.$on('$routeChangeStart', function (event, next, current) {
-      $rootScope.pageTitle = 'Zeppelin'
+function bootstrapApplication() {
+  zeppelinWebApp.run(function($rootScope, $location) {
+    $rootScope.$on('$routeChangeStart', function(event, next, current) {
+      $rootScope.pageTitle = 'Zeppelin';
       if (!$rootScope.ticket && next.$$route && !next.$$route.publicAccess) {
-        $location.path('/')
+        $location.path('/');
       }
-    })
-  })
-  angular.bootstrap(document, ['zeppelinWebApp'])
+    });
+  });
+  angular.bootstrap(document, ['zeppelinWebApp']);
 }
 
-angular.element(document).ready(function () {
-  auth().then(bootstrapApplication)
-})
+angular.element(document).ready(function() {
+  auth().then(bootstrapApplication);
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/configuration/configuration.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/configuration/configuration.controller.js b/zeppelin-web/src/app/configuration/configuration.controller.js
index 0d845de..0f5eba3 100644
--- a/zeppelin-web/src/app/configuration/configuration.controller.js
+++ b/zeppelin-web/src/app/configuration/configuration.controller.js
@@ -12,37 +12,37 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').controller('ConfigurationCtrl', ConfigurationCtrl)
+angular.module('zeppelinWebApp').controller('ConfigurationCtrl', ConfigurationCtrl);
 
-function ConfigurationCtrl ($scope, $http, baseUrlSrv, ngToast) {
-  'ngInject'
+function ConfigurationCtrl($scope, $http, baseUrlSrv, ngToast) {
+  'ngInject';
 
-  $scope.configrations = []
-  ngToast.dismiss()
+  $scope.configrations = [];
+  ngToast.dismiss();
 
-  let getConfigurations = function () {
+  let getConfigurations = function() {
     $http.get(baseUrlSrv.getRestApiBase() + '/configurations/all')
-    .success(function (data, status, headers, config) {
-      $scope.configurations = data.body
+    .success(function(data, status, headers, config) {
+      $scope.configurations = data.body;
     })
-    .error(function (data, status, headers, config) {
+    .error(function(data, status, headers, config) {
       if (status === 401) {
         ngToast.danger({
           content: 'You don\'t have permission on this page',
           verticalPosition: 'bottom',
-          timeout: '3000'
-        })
-        setTimeout(function () {
-          window.location = baseUrlSrv.getBase()
-        }, 3000)
+          timeout: '3000',
+        });
+        setTimeout(function() {
+          window.location = baseUrlSrv.getBase();
+        }, 3000);
       }
-      console.log('Error %o %o', status, data.message)
-    })
-  }
+      console.log('Error %o %o', status, data.message);
+    });
+  };
 
-  let init = function () {
-    getConfigurations()
-  }
+  let init = function() {
+    getConfigurations();
+  };
 
-  init()
+  init();
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/configuration/configuration.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/configuration/configuration.test.js b/zeppelin-web/src/app/configuration/configuration.test.js
index 8add102..4d98a08 100644
--- a/zeppelin-web/src/app/configuration/configuration.test.js
+++ b/zeppelin-web/src/app/configuration/configuration.test.js
@@ -1,69 +1,69 @@
-import template from './configuration.html'
+import template from './configuration.html';
 
-describe('Controller: Configuration', function () {
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+describe('Controller: Configuration', function() {
+  beforeEach(angular.mock.module('zeppelinWebApp'));
 
-  let baseUrlSrvMock = { getRestApiBase: () => '' }
+  let baseUrlSrvMock = {getRestApiBase: () => ''};
 
-  let ctrl // controller instance
-  let $scope
-  let $compile
-  let $controller // controller generator
-  let $httpBackend
-  let ngToast
+  let ctrl; // controller instance
+  let $scope;
+  let $compile;
+  let $controller; // controller generator
+  let $httpBackend;
+  let ngToast;
 
   beforeEach(inject((_$controller_, _$rootScope_, _$compile_, _$httpBackend_, _ngToast_) => {
-    $scope = _$rootScope_.$new()
-    $compile = _$compile_
-    $controller = _$controller_
-    $httpBackend = _$httpBackend_
-    ngToast = _ngToast_
-  }))
+    $scope = _$rootScope_.$new();
+    $compile = _$compile_;
+    $controller = _$controller_;
+    $httpBackend = _$httpBackend_;
+    ngToast = _ngToast_;
+  }));
 
-  afterEach(function () {
-    $httpBackend.verifyNoOutstandingExpectation()
-    $httpBackend.verifyNoOutstandingRequest()
-  })
+  afterEach(function() {
+    $httpBackend.verifyNoOutstandingExpectation();
+    $httpBackend.verifyNoOutstandingRequest();
+  });
 
   it('should get configuration initially', () => {
-    const conf = { 'conf1': 'value1' }
-    ctrl = $controller('ConfigurationCtrl', { $scope: $scope, baseUrlSrv: baseUrlSrvMock, })
-    expect(ctrl).toBeDefined()
+    const conf = {'conf1': 'value1'};
+    ctrl = $controller('ConfigurationCtrl', {$scope: $scope, baseUrlSrv: baseUrlSrvMock});
+    expect(ctrl).toBeDefined();
 
     $httpBackend
       .when('GET', '/configurations/all')
-      .respond(200, { body: conf, })
-    $httpBackend.expectGET('/configurations/all')
-    $httpBackend.flush()
+      .respond(200, {body: conf});
+    $httpBackend.expectGET('/configurations/all');
+    $httpBackend.flush();
 
-    expect($scope.configurations).toEqual(conf) // scope is updated after $httpBackend.flush()
-  })
+    expect($scope.configurations).toEqual(conf); // scope is updated after $httpBackend.flush()
+  });
 
   it('should display ngToast when failed to get configuration properly', () => {
-    ctrl = $controller('ConfigurationCtrl', { $scope: $scope, baseUrlSrv: baseUrlSrvMock, })
-    spyOn(ngToast, 'danger')
+    ctrl = $controller('ConfigurationCtrl', {$scope: $scope, baseUrlSrv: baseUrlSrvMock});
+    spyOn(ngToast, 'danger');
 
-    $httpBackend.when('GET', '/configurations/all').respond(401, {})
-    $httpBackend.expectGET('/configurations/all')
-    $httpBackend.flush()
+    $httpBackend.when('GET', '/configurations/all').respond(401, {});
+    $httpBackend.expectGET('/configurations/all');
+    $httpBackend.flush();
 
-    expect(ngToast.danger).toHaveBeenCalled()
-  })
+    expect(ngToast.danger).toHaveBeenCalled();
+  });
 
   it('should render list of configurations as the sorted order', () => {
     $scope.configurations = {
       'zeppelin.server.port': '8080',
       'zeppelin.server.addr': '0.0.0.0',
-    }
-    const elem = $compile(template)($scope)
-    $scope.$digest()
-    const tbody = elem.find('tbody')
-    const tds = tbody.find('td')
+    };
+    const elem = $compile(template)($scope);
+    $scope.$digest();
+    const tbody = elem.find('tbody');
+    const tds = tbody.find('td');
 
     // should be sorted
-    expect(tds[0].innerText.trim()).toBe('zeppelin.server.addr')
-    expect(tds[1].innerText.trim()).toBe('0.0.0.0')
-    expect(tds[2].innerText.trim()).toBe('zeppelin.server.port')
-    expect(tds[3].innerText.trim()).toBe('8080')
-  })
-})
+    expect(tds[0].innerText.trim()).toBe('zeppelin.server.addr');
+    expect(tds[1].innerText.trim()).toBe('0.0.0.0');
+    expect(tds[2].innerText.trim()).toBe('zeppelin.server.port');
+    expect(tds[3].innerText.trim()).toBe('8080');
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/credential/credential.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/credential/credential.controller.js b/zeppelin-web/src/app/credential/credential.controller.js
index 102876e..cf6c340 100644
--- a/zeppelin-web/src/app/credential/credential.controller.js
+++ b/zeppelin-web/src/app/credential/credential.controller.js
@@ -12,194 +12,196 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').controller('CredentialCtrl', CredentialController)
+angular.module('zeppelinWebApp').controller('CredentialCtrl', CredentialController);
 
 function CredentialController($scope, $http, baseUrlSrv, ngToast) {
-  'ngInject'
+  'ngInject';
 
-  ngToast.dismiss()
+  ngToast.dismiss();
 
-  $scope.credentialInfo = []
-  $scope.showAddNewCredentialInfo = false
-  $scope.availableInterpreters = []
+  $scope.credentialInfo = [];
+  $scope.showAddNewCredentialInfo = false;
+  $scope.availableInterpreters = [];
 
-  $scope.entity = ''
-  $scope.password = ''
-  $scope.username = ''
+  $scope.entity = '';
+  $scope.password = '';
+  $scope.username = '';
 
   $scope.hasCredential = () => {
-    return Array.isArray($scope.credentialInfo) && $scope.credentialInfo.length
-  }
+    return Array.isArray($scope.credentialInfo) && $scope.credentialInfo.length;
+  };
 
-  let getCredentialInfo = function () {
+  let getCredentialInfo = function() {
     $http.get(baseUrlSrv.getRestApiBase() + '/credential')
-      .success(function (data, status, headers, config) {
-        $scope.credentialInfo.length = 0 // keep the ref while cleaning
-        const returnedCredentials = data.body.userCredentials
+      .success(function(data, status, headers, config) {
+        $scope.credentialInfo.length = 0; // keep the ref while cleaning
+        const returnedCredentials = data.body.userCredentials;
 
         for (let key in returnedCredentials) {
-          const value = returnedCredentials[key]
-          $scope.credentialInfo.push({
-            entity: key,
-            password: value.password,
-            username: value.username,
-          })
+          if (returnedCredentials.hasOwnProperty(key)) {
+            const value = returnedCredentials[key];
+            $scope.credentialInfo.push({
+              entity: key,
+              password: value.password,
+              username: value.username,
+            });
+          }
         }
 
-        console.log('Success %o %o', status, $scope.credentialInfo)
+        console.log('Success %o %o', status, $scope.credentialInfo);
       })
-      .error(function (data, status, headers, config) {
+      .error(function(data, status, headers, config) {
         if (status === 401) {
-          showToast('You do not have permission on this page', 'danger')
-          setTimeout(function () {
-            window.location = baseUrlSrv.getBase()
-          }, 3000)
+          showToast('You do not have permission on this page', 'danger');
+          setTimeout(function() {
+            window.location = baseUrlSrv.getBase();
+          }, 3000);
         }
-        console.log('Error %o %o', status, data.message)
-      })
-  }
+        console.log('Error %o %o', status, data.message);
+      });
+  };
 
   $scope.isValidCredential = function() {
-    return $scope.entity.trim() !== '' && $scope.username.trim() !== ''
-  }
+    return $scope.entity.trim() !== '' && $scope.username.trim() !== '';
+  };
 
-  $scope.addNewCredentialInfo = function () {
+  $scope.addNewCredentialInfo = function() {
     if (!$scope.isValidCredential()) {
-      showToast('Username \\ Entity can not be empty.', 'danger')
-      return
+      showToast('Username \\ Entity can not be empty.', 'danger');
+      return;
     }
 
     let newCredential = {
       'entity': $scope.entity,
       'username': $scope.username,
-      'password': $scope.password
-    }
+      'password': $scope.password,
+    };
 
     $http.put(baseUrlSrv.getRestApiBase() + '/credential', newCredential)
-      .success(function (data, status, headers, config) {
-        showToast('Successfully saved credentials.', 'success')
-        $scope.credentialInfo.push(newCredential)
-        resetCredentialInfo()
-        $scope.showAddNewCredentialInfo = false
-        console.log('Success %o %o', status, data.message)
+      .success(function(data, status, headers, config) {
+        showToast('Successfully saved credentials.', 'success');
+        $scope.credentialInfo.push(newCredential);
+        resetCredentialInfo();
+        $scope.showAddNewCredentialInfo = false;
+        console.log('Success %o %o', status, data.message);
       })
-      .error(function (data, status, headers, config) {
-        showToast('Error saving credentials', 'danger')
-        console.log('Error %o %o', status, data.message)
-      })
-  }
+      .error(function(data, status, headers, config) {
+        showToast('Error saving credentials', 'danger');
+        console.log('Error %o %o', status, data.message);
+      });
+  };
 
-  let getAvailableInterpreters = function () {
+  let getAvailableInterpreters = function() {
     $http.get(baseUrlSrv.getRestApiBase() + '/interpreter/setting')
-      .success(function (data, status, headers, config) {
+      .success(function(data, status, headers, config) {
         for (let setting = 0; setting < data.body.length; setting++) {
           $scope.availableInterpreters.push(
-            data.body[setting].group + '.' + data.body[setting].name)
+            data.body[setting].group + '.' + data.body[setting].name);
         }
         angular.element('#entityname').autocomplete({
           source: $scope.availableInterpreters,
-          select: function (event, selected) {
-            $scope.entity = selected.item.value
-            return false
-          }
-        })
+          select: function(event, selected) {
+            $scope.entity = selected.item.value;
+            return false;
+          },
+        });
       })
-      .error(function (data, status, headers, config) {
-        showToast(data.message, 'danger')
-        console.log('Error %o %o', status, data.message)
-      })
-  }
+      .error(function(data, status, headers, config) {
+        showToast(data.message, 'danger');
+        console.log('Error %o %o', status, data.message);
+      });
+  };
 
-  $scope.toggleAddNewCredentialInfo = function () {
+  $scope.toggleAddNewCredentialInfo = function() {
     if ($scope.showAddNewCredentialInfo) {
-      $scope.showAddNewCredentialInfo = false
+      $scope.showAddNewCredentialInfo = false;
     } else {
-      $scope.showAddNewCredentialInfo = true
+      $scope.showAddNewCredentialInfo = true;
     }
-  }
+  };
 
-  $scope.cancelCredentialInfo = function () {
-    $scope.showAddNewCredentialInfo = false
-    resetCredentialInfo()
-  }
+  $scope.cancelCredentialInfo = function() {
+    $scope.showAddNewCredentialInfo = false;
+    resetCredentialInfo();
+  };
 
-  const resetCredentialInfo = function () {
-    $scope.entity = ''
-    $scope.username = ''
-    $scope.password = ''
-  }
+  const resetCredentialInfo = function() {
+    $scope.entity = '';
+    $scope.username = '';
+    $scope.password = '';
+  };
 
-  $scope.copyOriginCredentialsInfo = function () {
-    showToast('Since entity is a unique key, you can edit only username & password', 'info')
-  }
+  $scope.copyOriginCredentialsInfo = function() {
+    showToast('Since entity is a unique key, you can edit only username & password', 'info');
+  };
 
-  $scope.updateCredentialInfo = function (form, data, entity) {
+  $scope.updateCredentialInfo = function(form, data, entity) {
     if (!$scope.isValidCredential()) {
-      showToast('Username \\ Entity can not be empty.', 'danger')
-      return
+      showToast('Username \\ Entity can not be empty.', 'danger');
+      return;
     }
 
     let credential = {
       entity: entity,
       username: data.username,
-      password: data.password
-    }
+      password: data.password,
+    };
 
     $http.put(baseUrlSrv.getRestApiBase() + '/credential/', credential)
-      .success(function (data, status, headers, config) {
-        const index = $scope.credentialInfo.findIndex(elem => elem.entity === entity)
-        $scope.credentialInfo[index] = credential
-        return true
-      })
-      .error(function (data, status, headers, config) {
-        showToast('We could not save the credential', 'danger')
-        console.log('Error %o %o', status, data.message)
-        form.$show()
+      .success(function(data, status, headers, config) {
+        const index = $scope.credentialInfo.findIndex((elem) => elem.entity === entity);
+        $scope.credentialInfo[index] = credential;
+        return true;
       })
-    return false
-  }
-
-  $scope.removeCredentialInfo = function (entity) {
+      .error(function(data, status, headers, config) {
+        showToast('We could not save the credential', 'danger');
+        console.log('Error %o %o', status, data.message);
+        form.$show();
+      });
+    return false;
+  };
+
+  $scope.removeCredentialInfo = function(entity) {
     BootstrapDialog.confirm({
       closable: false,
       closeByBackdrop: false,
       closeByKeyboard: false,
       title: '',
       message: 'Do you want to delete this credential information?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
           $http.delete(baseUrlSrv.getRestApiBase() + '/credential/' + entity)
-            .success(function (data, status, headers, config) {
-              const index = $scope.credentialInfo.findIndex(elem => elem.entity === entity)
-              $scope.credentialInfo.splice(index, 1)
-              console.log('Success %o %o', status, data.message)
-            })
-            .error(function (data, status, headers, config) {
-              showToast(data.message, 'danger')
-              console.log('Error %o %o', status, data.message)
+            .success(function(data, status, headers, config) {
+              const index = $scope.credentialInfo.findIndex((elem) => elem.entity === entity);
+              $scope.credentialInfo.splice(index, 1);
+              console.log('Success %o %o', status, data.message);
             })
+            .error(function(data, status, headers, config) {
+              showToast(data.message, 'danger');
+              console.log('Error %o %o', status, data.message);
+            });
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
   function showToast(message, type) {
-    const verticalPosition = 'bottom'
-    const timeout = '3000'
+    const verticalPosition = 'bottom';
+    const timeout = '3000';
 
     if (type === 'success') {
-      ngToast.success({ content: message, verticalPosition: verticalPosition, timeout: timeout, })
+      ngToast.success({content: message, verticalPosition: verticalPosition, timeout: timeout});
     } else if (type === 'info') {
-      ngToast.info({ content: message, verticalPosition: verticalPosition, timeout: timeout, })
+      ngToast.info({content: message, verticalPosition: verticalPosition, timeout: timeout});
     } else {
-      ngToast.danger({ content: message, verticalPosition: verticalPosition, timeout: timeout, })
+      ngToast.danger({content: message, verticalPosition: verticalPosition, timeout: timeout});
     }
   }
 
-  let init = function () {
-    getAvailableInterpreters()
-    getCredentialInfo()
-  }
+  let init = function() {
+    getAvailableInterpreters();
+    getCredentialInfo();
+  };
 
-  init()
+  init();
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/credential/credential.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/credential/credential.test.js b/zeppelin-web/src/app/credential/credential.test.js
index d90567b..2b3c17a 100644
--- a/zeppelin-web/src/app/credential/credential.test.js
+++ b/zeppelin-web/src/app/credential/credential.test.js
@@ -1,114 +1,114 @@
 
-describe('Controller: Credential', function () {
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+describe('Controller: Credential', function() {
+  beforeEach(angular.mock.module('zeppelinWebApp'));
 
-  let baseUrlSrvMock = { getRestApiBase: () => '' }
+  let baseUrlSrvMock = {getRestApiBase: () => ''};
 
-  let $scope
-  let $controller // controller generator
-  let $httpBackend
+  let $scope;
+  let $controller; // controller generator
+  let $httpBackend;
 
   beforeEach(inject((_$controller_, _$rootScope_, _$compile_, _$httpBackend_, _ngToast_) => {
-    $scope = _$rootScope_.$new()
-    $controller = _$controller_
-    $httpBackend = _$httpBackend_
-  }))
+    $scope = _$rootScope_.$new();
+    $controller = _$controller_;
+    $httpBackend = _$httpBackend_;
+  }));
 
-  const credentialResponse = { 'spark.testCredential': { username: 'user1', password: 'password1' }, }
+  const credentialResponse = {'spark.testCredential': {username: 'user1', password: 'password1'}};
   const interpreterResponse = [
-    { 'name': 'spark', 'group': 'spark', },
-    { 'name': 'md', 'group': 'md', },
-  ] // simplified
+    {'name': 'spark', 'group': 'spark'},
+    {'name': 'md', 'group': 'md'},
+  ]; // simplified
 
   function setupInitialization(credentialRes, interpreterRes) {
     // requests should follow the exact order
     $httpBackend
       .when('GET', '/interpreter/setting')
-      .respond(200, { body: interpreterRes, })
-    $httpBackend.expectGET('/interpreter/setting')
+      .respond(200, {body: interpreterRes});
+    $httpBackend.expectGET('/interpreter/setting');
     $httpBackend
       .when('GET', '/credential')
-      .respond(200, { body: { userCredentials: credentialRes, } })
-    $httpBackend.expectGET('/credential')
+      .respond(200, {body: {userCredentials: credentialRes}});
+    $httpBackend.expectGET('/credential');
 
     // should flush after calling this function
   }
 
   it('should get available interpreters and credentials initially', () => {
-    const ctrl = createController()
-    expect(ctrl).toBeDefined()
+    const ctrl = createController();
+    expect(ctrl).toBeDefined();
 
-    setupInitialization(credentialResponse, interpreterResponse)
-    $httpBackend.flush()
+    setupInitialization(credentialResponse, interpreterResponse);
+    $httpBackend.flush();
 
     expect($scope.credentialInfo).toEqual(
-      [{ entity: 'spark.testCredential', username: 'user1', password: 'password1'}]
-    )
+      [{entity: 'spark.testCredential', username: 'user1', password: 'password1'}]
+    );
     expect($scope.availableInterpreters).toEqual(
       ['spark.spark', 'md.md']
-    )
+    );
 
-    $httpBackend.verifyNoOutstandingExpectation()
-    $httpBackend.verifyNoOutstandingRequest()
-  })
+    $httpBackend.verifyNoOutstandingExpectation();
+    $httpBackend.verifyNoOutstandingRequest();
+  });
 
   it('should toggle using toggleAddNewCredentialInfo', () => {
-    createController()
+    createController();
 
-    expect($scope.showAddNewCredentialInfo).toBe(false)
-    $scope.toggleAddNewCredentialInfo()
-    expect($scope.showAddNewCredentialInfo).toBe(true)
-    $scope.toggleAddNewCredentialInfo()
-    expect($scope.showAddNewCredentialInfo).toBe(false)
-  })
+    expect($scope.showAddNewCredentialInfo).toBe(false);
+    $scope.toggleAddNewCredentialInfo();
+    expect($scope.showAddNewCredentialInfo).toBe(true);
+    $scope.toggleAddNewCredentialInfo();
+    expect($scope.showAddNewCredentialInfo).toBe(false);
+  });
 
   it('should check empty credentials using isInvalidCredential', () => {
-    createController()
+    createController();
 
-    $scope.entity = ''
-    $scope.username = ''
-    expect($scope.isValidCredential()).toBe(false)
+    $scope.entity = '';
+    $scope.username = '';
+    expect($scope.isValidCredential()).toBe(false);
 
-    $scope.entity = 'spark1'
-    $scope.username = ''
-    expect($scope.isValidCredential()).toBe(false)
+    $scope.entity = 'spark1';
+    $scope.username = '';
+    expect($scope.isValidCredential()).toBe(false);
 
-    $scope.entity = ''
-    $scope.username = 'user1'
-    expect($scope.isValidCredential()).toBe(false)
+    $scope.entity = '';
+    $scope.username = 'user1';
+    expect($scope.isValidCredential()).toBe(false);
 
-    $scope.entity = 'spark'
-    $scope.username = 'user1'
-    expect($scope.isValidCredential()).toBe(true)
-  })
+    $scope.entity = 'spark';
+    $scope.username = 'user1';
+    expect($scope.isValidCredential()).toBe(true);
+  });
 
   it('should be able to add credential via addNewCredentialInfo', () => {
-    const ctrl = createController()
-    expect(ctrl).toBeDefined()
-    setupInitialization(credentialResponse, interpreterResponse)
+    const ctrl = createController();
+    expect(ctrl).toBeDefined();
+    setupInitialization(credentialResponse, interpreterResponse);
 
     // when
-    const newCredential = { entity: 'spark.sql', username: 'user2', password: 'password2'}
+    const newCredential = {entity: 'spark.sql', username: 'user2', password: 'password2'};
 
     $httpBackend
       .when('PUT', '/credential', newCredential)
-      .respond(200, { })
-    $httpBackend.expectPUT('/credential', newCredential)
+      .respond(200, { });
+    $httpBackend.expectPUT('/credential', newCredential);
 
-    $scope.entity = newCredential.entity
-    $scope.username = newCredential.username
-    $scope.password = newCredential.password
-    $scope.addNewCredentialInfo()
+    $scope.entity = newCredential.entity;
+    $scope.username = newCredential.username;
+    $scope.password = newCredential.password;
+    $scope.addNewCredentialInfo();
 
-    $httpBackend.flush()
+    $httpBackend.flush();
 
-    expect($scope.credentialInfo[1]).toEqual(newCredential)
+    expect($scope.credentialInfo[1]).toEqual(newCredential);
 
-    $httpBackend.verifyNoOutstandingExpectation()
-    $httpBackend.verifyNoOutstandingRequest()
-  })
+    $httpBackend.verifyNoOutstandingExpectation();
+    $httpBackend.verifyNoOutstandingRequest();
+  });
 
   function createController() {
-    return $controller('CredentialCtrl', { $scope: $scope, baseUrlSrv: baseUrlSrvMock, })
+    return $controller('CredentialCtrl', {$scope: $scope, baseUrlSrv: baseUrlSrvMock});
   }
-})
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/helium/helium-conf.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/helium/helium-conf.js b/zeppelin-web/src/app/helium/helium-conf.js
index 10ca18a..05a58cf 100644
--- a/zeppelin-web/src/app/helium/helium-conf.js
+++ b/zeppelin-web/src/app/helium/helium-conf.js
@@ -16,84 +16,92 @@ export const HeliumConfFieldType = {
   NUMBER: 'number',
   JSON: 'json',
   STRING: 'string',
-}
+};
 
 /**
  * @param persisted <Object> including `type`, `description`, `defaultValue` for each conf key
  * @param spec <Object> including `value` for each conf key
  */
-export function mergePersistedConfWithSpec (persisted, spec) {
-  const confs = []
+export function mergePersistedConfWithSpec(persisted, spec) {
+  const confs = [];
 
   for (let name in spec) {
-    const specField = spec[name]
-    const persistedValue = persisted[name]
-
-    const value = (persistedValue) ? persistedValue : specField.defaultValue
-    const merged = {
-      name: name,
-      type: specField.type,
-      description: specField.description,
-      value: value,
-      defaultValue: specField.defaultValue,
+    if (spec.hasOwnProperty(name)) {
+      const specField = spec[name];
+      const persistedValue = persisted[name];
+
+      const value = (persistedValue) ? persistedValue : specField.defaultValue;
+      const merged = {
+        name: name,
+        type: specField.type,
+        description: specField.description,
+        value: value,
+        defaultValue: specField.defaultValue,
+      };
+
+      confs.push(merged);
     }
-
-    confs.push(merged)
   }
 
-  return confs
+  return confs;
 }
 
-export function createAllPackageConfigs (defaultPackages, persistedConfs) {
-  let packageConfs = {}
+export function createAllPackageConfigs(defaultPackages, persistedConfs) {
+  let packageConfs = {};
 
   for (let name in defaultPackages) {
-    const pkgSearchResult = defaultPackages[name]
-
-    const spec = pkgSearchResult.pkg.config
-    if (!spec) { continue }
-
-    const artifact = pkgSearchResult.pkg.artifact
-    if (!artifact) { continue }
-
-    let persistedConf = {}
-    if (persistedConfs[artifact]) {
-      persistedConf = persistedConfs[artifact]
+    if (defaultPackages.hasOwnProperty(name)) {
+      const pkgSearchResult = defaultPackages[name];
+
+      const spec = pkgSearchResult.pkg.config;
+      if (!spec) {
+        continue;
+      }
+
+      const artifact = pkgSearchResult.pkg.artifact;
+      if (!artifact) {
+        continue;
+      }
+
+      let persistedConf = {};
+      if (persistedConfs[artifact]) {
+        persistedConf = persistedConfs[artifact];
+      }
+
+      const confs = mergePersistedConfWithSpec(persistedConf, spec);
+      packageConfs[name] = confs;
     }
-
-    const confs = mergePersistedConfWithSpec(persistedConf, spec)
-    packageConfs[name] = confs
   }
 
-  return packageConfs
+  return packageConfs;
 }
 
-export function parseConfigValue (type, stringified) {
-  let value = stringified
+export function parseConfigValue(type, stringified) {
+  let value = stringified;
 
   try {
     if (HeliumConfFieldType.NUMBER === type) {
-      value = parseFloat(stringified)
+      value = parseFloat(stringified);
     } else if (HeliumConfFieldType.JSON === type) {
-      value = JSON.parse(stringified)
+      value = JSON.parse(stringified);
     }
   } catch (error) {
     // return just the stringified one
-    console.error(`Failed to parse conf type ${type}, value ${value}`)
+    console.error(`Failed to parse conf type ${type}, value ${value}`);
   }
 
-  return value
+  return value;
 }
 
 /**
  * persist key-value only
  * since other info (e.g type, desc) can be provided by default config
  */
-export function createPersistableConfig (currentConfs) {
+export function createPersistableConfig(currentConfs) {
   const filtered = currentConfs.reduce((acc, c) => {
-    acc[c.name] = parseConfigValue(c.type, c.value)
-    return acc
-  }, {})
+    acc[c.name] = parseConfigValue(c.type, c.value);
+    return acc;
+  }, {});
 
-  return filtered
+  return filtered;
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/helium/helium-package.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/helium/helium-package.js b/zeppelin-web/src/app/helium/helium-package.js
index 88d191a..2fe9bf5 100644
--- a/zeppelin-web/src/app/helium/helium-package.js
+++ b/zeppelin-web/src/app/helium/helium-package.js
@@ -12,20 +12,22 @@
  * limitations under the License.
  */
 
-export function createDefaultPackage (pkgSearchResult, sce) {
+export function createDefaultPackage(pkgSearchResult, sce) {
   for (let pkgIdx in pkgSearchResult) {
-    const pkg = pkgSearchResult[pkgIdx]
-    pkg.pkg.icon = sce.trustAsHtml(pkg.pkg.icon)
-    if (pkg.enabled) {
-      pkgSearchResult.splice(pkgIdx, 1)
-      return pkg
+    if (pkgSearchResult.hasOwnProperty(pkgIdx)) {
+      const pkg = pkgSearchResult[pkgIdx];
+      pkg.pkg.icon = sce.trustAsHtml(pkg.pkg.icon);
+      if (pkg.enabled) {
+        pkgSearchResult.splice(pkgIdx, 1);
+        return pkg;
+      }
     }
   }
 
   // show first available version if package is not enabled
-  const result = pkgSearchResult[0]
-  pkgSearchResult.splice(0, 1)
-  return result
+  const result = pkgSearchResult[0];
+  pkgSearchResult.splice(0, 1);
+  return result;
 }
 
 /**
@@ -35,13 +37,15 @@ export function createDefaultPackage (pkgSearchResult, sce) {
  * @param sce angular `$sce` object
  * @returns {Object} including {name, pkgInfo}
  */
-export function createDefaultPackages (pkgSearchResults, sce) {
-  const defaultPackages = {}
+export function createDefaultPackages(pkgSearchResults, sce) {
+  const defaultPackages = {};
   // show enabled version if any version of package is enabled
   for (let name in pkgSearchResults) {
-    const pkgSearchResult = pkgSearchResults[name]
-    defaultPackages[name] = createDefaultPackage(pkgSearchResult, sce)
+    if (pkgSearchResults.hasOwnProperty(name)) {
+      const pkgSearchResult = pkgSearchResults[name];
+      defaultPackages[name] = createDefaultPackage(pkgSearchResult, sce);
+    }
   }
 
-  return defaultPackages
+  return defaultPackages;
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/helium/helium-type.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/helium/helium-type.js b/zeppelin-web/src/app/helium/helium-type.js
index 27b34fa..0b37a41 100644
--- a/zeppelin-web/src/app/helium/helium-type.js
+++ b/zeppelin-web/src/app/helium/helium-type.js
@@ -17,4 +17,4 @@ export const HeliumType = {
   SPELL: 'SPELL',
   INTERPRETER: 'INTERPRETER',
   APPLICATION: 'APPLICATION',
-}
+};

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/helium/helium.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/helium/helium.controller.js b/zeppelin-web/src/app/helium/helium.controller.js
index a397ace..4728e08 100644
--- a/zeppelin-web/src/app/helium/helium.controller.js
+++ b/zeppelin-web/src/app/helium/helium.controller.js
@@ -12,92 +12,94 @@
  * limitations under the License.
  */
 
-import { HeliumType, } from './helium-type'
+import {HeliumType} from './helium-type';
 
-export default function HeliumCtrl ($scope, $rootScope, $sce,
+export default function HeliumCtrl($scope, $rootScope, $sce,
                                    baseUrlSrv, ngToast, heliumService) {
-  'ngInject'
-
-  $scope.pkgSearchResults = {}
-  $scope.defaultPackages = {}
-  $scope.showVersions = {}
-  $scope.bundleOrder = []
-  $scope.bundleOrderChanged = false
-  $scope.vizTypePkg = {}
-  $scope.spellTypePkg = {}
-  $scope.intpTypePkg = {}
-  $scope.appTypePkg = {}
-  $scope.numberOfEachPackageByType = {}
-  $scope.allPackageTypes = [HeliumType][0]
-  $scope.pkgListByType = 'VISUALIZATION'
-  $scope.defaultPackageConfigs = {} // { pkgName, [{name, type, desc, value, defaultValue}] }
-  $scope.intpDefaultIcon = $sce.trustAsHtml('<img src="../assets/images/maven_default_icon.png" style="width: 12px"/>')
-
-  function init () {
+  'ngInject';
+
+  $scope.pkgSearchResults = {};
+  $scope.defaultPackages = {};
+  $scope.showVersions = {};
+  $scope.bundleOrder = [];
+  $scope.bundleOrderChanged = false;
+  $scope.vizTypePkg = {};
+  $scope.spellTypePkg = {};
+  $scope.intpTypePkg = {};
+  $scope.appTypePkg = {};
+  $scope.numberOfEachPackageByType = {};
+  $scope.allPackageTypes = [HeliumType][0];
+  $scope.pkgListByType = 'VISUALIZATION';
+  $scope.defaultPackageConfigs = {}; // { pkgName, [{name, type, desc, value, defaultValue}] }
+  $scope.intpDefaultIcon = $sce.trustAsHtml('<img src="../assets/images/maven_default_icon.png" style="width: 12px"/>');
+
+  function init() {
     // get all package info and set config
     heliumService.getAllPackageInfoAndDefaultPackages()
-      .then(({ pkgSearchResults, defaultPackages }) => {
+      .then(({pkgSearchResults, defaultPackages}) => {
         // pagination
-        $scope.itemsPerPage = 10
-        $scope.currentPage = 1
-        $scope.maxSize = 5
+        $scope.itemsPerPage = 10;
+        $scope.currentPage = 1;
+        $scope.maxSize = 5;
 
-        $scope.pkgSearchResults = pkgSearchResults
-        $scope.defaultPackages = defaultPackages
-        classifyPkgType($scope.defaultPackages)
+        $scope.pkgSearchResults = pkgSearchResults;
+        $scope.defaultPackages = defaultPackages;
+        classifyPkgType($scope.defaultPackages);
 
-        return heliumService.getAllPackageConfigs()
+        return heliumService.getAllPackageConfigs();
       })
-      .then(defaultPackageConfigs => {
-        $scope.defaultPackageConfigs = defaultPackageConfigs
-        return heliumService.getVisualizationPackageOrder()
-      })
-      .then(visPackageOrder => {
-        setVisPackageOrder(visPackageOrder)
+      .then((defaultPackageConfigs) => {
+        $scope.defaultPackageConfigs = defaultPackageConfigs;
+        return heliumService.getVisualizationPackageOrder();
       })
+      .then((visPackageOrder) => {
+        setVisPackageOrder(visPackageOrder);
+      });
   }
 
   const setVisPackageOrder = function(visPackageOrder) {
-    $scope.bundleOrder = visPackageOrder
-    $scope.bundleOrderChanged = false
-  }
+    $scope.bundleOrder = visPackageOrder;
+    $scope.bundleOrderChanged = false;
+  };
 
-  let orderPackageByPubDate = function (a, b) {
+  let orderPackageByPubDate = function(a, b) {
     if (!a.pkg.published) {
       // Because local registry pkgs don't have 'published' field, put current time instead to show them first
-      a.pkg.published = new Date().getTime()
+      a.pkg.published = new Date().getTime();
     }
 
-    return new Date(a.pkg.published).getTime() - new Date(b.pkg.published).getTime()
-  }
+    return new Date(a.pkg.published).getTime() - new Date(b.pkg.published).getTime();
+  };
 
-  const classifyPkgType = function (packageInfo) {
-    let allTypesOfPkg = {}
-    let vizTypePkg = []
-    let spellTypePkg = []
-    let intpTypePkg = []
-    let appTypePkg = []
+  const classifyPkgType = function(packageInfo) {
+    let allTypesOfPkg = {};
+    let vizTypePkg = [];
+    let spellTypePkg = [];
+    let intpTypePkg = [];
+    let appTypePkg = [];
 
-    let packageInfoArr = Object.keys(packageInfo).map(key => packageInfo[key])
-    packageInfoArr = packageInfoArr.sort(orderPackageByPubDate).reverse()
+    let packageInfoArr = Object.keys(packageInfo).map((key) => packageInfo[key]);
+    packageInfoArr = packageInfoArr.sort(orderPackageByPubDate).reverse();
 
     for (let name in packageInfoArr) {
-      let pkgs = packageInfoArr[name]
-      let pkgType = pkgs.pkg.type
-
-      switch (pkgType) {
-        case HeliumType.VISUALIZATION:
-          vizTypePkg.push(pkgs)
-          break
-        case HeliumType.SPELL:
-          spellTypePkg.push(pkgs)
-          break
-        case HeliumType.INTERPRETER:
-          intpTypePkg.push(pkgs)
-          break
-        case HeliumType.APPLICATION:
-          appTypePkg.push(pkgs)
-          break
+      if (packageInfoArr.hasOwnProperty(name)) {
+        let pkgs = packageInfoArr[name];
+        let pkgType = pkgs.pkg.type;
+
+        switch (pkgType) {
+          case HeliumType.VISUALIZATION:
+            vizTypePkg.push(pkgs);
+            break;
+          case HeliumType.SPELL:
+            spellTypePkg.push(pkgs);
+            break;
+          case HeliumType.INTERPRETER:
+            intpTypePkg.push(pkgs);
+            break;
+          case HeliumType.APPLICATION:
+            appTypePkg.push(pkgs);
+            break;
+        }
       }
     }
 
@@ -105,95 +107,99 @@ export default function HeliumCtrl ($scope, $rootScope, $sce,
       vizTypePkg,
       spellTypePkg,
       intpTypePkg,
-      appTypePkg
-    ]
+      appTypePkg,
+    ];
     for (let idx in _.keys(HeliumType)) {
-      allTypesOfPkg[_.keys(HeliumType)[idx]] = pkgsArr[idx]
+      if (_.keys(HeliumType).hasOwnProperty(idx)) {
+        allTypesOfPkg[_.keys(HeliumType)[idx]] = pkgsArr[idx];
+      }
     }
 
-    $scope.allTypesOfPkg = allTypesOfPkg
-  }
+    $scope.allTypesOfPkg = allTypesOfPkg;
+  };
 
   $scope.bundleOrderListeners = {
-    accept: function (sourceItemHandleScope, destSortableScope) { return true },
-    itemMoved: function (event) {},
-    orderChanged: function (event) {
-      $scope.bundleOrderChanged = true
-    }
-  }
-
-  $scope.saveBundleOrder = function () {
+    accept: function(sourceItemHandleScope, destSortableScope) {
+      return true;
+    },
+    itemMoved: function(event) {},
+    orderChanged: function(event) {
+      $scope.bundleOrderChanged = true;
+    },
+  };
+
+  $scope.saveBundleOrder = function() {
     const confirm = BootstrapDialog.confirm({
       closable: false,
       closeByBackdrop: false,
       closeByKeyboard: false,
       title: '',
       message: 'Save changes?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          confirm.$modalFooter.find('button').addClass('disabled')
+          confirm.$modalFooter.find('button').addClass('disabled');
           confirm.$modalFooter.find('button:contains("OK")')
-            .html('<i class="fa fa-circle-o-notch fa-spin"></i> Enabling')
+            .html('<i class="fa fa-circle-o-notch fa-spin"></i> Enabling');
           heliumService.setVisualizationPackageOrder($scope.bundleOrder)
-            .success(function (data, status) {
-              setVisPackageOrder($scope.bundleOrder)
-              confirm.close()
+            .success(function(data, status) {
+              setVisPackageOrder($scope.bundleOrder);
+              confirm.close();
             })
-            .error(function (data, status) {
-              confirm.close()
-              console.log('Failed to save order')
+            .error(function(data, status) {
+              confirm.close();
+              console.log('Failed to save order');
               BootstrapDialog.show({
                 title: 'Error on saving order ',
-                message: data.message
-              })
-            })
-          return false
+                message: data.message,
+              });
+            });
+          return false;
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  let getLicense = function (name, artifact) {
-    let filteredPkgSearchResults = _.filter($scope.defaultPackages[name], function (p) {
-      return p.artifact === artifact
-    })
+  let getLicense = function(name, artifact) {
+    let filteredPkgSearchResults = _.filter($scope.defaultPackages[name], function(p) {
+      return p.artifact === artifact;
+    });
 
-    let license
+    let license;
     if (filteredPkgSearchResults.length === 0) {
-      filteredPkgSearchResults = _.filter($scope.pkgSearchResults[name], function (p) {
-        return p.pkg.artifact === artifact
-      })
+      filteredPkgSearchResults = _.filter($scope.pkgSearchResults[name], function(p) {
+        return p.pkg.artifact === artifact;
+      });
 
       if (filteredPkgSearchResults.length > 0) {
-        license = filteredPkgSearchResults[0].pkg.license
+        license = filteredPkgSearchResults[0].pkg.license;
       }
     } else {
-      license = filteredPkgSearchResults[0].license
+      license = filteredPkgSearchResults[0].license;
     }
 
     if (!license) {
-      license = 'Unknown'
+      license = 'Unknown';
     }
-    return license
-  }
+    return license;
+  };
 
-  const getHeliumTypeText = function (type) {
+  const getHeliumTypeText = function(type) {
     if (type === HeliumType.VISUALIZATION) {
-      return `<a target="_blank" href="https://zeppelin.apache.org/docs/${$rootScope.zeppelinVersion}/development/helium/writing_visualization.html">${type}</a>` // eslint-disable-line max-len
+      return `<a target="_blank" href="https://zeppelin.apache.org/docs/${$rootScope.zeppelinVersion}/development/helium/writing_visualization.html">${type}</a>`; // eslint-disable-line max-len
     } else if (type === HeliumType.SPELL) {
-      return `<a target="_blank" href="https://zeppelin.apache.org/docs/${$rootScope.zeppelinVersion}/development/helium/writing_spell.html">${type}</a>` // eslint-disable-line max-len
+      return `<a target="_blank" href="https://zeppelin.apache.org/docs/${$rootScope.zeppelinVersion}/development/helium/writing_spell.html">${type}</a>`; // eslint-disable-line max-len
     } else {
-      return type
+      return type;
     }
-  }
+  };
 
-  $scope.enable = function (name, artifact, type, groupId, description) {
-    let license = getLicense(name, artifact)
-    let mavenArtifactInfoToHTML = groupId + ':' + artifact.split('@')[0] + ':' + artifact.split('@')[1]
-    let zeppelinVersion = $rootScope.zeppelinVersion
-    let url = 'https://zeppelin.apache.org/docs/' + zeppelinVersion + '/manual/interpreterinstallation.html'
+  $scope.enable = function(name, artifact, type, groupId, description) {
+    let license = getLicense(name, artifact);
+    let mavenArtifactInfoToHTML = groupId + ':' + artifact.split('@')[0] + ':' + artifact.split('@')[1];
+    let zeppelinVersion = $rootScope.zeppelinVersion;
+    let url = 'https://zeppelin.apache.org/docs/' + zeppelinVersion + '/manual/interpreterinstallation.html';
 
-    let confirm = ''
+    let confirm = '';
     if (type === HeliumType.INTERPRETER) {
       confirm = BootstrapDialog.show({
         title: '',
@@ -206,8 +212,8 @@ export default function HeliumCtrl ($scope, $rootScope, $sce,
         mavenArtifactInfoToHTML + ' </code></pre>' +
         '<p>After restart Zeppelin, create interpreter setting and bind it with your note. ' +
         'For more detailed information, see <a target="_blank" href=' +
-        url + '>Interpreter Installation.</a></p>'
-      })
+        url + '>Interpreter Installation.</a></p>',
+      });
     } else {
       confirm = BootstrapDialog.confirm({
         closable: false,
@@ -226,138 +232,138 @@ export default function HeliumCtrl ($scope, $rootScope, $sce,
           '<hr style="margin-top: 10px; margin-bottom: 10px;" />' +
           '<div style="font-size: 14px;">License</div>' +
           `<div style="color:gray">${license}</div>`,
-        callback: function (result) {
+        callback: function(result) {
           if (result) {
-            confirm.$modalFooter.find('button').addClass('disabled')
+            confirm.$modalFooter.find('button').addClass('disabled');
             confirm.$modalFooter.find('button:contains("OK")')
-              .html('<i class="fa fa-circle-o-notch fa-spin"></i> Enabling')
-            heliumService.enable(name, artifact, type).success(function (data, status) {
-              init()
-              confirm.close()
-            }).error(function (data, status) {
-              confirm.close()
-              console.log('Failed to enable package %o %o. %o', name, artifact, data)
+              .html('<i class="fa fa-circle-o-notch fa-spin"></i> Enabling');
+            heliumService.enable(name, artifact, type).success(function(data, status) {
+              init();
+              confirm.close();
+            }).error(function(data, status) {
+              confirm.close();
+              console.log('Failed to enable package %o %o. %o', name, artifact, data);
               BootstrapDialog.show({
                 title: 'Error on enabling ' + name,
-                message: data.message
-              })
-            })
-            return false
+                message: data.message,
+              });
+            });
+            return false;
           }
-        }
-      })
+        },
+      });
     }
-  }
+  };
 
-  $scope.disable = function (name, artifact) {
+  $scope.disable = function(name, artifact) {
     const confirm = BootstrapDialog.confirm({
       closable: false,
       closeByBackdrop: false,
       closeByKeyboard: false,
       title: '<div style="font-weight: 300;">Do you want to disable Helium Package?</div>',
       message: artifact,
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          confirm.$modalFooter.find('button').addClass('disabled')
+          confirm.$modalFooter.find('button').addClass('disabled');
           confirm.$modalFooter.find('button:contains("OK")')
-            .html('<i class="fa fa-circle-o-notch fa-spin"></i> Disabling')
+            .html('<i class="fa fa-circle-o-notch fa-spin"></i> Disabling');
           heliumService.disable(name)
-          .success(function (data, status) {
-            init()
-            confirm.close()
+          .success(function(data, status) {
+            init();
+            confirm.close();
           })
-          .error(function (data, status) {
-            confirm.close()
-            console.log('Failed to disable package %o. %o', name, data)
+          .error(function(data, status) {
+            confirm.close();
+            console.log('Failed to disable package %o. %o', name, data);
             BootstrapDialog.show({
               title: 'Error on disabling ' + name,
-              message: data.message
-            })
-          })
-          return false
+              message: data.message,
+            });
+          });
+          return false;
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  $scope.toggleVersions = function (pkgName) {
+  $scope.toggleVersions = function(pkgName) {
     if ($scope.showVersions[pkgName]) {
-      $scope.showVersions[pkgName] = false
+      $scope.showVersions[pkgName] = false;
     } else {
-      $scope.showVersions[pkgName] = true
+      $scope.showVersions[pkgName] = true;
     }
-  }
+  };
 
-  $scope.isLocalPackage = function (pkgSearchResult) {
-    const pkg = pkgSearchResult.pkg
-    return pkg.artifact && !pkg.artifact.includes('@')
-  }
+  $scope.isLocalPackage = function(pkgSearchResult) {
+    const pkg = pkgSearchResult.pkg;
+    return pkg.artifact && !pkg.artifact.includes('@');
+  };
 
-  $scope.hasNpmLink = function (pkgSearchResult) {
-    const pkg = pkgSearchResult.pkg
+  $scope.hasNpmLink = function(pkgSearchResult) {
+    const pkg = pkgSearchResult.pkg;
     return (pkg.type === HeliumType.SPELL || pkg.type === HeliumType.VISUALIZATION) &&
-      !$scope.isLocalPackage(pkgSearchResult)
-  }
+      !$scope.isLocalPackage(pkgSearchResult);
+  };
 
-  $scope.hasMavenLink = function (pkgSearchResult) {
-    const pkg = pkgSearchResult.pkg
+  $scope.hasMavenLink = function(pkgSearchResult) {
+    const pkg = pkgSearchResult.pkg;
     return (pkg.type === HeliumType.APPLICATION || pkg.type === HeliumType.INTERPRETER) &&
-      !$scope.isLocalPackage(pkgSearchResult)
-  }
-
-  $scope.getPackageSize = function (pkgSearchResult, targetPkgType) {
-    let result = []
-    _.map(pkgSearchResult, function (pkg) {
-      result.push(_.find(pkg, {type: targetPkgType}))
-    })
-    return _.compact(result).length
-  }
-
-  $scope.configExists = function (pkgSearchResult) {
+      !$scope.isLocalPackage(pkgSearchResult);
+  };
+
+  $scope.getPackageSize = function(pkgSearchResult, targetPkgType) {
+    let result = [];
+    _.map(pkgSearchResult, function(pkg) {
+      result.push(_.find(pkg, {type: targetPkgType}));
+    });
+    return _.compact(result).length;
+  };
+
+  $scope.configExists = function(pkgSearchResult) {
     // helium package config is persisted per version
-    return pkgSearchResult.pkg.config && pkgSearchResult.pkg.artifact
-  }
+    return pkgSearchResult.pkg.config && pkgSearchResult.pkg.artifact;
+  };
 
-  $scope.configOpened = function (pkgSearchResult) {
-    return pkgSearchResult.configOpened && !pkgSearchResult.configFetching
-  }
+  $scope.configOpened = function(pkgSearchResult) {
+    return pkgSearchResult.configOpened && !pkgSearchResult.configFetching;
+  };
 
-  $scope.getConfigButtonClass = function (pkgSearchResult) {
+  $scope.getConfigButtonClass = function(pkgSearchResult) {
     return (pkgSearchResult.configOpened && pkgSearchResult.configFetching)
-      ? 'disabled' : ''
-  }
+      ? 'disabled' : '';
+  };
 
-  $scope.toggleConfigButton = function (pkgSearchResult) {
+  $scope.toggleConfigButton = function(pkgSearchResult) {
     if (pkgSearchResult.configOpened) {
-      pkgSearchResult.configOpened = false
-      return
+      pkgSearchResult.configOpened = false;
+      return;
     }
 
-    const pkg = pkgSearchResult.pkg
-    const pkgName = pkg.name
-    pkgSearchResult.configFetching = true
-    pkgSearchResult.configOpened = true
+    const pkg = pkgSearchResult.pkg;
+    const pkgName = pkg.name;
+    pkgSearchResult.configFetching = true;
+    pkgSearchResult.configOpened = true;
 
     heliumService.getSinglePackageConfigs(pkg)
-      .then(confs => {
-        $scope.defaultPackageConfigs[pkgName] = confs
-        pkgSearchResult.configFetching = false
-      })
-  }
+      .then((confs) => {
+        $scope.defaultPackageConfigs[pkgName] = confs;
+        pkgSearchResult.configFetching = false;
+      });
+  };
 
-  $scope.saveConfig = function (pkgSearchResult) {
-    const pkgName = pkgSearchResult.pkg.name
-    const currentConf = $scope.defaultPackageConfigs[pkgName]
+  $scope.saveConfig = function(pkgSearchResult) {
+    const pkgName = pkgSearchResult.pkg.name;
+    const currentConf = $scope.defaultPackageConfigs[pkgName];
 
     heliumService.saveConfig(pkgSearchResult.pkg, currentConf, () => {
       // close after config is saved
-      pkgSearchResult.configOpened = false
-    })
-  }
+      pkgSearchResult.configOpened = false;
+    });
+  };
 
-  $scope.getDescriptionText = function (pkgSearchResult) {
-    return $sce.trustAsHtml(pkgSearchResult.pkg.description)
-  }
+  $scope.getDescriptionText = function(pkgSearchResult) {
+    return $sce.trustAsHtml(pkgSearchResult.pkg.description);
+  };
 
-  init()
+  init();
 }


[11/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/helium/helium.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/helium/helium.service.js b/zeppelin-web/src/app/helium/helium.service.js
index d2054b3..7501fae 100644
--- a/zeppelin-web/src/app/helium/helium.service.js
+++ b/zeppelin-web/src/app/helium/helium.service.js
@@ -12,290 +12,294 @@
  * limitations under the License.
  */
 
-import { HeliumType, } from './helium-type'
+import {HeliumType} from './helium-type';
 import {
   createAllPackageConfigs,
   createPersistableConfig,
   mergePersistedConfWithSpec,
-} from './helium-conf'
+} from './helium-conf';
 import {
   createDefaultPackages,
-} from './helium-package'
+} from './helium-package';
 
-angular.module('zeppelinWebApp').service('heliumService', HeliumService)
+angular.module('zeppelinWebApp').service('heliumService', HeliumService);
 
 export default function HeliumService($http, $sce, baseUrlSrv) {
-  'ngInject'
+  'ngInject';
 
-  let visualizationBundles = []
-  let visualizationPackageOrder = []
+  let visualizationBundles = [];
+  let visualizationPackageOrder = [];
   // name `heliumBundles` should be same as `HeliumBundleFactory.HELIUM_BUNDLES_VAR`
-  let heliumBundles = []
+  let heliumBundles = [];
   // map for `{ magic: interpreter }`
-  let spellPerMagic = {}
+  let spellPerMagic = {};
   // map for `{ magic: package-name }`
-  let pkgNamePerMagic = {}
+  let pkgNamePerMagic = {};
 
   /**
    * @param magic {string} e.g `%flowchart`
    * @returns {SpellBase} undefined if magic is not registered
    */
-  this.getSpellByMagic = function (magic) {
-    return spellPerMagic[magic]
-  }
+  this.getSpellByMagic = function(magic) {
+    return spellPerMagic[magic];
+  };
 
-  this.executeSpell = function (magic, textWithoutMagic) {
+  this.executeSpell = function(magic, textWithoutMagic) {
     const promisedConf = this.getSinglePackageConfigUsingMagic(magic)
-      .then(confs => createPersistableConfig(confs))
+      .then((confs) => createPersistableConfig(confs));
 
-    return promisedConf.then(conf => {
-      const spell = this.getSpellByMagic(magic)
-      const spellResult = spell.interpret(textWithoutMagic, conf)
+    return promisedConf.then((conf) => {
+      const spell = this.getSpellByMagic(magic);
+      const spellResult = spell.interpret(textWithoutMagic, conf);
       const parsed = spellResult.getAllParsedDataWithTypes(
-        spellPerMagic, magic, textWithoutMagic)
+        spellPerMagic, magic, textWithoutMagic);
 
-      return parsed
-    })
-  }
+      return parsed;
+    });
+  };
 
-  this.executeSpellAsDisplaySystem = function (magic, textWithoutMagic) {
+  this.executeSpellAsDisplaySystem = function(magic, textWithoutMagic) {
     const promisedConf = this.getSinglePackageConfigUsingMagic(magic)
-      .then(confs => createPersistableConfig(confs))
+      .then((confs) => createPersistableConfig(confs));
 
-    return promisedConf.then(conf => {
-      const spell = this.getSpellByMagic(magic)
-      const spellResult = spell.interpret(textWithoutMagic.trim(), conf)
-      const parsed = spellResult.getAllParsedDataWithTypes(spellPerMagic)
+    return promisedConf.then((conf) => {
+      const spell = this.getSpellByMagic(magic);
+      const spellResult = spell.interpret(textWithoutMagic.trim(), conf);
+      const parsed = spellResult.getAllParsedDataWithTypes(spellPerMagic);
 
-      return parsed
-    })
-  }
+      return parsed;
+    });
+  };
 
-  this.getVisualizationCachedPackages = function () {
-    return visualizationBundles
-  }
+  this.getVisualizationCachedPackages = function() {
+    return visualizationBundles;
+  };
 
-  this.getVisualizationCachedPackageOrder = function () {
-    return visualizationPackageOrder
-  }
+  this.getVisualizationCachedPackageOrder = function() {
+    return visualizationPackageOrder;
+  };
 
   /**
    * @returns {Promise} which returns bundleOrder and cache it in `visualizationPackageOrder`
    */
-  this.getVisualizationPackageOrder = function () {
+  this.getVisualizationPackageOrder = function() {
     return $http.get(baseUrlSrv.getRestApiBase() + '/helium/order/visualization')
-      .then(function (response, status) {
-        const order = response.data.body
-        visualizationPackageOrder = order
-        return order
-      })
-      .catch(function (error) {
-        console.error('Can not get bundle order', error)
+      .then(function(response, status) {
+        const order = response.data.body;
+        visualizationPackageOrder = order;
+        return order;
       })
-  }
+      .catch(function(error) {
+        console.error('Can not get bundle order', error);
+      });
+  };
 
-  this.setVisualizationPackageOrder = function (list) {
-    return $http.post(baseUrlSrv.getRestApiBase() + '/helium/order/visualization', list)
-  }
+  this.setVisualizationPackageOrder = function(list) {
+    return $http.post(baseUrlSrv.getRestApiBase() + '/helium/order/visualization', list);
+  };
 
-  this.enable = function (name, artifact) {
-    return $http.post(baseUrlSrv.getRestApiBase() + '/helium/enable/' + name, artifact)
-  }
+  this.enable = function(name, artifact) {
+    return $http.post(baseUrlSrv.getRestApiBase() + '/helium/enable/' + name, artifact);
+  };
 
-  this.disable = function (name) {
-    return $http.post(baseUrlSrv.getRestApiBase() + '/helium/disable/' + name)
-  }
+  this.disable = function(name) {
+    return $http.post(baseUrlSrv.getRestApiBase() + '/helium/disable/' + name);
+  };
 
-  this.saveConfig = function (pkg, defaultPackageConfig, closeConfigPanelCallback) {
+  this.saveConfig = function(pkg, defaultPackageConfig, closeConfigPanelCallback) {
     // in case of local package, it will include `/`
-    const pkgArtifact = encodeURIComponent(pkg.artifact)
-    const pkgName = pkg.name
-    const filtered = createPersistableConfig(defaultPackageConfig)
+    const pkgArtifact = encodeURIComponent(pkg.artifact);
+    const pkgName = pkg.name;
+    const filtered = createPersistableConfig(defaultPackageConfig);
 
     if (!pkgName || !pkgArtifact || !filtered) {
       console.error(
-        `Can't save config for helium package '${pkgArtifact}'`, filtered)
-      return
+        `Can't save config for helium package '${pkgArtifact}'`, filtered);
+      return;
     }
 
-    const url = `${baseUrlSrv.getRestApiBase()}/helium/config/${pkgName}/${pkgArtifact}`
+    const url = `${baseUrlSrv.getRestApiBase()}/helium/config/${pkgName}/${pkgArtifact}`;
     return $http.post(url, filtered)
       .then(() => {
-        if (closeConfigPanelCallback) { closeConfigPanelCallback() }
+        if (closeConfigPanelCallback) {
+          closeConfigPanelCallback();
+        }
       }).catch((error) => {
-        console.error(`Failed to save config for ${pkgArtifact}`, error)
-      })
-  }
+        console.error(`Failed to save config for ${pkgArtifact}`, error);
+      });
+  };
 
   /**
    * @returns {Promise<Object>} which including {name, Array<package info for artifact>}
    */
-  this.getAllPackageInfo = function () {
+  this.getAllPackageInfo = function() {
     return $http.get(`${baseUrlSrv.getRestApiBase()}/helium/package`)
-      .then(function (response, status) {
-        return response.data.body
-      })
-      .catch(function (error) {
-        console.error('Failed to get all package infos', error)
+      .then(function(response, status) {
+        return response.data.body;
       })
-  }
+      .catch(function(error) {
+        console.error('Failed to get all package infos', error);
+      });
+  };
 
-  this.getAllEnabledPackages = function () {
+  this.getAllEnabledPackages = function() {
     return $http.get(`${baseUrlSrv.getRestApiBase()}/helium/enabledPackage`)
-      .then(function (response, status) {
-        return response.data.body
+      .then(function(response, status) {
+        return response.data.body;
       })
-      .catch(function (error) {
-        console.error('Failed to get all enabled package infos', error)
-      })
-  }
+      .catch(function(error) {
+        console.error('Failed to get all enabled package infos', error);
+      });
+  };
 
-  this.getSingleBundle = function (pkgName) {
-    let url = `${baseUrlSrv.getRestApiBase()}/helium/bundle/load/${pkgName}`
+  this.getSingleBundle = function(pkgName) {
+    let url = `${baseUrlSrv.getRestApiBase()}/helium/bundle/load/${pkgName}`;
     if (process.env.HELIUM_BUNDLE_DEV) {
-      url = url + '?refresh=true'
+      url = url + '?refresh=true';
     }
 
     return $http.get(url)
-      .then(function (response, status) {
-        const bundle = response.data
+      .then(function(response, status) {
+        const bundle = response.data;
         if (bundle.substring(0, 'ERROR:'.length) === 'ERROR:') {
-          console.error(`Failed to get bundle: ${pkgName}`, bundle)
-          return '' // empty bundle will be filtered later
+          console.error(`Failed to get bundle: ${pkgName}`, bundle);
+          return ''; // empty bundle will be filtered later
         }
 
-        return bundle
-      })
-      .catch(function (error) {
-        console.error(`Failed to get single bundle: ${pkgName}`, error)
+        return bundle;
       })
-  }
+      .catch(function(error) {
+        console.error(`Failed to get single bundle: ${pkgName}`, error);
+      });
+  };
 
-  this.getDefaultPackages = function () {
+  this.getDefaultPackages = function() {
     return this.getAllPackageInfo()
-      .then(pkgSearchResults => {
-        return createDefaultPackages(pkgSearchResults, $sce)
-      })
-  }
+      .then((pkgSearchResults) => {
+        return createDefaultPackages(pkgSearchResults, $sce);
+      });
+  };
 
-  this.getAllPackageInfoAndDefaultPackages = function () {
+  this.getAllPackageInfoAndDefaultPackages = function() {
     return this.getAllPackageInfo()
-      .then(pkgSearchResults => {
+      .then((pkgSearchResults) => {
         return {
           pkgSearchResults: pkgSearchResults,
           defaultPackages: createDefaultPackages(pkgSearchResults, $sce),
-        }
-      })
-  }
+        };
+      });
+  };
 
   /**
    * get all package configs.
    * @return { Promise<{name, Array<Object>}> }
    */
-  this.getAllPackageConfigs = function () {
-    const promisedDefaultPackages = this.getDefaultPackages()
+  this.getAllPackageConfigs = function() {
+    const promisedDefaultPackages = this.getDefaultPackages();
     const promisedPersistedConfs =
       $http.get(`${baseUrlSrv.getRestApiBase()}/helium/config`)
-      .then(function (response, status) {
-        return response.data.body
-      })
+      .then(function(response, status) {
+        return response.data.body;
+      });
 
     return Promise.all([promisedDefaultPackages, promisedPersistedConfs])
-      .then(values => {
-        const defaultPackages = values[0]
-        const persistedConfs = values[1]
+      .then((values) => {
+        const defaultPackages = values[0];
+        const persistedConfs = values[1];
 
-        return createAllPackageConfigs(defaultPackages, persistedConfs)
-      })
-      .catch(function (error) {
-        console.error('Failed to get all package configs', error)
+        return createAllPackageConfigs(defaultPackages, persistedConfs);
       })
-  }
+      .catch(function(error) {
+        console.error('Failed to get all package configs', error);
+      });
+  };
 
   /**
    * get the package config which is persisted in server.
    * @return { Promise<Array<Object>> }
    */
-  this.getSinglePackageConfigs = function (pkg) {
-    const pkgName = pkg.name
+  this.getSinglePackageConfigs = function(pkg) {
+    const pkgName = pkg.name;
     // in case of local package, it will include `/`
-    const pkgArtifact = encodeURIComponent(pkg.artifact)
+    const pkgArtifact = encodeURIComponent(pkg.artifact);
 
     if (!pkgName || !pkgArtifact) {
-      console.error('Failed to fetch config for\n', pkg)
-      return Promise.resolve([])
+      console.error('Failed to fetch config for\n', pkg);
+      return Promise.resolve([]);
     }
 
-    const confUrl = `${baseUrlSrv.getRestApiBase()}/helium/config/${pkgName}/${pkgArtifact}`
+    const confUrl = `${baseUrlSrv.getRestApiBase()}/helium/config/${pkgName}/${pkgArtifact}`;
     const promisedConf = $http.get(confUrl)
-      .then(function (response, status) {
-        return response.data.body
-      })
+      .then(function(response, status) {
+        return response.data.body;
+      });
 
     return promisedConf.then(({confSpec, confPersisted}) => {
-      const merged = mergePersistedConfWithSpec(confPersisted, confSpec)
-      return merged
-    })
-  }
+      const merged = mergePersistedConfWithSpec(confPersisted, confSpec);
+      return merged;
+    });
+  };
 
-  this.getSinglePackageConfigUsingMagic = function (magic) {
-    const pkgName = pkgNamePerMagic[magic]
+  this.getSinglePackageConfigUsingMagic = function(magic) {
+    const pkgName = pkgNamePerMagic[magic];
 
-    const confUrl = `${baseUrlSrv.getRestApiBase()}/helium/spell/config/${pkgName}`
+    const confUrl = `${baseUrlSrv.getRestApiBase()}/helium/spell/config/${pkgName}`;
     const promisedConf = $http.get(confUrl)
-      .then(function (response, status) {
-        return response.data.body
-      })
+      .then(function(response, status) {
+        return response.data.body;
+      });
 
     return promisedConf.then(({confSpec, confPersisted}) => {
-      const merged = mergePersistedConfWithSpec(confPersisted, confSpec)
-      return merged
-    })
-  }
+      const merged = mergePersistedConfWithSpec(confPersisted, confSpec);
+      return merged;
+    });
+  };
 
   const p = this.getAllEnabledPackages()
-    .then(enabledPackageSearchResults => {
-      const promises = enabledPackageSearchResults.map(packageSearchResult => {
-        const pkgName = packageSearchResult.pkg.name
-        return this.getSingleBundle(pkgName)
-      })
+    .then((enabledPackageSearchResults) => {
+      const promises = enabledPackageSearchResults.map((packageSearchResult) => {
+        const pkgName = packageSearchResult.pkg.name;
+        return this.getSingleBundle(pkgName);
+      });
 
-      return Promise.all(promises)
+      return Promise.all(promises);
     })
-    .then(bundles => {
+    .then((bundles) => {
       return bundles.reduce((acc, b) => {
         // filter out empty bundle
-        if (b === '') { return acc }
-        acc.push(b)
-        return acc
-      }, [])
-    })
+        if (b === '') {
+          return acc;
+        }
+        acc.push(b);
+        return acc;
+      }, []);
+    });
 
   // load should be promise
-  this.load = p.then(availableBundles => {
+  this.load = p.then((availableBundles) => {
     // evaluate bundles
-    availableBundles.map(b => {
+    availableBundles.map((b) => {
       // eslint-disable-next-line no-eval
-      eval(b)
-    })
+      eval(b);
+    });
 
     // extract bundles by type
-    heliumBundles.map(b => {
+    heliumBundles.map((b) => {
       if (b.type === HeliumType.SPELL) {
-        const spell = new b.class() // eslint-disable-line new-cap
-        const pkgName = b.id
-        spellPerMagic[spell.getMagic()] = spell
-        pkgNamePerMagic[spell.getMagic()] = pkgName
+        const spell = new b.class(); // eslint-disable-line new-cap
+        const pkgName = b.id;
+        spellPerMagic[spell.getMagic()] = spell;
+        pkgNamePerMagic[spell.getMagic()] = pkgName;
       } else if (b.type === HeliumType.VISUALIZATION) {
-        visualizationBundles.push(b)
+        visualizationBundles.push(b);
       }
-    })
-  })
+    });
+  });
 
   this.init = function() {
-    this.getVisualizationPackageOrder()
-  }
+    this.getVisualizationPackageOrder();
+  };
 
   // init
-  this.init()
+  this.init();
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/helium/index.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/helium/index.js b/zeppelin-web/src/app/helium/index.js
index 2b27d60..754c949 100644
--- a/zeppelin-web/src/app/helium/index.js
+++ b/zeppelin-web/src/app/helium/index.js
@@ -12,7 +12,7 @@
  * limitations under the License.
  */
 
-import HeliumController from './helium.controller'
+import HeliumController from './helium.controller';
 
 angular.module('zeppelinWebApp')
-  .controller('HeliumCtrl', HeliumController)
+  .controller('HeliumCtrl', HeliumController);

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/home/home.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/home/home.controller.js b/zeppelin-web/src/app/home/home.controller.js
index d2823dd..7ae5e44 100644
--- a/zeppelin-web/src/app/home/home.controller.js
+++ b/zeppelin-web/src/app/home/home.controller.js
@@ -12,145 +12,145 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').controller('HomeCtrl', HomeCtrl)
+angular.module('zeppelinWebApp').controller('HomeCtrl', HomeCtrl);
 
-function HomeCtrl ($scope, noteListFactory, websocketMsgSrv, $rootScope, arrayOrderingSrv,
+function HomeCtrl($scope, noteListFactory, websocketMsgSrv, $rootScope, arrayOrderingSrv,
                   ngToast, noteActionService, TRASH_FOLDER_ID) {
-  'ngInject'
-
-  ngToast.dismiss()
-  let vm = this
-  vm.notes = noteListFactory
-  vm.websocketMsgSrv = websocketMsgSrv
-  vm.arrayOrderingSrv = arrayOrderingSrv
-  vm.noteActionService = noteActionService
-  vm.numberOfNotesDisplayed = window.innerHeight / 20
-
-  vm.notebookHome = false
-  vm.noteCustomHome = true
+  'ngInject';
+
+  ngToast.dismiss();
+  let vm = this;
+  vm.notes = noteListFactory;
+  vm.websocketMsgSrv = websocketMsgSrv;
+  vm.arrayOrderingSrv = arrayOrderingSrv;
+  vm.noteActionService = noteActionService;
+  vm.numberOfNotesDisplayed = window.innerHeight / 20;
+
+  vm.notebookHome = false;
+  vm.noteCustomHome = true;
   if ($rootScope.ticket !== undefined) {
-    vm.staticHome = false
+    vm.staticHome = false;
   } else {
-    vm.staticHome = true
+    vm.staticHome = true;
   }
 
-  $scope.isReloading = false
-  $scope.TRASH_FOLDER_ID = TRASH_FOLDER_ID
-  $scope.query = {q: ''}
+  $scope.isReloading = false;
+  $scope.TRASH_FOLDER_ID = TRASH_FOLDER_ID;
+  $scope.query = {q: ''};
 
-  $scope.initHome = function () {
-    websocketMsgSrv.getHomeNote()
-    vm.noteCustomHome = false
-  }
+  $scope.initHome = function() {
+    websocketMsgSrv.getHomeNote();
+    vm.noteCustomHome = false;
+  };
 
-  $scope.reloadNoteList = function () {
-    websocketMsgSrv.reloadAllNotesFromRepo()
-    $scope.isReloadingNotes = true
-  }
+  $scope.reloadNoteList = function() {
+    websocketMsgSrv.reloadAllNotesFromRepo();
+    $scope.isReloadingNotes = true;
+  };
 
-  $scope.toggleFolderNode = function (node) {
-    node.hidden = !node.hidden
-  }
+  $scope.toggleFolderNode = function(node) {
+    node.hidden = !node.hidden;
+  };
 
-  angular.element('#loginModal').on('hidden.bs.modal', function (e) {
-    $rootScope.$broadcast('initLoginValues')
-  })
+  angular.element('#loginModal').on('hidden.bs.modal', function(e) {
+    $rootScope.$broadcast('initLoginValues');
+  });
 
   /*
    ** $scope.$on functions below
    */
 
-  $scope.$on('setNoteMenu', function (event, notes) {
-    $scope.isReloadingNotes = false
-  })
+  $scope.$on('setNoteMenu', function(event, notes) {
+    $scope.isReloadingNotes = false;
+  });
 
-  $scope.$on('setNoteContent', function (event, note) {
+  $scope.$on('setNoteContent', function(event, note) {
     if (vm.noteCustomHome) {
-      return
+      return;
     }
 
     if (note) {
-      vm.note = note
+      vm.note = note;
 
       // initialize look And Feel
-      $rootScope.$broadcast('setLookAndFeel', 'home')
+      $rootScope.$broadcast('setLookAndFeel', 'home');
 
       // make it read only
-      vm.viewOnly = true
+      vm.viewOnly = true;
 
-      vm.notebookHome = true
-      vm.staticHome = false
+      vm.notebookHome = true;
+      vm.staticHome = false;
     } else {
-      vm.staticHome = true
-      vm.notebookHome = false
+      vm.staticHome = true;
+      vm.notebookHome = false;
     }
-  })
+  });
 
-  $scope.loadMoreNotes = function () {
-    vm.numberOfNotesDisplayed += 10
-  }
+  $scope.loadMoreNotes = function() {
+    vm.numberOfNotesDisplayed += 10;
+  };
 
-  $scope.renameNote = function (nodeId, nodePath) {
-    vm.noteActionService.renameNote(nodeId, nodePath)
-  }
+  $scope.renameNote = function(nodeId, nodePath) {
+    vm.noteActionService.renameNote(nodeId, nodePath);
+  };
 
-  $scope.moveNoteToTrash = function (noteId) {
-    vm.noteActionService.moveNoteToTrash(noteId, false)
-  }
+  $scope.moveNoteToTrash = function(noteId) {
+    vm.noteActionService.moveNoteToTrash(noteId, false);
+  };
 
-  $scope.moveFolderToTrash = function (folderId) {
-    vm.noteActionService.moveFolderToTrash(folderId)
-  }
+  $scope.moveFolderToTrash = function(folderId) {
+    vm.noteActionService.moveFolderToTrash(folderId);
+  };
 
-  $scope.restoreNote = function (noteId) {
-    websocketMsgSrv.restoreNote(noteId)
-  }
+  $scope.restoreNote = function(noteId) {
+    websocketMsgSrv.restoreNote(noteId);
+  };
 
-  $scope.restoreFolder = function (folderId) {
-    websocketMsgSrv.restoreFolder(folderId)
-  }
+  $scope.restoreFolder = function(folderId) {
+    websocketMsgSrv.restoreFolder(folderId);
+  };
 
-  $scope.restoreAll = function () {
-    vm.noteActionService.restoreAll()
-  }
+  $scope.restoreAll = function() {
+    vm.noteActionService.restoreAll();
+  };
 
-  $scope.renameFolder = function (node) {
-    vm.noteActionService.renameFolder(node.id)
-  }
+  $scope.renameFolder = function(node) {
+    vm.noteActionService.renameFolder(node.id);
+  };
 
-  $scope.removeNote = function (noteId) {
-    vm.noteActionService.removeNote(noteId, false)
-  }
+  $scope.removeNote = function(noteId) {
+    vm.noteActionService.removeNote(noteId, false);
+  };
 
-  $scope.removeFolder = function (folderId) {
-    vm.noteActionService.removeFolder(folderId)
-  }
+  $scope.removeFolder = function(folderId) {
+    vm.noteActionService.removeFolder(folderId);
+  };
 
-  $scope.emptyTrash = function () {
-    vm.noteActionService.emptyTrash()
-  }
+  $scope.emptyTrash = function() {
+    vm.noteActionService.emptyTrash();
+  };
 
-  $scope.clearAllParagraphOutput = function (noteId) {
-    vm.noteActionService.clearAllParagraphOutput(noteId)
-  }
+  $scope.clearAllParagraphOutput = function(noteId) {
+    vm.noteActionService.clearAllParagraphOutput(noteId);
+  };
 
-  $scope.isFilterNote = function (note) {
+  $scope.isFilterNote = function(note) {
     if (!$scope.query.q) {
-      return true
+      return true;
     }
 
-    let noteName = note.name
+    let noteName = note.name;
     if (noteName.toLowerCase().indexOf($scope.query.q.toLowerCase()) > -1) {
-      return true
+      return true;
     }
-    return false
-  }
+    return false;
+  };
 
-  $scope.getNoteName = function (note) {
-    return arrayOrderingSrv.getNoteName(note)
-  }
+  $scope.getNoteName = function(note) {
+    return arrayOrderingSrv.getNoteName(note);
+  };
 
-  $scope.noteComparator = function (note1, note2) {
-    return arrayOrderingSrv.noteComparator(note1, note2)
-  }
+  $scope.noteComparator = function(note1, note2) {
+    return arrayOrderingSrv.noteComparator(note1, note2);
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/interpreter/interpreter-item.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/interpreter/interpreter-item.directive.js b/zeppelin-web/src/app/interpreter/interpreter-item.directive.js
index 4bde44d..cfb109a 100644
--- a/zeppelin-web/src/app/interpreter/interpreter-item.directive.js
+++ b/zeppelin-web/src/app/interpreter/interpreter-item.directive.js
@@ -12,20 +12,20 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').directive('interpreterItem', InterpreterItemDirective)
+angular.module('zeppelinWebApp').directive('interpreterItem', InterpreterItemDirective);
 
-function InterpreterItemDirective ($timeout) {
-  'ngInject'
+function InterpreterItemDirective($timeout) {
+  'ngInject';
 
   return {
     restrict: 'A',
-    link: function (scope, element, attr) {
+    link: function(scope, element, attr) {
       if (scope.$last === true) {
-        $timeout(function () {
-          let id = 'ngRenderFinished'
-          scope.$emit(id)
-        })
+        $timeout(function() {
+          let id = 'ngRenderFinished';
+          scope.$emit(id);
+        });
       }
-    }
-  }
+    },
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/interpreter/interpreter.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js
index ef88402..060c6b6 100644
--- a/zeppelin-web/src/app/interpreter/interpreter.controller.js
+++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js
@@ -12,548 +12,552 @@
  * limitations under the License.
  */
 
-import { ParagraphStatus, } from '../notebook/paragraph/paragraph.status'
+import {ParagraphStatus} from '../notebook/paragraph/paragraph.status';
 
-angular.module('zeppelinWebApp').controller('InterpreterCtrl', InterpreterCtrl)
+angular.module('zeppelinWebApp').controller('InterpreterCtrl', InterpreterCtrl);
 
 function InterpreterCtrl($rootScope, $scope, $http, baseUrlSrv, ngToast, $timeout, $route) {
-  'ngInject'
-
-  let interpreterSettingsTmp = []
-  $scope.interpreterSettings = []
-  $scope.availableInterpreters = {}
-  $scope.showAddNewSetting = false
-  $scope.showRepositoryInfo = false
-  $scope.searchInterpreter = ''
-  $scope._ = _
-  $scope.interpreterPropertyTypes = []
-  ngToast.dismiss()
-
-  $scope.openPermissions = function () {
-    $scope.showInterpreterAuth = true
-  }
-
-  $scope.closePermissions = function () {
-    $scope.showInterpreterAuth = false
-  }
-
-  let getSelectJson = function () {
+  'ngInject';
+
+  let interpreterSettingsTmp = [];
+  $scope.interpreterSettings = [];
+  $scope.availableInterpreters = {};
+  $scope.showAddNewSetting = false;
+  $scope.showRepositoryInfo = false;
+  $scope.searchInterpreter = '';
+  $scope._ = _;
+  $scope.interpreterPropertyTypes = [];
+  ngToast.dismiss();
+
+  $scope.openPermissions = function() {
+    $scope.showInterpreterAuth = true;
+  };
+
+  $scope.closePermissions = function() {
+    $scope.showInterpreterAuth = false;
+  };
+
+  let getSelectJson = function() {
     let selectJson = {
       tags: true,
       minimumInputLength: 3,
       multiple: true,
       tokenSeparators: [',', ' '],
       ajax: {
-        url: function (params) {
+        url: function(params) {
           if (!params.term) {
-            return false
+            return false;
           }
-          return baseUrlSrv.getRestApiBase() + '/security/userlist/' + params.term
+          return baseUrlSrv.getRestApiBase() + '/security/userlist/' + params.term;
         },
         delay: 250,
-        processResults: function (data, params) {
-          let results = []
+        processResults: function(data, params) {
+          let results = [];
 
           if (data.body.users.length !== 0) {
-            let users = []
+            let users = [];
             for (let len = 0; len < data.body.users.length; len++) {
               users.push({
                 'id': data.body.users[len],
-                'text': data.body.users[len]
-              })
+                'text': data.body.users[len],
+              });
             }
             results.push({
               'text': 'Users :',
-              'children': users
-            })
+              'children': users,
+            });
           }
           if (data.body.roles.length !== 0) {
-            let roles = []
+            let roles = [];
             for (let len = 0; len < data.body.roles.length; len++) {
               roles.push({
                 'id': data.body.roles[len],
-                'text': data.body.roles[len]
-              })
+                'text': data.body.roles[len],
+              });
             }
             results.push({
               'text': 'Roles :',
-              'children': roles
-            })
+              'children': roles,
+            });
           }
           return {
             results: results,
             pagination: {
-              more: false
-            }
-          }
+              more: false,
+            },
+          };
         },
-        cache: false
-      }
-    }
-    return selectJson
-  }
-
-  $scope.togglePermissions = function (intpName) {
-    angular.element('#' + intpName + 'Owners').select2(getSelectJson())
+        cache: false,
+      },
+    };
+    return selectJson;
+  };
+
+  $scope.togglePermissions = function(intpName) {
+    angular.element('#' + intpName + 'Owners').select2(getSelectJson());
     if ($scope.showInterpreterAuth) {
-      $scope.closePermissions()
+      $scope.closePermissions();
     } else {
-      $scope.openPermissions()
+      $scope.openPermissions();
     }
-  }
+  };
 
-  $scope.$on('ngRenderFinished', function (event, data) {
+  $scope.$on('ngRenderFinished', function(event, data) {
     for (let setting = 0; setting < $scope.interpreterSettings.length; setting++) {
-      angular.element('#' + $scope.interpreterSettings[setting].name + 'Owners').select2(getSelectJson())
+      angular.element('#' + $scope.interpreterSettings[setting].name + 'Owners').select2(getSelectJson());
     }
-  })
+  });
 
-  let getInterpreterSettings = function () {
+  let getInterpreterSettings = function() {
     $http.get(baseUrlSrv.getRestApiBase() + '/interpreter/setting')
-      .then(function (res) {
-        $scope.interpreterSettings = res.data.body
-        checkDownloadingDependencies()
-      }).catch(function (res) {
+      .then(function(res) {
+        $scope.interpreterSettings = res.data.body;
+        checkDownloadingDependencies();
+      }).catch(function(res) {
         if (res.status === 401) {
           ngToast.danger({
             content: 'You don\'t have permission on this page',
             verticalPosition: 'bottom',
-            timeout: '3000'
-          })
-          setTimeout(function () {
-            window.location = baseUrlSrv.getBase()
-          }, 3000)
+            timeout: '3000',
+          });
+          setTimeout(function() {
+            window.location = baseUrlSrv.getBase();
+          }, 3000);
         }
-        console.log('Error %o %o', res.status, res.data ? res.data.message : '')
-      })
-  }
+        console.log('Error %o %o', res.status, res.data ? res.data.message : '');
+      });
+  };
 
-  const checkDownloadingDependencies = function () {
-    let isDownloading = false
+  const checkDownloadingDependencies = function() {
+    let isDownloading = false;
     for (let index = 0; index < $scope.interpreterSettings.length; index++) {
-      let setting = $scope.interpreterSettings[index]
+      let setting = $scope.interpreterSettings[index];
       if (setting.status === 'DOWNLOADING_DEPENDENCIES') {
-        isDownloading = true
+        isDownloading = true;
       }
 
       if (setting.status === ParagraphStatus.ERROR || setting.errorReason) {
         ngToast.danger({content: 'Error setting properties for interpreter \'' +
         setting.group + '.' + setting.name + '\': ' + setting.errorReason,
           verticalPosition: 'top',
-          dismissOnTimeout: false
-        })
+          dismissOnTimeout: false,
+        });
       }
     }
 
     if (isDownloading) {
-      $timeout(function () {
+      $timeout(function() {
         if ($route.current.$$route.originalPath === '/interpreter') {
-          getInterpreterSettings()
+          getInterpreterSettings();
         }
-      }, 2000)
+      }, 2000);
     }
-  }
+  };
 
-  let getAvailableInterpreters = function () {
-    $http.get(baseUrlSrv.getRestApiBase() + '/interpreter').then(function (res) {
-      $scope.availableInterpreters = res.data.body
-    }).catch(function (res) {
-      console.log('Error %o %o', res.status, res.data ? res.data.message : '')
-    })
-  }
+  let getAvailableInterpreters = function() {
+    $http.get(baseUrlSrv.getRestApiBase() + '/interpreter').then(function(res) {
+      $scope.availableInterpreters = res.data.body;
+    }).catch(function(res) {
+      console.log('Error %o %o', res.status, res.data ? res.data.message : '');
+    });
+  };
 
-  let getAvailableInterpreterPropertyWidgets = function () {
+  let getAvailableInterpreterPropertyWidgets = function() {
     $http.get(baseUrlSrv.getRestApiBase() + '/interpreter/property/types')
-      .then(function (res) {
-        $scope.interpreterPropertyTypes = res.data.body
-      }).catch(function (res) {
-        console.log('Error %o %o', res.status, res.data ? res.data.message : '')
-      })
-  }
+      .then(function(res) {
+        $scope.interpreterPropertyTypes = res.data.body;
+      }).catch(function(res) {
+        console.log('Error %o %o', res.status, res.data ? res.data.message : '');
+      });
+  };
 
   let emptyNewProperty = function(object) {
-    angular.extend(object, {propertyValue: '', propertyKey: '', propertyType: $scope.interpreterPropertyTypes[0]})
-  }
+    angular.extend(object, {propertyValue: '', propertyKey: '', propertyType: $scope.interpreterPropertyTypes[0]});
+  };
 
-  let emptyNewDependency = function (object) {
-    angular.extend(object, {depArtifact: '', depExclude: ''})
-  }
+  let emptyNewDependency = function(object) {
+    angular.extend(object, {depArtifact: '', depExclude: ''});
+  };
 
-  let removeTMPSettings = function (index) {
-    interpreterSettingsTmp.splice(index, 1)
-  }
+  let removeTMPSettings = function(index) {
+    interpreterSettingsTmp.splice(index, 1);
+  };
 
-  $scope.copyOriginInterpreterSettingProperties = function (settingId) {
-    let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-    interpreterSettingsTmp[index] = angular.copy($scope.interpreterSettings[index])
-  }
+  $scope.copyOriginInterpreterSettingProperties = function(settingId) {
+    let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+    interpreterSettingsTmp[index] = angular.copy($scope.interpreterSettings[index]);
+  };
 
-  $scope.setPerNoteOption = function (settingId, sessionOption) {
-    let option
+  $scope.setPerNoteOption = function(settingId, sessionOption) {
+    let option;
     if (settingId === undefined) {
-      option = $scope.newInterpreterSetting.option
+      option = $scope.newInterpreterSetting.option;
     } else {
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-      let setting = $scope.interpreterSettings[index]
-      option = setting.option
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+      let setting = $scope.interpreterSettings[index];
+      option = setting.option;
     }
 
     if (sessionOption === 'isolated') {
-      option.perNote = sessionOption
-      option.session = false
-      option.process = true
+      option.perNote = sessionOption;
+      option.session = false;
+      option.process = true;
     } else if (sessionOption === 'scoped') {
-      option.perNote = sessionOption
-      option.session = true
-      option.process = false
+      option.perNote = sessionOption;
+      option.session = true;
+      option.process = false;
     } else {
-      option.perNote = 'shared'
-      option.session = false
-      option.process = false
+      option.perNote = 'shared';
+      option.session = false;
+      option.process = false;
     }
-  }
+  };
 
-  $scope.defaultValueByType = function (setting) {
+  $scope.defaultValueByType = function(setting) {
     if (setting.propertyType === 'checkbox') {
-      setting.propertyValue = false
-      return
+      setting.propertyValue = false;
+      return;
     }
 
-    setting.propertyValue = ''
-  }
+    setting.propertyValue = '';
+  };
 
-  $scope.setPerUserOption = function (settingId, sessionOption) {
-    let option
+  $scope.setPerUserOption = function(settingId, sessionOption) {
+    let option;
     if (settingId === undefined) {
-      option = $scope.newInterpreterSetting.option
+      option = $scope.newInterpreterSetting.option;
     } else {
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-      let setting = $scope.interpreterSettings[index]
-      option = setting.option
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+      let setting = $scope.interpreterSettings[index];
+      option = setting.option;
     }
 
     if (sessionOption === 'isolated') {
-      option.perUser = sessionOption
-      option.session = false
-      option.process = true
+      option.perUser = sessionOption;
+      option.session = false;
+      option.process = true;
     } else if (sessionOption === 'scoped') {
-      option.perUser = sessionOption
-      option.session = true
-      option.process = false
+      option.perUser = sessionOption;
+      option.session = true;
+      option.process = false;
     } else {
-      option.perUser = 'shared'
-      option.session = false
-      option.process = false
+      option.perUser = 'shared';
+      option.session = false;
+      option.process = false;
     }
-  }
+  };
 
-  $scope.getPerNoteOption = function (settingId) {
-    let option
+  $scope.getPerNoteOption = function(settingId) {
+    let option;
     if (settingId === undefined) {
-      option = $scope.newInterpreterSetting.option
+      option = $scope.newInterpreterSetting.option;
     } else {
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-      let setting = $scope.interpreterSettings[index]
-      option = setting.option
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+      let setting = $scope.interpreterSettings[index];
+      option = setting.option;
     }
 
     if (option.perNote === 'scoped') {
-      return 'scoped'
+      return 'scoped';
     } else if (option.perNote === 'isolated') {
-      return 'isolated'
+      return 'isolated';
     } else {
-      return 'shared'
+      return 'shared';
     }
-  }
+  };
 
-  $scope.getPerUserOption = function (settingId) {
-    let option
+  $scope.getPerUserOption = function(settingId) {
+    let option;
     if (settingId === undefined) {
-      option = $scope.newInterpreterSetting.option
+      option = $scope.newInterpreterSetting.option;
     } else {
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-      let setting = $scope.interpreterSettings[index]
-      option = setting.option
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+      let setting = $scope.interpreterSettings[index];
+      option = setting.option;
     }
 
     if (option.perUser === 'scoped') {
-      return 'scoped'
+      return 'scoped';
     } else if (option.perUser === 'isolated') {
-      return 'isolated'
+      return 'isolated';
     } else {
-      return 'shared'
+      return 'shared';
     }
-  }
+  };
 
-  $scope.getInterpreterRunningOption = function (settingId) {
-    let sharedModeName = 'shared'
+  $scope.getInterpreterRunningOption = function(settingId) {
+    let sharedModeName = 'shared';
 
-    let globallyModeName = 'Globally'
-    let perNoteModeName = 'Per Note'
-    let perUserModeName = 'Per User'
+    let globallyModeName = 'Globally';
+    let perNoteModeName = 'Per Note';
+    let perUserModeName = 'Per User';
 
-    let option
+    let option;
     if (settingId === undefined) {
-      option = $scope.newInterpreterSetting.option
+      option = $scope.newInterpreterSetting.option;
     } else {
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-      let setting = $scope.interpreterSettings[index]
-      option = setting.option
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+      let setting = $scope.interpreterSettings[index];
+      option = setting.option;
     }
 
-    let perNote = option.perNote
-    let perUser = option.perUser
+    let perNote = option.perNote;
+    let perUser = option.perUser;
 
     // Globally == shared_perNote + shared_perUser
     if (perNote === sharedModeName && perUser === sharedModeName) {
-      return globallyModeName
+      return globallyModeName;
     }
 
     if ($rootScope.ticket.ticket === 'anonymous' && $rootScope.ticket.roles === '[]') {
       if (perNote !== undefined && typeof perNote === 'string' && perNote !== '') {
-        return perNoteModeName
+        return perNoteModeName;
       }
     } else if ($rootScope.ticket.ticket !== 'anonymous') {
       if (perNote !== undefined && typeof perNote === 'string' && perNote !== '') {
         if (perUser !== undefined && typeof perUser === 'string' && perUser !== '') {
-          return perUserModeName
+          return perUserModeName;
         }
-        return perNoteModeName
+        return perNoteModeName;
       }
     }
 
-    option.perNote = sharedModeName
-    option.perUser = sharedModeName
-    return globallyModeName
-  }
+    option.perNote = sharedModeName;
+    option.perUser = sharedModeName;
+    return globallyModeName;
+  };
 
-  $scope.setInterpreterRunningOption = function (settingId, isPerNoteMode, isPerUserMode) {
-    let option
+  $scope.setInterpreterRunningOption = function(settingId, isPerNoteMode, isPerUserMode) {
+    let option;
     if (settingId === undefined) {
-      option = $scope.newInterpreterSetting.option
+      option = $scope.newInterpreterSetting.option;
     } else {
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-      let setting = $scope.interpreterSettings[index]
-      option = setting.option
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+      let setting = $scope.interpreterSettings[index];
+      option = setting.option;
     }
-    option.perNote = isPerNoteMode
-    option.perUser = isPerUserMode
-  }
+    option.perNote = isPerNoteMode;
+    option.perUser = isPerUserMode;
+  };
 
-  $scope.updateInterpreterSetting = function (form, settingId) {
+  $scope.updateInterpreterSetting = function(form, settingId) {
     const thisConfirm = BootstrapDialog.confirm({
       closable: false,
       closeByBackdrop: false,
       closeByKeyboard: false,
       title: '',
       message: 'Do you want to update this interpreter and restart with new settings?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-          let setting = $scope.interpreterSettings[index]
+          let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+          let setting = $scope.interpreterSettings[index];
           if (setting.propertyKey !== '' || setting.propertyKey) {
-            $scope.addNewInterpreterProperty(settingId)
+            $scope.addNewInterpreterProperty(settingId);
           }
           if (setting.depArtifact !== '' || setting.depArtifact) {
-            $scope.addNewInterpreterDependency(settingId)
+            $scope.addNewInterpreterDependency(settingId);
           }
           // add missing field of option
           if (!setting.option) {
-            setting.option = {}
+            setting.option = {};
           }
           if (setting.option.isExistingProcess === undefined) {
-            setting.option.isExistingProcess = false
+            setting.option.isExistingProcess = false;
           }
           if (setting.option.setPermission === undefined) {
-            setting.option.setPermission = false
+            setting.option.setPermission = false;
           }
           if (setting.option.isUserImpersonate === undefined) {
-            setting.option.isUserImpersonate = false
+            setting.option.isUserImpersonate = false;
           }
           if (!($scope.getInterpreterRunningOption(settingId) === 'Per User' &&
             $scope.getPerUserOption(settingId) === 'isolated')) {
-            setting.option.isUserImpersonate = false
+            setting.option.isUserImpersonate = false;
           }
           if (setting.option.remote === undefined) {
             // remote always true for now
-            setting.option.remote = true
+            setting.option.remote = true;
           }
-          setting.option.owners = angular.element('#' + setting.name + 'Owners').val()
+          setting.option.owners = angular.element('#' + setting.name + 'Owners').val();
 
           let request = {
             option: angular.copy(setting.option),
             properties: angular.copy(setting.properties),
-            dependencies: angular.copy(setting.dependencies)
-          }
+            dependencies: angular.copy(setting.dependencies),
+          };
 
-          thisConfirm.$modalFooter.find('button').addClass('disabled')
+          thisConfirm.$modalFooter.find('button').addClass('disabled');
           thisConfirm.$modalFooter.find('button:contains("OK")')
-            .html('<i class="fa fa-circle-o-notch fa-spin"></i> Saving Setting')
+            .html('<i class="fa fa-circle-o-notch fa-spin"></i> Saving Setting');
 
           $http.put(baseUrlSrv.getRestApiBase() + '/interpreter/setting/' + settingId, request)
-            .then(function (res) {
-              $scope.interpreterSettings[index] = res.data.body
-              removeTMPSettings(index)
-              checkDownloadingDependencies()
-              thisConfirm.close()
-            })
-            .catch(function (res) {
-              const message = res.data ? res.data.message : 'Could not connect to server.'
-              console.log('Error %o %o', res.status, message)
-              ngToast.danger({content: message, verticalPosition: 'bottom'})
-              form.$show()
-              thisConfirm.close()
+            .then(function(res) {
+              $scope.interpreterSettings[index] = res.data.body;
+              removeTMPSettings(index);
+              checkDownloadingDependencies();
+              thisConfirm.close();
             })
-          return false
+            .catch(function(res) {
+              const message = res.data ? res.data.message : 'Could not connect to server.';
+              console.log('Error %o %o', res.status, message);
+              ngToast.danger({content: message, verticalPosition: 'bottom'});
+              form.$show();
+              thisConfirm.close();
+            });
+          return false;
         } else {
-          form.$show()
+          form.$show();
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  $scope.resetInterpreterSetting = function (settingId) {
-    let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
+  $scope.resetInterpreterSetting = function(settingId) {
+    let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
 
     // Set the old settings back
-    $scope.interpreterSettings[index] = angular.copy(interpreterSettingsTmp[index])
-    removeTMPSettings(index)
-  }
+    $scope.interpreterSettings[index] = angular.copy(interpreterSettingsTmp[index]);
+    removeTMPSettings(index);
+  };
 
-  $scope.removeInterpreterSetting = function (settingId) {
+  $scope.removeInterpreterSetting = function(settingId) {
     BootstrapDialog.confirm({
       closable: true,
       title: '',
       message: 'Do you want to delete this interpreter setting?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
           $http.delete(baseUrlSrv.getRestApiBase() + '/interpreter/setting/' + settingId)
-            .then(function (res) {
-              let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-              $scope.interpreterSettings.splice(index, 1)
-            }).catch(function (res) {
-              console.log('Error %o %o', res.status, res.data ? res.data.message : '')
-            })
+            .then(function(res) {
+              let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+              $scope.interpreterSettings.splice(index, 1);
+            }).catch(function(res) {
+              console.log('Error %o %o', res.status, res.data ? res.data.message : '');
+            });
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  $scope.newInterpreterGroupChange = function () {
+  $scope.newInterpreterGroupChange = function() {
     let el = _.pluck(_.filter($scope.availableInterpreters, {'name': $scope.newInterpreterSetting.group}),
-      'properties')
-    let properties = {}
+      'properties');
+    let properties = {};
     for (let i = 0; i < el.length; i++) {
-      let intpInfo = el[i]
+      let intpInfo = el[i];
       for (let key in intpInfo) {
-        properties[key] = {
-          value: intpInfo[key].defaultValue,
-          description: intpInfo[key].description,
-          type: intpInfo[key].type
+        if (intpInfo.hasOwnProperty(key)) {
+          properties[key] = {
+            value: intpInfo[key].defaultValue,
+            description: intpInfo[key].description,
+            type: intpInfo[key].type,
+          };
         }
       }
     }
-    $scope.newInterpreterSetting.properties = properties
-  }
+    $scope.newInterpreterSetting.properties = properties;
+  };
 
-  $scope.restartInterpreterSetting = function (settingId) {
+  $scope.restartInterpreterSetting = function(settingId) {
     BootstrapDialog.confirm({
       closable: true,
       title: '',
       message: 'Do you want to restart this interpreter?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
           $http.put(baseUrlSrv.getRestApiBase() + '/interpreter/setting/restart/' + settingId)
-            .then(function (res) {
-              let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-              $scope.interpreterSettings[index] = res.data.body
-              ngToast.info('Interpreter stopped. Will be lazily started on next run.')
-            }).catch(function (res) {
-              let errorMsg = (res.data !== null) ? res.data.message : 'Could not connect to server.'
-              console.log('Error %o %o', res.status, errorMsg)
-              ngToast.danger(errorMsg)
-            })
+            .then(function(res) {
+              let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+              $scope.interpreterSettings[index] = res.data.body;
+              ngToast.info('Interpreter stopped. Will be lazily started on next run.');
+            }).catch(function(res) {
+              let errorMsg = (res.data !== null) ? res.data.message : 'Could not connect to server.';
+              console.log('Error %o %o', res.status, errorMsg);
+              ngToast.danger(errorMsg);
+            });
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  $scope.addNewInterpreterSetting = function () {
+  $scope.addNewInterpreterSetting = function() {
     // user input validation on interpreter creation
     if (!$scope.newInterpreterSetting.name ||
       !$scope.newInterpreterSetting.name.trim() || !$scope.newInterpreterSetting.group) {
       BootstrapDialog.alert({
         closable: true,
         title: 'Add interpreter',
-        message: 'Please fill in interpreter name and choose a group'
-      })
-      return
+        message: 'Please fill in interpreter name and choose a group',
+      });
+      return;
     }
 
     if ($scope.newInterpreterSetting.name.indexOf('.') >= 0) {
       BootstrapDialog.alert({
         closable: true,
         title: 'Add interpreter',
-        message: '\'.\' is invalid for interpreter name'
-      })
-      return
+        message: '\'.\' is invalid for interpreter name',
+      });
+      return;
     }
 
     if (_.findIndex($scope.interpreterSettings, {'name': $scope.newInterpreterSetting.name}) >= 0) {
       BootstrapDialog.alert({
         closable: true,
         title: 'Add interpreter',
-        message: 'Name ' + $scope.newInterpreterSetting.name + ' already exists'
-      })
-      return
+        message: 'Name ' + $scope.newInterpreterSetting.name + ' already exists',
+      });
+      return;
     }
 
-    let newSetting = $scope.newInterpreterSetting
+    let newSetting = $scope.newInterpreterSetting;
     if (newSetting.propertyKey !== '' || newSetting.propertyKey) {
-      $scope.addNewInterpreterProperty()
+      $scope.addNewInterpreterProperty();
     }
     if (newSetting.depArtifact !== '' || newSetting.depArtifact) {
-      $scope.addNewInterpreterDependency()
+      $scope.addNewInterpreterDependency();
     }
     if (newSetting.option.setPermission === undefined) {
-      newSetting.option.setPermission = false
+      newSetting.option.setPermission = false;
     }
-    newSetting.option.owners = angular.element('#newInterpreterOwners').val()
+    newSetting.option.owners = angular.element('#newInterpreterOwners').val();
 
-    let request = angular.copy($scope.newInterpreterSetting)
+    let request = angular.copy($scope.newInterpreterSetting);
 
     // Change properties to proper request format
-    let newProperties = {}
+    let newProperties = {};
 
     for (let p in newSetting.properties) {
-      newProperties[p] = {
-        value: newSetting.properties[p].value,
-        type: newSetting.properties[p].type,
-        name: p
+      if (newSetting.properties.hasOwnProperty(p)) {
+        newProperties[p] = {
+          value: newSetting.properties[p].value,
+          type: newSetting.properties[p].type,
+          name: p,
+        };
       }
     }
 
-    request.properties = newProperties
+    request.properties = newProperties;
 
     $http.post(baseUrlSrv.getRestApiBase() + '/interpreter/setting', request)
-      .then(function (res) {
-        $scope.resetNewInterpreterSetting()
-        getInterpreterSettings()
-        $scope.showAddNewSetting = false
-        checkDownloadingDependencies()
-      }).catch(function (res) {
-        const errorMsg = res.data ? res.data.message : 'Could not connect to server.'
-        console.log('Error %o %o', res.status, errorMsg)
-        ngToast.danger({content: errorMsg, verticalPosition: 'bottom'})
-      })
-  }
-
-  $scope.cancelInterpreterSetting = function () {
-    $scope.showAddNewSetting = false
-    $scope.resetNewInterpreterSetting()
-  }
-
-  $scope.resetNewInterpreterSetting = function () {
+      .then(function(res) {
+        $scope.resetNewInterpreterSetting();
+        getInterpreterSettings();
+        $scope.showAddNewSetting = false;
+        checkDownloadingDependencies();
+      }).catch(function(res) {
+        const errorMsg = res.data ? res.data.message : 'Could not connect to server.';
+        console.log('Error %o %o', res.status, errorMsg);
+        ngToast.danger({content: errorMsg, verticalPosition: 'bottom'});
+      });
+  };
+
+  $scope.cancelInterpreterSetting = function() {
+    $scope.showAddNewSetting = false;
+    $scope.resetNewInterpreterSetting();
+  };
+
+  $scope.resetNewInterpreterSetting = function() {
     $scope.newInterpreterSetting = {
       name: undefined,
       group: undefined,
@@ -564,94 +568,94 @@ function InterpreterCtrl($rootScope, $scope, $http, baseUrlSrv, ngToast, $timeou
         isExistingProcess: false,
         setPermission: false,
         session: false,
-        process: false
+        process: false,
 
-      }
-    }
-    emptyNewProperty($scope.newInterpreterSetting)
-  }
+      },
+    };
+    emptyNewProperty($scope.newInterpreterSetting);
+  };
 
-  $scope.removeInterpreterProperty = function (key, settingId) {
+  $scope.removeInterpreterProperty = function(key, settingId) {
     if (settingId === undefined) {
-      delete $scope.newInterpreterSetting.properties[key]
+      delete $scope.newInterpreterSetting.properties[key];
     } else {
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-      delete $scope.interpreterSettings[index].properties[key]
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+      delete $scope.interpreterSettings[index].properties[key];
     }
-  }
+  };
 
-  $scope.removeInterpreterDependency = function (artifact, settingId) {
+  $scope.removeInterpreterDependency = function(artifact, settingId) {
     if (settingId === undefined) {
       $scope.newInterpreterSetting.dependencies = _.reject($scope.newInterpreterSetting.dependencies,
-        function (el) {
-          return el.groupArtifactVersion === artifact
-        })
+        function(el) {
+          return el.groupArtifactVersion === artifact;
+        });
     } else {
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
       $scope.interpreterSettings[index].dependencies = _.reject($scope.interpreterSettings[index].dependencies,
-        function (el) {
-          return el.groupArtifactVersion === artifact
-        })
+        function(el) {
+          return el.groupArtifactVersion === artifact;
+        });
     }
-  }
+  };
 
-  $scope.addNewInterpreterProperty = function (settingId) {
+  $scope.addNewInterpreterProperty = function(settingId) {
     if (settingId === undefined) {
       // Add new property from create form
       if (!$scope.newInterpreterSetting.propertyKey || $scope.newInterpreterSetting.propertyKey === '') {
-        return
+        return;
       }
       $scope.newInterpreterSetting.properties[$scope.newInterpreterSetting.propertyKey] = {
         value: $scope.newInterpreterSetting.propertyValue,
-        type: $scope.newInterpreterSetting.propertyType
-      }
-      emptyNewProperty($scope.newInterpreterSetting)
+        type: $scope.newInterpreterSetting.propertyType,
+      };
+      emptyNewProperty($scope.newInterpreterSetting);
     } else {
       // Add new property from edit form
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-      let setting = $scope.interpreterSettings[index]
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+      let setting = $scope.interpreterSettings[index];
 
       if (!setting.propertyKey || setting.propertyKey === '') {
-        return
+        return;
       }
 
       setting.properties[setting.propertyKey] =
-        {value: setting.propertyValue, type: setting.propertyType}
+        {value: setting.propertyValue, type: setting.propertyType};
 
-      emptyNewProperty(setting)
+      emptyNewProperty(setting);
     }
-  }
+  };
 
-  $scope.addNewInterpreterDependency = function (settingId) {
+  $scope.addNewInterpreterDependency = function(settingId) {
     if (settingId === undefined) {
       // Add new dependency from create form
       if (!$scope.newInterpreterSetting.depArtifact || $scope.newInterpreterSetting.depArtifact === '') {
-        return
+        return;
       }
 
       // overwrite if artifact already exists
-      let newSetting = $scope.newInterpreterSetting
+      let newSetting = $scope.newInterpreterSetting;
       for (let d in newSetting.dependencies) {
         if (newSetting.dependencies[d].groupArtifactVersion === newSetting.depArtifact) {
           newSetting.dependencies[d] = {
             'groupArtifactVersion': newSetting.depArtifact,
-            'exclusions': newSetting.depExclude
-          }
-          newSetting.dependencies.splice(d, 1)
+            'exclusions': newSetting.depExclude,
+          };
+          newSetting.dependencies.splice(d, 1);
         }
       }
 
       newSetting.dependencies.push({
         'groupArtifactVersion': newSetting.depArtifact,
-        'exclusions': (newSetting.depExclude === '') ? [] : newSetting.depExclude
-      })
-      emptyNewDependency(newSetting)
+        'exclusions': (newSetting.depExclude === '') ? [] : newSetting.depExclude,
+      });
+      emptyNewDependency(newSetting);
     } else {
       // Add new dependency from edit form
-      let index = _.findIndex($scope.interpreterSettings, {'id': settingId})
-      let setting = $scope.interpreterSettings[index]
+      let index = _.findIndex($scope.interpreterSettings, {'id': settingId});
+      let setting = $scope.interpreterSettings[index];
       if (!setting.depArtifact || setting.depArtifact === '') {
-        return
+        return;
       }
 
       // overwrite if artifact already exists
@@ -659,21 +663,21 @@ function InterpreterCtrl($rootScope, $scope, $http, baseUrlSrv, ngToast, $timeou
         if (setting.dependencies[dep].groupArtifactVersion === setting.depArtifact) {
           setting.dependencies[dep] = {
             'groupArtifactVersion': setting.depArtifact,
-            'exclusions': setting.depExclude
-          }
-          setting.dependencies.splice(dep, 1)
+            'exclusions': setting.depExclude,
+          };
+          setting.dependencies.splice(dep, 1);
         }
       }
 
       setting.dependencies.push({
         'groupArtifactVersion': setting.depArtifact,
-        'exclusions': (setting.depExclude === '') ? [] : setting.depExclude
-      })
-      emptyNewDependency(setting)
+        'exclusions': (setting.depExclude === '') ? [] : setting.depExclude,
+      });
+      emptyNewDependency(setting);
     }
-  }
+  };
 
-  $scope.resetNewRepositorySetting = function () {
+  $scope.resetNewRepositorySetting = function() {
     $scope.newRepoSetting = {
       id: '',
       url: '',
@@ -684,102 +688,102 @@ function InterpreterCtrl($rootScope, $scope, $http, baseUrlSrv, ngToast, $timeou
       proxyHost: '',
       proxyPort: null,
       proxyLogin: '',
-      proxyPassword: ''
-    }
-  }
+      proxyPassword: '',
+    };
+  };
 
-  let getRepositories = function () {
+  let getRepositories = function() {
     $http.get(baseUrlSrv.getRestApiBase() + '/interpreter/repository')
-      .success(function (data, status, headers, config) {
-        $scope.repositories = data.body
-      }).error(function (data, status, headers, config) {
-        console.log('Error %o %o', status, data.message)
-      })
-  }
+      .success(function(data, status, headers, config) {
+        $scope.repositories = data.body;
+      }).error(function(data, status, headers, config) {
+        console.log('Error %o %o', status, data.message);
+      });
+  };
 
-  $scope.addNewRepository = function () {
-    let request = angular.copy($scope.newRepoSetting)
+  $scope.addNewRepository = function() {
+    let request = angular.copy($scope.newRepoSetting);
 
     $http.post(baseUrlSrv.getRestApiBase() + '/interpreter/repository', request)
-      .then(function (res) {
-        getRepositories()
-        $scope.resetNewRepositorySetting()
-        angular.element('#repoModal').modal('hide')
-      }).catch(function (res) {
-        console.log('Error %o %o', res.headers, res.config)
-      })
-  }
-
-  $scope.removeRepository = function (repoId) {
+      .then(function(res) {
+        getRepositories();
+        $scope.resetNewRepositorySetting();
+        angular.element('#repoModal').modal('hide');
+      }).catch(function(res) {
+        console.log('Error %o %o', res.headers, res.config);
+      });
+  };
+
+  $scope.removeRepository = function(repoId) {
     BootstrapDialog.confirm({
       closable: true,
       title: '',
       message: 'Do you want to delete this repository?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
           $http.delete(baseUrlSrv.getRestApiBase() + '/interpreter/repository/' + repoId)
-            .then(function (res) {
-              let index = _.findIndex($scope.repositories, {'id': repoId})
-              $scope.repositories.splice(index, 1)
-            }).catch(function (res) {
-              console.log('Error %o %o', res.status, res.data ? res.data.message : '')
-            })
+            .then(function(res) {
+              let index = _.findIndex($scope.repositories, {'id': repoId});
+              $scope.repositories.splice(index, 1);
+            }).catch(function(res) {
+              console.log('Error %o %o', res.status, res.data ? res.data.message : '');
+            });
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  $scope.isDefaultRepository = function (repoId) {
+  $scope.isDefaultRepository = function(repoId) {
     if (repoId === 'central' || repoId === 'local') {
-      return true
+      return true;
     } else {
-      return false
+      return false;
     }
-  }
+  };
 
-  $scope.showErrorMessage = function (setting) {
+  $scope.showErrorMessage = function(setting) {
     BootstrapDialog.show({
       title: 'Error downloading dependencies',
-      message: setting.errorReason
-    })
-  }
+      message: setting.errorReason,
+    });
+  };
 
   let init = function() {
-    getAvailableInterpreterPropertyWidgets()
+    getAvailableInterpreterPropertyWidgets();
 
-    $scope.resetNewInterpreterSetting()
-    $scope.resetNewRepositorySetting()
+    $scope.resetNewInterpreterSetting();
+    $scope.resetNewRepositorySetting();
 
-    getInterpreterSettings()
-    getAvailableInterpreters()
-    getRepositories()
-  }
+    getInterpreterSettings();
+    getAvailableInterpreters();
+    getRepositories();
+  };
 
-  $scope.showSparkUI = function (settingId) {
+  $scope.showSparkUI = function(settingId) {
     $http.get(baseUrlSrv.getRestApiBase() + '/interpreter/metadata/' + settingId)
-      .then(function (res) {
+      .then(function(res) {
         if (res.data.body === undefined) {
           BootstrapDialog.alert({
-            message: 'No spark application running'
-          })
-          return
+            message: 'No spark application running',
+          });
+          return;
         }
         if (res.data.body.url) {
-          window.open(res.data.body.url, '_blank')
+          window.open(res.data.body.url, '_blank');
         } else {
           BootstrapDialog.alert({
-            message: res.data.body.message
-          })
+            message: res.data.body.message,
+          });
         }
-      }).catch(function (res) {
-        console.log('Error %o %o', res.status, res.data ? res.data.message : '')
-      })
-  }
+      }).catch(function(res) {
+        console.log('Error %o %o', res.status, res.data ? res.data.message : '');
+      });
+  };
 
   $scope.getInterpreterBindingModeDocsLink = function() {
-    const currentVersion = $rootScope.zeppelinVersion
-    return `https://zeppelin.apache.org/docs/${currentVersion}/usage/interpreter/interpreter_binding_mode.html`
-  }
+    const currentVersion = $rootScope.zeppelinVersion;
+    return `https://zeppelin.apache.org/docs/${currentVersion}/usage/interpreter/interpreter_binding_mode.html`;
+  };
 
-  init()
+  init();
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/interpreter/interpreter.filter.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/interpreter/interpreter.filter.js b/zeppelin-web/src/app/interpreter/interpreter.filter.js
index 3f42572..7b5ace0 100644
--- a/zeppelin-web/src/app/interpreter/interpreter.filter.js
+++ b/zeppelin-web/src/app/interpreter/interpreter.filter.js
@@ -12,11 +12,11 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').filter('sortByKey', sortByKey)
+angular.module('zeppelinWebApp').filter('sortByKey', sortByKey);
 
-function sortByKey () {
-  return function (properties) {
-    let sortedKeys = properties ? Object.keys(properties) : []
-    return sortedKeys.sort()
-  }
+function sortByKey() {
+  return function(properties) {
+    let sortedKeys = properties ? Object.keys(properties) : [];
+    return sortedKeys.sort();
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/interpreter/widget/number-widget.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/interpreter/widget/number-widget.directive.js b/zeppelin-web/src/app/interpreter/widget/number-widget.directive.js
index 2046b94..6ea129a 100644
--- a/zeppelin-web/src/app/interpreter/widget/number-widget.directive.js
+++ b/zeppelin-web/src/app/interpreter/widget/number-widget.directive.js
@@ -12,20 +12,20 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').directive('numberWidget', InterpreterNumberDirective)
+angular.module('zeppelinWebApp').directive('numberWidget', InterpreterNumberDirective);
 
 function InterpreterNumberDirective() {
   return {
     require: 'ngModel',
-    link: function (scope, element, attrs, modelCtrl) {
-      modelCtrl.$parsers.push(function (inputValue) {
-        let transformedInput = inputValue ? inputValue.replace(/[^\d.-]/g, '') : null
+    link: function(scope, element, attrs, modelCtrl) {
+      modelCtrl.$parsers.push(function(inputValue) {
+        let transformedInput = inputValue ? inputValue.replace(/[^\d.-]/g, '') : null;
         if (transformedInput !== inputValue) {
-          modelCtrl.$setViewValue(transformedInput)
-          modelCtrl.$render()
+          modelCtrl.$setViewValue(transformedInput);
+          modelCtrl.$render();
         }
-        return transformedInput
-      })
-    }
-  }
+        return transformedInput;
+      });
+    },
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/jobmanager/job-status.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/jobmanager/job-status.js b/zeppelin-web/src/app/jobmanager/job-status.js
index eda41b1..d918299 100644
--- a/zeppelin-web/src/app/jobmanager/job-status.js
+++ b/zeppelin-web/src/app/jobmanager/job-status.js
@@ -19,36 +19,36 @@ export const JobStatus = {
   ERROR: 'ERROR',
   PENDING: 'PENDING',
   RUNNING: 'RUNNING',
-}
+};
 
 export function getJobIconByStatus(jobStatus) {
   if (jobStatus === JobStatus.READY) {
-    return 'fa fa-circle-o'
+    return 'fa fa-circle-o';
   } else if (jobStatus === JobStatus.FINISHED) {
-    return 'fa fa-circle'
+    return 'fa fa-circle';
   } else if (jobStatus === JobStatus.ABORT) {
-    return 'fa fa-circle'
+    return 'fa fa-circle';
   } else if (jobStatus === JobStatus.ERROR) {
-    return 'fa fa-circle'
+    return 'fa fa-circle';
   } else if (jobStatus === JobStatus.PENDING) {
-    return 'fa fa-circle'
+    return 'fa fa-circle';
   } else if (jobStatus === JobStatus.RUNNING) {
-    return 'fa fa-spinner'
+    return 'fa fa-spinner';
   }
 }
 
 export function getJobColorByStatus(jobStatus) {
   if (jobStatus === JobStatus.READY) {
-    return 'green'
+    return 'green';
   } else if (jobStatus === JobStatus.FINISHED) {
-    return 'green'
+    return 'green';
   } else if (jobStatus === JobStatus.ABORT) {
-    return 'orange'
+    return 'orange';
   } else if (jobStatus === JobStatus.ERROR) {
-    return 'red'
+    return 'red';
   } else if (jobStatus === JobStatus.PENDING) {
-    return 'gray'
+    return 'gray';
   } else if (jobStatus === JobStatus.RUNNING) {
-    return 'blue'
+    return 'blue';
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/jobmanager/job/job.component.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/jobmanager/job/job.component.js b/zeppelin-web/src/app/jobmanager/job/job.component.js
index c4d4f51..e6f102f 100644
--- a/zeppelin-web/src/app/jobmanager/job/job.component.js
+++ b/zeppelin-web/src/app/jobmanager/job/job.component.js
@@ -12,35 +12,35 @@
  * limitations under the License.
  */
 
-import moment from 'moment'
+import moment from 'moment';
 
-import { ParagraphStatus, } from '../../notebook/paragraph/paragraph.status'
-import { getJobColorByStatus, getJobIconByStatus } from '../job-status'
+import {ParagraphStatus} from '../../notebook/paragraph/paragraph.status';
+import {getJobColorByStatus, getJobIconByStatus} from '../job-status';
 
-import jobTemplate from './job.html'
-import './job.css'
+import jobTemplate from './job.html';
+import './job.css';
 
 class JobController {
   constructor($http, JobManagerService) {
-    'ngInject'
-    this.$http = $http
-    this.JobManagerService = JobManagerService
+    'ngInject';
+    this.$http = $http;
+    this.JobManagerService = JobManagerService;
   }
 
   isRunning() {
-    return this.note.isRunningJob
+    return this.note.isRunningJob;
   }
 
   getParagraphs() {
-    return this.note.paragraphs
+    return this.note.paragraphs;
   }
 
   getNoteId() {
-    return this.note.noteId
+    return this.note.noteId;
   }
 
   getNoteName() {
-    return this.note.noteName
+    return this.note.noteName;
   }
 
   runJob() {
@@ -48,19 +48,21 @@ class JobController {
       closable: true,
       title: 'Job Dialog',
       message: 'Run all paragraphs?',
-      callback: clickOk => {
-        if (!clickOk) { return }
+      callback: (clickOk) => {
+        if (!clickOk) {
+          return;
+        }
 
-        const noteId = this.getNoteId()
+        const noteId = this.getNoteId();
         // if the request is handled successfully, the job page will get updated using websocket
         this.JobManagerService.sendRunJobRequest(noteId)
-          .catch(response => {
+          .catch((response) => {
             let message = (response.data && response.data.message)
-              ? response.data.message : 'SERVER ERROR'
-            this.showErrorDialog('Execution Failure', message)
-          })
-      }
-    })
+              ? response.data.message : 'SERVER ERROR';
+            this.showErrorDialog('Execution Failure', message);
+          });
+      },
+    });
   }
 
   stopJob() {
@@ -68,81 +70,85 @@ class JobController {
       closable: true,
       title: 'Job Dialog',
       message: 'Stop all paragraphs?',
-      callback: clickOk => {
-        if (!clickOk) { return }
+      callback: (clickOk) => {
+        if (!clickOk) {
+          return;
+        }
 
-        const noteId = this.getNoteId()
+        const noteId = this.getNoteId();
         // if the request is handled successfully, the job page will get updated using websocket
         this.JobManagerService.sendStopJobRequest(noteId)
-          .catch(response => {
+          .catch((response) => {
             let message = (response.data && response.data.message)
-              ? response.data.message : 'SERVER ERROR'
-            this.showErrorDialog('Stop Failure', message)
-          })
-      }
-    })
+              ? response.data.message : 'SERVER ERROR';
+            this.showErrorDialog('Stop Failure', message);
+          });
+      },
+    });
   }
 
   showErrorDialog(title, errorMessage) {
-    if (!errorMessage) { errorMessage = 'SERVER ERROR' }
+    if (!errorMessage) {
+      errorMessage = 'SERVER ERROR';
+    }
     BootstrapDialog.alert({
       closable: true,
       title: title,
-      message: errorMessage
-    })
+      message: errorMessage,
+    });
   }
 
   lastExecuteTime() {
-    const timestamp = this.note.unixTimeLastRun
-    return moment.unix(timestamp / 1000).fromNow()
+    const timestamp = this.note.unixTimeLastRun;
+    return moment.unix(timestamp / 1000).fromNow();
   }
 
   getInterpreterName() {
     return typeof this.note.interpreter === 'undefined'
-      ? 'interpreter is not set' : this.note.interpreter
+      ? 'interpreter is not set' : this.note.interpreter;
   }
 
   getInterpreterNameStyle() {
     return typeof this.note.interpreter === 'undefined'
-      ? { color: 'gray' } : { color: 'black' }
+      ? {color: 'gray'} : {color: 'black'};
   }
 
   getJobTypeIcon() {
-    const noteType = this.note.noteType
+    const noteType = this.note.noteType;
     if (noteType === 'normal') {
-      return 'icon-doc'
+      return 'icon-doc';
     } else if (noteType === 'cron') {
-      return 'icon-clock'
+      return 'icon-clock';
     } else {
-      return 'icon-question'
+      return 'icon-question';
     }
   }
 
   getJobColorByStatus(status) {
-    return getJobColorByStatus(status)
+    return getJobColorByStatus(status);
   }
 
   getJobIconByStatus(status) {
-    return getJobIconByStatus(status)
+    return getJobIconByStatus(status);
   }
 
   getProgress() {
-    const paragraphs = this.getParagraphs()
-    let paragraphStatuses = paragraphs.map(p => p.status)
-    let runningOrFinishedParagraphs = paragraphStatuses.filter(status => {
-      return status === ParagraphStatus.RUNNING || status === ParagraphStatus.FINISHED
-    })
+    const paragraphs = this.getParagraphs();
+    let paragraphStatuses = paragraphs.map((p) => p.status);
+    let runningOrFinishedParagraphs = paragraphStatuses.filter((status) => {
+      return status === ParagraphStatus.RUNNING || status === ParagraphStatus.FINISHED;
+    });
 
-    let totalCount = paragraphStatuses.length
-    let runningCount = runningOrFinishedParagraphs.length
-    let result = Math.ceil(runningCount / totalCount * 100)
-    result = isNaN(result) ? 0 : result
+    let totalCount = paragraphStatuses.length;
+    let runningCount = runningOrFinishedParagraphs.length;
+    let result = Math.ceil(runningCount / totalCount * 100);
+    result = isNaN(result) ? 0 : result;
 
-    return `${result}%`
+    return `${result}%`;
   }
 
   showPercentProgressBar() {
-    return this.getProgress() > 0 && this.getProgress() < 100
+    return this.getProgress() > 0 && this.getProgress() < 100;
   }
 }
 
@@ -152,9 +158,9 @@ export const JobComponent = {
   },
   template: jobTemplate,
   controller: JobController,
-}
+};
 
 export const JobModule = angular
   .module('zeppelinWebApp')
   .component('job', JobComponent)
-  .name
+  .name;

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/jobmanager/job/job.component.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/jobmanager/job/job.component.test.js b/zeppelin-web/src/app/jobmanager/job/job.component.test.js
index 6ca285c..5b6bec1 100644
--- a/zeppelin-web/src/app/jobmanager/job/job.component.test.js
+++ b/zeppelin-web/src/app/jobmanager/job/job.component.test.js
@@ -1,55 +1,55 @@
-import { ParagraphStatus } from '../../notebook/paragraph/paragraph.status'
+import {ParagraphStatus} from '../../notebook/paragraph/paragraph.status';
 
 describe('JobComponent', () => {
-  let $componentController
+  let $componentController;
 
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+  beforeEach(angular.mock.module('zeppelinWebApp'));
   beforeEach(angular.mock.inject((_$componentController_) => {
-    $componentController = _$componentController_
-  }))
+    $componentController = _$componentController_;
+  }));
 
   it('should get progress when there is a finished paragraph', () => {
     const paragraphs = [
-      { status: ParagraphStatus.FINISHED },
-    ]
-    const mockNote = createMockNote(paragraphs)
-    const bindings = { note: mockNote, }
+      {status: ParagraphStatus.FINISHED},
+    ];
+    const mockNote = createMockNote(paragraphs);
+    const bindings = {note: mockNote};
 
-    const ctrl = $componentController('job', null, bindings)
-    expect(ctrl).toBeDefined()
+    const ctrl = $componentController('job', null, bindings);
+    expect(ctrl).toBeDefined();
 
-    const progress1 = ctrl.getProgress()
-    expect(progress1).toBe('100%')
-  })
+    const progress1 = ctrl.getProgress();
+    expect(progress1).toBe('100%');
+  });
 
   it('should get progress when there is pending and finished paragraphs', () => {
     const paragraphs = [
-      { status: ParagraphStatus.PENDING },
-      { status: ParagraphStatus.FINISHED},
-    ]
-    const mockNote = createMockNote(paragraphs)
-    const bindings = { note: mockNote, }
+      {status: ParagraphStatus.PENDING},
+      {status: ParagraphStatus.FINISHED},
+    ];
+    const mockNote = createMockNote(paragraphs);
+    const bindings = {note: mockNote};
 
-    const ctrl = $componentController('job', null, bindings)
+    const ctrl = $componentController('job', null, bindings);
 
-    const progress1 = ctrl.getProgress()
-    expect(progress1).toBe('50%')
-  })
+    const progress1 = ctrl.getProgress();
+    expect(progress1).toBe('50%');
+  });
 
   it('should get proper job type icons', () => {
-    const paragraphs = [ { status: ParagraphStatus.PENDING }, ]
-    const mockNote = createMockNote(paragraphs)
-    const bindings = { note: mockNote, }
+    const paragraphs = [{status: ParagraphStatus.PENDING}];
+    const mockNote = createMockNote(paragraphs);
+    const bindings = {note: mockNote};
 
-    const ctrl = $componentController('job', null, bindings)
+    const ctrl = $componentController('job', null, bindings);
 
-    let icon = ctrl.getJobTypeIcon()
-    expect(icon).toBe('icon-doc')
+    let icon = ctrl.getJobTypeIcon();
+    expect(icon).toBe('icon-doc');
 
-    mockNote.noteType = 'cron'
-    icon = ctrl.getJobTypeIcon()
-    expect(icon).toBe('icon-clock')
-  })
+    mockNote.noteType = 'cron';
+    icon = ctrl.getJobTypeIcon();
+    expect(icon).toBe('icon-clock');
+  });
 
   function createMockNote(paragraphs) {
     return {
@@ -58,6 +58,6 @@ describe('JobComponent', () => {
       noteId: 'NT01',
       noteName: 'TestNote01',
       noteType: 'normal',
-    }
+    };
   }
-})
+});


[08/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
index 07ebf89..971257c 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
@@ -12,35 +12,35 @@
  * limitations under the License.
  */
 
-import {SpellResult} from '../../spell'
-import {isParagraphRunning, ParagraphStatus} from './paragraph.status'
+import {SpellResult} from '../../spell';
+import {isParagraphRunning, ParagraphStatus} from './paragraph.status';
 
-import moment from 'moment'
+import moment from 'moment';
 
-require('moment-duration-format')
+require('moment-duration-format');
 
 const ParagraphExecutor = {
   SPELL: 'SPELL',
   INTERPRETER: 'INTERPRETER',
   NONE: '', /** meaning `DONE` */
-}
+};
 
-angular.module('zeppelinWebApp').controller('ParagraphCtrl', ParagraphCtrl)
+angular.module('zeppelinWebApp').controller('ParagraphCtrl', ParagraphCtrl);
 
-function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $location,
+function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $location,
                        $timeout, $compile, $http, $q, websocketMsgSrv,
                        baseUrlSrv, ngToast, noteVarShareService,
                        heliumService) {
-  'ngInject'
+  'ngInject';
 
-  let ANGULAR_FUNCTION_OBJECT_NAME_PREFIX = '_Z_ANGULAR_FUNC_'
-  $rootScope.keys = Object.keys
-  $scope.parentNote = null
-  $scope.paragraph = {}
-  $scope.paragraph.results = {}
-  $scope.paragraph.results.msg = []
-  $scope.originalText = ''
-  $scope.editor = null
+  let ANGULAR_FUNCTION_OBJECT_NAME_PREFIX = '_Z_ANGULAR_FUNC_';
+  $rootScope.keys = Object.keys;
+  $scope.parentNote = null;
+  $scope.paragraph = {};
+  $scope.paragraph.results = {};
+  $scope.paragraph.results.msg = [];
+  $scope.originalText = '';
+  $scope.editor = null;
 
   // transactional info for spell execution
   $scope.spellTransaction = {
@@ -49,161 +49,161 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
     propagated: false,
     resultsMsg: [],
     paragraphText: '',
-  }
+  };
 
-  let searchRanges = []
+  let searchRanges = [];
   const getCurrentRangeDefault = function() {
-    return {id: -1, markerId: -1}
-  }
-  let currentRange = getCurrentRangeDefault()
+    return {id: -1, markerId: -1};
+  };
+  let currentRange = getCurrentRangeDefault();
 
-  let editorSetting = {}
+  let editorSetting = {};
   // flag that is used to set editor setting on paste percent sign
-  let pastePercentSign = false
+  let pastePercentSign = false;
   // flag that is used to set editor setting on save interpreter bindings
-  let setInterpreterBindings = false
-  let paragraphScope = $rootScope.$new(true, $rootScope)
+  let setInterpreterBindings = false;
+  let paragraphScope = $rootScope.$new(true, $rootScope);
 
   // to keep backward compatibility
-  $scope.compiledScope = paragraphScope
+  $scope.compiledScope = paragraphScope;
 
   paragraphScope.z = {
     // z.runParagraph('20150213-231621_168813393')
-    runParagraph: function (paragraphId) {
+    runParagraph: function(paragraphId) {
       if (paragraphId) {
-        let filtered = $scope.parentNote.paragraphs.filter(function (x) {
-          return x.id === paragraphId
-        })
+        let filtered = $scope.parentNote.paragraphs.filter(function(x) {
+          return x.id === paragraphId;
+        });
         if (filtered.length === 1) {
-          let paragraph = filtered[0]
+          let paragraph = filtered[0];
           websocketMsgSrv.runParagraph(paragraph.id, paragraph.title, paragraph.text,
-            paragraph.config, paragraph.settings.params)
+            paragraph.config, paragraph.settings.params);
         } else {
           ngToast.danger({
             content: 'Cannot find a paragraph with id \'' + paragraphId + '\'',
             verticalPosition: 'top',
-            dismissOnTimeout: false
-          })
+            dismissOnTimeout: false,
+          });
         }
       } else {
         ngToast.danger({
           content: 'Please provide a \'paragraphId\' when calling z.runParagraph(paragraphId)',
           verticalPosition: 'top',
-          dismissOnTimeout: false
-        })
+          dismissOnTimeout: false,
+        });
       }
     },
 
     // Example: z.angularBind('my_var', 'Test Value', '20150213-231621_168813393')
-    angularBind: function (varName, value, paragraphId) {
+    angularBind: function(varName, value, paragraphId) {
       // Only push to server if there paragraphId is defined
       if (paragraphId) {
-        websocketMsgSrv.clientBindAngularObject($routeParams.noteId, varName, value, paragraphId)
+        websocketMsgSrv.clientBindAngularObject($routeParams.noteId, varName, value, paragraphId);
       } else {
         ngToast.danger({
           content: 'Please provide a \'paragraphId\' when calling ' +
           'z.angularBind(varName, value, \'PUT_HERE_PARAGRAPH_ID\')',
           verticalPosition: 'top',
-          dismissOnTimeout: false
-        })
+          dismissOnTimeout: false,
+        });
       }
     },
 
     // Example: z.angularUnBind('my_var', '20150213-231621_168813393')
-    angularUnbind: function (varName, paragraphId) {
+    angularUnbind: function(varName, paragraphId) {
       // Only push to server if paragraphId is defined
       if (paragraphId) {
-        websocketMsgSrv.clientUnbindAngularObject($routeParams.noteId, varName, paragraphId)
+        websocketMsgSrv.clientUnbindAngularObject($routeParams.noteId, varName, paragraphId);
       } else {
         ngToast.danger({
           content: 'Please provide a \'paragraphId\' when calling ' +
           'z.angularUnbind(varName, \'PUT_HERE_PARAGRAPH_ID\')',
           verticalPosition: 'top',
-          dismissOnTimeout: false})
+          dismissOnTimeout: false});
       }
-    }
-  }
+    },
+  };
 
-  let angularObjectRegistry = {}
+  let angularObjectRegistry = {};
 
   // Controller init
-  $scope.init = function (newParagraph, note) {
-    $scope.paragraph = newParagraph
-    $scope.parentNote = note
-    $scope.originalText = angular.copy(newParagraph.text)
-    $scope.chart = {}
-    $scope.baseMapOption = ['Streets', 'Satellite', 'Hybrid', 'Topo', 'Gray', 'Oceans', 'Terrain']
-    $scope.colWidthOption = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
-    $scope.fontSizeOption = [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
-    $scope.paragraphFocused = false
+  $scope.init = function(newParagraph, note) {
+    $scope.paragraph = newParagraph;
+    $scope.parentNote = note;
+    $scope.originalText = angular.copy(newParagraph.text);
+    $scope.chart = {};
+    $scope.baseMapOption = ['Streets', 'Satellite', 'Hybrid', 'Topo', 'Gray', 'Oceans', 'Terrain'];
+    $scope.colWidthOption = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
+    $scope.fontSizeOption = [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
+    $scope.paragraphFocused = false;
     if (newParagraph.focus) {
-      $scope.paragraphFocused = true
+      $scope.paragraphFocused = true;
     }
     if (!$scope.paragraph.config) {
-      $scope.paragraph.config = {}
+      $scope.paragraph.config = {};
     }
 
-    noteVarShareService.put($scope.paragraph.id + '_paragraphScope', paragraphScope)
+    noteVarShareService.put($scope.paragraph.id + '_paragraphScope', paragraphScope);
 
-    initializeDefault($scope.paragraph.config)
-  }
+    initializeDefault($scope.paragraph.config);
+  };
 
-  const initializeDefault = function (config) {
-    let forms = $scope.paragraph.settings.forms
+  const initializeDefault = function(config) {
+    let forms = $scope.paragraph.settings.forms;
 
     if (!config.colWidth) {
-      config.colWidth = 12
+      config.colWidth = 12;
     }
 
     if (!config.fontSize) {
-      config.fontSize = 9
+      config.fontSize = 9;
     }
 
     if (config.enabled === undefined) {
-      config.enabled = true
+      config.enabled = true;
     }
 
     for (let idx in forms) {
       if (forms[idx]) {
         if (forms[idx].options) {
           if (config.runOnSelectionChange === undefined) {
-            config.runOnSelectionChange = true
+            config.runOnSelectionChange = true;
           }
         }
       }
     }
 
     if (!config.results) {
-      config.results = {}
+      config.results = {};
     }
 
     if (!config.editorSetting) {
-      config.editorSetting = {}
+      config.editorSetting = {};
     } else if (config.editorSetting.editOnDblClick) {
-      editorSetting.isOutputHidden = config.editorSetting.editOnDblClick
+      editorSetting.isOutputHidden = config.editorSetting.editOnDblClick;
     }
-  }
+  };
 
   const isTabCompletion = function() {
-    const completionKey = $scope.paragraph.config.editorSetting.completionKey
-    return completionKey === 'TAB'
-  }
+    const completionKey = $scope.paragraph.config.editorSetting.completionKey;
+    return completionKey === 'TAB';
+  };
 
-  $scope.$on('updateParagraphOutput', function (event, data) {
+  $scope.$on('updateParagraphOutput', function(event, data) {
     if ($scope.paragraph.id === data.paragraphId) {
       if (!$scope.paragraph.results) {
-        $scope.paragraph.results = {}
+        $scope.paragraph.results = {};
       }
       if (!$scope.paragraph.results.msg) {
-        $scope.paragraph.results.msg = []
+        $scope.paragraph.results.msg = [];
       }
 
-      let update = ($scope.paragraph.results.msg[data.index]) ? true : false
+      let update = ($scope.paragraph.results.msg[data.index]) ? true : false;
 
       $scope.paragraph.results.msg[data.index] = {
         data: data.data,
-        type: data.type
-      }
+        type: data.type,
+      };
 
       if (update) {
         $rootScope.$broadcast(
@@ -211,62 +211,62 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
           $scope.paragraph.results.msg[data.index],
           $scope.paragraph.config.results[data.index],
           $scope.paragraph,
-          data.index)
+          data.index);
       }
     }
-  })
+  });
 
-  $scope.getIframeDimensions = function () {
+  $scope.getIframeDimensions = function() {
     if ($scope.asIframe) {
-      let paragraphid = '#' + $routeParams.paragraphId + '_container'
-      let height = angular.element(paragraphid).height()
-      return height
+      let paragraphid = '#' + $routeParams.paragraphId + '_container';
+      let height = angular.element(paragraphid).height();
+      return height;
     }
-    return 0
-  }
+    return 0;
+  };
 
-  $scope.$watch($scope.getIframeDimensions, function (newValue, oldValue) {
+  $scope.$watch($scope.getIframeDimensions, function(newValue, oldValue) {
     if ($scope.asIframe && newValue) {
-      let message = {}
-      message.height = newValue
-      message.url = $location.$$absUrl
-      $window.parent.postMessage(angular.toJson(message), '*')
+      let message = {};
+      message.height = newValue;
+      message.url = $location.$$absUrl;
+      $window.parent.postMessage(angular.toJson(message), '*');
     }
-  })
+  });
 
-  $scope.getEditor = function () {
-    return $scope.editor
-  }
+  $scope.getEditor = function() {
+    return $scope.editor;
+  };
 
-  $scope.$watch($scope.getEditor, function (newValue, oldValue) {
+  $scope.$watch($scope.getEditor, function(newValue, oldValue) {
     if (!$scope.editor) {
-      return
+      return;
     }
     if (newValue === null || newValue === undefined) {
-      console.log('editor isnt loaded yet, returning')
-      return
+      console.log('editor isnt loaded yet, returning');
+      return;
     }
     if ($scope.revisionView === true) {
-      $scope.editor.setReadOnly(true)
+      $scope.editor.setReadOnly(true);
     } else {
-      $scope.editor.setReadOnly(false)
+      $scope.editor.setReadOnly(false);
     }
-  })
+  });
 
-  let isEmpty = function (object) {
-    return !object
-  }
+  let isEmpty = function(object) {
+    return !object;
+  };
 
-  $scope.isRunning = function (paragraph) {
-    return isParagraphRunning(paragraph)
-  }
+  $scope.isRunning = function(paragraph) {
+    return isParagraphRunning(paragraph);
+  };
 
-  $scope.cancelParagraph = function (paragraph) {
-    console.log('Cancel %o', paragraph.id)
-    websocketMsgSrv.cancelParagraphRun(paragraph.id)
-  }
+  $scope.cancelParagraph = function(paragraph) {
+    console.log('Cancel %o', paragraph.id);
+    websocketMsgSrv.cancelParagraphRun(paragraph.id);
+  };
 
-  $scope.propagateSpellResult = function (paragraphId, paragraphTitle,
+  $scope.propagateSpellResult = function(paragraphId, paragraphTitle,
                                          paragraphText, paragraphResults,
                                          paragraphStatus, paragraphErrorMessage,
                                          paragraphConfig, paragraphSettingsParam,
@@ -277,18 +277,18 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
       paragraphStatus, paragraphErrorMessage,
       paragraphConfig, paragraphSettingsParam,
       paragraphDateStarted, paragraphDateFinished
-    )
-  }
+    );
+  };
 
-  $scope.handleSpellError = function (paragraphText, error,
+  $scope.handleSpellError = function(paragraphText, error,
                                      digestRequired, propagated) {
-    const errorMessage = error.stack
-    $scope.paragraph.status = ParagraphStatus.ERROR
-    $scope.paragraph.errorMessage = errorMessage
-    console.error('Failed to execute interpret() in spell\n', error)
+    const errorMessage = error.stack;
+    $scope.paragraph.status = ParagraphStatus.ERROR;
+    $scope.paragraph.errorMessage = errorMessage;
+    console.error('Failed to execute interpret() in spell\n', error);
 
     if (!propagated) {
-      $scope.paragraph.dateFinished = $scope.getFormattedParagraphTime()
+      $scope.paragraph.dateFinished = $scope.getFormattedParagraphTime();
     }
 
     if (!propagated) {
@@ -296,547 +296,551 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
         $scope.paragraph.id, $scope.paragraph.title,
         paragraphText, [], $scope.paragraph.status, errorMessage,
         $scope.paragraph.config, $scope.paragraph.settings.params,
-        $scope.paragraph.dateStarted, $scope.paragraph.dateFinished)
+        $scope.paragraph.dateStarted, $scope.paragraph.dateFinished);
     }
-  }
+  };
 
-  $scope.prepareSpellTransaction = function (resultsMsg, propagated, paragraphText) {
-    $scope.spellTransaction.totalResultCount = resultsMsg.length
-    $scope.spellTransaction.renderedResultCount = 0
-    $scope.spellTransaction.propagated = propagated
-    $scope.spellTransaction.resultsMsg = resultsMsg
-    $scope.spellTransaction.paragraphText = paragraphText
-  }
+  $scope.prepareSpellTransaction = function(resultsMsg, propagated, paragraphText) {
+    $scope.spellTransaction.totalResultCount = resultsMsg.length;
+    $scope.spellTransaction.renderedResultCount = 0;
+    $scope.spellTransaction.propagated = propagated;
+    $scope.spellTransaction.resultsMsg = resultsMsg;
+    $scope.spellTransaction.paragraphText = paragraphText;
+  };
 
   /**
    * - update spell transaction count and
    * - check transaction is finished based on the result count
    * @returns {boolean}
    */
-  $scope.increaseSpellTransactionResultCount = function () {
-    $scope.spellTransaction.renderedResultCount += 1
+  $scope.increaseSpellTransactionResultCount = function() {
+    $scope.spellTransaction.renderedResultCount += 1;
 
-    const total = $scope.spellTransaction.totalResultCount
-    const current = $scope.spellTransaction.renderedResultCount
-    return total === current
-  }
+    const total = $scope.spellTransaction.totalResultCount;
+    const current = $scope.spellTransaction.renderedResultCount;
+    return total === current;
+  };
 
-  $scope.cleanupSpellTransaction = function () {
-    const status = ParagraphStatus.FINISHED
-    $scope.paragraph.executor = ParagraphExecutor.NONE
-    $scope.paragraph.status = status
-    $scope.paragraph.results.code = status
+  $scope.cleanupSpellTransaction = function() {
+    const status = ParagraphStatus.FINISHED;
+    $scope.paragraph.executor = ParagraphExecutor.NONE;
+    $scope.paragraph.status = status;
+    $scope.paragraph.results.code = status;
 
-    const propagated = $scope.spellTransaction.propagated
-    const resultsMsg = $scope.spellTransaction.resultsMsg
-    const paragraphText = $scope.spellTransaction.paragraphText
+    const propagated = $scope.spellTransaction.propagated;
+    const resultsMsg = $scope.spellTransaction.resultsMsg;
+    const paragraphText = $scope.spellTransaction.paragraphText;
 
     if (!propagated) {
-      $scope.paragraph.dateFinished = $scope.getFormattedParagraphTime()
+      $scope.paragraph.dateFinished = $scope.getFormattedParagraphTime();
     }
 
     if (!propagated) {
-      const propagable = SpellResult.createPropagable(resultsMsg)
+      const propagable = SpellResult.createPropagable(resultsMsg);
       $scope.propagateSpellResult(
         $scope.paragraph.id, $scope.paragraph.title,
         paragraphText, propagable, status, '',
         $scope.paragraph.config, $scope.paragraph.settings.params,
-        $scope.paragraph.dateStarted, $scope.paragraph.dateFinished)
+        $scope.paragraph.dateStarted, $scope.paragraph.dateFinished);
     }
-  }
+  };
 
-  $scope.runParagraphUsingSpell = function (paragraphText,
+  $scope.runParagraphUsingSpell = function(paragraphText,
                                            magic, digestRequired, propagated) {
-    $scope.paragraph.status = 'RUNNING'
-    $scope.paragraph.executor = ParagraphExecutor.SPELL
-    $scope.paragraph.results = {}
-    $scope.paragraph.errorMessage = ''
-    if (digestRequired) { $scope.$digest() }
+    $scope.paragraph.status = 'RUNNING';
+    $scope.paragraph.executor = ParagraphExecutor.SPELL;
+    $scope.paragraph.results = {};
+    $scope.paragraph.errorMessage = '';
+    if (digestRequired) {
+      $scope.$digest();
+    }
 
     try {
       // remove magic from paragraphText
-      const splited = paragraphText.split(magic)
+      const splited = paragraphText.split(magic);
       // remove leading spaces
-      const textWithoutMagic = splited[1].replace(/^\s+/g, '')
+      const textWithoutMagic = splited[1].replace(/^\s+/g, '');
 
       if (!propagated) {
-        $scope.paragraph.dateStarted = $scope.getFormattedParagraphTime()
+        $scope.paragraph.dateStarted = $scope.getFormattedParagraphTime();
       }
 
       // handle actual result message in promise
       heliumService.executeSpell(magic, textWithoutMagic)
-        .then(resultsMsg => {
-          $scope.prepareSpellTransaction(resultsMsg, propagated, paragraphText)
+        .then((resultsMsg) => {
+          $scope.prepareSpellTransaction(resultsMsg, propagated, paragraphText);
 
-          $scope.paragraph.results.msg = resultsMsg
-          $scope.paragraph.config.tableHide = false
+          $scope.paragraph.results.msg = resultsMsg;
+          $scope.paragraph.config.tableHide = false;
         })
-        .catch(error => {
+        .catch((error) => {
           $scope.handleSpellError(paragraphText, error,
-            digestRequired, propagated)
-        })
+            digestRequired, propagated);
+        });
     } catch (error) {
       $scope.handleSpellError(paragraphText, error,
-        digestRequired, propagated)
+        digestRequired, propagated);
     }
-  }
+  };
 
-  $scope.runParagraphUsingBackendInterpreter = function (paragraphText) {
+  $scope.runParagraphUsingBackendInterpreter = function(paragraphText) {
     websocketMsgSrv.runParagraph($scope.paragraph.id, $scope.paragraph.title,
-      paragraphText, $scope.paragraph.config, $scope.paragraph.settings.params)
-  }
+      paragraphText, $scope.paragraph.config, $scope.paragraph.settings.params);
+  };
 
-  $scope.bindBeforeUnload = function () {
-    angular.element(window).off('beforeunload')
+  $scope.bindBeforeUnload = function() {
+    angular.element(window).off('beforeunload');
 
-    let confirmOnPageExit = function (e) {
+    let confirmOnPageExit = function(e) {
       // If we haven't been passed the event get the window.event
-      e = e || window.event
-      let message = 'Do you want to reload this site?'
+      e = e || window.event;
+      let message = 'Do you want to reload this site?';
 
       // For IE6-8 and Firefox prior to version 4
       if (e) {
-        e.returnValue = message
+        e.returnValue = message;
       }
       // For Chrome, Safari, IE8+ and Opera 12+
-      return message
-    }
-    angular.element(window).on('beforeunload', confirmOnPageExit)
-  }
+      return message;
+    };
+    angular.element(window).on('beforeunload', confirmOnPageExit);
+  };
 
-  $scope.unBindBeforeUnload = function () {
-    angular.element(window).off('beforeunload')
-  }
+  $scope.unBindBeforeUnload = function() {
+    angular.element(window).off('beforeunload');
+  };
 
-  $scope.saveParagraph = function (paragraph) {
-    const dirtyText = paragraph.text
+  $scope.saveParagraph = function(paragraph) {
+    const dirtyText = paragraph.text;
     if (dirtyText === undefined || dirtyText === $scope.originalText) {
-      return
+      return;
     }
 
-    $scope.bindBeforeUnload()
+    $scope.bindBeforeUnload();
 
-    commitParagraph(paragraph).then(function () {
-      $scope.originalText = dirtyText
-      $scope.dirtyText = undefined
-      $scope.unBindBeforeUnload()
-    })
-  }
+    commitParagraph(paragraph).then(function() {
+      $scope.originalText = dirtyText;
+      $scope.dirtyText = undefined;
+      $scope.unBindBeforeUnload();
+    });
+  };
 
-  $scope.toggleEnableDisable = function (paragraph) {
-    paragraph.config.enabled = !paragraph.config.enabled
-    commitParagraph(paragraph)
-  }
+  $scope.toggleEnableDisable = function(paragraph) {
+    paragraph.config.enabled = !paragraph.config.enabled;
+    commitParagraph(paragraph);
+  };
 
   /**
    * @param paragraphText to be parsed
    * @param digestRequired true if calling `$digest` is required
    * @param propagated true if update request is sent from other client
    */
-  $scope.runParagraph = function (paragraphText, digestRequired, propagated) {
+  $scope.runParagraph = function(paragraphText, digestRequired, propagated) {
     if (!paragraphText || $scope.isRunning($scope.paragraph)) {
-      return
+      return;
     }
-    const magic = SpellResult.extractMagic(paragraphText)
+    const magic = SpellResult.extractMagic(paragraphText);
 
     if (heliumService.getSpellByMagic(magic)) {
-      $scope.runParagraphUsingSpell(paragraphText, magic, digestRequired, propagated)
+      $scope.runParagraphUsingSpell(paragraphText, magic, digestRequired, propagated);
     } else {
-      $scope.runParagraphUsingBackendInterpreter(paragraphText)
+      $scope.runParagraphUsingBackendInterpreter(paragraphText);
     }
 
-    $scope.originalText = angular.copy(paragraphText)
-    $scope.dirtyText = undefined
+    $scope.originalText = angular.copy(paragraphText);
+    $scope.dirtyText = undefined;
 
     if ($scope.paragraph.config.editorSetting.editOnDblClick) {
-      closeEditorAndOpenTable($scope.paragraph)
+      closeEditorAndOpenTable($scope.paragraph);
     } else if (editorSetting.isOutputHidden &&
       !$scope.paragraph.config.editorSetting.editOnDblClick) {
       // %md/%angular repl make output to be hidden by default after running
       // so should open output if repl changed from %md/%angular to another
-      openEditorAndOpenTable($scope.paragraph)
+      openEditorAndOpenTable($scope.paragraph);
     }
-    editorSetting.isOutputHidden = $scope.paragraph.config.editorSetting.editOnDblClick
-  }
+    editorSetting.isOutputHidden = $scope.paragraph.config.editorSetting.editOnDblClick;
+  };
 
-  $scope.runParagraphFromShortcut = function (paragraphText) {
+  $scope.runParagraphFromShortcut = function(paragraphText) {
     // passing `digestRequired` as true to update view immediately
     // without this, results cannot be rendered in view more than once
-    $scope.runParagraph(paragraphText, true, false)
-  }
+    $scope.runParagraph(paragraphText, true, false);
+  };
 
-  $scope.runParagraphFromButton = function () {
+  $scope.runParagraphFromButton = function() {
     // we come here from the view, so we don't need to call `$digest()`
-    $scope.runParagraph($scope.getEditorValue(), false, false)
-  }
+    $scope.runParagraph($scope.getEditorValue(), false, false);
+  };
 
   $scope.runAllToThis = function(paragraph) {
-    $scope.$emit('runAllAbove', paragraph, true)
-  }
+    $scope.$emit('runAllAbove', paragraph, true);
+  };
 
   $scope.runAllFromThis = function(paragraph) {
-    $scope.$emit('runAllBelowAndCurrent', paragraph, true)
-  }
+    $scope.$emit('runAllBelowAndCurrent', paragraph, true);
+  };
 
-  $scope.runAllToOrFromThis = function (paragraph) {
+  $scope.runAllToOrFromThis = function(paragraph) {
     BootstrapDialog.show({
       message: 'Run paragraphs:',
       title: '',
       buttons: [{
         label: 'Close',
         action: function(dialog) {
-          dialog.close()
-        }
+          dialog.close();
+        },
       },
       {
         label: 'Run all above',
         cssClass: 'btn-primary',
         action: function(dialog) {
-          $scope.$emit('runAllAbove', paragraph, false)
-          dialog.close()
-        }
+          $scope.$emit('runAllAbove', paragraph, false);
+          dialog.close();
+        },
       },
       {
         label: 'Run current and all below',
         cssClass: 'btn-primary',
         action: function(dialog) {
-          $scope.$emit('runAllBelowAndCurrent', paragraph, false)
-          dialog.close()
-        }
-      }]
-    })
-  }
+          $scope.$emit('runAllBelowAndCurrent', paragraph, false);
+          dialog.close();
+        },
+      }],
+    });
+  };
 
-  $scope.turnOnAutoRun = function (paragraph) {
-    paragraph.config.runOnSelectionChange = !paragraph.config.runOnSelectionChange
-    commitParagraph(paragraph)
-  }
+  $scope.turnOnAutoRun = function(paragraph) {
+    paragraph.config.runOnSelectionChange = !paragraph.config.runOnSelectionChange;
+    commitParagraph(paragraph);
+  };
 
-  $scope.moveUp = function (paragraph) {
-    $scope.$emit('moveParagraphUp', paragraph)
-  }
+  $scope.moveUp = function(paragraph) {
+    $scope.$emit('moveParagraphUp', paragraph);
+  };
 
-  $scope.moveDown = function (paragraph) {
-    $scope.$emit('moveParagraphDown', paragraph)
-  }
+  $scope.moveDown = function(paragraph) {
+    $scope.$emit('moveParagraphDown', paragraph);
+  };
 
-  $scope.insertNew = function (position) {
-    $scope.$emit('insertParagraph', $scope.paragraph.id, position)
-  }
+  $scope.insertNew = function(position) {
+    $scope.$emit('insertParagraph', $scope.paragraph.id, position);
+  };
 
-  $scope.copyPara = function (position) {
-    let editorValue = $scope.getEditorValue()
+  $scope.copyPara = function(position) {
+    let editorValue = $scope.getEditorValue();
     if (editorValue) {
-      $scope.copyParagraph(editorValue, position)
+      $scope.copyParagraph(editorValue, position);
     }
-  }
+  };
 
-  $scope.copyParagraph = function (data, position) {
-    let newIndex = -1
+  $scope.copyParagraph = function(data, position) {
+    let newIndex = -1;
     for (let i = 0; i < $scope.note.paragraphs.length; i++) {
       if ($scope.note.paragraphs[i].id === $scope.paragraph.id) {
         // determine position of where to add new paragraph; default is below
         if (position === 'above') {
-          newIndex = i
+          newIndex = i;
         } else {
-          newIndex = i + 1
+          newIndex = i + 1;
         }
-        break
+        break;
       }
     }
 
     if (newIndex < 0 || newIndex > $scope.note.paragraphs.length) {
-      return
+      return;
     }
 
-    let config = angular.copy($scope.paragraph.config)
-    config.editorHide = false
+    let config = angular.copy($scope.paragraph.config);
+    config.editorHide = false;
 
     websocketMsgSrv.copyParagraph(newIndex, $scope.paragraph.title, data,
-      config, $scope.paragraph.settings.params)
-  }
+      config, $scope.paragraph.settings.params);
+  };
 
-  $scope.removeParagraph = function (paragraph) {
+  $scope.removeParagraph = function(paragraph) {
     if ($scope.note.paragraphs.length === 1) {
       BootstrapDialog.alert({
         closable: true,
-        message: 'All the paragraphs can\'t be deleted.'
-      })
+        message: 'All the paragraphs can\'t be deleted.',
+      });
     } else {
       BootstrapDialog.confirm({
         closable: true,
         title: '',
         message: 'Do you want to delete this paragraph?',
-        callback: function (result) {
+        callback: function(result) {
           if (result) {
-            console.log('Remove paragraph')
-            websocketMsgSrv.removeParagraph(paragraph.id)
-            $scope.$emit('moveFocusToNextParagraph', $scope.paragraph.id)
+            console.log('Remove paragraph');
+            websocketMsgSrv.removeParagraph(paragraph.id);
+            $scope.$emit('moveFocusToNextParagraph', $scope.paragraph.id);
           }
-        }
-      })
+        },
+      });
     }
-  }
+  };
 
-  $scope.clearParagraphOutput = function (paragraph) {
-    websocketMsgSrv.clearParagraphOutput(paragraph.id)
-  }
+  $scope.clearParagraphOutput = function(paragraph) {
+    websocketMsgSrv.clearParagraphOutput(paragraph.id);
+  };
 
-  $scope.toggleEditor = function (paragraph) {
+  $scope.toggleEditor = function(paragraph) {
     if (paragraph.config.editorHide) {
-      $scope.openEditor(paragraph)
+      $scope.openEditor(paragraph);
     } else {
-      $scope.closeEditor(paragraph)
-    }
-  }
-
-  $scope.closeEditor = function (paragraph) {
-    console.log('close the note')
-    paragraph.config.editorHide = true
-    commitParagraph(paragraph)
-  }
-
-  $scope.openEditor = function (paragraph) {
-    console.log('open the note')
-    paragraph.config.editorHide = false
-    commitParagraph(paragraph)
-  }
-
-  $scope.closeTable = function (paragraph) {
-    console.log('close the output')
-    paragraph.config.tableHide = true
-    commitParagraph(paragraph)
-  }
-
-  $scope.openTable = function (paragraph) {
-    console.log('open the output')
-    paragraph.config.tableHide = false
-    commitParagraph(paragraph)
-  }
-
-  let openEditorAndCloseTable = function (paragraph) {
-    manageEditorAndTableState(paragraph, false, true)
-  }
-
-  const closeEditorAndOpenTable = function (paragraph) {
-    manageEditorAndTableState(paragraph, true, false)
-  }
-
-  const openEditorAndOpenTable = function (paragraph) {
-    manageEditorAndTableState(paragraph, false, false)
-  }
-
-  const manageEditorAndTableState = function (paragraph, hideEditor, hideTable) {
-    paragraph.config.editorHide = hideEditor
-    paragraph.config.tableHide = hideTable
-    commitParagraph(paragraph)
-  }
-
-  $scope.showTitle = function (paragraph) {
-    paragraph.config.title = true
-    commitParagraph(paragraph)
-  }
-
-  $scope.hideTitle = function (paragraph) {
-    paragraph.config.title = false
-    commitParagraph(paragraph)
-  }
-
-  $scope.setTitle = function (paragraph) {
-    commitParagraph(paragraph)
-  }
-
-  $scope.showLineNumbers = function (paragraph) {
+      $scope.closeEditor(paragraph);
+    }
+  };
+
+  $scope.closeEditor = function(paragraph) {
+    console.log('close the note');
+    paragraph.config.editorHide = true;
+    commitParagraph(paragraph);
+  };
+
+  $scope.openEditor = function(paragraph) {
+    console.log('open the note');
+    paragraph.config.editorHide = false;
+    commitParagraph(paragraph);
+  };
+
+  $scope.closeTable = function(paragraph) {
+    console.log('close the output');
+    paragraph.config.tableHide = true;
+    commitParagraph(paragraph);
+  };
+
+  $scope.openTable = function(paragraph) {
+    console.log('open the output');
+    paragraph.config.tableHide = false;
+    commitParagraph(paragraph);
+  };
+
+  let openEditorAndCloseTable = function(paragraph) {
+    manageEditorAndTableState(paragraph, false, true);
+  };
+
+  const closeEditorAndOpenTable = function(paragraph) {
+    manageEditorAndTableState(paragraph, true, false);
+  };
+
+  const openEditorAndOpenTable = function(paragraph) {
+    manageEditorAndTableState(paragraph, false, false);
+  };
+
+  const manageEditorAndTableState = function(paragraph, hideEditor, hideTable) {
+    paragraph.config.editorHide = hideEditor;
+    paragraph.config.tableHide = hideTable;
+    commitParagraph(paragraph);
+  };
+
+  $scope.showTitle = function(paragraph) {
+    paragraph.config.title = true;
+    commitParagraph(paragraph);
+  };
+
+  $scope.hideTitle = function(paragraph) {
+    paragraph.config.title = false;
+    commitParagraph(paragraph);
+  };
+
+  $scope.setTitle = function(paragraph) {
+    commitParagraph(paragraph);
+  };
+
+  $scope.showLineNumbers = function(paragraph) {
     if ($scope.editor) {
-      paragraph.config.lineNumbers = true
-      $scope.editor.renderer.setShowGutter(true)
-      commitParagraph(paragraph)
+      paragraph.config.lineNumbers = true;
+      $scope.editor.renderer.setShowGutter(true);
+      commitParagraph(paragraph);
     }
-  }
+  };
 
-  $scope.hideLineNumbers = function (paragraph) {
+  $scope.hideLineNumbers = function(paragraph) {
     if ($scope.editor) {
-      paragraph.config.lineNumbers = false
-      $scope.editor.renderer.setShowGutter(false)
-      commitParagraph(paragraph)
+      paragraph.config.lineNumbers = false;
+      $scope.editor.renderer.setShowGutter(false);
+      commitParagraph(paragraph);
     }
-  }
+  };
 
-  $scope.columnWidthClass = function (n) {
+  $scope.columnWidthClass = function(n) {
     if ($scope.asIframe) {
-      return 'col-md-12'
+      return 'col-md-12';
     } else {
-      return 'paragraph-col col-md-' + n
+      return 'paragraph-col col-md-' + n;
     }
-  }
+  };
 
-  $scope.changeColWidth = function (paragraph, width) {
-    angular.element('.navbar-right.open').removeClass('open')
-    paragraph.config.colWidth = width
-    $scope.$broadcast('paragraphResized', $scope.paragraph.id)
-    commitParagraph(paragraph)
-  }
+  $scope.changeColWidth = function(paragraph, width) {
+    angular.element('.navbar-right.open').removeClass('open');
+    paragraph.config.colWidth = width;
+    $scope.$broadcast('paragraphResized', $scope.paragraph.id);
+    commitParagraph(paragraph);
+  };
 
-  $scope.changeFontSize = function (paragraph, fontSize) {
-    angular.element('.navbar-right.open').removeClass('open')
+  $scope.changeFontSize = function(paragraph, fontSize) {
+    angular.element('.navbar-right.open').removeClass('open');
     if ($scope.editor) {
       $scope.editor.setOptions({
-        fontSize: fontSize + 'pt'
-      })
-      autoAdjustEditorHeight($scope.editor)
-      paragraph.config.fontSize = fontSize
-      commitParagraph(paragraph)
-    }
-  }
-
-  $scope.toggleOutput = function (paragraph) {
-    paragraph.config.tableHide = !paragraph.config.tableHide
-    commitParagraph(paragraph)
-  }
-
-  $scope.aceChanged = function (_, editor) {
-    let session = editor.getSession()
-    let dirtyText = session.getValue()
-    $scope.dirtyText = dirtyText
+        fontSize: fontSize + 'pt',
+      });
+      autoAdjustEditorHeight($scope.editor);
+      paragraph.config.fontSize = fontSize;
+      commitParagraph(paragraph);
+    }
+  };
+
+  $scope.toggleOutput = function(paragraph) {
+    paragraph.config.tableHide = !paragraph.config.tableHide;
+    commitParagraph(paragraph);
+  };
+
+  $scope.aceChanged = function(_, editor) {
+    let session = editor.getSession();
+    let dirtyText = session.getValue();
+    $scope.dirtyText = dirtyText;
     if ($scope.dirtyText !== $scope.originalText) {
-      $scope.startSaveTimer()
+      $scope.startSaveTimer();
     }
-    setParagraphMode(session, dirtyText, editor.getCursorPosition())
-  }
+    setParagraphMode(session, dirtyText, editor.getCursorPosition());
+  };
 
-  $scope.aceLoaded = function (_editor) {
-    let langTools = ace.require('ace/ext/language_tools')
-    let Range = ace.require('ace/range').Range
+  $scope.aceLoaded = function(_editor) {
+    let langTools = ace.require('ace/ext/language_tools');
+    let Range = ace.require('ace/range').Range;
 
-    _editor.$blockScrolling = Infinity
-    $scope.editor = _editor
-    $scope.editor.on('input', $scope.aceChanged)
+    _editor.$blockScrolling = Infinity;
+    $scope.editor = _editor;
+    $scope.editor.on('input', $scope.aceChanged);
     if (_editor.container.id !== '{{paragraph.id}}_editor') {
-      $scope.editor.renderer.setShowGutter($scope.paragraph.config.lineNumbers)
-      $scope.editor.setShowFoldWidgets(false)
-      $scope.editor.setHighlightActiveLine(false)
-      $scope.editor.getSession().setUseWrapMode(true)
-      $scope.editor.setTheme('ace/theme/chrome')
-      $scope.editor.setReadOnly($scope.isRunning($scope.paragraph))
-      $scope.editor.setHighlightActiveLine($scope.paragraphFocused)
+      $scope.editor.renderer.setShowGutter($scope.paragraph.config.lineNumbers);
+      $scope.editor.setShowFoldWidgets(false);
+      $scope.editor.setHighlightActiveLine(false);
+      $scope.editor.getSession().setUseWrapMode(true);
+      $scope.editor.setTheme('ace/theme/chrome');
+      $scope.editor.setReadOnly($scope.isRunning($scope.paragraph));
+      $scope.editor.setHighlightActiveLine($scope.paragraphFocused);
 
       if ($scope.paragraphFocused) {
-        let prefix = '%' + getInterpreterName($scope.paragraph.text)
-        let paragraphText = $scope.paragraph.text ? $scope.paragraph.text.trim() : ''
+        let prefix = '%' + getInterpreterName($scope.paragraph.text);
+        let paragraphText = $scope.paragraph.text ? $scope.paragraph.text.trim() : '';
 
-        $scope.editor.focus()
-        $scope.goToEnd($scope.editor)
+        $scope.editor.focus();
+        $scope.goToEnd($scope.editor);
         if (prefix === paragraphText) {
-          $timeout(function () {
-            $scope.editor.gotoLine(2, 0)
-          }, 0)
+          $timeout(function() {
+            $scope.editor.gotoLine(2, 0);
+          }, 0);
         }
       }
 
-      autoAdjustEditorHeight(_editor)
-      angular.element(window).resize(function () {
-        autoAdjustEditorHeight(_editor)
-      })
+      autoAdjustEditorHeight(_editor);
+      angular.element(window).resize(function() {
+        autoAdjustEditorHeight(_editor);
+      });
 
       if (navigator.appVersion.indexOf('Mac') !== -1) {
-        $scope.editor.setKeyboardHandler('ace/keyboard/emacs')
-        $rootScope.isMac = true
+        $scope.editor.setKeyboardHandler('ace/keyboard/emacs');
+        $rootScope.isMac = true;
       } else if (navigator.appVersion.indexOf('Win') !== -1 ||
         navigator.appVersion.indexOf('X11') !== -1 ||
         navigator.appVersion.indexOf('Linux') !== -1) {
-        $rootScope.isMac = false
+        $rootScope.isMac = false;
         // not applying emacs key binding while the binding override Ctrl-v. default behavior of paste text on windows.
       }
 
       let remoteCompleter = {
         getCompletions: function(editor, session, pos, prefix, callback) {
-          let langTools = ace.require('ace/ext/language_tools')
-          let defaultKeywords = new Set()
+          let langTools = ace.require('ace/ext/language_tools');
+          let defaultKeywords = new Set();
 
           // eslint-disable-next-line handle-callback-err
           let getDefaultKeywords = function(err, completions) {
             if (completions !== undefined) {
               completions.forEach(function(c) {
-                defaultKeywords.add(c.value)
-              })
+                defaultKeywords.add(c.value);
+              });
             }
-          }
+          };
           if (langTools.keyWordCompleter !== undefined) {
-            langTools.keyWordCompleter.getCompletions(editor, session, pos, prefix, getDefaultKeywords)
+            langTools.keyWordCompleter.getCompletions(editor, session, pos, prefix, getDefaultKeywords);
           }
 
           if (!editor.isFocused()) {
-            return
+            return;
           }
 
-          pos = session.getTextRange(new Range(0, 0, pos.row, pos.column)).length
-          let buf = session.getValue()
+          pos = session.getTextRange(new Range(0, 0, pos.row, pos.column)).length;
+          let buf = session.getValue();
 
-          websocketMsgSrv.completion($scope.paragraph.id, buf, pos)
+          websocketMsgSrv.completion($scope.paragraph.id, buf, pos);
 
           $scope.$on('completionList', function(event, data) {
             let computeCaption = function(value, meta) {
-              let metaLength = meta !== undefined ? meta.length : 0
-              let length = 42
-              let whitespaceLength = 3
-              let ellipses = '...'
-              let maxLengthCaption = length - metaLength - whitespaceLength - ellipses.length
+              let metaLength = meta !== undefined ? meta.length : 0;
+              let length = 42;
+              let whitespaceLength = 3;
+              let ellipses = '...';
+              let maxLengthCaption = length - metaLength - whitespaceLength - ellipses.length;
               if (value !== undefined && value.length > maxLengthCaption) {
-                return value.substr(0, maxLengthCaption) + ellipses
+                return value.substr(0, maxLengthCaption) + ellipses;
               }
-              return value
-            }
+              return value;
+            };
             if (data.completions) {
-              let completions = []
+              let completions = [];
               for (let c in data.completions) {
-                let v = data.completions[c]
-                if (v.meta !== undefined && v.meta === 'keyword' && defaultKeywords.has(v.value.trim())) {
-                  continue
+                if (data.completions.hasOwnProperty(c)) {
+                  let v = data.completions[c];
+                  if (v.meta !== undefined && v.meta === 'keyword' && defaultKeywords.has(v.value.trim())) {
+                    continue;
+                  }
+                  completions.push({
+                    name: v.name,
+                    value: v.value,
+                    meta: v.meta,
+                    caption: computeCaption(v.value, v.meta),
+                    score: 300,
+                  });
                 }
-                completions.push({
-                  name: v.name,
-                  value: v.value,
-                  meta: v.meta,
-                  caption: computeCaption(v.value, v.meta),
-                  score: 300
-                })
               }
-              callback(null, completions)
+              callback(null, completions);
             }
-          })
-        }
-      }
+          });
+        },
+      };
 
       langTools.setCompleters([remoteCompleter, langTools.keyWordCompleter, langTools.snippetCompleter,
-        langTools.textCompleter])
+        langTools.textCompleter]);
 
       $scope.editor.setOptions({
         fontSize: $scope.paragraph.config.fontSize + 'pt',
         enableBasicAutocompletion: true,
         enableSnippets: false,
-        enableLiveAutocompletion: false
-      })
+        enableLiveAutocompletion: false,
+      });
 
-      $scope.editor.on('focus', function () {
-        handleFocus(true)
-      })
+      $scope.editor.on('focus', function() {
+        handleFocus(true);
+      });
 
-      $scope.editor.on('blur', function () {
-        handleFocus(false)
-        $scope.saveParagraph($scope.paragraph)
-      })
+      $scope.editor.on('blur', function() {
+        handleFocus(false);
+        $scope.saveParagraph($scope.paragraph);
+      });
 
-      $scope.editor.on('paste', function (e) {
+      $scope.editor.on('paste', function(e) {
         if (e.text.indexOf('%') === 0) {
-          pastePercentSign = true
+          pastePercentSign = true;
         }
-      })
+      });
 
-      $scope.editor.getSession().on('change', function (e, editSession) {
-        autoAdjustEditorHeight(_editor)
-      })
+      $scope.editor.getSession().on('change', function(e, editSession) {
+        autoAdjustEditorHeight(_editor);
+      });
 
-      setParagraphMode($scope.editor.getSession(), $scope.editor.getSession().getValue())
+      setParagraphMode($scope.editor.getSession(), $scope.editor.getSession().getValue());
 
       // autocomplete on '.'
       /*
@@ -851,29 +855,29 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
        */
 
       // remove binding
-      $scope.editor.commands.removeCommand('showSettingsMenu')
-      $scope.editor.commands.removeCommand('find')
-      $scope.editor.commands.removeCommand('replace')
+      $scope.editor.commands.removeCommand('showSettingsMenu');
+      $scope.editor.commands.removeCommand('find');
+      $scope.editor.commands.removeCommand('replace');
 
-      let isOption = $rootScope.isMac ? 'option' : 'alt'
+      let isOption = $rootScope.isMac ? 'option' : 'alt';
 
-      $scope.editor.commands.bindKey('ctrl-' + isOption + '-n.', null)
-      $scope.editor.commands.bindKey('ctrl-' + isOption + '-l', null)
-      $scope.editor.commands.bindKey('ctrl-' + isOption + '-w', null)
-      $scope.editor.commands.bindKey('ctrl-' + isOption + '-a', null)
-      $scope.editor.commands.bindKey('ctrl-' + isOption + '-k', null)
-      $scope.editor.commands.bindKey('ctrl-' + isOption + '-e', null)
-      $scope.editor.commands.bindKey('ctrl-' + isOption + '-t', null)
-      $scope.editor.commands.bindKey('ctrl-space', null)
+      $scope.editor.commands.bindKey('ctrl-' + isOption + '-n.', null);
+      $scope.editor.commands.bindKey('ctrl-' + isOption + '-l', null);
+      $scope.editor.commands.bindKey('ctrl-' + isOption + '-w', null);
+      $scope.editor.commands.bindKey('ctrl-' + isOption + '-a', null);
+      $scope.editor.commands.bindKey('ctrl-' + isOption + '-k', null);
+      $scope.editor.commands.bindKey('ctrl-' + isOption + '-e', null);
+      $scope.editor.commands.bindKey('ctrl-' + isOption + '-t', null);
+      $scope.editor.commands.bindKey('ctrl-space', null);
 
       if ($rootScope.isMac) {
-        $scope.editor.commands.bindKey('command-l', null)
+        $scope.editor.commands.bindKey('command-l', null);
       } else {
-        $scope.editor.commands.bindKey('ctrl-l', null)
+        $scope.editor.commands.bindKey('ctrl-l', null);
       }
 
       // autocomplete on 'ctrl+.'
-      $scope.editor.commands.bindKey('ctrl-.', 'startAutocomplete')
+      $scope.editor.commands.bindKey('ctrl-.', 'startAutocomplete');
 
       // Show autocomplete on tab
       $scope.editor.commands.addCommand({
@@ -881,113 +885,123 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
         bindKey: {
           win: 'tab',
           mac: 'tab',
-          sender: 'editor|cli'
+          sender: 'editor|cli',
         },
         exec: function(env, args, request) {
-          let iCursor = $scope.editor.getCursorPosition()
-          let currentLine = $scope.editor.session.getLine(iCursor.row)
+          let iCursor = $scope.editor.getCursorPosition();
+          let currentLine = $scope.editor.session.getLine(iCursor.row);
           let isAllTabs = currentLine.substring(0, iCursor.column - 1).split('').every(function(char) {
-            return (char === '\t' || char === ' ')
-          })
+            return (char === '\t' || char === ' ');
+          });
 
           // If user has pressed tab on first line char or if isTabCompletion() is false, keep existing behavior
           // If user has pressed tab anywhere in between and editor mode is not %md, show autocomplete
           if (!isAllTabs && iCursor.column && isTabCompletion()) {
-            $scope.editor.execCommand('startAutocomplete')
+            $scope.editor.execCommand('startAutocomplete');
           } else {
-            ace.config.loadModule('ace/ext/language_tools', function () {
-              $scope.editor.insertSnippet('\t')
-            })
+            ace.config.loadModule('ace/ext/language_tools', function() {
+              $scope.editor.insertSnippet('\t');
+            });
           }
-        }
-      })
+        },
+      });
 
-      let keyBindingEditorFocusAction = function (scrollValue) {
-        let numRows = $scope.editor.getSession().getLength()
-        let currentRow = $scope.editor.getCursorPosition().row
+      let keyBindingEditorFocusAction = function(scrollValue) {
+        let numRows = $scope.editor.getSession().getLength();
+        let currentRow = $scope.editor.getCursorPosition().row;
         if (currentRow === 0 && scrollValue <= 0) {
           // move focus to previous paragraph
-          $scope.$emit('moveFocusToPreviousParagraph', $scope.paragraph.id)
+          $scope.$emit('moveFocusToPreviousParagraph', $scope.paragraph.id);
         } else if (currentRow === numRows - 1 && scrollValue >= 0) {
-          $scope.$emit('moveFocusToNextParagraph', $scope.paragraph.id)
+          $scope.$emit('moveFocusToNextParagraph', $scope.paragraph.id);
         } else {
-          $scope.scrollToCursor($scope.paragraph.id, scrollValue)
+          $scope.scrollToCursor($scope.paragraph.id, scrollValue);
         }
-      }
+      };
 
       // handle cursor moves
-      $scope.editor.keyBinding.origOnCommandKey = $scope.editor.keyBinding.onCommandKey
-      $scope.editor.keyBinding.onCommandKey = function (e, hashId, keyCode) {
+      $scope.editor.keyBinding.origOnCommandKey = $scope.editor.keyBinding.onCommandKey;
+      $scope.editor.keyBinding.onCommandKey = function(e, hashId, keyCode) {
         if ($scope.editor.completer && $scope.editor.completer.activated) { // if autocompleter is active
         } else {
           // fix ace editor focus issue in chrome (textarea element goes to top: -1000px after focused by cursor move)
           if (parseInt(angular.element('#' + $scope.paragraph.id + '_editor > textarea')
               .css('top').replace('px', '')) < 0) {
-            let position = $scope.editor.getCursorPosition()
-            let cursorPos = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true)
-            angular.element('#' + $scope.paragraph.id + '_editor > textarea').css('top', cursorPos.top)
+            let position = $scope.editor.getCursorPosition();
+            let cursorPos = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true);
+            angular.element('#' + $scope.paragraph.id + '_editor > textarea').css('top', cursorPos.top);
           }
 
-          let ROW_UP = -1
-          let ROW_DOWN = 1
+          let ROW_UP = -1;
+          let ROW_DOWN = 1;
 
           switch (keyCode) {
             case 38:
-              if (!e.shiftKey) { keyBindingEditorFocusAction(ROW_UP) }
-              break
+              if (!e.shiftKey) {
+                keyBindingEditorFocusAction(ROW_UP);
+              }
+              break;
             case 80:
-              if (e.ctrlKey && !e.altKey) { keyBindingEditorFocusAction(ROW_UP) }
-              break
+              if (e.ctrlKey && !e.altKey) {
+                keyBindingEditorFocusAction(ROW_UP);
+              }
+              break;
             case 40:
-              if (!e.shiftKey) { keyBindingEditorFocusAction(ROW_DOWN) }
-              break
+              if (!e.shiftKey) {
+                keyBindingEditorFocusAction(ROW_DOWN);
+              }
+              break;
             case 78:
-              if (e.ctrlKey && !e.altKey) { keyBindingEditorFocusAction(ROW_DOWN) }
-              break
+              if (e.ctrlKey && !e.altKey) {
+                keyBindingEditorFocusAction(ROW_DOWN);
+              }
+              break;
           }
         }
-        this.origOnCommandKey(e, hashId, keyCode)
-      }
+        this.origOnCommandKey(e, hashId, keyCode);
+      };
     }
-  }
+  };
 
-  const handleFocus = function (focused, isDigestPass) {
-    $scope.paragraphFocused = focused
+  const handleFocus = function(focused, isDigestPass) {
+    $scope.paragraphFocused = focused;
 
-    if ($scope.editor) { $scope.editor.setHighlightActiveLine(focused) }
+    if ($scope.editor) {
+      $scope.editor.setHighlightActiveLine(focused);
+    }
 
     if (isDigestPass === false || isDigestPass === undefined) {
       // Protect against error in case digest is already running
-      $timeout(function () {
+      $timeout(function() {
         // Apply changes since they come from 3rd party library
-        $scope.$digest()
-      })
+        $scope.$digest();
+      });
     }
-  }
+  };
 
-  let getEditorSetting = function (paragraph, interpreterName) {
-    let deferred = $q.defer()
+  let getEditorSetting = function(paragraph, interpreterName) {
+    let deferred = $q.defer();
     if (!$scope.revisionView) {
-      websocketMsgSrv.getEditorSetting(paragraph.id, interpreterName)
+      websocketMsgSrv.getEditorSetting(paragraph.id, interpreterName);
       $timeout(
-        $scope.$on('editorSetting', function (event, data) {
+        $scope.$on('editorSetting', function(event, data) {
           if (paragraph.id === data.paragraphId) {
-            deferred.resolve(data)
+            deferred.resolve(data);
           }
         }
-      ), 1000)
+      ), 1000);
     }
-    return deferred.promise
-  }
+    return deferred.promise;
+  };
 
-  let setEditorLanguage = function (session, language) {
-    let mode = 'ace/mode/'
-    mode += language
-    $scope.paragraph.config.editorMode = mode
-    session.setMode(mode)
-  }
+  let setEditorLanguage = function(session, language) {
+    let mode = 'ace/mode/';
+    mode += language;
+    $scope.paragraph.config.editorMode = mode;
+    session.setMode(mode);
+  };
 
-  const setParagraphMode = function (session, paragraphText, pos) {
+  const setParagraphMode = function(session, paragraphText, pos) {
     // Evaluate the mode only if the the position is undefined
     // or the first 30 characters of the paragraph have been modified
     // or cursor position is at beginning of second line.(in case user hit enter after typing %magic)
@@ -996,319 +1010,321 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
       // If paragraph loading, use config value if exists
       if ((typeof pos === 'undefined') && $scope.paragraph.config.editorMode &&
         !setInterpreterBindings) {
-        session.setMode($scope.paragraph.config.editorMode)
+        session.setMode($scope.paragraph.config.editorMode);
       } else {
-        let magic = getInterpreterName(paragraphText)
+        let magic = getInterpreterName(paragraphText);
         if (editorSetting.magic !== magic) {
-          editorSetting.magic = magic
+          editorSetting.magic = magic;
           getEditorSetting($scope.paragraph, magic)
-            .then(function (setting) {
-              setEditorLanguage(session, setting.editor.language)
-              _.merge($scope.paragraph.config.editorSetting, setting.editor)
-            })
+            .then(function(setting) {
+              setEditorLanguage(session, setting.editor.language);
+              _.merge($scope.paragraph.config.editorSetting, setting.editor);
+            });
         }
       }
     }
-    pastePercentSign = false
-    setInterpreterBindings = false
-  }
+    pastePercentSign = false;
+    setInterpreterBindings = false;
+  };
 
   const getInterpreterName = function(paragraphText) {
-    let intpNameRegexp = /^\s*%(.+?)(\s|\()/g
-    let match = intpNameRegexp.exec(paragraphText)
+    let intpNameRegexp = /^\s*%(.+?)(\s|\()/g;
+    let match = intpNameRegexp.exec(paragraphText);
     if (match) {
-      return match[1].trim()
+      return match[1].trim();
       // get default interpreter name if paragraph text doesn't start with '%'
       // TODO(mina): dig into the cause what makes interpreterBindings to have no element
     } else if ($scope.$parent.interpreterBindings && $scope.$parent.interpreterBindings.length !== 0) {
-      return $scope.$parent.interpreterBindings[0].name
+      return $scope.$parent.interpreterBindings[0].name;
     }
-    return ''
-  }
+    return '';
+  };
 
-  const autoAdjustEditorHeight = function (editor) {
+  const autoAdjustEditorHeight = function(editor) {
     let height =
       editor.getSession().getScreenLength() *
-      editor.renderer.lineHeight
+      editor.renderer.lineHeight;
 
-    angular.element('#' + editor.container.id).height(height.toString() + 'px')
-    editor.resize()
-  }
+    angular.element('#' + editor.container.id).height(height.toString() + 'px');
+    editor.resize();
+  };
 
-  $rootScope.$on('scrollToCursor', function (event) {
+  $rootScope.$on('scrollToCursor', function(event) {
     // scroll on 'scrollToCursor' event only when cursor is in the last paragraph
-    let paragraphs = angular.element('div[id$="_paragraphColumn_main"]')
+    let paragraphs = angular.element('div[id$="_paragraphColumn_main"]');
     if (paragraphs[paragraphs.length - 1].id.indexOf($scope.paragraph.id) === 0) {
-      $scope.scrollToCursor($scope.paragraph.id, 0)
+      $scope.scrollToCursor($scope.paragraph.id, 0);
     }
-  })
+  });
 
   /** scrollToCursor if it is necessary
    * when cursor touches scrollTriggerEdgeMargin from the top (or bottom) of the screen, it autoscroll to place cursor around 1/3 of screen height from the top (or bottom)
    * paragraphId : paragraph that has active cursor
    * lastCursorMove : 1(down), 0, -1(up) last cursor move event
    **/
-  $scope.scrollToCursor = function (paragraphId, lastCursorMove) {
+  $scope.scrollToCursor = function(paragraphId, lastCursorMove) {
     if (!$scope.editor || !$scope.editor.isFocused()) {
       // only make sense when editor is focused
-      return
+      return;
     }
-    let lineHeight = $scope.editor.renderer.lineHeight
-    let headerHeight = 103 // menubar, notebook titlebar
-    let scrollTriggerEdgeMargin = 50
+    let lineHeight = $scope.editor.renderer.lineHeight;
+    let headerHeight = 103; // menubar, notebook titlebar
+    let scrollTriggerEdgeMargin = 50;
 
-    let documentHeight = angular.element(document).height()
-    let windowHeight = angular.element(window).height()  // actual viewport height
+    let documentHeight = angular.element(document).height();
+    let windowHeight = angular.element(window).height();  // actual viewport height
 
-    let scrollPosition = angular.element(document).scrollTop()
-    let editorPosition = angular.element('#' + paragraphId + '_editor').offset()
-    let position = $scope.editor.getCursorPosition()
-    let lastCursorPosition = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true)
+    let scrollPosition = angular.element(document).scrollTop();
+    let editorPosition = angular.element('#' + paragraphId + '_editor').offset();
+    let position = $scope.editor.getCursorPosition();
+    let lastCursorPosition = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true);
 
-    let calculatedCursorPosition = editorPosition.top + lastCursorPosition.top + lineHeight * lastCursorMove
+    let calculatedCursorPosition = editorPosition.top + lastCursorPosition.top + lineHeight * lastCursorMove;
 
-    let scrollTargetPos
+    let scrollTargetPos;
     if (calculatedCursorPosition < scrollPosition + headerHeight + scrollTriggerEdgeMargin) {
-      scrollTargetPos = calculatedCursorPosition - headerHeight - ((windowHeight - headerHeight) / 3)
+      scrollTargetPos = calculatedCursorPosition - headerHeight - ((windowHeight - headerHeight) / 3);
       if (scrollTargetPos < 0) {
-        scrollTargetPos = 0
+        scrollTargetPos = 0;
       }
     } else if (calculatedCursorPosition > scrollPosition + scrollTriggerEdgeMargin + windowHeight - headerHeight) {
-      scrollTargetPos = calculatedCursorPosition - headerHeight - ((windowHeight - headerHeight) * 2 / 3)
+      scrollTargetPos = calculatedCursorPosition - headerHeight - ((windowHeight - headerHeight) * 2 / 3);
 
       if (scrollTargetPos > documentHeight) {
-        scrollTargetPos = documentHeight
+        scrollTargetPos = documentHeight;
       }
     }
 
     // cancel previous scroll animation
-    let bodyEl = angular.element('body')
-    bodyEl.stop()
-    bodyEl.finish()
+    let bodyEl = angular.element('body');
+    bodyEl.stop();
+    bodyEl.finish();
 
     // scroll to scrollTargetPos
-    bodyEl.scrollTo(scrollTargetPos, {axis: 'y', interrupt: true, duration: 100})
-  }
+    bodyEl.scrollTo(scrollTargetPos, {axis: 'y', interrupt: true, duration: 100});
+  };
 
-  $scope.getEditorValue = function () {
-    return !$scope.editor ? $scope.paragraph.text : $scope.editor.getValue()
-  }
+  $scope.getEditorValue = function() {
+    return !$scope.editor ? $scope.paragraph.text : $scope.editor.getValue();
+  };
 
-  $scope.getProgress = function () {
-    return $scope.currentProgress || 0
-  }
+  $scope.getProgress = function() {
+    return $scope.currentProgress || 0;
+  };
 
   $scope.getFormattedParagraphTime = () => {
-    return moment().toISOString()
-  }
+    return moment().toISOString();
+  };
 
-  $scope.getExecutionTime = function (pdata) {
-    const end = pdata.dateFinished
-    const start = pdata.dateStarted
-    let timeMs = Date.parse(end) - Date.parse(start)
+  $scope.getExecutionTime = function(pdata) {
+    const end = pdata.dateFinished;
+    const start = pdata.dateStarted;
+    let timeMs = Date.parse(end) - Date.parse(start);
     if (isNaN(timeMs) || timeMs < 0) {
       if ($scope.isResultOutdated(pdata)) {
-        return 'outdated'
+        return 'outdated';
       }
-      return ''
+      return '';
     }
 
-    const durationFormat = moment.duration((timeMs / 1000), 'seconds').format('h [hrs] m [min] s [sec]')
-    const endFormat = moment(pdata.dateFinished).format('MMMM DD YYYY, h:mm:ss A')
+    const durationFormat = moment.duration((timeMs / 1000), 'seconds').format('h [hrs] m [min] s [sec]');
+    const endFormat = moment(pdata.dateFinished).format('MMMM DD YYYY, h:mm:ss A');
 
-    let user = (pdata.user === undefined || pdata.user === null) ? 'anonymous' : pdata.user
-    let desc = `Took ${durationFormat}. Last updated by ${user} at ${endFormat}.`
+    let user = (pdata.user === undefined || pdata.user === null) ? 'anonymous' : pdata.user;
+    let desc = `Took ${durationFormat}. Last updated by ${user} at ${endFormat}.`;
 
-    if ($scope.isResultOutdated(pdata)) { desc += ' (outdated)' }
+    if ($scope.isResultOutdated(pdata)) {
+      desc += ' (outdated)';
+    }
 
-    return desc
-  }
+    return desc;
+  };
 
-  $scope.getElapsedTime = function (paragraph) {
-    return 'Started ' + moment(paragraph.dateStarted).fromNow() + '.'
-  }
+  $scope.getElapsedTime = function(paragraph) {
+    return 'Started ' + moment(paragraph.dateStarted).fromNow() + '.';
+  };
 
-  $scope.isResultOutdated = function (pdata) {
+  $scope.isResultOutdated = function(pdata) {
     if (pdata.dateUpdated !== undefined && Date.parse(pdata.dateUpdated) > Date.parse(pdata.dateStarted)) {
-      return true
+      return true;
     }
-    return false
-  }
+    return false;
+  };
 
-  $scope.goToEnd = function (editor) {
-    editor.navigateFileEnd()
-  }
+  $scope.goToEnd = function(editor) {
+    editor.navigateFileEnd();
+  };
 
-  $scope.parseTableCell = function (cell) {
+  $scope.parseTableCell = function(cell) {
     if (!isNaN(cell)) {
       if (cell.length === 0 || Number(cell) > Number.MAX_SAFE_INTEGER || Number(cell) < Number.MIN_SAFE_INTEGER) {
-        return cell
+        return cell;
       } else {
-        return Number(cell)
+        return Number(cell);
       }
     }
-    let d = moment(cell)
+    let d = moment(cell);
     if (d.isValid()) {
-      return d
+      return d;
     }
-    return cell
-  }
+    return cell;
+  };
 
-  const commitParagraph = function (paragraph) {
+  const commitParagraph = function(paragraph) {
     const {
       id,
       title,
       text,
       config,
       settings: {params},
-    } = paragraph
+    } = paragraph;
 
     return websocketMsgSrv.commitParagraph(id, title, text, config, params,
-      $route.current.pathParams.noteId)
-  }
+      $route.current.pathParams.noteId);
+  };
 
   /** Utility function */
-  $scope.goToSingleParagraph = function () {
-    let noteId = $route.current.pathParams.noteId
+  $scope.goToSingleParagraph = function() {
+    let noteId = $route.current.pathParams.noteId;
     let redirectToUrl = location.protocol + '//' + location.host + location.pathname + '#/notebook/' + noteId +
-      '/paragraph/' + $scope.paragraph.id + '?asIframe'
-    $window.open(redirectToUrl)
-  }
+      '/paragraph/' + $scope.paragraph.id + '?asIframe';
+    $window.open(redirectToUrl);
+  };
 
-  $scope.showScrollDownIcon = function (id) {
-    let doc = angular.element('#p' + id + '_text')
+  $scope.showScrollDownIcon = function(id) {
+    let doc = angular.element('#p' + id + '_text');
     if (doc[0]) {
-      return doc[0].scrollHeight > doc.innerHeight()
+      return doc[0].scrollHeight > doc.innerHeight();
     }
-    return false
-  }
+    return false;
+  };
 
-  $scope.scrollParagraphDown = function (id) {
-    let doc = angular.element('#p' + id + '_text')
-    doc.animate({scrollTop: doc[0].scrollHeight}, 500)
-    $scope.keepScrollDown = true
-  }
+  $scope.scrollParagraphDown = function(id) {
+    let doc = angular.element('#p' + id + '_text');
+    doc.animate({scrollTop: doc[0].scrollHeight}, 500);
+    $scope.keepScrollDown = true;
+  };
 
-  $scope.showScrollUpIcon = function (id) {
+  $scope.showScrollUpIcon = function(id) {
     if (angular.element('#p' + id + '_text')[0]) {
-      return angular.element('#p' + id + '_text')[0].scrollTop !== 0
+      return angular.element('#p' + id + '_text')[0].scrollTop !== 0;
     }
-    return false
-  }
+    return false;
+  };
 
-  $scope.scrollParagraphUp = function (id) {
-    let doc = angular.element('#p' + id + '_text')
-    doc.animate({scrollTop: 0}, 500)
-    $scope.keepScrollDown = false
-  }
+  $scope.scrollParagraphUp = function(id) {
+    let doc = angular.element('#p' + id + '_text');
+    doc.animate({scrollTop: 0}, 500);
+    $scope.keepScrollDown = false;
+  };
 
-  $scope.$on('angularObjectUpdate', function (event, data) {
-    let noteId = $route.current.pathParams.noteId
+  $scope.$on('angularObjectUpdate', function(event, data) {
+    let noteId = $route.current.pathParams.noteId;
     if (!data.noteId || data.noteId === noteId) {
-      let scope
-      let registry
+      let scope;
+      let registry;
 
       if (!data.paragraphId || data.paragraphId === $scope.paragraph.id) {
-        scope = paragraphScope
-        registry = angularObjectRegistry
+        scope = paragraphScope;
+        registry = angularObjectRegistry;
       } else {
-        return
+        return;
       }
-      let varName = data.angularObject.name
+      let varName = data.angularObject.name;
 
       if (angular.equals(data.angularObject.object, scope[varName])) {
         // return when update has no change
-        return
+        return;
       }
 
       if (!registry[varName]) {
         registry[varName] = {
           interpreterGroupId: data.interpreterGroupId,
           noteId: data.noteId,
-          paragraphId: data.paragraphId
-        }
+          paragraphId: data.paragraphId,
+        };
       } else {
-        registry[varName].noteId = registry[varName].noteId || data.noteId
-        registry[varName].paragraphId = registry[varName].paragraphId || data.paragraphId
+        registry[varName].noteId = registry[varName].noteId || data.noteId;
+        registry[varName].paragraphId = registry[varName].paragraphId || data.paragraphId;
       }
 
-      registry[varName].skipEmit = true
+      registry[varName].skipEmit = true;
 
       if (!registry[varName].clearWatcher) {
-        registry[varName].clearWatcher = scope.$watch(varName, function (newValue, oldValue) {
-          console.log('angular object (paragraph) updated %o %o', varName, registry[varName])
+        registry[varName].clearWatcher = scope.$watch(varName, function(newValue, oldValue) {
+          console.log('angular object (paragraph) updated %o %o', varName, registry[varName]);
           if (registry[varName].skipEmit) {
-            registry[varName].skipEmit = false
-            return
+            registry[varName].skipEmit = false;
+            return;
           }
           websocketMsgSrv.updateAngularObject(
             registry[varName].noteId,
             registry[varName].paragraphId,
             varName,
             newValue,
-            registry[varName].interpreterGroupId)
-        })
+            registry[varName].interpreterGroupId);
+        });
       }
-      console.log('angular object (paragraph) created %o', varName)
-      scope[varName] = data.angularObject.object
+      console.log('angular object (paragraph) created %o', varName);
+      scope[varName] = data.angularObject.object;
 
       // create proxy for AngularFunction
       if (varName.indexOf(ANGULAR_FUNCTION_OBJECT_NAME_PREFIX) === 0) {
-        let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length)
-        scope[funcName] = function () {
+        let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length);
+        scope[funcName] = function() {
           // eslint-disable-next-line prefer-rest-params
-          scope[varName] = arguments
+          scope[varName] = arguments;
           // eslint-disable-next-line prefer-rest-params
-          console.log('angular function (paragraph) invoked %o', arguments)
-        }
+          console.log('angular function (paragraph) invoked %o', arguments);
+        };
 
-        console.log('angular function (paragraph) created %o', scope[funcName])
+        console.log('angular function (paragraph) created %o', scope[funcName]);
       }
     }
-  })
+  });
 
-  $scope.$on('updateParaInfos', function (event, data) {
+  $scope.$on('updateParaInfos', function(event, data) {
     if (data.id === $scope.paragraph.id) {
-      $scope.paragraph.runtimeInfos = data.infos
+      $scope.paragraph.runtimeInfos = data.infos;
     }
-  })
+  });
 
-  $scope.$on('angularObjectRemove', function (event, data) {
-    let noteId = $route.current.pathParams.noteId
+  $scope.$on('angularObjectRemove', function(event, data) {
+    let noteId = $route.current.pathParams.noteId;
     if (!data.noteId || data.noteId === noteId) {
-      let scope
-      let registry
+      let scope;
+      let registry;
 
       if (!data.paragraphId || data.paragraphId === $scope.paragraph.id) {
-        scope = paragraphScope
-        registry = angularObjectRegistry
+        scope = paragraphScope;
+        registry = angularObjectRegistry;
       } else {
-        return
+        return;
       }
 
-      let varName = data.name
+      let varName = data.name;
 
       // clear watcher
       if (registry[varName]) {
-        registry[varName].clearWatcher()
-        registry[varName] = undefined
+        registry[varName].clearWatcher();
+        registry[varName] = undefined;
       }
 
       // remove scope variable
-      scope[varName] = undefined
+      scope[varName] = undefined;
 
       // remove proxy for AngularFunction
       if (varName.indexOf(ANGULAR_FUNCTION_OBJECT_NAME_PREFIX) === 0) {
-        let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length)
-        scope[funcName] = undefined
+        let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length);
+        scope[funcName] = undefined;
       }
     }
-  })
+  });
 
   /**
    * @returns {boolean} true if updated is needed
    */
-  function isUpdateRequired (oldPara, newPara) {
+  function isUpdateRequired(oldPara, newPara) {
     return (newPara.id === oldPara.id &&
       (newPara.dateCreated !== oldPara.dateCreated ||
       newPara.text !== oldPara.text ||
@@ -1322,453 +1338,457 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
       newPara.errorMessage !== oldPara.errorMessage ||
       !angular.equals(newPara.settings, oldPara.settings) ||
       !angular.equals(newPara.config, oldPara.config) ||
-      !angular.equals(newPara.runtimeInfos, oldPara.runtimeInfos)))
+      !angular.equals(newPara.runtimeInfos, oldPara.runtimeInfos)));
   }
 
-  $scope.updateAllScopeTexts = function (oldPara, newPara) {
+  $scope.updateAllScopeTexts = function(oldPara, newPara) {
     if (oldPara.text !== newPara.text) {
       if ($scope.dirtyText) {         // check if editor has local update
         if ($scope.dirtyText === newPara.text) {  // when local update is the same from remote, clear local update
-          $scope.paragraph.text = newPara.text
-          $scope.dirtyText = undefined
-          $scope.originalText = angular.copy(newPara.text)
+          $scope.paragraph.text = newPara.text;
+          $scope.dirtyText = undefined;
+          $scope.originalText = angular.copy(newPara.text);
         } else { // if there're local update, keep it.
-          $scope.paragraph.text = newPara.text
+          $scope.paragraph.text = newPara.text;
         }
       } else {
-        $scope.paragraph.text = newPara.text
-        $scope.originalText = angular.copy(newPara.text)
+        $scope.paragraph.text = newPara.text;
+        $scope.originalText = angular.copy(newPara.text);
       }
     }
-  }
+  };
 
-  $scope.updateParagraphObjectWhenUpdated = function (newPara) {
+  $scope.updateParagraphObjectWhenUpdated = function(newPara) {
     // resize col width
     if ($scope.paragraph.config.colWidth !== newPara.config.colWidth) {
-      $scope.$broadcast('paragraphResized', $scope.paragraph.id)
+      $scope.$broadcast('paragraphResized', $scope.paragraph.id);
     }
 
     if ($scope.paragraph.config.fontSize !== newPara.config.fontSize) {
-      $rootScope.$broadcast('fontSizeChanged', newPara.config.fontSize)
+      $rootScope.$broadcast('fontSizeChanged', newPara.config.fontSize);
     }
 
     /** push the rest */
-    $scope.paragraph.aborted = newPara.aborted
-    $scope.paragraph.user = newPara.user
-    $scope.paragraph.dateUpdated = newPara.dateUpdated
-    $scope.paragraph.dateCreated = newPara.dateCreated
-    $scope.paragraph.dateFinished = newPara.dateFinished
-    $scope.paragraph.dateStarted = newPara.dateStarted
-    $scope.paragraph.errorMessage = newPara.errorMessage
-    $scope.paragraph.jobName = newPara.jobName
-    $scope.paragraph.title = newPara.title
-    $scope.paragraph.lineNumbers = newPara.lineNumbers
-    $scope.paragraph.status = newPara.status
-    $scope.paragraph.fontSize = newPara.fontSize
+    $scope.paragraph.aborted = newPara.aborted;
+    $scope.paragraph.user = newPara.user;
+    $scope.paragraph.dateUpdated = newPara.dateUpdated;
+    $scope.paragraph.dateCreated = newPara.dateCreated;
+    $scope.paragraph.dateFinished = newPara.dateFinished;
+    $scope.paragraph.dateStarted = newPara.dateStarted;
+    $scope.paragraph.errorMessage = newPara.errorMessage;
+    $scope.paragraph.jobName = newPara.jobName;
+    $scope.paragraph.title = newPara.title;
+    $scope.paragraph.lineNumbers = newPara.lineNumbers;
+    $scope.paragraph.status = newPara.status;
+    $scope.paragraph.fontSize = newPara.fontSize;
     if (newPara.status !== ParagraphStatus.RUNNING) {
-      $scope.paragraph.results = newPara.results
+      $scope.paragraph.results = newPara.results;
     }
-    $scope.paragraph.settings = newPara.settings
-    $scope.paragraph.runtimeInfos = newPara.runtimeInfos
+    $scope.paragraph.settings = newPara.settings;
+    $scope.paragraph.runtimeInfos = newPara.runtimeInfos;
     if ($scope.editor) {
-      $scope.editor.setReadOnly($scope.isRunning(newPara))
+      $scope.editor.setReadOnly($scope.isRunning(newPara));
     }
 
     if (!$scope.asIframe) {
-      $scope.paragraph.config = newPara.config
-      initializeDefault(newPara.config)
+      $scope.paragraph.config = newPara.config;
+      initializeDefault(newPara.config);
     } else {
-      newPara.config.editorHide = true
-      newPara.config.tableHide = false
-      $scope.paragraph.config = newPara.config
+      newPara.config.editorHide = true;
+      newPara.config.tableHide = false;
+      $scope.paragraph.config = newPara.config;
     }
-  }
+  };
 
-  $scope.updateParagraph = function (oldPara, newPara, updateCallback) {
+  $scope.updateParagraph = function(oldPara, newPara, updateCallback) {
      // 1. can't update on revision view
     if ($scope.revisionView === true) {
-      return
+      return;
     }
 
      // 2. get status, refreshed
-    const statusChanged = (newPara.status !== oldPara.status)
+    const statusChanged = (newPara.status !== oldPara.status);
     const resultRefreshed = (newPara.dateFinished !== oldPara.dateFinished) ||
        isEmpty(newPara.results) !== isEmpty(oldPara.results) ||
        newPara.status === ParagraphStatus.ERROR ||
-       (newPara.status === ParagraphStatus.FINISHED && statusChanged)
+       (newPara.status === ParagraphStatus.FINISHED && statusChanged);
 
      // 3. update texts managed by $scope
-    $scope.updateAllScopeTexts(oldPara, newPara)
+    $scope.updateAllScopeTexts(oldPara, newPara);
 
      // 4. execute callback to update result
-    updateCallback()
+    updateCallback();
 
      // 5. update remaining paragraph objects
-    $scope.updateParagraphObjectWhenUpdated(newPara)
+    $scope.updateParagraphObjectWhenUpdated(newPara);
 
      // 6. handle scroll down by key properly if new paragraph is added
     if (statusChanged || resultRefreshed) {
        // when last paragraph runs, zeppelin automatically appends new paragraph.
        // this broadcast will focus to the newly inserted paragraph
-      const paragraphs = angular.element('div[id$="_paragraphColumn_main"]')
+      const paragraphs = angular.element('div[id$="_paragraphColumn_main"]');
       if (paragraphs.length >= 2 && paragraphs[paragraphs.length - 2].id.indexOf($scope.paragraph.id) === 0) {
          // rendering output can took some time. So delay scrolling event firing for sometime.
-        setTimeout(() => { $rootScope.$broadcast('scrollToCursor') }, 500)
+        setTimeout(() => {
+          $rootScope.$broadcast('scrollToCursor');
+        }, 500);
       }
     }
-  }
+  };
 
   /** $scope.$on */
 
-  $scope.$on('runParagraphUsingSpell', function (event, data) {
-    const oldPara = $scope.paragraph
-    let newPara = data.paragraph
+  $scope.$on('runParagraphUsingSpell', function(event, data) {
+    const oldPara = $scope.paragraph;
+    let newPara = data.paragraph;
     const updateCallback = () => {
-      $scope.runParagraph(newPara.text, true, true)
-    }
+      $scope.runParagraph(newPara.text, true, true);
+    };
 
     if (!isUpdateRequired(oldPara, newPara)) {
-      return
+      return;
     }
 
-    $scope.updateParagraph(oldPara, newPara, updateCallback)
-  })
+    $scope.updateParagraph(oldPara, newPara, updateCallback);
+  });
 
-  $scope.$on('updateParagraph', function (event, data) {
-    const oldPara = $scope.paragraph
-    const newPara = data.paragraph
+  $scope.$on('updateParagraph', function(event, data) {
+    const oldPara = $scope.paragraph;
+    const newPara = data.paragraph;
 
     if (!isUpdateRequired(oldPara, newPara)) {
-      return
+      return;
     }
 
     const updateCallback = () => {
       // broadcast `updateResult` message to trigger result update
       if (newPara.results && newPara.results.msg) {
         for (let i in newPara.results.msg) {
-          const newResult = newPara.results.msg ? newPara.results.msg[i] : {}
-          const oldResult = (oldPara.results && oldPara.results.msg)
-            ? oldPara.results.msg[i] : {}
-          const newConfig = newPara.config.results ? newPara.config.results[i] : {}
-          const oldConfig = oldPara.config.results ? oldPara.config.results[i] : {}
-          if (!angular.equals(newResult, oldResult) ||
-            !angular.equals(newConfig, oldConfig)) {
-            $rootScope.$broadcast('updateResult', newResult, newConfig, newPara, parseInt(i))
+          if (newPara.results.msg.hasOwnProperty(i)) {
+            const newResult = newPara.results.msg ? newPara.results.msg[i] : {};
+            const oldResult = (oldPara.results && oldPara.results.msg)
+              ? oldPara.results.msg[i] : {};
+            const newConfig = newPara.config.results ? newPara.config.results[i] : {};
+            const oldConfig = oldPara.config.results ? oldPara.config.results[i] : {};
+            if (!angular.equals(newResult, oldResult) ||
+              !angular.equals(newConfig, oldConfig)) {
+              $rootScope.$broadcast('updateResult', newResult, newConfig, newPara, parseInt(i));
+            }
           }
         }
       }
-    }
+    };
 
-    $scope.updateParagraph(oldPara, newPara, updateCallback)
-  })
+    $scope.updateParagraph(oldPara, newPara, updateCallback);
+  });
 
-  $scope.$on('updateProgress', function (event, data) {
+  $scope.$on('updateProgress', function(event, data) {
     if (data.id === $scope.paragraph.id) {
-      $scope.currentProgress = data.progress
+      $scope.currentProgress = data.progress;
     }
-  })
+  });
 
-  $scope.$on('appendParagraphOutput', function (event, data) {
+  $scope.$on('appendParagraphOutput', function(event, data) {
     if (data.paragraphId === $scope.paragraph.id) {
       if (!$scope.paragraph.results) {
-        $scope.paragraph.results = {}
+        $scope.paragraph.results = {};
 
         if (!$scope.paragraph.results.msg) {
-          $scope.paragraph.results.msg = []
+          $scope.paragraph.results.msg = [];
         }
 
         $scope.paragraph.results.msg[data.index] = {
           data: data.data,
-          type: data.type
-        }
+          type: data.type,
+        };
 
         $rootScope.$broadcast(
           'updateResult',
           $scope.paragraph.results.msg[data.index],
           $scope.paragraph.config.results[data.index],
           $scope.paragraph,
-          data.index)
+          data.index);
       }
     }
-  })
+  });
 
-  $scope.$on('keyEvent', function (event, keyEvent) {
+  $scope.$on('keyEvent', function(event, keyEvent) {
     if ($scope.paragraphFocused) {
-      let paragraphId = $scope.paragraph.id
-      let keyCode = keyEvent.keyCode
-      let noShortcutDefined = false
-      let editorHide = $scope.paragraph.config.editorHide
+      let paragraphId = $scope.paragraph.id;
+      let keyCode = keyEvent.keyCode;
+      let noShortcutDefined = false;
+      let editorHide = $scope.paragraph.config.editorHide;
 
       if (editorHide && (keyCode === 38 || (keyCode === 80 && keyEvent.ctrlKey && !keyEvent.altKey))) { // up
         // move focus to previous paragraph
-        $scope.$emit('moveFocusToPreviousParagraph', paragraphId)
+        $scope.$emit('moveFocusToPreviousParagraph', paragraphId);
       } else if (editorHide && (keyCode === 40 || (keyCode === 78 && keyEvent.ctrlKey && !keyEvent.altKey))) { // down
         // move focus to next paragraph
         // $timeout stops chaining effect of focus propogation
-        $timeout(() => $scope.$emit('moveFocusToNextParagraph', paragraphId))
+        $timeout(() => $scope.$emit('moveFocusToNextParagraph', paragraphId));
       } else if (!keyEvent.ctrlKey && keyEvent.shiftKey && keyCode === 13) { // Shift + Enter
-        $scope.runParagraphFromShortcut($scope.getEditorValue())
+        $scope.runParagraphFromShortcut($scope.getEditorValue());
       } else if (keyEvent.ctrlKey && keyEvent.shiftKey && keyCode === 13) { // Ctrl + Shift + Enter
-        $scope.runAllToOrFromThis($scope.paragraph)
+        $scope.runAllToOrFromThis($scope.paragraph);
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 67) { // Ctrl + Alt + c
-        $scope.cancelParagraph($scope.paragraph)
+        $scope.cancelParagraph($scope.paragraph);
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 68) { // Ctrl + Alt + d
-        $scope.removeParagraph($scope.paragraph)
+        $scope.removeParagraph($scope.paragraph);
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 75) { // Ctrl + Alt + k
-        $scope.moveUp($scope.paragraph)
+        $scope.moveUp($scope.paragraph);
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 74) { // Ctrl + Alt + j
-        $scope.moveDown($scope.paragraph)
+        $scope.moveDown($scope.paragraph);
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 65) { // Ctrl + Alt + a
-        $scope.insertNew('above')
+        $scope.insertNew('above');
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 66) { // Ctrl + Alt + b
-        $scope.insertNew('below')
+        $scope.insertNew('below');
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 79) { // Ctrl + Alt + o
-        $scope.toggleOutput($scope.paragraph)
+        $scope.toggleOutput($scope.paragraph);
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 82) { // Ctrl + Alt + r
-        $scope.toggleEnableDisable($scope.paragraph)
+        $scope.toggleEnableDisable($scope.paragraph);
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 69) { // Ctrl + Alt + e
-        $scope.toggleEditor($scope.paragraph)
+        $scope.toggleEditor($scope.paragraph);
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 77) { // Ctrl + Alt + m
         if ($scope.paragraph.config.lineNumbers) {
-          $scope.hideLineNumbers($scope.paragraph)
+          $scope.hideLineNumbers($scope.paragraph);
         } else {
-          $scope.showLineNumbers($scope.paragraph)
+          $scope.showLineNumbers($scope.paragraph);
         }
       } else if (keyEvent.ctrlKey && keyEvent.shiftKey && keyCode === 189) { // Ctrl + Shift + -
-        $scope.changeColWidth($scope.paragraph, Math.max(1, $scope.paragraph.config.colWidth - 1))
+        $scope.changeColWidth($scope.paragraph, Math.max(1, $scope.paragraph.config.colWidth - 1));
       } else if (keyEvent.ctrlKey && keyEvent.shiftKey && keyCode === 187) { // Ctrl + Shift + =
-        $scope.changeColWidth($scope.paragraph, Math.min(12, $scope.paragraph.config.colWidth + 1))
+        $scope.changeColWidth($scope.paragraph, Math.min(12, $scope.paragraph.config.colWidth + 1));
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 84) { // Ctrl + Alt + t
         if ($scope.paragraph.config.title) {
-          $scope.hideTitle($scope.paragraph)
+          $scope.hideTitle($scope.paragraph);
         } else {
-          $scope.showTitle($scope.paragraph)
+          $scope.showTitle($scope.paragraph);
         }
       } else if (keyEvent.ctrlKey && keyEvent.shiftKey && keyCode === 67) { // Ctrl + Alt + c
-        $scope.copyPara('below')
+        $scope.copyPara('below');
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 76) { // Ctrl + Alt + l
-        $scope.clearParagraphOutput($scope.paragraph)
+        $scope.clearParagraphOutput($scope.paragraph);
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 87) { // Ctrl + Alt + w
-        $scope.goToSingleParagraph()
+        $scope.goToSingleParagraph();
       } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 70) { // Ctrl + f
-        $scope.$emit('toggleSearchBox')
+        $scope.$emit('toggleSearchBox');
       } else {
-        noShortcutDefined = true
+        noShortcutDefined = true;
       }
 
       if (!noShortcutDefined) {
-        keyEvent.preventDefault()
+        keyEvent.preventDefault();
       }
     }
-  })
+  });
 
-  $scope.$on('focusParagraph', function (event, paragraphId, cursorPosRow, cursorPosCol, mouseEvent) {
+  $scope.$on('focusParagraph', function(event, paragraphId, cursorPosRow, cursorPosCol, mouseEvent) {
     if (cursorPosCol === null || cursorPosCol === undefined) {
-      cursorPosCol = 0
+      cursorPosCol = 0;
     }
     if ($scope.paragraph.id === paragraphId) {
       // focus editor
       if (!$scope.paragraph.config.editorHide) {
         if (!mouseEvent) {
-          $scope.editor.focus()
+          $scope.editor.focus();
           // move cursor to the first row (or the last row)
-          let row
+          let row;
           if (cursorPosRow >= 0) {
-            row = cursorPosRow
-            $scope.editor.gotoLine(row, cursorPosCol)
+            row = cursorPosRow;
+            $scope.editor.gotoLine(row, cursorPosCol);
           } else {
-        

<TRUNCATED>

[02/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/navbar/navbar.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/navbar/navbar.controller.js b/zeppelin-web/src/components/navbar/navbar.controller.js
index 139328e..9fb5db2 100644
--- a/zeppelin-web/src/components/navbar/navbar.controller.js
+++ b/zeppelin-web/src/components/navbar/navbar.controller.js
@@ -12,237 +12,237 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').controller('NavCtrl', NavCtrl)
+angular.module('zeppelinWebApp').controller('NavCtrl', NavCtrl);
 
-function NavCtrl ($scope, $rootScope, $http, $routeParams, $location,
+function NavCtrl($scope, $rootScope, $http, $routeParams, $location,
                  noteListFactory, baseUrlSrv, websocketMsgSrv,
                  arrayOrderingSrv, searchService, TRASH_FOLDER_ID) {
-  'ngInject'
-
-  let vm = this
-  vm.arrayOrderingSrv = arrayOrderingSrv
-  vm.connected = websocketMsgSrv.isConnected()
-  vm.isActive = isActive
-  vm.logout = logout
-  vm.notes = noteListFactory
-  vm.search = search
-  vm.searchForm = searchService
-  vm.showLoginWindow = showLoginWindow
-  vm.TRASH_FOLDER_ID = TRASH_FOLDER_ID
-  vm.isFilterNote = isFilterNote
-  vm.numberOfNotesDisplayed = 10
-
-  $scope.query = {q: ''}
-
-  initController()
-
-  function getZeppelinVersion () {
+  'ngInject';
+
+  let vm = this;
+  vm.arrayOrderingSrv = arrayOrderingSrv;
+  vm.connected = websocketMsgSrv.isConnected();
+  vm.isActive = isActive;
+  vm.logout = logout;
+  vm.notes = noteListFactory;
+  vm.search = search;
+  vm.searchForm = searchService;
+  vm.showLoginWindow = showLoginWindow;
+  vm.TRASH_FOLDER_ID = TRASH_FOLDER_ID;
+  vm.isFilterNote = isFilterNote;
+  vm.numberOfNotesDisplayed = 10;
+
+  $scope.query = {q: ''};
+
+  initController();
+
+  function getZeppelinVersion() {
     $http.get(baseUrlSrv.getRestApiBase() + '/version').success(
-      function (data, status, headers, config) {
-        $rootScope.zeppelinVersion = data.body.version
+      function(data, status, headers, config) {
+        $rootScope.zeppelinVersion = data.body.version;
       }).error(
-      function (data, status, headers, config) {
-        console.log('Error %o %o', status, data.message)
-      })
+      function(data, status, headers, config) {
+        console.log('Error %o %o', status, data.message);
+      });
   }
 
-  function initController () {
-    $scope.isDrawNavbarNoteList = false
-    angular.element('#notebook-list').perfectScrollbar({suppressScrollX: true})
+  function initController() {
+    $scope.isDrawNavbarNoteList = false;
+    angular.element('#notebook-list').perfectScrollbar({suppressScrollX: true});
 
-    angular.element(document).click(function () {
-      $scope.query.q = ''
-    })
+    angular.element(document).click(function() {
+      $scope.query.q = '';
+    });
 
-    getZeppelinVersion()
-    loadNotes()
+    getZeppelinVersion();
+    loadNotes();
   }
 
-  function isFilterNote (note) {
+  function isFilterNote(note) {
     if (!$scope.query.q) {
-      return true
+      return true;
     }
 
-    let noteName = note.name
+    let noteName = note.name;
     if (noteName.toLowerCase().indexOf($scope.query.q.toLowerCase()) > -1) {
-      return true
+      return true;
     }
-    return false
+    return false;
   }
 
-  function isActive (noteId) {
-    return ($routeParams.noteId === noteId)
+  function isActive(noteId) {
+    return ($routeParams.noteId === noteId);
   }
 
-  function listConfigurations () {
-    websocketMsgSrv.listConfigurations()
+  function listConfigurations() {
+    websocketMsgSrv.listConfigurations();
   }
 
-  function loadNotes () {
-    websocketMsgSrv.getNoteList()
+  function loadNotes() {
+    websocketMsgSrv.getNoteList();
   }
 
-  function getHomeNote () {
-    websocketMsgSrv.getHomeNote()
+  function getHomeNote() {
+    websocketMsgSrv.getHomeNote();
   }
 
   function logout() {
-    let logoutURL = baseUrlSrv.getRestApiBase() + '/login/logout'
+    let logoutURL = baseUrlSrv.getRestApiBase() + '/login/logout';
 
-    $http.post(logoutURL).then(function () {}, function (response) {
+    $http.post(logoutURL).then(function() {}, function(response) {
       if (response.data) {
-        let res = angular.fromJson(response.data).body
+        let res = angular.fromJson(response.data).body;
         if (res['redirectURL']) {
           if (res['isLogoutAPI'] === 'true') {
-            $http.get(res['redirectURL']).then(function () {
-            }, function () {
-              window.location = baseUrlSrv.getBase()
-            })
+            $http.get(res['redirectURL']).then(function() {
+            }, function() {
+              window.location = baseUrlSrv.getBase();
+            });
           } else {
-            window.location.href = res['redirectURL'] + window.location.href
+            window.location.href = res['redirectURL'] + window.location.href;
           }
-          return undefined
+          return undefined;
         }
       }
 
       // force authcBasic (if configured) to logout
       if (detectIE()) {
-        let outcome
+        let outcome;
         try {
-          outcome = document.execCommand('ClearAuthenticationCache')
+          outcome = document.execCommand('ClearAuthenticationCache');
         } catch (e) {
-          console.log(e)
+          console.log(e);
         }
         if (!outcome) {
           // Let's create an xmlhttp object
-          outcome = (function (x) {
+          outcome = (function(x) {
             if (x) {
               // the reason we use "random" value for password is
               // that browsers cache requests. changing
               // password effectively behaves like cache-busing.
               x.open('HEAD', location.href, true, 'logout',
-                (new Date()).getTime().toString())
-              x.send('')
+                (new Date()).getTime().toString());
+              x.send('');
               // x.abort()
-              return 1 // this is **speculative** "We are done."
+              return 1; // this is **speculative** "We are done."
             } else {
               // eslint-disable-next-line no-useless-return
-              return
+              return;
             }
           })(window.XMLHttpRequest ? new window.XMLHttpRequest()
             // eslint-disable-next-line no-undef
-            : (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : u))
+            : (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : u));
         }
         if (!outcome) {
           let m = 'Your browser is too old or too weird to support log out functionality. Close all windows and ' +
-            'restart the browser.'
-          alert(m)
+            'restart the browser.';
+          alert(m);
         }
       } else {
         // for firefox and safari
-        logoutURL = logoutURL.replace('//', '//false:false@')
+        logoutURL = logoutURL.replace('//', '//false:false@');
       }
 
-      $http.post(logoutURL).error(function () {
-        $rootScope.userName = ''
-        $rootScope.ticket.principal = ''
-        $rootScope.ticket.screenUsername = ''
-        $rootScope.ticket.ticket = ''
-        $rootScope.ticket.roles = ''
+      $http.post(logoutURL).error(function() {
+        $rootScope.userName = '';
+        $rootScope.ticket.principal = '';
+        $rootScope.ticket.screenUsername = '';
+        $rootScope.ticket.ticket = '';
+        $rootScope.ticket.roles = '';
         BootstrapDialog.show({
-          message: 'Logout Success'
-        })
-        setTimeout(function () {
-          window.location = baseUrlSrv.getBase()
-        }, 1000)
-      })
-    })
+          message: 'Logout Success',
+        });
+        setTimeout(function() {
+          window.location = baseUrlSrv.getBase();
+        }, 1000);
+      });
+    });
   }
 
   function detectIE() {
-    let ua = window.navigator.userAgent
+    let ua = window.navigator.userAgent;
 
-    let msie = ua.indexOf('MSIE ')
+    let msie = ua.indexOf('MSIE ');
     if (msie > 0) {
       // IE 10 or older => return version number
-      return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10)
+      return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
     }
 
-    let trident = ua.indexOf('Trident/')
+    let trident = ua.indexOf('Trident/');
     if (trident > 0) {
       // IE 11 => return version number
-      let rv = ua.indexOf('rv:')
-      return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10)
+      let rv = ua.indexOf('rv:');
+      return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
     }
 
-    let edge = ua.indexOf('Edge/')
+    let edge = ua.indexOf('Edge/');
     if (edge > 0) {
       // Edge (IE 12+) => return version number
-      return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10)
+      return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
     }
 
     // other browser
-    return false
+    return false;
   }
 
-  function search (searchTerm) {
-    $location.path('/search/' + searchTerm)
+  function search(searchTerm) {
+    $location.path('/search/' + searchTerm);
   }
 
-  function showLoginWindow () {
-    setTimeout(function () {
-      angular.element('#userName').focus()
-    }, 500)
+  function showLoginWindow() {
+    setTimeout(function() {
+      angular.element('#userName').focus();
+    }, 500);
   }
 
   /*
    ** $scope.$on functions below
    */
 
-  $scope.$on('setNoteMenu', function (event, notes) {
-    noteListFactory.setNotes(notes)
-    initNotebookListEventListener()
-  })
+  $scope.$on('setNoteMenu', function(event, notes) {
+    noteListFactory.setNotes(notes);
+    initNotebookListEventListener();
+  });
 
-  $scope.$on('setConnectedStatus', function (event, param) {
-    vm.connected = param
-  })
+  $scope.$on('setConnectedStatus', function(event, param) {
+    vm.connected = param;
+  });
 
-  $scope.$on('loginSuccess', function (event, param) {
-    $rootScope.ticket.screenUsername = $rootScope.ticket.principal
-    listConfigurations()
-    loadNotes()
-    getHomeNote()
-  })
+  $scope.$on('loginSuccess', function(event, param) {
+    $rootScope.ticket.screenUsername = $rootScope.ticket.principal;
+    listConfigurations();
+    loadNotes();
+    getHomeNote();
+  });
 
   /*
    ** Performance optimization for Browser Render.
    */
-  function initNotebookListEventListener () {
-    angular.element(document).ready(function () {
-      angular.element('.notebook-list-dropdown').on('show.bs.dropdown', function () {
-        $scope.isDrawNavbarNoteList = true
-      })
-
-      angular.element('.notebook-list-dropdown').on('hide.bs.dropdown', function () {
-        $scope.isDrawNavbarNoteList = false
-      })
-    })
+  function initNotebookListEventListener() {
+    angular.element(document).ready(function() {
+      angular.element('.notebook-list-dropdown').on('show.bs.dropdown', function() {
+        $scope.isDrawNavbarNoteList = true;
+      });
+
+      angular.element('.notebook-list-dropdown').on('hide.bs.dropdown', function() {
+        $scope.isDrawNavbarNoteList = false;
+      });
+    });
   }
 
-  $scope.loadMoreNotes = function () {
-    vm.numberOfNotesDisplayed += 10
-  }
+  $scope.loadMoreNotes = function() {
+    vm.numberOfNotesDisplayed += 10;
+  };
 
-  $scope.calculateTooltipPlacement = function (note) {
+  $scope.calculateTooltipPlacement = function(note) {
     if (note !== undefined && note.name !== undefined) {
-      let length = note.name.length
+      let length = note.name.length;
       if (length < 2) {
-        return 'top-left'
+        return 'top-left';
       } else if (length > 7) {
-        return 'top-right'
+        return 'top-right';
       }
     }
-    return 'top'
-  }
+    return 'top';
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/navbar/navbar.controller.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/navbar/navbar.controller.test.js b/zeppelin-web/src/components/navbar/navbar.controller.test.js
index bf29b84..f4bb3bf 100644
--- a/zeppelin-web/src/components/navbar/navbar.controller.test.js
+++ b/zeppelin-web/src/components/navbar/navbar.controller.test.js
@@ -1,18 +1,18 @@
-describe('Controller: NavCtrl', function () {
+describe('Controller: NavCtrl', function() {
   // load the controller's module
-  beforeEach(angular.mock.module('zeppelinWebApp'))
-  let NavCtrl
-  let scope
+  beforeEach(angular.mock.module('zeppelinWebApp'));
+  let NavCtrl;
+  let scope;
   // Initialize the controller and a mock scope
-  beforeEach(inject(function ($controller, $rootScope) {
-    scope = $rootScope.$new()
+  beforeEach(inject(function($controller, $rootScope) {
+    scope = $rootScope.$new();
     NavCtrl = $controller('NavCtrl', {
-      $scope: scope
-    })
+      $scope: scope,
+    });
 
-    it('NavCtrl to toBeDefined', function () {
-      expect(NavCtrl).toBeDefined()
-      expect(NavCtrl.loadNotes).toBeDefined()
-    })
-  }))
-})
+    it('NavCtrl to toBeDefined', function() {
+      expect(NavCtrl).toBeDefined();
+      expect(NavCtrl.loadNotes).toBeDefined();
+    });
+  }));
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/ng-enter/ng-enter.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/ng-enter/ng-enter.directive.js b/zeppelin-web/src/components/ng-enter/ng-enter.directive.js
index 98bc067..a4d9219 100644
--- a/zeppelin-web/src/components/ng-enter/ng-enter.directive.js
+++ b/zeppelin-web/src/components/ng-enter/ng-enter.directive.js
@@ -12,19 +12,19 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').directive('ngEnter', NgEnterDirective)
+angular.module('zeppelinWebApp').directive('ngEnter', NgEnterDirective);
 
 function NgEnterDirective() {
-  return function (scope, element, attrs) {
-    element.bind('keydown keypress', function (event) {
+  return function(scope, element, attrs) {
+    element.bind('keydown keypress', function(event) {
       if (event.which === 13) {
         if (!event.shiftKey) {
-          scope.$apply(function () {
-            scope.$eval(attrs.ngEnter)
-          })
+          scope.$apply(function() {
+            scope.$eval(attrs.ngEnter);
+          });
         }
-        event.preventDefault()
+        event.preventDefault();
       }
-    })
-  }
+    });
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/ng-enter/ng-enter.directive.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/ng-enter/ng-enter.directive.test.js b/zeppelin-web/src/components/ng-enter/ng-enter.directive.test.js
index 49f97cc..6285b59 100644
--- a/zeppelin-web/src/components/ng-enter/ng-enter.directive.test.js
+++ b/zeppelin-web/src/components/ng-enter/ng-enter.directive.test.js
@@ -1,19 +1,19 @@
-describe('Directive: ngEnter', function () {
+describe('Directive: ngEnter', function() {
   // load the directive's module
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+  beforeEach(angular.mock.module('zeppelinWebApp'));
 
-  let element
-  let scope
+  let element;
+  let scope;
 
-  beforeEach(inject(function ($rootScope) {
-    scope = $rootScope.$new()
-  }))
+  beforeEach(inject(function($rootScope) {
+    scope = $rootScope.$new();
+  }));
 
-  it('should be define', inject(function ($compile) {
-    element = angular.element('<ng-enter></ng-enter>')
-    element = $compile(element)(scope)
-    expect(element.text()).toBeDefined()
-  }))
+  it('should be define', inject(function($compile) {
+    element = angular.element('<ng-enter></ng-enter>');
+    element = $compile(element)(scope);
+    expect(element.text()).toBeDefined();
+  }));
 
   // Test the rest of function in ngEnter
   /*  it('should make hidden element visible', inject(function ($compile) {
@@ -21,4 +21,4 @@ describe('Directive: ngEnter', function () {
       element = $compile(element)(scope);
       expect(element.text()).toBe('this is the ngEnter directive');
     })); */
-})
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/ng-escape/ng-escape.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/ng-escape/ng-escape.directive.js b/zeppelin-web/src/components/ng-escape/ng-escape.directive.js
index a3d35ea..bdb7636 100644
--- a/zeppelin-web/src/components/ng-escape/ng-escape.directive.js
+++ b/zeppelin-web/src/components/ng-escape/ng-escape.directive.js
@@ -12,17 +12,17 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').directive('ngEscape', NgEscapeDirective)
+angular.module('zeppelinWebApp').directive('ngEscape', NgEscapeDirective);
 
 function NgEscapeDirective() {
-  return function (scope, element, attrs) {
-    element.bind('keydown keyup', function (event) {
+  return function(scope, element, attrs) {
+    element.bind('keydown keyup', function(event) {
       if (event.which === 27) {
-        scope.$apply(function () {
-          scope.$eval(attrs.ngEscape)
-        })
-        event.preventDefault()
+        scope.$apply(function() {
+          scope.$eval(attrs.ngEscape);
+        });
+        event.preventDefault();
       }
-    })
-  }
+    });
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/note-action/note-action.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/note-action/note-action.service.js b/zeppelin-web/src/components/note-action/note-action.service.js
index 8e00c0f..d4bf6f0 100644
--- a/zeppelin-web/src/components/note-action/note-action.service.js
+++ b/zeppelin-web/src/components/note-action/note-action.service.js
@@ -12,172 +12,172 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').service('noteActionService', noteActionService)
+angular.module('zeppelinWebApp').service('noteActionService', noteActionService);
 
 function noteActionService(websocketMsgSrv, $location, noteRenameService, noteListFactory) {
-  'ngInject'
+  'ngInject';
 
-  this.moveNoteToTrash = function (noteId, redirectToHome) {
+  this.moveNoteToTrash = function(noteId, redirectToHome) {
     BootstrapDialog.confirm({
       closable: true,
       title: 'Move this note to trash?',
       message: 'This note will be moved to <strong>trash</strong>.',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.moveNoteToTrash(noteId)
+          websocketMsgSrv.moveNoteToTrash(noteId);
           if (redirectToHome) {
-            $location.path('/')
+            $location.path('/');
           }
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  this.moveFolderToTrash = function (folderId) {
+  this.moveFolderToTrash = function(folderId) {
     BootstrapDialog.confirm({
       closable: true,
       title: 'Move this folder to trash?',
       message: 'This folder will be moved to <strong>trash</strong>.',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.moveFolderToTrash(folderId)
+          websocketMsgSrv.moveFolderToTrash(folderId);
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  this.removeNote = function (noteId, redirectToHome) {
+  this.removeNote = function(noteId, redirectToHome) {
     BootstrapDialog.confirm({
       type: BootstrapDialog.TYPE_WARNING,
       closable: true,
       title: 'WARNING! This note will be removed permanently',
       message: 'This cannot be undone. Are you sure?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.deleteNote(noteId)
+          websocketMsgSrv.deleteNote(noteId);
           if (redirectToHome) {
-            $location.path('/')
+            $location.path('/');
           }
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  this.removeFolder = function (folderId) {
+  this.removeFolder = function(folderId) {
     BootstrapDialog.confirm({
       type: BootstrapDialog.TYPE_WARNING,
       closable: true,
       title: 'WARNING! This folder will be removed permanently',
       message: 'This cannot be undone. Are you sure?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.removeFolder(folderId)
+          websocketMsgSrv.removeFolder(folderId);
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  this.restoreAll = function () {
+  this.restoreAll = function() {
     BootstrapDialog.confirm({
       closable: true,
       title: 'Are you sure want to restore all notes in the trash?',
       message: 'Folders and notes in the trash will be ' +
       '<strong>merged</strong> into their original position.',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.restoreAll()
+          websocketMsgSrv.restoreAll();
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  this.emptyTrash = function () {
+  this.emptyTrash = function() {
     BootstrapDialog.confirm({
       type: BootstrapDialog.TYPE_WARNING,
       closable: true,
       title: 'WARNING! Notes under trash will be removed permanently',
       message: 'This cannot be undone. Are you sure?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.emptyTrash()
+          websocketMsgSrv.emptyTrash();
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  this.clearAllParagraphOutput = function (noteId) {
+  this.clearAllParagraphOutput = function(noteId) {
     BootstrapDialog.confirm({
       closable: true,
       title: '',
       message: 'Do you want to clear all output?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.clearAllParagraphOutput(noteId)
+          websocketMsgSrv.clearAllParagraphOutput(noteId);
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  this.renameNote = function (noteId, notePath) {
+  this.renameNote = function(noteId, notePath) {
     noteRenameService.openRenameModal({
       title: 'Rename note',
       oldName: notePath,
-      callback: function (newName) {
-        websocketMsgSrv.renameNote(noteId, newName)
-      }
-    })
-  }
+      callback: function(newName) {
+        websocketMsgSrv.renameNote(noteId, newName);
+      },
+    });
+  };
 
-  this.renameFolder = function (folderId) {
+  this.renameFolder = function(folderId) {
     noteRenameService.openRenameModal({
       title: 'Rename folder',
       oldName: folderId,
-      callback: function (newName) {
-        let newFolderId = normalizeFolderId(newName)
+      callback: function(newName) {
+        let newFolderId = normalizeFolderId(newName);
         if (_.has(noteListFactory.flatFolderMap, newFolderId)) {
           BootstrapDialog.confirm({
             type: BootstrapDialog.TYPE_WARNING,
             closable: true,
             title: 'WARNING! The folder will be MERGED',
             message: 'The folder will be merged into <strong>' + newFolderId + '</strong>. Are you sure?',
-            callback: function (result) {
+            callback: function(result) {
               if (result) {
-                websocketMsgSrv.renameFolder(folderId, newFolderId)
+                websocketMsgSrv.renameFolder(folderId, newFolderId);
               }
-            }
-          })
+            },
+          });
         } else {
-          websocketMsgSrv.renameFolder(folderId, newFolderId)
+          websocketMsgSrv.renameFolder(folderId, newFolderId);
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  function normalizeFolderId (folderId) {
-    folderId = folderId.trim()
+  function normalizeFolderId(folderId) {
+    folderId = folderId.trim();
 
     while (folderId.indexOf('\\') > -1) {
-      folderId = folderId.replace('\\', '/')
+      folderId = folderId.replace('\\', '/');
     }
 
     while (folderId.indexOf('///') > -1) {
-      folderId = folderId.replace('///', '/')
+      folderId = folderId.replace('///', '/');
     }
 
-    folderId = folderId.replace('//', '/')
+    folderId = folderId.replace('//', '/');
 
     if (folderId === '/') {
-      return '/'
+      return '/';
     }
 
     if (folderId[0] === '/') {
-      folderId = folderId.substring(1)
+      folderId = folderId.substring(1);
     }
 
     if (folderId.slice(-1) === '/') {
-      folderId = folderId.slice(0, -1)
+      folderId = folderId.slice(0, -1);
     }
 
-    return folderId
+    return folderId;
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/note-create/note-create.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/note-create/note-create.controller.js b/zeppelin-web/src/components/note-create/note-create.controller.js
index c999c20..a2eb5a6 100644
--- a/zeppelin-web/src/components/note-create/note-create.controller.js
+++ b/zeppelin-web/src/components/note-create/note-create.controller.js
@@ -12,95 +12,95 @@
  * limitations under the License.
  */
 
-import './note-create.css'
+import './note-create.css';
 
-angular.module('zeppelinWebApp').controller('NoteCreateCtrl', NoteCreateCtrl)
+angular.module('zeppelinWebApp').controller('NoteCreateCtrl', NoteCreateCtrl);
 
-function NoteCreateCtrl ($scope, noteListFactory, $routeParams, websocketMsgSrv) {
-  'ngInject'
+function NoteCreateCtrl($scope, noteListFactory, $routeParams, websocketMsgSrv) {
+  'ngInject';
 
-  let vm = this
-  vm.clone = false
-  vm.notes = noteListFactory
-  vm.websocketMsgSrv = websocketMsgSrv
-  $scope.note = {}
-  $scope.interpreterSettings = {}
-  $scope.note.defaultInterpreter = null
+  let vm = this;
+  vm.clone = false;
+  vm.notes = noteListFactory;
+  vm.websocketMsgSrv = websocketMsgSrv;
+  $scope.note = {};
+  $scope.interpreterSettings = {};
+  $scope.note.defaultInterpreter = null;
 
-  vm.createNote = function () {
+  vm.createNote = function() {
     if (!vm.clone) {
-      let defaultInterpreterId = ''
+      let defaultInterpreterId = '';
       if ($scope.note.defaultInterpreter !== null) {
-        defaultInterpreterId = $scope.note.defaultInterpreter.id
+        defaultInterpreterId = $scope.note.defaultInterpreter.id;
       }
-      vm.websocketMsgSrv.createNotebook($scope.note.notename, defaultInterpreterId)
-      $scope.note.defaultInterpreter = $scope.interpreterSettings[0]
+      vm.websocketMsgSrv.createNotebook($scope.note.notename, defaultInterpreterId);
+      $scope.note.defaultInterpreter = $scope.interpreterSettings[0];
     } else {
-      let noteId = $routeParams.noteId
-      vm.websocketMsgSrv.cloneNote(noteId, $scope.note.notename)
+      let noteId = $routeParams.noteId;
+      vm.websocketMsgSrv.cloneNote(noteId, $scope.note.notename);
     }
-  }
+  };
 
-  vm.handleNameEnter = function () {
-    angular.element('#noteCreateModal').modal('toggle')
-    vm.createNote()
-  }
+  vm.handleNameEnter = function() {
+    angular.element('#noteCreateModal').modal('toggle');
+    vm.createNote();
+  };
 
   vm.preVisible = function(clone, sourceNoteName, path) {
-    vm.clone = clone
-    vm.sourceNoteName = sourceNoteName
-    $scope.note.notename = vm.clone ? vm.cloneNoteName() : vm.newNoteName(path)
-    $scope.$apply()
-  }
+    vm.clone = clone;
+    vm.sourceNoteName = sourceNoteName;
+    $scope.note.notename = vm.clone ? vm.cloneNoteName() : vm.newNoteName(path);
+    $scope.$apply();
+  };
 
   vm.newNoteName = function(path) {
-    let newCount = 1
-    angular.forEach(vm.notes.flatList, function (noteName) {
-      noteName = noteName.name
+    let newCount = 1;
+    angular.forEach(vm.notes.flatList, function(noteName) {
+      noteName = noteName.name;
       if (noteName.match(/^Untitled Note [0-9]*$/)) {
-        let lastCount = noteName.substr(14) * 1
+        let lastCount = noteName.substr(14) * 1;
         if (newCount <= lastCount) {
-          newCount = lastCount + 1
+          newCount = lastCount + 1;
         }
       }
-    })
-    return (path ? path + '/' : '') + 'Untitled Note ' + newCount
-  }
+    });
+    return (path ? path + '/' : '') + 'Untitled Note ' + newCount;
+  };
 
-  vm.cloneNoteName = function () {
-    let copyCount = 1
-    let newCloneName = ''
-    let lastIndex = vm.sourceNoteName.lastIndexOf(' ')
-    let endsWithNumber = !!vm.sourceNoteName.match('^.+?\\s\\d$')
-    let noteNamePrefix = endsWithNumber ? vm.sourceNoteName.substr(0, lastIndex) : vm.sourceNoteName
-    let regexp = new RegExp('^' + noteNamePrefix + ' .+')
+  vm.cloneNoteName = function() {
+    let copyCount = 1;
+    let newCloneName = '';
+    let lastIndex = vm.sourceNoteName.lastIndexOf(' ');
+    let endsWithNumber = !!vm.sourceNoteName.match('^.+?\\s\\d$');
+    let noteNamePrefix = endsWithNumber ? vm.sourceNoteName.substr(0, lastIndex) : vm.sourceNoteName;
+    let regexp = new RegExp('^' + noteNamePrefix + ' .+');
 
-    angular.forEach(vm.notes.flatList, function (noteName) {
-      noteName = noteName.name
+    angular.forEach(vm.notes.flatList, function(noteName) {
+      noteName = noteName.name;
       if (noteName.match(regexp)) {
-        let lastCopyCount = noteName.substr(lastIndex).trim()
-        newCloneName = noteNamePrefix
-        lastCopyCount = parseInt(lastCopyCount)
+        let lastCopyCount = noteName.substr(lastIndex).trim();
+        newCloneName = noteNamePrefix;
+        lastCopyCount = parseInt(lastCopyCount);
         if (copyCount <= lastCopyCount) {
-          copyCount = lastCopyCount + 1
+          copyCount = lastCopyCount + 1;
         }
       }
-    })
+    });
 
     if (!newCloneName) {
-      newCloneName = vm.sourceNoteName
+      newCloneName = vm.sourceNoteName;
     }
-    return newCloneName + ' ' + copyCount
-  }
+    return newCloneName + ' ' + copyCount;
+  };
 
-  vm.getInterpreterSettings = function () {
-    vm.websocketMsgSrv.getInterpreterSettings()
-  }
+  vm.getInterpreterSettings = function() {
+    vm.websocketMsgSrv.getInterpreterSettings();
+  };
 
-  $scope.$on('interpreterSettings', function (event, data) {
-    $scope.interpreterSettings = data.interpreterSettings
+  $scope.$on('interpreterSettings', function(event, data) {
+    $scope.interpreterSettings = data.interpreterSettings;
 
     // initialize default interpreter with Spark interpreter
-    $scope.note.defaultInterpreter = data.interpreterSettings[0]
-  })
+    $scope.note.defaultInterpreter = data.interpreterSettings[0];
+  });
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/note-create/note-create.controller.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/note-create/note-create.controller.test.js b/zeppelin-web/src/components/note-create/note-create.controller.test.js
index d409a14..59f01d2 100644
--- a/zeppelin-web/src/components/note-create/note-create.controller.test.js
+++ b/zeppelin-web/src/components/note-create/note-create.controller.test.js
@@ -1,39 +1,39 @@
-describe('Controller: NoteCreateCtrl', function () {
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+describe('Controller: NoteCreateCtrl', function() {
+  beforeEach(angular.mock.module('zeppelinWebApp'));
 
-  let scope
-  let ctrl
-  let noteList
+  let scope;
+  let ctrl;
+  let noteList;
 
-  beforeEach(inject(function ($injector, $rootScope, $controller) {
-    noteList = $injector.get('noteListFactory')
-    scope = $rootScope.$new()
+  beforeEach(inject(function($injector, $rootScope, $controller) {
+    noteList = $injector.get('noteListFactory');
+    scope = $rootScope.$new();
     ctrl = $controller('NoteCreateCtrl', {
       $scope: scope,
-      noteListFactory: noteList
-    })
-  }))
+      noteListFactory: noteList,
+    });
+  }));
 
-  it('should create a new name from current name when cloneNoteName is called', function () {
+  it('should create a new name from current name when cloneNoteName is called', function() {
     let notesList = [
       {name: 'dsds 1', id: '1'},
       {name: 'dsds 2', id: '2'},
       {name: 'test name', id: '3'},
       {name: 'aa bb cc', id: '4'},
-      {name: 'Untitled Note 6', id: '4'}
-    ]
+      {name: 'Untitled Note 6', id: '4'},
+    ];
 
-    noteList.setNotes(notesList)
+    noteList.setNotes(notesList);
 
-    ctrl.sourceNoteName = 'test name'
-    expect(ctrl.cloneNoteName()).toEqual('test name 1')
-    ctrl.sourceNoteName = 'aa bb cc'
-    expect(ctrl.cloneNoteName()).toEqual('aa bb cc 1')
-    ctrl.sourceNoteName = 'Untitled Note 6'
-    expect(ctrl.cloneNoteName()).toEqual('Untitled Note 7')
-    ctrl.sourceNoteName = 'My_note'
-    expect(ctrl.cloneNoteName()).toEqual('My_note 1')
-    ctrl.sourceNoteName = 'dsds 2'
-    expect(ctrl.cloneNoteName()).toEqual('dsds 3')
-  })
-})
+    ctrl.sourceNoteName = 'test name';
+    expect(ctrl.cloneNoteName()).toEqual('test name 1');
+    ctrl.sourceNoteName = 'aa bb cc';
+    expect(ctrl.cloneNoteName()).toEqual('aa bb cc 1');
+    ctrl.sourceNoteName = 'Untitled Note 6';
+    expect(ctrl.cloneNoteName()).toEqual('Untitled Note 7');
+    ctrl.sourceNoteName = 'My_note';
+    expect(ctrl.cloneNoteName()).toEqual('My_note 1');
+    ctrl.sourceNoteName = 'dsds 2';
+    expect(ctrl.cloneNoteName()).toEqual('dsds 3');
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/note-create/visible.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/note-create/visible.directive.js b/zeppelin-web/src/components/note-create/visible.directive.js
index 48c170f..7ba8db7 100644
--- a/zeppelin-web/src/components/note-create/visible.directive.js
+++ b/zeppelin-web/src/components/note-create/visible.directive.js
@@ -12,34 +12,34 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').directive('modalvisible', modalvisible)
+angular.module('zeppelinWebApp').directive('modalvisible', modalvisible);
 
-function modalvisible () {
+function modalvisible() {
   return {
     restrict: 'A',
     scope: {
       preVisibleCallback: '&previsiblecallback',
       postVisibleCallback: '&postvisiblecallback',
-      targetinput: '@targetinput'
+      targetinput: '@targetinput',
     },
-    link: function (scope, element, attrs) {
+    link: function(scope, element, attrs) {
       // Add some listeners
-      let previsibleMethod = scope.preVisibleCallback
-      let postVisibleMethod = scope.postVisibleCallback
-      element.on('show.bs.modal', function (e) {
-        let relatedTarget = angular.element(e.relatedTarget)
-        let clone = relatedTarget.data('clone')
-        let sourceNoteName = relatedTarget.data('source-note-name')
-        let path = relatedTarget.data('path')
-        let cloneNote = clone ? true : false
-        previsibleMethod()(cloneNote, sourceNoteName, path)
-      })
-      element.on('shown.bs.modal', function (e) {
+      let previsibleMethod = scope.preVisibleCallback;
+      let postVisibleMethod = scope.postVisibleCallback;
+      element.on('show.bs.modal', function(e) {
+        let relatedTarget = angular.element(e.relatedTarget);
+        let clone = relatedTarget.data('clone');
+        let sourceNoteName = relatedTarget.data('source-note-name');
+        let path = relatedTarget.data('path');
+        let cloneNote = clone ? true : false;
+        previsibleMethod()(cloneNote, sourceNoteName, path);
+      });
+      element.on('shown.bs.modal', function(e) {
         if (scope.targetinput) {
-          angular.element(e.target).find('input#' + scope.targetinput).select()
+          angular.element(e.target).find('input#' + scope.targetinput).select();
         }
-        postVisibleMethod()
-      })
-    }
-  }
+        postVisibleMethod();
+      });
+    },
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/note-import/note-import.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/note-import/note-import.controller.js b/zeppelin-web/src/components/note-import/note-import.controller.js
index 8cec890..fbfc5fa 100644
--- a/zeppelin-web/src/components/note-import/note-import.controller.js
+++ b/zeppelin-web/src/components/note-import/note-import.controller.js
@@ -12,76 +12,76 @@
  * limitations under the License.
  */
 
-import './note-import.css'
-
-angular.module('zeppelinWebApp').controller('NoteImportCtrl', NoteImportCtrl)
-
-function NoteImportCtrl ($scope, $timeout, websocketMsgSrv) {
-  'ngInject'
-
-  let vm = this
-  $scope.note = {}
-  $scope.note.step1 = true
-  $scope.note.step2 = false
-  $scope.maxLimit = ''
-  let limit = 0
-
-  websocketMsgSrv.listConfigurations()
-  $scope.$on('configurationsInfo', function (scope, event) {
-    limit = event.configurations['zeppelin.websocket.max.text.message.size']
-    $scope.maxLimit = Math.round(limit / 1048576)
-  })
-
-  vm.resetFlags = function () {
-    $scope.note = {}
-    $scope.note.step1 = true
-    $scope.note.step2 = false
-    angular.element('#noteImportFile').val('')
-  }
-
-  $scope.uploadFile = function () {
-    angular.element('#noteImportFile').click()
-  }
-
-  $scope.importFile = function (element) {
-    $scope.note.errorText = ''
-    $scope.note.importFile = element.files[0]
-    let file = $scope.note.importFile
-    let reader = new FileReader()
+import './note-import.css';
+
+angular.module('zeppelinWebApp').controller('NoteImportCtrl', NoteImportCtrl);
+
+function NoteImportCtrl($scope, $timeout, websocketMsgSrv) {
+  'ngInject';
+
+  let vm = this;
+  $scope.note = {};
+  $scope.note.step1 = true;
+  $scope.note.step2 = false;
+  $scope.maxLimit = '';
+  let limit = 0;
+
+  websocketMsgSrv.listConfigurations();
+  $scope.$on('configurationsInfo', function(scope, event) {
+    limit = event.configurations['zeppelin.websocket.max.text.message.size'];
+    $scope.maxLimit = Math.round(limit / 1048576);
+  });
+
+  vm.resetFlags = function() {
+    $scope.note = {};
+    $scope.note.step1 = true;
+    $scope.note.step2 = false;
+    angular.element('#noteImportFile').val('');
+  };
+
+  $scope.uploadFile = function() {
+    angular.element('#noteImportFile').click();
+  };
+
+  $scope.importFile = function(element) {
+    $scope.note.errorText = '';
+    $scope.note.importFile = element.files[0];
+    let file = $scope.note.importFile;
+    let reader = new FileReader();
 
     if (file.size > limit) {
-      $scope.note.errorText = 'File size limit Exceeded!'
-      $scope.$apply()
-      return
+      $scope.note.errorText = 'File size limit Exceeded!';
+      $scope.$apply();
+      return;
     }
 
-    reader.onloadend = function () {
-      vm.processImportJson(reader.result)
-    }
+    reader.onloadend = function() {
+      vm.processImportJson(reader.result);
+    };
 
     if (file) {
-      reader.readAsText(file)
+      reader.readAsText(file);
     }
-  }
-
-  $scope.uploadURL = function () {
-    $scope.note.errorText = ''
-    $scope.note.step1 = false
-    $timeout(function () {
-      $scope.note.step2 = true
-    }, 400)
-  }
-
-  vm.importBack = function () {
-    $scope.note.errorText = ''
-    $timeout(function () {
-      $scope.note.step1 = true
-    }, 400)
-    $scope.note.step2 = false
-  }
-
-  vm.importNote = function () {
-    $scope.note.errorText = ''
+  };
+
+  $scope.uploadURL = function() {
+    $scope.note.errorText = '';
+    $scope.note.step1 = false;
+    $timeout(function() {
+      $scope.note.step2 = true;
+    }, 400);
+  };
+
+  vm.importBack = function() {
+    $scope.note.errorText = '';
+    $timeout(function() {
+      $scope.note.step1 = true;
+    }, 400);
+    $scope.note.step2 = false;
+  };
+
+  vm.importNote = function() {
+    $scope.note.errorText = '';
     if ($scope.note.importUrl) {
       jQuery.ajax({
         url: $scope.note.importUrl,
@@ -89,50 +89,50 @@ function NoteImportCtrl ($scope, $timeout, websocketMsgSrv) {
         dataType: 'json',
         jsonp: false,
         xhrFields: {
-          withCredentials: false
+          withCredentials: false,
         },
-        error: function (xhr, ajaxOptions, thrownError) {
-          $scope.note.errorText = 'Unable to Fetch URL'
-          $scope.$apply()
-        }}).done(function (data) {
-          vm.processImportJson(data)
-        })
+        error: function(xhr, ajaxOptions, thrownError) {
+          $scope.note.errorText = 'Unable to Fetch URL';
+          $scope.$apply();
+        }}).done(function(data) {
+          vm.processImportJson(data);
+        });
     } else {
-      $scope.note.errorText = 'Enter URL'
-      $scope.$apply()
+      $scope.note.errorText = 'Enter URL';
+      $scope.$apply();
     }
-  }
+  };
 
-  vm.processImportJson = function (result) {
+  vm.processImportJson = function(result) {
     if (typeof result !== 'object') {
       try {
-        result = JSON.parse(result)
+        result = JSON.parse(result);
       } catch (e) {
-        $scope.note.errorText = 'JSON parse exception'
-        $scope.$apply()
-        return
+        $scope.note.errorText = 'JSON parse exception';
+        $scope.$apply();
+        return;
       }
     }
     if (result.paragraphs && result.paragraphs.length > 0) {
       if (!$scope.note.noteImportName) {
-        $scope.note.noteImportName = result.name
+        $scope.note.noteImportName = result.name;
       } else {
-        result.name = $scope.note.noteImportName
+        result.name = $scope.note.noteImportName;
       }
-      websocketMsgSrv.importNote(result)
+      websocketMsgSrv.importNote(result);
       // angular.element('#noteImportModal').modal('hide');
     } else {
-      $scope.note.errorText = 'Invalid JSON'
+      $scope.note.errorText = 'Invalid JSON';
     }
-    $scope.$apply()
-  }
+    $scope.$apply();
+  };
 
   /*
    ** $scope.$on functions below
    */
 
-  $scope.$on('setNoteMenu', function (event, notes) {
-    vm.resetFlags()
-    angular.element('#noteImportModal').modal('hide')
-  })
+  $scope.$on('setNoteMenu', function(event, notes) {
+    vm.resetFlags();
+    angular.element('#noteImportModal').modal('hide');
+  });
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/note-list/note-list.factory.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/note-list/note-list.factory.js b/zeppelin-web/src/components/note-list/note-list.factory.js
index 5e2c513..59662fa 100644
--- a/zeppelin-web/src/components/note-list/note-list.factory.js
+++ b/zeppelin-web/src/components/note-list/note-list.factory.js
@@ -12,71 +12,73 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').factory('noteListFactory', NoteListFactory)
+angular.module('zeppelinWebApp').factory('noteListFactory', NoteListFactory);
 
 function NoteListFactory(arrayOrderingSrv, TRASH_FOLDER_ID) {
-  'ngInject'
+  'ngInject';
 
   const notes = {
     root: {children: []},
     flatList: [],
     flatFolderMap: {},
 
-    setNotes: function (notesList) {
+    setNotes: function(notesList) {
       // a flat list to boost searching
       notes.flatList = _.map(notesList, (note) => {
         note.isTrash = note.name
-          ? note.name.split('/')[0] === TRASH_FOLDER_ID : false
-        return note
-      })
+          ? note.name.split('/')[0] === TRASH_FOLDER_ID : false;
+        return note;
+      });
 
       // construct the folder-based tree
-      notes.root = {children: []}
-      notes.flatFolderMap = {}
-      _.reduce(notesList, function (root, note) {
-        let noteName = note.name || note.id
-        let nodes = noteName.match(/([^\/][^\/]*)/g)
+      notes.root = {children: []};
+      notes.flatFolderMap = {};
+      _.reduce(notesList, function(root, note) {
+        let noteName = note.name || note.id;
+        let nodes = noteName.match(/([^\/][^\/]*)/g);
 
         // recursively add nodes
-        addNode(root, nodes, note.id)
+        addNode(root, nodes, note.id);
 
-        return root
-      }, notes.root)
-      notes.root.children.sort(arrayOrderingSrv.noteComparator)
-    }
-  }
+        return root;
+      }, notes.root);
+      notes.root.children.sort(arrayOrderingSrv.noteComparator);
+    },
+  };
 
-  const addNode = function (curDir, nodes, noteId) {
+  const addNode = function(curDir, nodes, noteId) {
     if (nodes.length === 1) {  // the leaf
       curDir.children.push({
         name: nodes[0],
         id: noteId,
         path: curDir.id ? curDir.id + '/' + nodes[0] : nodes[0],
-        isTrash: curDir.id ? curDir.id.split('/')[0] === TRASH_FOLDER_ID : false
-      })
+        isTrash: curDir.id ? curDir.id.split('/')[0] === TRASH_FOLDER_ID : false,
+      });
     } else {  // a folder node
-      let node = nodes.shift()
+      let node = nodes.shift();
       let dir = _.find(curDir.children,
-        function (c) { return c.name === node && c.children !== undefined })
+        function(c) {
+          return c.name === node && c.children !== undefined;
+        });
       if (dir !== undefined) { // found an existing dir
-        addNode(dir, nodes, noteId)
+        addNode(dir, nodes, noteId);
       } else {
         let newDir = {
           id: curDir.id ? curDir.id + '/' + node : node,
           name: node,
           hidden: true,
           children: [],
-          isTrash: curDir.id ? curDir.id.split('/')[0] === TRASH_FOLDER_ID : false
-        }
+          isTrash: curDir.id ? curDir.id.split('/')[0] === TRASH_FOLDER_ID : false,
+        };
 
         // add the folder to flat folder map
-        notes.flatFolderMap[newDir.id] = newDir
+        notes.flatFolderMap[newDir.id] = newDir;
 
-        curDir.children.push(newDir)
-        addNode(newDir, nodes, noteId)
+        curDir.children.push(newDir);
+        addNode(newDir, nodes, noteId);
       }
     }
-  }
+  };
 
-  return notes
+  return notes;
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/note-list/note-list.factory.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/note-list/note-list.factory.test.js b/zeppelin-web/src/components/note-list/note-list.factory.test.js
index c16504c..2a962d8 100644
--- a/zeppelin-web/src/components/note-list/note-list.factory.test.js
+++ b/zeppelin-web/src/components/note-list/note-list.factory.test.js
@@ -1,15 +1,15 @@
-describe('Factory: NoteList', function () {
-  let noteList
+describe('Factory: NoteList', function() {
+  let noteList;
 
-  beforeEach(function () {
-    angular.mock.module('zeppelinWebApp')
+  beforeEach(function() {
+    angular.mock.module('zeppelinWebApp');
 
-    inject(function ($injector) {
-      noteList = $injector.get('noteListFactory')
-    })
-  })
+    inject(function($injector) {
+      noteList = $injector.get('noteListFactory');
+    });
+  });
 
-  it('should generate both flat list and folder-based list properly', function () {
+  it('should generate both flat list and folder-based list properly', function() {
     let notesList = [
       {name: 'A', id: '000001'},
       {name: 'B', id: '000002'},
@@ -19,57 +19,57 @@ describe('Factory: NoteList', function () {
       {name: '/C/CB/CBA', id: '000006'},  // same name with a dir
       {name: '/C/CB/CBA', id: '000007'},  // same name with another note
       {name: 'C///CB//CBB', id: '000008'},
-      {name: 'D/D[A/DA]B', id: '000009'}   // check if '[' and ']' considered as folder seperator
-    ]
-    noteList.setNotes(notesList)
+      {name: 'D/D[A/DA]B', id: '000009'},   // check if '[' and ']' considered as folder seperator
+    ];
+    noteList.setNotes(notesList);
 
-    let flatList = noteList.flatList
-    expect(flatList.length).toBe(9)
-    expect(flatList[0].name).toBe('A')
-    expect(flatList[0].id).toBe('000001')
-    expect(flatList[1].name).toBe('B')
-    expect(flatList[2].name).toBeUndefined()
-    expect(flatList[3].name).toBe('/C/CA')
-    expect(flatList[4].name).toBe('/C/CB')
-    expect(flatList[5].name).toBe('/C/CB/CBA')
-    expect(flatList[6].name).toBe('/C/CB/CBA')
-    expect(flatList[7].name).toBe('C///CB//CBB')
-    expect(flatList[8].name).toBe('D/D[A/DA]B')
+    let flatList = noteList.flatList;
+    expect(flatList.length).toBe(9);
+    expect(flatList[0].name).toBe('A');
+    expect(flatList[0].id).toBe('000001');
+    expect(flatList[1].name).toBe('B');
+    expect(flatList[2].name).toBeUndefined();
+    expect(flatList[3].name).toBe('/C/CA');
+    expect(flatList[4].name).toBe('/C/CB');
+    expect(flatList[5].name).toBe('/C/CB/CBA');
+    expect(flatList[6].name).toBe('/C/CB/CBA');
+    expect(flatList[7].name).toBe('C///CB//CBB');
+    expect(flatList[8].name).toBe('D/D[A/DA]B');
 
-    let folderList = noteList.root.children
-    expect(folderList.length).toBe(5)
-    expect(folderList[3].name).toBe('A')
-    expect(folderList[3].id).toBe('000001')
-    expect(folderList[4].name).toBe('B')
-    expect(folderList[2].name).toBe('000003')
-    expect(folderList[0].name).toBe('C')
-    expect(folderList[0].id).toBe('C')
-    expect(folderList[0].children.length).toBe(3)
-    expect(folderList[0].children[0].name).toBe('CA')
-    expect(folderList[0].children[0].id).toBe('000004')
-    expect(folderList[0].children[0].children).toBeUndefined()
-    expect(folderList[0].children[1].name).toBe('CB')
-    expect(folderList[0].children[1].id).toBe('000005')
-    expect(folderList[0].children[1].children).toBeUndefined()
-    expect(folderList[0].children[2].name).toBe('CB')
-    expect(folderList[0].children[2].id).toBe('C/CB')
-    expect(folderList[0].children[2].children.length).toBe(3)
-    expect(folderList[0].children[2].children[0].name).toBe('CBA')
-    expect(folderList[0].children[2].children[0].id).toBe('000006')
-    expect(folderList[0].children[2].children[0].children).toBeUndefined()
-    expect(folderList[0].children[2].children[1].name).toBe('CBA')
-    expect(folderList[0].children[2].children[1].id).toBe('000007')
-    expect(folderList[0].children[2].children[1].children).toBeUndefined()
-    expect(folderList[0].children[2].children[2].name).toBe('CBB')
-    expect(folderList[0].children[2].children[2].id).toBe('000008')
-    expect(folderList[0].children[2].children[2].children).toBeUndefined()
-    expect(folderList[1].name).toBe('D')
-    expect(folderList[1].id).toBe('D')
-    expect(folderList[1].children.length).toBe(1)
-    expect(folderList[1].children[0].name).toBe('D[A')
-    expect(folderList[1].children[0].id).toBe('D/D[A')
-    expect(folderList[1].children[0].children[0].name).toBe('DA]B')
-    expect(folderList[1].children[0].children[0].id).toBe('000009')
-    expect(folderList[1].children[0].children[0].children).toBeUndefined()
-  })
-})
+    let folderList = noteList.root.children;
+    expect(folderList.length).toBe(5);
+    expect(folderList[3].name).toBe('A');
+    expect(folderList[3].id).toBe('000001');
+    expect(folderList[4].name).toBe('B');
+    expect(folderList[2].name).toBe('000003');
+    expect(folderList[0].name).toBe('C');
+    expect(folderList[0].id).toBe('C');
+    expect(folderList[0].children.length).toBe(3);
+    expect(folderList[0].children[0].name).toBe('CA');
+    expect(folderList[0].children[0].id).toBe('000004');
+    expect(folderList[0].children[0].children).toBeUndefined();
+    expect(folderList[0].children[1].name).toBe('CB');
+    expect(folderList[0].children[1].id).toBe('000005');
+    expect(folderList[0].children[1].children).toBeUndefined();
+    expect(folderList[0].children[2].name).toBe('CB');
+    expect(folderList[0].children[2].id).toBe('C/CB');
+    expect(folderList[0].children[2].children.length).toBe(3);
+    expect(folderList[0].children[2].children[0].name).toBe('CBA');
+    expect(folderList[0].children[2].children[0].id).toBe('000006');
+    expect(folderList[0].children[2].children[0].children).toBeUndefined();
+    expect(folderList[0].children[2].children[1].name).toBe('CBA');
+    expect(folderList[0].children[2].children[1].id).toBe('000007');
+    expect(folderList[0].children[2].children[1].children).toBeUndefined();
+    expect(folderList[0].children[2].children[2].name).toBe('CBB');
+    expect(folderList[0].children[2].children[2].id).toBe('000008');
+    expect(folderList[0].children[2].children[2].children).toBeUndefined();
+    expect(folderList[1].name).toBe('D');
+    expect(folderList[1].id).toBe('D');
+    expect(folderList[1].children.length).toBe(1);
+    expect(folderList[1].children[0].name).toBe('D[A');
+    expect(folderList[1].children[0].id).toBe('D/D[A');
+    expect(folderList[1].children[0].children[0].name).toBe('DA]B');
+    expect(folderList[1].children[0].children[0].id).toBe('000009');
+    expect(folderList[1].children[0].children[0].children).toBeUndefined();
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/note-rename/note-rename.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/note-rename/note-rename.controller.js b/zeppelin-web/src/components/note-rename/note-rename.controller.js
index b950d2b..0fa31c4 100644
--- a/zeppelin-web/src/components/note-rename/note-rename.controller.js
+++ b/zeppelin-web/src/components/note-rename/note-rename.controller.js
@@ -12,37 +12,37 @@
  * limitations under the License.
  */
 
-import './note-rename.css'
+import './note-rename.css';
 
-angular.module('zeppelinWebApp').controller('NoteRenameCtrl', NoteRenameController)
+angular.module('zeppelinWebApp').controller('NoteRenameCtrl', NoteRenameController);
 
 function NoteRenameController($scope) {
-  'ngInject'
+  'ngInject';
 
-  let self = this
+  let self = this;
 
-  $scope.params = {newName: ''}
-  $scope.isValid = true
+  $scope.params = {newName: ''};
+  $scope.isValid = true;
 
-  $scope.rename = function () {
-    angular.element('#noteRenameModal').modal('hide')
-    self.callback($scope.params.newName)
-  }
+  $scope.rename = function() {
+    angular.element('#noteRenameModal').modal('hide');
+    self.callback($scope.params.newName);
+  };
 
-  $scope.$on('openRenameModal', function (event, options) {
-    self.validator = options.validator || defaultValidator
-    self.callback = options.callback || function () {}
+  $scope.$on('openRenameModal', function(event, options) {
+    self.validator = options.validator || defaultValidator;
+    self.callback = options.callback || function() {};
 
-    $scope.title = options.title || 'Rename'
-    $scope.params.newName = options.oldName || ''
-    $scope.validate = function () {
-      $scope.isValid = self.validator($scope.params.newName)
-    }
+    $scope.title = options.title || 'Rename';
+    $scope.params.newName = options.oldName || '';
+    $scope.validate = function() {
+      $scope.isValid = self.validator($scope.params.newName);
+    };
 
-    angular.element('#noteRenameModal').modal('show')
-  })
+    angular.element('#noteRenameModal').modal('show');
+  });
 
-  function defaultValidator (str) {
-    return !!str.trim()
+  function defaultValidator(str) {
+    return !!str.trim();
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/note-rename/note-rename.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/note-rename/note-rename.service.js b/zeppelin-web/src/components/note-rename/note-rename.service.js
index 64df82f..fd0f3e5 100644
--- a/zeppelin-web/src/components/note-rename/note-rename.service.js
+++ b/zeppelin-web/src/components/note-rename/note-rename.service.js
@@ -12,12 +12,12 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').service('noteRenameService', NoteRenameService)
+angular.module('zeppelinWebApp').service('noteRenameService', NoteRenameService);
 
 function NoteRenameService($rootScope) {
-  'ngInject'
+  'ngInject';
 
-  let self = this
+  let self = this;
 
   /**
    * <options schema>
@@ -26,7 +26,7 @@ function NoteRenameService($rootScope) {
    * callback: (newName: string)=>void - callback onButtonClick
    * validator: (str: string)=>boolean - input validator
    */
-  self.openRenameModal = function (options) {
-    $rootScope.$broadcast('openRenameModal', options)
-  }
+  self.openRenameModal = function(options) {
+    $rootScope.$broadcast('openRenameModal', options);
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/websocket/websocket-event.factory.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/websocket/websocket-event.factory.js b/zeppelin-web/src/components/websocket/websocket-event.factory.js
index 70d61ec..18c704d 100644
--- a/zeppelin-web/src/components/websocket/websocket-event.factory.js
+++ b/zeppelin-web/src/components/websocket/websocket-event.factory.js
@@ -12,92 +12,92 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').factory('websocketEvents', WebsocketEventFactory)
+angular.module('zeppelinWebApp').factory('websocketEvents', WebsocketEventFactory);
 
-function WebsocketEventFactory ($rootScope, $websocket, $location, baseUrlSrv) {
-  'ngInject'
+function WebsocketEventFactory($rootScope, $websocket, $location, baseUrlSrv) {
+  'ngInject';
 
-  let websocketCalls = {}
-  let pingIntervalId
+  let websocketCalls = {};
+  let pingIntervalId;
 
-  websocketCalls.ws = $websocket(baseUrlSrv.getWebsocketUrl())
-  websocketCalls.ws.reconnectIfNotNormalClose = true
+  websocketCalls.ws = $websocket(baseUrlSrv.getWebsocketUrl());
+  websocketCalls.ws.reconnectIfNotNormalClose = true;
 
-  websocketCalls.ws.onOpen(function () {
-    console.log('Websocket created')
-    $rootScope.$broadcast('setConnectedStatus', true)
-    pingIntervalId = setInterval(function () {
-      websocketCalls.sendNewEvent({op: 'PING'})
-    }, 10000)
-  })
+  websocketCalls.ws.onOpen(function() {
+    console.log('Websocket created');
+    $rootScope.$broadcast('setConnectedStatus', true);
+    pingIntervalId = setInterval(function() {
+      websocketCalls.sendNewEvent({op: 'PING'});
+    }, 10000);
+  });
 
-  websocketCalls.sendNewEvent = function (data) {
+  websocketCalls.sendNewEvent = function(data) {
     if ($rootScope.ticket !== undefined) {
-      data.principal = $rootScope.ticket.principal
-      data.ticket = $rootScope.ticket.ticket
-      data.roles = $rootScope.ticket.roles
+      data.principal = $rootScope.ticket.principal;
+      data.ticket = $rootScope.ticket.ticket;
+      data.roles = $rootScope.ticket.roles;
     } else {
-      data.principal = ''
-      data.ticket = ''
-      data.roles = ''
+      data.principal = '';
+      data.ticket = '';
+      data.roles = '';
     }
-    console.log('Send >> %o, %o, %o, %o, %o', data.op, data.principal, data.ticket, data.roles, data)
-    return websocketCalls.ws.send(JSON.stringify(data))
-  }
+    console.log('Send >> %o, %o, %o, %o, %o', data.op, data.principal, data.ticket, data.roles, data);
+    return websocketCalls.ws.send(JSON.stringify(data));
+  };
 
-  websocketCalls.isConnected = function () {
-    return (websocketCalls.ws.socket.readyState === 1)
-  }
+  websocketCalls.isConnected = function() {
+    return (websocketCalls.ws.socket.readyState === 1);
+  };
 
-  websocketCalls.ws.onMessage(function (event) {
-    let payload
+  websocketCalls.ws.onMessage(function(event) {
+    let payload;
     if (event.data) {
-      payload = angular.fromJson(event.data)
+      payload = angular.fromJson(event.data);
     }
 
-    console.log('Receive << %o, %o', payload.op, payload)
+    console.log('Receive << %o, %o', payload.op, payload);
 
-    let op = payload.op
-    let data = payload.data
+    let op = payload.op;
+    let data = payload.data;
     if (op === 'NOTE') {
-      $rootScope.$broadcast('setNoteContent', data.note)
+      $rootScope.$broadcast('setNoteContent', data.note);
     } else if (op === 'NEW_NOTE') {
-      $location.path('/notebook/' + data.note.id)
+      $location.path('/notebook/' + data.note.id);
     } else if (op === 'NOTES_INFO') {
-      $rootScope.$broadcast('setNoteMenu', data.notes)
+      $rootScope.$broadcast('setNoteMenu', data.notes);
     } else if (op === 'LIST_NOTE_JOBS') {
-      $rootScope.$emit('jobmanager:set-jobs', data.noteJobs)
+      $rootScope.$emit('jobmanager:set-jobs', data.noteJobs);
     } else if (op === 'LIST_UPDATE_NOTE_JOBS') {
-      $rootScope.$emit('jobmanager:update-jobs', data.noteRunningJobs)
+      $rootScope.$emit('jobmanager:update-jobs', data.noteRunningJobs);
     } else if (op === 'AUTH_INFO') {
-      let btn = []
+      let btn = [];
       if ($rootScope.ticket.roles === '[]') {
         btn = [{
           label: 'Close',
-          action: function (dialog) {
-            dialog.close()
-          }
-        }]
+          action: function(dialog) {
+            dialog.close();
+          },
+        }];
       } else {
         btn = [{
           label: 'Login',
-          action: function (dialog) {
-            dialog.close()
+          action: function(dialog) {
+            dialog.close();
             angular.element('#loginModal').modal({
-              show: 'true'
-            })
-          }
+              show: 'true',
+            });
+          },
         }, {
           label: 'Cancel',
-          action: function (dialog) {
-            dialog.close()
+          action: function(dialog) {
+            dialog.close();
             // using $rootScope.apply to trigger angular digest cycle
             // changing $location.path inside bootstrap modal wont trigger digest
-            $rootScope.$apply(function () {
-              $location.path('/')
-            })
-          }
-        }]
+            $rootScope.$apply(function() {
+              $location.path('/');
+            });
+          },
+        }];
       }
 
       BootstrapDialog.show({
@@ -106,44 +106,44 @@ function WebsocketEventFactory ($rootScope, $websocket, $location, baseUrlSrv) {
         closeByKeyboard: false,
         title: 'Insufficient privileges',
         message: data.info.toString(),
-        buttons: btn
-      })
+        buttons: btn,
+      });
     } else if (op === 'PARAGRAPH') {
-      $rootScope.$broadcast('updateParagraph', data)
+      $rootScope.$broadcast('updateParagraph', data);
     } else if (op === 'RUN_PARAGRAPH_USING_SPELL') {
-      $rootScope.$broadcast('runParagraphUsingSpell', data)
+      $rootScope.$broadcast('runParagraphUsingSpell', data);
     } else if (op === 'PARAGRAPH_APPEND_OUTPUT') {
-      $rootScope.$broadcast('appendParagraphOutput', data)
+      $rootScope.$broadcast('appendParagraphOutput', data);
     } else if (op === 'PARAGRAPH_UPDATE_OUTPUT') {
-      $rootScope.$broadcast('updateParagraphOutput', data)
+      $rootScope.$broadcast('updateParagraphOutput', data);
     } else if (op === 'PROGRESS') {
-      $rootScope.$broadcast('updateProgress', data)
+      $rootScope.$broadcast('updateProgress', data);
     } else if (op === 'COMPLETION_LIST') {
-      $rootScope.$broadcast('completionList', data)
+      $rootScope.$broadcast('completionList', data);
     } else if (op === 'EDITOR_SETTING') {
-      $rootScope.$broadcast('editorSetting', data)
+      $rootScope.$broadcast('editorSetting', data);
     } else if (op === 'ANGULAR_OBJECT_UPDATE') {
-      $rootScope.$broadcast('angularObjectUpdate', data)
+      $rootScope.$broadcast('angularObjectUpdate', data);
     } else if (op === 'ANGULAR_OBJECT_REMOVE') {
-      $rootScope.$broadcast('angularObjectRemove', data)
+      $rootScope.$broadcast('angularObjectRemove', data);
     } else if (op === 'APP_APPEND_OUTPUT') {
-      $rootScope.$broadcast('appendAppOutput', data)
+      $rootScope.$broadcast('appendAppOutput', data);
     } else if (op === 'APP_UPDATE_OUTPUT') {
-      $rootScope.$broadcast('updateAppOutput', data)
+      $rootScope.$broadcast('updateAppOutput', data);
     } else if (op === 'APP_LOAD') {
-      $rootScope.$broadcast('appLoad', data)
+      $rootScope.$broadcast('appLoad', data);
     } else if (op === 'APP_STATUS_CHANGE') {
-      $rootScope.$broadcast('appStatusChange', data)
+      $rootScope.$broadcast('appStatusChange', data);
     } else if (op === 'LIST_REVISION_HISTORY') {
-      $rootScope.$broadcast('listRevisionHistory', data)
+      $rootScope.$broadcast('listRevisionHistory', data);
     } else if (op === 'NOTE_REVISION') {
-      $rootScope.$broadcast('noteRevision', data)
+      $rootScope.$broadcast('noteRevision', data);
     } else if (op === 'NOTE_REVISION_FOR_COMPARE') {
-      $rootScope.$broadcast('noteRevisionForCompare', data)
+      $rootScope.$broadcast('noteRevisionForCompare', data);
     } else if (op === 'INTERPRETER_BINDINGS') {
-      $rootScope.$broadcast('interpreterBindings', data)
+      $rootScope.$broadcast('interpreterBindings', data);
     } else if (op === 'SAVE_NOTE_FORMS') {
-      $rootScope.$broadcast('saveNoteForms', data)
+      $rootScope.$broadcast('saveNoteForms', data);
     } else if (op === 'ERROR_INFO') {
       BootstrapDialog.show({
         closable: false,
@@ -154,47 +154,47 @@ function WebsocketEventFactory ($rootScope, $websocket, $location, baseUrlSrv) {
         buttons: [{
           // close all the dialogs when there are error on running all paragraphs
           label: 'Close',
-          action: function () {
-            BootstrapDialog.closeAll()
-          }
-        }]
-      })
+          action: function() {
+            BootstrapDialog.closeAll();
+          },
+        }],
+      });
     } else if (op === 'SESSION_LOGOUT') {
-      $rootScope.$broadcast('session_logout', data)
+      $rootScope.$broadcast('session_logout', data);
     } else if (op === 'CONFIGURATIONS_INFO') {
-      $rootScope.$broadcast('configurationsInfo', data)
+      $rootScope.$broadcast('configurationsInfo', data);
     } else if (op === 'INTERPRETER_SETTINGS') {
-      $rootScope.$broadcast('interpreterSettings', data)
+      $rootScope.$broadcast('interpreterSettings', data);
     } else if (op === 'PARAGRAPH_ADDED') {
-      $rootScope.$broadcast('addParagraph', data.paragraph, data.index)
+      $rootScope.$broadcast('addParagraph', data.paragraph, data.index);
     } else if (op === 'PARAGRAPH_REMOVED') {
-      $rootScope.$broadcast('removeParagraph', data.id)
+      $rootScope.$broadcast('removeParagraph', data.id);
     } else if (op === 'PARAGRAPH_MOVED') {
-      $rootScope.$broadcast('moveParagraph', data.id, data.index)
+      $rootScope.$broadcast('moveParagraph', data.id, data.index);
     } else if (op === 'NOTE_UPDATED') {
-      $rootScope.$broadcast('updateNote', data.name, data.config, data.info)
+      $rootScope.$broadcast('updateNote', data.name, data.config, data.info);
     } else if (op === 'SET_NOTE_REVISION') {
-      $rootScope.$broadcast('setNoteRevisionResult', data)
+      $rootScope.$broadcast('setNoteRevisionResult', data);
     } else if (op === 'PARAS_INFO') {
-      $rootScope.$broadcast('updateParaInfos', data)
+      $rootScope.$broadcast('updateParaInfos', data);
     } else {
-      console.error(`unknown websocket op: ${op}`)
+      console.error(`unknown websocket op: ${op}`);
     }
-  })
+  });
 
-  websocketCalls.ws.onError(function (event) {
-    console.log('error message: ', event)
-    $rootScope.$broadcast('setConnectedStatus', false)
-  })
+  websocketCalls.ws.onError(function(event) {
+    console.log('error message: ', event);
+    $rootScope.$broadcast('setConnectedStatus', false);
+  });
 
-  websocketCalls.ws.onClose(function (event) {
-    console.log('close message: ', event)
+  websocketCalls.ws.onClose(function(event) {
+    console.log('close message: ', event);
     if (pingIntervalId !== undefined) {
-      clearInterval(pingIntervalId)
-      pingIntervalId = undefined
+      clearInterval(pingIntervalId);
+      pingIntervalId = undefined;
     }
-    $rootScope.$broadcast('setConnectedStatus', false)
-  })
+    $rootScope.$broadcast('setConnectedStatus', false);
+  });
 
-  return websocketCalls
+  return websocketCalls;
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/websocket/websocket-message.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/websocket/websocket-message.service.js b/zeppelin-web/src/components/websocket/websocket-message.service.js
index cd65e1d..f0cf92b 100644
--- a/zeppelin-web/src/components/websocket/websocket-message.service.js
+++ b/zeppelin-web/src/components/websocket/websocket-message.service.js
@@ -12,100 +12,100 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').service('websocketMsgSrv', WebsocketMessageService)
+angular.module('zeppelinWebApp').service('websocketMsgSrv', WebsocketMessageService);
 
-function WebsocketMessageService ($rootScope, websocketEvents) {
-  'ngInject'
+function WebsocketMessageService($rootScope, websocketEvents) {
+  'ngInject';
 
   return {
 
-    getHomeNote: function () {
-      websocketEvents.sendNewEvent({op: 'GET_HOME_NOTE'})
+    getHomeNote: function() {
+      websocketEvents.sendNewEvent({op: 'GET_HOME_NOTE'});
     },
 
-    createNotebook: function (noteName, defaultInterpreterId) {
+    createNotebook: function(noteName, defaultInterpreterId) {
       websocketEvents.sendNewEvent({
         op: 'NEW_NOTE',
         data: {
           name: noteName,
-          defaultInterpreterId: defaultInterpreterId
-        }
-      })
+          defaultInterpreterId: defaultInterpreterId,
+        },
+      });
     },
 
-    moveNoteToTrash: function (noteId) {
-      websocketEvents.sendNewEvent({op: 'MOVE_NOTE_TO_TRASH', data: {id: noteId}})
+    moveNoteToTrash: function(noteId) {
+      websocketEvents.sendNewEvent({op: 'MOVE_NOTE_TO_TRASH', data: {id: noteId}});
     },
 
-    moveFolderToTrash: function (folderId) {
-      websocketEvents.sendNewEvent({op: 'MOVE_FOLDER_TO_TRASH', data: {id: folderId}})
+    moveFolderToTrash: function(folderId) {
+      websocketEvents.sendNewEvent({op: 'MOVE_FOLDER_TO_TRASH', data: {id: folderId}});
     },
 
-    restoreNote: function (noteId) {
-      websocketEvents.sendNewEvent({op: 'RESTORE_NOTE', data: {id: noteId}})
+    restoreNote: function(noteId) {
+      websocketEvents.sendNewEvent({op: 'RESTORE_NOTE', data: {id: noteId}});
     },
 
-    restoreFolder: function (folderId) {
-      websocketEvents.sendNewEvent({op: 'RESTORE_FOLDER', data: {id: folderId}})
+    restoreFolder: function(folderId) {
+      websocketEvents.sendNewEvent({op: 'RESTORE_FOLDER', data: {id: folderId}});
     },
 
-    restoreAll: function () {
-      websocketEvents.sendNewEvent({op: 'RESTORE_ALL'})
+    restoreAll: function() {
+      websocketEvents.sendNewEvent({op: 'RESTORE_ALL'});
     },
 
-    deleteNote: function (noteId) {
-      websocketEvents.sendNewEvent({op: 'DEL_NOTE', data: {id: noteId}})
+    deleteNote: function(noteId) {
+      websocketEvents.sendNewEvent({op: 'DEL_NOTE', data: {id: noteId}});
     },
 
-    removeFolder: function (folderId) {
-      websocketEvents.sendNewEvent({op: 'REMOVE_FOLDER', data: {id: folderId}})
+    removeFolder: function(folderId) {
+      websocketEvents.sendNewEvent({op: 'REMOVE_FOLDER', data: {id: folderId}});
     },
 
-    emptyTrash: function () {
-      websocketEvents.sendNewEvent({op: 'EMPTY_TRASH'})
+    emptyTrash: function() {
+      websocketEvents.sendNewEvent({op: 'EMPTY_TRASH'});
     },
 
-    cloneNote: function (noteIdToClone, newNoteName) {
-      websocketEvents.sendNewEvent({op: 'CLONE_NOTE', data: {id: noteIdToClone, name: newNoteName}})
+    cloneNote: function(noteIdToClone, newNoteName) {
+      websocketEvents.sendNewEvent({op: 'CLONE_NOTE', data: {id: noteIdToClone, name: newNoteName}});
     },
 
-    getNoteList: function () {
-      websocketEvents.sendNewEvent({op: 'LIST_NOTES'})
+    getNoteList: function() {
+      websocketEvents.sendNewEvent({op: 'LIST_NOTES'});
     },
 
-    reloadAllNotesFromRepo: function () {
-      websocketEvents.sendNewEvent({op: 'RELOAD_NOTES_FROM_REPO'})
+    reloadAllNotesFromRepo: function() {
+      websocketEvents.sendNewEvent({op: 'RELOAD_NOTES_FROM_REPO'});
     },
 
-    getNote: function (noteId) {
-      websocketEvents.sendNewEvent({op: 'GET_NOTE', data: {id: noteId}})
+    getNote: function(noteId) {
+      websocketEvents.sendNewEvent({op: 'GET_NOTE', data: {id: noteId}});
     },
 
-    updateNote: function (noteId, noteName, noteConfig) {
-      websocketEvents.sendNewEvent({op: 'NOTE_UPDATE', data: {id: noteId, name: noteName, config: noteConfig}})
+    updateNote: function(noteId, noteName, noteConfig) {
+      websocketEvents.sendNewEvent({op: 'NOTE_UPDATE', data: {id: noteId, name: noteName, config: noteConfig}});
     },
 
-    updatePersonalizedMode: function (noteId, modeValue) {
-      websocketEvents.sendNewEvent({op: 'UPDATE_PERSONALIZED_MODE', data: {id: noteId, personalized: modeValue}})
+    updatePersonalizedMode: function(noteId, modeValue) {
+      websocketEvents.sendNewEvent({op: 'UPDATE_PERSONALIZED_MODE', data: {id: noteId, personalized: modeValue}});
     },
 
-    renameNote: function (noteId, noteName) {
-      websocketEvents.sendNewEvent({op: 'NOTE_RENAME', data: {id: noteId, name: noteName}})
+    renameNote: function(noteId, noteName) {
+      websocketEvents.sendNewEvent({op: 'NOTE_RENAME', data: {id: noteId, name: noteName}});
     },
 
-    renameFolder: function (folderId, folderName) {
-      websocketEvents.sendNewEvent({op: 'FOLDER_RENAME', data: {id: folderId, name: folderName}})
+    renameFolder: function(folderId, folderName) {
+      websocketEvents.sendNewEvent({op: 'FOLDER_RENAME', data: {id: folderId, name: folderName}});
     },
 
-    moveParagraph: function (paragraphId, newIndex) {
-      websocketEvents.sendNewEvent({op: 'MOVE_PARAGRAPH', data: {id: paragraphId, index: newIndex}})
+    moveParagraph: function(paragraphId, newIndex) {
+      websocketEvents.sendNewEvent({op: 'MOVE_PARAGRAPH', data: {id: paragraphId, index: newIndex}});
     },
 
-    insertParagraph: function (newIndex) {
-      websocketEvents.sendNewEvent({op: 'INSERT_PARAGRAPH', data: {index: newIndex}})
+    insertParagraph: function(newIndex) {
+      websocketEvents.sendNewEvent({op: 'INSERT_PARAGRAPH', data: {index: newIndex}});
     },
 
-    copyParagraph: function (newIndex, paragraphTitle, paragraphData,
+    copyParagraph: function(newIndex, paragraphTitle, paragraphData,
                             paragraphConfig, paragraphParams) {
       websocketEvents.sendNewEvent({
         op: 'COPY_PARAGRAPH',
@@ -114,12 +114,12 @@ function WebsocketMessageService ($rootScope, websocketEvents) {
           title: paragraphTitle,
           paragraph: paragraphData,
           config: paragraphConfig,
-          params: paragraphParams
-        }
-      })
+          params: paragraphParams,
+        },
+      });
     },
 
-    updateAngularObject: function (noteId, paragraphId, name, value, interpreterGroupId) {
+    updateAngularObject: function(noteId, paragraphId, name, value, interpreterGroupId) {
       websocketEvents.sendNewEvent({
         op: 'ANGULAR_OBJECT_UPDATED',
         data: {
@@ -127,39 +127,39 @@ function WebsocketMessageService ($rootScope, websocketEvents) {
           paragraphId: paragraphId,
           name: name,
           value: value,
-          interpreterGroupId: interpreterGroupId
-        }
-      })
+          interpreterGroupId: interpreterGroupId,
+        },
+      });
     },
 
-    clientBindAngularObject: function (noteId, name, value, paragraphId) {
+    clientBindAngularObject: function(noteId, name, value, paragraphId) {
       websocketEvents.sendNewEvent({
         op: 'ANGULAR_OBJECT_CLIENT_BIND',
         data: {
           noteId: noteId,
           name: name,
           value: value,
-          paragraphId: paragraphId
-        }
-      })
+          paragraphId: paragraphId,
+        },
+      });
     },
 
-    clientUnbindAngularObject: function (noteId, name, paragraphId) {
+    clientUnbindAngularObject: function(noteId, name, paragraphId) {
       websocketEvents.sendNewEvent({
         op: 'ANGULAR_OBJECT_CLIENT_UNBIND',
         data: {
           noteId: noteId,
           name: name,
-          paragraphId: paragraphId
-        }
-      })
+          paragraphId: paragraphId,
+        },
+      });
     },
 
-    cancelParagraphRun: function (paragraphId) {
-      websocketEvents.sendNewEvent({op: 'CANCEL_PARAGRAPH', data: {id: paragraphId}})
+    cancelParagraphRun: function(paragraphId) {
+      websocketEvents.sendNewEvent({op: 'CANCEL_PARAGRAPH', data: {id: paragraphId}});
     },
 
-    paragraphExecutedBySpell: function (paragraphId, paragraphTitle,
+    paragraphExecutedBySpell: function(paragraphId, paragraphTitle,
                                         paragraphText, paragraphResultsMsg,
                                         paragraphStatus, paragraphErrorMessage,
                                         paragraphConfig, paragraphParams,
@@ -172,10 +172,10 @@ function WebsocketMessageService ($rootScope, websocketEvents) {
           paragraph: paragraphText,
           results: {
             code: paragraphStatus,
-            msg: paragraphResultsMsg.map(dataWithType => {
-              let serializedData = dataWithType.data
-              return { type: dataWithType.type, data: serializedData, }
-            })
+            msg: paragraphResultsMsg.map((dataWithType) => {
+              let serializedData = dataWithType.data;
+              return {type: dataWithType.type, data: serializedData};
+            }),
           },
           status: paragraphStatus,
           errorMessage: paragraphErrorMessage,
@@ -183,11 +183,11 @@ function WebsocketMessageService ($rootScope, websocketEvents) {
           params: paragraphParams,
           dateStarted: paragraphDateStarted,
           dateFinished: paragraphDateFinished,
-        }
-      })
+        },
+      });
     },
 
-    runParagraph: function (paragraphId, paragraphTitle, paragraphData, paragraphConfig, paragraphParams) {
+    runParagraph: function(paragraphId, paragraphTitle, paragraphData, paragraphConfig, paragraphParams) {
       websocketEvents.sendNewEvent({
         op: 'RUN_PARAGRAPH',
         data: {
@@ -195,45 +195,45 @@ function WebsocketMessageService ($rootScope, websocketEvents) {
           title: paragraphTitle,
           paragraph: paragraphData,
           config: paragraphConfig,
-          params: paragraphParams
-        }
-      })
+          params: paragraphParams,
+        },
+      });
     },
 
-    runAllParagraphs: function (noteId, paragraphs) {
+    runAllParagraphs: function(noteId, paragraphs) {
       websocketEvents.sendNewEvent({
         op: 'RUN_ALL_PARAGRAPHS',
         data: {
           noteId: noteId,
-          paragraphs: JSON.stringify(paragraphs)
-        }
-      })
+          paragraphs: JSON.stringify(paragraphs),
+        },
+      });
     },
 
-    removeParagraph: function (paragraphId) {
-      websocketEvents.sendNewEvent({op: 'PARAGRAPH_REMOVE', data: {id: paragraphId}})
+    removeParagraph: function(paragraphId) {
+      websocketEvents.sendNewEvent({op: 'PARAGRAPH_REMOVE', data: {id: paragraphId}});
     },
 
-    clearParagraphOutput: function (paragraphId) {
-      websocketEvents.sendNewEvent({op: 'PARAGRAPH_CLEAR_OUTPUT', data: {id: paragraphId}})
+    clearParagraphOutput: function(paragraphId) {
+      websocketEvents.sendNewEvent({op: 'PARAGRAPH_CLEAR_OUTPUT', data: {id: paragraphId}});
     },
 
-    clearAllParagraphOutput: function (noteId) {
-      websocketEvents.sendNewEvent({op: 'PARAGRAPH_CLEAR_ALL_OUTPUT', data: {id: noteId}})
+    clearAllParagraphOutput: function(noteId) {
+      websocketEvents.sendNewEvent({op: 'PARAGRAPH_CLEAR_ALL_OUTPUT', data: {id: noteId}});
     },
 
-    completion: function (paragraphId, buf, cursor) {
+    completion: function(paragraphId, buf, cursor) {
       websocketEvents.sendNewEvent({
         op: 'COMPLETION',
         data: {
           id: paragraphId,
           buf: buf,
-          cursor: cursor
-        }
-      })
+          cursor: cursor,
+        },
+      });
     },
 
-    commitParagraph: function (paragraphId, paragraphTitle, paragraphData, paragraphConfig, paragraphParams, noteId) {
+    commitParagraph: function(paragraphId, paragraphTitle, paragraphData, paragraphConfig, paragraphParams, noteId) {
       return websocketEvents.sendNewEvent({
         op: 'COMMIT_PARAGRAPH',
         data: {
@@ -242,132 +242,132 @@ function WebsocketMessageService ($rootScope, websocketEvents) {
           title: paragraphTitle,
           paragraph: paragraphData,
           config: paragraphConfig,
-          params: paragraphParams
-        }
-      })
+          params: paragraphParams,
+        },
+      });
     },
 
-    importNote: function (note) {
+    importNote: function(note) {
       websocketEvents.sendNewEvent({
         op: 'IMPORT_NOTE',
         data: {
-          note: note
-        }
-      })
+          note: note,
+        },
+      });
     },
 
-    checkpointNote: function (noteId, commitMessage) {
+    checkpointNote: function(noteId, commitMessage) {
       websocketEvents.sendNewEvent({
         op: 'CHECKPOINT_NOTE',
         data: {
           noteId: noteId,
-          commitMessage: commitMessage
-        }
-      })
+          commitMessage: commitMessage,
+        },
+      });
     },
 
-    setNoteRevision: function (noteId, revisionId) {
+    setNoteRevision: function(noteId, revisionId) {
       websocketEvents.sendNewEvent({
         op: 'SET_NOTE_REVISION',
         data: {
           noteId: noteId,
-          revisionId: revisionId
-        }
-      })
+          revisionId: revisionId,
+        },
+      });
     },
 
-    listRevisionHistory: function (noteId) {
+    listRevisionHistory: function(noteId) {
       websocketEvents.sendNewEvent({
         op: 'LIST_REVISION_HISTORY',
         data: {
-          noteId: noteId
-        }
-      })
+          noteId: noteId,
+        },
+      });
     },
 
-    getNoteByRevision: function (noteId, revisionId) {
+    getNoteByRevision: function(noteId, revisionId) {
       websocketEvents.sendNewEvent({
         op: 'NOTE_REVISION',
         data: {
           noteId: noteId,
-          revisionId: revisionId
-        }
-      })
+          revisionId: revisionId,
+        },
+      });
     },
 
-    getNoteByRevisionForCompare: function (noteId, revisionId, position) {
+    getNoteByRevisionForCompare: function(noteId, revisionId, position) {
       websocketEvents.sendNewEvent({
         op: 'NOTE_REVISION_FOR_COMPARE',
         data: {
           noteId: noteId,
           revisionId: revisionId,
-          position: position
-        }
-      })
+          position: position,
+        },
+      });
     },
 
-    getEditorSetting: function (paragraphId, replName) {
+    getEditorSetting: function(paragraphId, replName) {
       websocketEvents.sendNewEvent({
         op: 'EDITOR_SETTING',
         data: {
           paragraphId: paragraphId,
-          magic: replName
-        }
-      })
+          magic: replName,
+        },
+      });
     },
 
-    isConnected: function () {
-      return websocketEvents.isConnected()
+    isConnected: function() {
+      return websocketEvents.isConnected();
     },
 
-    getJobs: function () {
-      websocketEvents.sendNewEvent({op: 'LIST_NOTE_JOBS'})
+    getJobs: function() {
+      websocketEvents.sendNewEvent({op: 'LIST_NOTE_JOBS'});
     },
 
-    disconnectJobEvent: function () {
-      websocketEvents.sendNewEvent({op: 'UNSUBSCRIBE_UPDATE_NOTE_JOBS'})
+    disconnectJobEvent: function() {
+      websocketEvents.sendNewEvent({op: 'UNSUBSCRIBE_UPDATE_NOTE_JOBS'});
     },
 
-    getUpdateNoteJobsList: function (lastUpdateServerUnixTime) {
+    getUpdateNoteJobsList: function(lastUpdateServerUnixTime) {
       websocketEvents.sendNewEvent(
         {op: 'LIST_UPDATE_NOTE_JOBS', data: {lastUpdateUnixTime: lastUpdateServerUnixTime * 1}}
-      )
+      );
     },
 
-    getInterpreterBindings: function (noteId) {
-      websocketEvents.sendNewEvent({op: 'GET_INTERPRETER_BINDINGS', data: {noteId: noteId}})
+    getInterpreterBindings: function(noteId) {
+      websocketEvents.sendNewEvent({op: 'GET_INTERPRETER_BINDINGS', data: {noteId: noteId}});
     },
 
-    saveInterpreterBindings: function (noteId, selectedSettingIds) {
+    saveInterpreterBindings: function(noteId, selectedSettingIds) {
       websocketEvents.sendNewEvent({op: 'SAVE_INTERPRETER_BINDINGS',
-        data: {noteId: noteId, selectedSettingIds: selectedSettingIds}})
+        data: {noteId: noteId, selectedSettingIds: selectedSettingIds}});
     },
 
-    listConfigurations: function () {
-      websocketEvents.sendNewEvent({op: 'LIST_CONFIGURATIONS'})
+    listConfigurations: function() {
+      websocketEvents.sendNewEvent({op: 'LIST_CONFIGURATIONS'});
     },
 
-    getInterpreterSettings: function () {
-      websocketEvents.sendNewEvent({op: 'GET_INTERPRETER_SETTINGS'})
+    getInterpreterSettings: function() {
+      websocketEvents.sendNewEvent({op: 'GET_INTERPRETER_SETTINGS'});
     },
 
-    saveNoteForms: function (note) {
+    saveNoteForms: function(note) {
       websocketEvents.sendNewEvent({op: 'SAVE_NOTE_FORMS',
         data: {
           noteId: note.id,
-          noteParams: note.noteParams
-        }
-      })
+          noteParams: note.noteParams,
+        },
+      });
     },
 
-    removeNoteForms: function (note, formName) {
+    removeNoteForms: function(note, formName) {
       websocketEvents.sendNewEvent({op: 'REMOVE_NOTE_FORMS',
         data: {
           noteId: note.id,
-          formName: formName
-        }
-      })
-    }
+          formName: formName,
+        },
+      });
+    },
 
-  }
+  };
 }


[07/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js
index 94230de..38d5480 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js
@@ -1,53 +1,53 @@
-describe('Controller: ParagraphCtrl', function () {
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+describe('Controller: ParagraphCtrl', function() {
+  beforeEach(angular.mock.module('zeppelinWebApp'));
 
-  let scope
-  let websocketMsgSrvMock = {}
+  let scope;
+  let websocketMsgSrvMock = {};
   let paragraphMock = {
     config: {},
     settings: {
-      forms: {}
-    }
-  }
+      forms: {},
+    },
+  };
   let route = {
     current: {
       pathParams: {
-        noteId: 'noteId'
-      }
-    }
-  }
+        noteId: 'noteId',
+      },
+    },
+  };
 
-  beforeEach(inject(function ($controller, $rootScope) {
-    scope = $rootScope.$new()
-    $rootScope.notebookScope = $rootScope.$new(true, $rootScope)
+  beforeEach(inject(function($controller, $rootScope) {
+    scope = $rootScope.$new();
+    $rootScope.notebookScope = $rootScope.$new(true, $rootScope);
 
     $controller('ParagraphCtrl', {
       $scope: scope,
       websocketMsgSrv: websocketMsgSrvMock,
       $element: {},
-      $route: route
-    })
+      $route: route,
+    });
 
-    scope.init(paragraphMock)
-  }))
+    scope.init(paragraphMock);
+  }));
 
   let functions = ['isRunning', 'getIframeDimensions', 'cancelParagraph', 'runParagraph', 'saveParagraph',
     'moveUp', 'moveDown', 'insertNew', 'removeParagraph', 'toggleEditor', 'closeEditor', 'openEditor',
     'closeTable', 'openTable', 'showTitle', 'hideTitle', 'setTitle', 'showLineNumbers', 'hideLineNumbers',
     'changeColWidth', 'columnWidthClass', 'toggleOutput',
-    'aceChanged', 'aceLoaded', 'getEditorValue', 'getProgress', 'getExecutionTime', 'isResultOutdated']
-
-  functions.forEach(function (fn) {
-    it('check for scope functions to be defined : ' + fn, function () {
-      expect(scope[fn]).toBeDefined()
-    })
-  })
-
-  it('should have this array of values for "colWidthOption"', function () {
-    expect(scope.colWidthOption).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
-  })
-
-  it('should set default value of "paragraphFocused" as false', function () {
-    expect(scope.paragraphFocused).toEqual(false)
-  })
-})
+    'aceChanged', 'aceLoaded', 'getEditorValue', 'getProgress', 'getExecutionTime', 'isResultOutdated'];
+
+  functions.forEach(function(fn) {
+    it('check for scope functions to be defined : ' + fn, function() {
+      expect(scope[fn]).toBeDefined();
+    });
+  });
+
+  it('should have this array of values for "colWidthOption"', function() {
+    expect(scope.colWidthOption).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
+  });
+
+  it('should set default value of "paragraphFocused" as false', function() {
+    expect(scope.paragraphFocused).toEqual(false);
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js
index f839eee..bd70de3 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js
@@ -19,12 +19,16 @@ export const ParagraphStatus = {
   FINISHED: 'FINISHED',
   ABORT: 'ABORT',
   ERROR: 'ERROR',
-}
+};
 
-export function isParagraphRunning (paragraph) {
-  if (!paragraph) { return false }
-  const status = paragraph.status
-  if (!status) { return false }
+export function isParagraphRunning(paragraph) {
+  if (!paragraph) {
+    return false;
+  }
+  const status = paragraph.status;
+  if (!status) {
+    return false;
+  }
 
-  return status === ParagraphStatus.PENDING || status === ParagraphStatus.RUNNING
+  return status === ParagraphStatus.PENDING || status === ParagraphStatus.RUNNING;
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js b/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js
index 2893cd5..874f9d8 100644
--- a/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js
+++ b/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js
@@ -12,58 +12,58 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').directive('resizable', ResizableDirective)
+angular.module('zeppelinWebApp').directive('resizable', ResizableDirective);
 
-function ResizableDirective () {
+function ResizableDirective() {
   let resizableConfig = {
     autoHide: true,
     handles: 'se',
     helper: 'resizable-helper',
-    stop: function () {
-      angular.element(this).css({'width': '100%', 'height': '100%'})
-    }
-  }
+    stop: function() {
+      angular.element(this).css({'width': '100%', 'height': '100%'});
+    },
+  };
 
   return {
     restrict: 'A',
     scope: {
-      callback: '&onResize'
+      callback: '&onResize',
     },
-    link: function postLink (scope, elem, attrs) {
-      attrs.$observe('resize', function (resize) {
-        let resetResize = function (elem, resize) {
-          let colStep = window.innerWidth / 12
-          elem.off('resizestop')
-          let conf = angular.copy(resizableConfig)
+    link: function postLink(scope, elem, attrs) {
+      attrs.$observe('resize', function(resize) {
+        let resetResize = function(elem, resize) {
+          let colStep = window.innerWidth / 12;
+          elem.off('resizestop');
+          let conf = angular.copy(resizableConfig);
           if (resize.graphType === 'TABLE' || resize.graphType === 'NETWORK' || resize.graphType === 'TEXT') {
-            conf.grid = [colStep, 10]
-            conf.minHeight = 100
+            conf.grid = [colStep, 10];
+            conf.minHeight = 100;
           } else {
-            conf.grid = [colStep, 10000]
-            conf.minHeight = 0
+            conf.grid = [colStep, 10000];
+            conf.minHeight = 0;
           }
-          conf.maxWidth = window.innerWidth
+          conf.maxWidth = window.innerWidth;
 
-          elem.resizable(conf)
-          elem.on('resizestop', function () {
+          elem.resizable(conf);
+          elem.on('resizestop', function() {
             if (scope.callback) {
-              let height = elem.height()
+              let height = elem.height();
               if (height < 50) {
-                height = 300
+                height = 300;
               }
-              scope.callback({width: Math.ceil(elem.width() / colStep), height: height})
+              scope.callback({width: Math.ceil(elem.width() / colStep), height: height});
             }
-          })
-        }
+          });
+        };
 
-        resize = JSON.parse(resize)
+        resize = JSON.parse(resize);
         if (resize.allowresize === 'true') {
-          resetResize(elem, resize)
-          angular.element(window).resize(function () {
-            resetResize(elem, resize)
-          })
+          resetResize(elem, resize);
+          angular.element(window).resize(function() {
+            resetResize(elem, resize);
+          });
         }
-      })
-    }
-  }
+      });
+    },
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js b/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js
index 5dfe314..5bf77dc 100644
--- a/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js
@@ -12,30 +12,30 @@
  * limitations under the License.
  */
 
-import moment from 'moment'
-
-import DatasetFactory from '../../../tabledata/datasetfactory'
-import TableVisualization from '../../../visualization/builtins/visualization-table'
-import BarchartVisualization from '../../../visualization/builtins/visualization-barchart'
-import PiechartVisualization from '../../../visualization/builtins/visualization-piechart'
-import AreachartVisualization from '../../../visualization/builtins/visualization-areachart'
-import LinechartVisualization from '../../../visualization/builtins/visualization-linechart'
-import ScatterchartVisualization from '../../../visualization/builtins/visualization-scatterchart'
-import NetworkVisualization from '../../../visualization/builtins/visualization-d3network'
-import {DefaultDisplayType, SpellResult} from '../../../spell'
-import {ParagraphStatus} from '../paragraph.status'
-
-const AnsiUp = require('ansi_up')
-const AnsiUpConverter = new AnsiUp.default // eslint-disable-line new-parens,new-cap
-const TableGridFilterTemplate = require('../../../visualization/builtins/visualization-table-grid-filter.html')
-
-angular.module('zeppelinWebApp').controller('ResultCtrl', ResultCtrl)
-
-function ResultCtrl ($scope, $rootScope, $route, $window, $routeParams, $location,
+import moment from 'moment';
+
+import DatasetFactory from '../../../tabledata/datasetfactory';
+import TableVisualization from '../../../visualization/builtins/visualization-table';
+import BarchartVisualization from '../../../visualization/builtins/visualization-barchart';
+import PiechartVisualization from '../../../visualization/builtins/visualization-piechart';
+import AreachartVisualization from '../../../visualization/builtins/visualization-areachart';
+import LinechartVisualization from '../../../visualization/builtins/visualization-linechart';
+import ScatterchartVisualization from '../../../visualization/builtins/visualization-scatterchart';
+import NetworkVisualization from '../../../visualization/builtins/visualization-d3network';
+import {DefaultDisplayType, SpellResult} from '../../../spell';
+import {ParagraphStatus} from '../paragraph.status';
+
+const AnsiUp = require('ansi_up');
+const AnsiUpConverter = new AnsiUp.default; // eslint-disable-line new-parens,new-cap
+const TableGridFilterTemplate = require('../../../visualization/builtins/visualization-table-grid-filter.html');
+
+angular.module('zeppelinWebApp').controller('ResultCtrl', ResultCtrl);
+
+function ResultCtrl($scope, $rootScope, $route, $window, $routeParams, $location,
                     $timeout, $compile, $http, $q, $templateCache, $templateRequest, $sce, websocketMsgSrv,
                     baseUrlSrv, ngToast, saveAsService, noteVarShareService, heliumService,
                     uiGridConstants) {
-  'ngInject'
+  'ngInject';
 
   /**
    * Built-in visualizations
@@ -45,49 +45,49 @@ function ResultCtrl ($scope, $rootScope, $route, $window, $routeParams, $locatio
       id: 'table',   // paragraph.config.graph.mode
       name: 'Table', // human readable name. tooltip
       icon: '<i class="fa fa-table"></i>',
-      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK]
+      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK],
     },
     {
       id: 'multiBarChart',
       name: 'Bar Chart',
       icon: '<i class="fa fa-bar-chart"></i>',
       transformation: 'pivot',
-      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK]
+      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK],
     },
     {
       id: 'pieChart',
       name: 'Pie Chart',
       icon: '<i class="fa fa-pie-chart"></i>',
       transformation: 'pivot',
-      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK]
+      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK],
     },
     {
       id: 'stackedAreaChart',
       name: 'Area Chart',
       icon: '<i class="fa fa-area-chart"></i>',
       transformation: 'pivot',
-      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK]
+      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK],
     },
     {
       id: 'lineChart',
       name: 'Line Chart',
       icon: '<i class="fa fa-line-chart"></i>',
       transformation: 'pivot',
-      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK]
+      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK],
     },
     {
       id: 'scatterChart',
       name: 'Scatter Chart',
       icon: '<i class="cf cf-scatter-chart"></i>',
-      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK]
+      supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK],
     },
     {
       id: 'network',
       name: 'Network',
       icon: '<i class="fa fa-share-alt"></i>',
-      supports: [DefaultDisplayType.NETWORK]
-    }
-  ]
+      supports: [DefaultDisplayType.NETWORK],
+    },
+  ];
 
   /**
    * Holds class and actual runtime instance and related infos of built-in visualizations
@@ -95,137 +95,143 @@ function ResultCtrl ($scope, $rootScope, $route, $window, $routeParams, $locatio
   let builtInVisualizations = {
     'table': {
       class: TableVisualization,
-      instance: undefined   // created from setGraphMode()
+      instance: undefined,   // created from setGraphMode()
     },
     'multiBarChart': {
       class: BarchartVisualization,
-      instance: undefined
+      instance: undefined,
     },
     'pieChart': {
       class: PiechartVisualization,
-      instance: undefined
+      instance: undefined,
     },
     'stackedAreaChart': {
       class: AreachartVisualization,
-      instance: undefined
+      instance: undefined,
     },
     'lineChart': {
       class: LinechartVisualization,
-      instance: undefined
+      instance: undefined,
     },
     'scatterChart': {
       class: ScatterchartVisualization,
-      instance: undefined
+      instance: undefined,
     },
     'network': {
       class: NetworkVisualization,
-      instance: undefined
-    }
-  }
+      instance: undefined,
+    },
+  };
 
   // type
-  $scope.type = null
+  $scope.type = null;
 
   // Data of the result
-  let data
+  let data;
 
   // config
-  $scope.config = null
+  $scope.config = null;
 
   // resultId = paragraph.id + index
-  $scope.id = null
+  $scope.id = null;
 
   // referece to paragraph
-  let paragraph
+  let paragraph;
 
   // index of the result
-  let resultIndex
+  let resultIndex;
 
   // TableData instance
-  let tableData
+  let tableData;
 
   // available columns in tabledata
-  $scope.tableDataColumns = []
+  $scope.tableDataColumns = [];
 
   // enable helium
-  let enableHelium = false
+  let enableHelium = false;
 
   // graphMode
-  $scope.graphMode = null
+  $scope.graphMode = null;
 
   // image data
-  $scope.imageData = null
+  $scope.imageData = null;
 
   // queue for append output
-  const textResultQueueForAppend = []
+  const textResultQueueForAppend = [];
 
   // prevent body area scrollbar from blocking due to scroll in paragraph results
-  $scope.mouseOver = false
-  $scope.onMouseOver = function() { $scope.mouseOver = true }
-  $scope.onMouseOut = function() { $scope.mouseOver = false }
+  $scope.mouseOver = false;
+  $scope.onMouseOver = function() {
+    $scope.mouseOver = true;
+  };
+  $scope.onMouseOut = function() {
+    $scope.mouseOver = false;
+  };
   $scope.getPointerEvent = function() {
-    return ($scope.mouseOver) ? {'pointer-events': 'auto' }
-      : {'pointer-events': 'none' }
-  }
+    return ($scope.mouseOver) ? {'pointer-events': 'auto'}
+      : {'pointer-events': 'none'};
+  };
 
-  $scope.init = function (result, config, paragraph, index) {
+  $scope.init = function(result, config, paragraph, index) {
     // register helium plugin vis packages
-    let visPackages = heliumService.getVisualizationCachedPackages()
-    const visPackageOrder = heliumService.getVisualizationCachedPackageOrder()
+    let visPackages = heliumService.getVisualizationCachedPackages();
+    const visPackageOrder = heliumService.getVisualizationCachedPackageOrder();
 
     // push the helium vis packages following the order
-    visPackageOrder.map(visName => {
-      visPackages.map(vis => {
-        if (vis.name !== visName) { return }
+    visPackageOrder.map((visName) => {
+      visPackages.map((vis) => {
+        if (vis.name !== visName) {
+          return;
+        }
         $scope.builtInTableDataVisualizationList.push({
           id: vis.id,
           name: vis.name,
           icon: $sce.trustAsHtml(vis.icon),
-          supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK]
-        })
+          supports: [DefaultDisplayType.TABLE, DefaultDisplayType.NETWORK],
+        });
         builtInVisualizations[vis.id] = {
-          class: vis.class
-        }
-      })
-    })
-
-    updateData(result, config, paragraph, index)
-    renderResult($scope.type)
-  }
-
-  function isDOMLoaded (targetElemId) {
-    const elem = angular.element(`#${targetElemId}`)
-    return elem.length
+          class: vis.class,
+        };
+      });
+    });
+
+    updateData(result, config, paragraph, index);
+    renderResult($scope.type);
+  };
+
+  function isDOMLoaded(targetElemId) {
+    const elem = angular.element(`#${targetElemId}`);
+    return elem.length;
   }
 
-  function retryUntilElemIsLoaded (targetElemId, callback) {
-    function retry () {
+  function retryUntilElemIsLoaded(targetElemId, callback) {
+    function retry() {
       if (!isDOMLoaded(targetElemId)) {
-        $timeout(retry, 10)
-        return
+        $timeout(retry, 10);
+        return;
       }
 
-      const elem = angular.element(`#${targetElemId}`)
-      callback(elem)
+      const elem = angular.element(`#${targetElemId}`);
+      callback(elem);
     }
 
-    $timeout(retry)
+    $timeout(retry);
   }
 
-  $scope.$on('updateResult', function (event, result, newConfig, paragraphRef, index) {
+  $scope.$on('updateResult', function(event, result, newConfig, paragraphRef, index) {
     if (paragraph.id !== paragraphRef.id || index !== resultIndex) {
-      return
+      return;
     }
 
     let refresh = !angular.equals(newConfig, $scope.config) ||
       !angular.equals(result.type, $scope.type) ||
-      !angular.equals(result.data, data)
+      !angular.equals(result.data, data);
 
-    updateData(result, newConfig, paragraph, resultIndex)
-    renderResult($scope.type, refresh)
-  })
+    updateData(result, newConfig, paragraph, resultIndex);
+    renderResult($scope.type, refresh);
+  });
 
-  $scope.$on('appendParagraphOutput', function (event, data) {
+  $scope.$on('appendParagraphOutput', function(event, data) {
     /* It has been observed that append events
      * can be errorneously called even if paragraph
      * execution has ended, and in that case, no append
@@ -238,162 +244,162 @@ function ResultCtrl ($scope, $rootScope, $route, $window, $routeParams, $locatio
       resultIndex === data.index &&
       (paragraph.status === ParagraphStatus.PENDING || paragraph.status === ParagraphStatus.RUNNING)) {
       if (DefaultDisplayType.TEXT !== $scope.type) {
-        $scope.type = DefaultDisplayType.TEXT
+        $scope.type = DefaultDisplayType.TEXT;
       }
-      appendTextOutput(data.data)
+      appendTextOutput(data.data);
     }
-  })
+  });
 
-  const updateData = function (result, config, paragraphRef, index) {
-    data = result.data
-    paragraph = paragraphRef
-    resultIndex = parseInt(index)
+  const updateData = function(result, config, paragraphRef, index) {
+    data = result.data;
+    paragraph = paragraphRef;
+    resultIndex = parseInt(index);
 
-    $scope.id = paragraph.id + '_' + index
-    $scope.type = result.type
-    config = config ? config : {}
+    $scope.id = paragraph.id + '_' + index;
+    $scope.type = result.type;
+    config = config ? config : {};
 
     // initialize default config values
     if (!config.graph) {
-      config.graph = {}
+      config.graph = {};
     }
 
     if (!config.graph.mode) {
-      config.graph.mode = 'table'
+      config.graph.mode = 'table';
     }
 
     if (!config.graph.height) {
-      config.graph.height = 300
+      config.graph.height = 300;
     }
 
     if (!config.graph.optionOpen) {
-      config.graph.optionOpen = false
+      config.graph.optionOpen = false;
     }
 
-    $scope.graphMode = config.graph.mode
-    $scope.config = angular.copy(config)
+    $scope.graphMode = config.graph.mode;
+    $scope.config = angular.copy(config);
 
     // enable only when it is last result
-    enableHelium = (index === paragraphRef.results.msg.length - 1)
+    enableHelium = (index === paragraphRef.results.msg.length - 1);
 
     if ($scope.type === 'TABLE' || $scope.type === 'NETWORK') {
-      tableData = new DatasetFactory().createDataset($scope.type)
-      tableData.loadParagraphResult({type: $scope.type, msg: data})
-      $scope.tableDataColumns = tableData.columns
-      $scope.tableDataComment = tableData.comment
+      tableData = new DatasetFactory().createDataset($scope.type);
+      tableData.loadParagraphResult({type: $scope.type, msg: data});
+      $scope.tableDataColumns = tableData.columns;
+      $scope.tableDataComment = tableData.comment;
       if ($scope.type === 'NETWORK') {
-        $scope.networkNodes = tableData.networkNodes
-        $scope.networkRelationships = tableData.networkRelationships
-        $scope.networkProperties = tableData.networkProperties
+        $scope.networkNodes = tableData.networkNodes;
+        $scope.networkRelationships = tableData.networkRelationships;
+        $scope.networkProperties = tableData.networkProperties;
       }
     } else if ($scope.type === 'IMG') {
-      $scope.imageData = data
+      $scope.imageData = data;
     }
-  }
+  };
 
-  $scope.createDisplayDOMId = function (baseDOMId, type) {
+  $scope.createDisplayDOMId = function(baseDOMId, type) {
     if (type === DefaultDisplayType.TABLE || type === DefaultDisplayType.NETWORK) {
-      return `${baseDOMId}_graph`
+      return `${baseDOMId}_graph`;
     } else if (type === DefaultDisplayType.HTML) {
-      return `${baseDOMId}_html`
+      return `${baseDOMId}_html`;
     } else if (type === DefaultDisplayType.ANGULAR) {
-      return `${baseDOMId}_angular`
+      return `${baseDOMId}_angular`;
     } else if (type === DefaultDisplayType.TEXT) {
-      return `${baseDOMId}_text`
+      return `${baseDOMId}_text`;
     } else if (type === DefaultDisplayType.ELEMENT) {
-      return `${baseDOMId}_elem`
+      return `${baseDOMId}_elem`;
     } else {
-      console.error(`Cannot create display DOM Id due to unknown display type: ${type}`)
+      console.error(`Cannot create display DOM Id due to unknown display type: ${type}`);
     }
-  }
+  };
 
-  $scope.renderDefaultDisplay = function (targetElemId, type, data, refresh) {
+  $scope.renderDefaultDisplay = function(targetElemId, type, data, refresh) {
     const afterLoaded = () => {
       if (type === DefaultDisplayType.TABLE || type === DefaultDisplayType.NETWORK) {
-        renderGraph(targetElemId, $scope.graphMode, refresh)
+        renderGraph(targetElemId, $scope.graphMode, refresh);
       } else if (type === DefaultDisplayType.HTML) {
-        renderHtml(targetElemId, data)
+        renderHtml(targetElemId, data);
       } else if (type === DefaultDisplayType.ANGULAR) {
-        renderAngular(targetElemId, data)
+        renderAngular(targetElemId, data);
       } else if (type === DefaultDisplayType.TEXT) {
-        renderText(targetElemId, data, refresh)
+        renderText(targetElemId, data, refresh);
       } else if (type === DefaultDisplayType.ELEMENT) {
-        renderElem(targetElemId, data)
+        renderElem(targetElemId, data);
       } else {
-        console.error(`Unknown Display Type: ${type}`)
+        console.error(`Unknown Display Type: ${type}`);
       }
-    }
+    };
 
-    retryUntilElemIsLoaded(targetElemId, afterLoaded)
+    retryUntilElemIsLoaded(targetElemId, afterLoaded);
 
     // send message to parent that this result is rendered
-    const paragraphId = $scope.$parent.paragraph.id
-    $scope.$emit('resultRendered', paragraphId)
-  }
+    const paragraphId = $scope.$parent.paragraph.id;
+    $scope.$emit('resultRendered', paragraphId);
+  };
 
-  const renderResult = function (type, refresh) {
-    let activeApp
+  const renderResult = function(type, refresh) {
+    let activeApp;
     if (enableHelium) {
-      getSuggestions()
-      getApplicationStates()
-      activeApp = _.get($scope.config, 'helium.activeApp')
+      getSuggestions();
+      getApplicationStates();
+      activeApp = _.get($scope.config, 'helium.activeApp');
     }
 
     if (activeApp) {
-      const appState = _.find($scope.apps, {id: activeApp})
-      renderApp(`p${appState.id}`, appState)
+      const appState = _.find($scope.apps, {id: activeApp});
+      renderApp(`p${appState.id}`, appState);
     } else {
       if (!DefaultDisplayType[type]) {
-        $scope.renderCustomDisplay(type, data)
+        $scope.renderCustomDisplay(type, data);
       } else {
-        const targetElemId = $scope.createDisplayDOMId(`p${$scope.id}`, type)
-        $scope.renderDefaultDisplay(targetElemId, type, data, refresh)
+        const targetElemId = $scope.createDisplayDOMId(`p${$scope.id}`, type);
+        $scope.renderDefaultDisplay(targetElemId, type, data, refresh);
       }
     }
-  }
+  };
 
-  $scope.isDefaultDisplay = function () {
-    return DefaultDisplayType[$scope.type]
-  }
+  $scope.isDefaultDisplay = function() {
+    return DefaultDisplayType[$scope.type];
+  };
 
   /**
    * Render multiple sub results for custom display
    */
-  $scope.renderCustomDisplay = function (type, data) {
+  $scope.renderCustomDisplay = function(type, data) {
     // get result from intp
     if (!heliumService.getSpellByMagic(type)) {
-      console.error(`Can't execute spell due to unknown display type: ${type}`)
-      return
+      console.error(`Can't execute spell due to unknown display type: ${type}`);
+      return;
     }
 
     // custom display result can include multiple subset results
     heliumService.executeSpellAsDisplaySystem(type, data)
-      .then(dataWithTypes => {
-        const containerDOMId = `p${$scope.id}_custom`
+      .then((dataWithTypes) => {
+        const containerDOMId = `p${$scope.id}_custom`;
         const afterLoaded = () => {
-          const containerDOM = angular.element(`#${containerDOMId}`)
+          const containerDOM = angular.element(`#${containerDOMId}`);
           // Spell.interpret() can create multiple outputs
           for (let i = 0; i < dataWithTypes.length; i++) {
-            const dt = dataWithTypes[i]
-            const data = dt.data
-            const type = dt.type
+            const dt = dataWithTypes[i];
+            const data = dt.data;
+            const type = dt.type;
 
             // prepare each DOM to be filled
-            const subResultDOMId = $scope.createDisplayDOMId(`p${$scope.id}_custom_${i}`, type)
-            const subResultDOM = document.createElement('div')
-            containerDOM.append(subResultDOM)
-            subResultDOM.setAttribute('id', subResultDOMId)
+            const subResultDOMId = $scope.createDisplayDOMId(`p${$scope.id}_custom_${i}`, type);
+            const subResultDOM = document.createElement('div');
+            containerDOM.append(subResultDOM);
+            subResultDOM.setAttribute('id', subResultDOMId);
 
-            $scope.renderDefaultDisplay(subResultDOMId, type, data, true)
+            $scope.renderDefaultDisplay(subResultDOMId, type, data, true);
           }
-        }
+        };
 
-        retryUntilElemIsLoaded(containerDOMId, afterLoaded)
-      })
-      .catch(error => {
-        console.error(`Failed to render custom display: ${$scope.type}\n` + error)
+        retryUntilElemIsLoaded(containerDOMId, afterLoaded);
       })
-  }
+      .catch((error) => {
+        console.error(`Failed to render custom display: ${$scope.type}\n` + error);
+      });
+  };
 
   /**
    * generates actually object which will be consumed from `data` property
@@ -405,688 +411,710 @@ function ResultCtrl ($scope, $rootScope, $route, $window, $routeParams, $locatio
    * @param successCallback
    * @param failureCallback
    */
-  const handleData = function (data, type, successCallback, failureCallback) {
+  const handleData = function(data, type, successCallback, failureCallback) {
     if (SpellResult.isFunction(data)) {
       try {
-        successCallback(data())
+        successCallback(data());
       } catch (error) {
-        failureCallback(error)
-        console.error(`Failed to handle ${type} type, function data\n`, error)
+        failureCallback(error);
+        console.error(`Failed to handle ${type} type, function data\n`, error);
       }
     } else if (SpellResult.isObject(data)) {
       try {
-        successCallback(data)
+        successCallback(data);
       } catch (error) {
-        console.error(`Failed to handle ${type} type, object data\n`, error)
+        console.error(`Failed to handle ${type} type, object data\n`, error);
       }
     }
-  }
+  };
 
-  const renderElem = function (targetElemId, data) {
-    const elem = angular.element(`#${targetElemId}`)
-    handleData(() => { data(targetElemId) }, DefaultDisplayType.ELEMENT,
+  const renderElem = function(targetElemId, data) {
+    const elem = angular.element(`#${targetElemId}`);
+    handleData(() => {
+      data(targetElemId);
+    }, DefaultDisplayType.ELEMENT,
       () => {}, /** HTML element will be filled with data. thus pass empty success callback */
-      (error) => { elem.html(`${error.stack}`) }
-    )
-  }
+      (error) => {
+        elem.html(`${error.stack}`);
+      }
+    );
+  };
 
-  const renderHtml = function (targetElemId, data) {
-    const elem = angular.element(`#${targetElemId}`)
+  const renderHtml = function(targetElemId, data) {
+    const elem = angular.element(`#${targetElemId}`);
     handleData(data, DefaultDisplayType.HTML,
       (generated) => {
-        elem.html(generated)
-        elem.find('pre code').each(function (i, e) {
-          hljs.highlightBlock(e)
-        })
+        elem.html(generated);
+        elem.find('pre code').each(function(i, e) {
+          hljs.highlightBlock(e);
+        });
         /* eslint new-cap: [2, {"capIsNewExceptions": ["MathJax.Hub.Queue"]}] */
-        MathJax.Hub.Queue(['Typeset', MathJax.Hub, elem[0]])
+        MathJax.Hub.Queue(['Typeset', MathJax.Hub, elem[0]]);
       },
-      (error) => { elem.html(`${error.stack}`) }
-    )
-  }
+      (error) => {
+        elem.html(`${error.stack}`);
+      }
+    );
+  };
 
-  const renderAngular = function (targetElemId, data) {
-    const elem = angular.element(`#${targetElemId}`)
-    const paragraphScope = noteVarShareService.get(`${paragraph.id}_paragraphScope`)
+  const renderAngular = function(targetElemId, data) {
+    const elem = angular.element(`#${targetElemId}`);
+    const paragraphScope = noteVarShareService.get(`${paragraph.id}_paragraphScope`);
     handleData(data, DefaultDisplayType.ANGULAR,
       (generated) => {
-        elem.html(generated)
-        $compile(elem.contents())(paragraphScope)
+        elem.html(generated);
+        $compile(elem.contents())(paragraphScope);
       },
-      (error) => { elem.html(`${error.stack}`) }
-    )
-  }
+      (error) => {
+        elem.html(`${error.stack}`);
+      }
+    );
+  };
 
-  const getTextResultElemId = function (resultId) {
-    return `p${resultId}_text`
-  }
+  const getTextResultElemId = function(resultId) {
+    return `p${resultId}_text`;
+  };
 
-  const checkAndReplaceCarriageReturn = function (str) {
+  const checkAndReplaceCarriageReturn = function(str) {
     if (/\r/.test(str)) {
-      let newGenerated = ''
-      let strArr = str.split('\n')
+      let newGenerated = '';
+      let strArr = str.split('\n');
       for (let str of strArr) {
         if (/\r/.test(str)) {
-          let splitCR = str.split('\r')
-          newGenerated += splitCR[splitCR.length - 1] + '\n'
+          let splitCR = str.split('\r');
+          newGenerated += splitCR[splitCR.length - 1] + '\n';
         } else {
-          newGenerated += str + '\n'
+          newGenerated += str + '\n';
         }
       }
       // remove last "\n" character
-      return newGenerated.slice(0, -1)
+      return newGenerated.slice(0, -1);
     } else {
-      return str
+      return str;
     }
-  }
+  };
 
-  const renderText = function (targetElemId, data, refresh) {
-    const elem = angular.element(`#${targetElemId}`)
+  const renderText = function(targetElemId, data, refresh) {
+    const elem = angular.element(`#${targetElemId}`);
     handleData(data, DefaultDisplayType.TEXT,
       (generated) => {
         // clear all lines before render
-        removeChildrenDOM(targetElemId)
+        removeChildrenDOM(targetElemId);
 
         if (generated) {
-          generated = checkAndReplaceCarriageReturn(generated)
-          const escaped = AnsiUpConverter.ansi_to_html(generated)
-          const divDOM = angular.element('<div></div>').innerHTML = escaped
+          generated = checkAndReplaceCarriageReturn(generated);
+          const escaped = AnsiUpConverter.ansi_to_html(generated);
+          const divDOM = angular.element('<div></div>').innerHTML = escaped;
           if (refresh) {
-            elem.html(divDOM)
+            elem.html(divDOM);
           } else {
-            elem.append(divDOM)
+            elem.append(divDOM);
           }
         } else if (refresh) {
-          elem.html('')
+          elem.html('');
         }
 
-        elem.bind('mousewheel', (e) => { $scope.keepScrollDown = false })
+        elem.bind('mousewheel', (e) => {
+          $scope.keepScrollDown = false;
+        });
       },
-      (error) => { elem.html(`${error.stack}`) }
-    )
-  }
+      (error) => {
+        elem.html(`${error.stack}`);
+      }
+    );
+  };
 
-  const removeChildrenDOM = function (targetElemId) {
-    const elem = angular.element(`#${targetElemId}`)
+  const removeChildrenDOM = function(targetElemId) {
+    const elem = angular.element(`#${targetElemId}`);
     if (elem.length) {
-      elem.children().remove()
+      elem.children().remove();
     }
-  }
+  };
 
-  function appendTextOutput (data) {
-    const elemId = getTextResultElemId($scope.id)
-    textResultQueueForAppend.push(data)
+  function appendTextOutput(data) {
+    const elemId = getTextResultElemId($scope.id);
+    textResultQueueForAppend.push(data);
 
     // if DOM is not loaded, just push data and return
     if (!isDOMLoaded(elemId)) {
-      return
+      return;
     }
 
-    const elem = angular.element(`#${elemId}`)
+    const elem = angular.element(`#${elemId}`);
 
     // pop all stacked data and append to the DOM
     while (textResultQueueForAppend.length > 0) {
-      const line = elem.html() + AnsiUpConverter.ansi_to_html(textResultQueueForAppend.pop())
-      elem.html(checkAndReplaceCarriageReturn(line))
+      const line = elem.html() + AnsiUpConverter.ansi_to_html(textResultQueueForAppend.pop());
+      elem.html(checkAndReplaceCarriageReturn(line));
       if ($scope.keepScrollDown) {
-        const doc = angular.element(`#${elemId}`)
-        doc[0].scrollTop = doc[0].scrollHeight
+        const doc = angular.element(`#${elemId}`);
+        doc[0].scrollTop = doc[0].scrollHeight;
       }
     }
   }
 
-  const getTrSettingElem = function (scopeId, graphMode) {
-    return angular.element('#trsetting' + scopeId + '_' + graphMode)
-  }
+  const getTrSettingElem = function(scopeId, graphMode) {
+    return angular.element('#trsetting' + scopeId + '_' + graphMode);
+  };
 
-  const getVizSettingElem = function (scopeId, graphMode) {
-    return angular.element('#vizsetting' + scopeId + '_' + graphMode)
-  }
+  const getVizSettingElem = function(scopeId, graphMode) {
+    return angular.element('#vizsetting' + scopeId + '_' + graphMode);
+  };
 
-  const renderGraph = function (graphElemId, graphMode, refresh) {
+  const renderGraph = function(graphElemId, graphMode, refresh) {
     // set graph height
-    const height = $scope.config.graph.height
-    const graphElem = angular.element(`#${graphElemId}`)
-    graphElem.height(height)
+    const height = $scope.config.graph.height;
+    const graphElem = angular.element(`#${graphElemId}`);
+    graphElem.height(height);
 
-    if (!graphMode) { graphMode = 'table' }
+    if (!graphMode) {
+      graphMode = 'table';
+    }
 
-    let builtInViz = builtInVisualizations[graphMode]
+    let builtInViz = builtInVisualizations[graphMode];
     if (!builtInViz) {
       /** helium package is not available, fallback to table vis */
-      graphMode = 'table'
-      $scope.graphMode = graphMode /** html depends on this scope value */
-      builtInViz = builtInVisualizations[graphMode]
+      graphMode = 'table';
+      $scope.graphMode = graphMode; /** html depends on this scope value */
+      builtInViz = builtInVisualizations[graphMode];
     }
 
     // deactive previsouly active visualization
     for (let t in builtInVisualizations) {
-      const v = builtInVisualizations[t].instance
+      if (builtInVisualizations.hasOwnProperty(t)) {
+        const v = builtInVisualizations[t].instance;
 
-      if (t !== graphMode && v && v.isActive()) {
-        v.deactivate()
-        break
+        if (t !== graphMode && v && v.isActive()) {
+          v.deactivate();
+          break;
+        }
       }
     }
 
-    let afterLoaded = function () { /** will be overwritten */ }
+    let afterLoaded = function() { /** will be overwritten */ };
 
     if (!builtInViz.instance) { // not instantiated yet
       // render when targetEl is available
-      afterLoaded = function (loadedElem) {
+      afterLoaded = function(loadedElem) {
         try {
-          const transformationSettingTargetEl = getTrSettingElem($scope.id, graphMode)
-          const visualizationSettingTargetEl = getVizSettingElem($scope.id, graphMode)
+          const transformationSettingTargetEl = getTrSettingElem($scope.id, graphMode);
+          const visualizationSettingTargetEl = getVizSettingElem($scope.id, graphMode);
           // set height
-          loadedElem.height(height)
+          loadedElem.height(height);
 
           // instantiate visualization
-          const config = getVizConfig(graphMode)
-          const Visualization = builtInViz.class
-          builtInViz.instance = new Visualization(loadedElem, config)
+          const config = getVizConfig(graphMode);
+          const Visualization = builtInViz.class;
+          builtInViz.instance = new Visualization(loadedElem, config);
 
           // inject emitter, $templateRequest
-          const emitter = function (graphSetting) {
-            commitVizConfigChange(graphSetting, graphMode)
-          }
-          builtInViz.instance._emitter = emitter
-          builtInViz.instance._compile = $compile
+          const emitter = function(graphSetting) {
+            commitVizConfigChange(graphSetting, graphMode);
+          };
+          builtInViz.instance._emitter = emitter;
+          builtInViz.instance._compile = $compile;
 
           // ui-grid related
-          $templateCache.put('ui-grid/ui-grid-filter', TableGridFilterTemplate)
-          builtInViz.instance._uiGridConstants = uiGridConstants
-          builtInViz.instance._timeout = $timeout
-
-          builtInViz.instance._createNewScope = createNewScope
-          builtInViz.instance._templateRequest = $templateRequest
-          const transformation = builtInViz.instance.getTransformation()
-          transformation._emitter = emitter
-          transformation._templateRequest = $templateRequest
-          transformation._compile = $compile
-          transformation._createNewScope = createNewScope
+          $templateCache.put('ui-grid/ui-grid-filter', TableGridFilterTemplate);
+          builtInViz.instance._uiGridConstants = uiGridConstants;
+          builtInViz.instance._timeout = $timeout;
+
+          builtInViz.instance._createNewScope = createNewScope;
+          builtInViz.instance._templateRequest = $templateRequest;
+          const transformation = builtInViz.instance.getTransformation();
+          transformation._emitter = emitter;
+          transformation._templateRequest = $templateRequest;
+          transformation._compile = $compile;
+          transformation._createNewScope = createNewScope;
 
           // render
-          const transformed = transformation.transform(tableData)
-          transformation.renderSetting(transformationSettingTargetEl)
-          builtInViz.instance.render(transformed)
-          builtInViz.instance.renderSetting(visualizationSettingTargetEl)
-          builtInViz.instance.activate()
+          const transformed = transformation.transform(tableData);
+          transformation.renderSetting(transformationSettingTargetEl);
+          builtInViz.instance.render(transformed);
+          builtInViz.instance.renderSetting(visualizationSettingTargetEl);
+          builtInViz.instance.activate();
           angular.element(window).resize(() => {
-            builtInViz.instance.resize()
-          })
+            builtInViz.instance.resize();
+          });
         } catch (err) {
-          console.error('Graph drawing error %o', err)
+          console.error('Graph drawing error %o', err);
         }
-      }
+      };
     } else if (refresh) {
       // when graph options or data are changed
-      console.log('Refresh data %o', tableData)
-
-      afterLoaded = function (loadedElem) {
-        const transformationSettingTargetEl = getTrSettingElem($scope.id, graphMode)
-        const visualizationSettingTargetEl = getVizSettingElem($scope.id, graphMode)
-        const config = getVizConfig(graphMode)
-        loadedElem.height(height)
-        const transformation = builtInViz.instance.getTransformation()
-        transformation.setConfig(config)
-        const transformed = transformation.transform(tableData)
-        transformation.renderSetting(transformationSettingTargetEl)
-        builtInViz.instance.setConfig(config)
-        builtInViz.instance.render(transformed)
-        builtInViz.instance.renderSetting(visualizationSettingTargetEl)
-        builtInViz.instance.activate()
-      }
+      console.log('Refresh data %o', tableData);
+
+      afterLoaded = function(loadedElem) {
+        const transformationSettingTargetEl = getTrSettingElem($scope.id, graphMode);
+        const visualizationSettingTargetEl = getVizSettingElem($scope.id, graphMode);
+        const config = getVizConfig(graphMode);
+        loadedElem.height(height);
+        const transformation = builtInViz.instance.getTransformation();
+        transformation.setConfig(config);
+        const transformed = transformation.transform(tableData);
+        transformation.renderSetting(transformationSettingTargetEl);
+        builtInViz.instance.setConfig(config);
+        builtInViz.instance.render(transformed);
+        builtInViz.instance.renderSetting(visualizationSettingTargetEl);
+        builtInViz.instance.activate();
+      };
     } else {
-      afterLoaded = function (loadedElem) {
-        loadedElem.height(height)
-        builtInViz.instance.activate()
-      }
+      afterLoaded = function(loadedElem) {
+        loadedElem.height(height);
+        builtInViz.instance.activate();
+      };
     }
 
-    const tableElemId = `p${$scope.id}_${graphMode}`
-    retryUntilElemIsLoaded(tableElemId, afterLoaded)
-  }
+    const tableElemId = `p${$scope.id}_${graphMode}`;
+    retryUntilElemIsLoaded(tableElemId, afterLoaded);
+  };
 
-  $scope.switchViz = function (newMode) {
-    let newConfig = angular.copy($scope.config)
-    let newParams = angular.copy(paragraph.settings.params)
+  $scope.switchViz = function(newMode) {
+    let newConfig = angular.copy($scope.config);
+    let newParams = angular.copy(paragraph.settings.params);
 
     // graph options
-    newConfig.graph.mode = newMode
+    newConfig.graph.mode = newMode;
 
     // see switchApp()
-    _.set(newConfig, 'helium.activeApp', undefined)
+    _.set(newConfig, 'helium.activeApp', undefined);
 
-    commitParagraphResult(paragraph.title, paragraph.text, newConfig, newParams)
-  }
+    commitParagraphResult(paragraph.title, paragraph.text, newConfig, newParams);
+  };
 
-  const createNewScope = function () {
-    return $rootScope.$new(true)
-  }
+  const createNewScope = function() {
+    return $rootScope.$new(true);
+  };
 
-  const commitParagraphResult = function (title, text, config, params) {
-    let newParagraphConfig = angular.copy(paragraph.config)
-    newParagraphConfig.results = newParagraphConfig.results || []
-    newParagraphConfig.results[resultIndex] = config
+  const commitParagraphResult = function(title, text, config, params) {
+    let newParagraphConfig = angular.copy(paragraph.config);
+    newParagraphConfig.results = newParagraphConfig.results || [];
+    newParagraphConfig.results[resultIndex] = config;
     if ($scope.revisionView === true) {
       // local update without commit
       updateData({
         type: $scope.type,
-        data: data
-      }, newParagraphConfig.results[resultIndex], paragraph, resultIndex)
-      renderResult($scope.type, true)
+        data: data,
+      }, newParagraphConfig.results[resultIndex], paragraph, resultIndex);
+      renderResult($scope.type, true);
     } else {
-      return websocketMsgSrv.commitParagraph(paragraph.id, title, text, newParagraphConfig, params)
+      return websocketMsgSrv.commitParagraph(paragraph.id, title, text, newParagraphConfig, params);
     }
-  }
+  };
 
-  $scope.toggleGraphSetting = function () {
-    let newConfig = angular.copy($scope.config)
+  $scope.toggleGraphSetting = function() {
+    let newConfig = angular.copy($scope.config);
     if (newConfig.graph.optionOpen) {
-      newConfig.graph.optionOpen = false
+      newConfig.graph.optionOpen = false;
     } else {
-      newConfig.graph.optionOpen = true
+      newConfig.graph.optionOpen = true;
     }
 
-    let newParams = angular.copy(paragraph.settings.params)
-    commitParagraphResult(paragraph.title, paragraph.text, newConfig, newParams)
-  }
+    let newParams = angular.copy(paragraph.settings.params);
+    commitParagraphResult(paragraph.title, paragraph.text, newConfig, newParams);
+  };
 
-  const getVizConfig = function (vizId) {
-    let config
-    let graph = $scope.config.graph
+  const getVizConfig = function(vizId) {
+    let config;
+    let graph = $scope.config.graph;
     if (graph) {
       // copy setting for vizId
       if (graph.setting) {
-        config = angular.copy(graph.setting[vizId])
+        config = angular.copy(graph.setting[vizId]);
       }
 
       if (!config) {
-        config = {}
+        config = {};
       }
 
       // copy common setting
-      config.common = angular.copy(graph.commonSetting) || {}
+      config.common = angular.copy(graph.commonSetting) || {};
 
       // copy pivot setting
       if (graph.keys) {
         config.common.pivot = {
           keys: angular.copy(graph.keys),
           groups: angular.copy(graph.groups),
-          values: angular.copy(graph.values)
-        }
+          values: angular.copy(graph.values),
+        };
       }
     }
-    console.debug('getVizConfig', config)
-    return config
-  }
+    console.debug('getVizConfig', config);
+    return config;
+  };
 
-  const commitVizConfigChange = function (config, vizId) {
-    let newConfig = angular.copy($scope.config)
+  const commitVizConfigChange = function(config, vizId) {
+    let newConfig = angular.copy($scope.config);
     if (!newConfig.graph) {
-      newConfig.graph = {}
+      newConfig.graph = {};
     }
 
     // copy setting for vizId
     if (!newConfig.graph.setting) {
-      newConfig.graph.setting = {}
+      newConfig.graph.setting = {};
     }
-    newConfig.graph.setting[vizId] = angular.copy(config)
+    newConfig.graph.setting[vizId] = angular.copy(config);
 
     // copy common setting
     if (newConfig.graph.setting[vizId]) {
-      newConfig.graph.commonSetting = newConfig.graph.setting[vizId].common
-      delete newConfig.graph.setting[vizId].common
+      newConfig.graph.commonSetting = newConfig.graph.setting[vizId].common;
+      delete newConfig.graph.setting[vizId].common;
     }
 
     // copy pivot setting
     if (newConfig.graph.commonSetting && newConfig.graph.commonSetting.pivot) {
-      newConfig.graph.keys = newConfig.graph.commonSetting.pivot.keys
-      newConfig.graph.groups = newConfig.graph.commonSetting.pivot.groups
-      newConfig.graph.values = newConfig.graph.commonSetting.pivot.values
-      delete newConfig.graph.commonSetting.pivot
+      newConfig.graph.keys = newConfig.graph.commonSetting.pivot.keys;
+      newConfig.graph.groups = newConfig.graph.commonSetting.pivot.groups;
+      newConfig.graph.values = newConfig.graph.commonSetting.pivot.values;
+      delete newConfig.graph.commonSetting.pivot;
     }
-    console.debug('committVizConfig', newConfig)
-    let newParams = angular.copy(paragraph.settings.params)
-    commitParagraphResult(paragraph.title, paragraph.text, newConfig, newParams)
-  }
+    console.debug('committVizConfig', newConfig);
+    let newParams = angular.copy(paragraph.settings.params);
+    commitParagraphResult(paragraph.title, paragraph.text, newConfig, newParams);
+  };
 
-  $scope.$on('paragraphResized', function (event, paragraphId) {
+  $scope.$on('paragraphResized', function(event, paragraphId) {
     // paragraph col width changed
     if (paragraphId === paragraph.id) {
-      let builtInViz = builtInVisualizations[$scope.graphMode]
+      let builtInViz = builtInVisualizations[$scope.graphMode];
       if (builtInViz && builtInViz.instance) {
-        $timeout(_ => builtInViz.instance.resize(), 200)
+        $timeout(() => builtInViz.instance.resize(), 200);
       }
     }
-  })
+  });
 
-  $scope.resize = function (width, height) {
-    $timeout(function () {
-      changeHeight(width, height)
-    }, 200)
-  }
+  $scope.resize = function(width, height) {
+    $timeout(function() {
+      changeHeight(width, height);
+    }, 200);
+  };
 
-  const changeHeight = function (width, height) {
-    let newParams = angular.copy(paragraph.settings.params)
-    let newConfig = angular.copy($scope.config)
+  const changeHeight = function(width, height) {
+    let newParams = angular.copy(paragraph.settings.params);
+    let newConfig = angular.copy($scope.config);
 
-    newConfig.graph.height = height
-    paragraph.config.colWidth = width
+    newConfig.graph.height = height;
+    paragraph.config.colWidth = width;
 
-    commitParagraphResult(paragraph.title, paragraph.text, newConfig, newParams)
-  }
+    commitParagraphResult(paragraph.title, paragraph.text, newConfig, newParams);
+  };
 
-  $scope.exportToDSV = function (delimiter) {
-    let dsv = ''
-    let dateFinished = moment(paragraph.dateFinished).format('YYYY-MM-DD hh:mm:ss A')
-    let exportedFileName = paragraph.title ? paragraph.title + '_' + dateFinished : 'data_' + dateFinished
+  $scope.exportToDSV = function(delimiter) {
+    let dsv = '';
+    let dateFinished = moment(paragraph.dateFinished).format('YYYY-MM-DD hh:mm:ss A');
+    let exportedFileName = paragraph.title ? paragraph.title + '_' + dateFinished : 'data_' + dateFinished;
 
     for (let titleIndex in tableData.columns) {
-      dsv += tableData.columns[titleIndex].name + delimiter
+      if (tableData.columns.hasOwnProperty(titleIndex)) {
+        dsv += tableData.columns[titleIndex].name + delimiter;
+      }
     }
-    dsv = dsv.substring(0, dsv.length - 1) + '\n'
+    dsv = dsv.substring(0, dsv.length - 1) + '\n';
     for (let r in tableData.rows) {
-      let row = tableData.rows[r]
-      let dsvRow = ''
-      for (let index in row) {
-        let stringValue = (row[index]).toString()
-        if (stringValue.indexOf(delimiter) > -1) {
-          dsvRow += '"' + stringValue + '"' + delimiter
-        } else {
-          dsvRow += row[index] + delimiter
+      if (tableData.rows.hasOwnProperty(r)) {
+        let row = tableData.rows[r];
+        let dsvRow = '';
+        for (let index in row) {
+          if (row.hasOwnProperty(index)) {
+            let stringValue = (row[index]).toString();
+            if (stringValue.indexOf(delimiter) > -1) {
+              dsvRow += '"' + stringValue + '"' + delimiter;
+            } else {
+              dsvRow += row[index] + delimiter;
+            }
+          }
         }
+        dsv += dsvRow.substring(0, dsvRow.length - 1) + '\n';
       }
-      dsv += dsvRow.substring(0, dsvRow.length - 1) + '\n'
     }
-    let extension = ''
+    let extension = '';
     if (delimiter === '\t') {
-      extension = 'tsv'
+      extension = 'tsv';
     } else if (delimiter === ',') {
-      extension = 'csv'
+      extension = 'csv';
     }
-    saveAsService.saveAs(dsv, exportedFileName, extension)
-  }
+    saveAsService.saveAs(dsv, exportedFileName, extension);
+  };
 
-  $scope.getBase64ImageSrc = function (base64Data) {
-    return 'data:image/png;base64,' + base64Data
-  }
+  $scope.getBase64ImageSrc = function(base64Data) {
+    return 'data:image/png;base64,' + base64Data;
+  };
 
   // Helium ----------------
-  let ANGULAR_FUNCTION_OBJECT_NAME_PREFIX = '_Z_ANGULAR_FUNC_'
+  let ANGULAR_FUNCTION_OBJECT_NAME_PREFIX = '_Z_ANGULAR_FUNC_';
 
   // app states
-  $scope.apps = []
+  $scope.apps = [];
 
   // suggested apps
-  $scope.suggestion = {}
+  $scope.suggestion = {};
 
-  $scope.switchApp = function (appId) {
-    let newConfig = angular.copy($scope.config)
-    let newParams = angular.copy(paragraph.settings.params)
+  $scope.switchApp = function(appId) {
+    let newConfig = angular.copy($scope.config);
+    let newParams = angular.copy(paragraph.settings.params);
 
     // 'helium.activeApp' can be cleared by switchViz()
-    _.set(newConfig, 'helium.activeApp', appId)
+    _.set(newConfig, 'helium.activeApp', appId);
 
-    commitConfig(newConfig, newParams)
-  }
+    commitConfig(newConfig, newParams);
+  };
 
-  $scope.loadApp = function (heliumPackage) {
-    let noteId = $route.current.pathParams.noteId
+  $scope.loadApp = function(heliumPackage) {
+    let noteId = $route.current.pathParams.noteId;
     $http.post(baseUrlSrv.getRestApiBase() + '/helium/load/' + noteId + '/' + paragraph.id, heliumPackage)
-      .success(function (data, status, headers, config) {
-        console.log('Load app %o', data)
+      .success(function(data, status, headers, config) {
+        console.log('Load app %o', data);
       })
-      .error(function (err, status, headers, config) {
-        console.log('Error %o', err)
-      })
-  }
+      .error(function(err, status, headers, config) {
+        console.log('Error %o', err);
+      });
+  };
 
-  const commitConfig = function (config, params) {
-    commitParagraphResult(paragraph.title, paragraph.text, config, params)
-  }
+  const commitConfig = function(config, params) {
+    commitParagraphResult(paragraph.title, paragraph.text, config, params);
+  };
 
-  const getApplicationStates = function () {
-    let appStates = []
+  const getApplicationStates = function() {
+    let appStates = [];
 
     // Display ApplicationState
     if (paragraph.apps) {
-      _.forEach(paragraph.apps, function (app) {
+      _.forEach(paragraph.apps, function(app) {
         appStates.push({
           id: app.id,
           pkg: app.pkg,
           status: app.status,
-          output: app.output
-        })
-      })
+          output: app.output,
+        });
+      });
     }
 
     // update or remove app states no longer exists
-    _.forEach($scope.apps, function (currentAppState, idx) {
-      let newAppState = _.find(appStates, {id: currentAppState.id})
+    _.forEach($scope.apps, function(currentAppState, idx) {
+      let newAppState = _.find(appStates, {id: currentAppState.id});
       if (newAppState) {
-        angular.extend($scope.apps[idx], newAppState)
+        angular.extend($scope.apps[idx], newAppState);
       } else {
-        $scope.apps.splice(idx, 1)
+        $scope.apps.splice(idx, 1);
       }
-    })
+    });
 
     // add new app states
-    _.forEach(appStates, function (app, idx) {
+    _.forEach(appStates, function(app, idx) {
       if ($scope.apps.length <= idx || $scope.apps[idx].id !== app.id) {
-        $scope.apps.splice(idx, 0, app)
+        $scope.apps.splice(idx, 0, app);
       }
-    })
-  }
+    });
+  };
 
-  const getSuggestions = function () {
+  const getSuggestions = function() {
     // Get suggested apps
-    let noteId = $route.current.pathParams.noteId
+    let noteId = $route.current.pathParams.noteId;
     if (!noteId) {
-      return
+      return;
     }
     $http.get(baseUrlSrv.getRestApiBase() + '/helium/suggest/' + noteId + '/' + paragraph.id)
-      .success(function (data, status, headers, config) {
-        $scope.suggestion = data.body
-      })
-      .error(function (err, status, headers, config) {
-        console.log('Error %o', err)
+      .success(function(data, status, headers, config) {
+        $scope.suggestion = data.body;
       })
-  }
+      .error(function(err, status, headers, config) {
+        console.log('Error %o', err);
+      });
+  };
 
-  const renderApp = function (targetElemId, appState) {
+  const renderApp = function(targetElemId, appState) {
     const afterLoaded = (loadedElem) => {
       try {
-        console.log('renderApp %o', appState)
-        loadedElem.html(appState.output)
-        $compile(loadedElem.contents())(getAppScope(appState))
+        console.log('renderApp %o', appState);
+        loadedElem.html(appState.output);
+        $compile(loadedElem.contents())(getAppScope(appState));
       } catch (err) {
-        console.log('App rendering error %o', err)
+        console.log('App rendering error %o', err);
       }
-    }
-    retryUntilElemIsLoaded(targetElemId, afterLoaded)
-  }
+    };
+    retryUntilElemIsLoaded(targetElemId, afterLoaded);
+  };
 
   /*
    ** $scope.$on functions below
    */
-  $scope.$on('appendAppOutput', function (event, data) {
+  $scope.$on('appendAppOutput', function(event, data) {
     if (paragraph.id === data.paragraphId) {
-      let app = _.find($scope.apps, {id: data.appId})
+      let app = _.find($scope.apps, {id: data.appId});
       if (app) {
-        app.output += data.data
+        app.output += data.data;
 
-        let paragraphAppState = _.find(paragraph.apps, {id: data.appId})
-        paragraphAppState.output = app.output
+        let paragraphAppState = _.find(paragraph.apps, {id: data.appId});
+        paragraphAppState.output = app.output;
 
-        let targetEl = angular.element(document.getElementById('p' + app.id))
-        targetEl.html(app.output)
-        $compile(targetEl.contents())(getAppScope(app))
-        console.log('append app output %o', $scope.apps)
+        let targetEl = angular.element(document.getElementById('p' + app.id));
+        targetEl.html(app.output);
+        $compile(targetEl.contents())(getAppScope(app));
+        console.log('append app output %o', $scope.apps);
       }
     }
-  })
+  });
 
-  $scope.$on('updateAppOutput', function (event, data) {
+  $scope.$on('updateAppOutput', function(event, data) {
     if (paragraph.id === data.paragraphId) {
-      let app = _.find($scope.apps, {id: data.appId})
+      let app = _.find($scope.apps, {id: data.appId});
       if (app) {
-        app.output = data.data
+        app.output = data.data;
 
-        let paragraphAppState = _.find(paragraph.apps, {id: data.appId})
-        paragraphAppState.output = app.output
+        let paragraphAppState = _.find(paragraph.apps, {id: data.appId});
+        paragraphAppState.output = app.output;
 
-        let targetEl = angular.element(document.getElementById('p' + app.id))
-        targetEl.html(app.output)
-        $compile(targetEl.contents())(getAppScope(app))
-        console.log('append app output')
+        let targetEl = angular.element(document.getElementById('p' + app.id));
+        targetEl.html(app.output);
+        $compile(targetEl.contents())(getAppScope(app));
+        console.log('append app output');
       }
     }
-  })
+  });
 
-  $scope.$on('appLoad', function (event, data) {
+  $scope.$on('appLoad', function(event, data) {
     if (paragraph.id === data.paragraphId) {
-      let app = _.find($scope.apps, {id: data.appId})
+      let app = _.find($scope.apps, {id: data.appId});
       if (!app) {
         app = {
           id: data.appId,
           pkg: data.pkg,
           status: 'UNLOADED',
-          output: ''
-        }
+          output: '',
+        };
 
-        $scope.apps.push(app)
-        paragraph.apps.push(app)
-        $scope.switchApp(app.id)
+        $scope.apps.push(app);
+        paragraph.apps.push(app);
+        $scope.switchApp(app.id);
       }
     }
-  })
+  });
 
-  $scope.$on('appStatusChange', function (event, data) {
+  $scope.$on('appStatusChange', function(event, data) {
     if (paragraph.id === data.paragraphId) {
-      let app = _.find($scope.apps, {id: data.appId})
+      let app = _.find($scope.apps, {id: data.appId});
       if (app) {
-        app.status = data.status
-        let paragraphAppState = _.find(paragraph.apps, {id: data.appId})
-        paragraphAppState.status = app.status
+        app.status = data.status;
+        let paragraphAppState = _.find(paragraph.apps, {id: data.appId});
+        paragraphAppState.status = app.status;
       }
     }
-  })
+  });
 
-  let getAppRegistry = function (appState) {
+  let getAppRegistry = function(appState) {
     if (!appState.registry) {
-      appState.registry = {}
+      appState.registry = {};
     }
 
-    return appState.registry
-  }
+    return appState.registry;
+  };
 
-  const getAppScope = function (appState) {
+  const getAppScope = function(appState) {
     if (!appState.scope) {
-      appState.scope = $rootScope.$new(true, $rootScope)
+      appState.scope = $rootScope.$new(true, $rootScope);
     }
-    return appState.scope
-  }
+    return appState.scope;
+  };
 
-  $scope.$on('angularObjectUpdate', function (event, data) {
-    let noteId = $route.current.pathParams.noteId
+  $scope.$on('angularObjectUpdate', function(event, data) {
+    let noteId = $route.current.pathParams.noteId;
     if (!data.noteId || data.noteId === noteId) {
-      let scope
-      let registry
+      let scope;
+      let registry;
 
-      let app = _.find($scope.apps, {id: data.paragraphId})
+      let app = _.find($scope.apps, {id: data.paragraphId});
       if (app) {
-        scope = getAppScope(app)
-        registry = getAppRegistry(app)
+        scope = getAppScope(app);
+        registry = getAppRegistry(app);
       } else {
         // no matching app in this paragraph
-        return
+        return;
       }
 
-      let varName = data.angularObject.name
+      let varName = data.angularObject.name;
 
       if (angular.equals(data.angularObject.object, scope[varName])) {
         // return when update has no change
-        return
+        return;
       }
 
       if (!registry[varName]) {
         registry[varName] = {
           interpreterGroupId: data.interpreterGroupId,
           noteId: data.noteId,
-          paragraphId: data.paragraphId
-        }
+          paragraphId: data.paragraphId,
+        };
       } else {
-        registry[varName].noteId = registry[varName].noteId || data.noteId
-        registry[varName].paragraphId = registry[varName].paragraphId || data.paragraphId
+        registry[varName].noteId = registry[varName].noteId || data.noteId;
+        registry[varName].paragraphId = registry[varName].paragraphId || data.paragraphId;
       }
 
-      registry[varName].skipEmit = true
+      registry[varName].skipEmit = true;
 
       if (!registry[varName].clearWatcher) {
-        registry[varName].clearWatcher = scope.$watch(varName, function (newValue, oldValue) {
-          console.log('angular object (paragraph) updated %o %o', varName, registry[varName])
+        registry[varName].clearWatcher = scope.$watch(varName, function(newValue, oldValue) {
+          console.log('angular object (paragraph) updated %o %o', varName, registry[varName]);
           if (registry[varName].skipEmit) {
-            registry[varName].skipEmit = false
-            return
+            registry[varName].skipEmit = false;
+            return;
           }
           websocketMsgSrv.updateAngularObject(
             registry[varName].noteId,
             registry[varName].paragraphId,
             varName,
             newValue,
-            registry[varName].interpreterGroupId)
-        })
+            registry[varName].interpreterGroupId);
+        });
       }
-      console.log('angular object (paragraph) created %o', varName)
-      scope[varName] = data.angularObject.object
+      console.log('angular object (paragraph) created %o', varName);
+      scope[varName] = data.angularObject.object;
 
       // create proxy for AngularFunction
       if (varName.indexOf(ANGULAR_FUNCTION_OBJECT_NAME_PREFIX) === 0) {
-        let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length)
-        scope[funcName] = function () {
+        let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length);
+        scope[funcName] = function() {
           // eslint-disable-next-line prefer-rest-params
-          scope[varName] = arguments
+          scope[varName] = arguments;
           // eslint-disable-next-line prefer-rest-params
-          console.log('angular function (paragraph) invoked %o', arguments)
-        }
+          console.log('angular function (paragraph) invoked %o', arguments);
+        };
 
-        console.log('angular function (paragraph) created %o', scope[funcName])
+        console.log('angular function (paragraph) created %o', scope[funcName]);
       }
     }
-  })
+  });
 
-  $scope.$on('angularObjectRemove', function (event, data) {
-    let noteId = $route.current.pathParams.noteId
+  $scope.$on('angularObjectRemove', function(event, data) {
+    let noteId = $route.current.pathParams.noteId;
     if (!data.noteId || data.noteId === noteId) {
-      let scope
-      let registry
+      let scope;
+      let registry;
 
-      let app = _.find($scope.apps, {id: data.paragraphId})
+      let app = _.find($scope.apps, {id: data.paragraphId});
       if (app) {
-        scope = getAppScope(app)
-        registry = getAppRegistry(app)
+        scope = getAppScope(app);
+        registry = getAppRegistry(app);
       } else {
         // no matching app in this paragraph
-        return
+        return;
       }
 
-      let varName = data.name
+      let varName = data.name;
 
       // clear watcher
       if (registry[varName]) {
-        registry[varName].clearWatcher()
-        registry[varName] = undefined
+        registry[varName].clearWatcher();
+        registry[varName] = undefined;
       }
 
       // remove scope variable
-      scope[varName] = undefined
+      scope[varName] = undefined;
 
       // remove proxy for AngularFunction
       if (varName.indexOf(ANGULAR_FUNCTION_OBJECT_NAME_PREFIX) === 0) {
-        let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length)
-        scope[funcName] = undefined
+        let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length);
+        scope[funcName] = undefined;
       }
     }
-  })
+  });
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/revisions-comparator/revisions-comparator.component.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/revisions-comparator/revisions-comparator.component.js b/zeppelin-web/src/app/notebook/revisions-comparator/revisions-comparator.component.js
index 45db38a..debdb6e 100644
--- a/zeppelin-web/src/app/notebook/revisions-comparator/revisions-comparator.component.js
+++ b/zeppelin-web/src/app/notebook/revisions-comparator/revisions-comparator.component.js
@@ -12,81 +12,81 @@
  * limitations under the License.
  */
 
-import revisionsComparatorTemplate from './revisions-comparator.html'
-import './revisions-comparator.css'
-import moment from 'moment'
+import revisionsComparatorTemplate from './revisions-comparator.html';
+import './revisions-comparator.css';
+import moment from 'moment';
 
 function RevisionsComparatorController($scope, websocketMsgSrv, $routeParams) {
-  'ngInject'
+  'ngInject';
 
-  $scope.firstNoteRevisionForCompare = null
-  $scope.secondNoteRevisionForCompare = null
-  $scope.mergeNoteRevisionsForCompare = null
-  $scope.currentParagraphDiffDisplay = null
-  $scope.currentFirstRevisionForCompare = 'Choose...'
-  $scope.currentSecondRevisionForCompare = 'Choose...'
+  $scope.firstNoteRevisionForCompare = null;
+  $scope.secondNoteRevisionForCompare = null;
+  $scope.mergeNoteRevisionsForCompare = null;
+  $scope.currentParagraphDiffDisplay = null;
+  $scope.currentFirstRevisionForCompare = 'Choose...';
+  $scope.currentSecondRevisionForCompare = 'Choose...';
 
-  $scope.getNoteRevisionForReview = function (revision, position) {
+  $scope.getNoteRevisionForReview = function(revision, position) {
     if (position) {
       if (position === 'first') {
-        $scope.currentFirstRevisionForCompare = revision.message
+        $scope.currentFirstRevisionForCompare = revision.message;
       } else {
-        $scope.currentSecondRevisionForCompare = revision.message
+        $scope.currentSecondRevisionForCompare = revision.message;
       }
-      websocketMsgSrv.getNoteByRevisionForCompare($routeParams.noteId, revision.id, position)
+      websocketMsgSrv.getNoteByRevisionForCompare($routeParams.noteId, revision.id, position);
     }
-  }
+  };
 
   // compare revisions
-  $scope.compareRevisions = function () {
+  $scope.compareRevisions = function() {
     if ($scope.firstNoteRevisionForCompare && $scope.secondNoteRevisionForCompare) {
-      let paragraphs1 = $scope.firstNoteRevisionForCompare.note.paragraphs
-      let paragraphs2 = $scope.secondNoteRevisionForCompare.note.paragraphs
-      let added = 'added'
-      let deleted = 'deleted'
-      let compared = 'compared'
-      let merge = []
+      let paragraphs1 = $scope.firstNoteRevisionForCompare.note.paragraphs;
+      let paragraphs2 = $scope.secondNoteRevisionForCompare.note.paragraphs;
+      let added = 'added';
+      let deleted = 'deleted';
+      let compared = 'compared';
+      let merge = [];
       for (let p1 of paragraphs1) {
-        let p2 = null
+        let p2 = null;
         for (let p of paragraphs2) {
           if (p1.id === p.id) {
-            p2 = p
-            break
+            p2 = p;
+            break;
           }
         }
         if (p2 === null) {
-          merge.push({paragraph: p1, firstString: (p1.text || '').split('\n')[0], type: deleted})
+          merge.push({paragraph: p1, firstString: (p1.text || '').split('\n')[0], type: deleted});
         } else {
-          let colorClass = ''
-          let span = null
-          let text1 = p1.text || ''
-          let text2 = p2.text || ''
-
-          let diff = window.JsDiff.diffLines(text1, text2)
-          let diffHtml = document.createDocumentFragment()
-          let identical = true
-          let identicalClass = 'color-black'
-
-          diff.forEach(function (part) {
-            colorClass = part.added ? 'color-green-row' : part.removed ? 'color-red-row' : identicalClass
-            span = document.createElement('span')
-            span.className = colorClass
+          let colorClass = '';
+          let span = null;
+          let text1 = p1.text || '';
+          let text2 = p2.text || '';
+
+          let diff = window.JsDiff.diffLines(text1, text2);
+          let diffHtml = document.createDocumentFragment();
+          let identical = true;
+          let identicalClass = 'color-black';
+
+          diff.forEach(function(part) {
+            colorClass = part.added ? 'color-green-row' : part.removed ? 'color-red-row' : identicalClass;
+            span = document.createElement('span');
+            span.className = colorClass;
             if (identical && colorClass !== identicalClass) {
-              identical = false
+              identical = false;
             }
 
-            let str = part.value
+            let str = part.value;
 
             if (str[str.length - 1] !== '\n') {
-              str = str + '\n'
+              str = str + '\n';
             }
 
-            span.appendChild(document.createTextNode(str))
-            diffHtml.appendChild(span)
-          })
+            span.appendChild(document.createTextNode(str));
+            diffHtml.appendChild(span);
+          });
 
-          let pre = document.createElement('pre')
-          pre.appendChild(diffHtml)
+          let pre = document.createElement('pre');
+          pre.appendChild(diffHtml);
 
           merge.push(
             {
@@ -94,88 +94,88 @@ function RevisionsComparatorController($scope, websocketMsgSrv, $routeParams) {
               diff: pre.innerHTML,
               identical: identical,
               firstString: (p1.text || '').split('\n')[0],
-              type: compared
-            })
+              type: compared,
+            });
         }
       }
 
       for (let p2 of paragraphs2) {
-        let p1 = null
+        let p1 = null;
         for (let p of paragraphs1) {
           if (p2.id === p.id) {
-            p1 = p
-            break
+            p1 = p;
+            break;
           }
         }
         if (p1 === null) {
-          merge.push({paragraph: p2, firstString: (p2.text || '').split('\n')[0], type: added})
+          merge.push({paragraph: p2, firstString: (p2.text || '').split('\n')[0], type: added});
         }
       }
 
-      merge.sort(function (a, b) {
+      merge.sort(function(a, b) {
         if (a.type === added) {
-          return -1
+          return -1;
         }
         if (a.type === compared) {
-          return 1
+          return 1;
         }
         if (a.type === deleted) {
           if (b.type === compared) {
-            return -1
+            return -1;
           } else {
-            return 1
+            return 1;
           }
         }
-      })
+      });
 
-      $scope.mergeNoteRevisionsForCompare = merge
+      $scope.mergeNoteRevisionsForCompare = merge;
 
       if ($scope.currentParagraphDiffDisplay !== null) {
-        $scope.changeCurrentParagraphDiffDisplay($scope.currentParagraphDiffDisplay.paragraph.id)
+        $scope.changeCurrentParagraphDiffDisplay($scope.currentParagraphDiffDisplay.paragraph.id);
       }
     }
-  }
+  };
 
-  $scope.$on('noteRevisionForCompare', function (event, data) {
-    console.debug('received note revision for compare %o', data)
+  $scope.$on('noteRevisionForCompare', function(event, data) {
+    console.debug('received note revision for compare %o', data);
     if (data.note && data.position) {
       if (data.position === 'first') {
-        $scope.firstNoteRevisionForCompare = data
+        $scope.firstNoteRevisionForCompare = data;
       } else {
-        $scope.secondNoteRevisionForCompare = data
+        $scope.secondNoteRevisionForCompare = data;
       }
 
       if ($scope.firstNoteRevisionForCompare !== null && $scope.secondNoteRevisionForCompare !== null &&
         $scope.firstNoteRevisionForCompare.revisionId !== $scope.secondNoteRevisionForCompare.revisionId) {
-        $scope.compareRevisions()
+        $scope.compareRevisions();
       }
     }
-  })
+  });
 
-  $scope.formatRevisionDate = function (date) {
-    return moment.unix(date).format('MMMM Do YYYY, h:mm:ss a')
-  }
+  $scope.formatRevisionDate = function(date) {
+    return moment.unix(date).format('MMMM Do YYYY, h:mm:ss a');
+  };
 
-  $scope.changeCurrentParagraphDiffDisplay = function (paragraphId) {
+  $scope.changeCurrentParagraphDiffDisplay = function(paragraphId) {
     for (let p of $scope.mergeNoteRevisionsForCompare) {
       if (p.paragraph.id === paragraphId) {
-        $scope.currentParagraphDiffDisplay = p
-        return
+        $scope.currentParagraphDiffDisplay = p;
+        return;
       }
     }
-    $scope.currentParagraphDiffDisplay = null
-  }
+    $scope.currentParagraphDiffDisplay = null;
+  };
 }
 
 export const RevisionsComparatorComponent = {
   template: revisionsComparatorTemplate,
   controller: RevisionsComparatorController,
   bindings: {
-    noteRevisions: '<'
-  }
-}
+    noteRevisions: '<',
+  },
+};
 
 export const RevisionsComparatorModule = angular
   .module('zeppelinWebApp')
   .component('revisionsComparator', RevisionsComparatorComponent)
-  .name
+  .name;

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/save-as/browser-detect.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/save-as/browser-detect.service.js b/zeppelin-web/src/app/notebook/save-as/browser-detect.service.js
index a31e9af..0c74b45 100644
--- a/zeppelin-web/src/app/notebook/save-as/browser-detect.service.js
+++ b/zeppelin-web/src/app/notebook/save-as/browser-detect.service.js
@@ -12,28 +12,28 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').service('browserDetectService', BrowserDetectService)
+angular.module('zeppelinWebApp').service('browserDetectService', BrowserDetectService);
 
-function BrowserDetectService () {
-  this.detectIE = function () {
-    let ua = window.navigator.userAgent
-    let msie = ua.indexOf('MSIE ')
+function BrowserDetectService() {
+  this.detectIE = function() {
+    let ua = window.navigator.userAgent;
+    let msie = ua.indexOf('MSIE ');
     if (msie > 0) {
       // IE 10 or older => return version number
-      return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10)
+      return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
     }
-    let trident = ua.indexOf('Trident/')
+    let trident = ua.indexOf('Trident/');
     if (trident > 0) {
       // IE 11 => return version number
-      let rv = ua.indexOf('rv:')
-      return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10)
+      let rv = ua.indexOf('rv:');
+      return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
     }
-    let edge = ua.indexOf('Edge/')
+    let edge = ua.indexOf('Edge/');
     if (edge > 0) {
       // IE 12 (aka Edge) => return version number
-      return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10)
+      return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
     }
     // other browser
-    return false
-  }
+    return false;
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/save-as/save-as.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/save-as/save-as.service.js b/zeppelin-web/src/app/notebook/save-as/save-as.service.js
index ff463c8..72a54d1 100644
--- a/zeppelin-web/src/app/notebook/save-as/save-as.service.js
+++ b/zeppelin-web/src/app/notebook/save-as/save-as.service.js
@@ -12,45 +12,45 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').service('saveAsService', SaveAsService)
+angular.module('zeppelinWebApp').service('saveAsService', SaveAsService);
 
-function SaveAsService (browserDetectService) {
-  'ngInject'
+function SaveAsService(browserDetectService) {
+  'ngInject';
 
-  this.saveAs = function (content, filename, extension) {
-    let BOM = '\uFEFF'
+  this.saveAs = function(content, filename, extension) {
+    let BOM = '\uFEFF';
     if (browserDetectService.detectIE()) {
-      angular.element('body').append('<iframe id="SaveAsId" style="display: none"></iframe>')
-      let frameSaveAs = angular.element('body > iframe#SaveAsId')[0].contentWindow
-      content = BOM + content
-      frameSaveAs.document.open('text/json', 'replace')
-      frameSaveAs.document.write(content)
-      frameSaveAs.document.close()
-      frameSaveAs.focus()
-      let t1 = Date.now()
-      frameSaveAs.document.execCommand('SaveAs', false, filename + '.' + extension)
-      let t2 = Date.now()
+      angular.element('body').append('<iframe id="SaveAsId" style="display: none"></iframe>');
+      let frameSaveAs = angular.element('body > iframe#SaveAsId')[0].contentWindow;
+      content = BOM + content;
+      frameSaveAs.document.open('text/json', 'replace');
+      frameSaveAs.document.write(content);
+      frameSaveAs.document.close();
+      frameSaveAs.focus();
+      let t1 = Date.now();
+      frameSaveAs.document.execCommand('SaveAs', false, filename + '.' + extension);
+      let t2 = Date.now();
 
       // This means, this version of IE dosen't support auto download of a file with extension provided in param
       // falling back to ".txt"
       if (t1 === t2) {
-        frameSaveAs.document.execCommand('SaveAs', true, filename + '.txt')
+        frameSaveAs.document.execCommand('SaveAs', true, filename + '.txt');
       }
-      angular.element('body > iframe#SaveAsId').remove()
+      angular.element('body > iframe#SaveAsId').remove();
     } else {
-      let binaryData = []
-      binaryData.push(BOM)
-      binaryData.push(content)
-      content = window.URL.createObjectURL(new Blob(binaryData))
+      let binaryData = [];
+      binaryData.push(BOM);
+      binaryData.push(content);
+      content = window.URL.createObjectURL(new Blob(binaryData));
 
-      angular.element('body').append('<a id="SaveAsId"></a>')
-      let saveAsElement = angular.element('body > a#SaveAsId')
-      saveAsElement.attr('href', content)
-      saveAsElement.attr('download', filename + '.' + extension)
-      saveAsElement.attr('target', '_blank')
-      saveAsElement[0].click()
-      saveAsElement.remove()
-      window.URL.revokeObjectURL(content)
+      angular.element('body').append('<a id="SaveAsId"></a>');
+      let saveAsElement = angular.element('body > a#SaveAsId');
+      saveAsElement.attr('href', content);
+      saveAsElement.attr('download', filename + '.' + extension);
+      saveAsElement.attr('target', '_blank');
+      saveAsElement[0].click();
+      saveAsElement.remove();
+      window.URL.revokeObjectURL(content);
     }
-  }
+  };
 }


[09/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/notebook.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js
index b02b74e..05ab9fb 100644
--- a/zeppelin-web/src/app/notebook/notebook.controller.js
+++ b/zeppelin-web/src/app/notebook/notebook.controller.js
@@ -12,30 +12,30 @@
  * limitations under the License.
  */
 
-import moment from 'moment'
+import moment from 'moment';
 
-import { isParagraphRunning, } from './paragraph/paragraph.status'
+import {isParagraphRunning} from './paragraph/paragraph.status';
 
-angular.module('zeppelinWebApp').controller('NotebookCtrl', NotebookCtrl)
+angular.module('zeppelinWebApp').controller('NotebookCtrl', NotebookCtrl);
 
-function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
+function NotebookCtrl($scope, $route, $routeParams, $location, $rootScope,
                       $http, websocketMsgSrv, baseUrlSrv, $timeout, saveAsService,
                       ngToast, noteActionService, noteVarShareService, TRASH_FOLDER_ID,
                       heliumService) {
-  'ngInject'
-
-  ngToast.dismiss()
-
-  $scope.note = null
-  $scope.actionOnFormSelectionChange = true
-  $scope.hideForms = false
-  $scope.disableForms = false
-  $scope.editorToggled = false
-  $scope.tableToggled = false
-  $scope.viewOnly = false
-  $scope.showSetting = false
-  $scope.showRevisionsComparator = false
-  $scope.looknfeelOption = ['default', 'simple', 'report']
+  'ngInject';
+
+  ngToast.dismiss();
+
+  $scope.note = null;
+  $scope.actionOnFormSelectionChange = true;
+  $scope.hideForms = false;
+  $scope.disableForms = false;
+  $scope.editorToggled = false;
+  $scope.tableToggled = false;
+  $scope.viewOnly = false;
+  $scope.showSetting = false;
+  $scope.showRevisionsComparator = false;
+  $scope.looknfeelOption = ['default', 'simple', 'report'];
   $scope.cronOption = [
     {name: 'None', value: undefined},
     {name: '1m', value: '0 0/1 * * * ?'},
@@ -44,28 +44,28 @@ function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
     {name: '3h', value: '0 0 0/3 * * ?'},
     {name: '6h', value: '0 0 0/6 * * ?'},
     {name: '12h', value: '0 0 0/12 * * ?'},
-    {name: '1d', value: '0 0 0 * * ?'}
-  ]
+    {name: '1d', value: '0 0 0 * * ?'},
+  ];
 
   $scope.formatRevisionDate = function(date) {
-    return moment.unix(date).format('MMMM Do YYYY, h:mm a')
-  }
+    return moment.unix(date).format('MMMM Do YYYY, h:mm a');
+  };
 
-  $scope.interpreterSettings = []
-  $scope.interpreterBindings = []
-  $scope.isNoteDirty = null
-  $scope.saveTimer = null
-  $scope.paragraphWarningDialog = {}
+  $scope.interpreterSettings = [];
+  $scope.interpreterBindings = [];
+  $scope.isNoteDirty = null;
+  $scope.saveTimer = null;
+  $scope.paragraphWarningDialog = {};
 
-  let connectedOnce = false
-  let isRevisionPath = function (path) {
-    let pattern = new RegExp('^.*\/notebook\/[a-zA-Z0-9_]*\/revision\/[a-zA-Z0-9_]*')
-    return pattern.test(path)
-  }
+  let connectedOnce = false;
+  let isRevisionPath = function(path) {
+    let pattern = new RegExp('^.*\/notebook\/[a-zA-Z0-9_]*\/revision\/[a-zA-Z0-9_]*');
+    return pattern.test(path);
+  };
 
-  $scope.noteRevisions = []
-  $scope.currentRevision = 'Head'
-  $scope.revisionView = isRevisionPath($location.path())
+  $scope.noteRevisions = [];
+  $scope.currentRevision = 'Head';
+  $scope.revisionView = isRevisionPath($location.path());
 
   $scope.search = {
     searchText: '',
@@ -78,48 +78,48 @@ function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
     currentOccurrence: 0,
     searchBoxOpened: false,
     searchBoxWidth: 350,
-    left: '0px'
-  }
-  let currentSearchParagraph = 0
+    left: '0px',
+  };
+  let currentSearchParagraph = 0;
 
-  $scope.$watch('note', function (value) {
-    let title
+  $scope.$watch('note', function(value) {
+    let title;
     if (value) {
-      title = value.name.substr(value.name.lastIndexOf('/') + 1, value.name.length)
-      title += ' - Zeppelin'
+      title = value.name.substr(value.name.lastIndexOf('/') + 1, value.name.length);
+      title += ' - Zeppelin';
     } else {
-      title = 'Zeppelin'
+      title = 'Zeppelin';
     }
-    $rootScope.pageTitle = title
-  }, true)
+    $rootScope.pageTitle = title;
+  }, true);
 
-  $scope.$on('setConnectedStatus', function (event, param) {
+  $scope.$on('setConnectedStatus', function(event, param) {
     if (connectedOnce && param) {
-      initNotebook()
+      initNotebook();
     }
-    connectedOnce = true
-  })
+    connectedOnce = true;
+  });
 
-  $scope.getCronOptionNameFromValue = function (value) {
+  $scope.getCronOptionNameFromValue = function(value) {
     if (!value) {
-      return ''
+      return '';
     }
 
     for (let o in $scope.cronOption) {
       if ($scope.cronOption[o].value === value) {
-        return $scope.cronOption[o].name
+        return $scope.cronOption[o].name;
       }
     }
-    return value
-  }
+    return value;
+  };
 
-  $scope.blockAnonUsers = function () {
-    let zeppelinVersion = $rootScope.zeppelinVersion
-    let url = 'https://zeppelin.apache.org/docs/' + zeppelinVersion + '/security/notebook_authorization.html'
+  $scope.blockAnonUsers = function() {
+    let zeppelinVersion = $rootScope.zeppelinVersion;
+    let url = 'https://zeppelin.apache.org/docs/' + zeppelinVersion + '/security/notebook_authorization.html';
     let content = 'Only authenticated user can set the permission.' +
       '<a data-toggle="tooltip" data-placement="top" title="Learn more" target="_blank" href=' + url + '>' +
       '<i class="icon-question" />' +
-      '</a>'
+      '</a>';
     BootstrapDialog.show({
       closable: false,
       closeByBackdrop: false,
@@ -128,866 +128,878 @@ function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
       message: content,
       buttons: [{
         label: 'Close',
-        action: function (dialog) {
-          dialog.close()
-        }
-      }]
-    })
-  }
+        action: function(dialog) {
+          dialog.close();
+        },
+      }],
+    });
+  };
 
   /** Init the new controller */
-  const initNotebook = function () {
-    noteVarShareService.clear()
+  const initNotebook = function() {
+    noteVarShareService.clear();
     if ($routeParams.revisionId) {
-      websocketMsgSrv.getNoteByRevision($routeParams.noteId, $routeParams.revisionId)
+      websocketMsgSrv.getNoteByRevision($routeParams.noteId, $routeParams.revisionId);
     } else {
-      websocketMsgSrv.getNote($routeParams.noteId)
+      websocketMsgSrv.getNote($routeParams.noteId);
     }
-    websocketMsgSrv.listRevisionHistory($routeParams.noteId)
-    let currentRoute = $route.current
+    websocketMsgSrv.listRevisionHistory($routeParams.noteId);
+    let currentRoute = $route.current;
     if (currentRoute) {
       setTimeout(
-        function () {
-          let routeParams = currentRoute.params
-          let $id = angular.element('#' + routeParams.paragraph + '_container')
+        function() {
+          let routeParams = currentRoute.params;
+          let $id = angular.element('#' + routeParams.paragraph + '_container');
 
           if ($id.length > 0) {
             // adjust for navbar
-            let top = $id.offset().top - 103
-            angular.element('html, body').scrollTo({top: top, left: 0})
+            let top = $id.offset().top - 103;
+            angular.element('html, body').scrollTo({top: top, left: 0});
           }
         },
         1000
-      )
+      );
     }
-  }
+  };
 
-  initNotebook()
+  initNotebook();
 
-  $scope.focusParagraphOnClick = function (clickEvent) {
+  $scope.focusParagraphOnClick = function(clickEvent) {
     if (!$scope.note) {
-      return
+      return;
     }
     for (let i = 0; i < $scope.note.paragraphs.length; i++) {
-      let paragraphId = $scope.note.paragraphs[i].id
+      let paragraphId = $scope.note.paragraphs[i].id;
       if (jQuery.contains(angular.element('#' + paragraphId + '_container')[0], clickEvent.target)) {
-        $scope.$broadcast('focusParagraph', paragraphId, 0, null, true)
-        break
+        $scope.$broadcast('focusParagraph', paragraphId, 0, null, true);
+        break;
       }
     }
-  }
+  };
 
   // register mouseevent handler for focus paragraph
-  document.addEventListener('click', $scope.focusParagraphOnClick)
+  document.addEventListener('click', $scope.focusParagraphOnClick);
 
-  let keyboardShortcut = function (keyEvent) {
+  let keyboardShortcut = function(keyEvent) {
     // handle keyevent
     if (!$scope.viewOnly && !$scope.revisionView) {
-      $scope.$broadcast('keyEvent', keyEvent)
+      $scope.$broadcast('keyEvent', keyEvent);
     }
-  }
+  };
 
-  $scope.keydownEvent = function (keyEvent) {
+  $scope.keydownEvent = function(keyEvent) {
     if ((keyEvent.ctrlKey || keyEvent.metaKey) && String.fromCharCode(keyEvent.which).toLowerCase() === 's') {
-      keyEvent.preventDefault()
+      keyEvent.preventDefault();
     }
 
-    keyboardShortcut(keyEvent)
-  }
+    keyboardShortcut(keyEvent);
+  };
 
   // register mouseevent handler for focus paragraph
-  document.addEventListener('keydown', $scope.keydownEvent)
+  document.addEventListener('keydown', $scope.keydownEvent);
 
-  $scope.paragraphOnDoubleClick = function (paragraphId) {
-    $scope.$broadcast('doubleClickParagraph', paragraphId)
-  }
+  $scope.paragraphOnDoubleClick = function(paragraphId) {
+    $scope.$broadcast('doubleClickParagraph', paragraphId);
+  };
 
   // Move the note to trash and go back to the main page
-  $scope.moveNoteToTrash = function (noteId) {
-    noteActionService.moveNoteToTrash(noteId, true)
-  }
+  $scope.moveNoteToTrash = function(noteId) {
+    noteActionService.moveNoteToTrash(noteId, true);
+  };
 
   // Remove the note permanently if it's in the trash
-  $scope.removeNote = function (noteId) {
-    noteActionService.removeNote(noteId, true)
-  }
+  $scope.removeNote = function(noteId) {
+    noteActionService.removeNote(noteId, true);
+  };
 
-  $scope.isTrash = function (note) {
-    return note ? note.name.split('/')[0] === TRASH_FOLDER_ID : false
-  }
+  $scope.isTrash = function(note) {
+    return note ? note.name.split('/')[0] === TRASH_FOLDER_ID : false;
+  };
 
   // Export notebook
-  $scope.exportNote = function () {
-    let jsonContent = JSON.stringify($scope.note)
-    saveAsService.saveAs(jsonContent, $scope.note.name, 'json')
-  }
+  $scope.exportNote = function() {
+    let jsonContent = JSON.stringify($scope.note);
+    saveAsService.saveAs(jsonContent, $scope.note.name, 'json');
+  };
 
   // Clone note
-  $scope.cloneNote = function (noteId) {
+  $scope.cloneNote = function(noteId) {
     BootstrapDialog.confirm({
       closable: true,
       title: '',
       message: 'Do you want to clone this note?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.cloneNote(noteId)
-          $location.path('/')
+          websocketMsgSrv.cloneNote(noteId);
+          $location.path('/');
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
   // checkpoint/commit notebook
-  $scope.checkpointNote = function (commitMessage) {
+  $scope.checkpointNote = function(commitMessage) {
     BootstrapDialog.confirm({
       closable: true,
       title: '',
       message: 'Commit note to current repository?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.checkpointNote($routeParams.noteId, commitMessage)
+          websocketMsgSrv.checkpointNote($routeParams.noteId, commitMessage);
         }
-      }
-    })
-    document.getElementById('note.checkpoint.message').value = ''
-  }
+      },
+    });
+    document.getElementById('note.checkpoint.message').value = '';
+  };
 
   // set notebook head to given revision
-  $scope.setNoteRevision = function () {
+  $scope.setNoteRevision = function() {
     BootstrapDialog.confirm({
       closable: true,
       title: '',
       message: 'Set notebook head to current revision?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          websocketMsgSrv.setNoteRevision($routeParams.noteId, $routeParams.revisionId)
+          websocketMsgSrv.setNoteRevision($routeParams.noteId, $routeParams.revisionId);
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
   $scope.preVisibleRevisionsComparator = function() {
-    $scope.mergeNoteRevisionsForCompare = null
-    $scope.firstNoteRevisionForCompare = null
-    $scope.secondNoteRevisionForCompare = null
-    $scope.currentFirstRevisionForCompare = 'Choose...'
-    $scope.currentSecondRevisionForCompare = 'Choose...'
-    $scope.$apply()
-  }
-
-  $scope.$on('listRevisionHistory', function (event, data) {
-    console.debug('received list of revisions %o', data)
-    $scope.noteRevisions = data.revisionList
+    $scope.mergeNoteRevisionsForCompare = null;
+    $scope.firstNoteRevisionForCompare = null;
+    $scope.secondNoteRevisionForCompare = null;
+    $scope.currentFirstRevisionForCompare = 'Choose...';
+    $scope.currentSecondRevisionForCompare = 'Choose...';
+    $scope.$apply();
+  };
+
+  $scope.$on('listRevisionHistory', function(event, data) {
+    console.debug('received list of revisions %o', data);
+    $scope.noteRevisions = data.revisionList;
     if ($scope.noteRevisions.length === 0 || $scope.noteRevisions[0].id !== 'Head') {
       $scope.noteRevisions.splice(0, 0, {
         id: 'Head',
-        message: 'Head'
-      })
+        message: 'Head',
+      });
     }
     if ($routeParams.revisionId) {
-      let index = _.findIndex($scope.noteRevisions, {'id': $routeParams.revisionId})
+      let index = _.findIndex($scope.noteRevisions, {'id': $routeParams.revisionId});
       if (index > -1) {
-        $scope.currentRevision = $scope.noteRevisions[index].message
+        $scope.currentRevision = $scope.noteRevisions[index].message;
       }
     }
-  })
+  });
 
-  $scope.$on('noteRevision', function (event, data) {
-    console.log('received note revision %o', data)
+  $scope.$on('noteRevision', function(event, data) {
+    console.log('received note revision %o', data);
     if (data.note) {
-      $scope.note = data.note
-      initializeLookAndFeel()
+      $scope.note = data.note;
+      initializeLookAndFeel();
     } else {
-      $location.path('/')
+      $location.path('/');
     }
-  })
+  });
 
-  $scope.$on('setNoteRevisionResult', function (event, data) {
-    console.log('received set note revision result %o', data)
+  $scope.$on('setNoteRevisionResult', function(event, data) {
+    console.log('received set note revision result %o', data);
     if (data.status) {
-      $location.path('/notebook/' + $routeParams.noteId)
+      $location.path('/notebook/' + $routeParams.noteId);
     }
-  })
+  });
 
-  $scope.visitRevision = function (revision) {
+  $scope.visitRevision = function(revision) {
     if (revision.id) {
       if (revision.id === 'Head') {
-        $location.path('/notebook/' + $routeParams.noteId)
+        $location.path('/notebook/' + $routeParams.noteId);
       } else {
-        $location.path('/notebook/' + $routeParams.noteId + '/revision/' + revision.id)
+        $location.path('/notebook/' + $routeParams.noteId + '/revision/' + revision.id);
       }
     } else {
       ngToast.danger({content: 'There is a problem with this Revision',
         verticalPosition: 'top',
-        dismissOnTimeout: false
-      })
+        dismissOnTimeout: false,
+      });
     }
-  }
+  };
 
-  $scope.runAllParagraphs = function (noteId) {
+  $scope.runAllParagraphs = function(noteId) {
     BootstrapDialog.confirm({
       closable: true,
       title: '',
       message: 'Run all paragraphs?',
-      callback: function (result) {
+      callback: function(result) {
         if (result) {
-          const paragraphs = $scope.note.paragraphs.map(p => {
+          const paragraphs = $scope.note.paragraphs.map((p) => {
             return {
               id: p.id,
               title: p.title,
               paragraph: p.text,
               config: p.config,
-              params: p.settings.params
-            }
-          })
-          websocketMsgSrv.runAllParagraphs(noteId, paragraphs)
+              params: p.settings.params,
+            };
+          });
+          websocketMsgSrv.runAllParagraphs(noteId, paragraphs);
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  $scope.saveNote = function () {
+  $scope.saveNote = function() {
     if ($scope.note && $scope.note.paragraphs) {
-      _.forEach($scope.note.paragraphs, function (par) {
+      _.forEach($scope.note.paragraphs, function(par) {
         angular
           .element('#' + par.id + '_paragraphColumn_main')
           .scope()
-          .saveParagraph(par)
-      })
-      $scope.isNoteDirty = null
+          .saveParagraph(par);
+      });
+      $scope.isNoteDirty = null;
     }
-  }
+  };
 
-  $scope.clearAllParagraphOutput = function (noteId) {
-    noteActionService.clearAllParagraphOutput(noteId)
-  }
+  $scope.clearAllParagraphOutput = function(noteId) {
+    noteActionService.clearAllParagraphOutput(noteId);
+  };
 
-  $scope.toggleAllEditor = function () {
+  $scope.toggleAllEditor = function() {
     if ($scope.editorToggled) {
-      $scope.$broadcast('openEditor')
+      $scope.$broadcast('openEditor');
     } else {
-      $scope.$broadcast('closeEditor')
+      $scope.$broadcast('closeEditor');
     }
-    $scope.editorToggled = !$scope.editorToggled
-  }
+    $scope.editorToggled = !$scope.editorToggled;
+  };
 
-  $scope.showAllEditor = function () {
-    $scope.$broadcast('openEditor')
-  }
+  $scope.showAllEditor = function() {
+    $scope.$broadcast('openEditor');
+  };
 
-  $scope.hideAllEditor = function () {
-    $scope.$broadcast('closeEditor')
-  }
+  $scope.hideAllEditor = function() {
+    $scope.$broadcast('closeEditor');
+  };
 
-  $scope.toggleAllTable = function () {
+  $scope.toggleAllTable = function() {
     if ($scope.tableToggled) {
-      $scope.$broadcast('openTable')
+      $scope.$broadcast('openTable');
     } else {
-      $scope.$broadcast('closeTable')
+      $scope.$broadcast('closeTable');
     }
-    $scope.tableToggled = !$scope.tableToggled
-  }
+    $scope.tableToggled = !$scope.tableToggled;
+  };
 
-  $scope.showAllTable = function () {
-    $scope.$broadcast('openTable')
-  }
+  $scope.showAllTable = function() {
+    $scope.$broadcast('openTable');
+  };
 
-  $scope.hideAllTable = function () {
-    $scope.$broadcast('closeTable')
-  }
+  $scope.hideAllTable = function() {
+    $scope.$broadcast('closeTable');
+  };
 
   /**
    * @returns {boolean} true if one more paragraphs are running. otherwise return false.
    */
-  $scope.isNoteRunning = function () {
-    if (!$scope.note) { return false }
+  $scope.isNoteRunning = function() {
+    if (!$scope.note) {
+      return false;
+    }
 
     for (let i = 0; i < $scope.note.paragraphs.length; i++) {
       if (isParagraphRunning($scope.note.paragraphs[i])) {
-        return true
+        return true;
       }
     }
 
-    return false
-  }
+    return false;
+  };
 
-  $scope.killSaveTimer = function () {
+  $scope.killSaveTimer = function() {
     if ($scope.saveTimer) {
-      $timeout.cancel($scope.saveTimer)
-      $scope.saveTimer = null
+      $timeout.cancel($scope.saveTimer);
+      $scope.saveTimer = null;
     }
-  }
+  };
 
-  $scope.startSaveTimer = function () {
-    $scope.killSaveTimer()
-    $scope.isNoteDirty = true
+  $scope.startSaveTimer = function() {
+    $scope.killSaveTimer();
+    $scope.isNoteDirty = true;
     // console.log('startSaveTimer called ' + $scope.note.id);
-    $scope.saveTimer = $timeout(function () {
-      $scope.saveNote()
-    }, 10000)
-  }
+    $scope.saveTimer = $timeout(function() {
+      $scope.saveNote();
+    }, 10000);
+  };
 
-  $scope.setLookAndFeel = function (looknfeel) {
-    $scope.note.config.looknfeel = looknfeel
+  $scope.setLookAndFeel = function(looknfeel) {
+    $scope.note.config.looknfeel = looknfeel;
     if ($scope.revisionView === true) {
-      $rootScope.$broadcast('setLookAndFeel', $scope.note.config.looknfeel)
+      $rootScope.$broadcast('setLookAndFeel', $scope.note.config.looknfeel);
     } else {
-      $scope.setConfig()
+      $scope.setConfig();
     }
-  }
+  };
 
   /** Set cron expression for this note **/
-  $scope.setCronScheduler = function (cronExpr) {
+  $scope.setCronScheduler = function(cronExpr) {
     if (cronExpr) {
       if (!$scope.note.config.cronExecutingUser) {
-        $scope.note.config.cronExecutingUser = $rootScope.ticket.principal
+        $scope.note.config.cronExecutingUser = $rootScope.ticket.principal;
       }
     } else {
-      $scope.note.config.cronExecutingUser = ''
+      $scope.note.config.cronExecutingUser = '';
     }
-    $scope.note.config.cron = cronExpr
-    $scope.setConfig()
-  }
+    $scope.note.config.cron = cronExpr;
+    $scope.setConfig();
+  };
 
   /** Set the username of the user to be used to execute all notes in notebook **/
-  $scope.setCronExecutingUser = function (cronExecutingUser) {
-    $scope.note.config.cronExecutingUser = cronExecutingUser
-    $scope.setConfig()
-  }
+  $scope.setCronExecutingUser = function(cronExecutingUser) {
+    $scope.note.config.cronExecutingUser = cronExecutingUser;
+    $scope.setConfig();
+  };
 
   /** Set release resource for this note **/
-  $scope.setReleaseResource = function (value) {
-    $scope.note.config.releaseresource = value
-    $scope.setConfig()
-  }
+  $scope.setReleaseResource = function(value) {
+    $scope.note.config.releaseresource = value;
+    $scope.setConfig();
+  };
 
   /** Update note config **/
-  $scope.setConfig = function (config) {
+  $scope.setConfig = function(config) {
     if (config) {
-      $scope.note.config = config
+      $scope.note.config = config;
     }
-    websocketMsgSrv.updateNote($scope.note.id, $scope.note.name, $scope.note.config)
-  }
+    websocketMsgSrv.updateNote($scope.note.id, $scope.note.name, $scope.note.config);
+  };
 
   /** Update the note name */
-  $scope.updateNoteName = function (newName) {
-    const trimmedNewName = newName.trim()
+  $scope.updateNoteName = function(newName) {
+    const trimmedNewName = newName.trim();
     if (trimmedNewName.length > 0 && $scope.note.name !== trimmedNewName) {
-      $scope.note.name = trimmedNewName
-      websocketMsgSrv.renameNote($scope.note.id, $scope.note.name)
+      $scope.note.name = trimmedNewName;
+      websocketMsgSrv.renameNote($scope.note.id, $scope.note.name);
     }
-  }
+  };
 
-  const initializeLookAndFeel = function () {
+  const initializeLookAndFeel = function() {
     if (!$scope.note.config.looknfeel) {
-      $scope.note.config.looknfeel = 'default'
+      $scope.note.config.looknfeel = 'default';
     } else {
-      $scope.viewOnly = $scope.note.config.looknfeel === 'report' ? true : false
+      $scope.viewOnly = $scope.note.config.looknfeel === 'report' ? true : false;
     }
 
     if ($scope.note.paragraphs && $scope.note.paragraphs[0]) {
-      $scope.note.paragraphs[0].focus = true
-    }
-    $rootScope.$broadcast('setLookAndFeel', $scope.note.config.looknfeel)
-  }
-
-  let cleanParagraphExcept = function (paragraphId, note) {
-    let noteCopy = {}
-    noteCopy.id = note.id
-    noteCopy.name = note.name
-    noteCopy.config = note.config
-    noteCopy.info = note.info
-    noteCopy.paragraphs = []
+      $scope.note.paragraphs[0].focus = true;
+    }
+    $rootScope.$broadcast('setLookAndFeel', $scope.note.config.looknfeel);
+  };
+
+  let cleanParagraphExcept = function(paragraphId, note) {
+    let noteCopy = {};
+    noteCopy.id = note.id;
+    noteCopy.name = note.name;
+    noteCopy.config = note.config;
+    noteCopy.info = note.info;
+    noteCopy.paragraphs = [];
     for (let i = 0; i < note.paragraphs.length; i++) {
       if (note.paragraphs[i].id === paragraphId) {
-        noteCopy.paragraphs[0] = note.paragraphs[i]
+        noteCopy.paragraphs[0] = note.paragraphs[i];
         if (!noteCopy.paragraphs[0].config) {
-          noteCopy.paragraphs[0].config = {}
+          noteCopy.paragraphs[0].config = {};
         }
-        noteCopy.paragraphs[0].config.editorHide = true
-        noteCopy.paragraphs[0].config.tableHide = false
-        break
+        noteCopy.paragraphs[0].config.editorHide = true;
+        noteCopy.paragraphs[0].config.tableHide = false;
+        break;
       }
     }
-    return noteCopy
-  }
+    return noteCopy;
+  };
 
-  let addPara = function (paragraph, index) {
-    $scope.note.paragraphs.splice(index, 0, paragraph)
-    $scope.note.paragraphs.map(para => {
+  let addPara = function(paragraph, index) {
+    $scope.note.paragraphs.splice(index, 0, paragraph);
+    $scope.note.paragraphs.map((para) => {
       if (para.id === paragraph.id) {
-        para.focus = true
+        para.focus = true;
 
         // we need `$timeout` since angular DOM might not be initialized
-        $timeout(() => { $scope.$broadcast('focusParagraph', para.id, 0, null, false) })
+        $timeout(() => {
+          $scope.$broadcast('focusParagraph', para.id, 0, null, false);
+        });
       }
-    })
-  }
+    });
+  };
 
-  let removePara = function (paragraphId) {
-    let removeIdx
-    _.each($scope.note.paragraphs, function (para, idx) {
+  let removePara = function(paragraphId) {
+    let removeIdx;
+    _.each($scope.note.paragraphs, function(para, idx) {
       if (para.id === paragraphId) {
-        removeIdx = idx
+        removeIdx = idx;
       }
-    })
-    return $scope.note.paragraphs.splice(removeIdx, 1)
-  }
+    });
+    return $scope.note.paragraphs.splice(removeIdx, 1);
+  };
 
-  $scope.$on('addParagraph', function (event, paragraph, index) {
+  $scope.$on('addParagraph', function(event, paragraph, index) {
     if ($scope.paragraphUrl || $scope.revisionView === true) {
-      return
+      return;
     }
-    addPara(paragraph, index)
-  })
+    addPara(paragraph, index);
+  });
 
-  $scope.$on('removeParagraph', function (event, paragraphId) {
+  $scope.$on('removeParagraph', function(event, paragraphId) {
     if ($scope.paragraphUrl || $scope.revisionView === true) {
-      return
+      return;
     }
-    removePara(paragraphId)
-  })
+    removePara(paragraphId);
+  });
 
-  $scope.$on('moveParagraph', function (event, paragraphId, newIdx) {
+  $scope.$on('moveParagraph', function(event, paragraphId, newIdx) {
     if ($scope.revisionView === true) {
-      return
+      return;
     }
-    let removedPara = removePara(paragraphId)
+    let removedPara = removePara(paragraphId);
     if (removedPara && removedPara.length === 1) {
-      addPara(removedPara[0], newIdx)
+      addPara(removedPara[0], newIdx);
     }
-  })
+  });
 
-  $scope.$on('updateNote', function (event, name, config, info) {
+  $scope.$on('updateNote', function(event, name, config, info) {
     /** update Note name */
     if (name !== $scope.note.name) {
-      console.log('change note name to : %o', $scope.note.name)
-      $scope.note.name = name
+      console.log('change note name to : %o', $scope.note.name);
+      $scope.note.name = name;
     }
-    $scope.note.config = config
-    $scope.note.info = info
-    initializeLookAndFeel()
-  })
+    $scope.note.config = config;
+    $scope.note.info = info;
+    initializeLookAndFeel();
+  });
 
-  let getInterpreterBindings = function () {
-    websocketMsgSrv.getInterpreterBindings($scope.note.id)
-  }
+  let getInterpreterBindings = function() {
+    websocketMsgSrv.getInterpreterBindings($scope.note.id);
+  };
 
-  $scope.$on('interpreterBindings', function (event, data) {
-    $scope.interpreterBindings = data.interpreterBindings
-    $scope.interpreterBindingsOrig = angular.copy($scope.interpreterBindings) // to check dirty
+  $scope.$on('interpreterBindings', function(event, data) {
+    $scope.interpreterBindings = data.interpreterBindings;
+    $scope.interpreterBindingsOrig = angular.copy($scope.interpreterBindings); // to check dirty
 
-    let selected = false
-    let key
-    let setting
+    let selected = false;
+    let key;
+    let setting;
 
     for (key in $scope.interpreterBindings) {
-      setting = $scope.interpreterBindings[key]
-      if (setting.selected) {
-        selected = true
-        break
+      if($scope.interpreterBindings.hasOwnProperty(key)) {
+        setting = $scope.interpreterBindings[key];
+        if (setting.selected) {
+          selected = true;
+          break;
+        }
       }
     }
 
     if (!selected) {
       // make default selection
-      let selectedIntp = {}
+      let selectedIntp = {};
       for (key in $scope.interpreterBindings) {
-        setting = $scope.interpreterBindings[key]
-        if (!selectedIntp[setting.name]) {
-          setting.selected = true
-          selectedIntp[setting.name] = true
+        if ($scope.interpreterBindings.hasOwnProperty(key)) {
+          setting = $scope.interpreterBindings[key];
+          if (!selectedIntp[setting.name]) {
+            setting.selected = true;
+            selectedIntp[setting.name] = true;
+          }
         }
       }
-      $scope.showSetting = true
+      $scope.showSetting = true;
     }
-  })
+  });
 
   $scope.interpreterSelectionListeners = {
-    accept: function (sourceItemHandleScope, destSortableScope) { return true },
-    itemMoved: function (event) {},
-    orderChanged: function (event) {}
-  }
+    accept: function(sourceItemHandleScope, destSortableScope) {
+      return true;
+    },
+    itemMoved: function(event) {},
+    orderChanged: function(event) {},
+  };
 
   $scope.closeAdditionalBoards = function() {
-    $scope.closeSetting()
-    $scope.closePermissions()
-    $scope.closeRevisionsComparator()
-  }
+    $scope.closeSetting();
+    $scope.closePermissions();
+    $scope.closeRevisionsComparator();
+  };
 
-  $scope.openSetting = function () {
-    $scope.showSetting = true
-    getInterpreterBindings()
-  }
+  $scope.openSetting = function() {
+    $scope.showSetting = true;
+    getInterpreterBindings();
+  };
 
-  $scope.closeSetting = function () {
+  $scope.closeSetting = function() {
     if (isSettingDirty()) {
       BootstrapDialog.confirm({
         closable: true,
         title: '',
         message: 'Interpreter setting changes will be discarded.',
-        callback: function (result) {
+        callback: function(result) {
           if (result) {
-            $scope.$apply(function () {
-              $scope.showSetting = false
-            })
+            $scope.$apply(function() {
+              $scope.showSetting = false;
+            });
           }
-        }
-      })
+        },
+      });
     } else {
-      $scope.showSetting = false
+      $scope.showSetting = false;
     }
-  }
+  };
 
-  $scope.saveSetting = function () {
-    let selectedSettingIds = []
+  $scope.saveSetting = function() {
+    let selectedSettingIds = [];
     for (let no in $scope.interpreterBindings) {
-      let setting = $scope.interpreterBindings[no]
-      if (setting.selected) {
-        selectedSettingIds.push(setting.id)
+      if ($scope.interpreterBindings.hasOwnProperty(no)) {
+        let setting = $scope.interpreterBindings[no];
+        if (setting.selected) {
+          selectedSettingIds.push(setting.id);
+        }
       }
     }
-    websocketMsgSrv.saveInterpreterBindings($scope.note.id, selectedSettingIds)
-    console.log('Interpreter bindings %o saved', selectedSettingIds)
+    websocketMsgSrv.saveInterpreterBindings($scope.note.id, selectedSettingIds);
+    console.log('Interpreter bindings %o saved', selectedSettingIds);
 
-    _.forEach($scope.note.paragraphs, function (n, key) {
-      let regExp = /^\s*%/g
+    _.forEach($scope.note.paragraphs, function(n, key) {
+      let regExp = /^\s*%/g;
       if (n.text && !regExp.exec(n.text)) {
-        $scope.$broadcast('saveInterpreterBindings', n.id)
+        $scope.$broadcast('saveInterpreterBindings', n.id);
       }
-    })
+    });
 
-    $scope.showSetting = false
-  }
+    $scope.showSetting = false;
+  };
 
-  $scope.toggleSetting = function () {
+  $scope.toggleSetting = function() {
     if ($scope.showSetting) {
-      $scope.closeSetting()
+      $scope.closeSetting();
     } else {
-      $scope.closeAdditionalBoards()
-      $scope.openSetting()
-      angular.element('html, body').animate({ scrollTop: 0 }, 'slow')
+      $scope.closeAdditionalBoards();
+      $scope.openSetting();
+      angular.element('html, body').animate({scrollTop: 0}, 'slow');
     }
-  }
+  };
 
-  $scope.openRevisionsComparator = function () {
-    $scope.showRevisionsComparator = true
-  }
+  $scope.openRevisionsComparator = function() {
+    $scope.showRevisionsComparator = true;
+  };
 
-  $scope.closeRevisionsComparator = function () {
-    $scope.showRevisionsComparator = false
-  }
+  $scope.closeRevisionsComparator = function() {
+    $scope.showRevisionsComparator = false;
+  };
 
-  $scope.toggleRevisionsComparator = function () {
+  $scope.toggleRevisionsComparator = function() {
     if ($scope.showRevisionsComparator) {
-      $scope.closeRevisionsComparator()
+      $scope.closeRevisionsComparator();
     } else {
-      $scope.closeAdditionalBoards()
-      $scope.openRevisionsComparator()
-      angular.element('html, body').animate({ scrollTop: 0 }, 'slow')
+      $scope.closeAdditionalBoards();
+      $scope.openRevisionsComparator();
+      angular.element('html, body').animate({scrollTop: 0}, 'slow');
     }
-  }
+  };
 
-  let getPermissions = function (callback) {
+  let getPermissions = function(callback) {
     $http.get(baseUrlSrv.getRestApiBase() + '/notebook/' + $scope.note.id + '/permissions')
-    .success(function (data, status, headers, config) {
-      $scope.permissions = data.body
-      $scope.permissionsOrig = angular.copy($scope.permissions) // to check dirty
+    .success(function(data, status, headers, config) {
+      $scope.permissions = data.body;
+      $scope.permissionsOrig = angular.copy($scope.permissions); // to check dirty
 
       let selectJson = {
         tokenSeparators: [',', ' '],
         ajax: {
-          url: function (params) {
+          url: function(params) {
             if (!params.term) {
-              return false
+              return false;
             }
-            return baseUrlSrv.getRestApiBase() + '/security/userlist/' + params.term
+            return baseUrlSrv.getRestApiBase() + '/security/userlist/' + params.term;
           },
           delay: 250,
-          processResults: function (data, params) {
-            let results = []
+          processResults: function(data, params) {
+            let results = [];
 
             if (data.body.users.length !== 0) {
-              let users = []
+              let users = [];
               for (let len = 0; len < data.body.users.length; len++) {
                 users.push({
                   'id': data.body.users[len],
-                  'text': data.body.users[len]
-                })
+                  'text': data.body.users[len],
+                });
               }
               results.push({
                 'text': 'Users :',
-                'children': users
-              })
+                'children': users,
+              });
             }
             if (data.body.roles.length !== 0) {
-              let roles = []
+              let roles = [];
               for (let len = 0; len < data.body.roles.length; len++) {
                 roles.push({
                   'id': data.body.roles[len],
-                  'text': data.body.roles[len]
-                })
+                  'text': data.body.roles[len],
+                });
               }
               results.push({
                 'text': 'Roles :',
-                'children': roles
-              })
+                'children': roles,
+              });
             }
             return {
               results: results,
               pagination: {
-                more: false
-              }
-            }
+                more: false,
+              },
+            };
           },
-          cache: false
+          cache: false,
         },
         width: ' ',
         tags: true,
-        minimumInputLength: 3
-      }
-
-      $scope.setIamOwner()
-      angular.element('#selectOwners').select2(selectJson)
-      angular.element('#selectReaders').select2(selectJson)
-      angular.element('#selectRunners').select2(selectJson)
-      angular.element('#selectWriters').select2(selectJson)
+        minimumInputLength: 3,
+      };
+
+      $scope.setIamOwner();
+      angular.element('#selectOwners').select2(selectJson);
+      angular.element('#selectReaders').select2(selectJson);
+      angular.element('#selectRunners').select2(selectJson);
+      angular.element('#selectWriters').select2(selectJson);
       if (callback) {
-        callback()
+        callback();
       }
     })
-    .error(function (data, status, headers, config) {
+    .error(function(data, status, headers, config) {
       if (status !== 0) {
-        console.log('Error %o %o', status, data.message)
+        console.log('Error %o %o', status, data.message);
       }
-    })
-  }
+    });
+  };
 
-  $scope.openPermissions = function () {
-    $scope.showPermissions = true
-    getPermissions()
-  }
+  $scope.openPermissions = function() {
+    $scope.showPermissions = true;
+    getPermissions();
+  };
 
-  $scope.closePermissions = function () {
+  $scope.closePermissions = function() {
     if (isPermissionsDirty()) {
       BootstrapDialog.confirm({
         closable: true,
         title: '',
         message: 'Changes will be discarded.',
-        callback: function (result) {
+        callback: function(result) {
           if (result) {
-            $scope.$apply(function () {
-              $scope.showPermissions = false
-            })
+            $scope.$apply(function() {
+              $scope.showPermissions = false;
+            });
           }
-        }
-      })
+        },
+      });
     } else {
-      $scope.showPermissions = false
+      $scope.showPermissions = false;
     }
-  }
+  };
 
-  function convertPermissionsToArray () {
-    $scope.permissions.owners = angular.element('#selectOwners').val()
-    $scope.permissions.readers = angular.element('#selectReaders').val()
-    $scope.permissions.runners = angular.element('#selectRunners').val()
-    $scope.permissions.writers = angular.element('#selectWriters').val()
-    angular.element('.permissionsForm select').find('option:not([is-select2="false"])').remove()
+  function convertPermissionsToArray() {
+    $scope.permissions.owners = angular.element('#selectOwners').val();
+    $scope.permissions.readers = angular.element('#selectReaders').val();
+    $scope.permissions.runners = angular.element('#selectRunners').val();
+    $scope.permissions.writers = angular.element('#selectWriters').val();
+    angular.element('.permissionsForm select').find('option:not([is-select2="false"])').remove();
   }
 
   $scope.hasMatches = function() {
-    return $scope.search.occurrencesCount > 0
-  }
+    return $scope.search.occurrencesCount > 0;
+  };
 
   const markAllOccurrences = function() {
-    $scope.search.occurrencesCount = 0
-    $scope.search.occurrencesHidden = false
-    currentSearchParagraph = 0
-    $scope.$broadcast('markAllOccurrences', $scope.search.searchText)
-    $scope.search.currentOccurrence = $scope.search.occurrencesCount > 0 ? 1 : 0
-  }
+    $scope.search.occurrencesCount = 0;
+    $scope.search.occurrencesHidden = false;
+    currentSearchParagraph = 0;
+    $scope.$broadcast('markAllOccurrences', $scope.search.searchText);
+    $scope.search.currentOccurrence = $scope.search.occurrencesCount > 0 ? 1 : 0;
+  };
 
   $scope.markAllOccurrencesAndHighlightFirst = function() {
-    $scope.search.needHighlightFirst = true
-    markAllOccurrences()
-  }
+    $scope.search.needHighlightFirst = true;
+    markAllOccurrences();
+  };
 
   const increaseCurrentOccurence = function() {
-    ++$scope.search.currentOccurrence
+    ++$scope.search.currentOccurrence;
     if ($scope.search.currentOccurrence > $scope.search.occurrencesCount) {
-      $scope.search.currentOccurrence = 1
+      $scope.search.currentOccurrence = 1;
     }
-  }
+  };
 
   const decreaseCurrentOccurence = function() {
-    --$scope.search.currentOccurrence
+    --$scope.search.currentOccurrence;
     if ($scope.search.currentOccurrence === 0) {
-      $scope.search.currentOccurrence = $scope.search.occurrencesCount
+      $scope.search.currentOccurrence = $scope.search.occurrencesCount;
     }
-  }
+  };
 
   const sendNextOccurrenceMessage = function() {
     if ($scope.search.occurrencesCount === 0) {
-      markAllOccurrences()
+      markAllOccurrences();
       if ($scope.search.occurrencesCount === 0) {
-        return
+        return;
       }
     }
     if ($scope.search.occurrencesHidden) {
-      markAllOccurrences()
+      markAllOccurrences();
     }
-    $scope.$broadcast('nextOccurrence', $scope.note.paragraphs[currentSearchParagraph].id)
-  }
+    $scope.$broadcast('nextOccurrence', $scope.note.paragraphs[currentSearchParagraph].id);
+  };
 
   const sendPrevOccurrenceMessage = function() {
     if ($scope.search.occurrencesCount === 0) {
-      markAllOccurrences()
+      markAllOccurrences();
       if ($scope.search.occurrencesCount === 0) {
-        return
+        return;
       }
     }
     if ($scope.search.occurrencesHidden) {
-      markAllOccurrences()
-      currentSearchParagraph = $scope.note.paragraphs.length - 1
+      markAllOccurrences();
+      currentSearchParagraph = $scope.note.paragraphs.length - 1;
     }
-    $scope.$broadcast('prevOccurrence', $scope.note.paragraphs[currentSearchParagraph].id)
-  }
+    $scope.$broadcast('prevOccurrence', $scope.note.paragraphs[currentSearchParagraph].id);
+  };
 
   const increaseCurrentSearchParagraph = function() {
-    ++currentSearchParagraph
+    ++currentSearchParagraph;
     if (currentSearchParagraph >= $scope.note.paragraphs.length) {
-      currentSearchParagraph = 0
+      currentSearchParagraph = 0;
     }
-  }
+  };
 
-  const decreaseCurrentSearchParagraph = function () {
-    --currentSearchParagraph
+  const decreaseCurrentSearchParagraph = function() {
+    --currentSearchParagraph;
     if (currentSearchParagraph === -1) {
-      currentSearchParagraph = $scope.note.paragraphs.length - 1
+      currentSearchParagraph = $scope.note.paragraphs.length - 1;
     }
-  }
+  };
 
   $scope.$on('occurrencesExists', function(event, count) {
-    $scope.search.occurrencesCount += count
+    $scope.search.occurrencesCount += count;
     if ($scope.search.needHighlightFirst) {
-      sendNextOccurrenceMessage()
-      $scope.search.needHighlightFirst = false
+      sendNextOccurrenceMessage();
+      $scope.search.needHighlightFirst = false;
     }
-  })
+  });
 
   $scope.nextOccurrence = function() {
-    sendNextOccurrenceMessage()
-    increaseCurrentOccurence()
-  }
+    sendNextOccurrenceMessage();
+    increaseCurrentOccurence();
+  };
 
   $scope.$on('noNextOccurrence', function(event) {
-    increaseCurrentSearchParagraph()
-    sendNextOccurrenceMessage()
-  })
+    increaseCurrentSearchParagraph();
+    sendNextOccurrenceMessage();
+  });
 
   $scope.prevOccurrence = function() {
-    sendPrevOccurrenceMessage()
-    decreaseCurrentOccurence()
-  }
+    sendPrevOccurrenceMessage();
+    decreaseCurrentOccurence();
+  };
 
   $scope.$on('noPrevOccurrence', function(event) {
-    decreaseCurrentSearchParagraph()
-    sendPrevOccurrenceMessage()
-  })
+    decreaseCurrentSearchParagraph();
+    sendPrevOccurrenceMessage();
+  });
 
   $scope.$on('editorClicked', function() {
-    $scope.search.occurrencesHidden = true
-    $scope.$broadcast('unmarkAll')
-  })
+    $scope.search.occurrencesHidden = true;
+    $scope.$broadcast('unmarkAll');
+  });
 
   $scope.replace = function() {
     if ($scope.search.occurrencesCount === 0) {
-      $scope.markAllOccurrencesAndHighlightFirst()
+      $scope.markAllOccurrencesAndHighlightFirst();
       if ($scope.search.occurrencesCount === 0) {
-        return
+        return;
       }
     }
     if ($scope.search.occurrencesHidden) {
-      $scope.markAllOccurrencesAndHighlightFirst()
-      return
+      $scope.markAllOccurrencesAndHighlightFirst();
+      return;
     }
-    $scope.$broadcast('replaceCurrent', $scope.search.searchText, $scope.search.replaceText)
+    $scope.$broadcast('replaceCurrent', $scope.search.searchText, $scope.search.replaceText);
     if ($scope.search.needToSendNextOccurrenceAfterReplace) {
-      sendNextOccurrenceMessage()
-      $scope.search.needToSendNextOccurrenceAfterReplace = false
+      sendNextOccurrenceMessage();
+      $scope.search.needToSendNextOccurrenceAfterReplace = false;
     }
-  }
+  };
 
   $scope.$on('occurrencesCountChanged', function(event, cnt) {
-    $scope.search.occurrencesCount += cnt
+    $scope.search.occurrencesCount += cnt;
     if ($scope.search.occurrencesCount === 0) {
-      $scope.search.currentOccurrence = 0
+      $scope.search.currentOccurrence = 0;
     } else {
-      $scope.search.currentOccurrence += cnt + 1
+      $scope.search.currentOccurrence += cnt + 1;
       if ($scope.search.currentOccurrence > $scope.search.occurrencesCount) {
-        $scope.search.currentOccurrence = 1
+        $scope.search.currentOccurrence = 1;
       }
     }
-  })
+  });
 
   $scope.replaceAll = function() {
     if ($scope.search.occurrencesCount === 0) {
-      return
+      return;
     }
     if ($scope.search.occurrencesHidden) {
-      $scope.markAllOccurrencesAndHighlightFirst()
+      $scope.markAllOccurrencesAndHighlightFirst();
     }
-    $scope.$broadcast('replaceAll', $scope.search.searchText, $scope.search.replaceText)
-    $scope.markAllOccurrencesAndHighlightFirst()
-  }
+    $scope.$broadcast('replaceAll', $scope.search.searchText, $scope.search.replaceText);
+    $scope.markAllOccurrencesAndHighlightFirst();
+  };
 
   $scope.$on('noNextOccurrenceAfterReplace', function() {
-    $scope.search.occurrencesCount = 0
-    $scope.search.needHighlightFirst = false
-    $scope.search.needToSendNextOccurrenceAfterReplace = false
-    $scope.$broadcast('checkOccurrences')
-    increaseCurrentSearchParagraph()
+    $scope.search.occurrencesCount = 0;
+    $scope.search.needHighlightFirst = false;
+    $scope.search.needToSendNextOccurrenceAfterReplace = false;
+    $scope.$broadcast('checkOccurrences');
+    increaseCurrentSearchParagraph();
     if ($scope.search.occurrencesCount > 0) {
-      $scope.search.needToSendNextOccurrenceAfterReplace = true
+      $scope.search.needToSendNextOccurrenceAfterReplace = true;
     }
-  })
+  });
 
   $scope.onPressOnFindInput = function(event) {
     if (event.keyCode === 13) {
-      $scope.nextOccurrence()
+      $scope.nextOccurrence();
     }
-  }
+  };
 
   let makeSearchBoxVisible = function() {
     if ($scope.search.searchBoxOpened) {
-      $scope.search.searchBoxOpened = false
-      console.log('make 0')
-      $scope.search.left = '0px'
+      $scope.search.searchBoxOpened = false;
+      console.log('make 0');
+      $scope.search.left = '0px';
     } else {
-      $scope.search.searchBoxOpened = true
-      let searchGroupRect = angular.element('#searchGroup')[0].getBoundingClientRect()
-      console.log('make visible')
-      let dropdownRight = searchGroupRect.left + $scope.search.searchBoxWidth
-      console.log(dropdownRight + ' ' + window.innerWidth)
+      $scope.search.searchBoxOpened = true;
+      let searchGroupRect = angular.element('#searchGroup')[0].getBoundingClientRect();
+      console.log('make visible');
+      let dropdownRight = searchGroupRect.left + $scope.search.searchBoxWidth;
+      console.log(dropdownRight + ' ' + window.innerWidth);
       if (dropdownRight + 5 > window.innerWidth) {
-        $scope.search.left = window.innerWidth - dropdownRight - 15 + 'px'
+        $scope.search.left = window.innerWidth - dropdownRight - 15 + 'px';
       }
     }
-  }
+  };
 
   $scope.searchClicked = function() {
-    makeSearchBoxVisible()
-  }
+    makeSearchBoxVisible();
+  };
 
   $scope.$on('toggleSearchBox', function() {
-    let elem = angular.element('#searchGroup')
+    let elem = angular.element('#searchGroup');
     if ($scope.search.searchBoxOpened) {
-      elem.removeClass('open')
+      elem.removeClass('open');
     } else {
-      elem.addClass('open')
+      elem.addClass('open');
     }
-    $timeout(makeSearchBoxVisible())
-  })
+    $timeout(makeSearchBoxVisible());
+  });
 
   $scope.restartInterpreter = function(interpreter) {
     const thisConfirm = BootstrapDialog.confirm({
@@ -999,37 +1011,37 @@ function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
       callback: function(result) {
         if (result) {
           let payload = {
-            'noteId': $scope.note.id
-          }
+            'noteId': $scope.note.id,
+          };
 
-          thisConfirm.$modalFooter.find('button').addClass('disabled')
+          thisConfirm.$modalFooter.find('button').addClass('disabled');
           thisConfirm.$modalFooter.find('button:contains("OK")')
-            .html('<i class="fa fa-circle-o-notch fa-spin"></i> Saving Setting')
+            .html('<i class="fa fa-circle-o-notch fa-spin"></i> Saving Setting');
 
           $http.put(baseUrlSrv.getRestApiBase() + '/interpreter/setting/restart/' + interpreter.id, payload)
             .success(function(data, status, headers, config) {
-              let index = _.findIndex($scope.interpreterSettings, {'id': interpreter.id})
-              $scope.interpreterSettings[index] = data.body
-              thisConfirm.close()
-            }).error(function (data, status, headers, config) {
-              thisConfirm.close()
-              console.log('Error %o %o', status, data.message)
+              let index = _.findIndex($scope.interpreterSettings, {'id': interpreter.id});
+              $scope.interpreterSettings[index] = data.body;
+              thisConfirm.close();
+            }).error(function(data, status, headers, config) {
+              thisConfirm.close();
+              console.log('Error %o %o', status, data.message);
               BootstrapDialog.show({
                 title: 'Error restart interpreter.',
-                message: data.message
-              })
-            })
-          return false
+                message: data.message,
+              });
+            });
+          return false;
         }
-      }
-    })
-  }
+      },
+    });
+  };
 
-  $scope.savePermissions = function () {
+  $scope.savePermissions = function() {
     if ($scope.isAnonymous || $rootScope.ticket.principal.trim().length === 0) {
-      $scope.blockAnonUsers()
+      $scope.blockAnonUsers();
     }
-    convertPermissionsToArray()
+    convertPermissionsToArray();
     if ($scope.isOwnerEmpty()) {
       BootstrapDialog.show({
         closable: false,
@@ -1040,43 +1052,43 @@ function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
           {
             label: 'Set',
             action: function(dialog) {
-              dialog.close()
-              $scope.permissions.owners = [$rootScope.ticket.principal]
-              $scope.setPermissions()
-            }
+              dialog.close();
+              $scope.permissions.owners = [$rootScope.ticket.principal];
+              $scope.setPermissions();
+            },
           },
           {
             label: 'Cancel',
             action: function(dialog) {
-              dialog.close()
-              $scope.openPermissions()
-            }
-          }
-        ]
-      })
+              dialog.close();
+              $scope.openPermissions();
+            },
+          },
+        ],
+      });
     } else {
-      $scope.setPermissions()
+      $scope.setPermissions();
     }
-  }
+  };
 
   $scope.setPermissions = function() {
     $http.put(baseUrlSrv.getRestApiBase() + '/notebook/' + $scope.note.id + '/permissions',
       $scope.permissions, {withCredentials: true})
-    .success(function (data, status, headers, config) {
-      getPermissions(function () {
-        console.log('Note permissions %o saved', $scope.permissions)
+    .success(function(data, status, headers, config) {
+      getPermissions(function() {
+        console.log('Note permissions %o saved', $scope.permissions);
         BootstrapDialog.alert({
           closable: true,
           title: 'Permissions Saved Successfully',
           message: 'Owners : ' + $scope.permissions.owners + '\n\n' + 'Readers : ' +
            $scope.permissions.readers + '\n\n' + 'Runners : ' + $scope.permissions.runners +
-           '\n\n' + 'Writers  : ' + $scope.permissions.writers
-        })
-        $scope.showPermissions = false
-      })
+           '\n\n' + 'Writers  : ' + $scope.permissions.writers,
+        });
+        $scope.showPermissions = false;
+      });
     })
-    .error(function (data, status, headers, config) {
-      console.log('Error %o %o', status, data.message)
+    .error(function(data, status, headers, config) {
+      console.log('Error %o %o', status, data.message);
       BootstrapDialog.show({
         closable: false,
         closeByBackdrop: false,
@@ -1086,362 +1098,366 @@ function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
         buttons: [
           {
             label: 'Login',
-            action: function (dialog) {
-              dialog.close()
+            action: function(dialog) {
+              dialog.close();
               angular.element('#loginModal').modal({
-                show: 'true'
-              })
-            }
+                show: 'true',
+              });
+            },
           },
           {
             label: 'Cancel',
-            action: function (dialog) {
-              dialog.close()
-              $location.path('/')
-            }
-          }
-        ]
-      })
-    })
-  }
-
-  $scope.togglePermissions = function () {
-    let principal = $rootScope.ticket.principal
-    $scope.isAnonymous = principal === 'anonymous' ? true : false
+            action: function(dialog) {
+              dialog.close();
+              $location.path('/');
+            },
+          },
+        ],
+      });
+    });
+  };
+
+  $scope.togglePermissions = function() {
+    let principal = $rootScope.ticket.principal;
+    $scope.isAnonymous = principal === 'anonymous' ? true : false;
     if (!!principal && $scope.isAnonymous) {
-      $scope.blockAnonUsers()
+      $scope.blockAnonUsers();
     } else {
       if ($scope.showPermissions) {
-        $scope.closePermissions()
-        angular.element('#selectOwners').select2({})
-        angular.element('#selectReaders').select2({})
-        angular.element('#selectRunners').select2({})
-        angular.element('#selectWriters').select2({})
+        $scope.closePermissions();
+        angular.element('#selectOwners').select2({});
+        angular.element('#selectReaders').select2({});
+        angular.element('#selectRunners').select2({});
+        angular.element('#selectWriters').select2({});
       } else {
-        $scope.closeAdditionalBoards()
-        $scope.openPermissions()
+        $scope.closeAdditionalBoards();
+        $scope.openPermissions();
       }
     }
-  }
+  };
 
-  $scope.setIamOwner = function () {
+  $scope.setIamOwner = function() {
     if ($scope.permissions.owners.length > 0 &&
       _.indexOf($scope.permissions.owners, $rootScope.ticket.principal) < 0) {
-      $scope.isOwner = false
-      return false
+      $scope.isOwner = false;
+      return false;
     }
-    $scope.isOwner = true
-    return true
-  }
+    $scope.isOwner = true;
+    return true;
+  };
 
-  $scope.toggleNotePersonalizedMode = function () {
-    let personalizedMode = $scope.note.config.personalizedMode
+  $scope.toggleNotePersonalizedMode = function() {
+    let personalizedMode = $scope.note.config.personalizedMode;
     if ($scope.isOwner) {
       BootstrapDialog.confirm({
         closable: true,
         title: 'Setting the result display',
-        message: function (dialog) {
-          let modeText = $scope.note.config.personalizedMode === 'true' ? 'collaborate' : 'personalize'
-          return 'Do you want to <span class="text-info">' + modeText + '</span> your analysis?'
+        message: function(dialog) {
+          let modeText = $scope.note.config.personalizedMode === 'true' ? 'collaborate' : 'personalize';
+          return 'Do you want to <span class="text-info">' + modeText + '</span> your analysis?';
         },
-        callback: function (result) {
+        callback: function(result) {
           if (result) {
             if ($scope.note.config.personalizedMode === undefined) {
-              $scope.note.config.personalizedMode = 'false'
+              $scope.note.config.personalizedMode = 'false';
             }
-            $scope.note.config.personalizedMode = personalizedMode === 'true' ? 'false' : 'true'
-            websocketMsgSrv.updatePersonalizedMode($scope.note.id, $scope.note.config.personalizedMode)
+            $scope.note.config.personalizedMode = personalizedMode === 'true' ? 'false' : 'true';
+            websocketMsgSrv.updatePersonalizedMode($scope.note.id, $scope.note.config.personalizedMode);
           }
-        }
-      })
+        },
+      });
     }
-  }
+  };
 
-  const isSettingDirty = function () {
+  const isSettingDirty = function() {
     if (angular.equals($scope.interpreterBindings, $scope.interpreterBindingsOrig)) {
-      return false
+      return false;
     } else {
-      return true
+      return true;
     }
-  }
+  };
 
-  const isPermissionsDirty = function () {
+  const isPermissionsDirty = function() {
     if (angular.equals($scope.permissions, $scope.permissionsOrig)) {
-      return false
+      return false;
     } else {
-      return true
+      return true;
     }
-  }
+  };
 
-  angular.element(document).click(function () {
-    angular.element('.ace_autocomplete').hide()
-  })
+  angular.element(document).click(function() {
+    angular.element('.ace_autocomplete').hide();
+  });
 
   $scope.isOwnerEmpty = function() {
     if ($scope.permissions.owners.length > 0) {
       for (let i = 0; i < $scope.permissions.owners.length; i++) {
         if ($scope.permissions.owners[i].trim().length > 0) {
-          return false
+          return false;
         } else if (i === $scope.permissions.owners.length - 1) {
-          return true
+          return true;
         }
       }
     } else {
-      return true
+      return true;
     }
-  }
+  };
 
   /*
    ** $scope.$on functions below
    */
 
-  $scope.$on('runAllAbove', function (event, paragraph, isNeedConfirm) {
-    let allParagraphs = $scope.note.paragraphs
-    let toRunParagraphs = []
+  $scope.$on('runAllAbove', function(event, paragraph, isNeedConfirm) {
+    let allParagraphs = $scope.note.paragraphs;
+    let toRunParagraphs = [];
 
     for (let i = 0; allParagraphs[i] !== paragraph; i++) {
-      if (i === allParagraphs.length - 1) { return } // if paragraph not in array of all paragraphs
-      toRunParagraphs.push(allParagraphs[i])
+      if (i === allParagraphs.length - 1) {
+        return;
+      } // if paragraph not in array of all paragraphs
+      toRunParagraphs.push(allParagraphs[i]);
     }
 
-    const paragraphs = toRunParagraphs.map(p => {
+    const paragraphs = toRunParagraphs.map((p) => {
       return {
         id: p.id,
         title: p.title,
         paragraph: p.text,
         config: p.config,
-        params: p.settings.params
-      }
-    })
+        params: p.settings.params,
+      };
+    });
 
     if (!isNeedConfirm) {
-      websocketMsgSrv.runAllParagraphs($scope.note.id, paragraphs)
+      websocketMsgSrv.runAllParagraphs($scope.note.id, paragraphs);
     } else {
       BootstrapDialog.confirm({
         closable: true,
         title: '',
         message: 'Run all above?',
-        callback: function (result) {
+        callback: function(result) {
           if (result) {
-            websocketMsgSrv.runAllParagraphs($scope.note.id, paragraphs)
+            websocketMsgSrv.runAllParagraphs($scope.note.id, paragraphs);
           }
-        }
-      })
+        },
+      });
     }
 
-    $scope.saveCursorPosition(paragraph)
-  })
+    $scope.saveCursorPosition(paragraph);
+  });
 
-  $scope.$on('runAllBelowAndCurrent', function (event, paragraph, isNeedConfirm) {
-    let allParagraphs = $scope.note.paragraphs
-    let toRunParagraphs = []
+  $scope.$on('runAllBelowAndCurrent', function(event, paragraph, isNeedConfirm) {
+    let allParagraphs = $scope.note.paragraphs;
+    let toRunParagraphs = [];
 
     for (let i = allParagraphs.length - 1; allParagraphs[i] !== paragraph; i--) {
-      if (i < 0) { return } // if paragraph not in array of all paragraphs
-      toRunParagraphs.push(allParagraphs[i])
+      if (i < 0) {
+        return;
+      } // if paragraph not in array of all paragraphs
+      toRunParagraphs.push(allParagraphs[i]);
     }
 
-    toRunParagraphs.push(paragraph)
-    toRunParagraphs.reverse()
+    toRunParagraphs.push(paragraph);
+    toRunParagraphs.reverse();
 
-    const paragraphs = toRunParagraphs.map(p => {
+    const paragraphs = toRunParagraphs.map((p) => {
       return {
         id: p.id,
         title: p.title,
         paragraph: p.text,
         config: p.config,
-        params: p.settings.params
-      }
-    })
+        params: p.settings.params,
+      };
+    });
 
     if (!isNeedConfirm) {
-      websocketMsgSrv.runAllParagraphs($scope.note.id, paragraphs)
+      websocketMsgSrv.runAllParagraphs($scope.note.id, paragraphs);
     } else {
       BootstrapDialog.confirm({
         closable: true,
         title: '',
         message: 'Run current and all below?',
-        callback: function (result) {
+        callback: function(result) {
           if (result) {
-            websocketMsgSrv.runAllParagraphs($scope.note.id, paragraphs)
+            websocketMsgSrv.runAllParagraphs($scope.note.id, paragraphs);
           }
-        }
-      })
+        },
+      });
     }
 
-    $scope.saveCursorPosition(paragraph)
-  })
+    $scope.saveCursorPosition(paragraph);
+  });
 
-  $scope.saveCursorPosition = function (paragraph) {
+  $scope.saveCursorPosition = function(paragraph) {
     let angParagEditor = angular
       .element('#' + paragraph.id + '_paragraphColumn_main')
-      .scope().editor
-    let col = angParagEditor.selection.lead.column
-    let row = angParagEditor.selection.lead.row
-    $scope.$broadcast('focusParagraph', paragraph.id, row + 1, col)
-  }
+      .scope().editor;
+    let col = angParagEditor.selection.lead.column;
+    let row = angParagEditor.selection.lead.row;
+    $scope.$broadcast('focusParagraph', paragraph.id, row + 1, col);
+  };
 
-  $scope.$on('setConnectedStatus', function (event, param) {
+  $scope.$on('setConnectedStatus', function(event, param) {
     if (connectedOnce && param) {
-      initNotebook()
+      initNotebook();
     }
-    connectedOnce = true
-  })
+    connectedOnce = true;
+  });
 
-  $scope.$on('moveParagraphUp', function (event, paragraph) {
-    let newIndex = -1
+  $scope.$on('moveParagraphUp', function(event, paragraph) {
+    let newIndex = -1;
     for (let i = 0; i < $scope.note.paragraphs.length; i++) {
       if ($scope.note.paragraphs[i].id === paragraph.id) {
-        newIndex = i - 1
-        break
+        newIndex = i - 1;
+        break;
       }
     }
     if (newIndex < 0 || newIndex >= $scope.note.paragraphs.length) {
-      return
+      return;
     }
     // save dirtyText of moving paragraphs.
-    let prevParagraph = $scope.note.paragraphs[newIndex]
+    let prevParagraph = $scope.note.paragraphs[newIndex];
     angular
       .element('#' + paragraph.id + '_paragraphColumn_main')
       .scope()
-      .saveParagraph(paragraph)
+      .saveParagraph(paragraph);
     angular
       .element('#' + prevParagraph.id + '_paragraphColumn_main')
       .scope()
-      .saveParagraph(prevParagraph)
-    websocketMsgSrv.moveParagraph(paragraph.id, newIndex)
-  })
+      .saveParagraph(prevParagraph);
+    websocketMsgSrv.moveParagraph(paragraph.id, newIndex);
+  });
 
-  $scope.$on('moveParagraphDown', function (event, paragraph) {
-    let newIndex = -1
+  $scope.$on('moveParagraphDown', function(event, paragraph) {
+    let newIndex = -1;
     for (let i = 0; i < $scope.note.paragraphs.length; i++) {
       if ($scope.note.paragraphs[i].id === paragraph.id) {
-        newIndex = i + 1
-        break
+        newIndex = i + 1;
+        break;
       }
     }
 
     if (newIndex < 0 || newIndex >= $scope.note.paragraphs.length) {
-      return
+      return;
     }
     // save dirtyText of moving paragraphs.
-    let nextParagraph = $scope.note.paragraphs[newIndex]
+    let nextParagraph = $scope.note.paragraphs[newIndex];
     angular
       .element('#' + paragraph.id + '_paragraphColumn_main')
       .scope()
-      .saveParagraph(paragraph)
+      .saveParagraph(paragraph);
     angular
       .element('#' + nextParagraph.id + '_paragraphColumn_main')
       .scope()
-      .saveParagraph(nextParagraph)
-    websocketMsgSrv.moveParagraph(paragraph.id, newIndex)
-  })
+      .saveParagraph(nextParagraph);
+    websocketMsgSrv.moveParagraph(paragraph.id, newIndex);
+  });
 
-  $scope.$on('moveFocusToPreviousParagraph', function (event, currentParagraphId) {
-    let focus = false
+  $scope.$on('moveFocusToPreviousParagraph', function(event, currentParagraphId) {
+    let focus = false;
     for (let i = $scope.note.paragraphs.length - 1; i >= 0; i--) {
       if (focus === false) {
         if ($scope.note.paragraphs[i].id === currentParagraphId) {
-          focus = true
-          continue
+          focus = true;
+          continue;
         }
       } else {
-        $scope.$broadcast('focusParagraph', $scope.note.paragraphs[i].id, -1)
-        break
+        $scope.$broadcast('focusParagraph', $scope.note.paragraphs[i].id, -1);
+        break;
       }
     }
-  })
+  });
 
-  $scope.$on('moveFocusToNextParagraph', function (event, currentParagraphId) {
-    let focus = false
+  $scope.$on('moveFocusToNextParagraph', function(event, currentParagraphId) {
+    let focus = false;
     for (let i = 0; i < $scope.note.paragraphs.length; i++) {
       if (focus === false) {
         if ($scope.note.paragraphs[i].id === currentParagraphId) {
-          focus = true
-          continue
+          focus = true;
+          continue;
         }
       } else {
-        $scope.$broadcast('focusParagraph', $scope.note.paragraphs[i].id, 0)
-        break
+        $scope.$broadcast('focusParagraph', $scope.note.paragraphs[i].id, 0);
+        break;
       }
     }
-  })
+  });
 
-  $scope.$on('insertParagraph', function (event, paragraphId, position) {
+  $scope.$on('insertParagraph', function(event, paragraphId, position) {
     if ($scope.revisionView === true) {
-      return
+      return;
     }
-    let newIndex = -1
+    let newIndex = -1;
     for (let i = 0; i < $scope.note.paragraphs.length; i++) {
       if ($scope.note.paragraphs[i].id === paragraphId) {
         // determine position of where to add new paragraph; default is below
         if (position === 'above') {
-          newIndex = i
+          newIndex = i;
         } else {
-          newIndex = i + 1
+          newIndex = i + 1;
         }
-        break
+        break;
       }
     }
 
     if (newIndex < 0 || newIndex > $scope.note.paragraphs.length) {
-      return
+      return;
     }
-    websocketMsgSrv.insertParagraph(newIndex)
-  })
+    websocketMsgSrv.insertParagraph(newIndex);
+  });
 
-  $scope.$on('setNoteContent', function (event, note) {
+  $scope.$on('setNoteContent', function(event, note) {
     if (note === undefined) {
-      $location.path('/')
+      $location.path('/');
     }
 
-    $scope.note = note
+    $scope.note = note;
 
-    $scope.paragraphUrl = $routeParams.paragraphId
-    $scope.asIframe = $routeParams.asIframe
+    $scope.paragraphUrl = $routeParams.paragraphId;
+    $scope.asIframe = $routeParams.asIframe;
     if ($scope.paragraphUrl) {
-      $scope.note = cleanParagraphExcept($scope.paragraphUrl, $scope.note)
-      $scope.$broadcast('$unBindKeyEvent', $scope.$unBindKeyEvent)
-      $rootScope.$broadcast('setIframe', $scope.asIframe)
-      initializeLookAndFeel()
-      return
+      $scope.note = cleanParagraphExcept($scope.paragraphUrl, $scope.note);
+      $scope.$broadcast('$unBindKeyEvent', $scope.$unBindKeyEvent);
+      $rootScope.$broadcast('setIframe', $scope.asIframe);
+      initializeLookAndFeel();
+      return;
     }
 
-    initializeLookAndFeel()
+    initializeLookAndFeel();
 
     // open interpreter binding setting when there're none selected
-    getInterpreterBindings()
-    getPermissions()
-    let isPersonalized = $scope.note.config.personalizedMode
-    isPersonalized = isPersonalized === undefined ? 'false' : isPersonalized
-    $scope.note.config.personalizedMode = isPersonalized
-  })
-
-  $scope.$on('$routeChangeStart', function (event, next, current) {
+    getInterpreterBindings();
+    getPermissions();
+    let isPersonalized = $scope.note.config.personalizedMode;
+    isPersonalized = isPersonalized === undefined ? 'false' : isPersonalized;
+    $scope.note.config.personalizedMode = isPersonalized;
+  });
+
+  $scope.$on('$routeChangeStart', function(event, next, current) {
     if (!$scope.note || !$scope.note.paragraphs) {
-      return
+      return;
     }
     if ($scope.note && $scope.note.paragraphs) {
-      $scope.note.paragraphs.map(par => {
+      $scope.note.paragraphs.map((par) => {
         if ($scope.allowLeave === true) {
-          return
+          return;
         }
         let thisScope = angular.element(
-          '#' + par.id + '_paragraphColumn_main').scope()
+          '#' + par.id + '_paragraphColumn_main').scope();
 
         if (thisScope.dirtyText === undefined ||
           thisScope.originalText === undefined ||
           thisScope.dirtyText === thisScope.originalText) {
-          return true
+          return true;
         } else {
-          event.preventDefault()
-          $scope.showParagraphWarning(next)
+          event.preventDefault();
+          $scope.showParagraphWarning(next);
         }
-      })
+      });
     }
-  })
+  });
 
-  $scope.showParagraphWarning = function (next) {
+  $scope.showParagraphWarning = function(next) {
     if ($scope.paragraphWarningDialog.opened !== true) {
       $scope.paragraphWarningDialog = BootstrapDialog.show({
         closable: false,
@@ -1451,62 +1467,62 @@ function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
         message: 'Changes that you have made will not be saved.',
         buttons: [{
           label: 'Stay',
-          action: function (dialog) {
-            dialog.close()
-          }
+          action: function(dialog) {
+            dialog.close();
+          },
         }, {
           label: 'Leave',
-          action: function (dialog) {
-            dialog.close()
-            let locationToRedirect = next['$$route']['originalPath']
-            Object.keys(next.pathParams).map(key => {
+          action: function(dialog) {
+            dialog.close();
+            let locationToRedirect = next['$$route']['originalPath'];
+            Object.keys(next.pathParams).map((key) => {
               locationToRedirect = locationToRedirect.replace(':' + key,
-                next.pathParams[key])
-            })
-            $scope.allowLeave = true
-            $location.path(locationToRedirect)
-          }
-        }]
-      })
+                next.pathParams[key]);
+            });
+            $scope.allowLeave = true;
+            $location.path(locationToRedirect);
+          },
+        }],
+      });
     }
-  }
+  };
 
-  $scope.$on('saveNoteForms', function (event, data) {
-    $scope.note.noteForms = data.formsData.forms
-    $scope.note.noteParams = data.formsData.params
-  })
+  $scope.$on('saveNoteForms', function(event, data) {
+    $scope.note.noteForms = data.formsData.forms;
+    $scope.note.noteParams = data.formsData.params;
+  });
 
   $scope.isShowNoteForms = function() {
     if ($scope.note && !angular.equals({}, $scope.note.noteForms)) {
-      return true
+      return true;
     }
-    return false
-  }
+    return false;
+  };
 
-  $scope.saveNoteForms = function () {
-    websocketMsgSrv.saveNoteForms($scope.note)
-  }
+  $scope.saveNoteForms = function() {
+    websocketMsgSrv.saveNoteForms($scope.note);
+  };
 
-  $scope.removeNoteForms = function (formName) {
-    websocketMsgSrv.removeNoteForms($scope.note, formName)
-  }
+  $scope.removeNoteForms = function(formName) {
+    websocketMsgSrv.removeNoteForms($scope.note, formName);
+  };
 
-  $scope.$on('$destroy', function () {
-    angular.element(window).off('beforeunload')
-    $scope.killSaveTimer()
-    $scope.saveNote()
+  $scope.$on('$destroy', function() {
+    angular.element(window).off('beforeunload');
+    $scope.killSaveTimer();
+    $scope.saveNote();
 
-    document.removeEventListener('click', $scope.focusParagraphOnClick)
-    document.removeEventListener('keydown', $scope.keyboardShortcut)
-  })
+    document.removeEventListener('click', $scope.focusParagraphOnClick);
+    document.removeEventListener('keydown', $scope.keyboardShortcut);
+  });
 
-  $scope.$on('$unBindKeyEvent', function () {
-    document.removeEventListener('click', $scope.focusParagraphOnClick)
-    document.removeEventListener('keydown', $scope.keyboardShortcut)
-  })
+  $scope.$on('$unBindKeyEvent', function() {
+    document.removeEventListener('click', $scope.focusParagraphOnClick);
+    document.removeEventListener('keydown', $scope.keyboardShortcut);
+  });
 
-  angular.element(window).bind('resize', function () {
-    const actionbarHeight = document.getElementById('actionbar').lastElementChild.clientHeight
-    angular.element(document.getElementById('content')).css('padding-top', actionbarHeight - 20)
-  })
+  angular.element(window).bind('resize', function() {
+    const actionbarHeight = document.getElementById('actionbar').lastElementChild.clientHeight;
+    angular.element(document.getElementById('content')).css('padding-top', actionbarHeight - 20);
+  });
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/notebook.controller.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/notebook.controller.test.js b/zeppelin-web/src/app/notebook/notebook.controller.test.js
index f393d2c..be9f956 100644
--- a/zeppelin-web/src/app/notebook/notebook.controller.test.js
+++ b/zeppelin-web/src/app/notebook/notebook.controller.test.js
@@ -1,139 +1,139 @@
-describe('Controller: NotebookCtrl', function () {
-  beforeEach(angular.mock.module('zeppelinWebApp'))
+describe('Controller: NotebookCtrl', function() {
+  beforeEach(angular.mock.module('zeppelinWebApp'));
 
-  let scope
+  let scope;
 
   let websocketMsgSrvMock = {
-    getNote: function () {},
-    listRevisionHistory: function () {},
-    getInterpreterBindings: function () {},
-    updateNote: function () {},
-    renameNote: function () {}
-  }
+    getNote: function() {},
+    listRevisionHistory: function() {},
+    getInterpreterBindings: function() {},
+    updateNote: function() {},
+    renameNote: function() {},
+  };
 
   let baseUrlSrvMock = {
-    getRestApiBase: function () {
-      return 'http://localhost:8080'
-    }
-  }
+    getRestApiBase: function() {
+      return 'http://localhost:8080';
+    },
+  };
 
   let noteMock = {
     id: 1,
     name: 'my note',
     config: {},
-  }
+  };
 
-  beforeEach(inject(function ($controller, $rootScope) {
-    scope = $rootScope.$new()
+  beforeEach(inject(function($controller, $rootScope) {
+    scope = $rootScope.$new();
     $controller('NotebookCtrl', {
       $scope: scope,
       websocketMsgSrv: websocketMsgSrvMock,
-      baseUrlSrv: baseUrlSrvMock
-    })
-  }))
+      baseUrlSrv: baseUrlSrvMock,
+    });
+  }));
 
-  beforeEach(function () {
-    scope.note = noteMock
-  })
+  beforeEach(function() {
+    scope.note = noteMock;
+  });
 
   let functions = ['getCronOptionNameFromValue', 'removeNote', 'runAllParagraphs', 'saveNote', 'toggleAllEditor',
     'showAllEditor', 'hideAllEditor', 'toggleAllTable', 'hideAllTable', 'showAllTable', 'isNoteRunning',
     'killSaveTimer', 'startSaveTimer', 'setLookAndFeel', 'setCronScheduler', 'setConfig', 'updateNoteName',
-    'openSetting', 'closeSetting', 'saveSetting', 'toggleSetting']
-
-  functions.forEach(function (fn) {
-    it('check for scope functions to be defined : ' + fn, function () {
-      expect(scope[fn]).toBeDefined()
-    })
-  })
-
-  it('should set default value of "editorToggled" to false', function () {
-    expect(scope.editorToggled).toEqual(false)
-  })
-
-  it('should set "showSetting" to true when openSetting() is called', function () {
-    scope.openSetting()
-    expect(scope.showSetting).toEqual(true)
-  })
-
-  it('should set "showSetting" to false when closeSetting() is called', function () {
-    scope.closeSetting()
-    expect(scope.showSetting).toEqual(false)
-  })
-
-  it('should return the correct value for getCronOptionNameFromValue()', function () {
-    let none = scope.getCronOptionNameFromValue()
-    let oneMin = scope.getCronOptionNameFromValue('0 0/1 * * * ?')
-    let fiveMin = scope.getCronOptionNameFromValue('0 0/5 * * * ?')
-    let oneHour = scope.getCronOptionNameFromValue('0 0 0/1 * * ?')
-    let threeHours = scope.getCronOptionNameFromValue('0 0 0/3 * * ?')
-    let sixHours = scope.getCronOptionNameFromValue('0 0 0/6 * * ?')
-    let twelveHours = scope.getCronOptionNameFromValue('0 0 0/12 * * ?')
-    let oneDay = scope.getCronOptionNameFromValue('0 0 0 * * ?')
-
-    expect(none).toEqual('')
-    expect(oneMin).toEqual('1m')
-    expect(fiveMin).toEqual('5m')
-    expect(oneHour).toEqual('1h')
-    expect(threeHours).toEqual('3h')
-    expect(sixHours).toEqual('6h')
-    expect(twelveHours).toEqual('12h')
-    expect(oneDay).toEqual('1d')
-  })
-
-  it('should have "isNoteDirty" as null by default', function () {
-    expect(scope.isNoteDirty).toEqual(null)
-  })
-
-  it('should first call killSaveTimer() when calling startSaveTimer()', function () {
-    expect(scope.saveTimer).toEqual(null)
-    spyOn(scope, 'killSaveTimer')
-    scope.startSaveTimer()
-    expect(scope.killSaveTimer).toHaveBeenCalled()
-  })
-
-  it('should set "saveTimer" when saveTimer() and killSaveTimer() are called', function () {
-    expect(scope.saveTimer).toEqual(null)
-    scope.startSaveTimer()
-    expect(scope.saveTimer).toBeTruthy()
-    scope.killSaveTimer()
-    expect(scope.saveTimer).toEqual(null)
-  })
-
-  it('should NOT update note name when updateNoteName() is called with an invalid name', function () {
-    spyOn(websocketMsgSrvMock, 'renameNote')
-    scope.updateNoteName('')
-    expect(scope.note.name).toEqual(noteMock.name)
-    expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled()
-    scope.updateNoteName(' ')
-    expect(scope.note.name).toEqual(noteMock.name)
-    expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled()
-    scope.updateNoteName(scope.note.name)
-    expect(scope.note.name).toEqual(noteMock.name)
-    expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled()
-  })
-
-  it('should update note name when updateNoteName() is called with a valid name', function () {
-    spyOn(websocketMsgSrvMock, 'renameNote')
-    let newName = 'Your Note'
-    scope.updateNoteName(newName)
-    expect(scope.note.name).toEqual(newName)
-    expect(websocketMsgSrvMock.renameNote).toHaveBeenCalled()
-  })
-
-  it('should reload note info once per one "setNoteMenu" event', function () {
-    spyOn(websocketMsgSrvMock, 'getNote')
-    spyOn(websocketMsgSrvMock, 'listRevisionHistory')
-
-    scope.$broadcast('setNoteMenu')
-    expect(websocketMsgSrvMock.getNote.calls.count()).toEqual(0)
-    expect(websocketMsgSrvMock.listRevisionHistory.calls.count()).toEqual(0)
-
-    websocketMsgSrvMock.getNote.calls.reset()
-    websocketMsgSrvMock.listRevisionHistory.calls.reset()
-
-    scope.$broadcast('setNoteMenu')
-    expect(websocketMsgSrvMock.getNote.calls.count()).toEqual(0)
-    expect(websocketMsgSrvMock.listRevisionHistory.calls.count()).toEqual(0)
-  })
-})
+    'openSetting', 'closeSetting', 'saveSetting', 'toggleSetting'];
+
+  functions.forEach(function(fn) {
+    it('check for scope functions to be defined : ' + fn, function() {
+      expect(scope[fn]).toBeDefined();
+    });
+  });
+
+  it('should set default value of "editorToggled" to false', function() {
+    expect(scope.editorToggled).toEqual(false);
+  });
+
+  it('should set "showSetting" to true when openSetting() is called', function() {
+    scope.openSetting();
+    expect(scope.showSetting).toEqual(true);
+  });
+
+  it('should set "showSetting" to false when closeSetting() is called', function() {
+    scope.closeSetting();
+    expect(scope.showSetting).toEqual(false);
+  });
+
+  it('should return the correct value for getCronOptionNameFromValue()', function() {
+    let none = scope.getCronOptionNameFromValue();
+    let oneMin = scope.getCronOptionNameFromValue('0 0/1 * * * ?');
+    let fiveMin = scope.getCronOptionNameFromValue('0 0/5 * * * ?');
+    let oneHour = scope.getCronOptionNameFromValue('0 0 0/1 * * ?');
+    let threeHours = scope.getCronOptionNameFromValue('0 0 0/3 * * ?');
+    let sixHours = scope.getCronOptionNameFromValue('0 0 0/6 * * ?');
+    let twelveHours = scope.getCronOptionNameFromValue('0 0 0/12 * * ?');
+    let oneDay = scope.getCronOptionNameFromValue('0 0 0 * * ?');
+
+    expect(none).toEqual('');
+    expect(oneMin).toEqual('1m');
+    expect(fiveMin).toEqual('5m');
+    expect(oneHour).toEqual('1h');
+    expect(threeHours).toEqual('3h');
+    expect(sixHours).toEqual('6h');
+    expect(twelveHours).toEqual('12h');
+    expect(oneDay).toEqual('1d');
+  });
+
+  it('should have "isNoteDirty" as null by default', function() {
+    expect(scope.isNoteDirty).toEqual(null);
+  });
+
+  it('should first call killSaveTimer() when calling startSaveTimer()', function() {
+    expect(scope.saveTimer).toEqual(null);
+    spyOn(scope, 'killSaveTimer');
+    scope.startSaveTimer();
+    expect(scope.killSaveTimer).toHaveBeenCalled();
+  });
+
+  it('should set "saveTimer" when saveTimer() and killSaveTimer() are called', function() {
+    expect(scope.saveTimer).toEqual(null);
+    scope.startSaveTimer();
+    expect(scope.saveTimer).toBeTruthy();
+    scope.killSaveTimer();
+    expect(scope.saveTimer).toEqual(null);
+  });
+
+  it('should NOT update note name when updateNoteName() is called with an invalid name', function() {
+    spyOn(websocketMsgSrvMock, 'renameNote');
+    scope.updateNoteName('');
+    expect(scope.note.name).toEqual(noteMock.name);
+    expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled();
+    scope.updateNoteName(' ');
+    expect(scope.note.name).toEqual(noteMock.name);
+    expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled();
+    scope.updateNoteName(scope.note.name);
+    expect(scope.note.name).toEqual(noteMock.name);
+    expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled();
+  });
+
+  it('should update note name when updateNoteName() is called with a valid name', function() {
+    spyOn(websocketMsgSrvMock, 'renameNote');
+    let newName = 'Your Note';
+    scope.updateNoteName(newName);
+    expect(scope.note.name).toEqual(newName);
+    expect(websocketMsgSrvMock.renameNote).toHaveBeenCalled();
+  });
+
+  it('should reload note info once per one "setNoteMenu" event', function() {
+    spyOn(websocketMsgSrvMock, 'getNote');
+    spyOn(websocketMsgSrvMock, 'listRevisionHistory');
+
+    scope.$broadcast('setNoteMenu');
+    expect(websocketMsgSrvMock.getNote.calls.count()).toEqual(0);
+    expect(websocketMsgSrvMock.listRevisionHistory.calls.count()).toEqual(0);
+
+    websocketMsgSrvMock.getNote.calls.reset();
+    websocketMsgSrvMock.listRevisionHistory.calls.reset();
+
+    scope.$broadcast('setNoteMenu');
+    expect(websocketMsgSrvMock.getNote.calls.count()).toEqual(0);
+    expect(websocketMsgSrvMock.listRevisionHistory.calls.count()).toEqual(0);
+  });
+});

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/paragraph/clipboard.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/clipboard.controller.js b/zeppelin-web/src/app/notebook/paragraph/clipboard.controller.js
index 0eb78e3..ea75b27 100644
--- a/zeppelin-web/src/app/notebook/paragraph/clipboard.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/clipboard.controller.js
@@ -11,24 +11,24 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-angular.module('zeppelinWebApp').controller('clipboardCtrl', ClipboardController)
+angular.module('zeppelinWebApp').controller('clipboardCtrl', ClipboardController);
 
-function ClipboardController ($scope) {
-  'ngInject'
+function ClipboardController($scope) {
+  'ngInject';
 
-  $scope.complete = function (e) {
-    $scope.copied = true
-    $scope.tooltip = 'Copied!'
-    setTimeout(function () {
-      $scope.tooltip = 'Copy to clipboard'
-    }, 400)
-  }
-  $scope.$watch('input', function () {
-    $scope.copied = false
-    $scope.tooltip = 'Copy to clipboard'
-  })
-  $scope.clipError = function (e) {
-    console.log('Error: ' + e.name + ' - ' + e.message)
-    $scope.tooltip = 'Not supported browser'
-  }
+  $scope.complete = function(e) {
+    $scope.copied = true;
+    $scope.tooltip = 'Copied!';
+    setTimeout(function() {
+      $scope.tooltip = 'Copy to clipboard';
+    }, 400);
+  };
+  $scope.$watch('input', function() {
+    $scope.copied = false;
+    $scope.tooltip = 'Copy to clipboard';
+  });
+  $scope.clipError = function(e) {
+    console.log('Error: ' + e.name + ' - ' + e.message);
+    $scope.tooltip = 'Not supported browser';
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/notebook/paragraph/code-editor/code-editor.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/code-editor/code-editor.directive.js b/zeppelin-web/src/app/notebook/paragraph/code-editor/code-editor.directive.js
index 944f05d..db4a98f 100644
--- a/zeppelin-web/src/app/notebook/paragraph/code-editor/code-editor.directive.js
+++ b/zeppelin-web/src/app/notebook/paragraph/code-editor/code-editor.directive.js
@@ -12,7 +12,7 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').directive('codeEditor', CodeEditorDirective)
+angular.module('zeppelinWebApp').directive('codeEditor', CodeEditorDirective);
 
 function CodeEditorDirective($templateRequest, $compile) {
   return {
@@ -23,16 +23,16 @@ function CodeEditorDirective($templateRequest, $compile) {
       dirtyText: '=dirtyText',
       originalText: '=originalText',
       onLoad: '=onLoad',
-      revisionView: '=revisionView'
+      revisionView: '=revisionView',
     },
-    link: function (scope, element, attrs, controller) {
-      $templateRequest('app/notebook/paragraph/code-editor/code-editor.directive.html').then(function (editorHtml) {
-        let editor = angular.element(editorHtml)
-        editor.attr('id', scope.paragraphId + '_editor')
-        element.append(editor)
-        $compile(editor)(scope)
-        console.debug('codeEditor directive revision view is ' + scope.revisionView)
-      })
-    }
-  }
+    link: function(scope, element, attrs, controller) {
+      $templateRequest('app/notebook/paragraph/code-editor/code-editor.directive.html').then(function(editorHtml) {
+        let editor = angular.element(editorHtml);
+        editor.attr('id', scope.paragraphId + '_editor');
+        element.append(editor);
+        $compile(editor)(scope);
+        console.debug('codeEditor directive revision view is ' + scope.revisionView);
+      });
+    },
+  };
 }


[03/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/builtins/visualization-linechart.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/builtins/visualization-linechart.js b/zeppelin-web/src/app/visualization/builtins/visualization-linechart.js
index 6d47a9e..df161b9 100644
--- a/zeppelin-web/src/app/visualization/builtins/visualization-linechart.js
+++ b/zeppelin-web/src/app/visualization/builtins/visualization-linechart.js
@@ -12,39 +12,39 @@
  * limitations under the License.
  */
 
-import Nvd3ChartVisualization from './visualization-nvd3chart'
-import PivotTransformation from '../../tabledata/pivot'
-import moment from 'moment'
+import Nvd3ChartVisualization from './visualization-nvd3chart';
+import PivotTransformation from '../../tabledata/pivot';
+import moment from 'moment';
 
 /**
  * Visualize data in line chart
  */
 export default class LinechartVisualization extends Nvd3ChartVisualization {
-  constructor (targetEl, config) {
-    super(targetEl, config)
+  constructor(targetEl, config) {
+    super(targetEl, config);
 
-    this.pivot = new PivotTransformation(config)
+    this.pivot = new PivotTransformation(config);
 
     try {
-      this.config.rotate = {degree: config.rotate.degree}
+      this.config.rotate = {degree: config.rotate.degree};
     } catch (e) {
-      this.config.rotate = {degree: '-45'}
+      this.config.rotate = {degree: '-45'};
     }
   }
 
-  type () {
+  type() {
     if (this.config.lineWithFocus) {
-      return 'lineWithFocusChart'
+      return 'lineWithFocusChart';
     } else {
-      return 'lineChart'
+      return 'lineChart';
     }
   }
 
-  getTransformation () {
-    return this.pivot
+  getTransformation() {
+    return this.pivot;
   }
 
-  render (pivot) {
+  render(pivot) {
     let d3Data = this.d3DataFromPivot(
       pivot.schema,
       pivot.rows,
@@ -53,113 +53,113 @@ export default class LinechartVisualization extends Nvd3ChartVisualization {
       pivot.values,
       false,
       true,
-      false)
+      false);
 
-    this.xLabels = d3Data.xLabels
-    super.render(d3Data)
-    this.config.changeXLabel(this.config.xLabelStatus)
+    this.xLabels = d3Data.xLabels;
+    super.render(d3Data);
+    this.config.changeXLabel(this.config.xLabelStatus);
   }
 
   /**
    * Set new config
    */
-  setConfig (config) {
-    super.setConfig(config)
-    this.pivot.setConfig(config)
+  setConfig(config) {
+    super.setConfig(config);
+    this.pivot.setConfig(config);
 
     // change mode
     if (this.currentMode !== config.lineWithFocus) {
-      super.destroy()
-      this.currentMode = config.lineWithFocus
+      super.destroy();
+      this.currentMode = config.lineWithFocus;
     }
   }
 
-  configureChart (chart) {
-    let self = this
-    let configObj = self.config
+  configureChart(chart) {
+    let self = this;
+    let configObj = self.config;
 
-    chart.xAxis.tickFormat(function (d) {
+    chart.xAxis.tickFormat(function(d) {
       if (self.config.isDateFormat) {
         if (self.config.dateFormat) {
-          return moment(new Date(self.xAxisTickFormat(d, self.xLabels))).format(self.config.dateFormat)
+          return moment(new Date(self.xAxisTickFormat(d, self.xLabels))).format(self.config.dateFormat);
         } else {
-          return moment(new Date(self.xAxisTickFormat(d, self.xLabels))).format('YYYY-MM-DD HH:mm:ss')
+          return moment(new Date(self.xAxisTickFormat(d, self.xLabels))).format('YYYY-MM-DD HH:mm:ss');
         }
       }
-      return self.xAxisTickFormat(d, self.xLabels)
-    })
-    chart.yAxis.tickFormat(function (d) {
+      return self.xAxisTickFormat(d, self.xLabels);
+    });
+    chart.yAxis.tickFormat(function(d) {
       if (d === undefined) {
-        return 'N/A'
+        return 'N/A';
       }
-      return self.yAxisTickFormat(d, self.xLabels)
-    })
-    chart.yAxis.axisLabelDistance(50)
+      return self.yAxisTickFormat(d, self.xLabels);
+    });
+    chart.yAxis.axisLabelDistance(50);
     if (chart.useInteractiveGuideline) {   // lineWithFocusChart hasn't got useInteractiveGuideline
-      chart.useInteractiveGuideline(true) // for better UX and performance issue. (https://github.com/novus/nvd3/issues/691)
+      chart.useInteractiveGuideline(true); // for better UX and performance issue. (https://github.com/novus/nvd3/issues/691)
     }
     if (this.config.forceY) {
-      chart.forceY([0]) // force y-axis minimum to 0 for line chart.
+      chart.forceY([0]); // force y-axis minimum to 0 for line chart.
     } else {
-      chart.forceY([])
+      chart.forceY([]);
     }
 
     self.config.changeXLabel = function(type) {
       switch (type) {
         case 'default':
-          self.chart._options['showXAxis'] = true
-          self.chart._options['margin'] = {bottom: 50}
-          self.chart.xAxis.rotateLabels(0)
-          configObj.xLabelStatus = 'default'
-          break
+          self.chart._options['showXAxis'] = true;
+          self.chart._options['margin'] = {bottom: 50};
+          self.chart.xAxis.rotateLabels(0);
+          configObj.xLabelStatus = 'default';
+          break;
         case 'rotate':
-          self.chart._options['showXAxis'] = true
-          self.chart._options['margin'] = {bottom: 140}
-          self.chart.xAxis.rotateLabels(configObj.rotate.degree)
-          configObj.xLabelStatus = 'rotate'
-          break
+          self.chart._options['showXAxis'] = true;
+          self.chart._options['margin'] = {bottom: 140};
+          self.chart.xAxis.rotateLabels(configObj.rotate.degree);
+          configObj.xLabelStatus = 'rotate';
+          break;
         case 'hide':
-          self.chart._options['showXAxis'] = false
-          self.chart._options['margin'] = {bottom: 50}
-          d3.select('#' + self.targetEl[0].id + '> svg').select('g.nv-axis.nv-x').selectAll('*').remove()
-          configObj.xLabelStatus = 'hide'
-          break
+          self.chart._options['showXAxis'] = false;
+          self.chart._options['margin'] = {bottom: 50};
+          d3.select('#' + self.targetEl[0].id + '> svg').select('g.nv-axis.nv-x').selectAll('*').remove();
+          configObj.xLabelStatus = 'hide';
+          break;
       }
-      self.emitConfig(configObj)
-    }
+      self.emitConfig(configObj);
+    };
 
     self.config.isXLabelStatus = function(type) {
       if (configObj.xLabelStatus === type) {
-        return true
+        return true;
       } else {
-        return false
+        return false;
       }
-    }
+    };
 
     self.config.setDegree = function(type) {
-      configObj.rotate.degree = type
-      self.chart.xAxis.rotateLabels(type)
-      self.emitConfig(configObj)
-    }
-
-    self.config.setDateFormat = function (format) {
-      configObj.dateFormat = format
-      self.emitConfig(configObj)
-    }
+      configObj.rotate.degree = type;
+      self.chart.xAxis.rotateLabels(type);
+      self.emitConfig(configObj);
+    };
+
+    self.config.setDateFormat = function(format) {
+      configObj.dateFormat = format;
+      self.emitConfig(configObj);
+    };
   }
 
-  getSetting (chart) {
-    let self = this
-    let configObj = self.config
+  getSetting(chart) {
+    let self = this;
+    let configObj = self.config;
 
     // default to visualize xLabel
     if (typeof (configObj.xLabelStatus) === 'undefined') {
-      configObj.changeXLabel('default')
+      configObj.changeXLabel('default');
     }
 
     if (typeof (configObj.rotate.degree) === 'undefined' || configObj.rotate.degree === '') {
-      configObj.rotate.degree = '-45'
-      self.emitConfig(configObj)
+      configObj.rotate.degree = '-45';
+      self.emitConfig(configObj);
     }
 
     return {
@@ -199,14 +199,14 @@ export default class LinechartVisualization extends Nvd3ChartVisualization {
       </ng-include>`,
       scope: {
         config: configObj,
-        save: function () {
-          self.emitConfig(configObj)
-        }
-      }
-    }
+        save: function() {
+          self.emitConfig(configObj);
+        },
+      },
+    };
   }
 
-  defaultY () {
-    return undefined
+  defaultY() {
+    return undefined;
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/builtins/visualization-nvd3chart.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/builtins/visualization-nvd3chart.js b/zeppelin-web/src/app/visualization/builtins/visualization-nvd3chart.js
index f99fa3d..b3e6ec6 100644
--- a/zeppelin-web/src/app/visualization/builtins/visualization-nvd3chart.js
+++ b/zeppelin-web/src/app/visualization/builtins/visualization-nvd3chart.js
@@ -12,42 +12,42 @@
  * limitations under the License.
  */
 
-import Visualization from '../visualization'
+import Visualization from '../visualization';
 
 /**
  * Visualize data in table format
  */
 export default class Nvd3ChartVisualization extends Visualization {
-  constructor (targetEl, config) {
-    super(targetEl, config)
-    this.targetEl.append('<svg></svg>')
+  constructor(targetEl, config) {
+    super(targetEl, config);
+    this.targetEl.append('<svg></svg>');
   }
 
-  refresh () {
+  refresh() {
     if (this.chart) {
-      this.chart.update()
+      this.chart.update();
     }
   }
 
-  render (data) {
-    let type = this.type()
-    let d3g = data.d3g
+  render(data) {
+    let type = this.type();
+    let d3g = data.d3g;
 
     if (!this.chart) {
-      this.chart = nv.models[type]()
+      this.chart = nv.models[type]();
     }
 
-    this.configureChart(this.chart)
+    this.configureChart(this.chart);
 
-    let animationDuration = 300
-    let numberOfDataThreshold = 150
-    let height = this.targetEl.height()
+    let animationDuration = 300;
+    let numberOfDataThreshold = 150;
+    let height = this.targetEl.height();
 
     // turn off animation when dataset is too large. (for performance issue)
     // still, since dataset is large, the chart content sequentially appears like animated
     try {
       if (d3g[0].values.length > numberOfDataThreshold) {
-        animationDuration = 0
+        animationDuration = 0;
       }
     } catch (err) { /** ignore */ }
 
@@ -56,206 +56,214 @@ export default class Nvd3ChartVisualization extends Visualization {
       .datum(d3g)
       .transition()
       .duration(animationDuration)
-      .call(this.chart)
-    d3.select('#' + this.targetEl[0].id + ' svg').style.height = height + 'px'
+      .call(this.chart);
+    d3.select('#' + this.targetEl[0].id + ' svg').style.height = height + 'px';
   }
 
-  type () {
+  type() {
     // override this and return chart type
   }
 
-  configureChart (chart) {
+  configureChart(chart) {
     // override this to configure chart
   }
 
-  groupedThousandsWith3DigitsFormatter (x) {
-    return d3.format(',')(d3.round(x, 3))
+  groupedThousandsWith3DigitsFormatter(x) {
+    return d3.format(',')(d3.round(x, 3));
   }
 
-  customAbbrevFormatter (x) {
-    let s = d3.format('.3s')(x)
+  customAbbrevFormatter(x) {
+    let s = d3.format('.3s')(x);
     switch (s[s.length - 1]) {
-      case 'G': return s.slice(0, -1) + 'B'
+      case 'G': return s.slice(0, -1) + 'B';
     }
-    return s
+    return s;
   }
 
-  defaultY () {
-    return 0
+  defaultY() {
+    return 0;
   }
 
-  xAxisTickFormat (d, xLabels) {
+  xAxisTickFormat(d, xLabels) {
     if (xLabels[d] && (isNaN(parseFloat(xLabels[d])) || !isFinite(xLabels[d]))) { // to handle string type xlabel
-      return xLabels[d]
+      return xLabels[d];
     } else {
-      return d
+      return d;
     }
   }
 
-  yAxisTickFormat (d) {
+  yAxisTickFormat(d) {
     if (Math.abs(d) >= Math.pow(10, 6)) {
-      return this.customAbbrevFormatter(d)
+      return this.customAbbrevFormatter(d);
     }
-    return this.groupedThousandsWith3DigitsFormatter(d)
+    return this.groupedThousandsWith3DigitsFormatter(d);
   }
 
-  d3DataFromPivot (
+  d3DataFromPivot(
     schema, rows, keys, groups, values, allowTextXAxis, fillMissingValues, multiBarChart) {
-    let self = this
+    let self = this;
     // construct table data
-    let d3g = []
+    let d3g = [];
 
-    let concat = function (o, n) {
+    let concat = function(o, n) {
       if (!o) {
-        return n
+        return n;
       } else {
-        return o + '.' + n
+        return o + '.' + n;
       }
-    }
+    };
 
-    const getSchemaUnderKey = function (key, s) {
+    const getSchemaUnderKey = function(key, s) {
       for (let c in key.children) {
-        s[c] = {}
-        getSchemaUnderKey(key.children[c], s[c])
+        if(key.children.hasOwnProperty(c)) {
+          s[c] = {};
+          getSchemaUnderKey(key.children[c], s[c]);
+        }
       }
-    }
+    };
 
-    const traverse = function (sKey, s, rKey, r, func, rowName, rowValue, colName) {
+    const traverse = function(sKey, s, rKey, r, func, rowName, rowValue, colName) {
       // console.log("TRAVERSE sKey=%o, s=%o, rKey=%o, r=%o, rowName=%o, rowValue=%o, colName=%o", sKey, s, rKey, r, rowName, rowValue, colName);
 
       if (s.type === 'key') {
-        rowName = concat(rowName, sKey)
-        rowValue = concat(rowValue, rKey)
+        rowName = concat(rowName, sKey);
+        rowValue = concat(rowValue, rKey);
       } else if (s.type === 'group') {
-        colName = concat(colName, rKey)
+        colName = concat(colName, rKey);
       } else if (s.type === 'value' && sKey === rKey || valueOnly) {
-        colName = concat(colName, rKey)
-        func(rowName, rowValue, colName, r)
+        colName = concat(colName, rKey);
+        func(rowName, rowValue, colName, r);
       }
 
       for (let c in s.children) {
         if (fillMissingValues && s.children[c].type === 'group' && r[c] === undefined) {
-          let cs = {}
-          getSchemaUnderKey(s.children[c], cs)
-          traverse(c, s.children[c], c, cs, func, rowName, rowValue, colName)
-          continue
+          let cs = {};
+          getSchemaUnderKey(s.children[c], cs);
+          traverse(c, s.children[c], c, cs, func, rowName, rowValue, colName);
+          continue;
         }
 
         for (let j in r) {
           if (s.children[c].type === 'key' || c === j) {
-            traverse(c, s.children[c], j, r[j], func, rowName, rowValue, colName)
+            traverse(c, s.children[c], j, r[j], func, rowName, rowValue, colName);
           }
         }
       }
-    }
+    };
 
-    const valueOnly = (keys.length === 0 && groups.length === 0 && values.length > 0)
-    let noKey = (keys.length === 0)
-    let isMultiBarChart = multiBarChart
+    const valueOnly = (keys.length === 0 && groups.length === 0 && values.length > 0);
+    let noKey = (keys.length === 0);
+    let isMultiBarChart = multiBarChart;
 
-    let sKey = Object.keys(schema)[0]
+    let sKey = Object.keys(schema)[0];
 
-    let rowNameIndex = {}
-    let rowIdx = 0
-    let colNameIndex = {}
-    let colIdx = 0
-    let rowIndexValue = {}
+    let rowNameIndex = {};
+    let rowIdx = 0;
+    let colNameIndex = {};
+    let colIdx = 0;
+    let rowIndexValue = {};
 
     for (let k in rows) {
-      traverse(sKey, schema[sKey], k, rows[k], function (rowName, rowValue, colName, value) {
-        // console.log("RowName=%o, row=%o, col=%o, value=%o", rowName, rowValue, colName, value);
-        if (rowNameIndex[rowValue] === undefined) {
-          rowIndexValue[rowIdx] = rowValue
-          rowNameIndex[rowValue] = rowIdx++
-        }
+      if (rows.hasOwnProperty(k)) {
+        traverse(sKey, schema[sKey], k, rows[k], function(rowName, rowValue, colName, value) {
+          // console.log("RowName=%o, row=%o, col=%o, value=%o", rowName, rowValue, colName, value);
+          if (rowNameIndex[rowValue] === undefined) {
+            rowIndexValue[rowIdx] = rowValue;
+            rowNameIndex[rowValue] = rowIdx++;
+          }
 
-        if (colNameIndex[colName] === undefined) {
-          colNameIndex[colName] = colIdx++
-        }
-        let i = colNameIndex[colName]
-        if (noKey && isMultiBarChart) {
-          i = 0
-        }
+          if (colNameIndex[colName] === undefined) {
+            colNameIndex[colName] = colIdx++;
+          }
+          let i = colNameIndex[colName];
+          if (noKey && isMultiBarChart) {
+            i = 0;
+          }
 
-        if (!d3g[i]) {
-          d3g[i] = {
-            values: [],
-            key: (noKey && isMultiBarChart) ? 'values' : colName
+          if (!d3g[i]) {
+            d3g[i] = {
+              values: [],
+              key: (noKey && isMultiBarChart) ? 'values' : colName,
+            };
           }
-        }
 
-        let xVar = isNaN(rowValue) ? ((allowTextXAxis) ? rowValue : rowNameIndex[rowValue]) : parseFloat(rowValue)
-        let yVar = self.defaultY()
-        if (xVar === undefined) { xVar = colName }
-        if (value !== undefined) {
-          yVar = isNaN(value.value) ? self.defaultY() : parseFloat(value.value) / parseFloat(value.count)
-        }
-        d3g[i].values.push({
-          x: xVar,
-          y: yVar
-        })
-      })
+          let xVar = isNaN(rowValue) ? ((allowTextXAxis) ? rowValue : rowNameIndex[rowValue]) : parseFloat(rowValue);
+          let yVar = self.defaultY();
+          if (xVar === undefined) {
+            xVar = colName;
+          }
+          if (value !== undefined) {
+            yVar = isNaN(value.value) ? self.defaultY() : parseFloat(value.value) / parseFloat(value.count);
+          }
+          d3g[i].values.push({
+            x: xVar,
+            y: yVar,
+          });
+        });
+      }
     }
 
     // clear aggregation name, if possible
-    let namesWithoutAggr = {}
-    let colName
-    let withoutAggr
+    let namesWithoutAggr = {};
+    let colName;
+    let withoutAggr;
     // TODO - This part could use som refactoring - Weird if/else with similar actions and variable names
     for (colName in colNameIndex) {
-      withoutAggr = colName.substring(0, colName.lastIndexOf('('))
-      if (!namesWithoutAggr[withoutAggr]) {
-        namesWithoutAggr[withoutAggr] = 1
-      } else {
-        namesWithoutAggr[withoutAggr]++
+      if (colNameIndex.hasOwnProperty(colName)) {
+        withoutAggr = colName.substring(0, colName.lastIndexOf('('));
+        if (!namesWithoutAggr[withoutAggr]) {
+          namesWithoutAggr[withoutAggr] = 1;
+        } else {
+          namesWithoutAggr[withoutAggr]++;
+        }
       }
     }
 
     if (valueOnly) {
       for (let valueIndex = 0; valueIndex < d3g[0].values.length; valueIndex++) {
-        colName = d3g[0].values[valueIndex].x
+        colName = d3g[0].values[valueIndex].x;
         if (!colName) {
-          continue
+          continue;
         }
 
-        withoutAggr = colName.substring(0, colName.lastIndexOf('('))
+        withoutAggr = colName.substring(0, colName.lastIndexOf('('));
         if (namesWithoutAggr[withoutAggr] <= 1) {
-          d3g[0].values[valueIndex].x = withoutAggr
+          d3g[0].values[valueIndex].x = withoutAggr;
         }
       }
     } else {
       for (let d3gIndex = 0; d3gIndex < d3g.length; d3gIndex++) {
-        colName = d3g[d3gIndex].key
-        withoutAggr = colName.substring(0, colName.lastIndexOf('('))
+        colName = d3g[d3gIndex].key;
+        withoutAggr = colName.substring(0, colName.lastIndexOf('('));
         if (namesWithoutAggr[withoutAggr] <= 1) {
-          d3g[d3gIndex].key = withoutAggr
+          d3g[d3gIndex].key = withoutAggr;
         }
       }
 
       // use group name instead of group.value as a column name, if there're only one group and one value selected.
       if (groups.length === 1 && values.length === 1) {
         for (let d3gIndex = 0; d3gIndex < d3g.length; d3gIndex++) {
-          colName = d3g[d3gIndex].key
-          colName = colName.split('.').slice(0, -1).join('.')
-          d3g[d3gIndex].key = colName
+          colName = d3g[d3gIndex].key;
+          colName = colName.split('.').slice(0, -1).join('.');
+          d3g[d3gIndex].key = colName;
         }
       }
     }
 
     return {
       xLabels: rowIndexValue,
-      d3g: d3g
-    }
+      d3g: d3g,
+    };
   }
 
   /**
    * method will be invoked when visualization need to be destroyed.
    * Don't need to destroy this.targetEl.
    */
-  destroy () {
+  destroy() {
     if (this.chart) {
-      d3.selectAll('#' + this.targetEl[0].id + ' svg > *').remove()
-      this.chart = undefined
+      d3.selectAll('#' + this.targetEl[0].id + ' svg > *').remove();
+      this.chart = undefined;
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/builtins/visualization-piechart.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/builtins/visualization-piechart.js b/zeppelin-web/src/app/visualization/builtins/visualization-piechart.js
index 4f80654..84479cb 100644
--- a/zeppelin-web/src/app/visualization/builtins/visualization-piechart.js
+++ b/zeppelin-web/src/app/visualization/builtins/visualization-piechart.js
@@ -12,29 +12,29 @@
  * limitations under the License.
  */
 
-import Nvd3ChartVisualization from './visualization-nvd3chart'
-import PivotTransformation from '../../tabledata/pivot'
+import Nvd3ChartVisualization from './visualization-nvd3chart';
+import PivotTransformation from '../../tabledata/pivot';
 
 /**
  * Visualize data in pie chart
  */
 export default class PiechartVisualization extends Nvd3ChartVisualization {
-  constructor (targetEl, config) {
-    super(targetEl, config)
-    this.pivot = new PivotTransformation(config)
+  constructor(targetEl, config) {
+    super(targetEl, config);
+    this.pivot = new PivotTransformation(config);
   }
 
-  type () {
-    return 'pieChart'
+  type() {
+    return 'pieChart';
   }
 
-  getTransformation () {
-    return this.pivot
+  getTransformation() {
+    return this.pivot;
   }
 
-  render (pivot) {
+  render(pivot) {
     // [ZEPPELIN-2253] New chart function will be created each time inside super.render()
-    this.chart = null
+    this.chart = null;
     const d3Data = this.d3DataFromPivot(
       pivot.schema,
       pivot.rows,
@@ -43,41 +43,45 @@ export default class PiechartVisualization extends Nvd3ChartVisualization {
       pivot.values,
       true,
       false,
-      false)
-    const d = d3Data.d3g
+      false);
+    const d = d3Data.d3g;
 
-    let generateLabel
+    let generateLabel;
     // data is grouped
     if (pivot.groups && pivot.groups.length > 0) {
-      generateLabel = (suffix, prefix) => `${prefix}.${suffix}`
+      generateLabel = (suffix, prefix) => `${prefix}.${suffix}`;
     } else { // data isn't grouped
-      generateLabel = suffix => suffix
+      generateLabel = (suffix) => suffix;
     }
 
-    let d3g = d.map(group => {
-      return group.values.map(row => ({
+    let d3g = d.map((group) => {
+      return group.values.map((row) => ({
         label: generateLabel(row.x, group.key),
-        value: row.y
-      }))
-    })
+        value: row.y,
+      }));
+    });
     // the map function returns d3g as a nested array
     // [].concat flattens it, http://stackoverflow.com/a/10865042/5154397
-    d3g = [].concat.apply([], d3g) // eslint-disable-line prefer-spread
-    super.render({d3g: d3g})
+    d3g = [].concat.apply([], d3g); // eslint-disable-line prefer-spread
+    super.render({d3g: d3g});
   }
 
   /**
    * Set new config
    */
-  setConfig (config) {
-    super.setConfig(config)
-    this.pivot.setConfig(config)
+  setConfig(config) {
+    super.setConfig(config);
+    this.pivot.setConfig(config);
   }
 
-  configureChart (chart) {
-    chart.x(function (d) { return d.label })
-      .y(function (d) { return d.value })
-      .showLabels(false)
-      .showTooltipPercent(true)
+  configureChart(chart) {
+    chart.x(function(d) {
+      return d.label;
+    })
+    .y(function(d) {
+      return d.value;
+    })
+    .showLabels(false)
+    .showTooltipPercent(true);
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/builtins/visualization-scatterchart.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/builtins/visualization-scatterchart.js b/zeppelin-web/src/app/visualization/builtins/visualization-scatterchart.js
index d7c00db..fad7500 100644
--- a/zeppelin-web/src/app/visualization/builtins/visualization-scatterchart.js
+++ b/zeppelin-web/src/app/visualization/builtins/visualization-scatterchart.js
@@ -12,25 +12,25 @@
  * limitations under the License.
  */
 
-import Nvd3ChartVisualization from './visualization-nvd3chart'
-import ColumnselectorTransformation from '../../tabledata/columnselector'
+import Nvd3ChartVisualization from './visualization-nvd3chart';
+import ColumnselectorTransformation from '../../tabledata/columnselector';
 
 /**
  * Visualize data in scatter char
  */
 export default class ScatterchartVisualization extends Nvd3ChartVisualization {
-  constructor (targetEl, config) {
-    super(targetEl, config)
+  constructor(targetEl, config) {
+    super(targetEl, config);
 
     this.columnselectorProps = [
       {
-        name: 'xAxis'
+        name: 'xAxis',
       },
       {
-        name: 'yAxis'
+        name: 'yAxis',
       },
       {
-        name: 'group'
+        name: 'group',
       },
       {
         name: 'size',
@@ -39,322 +39,330 @@ export default class ScatterchartVisualization extends Nvd3ChartVisualization {
           'number of values in corresponding coordinate' will be used.
           Zeppelin considers values as discrete when input values contain a string
           or the number of distinct values is greater than 5% of the total number of values.
-          This field turns grey when the selected option is invalid.`
-      }
-    ]
-    this.columnselector = new ColumnselectorTransformation(config, this.columnselectorProps)
+          This field turns grey when the selected option is invalid.`,
+      },
+    ];
+    this.columnselector = new ColumnselectorTransformation(config, this.columnselectorProps);
   }
 
-  type () {
-    return 'scatterChart'
+  type() {
+    return 'scatterChart';
   }
 
-  getTransformation () {
-    return this.columnselector
+  getTransformation() {
+    return this.columnselector;
   }
 
-  render (tableData) {
-    this.tableData = tableData
-    this.selectDefault()
-    let d3Data = this.setScatterChart(tableData, true)
-    this.xLabels = d3Data.xLabels
-    this.yLabels = d3Data.yLabels
+  render(tableData) {
+    this.tableData = tableData;
+    this.selectDefault();
+    let d3Data = this.setScatterChart(tableData, true);
+    this.xLabels = d3Data.xLabels;
+    this.yLabels = d3Data.yLabels;
 
-    super.render(d3Data)
+    super.render(d3Data);
   }
 
-  configureChart (chart) {
-    let self = this
+  configureChart(chart) {
+    let self = this;
 
-    chart.xAxis.tickFormat(function (d) { // TODO remove round after bump to nvd3 > 1.8.5
-      return self.xAxisTickFormat(Math.round(d * 1e3) / 1e3, self.xLabels)
-    })
+    chart.xAxis.tickFormat(function(d) { // TODO remove round after bump to nvd3 > 1.8.5
+      return self.xAxisTickFormat(Math.round(d * 1e3) / 1e3, self.xLabels);
+    });
 
-    chart.yAxis.tickFormat(function (d) { // TODO remove round after bump to nvd3 > 1.8.5
-      return self.yAxisTickFormat(Math.round(d * 1e3) / 1e3, self.yLabels)
-    })
+    chart.yAxis.tickFormat(function(d) { // TODO remove round after bump to nvd3 > 1.8.5
+      return self.yAxisTickFormat(Math.round(d * 1e3) / 1e3, self.yLabels);
+    });
 
-    chart.showDistX(true).showDistY(true)
+    chart.showDistX(true).showDistY(true);
     // handle the problem of tooltip not showing when muliple points have same value.
   }
 
-  yAxisTickFormat (d, yLabels) {
+  yAxisTickFormat(d, yLabels) {
     if (yLabels[d] && (isNaN(parseFloat(yLabels[d])) || !isFinite(yLabels[d]))) { // to handle string type xlabel
-      return yLabels[d]
+      return yLabels[d];
     } else {
-      return super.yAxisTickFormat(d)
+      return super.yAxisTickFormat(d);
     }
   }
 
-  selectDefault () {
+  selectDefault() {
     if (!this.config.xAxis && !this.config.yAxis) {
       if (this.tableData.columns.length > 1) {
-        this.config.xAxis = this.tableData.columns[0]
-        this.config.yAxis = this.tableData.columns[1]
+        this.config.xAxis = this.tableData.columns[0];
+        this.config.yAxis = this.tableData.columns[1];
       } else if (this.tableData.columns.length === 1) {
-        this.config.xAxis = this.tableData.columns[0]
+        this.config.xAxis = this.tableData.columns[0];
       }
     }
   }
 
-  setScatterChart (data, refresh) {
-    let xAxis = this.config.xAxis
-    let yAxis = this.config.yAxis
-    let group = this.config.group
-    let size = this.config.size
-
-    let xValues = []
-    let yValues = []
-    let rows = {}
-    let d3g = []
-
-    let rowNameIndex = {}
-    let colNameIndex = {}
-    let grpNameIndex = {}
-    let rowIndexValue = {}
-    let colIndexValue = {}
-    let grpIndexValue = {}
-    let rowIdx = 0
-    let colIdx = 0
-    let grpIdx = 0
-    let grpName = ''
-
-    let xValue
-    let yValue
-    let row
+  setScatterChart(data, refresh) {
+    let xAxis = this.config.xAxis;
+    let yAxis = this.config.yAxis;
+    let group = this.config.group;
+    let size = this.config.size;
+
+    let xValues = [];
+    let yValues = [];
+    let rows = {};
+    let d3g = [];
+
+    let rowNameIndex = {};
+    let colNameIndex = {};
+    let grpNameIndex = {};
+    let rowIndexValue = {};
+    let colIndexValue = {};
+    let grpIndexValue = {};
+    let rowIdx = 0;
+    let colIdx = 0;
+    let grpIdx = 0;
+    let grpName = '';
+
+    let xValue;
+    let yValue;
+    let row;
 
     if (!xAxis && !yAxis) {
       return {
-        d3g: []
-      }
+        d3g: [],
+      };
     }
 
     for (let i = 0; i < data.rows.length; i++) {
-      row = data.rows[i]
+      row = data.rows[i];
       if (xAxis) {
-        xValue = row[xAxis.index]
-        xValues[i] = xValue
+        xValue = row[xAxis.index];
+        xValues[i] = xValue;
       }
       if (yAxis) {
-        yValue = row[yAxis.index]
-        yValues[i] = yValue
+        yValue = row[yAxis.index];
+        yValues[i] = yValue;
       }
     }
 
     let isAllDiscrete = ((xAxis && yAxis && this.isDiscrete(xValues) && this.isDiscrete(yValues)) ||
     (!xAxis && this.isDiscrete(yValues)) ||
-    (!yAxis && this.isDiscrete(xValues)))
+    (!yAxis && this.isDiscrete(xValues)));
 
     if (isAllDiscrete) {
-      rows = this.setDiscreteScatterData(data)
+      rows = this.setDiscreteScatterData(data);
     } else {
-      rows = data.rows
+      rows = data.rows;
     }
 
     if (!group && isAllDiscrete) {
-      grpName = 'count'
+      grpName = 'count';
     } else if (!group && !size) {
       if (xAxis && yAxis) {
-        grpName = '(' + xAxis.name + ', ' + yAxis.name + ')'
+        grpName = '(' + xAxis.name + ', ' + yAxis.name + ')';
       } else if (xAxis && !yAxis) {
-        grpName = xAxis.name
+        grpName = xAxis.name;
       } else if (!xAxis && yAxis) {
-        grpName = yAxis.name
+        grpName = yAxis.name;
       }
     } else if (!group && size) {
-      grpName = size.name
+      grpName = size.name;
     }
 
-    let epsilon = 1e-4 // TODO remove after bump to nvd3 > 1.8.5
+    let epsilon = 1e-4; // TODO remove after bump to nvd3 > 1.8.5
 
     for (let i = 0; i < rows.length; i++) {
-      row = rows[i]
+      row = rows[i];
       if (xAxis) {
-        xValue = row[xAxis.index]
+        xValue = row[xAxis.index];
       }
       if (yAxis) {
-        yValue = row[yAxis.index]
+        yValue = row[yAxis.index];
       }
       if (group) {
-        grpName = row[group.index]
+        grpName = row[group.index];
       }
-      let sz = (isAllDiscrete) ? row[row.length - 1] : ((size) ? row[size.index] : 1)
+      let sz = (isAllDiscrete) ? row[row.length - 1] : ((size) ? row[size.index] : 1);
 
       if (grpNameIndex[grpName] === undefined) {
-        grpIndexValue[grpIdx] = grpName
-        grpNameIndex[grpName] = grpIdx++
+        grpIndexValue[grpIdx] = grpName;
+        grpNameIndex[grpName] = grpIdx++;
       }
 
       if (xAxis && rowNameIndex[xValue] === undefined) {
-        rowIndexValue[rowIdx] = xValue
-        rowNameIndex[xValue] = rowIdx++
+        rowIndexValue[rowIdx] = xValue;
+        rowNameIndex[xValue] = rowIdx++;
       }
 
       if (yAxis && colNameIndex[yValue] === undefined) {
-        colIndexValue[colIdx] = yValue
-        colNameIndex[yValue] = colIdx++
+        colIndexValue[colIdx] = yValue;
+        colNameIndex[yValue] = colIdx++;
       }
 
       if (!d3g[grpNameIndex[grpName]]) {
         d3g[grpNameIndex[grpName]] = {
           key: grpName,
-          values: []
-        }
+          values: [],
+        };
       }
 
       // TODO remove epsilon jitter after bump to nvd3 > 1.8.5
-      let xval = 0
-      let yval = 0
+      let xval = 0;
+      let yval = 0;
       if (xAxis) {
-        xval = (isNaN(xValue) ? rowNameIndex[xValue] : parseFloat(xValue)) + Math.random() * epsilon
+        xval = (isNaN(xValue) ? rowNameIndex[xValue] : parseFloat(xValue)) + Math.random() * epsilon;
       }
       if (yAxis) {
-        yval = (isNaN(yValue) ? colNameIndex[yValue] : parseFloat(yValue)) + Math.random() * epsilon
+        yval = (isNaN(yValue) ? colNameIndex[yValue] : parseFloat(yValue)) + Math.random() * epsilon;
       }
 
       d3g[grpNameIndex[grpName]].values.push({
         x: xval,
         y: yval,
-        size: isNaN(parseFloat(sz)) ? 1 : parseFloat(sz)
-      })
+        size: isNaN(parseFloat(sz)) ? 1 : parseFloat(sz),
+      });
     }
 
     // TODO remove sort and dedup after bump to nvd3 > 1.8.5
-    let d3gvalues = d3g[grpNameIndex[grpName]].values
-    d3gvalues.sort(function (a, b) {
-      return ((a['x'] - b['x']) || (a['y'] - b['y']))
-    })
+    let d3gvalues = d3g[grpNameIndex[grpName]].values;
+    d3gvalues.sort(function(a, b) {
+      return ((a['x'] - b['x']) || (a['y'] - b['y']));
+    });
 
     for (let i = 0; i < d3gvalues.length - 1;) {
       if ((Math.abs(d3gvalues[i]['x'] - d3gvalues[i + 1]['x']) < epsilon) &&
            (Math.abs(d3gvalues[i]['y'] - d3gvalues[i + 1]['y']) < epsilon)) {
-        d3gvalues.splice(i + 1, 1)
+        d3gvalues.splice(i + 1, 1);
       } else {
-        i++
+        i++;
       }
     }
 
     return {
       xLabels: rowIndexValue,
       yLabels: colIndexValue,
-      d3g: d3g
-    }
+      d3g: d3g,
+    };
   }
 
-  setDiscreteScatterData (data) {
-    let xAxis = this.config.xAxis
-    let yAxis = this.config.yAxis
-    let group = this.config.group
+  setDiscreteScatterData(data) {
+    let xAxis = this.config.xAxis;
+    let yAxis = this.config.yAxis;
+    let group = this.config.group;
 
-    let xValue
-    let yValue
-    let grp
+    let xValue;
+    let yValue;
+    let grp;
 
-    let rows = {}
+    let rows = {};
 
     for (let i = 0; i < data.rows.length; i++) {
-      let row = data.rows[i]
+      let row = data.rows[i];
       if (xAxis) {
-        xValue = row[xAxis.index]
+        xValue = row[xAxis.index];
       }
       if (yAxis) {
-        yValue = row[yAxis.index]
+        yValue = row[yAxis.index];
       }
       if (group) {
-        grp = row[group.index]
+        grp = row[group.index];
       }
 
-      let key = xValue + ',' + yValue + ',' + grp
+      let key = xValue + ',' + yValue + ',' + grp;
 
       if (!rows[key]) {
         rows[key] = {
           x: xValue,
           y: yValue,
           group: grp,
-          size: 1
-        }
+          size: 1,
+        };
       } else {
-        rows[key].size++
+        rows[key].size++;
       }
     }
 
     // change object into array
-    let newRows = []
+    let newRows = [];
     for (let r in rows) {
-      let newRow = []
-      if (xAxis) { newRow[xAxis.index] = rows[r].x }
-      if (yAxis) { newRow[yAxis.index] = rows[r].y }
-      if (group) { newRow[group.index] = rows[r].group }
-      newRow[data.rows[0].length] = rows[r].size
-      newRows.push(newRow)
+      if (rows.hasOwnProperty(r)) {
+        let newRow = [];
+        if (xAxis) {
+          newRow[xAxis.index] = rows[r].x;
+        }
+        if (yAxis) {
+          newRow[yAxis.index] = rows[r].y;
+        }
+        if (group) {
+          newRow[group.index] = rows[r].group;
+        }
+        newRow[data.rows[0].length] = rows[r].size;
+        newRows.push(newRow);
+      }
     }
-    return newRows
+    return newRows;
   }
 
-  isDiscrete (field) {
-    let getUnique = function (f) {
-      let uniqObj = {}
-      let uniqArr = []
-      let j = 0
+  isDiscrete(field) {
+    let getUnique = function(f) {
+      let uniqObj = {};
+      let uniqArr = [];
+      let j = 0;
       for (let i = 0; i < f.length; i++) {
-        let item = f[i]
+        let item = f[i];
         if (uniqObj[item] !== 1) {
-          uniqObj[item] = 1
-          uniqArr[j++] = item
+          uniqObj[item] = 1;
+          uniqArr[j++] = item;
         }
       }
-      return uniqArr
-    }
+      return uniqArr;
+    };
 
     for (let i = 0; i < field.length; i++) {
       if (isNaN(parseFloat(field[i])) &&
         (typeof field[i] === 'string' || field[i] instanceof String)) {
-        return true
+        return true;
       }
     }
 
-    let threshold = 0.05
-    let unique = getUnique(field)
+    let threshold = 0.05;
+    let unique = getUnique(field);
     if (unique.length / field.length < threshold) {
-      return true
+      return true;
     } else {
-      return false
+      return false;
     }
   }
 
-  isValidSizeOption (options) {
-    let xValues = []
-    let yValues = []
-    let rows = this.tableData.rows
+  isValidSizeOption(options) {
+    let xValues = [];
+    let yValues = [];
+    let rows = this.tableData.rows;
 
     for (let i = 0; i < rows.length; i++) {
-      let row = rows[i]
-      let size = row[options.size.index]
+      let row = rows[i];
+      let size = row[options.size.index];
 
       // check if the field is numeric
       if (isNaN(parseFloat(size)) || !isFinite(size)) {
-        return false
+        return false;
       }
 
       if (options.xAxis) {
-        let x = row[options.xAxis.index]
-        xValues[i] = x
+        let x = row[options.xAxis.index];
+        xValues[i] = x;
       }
       if (options.yAxis) {
-        let y = row[options.yAxis.index]
-        yValues[i] = y
+        let y = row[options.yAxis.index];
+        yValues[i] = y;
       }
     }
 
     // check if all existing fields are discrete
     let isAllDiscrete = ((options.xAxis && options.yAxis && this.isDiscrete(xValues) && this.isDiscrete(yValues)) ||
     (!options.xAxis && this.isDiscrete(yValues)) ||
-    (!options.yAxis && this.isDiscrete(xValues)))
+    (!options.yAxis && this.isDiscrete(xValues)));
 
     if (isAllDiscrete) {
-      return false
+      return false;
     }
 
-    return true
+    return true;
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/builtins/visualization-table.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/builtins/visualization-table.js b/zeppelin-web/src/app/visualization/builtins/visualization-table.js
index afb5394..d77efbc 100644
--- a/zeppelin-web/src/app/visualization/builtins/visualization-table.js
+++ b/zeppelin-web/src/app/visualization/builtins/visualization-table.js
@@ -12,8 +12,8 @@
  * limitations under the License.
  */
 
-import Visualization from '../visualization'
-import PassthroughTransformation from '../../tabledata/passthrough'
+import Visualization from '../visualization';
+import PassthroughTransformation from '../../tabledata/passthrough';
 
 import {
   Widget, ValueType,
@@ -22,9 +22,9 @@ import {
   initializeTableConfig, resetTableOptionConfig,
   DefaultTableColumnType, TableColumnType, updateColumnTypeState,
   parseTableOption,
-} from './visualization-util'
+} from './visualization-util';
 
-const SETTING_TEMPLATE = require('./visualization-table-setting.html')
+const SETTING_TEMPLATE = require('./visualization-table-setting.html');
 
 const TABLE_OPTION_SPECS = [
   {
@@ -48,41 +48,43 @@ const TABLE_OPTION_SPECS = [
     widget: Widget.CHECKBOX,
     description: 'Enable a footer for displaying aggregated values',
   },
-]
+];
 
 /**
  * Visualize data in table format
  */
 export default class TableVisualization extends Visualization {
-  constructor (targetEl, config) {
-    super(targetEl, config)
-    this.passthrough = new PassthroughTransformation(config)
-    this.emitTimeout = null
-    this.isRestoring = false
+  constructor(targetEl, config) {
+    super(targetEl, config);
+    this.passthrough = new PassthroughTransformation(config);
+    this.emitTimeout = null;
+    this.isRestoring = false;
 
-    initializeTableConfig(config, TABLE_OPTION_SPECS)
+    initializeTableConfig(config, TABLE_OPTION_SPECS);
   }
 
   getColumnMinWidth(colName) {
-    let width = 150 // default
-    const calculatedWidth = colName.length * 10
+    let width = 150; // default
+    const calculatedWidth = colName.length * 10;
 
     // use the broad one
-    if (calculatedWidth > width) { width = calculatedWidth }
+    if (calculatedWidth > width) {
+      width = calculatedWidth;
+    }
 
-    return width
+    return width;
   }
 
   createGridOptions(tableData, onRegisterApiCallback, config) {
-    const rows = tableData.rows
-    const columnNames = tableData.columns.map(c => c.name)
+    const rows = tableData.rows;
+    const columnNames = tableData.columns.map((c) => c.name);
 
-    const gridData = rows.map(r => {
+    const gridData = rows.map((r) => {
       return columnNames.reduce((acc, colName, index) => {
-        acc[colName] = r[index]
-        return acc
-      }, {})
-    })
+        acc[colName] = r[index];
+        return acc;
+      }, {});
+    });
 
     const gridOptions = {
       data: gridData,
@@ -94,7 +96,7 @@ export default class TableVisualization extends Visualization {
       fastWatch: false,
       treeRowHeaderAlwaysVisible: false,
 
-      columnDefs: columnNames.map(colName => {
+      columnDefs: columnNames.map((colName) => {
         return {
           displayName: colName,
           name: colName,
@@ -111,7 +113,7 @@ export default class TableVisualization extends Visualization {
           `,
           minWidth: this.getColumnMinWidth(colName),
           width: '*',
-        }
+        };
       }),
       rowEditWaitInterval: -1, /** disable saveRow event */
       enableRowHashing: true,
@@ -126,127 +128,131 @@ export default class TableVisualization extends Visualization {
       saveTreeView: true,
       saveFilter: true,
       saveSelection: false,
-    }
+    };
 
-    return gridOptions
+    return gridOptions;
   }
 
   getGridElemId() {
     // angular doesn't allow `-` in scope variable name
-    const gridElemId = `${this.targetEl[0].id}_grid`.replace('-', '_')
-    return gridElemId
+    const gridElemId = `${this.targetEl[0].id}_grid`.replace('-', '_');
+    return gridElemId;
   }
 
   getGridApiId() {
     // angular doesn't allow `-` in scope variable name
-    const gridApiId = `${this.targetEl[0].id}_gridApi`.replace('-', '_')
-    return gridApiId
+    const gridApiId = `${this.targetEl[0].id}_gridApi`.replace('-', '_');
+    return gridApiId;
   }
 
   refresh() {
-    const gridElemId = this.getGridElemId()
-    const gridElem = angular.element(`#${gridElemId}`)
+    const gridElemId = this.getGridElemId();
+    const gridElem = angular.element(`#${gridElemId}`);
 
     if (gridElem) {
-      gridElem.css('height', this.targetEl.height() - 10)
+      gridElem.css('height', this.targetEl.height() - 10);
     }
   }
 
   refreshGrid() {
-    const gridElemId = this.getGridElemId()
-    const gridElem = angular.element(`#${gridElemId}`)
+    const gridElemId = this.getGridElemId();
+    const gridElem = angular.element(`#${gridElemId}`);
 
     if (gridElem) {
-      const scope = this.getScope()
-      const gridApiId = this.getGridApiId()
-      scope[gridApiId].core.notifyDataChange(this._uiGridConstants.dataChange.ALL)
+      const scope = this.getScope();
+      const gridApiId = this.getGridApiId();
+      scope[gridApiId].core.notifyDataChange(this._uiGridConstants.dataChange.ALL);
     }
   }
 
   updateColDefType(colDef, type) {
-    if (type === colDef.type) { return }
+    if (type === colDef.type) {
+      return;
+    }
 
-    colDef.type = type
-    const colName = colDef.name
-    const config = this.config
+    colDef.type = type;
+    const colName = colDef.name;
+    const config = this.config;
     if (config.tableColumnTypeState.names && config.tableColumnTypeState.names[colName]) {
-      config.tableColumnTypeState.names[colName] = type
-      this.persistConfigWithGridState(this.config)
+      config.tableColumnTypeState.names[colName] = type;
+      this.persistConfigWithGridState(this.config);
     }
   }
 
   addColumnMenus(gridOptions) {
-    if (!gridOptions || !gridOptions.columnDefs) { return }
+    if (!gridOptions || !gridOptions.columnDefs) {
+      return;
+    }
 
-    const self = this // for closure
+    const self = this; // for closure
 
     // SHOULD use `function() { ... }` syntax for each action to get `this`
-    gridOptions.columnDefs.map(colDef => {
+    gridOptions.columnDefs.map((colDef) => {
       colDef.menuItems = [
         {
           title: 'Type: String',
           action: function() {
-            self.updateColDefType(this.context.col.colDef, TableColumnType.STRING)
+            self.updateColDefType(this.context.col.colDef, TableColumnType.STRING);
           },
           active: function() {
-            return this.context.col.colDef.type === TableColumnType.STRING
+            return this.context.col.colDef.type === TableColumnType.STRING;
           },
         },
         {
           title: 'Type: Number',
           action: function() {
-            self.updateColDefType(this.context.col.colDef, TableColumnType.NUMBER)
+            self.updateColDefType(this.context.col.colDef, TableColumnType.NUMBER);
           },
           active: function() {
-            return this.context.col.colDef.type === TableColumnType.NUMBER
+            return this.context.col.colDef.type === TableColumnType.NUMBER;
           },
         },
         {
           title: 'Type: Date',
           action: function() {
-            self.updateColDefType(this.context.col.colDef, TableColumnType.DATE)
+            self.updateColDefType(this.context.col.colDef, TableColumnType.DATE);
           },
           active: function() {
-            return this.context.col.colDef.type === TableColumnType.DATE
+            return this.context.col.colDef.type === TableColumnType.DATE;
           },
         },
-      ]
-    })
+      ];
+    });
   }
 
   setDynamicGridOptions(gridOptions, config) {
     // parse based on their type definitions
-    const parsed = parseTableOption(TABLE_OPTION_SPECS, config.tableOptionValue)
+    const parsed = parseTableOption(TABLE_OPTION_SPECS, config.tableOptionValue);
 
-    const { showAggregationFooter, useFilter, showPagination, } = parsed
+    const {showAggregationFooter, useFilter, showPagination} = parsed;
 
-    gridOptions.showGridFooter = false
-    gridOptions.showColumnFooter = showAggregationFooter
-    gridOptions.enableFiltering = useFilter
+    gridOptions.showGridFooter = false;
+    gridOptions.showColumnFooter = showAggregationFooter;
+    gridOptions.enableFiltering = useFilter;
 
-    gridOptions.enablePagination = showPagination
-    gridOptions.enablePaginationControls = showPagination
+    gridOptions.enablePagination = showPagination;
+    gridOptions.enablePaginationControls = showPagination;
 
     if (showPagination) {
-      gridOptions.paginationPageSize = 50
-      gridOptions.paginationPageSizes = [25, 50, 100, 250, 1000]
+      gridOptions.paginationPageSize = 50;
+      gridOptions.paginationPageSizes = [25, 50, 100, 250, 1000];
     }
 
     // selection can't be rendered dynamically in ui-grid 4.0.4
-    gridOptions.enableRowSelection = false
-    gridOptions.enableRowHeaderSelection = false
-    gridOptions.enableFullRowSelection = false
-    gridOptions.enableSelectAll = false
-    gridOptions.enableGroupHeaderSelection = false
-    gridOptions.enableSelectionBatchEvent = false
+    gridOptions.enableRowSelection = false;
+    gridOptions.enableRowHeaderSelection = false;
+    gridOptions.enableFullRowSelection = false;
+    gridOptions.enableSelectAll = false;
+    gridOptions.enableGroupHeaderSelection = false;
+    gridOptions.enableSelectionBatchEvent = false;
   }
 
-  render (tableData) {
-    const gridElemId = this.getGridElemId()
-    let gridElem = document.getElementById(gridElemId)
+  render(tableData) {
+    const gridElemId = this.getGridElemId();
+    let gridElem = document.getElementById(gridElemId);
 
-    const config = this.config
-    const self = this // for closure
+    const config = this.config;
+    const self = this; // for closure
 
     if (!gridElem) {
       // create, compile and append grid elem
@@ -261,125 +267,147 @@ export default class TableVisualization extends Visualization {
               ui-grid-move-columns
               ui-grid-grouping
               ui-grid-save-state
-              ui-grid-exporter></div>`)
+              ui-grid-exporter></div>`);
 
-      gridElem.css('height', this.targetEl.height() - 10)
-      const scope = this.getScope()
-      gridElem = this._compile(gridElem)(scope)
-      this.targetEl.append(gridElem)
+      gridElem.css('height', this.targetEl.height() - 10);
+      const scope = this.getScope();
+      gridElem = this._compile(gridElem)(scope);
+      this.targetEl.append(gridElem);
 
       // set gridOptions for this elem
-      const gridOptions = this.createGridOptions(tableData, onRegisterApiCallback, config)
-      this.setDynamicGridOptions(gridOptions, config)
-      this.addColumnMenus(gridOptions)
-      scope[gridElemId] = gridOptions
+      const gridOptions = this.createGridOptions(tableData, onRegisterApiCallback, config);
+      this.setDynamicGridOptions(gridOptions, config);
+      this.addColumnMenus(gridOptions);
+      scope[gridElemId] = gridOptions;
 
       // set gridApi for this elem
-      const gridApiId = this.getGridApiId()
+      const gridApiId = this.getGridApiId();
       const onRegisterApiCallback = (gridApi) => {
-        scope[gridApiId] = gridApi
+        scope[gridApiId] = gridApi;
         // should restore state before registering APIs
 
         // register callbacks for change evens
         // should persist `self.config` instead `config` (closure issue)
-        gridApi.core.on.columnVisibilityChanged(scope, () => { self.persistConfigWithGridState(self.config) })
-        gridApi.colMovable.on.columnPositionChanged(scope, () => { self.persistConfigWithGridState(self.config) })
-        gridApi.core.on.sortChanged(scope, () => { self.persistConfigWithGridState(self.config) })
-        gridApi.core.on.filterChanged(scope, () => { self.persistConfigWithGridState(self.config) })
-        gridApi.grouping.on.aggregationChanged(scope, () => { self.persistConfigWithGridState(self.config) })
-        gridApi.grouping.on.groupingChanged(scope, () => { self.persistConfigWithGridState(self.config) })
-        gridApi.treeBase.on.rowCollapsed(scope, () => { self.persistConfigWithGridState(self.config) })
-        gridApi.treeBase.on.rowExpanded(scope, () => { self.persistConfigWithGridState(self.config) })
-        gridApi.colResizable.on.columnSizeChanged(scope, () => { self.persistConfigWithGridState(self.config) })
+        gridApi.core.on.columnVisibilityChanged(scope, () => {
+          self.persistConfigWithGridState(self.config);
+        });
+        gridApi.colMovable.on.columnPositionChanged(scope, () => {
+          self.persistConfigWithGridState(self.config);
+        });
+        gridApi.core.on.sortChanged(scope, () => {
+          self.persistConfigWithGridState(self.config);
+        });
+        gridApi.core.on.filterChanged(scope, () => {
+          self.persistConfigWithGridState(self.config);
+        });
+        gridApi.grouping.on.aggregationChanged(scope, () => {
+          self.persistConfigWithGridState(self.config);
+        });
+        gridApi.grouping.on.groupingChanged(scope, () => {
+          self.persistConfigWithGridState(self.config);
+        });
+        gridApi.treeBase.on.rowCollapsed(scope, () => {
+          self.persistConfigWithGridState(self.config);
+        });
+        gridApi.treeBase.on.rowExpanded(scope, () => {
+          self.persistConfigWithGridState(self.config);
+        });
+        gridApi.colResizable.on.columnSizeChanged(scope, () => {
+          self.persistConfigWithGridState(self.config);
+        });
 
         // pagination doesn't follow usual life-cycle in ui-grid v4.0.4
         // gridApi.pagination.on.paginationChanged(scope, () => { self.persistConfigWithGridState(self.config) })
         // TBD: do we need to propagate row selection?
         // gridApi.selection.on.rowSelectionChanged(scope, () => { self.persistConfigWithGridState(self.config) })
         // gridApi.selection.on.rowSelectionChangedBatch(scope, () => { self.persistConfigWithGridState(self.config) })
-      }
-      gridOptions.onRegisterApi = onRegisterApiCallback
+      };
+      gridOptions.onRegisterApi = onRegisterApiCallback;
     } else {
       // don't need to update gridOptions.data since it's synchronized by paragraph execution
-      const gridOptions = this.getGridOptions()
-      this.setDynamicGridOptions(gridOptions, config)
-      this.refreshGrid()
+      const gridOptions = this.getGridOptions();
+      this.setDynamicGridOptions(gridOptions, config);
+      this.refreshGrid();
     }
 
-    const columnDefs = this.getGridOptions().columnDefs
-    updateColumnTypeState(tableData.columns, config, columnDefs)
+    const columnDefs = this.getGridOptions().columnDefs;
+    updateColumnTypeState(tableData.columns, config, columnDefs);
     // SHOULD restore grid state after columnDefs are updated
-    this.restoreGridState(config.tableGridState)
+    this.restoreGridState(config.tableGridState);
   }
 
   restoreGridState(gridState) {
-    if (!gridState) { return }
+    if (!gridState) {
+      return;
+    }
 
     // should set isRestoring to avoid that changed* events are triggered while restoring
-    this.isRestoring = true
-    const gridApi = this.getGridApi()
+    this.isRestoring = true;
+    const gridApi = this.getGridApi();
 
     // restore grid state when gridApi is available
     if (!gridApi) {
-      setTimeout(() => this.restoreGridState(gridState), 100)
+      setTimeout(() => this.restoreGridState(gridState), 100);
     } else {
-      gridApi.saveState.restore(this.getScope(), gridState)
-      this.isRestoring = false
+      gridApi.saveState.restore(this.getScope(), gridState);
+      this.isRestoring = false;
     }
   }
 
-  destroy () {
+  destroy() {
   }
 
-  getTransformation () {
-    return this.passthrough
+  getTransformation() {
+    return this.passthrough;
   }
 
   getScope() {
-    const scope = this.targetEl.scope()
-    return scope
+    const scope = this.targetEl.scope();
+    return scope;
   }
 
   getGridOptions() {
-    const scope = this.getScope()
-    const gridElemId = this.getGridElemId()
-    return scope[gridElemId]
+    const scope = this.getScope();
+    const gridElemId = this.getGridElemId();
+    return scope[gridElemId];
   }
 
   getGridApi() {
-    const scope = this.targetEl.scope()
-    const gridApiId = this.getGridApiId()
-    return scope[gridApiId]
+    const scope = this.targetEl.scope();
+    const gridApiId = this.getGridApiId();
+    return scope[gridApiId];
   }
 
   persistConfigImmediatelyWithGridState(config) {
-    this.persistConfigWithGridState(config)
+    this.persistConfigWithGridState(config);
   }
 
   persistConfigWithGridState(config) {
-    if (this.isRestoring) { return }
+    if (this.isRestoring) {
+      return;
+    }
 
-    const gridApi = this.getGridApi()
-    config.tableGridState = gridApi.saveState.save()
-    this.emitConfig(config)
+    const gridApi = this.getGridApi();
+    config.tableGridState = gridApi.saveState.save();
+    this.emitConfig(config);
   }
 
   persistConfig(config) {
-    this.emitConfig(config)
+    this.emitConfig(config);
   }
 
-  getSetting (chart) {
-    const self = this // for closure in scope
-    const configObj = self.config
+  getSetting(chart) {
+    const self = this; // for closure in scope
+    const configObj = self.config;
 
     // emit config if it's updated in `render`
     if (configObj.initialized) {
-      configObj.initialized = false
-      this.persistConfig(configObj) // should persist w/o state
+      configObj.initialized = false;
+      this.persistConfig(configObj); // should persist w/o state
     } else if (configObj.tableColumnTypeState &&
       configObj.tableColumnTypeState.updated) {
-      configObj.tableColumnTypeState.updated = false
-      this.persistConfig(configObj) // should persist w/o state
+      configObj.tableColumnTypeState.updated = false;
+      this.persistConfig(configObj); // should persist w/o state
     }
 
     return {
@@ -393,27 +421,27 @@ export default class TableVisualization extends Visualization {
         isTextareaWidget: isTextareaWidget,
         isBtnGroupWidget: isBtnGroupWidget,
         tableOptionValueChanged: () => {
-          self.persistConfigWithGridState(configObj)
+          self.persistConfigWithGridState(configObj);
         },
         saveTableOption: () => {
-          self.persistConfigWithGridState(configObj)
+          self.persistConfigWithGridState(configObj);
         },
         resetTableOption: () => {
-          resetTableOptionConfig(configObj)
-          initializeTableConfig(configObj, TABLE_OPTION_SPECS)
-          self.persistConfigWithGridState(configObj)
+          resetTableOptionConfig(configObj);
+          initializeTableConfig(configObj, TABLE_OPTION_SPECS);
+          self.persistConfigWithGridState(configObj);
         },
         tableWidgetOnKeyDown: (event, optSpec) => {
-          const code = event.keyCode || event.which
+          const code = event.keyCode || event.which;
           if (code === 13 && isInputWidget(optSpec)) {
-            self.persistConfigWithGridState(configObj)
+            self.persistConfigWithGridState(configObj);
           } else if (code === 13 && event.shiftKey && isTextareaWidget(optSpec)) {
-            self.persistConfigWithGridState(configObj)
+            self.persistConfigWithGridState(configObj);
           }
 
-          event.stopPropagation() /** avoid to conflict with paragraph shortcuts */
-        }
-      }
-    }
+          event.stopPropagation(); /** avoid to conflict with paragraph shortcuts */
+        },
+      },
+    };
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/builtins/visualization-util.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/builtins/visualization-util.js b/zeppelin-web/src/app/visualization/builtins/visualization-util.js
index cd9cd48..a82a18e 100644
--- a/zeppelin-web/src/app/visualization/builtins/visualization-util.js
+++ b/zeppelin-web/src/app/visualization/builtins/visualization-util.js
@@ -18,7 +18,7 @@ export const Widget = {
   TEXTAREA: 'textarea',
   OPTION: 'option',
   BTN_GROUP: 'btn-group',
-}
+};
 
 export const ValueType = {
   INT: 'int',
@@ -26,7 +26,7 @@ export const ValueType = {
   BOOLEAN: 'boolean',
   STRING: 'string',
   JSON: 'JSON',
-}
+};
 
 export const TableColumnType = {
   STRING: 'string',
@@ -35,138 +35,170 @@ export const TableColumnType = {
   DATE: 'date',
   OBJECT: 'object',
   NUMBER_STR: 'numberStr',
-}
+};
 
-export const DefaultTableColumnType = TableColumnType.STRING
+export const DefaultTableColumnType = TableColumnType.STRING;
 
-export function isInputWidget (spec) { return spec.widget === Widget.INPUT }
-export function isOptionWidget (spec) { return spec.widget === Widget.OPTION }
-export function isCheckboxWidget (spec) { return spec.widget === Widget.CHECKBOX }
-export function isTextareaWidget (spec) { return spec.widget === Widget.TEXTAREA }
-export function isBtnGroupWidget (spec) { return spec.widget === Widget.BTN_GROUP }
+export function isInputWidget(spec) {
+  return spec.widget === Widget.INPUT;
+}
+export function isOptionWidget(spec) {
+  return spec.widget === Widget.OPTION;
+}
+export function isCheckboxWidget(spec) {
+  return spec.widget === Widget.CHECKBOX;
+}
+export function isTextareaWidget(spec) {
+  return spec.widget === Widget.TEXTAREA;
+}
+export function isBtnGroupWidget(spec) {
+  return spec.widget === Widget.BTN_GROUP;
+}
 
 export function resetTableOptionConfig(config) {
-  delete config.tableOptionSpecHash
-  config.tableOptionSpecHash = {}
-  delete config.tableOptionValue
-  config.tableOptionValue = {}
-  delete config.tableColumnTypeState.names
-  config.tableColumnTypeState.names = {}
-  config.updated = false
-  return config
+  delete config.tableOptionSpecHash;
+  config.tableOptionSpecHash = {};
+  delete config.tableOptionValue;
+  config.tableOptionValue = {};
+  delete config.tableColumnTypeState.names;
+  config.tableColumnTypeState.names = {};
+  config.updated = false;
+  return config;
 }
 
 export function initializeTableConfig(config, tableOptionSpecs) {
-  if (typeof config.tableOptionValue === 'undefined') { config.tableOptionValue = {} }
-  if (typeof config.tableGridState === 'undefined') { config.tableGridState = {} }
-  if (typeof config.tableColumnTypeState === 'undefined') { config.tableColumnTypeState = {} }
+  if (typeof config.tableOptionValue === 'undefined') {
+    config.tableOptionValue = {};
+  }
+  if (typeof config.tableGridState === 'undefined') {
+    config.tableGridState = {};
+  }
+  if (typeof config.tableColumnTypeState === 'undefined') {
+    config.tableColumnTypeState = {};
+  }
 
   // should remove `$$hashKey` using angular.toJson
-  const newSpecHash = JSON.stringify(JSON.parse(angular.toJson(tableOptionSpecs)))
-  const previousSpecHash = config.tableOptionSpecHash
+  const newSpecHash = JSON.stringify(JSON.parse(angular.toJson(tableOptionSpecs)));
+  const previousSpecHash = config.tableOptionSpecHash;
 
   // check whether spec is updated or not
   if (typeof previousSpecHash === 'undefined' || (previousSpecHash !== newSpecHash)) {
-    resetTableOptionConfig(config)
+    resetTableOptionConfig(config);
 
-    config.tableOptionSpecHash = newSpecHash
-    config.initialized = true
+    config.tableOptionSpecHash = newSpecHash;
+    config.initialized = true;
 
     // reset all persisted option values if spec is updated
     for (let i = 0; i < tableOptionSpecs.length; i++) {
-      const option = tableOptionSpecs[i]
-      config.tableOptionValue[option.name] = option.defaultValue
+      const option = tableOptionSpecs[i];
+      config.tableOptionValue[option.name] = option.defaultValue;
     }
   }
 
-  return config
+  return config;
 }
 
 export function parseTableOption(specs, persistedTableOption) {
   /** copy original params */
-  const parsed = JSON.parse(JSON.stringify(persistedTableOption))
+  const parsed = JSON.parse(JSON.stringify(persistedTableOption));
 
   for (let i = 0; i < specs.length; i++) {
-    const s = specs[i]
-    const name = s.name
+    const s = specs[i];
+    const name = s.name;
 
     if (s.valueType === ValueType.INT &&
       typeof parsed[name] !== 'number') {
-      try { parsed[name] = parseInt(parsed[name]) } catch (error) { parsed[name] = s.defaultValue }
+      try {
+        parsed[name] = parseInt(parsed[name]);
+      } catch (error) {
+        parsed[name] = s.defaultValue;
+      }
     } else if (s.valueType === ValueType.FLOAT &&
       typeof parsed[name] !== 'number') {
-      try { parsed[name] = parseFloat(parsed[name]) } catch (error) { parsed[name] = s.defaultValue }
+      try {
+        parsed[name] = parseFloat(parsed[name]);
+      } catch (error) {
+        parsed[name] = s.defaultValue;
+      }
     } else if (s.valueType === ValueType.BOOLEAN) {
       if (parsed[name] === 'false') {
-        parsed[name] = false
+        parsed[name] = false;
       } else if (parsed[name] === 'true') {
-        parsed[name] = true
+        parsed[name] = true;
       } else if (typeof parsed[name] !== 'boolean') {
-        parsed[name] = s.defaultValue
+        parsed[name] = s.defaultValue;
       }
     } else if (s.valueType === ValueType.JSON) {
       if (parsed[name] !== null && typeof parsed[name] !== 'object') {
-        try { parsed[name] = JSON.parse(parsed[name]) } catch (error) { parsed[name] = s.defaultValue }
+        try {
+          parsed[name] = JSON.parse(parsed[name]);
+        } catch (error) {
+          parsed[name] = s.defaultValue;
+        }
       } else if (parsed[name] === null) {
-        parsed[name] = s.defaultValue
+        parsed[name] = s.defaultValue;
       }
     }
   }
 
-  return parsed
+  return parsed;
 }
 
 export function isColumnNameUpdated(prevColumnNames, newColumnNames) {
-  if (typeof prevColumnNames === 'undefined') { return true }
+  if (typeof prevColumnNames === 'undefined') {
+    return true;
+  }
 
-  let columnNameUpdated = false
+  let columnNameUpdated = false;
 
   for (let prevColName in prevColumnNames) {
     if (!newColumnNames[prevColName]) {
-      return true
+      return true;
     }
   }
 
   if (!columnNameUpdated) {
     for (let newColName in newColumnNames) {
       if (!prevColumnNames[newColName]) {
-        return true
+        return true;
       }
     }
   }
 
-  return false
+  return false;
 }
 
 export function updateColumnTypeState(columns, config, columnDefs) {
-  const columnTypeState = config.tableColumnTypeState
+  const columnTypeState = config.tableColumnTypeState;
 
-  if (!columnTypeState) { return }
+  if (!columnTypeState) {
+    return;
+  }
 
   // compare objects because order might be changed
-  const prevColumnNames = columnTypeState.names || {}
+  const prevColumnNames = columnTypeState.names || {};
   const newColumnNames = columns.reduce((acc, c) => {
-    const prevColumnType = prevColumnNames[c.name]
+    const prevColumnType = prevColumnNames[c.name];
 
     // use previous column type if exists
     if (prevColumnType) {
-      acc[c.name] = prevColumnType
+      acc[c.name] = prevColumnType;
     } else {
-      acc[c.name] = DefaultTableColumnType
+      acc[c.name] = DefaultTableColumnType;
     }
-    return acc
-  }, {})
+    return acc;
+  }, {});
 
-  let columnNameUpdated = isColumnNameUpdated(prevColumnNames, newColumnNames)
+  let columnNameUpdated = isColumnNameUpdated(prevColumnNames, newColumnNames);
 
   if (columnNameUpdated) {
-    columnTypeState.names = newColumnNames
-    columnTypeState.updated = true
+    columnTypeState.names = newColumnNames;
+    columnTypeState.updated = true;
   }
 
   // update `columnDefs[n].type`
   for (let i = 0; i < columnDefs.length; i++) {
-    const colName = columnDefs[i].name
-    columnDefs[i].type = columnTypeState.names[colName]
+    const colName = columnDefs[i].name;
+    columnDefs[i].type = columnTypeState.names[colName];
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/visualization/visualization.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/visualization/visualization.js b/zeppelin-web/src/app/visualization/visualization.js
index 6b6e36a..f6475cb 100644
--- a/zeppelin-web/src/app/visualization/visualization.js
+++ b/zeppelin-web/src/app/visualization/visualization.js
@@ -16,12 +16,12 @@
  * Base class for visualization.
  */
 export default class Visualization {
-  constructor (targetEl, config) {
-    this.targetEl = targetEl
-    this.config = config
-    this._dirty = false
-    this._active = false
-    this._emitter = () => {}
+  constructor(targetEl, config) {
+    this.targetEl = targetEl;
+    this.config = config;
+    this._dirty = false;
+    this._active = false;
+    this._emitter = () => {};
   }
 
   /**
@@ -29,33 +29,33 @@ export default class Visualization {
    * @abstract
    * @return {Transformation}
    */
-  getTransformation () {
+  getTransformation() {
     // override this
-    throw new TypeError('Visualization.getTransformation() should be overrided')
+    throw new TypeError('Visualization.getTransformation() should be overrided');
   }
 
   /**
    * Method will be invoked when data or configuration changed.
    * @abstract
    */
-  render (tableData) {
+  render(tableData) {
     // override this
-    throw new TypeError('Visualization.render() should be overrided')
+    throw new TypeError('Visualization.render() should be overrided');
   }
 
   /**
    * Refresh visualization.
    */
-  refresh () {
+  refresh() {
     // override this
-    console.warn('A chart is missing refresh function, it might not work preperly')
+    console.warn('A chart is missing refresh function, it might not work preperly');
   }
 
   /**
    * Method will be invoked when visualization need to be destroyed.
    * Don't need to destroy this.targetEl.
    */
-  destroy () {
+  destroy() {
     // override this
   }
 
@@ -65,113 +65,117 @@ export default class Visualization {
    *   scope : an object to bind to template scope
    * }
    */
-  getSetting () {
+  getSetting() {
     // override this
   }
 
   /**
    * Activate. Invoked when visualization is selected.
    */
-  activate () {
+  activate() {
     if (!this._active || this._dirty) {
-      this.refresh()
-      this._dirty = false
+      this.refresh();
+      this._dirty = false;
     }
-    this._active = true
+    this._active = true;
   }
 
   /**
    * Deactivate. Invoked when visualization is de selected.
    */
-  deactivate () {
-    this._active = false
+  deactivate() {
+    this._active = false;
   }
 
   /**
    * Is active.
    */
-  isActive () {
-    return this._active
+  isActive() {
+    return this._active;
   }
 
   /**
    * When window or paragraph is resized.
    */
-  resize () {
+  resize() {
     if (this.isActive()) {
-      this.refresh()
+      this.refresh();
     } else {
-      this._dirty = true
+      this._dirty = true;
     }
   }
 
   /**
    * Set new config.
    */
-  setConfig (config) {
-    this.config = config
+  setConfig(config) {
+    this.config = config;
     if (this.isActive()) {
-      this.refresh()
+      this.refresh();
     } else {
-      this._dirty = true
+      this._dirty = true;
     }
   }
 
   /**
    * Emit config. config will sent to server and saved.
    */
-  emitConfig (config) {
-    this._emitter(config)
+  emitConfig(config) {
+    this._emitter(config);
   }
 
   /**
    * Render setting.
    */
-  renderSetting (targetEl) {
-    let setting = this.getSetting()
+  renderSetting(targetEl) {
+    let setting = this.getSetting();
     if (!setting) {
-      return
+      return;
     }
 
     // already readered
     if (this._scope) {
-      let self = this
-      this._scope.$apply(function () {
+      let self = this;
+      this._scope.$apply(function() {
         for (let k in setting.scope) {
-          self._scope[k] = setting.scope[k]
+          if (setting.scope.hasOwnProperty(k)) {
+            self._scope[k] = setting.scope[k];
+          }
         }
 
         for (let k in self._prevSettingScope) {
           if (!setting.scope[k]) {
-            self._scope[k] = setting.scope[k]
+            self._scope[k] = setting.scope[k];
           }
         }
-      })
-      return
+      });
+      return;
     } else {
-      this._prevSettingScope = setting.scope
+      this._prevSettingScope = setting.scope;
     }
 
-    let scope = this._createNewScope()
+    let scope = this._createNewScope();
     for (let k in setting.scope) {
-      scope[k] = setting.scope[k]
+      if (setting.scope.hasOwnProperty(k)) {
+        scope[k] = setting.scope[k];
+      }
     }
-    let template = setting.template
+    let template = setting.template;
 
     if (template.split('\n').length === 1 &&
         template.endsWith('.html')) { // template is url
-      this._templateRequest(template).then(t =>
+      this._templateRequest(template).then((t) =>
       _renderSetting(this, targetEl, t, scope)
-      )
+      );
     } else {
-      _renderSetting(this, targetEl, template, scope)
+      _renderSetting(this, targetEl, template, scope);
     }
   }
 }
 
-function _renderSetting (instance, targetEl, template, scope) {
-  instance._targetEl = targetEl
-  targetEl.html(template)
-  instance._compile(targetEl.contents())(scope)
-  instance._scope = scope
+function _renderSetting(instance, targetEl, template, scope) {
+  instance._targetEl = targetEl;
+  targetEl.html(template);
+  instance._compile(targetEl.contents())(scope);
+  instance._scope = scope;
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/array-ordering/array-ordering.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/array-ordering/array-ordering.service.js b/zeppelin-web/src/components/array-ordering/array-ordering.service.js
index 6fa1ad9..1f275e6 100644
--- a/zeppelin-web/src/components/array-ordering/array-ordering.service.js
+++ b/zeppelin-web/src/components/array-ordering/array-ordering.service.js
@@ -12,51 +12,51 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').service('arrayOrderingSrv', ArrayOrderingService)
+angular.module('zeppelinWebApp').service('arrayOrderingSrv', ArrayOrderingService);
 
 function ArrayOrderingService(TRASH_FOLDER_ID) {
-  'ngInject'
+  'ngInject';
 
-  let arrayOrderingSrv = this
+  let arrayOrderingSrv = this;
 
-  this.noteListOrdering = function (note) {
+  this.noteListOrdering = function(note) {
     if (note.id === TRASH_FOLDER_ID) {
-      return '\uFFFF'
+      return '\uFFFF';
     }
-    return arrayOrderingSrv.getNoteName(note)
-  }
+    return arrayOrderingSrv.getNoteName(note);
+  };
 
-  this.getNoteName = function (note) {
+  this.getNoteName = function(note) {
     if (note.name === undefined || note.name.trim() === '') {
-      return 'Note ' + note.id
+      return 'Note ' + note.id;
     } else {
-      return note.name
+      return note.name;
     }
-  }
+  };
 
-  this.noteComparator = function (v1, v2) {
-    let note1 = v1.value || v1
-    let note2 = v2.value || v2
+  this.noteComparator = function(v1, v2) {
+    let note1 = v1.value || v1;
+    let note2 = v2.value || v2;
 
     if (note1.id === TRASH_FOLDER_ID) {
-      return 1
+      return 1;
     }
 
     if (note2.id === TRASH_FOLDER_ID) {
-      return -1
+      return -1;
     }
 
     if (note1.children === undefined && note2.children !== undefined) {
-      return 1
+      return 1;
     }
 
     if (note1.children !== undefined && note2.children === undefined) {
-      return -1
+      return -1;
     }
 
-    let noteName1 = arrayOrderingSrv.getNoteName(note1)
-    let noteName2 = arrayOrderingSrv.getNoteName(note2)
+    let noteName1 = arrayOrderingSrv.getNoteName(note1);
+    let noteName2 = arrayOrderingSrv.getNoteName(note2);
 
-    return noteName1.localeCompare(noteName2)
-  }
+    return noteName1.localeCompare(noteName2);
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/base-url/base-url.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/base-url/base-url.service.js b/zeppelin-web/src/components/base-url/base-url.service.js
index 6ef55b9..845293c 100644
--- a/zeppelin-web/src/components/base-url/base-url.service.js
+++ b/zeppelin-web/src/components/base-url/base-url.service.js
@@ -12,39 +12,39 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').service('baseUrlSrv', BaseUrlService)
+angular.module('zeppelinWebApp').service('baseUrlSrv', BaseUrlService);
 
 function BaseUrlService() {
-  this.getPort = function () {
-    let port = Number(location.port)
+  this.getPort = function() {
+    let port = Number(location.port);
     if (!port) {
-      port = 80
+      port = 80;
       if (location.protocol === 'https:') {
-        port = 443
+        port = 443;
       }
     }
     // Exception for when running locally via grunt
     if (port === process.env.WEB_PORT) {
-      port = process.env.SERVER_PORT
+      port = process.env.SERVER_PORT;
     }
-    return port
-  }
+    return port;
+  };
 
-  this.getWebsocketUrl = function () {
-    let wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'
+  this.getWebsocketUrl = function() {
+    let wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
     return wsProtocol + '//' + location.hostname + ':' + this.getPort() +
-      skipTrailingSlash(location.pathname) + '/ws'
-  }
+      skipTrailingSlash(location.pathname) + '/ws';
+  };
 
   this.getBase = function() {
-    return location.protocol + '//' + location.hostname + ':' + this.getPort() + location.pathname
-  }
+    return location.protocol + '//' + location.hostname + ':' + this.getPort() + location.pathname;
+  };
 
-  this.getRestApiBase = function () {
-    return skipTrailingSlash(this.getBase()) + '/api'
-  }
+  this.getRestApiBase = function() {
+    return skipTrailingSlash(this.getBase()) + '/api';
+  };
 
-  const skipTrailingSlash = function (path) {
-    return path.replace(/\/$/, '')
-  }
+  const skipTrailingSlash = function(path) {
+    return path.replace(/\/$/, '');
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/login/login.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/login/login.controller.js b/zeppelin-web/src/components/login/login.controller.js
index 9190950..9a42d5f 100644
--- a/zeppelin-web/src/components/login/login.controller.js
+++ b/zeppelin-web/src/components/login/login.controller.js
@@ -12,73 +12,73 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').controller('LoginCtrl', LoginCtrl)
+angular.module('zeppelinWebApp').controller('LoginCtrl', LoginCtrl);
 
-function LoginCtrl ($scope, $rootScope, $http, $httpParamSerializer, baseUrlSrv, $location, $timeout) {
-  'ngInject'
+function LoginCtrl($scope, $rootScope, $http, $httpParamSerializer, baseUrlSrv, $location, $timeout) {
+  'ngInject';
 
-  $scope.SigningIn = false
-  $scope.loginParams = {}
-  $scope.login = function () {
-    $scope.SigningIn = true
+  $scope.SigningIn = false;
+  $scope.loginParams = {};
+  $scope.login = function() {
+    $scope.SigningIn = true;
     $http({
       method: 'POST',
       url: baseUrlSrv.getRestApiBase() + '/login',
       headers: {
-        'Content-Type': 'application/x-www-form-urlencoded'
+        'Content-Type': 'application/x-www-form-urlencoded',
       },
       data: $httpParamSerializer({
         'userName': $scope.loginParams.userName,
-        'password': $scope.loginParams.password
-      })
-    }).then(function successCallback (response) {
-      $rootScope.ticket = response.data.body
-      angular.element('#loginModal').modal('toggle')
-      $rootScope.$broadcast('loginSuccess', true)
-      $rootScope.userName = $scope.loginParams.userName
-      $scope.SigningIn = false
+        'password': $scope.loginParams.password,
+      }),
+    }).then(function successCallback(response) {
+      $rootScope.ticket = response.data.body;
+      angular.element('#loginModal').modal('toggle');
+      $rootScope.$broadcast('loginSuccess', true);
+      $rootScope.userName = $scope.loginParams.userName;
+      $scope.SigningIn = false;
 
       // redirect to the page from where the user originally was
       if ($location.search() && $location.search()['ref']) {
-        $timeout(function () {
-          let redirectLocation = $location.search()['ref']
-          $location.$$search = {}
-          $location.path(redirectLocation)
-        }, 100)
+        $timeout(function() {
+          let redirectLocation = $location.search()['ref'];
+          $location.$$search = {};
+          $location.path(redirectLocation);
+        }, 100);
       }
-    }, function errorCallback (errorResponse) {
-      $scope.loginParams.errorText = 'The username and password that you entered don\'t match.'
-      $scope.SigningIn = false
-    })
-  }
+    }, function errorCallback(errorResponse) {
+      $scope.loginParams.errorText = 'The username and password that you entered don\'t match.';
+      $scope.SigningIn = false;
+    });
+  };
 
-  let initValues = function () {
+  let initValues = function() {
     $scope.loginParams = {
       userName: '',
-      password: ''
-    }
-  }
+      password: '',
+    };
+  };
 
   // handle session logout message received from WebSocket
-  $rootScope.$on('session_logout', function (event, data) {
+  $rootScope.$on('session_logout', function(event, data) {
     if ($rootScope.userName !== '') {
-      $rootScope.userName = ''
-      $rootScope.ticket = undefined
+      $rootScope.userName = '';
+      $rootScope.ticket = undefined;
 
-      setTimeout(function () {
-        $scope.loginParams = {}
-        $scope.loginParams.errorText = data.info
-        angular.element('.nav-login-btn').click()
-      }, 1000)
-      let locationPath = $location.path()
-      $location.path('/').search('ref', locationPath)
+      setTimeout(function() {
+        $scope.loginParams = {};
+        $scope.loginParams.errorText = data.info;
+        angular.element('.nav-login-btn').click();
+      }, 1000);
+      let locationPath = $location.path();
+      $location.path('/').search('ref', locationPath);
     }
-  })
+  });
 
   /*
    ** $scope.$on functions below
    */
-  $scope.$on('initLoginValues', function () {
-    initValues()
-  })
+  $scope.$on('initLoginValues', function() {
+    initValues();
+  });
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/components/navbar/expand-collapse/expand-collapse.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/navbar/expand-collapse/expand-collapse.directive.js b/zeppelin-web/src/components/navbar/expand-collapse/expand-collapse.directive.js
index e4280e8..58629af 100644
--- a/zeppelin-web/src/components/navbar/expand-collapse/expand-collapse.directive.js
+++ b/zeppelin-web/src/components/navbar/expand-collapse/expand-collapse.directive.js
@@ -12,37 +12,37 @@
  * limitations under the License.
  */
 
-import './expand-collapse.css'
+import './expand-collapse.css';
 
-angular.module('zeppelinWebApp').directive('expandCollapse', expandCollapseDirective)
+angular.module('zeppelinWebApp').directive('expandCollapse', expandCollapseDirective);
 
 function expandCollapseDirective() {
   return {
     restrict: 'EA',
-    link: function (scope, element, attrs) {
-      angular.element(element).click(function (event) {
+    link: function(scope, element, attrs) {
+      angular.element(element).click(function(event) {
         if (angular.element(element).next('.expandable:visible').length > 1) {
-          angular.element(element).next('.expandable:visible').slideUp('slow')
-          angular.element(element).find('i.fa-folder-open').toggleClass('fa-folder fa-folder-open')
+          angular.element(element).next('.expandable:visible').slideUp('slow');
+          angular.element(element).find('i.fa-folder-open').toggleClass('fa-folder fa-folder-open');
         } else {
-          angular.element(element).next('.expandable').first().slideToggle('200', function () {
+          angular.element(element).next('.expandable').first().slideToggle('200', function() {
             // do not toggle trash folder
             if (angular.element(element).find('.fa-trash-o').length === 0) {
-              angular.element(element).find('i').first().toggleClass('fa-folder fa-folder-open')
+              angular.element(element).find('i').first().toggleClass('fa-folder fa-folder-open');
             }
-          })
+          });
         }
 
-        let target = event.target
+        let target = event.target;
 
         // add note
         if (target.classList !== undefined && target.classList.contains('fa-plus') &&
           target.tagName.toLowerCase() === 'i') {
-          return
+          return;
         }
 
-        event.stopPropagation()
-      })
-    }
-  }
+        event.stopPropagation();
+      });
+    },
+  };
 }


[05/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/advanced-transformation-util.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/advanced-transformation-util.test.js b/zeppelin-web/src/app/tabledata/advanced-transformation-util.test.js
index 90f569f..84ea441 100644
--- a/zeppelin-web/src/app/tabledata/advanced-transformation-util.test.js
+++ b/zeppelin-web/src/app/tabledata/advanced-transformation-util.test.js
@@ -12,1728 +12,1730 @@
  * limitations under the License.
  */
 
-import * as Util from './advanced-transformation-util.js'
+import * as Util from './advanced-transformation-util.js';
 
 /* eslint-disable max-len */
 const MockParameter = {
-  'floatParam': { valueType: 'float', defaultValue: 10, description: '', },
-  'intParam': { valueType: 'int', defaultValue: 50, description: '', },
-  'jsonParam': { valueType: 'JSON', defaultValue: '', description: '', widget: 'textarea', },
-  'stringParam1': { valueType: 'string', defaultValue: '', description: '', },
-  'stringParam2': { valueType: 'string', defaultValue: '', description: '', widget: 'input', },
-  'boolParam': { valueType: 'boolean', defaultValue: false, description: '', widget: 'checkbox', },
-  'optionParam': { valueType: 'string', defaultValue: 'line', description: '', widget: 'option', optionValues: [ 'line', 'smoothedLine', ], },
-}
+  'floatParam': {valueType: 'float', defaultValue: 10, description: ''},
+  'intParam': {valueType: 'int', defaultValue: 50, description: ''},
+  'jsonParam': {valueType: 'JSON', defaultValue: '', description: '', widget: 'textarea'},
+  'stringParam1': {valueType: 'string', defaultValue: '', description: ''},
+  'stringParam2': {valueType: 'string', defaultValue: '', description: '', widget: 'input'},
+  'boolParam': {valueType: 'boolean', defaultValue: false, description: '', widget: 'checkbox'},
+  'optionParam': {valueType: 'string', defaultValue: 'line', description: '', widget: 'option', optionValues: ['line', 'smoothedLine']},
+};
 /* eslint-enable max-len */
 
 const MockAxis1 = {
-  'keyAxis': { dimension: 'multiple', axisType: 'key', },
-  'aggrAxis': { dimension: 'multiple', axisType: 'aggregator', },
-  'groupAxis': { dimension: 'multiple', axisType: 'group', },
-}
+  'keyAxis': {dimension: 'multiple', axisType: 'key'},
+  'aggrAxis': {dimension: 'multiple', axisType: 'aggregator'},
+  'groupAxis': {dimension: 'multiple', axisType: 'group'},
+};
 
 const MockAxis2 = {
-  'singleKeyAxis': { dimension: 'single', axisType: 'key', },
-  'limitedAggrAxis': { dimension: 'multiple', axisType: 'aggregator', maxAxisCount: 2, },
-  'groupAxis': { dimension: 'multiple', axisType: 'group', },
-}
+  'singleKeyAxis': {dimension: 'single', axisType: 'key'},
+  'limitedAggrAxis': {dimension: 'multiple', axisType: 'aggregator', maxAxisCount: 2},
+  'groupAxis': {dimension: 'multiple', axisType: 'group'},
+};
 
 const MockAxis3 = {
-  'customAxis1': { dimension: 'single', axisType: 'unique', },
-  'customAxis2': { dimension: 'multiple', axisType: 'value', },
-}
+  'customAxis1': {dimension: 'single', axisType: 'unique'},
+  'customAxis2': {dimension: 'multiple', axisType: 'value'},
+};
 
 const MockAxis4 = {
-  'key1Axis': { dimension: 'multiple', axisType: 'key', },
-  'key2Axis': { dimension: 'multiple', axisType: 'key', },
-  'aggrAxis': { dimension: 'multiple', axisType: 'aggregator', },
-  'groupAxis': { dimension: 'multiple', axisType: 'group', },
-}
+  'key1Axis': {dimension: 'multiple', axisType: 'key'},
+  'key2Axis': {dimension: 'multiple', axisType: 'key'},
+  'aggrAxis': {dimension: 'multiple', axisType: 'aggregator'},
+  'groupAxis': {dimension: 'multiple', axisType: 'group'},
+};
 
 // test spec for axis, param, widget
 const MockSpec = {
   charts: {
     'object-chart': {
-      transform: { method: 'object', },
+      transform: {method: 'object'},
       sharedAxis: true,
       axis: JSON.parse(JSON.stringify(MockAxis1)),
       parameter: MockParameter,
     },
 
     'array-chart': {
-      transform: { method: 'array', },
+      transform: {method: 'array'},
       sharedAxis: true,
       axis: JSON.parse(JSON.stringify(MockAxis1)),
       parameter: {
-        'arrayChartParam0': { valueType: 'string', defaultValue: '', description: 'param0', },
+        'arrayChartParam0': {valueType: 'string', defaultValue: '', description: 'param0'},
       },
     },
 
     'drillDown-chart': {
-      transform: { method: 'drill-down', },
+      transform: {method: 'drill-down'},
       axis: JSON.parse(JSON.stringify(MockAxis2)),
       parameter: {
-        'drillDownChartParam0': { valueType: 'string', defaultValue: '', description: 'param0', },
+        'drillDownChartParam0': {valueType: 'string', defaultValue: '', description: 'param0'},
       },
     },
 
     'raw-chart': {
-      transform: { method: 'raw', },
+      transform: {method: 'raw'},
       axis: JSON.parse(JSON.stringify(MockAxis3)),
       parameter: {
-        'rawChartParam0': { valueType: 'string', defaultValue: '', description: 'param0', },
+        'rawChartParam0': {valueType: 'string', defaultValue: '', description: 'param0'},
       },
     },
   },
-}
+};
 
 // test spec for transformation
 const MockSpec2 = {
   charts: {
     'object-chart': {
-      transform: { method: 'object', },
+      transform: {method: 'object'},
       sharedAxis: false,
       axis: JSON.parse(JSON.stringify(MockAxis1)),
       parameter: MockParameter,
     },
 
     'array-chart': {
-      transform: { method: 'array', },
+      transform: {method: 'array'},
       sharedAxis: false,
       axis: JSON.parse(JSON.stringify(MockAxis1)),
       parameter: {
-        'arrayChartParam0': { valueType: 'string', defaultValue: '', description: 'param0', },
+        'arrayChartParam0': {valueType: 'string', defaultValue: '', description: 'param0'},
       },
     },
 
     'drillDown-chart': {
-      transform: { method: 'drill-down', },
+      transform: {method: 'drill-down'},
       sharedAxis: false,
       axis: JSON.parse(JSON.stringify(MockAxis1)),
       parameter: {
-        'drillDownChartParam0': { valueType: 'string', defaultValue: '', description: 'param0', },
+        'drillDownChartParam0': {valueType: 'string', defaultValue: '', description: 'param0'},
       },
     },
 
     'array2Key-chart': {
-      transform: { method: 'array:2-key', },
+      transform: {method: 'array:2-key'},
       sharedAxis: false,
       axis: JSON.parse(JSON.stringify(MockAxis4)),
       parameter: {
-        'drillDownChartParam0': { valueType: 'string', defaultValue: '', description: 'param0', },
+        'drillDownChartParam0': {valueType: 'string', defaultValue: '', description: 'param0'},
       },
     },
 
     'raw-chart': {
-      transform: { method: 'raw', },
+      transform: {method: 'raw'},
       sharedAxis: false,
       axis: JSON.parse(JSON.stringify(MockAxis3)),
       parameter: {
-        'rawChartParam0': { valueType: 'string', defaultValue: '', description: 'param0', },
+        'rawChartParam0': {valueType: 'string', defaultValue: '', description: 'param0'},
       },
     },
   },
-}
+};
 
 /* eslint-disable max-len */
 const MockTableDataColumn = [
-  {'name': 'age', 'index': 0, 'aggr': 'sum', },
-  {'name': 'job', 'index': 1, 'aggr': 'sum', },
-  {'name': 'marital', 'index': 2, 'aggr': 'sum', },
-  {'name': 'education', 'index': 3, 'aggr': 'sum', },
-  {'name': 'default', 'index': 4, 'aggr': 'sum', },
-  {'name': 'balance', 'index': 5, 'aggr': 'sum', },
-  {'name': 'housing', 'index': 6, 'aggr': 'sum', },
-  {'name': 'loan', 'index': 7, 'aggr': 'sum', },
-  {'name': 'contact', 'index': 8, 'aggr': 'sum', },
-  {'name': 'day', 'index': 9, 'aggr': 'sum', },
-  {'name': 'month', 'index': 10, 'aggr': 'sum', },
-  {'name': 'duration', 'index': 11, 'aggr': 'sum', },
-  {'name': 'campaign', 'index': 12, 'aggr': 'sum', },
-  {'name': 'pdays', 'index': 13, 'aggr': 'sum', },
-  {'name': 'previous', 'index': 14, 'aggr': 'sum', },
-  {'name': 'poutcome', 'index': 15, 'aggr': 'sum', },
-  {'name': 'y', 'index': 16, 'aggr': 'sum', }
-]
+  {'name': 'age', 'index': 0, 'aggr': 'sum'},
+  {'name': 'job', 'index': 1, 'aggr': 'sum'},
+  {'name': 'marital', 'index': 2, 'aggr': 'sum'},
+  {'name': 'education', 'index': 3, 'aggr': 'sum'},
+  {'name': 'default', 'index': 4, 'aggr': 'sum'},
+  {'name': 'balance', 'index': 5, 'aggr': 'sum'},
+  {'name': 'housing', 'index': 6, 'aggr': 'sum'},
+  {'name': 'loan', 'index': 7, 'aggr': 'sum'},
+  {'name': 'contact', 'index': 8, 'aggr': 'sum'},
+  {'name': 'day', 'index': 9, 'aggr': 'sum'},
+  {'name': 'month', 'index': 10, 'aggr': 'sum'},
+  {'name': 'duration', 'index': 11, 'aggr': 'sum'},
+  {'name': 'campaign', 'index': 12, 'aggr': 'sum'},
+  {'name': 'pdays', 'index': 13, 'aggr': 'sum'},
+  {'name': 'previous', 'index': 14, 'aggr': 'sum'},
+  {'name': 'poutcome', 'index': 15, 'aggr': 'sum'},
+  {'name': 'y', 'index': 16, 'aggr': 'sum'},
+];
 
 const MockTableDataRows1 = [
-  [ '44', 'services', 'single', 'tertiary', 'no', '106', 'no', 'no', 'unknown', '12', 'jun', '109', '2', '-1', '0', 'unknown', 'no' ],
-  [ '43', 'services', 'married', 'primary', 'no', '-88', 'yes', 'yes', 'cellular', '17', 'apr', '313', '1', '147', '2', 'failure', 'no' ],
-  [ '39', 'services', 'married', 'secondary', 'no', '9374', 'yes', 'no', 'unknown', '20', 'may', '273', '1', '-1', '0', 'unknown', 'no' ],
-  [ '33', 'services', 'single', 'tertiary', 'no', '4789', 'yes', 'yes', 'cellular', '11', 'may', '220', '1', '339', '4', 'failure', 'no' ],
-]
+  ['44', 'services', 'single', 'tertiary', 'no', '106', 'no', 'no', 'unknown', '12', 'jun', '109', '2', '-1', '0', 'unknown', 'no'],
+  ['43', 'services', 'married', 'primary', 'no', '-88', 'yes', 'yes', 'cellular', '17', 'apr', '313', '1', '147', '2', 'failure', 'no'],
+  ['39', 'services', 'married', 'secondary', 'no', '9374', 'yes', 'no', 'unknown', '20', 'may', '273', '1', '-1', '0', 'unknown', 'no'],
+  ['33', 'services', 'single', 'tertiary', 'no', '4789', 'yes', 'yes', 'cellular', '11', 'may', '220', '1', '339', '4', 'failure', 'no'],
+];
 
 /* eslint-enable max-len */
 
 describe('advanced-transformation-util', () => {
   describe('getCurrent* funcs', () => {
     it('should set return proper value of the current chart', () => {
-      const config = {}
-      const spec = JSON.parse(JSON.stringify(MockSpec))
-      Util.initializeConfig(config, spec)
-      expect(Util.getCurrentChart(config)).toEqual('object-chart')
-      expect(Util.getCurrentChartTransform(config)).toEqual({method: 'object'})
+      const config = {};
+      const spec = JSON.parse(JSON.stringify(MockSpec));
+      Util.initializeConfig(config, spec);
+      expect(Util.getCurrentChart(config)).toEqual('object-chart');
+      expect(Util.getCurrentChartTransform(config)).toEqual({method: 'object'});
       // use `toBe` to compare reference
-      expect(Util.getCurrentChartAxis(config)).toBe(config.axis['object-chart'])
+      expect(Util.getCurrentChartAxis(config)).toBe(config.axis['object-chart']);
       // use `toBe` to compare reference
-      expect(Util.getCurrentChartParam(config)).toBe(config.parameter['object-chart'])
-    })
-  })
+      expect(Util.getCurrentChartParam(config)).toBe(config.parameter['object-chart']);
+    });
+  });
 
   describe('useSharedAxis', () => {
     it('should set chartChanged for initial drawing', () => {
-      const config = {}
-      const spec = JSON.parse(JSON.stringify(MockSpec))
-      Util.initializeConfig(config, spec)
-      expect(Util.useSharedAxis(config, 'object-chart')).toEqual(true)
-      expect(Util.useSharedAxis(config, 'array-chart')).toEqual(true)
-      expect(Util.useSharedAxis(config, 'drillDown-chart')).toBeUndefined()
-      expect(Util.useSharedAxis(config, 'raw-chart')).toBeUndefined()
-    })
-  })
+      const config = {};
+      const spec = JSON.parse(JSON.stringify(MockSpec));
+      Util.initializeConfig(config, spec);
+      expect(Util.useSharedAxis(config, 'object-chart')).toEqual(true);
+      expect(Util.useSharedAxis(config, 'array-chart')).toEqual(true);
+      expect(Util.useSharedAxis(config, 'drillDown-chart')).toBeUndefined();
+      expect(Util.useSharedAxis(config, 'raw-chart')).toBeUndefined();
+    });
+  });
 
   describe('initializeConfig', () => {
-    const config = {}
-    const spec = JSON.parse(JSON.stringify(MockSpec))
-    Util.initializeConfig(config, spec)
+    const config = {};
+    const spec = JSON.parse(JSON.stringify(MockSpec));
+    Util.initializeConfig(config, spec);
 
     it('should set chartChanged for initial drawing', () => {
-      expect(config.chartChanged).toBe(true)
-      expect(config.parameterChanged).toBe(false)
-    })
+      expect(config.chartChanged).toBe(true);
+      expect(config.parameterChanged).toBe(false);
+    });
 
     it('should set panel toggles ', () => {
-      expect(config.panel.columnPanelOpened).toBe(true)
-      expect(config.panel.parameterPanelOpened).toBe(false)
-    })
+      expect(config.panel.columnPanelOpened).toBe(true);
+      expect(config.panel.parameterPanelOpened).toBe(false);
+    });
 
     it('should set version and initialized', () => {
-      expect(config.spec.version).toBeDefined()
-      expect(config.spec.initialized).toBe(true)
-    })
+      expect(config.spec.version).toBeDefined();
+      expect(config.spec.initialized).toBe(true);
+    });
 
     it('should set chart', () => {
-      expect(config.chart.current).toBe('object-chart')
+      expect(config.chart.current).toBe('object-chart');
       expect(config.chart.available).toEqual([
         'object-chart',
         'array-chart',
         'drillDown-chart',
         'raw-chart',
-      ])
-    })
+      ]);
+    });
 
     it('should set sharedAxis', () => {
       expect(config.sharedAxis).toEqual({
         keyAxis: [], aggrAxis: [], groupAxis: [],
-      })
+      });
       // should use `toBe` to compare object reference
-      expect(config.sharedAxis).toBe(config.axis['object-chart'])
+      expect(config.sharedAxis).toBe(config.axis['object-chart']);
       // should use `toBe` to compare object reference
-      expect(config.sharedAxis).toBe(config.axis['array-chart'])
-    })
+      expect(config.sharedAxis).toBe(config.axis['array-chart']);
+    });
 
     it('should set paramSpecs', () => {
-      const expected = Util.getSpecs(MockParameter)
-      expect(config.paramSpecs['object-chart']).toEqual(expected)
-      expect(config.paramSpecs['array-chart'].length).toEqual(1)
-      expect(config.paramSpecs['drillDown-chart'].length).toEqual(1)
-      expect(config.paramSpecs['raw-chart'].length).toEqual(1)
-    })
+      const expected = Util.getSpecs(MockParameter);
+      expect(config.paramSpecs['object-chart']).toEqual(expected);
+      expect(config.paramSpecs['array-chart'].length).toEqual(1);
+      expect(config.paramSpecs['drillDown-chart'].length).toEqual(1);
+      expect(config.paramSpecs['raw-chart'].length).toEqual(1);
+    });
 
     it('should set parameter with default value', () => {
-      expect(Object.keys(MockParameter).length).toBeGreaterThan(0) // length > 0
+      expect(Object.keys(MockParameter).length).toBeGreaterThan(0); // length > 0
       for (let paramName in MockParameter) {
-        expect(config.parameter['object-chart'][paramName])
-          .toEqual(MockParameter[paramName].defaultValue)
+        if (MockParameter.hasOwnProperty(paramName)) {
+          expect(config.parameter['object-chart'][paramName])
+            .toEqual(MockParameter[paramName].defaultValue);
+        }
       }
-    })
+    });
 
     it('should set axisSpecs', () => {
-      const expected = Util.getSpecs(MockAxis1)
-      expect(config.axisSpecs['object-chart']).toEqual(expected)
-      expect(config.axisSpecs['array-chart'].length).toEqual(3)
-      expect(config.axisSpecs['drillDown-chart'].length).toEqual(3)
-      expect(config.axisSpecs['raw-chart'].length).toEqual(2)
-    })
+      const expected = Util.getSpecs(MockAxis1);
+      expect(config.axisSpecs['object-chart']).toEqual(expected);
+      expect(config.axisSpecs['array-chart'].length).toEqual(3);
+      expect(config.axisSpecs['drillDown-chart'].length).toEqual(3);
+      expect(config.axisSpecs['raw-chart'].length).toEqual(2);
+    });
 
     it('should prepare axis depending on dimension', () => {
       expect(config.axis['object-chart']).toEqual({
         keyAxis: [], aggrAxis: [], groupAxis: [],
-      })
+      });
       expect(config.axis['array-chart']).toEqual({
         keyAxis: [], aggrAxis: [], groupAxis: [],
-      })
+      });
       // it's ok not to set single dimension axis
-      expect(config.axis['drillDown-chart']).toEqual({ limitedAggrAxis: [], groupAxis: [], })
+      expect(config.axis['drillDown-chart']).toEqual({limitedAggrAxis: [], groupAxis: []});
       // it's ok not to set single dimension axis
-      expect(config.axis['raw-chart']).toEqual({ customAxis2: [], })
-    })
-  })
+      expect(config.axis['raw-chart']).toEqual({customAxis2: []});
+    });
+  });
 
   describe('axis', () => {
 
-  })
+  });
 
   describe('parameter:widget', () => {
     it('isInputWidget', () => {
-      expect(Util.isInputWidget(MockParameter.stringParam1)).toBe(true)
-      expect(Util.isInputWidget(MockParameter.stringParam2)).toBe(true)
+      expect(Util.isInputWidget(MockParameter.stringParam1)).toBe(true);
+      expect(Util.isInputWidget(MockParameter.stringParam2)).toBe(true);
 
-      expect(Util.isInputWidget(MockParameter.boolParam)).toBe(false)
-      expect(Util.isInputWidget(MockParameter.jsonParam)).toBe(false)
-      expect(Util.isInputWidget(MockParameter.optionParam)).toBe(false)
-    })
+      expect(Util.isInputWidget(MockParameter.boolParam)).toBe(false);
+      expect(Util.isInputWidget(MockParameter.jsonParam)).toBe(false);
+      expect(Util.isInputWidget(MockParameter.optionParam)).toBe(false);
+    });
 
     it('isOptionWidget', () => {
-      expect(Util.isOptionWidget(MockParameter.optionParam)).toBe(true)
+      expect(Util.isOptionWidget(MockParameter.optionParam)).toBe(true);
 
-      expect(Util.isOptionWidget(MockParameter.stringParam1)).toBe(false)
-      expect(Util.isOptionWidget(MockParameter.stringParam2)).toBe(false)
-      expect(Util.isOptionWidget(MockParameter.boolParam)).toBe(false)
-      expect(Util.isOptionWidget(MockParameter.jsonParam)).toBe(false)
-    })
+      expect(Util.isOptionWidget(MockParameter.stringParam1)).toBe(false);
+      expect(Util.isOptionWidget(MockParameter.stringParam2)).toBe(false);
+      expect(Util.isOptionWidget(MockParameter.boolParam)).toBe(false);
+      expect(Util.isOptionWidget(MockParameter.jsonParam)).toBe(false);
+    });
 
     it('isCheckboxWidget', () => {
-      expect(Util.isCheckboxWidget(MockParameter.boolParam)).toBe(true)
+      expect(Util.isCheckboxWidget(MockParameter.boolParam)).toBe(true);
 
-      expect(Util.isCheckboxWidget(MockParameter.stringParam1)).toBe(false)
-      expect(Util.isCheckboxWidget(MockParameter.stringParam2)).toBe(false)
-      expect(Util.isCheckboxWidget(MockParameter.jsonParam)).toBe(false)
-      expect(Util.isCheckboxWidget(MockParameter.optionParam)).toBe(false)
-    })
+      expect(Util.isCheckboxWidget(MockParameter.stringParam1)).toBe(false);
+      expect(Util.isCheckboxWidget(MockParameter.stringParam2)).toBe(false);
+      expect(Util.isCheckboxWidget(MockParameter.jsonParam)).toBe(false);
+      expect(Util.isCheckboxWidget(MockParameter.optionParam)).toBe(false);
+    });
 
     it('isTextareaWidget', () => {
-      expect(Util.isTextareaWidget(MockParameter.jsonParam)).toBe(true)
+      expect(Util.isTextareaWidget(MockParameter.jsonParam)).toBe(true);
 
-      expect(Util.isTextareaWidget(MockParameter.stringParam1)).toBe(false)
-      expect(Util.isTextareaWidget(MockParameter.stringParam2)).toBe(false)
-      expect(Util.isTextareaWidget(MockParameter.boolParam)).toBe(false)
-      expect(Util.isTextareaWidget(MockParameter.optionParam)).toBe(false)
-    })
-  })
+      expect(Util.isTextareaWidget(MockParameter.stringParam1)).toBe(false);
+      expect(Util.isTextareaWidget(MockParameter.stringParam2)).toBe(false);
+      expect(Util.isTextareaWidget(MockParameter.boolParam)).toBe(false);
+      expect(Util.isTextareaWidget(MockParameter.optionParam)).toBe(false);
+    });
+  });
 
   describe('parameter:parseParameter', () => {
-    const paramSpec = Util.getSpecs(MockParameter)
+    const paramSpec = Util.getSpecs(MockParameter);
 
     it('should parse number', () => {
-      const params = { intParam: '3', }
-      const parsed = Util.parseParameter(paramSpec, params)
-      expect(parsed.intParam).toBe(3)
-    })
+      const params = {intParam: '3'};
+      const parsed = Util.parseParameter(paramSpec, params);
+      expect(parsed.intParam).toBe(3);
+    });
 
     it('should parse float', () => {
-      const params = { floatParam: '0.10', }
-      const parsed = Util.parseParameter(paramSpec, params)
-      expect(parsed.floatParam).toBe(0.10)
-    })
+      const params = {floatParam: '0.10'};
+      const parsed = Util.parseParameter(paramSpec, params);
+      expect(parsed.floatParam).toBe(0.10);
+    });
 
     it('should parse boolean', () => {
-      const params1 = { boolParam: 'true', }
-      const parsed1 = Util.parseParameter(paramSpec, params1)
-      expect(typeof parsed1.boolParam).toBe('boolean')
-      expect(parsed1.boolParam).toBe(true)
+      const params1 = {boolParam: 'true'};
+      const parsed1 = Util.parseParameter(paramSpec, params1);
+      expect(typeof parsed1.boolParam).toBe('boolean');
+      expect(parsed1.boolParam).toBe(true);
 
-      const params2 = { boolParam: 'false', }
-      const parsed2 = Util.parseParameter(paramSpec, params2)
-      expect(typeof parsed2.boolParam).toBe('boolean')
-      expect(parsed2.boolParam).toBe(false)
-    })
+      const params2 = {boolParam: 'false'};
+      const parsed2 = Util.parseParameter(paramSpec, params2);
+      expect(typeof parsed2.boolParam).toBe('boolean');
+      expect(parsed2.boolParam).toBe(false);
+    });
 
     it('should parse JSON', () => {
-      const params = { jsonParam: '{ "a": 3 }', }
-      const parsed = Util.parseParameter(paramSpec, params)
-      expect(typeof parsed.jsonParam).toBe('object')
-      expect(JSON.stringify(parsed.jsonParam)).toBe('{"a":3}')
-    })
+      const params = {jsonParam: '{ "a": 3 }'};
+      const parsed = Util.parseParameter(paramSpec, params);
+      expect(typeof parsed.jsonParam).toBe('object');
+      expect(JSON.stringify(parsed.jsonParam)).toBe('{"a":3}');
+    });
 
     it('should not parse string', () => {
-      const params = { stringParam: 'example', }
-      const parsed = Util.parseParameter(paramSpec, params)
-      expect(typeof parsed.stringParam).toBe('string')
-      expect(parsed.stringParam).toBe('example')
-    })
-  })
+      const params = {stringParam: 'example'};
+      const parsed = Util.parseParameter(paramSpec, params);
+      expect(typeof parsed.stringParam).toBe('string');
+      expect(parsed.stringParam).toBe('example');
+    });
+  });
 
   describe('removeDuplicatedColumnsInMultiDimensionAxis', () => {
-    let config = {}
+    let config = {};
 
     beforeEach(() => {
-      config = {}
-      const spec = JSON.parse(JSON.stringify(MockSpec))
-      Util.initializeConfig(config, spec)
-      config.chart.current = 'drillDown-chart' // set non-sharedAxis chart
-    })
+      config = {};
+      const spec = JSON.parse(JSON.stringify(MockSpec));
+      Util.initializeConfig(config, spec);
+      config.chart.current = 'drillDown-chart'; // set non-sharedAxis chart
+    });
 
     it('should remove duplicated axis names in config when axis is not aggregator', () => {
       const addColumn = function(config, col) {
-        const axis = Util.getCurrentChartAxis(config)['groupAxis']
-        axis.push(col)
-        const axisSpecs = Util.getCurrentChartAxisSpecs(config)
-        Util.removeDuplicatedColumnsInMultiDimensionAxis(config, axisSpecs[2])
-      }
+        const axis = Util.getCurrentChartAxis(config)['groupAxis'];
+        axis.push(col);
+        const axisSpecs = Util.getCurrentChartAxisSpecs(config);
+        Util.removeDuplicatedColumnsInMultiDimensionAxis(config, axisSpecs[2]);
+      };
 
-      addColumn(config, { name: 'columnA', aggr: 'sum', index: 0, })
-      addColumn(config, { name: 'columnA', aggr: 'sum', index: 0, })
-      addColumn(config, { name: 'columnA', aggr: 'sum', index: 0, })
+      addColumn(config, {name: 'columnA', aggr: 'sum', index: 0});
+      addColumn(config, {name: 'columnA', aggr: 'sum', index: 0});
+      addColumn(config, {name: 'columnA', aggr: 'sum', index: 0});
 
-      expect(Util.getCurrentChartAxis(config)['groupAxis'].length).toEqual(1)
-    })
+      expect(Util.getCurrentChartAxis(config)['groupAxis'].length).toEqual(1);
+    });
 
     it('should remove duplicated axis names in config when axis is aggregator', () => {
       const addColumn = function(config, value) {
-        const axis = Util.getCurrentChartAxis(config)['limitedAggrAxis']
-        axis.push(value)
-        const axisSpecs = Util.getCurrentChartAxisSpecs(config)
-        Util.removeDuplicatedColumnsInMultiDimensionAxis(config, axisSpecs[1])
-      }
+        const axis = Util.getCurrentChartAxis(config)['limitedAggrAxis'];
+        axis.push(value);
+        const axisSpecs = Util.getCurrentChartAxisSpecs(config);
+        Util.removeDuplicatedColumnsInMultiDimensionAxis(config, axisSpecs[1]);
+      };
 
-      config.chart.current = 'drillDown-chart' // set non-sharedAxis chart
-      addColumn(config, { name: 'columnA', aggr: 'sum', index: 0, })
-      addColumn(config, { name: 'columnA', aggr: 'aggr', index: 0, })
-      addColumn(config, { name: 'columnA', aggr: 'sum', index: 0, })
+      config.chart.current = 'drillDown-chart'; // set non-sharedAxis chart
+      addColumn(config, {name: 'columnA', aggr: 'sum', index: 0});
+      addColumn(config, {name: 'columnA', aggr: 'aggr', index: 0});
+      addColumn(config, {name: 'columnA', aggr: 'sum', index: 0});
 
-      expect(Util.getCurrentChartAxis(config)['limitedAggrAxis'].length).toEqual(2)
-    })
-  })
+      expect(Util.getCurrentChartAxis(config)['limitedAggrAxis'].length).toEqual(2);
+    });
+  });
 
   describe('applyMaxAxisCount', () => {
-    const config = {}
-    const spec = JSON.parse(JSON.stringify(MockSpec))
-    Util.initializeConfig(config, spec)
+    const config = {};
+    const spec = JSON.parse(JSON.stringify(MockSpec));
+    Util.initializeConfig(config, spec);
 
     const addColumn = function(config, value) {
-      const axis = Util.getCurrentChartAxis(config)['limitedAggrAxis']
-      axis.push(value)
-      const axisSpecs = Util.getCurrentChartAxisSpecs(config)
-      Util.applyMaxAxisCount(config, axisSpecs[1])
-    }
+      const axis = Util.getCurrentChartAxis(config)['limitedAggrAxis'];
+      axis.push(value);
+      const axisSpecs = Util.getCurrentChartAxisSpecs(config);
+      Util.applyMaxAxisCount(config, axisSpecs[1]);
+    };
 
     it('should remove duplicated axis names in config', () => {
-      config.chart.current = 'drillDown-chart' // set non-sharedAxis chart
+      config.chart.current = 'drillDown-chart'; // set non-sharedAxis chart
 
-      addColumn(config, 'columnA')
-      addColumn(config, 'columnB')
-      addColumn(config, 'columnC')
-      addColumn(config, 'columnD')
+      addColumn(config, 'columnA');
+      addColumn(config, 'columnB');
+      addColumn(config, 'columnC');
+      addColumn(config, 'columnD');
 
       expect(Util.getCurrentChartAxis(config)['limitedAggrAxis']).toEqual([
         'columnC', 'columnD',
-      ])
-    })
-  })
+      ]);
+    });
+  });
 
   describe('getColumnsFromAxis', () => {
     it('should return proper value for regular axis spec (key, aggr, group)', () => {
-      const config = {}
-
-      const spec = JSON.parse(JSON.stringify(MockSpec))
-      Util.initializeConfig(config, spec)
-      const chart = 'object-chart'
-      config.chart.current = chart
-
-      const axisSpecs = config.axisSpecs[chart]
-      const axis = config.axis[chart]
-      axis['keyAxis'].push('columnA')
-      axis['keyAxis'].push('columnB')
-      axis['aggrAxis'].push('columnC')
-      axis['groupAxis'].push('columnD')
-      axis['groupAxis'].push('columnE')
-      axis['groupAxis'].push('columnF')
-
-      const column = Util.getColumnsFromAxis(axisSpecs, axis)
-      expect(column.key).toEqual([ 'columnA', 'columnB', ])
-      expect(column.aggregator).toEqual([ 'columnC', ])
-      expect(column.group).toEqual([ 'columnD', 'columnE', 'columnF', ])
-    })
+      const config = {};
+
+      const spec = JSON.parse(JSON.stringify(MockSpec));
+      Util.initializeConfig(config, spec);
+      const chart = 'object-chart';
+      config.chart.current = chart;
+
+      const axisSpecs = config.axisSpecs[chart];
+      const axis = config.axis[chart];
+      axis['keyAxis'].push('columnA');
+      axis['keyAxis'].push('columnB');
+      axis['aggrAxis'].push('columnC');
+      axis['groupAxis'].push('columnD');
+      axis['groupAxis'].push('columnE');
+      axis['groupAxis'].push('columnF');
+
+      const column = Util.getColumnsFromAxis(axisSpecs, axis);
+      expect(column.key).toEqual(['columnA', 'columnB']);
+      expect(column.aggregator).toEqual(['columnC']);
+      expect(column.group).toEqual(['columnD', 'columnE', 'columnF']);
+    });
 
     it('should return proper value for custom axis spec', () => {
-      const config = {}
-      const spec = JSON.parse(JSON.stringify(MockSpec))
-      Util.initializeConfig(config, spec)
-      const chart = 'raw-chart' // for test custom columns
-      config.chart.current = chart
-
-      const axisSpecs = config.axisSpecs[chart]
-      const axis = config.axis[chart]
-      axis['customAxis1'] = ['columnA']
-      axis['customAxis2'].push('columnB')
-      axis['customAxis2'].push('columnC')
-      axis['customAxis2'].push('columnD')
-
-      const column = Util.getColumnsFromAxis(axisSpecs, axis)
-      expect(column.custom.unique).toEqual([ 'columnA', ])
-      expect(column.custom.value).toEqual([ 'columnB', 'columnC', 'columnD', ])
-    })
-  })
+      const config = {};
+      const spec = JSON.parse(JSON.stringify(MockSpec));
+      Util.initializeConfig(config, spec);
+      const chart = 'raw-chart'; // for test custom columns
+      config.chart.current = chart;
+
+      const axisSpecs = config.axisSpecs[chart];
+      const axis = config.axis[chart];
+      axis['customAxis1'] = ['columnA'];
+      axis['customAxis2'].push('columnB');
+      axis['customAxis2'].push('columnC');
+      axis['customAxis2'].push('columnD');
+
+      const column = Util.getColumnsFromAxis(axisSpecs, axis);
+      expect(column.custom.unique).toEqual(['columnA']);
+      expect(column.custom.value).toEqual(['columnB', 'columnC', 'columnD']);
+    });
+  });
 
   // it's hard to test all methods for transformation.
   // so let's do behavioral (black-box) test instead of
   describe('getTransformer', () => {
     describe('method: raw', () => {
-      let config = {}
-      const spec = JSON.parse(JSON.stringify(MockSpec2))
-      Util.initializeConfig(config, spec)
+      let config = {};
+      const spec = JSON.parse(JSON.stringify(MockSpec2));
+      Util.initializeConfig(config, spec);
 
       it('should return original rows when transform.method is `raw`', () => {
-        const chart = 'raw-chart'
-        config.chart.current = chart
+        const chart = 'raw-chart';
+        config.chart.current = chart;
 
-        const rows = [ { 'r1': 1, }, ]
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, rows, axisSpecs, axis).transformer
-        const transformed = transformer()
+        const rows = [{'r1': 1}];
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, rows, axisSpecs, axis).transformer;
+        const transformed = transformer();
 
-        expect(transformed).toBe(rows)
-      })
-    })
+        expect(transformed).toBe(rows);
+      });
+    });
 
     describe('array method', () => {
-      let config = {}
-      const chart = 'array-chart'
-      let ageColumn = null
-      let balanceColumn = null
-      let educationColumn = null
-      let martialColumn = null
-      let tableDataRows = []
+      let config = {};
+      const chart = 'array-chart';
+      let ageColumn = null;
+      let balanceColumn = null;
+      let educationColumn = null;
+      let martialColumn = null;
+      let tableDataRows = [];
 
       beforeEach(() => {
-        const spec = JSON.parse(JSON.stringify(MockSpec2))
-        config = {}
-        Util.initializeConfig(config, spec)
-        config.chart.current = chart
-        tableDataRows = JSON.parse(JSON.stringify(MockTableDataRows1))
-        ageColumn = JSON.parse(JSON.stringify(MockTableDataColumn[0]))
-        balanceColumn = JSON.parse(JSON.stringify(MockTableDataColumn[5]))
-        educationColumn = JSON.parse(JSON.stringify(MockTableDataColumn[3]))
-        martialColumn = JSON.parse(JSON.stringify(MockTableDataColumn[2]))
-      })
+        const spec = JSON.parse(JSON.stringify(MockSpec2));
+        config = {};
+        Util.initializeConfig(config, spec);
+        config.chart.current = chart;
+        tableDataRows = JSON.parse(JSON.stringify(MockTableDataRows1));
+        ageColumn = JSON.parse(JSON.stringify(MockTableDataColumn[0]));
+        balanceColumn = JSON.parse(JSON.stringify(MockTableDataColumn[5]));
+        educationColumn = JSON.parse(JSON.stringify(MockTableDataColumn[3]));
+        martialColumn = JSON.parse(JSON.stringify(MockTableDataColumn[2]));
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
-
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
-
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ '', ])
-        expect(groupNames).toEqual([ 'age(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', ])
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
+
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
+
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['']);
+        expect(groupNames).toEqual(['age(sum)']);
+        expect(selectors).toEqual(['age(sum)']);
         expect(rows).toEqual([
-          { selector: 'age(sum)', value: [ 159, ], }
-        ])
-      })
+          {selector: 'age(sum)', value: [159]},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(count)', () => {
-        ageColumn.aggr = 'count'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'count';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        let { rows, } = transformer()
+        let {rows} = transformer();
         expect(rows).toEqual([
-          { selector: 'age(count)', value: [ 4, ], }
-        ])
-      })
+          {selector: 'age(count)', value: [4]},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(avg)', () => {
-        ageColumn.aggr = 'avg'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'avg';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
+        const {rows} = transformer();
         expect(rows).toEqual([
-          { selector: 'age(avg)', value: [ (44 + 43 + 39 + 33) / 4.0, ], }
-        ])
-      })
+          {selector: 'age(avg)', value: [(44 + 43 + 39 + 33) / 4.0]},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(max)', () => {
-        ageColumn.aggr = 'max'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'max';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
+        const {rows} = transformer();
         expect(rows).toEqual([
-          { selector: 'age(max)', value: [ 44, ], }
-        ])
-      })
+          {selector: 'age(max)', value: [44]},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(min)', () => {
-        ageColumn.aggr = 'min'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'min';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
+        const {rows} = transformer();
         expect(rows).toEqual([
-          { selector: 'age(min)', value: [ 33, ], }
-        ])
-      })
+          {selector: 'age(min)', value: [33]},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 2 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        balanceColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].aggrAxis.push(balanceColumn)
+        ageColumn.aggr = 'sum';
+        balanceColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].aggrAxis.push(balanceColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ '', ])
-        expect(groupNames).toEqual([ 'age(sum)', 'balance(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', 'balance(sum)', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['']);
+        expect(groupNames).toEqual(['age(sum)', 'balance(sum)']);
+        expect(selectors).toEqual(['age(sum)', 'balance(sum)']);
         expect(rows).toEqual([
-          { selector: 'age(sum)', value: [ 159, ], },
-          { selector: 'balance(sum)', value: [ 14181, ], },
-        ])
-      })
+          {selector: 'age(sum)', value: [159]},
+          {selector: 'balance(sum)', value: [14181]},
+        ]);
+      });
 
       it('should transform properly: 0 key, 1 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].groupAxis.push(martialColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].groupAxis.push(martialColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ 'marital', ])
-        expect(groupNames).toEqual([ 'married', 'single', ])
-        expect(selectors).toEqual([ 'married', 'single', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['marital']);
+        expect(groupNames).toEqual(['married', 'single']);
+        expect(selectors).toEqual(['married', 'single']);
         expect(rows).toEqual([
-          { selector: 'married', value: [ 82, ], },
-          { selector: 'single', value: [ 77, ], },
-        ])
-      })
+          {selector: 'married', value: [82]},
+          {selector: 'single', value: [77]},
+        ]);
+      });
 
       it('should transform properly: 0 key, 1 group, 2 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        balanceColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].aggrAxis.push(balanceColumn)
-        config.axis[chart].groupAxis.push(martialColumn)
+        ageColumn.aggr = 'sum';
+        balanceColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].aggrAxis.push(balanceColumn);
+        config.axis[chart].groupAxis.push(martialColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ 'marital', ])
-        expect(groupNames).toEqual([ 'married', 'single', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['marital']);
+        expect(groupNames).toEqual(['married', 'single']);
         expect(selectors).toEqual([
           'married / age(sum)', 'married / balance(sum)', 'single / age(sum)', 'single / balance(sum)',
-        ])
+        ]);
         expect(rows).toEqual([
-          { selector: 'married / age(sum)', value: [ 82 ] },
-          { selector: 'married / balance(sum)', value: [ 9286 ] },
-          { selector: 'single / age(sum)', value: [ 77 ] },
-          { selector: 'single / balance(sum)', value: [ 4895 ] },
-        ])
-      })
+          {selector: 'married / age(sum)', value: [82]},
+          {selector: 'married / balance(sum)', value: [9286]},
+          {selector: 'single / age(sum)', value: [77]},
+          {selector: 'single / balance(sum)', value: [4895]},
+        ]);
+      });
 
       it('should transform properly: 0 key, 2 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].groupAxis.push(martialColumn)
-        config.axis[chart].groupAxis.push(educationColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].groupAxis.push(martialColumn);
+        config.axis[chart].groupAxis.push(educationColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ 'marital.education', ])
-        expect(groupNames).toEqual([ 'married.primary', 'married.secondary', 'single.tertiary', ])
-        expect(selectors).toEqual([ 'married.primary', 'married.secondary', 'single.tertiary', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['marital.education']);
+        expect(groupNames).toEqual(['married.primary', 'married.secondary', 'single.tertiary']);
+        expect(selectors).toEqual(['married.primary', 'married.secondary', 'single.tertiary']);
         expect(rows).toEqual([
-          { selector: 'married.primary', value: [ '43' ] },
-          { selector: 'married.secondary', value: [ '39' ] },
-          { selector: 'single.tertiary', value: [ 77 ] },
-        ])
-      })
+          {selector: 'married.primary', value: ['43']},
+          {selector: 'married.secondary', value: ['39']},
+          {selector: 'single.tertiary', value: [77]},
+        ]);
+      });
 
       it('should transform properly: 1 key, 0 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].keyAxis.push(martialColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].keyAxis.push(martialColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('marital')
-        expect(keyNames).toEqual([ 'married', 'single', ])
-        expect(groupNames).toEqual([ 'age(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', ])
+        expect(keyColumnName).toEqual('marital');
+        expect(keyNames).toEqual(['married', 'single']);
+        expect(groupNames).toEqual(['age(sum)']);
+        expect(selectors).toEqual(['age(sum)']);
         expect(rows).toEqual([
-          { selector: 'age(sum)', value: [ 82, 77, ] },
-        ])
-      })
+          {selector: 'age(sum)', value: [82, 77]},
+        ]);
+      });
 
       it('should transform properly: 2 key, 0 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].keyAxis.push(martialColumn)
-        config.axis[chart].keyAxis.push(educationColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].keyAxis.push(martialColumn);
+        config.axis[chart].keyAxis.push(educationColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('marital.education')
-        expect(keyNames).toEqual([ 'married.primary', 'married.secondary', 'single.tertiary', ])
-        expect(groupNames).toEqual([ 'age(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', ])
+        expect(keyColumnName).toEqual('marital.education');
+        expect(keyNames).toEqual(['married.primary', 'married.secondary', 'single.tertiary']);
+        expect(groupNames).toEqual(['age(sum)']);
+        expect(selectors).toEqual(['age(sum)']);
         expect(rows).toEqual([
-          { selector: 'age(sum)', value: [ '43', '39', 77, ] },
-        ])
-      })
+          {selector: 'age(sum)', value: ['43', '39', 77]},
+        ]);
+      });
 
       it('should transform properly: 1 key, 1 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].keyAxis.push(martialColumn)
-        config.axis[chart].groupAxis.push(educationColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].keyAxis.push(martialColumn);
+        config.axis[chart].groupAxis.push(educationColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('marital')
-        expect(keyNames).toEqual([ 'married', 'single', ])
-        expect(groupNames).toEqual([ 'primary', 'secondary', 'tertiary', ])
-        expect(selectors).toEqual([ 'primary', 'secondary', 'tertiary', ])
+        expect(keyColumnName).toEqual('marital');
+        expect(keyNames).toEqual(['married', 'single']);
+        expect(groupNames).toEqual(['primary', 'secondary', 'tertiary']);
+        expect(selectors).toEqual(['primary', 'secondary', 'tertiary']);
         expect(rows).toEqual([
-          { selector: 'primary', value: [ '43', null, ] },
-          { selector: 'secondary', value: [ '39', null, ] },
-          { selector: 'tertiary', value: [ null, 77, ] },
-        ])
-      })
-    }) // end: describe('method: array')
+          {selector: 'primary', value: ['43', null]},
+          {selector: 'secondary', value: ['39', null]},
+          {selector: 'tertiary', value: [null, 77]},
+        ]);
+      });
+    }); // end: describe('method: array')
 
     describe('method: object', () => {
-      let config = {}
-      const chart = 'object-chart'
-      let ageColumn = null
-      let balanceColumn = null
-      let educationColumn = null
-      let martialColumn = null
-      const tableDataRows = JSON.parse(JSON.stringify(MockTableDataRows1))
+      let config = {};
+      const chart = 'object-chart';
+      let ageColumn = null;
+      let balanceColumn = null;
+      let educationColumn = null;
+      let martialColumn = null;
+      const tableDataRows = JSON.parse(JSON.stringify(MockTableDataRows1));
 
       beforeEach(() => {
-        const spec = JSON.parse(JSON.stringify(MockSpec2))
-        config = {}
-        Util.initializeConfig(config, spec)
-        config.chart.current = chart
-        ageColumn = JSON.parse(JSON.stringify(MockTableDataColumn[0]))
-        balanceColumn = JSON.parse(JSON.stringify(MockTableDataColumn[5]))
-        educationColumn = JSON.parse(JSON.stringify(MockTableDataColumn[3]))
-        martialColumn = JSON.parse(JSON.stringify(MockTableDataColumn[2]))
-      })
+        const spec = JSON.parse(JSON.stringify(MockSpec2));
+        config = {};
+        Util.initializeConfig(config, spec);
+        config.chart.current = chart;
+        ageColumn = JSON.parse(JSON.stringify(MockTableDataColumn[0]));
+        balanceColumn = JSON.parse(JSON.stringify(MockTableDataColumn[5]));
+        educationColumn = JSON.parse(JSON.stringify(MockTableDataColumn[3]));
+        martialColumn = JSON.parse(JSON.stringify(MockTableDataColumn[2]));
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ '', ])
-        expect(groupNames).toEqual([ 'age(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', ])
-        expect(rows).toEqual([{ 'age(sum)': 44 + 43 + 39 + 33, }])
-      })
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['']);
+        expect(groupNames).toEqual(['age(sum)']);
+        expect(selectors).toEqual(['age(sum)']);
+        expect(rows).toEqual([{'age(sum)': 44 + 43 + 39 + 33}]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(count)', () => {
-        ageColumn.aggr = 'count'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'count';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
-        expect(rows).toEqual([{ 'age(count)': 4, }])
-      })
+        const {rows} = transformer();
+        expect(rows).toEqual([{'age(count)': 4}]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(avg)', () => {
-        ageColumn.aggr = 'avg'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'avg';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
+        const {rows} = transformer();
         expect(rows).toEqual([
-          { 'age(avg)': (44 + 43 + 39 + 33) / 4.0, }
-        ])
-      })
+          {'age(avg)': (44 + 43 + 39 + 33) / 4.0},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(max)', () => {
-        ageColumn.aggr = 'max'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'max';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
-        expect(rows).toEqual([{ 'age(max)': 44, }])
-      })
+        const {rows} = transformer();
+        expect(rows).toEqual([{'age(max)': 44}]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(min)', () => {
-        ageColumn.aggr = 'min'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'min';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
-        expect(rows).toEqual([{ 'age(min)': 33, }])
-      })
+        const {rows} = transformer();
+        expect(rows).toEqual([{'age(min)': 33}]);
+      });
 
       it('should transform properly: 0 key, 0 group, 2 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        balanceColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].aggrAxis.push(balanceColumn)
+        ageColumn.aggr = 'sum';
+        balanceColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].aggrAxis.push(balanceColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ '', ])
-        expect(groupNames).toEqual([ 'age(sum)', 'balance(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', 'balance(sum)', ])
-        expect(rows).toEqual([{ 'age(sum)': 159, 'balance(sum)': 14181, }])
-      })
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['']);
+        expect(groupNames).toEqual(['age(sum)', 'balance(sum)']);
+        expect(selectors).toEqual(['age(sum)', 'balance(sum)']);
+        expect(rows).toEqual([{'age(sum)': 159, 'balance(sum)': 14181}]);
+      });
 
       it('should transform properly: 0 key, 1 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].groupAxis.push(martialColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].groupAxis.push(martialColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ 'marital', ])
-        expect(groupNames).toEqual([ 'married', 'single', ])
-        expect(selectors).toEqual([ 'married', 'single', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['marital']);
+        expect(groupNames).toEqual(['married', 'single']);
+        expect(selectors).toEqual(['married', 'single']);
         expect(rows).toEqual([
-          { single: 77, married: 82, }
-        ])
-      })
+          {single: 77, married: 82},
+        ]);
+      });
 
       it('should transform properly: 0 key, 1 group, 2 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        balanceColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].aggrAxis.push(balanceColumn)
-        config.axis[chart].groupAxis.push(martialColumn)
+        ageColumn.aggr = 'sum';
+        balanceColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].aggrAxis.push(balanceColumn);
+        config.axis[chart].groupAxis.push(martialColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ 'marital', ])
-        expect(groupNames).toEqual([ 'married', 'single', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['marital']);
+        expect(groupNames).toEqual(['married', 'single']);
         expect(selectors).toEqual([
           'married / age(sum)', 'married / balance(sum)', 'single / age(sum)', 'single / balance(sum)',
-        ])
+        ]);
         expect(rows).toEqual([{
           'married / age(sum)': 82,
           'single / age(sum)': 77,
           'married / balance(sum)': 9286,
           'single / balance(sum)': 4895,
-        }])
-      })
+        }]);
+      });
 
       it('should transform properly: 0 key, 2 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].groupAxis.push(martialColumn)
-        config.axis[chart].groupAxis.push(educationColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].groupAxis.push(martialColumn);
+        config.axis[chart].groupAxis.push(educationColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ 'marital.education', ])
-        expect(groupNames).toEqual([ 'married.primary', 'married.secondary', 'single.tertiary', ])
-        expect(selectors).toEqual([ 'married.primary', 'married.secondary', 'single.tertiary', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['marital.education']);
+        expect(groupNames).toEqual(['married.primary', 'married.secondary', 'single.tertiary']);
+        expect(selectors).toEqual(['married.primary', 'married.secondary', 'single.tertiary']);
         expect(rows).toEqual([{
           'married.primary': '43', 'married.secondary': '39', 'single.tertiary': 77,
-        }])
-      })
+        }]);
+      });
 
       it('should transform properly: 1 key, 0 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].keyAxis.push(martialColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].keyAxis.push(martialColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('marital')
-        expect(keyNames).toEqual([ 'married', 'single', ])
-        expect(groupNames).toEqual([ 'age(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', ])
+        expect(keyColumnName).toEqual('marital');
+        expect(keyNames).toEqual(['married', 'single']);
+        expect(groupNames).toEqual(['age(sum)']);
+        expect(selectors).toEqual(['age(sum)']);
         expect(rows).toEqual([
-          { 'age(sum)': 82, 'marital': 'married', },
-          { 'age(sum)': 77, 'marital': 'single', },
-        ])
-      })
+          {'age(sum)': 82, 'marital': 'married'},
+          {'age(sum)': 77, 'marital': 'single'},
+        ]);
+      });
 
       it('should transform properly: 2 key, 0 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].keyAxis.push(martialColumn)
-        config.axis[chart].keyAxis.push(educationColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].keyAxis.push(martialColumn);
+        config.axis[chart].keyAxis.push(educationColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('marital.education')
-        expect(keyNames).toEqual([ 'married.primary', 'married.secondary', 'single.tertiary', ])
-        expect(groupNames).toEqual([ 'age(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', ])
+        expect(keyColumnName).toEqual('marital.education');
+        expect(keyNames).toEqual(['married.primary', 'married.secondary', 'single.tertiary']);
+        expect(groupNames).toEqual(['age(sum)']);
+        expect(selectors).toEqual(['age(sum)']);
         expect(rows).toEqual([
-          { 'age(sum)': '43', 'marital.education': 'married.primary' },
-          { 'age(sum)': '39', 'marital.education': 'married.secondary' },
-          { 'age(sum)': 77, 'marital.education': 'single.tertiary' },
-        ])
-      })
+          {'age(sum)': '43', 'marital.education': 'married.primary'},
+          {'age(sum)': '39', 'marital.education': 'married.secondary'},
+          {'age(sum)': 77, 'marital.education': 'single.tertiary'},
+        ]);
+      });
 
       it('should transform properly: 1 key, 1 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].keyAxis.push(martialColumn)
-        config.axis[chart].groupAxis.push(educationColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].keyAxis.push(martialColumn);
+        config.axis[chart].groupAxis.push(educationColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('marital')
-        expect(keyNames).toEqual([ 'married', 'single', ])
-        expect(groupNames).toEqual([ 'primary', 'secondary', 'tertiary', ])
-        expect(selectors).toEqual([ 'primary', 'secondary', 'tertiary', ])
+        expect(keyColumnName).toEqual('marital');
+        expect(keyNames).toEqual(['married', 'single']);
+        expect(groupNames).toEqual(['primary', 'secondary', 'tertiary']);
+        expect(selectors).toEqual(['primary', 'secondary', 'tertiary']);
         expect(rows).toEqual([
-          { primary: '43', secondary: '39', marital: 'married' },
-          { tertiary: 44 + 33, marital: 'single' },
-        ])
-      })
-    }) // end: describe('method: object')
+          {primary: '43', secondary: '39', marital: 'married'},
+          {tertiary: 44 + 33, marital: 'single'},
+        ]);
+      });
+    }); // end: describe('method: object')
 
     describe('method: drill-down', () => {
-      let config = {}
-      const chart = 'drillDown-chart'
-      let ageColumn = null
-      let balanceColumn = null
-      let educationColumn = null
-      let martialColumn = null
-      const tableDataRows = JSON.parse(JSON.stringify(MockTableDataRows1))
+      let config = {};
+      const chart = 'drillDown-chart';
+      let ageColumn = null;
+      let balanceColumn = null;
+      let educationColumn = null;
+      let martialColumn = null;
+      const tableDataRows = JSON.parse(JSON.stringify(MockTableDataRows1));
 
       beforeEach(() => {
-        const spec = JSON.parse(JSON.stringify(MockSpec2))
-        config = {}
-        Util.initializeConfig(config, spec)
-        config.chart.current = chart
-        ageColumn = JSON.parse(JSON.stringify(MockTableDataColumn[0]))
-        balanceColumn = JSON.parse(JSON.stringify(MockTableDataColumn[5]))
-        educationColumn = JSON.parse(JSON.stringify(MockTableDataColumn[3]))
-        martialColumn = JSON.parse(JSON.stringify(MockTableDataColumn[2]))
-      })
+        const spec = JSON.parse(JSON.stringify(MockSpec2));
+        config = {};
+        Util.initializeConfig(config, spec);
+        config.chart.current = chart;
+        ageColumn = JSON.parse(JSON.stringify(MockTableDataColumn[0]));
+        balanceColumn = JSON.parse(JSON.stringify(MockTableDataColumn[5]));
+        educationColumn = JSON.parse(JSON.stringify(MockTableDataColumn[3]));
+        martialColumn = JSON.parse(JSON.stringify(MockTableDataColumn[2]));
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ '', ])
-        expect(groupNames).toEqual([ 'age(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['']);
+        expect(groupNames).toEqual(['age(sum)']);
+        expect(selectors).toEqual(['age(sum)']);
         expect(rows).toEqual([
-          { selector: 'age(sum)', value: 44 + 43 + 39 + 33, drillDown: [ ], },
-        ])
-      })
+          {selector: 'age(sum)', value: 44 + 43 + 39 + 33, drillDown: []},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(count)', () => {
-        ageColumn.aggr = 'count'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'count';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
+        const {rows} = transformer();
         expect(rows).toEqual([
-          { selector: 'age(count)', value: 4, drillDown: [ ], },
-        ])
-      })
+          {selector: 'age(count)', value: 4, drillDown: []},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(avg)', () => {
-        ageColumn.aggr = 'avg'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'avg';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
+        const {rows} = transformer();
         expect(rows).toEqual([
-          { selector: 'age(avg)', value: (44 + 43 + 39 + 33) / 4.0, drillDown: [ ], },
-        ])
-      })
+          {selector: 'age(avg)', value: (44 + 43 + 39 + 33) / 4.0, drillDown: []},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(max)', () => {
-        ageColumn.aggr = 'max'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'max';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
+        const {rows} = transformer();
         expect(rows).toEqual([
-          { selector: 'age(max)', value: 44, drillDown: [ ], },
-        ])
-      })
+          {selector: 'age(max)', value: 44, drillDown: []},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 1 aggr(min)', () => {
-        ageColumn.aggr = 'min'
-        config.axis[chart].aggrAxis.push(ageColumn)
+        ageColumn.aggr = 'min';
+        config.axis[chart].aggrAxis.push(ageColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, } = transformer()
+        const {rows} = transformer();
         expect(rows).toEqual([
-          { selector: 'age(min)', value: 33, drillDown: [ ], },
-        ])
-      })
+          {selector: 'age(min)', value: 33, drillDown: []},
+        ]);
+      });
 
       it('should transform properly: 0 key, 0 group, 2 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        balanceColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].aggrAxis.push(balanceColumn)
+        ageColumn.aggr = 'sum';
+        balanceColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].aggrAxis.push(balanceColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ '', ])
-        expect(groupNames).toEqual([ 'age(sum)', 'balance(sum)', ])
-        expect(selectors).toEqual([ 'age(sum)', 'balance(sum)', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['']);
+        expect(groupNames).toEqual(['age(sum)', 'balance(sum)']);
+        expect(selectors).toEqual(['age(sum)', 'balance(sum)']);
         expect(rows).toEqual([
-          { selector: 'age(sum)', value: 159, drillDown: [ ], },
-          { selector: 'balance(sum)', value: 14181, drillDown: [ ], },
-        ])
-      })
+          {selector: 'age(sum)', value: 159, drillDown: []},
+          {selector: 'balance(sum)', value: 14181, drillDown: []},
+        ]);
+      });
 
       it('should transform properly: 0 key, 1 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].groupAxis.push(martialColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].groupAxis.push(martialColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ 'marital', ])
-        expect(groupNames).toEqual([ 'married', 'single', ])
-        expect(selectors).toEqual([ 'age(sum)', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['marital']);
+        expect(groupNames).toEqual(['married', 'single']);
+        expect(selectors).toEqual(['age(sum)']);
         expect(rows).toEqual([
           {
             selector: 'age(sum)',
             value: 159,
             drillDown: [
-              { group: 'married', value: 82 },
-              { group: 'single', value: 77 },
+              {group: 'married', value: 82},
+              {group: 'single', value: 77},
             ],
           },
-        ])
-      })
+        ]);
+      });
 
       it('should transform properly: 0 key, 1 group, 2 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        balanceColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].aggrAxis.push(balanceColumn)
-        config.axis[chart].groupAxis.push(martialColumn)
-
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
-
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
-
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ 'marital', ])
-        expect(groupNames).toEqual([ 'married', 'single', ])
-        expect(selectors).toEqual([ 'age(sum)', 'balance(sum)' ])
+        ageColumn.aggr = 'sum';
+        balanceColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].aggrAxis.push(balanceColumn);
+        config.axis[chart].groupAxis.push(martialColumn);
+
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
+
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
+
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['marital']);
+        expect(groupNames).toEqual(['married', 'single']);
+        expect(selectors).toEqual(['age(sum)', 'balance(sum)']);
         expect(rows).toEqual([
           {
             selector: 'age(sum)',
             value: 159,
             drillDown: [
-              { group: 'married', value: 82 },
-              { group: 'single', value: 77 },
+              {group: 'married', value: 82},
+              {group: 'single', value: 77},
             ],
           },
           {
             selector: 'balance(sum)',
             value: 14181,
             drillDown: [
-              { group: 'married', value: 9286 },
-              { group: 'single', value: 4895 },
+              {group: 'married', value: 9286},
+              {group: 'single', value: 4895},
             ],
           },
-        ])
-      })
+        ]);
+      });
 
       it('should transform properly: 0 key, 2 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].groupAxis.push(martialColumn)
-        config.axis[chart].groupAxis.push(educationColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].groupAxis.push(martialColumn);
+        config.axis[chart].groupAxis.push(educationColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('')
-        expect(keyNames).toEqual([ 'marital.education', ])
-        expect(groupNames).toEqual([ 'married.primary', 'married.secondary', 'single.tertiary', ])
-        expect(selectors).toEqual([ 'age(sum)', ])
+        expect(keyColumnName).toEqual('');
+        expect(keyNames).toEqual(['marital.education']);
+        expect(groupNames).toEqual(['married.primary', 'married.secondary', 'single.tertiary']);
+        expect(selectors).toEqual(['age(sum)']);
         expect(rows).toEqual([
           {
             selector: 'age(sum)',
             value: 159,
             drillDown: [
-              { group: 'married.primary', value: '43' },
-              { group: 'married.secondary', value: '39' },
-              { group: 'single.tertiary', value: 77 },
+              {group: 'married.primary', value: '43'},
+              {group: 'married.secondary', value: '39'},
+              {group: 'single.tertiary', value: 77},
             ],
           },
-        ])
-      })
+        ]);
+      });
 
       it('should transform properly: 1 key, 0 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].keyAxis.push(martialColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].keyAxis.push(martialColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('marital')
-        expect(keyNames).toEqual([ 'married', 'single', ])
-        expect(groupNames).toEqual([ 'age(sum)', ])
-        expect(selectors).toEqual([ 'married', 'single', ])
+        expect(keyColumnName).toEqual('marital');
+        expect(keyNames).toEqual(['married', 'single']);
+        expect(groupNames).toEqual(['age(sum)']);
+        expect(selectors).toEqual(['married', 'single']);
         expect(rows).toEqual([
-          { selector: 'married', value: 82, drillDown: [ ], },
-          { selector: 'single', value: 77, drillDown: [ ], },
-        ])
-      })
+          {selector: 'married', value: 82, drillDown: []},
+          {selector: 'single', value: 77, drillDown: []},
+        ]);
+      });
 
       it('should transform properly: 2 key, 0 group, 1 aggr(sum)', () => {
-        ageColumn.aggr = 'sum'
-        config.axis[chart].aggrAxis.push(ageColumn)
-        config.axis[chart].keyAxis.push(martialColumn)
-        config.axis[chart].keyAxis.push(educationColumn)
+        ageColumn.aggr = 'sum';
+        config.axis[chart].aggrAxis.push(ageColumn);
+        config.axis[chart].keyAxis.push(martialColumn);
+        config.axis[chart].keyAxis.push(educationColumn);
 
-        const axisSpecs = config.axisSpecs[chart]
-        const axis = config.axis[chart]
-        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer
+        const axisSpecs = config.axisSpecs[chart];
+        const axis = config.axis[chart];
+        const transformer = Util.getTransformer(config, tableDataRows, axisSpecs, axis).transformer;
 
-        const { rows, keyColumnName, keyNames, groupNames, selectors, } = transformer()
+        const {rows, keyColumnName, keyNames, groupNames, selectors} = transformer();
 
-        expect(keyColumnName).toEqual('marital.education')
-        expect(keyNames).toEqual([ 'married.primary', 'married.secondary', 'single.tertiary', ])
-        expect(groupNames).toEqual([ 'age(sum)', ])
-        expect(selectors).toEqual([ 'married.primary', 'married.secondary', 'single.tertiary', ])
+        expect(keyColumnName).toEqual('marital.education');
+        expect(keyNames).toEqual(['married.primary', 'married.secondary', 'single.tertiary']);
+        expect(groupNames).toEqual(['age(sum)']);
+        expect(selectors).toEqual(['married.primary', 'married.secondary', 'single.tertiary']);
         expect(rows).toEqual([
-          { selector: 'married.primary', value: '43', drillDown: [ ], },
-          { selector: 'married.secondary', value: '39', drillDown: [ ], },
-          { selector: 'single.tertiary', value: 77, drillDown: [ ], },
-        ])
-      })
+          {selector: 'married.primary', value: '43', drillDown: []},
+          {selector: 'marr

<TRUNCATED>

[06/12] zeppelin git commit: [ZEPPELIN-3245] checkstyle/eslintrc for zeppelin-web (JavaScript)

Posted by pr...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/search/result-list.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/search/result-list.controller.js b/zeppelin-web/src/app/search/result-list.controller.js
index 05be721..65c10b1 100644
--- a/zeppelin-web/src/app/search/result-list.controller.js
+++ b/zeppelin-web/src/app/search/result-list.controller.js
@@ -12,107 +12,107 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').controller('SearchResultCtrl', SearchResultCtrl)
+angular.module('zeppelinWebApp').controller('SearchResultCtrl', SearchResultCtrl);
 
-function SearchResultCtrl ($scope, $routeParams, searchService) {
-  'ngInject'
+function SearchResultCtrl($scope, $routeParams, searchService) {
+  'ngInject';
 
-  $scope.isResult = true
-  $scope.searchTerm = $routeParams.searchTerm
-  let results = searchService.search({'q': $routeParams.searchTerm}).query()
+  $scope.isResult = true;
+  $scope.searchTerm = $routeParams.searchTerm;
+  let results = searchService.search({'q': $routeParams.searchTerm}).query();
 
-  results.$promise.then(function (result) {
-    $scope.notes = result.body.map(function (note) {
+  results.$promise.then(function(result) {
+    $scope.notes = result.body.map(function(note) {
       // redirect to notebook when search result is a notebook itself,
       // not a paragraph
       if (!/\/paragraph\//.test(note.id)) {
-        return note
+        return note;
       }
 
       note.id = note.id.replace('paragraph/', '?paragraph=') +
-        '&term=' + $routeParams.searchTerm
+        '&term=' + $routeParams.searchTerm;
 
-      return note
-    })
+      return note;
+    });
     if ($scope.notes.length === 0) {
-      $scope.isResult = false
+      $scope.isResult = false;
     } else {
-      $scope.isResult = true
+      $scope.isResult = true;
     }
 
-    $scope.$on('$routeChangeStart', function (event, next, current) {
+    $scope.$on('$routeChangeStart', function(event, next, current) {
       if (next.originalPath !== '/search/:searchTerm') {
-        searchService.searchTerm = ''
+        searchService.searchTerm = '';
       }
-    })
-  })
+    });
+  });
 
-  $scope.page = 0
-  $scope.allResults = false
+  $scope.page = 0;
+  $scope.allResults = false;
 
-  $scope.highlightSearchResults = function (note) {
-    return function (_editor) {
-      function getEditorMode (text) {
+  $scope.highlightSearchResults = function(note) {
+    return function(_editor) {
+      function getEditorMode(text) {
         let editorModes = {
           'ace/mode/scala': /^%(\w*\.)?spark/,
           'ace/mode/python': /^%(\w*\.)?(pyspark|python)/,
           'ace/mode/r': /^%(\w*\.)?(r|sparkr|knitr)/,
           'ace/mode/sql': /^%(\w*\.)?\wql/,
           'ace/mode/markdown': /^%md/,
-          'ace/mode/sh': /^%sh/
-        }
+          'ace/mode/sh': /^%sh/,
+        };
 
-        return Object.keys(editorModes).reduce(function (res, mode) {
-          return editorModes[mode].test(text) ? mode : res
-        }, 'ace/mode/scala')
+        return Object.keys(editorModes).reduce(function(res, mode) {
+          return editorModes[mode].test(text) ? mode : res;
+        }, 'ace/mode/scala');
       }
 
-      let Range = ace.require('ace/range').Range
+      let Range = ace.require('ace/range').Range;
 
-      _editor.setOption('highlightActiveLine', false)
-      _editor.$blockScrolling = Infinity
-      _editor.setReadOnly(true)
-      _editor.renderer.setShowGutter(false)
-      _editor.setTheme('ace/theme/chrome')
-      _editor.getSession().setMode(getEditorMode(note.text))
+      _editor.setOption('highlightActiveLine', false);
+      _editor.$blockScrolling = Infinity;
+      _editor.setReadOnly(true);
+      _editor.renderer.setShowGutter(false);
+      _editor.setTheme('ace/theme/chrome');
+      _editor.getSession().setMode(getEditorMode(note.text));
 
-      function getIndeces (term) {
-        return function (str) {
-          let indeces = []
-          let i = -1
+      function getIndeces(term) {
+        return function(str) {
+          let indeces = [];
+          let i = -1;
           while ((i = str.indexOf(term, i + 1)) >= 0) {
-            indeces.push(i)
+            indeces.push(i);
           }
-          return indeces
-        }
+          return indeces;
+        };
       }
 
-      let result = ''
+      let result = '';
       if (note.header !== '') {
-        result = note.header + '\n\n' + note.snippet
+        result = note.header + '\n\n' + note.snippet;
       } else {
-        result = note.snippet
+        result = note.snippet;
       }
 
       let lines = result
         .split('\n')
-        .map(function (line, row) {
-          let match = line.match(/<B>(.+?)<\/B>/)
+        .map(function(line, row) {
+          let match = line.match(/<B>(.+?)<\/B>/);
 
           // return early if nothing to highlight
           if (!match) {
-            return line
+            return line;
           }
 
-          let term = match[1]
+          let term = match[1];
           let __line = line
             .replace(/<B>/g, '')
-            .replace(/<\/B>/g, '')
+            .replace(/<\/B>/g, '');
 
-          let indeces = getIndeces(term)(__line)
+          let indeces = getIndeces(term)(__line);
 
-          indeces.forEach(function (start) {
-            let end = start + term.length
+          indeces.forEach(function(start) {
+            let end = start + term.length;
             if (note.header !== '' && row === 0) {
               _editor
                 .getSession()
@@ -120,14 +120,14 @@ function SearchResultCtrl ($scope, $routeParams, searchService) {
                   new Range(row, 0, row, line.length),
                   'search-results-highlight-header',
                   'background'
-                )
+                );
               _editor
                 .getSession()
                 .addMarker(
                   new Range(row, start, row, end),
                   'search-results-highlight',
                   'line'
-                )
+                );
             } else {
               _editor
                 .getSession()
@@ -135,20 +135,22 @@ function SearchResultCtrl ($scope, $routeParams, searchService) {
                   new Range(row, start, row, end),
                   'search-results-highlight',
                   'line'
-                )
+                );
             }
-          })
-          return __line
-        })
+          });
+          return __line;
+        });
 
       // resize editor based on content length
       _editor.setOption(
         'maxLines',
-        lines.reduce(function (len, line) { return len + line.length }, 0)
-      )
-
-      _editor.getSession().setValue(lines.join('\n'))
-      note.searchResult = lines
-    }
-  }
+        lines.reduce(function(len, line) {
+          return len + line.length;
+        }, 0)
+      );
+
+      _editor.getSession().setValue(lines.join('\n'));
+      note.searchResult = lines;
+    };
+  };
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/search/search.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/search/search.service.js b/zeppelin-web/src/app/search/search.service.js
index fe4b666..248bacd 100644
--- a/zeppelin-web/src/app/search/search.service.js
+++ b/zeppelin-web/src/app/search/search.service.js
@@ -12,22 +12,22 @@
  * limitations under the License.
  */
 
-angular.module('zeppelinWebApp').service('searchService', SearchService)
+angular.module('zeppelinWebApp').service('searchService', SearchService);
 
-function SearchService ($resource, baseUrlSrv) {
-  'ngInject'
+function SearchService($resource, baseUrlSrv) {
+  'ngInject';
 
-  this.search = function (term) {
-    this.searchTerm = term.q
-    console.log('Searching for: %o', term.q)
+  this.search = function(term) {
+    this.searchTerm = term.q;
+    console.log('Searching for: %o', term.q);
     if (!term.q) { // TODO(bzz): empty string check
-      return
+      return;
     }
-    let encQuery = window.encodeURIComponent(term.q)
+    let encQuery = window.encodeURIComponent(term.q);
     return $resource(baseUrlSrv.getRestApiBase() + '/notebook/search?q=' + encQuery, {}, {
-      query: {method: 'GET'}
-    })
-  }
+      query: {method: 'GET'},
+    });
+  };
 
-  this.searchTerm = ''
+  this.searchTerm = '';
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/spell/index.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/spell/index.js b/zeppelin-web/src/app/spell/index.js
index ac4343c..8ec4753 100644
--- a/zeppelin-web/src/app/spell/index.js
+++ b/zeppelin-web/src/app/spell/index.js
@@ -18,8 +18,8 @@
 export {
   DefaultDisplayType,
   SpellResult,
-} from './spell-result'
+} from './spell-result';
 
 export {
   SpellBase,
-} from './spell-base'
+} from './spell-base';

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/spell/spell-base.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/spell/spell-base.js b/zeppelin-web/src/app/spell/spell-base.js
index 0b4216f..16e0553 100644
--- a/zeppelin-web/src/app/spell/spell-base.js
+++ b/zeppelin-web/src/app/spell/spell-base.js
@@ -19,12 +19,12 @@
 import {
   DefaultDisplayType,
   SpellResult,
-} from './spell-result'
+} from './spell-result';
 /* eslint-enable no-unused-vars */
 
 export class SpellBase {
-  constructor (magic) {
-    this.magic = magic
+  constructor(magic) {
+    this.magic = magic;
   }
 
   /**
@@ -34,8 +34,8 @@ export class SpellBase {
    * @param config {Object}
    * @return {SpellResult}
    */
-  interpret (paragraphText, config) {
-    throw new Error('SpellBase.interpret() should be overrided')
+  interpret(paragraphText, config) {
+    throw new Error('SpellBase.interpret() should be overrided');
   }
 
   /**
@@ -43,7 +43,7 @@ export class SpellBase {
    * (e.g `%flowchart`)
    * @return {string}
    */
-  getMagic () {
-    return this.magic
+  getMagic() {
+    return this.magic;
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/spell/spell-result.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/spell/spell-result.js b/zeppelin-web/src/app/spell/spell-result.js
index 5ba65c2..52bcdc1 100644
--- a/zeppelin-web/src/app/spell/spell-result.js
+++ b/zeppelin-web/src/app/spell/spell-result.js
@@ -21,8 +21,8 @@ export const DefaultDisplayType = {
   HTML: 'HTML',
   ANGULAR: 'ANGULAR',
   TEXT: 'TEXT',
-  NETWORK: 'NETWORK'
-}
+  NETWORK: 'NETWORK',
+};
 
 export const DefaultDisplayMagic = {
   '%element': DefaultDisplayType.ELEMENT,
@@ -31,12 +31,12 @@ export const DefaultDisplayMagic = {
   '%angular': DefaultDisplayType.ANGULAR,
   '%text': DefaultDisplayType.TEXT,
   '%network': DefaultDisplayType.NETWORK,
-}
+};
 
 export class DataWithType {
-  constructor (data, type, magic, text) {
-    this.data = data
-    this.type = type
+  constructor(data, type, magic, text) {
+    this.data = data;
+    this.type = type;
 
     /**
      * keep for `DefaultDisplayType.ELEMENT` (function data type)
@@ -46,29 +46,29 @@ export class DataWithType {
      * since they don't have context where they are created.
      */
 
-    this.magic = magic
-    this.text = text
+    this.magic = magic;
+    this.text = text;
   }
 
-  static handleDefaultMagic (m) {
+  static handleDefaultMagic(m) {
     // let's use default display type instead of magic in case of default
     // to keep consistency with backend interpreter
     if (DefaultDisplayMagic[m]) {
-      return DefaultDisplayMagic[m]
+      return DefaultDisplayMagic[m];
     } else {
-      return m
+      return m;
     }
   }
 
-  static createPropagable (dataWithType) {
+  static createPropagable(dataWithType) {
     if (!SpellResult.isFunction(dataWithType.data)) {
-      return dataWithType
+      return dataWithType;
     }
 
-    const data = dataWithType.getText()
-    const type = dataWithType.getMagic()
+    const data = dataWithType.getText();
+    const type = dataWithType.getMagic();
 
-    return new DataWithType(data, type)
+    return new DataWithType(data, type);
   }
 
   /**
@@ -77,45 +77,45 @@ export class DataWithType {
    * @param customDisplayType
    * @return {Array<DataWithType>}
    */
-  static parseStringData (data, customDisplayMagic) {
-    function availableMagic (magic) {
-      return magic && (DefaultDisplayMagic[magic] || customDisplayMagic[magic])
+  static parseStringData(data, customDisplayMagic) {
+    function availableMagic(magic) {
+      return magic && (DefaultDisplayMagic[magic] || customDisplayMagic[magic]);
     }
 
-    const splited = data.split('\n')
+    const splited = data.split('\n');
 
-    const gensWithTypes = []
-    let mergedGens = []
-    let previousMagic = DefaultDisplayType.TEXT
+    const gensWithTypes = [];
+    let mergedGens = [];
+    let previousMagic = DefaultDisplayType.TEXT;
 
     // create `DataWithType` whenever see available display type.
     for (let i = 0; i < splited.length; i++) {
-      const g = splited[i]
-      const magic = SpellResult.extractMagic(g)
+      const g = splited[i];
+      const magic = SpellResult.extractMagic(g);
 
       // create `DataWithType` only if see new magic
       if (availableMagic(magic) && mergedGens.length > 0) {
-        gensWithTypes.push(new DataWithType(mergedGens.join(''), previousMagic))
-        mergedGens = []
+        gensWithTypes.push(new DataWithType(mergedGens.join(''), previousMagic));
+        mergedGens = [];
       }
 
       // accumulate `data` to mergedGens
       if (availableMagic(magic)) {
-        const withoutMagic = g.split(magic)[1]
-        mergedGens.push(`${withoutMagic}\n`)
-        previousMagic = DataWithType.handleDefaultMagic(magic)
+        const withoutMagic = g.split(magic)[1];
+        mergedGens.push(`${withoutMagic}\n`);
+        previousMagic = DataWithType.handleDefaultMagic(magic);
       } else {
-        mergedGens.push(`${g}\n`)
+        mergedGens.push(`${g}\n`);
       }
     }
 
     // cleanup the last `DataWithType`
     if (mergedGens.length > 0) {
-      previousMagic = DataWithType.handleDefaultMagic(previousMagic)
-      gensWithTypes.push(new DataWithType(mergedGens.join(''), previousMagic))
+      previousMagic = DataWithType.handleDefaultMagic(previousMagic);
+      gensWithTypes.push(new DataWithType(mergedGens.join(''), previousMagic));
     }
 
-    return gensWithTypes
+    return gensWithTypes;
   }
 
   /**
@@ -128,44 +128,46 @@ export class DataWithType {
    * @param textWithoutMagic
    * @return {Promise<Array<DataWithType>>}
    */
-  static produceMultipleData (dataWithType, customDisplayType,
+  static produceMultipleData(dataWithType, customDisplayType,
                              magic, textWithoutMagic) {
-    const data = dataWithType.getData()
-    const type = dataWithType.getType()
+    const data = dataWithType.getData();
+    const type = dataWithType.getType();
 
     // if the type is specified, just return it
     // handle non-specified dataWithTypes only
     if (type) {
-      return new Promise((resolve) => { resolve([dataWithType]) })
+      return new Promise((resolve) => {
+        resolve([dataWithType]);
+      });
     }
 
-    let wrapped
+    let wrapped;
 
     if (SpellResult.isFunction(data)) {
       // if data is a function, we consider it as ELEMENT type.
       wrapped = new Promise((resolve) => {
         const dt = new DataWithType(
-          data, DefaultDisplayType.ELEMENT, magic, textWithoutMagic)
-        const result = [dt]
-        return resolve(result)
-      })
+          data, DefaultDisplayType.ELEMENT, magic, textWithoutMagic);
+        const result = [dt];
+        return resolve(result);
+      });
     } else if (SpellResult.isPromise(data)) {
       // if data is a promise,
-      wrapped = data.then(generated => {
+      wrapped = data.then((generated) => {
         const result =
-          DataWithType.parseStringData(generated, customDisplayType)
-        return result
-      })
+          DataWithType.parseStringData(generated, customDisplayType);
+        return result;
+      });
     } else {
       // if data is a object, parse it to multiples
       wrapped = new Promise((resolve) => {
         const result =
-          DataWithType.parseStringData(data, customDisplayType)
-        return resolve(result)
-      })
+          DataWithType.parseStringData(data, customDisplayType);
+        return resolve(result);
+      });
     }
 
-    return wrapped
+    return wrapped;
   }
 
   /**
@@ -177,8 +179,8 @@ export class DataWithType {
    *   will be called in `then()` of this promise.
    * @returns {*} `data` which can be object, function or promise.
    */
-  getData () {
-    return this.data
+  getData() {
+    return this.data;
   }
 
   /**
@@ -187,66 +189,66 @@ export class DataWithType {
    * by `SpellResult.parseStringData()`
    * @returns {string}
    */
-  getType () {
-    return this.type
+  getType() {
+    return this.type;
   }
 
-  getMagic () {
-    return this.magic
+  getMagic() {
+    return this.magic;
   }
 
-  getText () {
-    return this.text
+  getText() {
+    return this.text;
   }
 }
 
 export class SpellResult {
-  constructor (resultData, resultType) {
-    this.dataWithTypes = []
-    this.add(resultData, resultType)
+  constructor(resultData, resultType) {
+    this.dataWithTypes = [];
+    this.add(resultData, resultType);
   }
 
-  static isFunction (data) {
-    return (data && typeof data === 'function')
+  static isFunction(data) {
+    return (data && typeof data === 'function');
   }
 
-  static isPromise (data) {
-    return (data && typeof data.then === 'function')
+  static isPromise(data) {
+    return (data && typeof data.then === 'function');
   }
 
-  static isObject (data) {
+  static isObject(data) {
     return (data &&
       !SpellResult.isFunction(data) &&
-      !SpellResult.isPromise(data))
+      !SpellResult.isPromise(data));
   }
 
-  static extractMagic (allParagraphText) {
-    const pattern = /^\s*%(\S+)\s*/g
+  static extractMagic(allParagraphText) {
+    const pattern = /^\s*%(\S+)\s*/g;
     try {
-      let match = pattern.exec(allParagraphText)
+      let match = pattern.exec(allParagraphText);
       if (match) {
-        return `%${match[1].trim()}`
+        return `%${match[1].trim()}`;
       }
     } catch (error) {
       // failed to parse, ignore
     }
 
-    return undefined
+    return undefined;
   }
 
-  static createPropagable (resultMsg) {
-    return resultMsg.map(dt => {
-      return DataWithType.createPropagable(dt)
-    })
+  static createPropagable(resultMsg) {
+    return resultMsg.map((dt) => {
+      return DataWithType.createPropagable(dt);
+    });
   }
 
-  add (resultData, resultType) {
+  add(resultData, resultType) {
     if (resultData) {
       this.dataWithTypes.push(
-        new DataWithType(resultData, resultType))
+        new DataWithType(resultData, resultType));
     }
 
-    return this
+    return this;
   }
 
   /**
@@ -254,23 +256,23 @@ export class SpellResult {
    * @param textWithoutMagic
    * @return {Promise<Array<DataWithType>>}
    */
-  getAllParsedDataWithTypes (customDisplayType, magic, textWithoutMagic) {
-    const promises = this.dataWithTypes.map(dt => {
+  getAllParsedDataWithTypes(customDisplayType, magic, textWithoutMagic) {
+    const promises = this.dataWithTypes.map((dt) => {
       return DataWithType.produceMultipleData(
-        dt, customDisplayType, magic, textWithoutMagic)
-    })
+        dt, customDisplayType, magic, textWithoutMagic);
+    });
 
     // some promises can include an array so we need to flatten them
-    const flatten = Promise.all(promises).then(values => {
+    const flatten = Promise.all(promises).then((values) => {
       return values.reduce((acc, cur) => {
         if (Array.isArray(cur)) {
-          return acc.concat(cur)
+          return acc.concat(cur);
         } else {
-          return acc.concat([cur])
+          return acc.concat([cur]);
         }
-      })
-    })
+      });
+    });
 
-    return flatten
+    return flatten;
   }
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/ea2c9447/zeppelin-web/src/app/tabledata/advanced-transformation-util.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/tabledata/advanced-transformation-util.js b/zeppelin-web/src/app/tabledata/advanced-transformation-util.js
index 0d1c2f6..97c1b2c 100644
--- a/zeppelin-web/src/app/tabledata/advanced-transformation-util.js
+++ b/zeppelin-web/src/app/tabledata/advanced-transformation-util.js
@@ -13,40 +13,40 @@
  */
 
 export function getCurrentChart(config) {
-  return config.chart.current
+  return config.chart.current;
 }
 
 export function getCurrentChartTransform(config) {
-  return config.spec.charts[getCurrentChart(config)].transform
+  return config.spec.charts[getCurrentChart(config)].transform;
 }
 
 export function getCurrentChartAxis(config) {
-  return config.axis[getCurrentChart(config)]
+  return config.axis[getCurrentChart(config)];
 }
 
 export function getCurrentChartParam(config) {
-  return config.parameter[getCurrentChart(config)]
+  return config.parameter[getCurrentChart(config)];
 }
 
 export function getCurrentChartAxisSpecs(config) {
-  return config.axisSpecs[getCurrentChart(config)]
+  return config.axisSpecs[getCurrentChart(config)];
 }
 
 export function getCurrentChartParamSpecs(config) {
-  return config.paramSpecs[getCurrentChart(config)]
+  return config.paramSpecs[getCurrentChart(config)];
 }
 
 export function useSharedAxis(config, chart) {
-  return config.spec.charts[chart].sharedAxis
+  return config.spec.charts[chart].sharedAxis;
 }
 
 export function serializeSharedAxes(config) {
-  const availableCharts = getAvailableChartNames(config.spec.charts)
+  const availableCharts = getAvailableChartNames(config.spec.charts);
   for (let i = 0; i < availableCharts.length; i++) {
-    const chartName = availableCharts[i]
+    const chartName = availableCharts[i];
     if (useSharedAxis(config, chartName)) {
       /** use reference :) in case of sharedAxis */
-      config.axis[chartName] = config.sharedAxis
+      config.axis[chartName] = config.sharedAxis;
     }
   }
 }
@@ -56,22 +56,22 @@ export const Widget = {
   OPTION: 'option',
   CHECKBOX: 'checkbox',
   TEXTAREA: 'textarea',
-}
+};
 
 export function isInputWidget(paramSpec) {
-  return (paramSpec && !paramSpec.widget) || (paramSpec && paramSpec.widget === Widget.INPUT)
+  return (paramSpec && !paramSpec.widget) || (paramSpec && paramSpec.widget === Widget.INPUT);
 }
 
 export function isOptionWidget(paramSpec) {
-  return paramSpec && paramSpec.widget === Widget.OPTION
+  return paramSpec && paramSpec.widget === Widget.OPTION;
 }
 
 export function isCheckboxWidget(paramSpec) {
-  return paramSpec && paramSpec.widget === Widget.CHECKBOX
+  return paramSpec && paramSpec.widget === Widget.CHECKBOX;
 }
 
 export function isTextareaWidget(paramSpec) {
-  return paramSpec && paramSpec.widget === Widget.TEXTAREA
+  return paramSpec && paramSpec.widget === Widget.TEXTAREA;
 }
 
 export const ParameterValueType = {
@@ -80,59 +80,71 @@ export const ParameterValueType = {
   BOOLEAN: 'boolean',
   STRING: 'string',
   JSON: 'JSON',
-}
+};
 
 export function parseParameter(paramSpecs, param) {
   /** copy original params */
-  const parsed = JSON.parse(JSON.stringify(param))
+  const parsed = JSON.parse(JSON.stringify(param));
 
   for (let i = 0; i < paramSpecs.length; i++) {
-    const paramSpec = paramSpecs[i]
-    const name = paramSpec.name
+    const paramSpec = paramSpecs[i];
+    const name = paramSpec.name;
 
     if (paramSpec.valueType === ParameterValueType.INT &&
       typeof parsed[name] !== 'number') {
-      try { parsed[name] = parseInt(parsed[name]) } catch (error) { parsed[name] = paramSpec.defaultValue }
+      try {
+        parsed[name] = parseInt(parsed[name]);
+      } catch (error) {
+        parsed[name] = paramSpec.defaultValue;
+      }
     } else if (paramSpec.valueType === ParameterValueType.FLOAT &&
       typeof parsed[name] !== 'number') {
-      try { parsed[name] = parseFloat(parsed[name]) } catch (error) { parsed[name] = paramSpec.defaultValue }
+      try {
+        parsed[name] = parseFloat(parsed[name]);
+      } catch (error) {
+        parsed[name] = paramSpec.defaultValue;
+      }
     } else if (paramSpec.valueType === ParameterValueType.BOOLEAN) {
       if (parsed[name] === 'false') {
-        parsed[name] = false
+        parsed[name] = false;
       } else if (parsed[name] === 'true') {
-        parsed[name] = true
+        parsed[name] = true;
       } else if (typeof parsed[name] !== 'boolean') {
-        parsed[name] = paramSpec.defaultValue
+        parsed[name] = paramSpec.defaultValue;
       }
     } else if (paramSpec.valueType === ParameterValueType.JSON) {
       if (parsed[name] !== null && typeof parsed[name] !== 'object') {
-        try { parsed[name] = JSON.parse(parsed[name]) } catch (error) { parsed[name] = paramSpec.defaultValue }
+        try {
+          parsed[name] = JSON.parse(parsed[name]);
+        } catch (error) {
+          parsed[name] = paramSpec.defaultValue;
+        }
       } else if (parsed[name] === null) {
-        parsed[name] = paramSpec.defaultValue
+        parsed[name] = paramSpec.defaultValue;
       }
     }
   }
 
-  return parsed
+  return parsed;
 }
 
 export const AxisType = {
   AGGREGATOR: 'aggregator',
   KEY: 'key',
   GROUP: 'group',
-}
+};
 
 export function isAggregatorAxis(axisSpec) {
-  return axisSpec && axisSpec.axisType === AxisType.AGGREGATOR
+  return axisSpec && axisSpec.axisType === AxisType.AGGREGATOR;
 }
 export function isGroupAxis(axisSpec) {
-  return axisSpec && axisSpec.axisType === AxisType.GROUP
+  return axisSpec && axisSpec.axisType === AxisType.GROUP;
 }
 export function isKeyAxis(axisSpec) {
-  return axisSpec && axisSpec.axisType === AxisType.KEY
+  return axisSpec && axisSpec.axisType === AxisType.KEY;
 }
 export function isSingleDimensionAxis(axisSpec) {
-  return axisSpec && axisSpec.dimension === 'single'
+  return axisSpec && axisSpec.dimension === 'single';
 }
 
 /**
@@ -142,92 +154,112 @@ export function isSingleDimensionAxis(axisSpec) {
  * add the `name` field while converting to array to easily manipulate
  */
 export function getSpecs(specObject) {
-  const specs = []
+  const specs = [];
   for (let name in specObject) {
-    const singleSpec = specObject[name]
-    if (!singleSpec) { continue }
-    singleSpec.name = name
-    specs.push(singleSpec)
+    if (specObject.hasOwnProperty(name)) {
+      const singleSpec = specObject[name];
+      if (!singleSpec) {
+        continue;
+      }
+      singleSpec.name = name;
+      specs.push(singleSpec);
+    }
   }
 
-  return specs
+  return specs;
 }
 
 export function getAvailableChartNames(charts) {
-  const available = []
+  const available = [];
   for (let name in charts) {
-    available.push(name)
+    if (charts.hasOwnProperty(name)) {
+      available.push(name);
+    }
   }
 
-  return available
+  return available;
 }
 
 export function applyMaxAxisCount(config, axisSpec) {
   if (isSingleDimensionAxis(axisSpec) || typeof axisSpec.maxAxisCount === 'undefined') {
-    return
+    return;
   }
 
-  const columns = getCurrentChartAxis(config)[axisSpec.name]
-  if (columns.length <= axisSpec.maxAxisCount) { return }
+  const columns = getCurrentChartAxis(config)[axisSpec.name];
+  if (columns.length <= axisSpec.maxAxisCount) {
+    return;
+  }
 
-  const sliced = columns.slice(1)
-  getCurrentChartAxis(config)[axisSpec.name] = sliced
+  const sliced = columns.slice(1);
+  getCurrentChartAxis(config)[axisSpec.name] = sliced;
 }
 
 export function removeDuplicatedColumnsInMultiDimensionAxis(config, axisSpec) {
-  if (isSingleDimensionAxis(axisSpec)) { return config }
+  if (isSingleDimensionAxis(axisSpec)) {
+    return config;
+  }
 
-  const columns = getCurrentChartAxis(config)[axisSpec.name]
+  const columns = getCurrentChartAxis(config)[axisSpec.name];
   const uniqObject = columns.reduce((acc, col) => {
-    if (!acc[`${col.name}(${col.aggr})`]) { acc[`${col.name}(${col.aggr})`] = col }
-    return acc
-  }, {})
+    if (!acc[`${col.name}(${col.aggr})`]) {
+      acc[`${col.name}(${col.aggr})`] = col;
+    }
+    return acc;
+  }, {});
 
-  const filtered = []
+  const filtered = [];
   for (let name in uniqObject) {
-    const col = uniqObject[name]
-    filtered.push(col)
+    if (uniqObject.hasOwnProperty(name)) {
+      const col = uniqObject[name];
+      filtered.push(col);
+    }
   }
 
-  getCurrentChartAxis(config)[axisSpec.name] = filtered
-  return config
+  getCurrentChartAxis(config)[axisSpec.name] = filtered;
+  return config;
 }
 
 export function clearAxisConfig(config) {
-  delete config.axis /** Object: persisted axis for each chart */
-  delete config.sharedAxis
+  delete config.axis; /** Object: persisted axis for each chart */
+  delete config.sharedAxis;
 }
 
 export function initAxisConfig(config) {
-  if (!config.axis) { config.axis = {} }
-  if (!config.sharedAxis) { config.sharedAxis = {} }
+  if (!config.axis) {
+    config.axis = {};
+  }
+  if (!config.sharedAxis) {
+    config.sharedAxis = {};
+  }
 
-  const spec = config.spec
-  const availableCharts = getAvailableChartNames(spec.charts)
+  const spec = config.spec;
+  const availableCharts = getAvailableChartNames(spec.charts);
 
-  if (!config.axisSpecs) { config.axisSpecs = {} }
+  if (!config.axisSpecs) {
+    config.axisSpecs = {};
+  }
   for (let i = 0; i < availableCharts.length; i++) {
-    const chartName = availableCharts[i]
+    const chartName = availableCharts[i];
 
     if (!config.axis[chartName]) {
-      config.axis[chartName] = {}
+      config.axis[chartName] = {};
     }
-    const axisSpecs = getSpecs(spec.charts[chartName].axis)
+    const axisSpecs = getSpecs(spec.charts[chartName].axis);
     if (!config.axisSpecs[chartName]) {
-      config.axisSpecs[chartName] = axisSpecs
+      config.axisSpecs[chartName] = axisSpecs;
     }
 
     /** initialize multi-dimension axes */
     for (let i = 0; i < axisSpecs.length; i++) {
-      const axisSpec = axisSpecs[i]
+      const axisSpec = axisSpecs[i];
       if (isSingleDimensionAxis(axisSpec)) {
-        continue
+        continue;
       }
 
       /** intentionally nested if-stmt is used because order of conditions matter here */
       if (!useSharedAxis(config, chartName)) {
         if (!Array.isArray(config.axis[chartName][axisSpec.name])) {
-          config.axis[chartName][axisSpec.name] = []
+          config.axis[chartName][axisSpec.name] = [];
         }
       } else if (useSharedAxis(config, chartName)) {
         /**
@@ -235,180 +267,200 @@ export function initAxisConfig(config) {
          * all charts using shared axis have the same axis specs
          */
         if (!Array.isArray(config.sharedAxis[axisSpec.name])) {
-          config.sharedAxis[axisSpec.name] = []
+          config.sharedAxis[axisSpec.name] = [];
         }
       }
     }
   }
 
   /** this function should be called after initializing */
-  serializeSharedAxes(config)
+  serializeSharedAxes(config);
 }
 
 export function resetAxisConfig(config) {
-  clearAxisConfig(config)
-  initAxisConfig(config)
+  clearAxisConfig(config);
+  initAxisConfig(config);
 }
 
 export function clearParameterConfig(config) {
-  delete config.parameter  /** Object: persisted parameter for each chart */
+  delete config.parameter;  /** Object: persisted parameter for each chart */
 }
 
 export function initParameterConfig(config) {
-  if (!config.parameter) { config.parameter = {} }
+  if (!config.parameter) {
+    config.parameter = {};
+  }
 
-  const spec = config.spec
-  const availableCharts = getAvailableChartNames(spec.charts)
+  const spec = config.spec;
+  const availableCharts = getAvailableChartNames(spec.charts);
 
-  if (!config.paramSpecs) { config.paramSpecs = {} }
+  if (!config.paramSpecs) {
+    config.paramSpecs = {};
+  }
   for (let i = 0; i < availableCharts.length; i++) {
-    const chartName = availableCharts[i]
+    const chartName = availableCharts[i];
 
-    if (!config.parameter[chartName]) { config.parameter[chartName] = {} }
-    const paramSpecs = getSpecs(spec.charts[chartName].parameter)
-    if (!config.paramSpecs[chartName]) { config.paramSpecs[chartName] = paramSpecs }
+    if (!config.parameter[chartName]) {
+      config.parameter[chartName] = {};
+    }
+    const paramSpecs = getSpecs(spec.charts[chartName].parameter);
+    if (!config.paramSpecs[chartName]) {
+      config.paramSpecs[chartName] = paramSpecs;
+    }
 
     for (let i = 0; i < paramSpecs.length; i++) {
-      const paramSpec = paramSpecs[i]
+      const paramSpec = paramSpecs[i];
       if (!config.parameter[chartName][paramSpec.name]) {
-        config.parameter[chartName][paramSpec.name] = paramSpec.defaultValue
+        config.parameter[chartName][paramSpec.name] = paramSpec.defaultValue;
       }
     }
   }
 }
 
 export function resetParameterConfig(config) {
-  clearParameterConfig(config)
-  initParameterConfig(config)
+  clearParameterConfig(config);
+  initParameterConfig(config);
 }
 
 export function getSpecVersion(availableCharts, spec) {
-  const axisHash = {}
-  const paramHash = {}
+  const axisHash = {};
+  const paramHash = {};
 
   for (let i = 0; i < availableCharts.length; i++) {
-    const chartName = availableCharts[i]
-    const axisSpecs = getSpecs(spec.charts[chartName].axis)
-    axisHash[chartName] = axisSpecs
+    const chartName = availableCharts[i];
+    const axisSpecs = getSpecs(spec.charts[chartName].axis);
+    axisHash[chartName] = axisSpecs;
 
-    const paramSpecs = getSpecs(spec.charts[chartName].parameter)
-    paramHash[chartName] = paramSpecs
+    const paramSpecs = getSpecs(spec.charts[chartName].parameter);
+    paramHash[chartName] = paramSpecs;
   }
 
-  return { axisVersion: JSON.stringify(axisHash), paramVersion: JSON.stringify(paramHash), }
+  return {axisVersion: JSON.stringify(axisHash), paramVersion: JSON.stringify(paramHash)};
 }
 
 export function initializeConfig(config, spec) {
-  config.chartChanged = true
-  config.parameterChanged = false
+  config.chartChanged = true;
+  config.parameterChanged = false;
 
-  let updated = false
+  let updated = false;
 
-  const availableCharts = getAvailableChartNames(spec.charts)
-  const { axisVersion, paramVersion, } = getSpecVersion(availableCharts, spec)
+  const availableCharts = getAvailableChartNames(spec.charts);
+  const {axisVersion, paramVersion} = getSpecVersion(availableCharts, spec);
 
   if (!config.spec || !config.spec.version ||
     !config.spec.version.axis ||
     config.spec.version.axis !== axisVersion) {
-    spec.initialized = true
-    updated = true
+    spec.initialized = true;
+    updated = true;
 
-    delete config.chart      /** Object: contains current, available chart */
-    config.panel = { columnPanelOpened: true, parameterPanelOpened: false, }
+    delete config.chart;      /** Object: contains current, available chart */
+    config.panel = {columnPanelOpened: true, parameterPanelOpened: false};
 
-    clearAxisConfig(config)
-    delete config.axisSpecs  /** Object: persisted axisSpecs for each chart */
+    clearAxisConfig(config);
+    delete config.axisSpecs;  /** Object: persisted axisSpecs for each chart */
   }
 
   if (!config.spec || !config.spec.version ||
     !config.spec.version.parameter ||
     config.spec.version.parameter !== paramVersion) {
-    updated = true
+    updated = true;
 
-    clearParameterConfig(config)
-    delete config.paramSpecs /** Object: persisted paramSpecs for each chart */
+    clearParameterConfig(config);
+    delete config.paramSpecs; /** Object: persisted paramSpecs for each chart */
   }
 
-  if (!spec.version) { spec.version = {} }
-  spec.version.axis = axisVersion
-  spec.version.parameter = paramVersion
+  if (!spec.version) {
+    spec.version = {};
+  }
+  spec.version.axis = axisVersion;
+  spec.version.parameter = paramVersion;
 
-  if (!config.spec || updated) { config.spec = spec }
+  if (!config.spec || updated) {
+    config.spec = spec;
+  }
 
   if (!config.chart) {
-    config.chart = {}
-    config.chart.current = availableCharts[0]
-    config.chart.available = availableCharts
+    config.chart = {};
+    config.chart.current = availableCharts[0];
+    config.chart.available = availableCharts;
   }
 
   /** initialize config.axis, config.axisSpecs for each chart */
-  initAxisConfig(config)
+  initAxisConfig(config);
 
   /** initialize config.parameter for each chart */
-  initParameterConfig(config)
-  return config
+  initParameterConfig(config);
+  return config;
 }
 
 export function getColumnsForMultipleAxes(axisType, axisSpecs, axis) {
-  const axisNames = []
-  let column = {}
+  const axisNames = [];
+  let column = {};
 
   for (let i = 0; i < axisSpecs.length; i++) {
-    const axisSpec = axisSpecs[i]
+    const axisSpec = axisSpecs[i];
 
     if (axisType === AxisType.KEY && isKeyAxis(axisSpec)) {
-      axisNames.push(axisSpec.name)
+      axisNames.push(axisSpec.name);
     } else if (axisType === AxisType.GROUP && isGroupAxis(axisSpec)) {
-      axisNames.push(axisSpec.name)
+      axisNames.push(axisSpec.name);
     } else if (axisType.AGGREGATOR && isAggregatorAxis(axisSpec)) {
-      axisNames.push(axisSpec.name)
+      axisNames.push(axisSpec.name);
     }
   }
 
   for (let axisName of axisNames) {
-    const columns = axis[axisName]
-    if (typeof axis[axisName] === 'undefined') { continue }
-    if (!column[axisName]) { column[axisName] = [] }
-    column[axisName] = column[axisName].concat(columns)
+    const columns = axis[axisName];
+    if (typeof axis[axisName] === 'undefined') {
+      continue;
+    }
+    if (!column[axisName]) {
+      column[axisName] = [];
+    }
+    column[axisName] = column[axisName].concat(columns);
   }
 
-  return column
+  return column;
 }
 
 export function getColumnsFromAxis(axisSpecs, axis) {
-  const keyAxisNames = []
-  const groupAxisNames = []
-  const aggrAxisNames = []
+  const keyAxisNames = [];
+  const groupAxisNames = [];
+  const aggrAxisNames = [];
 
   for (let i = 0; i < axisSpecs.length; i++) {
-    const axisSpec = axisSpecs[i]
+    const axisSpec = axisSpecs[i];
 
     if (isKeyAxis(axisSpec)) {
-      keyAxisNames.push(axisSpec.name)
+      keyAxisNames.push(axisSpec.name);
     } else if (isGroupAxis(axisSpec)) {
-      groupAxisNames.push(axisSpec.name)
+      groupAxisNames.push(axisSpec.name);
     } else if (isAggregatorAxis(axisSpec)) {
-      aggrAxisNames.push(axisSpec.name)
+      aggrAxisNames.push(axisSpec.name);
     }
   }
 
-  let keyColumns = []
-  let groupColumns = []
-  let aggregatorColumns = []
-  let customColumn = {}
+  let keyColumns = [];
+  let groupColumns = [];
+  let aggregatorColumns = [];
+  let customColumn = {};
 
   for (let axisName in axis) {
-    const columns = axis[axisName]
-    if (keyAxisNames.includes(axisName)) {
-      keyColumns = keyColumns.concat(columns)
-    } else if (groupAxisNames.includes(axisName)) {
-      groupColumns = groupColumns.concat(columns)
-    } else if (aggrAxisNames.includes(axisName)) {
-      aggregatorColumns = aggregatorColumns.concat(columns)
-    } else {
-      const axisType = axisSpecs.filter(s => s.name === axisName)[0].axisType
-      if (!customColumn[axisType]) { customColumn[axisType] = [] }
-      customColumn[axisType] = customColumn[axisType].concat(columns)
+    if (axis.hasOwnProperty(axisName)) {
+      const columns = axis[axisName];
+      if (keyAxisNames.includes(axisName)) {
+        keyColumns = keyColumns.concat(columns);
+      } else if (groupAxisNames.includes(axisName)) {
+        groupColumns = groupColumns.concat(columns);
+      } else if (aggrAxisNames.includes(axisName)) {
+        aggregatorColumns = aggregatorColumns.concat(columns);
+      } else {
+        const axisType = axisSpecs.filter((s) => s.name === axisName)[0].axisType;
+        if (!customColumn[axisType]) {
+          customColumn[axisType] = [];
+        }
+        customColumn[axisType] = customColumn[axisType].concat(columns);
+      }
     }
   }
 
@@ -417,7 +469,7 @@ export function getColumnsFromAxis(axisSpecs, axis) {
     group: groupColumns,
     aggregator: aggregatorColumns,
     custom: customColumn,
-  }
+  };
 }
 
 export const Aggregator = {
@@ -426,7 +478,7 @@ export const Aggregator = {
   AVG: 'avg',
   MIN: 'min',
   MAX: 'max',
-}
+};
 
 const TransformMethod = {
   /**
@@ -449,38 +501,42 @@ const TransformMethod = {
   ARRAY: 'array',
   ARRAY_2_KEY: 'array:2-key',
   DRILL_DOWN: 'drill-down',
-}
+};
 
 /** return function for lazy computation */
 export function getTransformer(conf, rows, axisSpecs, axis) {
-  let transformer = () => {}
+  let transformer = () => {};
 
-  const transformSpec = getCurrentChartTransform(conf)
-  if (!transformSpec) { return transformer }
+  const transformSpec = getCurrentChartTransform(conf);
+  if (!transformSpec) {
+    return transformer;
+  }
 
-  const method = transformSpec.method
+  const method = transformSpec.method;
 
-  const columns = getColumnsFromAxis(axisSpecs, axis)
-  const keyColumns = columns.key
-  const groupColumns = columns.group
-  const aggregatorColumns = columns.aggregator
-  const customColumns = columns.custom
+  const columns = getColumnsFromAxis(axisSpecs, axis);
+  const keyColumns = columns.key;
+  const groupColumns = columns.group;
+  const aggregatorColumns = columns.aggregator;
+  const customColumns = columns.custom;
 
   let column = {
     key: keyColumns, group: groupColumns, aggregator: aggregatorColumns, custom: customColumns,
-  }
+  };
 
   if (method === TransformMethod.RAW) {
-    transformer = () => { return rows }
+    transformer = () => {
+      return rows;
+    };
   } else if (method === TransformMethod.OBJECT) {
     transformer = () => {
-      const { cube, schema, keyColumnName, keyNames, groupNameSet, selectorNameWithIndex, } =
-        getKGACube(rows, keyColumns, groupColumns, aggregatorColumns)
+      const {cube, schema, keyColumnName, keyNames, groupNameSet, selectorNameWithIndex} =
+        getKGACube(rows, keyColumns, groupColumns, aggregatorColumns);
 
       const {
-        transformed, groupNames, sortedSelectors
+        transformed, groupNames, sortedSelectors,
       } = getObjectRowsFromKGACube(cube, schema, aggregatorColumns,
-        keyColumnName, keyNames, groupNameSet, selectorNameWithIndex)
+        keyColumnName, keyNames, groupNameSet, selectorNameWithIndex);
 
       return {
         rows: transformed,
@@ -488,17 +544,17 @@ export function getTransformer(conf, rows, axisSpecs, axis) {
         keyNames,
         groupNames: groupNames,
         selectors: sortedSelectors,
-      }
-    }
+      };
+    };
   } else if (method === TransformMethod.ARRAY) {
     transformer = () => {
-      const { cube, schema, keyColumnName, keyNames, groupNameSet, selectorNameWithIndex, } =
-        getKGACube(rows, keyColumns, groupColumns, aggregatorColumns)
+      const {cube, schema, keyColumnName, keyNames, groupNameSet, selectorNameWithIndex} =
+        getKGACube(rows, keyColumns, groupColumns, aggregatorColumns);
 
       const {
         transformed, groupNames, sortedSelectors,
       } = getArrayRowsFromKGACube(cube, schema, aggregatorColumns,
-        keyColumnName, keyNames, groupNameSet, selectorNameWithIndex)
+        keyColumnName, keyNames, groupNameSet, selectorNameWithIndex);
 
       return {
         rows: transformed,
@@ -506,34 +562,40 @@ export function getTransformer(conf, rows, axisSpecs, axis) {
         keyNames,
         groupNames: groupNames,
         selectors: sortedSelectors,
-      }
-    }
+      };
+    };
   } else if (method === TransformMethod.ARRAY_2_KEY) {
-    const keyAxisColumn = getColumnsForMultipleAxes(AxisType.KEY, axisSpecs, axis)
-    column.key = keyAxisColumn
+    const keyAxisColumn = getColumnsForMultipleAxes(AxisType.KEY, axisSpecs, axis);
+    column.key = keyAxisColumn;
 
-    let key1Columns = []
-    let key2Columns = []
+    let key1Columns = [];
+    let key2Columns = [];
 
     // since ARRAY_2_KEY :)
-    let i = 0
+    let i = 0;
     for (let axisName in keyAxisColumn) {
-      if (i === 2) { break }
+      if (i === 2) {
+        break;
+      }
 
-      if (i === 0) { key1Columns = keyAxisColumn[axisName] } else if (i === 1) { key2Columns = keyAxisColumn[axisName] }
-      i++
+      if (i === 0) {
+        key1Columns = keyAxisColumn[axisName];
+      } else if (i === 1) {
+        key2Columns = keyAxisColumn[axisName];
+      }
+      i++;
     }
 
-    const { cube, schema,
+    const {cube, schema,
       key1ColumnName, key1Names, key2ColumnName, key2Names,
       groupNameSet, selectorNameWithIndex,
-    } = getKKGACube(rows, key1Columns, key2Columns, groupColumns, aggregatorColumns)
+    } = getKKGACube(rows, key1Columns, key2Columns, groupColumns, aggregatorColumns);
 
     const {
       transformed, groupNames, sortedSelectors,
       key1NameWithIndex, key2NameWithIndex,
     } = getArrayRowsFromKKGACube(cube, schema, aggregatorColumns,
-      key1Names, key2Names, groupNameSet, selectorNameWithIndex)
+      key1Names, key2Names, groupNameSet, selectorNameWithIndex);
 
     transformer = () => {
       return {
@@ -546,17 +608,17 @@ export function getTransformer(conf, rows, axisSpecs, axis) {
         key2NameWithIndex: key2NameWithIndex,
         groupNames: groupNames,
         selectors: sortedSelectors,
-      }
-    }
+      };
+    };
   } else if (method === TransformMethod.DRILL_DOWN) {
     transformer = () => {
-      const { cube, schema, keyColumnName, keyNames, groupNameSet, selectorNameWithIndex, } =
-        getKAGCube(rows, keyColumns, groupColumns, aggregatorColumns)
+      const {cube, schema, keyColumnName, keyNames, groupNameSet, selectorNameWithIndex} =
+        getKAGCube(rows, keyColumns, groupColumns, aggregatorColumns);
 
       const {
         transformed, groupNames, sortedSelectors,
       } = getDrilldownRowsFromKAGCube(cube, schema, aggregatorColumns,
-        keyColumnName, keyNames, groupNameSet, selectorNameWithIndex)
+        keyColumnName, keyNames, groupNameSet, selectorNameWithIndex);
 
       return {
         rows: transformed,
@@ -564,48 +626,48 @@ export function getTransformer(conf, rows, axisSpecs, axis) {
         keyNames,
         groupNames: groupNames,
         selectors: sortedSelectors,
-      }
-    }
+      };
+    };
   }
 
-  return { transformer: transformer, column: column, }
+  return {transformer: transformer, column: column};
 }
 
 const AggregatorFunctions = {
   sum: function(a, b) {
-    const varA = (a !== undefined) ? (isNaN(a) ? 1 : parseFloat(a)) : 0
-    const varB = (b !== undefined) ? (isNaN(b) ? 1 : parseFloat(b)) : 0
-    return varA + varB
+    const varA = (a !== undefined) ? (isNaN(a) ? 1 : parseFloat(a)) : 0;
+    const varB = (b !== undefined) ? (isNaN(b) ? 1 : parseFloat(b)) : 0;
+    return varA + varB;
   },
   count: function(a, b) {
-    const varA = (a !== undefined) ? parseInt(a) : 0
-    const varB = (b !== undefined) ? 1 : 0
-    return varA + varB
+    const varA = (a !== undefined) ? parseInt(a) : 0;
+    const varB = (b !== undefined) ? 1 : 0;
+    return varA + varB;
   },
   min: function(a, b) {
-    const varA = (a !== undefined) ? (isNaN(a) ? 1 : parseFloat(a)) : 0
-    const varB = (b !== undefined) ? (isNaN(b) ? 1 : parseFloat(b)) : 0
-    return Math.min(varA, varB)
+    const varA = (a !== undefined) ? (isNaN(a) ? 1 : parseFloat(a)) : 0;
+    const varB = (b !== undefined) ? (isNaN(b) ? 1 : parseFloat(b)) : 0;
+    return Math.min(varA, varB);
   },
   max: function(a, b) {
-    const varA = (a !== undefined) ? (isNaN(a) ? 1 : parseFloat(a)) : 0
-    const varB = (b !== undefined) ? (isNaN(b) ? 1 : parseFloat(b)) : 0
-    return Math.max(varA, varB)
+    const varA = (a !== undefined) ? (isNaN(a) ? 1 : parseFloat(a)) : 0;
+    const varB = (b !== undefined) ? (isNaN(b) ? 1 : parseFloat(b)) : 0;
+    return Math.max(varA, varB);
   },
   avg: function(a, b, c) {
-    const varA = (a !== undefined) ? (isNaN(a) ? 1 : parseFloat(a)) : 0
-    const varB = (b !== undefined) ? (isNaN(b) ? 1 : parseFloat(b)) : 0
-    return varA + varB
-  }
-}
+    const varA = (a !== undefined) ? (isNaN(a) ? 1 : parseFloat(a)) : 0;
+    const varB = (b !== undefined) ? (isNaN(b) ? 1 : parseFloat(b)) : 0;
+    return varA + varB;
+  },
+};
 
 const AggregatorFunctionDiv = {
   sum: false,
   min: false,
   max: false,
   count: false,
-  avg: true
-}
+  avg: true,
+};
 
 /** nested cube `(key) -> (group) -> aggregator` */
 export function getKGACube(rows, keyColumns, groupColumns, aggrColumns) {
@@ -613,67 +675,75 @@ export function getKGACube(rows, keyColumns, groupColumns, aggrColumns) {
     key: keyColumns.length !== 0,
     group: groupColumns.length !== 0,
     aggregator: aggrColumns.length !== 0,
-  }
+  };
 
-  let cube = {}
-  const entry = {}
+  let cube = {};
+  const entry = {};
 
-  const keyColumnName = keyColumns.map(c => c.name).join('.')
-  const groupNameSet = new Set()
-  const keyNameSet = new Set()
-  const selectorNameWithIndex = {} /** { selectorName: index } */
-  let indexCounter = 0
+  const keyColumnName = keyColumns.map((c) => c.name).join('.');
+  const groupNameSet = new Set();
+  const keyNameSet = new Set();
+  const selectorNameWithIndex = {}; /** { selectorName: index } */
+  let indexCounter = 0;
 
   for (let i = 0; i < rows.length; i++) {
-    const row = rows[i]
-    let e = entry
-    let c = cube
+    const row = rows[i];
+    let e = entry;
+    let c = cube;
 
     // key: add to entry
-    let mergedKeyName
+    let mergedKeyName;
     if (schema.key) {
-      mergedKeyName = keyColumns.map(c => row[c.index]).join('.')
-      if (!e[mergedKeyName]) { e[mergedKeyName] = { children: {}, } }
-      e = e[mergedKeyName].children
+      mergedKeyName = keyColumns.map((c) => row[c.index]).join('.');
+      if (!e[mergedKeyName]) {
+        e[mergedKeyName] = {children: {}};
+      }
+      e = e[mergedKeyName].children;
       // key: add to row
-      if (!c[mergedKeyName]) { c[mergedKeyName] = {} }
-      c = c[mergedKeyName]
+      if (!c[mergedKeyName]) {
+        c[mergedKeyName] = {};
+      }
+      c = c[mergedKeyName];
 
-      keyNameSet.add(mergedKeyName)
+      keyNameSet.add(mergedKeyName);
     }
 
-    let mergedGroupName
+    let mergedGroupName;
     if (schema.group) {
-      mergedGroupName = groupColumns.map(c => row[c.index]).join('.')
+      mergedGroupName = groupColumns.map((c) => row[c.index]).join('.');
 
       // add group to entry
-      if (!e[mergedGroupName]) { e[mergedGroupName] = { children: {}, } }
-      e = e[mergedGroupName].children
+      if (!e[mergedGroupName]) {
+        e[mergedGroupName] = {children: {}};
+      }
+      e = e[mergedGroupName].children;
       // add group to row
-      if (!c[mergedGroupName]) { c[mergedGroupName] = {} }
-      c = c[mergedGroupName]
-      groupNameSet.add(mergedGroupName)
+      if (!c[mergedGroupName]) {
+        c[mergedGroupName] = {};
+      }
+      c = c[mergedGroupName];
+      groupNameSet.add(mergedGroupName);
     }
 
     for (let a = 0; a < aggrColumns.length; a++) {
-      const aggrColumn = aggrColumns[a]
-      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`
+      const aggrColumn = aggrColumns[a];
+      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`;
 
       // update groupNameSet
       if (!mergedGroupName) {
-        groupNameSet.add(aggrName) /** aggr column name will be used as group name if group is empty */
+        groupNameSet.add(aggrName); /** aggr column name will be used as group name if group is empty */
       }
 
       // update selectorNameWithIndex
-      const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName)
+      const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName);
       if (typeof selectorNameWithIndex[selector] === 'undefined' /** value might be 0 */) {
-        selectorNameWithIndex[selector] = indexCounter
-        indexCounter = indexCounter + 1
+        selectorNameWithIndex[selector] = indexCounter;
+        indexCounter = indexCounter + 1;
       }
 
       // add aggregator to entry
       if (!e[aggrName]) {
-        e[aggrName] = { type: 'aggregator', order: aggrColumn, index: aggrColumn.index, }
+        e[aggrName] = {type: 'aggregator', order: aggrColumn, index: aggrColumn.index};
       }
 
       // add aggregatorName to row
@@ -682,26 +752,26 @@ export function getKGACube(rows, keyColumns, groupColumns, aggrColumns) {
           aggr: aggrColumn.aggr,
           value: (aggrColumn.aggr !== 'count') ? row[aggrColumn.index] : 1,
           count: 1,
-        }
+        };
       } else {
         const value = AggregatorFunctions[aggrColumn.aggr](
-          c[aggrName].value, row[aggrColumn.index], c[aggrName].count + 1)
+          c[aggrName].value, row[aggrColumn.index], c[aggrName].count + 1);
         const count = (AggregatorFunctionDiv[aggrColumn.aggr])
-          ? c[aggrName].count + 1 : c[aggrName].count
+          ? c[aggrName].count + 1 : c[aggrName].count;
 
-        c[aggrName].value = value
-        c[aggrName].count = count
+        c[aggrName].value = value;
+        c[aggrName].count = count;
       }
     } /** end loop for aggrColumns */
   }
 
-  let keyNames = null
+  let keyNames = null;
   if (!schema.key) {
-    const mergedGroupColumnName = groupColumns.map(c => c.name).join('.')
-    cube = { [mergedGroupColumnName]: cube, }
-    keyNames = [ mergedGroupColumnName, ]
+    const mergedGroupColumnName = groupColumns.map((c) => c.name).join('.');
+    cube = {[mergedGroupColumnName]: cube};
+    keyNames = [mergedGroupColumnName];
   } else {
-    keyNames = Object.keys(cube).sort() /** keys should be sorted */
+    keyNames = Object.keys(cube).sort(); /** keys should be sorted */
   }
 
   return {
@@ -711,7 +781,7 @@ export function getKGACube(rows, keyColumns, groupColumns, aggrColumns) {
     keyNames: keyNames,
     groupNameSet: groupNameSet,
     selectorNameWithIndex: selectorNameWithIndex,
-  }
+  };
 }
 
 /** nested cube `(key) -> aggregator -> (group)` for drill-down support */
@@ -720,98 +790,100 @@ export function getKAGCube(rows, keyColumns, groupColumns, aggrColumns) {
     key: keyColumns.length !== 0,
     group: groupColumns.length !== 0,
     aggregator: aggrColumns.length !== 0,
-  }
+  };
 
-  let cube = {}
+  let cube = {};
 
-  const keyColumnName = keyColumns.map(c => c.name).join('.')
-  const groupNameSet = new Set()
-  const keyNameSet = new Set()
-  const selectorNameWithIndex = {} /** { selectorName: index } */
-  let indexCounter = 0
+  const keyColumnName = keyColumns.map((c) => c.name).join('.');
+  const groupNameSet = new Set();
+  const keyNameSet = new Set();
+  const selectorNameWithIndex = {}; /** { selectorName: index } */
+  let indexCounter = 0;
 
   for (let i = 0; i < rows.length; i++) {
-    const row = rows[i]
-    let c = cube
+    const row = rows[i];
+    let c = cube;
 
     // key: add to entry
-    let mergedKeyName
+    let mergedKeyName;
     if (schema.key) {
-      mergedKeyName = keyColumns.map(c => row[c.index]).join('.')
+      mergedKeyName = keyColumns.map((c) => row[c.index]).join('.');
       // key: add to row
-      if (!c[mergedKeyName]) { c[mergedKeyName] = {} }
-      c = c[mergedKeyName]
+      if (!c[mergedKeyName]) {
+        c[mergedKeyName] = {};
+      }
+      c = c[mergedKeyName];
 
-      keyNameSet.add(mergedKeyName)
+      keyNameSet.add(mergedKeyName);
     }
 
-    let mergedGroupName
+    let mergedGroupName;
     if (schema.group) {
-      mergedGroupName = groupColumns.map(c => row[c.index]).join('.')
-      groupNameSet.add(mergedGroupName)
+      mergedGroupName = groupColumns.map((c) => row[c.index]).join('.');
+      groupNameSet.add(mergedGroupName);
     }
 
     for (let a = 0; a < aggrColumns.length; a++) {
-      const aggrColumn = aggrColumns[a]
-      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`
+      const aggrColumn = aggrColumns[a];
+      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`;
 
       // update groupNameSet
       if (!mergedGroupName) {
-        groupNameSet.add(aggrName) /** aggr column name will be used as group name if group is empty */
+        groupNameSet.add(aggrName); /** aggr column name will be used as group name if group is empty */
       }
 
       // update selectorNameWithIndex
-      const selector = getSelectorName(mergedKeyName, aggrColumns.length, aggrName)
+      const selector = getSelectorName(mergedKeyName, aggrColumns.length, aggrName);
       if (typeof selectorNameWithIndex[selector] === 'undefined' /** value might be 0 */) {
-        selectorNameWithIndex[selector] = indexCounter
-        indexCounter = indexCounter + 1
+        selectorNameWithIndex[selector] = indexCounter;
+        indexCounter = indexCounter + 1;
       }
 
       // add aggregatorName to row
       if (!c[aggrName]) {
-        const value = (aggrColumn.aggr !== 'count') ? row[aggrColumn.index] : 1
-        const count = 1
+        const value = (aggrColumn.aggr !== 'count') ? row[aggrColumn.index] : 1;
+        const count = 1;
 
-        c[aggrName] = { aggr: aggrColumn.aggr, value: value, count: count, children: {}, }
+        c[aggrName] = {aggr: aggrColumn.aggr, value: value, count: count, children: {}};
       } else {
         const value = AggregatorFunctions[aggrColumn.aggr](
-          c[aggrName].value, row[aggrColumn.index], c[aggrName].count + 1)
+          c[aggrName].value, row[aggrColumn.index], c[aggrName].count + 1);
         const count = (AggregatorFunctionDiv[aggrColumn.aggr])
-          ? c[aggrName].count + 1 : c[aggrName].count
+          ? c[aggrName].count + 1 : c[aggrName].count;
 
-        c[aggrName].value = value
-        c[aggrName].count = count
+        c[aggrName].value = value;
+        c[aggrName].count = count;
       }
 
       // add aggregated group (for drill-down) to row iff group is enabled
       if (mergedGroupName) {
         if (!c[aggrName].children[mergedGroupName]) {
-          const value = (aggrColumn.aggr !== 'count') ? row[aggrColumn.index] : 1
-          const count = 1
+          const value = (aggrColumn.aggr !== 'count') ? row[aggrColumn.index] : 1;
+          const count = 1;
 
-          c[aggrName].children[mergedGroupName] = { value: value, count: count, }
+          c[aggrName].children[mergedGroupName] = {value: value, count: count};
         } else {
-          const drillDownedValue = c[aggrName].children[mergedGroupName].value
-          const drillDownedCount = c[aggrName].children[mergedGroupName].count
+          const drillDownedValue = c[aggrName].children[mergedGroupName].value;
+          const drillDownedCount = c[aggrName].children[mergedGroupName].count;
           const value = AggregatorFunctions[aggrColumn.aggr](
-            drillDownedValue, row[aggrColumn.index], drillDownedCount + 1)
+            drillDownedValue, row[aggrColumn.index], drillDownedCount + 1);
           const count = (AggregatorFunctionDiv[aggrColumn.aggr])
-            ? drillDownedCount + 1 : drillDownedCount
+            ? drillDownedCount + 1 : drillDownedCount;
 
-          c[aggrName].children[mergedGroupName].value = value
-          c[aggrName].children[mergedGroupName].count = count
+          c[aggrName].children[mergedGroupName].value = value;
+          c[aggrName].children[mergedGroupName].count = count;
         }
       }
     } /** end loop for aggrColumns */
   }
 
-  let keyNames = null
+  let keyNames = null;
   if (!schema.key) {
-    const mergedGroupColumnName = groupColumns.map(c => c.name).join('.')
-    cube = { [mergedGroupColumnName]: cube, }
-    keyNames = [ mergedGroupColumnName, ]
+    const mergedGroupColumnName = groupColumns.map((c) => c.name).join('.');
+    cube = {[mergedGroupColumnName]: cube};
+    keyNames = [mergedGroupColumnName];
   } else {
-    keyNames = Object.keys(cube).sort() /** keys should be sorted */
+    keyNames = Object.keys(cube).sort(); /** keys should be sorted */
   }
 
   return {
@@ -821,7 +893,7 @@ export function getKAGCube(rows, keyColumns, groupColumns, aggrColumns) {
     keyNames: keyNames,
     groupNameSet: groupNameSet,
     selectorNameWithIndex: selectorNameWithIndex,
-  }
+  };
 }
 /** nested cube `(key1) -> (key2) -> (group) -> aggregator` */
 export function getKKGACube(rows, key1Columns, key2Columns, groupColumns, aggrColumns) {
@@ -830,82 +902,98 @@ export function getKKGACube(rows, key1Columns, key2Columns, groupColumns, aggrCo
     key2: key2Columns.length !== 0,
     group: groupColumns.length !== 0,
     aggregator: aggrColumns.length !== 0,
-  }
+  };
 
-  let cube = {}
-  const entry = {}
+  let cube = {};
+  const entry = {};
 
-  const key1ColumnName = key1Columns.map(c => c.name).join('.')
-  const key1NameSet = {}
-  const key2ColumnName = key2Columns.map(c => c.name).join('.')
-  const key2NameSet = {}
-  const groupNameSet = new Set()
-  const selectorNameWithIndex = {} /** { selectorName: index } */
-  let indexCounter = 0
+  const key1ColumnName = key1Columns.map((c) => c.name).join('.');
+  const key1NameSet = {};
+  const key2ColumnName = key2Columns.map((c) => c.name).join('.');
+  const key2NameSet = {};
+  const groupNameSet = new Set();
+  const selectorNameWithIndex = {}; /** { selectorName: index } */
+  let indexCounter = 0;
 
   for (let i = 0; i < rows.length; i++) {
-    const row = rows[i]
-    let e = entry
-    let c = cube
+    const row = rows[i];
+    let e = entry;
+    let c = cube;
 
     // key1: add to entry
-    let mergedKey1Name
+    let mergedKey1Name;
     if (schema.key1) {
-      mergedKey1Name = key1Columns.map(c => row[c.index]).join('.')
-      if (!e[mergedKey1Name]) { e[mergedKey1Name] = { children: {}, } }
-      e = e[mergedKey1Name].children
+      mergedKey1Name = key1Columns.map((c) => row[c.index]).join('.');
+      if (!e[mergedKey1Name]) {
+        e[mergedKey1Name] = {children: {}};
+      }
+      e = e[mergedKey1Name].children;
       // key1: add to row
-      if (!c[mergedKey1Name]) { c[mergedKey1Name] = {} }
-      c = c[mergedKey1Name]
+      if (!c[mergedKey1Name]) {
+        c[mergedKey1Name] = {};
+      }
+      c = c[mergedKey1Name];
 
-      if (!key1NameSet[mergedKey1Name]) { key1NameSet[mergedKey1Name] = true }
+      if (!key1NameSet[mergedKey1Name]) {
+        key1NameSet[mergedKey1Name] = true;
+      }
     }
 
     // key2: add to entry
-    let mergedKey2Name
+    let mergedKey2Name;
     if (schema.key2) {
-      mergedKey2Name = key2Columns.map(c => row[c.index]).join('.')
-      if (!e[mergedKey2Name]) { e[mergedKey2Name] = { children: {}, } }
-      e = e[mergedKey2Name].children
+      mergedKey2Name = key2Columns.map((c) => row[c.index]).join('.');
+      if (!e[mergedKey2Name]) {
+        e[mergedKey2Name] = {children: {}};
+      }
+      e = e[mergedKey2Name].children;
       // key2: add to row
-      if (!c[mergedKey2Name]) { c[mergedKey2Name] = {} }
-      c = c[mergedKey2Name]
+      if (!c[mergedKey2Name]) {
+        c[mergedKey2Name] = {};
+      }
+      c = c[mergedKey2Name];
 
-      if (!key2NameSet[mergedKey2Name]) { key2NameSet[mergedKey2Name] = true }
+      if (!key2NameSet[mergedKey2Name]) {
+        key2NameSet[mergedKey2Name] = true;
+      }
     }
 
-    let mergedGroupName
+    let mergedGroupName;
     if (schema.group) {
-      mergedGroupName = groupColumns.map(c => row[c.index]).join('.')
+      mergedGroupName = groupColumns.map((c) => row[c.index]).join('.');
 
       // add group to entry
-      if (!e[mergedGroupName]) { e[mergedGroupName] = { children: {}, } }
-      e = e[mergedGroupName].children
+      if (!e[mergedGroupName]) {
+        e[mergedGroupName] = {children: {}};
+      }
+      e = e[mergedGroupName].children;
       // add group to row
-      if (!c[mergedGroupName]) { c[mergedGroupName] = {} }
-      c = c[mergedGroupName]
-      groupNameSet.add(mergedGroupName)
+      if (!c[mergedGroupName]) {
+        c[mergedGroupName] = {};
+      }
+      c = c[mergedGroupName];
+      groupNameSet.add(mergedGroupName);
     }
 
     for (let a = 0; a < aggrColumns.length; a++) {
-      const aggrColumn = aggrColumns[a]
-      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`
+      const aggrColumn = aggrColumns[a];
+      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`;
 
       // update groupNameSet
       if (!mergedGroupName) {
-        groupNameSet.add(aggrName) /** aggr column name will be used as group name if group is empty */
+        groupNameSet.add(aggrName); /** aggr column name will be used as group name if group is empty */
       }
 
       // update selectorNameWithIndex
-      const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName)
+      const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName);
       if (typeof selectorNameWithIndex[selector] === 'undefined' /** value might be 0 */) {
-        selectorNameWithIndex[selector] = indexCounter
-        indexCounter = indexCounter + 1
+        selectorNameWithIndex[selector] = indexCounter;
+        indexCounter = indexCounter + 1;
       }
 
       // add aggregator to entry
       if (!e[aggrName]) {
-        e[aggrName] = { type: 'aggregator', order: aggrColumn, index: aggrColumn.index, }
+        e[aggrName] = {type: 'aggregator', order: aggrColumn, index: aggrColumn.index};
       }
 
       // add aggregatorName to row
@@ -914,21 +1002,21 @@ export function getKKGACube(rows, key1Columns, key2Columns, groupColumns, aggrCo
           aggr: aggrColumn.aggr,
           value: (aggrColumn.aggr !== 'count') ? row[aggrColumn.index] : 1,
           count: 1,
-        }
+        };
       } else {
         const value = AggregatorFunctions[aggrColumn.aggr](
-          c[aggrName].value, row[aggrColumn.index], c[aggrName].count + 1)
+          c[aggrName].value, row[aggrColumn.index], c[aggrName].count + 1);
         const count = (AggregatorFunctionDiv[aggrColumn.aggr])
-          ? c[aggrName].count + 1 : c[aggrName].count
+          ? c[aggrName].count + 1 : c[aggrName].count;
 
-        c[aggrName].value = value
-        c[aggrName].count = count
+        c[aggrName].value = value;
+        c[aggrName].count = count;
       }
     } /** end loop for aggrColumns */
   }
 
-  let key1Names = Object.keys(key1NameSet).sort() /** keys should be sorted */
-  let key2Names = Object.keys(key2NameSet).sort() /** keys should be sorted */
+  let key1Names = Object.keys(key1NameSet).sort(); /** keys should be sorted */
+  let key2Names = Object.keys(key2NameSet).sort(); /** keys should be sorted */
 
   return {
     cube: cube,
@@ -939,59 +1027,61 @@ export function getKKGACube(rows, key1Columns, key2Columns, groupColumns, aggrCo
     key2Names: key2Names,
     groupNameSet: groupNameSet,
     selectorNameWithIndex: selectorNameWithIndex,
-  }
+  };
 }
 
 export function getSelectorName(mergedGroupName, aggrColumnLength, aggrColumnName) {
   if (!mergedGroupName) {
-    return aggrColumnName
+    return aggrColumnName;
   } else {
     return (aggrColumnLength > 1)
-      ? `${mergedGroupName} / ${aggrColumnName}` : mergedGroupName
+      ? `${mergedGroupName} / ${aggrColumnName}` : mergedGroupName;
   }
 }
 
 export function getCubeValue(obj, aggregator, aggrColumnName) {
-  let value = null /** default is null */
+  let value = null; /** default is null */
   try {
     /** if AVG or COUNT, calculate it now, previously we can't because we were doing accumulation */
     if (aggregator === Aggregator.AVG) {
-      value = obj[aggrColumnName].value / obj[aggrColumnName].count
+      value = obj[aggrColumnName].value / obj[aggrColumnName].count;
     } else if (aggregator === Aggregator.COUNT) {
-      value = obj[aggrColumnName].value
+      value = obj[aggrColumnName].value;
     } else {
-      value = obj[aggrColumnName].value
+      value = obj[aggrColumnName].value;
     }
 
-    if (typeof value === 'undefined') { value = null }
+    if (typeof value === 'undefined') {
+      value = null;
+    }
   } catch (error) { /** iognore */ }
 
-  return value
+  return value;
 }
 
 export function getNameWithIndex(names) {
-  const nameWithIndex = {}
+  const nameWithIndex = {};
 
   for (let i = 0; i < names.length; i++) {
-    const name = names[i]
-    nameWithIndex[name] = i
+    const name = names[i];
+    nameWithIndex[name] = i;
   }
 
-  return nameWithIndex
+  return nameWithIndex;
 }
 
 export function getArrayRowsFromKKGACube(cube, schema, aggregatorColumns,
                                          key1Names, key2Names, groupNameSet, selectorNameWithIndex) {
-  const sortedSelectors = Object.keys(selectorNameWithIndex).sort()
-  const sortedSelectorNameWithIndex = getNameWithIndex(sortedSelectors)
+  const sortedSelectors = Object.keys(selectorNameWithIndex).sort();
+  const sortedSelectorNameWithIndex = getNameWithIndex(sortedSelectors);
 
-  const selectorRows = new Array(sortedSelectors.length)
-  const key1NameWithIndex = getNameWithIndex(key1Names)
-  const key2NameWithIndex = getNameWithIndex(key2Names)
+  const selectorRows = new Array(sortedSelectors.length);
+  const key1NameWithIndex = getNameWithIndex(key1Names);
+  const key2NameWithIndex = getNameWithIndex(key2Names);
 
   fillSelectorRows(schema, cube, selectorRows,
     aggregatorColumns, sortedSelectorNameWithIndex,
-    key1Names, key2Names, key1NameWithIndex, key2NameWithIndex)
+    key1Names, key2Names, key1NameWithIndex, key2NameWithIndex);
 
   return {
     key1NameWithIndex: key1NameWithIndex,
@@ -999,7 +1089,7 @@ export function getArrayRowsFromKKGACube(cube, schema, aggregatorColumns,
     transformed: selectorRows,
     groupNames: Array.from(groupNameSet).sort(),
     sortedSelectors: sortedSelectors,
-  }
+  };
 }
 
 /** truly mutable style func. will return nothing */
@@ -1009,90 +1099,94 @@ export function fillSelectorRows(schema, cube, selectorRows,
   function fill(grouped, mergedGroupName, key1Name, key2Name) {
     // should iterate aggrColumns in the most nested loop to utilize memory locality
     for (let aggrColumn of aggrColumns) {
-      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`
-      const value = getCubeValue(grouped, aggrColumn.aggr, aggrName)
-      const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName)
-      const selectorIndex = selectorNameWithIndex[selector]
+      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`;
+      const value = getCubeValue(grouped, aggrColumn.aggr, aggrName);
+      const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName);
+      const selectorIndex = selectorNameWithIndex[selector];
 
       if (typeof selectorRows[selectorIndex] === 'undefined') {
-        selectorRows[selectorIndex] = { selector: selector, value: [], }
+        selectorRows[selectorIndex] = {selector: selector, value: []};
       }
 
-      const row = { aggregated: value, }
+      const row = {aggregated: value};
 
-      if (typeof key1Name !== 'undefined') { row.key1 = key1Name }
-      if (typeof key2Name !== 'undefined') { row.key2 = key2Name }
+      if (typeof key1Name !== 'undefined') {
+        row.key1 = key1Name;
+      }
+      if (typeof key2Name !== 'undefined') {
+        row.key2 = key2Name;
+      }
 
-      selectorRows[selectorIndex].value.push(row)
+      selectorRows[selectorIndex].value.push(row);
     }
   }
 
   function iterateGroupNames(keyed, key1Name, key2Name) {
     if (!schema.group) {
-      fill(keyed, undefined, key1Name, key2Name)
+      fill(keyed, undefined, key1Name, key2Name);
     } else {
       // assuming sparse distribution (usual case)
       // otherwise we need to iterate using `groupNameSet`
-      const availableGroupNames = Object.keys(keyed)
+      const availableGroupNames = Object.keys(keyed);
 
       for (let groupName of availableGroupNames) {
-        const grouped = keyed[groupName]
-        fill(grouped, groupName, key1Name, key2Name)
+        const grouped = keyed[groupName];
+        fill(grouped, groupName, key1Name, key2Name);
       }
     }
   }
 
   if (schema.key1 && schema.key2) {
     for (let key1Name of key1Names) {
-      const key1ed = cube[key1Name]
+      const key1ed = cube[key1Name];
 
       // assuming sparse distribution (usual case)
       // otherwise we need to iterate using `key2Names`
-      const availableKey2Names = Object.keys(key1ed)
+      const availableKey2Names = Object.keys(key1ed);
 
       for (let key2Name of availableKey2Names) {
-        const keyed = key1ed[key2Name]
-        iterateGroupNames(keyed, key1Name, key2Name)
+        const keyed = key1ed[key2Name];
+        iterateGroupNames(keyed, key1Name, key2Name);
       }
     }
   } else if (schema.key1 && !schema.key2) {
     for (let key1Name of key1Names) {
-      const keyed = cube[key1Name]
-      iterateGroupNames(keyed, key1Name, undefined)
+      const keyed = cube[key1Name];
+      iterateGroupNames(keyed, key1Name, undefined);
     }
   } else if (!schema.key1 && schema.key2) {
     for (let key2Name of key2Names) {
-      const keyed = cube[key2Name]
-      iterateGroupNames(keyed, undefined, key2Name)
+      const keyed = cube[key2Name];
+      iterateGroupNames(keyed, undefined, key2Name);
     }
   } else {
-    iterateGroupNames(cube, undefined, undefined)
+    iterateGroupNames(cube, undefined, undefined);
   }
 }
 
 export function getArrayRowsFromKGACube(cube, schema, aggregatorColumns,
                                         keyColumnName, keyNames, groupNameSet,
                                         selectorNameWithIndex) {
-  const sortedSelectors = Object.keys(selectorNameWithIndex).sort()
-  const sortedSelectorNameWithIndex = getNameWithIndex(sortedSelectors)
+  const sortedSelectors = Object.keys(selectorNameWithIndex).sort();
+  const sortedSelectorNameWithIndex = getNameWithIndex(sortedSelectors);
 
-  const keyArrowRows = new Array(sortedSelectors.length)
-  const keyNameWithIndex = getNameWithIndex(keyNames)
+  const keyArrowRows = new Array(sortedSelectors.length);
+  const keyNameWithIndex = getNameWithIndex(keyNames);
 
   for (let i = 0; i < keyNames.length; i++) {
-    const key = keyNames[i]
+    const key = keyNames[i];
 
-    const obj = cube[key]
+    const obj = cube[key];
     fillArrayRow(schema, aggregatorColumns, obj,
       groupNameSet, sortedSelectorNameWithIndex,
-      key, keyNames, keyArrowRows, keyNameWithIndex)
+      key, keyNames, keyArrowRows, keyNameWithIndex);
   }
 
   return {
     transformed: keyArrowRows,
     groupNames: Array.from(groupNameSet).sort(),
     sortedSelectors: sortedSelectors,
-  }
+  };
 }
 
 /** truly mutable style func. will return nothing, just modify `keyArrayRows` */
@@ -1100,34 +1194,34 @@ export function fillArrayRow(schema, aggrColumns, obj,
                              groupNameSet, selectorNameWithIndex,
                              keyName, keyNames, keyArrayRows, keyNameWithIndex) {
   function fill(target, mergedGroupName, aggr, aggrName) {
-    const value = getCubeValue(target, aggr, aggrName)
-    const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName)
-    const selectorIndex = selectorNameWithIndex[selector]
-    const keyIndex = keyNameWithIndex[keyName]
+    const value = getCubeValue(target, aggr, aggrName);
+    const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName);
+    const selectorIndex = selectorNameWithIndex[selector];
+    const keyIndex = keyNameWithIndex[keyName];
 
     if (typeof keyArrayRows[selectorIndex] === 'undefined') {
       keyArrayRows[selectorIndex] = {
-        selector: selector, value: new Array(keyNames.length)
-      }
+        selector: selector, value: new Array(keyNames.length),
+      };
     }
-    keyArrayRows[selectorIndex].value[keyIndex] = value
+    keyArrayRows[selectorIndex].value[keyIndex] = value;
   }
 
   /** when group is empty */
   if (!schema.group) {
     for (let i = 0; i < aggrColumns.length; i++) {
-      const aggrColumn = aggrColumns[i]
-      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`
-      fill(obj, undefined, aggrColumn.aggr, aggrName)
+      const aggrColumn = aggrColumns[i];
+      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`;
+      fill(obj, undefined, aggrColumn.aggr, aggrName);
     }
   } else {
     for (let i = 0; i < aggrColumns.length; i++) {
-      const aggrColumn = aggrColumns[i]
-      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`
+      const aggrColumn = aggrColumns[i];
+      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`;
 
       for (let groupName of groupNameSet) {
-        const grouped = obj[groupName]
-        fill(grouped, groupName, aggrColumn.aggr, aggrName)
+        const grouped = obj[groupName];
+        fill(grouped, groupName, aggrColumn.aggr, aggrName);
       }
     }
   }
@@ -1137,81 +1231,83 @@ export function getObjectRowsFromKGACube(cube, schema, aggregatorColumns,
                                          keyColumnName, keyNames, groupNameSet,
                                          selectorNameWithIndex) {
   const rows = keyNames.reduce((acc, key) => {
-    const obj = cube[key]
-    const row = getObjectRow(schema, aggregatorColumns, obj, groupNameSet)
+    const obj = cube[key];
+    const row = getObjectRow(schema, aggregatorColumns, obj, groupNameSet);
 
-    if (schema.key) { row[keyColumnName] = key }
-    acc.push(row)
+    if (schema.key) {
+      row[keyColumnName] = key;
+    }
+    acc.push(row);
 
-    return acc
-  }, [])
+    return acc;
+  }, []);
 
   return {
     transformed: rows,
     sortedSelectors: Object.keys(selectorNameWithIndex).sort(),
     groupNames: Array.from(groupNameSet).sort(),
-  }
+  };
 }
 
 export function getObjectRow(schema, aggrColumns, obj, groupNameSet) {
-  const row = {}
+  const row = {};
 
   function fill(row, target, mergedGroupName, aggr, aggrName) {
-    const value = getCubeValue(target, aggr, aggrName)
-    const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName)
-    row[selector] = value
+    const value = getCubeValue(target, aggr, aggrName);
+    const selector = getSelectorName(mergedGroupName, aggrColumns.length, aggrName);
+    row[selector] = value;
   }
 
   /** when group is empty */
   if (!schema.group) {
     for (let i = 0; i < aggrColumns.length; i++) {
-      const aggrColumn = aggrColumns[i]
-      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`
+      const aggrColumn = aggrColumns[i];
+      const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`;
 
-      fill(row, obj, undefined, aggrColumn.aggr, aggrName)
+      fill(row, obj, undefined, aggrColumn.aggr, aggrName);
     }
 
-    return row
+    return row;
   }
 
   /** when group is specified */
   for (let i = 0; i < aggrColumns.length; i++) {
-    const aggrColumn = aggrColumns[i]
-    const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`
+    const aggrColumn = aggrColumns[i];
+    const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`;
 
     for (let groupName of groupNameSet) {
-      const grouped = obj[groupName]
+      const grouped = obj[groupName];
 
       if (grouped) {
-        fill(row, grouped, groupName, aggrColumn.aggr, aggrName)
+        fill(row, grouped, groupName, aggrColumn.aggr, aggrName);
       }
     }
   }
 
-  return row
+  return row;
 }
 
 export function getDrilldownRowsFromKAGCube(cube, schema, aggregatorColumns,
                                             keyColumnName, keyNames, groupNameSet, selectorNameWithIndex) {
-  const sortedSelectors = Object.keys(selectorNameWithIndex).sort()
-  const sortedSelectorNameWithIndex = getNameWithIndex(sortedSelectors)
+  const sortedSelectors = Object.keys(selectorNameWithIndex).sort();
+  const sortedSelectorNameWithIndex = getNameWithIndex(sortedSelectors);
 
-  const rows = new Array(sortedSelectors.length)
+  const rows = new Array(sortedSelectors.length);
 
-  const groupNames = Array.from(groupNameSet).sort()
+  const groupNames = Array.from(groupNameSet).sort();
 
-  keyNames.map(key => {
-    const obj = cube[key]
+  keyNames.map((key) => {
+    const obj = cube[key];
     fillDrillDownRow(schema, obj, rows, key,
-      sortedSelectorNameWithIndex, aggregatorColumns, groupNames)
-  })
+      sortedSelectorNameWithIndex, aggregatorColumns, groupNames);
+  });
 
   return {
     transformed: rows,
     groupNames: groupNames,
     sortedSelectors: sortedSelectors,
     sortedSelectorNameWithIndex: sortedSelectorNameWithIndex,
-  }
+  };
 }
 
 /** truly mutable style func. will return nothing, just modify `rows` */
@@ -1219,27 +1315,27 @@ export function fillDrillDownRow(schema, obj, rows, key,
                                  selectorNameWithIndex, aggrColumns, groupNames) {
   /** when group is empty */
   for (let i = 0; i < aggrColumns.length; i++) {
-    const row = {}
-    const aggrColumn = aggrColumns[i]
-    const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`
+    const row = {};
+    const aggrColumn = aggrColumns[i];
+    const aggrName = `${aggrColumn.name}(${aggrColumn.aggr})`;
 
-    const value = getCubeValue(obj, aggrColumn.aggr, aggrName)
-    const selector = getSelectorName((schema.key) ? key : undefined, aggrColumns.length, aggrName)
+    const value = getCubeValue(obj, aggrColumn.aggr, aggrName);
+    const selector = getSelectorName((schema.key) ? key : undefined, aggrColumns.length, aggrName);
 
-    const selectorIndex = selectorNameWithIndex[selector]
-    row.value = value
-    row.drillDown = []
-    row.selector = selector
+    const selectorIndex = selectorNameWithIndex[selector];
+    row.value = value;
+    row.drillDown = [];
+    row.selector = selector;
 
     if (schema.group) {
-      row.drillDown = []
+      row.drillDown = [];
 
       for (let groupName of groupNames) {
-        const value = getCubeValue(obj[aggrName].children, aggrColumn.aggr, groupName)
-        row.drillDown.push({ group: groupName, value: value, })
+        const value = getCubeValue(obj[aggrName].children, aggrColumn.aggr, groupName);
+        row.drillDown.push({group: groupName, value: value});
       }
     }
 
-    rows[selectorIndex] = row
+    rows[selectorIndex] = row;
   }
 }