Skip to content

Commit 721bafc

Browse files
committed
fix issue with change event not firing on first keyboard interaction
1 parent 116b049 commit 721bafc

File tree

11 files changed

+578
-152
lines changed

11 files changed

+578
-152
lines changed

dist/range-slider-pips.js

Lines changed: 71 additions & 62 deletions
Large diffs are not rendered by default.

dist/range-slider-pips.mjs

Lines changed: 71 additions & 62 deletions
Large diffs are not rendered by default.

dist/svelte/components/RangeSlider.svelte

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ function moveHandle(index, value2, fireEvent = true) {
337337
function fireChangeEvent(values2) {
338338
const hasChanged = previousValues.some((prev, index) => {
339339
return prev !== values2[index];
340-
});
340+
}) || previousValues.length !== values2.length;
341341
if (hasChanged) {
342342
eChange();
343343
previousValues = [...values2];
@@ -392,20 +392,24 @@ function sliderKeydown(event) {
392392
case "PageUp":
393393
case "ArrowRight":
394394
case "ArrowUp":
395+
setStartAndPreviousValues();
395396
moveHandle(handle, values[handle] + jump);
396397
prevent = true;
397398
break;
398399
case "PageDown":
399400
case "ArrowLeft":
400401
case "ArrowDown":
402+
setStartAndPreviousValues();
401403
moveHandle(handle, values[handle] - jump);
402404
prevent = true;
403405
break;
404406
case "Home":
407+
setStartAndPreviousValues();
405408
moveHandle(handle, min);
406409
prevent = true;
407410
break;
408411
case "End":
412+
setStartAndPreviousValues();
409413
moveHandle(handle, max);
410414
prevent = true;
411415
break;
@@ -416,6 +420,10 @@ function sliderKeydown(event) {
416420
}
417421
}
418422
}
423+
function setStartAndPreviousValues() {
424+
startValues = values.map((v) => constrainAndAlignValue(v, min, max, step, precision, limits));
425+
previousValues = [...startValues];
426+
}
419427
function sliderInteractStart(event) {
420428
if (!disabled) {
421429
const target = event.target;
@@ -436,8 +444,7 @@ function sliderInteractStart(event) {
436444
handleInteract(clientPos);
437445
}
438446
}
439-
startValues = values.map((v) => constrainAndAlignValue(v, min, max, step, precision, limits));
440-
previousValues = [...startValues];
447+
setStartAndPreviousValues();
441448
eStart();
442449
}
443450
}
@@ -519,7 +526,7 @@ function eStop() {
519526
function eChange() {
520527
if (disabled) return;
521528
const startValue = rangeActivated ? startValues : startValues[activeHandle];
522-
const previousValue = typeof previousValues === "undefined" ? startValue : rangeActivated ? previousValues : previousValues[activeHandle];
529+
const previousValue = previousValues.length === 0 ? startValue : rangeActivated ? previousValues : previousValues[activeHandle];
523530
dispatch("change", {
524531
activeHandle,
525532
startValue,

package-lock.json

Lines changed: 17 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "svelte-range-slider-pips",
3-
"version": "4.0.7",
3+
"version": "4.0.8",
44
"description": "Multi-Thumb, Accessible, Beautiful Range Slider with Pips",
55
"repository": {
66
"type": "git",

src/lib/components/RangeSlider.svelte

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -518,9 +518,10 @@
518518
*/
519519
function fireChangeEvent(values: number[]) {
520520
// Check if any value has changed by comparing each element
521-
const hasChanged = previousValues.some((prev, index) => {
522-
return prev !== values[index];
523-
});
521+
const hasChanged =
522+
previousValues.some((prev, index) => {
523+
return prev !== values[index];
524+
}) || previousValues.length !== values.length;
524525
525526
if (hasChanged) {
526527
eChange();
@@ -609,20 +610,24 @@
609610
case 'PageUp':
610611
case 'ArrowRight':
611612
case 'ArrowUp':
613+
setStartAndPreviousValues();
612614
moveHandle(handle, values[handle] + jump);
613615
prevent = true;
614616
break;
615617
case 'PageDown':
616618
case 'ArrowLeft':
617619
case 'ArrowDown':
620+
setStartAndPreviousValues();
618621
moveHandle(handle, values[handle] - jump);
619622
prevent = true;
620623
break;
621624
case 'Home':
625+
setStartAndPreviousValues();
622626
moveHandle(handle, min);
623627
prevent = true;
624628
break;
625629
case 'End':
630+
setStartAndPreviousValues();
626631
moveHandle(handle, max);
627632
prevent = true;
628633
break;
@@ -634,6 +639,14 @@
634639
}
635640
}
636641
642+
/**
643+
* set the start and previous values to the current values when the user interacts with the slider
644+
*/
645+
function setStartAndPreviousValues() {
646+
startValues = values.map((v) => constrainAndAlignValue(v, min, max, step, precision, limits));
647+
previousValues = [...startValues];
648+
}
649+
637650
/**
638651
* function to run when the user touches
639652
* down on the slider element anywhere
@@ -663,9 +676,7 @@
663676
handleInteract(clientPos);
664677
}
665678
}
666-
// fire the start event
667-
startValues = values.map((v) => constrainAndAlignValue(v, min, max, step, precision, limits));
668-
previousValues = [...startValues];
679+
setStartAndPreviousValues();
669680
eStart();
670681
}
671682
}
@@ -791,11 +802,7 @@
791802
if (disabled) return;
792803
const startValue = rangeActivated ? startValues : startValues[activeHandle];
793804
const previousValue =
794-
typeof previousValues === 'undefined'
795-
? startValue
796-
: rangeActivated
797-
? previousValues
798-
: previousValues[activeHandle];
805+
previousValues.length === 0 ? startValue : rangeActivated ? previousValues : previousValues[activeHandle];
799806
dispatch('change', {
800807
activeHandle,
801808
startValue,

src/routes/test/nav/test-nav.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
}
3030
]
3131
},
32+
{
33+
"name": "keyboard",
34+
"path": "/test/range-slider/keyboard"
35+
},
3236
{
3337
"name": "limits",
3438
"path": "/test/range-slider/limits"
@@ -121,7 +125,7 @@
121125
},
122126
{
123127
"name": "spring",
124-
"path": "/test/range-slider/spring",
128+
"path": "",
125129
"children": [
126130
{
127131
"name": "configurations",
@@ -130,10 +134,6 @@
130134
{
131135
"name": "dynamic",
132136
"path": "/test/range-slider/spring/dynamic"
133-
},
134-
{
135-
"name": "edge-cases",
136-
"path": "/test/range-slider/spring/edge-cases"
137137
}
138138
]
139139
},

src/routes/test/range-slider/events/+page.svelte

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,20 @@
2020
function handleStart(event: CustomEvent) {
2121
events.push({ type: 'start', detail: event.detail });
2222
events = [...events];
23-
lastEvent = { type: 'start', detail: event.detail };
2423
}
2524
2625
function handleStop(event: CustomEvent) {
2726
events.push({ type: 'stop', detail: event.detail });
2827
events = [...events];
29-
lastEvent = { type: 'stop', detail: event.detail };
3028
}
3129
3230
function handleChange(event: CustomEvent) {
3331
events.push({ type: 'change', detail: event.detail });
3432
events = [...events];
35-
lastEvent = { type: 'change', detail: event.detail };
3633
}
3734
35+
$: lastEvent = events[events.length - 1];
36+
3837
// Test scenarios
3938
function clearTestScenario() {
4039
events = [];

0 commit comments

Comments
 (0)