Skip to content

Commit

Permalink
Range Slider: First attempt at new range widget
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Schmitz committed Nov 26, 2012
1 parent 767a36d commit a2c564f
Show file tree
Hide file tree
Showing 7 changed files with 215 additions and 5 deletions.
79 changes: 79 additions & 0 deletions css/structure/jquery.mobile.forms.range.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
.ui-range{
position:relative;
display:inline-block;
clear:right;
min-height:1em;
width:78%;
}
.ui-range div.ui-slider{
position:absolute;
left:100px;
float:left;
margin-left:3.7em;
box-sizing:border-box;
margin-top:.45em;
max-width:80%;
width:100%;
margin-right:18px;
}
.ui-field-contain .ui-range div.ui-slider{
width:45%;
}
.ui-range div.ui-slider:last-child{
margin-left:.9em;
}
.ui-range.ui-range-split{
margin-left:70px;
}
.ui-range input{
float:left;
margin-right:5px;
}
.ui-range input.ui-range-first{
margin-left:-140px;
}
.ui-range.ui-range-split input.ui-range-first,
.ui-range input.ui-range-last{
margin-left:-70px;
}
.ui-range div.ui-slider:last-child{
position:relative;
left:0px;
}
.ui-field-contain .ui-range input.ui-slider-input{
margin-right:.5em;
}
@media (max-width: 450px){
.ui-range{
width:100%;
}
.ui-field-contain .ui-range div.ui-slider{
width:100%;
left:0;
top:50%;
margin-top:1.05em;
margin-left:1.35em;
}
.ui-field-contain .ui-range div.ui-slider:last-child{
margin-top:.75em;
}
.ui-range{
margin-bottom:8px;
}
}
@media (max-width: 750px){

.content-primary .ui-field-contain .ui-range div.ui-slider{
width:100%;
left:0;
top:50%;
margin-top:1.05em;
margin-left:1.35em;
}
.ui-field-contain .ui-range div.ui-slider:last-child{
margin-top:.75em;
}
.ui-range{
margin-bottom:8px;
}
}
1 change: 1 addition & 0 deletions css/structure/jquery.mobile.structure.css
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
@import url( "jquery.mobile.forms.fieldcontain.css" );
@import url( "jquery.mobile.forms.select.css" );
@import url( "jquery.mobile.forms.textinput.css" );
@import url( "jquery.mobile.forms.range.css" );
@import url( "jquery.mobile.listview.css" );
@import url( "jquery.mobile.forms.slider.css" );
@import url( "jquery.mobile.table.css" );
Expand Down
6 changes: 5 additions & 1 deletion docs/forms/forms-all.html
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,11 @@ <h2>Form elements</h2>
<label for="slider">Slider:</label>
<input type="range" name="slider" id="slider" value="50" min="0" max="100" data-highlight="true" />
</div>

