You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2017/02/09 09:23:09 UTC

ambari git commit: AMBARI-19921. Js errors appear when user try to delete widgets from dashboard (onechiporenko)

Repository: ambari
Updated Branches:
  refs/heads/trunk 7c3bcc9e8 -> bb7ed8952


AMBARI-19921. Js errors appear when user try to delete widgets from dashboard (onechiporenko)


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

Branch: refs/heads/trunk
Commit: bb7ed895212845201cbc1a159a10b6395f48bf51
Parents: 7c3bcc9
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Wed Feb 8 14:13:38 2017 +0200
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Thu Feb 9 11:22:45 2017 +0200

----------------------------------------------------------------------
 .../app/templates/main/dashboard/widgets.hbs    |  10 +-
 ambari-web/app/views/main/dashboard/widget.js   |  11 +-
 ambari-web/app/views/main/dashboard/widgets.js  | 116 ++++++++-----
 .../test/views/main/dashboard/widget_test.js    |  21 +--
 .../test/views/main/dashboard/widgets_test.js   | 161 +++++++++++++++----
 5 files changed, 221 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/bb7ed895/ambari-web/app/templates/main/dashboard/widgets.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/dashboard/widgets.hbs b/ambari-web/app/templates/main/dashboard/widgets.hbs
index 8e04f1c..4b7a269 100644
--- a/ambari-web/app/templates/main/dashboard/widgets.hbs
+++ b/ambari-web/app/templates/main/dashboard/widgets.hbs
@@ -47,11 +47,11 @@
   <div class="dashboard-widgets-box">
     <div id="dashboard-widgets"  class="widgets-container">
       <div class="thumbnails" id="sortable">
