Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit 8dc92af

Browse files
lazychinopkozlowski-opensource
authored andcommitted
fix(timepicker): added wheel event to enable mousewheel on Firefox
Closes #669
1 parent b1fa7bb commit 8dc92af

File tree

2 files changed

+98
-6
lines changed

2 files changed

+98
-6
lines changed

src/timepicker/test/timepicker.spec.js

+90
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ describe('timepicker directive', function () {
6464
e.wheelDelta = delta;
6565
return e;
6666
}
67+
68+
function wheelThatOtherMouse(delta) {
69+
var e = $.Event('wheel');
70+
e.deltaY = delta;
71+
return e;
72+
}
6773

6874
it('contains three row & three input elements', function() {
6975
expect(element.find('tr').length).toBe(3);
@@ -304,6 +310,58 @@ describe('timepicker directive', function () {
304310
expect(getModelState()).toEqual([14, 40]);
305311
});
306312

313+
it('responds properly on "wheel" events', function() {
314+
var inputs = element.find('input');
315+
var hoursEl = inputs.eq(0), minutesEl = inputs.eq(1);
316+
var upMouseWheelEvent = wheelThatOtherMouse(-1);
317+
var downMouseWheelEvent = wheelThatOtherMouse(1);
318+
319+
expect(getTimeState()).toEqual(['02', '40', 'PM']);
320+
expect(getModelState()).toEqual([14, 40]);
321+
322+
// UP
323+
hoursEl.trigger( upMouseWheelEvent );
324+
$rootScope.$digest();
325+
expect(getTimeState()).toEqual(['03', '40', 'PM']);
326+
expect(getModelState()).toEqual([15, 40]);
327+
328+
hoursEl.trigger( upMouseWheelEvent );
329+
$rootScope.$digest();
330+
expect(getTimeState()).toEqual(['04', '40', 'PM']);
331+
expect(getModelState()).toEqual([16, 40]);
332+
333+
minutesEl.trigger( upMouseWheelEvent );
334+
$rootScope.$digest();
335+
expect(getTimeState()).toEqual(['04', '41', 'PM']);
336+
expect(getModelState()).toEqual([16, 41]);
337+
338+
minutesEl.trigger( upMouseWheelEvent );
339+
$rootScope.$digest();
340+
expect(getTimeState()).toEqual(['04', '42', 'PM']);
341+
expect(getModelState()).toEqual([16, 42]);
342+
343+
// DOWN
344+
minutesEl.trigger( downMouseWheelEvent );
345+
$rootScope.$digest();
346+
expect(getTimeState()).toEqual(['04', '41', 'PM']);
347+
expect(getModelState()).toEqual([16, 41]);
348+
349+
minutesEl.trigger( downMouseWheelEvent );
350+
$rootScope.$digest();
351+
expect(getTimeState()).toEqual(['04', '40', 'PM']);
352+
expect(getModelState()).toEqual([16, 40]);
353+
354+
hoursEl.trigger( downMouseWheelEvent );
355+
$rootScope.$digest();
356+
expect(getTimeState()).toEqual(['03', '40', 'PM']);
357+
expect(getModelState()).toEqual([15, 40]);
358+
359+
hoursEl.trigger( downMouseWheelEvent );
360+
$rootScope.$digest();
361+
expect(getTimeState()).toEqual(['02', '40', 'PM']);
362+
expect(getModelState()).toEqual([14, 40]);
363+
});
364+
307365
describe('attributes', function () {
308366
beforeEach(function() {
309367
$rootScope.hstep = 2;
@@ -413,6 +471,38 @@ describe('timepicker directive', function () {
413471
expect(getTimeState()).toEqual(['02', '00', 'PM']);
414472
expect(getModelState()).toEqual([14, 0]);
415473
});
474+
475+
it('responds properly on "wheel" events with configurable steps', function() {
476+
var inputs = element.find('input');
477+
var hoursEl = inputs.eq(0), minutesEl = inputs.eq(1);
478+
var upMouseWheelEvent = wheelThatOtherMouse(-1);
479+
var downMouseWheelEvent = wheelThatOtherMouse(1);
480+
481+
expect(getTimeState()).toEqual(['02', '00', 'PM']);
482+
expect(getModelState()).toEqual([14, 0]);
483+
484+
// UP
485+
hoursEl.trigger( upMouseWheelEvent );
486+
$rootScope.$digest();
487+
expect(getTimeState()).toEqual(['04', '00', 'PM']);
488+
expect(getModelState()).toEqual([16, 0]);
489+
490+
minutesEl.trigger( upMouseWheelEvent );
491+
$rootScope.$digest();
492+
expect(getTimeState()).toEqual(['04', '30', 'PM']);
493+
expect(getModelState()).toEqual([16, 30]);
494+
495+
// DOWN
496+
minutesEl.trigger( downMouseWheelEvent );
497+
$rootScope.$digest();
498+
expect(getTimeState()).toEqual(['04', '00', 'PM']);
499+
expect(getModelState()).toEqual([16, 0]);
500+
501+
hoursEl.trigger( downMouseWheelEvent );
502+
$rootScope.$digest();
503+
expect(getTimeState()).toEqual(['02', '00', 'PM']);
504+
expect(getModelState()).toEqual([14, 0]);
505+
});
416506

417507
it('can handle strings as steps', function() {
418508
var upHours = getHoursButton(true);

src/timepicker/timepicker.js

+8-6
Original file line numberDiff line numberDiff line change
@@ -90,20 +90,22 @@ angular.module('ui.bootstrap.timepicker', [])
9090
// Respond on mousewheel spin
9191
var mousewheel = (angular.isDefined(attrs.mousewheel)) ? scope.$eval(attrs.mousewheel) : timepickerConfig.mousewheel;
9292
if ( mousewheel ) {
93-
93+
9494
var isScrollingUp = function(e) {
9595
if (e.originalEvent) {
9696
e = e.originalEvent;
9797
}
98-
return (e.detail || e.wheelDelta > 0);
98+
//pick correct delta variable depending on event
99+
var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY;
100+
return (e.detail || delta > 0);
99101
};
100-
101-
hoursInputEl.bind('mousewheel', function(e) {
102+
103+
hoursInputEl.bind('mousewheel wheel', function(e) {
102104
scope.$apply( (isScrollingUp(e)) ? scope.incrementHours() : scope.decrementHours() );
103105
e.preventDefault();
104106
});
105107

106-
minutesInputEl.bind('mousewheel', function(e) {
108+
minutesInputEl.bind('mousewheel wheel', function(e) {
107109
scope.$apply( (isScrollingUp(e)) ? scope.incrementMinutes() : scope.decrementMinutes() );
108110
e.preventDefault();
109111
});
@@ -212,4 +214,4 @@ angular.module('ui.bootstrap.timepicker', [])
212214
};
213215
}
214216
};
215-
}]);
217+
}]);

0 commit comments

Comments
 (0)