Skip to content

Commit 3af8e05

Browse files
authored
Merge pull request #384 from dolezaljan/cancel-handle-movement
Subscribe cancel handle movement
2 parents e6cd2c4 + 1097942 commit 3af8e05

11 files changed

+79
-8
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
* added cancelUserChange input EventEmitter (issue #139)
2+
13
# 18.0.0
24
* add support for Angular 18 (issue #379)
35

src/demo-app/app/app-router.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
LimitedRangeSliderComponent,
1111
LimitedSliderComponent,
1212
NoSwitchingRangeSliderComponent,
13+
PreventChangeOnScrollSliderComponent,
1314
PushRangeSliderComponent,
1415
RangeSliderComponent,
1516
ReactiveFormRangeSliderComponent,
@@ -34,6 +35,7 @@ export const routerConfig: Routes = [
3435
{ path: 'limited-range-slider', component: LimitedRangeSliderComponent },
3536
{ path: 'limited-slider', component: LimitedSliderComponent },
3637
{ path: 'no-switching-range-slider', component: NoSwitchingRangeSliderComponent },
38+
{ path: 'prevent-change-on-scroll-slider', component: PreventChangeOnScrollSliderComponent },
3739
{ path: 'push-range-slider', component: PushRangeSliderComponent },
3840
{ path: 'range-slider', component: RangeSliderComponent },
3941
{ path: 'reactive-form-range-slider', component: ReactiveFormRangeSliderComponent },

src/demo-app/app/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
LogScaleSliderComponent,
3939
ManualRefreshSliderComponent,
4040
NoSwitchingRangeSliderComponent,
41+
PreventChangeOnScrollSliderComponent,
4142
PushRangeSliderComponent,
4243
RangeSliderComponent,
4344
ReactiveFormRangeSliderComponent,
@@ -96,6 +97,7 @@ import { routerConfig, routerOptions } from './app-router.config';
9697
LogScaleSliderComponent,
9798
ManualRefreshSliderComponent,
9899
NoSwitchingRangeSliderComponent,
100+
PreventChangeOnScrollSliderComponent,
99101
PushRangeSliderComponent,
100102
RangeSliderComponent,
101103
ReactiveFormRangeSliderComponent,

src/demo-app/app/demos.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<app-limited-slider></app-limited-slider>
1010
<app-limited-range-slider></app-limited-range-slider>
1111
<app-no-switching-range-slider></app-no-switching-range-slider>
12+
<app-prevent-change-on-scroll-slider></app-prevent-change-on-scroll-slider>
1213
<app-push-range-slider></app-push-range-slider>
1314
<app-selection-bar-slider></app-selection-bar-slider>
1415
<app-selection-bar-at-end-slider></app-selection-bar-at-end-slider>

src/demo-app/app/snippets/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export * from './limited-slider/limited-slider.component';
2525
export * from './log-scale-slider/log-scale-slider.component';
2626
export * from './manual-refresh-slider/manual-refresh-slider.component';
2727
export * from './no-switching-range-slider/no-switching-range-slider.component';
28+
export * from './prevent-change-on-scroll-slider/prevent-change-on-scroll-slider.component';
2829
export * from './push-range-slider/push-range-slider.component';
2930
export * from './range-slider/range-slider.component';
3031
export * from './reactive-form-range-slider/reactive-form-range-slider.component';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
prevent-change-on-scroll-slider
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<p>Value: <input type="number" [(ngModel)]="value"></p>
2+
<ngx-slider [(value)]="value" [options]="options" [cancelUserChange]="emitOnScroll"></ngx-slider>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Prevent change on page scroll using touch gesture
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Component, HostListener, EventEmitter } from '@angular/core';
2+
import { Options } from '@local/ngx-slider';
3+
4+
@Component({
5+
selector: 'app-prevent-change-on-scroll-slider',
6+
templateUrl: './prevent-change-on-scroll-slider.component.html'
7+
})
8+
export class PreventChangeOnScrollSliderComponent {
9+
value: number = 100;
10+
options: Options = {
11+
floor: 0,
12+
ceil: 250
13+
};
14+
emitOnScroll: EventEmitter<void> = new EventEmitter<void>;
15+
16+
@HostListener('window:scroll', ['$event'])
17+
public onScroll(event: any): void {
18+
this.emitOnScroll.emit();
19+
}
20+
}

src/ngx-slider/lib/slider.component.ts

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,18 @@ export class SliderComponent
195195
);
196196
}
197197