<div data-role="range" data-highlight="true">
<label for="range">Range:</label>
<input type="range" name="range_min" id="range_min" value="0" min="0" max="100"/>
<input type="range" name="range_max" id="range_max" value="100" min="0" max="100"/>
</div>
<div data-role="fieldcontain">
<fieldset data-role="controlgroup">
<legend>Choose as many snacks as you'd like:</legend>
Expand Down
1 change: 1 addition & 0 deletions js/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
'widgets/forms/checkboxradio.js',
'widgets/forms/button.js',
'widgets/forms/slider.js',
'widgets/forms/range.js',
'widgets/forms/textinput.js',
'widgets/forms/select.custom.js',
'widgets/forms/select.js',
Expand Down
1 change: 1 addition & 0 deletions js/jquery.mobile.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ define([
'./widgets/forms/checkboxradio',
'./widgets/forms/button',
'./widgets/forms/slider',
'./widgets/forms/range',
'./widgets/forms/textinput',
'./widgets/forms/select.custom',
'./widgets/forms/select',
Expand Down
117 changes: 117 additions & 0 deletions js/widgets/forms/range.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
//>>description: Slider form widget
//>>label: Slider
//>>group: Forms
//>>css.structure: ../css/structure/jquery.mobile.forms.slider.css
//>>css.theme: ../css/themes/default/jquery.mobile.theme.css

define( [ "jquery", "../../jquery.mobile.core", "../../jquery.mobile.widget", "./textinput", "../../jquery.mobile.buttonMarkup", "./reset" ], function( $ ) {
//>>excludeEnd("jqmBuildExclude");
(function( $, undefined ) {
$.widget( "mobile.range", $.mobile.widget, {
widgetEventPrefix: "range",

options: {
theme: null,
trackTheme: null,
disabled: false,
initSelector: ":jqmData(role='range')",
mini: false,
highlight: true
},

_create: function() {
var inputFirst, inputLast, sliderFirst, sliderLast, sliderLastWidth, sliderFirstWidth, label, wrap,
self = this,
$el = self.element,
o = this.options;

inputFirst = $el.find( "input:first" );
inputLast = $el.find( "input:last" );
inputFirst.addClass( "ui-range-first" );
inputLast.addClass( "ui-range-last" );
label = $el.find( "label" );
$el.wrap( "<div class=\"ui-range-wrap ui-field-contain\" />" );
wrap = $el.closest( ".ui-range-wrap" );
label.prependTo(wrap).addClass( "ui-slider" );
$el.find( "input" ).slider({
theme: o.theme,
trackTheme: o.trackTheme,
disabled: o.disabled,
mini: o.mini,
highlight: o.highlight
}).slider( "refresh" );
$el.addClass( "ui-range" );
sliderFirst = $el.find( ".ui-slider:first" ).addClass( "ui-slider-first" );
sliderLast = $el.find( ".ui-slider:last" ).addClass( "ui-slider-last" );

$.extend( self, {
inputFirst: inputFirst,
inputLast: inputLast,
label: label,
wrap: wrap,
sliderFirst: sliderFirst,
sliderLast: sliderLast,
sliderFirstWidth: sliderFirstWidth,
sliderLastWidth: sliderLastWidth
});

$(function(){
self.sliderFirstWidth = sliderFirst.find( ".ui-slider-bg" ).width();
self.sliderLastWidth = sliderLast.find( ".ui-slider-bg" ).width();
});
self._bindChangeEvents();
self._bindToggle();
},

_bindChangeEvents: function() {
this._on( {
"change input": function( event ){
var min = parseInt( this.inputFirst.val() ),
max = parseInt( this.inputLast.val() ),
first = $(event.target).hasClass("ui-range-first");
if( min > max ) {
$( event.target ).val(first ? max: min).slider("refresh");
}
if(first){
this.sliderFirstWidth = this.sliderFirst.find( ".ui-slider-bg" ).width();
} else {
this.sliderLastWidth = this.sliderLast.find( ".ui-slider-bg" ).width();
}
if( min !== max || !first ) this._updateHighlight();
}
});
},

_bindToggle: function() {
this._on( this.element.find( ".ui-slider-handle" ), {
"vclick": function( event ){
var first = $(event.target).closest( ".ui-slider" ).hasClass( "ui-slider-first" );
this.sliderFirst.css( "z-index", first ? 1 : "" );
}
});
},

_updateHighlight: function() {
var newWidth = this.sliderLastWidth - this.sliderFirstWidth,
tWidth = this.sliderLast.width();
console.log(newWidth);
this.element.find( ".ui-slider-bg" ).css({
"margin-left": parseInt(this.sliderFirstWidth / tWidth * 100) + "%",
"width": parseInt((newWidth) / tWidth * 100) + "%"
});
}

});

$.widget( "mobile.range", $.mobile.range, $.mobile.behaviors.formReset );

//auto self-init widgets
$( document ).bind( "pagecreate create", function( e ) {
$.mobile.range.prototype.enhanceWithin( e.target, true );
});

})( jQuery );
//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
});
//>>excludeEnd("jqmBuildExclude");
15 changes: 11 additions & 4 deletions js/widgets/forms/slider.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ $.widget( "mobile.slider", $.mobile.widget, {
trackTheme: null,
disabled: false,
initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')",
mini: false
mini: false,
highlight: false
},

_create: function() {
Expand Down Expand Up @@ -62,7 +63,7 @@ $.widget( "mobile.slider", $.mobile.widget, {
domSlider = document.createElement( 'div' ),
slider = $( domSlider ),

valuebg = control.jqmData( "highlight" ) && !this.isToggleSwitch ? (function() {
valuebg = this.options.highlight && !this.isToggleSwitch ? (function() {
var bg = document.createElement('div');
bg.className = 'ui-slider-bg ' + $.mobile.activeBtnClass + ' ui-btn-corner-all';
return $( bg ).prependTo( slider );
Expand Down Expand Up @@ -357,10 +358,16 @@ $.widget( "mobile.slider", $.mobile.widget, {
if ( this.options.disabled || this.element.attr('disabled')) {
this.disable();
}

var self = this;
// set the stored value for comparison later
this.value = this._value();

if(this.options.highlight && !this.isToggleSwitch && this.slider.find( ".ui-slider-bg").length == 0){
this.valuebg = (function() {
var bg = document.createElement('div');
bg.className = 'ui-slider-bg ' + $.mobile.activeBtnClass + ' ui-btn-corner-all';
return $( bg ).prependTo( self.slider );
})()
}
var control = this.element, percent,
isInput = !this.isToggleSwitch,
optionElements = isInput ? [] : control.find( "option" ),
Expand Down

0 comments on commit a2c564f

Please sign in to comment.