Repository: ambari Updated Branches: refs/heads/branch-2.1 ed9360453 -> 6205c1a71
AMBARI-11877. Min/Max value for Sliders should be proportional to the step_increment (onechiporenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6205c1a7 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6205c1a7 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6205c1a7 Branch: refs/heads/branch-2.1 Commit: 6205c1a7145b62b382828dbfc8aaa6bd47d06d29 Parents: ed93604 Author: Oleg Nechiporenko <onechipore...@apache.org> Authored: Fri Jun 12 15:31:26 2015 +0300 Committer: Oleg Nechiporenko <onechipore...@apache.org> Committed: Fri Jun 12 15:33:57 2015 +0300 ---------------------------------------------------------------------- .../widgets/slider_config_widget_view.js | 27 ++++++++++++---- .../widgets/slider_config_widget_view_test.js | 34 ++++++++++++++++++++ 2 files changed, 55 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/6205c1a7/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 6f6b9e3..4eb6add 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 @@ -290,8 +290,11 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({ parseFunction = this.get('parseFunction'), ticks = [this.valueForTick(this.get('minMirrorValue'))], ticksLabels = [], + maxMirrorValue = this.get('maxMirrorValue'), + minMirrorValue = this.get('minMirrorValue'), + mirrorStep = this.get('mirrorStep'), recommendedValue = this.valueForTick(+this.get('widgetRecommendedValue')), - range = this.get('maxMirrorValue') - this.get('minMirrorValue'), + range = Math.floor((maxMirrorValue - minMirrorValue) / mirrorStep) * mirrorStep, // for little odd numbers in range 4..23 and widget type 'int' use always 4 ticks isSmallInt = this.get('unitType') == 'int' && range > 4 && range < 23 && range % 2 == 1, recommendedValueMirroredId, @@ -299,12 +302,12 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({ // ticks and labels for (var i = 1; i <= 3; i++) { - var val = this.get('minMirrorValue') + range * (i / (isSmallInt ? 3 : 4)); + var val = minMirrorValue + this.valueForTickProportionalToStep(range * (i / (isSmallInt ? 3 : 4))); // if value's type is float, ticks may be float too - ticks.push(this.valueForTick(val)); + ticks.push(val); } - ticks.push(this.valueForTick(this.get('maxMirrorValue'))); + ticks.push(this.valueForTick(maxMirrorValue)); ticks = ticks.uniq(); ticks.forEach(function (tick, index, items) { ticksLabels.push((items.length < 5 || index % 2 === 0 || items.length - 1 == index) ? tick + ' ' + self.get('unitLabel') : ''); @@ -313,7 +316,7 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({ ticks = ticks.uniq(); // default marker should be added only if recommendedValue is in range [min, max] - if (recommendedValue <= this.get('maxMirrorValue') && recommendedValue >= this.get('minMirrorValue') && recommendedValue != '') { + if (recommendedValue <= maxMirrorValue && recommendedValue >= minMirrorValue && recommendedValue != '') { // process additional tick for default value if it not defined in previous computation if (!ticks.contains(recommendedValue)) { // push default value @@ -357,7 +360,7 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({ ticks: ticks, tooltip: 'always', ticks_labels: ticksLabels, - step: this.get('mirrorStep'), + step: mirrorStep, formatter: function(val) { if (Em.isArray(val)) { return val[0] + self.get('unitLabel'); @@ -429,6 +432,18 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({ * @returns {Number} */ valueForTick: function(val) { + return this.get('unitType') === 'int' ? Math.round(val) : parseFloat(val.toFixed(3)); + }, + + /** + * Convert value according to property attribute unit + * Also returned value is proportional to the <code>mirrorStep</code> + * + * @param {Number} val + * @private + * @returns {Number} + */ + valueForTickProportionalToStep: function (val) { if (this.get('unitType') === 'int') { return Math.round(val); } http://git-wip-us.apache.org/repos/asf/ambari/blob/6205c1a7/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 e4e8a7b..2d2b98e 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 @@ -330,6 +330,40 @@ describe('App.SliderConfigWidgetView', function () { ticks: [0,2,6,12,17,20,23], ticksLabels: ['0 ', '', '', '12 ', '', '', '23 '] } + }, + { + viewSetup: { + minMirrorValue: 1, + maxMirrorValue: 30, + widgetRecommendedValue: 1, + config: Em.Object.create({ + stackConfigProperty: Em.Object.create({ + valueAttributes: { unit: "B", type: "int", minimum: "1048576", maximum: "31457280", increment_step: "262144" }, + widget: { units: [ { 'unit-name': "MB"}]} + }) + }) + }, + e: { + ticks: [1, 8.25, 15.5, 22.75, 30], + ticksLabels: ["1 MB", "", "15.5 MB", "", "30 MB"] + } + }, + { + viewSetup: { + minMirrorValue: 1, + maxMirrorValue: 100, + widgetRecommendedValue: 10, + config: Em.Object.create({ + stackConfigProperty: Em.Object.create({ + valueAttributes: {unit: "B", type: "int", minimum: "1073741824", maximum: "107374182400", increment_step: "1073741824"}, + widget: { units: [ { 'unit-name': "GB"}]} + }) + }) + }, + e: { + ticks: [1, 10, 26, 51, 75, 87.5, 100], + ticksLabels: ["1 GB", "", "", "51 GB", "", "", "100 GB"] + } } ];