Skip to content

Commit 2fbdebc

Browse files
author
Adam Bradley
committed
fix(range): Fix range being able to slide when in a side menu, closes #318
1 parent 04b4d77 commit 2fbdebc

File tree

3 files changed

+92
-13
lines changed

3 files changed

+92
-13
lines changed

Diff for: js/ext/angular/src/directive/ionicSideMenu.js

+16-13
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture', 'ionic.service.vie
7979
* @name $ionicSideMenuDelegate#getOpenRatio
8080
* @description Gets the ratio of open amount over menu width. For example, a
8181
* menu of width 100 that is opened by 50 pixels is 50% opened, and would return
82-
* a ratio of 0.5.
82+
* a ratio of 0.5.
8383
*
84-
* @returns {float} 0 if nothing is open, between 0 and 1 if left menu is
84+
* @returns {float} 0 if nothing is open, between 0 and 1 if left menu is
8585
* opened/opening, and between 0 and -1 if right menu is opened/opening.
8686
*/
8787
'getOpenRatio',
@@ -104,7 +104,7 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture', 'ionic.service.vie
104104
* side menus.
105105
* @returns {boolean} Whether the content can be dragged to open side menus.
106106
*/
107-
'canDragContent',
107+
'canDragContent'
108108
/**
109109
* @ngdoc method
110110
* @name $ionicSideMenuDelegate#$getByHandle
@@ -171,8 +171,6 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture', 'ionic.service.vie
171171
return {
172172
restrict: 'ECA',
173173
controller: ['$scope', '$attrs', '$ionicSideMenuDelegate', function($scope, $attrs, $ionicSideMenuDelegate) {
174-
var _this = this;
175-
176174
angular.extend(this, ionic.controllers.SideMenuController.prototype);
177175

178176
ionic.controllers.SideMenuController.call(this, {
@@ -187,6 +185,14 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture', 'ionic.service.vie
187185
return $scope.dragContent;
188186
};
189187

188+
this.isDraggableTarget = function(e) {
189+
return $scope.dragContent &&
190+
(!e.gesture.srcEvent.defaultPrevented &&
191+
!e.target.tagName.match(/input|textarea|select|object|embed/i) &&
192+
!e.target.isContentEditable &&
193+
!(e.target.dataset ? e.target.dataset.preventScroll : e.target.getAttribute('data-prevent-default') == 'true'));
194+
};
195+
190196
$scope.sideMenuContentTranslateX = 0;
191197

192198
var deregisterInstance = $ionicSideMenuDelegate._registerInstance(
@@ -225,6 +231,7 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture', 'ionic.service.vie
225231
*
226232
*/
227233
.directive('ionSideMenuContent', ['$timeout', '$ionicGesture', function($timeout, $ionicGesture) {
234+
228235
return {
229236
restrict: 'EA', //DEPRECATED 'A'
230237
require: '^ionSideMenus',
@@ -256,14 +263,10 @@ angular.module('ionic.ui.sideMenu', ['ionic.service.gesture', 'ionic.service.vie
256263
ionic.on('tap', contentTap, $element[0]);
257264

258265
var dragFn = function(e) {
259-
if($scope.dragContent) {
260-
if(defaultPrevented || e.gesture.srcEvent.defaultPrevented) {
261-
return;
262-
}
263-
isDragging = true;
264-
sideMenuCtrl._handleDrag(e);
265-
e.gesture.srcEvent.preventDefault();
266-
}
266+
if(defaultPrevented || !sideMenuCtrl.isDraggableTarget(e)) return;
267+
isDragging = true;
268+
sideMenuCtrl._handleDrag(e);
269+
e.gesture.srcEvent.preventDefault();
267270
};
268271

269272
var dragVertFn = function(e) {

Diff for: js/ext/angular/test/directive/ionicSideMenu.unit.js

+70
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,76 @@ describe('Ionic Angular Side Menu', function() {
3838
expect(el.controller('ionSideMenus').canDragContent()).toBe(true);
3939
expect(el.scope().dragContent).toBe(true);
4040
}));
41+
42+
it('should isDraggableTarget', inject(function($compile, $rootScope) {
43+
var el = $compile('<ion-side-menus><ion-side-menu-content></ion-side-menu-content></ion-side-menus>')($rootScope.$new());
44+
$rootScope.$apply();
45+
46+
expect(el.controller('ionSideMenus').canDragContent()).toBe(true);
47+
48+
var e = {
49+
gesture: {
50+
srcEvent: {
51+
defaultPrevented: false
52+
}
53+
},
54+
target: {
55+
tagName: 'DIV',
56+
dataset: {
57+
preventScroll: false
58+
}
59+
}
60+
};
61+
62+
var ctrl = el.controller('ionSideMenus');
63+
expect(ctrl.isDraggableTarget(e)).toBe(true);
64+
65+
el.controller('ionSideMenus').canDragContent(false);
66+
expect(ctrl.isDraggableTarget(e)).toBe(false);
67+
el.controller('ionSideMenus').canDragContent(true);
68+
69+
e.gesture.srcEvent.defaultPrevented = true;
70+
expect(ctrl.isDraggableTarget(e)).toBe(false);
71+
e.gesture.srcEvent.defaultPrevented = false;
72+
73+
e.target.tagName = 'INPUT';
74+
expect(ctrl.isDraggableTarget(e)).toBe(false);
75+
76+
e.target.tagName = 'TEXTAREA';
77+
expect(ctrl.isDraggableTarget(e)).toBe(false);
78+
79+
e.target.tagName = 'SELECT';
80+
expect(ctrl.isDraggableTarget(e)).toBe(false);
81+
82+
e.target.tagName = 'OBJECT';
83+
expect(ctrl.isDraggableTarget(e)).toBe(false);
84+
85+
e.target.tagName = 'EMBED';
86+
expect(ctrl.isDraggableTarget(e)).toBe(false);
87+
88+
e.target.tagName = 'DIV';
89+
expect(ctrl.isDraggableTarget(e)).toBe(true);
90+
91+
e.target.isContentEditable = true;
92+
expect(ctrl.isDraggableTarget(e)).toBe(false);
93+
e.target.isContentEditable = false;
94+
95+
e.target.dataset.preventScroll = true
96+
expect(ctrl.isDraggableTarget(e)).toBe(false);
97+
e.target.isContentEditable = false;
98+
99+
e.target.dataset = undefined;
100+
e.target.getAttribute = function(val){
101+
return (val == 'data-prevent-default' ? 'true' : undefined);
102+
}
103+
expect(ctrl.isDraggableTarget(e)).toBe(false);
104+
105+
e.target.getAttribute = function(){
106+
return null;
107+
}
108+
expect(ctrl.isDraggableTarget(e)).toBe(true);
109+
110+
}));
41111
});
42112

43113
describe('Ionic Side Menu Content Directive', function () {

Diff for: js/ext/angular/test/sideMenu2.html

+6
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@
6969
<p>Swipe to the right to reveal the left menu.</p>
7070

7171
<div class="list">
72+
<div class="item item-input range range-positive">
73+
<span class="input-label">Range</span>
74+
5 km
75+
<input type="range" min="5" max="700">
76+
700 km
77+
</div>
7278
<ion-item ion-item="item" ng-href="#" ng-click="itemClick()" ng-repeat="item in range">
7379
<strong>{{$index}}</strong>
7480
<b>:</b>

0 commit comments

Comments
 (0)