From 62907dc56f154f1513e956a49432ac806034d309 Mon Sep 17 00:00:00 2001
From: Ablay Keldibek
Date: Mon, 16 Mar 2015 15:10:23 +0600
Subject: [PATCH 1/4] Slider: Setting values or range slider to max, doesn't
lock slider
When both values are set to the maximum change them in descending order
Fixes #9046
---
tests/visual/slider/range_slider.html | 47 +++++++++++++++++++++++++++
ui/slider.js | 23 ++++++++++---
2 files changed, 65 insertions(+), 5 deletions(-)
create mode 100644 tests/visual/slider/range_slider.html
diff --git a/tests/visual/slider/range_slider.html b/tests/visual/slider/range_slider.html
new file mode 100644
index 00000000000..2b041f37740
--- /dev/null
+++ b/tests/visual/slider/range_slider.html
@@ -0,0 +1,47 @@
+
+
+
+
+ jQuery UI Slider - Range slider
+
+
+
+
+
+
+
+
+
+
+
Range Slider
+
When set both values of range slider to the maximum, slider should not lock
+
+
+
+
+
+
+
+
+
diff --git a/ui/slider.js b/ui/slider.js
index 094f0135d47..e973a9e86f0 100644
--- a/ui/slider.js
+++ b/ui/slider.js
@@ -410,9 +410,24 @@ return $.widget( "ui.slider", $.ui.mouse, {
}
},
- _setOption: function( key, value ) {
+ _changeAllValues: function( valuesLength ) {
var i,
- valsLength = 0;
+ rangeValues = [ this.values( 0 ), this.values( 1 ), this._valueMax() ];
+
+ if ( this.options.range === true && $.unique( rangeValues ).length === 1 ) {
+ for ( i = valuesLength - 1; i >= 0; i -= 1 ) {
+ this._change( null, i );
+ }
+ return;
+ }
+
+ for ( i = 0; i < valuesLength; i += 1 ) {
+ this._change( null, i );
+ }
+ },
+
+ _setOption: function( key, value ) {
+ var valsLength = 0;
if ( key === "range" && this.options.range === true ) {
if ( value === "min" ) {
@@ -453,9 +468,7 @@ return $.widget( "ui.slider", $.ui.mouse, {
case "values":
this._animateOff = true;
this._refreshValue();
- for ( i = 0; i < valsLength; i += 1 ) {
- this._change( null, i );
- }
+ this._changeAllValues( valsLength );
this._animateOff = false;
break;
case "step":
From 5dac65fe149b3ec66b667ac9f177ef15fb0a433c Mon Sep 17 00:00:00 2001
From: Ablay Keldibek
Date: Mon, 16 Mar 2015 17:59:08 +0600
Subject: [PATCH 2/4] Slider: Unit test for setting both values of range slider
to the max
Refs #9046
---
tests/unit/slider/slider_events.js | 14 +++++++++++++-
ui/slider.js | 12 ++----------
2 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/tests/unit/slider/slider_events.js b/tests/unit/slider/slider_events.js
index d020d8ac616..e6cb77bfbc5 100644
--- a/tests/unit/slider/slider_events.js
+++ b/tests/unit/slider/slider_events.js
@@ -99,7 +99,7 @@ test( "programmatic event triggers", function() {
});
test( "mouse based interaction part two: when handles overlap", function() {
- expect( 4 );
+ expect( 5 );
var element = $( "#slider1" )
.slider({
@@ -147,6 +147,18 @@ test( "mouse based interaction part two: when handles overlap", function() {
});
handles.eq( 0 ).simulate( "drag", { dx: 10 } );
+ element = $( "#slider1" )
+ .slider({
+ range: true,
+ min: 0,
+ max: 100,
+ values: [ 0, 50 ]
+ }),
+ handles = element.find( ".ui-slider-handle" );
+
+ element.slider( "option", { values: [ 100, 100 ] } );
+ element.find( ".ui-slider-handle" ).simulate( "drag", { dx: -10 } );
+ equal( element.slider( "values" )[ 0 ], 99, "setting values of range slider doesn't lock slider" );
});
test( "event data", function() {
diff --git a/ui/slider.js b/ui/slider.js
index e973a9e86f0..65b65864d70 100644
--- a/ui/slider.js
+++ b/ui/slider.js
@@ -411,17 +411,9 @@ return $.widget( "ui.slider", $.ui.mouse, {
},
_changeAllValues: function( valuesLength ) {
- var i,
- rangeValues = [ this.values( 0 ), this.values( 1 ), this._valueMax() ];
+ var i;
- if ( this.options.range === true && $.unique( rangeValues ).length === 1 ) {
- for ( i = valuesLength - 1; i >= 0; i -= 1 ) {
- this._change( null, i );
- }
- return;
- }
-
- for ( i = 0; i < valuesLength; i += 1 ) {
+ for ( i = valuesLength - 1; i >= 0; i -= 1 ) {
this._change( null, i );
}
},
From 00ce97fe5165a48fe36beb1c8e828edd23b06e68 Mon Sep 17 00:00:00 2001
From: Ablay Keldibek
Date: Tue, 17 Mar 2015 12:22:05 +0600
Subject: [PATCH 3/4] Slider: Unit test for setting both values of range slider
to the min
Refs #9046
---
tests/unit/slider/slider_events.js | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/tests/unit/slider/slider_events.js b/tests/unit/slider/slider_events.js
index e6cb77bfbc5..cc5546a9f6f 100644
--- a/tests/unit/slider/slider_events.js
+++ b/tests/unit/slider/slider_events.js
@@ -99,7 +99,7 @@ test( "programmatic event triggers", function() {
});
test( "mouse based interaction part two: when handles overlap", function() {
- expect( 5 );
+ expect( 6 );
var element = $( "#slider1" )
.slider({
@@ -157,8 +157,12 @@ test( "mouse based interaction part two: when handles overlap", function() {
handles = element.find( ".ui-slider-handle" );
element.slider( "option", { values: [ 100, 100 ] } );
- element.find( ".ui-slider-handle" ).simulate( "drag", { dx: -10 } );
- equal( element.slider( "values" )[ 0 ], 99, "setting values of range slider doesn't lock slider" );
+ handles.eq( 0 ).simulate( "drag", { dx: -10 } );
+ equal( element.slider( "values" )[ 0 ], 99, "setting both values of range slider to the maximum doesn't lock slider" );
+
+ element.slider( "option", { values: [ 0, 0 ] } );
+ handles.eq( 1 ).simulate( "drag", { dx: 10 } );
+ equal( element.slider( "values" )[ 1 ], 1, "setting both values of range slider to the minimum doesn't lock slider" );
});
test( "event data", function() {
From 1f0353ae72f705908ad84c4d55d17545fbfa2d64 Mon Sep 17 00:00:00 2001
From: Ablay Keldibek
Date: Tue, 17 Mar 2015 22:23:59 +0600
Subject: [PATCH 4/4] Slider: Separate method for change all values removed
Refs #9046
---
ui/slider.js | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/ui/slider.js b/ui/slider.js
index 65b65864d70..6c72055ea39 100644
--- a/ui/slider.js
+++ b/ui/slider.js
@@ -410,16 +410,9 @@ return $.widget( "ui.slider", $.ui.mouse, {
}
},
- _changeAllValues: function( valuesLength ) {
- var i;
-
- for ( i = valuesLength - 1; i >= 0; i -= 1 ) {
- this._change( null, i );
- }
- },
-
_setOption: function( key, value ) {
- var valsLength = 0;
+ var i,
+ valsLength = 0;
if ( key === "range" && this.options.range === true ) {
if ( value === "min" ) {
@@ -460,7 +453,12 @@ return $.widget( "ui.slider", $.ui.mouse, {
case "values":
this._animateOff = true;
this._refreshValue();
- this._changeAllValues( valsLength );
+
+ // use reverse loop to change values, then last changed handle will be the first handle
+ // it need when user set both values to max ( with normal loop slider locks )
+ for ( i = valsLength - 1; i >= 0; i -= 1 ) {
+ this._change( null, i );
+ }
this._animateOff = false;
break;
case "step":