Skip to content

Commit 1e20140

Browse files
fix(time-picker): fix time picker pan event #9717 (#9973)
1 parent 5f910f9 commit 1e20140

File tree

3 files changed

+48
-60
lines changed

3 files changed

+48
-60
lines changed

projects/igniteui-angular/src/lib/time-picker/time-picker.component.spec.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ import { IgxToggleDirective } from '../directives/toggle/toggle.directive';
1515
import { PlatformUtil } from '../core/utils';
1616
import { DatePart, IgxDateTimeEditorDirective } from '../directives/date-time-editor/public_api';
1717
import { DateTimeUtil } from '../date-common/util/date-time.util';
18-
import { IgxTimeItemDirective } from './time-picker.directives';
18+
import { IgxItemListDirective, IgxTimeItemDirective } from './time-picker.directives';
1919
import { IgxPickerClearComponent, IgxPickerToggleComponent } from '../date-common/public_api';
2020
import { Subscription } from 'rxjs';
21+
import { HammerGesturesManager } from '../core/touch';
2122

2223
const CSS_CLASS_TIMEPICKER = 'igx-time-picker';
2324
const CSS_CLASS_INPUTGROUP = 'igx-input-group';
@@ -435,6 +436,26 @@ describe('IgxTimePicker', () => {
435436
date.setHours(20);
436437
expect(timePicker.validate(mockFormControl)).toEqual({ maxValue: true });
437438
});
439+
440+
it('should handle panmove event correctly', () => {
441+
const touchManager = new HammerGesturesManager(null, null, new PlatformUtil(1));
442+
const itemListDirective = new IgxItemListDirective(timePicker, elementRef, touchManager);
443+
spyOn(touchManager, 'addEventListener');
444+
445+
itemListDirective.ngOnInit();
446+
expect(touchManager.addEventListener).toHaveBeenCalledTimes(1);
447+
const hammerOptions: HammerOptions = { recognizers: [[Hammer.Pan, { direction: Hammer.DIRECTION_VERTICAL, threshold: 10 }]] };
448+
expect(touchManager.addEventListener).toHaveBeenCalledWith(
449+
elementRef.nativeElement,
450+
'pan',
451+
(itemListDirective as any).onPanMove,
452+
hammerOptions);
453+
454+
spyOn<any>(itemListDirective, 'onPanMove').and.callThrough();
455+
const event = { type: 'pan' };
456+
(itemListDirective as any).onPanMove(event);
457+
expect(itemListDirective['onPanMove']).toHaveBeenCalled();
458+
});
438459
});
439460

