|
135 | 135 | $module.attr('tabindex', 0);
|
136 | 136 | }
|
137 | 137 | if ($module.find('.inner').length === 0) {
|
138 |
| - $module.append("<div class='inner'>" |
139 |
| - + "<div class='track'></div>" |
140 |
| - + "<div class='track-fill'></div>" |
141 |
| - + "<div class='thumb'></div>" |
| 138 | + $module.append('<div class="inner">' |
| 139 | + + '<div class="track"></div>' |
| 140 | + + '<div class="track-fill"></div>' |
| 141 | + + '<div class="thumb"></div>' |
142 | 142 | + '</div>');
|
143 | 143 | }
|
144 | 144 | precision = module.get.precision();
|
145 | 145 | $thumb = $module.find('.thumb:not(.second)');
|
| 146 | + if (settings.showThumbTooltip) { |
| 147 | + $thumb |
| 148 | + .attr('data-position', settings.tooltipConfig.position) |
| 149 | + .attr('data-variation', settings.tooltipConfig.variation) |
| 150 | + ; |
| 151 | + } |
146 | 152 | $currThumb = $thumb;
|
147 | 153 | if (module.is.range()) {
|
148 | 154 | if ($module.find('.thumb.second').length === 0) {
|
149 |
| - $module.find('.inner').append("<div class='thumb second'></div>"); |
| 155 | + $module.find('.inner').append('<div class="thumb second"></div>'); |
150 | 156 | }
|
151 | 157 | $secondThumb = $module.find('.thumb.second');
|
| 158 | + if (settings.showThumbTooltip) { |
| 159 | + $secondThumb |
| 160 | + .attr('data-position', settings.tooltipConfig.position) |
| 161 | + .attr('data-variation', settings.tooltipConfig.variation) |
| 162 | + ; |
| 163 | + } |
152 | 164 | }
|
153 | 165 | $track = $module.find('.track');
|
154 | 166 | $trackFill = $module.find('.track-fill');
|
|
202 | 214 | for (var i = 0, len = module.get.numLabels(); i <= len; i++) {
|
203 | 215 | var
|
204 | 216 | labelText = module.get.label(i),
|
205 |
| - $label = labelText !== '' |
| 217 | + showLabel = settings.restrictedLabels.length === 0 || settings.restrictedLabels.indexOf(labelText) >= 0, |
| 218 | + $label = labelText !== '' && (showLabel || settings.showLabelTicks === 'always') |
206 | 219 | ? (!(i % module.get.gapRatio())
|
207 |
| - ? $('<li class="label">' + labelText + '</li>') |
| 220 | + ? $('<li class="label">' + (showLabel ? labelText : '') + '</li>') |
208 | 221 | : $('<li class="halftick label"></li>'))
|
209 | 222 | : null,
|
210 | 223 | ratio = i / len
|
|
348 | 361 | ;
|
349 | 362 | $currThumb = initialPosition > newPos ? $thumb : $secondThumb;
|
350 | 363 | }
|
| 364 | + if (module.is.range() && (settings.minRange || settings.maxRange)) { |
| 365 | + var currentRangeDiff = module.get.currentRangeDiff(value), |
| 366 | + isSecondThumb = $currThumb.hasClass('second') |
| 367 | + ; |
| 368 | + if ((settings.minRange && currentRangeDiff < settings.minRange) |
| 369 | + || (settings.maxRange && currentRangeDiff > settings.maxRange) |
| 370 | + || (settings.preventCrossover && !isSecondThumb && value > module.secondThumbVal) |
| 371 | + || (settings.preventCrossover && isSecondThumb && value < module.thumbVal) |
| 372 | + ) { |
| 373 | + return; |
| 374 | + } |
| 375 | + } |
351 | 376 | if (module.get.step() === 0 || module.is.smooth()) {
|
352 | 377 | var
|
353 | 378 | thumbVal = module.thumbVal,
|
|
383 | 408 | return;
|
384 | 409 | }
|
385 | 410 | var value = module.determine.valueFromEvent(event);
|
| 411 | + if (module.is.range() && (settings.minRange || settings.maxRange)) { |
| 412 | + if ($currThumb === undefined) { |
| 413 | + $currThumb = value <= module.get.currentThumbValue() ? $thumb : $secondThumb; |
| 414 | + } |
| 415 | + var currentRangeDiff = module.get.currentRangeDiff(value); |
| 416 | + if (settings.minRange && currentRangeDiff < settings.minRange) { |
| 417 | + value = module.get.edgeValue(value, settings.minRange); |
| 418 | + } else if (settings.maxRange && currentRangeDiff > settings.maxRange) { |
| 419 | + value = module.get.edgeValue(value, settings.maxRange); |
| 420 | + } |
| 421 | + } |
386 | 422 | module.set.value(value);
|
387 | 423 | module.unbind.slidingEvents();
|
388 | 424 | touchIdentifier = undefined;
|
|
503 | 539 |
|
504 | 540 | is: {
|
505 | 541 | range: function () {
|
506 |
| - return $module.hasClass(settings.className.range); |
| 542 | + var isRange = $module.hasClass(className.range); |
| 543 | + if (!isRange && (settings.minRange || settings.maxRange)) { |
| 544 | + $module.addClass(className.range); |
| 545 | + isRange = true; |
| 546 | + } |
| 547 | + |
| 548 | + return isRange; |
507 | 549 | },
|
508 | 550 | hover: function () {
|
509 | 551 | return isHover;
|
|
512 | 554 | return $module.is(':focus');
|
513 | 555 | },
|
514 | 556 | disabled: function () {
|
515 |
| - return $module.hasClass(settings.className.disabled); |
| 557 | + return $module.hasClass(className.disabled); |
516 | 558 | },
|
517 | 559 | labeled: function () {
|
518 |
| - return $module.hasClass(settings.className.labeled); |
| 560 | + var isLabeled = $module.hasClass(className.labeled); |
| 561 | + if (!isLabeled && (settings.restrictedLabels.length > 0 || settings.showLabelTicks !== false)) { |
| 562 | + $module.addClass(className.labeled); |
| 563 | + isLabeled = true; |
| 564 | + } |
| 565 | + |
| 566 | + return isLabeled; |
519 | 567 | },
|
520 | 568 | reversed: function () {
|
521 |
| - return $module.hasClass(settings.className.reversed); |
| 569 | + return $module.hasClass(className.reversed); |
522 | 570 | },
|
523 | 571 | vertical: function () {
|
524 |
| - return $module.hasClass(settings.className.vertical); |
| 572 | + return $module.hasClass(className.vertical); |
525 | 573 | },
|
526 | 574 | smooth: function () {
|
527 |
| - return settings.smooth || $module.hasClass(settings.className.smooth); |
| 575 | + return settings.smooth || $module.hasClass(className.smooth); |
528 | 576 | },
|
529 | 577 | },
|
530 | 578 |
|
531 | 579 | get: {
|
| 580 | + currentRangeDiff: function (value) { |
| 581 | + var currentRangeDiff; |
| 582 | + if ($currThumb.hasClass('second')) { |
| 583 | + currentRangeDiff = module.thumbVal < value |
| 584 | + ? value - module.thumbVal |
| 585 | + : module.thumbVal - value; |
| 586 | + } else { |
| 587 | + currentRangeDiff = module.secondThumbVal > value |
| 588 | + ? module.secondThumbVal - value |
| 589 | + : value - module.secondThumbVal; |
| 590 | + } |
| 591 | + |
| 592 | + return currentRangeDiff; |
| 593 | + }, |
| 594 | + edgeValue: function (value, edgeValue) { |
| 595 | + if ($currThumb.hasClass('second')) { |
| 596 | + value = module.thumbVal < value |
| 597 | + ? module.thumbVal + edgeValue |
| 598 | + : module.thumbVal - edgeValue; |
| 599 | + } else { |
| 600 | + value = module.secondThumbVal < value |
| 601 | + ? module.secondThumbVal + edgeValue |
| 602 | + : module.secondThumbVal - edgeValue; |
| 603 | + } |
| 604 | + |
| 605 | + return value; |
| 606 | + }, |
532 | 607 | trackOffset: function () {
|
533 | 608 | if (module.is.vertical()) {
|
534 | 609 | return $track.offset().top;
|
|
732 | 807 | return thumbDelta <= secondThumbDelta ? thumbPos : secondThumbPos;
|
733 | 808 | },
|
734 | 809 | thumbPos: function ($element) {
|
735 |
| - var |
736 |
| - pos = module.is.vertical() |
737 |
| - ? (module.is.reversed() ? $element.css('bottom') : $element.css('top')) |
738 |
| - : (module.is.reversed() ? $element.css('right') : $element.css('left')) |
| 810 | + return module.is.vertical() |
| 811 | + ? (module.is.reversed() ? $element.css('bottom') : $element.css('top')) |
| 812 | + : (module.is.reversed() ? $element.css('right') : $element.css('left')) |
739 | 813 | ;
|
740 |
| - |
741 |
| - return pos; |
742 | 814 | },
|
743 | 815 | positionFromValue: function (val) {
|
744 | 816 | var
|
|
762 | 834 | position = Math.round(ratio * trackLength),
|
763 | 835 | adjustedPos = step === 0 ? position : Math.round(position / step) * step
|
764 | 836 | ;
|
| 837 | + module.verbose('Determined position: ' + position + ' from ratio: ' + ratio); |
765 | 838 |
|
766 | 839 | return adjustedPos;
|
767 | 840 | },
|
|
985 | 1058 | }
|
986 | 1059 | if (!$currThumb.hasClass('second')) {
|
987 | 1060 | if (settings.preventCrossover && module.is.range()) {
|
988 |
| - newValue = Math.min(module.secondThumbVal, newValue); |
| 1061 | + newValue = Math.min(module.secondThumbVal - (settings.minRange || 0), newValue); |
989 | 1062 | }
|
990 | 1063 | module.thumbVal = newValue;
|
991 | 1064 | } else {
|
992 | 1065 | if (settings.preventCrossover && module.is.range()) {
|
993 |
| - newValue = Math.max(module.thumbVal, newValue); |
| 1066 | + newValue = Math.max(module.thumbVal + (settings.minRange || 0), newValue); |
994 | 1067 | }
|
995 | 1068 | module.secondThumbVal = newValue;
|
996 | 1069 | }
|
|
1009 | 1082 | thumbVal = module.thumbVal || module.get.min(),
|
1010 | 1083 | secondThumbVal = module.secondThumbVal || module.get.min()
|
1011 | 1084 | ;
|
| 1085 | + if (settings.showThumbTooltip) { |
| 1086 | + var precision = module.get.precision(); |
| 1087 | + $targetThumb.attr('data-tooltip', Math.round(newValue * precision) / precision); |
| 1088 | + } |
1012 | 1089 | if (module.is.range()) {
|
1013 | 1090 | if (!$targetThumb.hasClass('second')) {
|
1014 | 1091 | position = newPos;
|
|
1097 | 1174 | settings: function () {
|
1098 | 1175 | if (settings.start !== false) {
|
1099 | 1176 | if (module.is.range()) {
|
| 1177 | + var rangeDiff = settings.end - settings.start; |
| 1178 | + if (rangeDiff < 0 |
| 1179 | + || (settings.minRange && rangeDiff < settings.minRange) |
| 1180 | + || (settings.maxRange && rangeDiff > settings.maxRange) |
| 1181 | + || (settings.minRange && settings.maxRange && settings.minRange > settings.maxRange) |
| 1182 | + ) { |
| 1183 | + module.error(error.invalidRanges, settings.start, settings.end, settings.minRange, settings.maxRange); |
| 1184 | + } |
1100 | 1185 | module.debug('Start position set from settings', settings.start, settings.end);
|
1101 | 1186 | module.set.rangeValue(settings.start, settings.end);
|
1102 | 1187 | } else {
|
|
1289 | 1374 | error: {
|
1290 | 1375 | method: 'The method you called is not defined.',
|
1291 | 1376 | notrange: 'This slider is not a range slider',
|
| 1377 | + invalidRanges: 'Invalid range settings (start/end/minRange/maxRange)', |
1292 | 1378 | },
|
1293 | 1379 |
|
1294 | 1380 | metadata: {
|
|
1301 | 1387 | step: 1,
|
1302 | 1388 | start: 0,
|
1303 | 1389 | end: 20,
|
| 1390 | + minRange: false, |
| 1391 | + maxRange: false, |
1304 | 1392 | labelType: 'number',
|
1305 | 1393 | showLabelTicks: false,
|
1306 | 1394 | smooth: false,
|
|
1337 | 1425 | downArrow: 40,
|
1338 | 1426 | },
|
1339 | 1427 |
|
| 1428 | + restrictedLabels: [], |
| 1429 | + showThumbTooltip: false, |
| 1430 | + tooltipConfig: { |
| 1431 | + position: 'top center', |
| 1432 | + variation: 'tiny black', |
| 1433 | + }, |
| 1434 | + |
1340 | 1435 | labelTypes: {
|
1341 | 1436 | number: 'number',
|
1342 | 1437 | letter: 'letter',
|
|
0 commit comments