198+
private cancelUserChangeSubscription: any;
199+
@Input() set cancelUserChange(cancelUserChange: EventEmitter<void>) {
200+
this.unsubscribeCancelUserChange();
201+
202+
this.cancelUserChangeSubscription = cancelUserChange.subscribe(() => {
203+
if (this.moving) {
204+
this.positionTrackingHandle(this.preStartHandleValue);
205+
this.forceEnd(true);
206+
}
207+
});
208+
}
209+
198210
// Slider type, true means range slider
199211
public get range(): boolean {
200212
return (
@@ -240,6 +252,8 @@ export class SliderComponent
240252
private touchId: number = null;
241253
// Values recorded when first dragging the bar
242254
private dragging: Dragging = new Dragging();
255+
// Value of hanlde at the beginning of onStart()
256+
private preStartHandleValue: number = null;
243257

244258
/* Slider DOM elements */
245259

@@ -575,6 +589,13 @@ export class SliderComponent
575589
}
576590
}
577591

592+
private unsubscribeCancelUserChange(): void {
593+
if (!ValueHelper.isNullOrUndefined(this.cancelUserChangeSubscription)) {
594+
this.cancelUserChangeSubscription.unsubscribe();
595+
this.cancelUserChangeSubscription = null;
596+
}
597+
}
598+
578599
private getPointerElement(pointerType: PointerType): SliderHandleDirective {
579600
if (pointerType === PointerType.Min) {
580601
return this.minHandleElement;
@@ -2165,6 +2186,10 @@ export class SliderComponent
21652186
this.getPointerElement(pointerType);
21662187
pointerElement.active = true;
21672188

2189+
// Store currentTrackingValue as soon as it is available to allow
2190+
// the slide to be canceled. (E.g. on scroll detected.)
2191+
this.preStartHandleValue = this.getCurrentTrackingValue();
2192+
21682193
if (this.viewOptions.keyboardSupport) {
21692194
pointerElement.focus();
21702195
}
@@ -2294,18 +2319,16 @@ export class SliderComponent
22942319
this.positionTrackingHandle(newValue);
22952320
}
22962321

2297-
private onEnd(event: MouseEvent | TouchEvent): void {
2298-
if (CompatibilityHelper.isTouchEvent(event)) {
2299-
const changedTouches: TouchList = (event as TouchEvent).changedTouches;
2300-
if (changedTouches[0].identifier !== this.touchId) {
2301-
return;
2302-
}
2303-
}
2304-
2322+
private forceEnd(disableAnimation: boolean = false): void {
23052323
this.moving = false;
23062324
if (this.viewOptions.animate) {
23072325
this.sliderElementAnimateClass = true;
23082326
}
2327+
if (disableAnimation) {
2328+
this.sliderElementAnimateClass = false;
2329+
// make sure the slider animate class is set according to the viewOptions after forceEnd() with disabled animations finishes
2330+
setTimeout(() => {this.sliderElementAnimateClass = this.viewOptions.animate});
2331+
}
23092332

23102333
this.touchId = null;
23112334

@@ -2322,6 +2345,17 @@ export class SliderComponent
23222345
this.userChangeEnd.emit(this.getChangeContext());
23232346
}
23242347

2348+
private onEnd(event: MouseEvent | TouchEvent): void {
2349+
if (CompatibilityHelper.isTouchEvent(event)) {
2350+
const changedTouches: TouchList = (event as TouchEvent).changedTouches;
2351+
if (changedTouches[0].identifier !== this.touchId) {
2352+
return;
2353+
}
2354+
}
2355+
2356+
this.forceEnd();
2357+
}
2358+
23252359
private onPointerFocus(pointerType: PointerType): void {
23262360
const pointerElement: SliderHandleDirective =
23272361
this.getPointerElement(pointerType);

0 commit comments

Comments
 (0)