440461
describe('Interaction tests', () => {

projects/igniteui-angular/src/lib/time-picker/time-picker.component.ts

-15
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
ViewChild,
1515
ContentChild,
1616
Inject,
17-
Injectable,
1817
AfterViewInit,
1918
Injector,
2019
PipeTransform,
@@ -29,7 +28,6 @@ import {
2928
Validator,
3029
NG_VALIDATORS
3130
} from '@angular/forms';
32-
import { HAMMER_GESTURE_CONFIG, HammerGestureConfig } from '@angular/platform-browser';
3331
import { IgxIconModule } from '../icon/public_api';
3432
import { IgxInputGroupModule, IgxInputGroupComponent } from '../input-group/input-group.component';
3533
import { IgxInputDirective, IgxInputState } from '../directives/input/input.directive';
@@ -65,15 +63,6 @@ import { IgxPickerClearComponent, IgxPickersCommonModule } from '../date-common/
6563
import { TimeFormatPipe, TimeItemPipe } from './time-picker.pipes';
6664

6765
let NEXT_ID = 0;
68-
const ITEMS_COUNT = 7;
69-
70-
@Injectable()
71-
export class TimePickerHammerConfig extends HammerGestureConfig {
72-
public overrides = {
73-
pan: { direction: Hammer.DIRECTION_VERTICAL, threshold: 1 }
74-
};
75-
}
76-
7766
export interface IgxTimePickerValidationFailedEventArgs extends IBaseEventArgs {
7867
previousValue: Date | string;
7968
currentValue: Date | string;
@@ -86,10 +75,6 @@ export interface IgxTimePickerValidationFailedEventArgs extends IBaseEventArgs {
8675
useExisting: IgxTimePickerComponent,
8776
multi: true
8877
},
89-
{
90-
provide: HAMMER_GESTURE_CONFIG,
91-
useClass: TimePickerHammerConfig
92-
},
9378
{
9479
provide: IGX_TIME_PICKER_COMPONENT,
9580
useExisting: IgxTimePickerComponent

projects/igniteui-angular/src/lib/time-picker/time-picker.directives.ts

+26-44
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,20 @@ import {
1111
HostListener,
1212
Inject,
1313
Input,
14+
OnDestroy,
15+
OnInit,
1416
TemplateRef
1517
} from '@angular/core';
18+
import { HammerGesturesManager } from '../core/touch';
1619
import { DateTimeUtil } from '../date-common/util/date-time.util';
1720
import { IgxTimePickerBase, IGX_TIME_PICKER_COMPONENT } from './time-picker.common';
1821

1922
/** @hidden */
2023
@Directive({
21-
selector: '[igxItemList]'
24+
selector: '[igxItemList]',
25+
providers: [HammerGesturesManager]
2226
})
23-
export class IgxItemListDirective {
27+
export class IgxItemListDirective implements OnInit, OnDestroy {
2428
@HostBinding('attr.tabindex')
2529
public tabindex = 0;
2630

@@ -31,7 +35,8 @@ export class IgxItemListDirective {
3135

3236
constructor(
3337
@Inject(IGX_TIME_PICKER_COMPONENT) public timePicker: IgxTimePickerBase,
34-
private elementRef: ElementRef
38+
private elementRef: ElementRef,
39+
private touchManager: HammerGesturesManager
3540
) { }
3641

3742
@HostBinding('class.igx-time-picker__column')
@@ -166,54 +171,31 @@ export class IgxItemListDirective {
166171

167172
const delta = event.deltaY;
168173
if (delta !== 0) {
169-
switch (this.type) {
170-
case 'hourList': {
171-
this.timePicker.nextHour(delta);
172-
break;
173-
}
174-
case 'minuteList': {
175-
this.timePicker.nextMinute(delta);
176-
break;
177-
}
178-
case 'secondsList': {
179-
this.timePicker.nextSeconds(delta);
180-
break;
181-
}
182-
case 'ampmList': {
183-
this.timePicker.nextAmPm(delta);
184-
break;
185-
}
186-
}
174+
this.nextItem(delta);
187175
}
188176
}
189177

190178
/**
191-
* @hidden
179+
* @hidden @internal
180+
*/
181+
public ngOnInit() {
182+
const hammerOptions: HammerOptions = { recognizers: [[Hammer.Pan, { direction: Hammer.DIRECTION_VERTICAL, threshold: 10 }]] };
183+
this.touchManager.addEventListener(this.elementRef.nativeElement, 'pan', this.onPanMove, hammerOptions);
184+
}
185+
186+
/**
187+
* @hidden @internal
192188
*/
193-
@HostListener('panmove', ['$event'])
194-
public onPanMove(event) {
195-
const delta = event.deltaY < 0 ? 1 : event.deltaY > 0 ? -1 : 0;
189+
public ngOnDestroy() {
190+
this.touchManager.destroy();
191+
}
192+
193+
private onPanMove = (event: HammerInput) => {
194+
const delta = event.deltaY < 0 ? -1 : event.deltaY > 0 ? 1 : 0;
196195
if (delta !== 0) {
197-
switch (this.type) {
198-
case 'hourList': {
199-
this.timePicker.nextHour(delta);
200-
break;
201-
}
202-
case 'minuteList': {
203-
this.timePicker.nextMinute(delta);
204-
break;
205-
}
206-
case 'secondsList': {
207-
this.timePicker.nextSeconds(delta);
208-
break;
209-
}
210-
case 'ampmList': {
211-
this.timePicker.nextAmPm(delta);
212-
break;
213-
}
214-
}
196+
this.nextItem(delta);
215197
}
216-
}
198+
};
217199

218200
private nextItem(delta: number): void {
219201
switch (this.type) {

0 commit comments

Comments
 (0)