Skip to content

Commit 296e454

Browse files
committed
Slider: Fix to restrict handle values when set programmatically.
Fixes #3762 - Slider: handles not restricted properly when set programmatically
1 parent ea999e4 commit 296e454

File tree

3 files changed

+125
-12
lines changed

3 files changed

+125
-12
lines changed

tests/unit/slider/slider_methods.js

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,58 @@ test( "value", function() {
100100
equal( element.slider( "value" ), 2.4, "value is set to max with 0.01 step" );
101101
});
102102

103-
//test( "values", function() {
104-
// ok(false, "missing test - untested code is broken code." );
105-
//});
103+
test( "values", function() {
104+
expect( 12 );
105+
106+
var element = $( "<div></div>" ).slider({
107+
range: true,
108+
min: 10,
109+
max: 100,
110+
step: 1
111+
});
112+
113+
element.slider( "option", "values", [ 20, 90 ] );
114+
deepEqual( element.slider( "values" ), [ 20, 90 ], "option values - get value for all handles" );
115+
116+
element.slider( "option", "values", [ 0, 200 ] );
117+
deepEqual( element.slider( "values" ), [ 10, 100 ], "option values - restricted min and max" );
118+
119+
element.slider( "values", 0, 50 );
120+
equal( element.slider( "values", 0 ), 50, "values - set first handle" );
121+
122+
element.slider( "values", 1, 75 );
123+
equal( element.slider( "values", 1 ), 75, "values - set second handle" );
124+
125+
element.slider( "option", "values", [ 50, 75 ] );
126+
element.slider( "values", 0, 5 );
127+
equal( element.slider( "values", 0 ), 10, "1st handle restricted properly, against min" );
128+
129+
element.slider( "values", 1, 5 );
130+
equal( element.slider( "values", 0 ), 10, "2nd handle restricted properly, against min" );
131+
132+
element.slider( "option", "values", [ 50, 75 ] );
133+
element.slider( "values", 0, 110 );
134+
equal( element.slider( "values", 0 ), 75, "1st handle restricted properly, against max" );
135+
136+
element.slider( "values", 1, 110 );
137+
equal( element.slider( "values", 1 ), 100, "2nd handle restricted properly, against max" );
138+
139+
element.slider( "option", "values", [ 50, 75 ] );
140+
element.slider( "values", 0, 90 );
141+
equal( element.slider( "values", 0 ), 75, "1st handle restricted properly, against 2nd handle" );
142+
143+
element.slider( "option", "values", [ 50, 75 ] );
144+
element.slider( "values", 1, 45 );
145+
equal( element.slider( "values", 1 ), 50, "2nd handle restricted properly, against 1st handle" );
146+
147+
element.slider( "option", "values", [ 50, 75 ] );
148+
element.slider( "values", [ 50, 10 ] );
149+
deepEqual( element.slider( "values" ), [ 50, 50 ], "Setting both handles - 2nd Handle resets to 1st" );
150+
151+
element.slider( "option", "values", [ 50, 75 ] );
152+
element.slider( "values", [ 75, 50 ] );
153+
deepEqual( element.slider( "values" ), [ 75, 75 ], "Setting both handles - 2nd Handle resets to 1st" );
154+
155+
});
106156

107157
})( jQuery );

