Repository: ambari Updated Branches: refs/heads/trunk 728b2d470 -> a1f409cb2
AMBARI-10375. Editing configs in config-group running into weird situations (alexantonenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a1f409cb Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a1f409cb Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a1f409cb Branch: refs/heads/trunk Commit: a1f409cb206442c55fd043610a415624eda02b7d Parents: 728b2d4 Author: Alex Antonenko <[email protected]> Authored: Thu Apr 9 01:52:31 2015 +0300 Committer: Alex Antonenko <[email protected]> Committed: Thu Apr 9 01:52:43 2015 +0300 ---------------------------------------------------------------------- .../mixins/common/configs/enhanced_configs.js | 34 ++++++++++++-------- ambari-web/app/utils/config.js | 1 + .../configs/widgets/config_widget_view.js | 1 + .../widgets/slider_config_widget_view.js | 1 + ambari-web/app/views/common/controls_view.js | 18 ++++++++--- .../common/configs/enhanced_configs_test.js | 25 +++++++++++++- .../widgets/list_config_widget_view_test.js | 11 ++++++- 7 files changed, 71 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/a1f409cb/ambari-web/app/mixins/common/configs/enhanced_configs.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins/common/configs/enhanced_configs.js b/ambari-web/app/mixins/common/configs/enhanced_configs.js index 467f31c..c14867b 100644 --- a/ambari-web/app/mixins/common/configs/enhanced_configs.js +++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js @@ -154,6 +154,22 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ /** + * disable saving recommended value for current config + * @param config + * @method removeCurrentFromDependentList + */ + removeCurrentFromDependentList: function (config) { + var current = this.get('_dependentConfigValues').filterProperty('propertyName', config.get('name')).findProperty('fileName', App.config.getConfigTagFromFileName(config.get('filename'))); + if (current) { + Em.setProperties(current, { + 'saveRecommended': false, + 'saveRecommendedDefault': false, + 'value': config.get('value') + }); + } + }, + + /** * sends request to get values for dependent configs * @param changedConfigs * @param initial @@ -162,7 +178,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ */ getRecommendationsForDependencies: function(changedConfigs, initial, onComplete) { if (Em.isArray(changedConfigs) && changedConfigs.length > 0 || initial) { - var self = this; var recommendations = this.get('hostGroups'); var configs = this._getConfigsByGroup(this.get('stepConfigs')); recommendations.blueprint.configurations = blueprintUtils.buildConfigsJSON(this.get('services'), configs); @@ -188,7 +203,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ success: 'dependenciesSuccess', error: 'dependenciesError', callback: function() { - self.onRecommendationsReceived(); if (onComplete) { onComplete() } @@ -200,14 +214,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ }, /** - * complete callback on <code>getRecommendationsForDependencies<code> - * @method onRecommendationsReceived - */ - onRecommendationsReceived: function() { - this.set('recommendationTimeStamp', (new Date).getTime()); - }, - - /** * shows popup with results for recommended value * if case properties that was changes belongs to not default group * user should pick to what config group from dependent service dependent properties will be saved @@ -233,7 +239,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ * method to show popup with dependent configs * @method showChangedDependentConfigs */ - showChangedDependentConfigs: function(event, callback) { + showChangedDependentConfigs: function(event, callback, secondary) { var self = this; if (self.get('_dependentConfigValues.length') > 0) { App.showDependentConfigsPopup(this.get('_dependentConfigValues'), function() { @@ -241,7 +247,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ if (callback) { callback(); } - }); + }, secondary); } else { if (callback) { callback(); @@ -257,6 +263,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ * @param opt */ dependenciesError: function(jqXHR, ajaxOptions, error, opt) { + this.set('recommendationTimeStamp', (new Date).getTime()); App.ajax.defaultErrorHandler(jqXHR, opt.url, opt.method, jqXHR.status); }, @@ -322,6 +329,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ } }) }); + this.set('recommendationTimeStamp', (new Date).getTime()); }, /** @@ -450,4 +458,4 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ } } } -}); \ No newline at end of file +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/a1f409cb/ambari-web/app/utils/config.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js index 162ea1e..1b7ae4a 100644 --- a/ambari-web/app/utils/config.js +++ b/ambari-web/app/utils/config.js @@ -311,6 +311,7 @@ App.config = Em.Object.create({ defaultValue: properties[index], filename: filename, isUserProperty: !advancedConfig, + isVisible: !!service, isOverridable: true, isReconfigurable: true, isRequired: isAdvanced, http://git-wip-us.apache.org/repos/asf/ambari/blob/a1f409cb/ambari-web/app/views/common/configs/widgets/config_widget_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/configs/widgets/config_widget_view.js b/ambari-web/app/views/common/configs/widgets/config_widget_view.js index d24e845..d75dd03 100644 --- a/ambari-web/app/views/common/configs/widgets/config_widget_view.js +++ b/ambari-web/app/views/common/configs/widgets/config_widget_view.js @@ -82,6 +82,7 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo */ restoreValue: function () { this.set('config.value', this.get('config.defaultValue')); + this.get('controller').removeCurrentFromDependentList(this.get('config')); this.sendRequestRorDependentConfigs(this.get('config')); if (this.get('config.supportsFinal')) { http://git-wip-us.apache.org/repos/asf/ambari/blob/a1f409cb/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js b/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js index 7dc0c13..29c0ac7 100644 --- a/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js +++ b/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js @@ -255,6 +255,7 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({ * action to run sendRequestRorDependentConfigs when * we have changed config value within slider */ + self.get('controller').removeCurrentFromDependentList(self.get('config')); self.sendRequestRorDependentConfigs(self.get('config')); }); this.set('slider', slider); http://git-wip-us.apache.org/repos/asf/ambari/blob/a1f409cb/ambari-web/app/views/common/controls_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/controls_view.js b/ambari-web/app/views/common/controls_view.js index 1b9e54b..364cd92 100644 --- a/ambari-web/app/views/common/controls_view.js +++ b/ambari-web/app/views/common/controls_view.js @@ -63,6 +63,14 @@ App.ServiceConfigPopoverSupport = Ember.Mixin.create({ App.SupportsDependentConfigs = Ember.Mixin.create({ /** + * do not apply recommended value if user change value by himself. + */ + keyUp: function() { + if (App.get('supports.enhancedConfigs')) { + this.get('controller').removeCurrentFromDependentList(this.get('serviceConfig')); + } + }, + /** * method send request to check if some of dependent configs was changes * and in case there was changes shows popup with info about changed configs */ @@ -202,7 +210,7 @@ App.ServiceConfigPasswordField = Ember.TextField.extend({ * Textarea control * @type {*} */ -App.ServiceConfigTextArea = Ember.TextArea.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, { +App.ServiceConfigTextArea = Ember.TextArea.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, App.SupportsDependentConfigs, { valueBinding: 'serviceConfig.value', rows: 4, @@ -215,7 +223,7 @@ App.ServiceConfigTextArea = Ember.TextArea.extend(App.ServiceConfigPopoverSuppor * Textarea control for content type * @type {*} */ -App.ServiceConfigTextAreaContent = Ember.TextArea.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, { +App.ServiceConfigTextAreaContent = Ember.TextArea.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, App.SupportsDependentConfigs, { valueBinding: 'serviceConfig.value', rows: 20, @@ -234,7 +242,7 @@ App.ServiceConfigBigTextArea = App.ServiceConfigTextArea.extend(App.ServiceConfi * Checkbox control * @type {*} */ -App.ServiceConfigCheckbox = Ember.Checkbox.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, { +App.ServiceConfigCheckbox = Ember.Checkbox.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, App.SupportsDependentConfigs, { allowedPairs: { 'trueFalse': ["true", "false"], @@ -336,7 +344,7 @@ App.ServiceConfigCheckboxWithDependencies = App.ServiceConfigCheckbox.extend({ } }); -App.ServiceConfigRadioButtons = Ember.View.extend(App.ServiceConfigCalculateId, { +App.ServiceConfigRadioButtons = Ember.View.extend(App.ServiceConfigCalculateId, App.SupportsDependentConfigs, { templateName: require('templates/wizard/controls_service_config_radio_buttons'), didInsertElement: function () { @@ -688,7 +696,7 @@ App.ServiceConfigRadioButton = Ember.Checkbox.extend({ }.property('parentView.serviceConfig.isEditable') }); -App.ServiceConfigComboBox = Ember.Select.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, { +App.ServiceConfigComboBox = Ember.Select.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, App.SupportsDependentConfigs, { contentBinding: 'serviceConfig.options', selectionBinding: 'serviceConfig.value', placeholderBinding: 'serviceConfig.defaultValue', http://git-wip-us.apache.org/repos/asf/ambari/blob/a1f409cb/ambari-web/test/mixins/common/configs/enhanced_configs_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/mixins/common/configs/enhanced_configs_test.js b/ambari-web/test/mixins/common/configs/enhanced_configs_test.js index a9cbce7..bc88a9f 100644 --- a/ambari-web/test/mixins/common/configs/enhanced_configs_test.js +++ b/ambari-web/test/mixins/common/configs/enhanced_configs_test.js @@ -18,5 +18,28 @@ var App = require('app'); -describe('App.EnhancedConfigsMixin', function() {}); +describe('App.EnhancedConfigsMixin', function() { + + var mixinObject = Em.Controller.extend(App.EnhancedConfigsMixin, {}); + var instanceObject = mixinObject.create({}); + describe('#removeCurrentFromDependentList()', function() { + it('update some fields', function() { + instanceObject.get('_dependentConfigValues').pushObject({ + saveRecommended: true, + saveRecommendedDefault: true, + propertyName: 'p1', + fileName: 'f1', + value: 'v1' + }); + instanceObject.removeCurrentFromDependentList(Em.Object.create({name: 'p1', filename: 'f1.xml', value: 'v2'})); + expect(instanceObject.get('_dependentConfigValues')[0]).to.eql({ + saveRecommended: false, + saveRecommendedDefault: false, + propertyName: 'p1', + fileName: 'f1', + value: 'v2' + }); + }); + }); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/a1f409cb/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js b/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js index a64bf11..01e184a 100644 --- a/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js +++ b/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js @@ -29,6 +29,7 @@ describe('App.ListConfigWidgetView', function () { name: 'a.b.c', defaultValue: '2,1', value: '2,1', + filename: 'f1', stackConfigProperty: Em.Object.create({ valueAttributes: { entries: ['1', '2', '3', '4', '5'], @@ -37,7 +38,8 @@ describe('App.ListConfigWidgetView', function () { selection_cardinality: '3' } }) - }) + }), + controller: App.MainServiceInfoConfigsController.create({}) }); view.willInsertElement(); view.didInsertElement(); @@ -112,6 +114,12 @@ describe('App.ListConfigWidgetView', function () { describe('#restoreValue', function () { + beforeEach(function() { + sinon.stub(view.get('controller'), 'removeCurrentFromDependentList', Em.K) + }); + afterEach(function() { + view.get('controller.removeCurrentFromDependentList').restore(); + }); it('should restore default value', function () { view.toggleOption({context: view.get('options')[0]}); view.toggleOption({context: view.get('options')[1]}); @@ -119,6 +127,7 @@ describe('App.ListConfigWidgetView', function () { expect(view.get('config.value')).to.equal('3'); view.restoreValue(); expect(view.get('config.value')).to.equal('2,1'); + expect(view.get('controller.removeCurrentFromDependentList')).to.be.called }); });
