Repository: ambari Updated Branches: refs/heads/trunk 2414fec43 -> 7cea66b6e
AMBARI-8107Configs: not prompted when changes are not saved when clicking on scv. (atkach) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7cea66b6 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7cea66b6 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7cea66b6 Branch: refs/heads/trunk Commit: 7cea66b6e0d9f45a86f69757d57e7922c15988ed Parents: 2414fec Author: atkach <[email protected]> Authored: Sun Nov 2 20:52:52 2014 +0200 Committer: atkach <[email protected]> Committed: Sun Nov 2 20:52:52 2014 +0200 ---------------------------------------------------------------------- .../controllers/main/service/info/configs.js | 24 ++++++++-- .../common/configs/config_history_flow.hbs | 12 ++--- .../common/configs/service_version_box.hbs | 8 ++-- .../views/common/configs/config_history_flow.js | 44 ++++++++++++++++-- .../main/service/info/config_test.js | 49 ++++++++------------ 5 files changed, 87 insertions(+), 50 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/7cea66b6/ambari-web/app/controllers/main/service/info/configs.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/service/info/configs.js b/ambari-web/app/controllers/main/service/info/configs.js index ec1c086..f72fd66 100644 --- a/ambari-web/app/controllers/main/service/info/configs.js +++ b/ambari-web/app/controllers/main/service/info/configs.js @@ -2627,12 +2627,26 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM * @method selectConfigGroup */ selectConfigGroup: function (event) { + var self = this; + + function callback() { + self.doSelectConfigGroup(event); + } + if (!this.get('isInit')) { if (this.hasUnsavedChanges()) { - this.showSavePopup(null, event); + this.showSavePopup(null, callback); return; } } + callback(); + }, + /** + * switch view to selected group + * @param event + * @method selectConfigGroup + */ + doSelectConfigGroup: function (event) { //clean when switch config group this.loadedGroupToOverrideSiteToTagMap = {}; var configGroupVersions = App.ServiceConfigVersion.find().filterProperty('groupId', event.context.get('id')); @@ -2655,10 +2669,10 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM /** * If some configs are changed and user navigates away or select another config-group, show this popup with propose to save changes * @param {String} path - * @param {object} event - triggered event for selecting another config-group + * @param {object} callback - callback with action to change configs view(change group or version) * @method showSavePopup */ - showSavePopup: function (path, event) { + showSavePopup: function (path, callback) { var self = this; return App.ModalPopup.show({ header: Em.I18n.t('common.warning'), @@ -2687,10 +2701,10 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM if (path) { self.set('forceTransition', true); App.router.route(path); - } else if (event) { + } else if (callback) { // Prevent multiple popups self.set('hash', self.getHash()); - self.selectConfigGroup(event); + callback(); } this.hide(); }, http://git-wip-us.apache.org/repos/asf/ambari/blob/7cea66b6/ambari-web/app/templates/common/configs/config_history_flow.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/common/configs/config_history_flow.hbs b/ambari-web/app/templates/common/configs/config_history_flow.hbs index 68d6b11..def5820 100644 --- a/ambari-web/app/templates/common/configs/config_history_flow.hbs +++ b/ambari-web/app/templates/common/configs/config_history_flow.hbs @@ -48,7 +48,7 @@ <strong>{{view.compareServiceVersion.createdDate}}</strong> </div> <div class="pull-right operations-button"> - <button class="btn btn-success" {{action revert view.serviceVersionsReferences.compare target="view"}} {{bindAttr disabled="view.versionActionsDisabled" class="view.compareServiceVersion.isCurrent:hidden"}}>{{view.compareServiceVersion.makeCurrentButtonText}}</button> + <button class="btn btn-success" {{action doAction view.serviceVersionsReferences.compare view.actionTypes.REVERT target="view"}} {{bindAttr disabled="view.versionActionsDisabled" class="view.compareServiceVersion.isCurrent:hidden"}}>{{view.compareServiceVersion.makeCurrentButtonText}}</button> </div> </div> </div> @@ -63,7 +63,7 @@ <ul class="dropdown-menu"> {{#each serviceVersion in view.dropDownList}} <li {{bindAttr class=":pointer :dropdown-submenu serviceVersion.isDisplayed:not-allowed"}}> - <div class="row-fluid version-in-dropdown " {{action switchVersion serviceVersion target="view"}}> + <div class="row-fluid version-in-dropdown " {{action doAction serviceVersion view.actionTypes.SWITCH target="view"}}> <div class="span2">{{serviceVersion.versionText}}</div> <div class="span6">{{serviceVersion.createdDate}}</div> <div class="span3">{{serviceVersion.author}}</div> @@ -77,10 +77,10 @@ <div class="notes">{{{serviceVersion.fullNotes}}}</div> </div> <div class="version-operations-buttons"> - <button {{bindAttr disabled="serviceVersion.disabledActionAttr.view" class=":btn serviceVersion.isDisplayed:not-allowed-cursor" title="serviceVersion.disabledActionMessages.view"}} {{action switchVersion serviceVersion target="view"}}><i class="icon-search"></i> {{t common.view}}</button> + <button {{bindAttr disabled="serviceVersion.disabledActionAttr.view" class=":btn serviceVersion.isDisplayed:not-allowed-cursor" title="serviceVersion.disabledActionMessages.view"}} {{action doAction serviceVersion view.actionTypes.SWITCH target="view"}}><i class="icon-search"></i> {{t common.view}}</button> {{#if App.isManager}} - <button {{bindAttr disabled="serviceVersion.disabledActionAttr.compare" class=":btn serviceVersion.isDisplayed:not-allowed-cursor" title="serviceVersion.disabledActionMessages.compare"}} {{action compare serviceVersion target="view"}}><i class="icon-copy"></i> {{t common.compare}}</button> - <button {{bindAttr disabled="serviceVersion.disabledActionAttr.revert" class=":btn serviceVersion.isCurrent:not-allowed-cursor" title="serviceVersion.disabledActionMessages.revert"}} {{action revert serviceVersion target="view"}}>{{t dashboard.configHistory.info-bar.revert.button}}</button> + <button {{bindAttr disabled="serviceVersion.disabledActionAttr.compare" class=":btn serviceVersion.isDisplayed:not-allowed-cursor" title="serviceVersion.disabledActionMessages.compare"}} {{action doAction serviceVersion view.actionTypes.COMPARE target="view"}}><i class="icon-copy"></i> {{t common.compare}}</button> + <button {{bindAttr disabled="serviceVersion.disabledActionAttr.revert" class=":btn serviceVersion.isCurrent:not-allowed-cursor" title="serviceVersion.disabledActionMessages.revert"}} {{action doAction serviceVersion view.actionTypes.REVERT target="view"}}>{{t dashboard.configHistory.info-bar.revert.button}}</button> {{/if}} </div> </ul> @@ -109,7 +109,7 @@ <button class="btn" {{action doCancel target="controller"}} {{bindAttr disabled="view.isDiscardDisabled"}}>{{t common.discard}}</button> <button class="btn btn-success" {{action save target="view"}} {{bindAttr disabled="view.isSaveDisabled"}}>{{t common.save}}</button> </div> - <button class="btn btn-success" {{action revert view.serviceVersionsReferences.displayed target="view"}} {{bindAttr disabled="view.versionActionsDisabled" class="view.displayedServiceVersion.isCurrent:hidden"}}>{{view.displayedServiceVersion.makeCurrentButtonText}}</button> + <button class="btn btn-success" {{action doAction view.serviceVersionsReferences.displayed view.actionTypes.REVERT target="view"}} {{bindAttr disabled="view.versionActionsDisabled" class="view.displayedServiceVersion.isCurrent:hidden"}}>{{view.displayedServiceVersion.makeCurrentButtonText}}</button> </div> {{/if}} </div> http://git-wip-us.apache.org/repos/asf/ambari/blob/7cea66b6/ambari-web/app/templates/common/configs/service_version_box.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/common/configs/service_version_box.hbs b/ambari-web/app/templates/common/configs/service_version_box.hbs index 8bd8434..749cb1d 100644 --- a/ambari-web/app/templates/common/configs/service_version_box.hbs +++ b/ambari-web/app/templates/common/configs/service_version_box.hbs @@ -19,7 +19,7 @@ <div {{bindAttr class=":flow-element :pull-left serviceVersion.first:first"}}> <div class="arrow-box pull-left"></div> <div class="version-box"> - <div {{bindAttr class=":version-info :box :pull-right serviceVersion.isDisplayed:displayed serviceVersion.isDisabled:grayedOut"}} {{action switchVersion serviceVersion target="view.parentView"}}> + <div {{bindAttr class=":version-info :box :pull-right serviceVersion.isDisplayed:displayed serviceVersion.isDisabled:grayedOut"}} {{action doAction serviceVersion view.actionTypes.SWITCH target="view.parentView"}}> <div class="top-label"> <span class="label label-info">{{serviceVersion.versionText}}</span> <span class="author pull-right">{{serviceVersion.author}}</span> @@ -42,10 +42,10 @@ <div class="notes">{{{serviceVersion.fullNotes}}}</div> </div> <div class="version-operations-buttons"> - <button {{bindAttr disabled="serviceVersion.disabledActionAttr.view" class=":btn serviceVersion.isDisplayed:not-allowed-cursor" title="serviceVersion.disabledActionMessages.view"}} {{action switchVersion serviceVersion target="view.parentView"}}><i class="icon-search"></i> {{t common.view}}</button> + <button {{bindAttr disabled="serviceVersion.disabledActionAttr.view" class=":btn serviceVersion.isDisplayed:not-allowed-cursor" title="serviceVersion.disabledActionMessages.view"}} {{action doAction serviceVersion view.actionTypes.SWITCH target="view.parentView"}}><i class="icon-search"></i> {{t common.view}}</button> {{#if App.isManager}} - <button {{bindAttr disabled="serviceVersion.disabledActionAttr.compare" class=":btn serviceVersion.isDisplayed:not-allowed-cursor" title="serviceVersion.disabledActionMessages.compare"}} {{action compare serviceVersion target="view.parentView"}}><i class="icon-copy"></i> {{t common.compare}}</button> - <button {{bindAttr disabled="serviceVersion.disabledActionAttr.revert" class=":btn serviceVersion.isCurrent:not-allowed-cursor" title="serviceVersion.disabledActionMessages.revert"}} {{action revert serviceVersion target="view.parentView"}}>{{t dashboard.configHistory.info-bar.revert.button}}</button> + <button {{bindAttr disabled="serviceVersion.disabledActionAttr.compare" class=":btn serviceVersion.isDisplayed:not-allowed-cursor" title="serviceVersion.disabledActionMessages.compare"}} {{action doAction serviceVersion view.actionTypes.COMPARE target="view.parentView"}}><i class="icon-copy"></i> {{t common.compare}}</button> + <button {{bindAttr disabled="serviceVersion.disabledActionAttr.revert" class=":btn serviceVersion.isCurrent:not-allowed-cursor" title="serviceVersion.disabledActionMessages.revert"}} {{action doAction serviceVersion view.actionTypes.REVERT target="view.parentView"}}>{{t dashboard.configHistory.info-bar.revert.button}}</button> {{/if}} </div> </div> http://git-wip-us.apache.org/repos/asf/ambari/blob/7cea66b6/ambari-web/app/views/common/configs/config_history_flow.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/configs/config_history_flow.js b/ambari-web/app/views/common/configs/config_history_flow.js index 2e3a3e4..00c7a13 100644 --- a/ambari-web/app/views/common/configs/config_history_flow.js +++ b/ambari-web/app/views/common/configs/config_history_flow.js @@ -42,6 +42,15 @@ App.ConfigHistoryFlowView = Em.View.extend({ compareServiceVersion: null, /** + * types of actions that can't be done to service config versions + */ + actionTypes: { + SWITCH: 'switchVersion', + COMPARE: 'compare', + REVERT: 'revert' + }, + + /** * In reason of absence of properties dynamic values support which passed to an action, * used property map to get latest values of properties for action */ @@ -157,6 +166,9 @@ App.ConfigHistoryFlowView = Em.View.extend({ }, serviceVersionBox: Em.View.extend({ + actionTypes: function() { + return this.get('parentView.actionTypes'); + }.property('parentView.actionTypes'), templateName: require('templates/common/configs/service_version_box'), didInsertElement: function () { $('.version-box').hoverIntent(function() { @@ -314,10 +326,36 @@ App.ConfigHistoryFlowView = Em.View.extend({ }, /** + * check action constraints prior to invoke it + * @param event + */ + doAction: function (event) { + var type = event.contexts[1], + controller = this.get('controller'), + self = this; + + if (type === 'switchVersion') { + if (event.context.get("isDisplayed")) return; + } else { + var isDisabled = event.context ? event.context.get('isDisabled') : false; + if (isDisabled) return; + } + + function callback() { + self[type].call(self, event); + } + + if (controller.hasUnsavedChanges()) { + controller.showSavePopup(null, callback); + return; + } + callback(); + }, + + /** * switch configs view version to chosen */ switchVersion: function (event) { - if (event.context.get("isDisplayed")) return; var version = event.context.get('version'); var versionIndex = 0; @@ -339,8 +377,6 @@ App.ConfigHistoryFlowView = Em.View.extend({ * add a second version-info-bar for the chosen version */ compare: function (event) { - var isDisabled = event.context ? event.context.get('isDisabled') : false; - if (isDisabled) return; this.set('controller.compareServiceVersion', event.context); this.set('compareServiceVersion', event.context); this.get('controller').onConfigGroupChange(); @@ -369,8 +405,6 @@ App.ConfigHistoryFlowView = Em.View.extend({ */ revert: function (event) { var self = this; - var isDisabled = event.context ? event.context.get('isDisabled') : false; - if (isDisabled) return; var serviceConfigVersion = event.context || Em.Object.create({ version: this.get('displayedServiceVersion.version'), serviceName: this.get('displayedServiceVersion.serviceName'), http://git-wip-us.apache.org/repos/asf/ambari/blob/7cea66b6/ambari-web/test/controllers/main/service/info/config_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/main/service/info/config_test.js b/ambari-web/test/controllers/main/service/info/config_test.js index 1d7ceed..0c60d9e 100644 --- a/ambari-web/test/controllers/main/service/info/config_test.js +++ b/ambari-web/test/controllers/main/service/info/config_test.js @@ -30,64 +30,52 @@ describe("App.MainServiceInfoConfigsController", function () { var tests = [ { path: false, - event: false, + callback: null, action: "onSave", - m: "save configs without path/event", + m: "save configs without path/callback", results: [ { method: "restartServicePopup", called: true - }, - { - method: "selectConfigGroup", - called: false } ] }, { path: true, - event: true, + callback: true, action: "onSave", - m: "save configs with path/event", + m: "save configs with path/callback", results: [ { method: "restartServicePopup", called: true - }, - { - method: "selectConfigGroup", - called: false } ] }, { path: false, - event: false, + callback: false, action: "onDiscard", - m: "discard changes without path/event", + m: "discard changes without path/callback", results: [ { method: "restartServicePopup", called: false - }, - { - method: "selectConfigGroup", - called: false } ] }, { path: false, - event: true, + callback: true, action: "onDiscard", - m: "discard changes with event", + m: "discard changes with callback", results: [ { method: "restartServicePopup", called: false }, { - method: "selectConfigGroup", + method: "callback", called: true }, { @@ -98,7 +86,7 @@ describe("App.MainServiceInfoConfigsController", function () { }, { path: true, - event: false, + callback: null, action: "onDiscard", m: "discard changes with path", results: [ @@ -107,10 +95,6 @@ describe("App.MainServiceInfoConfigsController", function () { called: false }, { - method: "selectConfigGroup", - called: false - }, - { field: "forceTransition", value: true } @@ -120,7 +104,6 @@ describe("App.MainServiceInfoConfigsController", function () { beforeEach(function () { sinon.stub(mainServiceInfoConfigsController, "restartServicePopup", Em.K); - sinon.stub(mainServiceInfoConfigsController, "selectConfigGroup", Em.K); sinon.stub(mainServiceInfoConfigsController, "getHash", function () { return "hash" }); @@ -128,16 +111,22 @@ describe("App.MainServiceInfoConfigsController", function () { }); afterEach(function () { mainServiceInfoConfigsController.restartServicePopup.restore(); - mainServiceInfoConfigsController.selectConfigGroup.restore(); mainServiceInfoConfigsController.getHash.restore(); }); tests.forEach(function (t) { t.results.forEach(function (r) { it(t.m + " " + r.method + " " + r.field, function () { - mainServiceInfoConfigsController.showSavePopup(t.path, t.event)[t.action](); + if (t.callback) { + t.callback = sinon.stub(); + } + mainServiceInfoConfigsController.showSavePopup(t.path, t.callback)[t.action](); if (r.method) { - expect(mainServiceInfoConfigsController[r.method].calledOnce).to.equal(r.called); + if (r.method === 'callback') { + expect(t.callback.calledOnce).to.equal(r.called); + } else { + expect(mainServiceInfoConfigsController[r.method].calledOnce).to.equal(r.called); + } } else if (r.field) { expect(mainServiceInfoConfigsController.get(r.field)).to.equal(r.value); }