tests/unit/slider/slider_options.js

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,18 +198,19 @@ test( "step", function() {
198198
//});
199199

200200
test( "values", function() {
201-
expect( 2 );
201+
expect( 3 );
202202

203203
// testing multiple ranges on the same page, the object reference to the values
204204
// property is preserved via multiple range elements, so updating options.values
205205
// of 1 slider updates options.values of all the others
206-
var ranges = $([
207-
document.createElement( "div" ),
208-
document.createElement( "div" )
209-
]).slider({
210-
range: true,
211-
values: [ 25, 75 ]
212-
});
206+
var element,
207+
ranges = $([
208+
document.createElement( "div" ),
209+
document.createElement( "div" )
210+
]).slider({
211+
range: true,
212+
values: [ 25, 75 ]
213+
});
213214

214215
notStrictEqual(
215216
ranges.eq( 0 ).slider( "instance" ).options.values,
@@ -224,6 +225,15 @@ test( "values", function() {
224225
ranges.eq( 1 ).slider( "values", 0 ),
225226
"the values for multiple sliders should be different"
226227
);
228+
229+
element = $( "<div></div>" ).slider({
230+
range: true,
231+
min: 10,
232+
max: 100,
233+
step: 1,
234+
values: [ 15, 1 ]
235+
});
236+
deepEqual( element.slider( "values" ), [ 15, 15 ], "handles restricted properly when set programmatically - 2nd handle reset" );
227237
});
228238

229239
test( "range", function() {

ui/slider.js

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ return $.widget( "ui.slider", $.ui.mouse, {
6767
this._detectOrientation();
6868
this._mouseInit();
6969
this._calculateNewMax();
70+
this._cleanValues();
7071

7172
this.element
7273
.addClass( "ui-slider" +
@@ -157,6 +158,57 @@ return $.widget( "ui.slider", $.ui.mouse, {
157158
}
158159
},
159160

161+
_cleanValues: function( index, newValue ) {
162+
var values,
163+
i = 0;
164+
165+
if ( this.options.range === true ){
166+
if ( arguments.length === 2 ) {
167+
values = this.options.values;
168+
if ( index === 0 && newValue < this._valueMin() ){
169+
newValue = this._valueMin();
170+
}else if ( index === 1 && newValue > this._valueMax() ){
171+
newValue = this._valueMax();
172+
}
173+
174+
if ( index === 0 && newValue > values[ 1 ] ) {
175+
newValue = values[ 1 ];
176+
}else if ( index === 1 && newValue < values[ 0 ] ) {
177+
newValue = values[ 0 ];
178+
}
179+
return newValue;
180+
}
181+
182+
values = arguments[ 0 ] || this.options.values;
183+
if ( values ) {
184+
for ( ; i < values.length; i++ ) {
185+
if ( values[ i ] < this._valueMin() ) {
186+
values[ i ] = this._valueMin();
187+
}
188+
189+
if ( values[ i ] > this._valueMax() ) {
190+
values[ i ] = this._valueMax();
191+
}
192+
}
193+
if ( values[ 0 ] > values[ 1 ] ) {
194+
values[ 1 ] = values[ 0 ];
195+
}
196+
197+
if ( !arguments.length ){
198+
this.options.values = values;
199+
}
200+
201+
return values;
202+
}
203+
} else {
204+
if ( $.isArray( arguments[ 0 ] ) ) {
205+
return arguments[0];
206+
} else {
207+
return newValue;
208+
}
209+
}
210+
},
211+
160212
_setupEvents: function() {
161213
this._off( this.handles );
162214
this._on( this.handles, this._handleEvents );
@@ -406,6 +458,7 @@ return $.widget( "ui.slider", $.ui.mouse, {
406458

407459
if ( arguments.length > 1 ) {
408460
this.options.values[ index ] = this._trimAlignValue( newValue );
461+
this.options.values[ index ] = this._cleanValues( index, newValue );
409462
this._refreshValue();
410463
this._change( null, index );
411464
return;
@@ -414,7 +467,7 @@ return $.widget( "ui.slider", $.ui.mouse, {
414467
if ( arguments.length ) {
415468
if ( $.isArray( arguments[ 0 ] ) ) {
416469
vals = this.options.values;
417-
newValues = arguments[ 0 ];
470+
newValues = this._cleanValues( arguments[ 0 ] );
418471
for ( i = 0; i < vals.length; i += 1 ) {
419472
vals[ i ] = this._trimAlignValue( newValues[ i ] );
420473
this._change( null, i );

0 commit comments

Comments
 (0)