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 2015/03/27 13:35:13 UTC
ambari git commit: AMBARI-10234. Widgets validation rules should
affect config internal valid/invalid state (onechiporenko)
Repository: ambari
Updated Branches:
refs/heads/trunk 3937b6f7a -> 589faa74a
AMBARI-10234. Widgets validation rules should affect config internal valid/invalid state (onechiporenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/589faa74
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/589faa74
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/589faa74
Branch: refs/heads/trunk
Commit: 589faa74a9eb7a521ce2e601895d11bc4ad93743
Parents: 3937b6f
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Fri Mar 27 14:30:50 2015 +0200
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Fri Mar 27 14:30:50 2015 +0200
----------------------------------------------------------------------
.../configs/widgets/list_config_widget_view.js | 16 +++++++++++++---
.../configs/widgets/slider_config_widget_view.js | 3 +++
.../configs/widgets/time_interval_spinner_view.js | 7 +++++--
.../configs/widgets/list_config_widget_view_test.js | 16 ++++++++++++++++
.../widgets/slider_config_widget_view_test.js | 4 ++++
.../widgets/time_interval_spinner_view_test.js | 4 +++-
6 files changed, 44 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/589faa74/ambari-web/app/views/common/configs/widgets/list_config_widget_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/widgets/list_config_widget_view.js b/ambari-web/app/views/common/configs/widgets/list_config_widget_view.js
index 770f746..bd79501 100644
--- a/ambari-web/app/views/common/configs/widgets/list_config_widget_view.js
+++ b/ambari-web/app/views/common/configs/widgets/list_config_widget_view.js
@@ -98,6 +98,12 @@ App.ListConfigWidgetView = App.ConfigWidgetView.extend({
*/
allowedToSelect: 1,
+ /**
+ * Minimum number of options needed to select (based on <code>config.valueAttributes.selection_cardinality</code>)
+ * @type {number}
+ */
+ neededToSelect: 0,
+
templateName: require('templates/common/configs/widgets/list_config_widget'),
willInsertElement: function () {
@@ -177,24 +183,28 @@ App.ListConfigWidgetView = App.ConfigWidgetView.extend({
/**
* If user already selected maximum of allowed options, disable other options
+ * If user selected less than minimum of needed options, mark config.value as invalid
* If user deselect some option, all disabled options become enabled
* Triggers on each option select/deselect
* @method checkSelectedItemsCount
*/
checkSelectedItemsCount: function () {
var allowedToSelect = this.get('allowedToSelect'),
+ neededToSelect = this.get('neededToSelect'),
currentlySelected = this.get('options').filterProperty('isSelected').length,
selectionDisabled = allowedToSelect <= currentlySelected;
this.get('options').filterProperty('isSelected', false).setEach('isDisabled', selectionDisabled);
+ this.set('config.errorMessage', currentlySelected < neededToSelect ? 'You should select at least ' + neededToSelect + ' item(s)' : '');
},
/**
- * Get maximum number of options allowed to select basing on config cardinality value
+ * Get maximum number of options allowed to select and needed to select basing on config cardinality value
* @method parseCardinality
*/
parseCardinality: function () {
- var cardinality = numberUtils.getCardinalityValue(this.get('config.stackConfigProperty.valueAttributes.selection_cardinality'), true);
- this.set('allowedToSelect', cardinality);
+ var cardinality = this.get('config.stackConfigProperty.valueAttributes.selection_cardinality');
+ this.set('allowedToSelect', numberUtils.getCardinalityValue(cardinality, true));
+ this.set('neededToSelect', numberUtils.getCardinalityValue(cardinality, false));
},
/**
http://git-wip-us.apache.org/repos/asf/ambari/blob/589faa74/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 58be1e2..118f50f 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
@@ -111,6 +111,7 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({
var parsed = parseFunction(mirrorValue);
if (parsed >= min && parsed <= max) {
this.set('isMirrorValueValid', true);
+ this.set('config.errorMessage', '');
this.set('config.value', '' + parsed);
if (slider) {
slider.setValue(parsed);
@@ -118,10 +119,12 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({
}
else {
this.set('isMirrorValueValid', false);
+ this.set('config.errorMessage', 'Invalid value');
}
}
else {
this.set('isMirrorValueValid', false);
+ this.set('config.errorMessage', 'Invalid value');
}
},
http://git-wip-us.apache.org/repos/asf/ambari/blob/589faa74/ambari-web/app/views/common/configs/widgets/time_interval_spinner_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/widgets/time_interval_spinner_view.js b/ambari-web/app/views/common/configs/widgets/time_interval_spinner_view.js
index 83881e1..d76e698 100644
--- a/ambari-web/app/views/common/configs/widgets/time_interval_spinner_view.js
+++ b/ambari-web/app/views/common/configs/widgets/time_interval_spinner_view.js
@@ -251,8 +251,11 @@ App.TimeIntervalSpinnerView = App.ConfigWidgetView.extend({
else if (convertedValue > parseInt(this.get('config.stackConfigProperty.valueAttributes.maximum'))) {
errorMessage = Em.I18n.t('number.validate.moreThanMaximum').format(this.dateToText(this.get('maxValue')));
}
- this.set('isValid', !errorMessage);
- this.set('errorMessage', errorMessage);
+ this.setProperties({
+ isValid: !errorMessage,
+ errorMessage: errorMessage
+ });
+ this.get('config').set('errorMessage', errorMessage);
},
/**
http://git-wip-us.apache.org/repos/asf/ambari/blob/589faa74/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 62d8ec1..4e7fb81 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
@@ -138,4 +138,20 @@ describe('App.ListConfigWidgetView', function () {
});
+ describe('#checkSelectedItemsCount', function () {
+
+ beforeEach(function () {
+ view.set('config.stackConfigProperty.valueAttributes.selection_cardinality', '1+');
+ view.parseCardinality();
+ });
+
+ it('should check minimum count of the selected items', function () {
+ view.get('options').setEach('isSelected', false);
+ expect(view.get('config.errorMessage')).to.have.property('length').that.is.least(1);
+ view.get('options').setEach('isSelected', true);
+ expect(view.get('config.errorMessage')).to.equal('');
+ });
+
+ });
+
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/589faa74/ambari-web/test/views/common/configs/widgets/slider_config_widget_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/widgets/slider_config_widget_view_test.js b/ambari-web/test/views/common/configs/widgets/slider_config_widget_view_test.js
index 4a25ddf..34a254f 100644
--- a/ambari-web/test/views/common/configs/widgets/slider_config_widget_view_test.js
+++ b/ambari-web/test/views/common/configs/widgets/slider_config_widget_view_test.js
@@ -86,20 +86,24 @@ describe('App.SliderConfigWidgetView', function () {
viewInt.set('mirrorValue', 1000);
expect(viewInt.get('isMirrorValueValid')).to.be.true;
expect(viewInt.get('config.value')).to.equal('1000');
+ expect(viewInt.get('config.errorMessage')).to.equal('');
viewInt.set('mirrorValue', 100500);
expect(viewInt.get('isMirrorValueValid')).to.be.false;
expect(viewInt.get('config.value')).to.equal('1000');
+ expect(viewInt.get('config.errorMessage')).to.have.property('length').that.is.least(1);
});
it('check float', function () {
viewFloat.set('mirrorValue', 55.5);
expect(viewFloat.get('isMirrorValueValid')).to.be.true;
expect(viewFloat.get('config.value')).to.equal('55.5');
+ expect(viewFloat.get('config.errorMessage')).to.equal('');
viewFloat.set('mirrorValue', 100500.5);
expect(viewFloat.get('isMirrorValueValid')).to.be.false;
expect(viewFloat.get('config.value')).to.equal('55.5');
+ expect(viewFloat.get('config.errorMessage')).to.have.property('length').that.is.least(1);
});
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/589faa74/ambari-web/test/views/common/configs/widgets/time_interval_spinner_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/widgets/time_interval_spinner_view_test.js b/ambari-web/test/views/common/configs/widgets/time_interval_spinner_view_test.js
index c238709..c7a4486 100644
--- a/ambari-web/test/views/common/configs/widgets/time_interval_spinner_view_test.js
+++ b/ambari-web/test/views/common/configs/widgets/time_interval_spinner_view_test.js
@@ -19,6 +19,7 @@
var App = require('app');
describe('App.TimeIntervalSpinnerView', function() {
+
describe('#convertToWidgetUnits', function(){
beforeEach(function() {
this.view = App.TimeIntervalSpinnerView.create({});
@@ -86,7 +87,7 @@ describe('App.TimeIntervalSpinnerView', function() {
inputType: 'hours',
desiredUnits: "hours",
e: [
- { label: 'Hours', value: 2},
+ { label: 'Hours', value: 2}
]
}
];
@@ -139,4 +140,5 @@ describe('App.TimeIntervalSpinnerView', function() {
});
});
});
+
});