-        {{#if view.visibleWidgets.length}}
-          {{#each widget in view.visibleWidgets}}
-             {{view widget.viewClass widgetBinding="widget"}}
-          {{/each}}
-        {{/if}}
+        {{#each widget in view.allWidgets}}
+          {{#if widget.isVisible}}
+            {{view widget.viewClass widgetBinding="widget"}}
+          {{/if}}
+        {{/each}}
       </div>
     </div>
   </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/bb7ed895/ambari-web/app/views/main/dashboard/widget.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/widget.js b/ambari-web/app/views/main/dashboard/widget.js
index cacac1a..e7a626c 100644
--- a/ambari-web/app/views/main/dashboard/widget.js
+++ b/ambari-web/app/views/main/dashboard/widget.js
@@ -186,16 +186,7 @@ App.DashboardWidgetView = Em.View.extend({
    * delete widget
    */
   deleteWidget: function () {
-    var parent = this.get('parentView');
-    var userPreferences = parent.get('userPreferences');
-    var deletedId = this.get('id');
-    var newValue = {
-      visible: userPreferences.visible.slice(0).without(deletedId),
-      hidden: userPreferences.hidden.concat([deletedId]),
-      threshold: userPreferences.threshold
-    };
-    parent.saveWidgetsSettings(newValue);
-    parent.renderWidgets();
+    this.get('parentView').hideWidget(this.get('id'));
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/bb7ed895/ambari-web/app/views/main/dashboard/widgets.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/widgets.js b/ambari-web/app/views/main/dashboard/widgets.js
index 0c6b7aa..572625d 100644
--- a/ambari-web/app/views/main/dashboard/widgets.js
+++ b/ambari-web/app/views/main/dashboard/widgets.js
@@ -17,7 +17,16 @@
  */
 
 var App = require('app');
-var filters = require('views/common/filter_view');
+
+const WidgetObject = Em.Object.extend({
+  id: '',
+  threshold: '',
+  viewClass: null,
+  sourceName: '',
+  title: '',
+  checked: false,
+  isVisible: true
+});
 
 App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, App.TimeRangeMixin, {
   name: 'mainDashboardWidgetsView',
@@ -202,6 +211,10 @@ App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, Ap
     }
   ],
 
+  widgetsDefinitionMap: function () {
+    return this.get('widgetsDefinition').toMapByProperty('id');
+  }.property('widgetsDefinition.[]'),
+
   /**
    * List of services
    * @type {Ember.Enumerable}
@@ -226,16 +239,23 @@ App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, Ap
   isMoving: false,
 
   /**
+   * @type {WidgetObject[]}
+   */
+  allWidgets: [],
+
+  /**
    * List of visible widgets
-   * @type {Ember.Enumerable}
+   *
+   * @type {WidgetObject[]}
    */
-  visibleWidgets: [],
+  visibleWidgets: Em.computed.filterBy('allWidgets', 'isVisible', true),
 
   /**
    * List of hidden widgets
-   * @type {Ember.Enumerable}
+   *
+   * @type {WidgetObject[]}
    */
-  hiddenWidgets: [], // widget child view will push object in this array if deleted
+  hiddenWidgets: Em.computed.filterBy('allWidgets', 'isVisible', false),
 
   timeRangeClassName: 'pull-left',
 
@@ -276,12 +296,30 @@ App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, Ap
 
   /**
    * make POST call to save settings
-   * @param {object} settings
+   * format settings if they are not provided
+   *
+   * @param {object} [settings]
    */
   saveWidgetsSettings: function (settings) {
-    this.set('userPreferences', settings);
-    this.setDBProperty(this.get('persistKey'), settings);
-    this.postUserPref(this.get('persistKey'), settings);
+    let userPreferences = this.get('userPreferences');
+    let newSettings = {
+      visible: [],
+      hidden: [],
+      threshold: {}
+    };
+    if (arguments.length === 1) {
+      newSettings = settings;
+    }
+    else {
+      newSettings.threshold = userPreferences.threshold;
+      this.get('allWidgets').forEach(widget => {
+        let key = widget.get('isVisible') ? 'visible' : 'hidden';
+        newSettings[key].push(widget.get('id'));
+      });
+    }
+    this.set('userPreferences', newSettings);
+    this.setDBProperty(this.get('persistKey'), newSettings);
+    this.postUserPref(this.get('persistKey'), newSettings);
   },
 
   getUserPrefSuccessCallback: function (response) {
@@ -301,7 +339,7 @@ App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, Ap
     var clusterEnv = App.router.get('clusterController.clusterEnv').properties;
     var yarnMemoryWidget = widgetsDefinition.findProperty('id', 20);
 
-    if (clusterEnv['hide_yarn_memory_widget'] === 'true') {
+    if (clusterEnv.hide_yarn_memory_widget === 'true') {
       yarnMemoryWidget.isHiddenByDefault = true;
     }
   },
@@ -331,36 +369,42 @@ App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, Ap
   },
 
   /**
-   * set widgets to view in order to render
+   * Don't show widget on the Dashboard
+   *
+   * @param {number} id
    */
-  renderWidgets: function () {
-    var widgetsDefinitionMap = this.get('widgetsDefinition').toMapByProperty('id');
-    var userPreferences = this.get('userPreferences');
-    var visibleWidgets = [];
-    var hiddenWidgets = [];
-
-    userPreferences.visible.forEach(function(id) {
-      var widget = widgetsDefinitionMap[id];
-      visibleWidgets.push(Em.Object.create({
-        id: id,
-        threshold: userPreferences.threshold[id],
-        viewClass: App[widget.viewName],
-        sourceName: widget.sourceName,
-        title: widget.title
-      }));
-    });
+  hideWidget(id) {
+    this.get('allWidgets').findProperty('id', id).set('isVisible', false);
+    this.saveWidgetsSettings();
+  },
 
-    userPreferences.hidden.forEach(function(id) {
-      var widget = widgetsDefinitionMap[id];
-      hiddenWidgets.push(Em.Object.create({
-        id: id,
-        title: widget.title,
-        checked: false
-      }));
+  /**
+   *
+   * @param {number} id
+   * @param {boolean} isVisible
+   * @returns {WidgetObject}
+   * @private
+   */
+  _createWidgetObj(id, isVisible) {
+    var widget = this.get('widgetsDefinitionMap')[id];
+    return WidgetObject.create({
+      id,
+      threshold: this.get('userPreferences.threshold')[id],
+      viewClass: App[widget.viewName],
+      sourceName: widget.sourceName,
+      title: widget.title,
+      isVisible
     });
+  },
 
-    this.set('visibleWidgets', visibleWidgets);
-    this.set('hiddenWidgets', hiddenWidgets);
+  /**
+   * set widgets to view in order to render
+   */
+  renderWidgets: function () {
+    var userPreferences = this.get('userPreferences');
+    var newVisibleWidgets = userPreferences.visible.map(id => this._createWidgetObj(id, true));
+    var newHiddenWidgets = userPreferences.hidden.map(id => this._createWidgetObj(id, false));
+    this.set('allWidgets', newVisibleWidgets.concat(newHiddenWidgets));
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/bb7ed895/ambari-web/test/views/main/dashboard/widget_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/dashboard/widget_test.js b/ambari-web/test/views/main/dashboard/widget_test.js
index 8582ad0..a504c6d 100644
--- a/ambari-web/test/views/main/dashboard/widget_test.js
+++ b/ambari-web/test/views/main/dashboard/widget_test.js
@@ -19,6 +19,7 @@
 var App = require('app');
 require('views/main/dashboard/widget');
 
+var dashboard = App.MainDashboardWidgetsView.create();
 describe('App.DashboardWidgetView', function () {
 
   var view;
@@ -28,7 +29,10 @@ describe('App.DashboardWidgetView', function () {
       widget: Em.Object.create(),
       parentView: Em.Object.create({
         userPreferences: {},
-        saveWidgetsSettings: Em.K,
+        setDBProperty: Em.K,
+        postUserPref: Em.K,
+        hideWidget: dashboard.hideWidget,
+        saveWidgetsSettings: dashboard.saveWidgetsSettings,
         renderWidgets: Em.K
       })
     });
@@ -223,8 +227,7 @@ describe('App.DashboardWidgetView', function () {
   describe('#deleteWidget()', function() {
 
     beforeEach(function() {
-      sinon.stub(view.get('parentView'), 'saveWidgetsSettings');
-      sinon.stub(view.get('parentView'), 'renderWidgets');
+      view.get('parentView').set('allWidgets', [Em.Object.create({id: 1, isVisible: true})]);
       view.set('widget.id', 1);
       view.set('parentView.userPreferences', {
         visible: [1],
@@ -234,22 +237,14 @@ describe('App.DashboardWidgetView', function () {
       view.deleteWidget();
     });
 
-    afterEach(function() {
-      view.get('parentView').saveWidgetsSettings.restore();
-      view.get('parentView').renderWidgets.restore();
-    });
-
-    it('saveWidgetsSettings should be called', function() {
-      expect(view.get('parentView').saveWidgetsSettings.getCall(0).args[0]).to.be.eql({
+    it('userPreferences are set correctly', function() {
+      expect(view.get('parentView.userPreferences')).to.be.eql({
         visible: [],
         hidden: [1],
         threshold: []
       });
     });
 
-    it('renderWidgets should be called', function() {
-      expect(view.get('parentView').renderWidgets).to.be.calledOnce;
-    });
   });
 
   describe('#editWidget()', function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/bb7ed895/ambari-web/test/views/main/dashboard/widgets_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/dashboard/widgets_test.js b/ambari-web/test/views/main/dashboard/widgets_test.js
index b2d154b..5d1ddb2 100644
--- a/ambari-web/test/views/main/dashboard/widgets_test.js
+++ b/ambari-web/test/views/main/dashboard/widgets_test.js
@@ -90,10 +90,12 @@ describe('App.MainDashboardWidgetsView', function () {
 
   describe('#saveWidgetsSettings()', function() {
 
-    beforeEach(function() {
-      sinon.stub(view, 'setDBProperty');
-      sinon.stub(view, 'postUserPref');
-      view.saveWidgetsSettings({settings:{}});
+    var userPreferences = {visible: [], hidden: [], threshold: {}};
+
+    beforeEach(function () {
+      sinon.stub(view, 'setDBProperty', Em.K);
+      sinon.stub(view, 'postUserPref', Em.K);
+      view.set('userPreferences', userPreferences);
     });
 
     afterEach(function() {
@@ -101,17 +103,61 @@ describe('App.MainDashboardWidgetsView', function () {
       view.postUserPref.restore();
     });
 
-    it('setDBProperty should be called', function() {
-      expect(view.setDBProperty.calledWith('key', {settings:{}})).to.be.true;
-    });
+    describe('called with arg', function () {
+
+      beforeEach(function() {
+        view.saveWidgetsSettings({settings:{}});
+      });
+
+      it('setDBProperty should be called', function() {
+        expect(view.setDBProperty.calledWith('key', {settings:{}})).to.be.true;
+      });
+
+      it('postUserPref should be called', function() {
+        expect(view.postUserPref.calledWith('key', {settings:{}})).to.be.true;
+      });
+
+      it('userPreferences should be set', function() {
+        expect(view.get('userPreferences')).to.be.eql({settings:{}});
+      });
 
-    it('postUserPref should be called', function() {
-      expect(view.postUserPref.calledWith('key', {settings:{}})).to.be.true;
     });
 
-    it('userPreferences should be set', function() {
-      expect(view.get('userPreferences')).to.be.eql({settings:{}});
+    describe('called without args', function () {
+
+      var allWidgets = [
+        Em.Object.create({id: 1, isVisible: true}),
+        Em.Object.create({id: 2, isVisible: true}),
+        Em.Object.create({id: 3, isVisible: false}),
+        Em.Object.create({id: 4, isVisible: false})
+      ];
+
+      var expectedUserSettings = {
+        visible: [1, 2],
+        hidden: [3, 4],
+        threshold: {}
+      };
+
+      beforeEach(function () {
+        view.set('userPreferences', userPreferences);
+        view.set('allWidgets', allWidgets);
+        view.saveWidgetsSettings();
+      });
+
+      it('setDBProperty should be called', function() {
+        expect(view.setDBProperty.calledWith('key', expectedUserSettings)).to.be.true;
+      });
+
+      it('postUserPref should be called', function() {
+        expect(view.postUserPref.calledWith('key', expectedUserSettings)).to.be.true;
+      });
+
+      it('userPreferences should be set', function() {
+        expect(view.get('userPreferences')).to.be.eql(expectedUserSettings);
+      });
+
     });
+
   });
 
   describe('#getUserPrefSuccessCallback()', function() {
@@ -210,30 +256,77 @@ describe('App.MainDashboardWidgetsView', function () {
 
   describe('#renderWidgets()', function() {
 
-    it('should set visibleWidgets and hiddenWidgets', function() {
-      view.set('userPreferences', {
-        visible: [1],
-        hidden: [2],
-        threshold: {
-          1: [],
-          2: [1,2]
-        }
+    describe('should set visibleWidgets and hiddenWidgets', function() {
+
+      beforeEach(function () {
+        view.set('userPreferences', {
+          visible: [1],
+          hidden: [2],
+          threshold: {
+            1: [],
+            2: [1,2]
+          }
+        });
+        view.renderWidgets();
+      });
+
+      describe('visibleWidgets', function () {
+        var widget;
+
+        beforeEach(function () {
+          widget = view.get('visibleWidgets')[0];
+        });
+
+        it('one visible widget', function () {
+          expect(view.get('visibleWidgets.length')).to.be.equal(1);
+        });
+
+        it('id', function () {
+          expect(widget.get('id')).to.be.equal(1);
+        });
+
+        it('threshold', function () {
+          expect(widget.get('threshold')).to.be.eql([]);
+        });
+
+        it('viewClass', function () {
+          expect(widget.get('viewClass')).to.be.eql(App.NameNodeHeapPieChartView);
+        });
+
+        it('sourceName', function () {
+          expect(widget.get('sourceName')).to.be.equal('HDFS');
+        });
+
+        it('title', function () {
+          expect(widget.get('title')).to.be.equal(Em.I18n.t('dashboard.widgets.NameNodeHeap'));
+        });
+
+      });
+
+      describe('hiddenWidgets', function () {
+        var widget;
+
+        beforeEach(function () {
+          widget = view.get('hiddenWidgets')[0];
+        });
+
+        it('one hidden widget', function () {
+          expect(view.get('hiddenWidgets.length')).to.be.equal(1);
+        });
+
+        it('id', function () {
+          expect(widget.get('id')).to.be.equal(2);
+        });
+
+        it('checked', function () {
+          expect(widget.get('checked')).to.be.equal(false);
+        });
+
+        it('title', function () {
+          expect(widget.get('title')).to.be.equal(Em.I18n.t('dashboard.widgets.HDFSDiskUsage'));
+        });
+
       });
-      view.renderWidgets();
-      expect(view.get('visibleWidgets')).to.be.eql([Em.Object.create({
-        id: 1,
-        threshold: [],
-        viewClass: App.NameNodeHeapPieChartView,
-        sourceName: 'HDFS',
-        title: Em.I18n.t('dashboard.widgets.NameNodeHeap')
-      })]);
-      expect(view.get('hiddenWidgets')).to.be.eql([
-        Em.Object.create({
-          id: 2,
-          title: Em.I18n.t('dashboard.widgets.HDFSDiskUsage'),
-          checked: false
-        })
-      ]);
     });
   });