From 92ad160d56049b8f69ae575b6a105bd38a0b1f1e Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 18:11:54 +0200 Subject: [PATCH 01/40] Improvements --- ionic.contrib.drawer.js | 60 ++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index b2f5815..b0bcff0 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -20,12 +20,17 @@ angular.module('ionic.contrib.drawer', ['ionic']) // How far from edge before triggering var edgeX = 40; - var LEFT = 0; - var RIGHT = 1; + var SIDE_LEFT = 'left'; + var SIDE_RIGHT = 'right'; + var STATE_CLOSE = 'close'; + var STATE_OPEN = 'open'; var isTargetDrag = false; var width = $element[0].clientWidth; + + // Current State of Drawer + var drawerState = STATE_CLOSE; var enableAnimation = function() { $element.addClass('animate'); @@ -35,12 +40,12 @@ angular.module('ionic.contrib.drawer', ['ionic']) }; // Check if this is on target or not - var isTarget = function(el) { - while(el) { - if(el === $element[0]) { + var isTarget = function(targetEl) { + while(targetEl) { + if(targetEl === el]) { return true; } - el = el.parentNode; + targetEl = targetEl.parentNode; } }; @@ -79,11 +84,14 @@ angular.module('ionic.contrib.drawer', ['ionic']) enableAnimation(); ionic.requestAnimationFrame(function() { + var translateX = 0; if(newX < (-width / 2)) { - el.style.transform = el.style.webkitTransform = 'translate3d(' + -width + 'px, 0, 0)'; + translateX = -width; + drawerState = STATE_CLOSE; } else { - el.style.transform = el.style.webkitTransform = 'translate3d(0px, 0, 0)'; + drawerState = STATE_OPEN; } + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; }); }; @@ -112,9 +120,8 @@ angular.module('ionic.contrib.drawer', ['ionic']) console.log(lastX, offsetX, lastX - offsetX); newX = Math.min(0, (-width + (lastX - offsetX))); ionic.requestAnimationFrame(function() { - el.style.transform = el.style.webkitTransform = 'translate3d(' + newX + 'px, 0, 0)'; - }); - + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)'; + }); } if(dragging) { @@ -122,38 +129,31 @@ angular.module('ionic.contrib.drawer', ['ionic']) } }; - side = $attr.side == 'left' ? LEFT : RIGHT; + side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; console.log(side); - $ionicGesture.on('drag', function(e) { - doDrag(e); - }, $document); - $ionicGesture.on('dragend', function(e) { - doEndDrag(e); - }, $document); - - + $ionicGesture.on('drag', doDrag, $document); + $ionicGesture.on('dragend', doEndDrag, $document); + this.close = function() { + var translateX = side === SIDE_LEFT ? '-100' : '100'; + enableAnimation(); ionic.requestAnimationFrame(function() { - if(side === LEFT) { - el.style.transform = el.style.webkitTransform = 'translate3d(-100%, 0, 0)'; - } else { - el.style.transform = el.style.webkitTransform = 'translate3d(100%, 0, 0)'; - } + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; }); }; this.open = function() { enableAnimation(); ionic.requestAnimationFrame(function() { - if(side === LEFT) { - el.style.transform = el.style.webkitTransform = 'translate3d(0%, 0, 0)'; - } else { - el.style.transform = el.style.webkitTransform = 'translate3d(0%, 0, 0)'; - } + el.style[ionic.CSS.TRANSFORM] = 'translate3d(0%, 0, 0)'; }); }; + + this.isOpen = function() { + return (drawerState === STATE_OPEN); + }; }]) .directive('drawer', ['$rootScope', '$ionicGesture', function($rootScope, $ionicGesture) { From 6007fcbab3e6c5b5023e513aad7a7c9a3617487f Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 18:15:16 +0200 Subject: [PATCH 02/40] Add toggleDrawer method --- ionic.contrib.drawer.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index b0bcff0..35b2c6f 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -162,14 +162,24 @@ angular.module('ionic.contrib.drawer', ['ionic']) controller: 'drawerCtrl', link: function($scope, $element, $attr, ctrl) { $element.addClass($attr.side); + $scope.openDrawer = function() { console.log('open'); ctrl.open(); }; + $scope.closeDrawer = function() { console.log('close'); ctrl.close(); }; + + $scope.toggleDrawer = function() { + if (ctrl.isOpen()) { + ctrl.close(); + } else { + ctrl.open(); + } + }; } } }]); From 40541b71d3cc6e47b7ee9b9dc9417361e9749a9b Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 18:18:45 +0200 Subject: [PATCH 03/40] Fix drawerState update --- ionic.contrib.drawer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 35b2c6f..e7a0d03 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -139,6 +139,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) var translateX = side === SIDE_LEFT ? '-100' : '100'; enableAnimation(); + drawerState = STATE_CLOSE; ionic.requestAnimationFrame(function() { el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; }); @@ -146,6 +147,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) this.open = function() { enableAnimation(); + drawerState = STATE_OPEN; ionic.requestAnimationFrame(function() { el.style[ionic.CSS.TRANSFORM] = 'translate3d(0%, 0, 0)'; }); From c2288226d0a3aaec96067d6785694111404211cc Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 18:25:28 +0200 Subject: [PATCH 04/40] Cleanup code --- ionic.contrib.drawer.js | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index e7a0d03..a6e73c2 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -13,7 +13,6 @@ angular.module('ionic.contrib.drawer', ['ionic']) var el = $element[0]; var dragging = false; var startX, lastX, offsetX, newX; - var side; // How far to drag before triggering var thresholdX = 15; @@ -27,7 +26,8 @@ angular.module('ionic.contrib.drawer', ['ionic']) var isTargetDrag = false; - var width = $element[0].clientWidth; + var side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; + var width = el.clientWidth; // Current State of Drawer var drawerState = STATE_CLOSE; @@ -35,14 +35,15 @@ angular.module('ionic.contrib.drawer', ['ionic']) var enableAnimation = function() { $element.addClass('animate'); }; + var disableAnimation = function() { $element.removeClass('animate'); }; // Check if this is on target or not var isTarget = function(targetEl) { - while(targetEl) { - if(targetEl === el]) { + while (targetEl) { + if (targetEl === el]) { return true; } targetEl = targetEl.parentNode; @@ -74,7 +75,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) offsetX = null; isTargetDrag = false; - if(!dragging) { + if (!dragging) { return; } @@ -85,32 +86,33 @@ angular.module('ionic.contrib.drawer', ['ionic']) ionic.requestAnimationFrame(function() { var translateX = 0; - if(newX < (-width / 2)) { + + if (newX < (-width / 2)) { translateX = -width; drawerState = STATE_CLOSE; } else { drawerState = STATE_OPEN; } + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; }); }; var doDrag = function(e) { - if(e.defaultPrevented) { + if (e.defaultPrevented) { return; } - if(!lastX) { + if (!lastX) { startX = e.gesture.touches[0].pageX; } lastX = e.gesture.touches[0].pageX; - if(!dragging) { - + if (!dragging) { // Dragged 15 pixels and finger is by edge - if(Math.abs(lastX - startX) > thresholdX) { - if(isTarget(e.target)) { + if (Math.abs(lastX - startX) > thresholdX) { + if (isTarget(e.target)) { startTargetDrag(e); } else if(startX < edgeX) { startDrag(e); @@ -124,24 +126,19 @@ angular.module('ionic.contrib.drawer', ['ionic']) }); } - if(dragging) { + if (dragging) { e.gesture.srcEvent.preventDefault(); } }; - side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; - console.log(side); - $ionicGesture.on('drag', doDrag, $document); $ionicGesture.on('dragend', doEndDrag, $document); this.close = function() { - var translateX = side === SIDE_LEFT ? '-100' : '100'; - enableAnimation(); drawerState = STATE_CLOSE; ionic.requestAnimationFrame(function() { - el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; }); }; @@ -149,7 +146,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) enableAnimation(); drawerState = STATE_OPEN; ionic.requestAnimationFrame(function() { - el.style[ionic.CSS.TRANSFORM] = 'translate3d(0%, 0, 0)'; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, 0, 0)'; }); }; From 8f47a8617c7e5a68e4b2bdfc88c535f689223b96 Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 18:38:36 +0200 Subject: [PATCH 05/40] Add drawer overlay --- ionic.contrib.drawer.js | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index a6e73c2..b585ccc 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -31,13 +31,32 @@ angular.module('ionic.contrib.drawer', ['ionic']) // Current State of Drawer var drawerState = STATE_CLOSE; + + // Drawer overlay + var $overlay = angular.element('
'); + var overlayEl = $overlay[0]; + var overlayState = STATE_CLOSE; + + $element.parent().prepend(this.overlayElement); + + var toggleOverlay = function(state) { + if (overlayState !== state) { + ionic.requestAnimationFrame(function() { + var translateX = state === STATE_CLOSE ? '0' : '-100'; + overlayEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; + }); + overlayState = state; + } + }; var enableAnimation = function() { $element.addClass('animate'); + $overlay.addClass('animate'); }; var disableAnimation = function() { $element.removeClass('animate'); + $overlay.removeClass('animate'); }; // Check if this is on target or not @@ -86,14 +105,17 @@ angular.module('ionic.contrib.drawer', ['ionic']) ionic.requestAnimationFrame(function() { var translateX = 0; + var opacity = 0; if (newX < (-width / 2)) { translateX = -width; drawerState = STATE_CLOSE; } else { + opacity = 1; drawerState = STATE_OPEN; } + overlayEl.style.opacity = opacity; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; }); }; @@ -121,7 +143,15 @@ angular.module('ionic.contrib.drawer', ['ionic']) } else { console.log(lastX, offsetX, lastX - offsetX); newX = Math.min(0, (-width + (lastX - offsetX))); + + var opacity = 1 + (this.newX / this.width); + + if (opacity < 0) { + opacity = 0; + } + ionic.requestAnimationFrame(function() { + overlayEl.style.opacity = opacity; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)'; }); } @@ -133,19 +163,24 @@ angular.module('ionic.contrib.drawer', ['ionic']) $ionicGesture.on('drag', doDrag, $document); $ionicGesture.on('dragend', doEndDrag, $document); + $overlay.on('click', this.close); this.close = function() { - enableAnimation(); drawerState = STATE_CLOSE; + enableAnimation(); + toggleOverlay(STATE_CLOSE); ionic.requestAnimationFrame(function() { + overlayEl.style.opacity = 0; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; }); }; this.open = function() { - enableAnimation(); drawerState = STATE_OPEN; + enableAnimation(); + toggleOverlay(STATE_OPEN); ionic.requestAnimationFrame(function() { + overlayEl.style.opacity = 1; el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, 0, 0)'; }); }; From 235d3e43eac81f70ab72fc96eb496312928ffd02 Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 18:44:18 +0200 Subject: [PATCH 06/40] Add drawer-overlay styles --- ionic.contrib.drawer.css | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ionic.contrib.drawer.css b/ionic.contrib.drawer.css index 37a450c..1401a34 100644 --- a/ionic.contrib.drawer.css +++ b/ionic.contrib.drawer.css @@ -17,6 +17,7 @@ drawer.left { transform: translate3d(-100%, 0, 0); box-shadow: 1px 0px 10px rgba(0,0,0,0.3); } + drawer.right { right: 0; top: 0; @@ -24,3 +25,21 @@ drawer.right { transform: translate3d(100%, 0, 0); box-shadow: -1px 0px 10px rgba(0,0,0,0.3); } + +.drawer-overlay { + background-color: rgba(0, 0, 0, 0.6); + opacity: 0; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 99; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} + +.drawer-overlay.animate { + -webkit-transition: 0.4s opacity ease-in-out; + transition: 0.4s opacity ease-in-out; +} From fc231b8f243292a6655132956b81768fbdeb3e1f Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 18:48:19 +0200 Subject: [PATCH 07/40] Optimise drawer transition --- ionic.contrib.drawer.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ionic.contrib.drawer.css b/ionic.contrib.drawer.css index 1401a34..635c2c4 100644 --- a/ionic.contrib.drawer.css +++ b/ionic.contrib.drawer.css @@ -8,8 +8,8 @@ drawer { } drawer.animate { - -webkit-transition: 0.4s all ease-in-out; - transition: 0.4s all ease-in-out; + -webkit-transition: -webkit-transform 0.4s ease-in-out; + transition: transform 0.4s ease-in-out; } drawer.left { From 2c133c6c34ce25284ac369851a138bc86be4cb24 Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 18:50:38 +0200 Subject: [PATCH 08/40] Fix drag when drawer is opened --- ionic.contrib.drawer.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index b585ccc..1621827 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -144,6 +144,16 @@ angular.module('ionic.contrib.drawer', ['ionic']) console.log(lastX, offsetX, lastX - offsetX); newX = Math.min(0, (-width + (lastX - offsetX))); + if (drawerState === STATE_OPEN) { + if (lastX > startX) { + return; + } + } else { + if (lastX < startX) { + return; + } + } + var opacity = 1 + (this.newX / this.width); if (opacity < 0) { From fb73dd6cf9cccfa77af6dac8f756ad266fb6ad4d Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 18:56:57 +0200 Subject: [PATCH 09/40] HardwareBackButton support --- ionic.contrib.drawer.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 1621827..bff37f5 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -9,7 +9,7 @@ */ angular.module('ionic.contrib.drawer', ['ionic']) -.controller('drawerCtrl', ['$element', '$attrs', '$ionicGesture', '$document', function($element, $attr, $ionicGesture, $document) { +.controller('drawerCtrl', ['$element', '$attrs', '$ionicGesture', '$document', '$ionicPlatform', function($element, $attr, $ionicGesture, $document, $ionicPlatform) { var el = $element[0]; var dragging = false; var startX, lastX, offsetX, newX; @@ -29,6 +29,9 @@ angular.module('ionic.contrib.drawer', ['ionic']) var side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; var width = el.clientWidth; + // Handle back button + var unregisterBackAction; + // Current State of Drawer var drawerState = STATE_CLOSE; @@ -170,6 +173,10 @@ angular.module('ionic.contrib.drawer', ['ionic']) e.gesture.srcEvent.preventDefault(); } }; + + var hardwareBackCallback = function() { + this.close(); + }.bind(this); $ionicGesture.on('drag', doDrag, $document); $ionicGesture.on('dragend', doEndDrag, $document); @@ -183,6 +190,10 @@ angular.module('ionic.contrib.drawer', ['ionic']) overlayEl.style.opacity = 0; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; }); + + if (unregisterBackAction) { + unregisterBackAction(); + } }; this.open = function() { @@ -193,6 +204,8 @@ angular.module('ionic.contrib.drawer', ['ionic']) overlayEl.style.opacity = 1; el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, 0, 0)'; }); + + unregisterBackAction = $ionicPlatform.registerBackButtonAction(hardwareBackCallback, 100); }; this.isOpen = function() { From e6878e5801c1867f0f278a92e6cf5a27b9de44bd Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 19:00:23 +0200 Subject: [PATCH 10/40] remove semi-colon from "drawer" directive --- ionic.contrib.drawer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index bff37f5..17b948a 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -239,7 +239,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) }; } } -}]); +}]) .directive('drawerClose', ['$rootScope', function($rootScope) { return { From 55dd45a30d8e93de1dd34c959e2235194b90466c Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 20:11:02 +0200 Subject: [PATCH 11/40] Remove bracket from "isTarget" method --- ionic.contrib.drawer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 17b948a..68728e6 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -65,7 +65,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) // Check if this is on target or not var isTarget = function(targetEl) { while (targetEl) { - if (targetEl === el]) { + if (targetEl === el) { return true; } targetEl = targetEl.parentNode; From abb17d84d1869b403f2d541978e95221b06f341f Mon Sep 17 00:00:00 2001 From: Vitaly Rotari Date: Thu, 19 Feb 2015 20:16:35 +0200 Subject: [PATCH 12/40] Improve dragging --- ionic.contrib.drawer.js | 46 +++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 68728e6..1622d8a 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -12,7 +12,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) .controller('drawerCtrl', ['$element', '$attrs', '$ionicGesture', '$document', '$ionicPlatform', function($element, $attr, $ionicGesture, $document, $ionicPlatform) { var el = $element[0]; var dragging = false; - var startX, lastX, offsetX, newX; + var startX, lastX, offsetX, newX, startY, lastY, startDir; // How far to drag before triggering var thresholdX = 15; @@ -92,9 +92,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) }; var doEndDrag = function(e) { - startX = null; - lastX = null; - offsetX = null; + startX = lastX = offsetX = startY = lastY = startDir = null; isTargetDrag = false; if (!dragging) { @@ -127,12 +125,38 @@ angular.module('ionic.contrib.drawer', ['ionic']) if (e.defaultPrevented) { return; } + + var finger = e.gesture.touches[0]; + var dir = e.gesture.direction; if (!lastX) { - startX = e.gesture.touches[0].pageX; + startX = finger.pageX; + } + + if (!lastY) { + startY = finger.pageY; + } + + if (!startDir) { + startDir = dir; } - lastX = e.gesture.touches[0].pageX; + lastX = finger.pageX; + lastY = finger.pageY; + + if (Math.abs(lastY - startY) > thresholdX && (startDir === 'down' || startDir === 'up')) { + return; + } + + if (drawerState === STATE_OPEN) { + if (dir === SIDE_RIGHT) { + return; + } + } else { + if (dir === SIDE_LEFT) { + return; + } + } if (!dragging) { // Dragged 15 pixels and finger is by edge @@ -147,16 +171,6 @@ angular.module('ionic.contrib.drawer', ['ionic']) console.log(lastX, offsetX, lastX - offsetX); newX = Math.min(0, (-width + (lastX - offsetX))); - if (drawerState === STATE_OPEN) { - if (lastX > startX) { - return; - } - } else { - if (lastX < startX) { - return; - } - } - var opacity = 1 + (this.newX / this.width); if (opacity < 0) { From 34b485c8be9bc2303d2994f7100001afc248d39b Mon Sep 17 00:00:00 2001 From: Vitalie Rotari Date: Fri, 20 Feb 2015 10:09:01 +0200 Subject: [PATCH 13/40] Fix demo --- index.html | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/index.html b/index.html index 0382143..c0c1271 100644 --- a/index.html +++ b/index.html @@ -4,15 +4,10 @@ Ionic Seed App - - - - + - - - + - - +

Menu

From 24814dd2350a3cb8dd891aefe3971fe8a65dba6f Mon Sep 17 00:00:00 2001 From: Vitalie Rotari Date: Fri, 20 Feb 2015 12:01:59 +0200 Subject: [PATCH 20/40] Fix drawer overlay --- ionic.contrib.drawer.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 1aa9a8d..af35b0c 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -40,12 +40,12 @@ angular.module('ionic.contrib.drawer', ['ionic']) var overlayEl = $overlay[0]; var overlayState = STATE_CLOSE; - $element.parent().prepend(this.overlayElement); + $element.parent().prepend(overlayEl); var toggleOverlay = function(state) { if (overlayState !== state) { ionic.requestAnimationFrame(function() { - var translateX = state === STATE_CLOSE ? '0' : '-100'; + var translateX = state === STATE_CLOSE ? '-100' : '0'; overlayEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; }); overlayState = state; @@ -78,12 +78,15 @@ angular.module('ionic.contrib.drawer', ['ionic']) var startDrag = function(e) { disableAnimation(); + toggleOverlay(STATE_OPEN); + dragging = true; offsetX = lastX - startX; }; var startTargetDrag = function(e) { disableAnimation(); + toggleOverlay(STATE_OPEN); dragging = true; isTargetDrag = true; @@ -113,6 +116,8 @@ angular.module('ionic.contrib.drawer', ['ionic']) drawerState = STATE_OPEN; } + toggleOverlay(drawerState); + ionic.requestAnimationFrame(function() { overlayEl.style.opacity = opacity; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; @@ -177,7 +182,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) newX = Math.min(0, (-width + (lastX - offsetX))); - var opacity = 1 + (this.newX / this.width); + var opacity = 1 + (newX / width); if (opacity < 0) { opacity = 0; @@ -197,15 +202,12 @@ angular.module('ionic.contrib.drawer', ['ionic']) var hardwareBackCallback = function() { this.close(); }.bind(this); - - $ionicGesture.on('drag', doDrag, $document); - $ionicGesture.on('dragend', doEndDrag, $document); - $overlay.on('click', this.close); this.close = function() { drawerState = STATE_CLOSE; enableAnimation(); toggleOverlay(STATE_CLOSE); + ionic.requestAnimationFrame(function() { overlayEl.style.opacity = 0; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; @@ -229,6 +231,10 @@ angular.module('ionic.contrib.drawer', ['ionic']) }; this.isOpen = isOpen; + + $ionicGesture.on('drag', doDrag, $document); + $ionicGesture.on('dragend', doEndDrag, $document); + $overlay.on('click', this.close); }]) .directive('drawer', ['$rootScope', '$ionicGesture', function($rootScope, $ionicGesture) { From 9d95d671b62ab565aec6e372df88d0ff7d87f7c5 Mon Sep 17 00:00:00 2001 From: bace135 Date: Thu, 30 Apr 2015 21:24:16 -0700 Subject: [PATCH 21/40] update drawer to work on right side --- ionic.contrib.drawer.js | 109 +++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 40 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index af35b0c..80c42ae 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -12,7 +12,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) .controller('drawerCtrl', ['$element', '$attrs', '$ionicGesture', '$document', '$ionicPlatform', function($element, $attr, $ionicGesture, $document, $ionicPlatform) { var el = $element[0]; var dragging = false; - var startX, lastX, offsetX, newX, startDir; + var startX, lastX, offsetX, newX; // How far to drag before triggering var thresholdX = 15; @@ -28,6 +28,8 @@ angular.module('ionic.contrib.drawer', ['ionic']) var side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; var width = el.clientWidth; + var docWidth = $document[0].body.clientWidth; + console.log(docWidth) // Handle back button var unregisterBackAction; @@ -94,7 +96,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) }; var doEndDrag = function(e) { - startX = lastX = offsetX = startDir = null; + startX = lastX = offsetX = null; isTargetDrag = false; if (!dragging) { @@ -108,12 +110,22 @@ angular.module('ionic.contrib.drawer', ['ionic']) var translateX = 0; var opacity = 0; - if (newX < (-width / 2)) { - translateX = -width; - drawerState = STATE_CLOSE; - } else { - opacity = 1; - drawerState = STATE_OPEN; + if (side === SIDE_RIGHT){ + if (newX > width / 2) { + translateX = width; + drawerState = STATE_CLOSE; + } else { + opacity = 1; + drawerState = STATE_OPEN; + } + } else if (side === SIDE_LEFT){ + if (newX < (-width / 2)) { + translateX = -width; + drawerState = STATE_CLOSE; + } else { + opacity = 1; + drawerState = STATE_OPEN; + } } toggleOverlay(drawerState); @@ -136,53 +148,82 @@ angular.module('ionic.contrib.drawer', ['ionic']) startX = finger.pageX; } - if (!startDir) { - startDir = dir; - } - lastX = finger.pageX; - if (startDir === 'down' || startDir === 'up') { + if (dir === 'down' || dir === 'up') { return; } if (!dragging) { + //here at just the beginning of drag // Dragged 15 pixels and finger is by edge if (Math.abs(lastX - startX) > thresholdX) { - if (isOpen()) { - if (dir === SIDE_RIGHT) { - return; + if (side === SIDE_LEFT){ + if (isOpen()) { + if (dir === SIDE_RIGHT) { + return; + } + } else { + if (dir === SIDE_LEFT) { + return; + } } - } else { - if (dir === SIDE_LEFT) { - return; + } else if (side === SIDE_RIGHT){ + if (isOpen()) { + if (dir === SIDE_LEFT) { + return; + } + } else { + if (dir === SIDE_RIGHT) { + return; + } } } if (isTarget(e.target)) { startTargetDrag(e); - } else if(startX < edgeX) { + } else if(startX < edgeX || startX > docWidth-edgeX) { startDrag(e); } } } else { + //here when we are dragging e.gesture.srcEvent.stopImmediatePropagation(); + // if fast gesture if (e.gesture.deltaTime < 200) { - if (isOpen()) { - if (dir === SIDE_LEFT) { - return newX = -width; + if (side === SIDE_LEFT){ + if (isOpen()) { + if (dir === SIDE_LEFT) { + return newX = -width; + } + } else { + if (dir === SIDE_RIGHT) { + return newX = 0; + } } - } else { - if (dir === SIDE_RIGHT) { - return newX = 0; + } else if (side === SIDE_RIGHT){ + if (isOpen()) { + if (dir === SIDE_RIGHT) { + return newX = width; + } + } else { + if (dir === SIDE_LEFT) { + return newX = 0; + } } } } - newX = Math.min(0, (-width + (lastX - offsetX))); + if (side === SIDE_LEFT){ + newX = Math.min(0, (-width + (lastX - offsetX))); + var opacity = 1 + (newX / width); + } + else if (side === SIDE_RIGHT){ + newX = Math.max(0, (width - (docWidth - lastX + offsetX))); + var opacity = 1 - (newX / width); + } - var opacity = 1 + (newX / width); if (opacity < 0) { opacity = 0; @@ -261,18 +302,6 @@ angular.module('ionic.contrib.drawer', ['ionic']) }; } } -}]) - -.directive('drawerClose', ['$rootScope', function($rootScope) { - return { - restrict: 'A', - link: function($scope, $element) { - $element.bind('click', function() { - var drawerCtrl = $element.inheritedData('$drawerController'); - drawerCtrl.close(); - }); - } - } }]); })(); From 007337dcdb15e938d100c704458caa3e64ac0958 Mon Sep 17 00:00:00 2001 From: bace135 Date: Thu, 30 Apr 2015 23:21:28 -0700 Subject: [PATCH 22/40] updated README.md --- README.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/README.md b/README.md index e28bdb6..a18a9dc 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,59 @@ ionic-contrib-drawer ==================== A side menu drawer for Ionic apps + +#####Setting up: + +Clone the ionic-ion-drawer repo into the lib folder in your ionic project so it looks like: + +*yourProjectName/www/lib/ionic-ion-drawer* + +Add the ionic-contrib-drawer.js and ionic-contrib-drawer.css files to your index file + + + + +Add ionic.contrib.drawer to your Angular app: + + angular.module('App', [ + 'ionic', + 'ionic.contrib.drawer' + ]) + +#####Usage: + + Add the `` directive to your ionic templates or index.html files. + +#####Example: + + + +
+

Example

+
+
+ + +

Menu

+ + + Friends + Favorites + Search + +
+
+
+ + + +Change the 'side' attribute of the `` to either "right" or "left" to switch the side the drawer opens from. + +#####Credits: + +driftyco: https://github.com/driftyco (original build) + +vitalyrotari: https://github.com/vitalyrotari (bug fixes, improved performance, background fading +transition) + +brybott: https://github.com/brybott (right side functionality) From ad58e77e00939fa24e7346a40a56f63358af6b83 Mon Sep 17 00:00:00 2001 From: bace135 Date: Fri, 1 May 2015 22:50:41 -0700 Subject: [PATCH 23/40] fixed closing from wrong side of screen --- ionic.contrib.drawer.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 80c42ae..8c3c975 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -182,7 +182,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) if (isTarget(e.target)) { startTargetDrag(e); - } else if(startX < edgeX || startX > docWidth-edgeX) { + } else if((startX < edgeX && side === SIDE_LEFT) || (startX > docWidth-edgeX && side === SIDE_RIGHT)) { startDrag(e); } } @@ -218,8 +218,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) if (side === SIDE_LEFT){ newX = Math.min(0, (-width + (lastX - offsetX))); var opacity = 1 + (newX / width); - } - else if (side === SIDE_RIGHT){ + } else if (side === SIDE_RIGHT){ newX = Math.max(0, (width - (docWidth - lastX + offsetX))); var opacity = 1 - (newX / width); } From 91e154d788996a3888528038514bb1aa2b74ee37 Mon Sep 17 00:00:00 2001 From: Russell Cheung Date: Tue, 4 Aug 2015 17:58:58 +0800 Subject: [PATCH 24/40] Slide content with menu on drag. --- ionic.contrib.drawer.css | 2 +- ionic.contrib.drawer.js | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ionic.contrib.drawer.css b/ionic.contrib.drawer.css index 635c2c4..f9aafa2 100644 --- a/ionic.contrib.drawer.css +++ b/ionic.contrib.drawer.css @@ -7,7 +7,7 @@ drawer { background: #ffffff; } -drawer.animate { +drawer.animate, .menu-animated { -webkit-transition: -webkit-transform 0.4s ease-in-out; transition: transform 0.4s ease-in-out; } diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 8c3c975..2e3d427 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -29,7 +29,6 @@ angular.module('ionic.contrib.drawer', ['ionic']) var side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; var width = el.clientWidth; var docWidth = $document[0].body.clientWidth; - console.log(docWidth) // Handle back button var unregisterBackAction; @@ -41,6 +40,10 @@ angular.module('ionic.contrib.drawer', ['ionic']) var $overlay = angular.element('
'); var overlayEl = $overlay[0]; var overlayState = STATE_CLOSE; + + // Content container + var $content = $element.parent().find('ion-side-menu-content'); + var contentEl = $content[0]; $element.parent().prepend(overlayEl); @@ -57,11 +60,13 @@ angular.module('ionic.contrib.drawer', ['ionic']) var enableAnimation = function() { $element.addClass('animate'); $overlay.addClass('animate'); + $content.addClass('animate menu-animated'); }; var disableAnimation = function() { $element.removeClass('animate'); $overlay.removeClass('animate'); + $content.removeClass('animate menu-animated'); }; // Check if this is on target or not @@ -133,6 +138,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) ionic.requestAnimationFrame(function() { overlayEl.style.opacity = opacity; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (translateX - width) + 'px, 0, 0)'; }); }; @@ -231,6 +237,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) ionic.requestAnimationFrame(function() { overlayEl.style.opacity = opacity; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (newX - width) + 'px, 0, 0)'; }); } @@ -251,6 +258,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) ionic.requestAnimationFrame(function() { overlayEl.style.opacity = 0; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(0%, 0, 0)'; }); if (unregisterBackAction) { From 0ef1e97074df41950ddb7fd4a336a1315de3f063 Mon Sep 17 00:00:00 2001 From: Russell Cheung Date: Wed, 5 Aug 2015 11:19:41 +0800 Subject: [PATCH 25/40] Custom content directive (no more quirkiness from ionSideMenuContent) --- ionic.contrib.drawer.js | 63 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 2e3d427..6cc76ab 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -42,7 +42,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) var overlayState = STATE_CLOSE; // Content container - var $content = $element.parent().find('ion-side-menu-content'); + var $content = $element.parent().find('drawer-content'); var contentEl = $content[0]; $element.parent().prepend(overlayEl); @@ -273,6 +273,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) ionic.requestAnimationFrame(function() { overlayEl.style.opacity = 1; el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + -width + 'px, 0, 0)'; }); unregisterBackAction = $ionicPlatform.registerBackButtonAction(hardwareBackCallback, 100); @@ -309,6 +310,64 @@ angular.module('ionic.contrib.drawer', ['ionic']) }; } } -}]); +}]) + +.directive('drawerContent', [function() { + return { + restrict: 'E', + require: '^ionSideMenus', + scope: true, + compile: function(element, attr) { + element.addClass('menu-content pane'); + + return { pre: prelink }; + function prelink($scope, $element, $attr, sideMenuCtrl) { + var content = { + element: element[0], + getTranslateX: function() { + return $scope.sideMenuContentTranslateX || 0; + } + }; + + sideMenuCtrl.setContent(content); + + // Cleanup + $scope.$on('$destroy', function() { + if (content) { + content.element = null; + content = null; + } + }); + } + } + }; +}]) + +.directive('drawerClose', ['$ionicHistory', function($ionicHistory) { + return { + restrict: 'A', + link: function($scope, $element, $attr, ctrl) { + $element.bind('click', function() { + $ionicHistory.nextViewOptions({ + disableAnimate: true, + disableBack: true + }); + $scope.closeDrawer(); + }); + } + } +}]) + +.directive('drawerToggle', [function() { + return { + restrict: 'A', + link: function($scope, $element, $attr, ctrl) { + $element.bind('click', function() { + $scope.toggleDrawer(); + }); + } + } +}]) +; })(); From 3fe49654c00d5d3666460ff929de8680346dfc61 Mon Sep 17 00:00:00 2001 From: Russell Cheung Date: Wed, 5 Aug 2015 11:20:43 +0800 Subject: [PATCH 26/40] Check if menu can be dragged (from $ionicSideMenuDelegate) before drag --- ionic.contrib.drawer.js | 499 +++++++++++++++++++++------------------- 1 file changed, 263 insertions(+), 236 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 6cc76ab..950a9a5 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -9,282 +9,309 @@ */ angular.module('ionic.contrib.drawer', ['ionic']) -.controller('drawerCtrl', ['$element', '$attrs', '$ionicGesture', '$document', '$ionicPlatform', function($element, $attr, $ionicGesture, $document, $ionicPlatform) { - var el = $element[0]; - var dragging = false; - var startX, lastX, offsetX, newX; - - // How far to drag before triggering - var thresholdX = 15; - // How far from edge before triggering - var edgeX = 40; - - var SIDE_LEFT = 'left'; - var SIDE_RIGHT = 'right'; - var STATE_CLOSE = 'close'; - var STATE_OPEN = 'open'; - - var isTargetDrag = false; - - var side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; - var width = el.clientWidth; - var docWidth = $document[0].body.clientWidth; - - // Handle back button - var unregisterBackAction; - - // Current State of Drawer - var drawerState = STATE_CLOSE; - - // Drawer overlay - var $overlay = angular.element('
'); - var overlayEl = $overlay[0]; - var overlayState = STATE_CLOSE; - - // Content container - var $content = $element.parent().find('drawer-content'); - var contentEl = $content[0]; - - $element.parent().prepend(overlayEl); - - var toggleOverlay = function(state) { - if (overlayState !== state) { - ionic.requestAnimationFrame(function() { - var translateX = state === STATE_CLOSE ? '-100' : '0'; - overlayEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; - }); - overlayState = state; - } - }; +.controller('drawerCtrl', [ + '$element', + '$attrs', + '$ionicGesture', + '$ionicSideMenuDelegate', + '$document', + '$ionicPlatform', + function( + $element, + $attr, + $ionicGesture, + $ionicSideMenuDelegate, + $document, + $ionicPlatform + ) { + var el = $element[0]; + var dragging = false; + var startX, lastX, offsetX, newX; + + // How far to drag before triggering + var thresholdX = 15; + // How far from edge before triggering + var edgeX = 40; + + var SIDE_LEFT = 'left'; + var SIDE_RIGHT = 'right'; + var STATE_CLOSE = 'close'; + var STATE_OPEN = 'open'; + + var isTargetDrag = false; + + var side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; + var width = el.clientWidth; + var docWidth = $document[0].body.clientWidth; + + // Handle back button + var unregisterBackAction; + + // Current State of Drawer + var drawerState = STATE_CLOSE; + + // Drawer overlay + var $overlay = angular.element('
'); + var overlayEl = $overlay[0]; + var overlayState = STATE_CLOSE; + + // Content container + var $content = $element.parent().find('drawer-content'); + var contentEl = $content[0]; + + $element.parent().prepend(overlayEl); + + var toggleOverlay = function(state) { + if (overlayState !== state) { + ionic.requestAnimationFrame(function() { + var translateX = state === STATE_CLOSE ? '-100' : '0'; + overlayEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; + }); + overlayState = state; + } + }; - var enableAnimation = function() { - $element.addClass('animate'); - $overlay.addClass('animate'); - $content.addClass('animate menu-animated'); - }; - - var disableAnimation = function() { - $element.removeClass('animate'); - $overlay.removeClass('animate'); - $content.removeClass('animate menu-animated'); - }; + var enableAnimation = function() { + $element.addClass('animate'); + $overlay.addClass('animate'); + $content.addClass('animate menu-animated'); + }; + + var disableAnimation = function() { + $element.removeClass('animate'); + $overlay.removeClass('animate'); + $content.removeClass('animate menu-animated'); + }; + + // Check if this is on target or not + var isTarget = function(targetEl) { + while (targetEl) { + if (targetEl === el) { + return true; + } + targetEl = targetEl.parentNode; + } + }; - // Check if this is on target or not - var isTarget = function(targetEl) { - while (targetEl) { - if (targetEl === el) { - return true; + var isOpen = function() { + return drawerState === STATE_OPEN; + }; + + var startDrag = function(e) { + if (!$ionicSideMenuDelegate.canDragContent()) { + return; } - targetEl = targetEl.parentNode; - } - }; - var isOpen = function() { - return drawerState === STATE_OPEN; - }; + disableAnimation(); + toggleOverlay(STATE_OPEN); - var startDrag = function(e) { - disableAnimation(); - toggleOverlay(STATE_OPEN); + dragging = true; + offsetX = lastX - startX; + }; - dragging = true; - offsetX = lastX - startX; - }; + var startTargetDrag = function(e) { + if (!$ionicSideMenuDelegate.canDragContent()) { + return; + } - var startTargetDrag = function(e) { - disableAnimation(); - toggleOverlay(STATE_OPEN); + disableAnimation(); + toggleOverlay(STATE_OPEN); - dragging = true; - isTargetDrag = true; - offsetX = lastX - startX; - }; + dragging = true; + isTargetDrag = true; + offsetX = lastX - startX; + }; - var doEndDrag = function(e) { - startX = lastX = offsetX = null; - isTargetDrag = false; + var doEndDrag = function(e) { + if (!$ionicSideMenuDelegate.canDragContent()) { + return; + } - if (!dragging) { - return; - } + startX = lastX = offsetX = null; + isTargetDrag = false; - dragging = false; + if (!dragging) { + return; + } - enableAnimation(); + dragging = false; - var translateX = 0; - var opacity = 0; - - if (side === SIDE_RIGHT){ - if (newX > width / 2) { - translateX = width; - drawerState = STATE_CLOSE; - } else { - opacity = 1; - drawerState = STATE_OPEN; - } - } else if (side === SIDE_LEFT){ - if (newX < (-width / 2)) { - translateX = -width; - drawerState = STATE_CLOSE; - } else { - opacity = 1; - drawerState = STATE_OPEN; + enableAnimation(); + + var translateX = 0; + var opacity = 0; + + if (side === SIDE_RIGHT){ + if (newX > width / 2) { + translateX = width; + drawerState = STATE_CLOSE; + } else { + opacity = 1; + drawerState = STATE_OPEN; + } + } else if (side === SIDE_LEFT){ + if (newX < (-width / 2)) { + translateX = -width; + drawerState = STATE_CLOSE; + } else { + opacity = 1; + drawerState = STATE_OPEN; + } } - } - toggleOverlay(drawerState); + toggleOverlay(drawerState); - ionic.requestAnimationFrame(function() { - overlayEl.style.opacity = opacity; - el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (translateX - width) + 'px, 0, 0)'; - }); - }; + ionic.requestAnimationFrame(function() { + overlayEl.style.opacity = opacity; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (translateX - width) + 'px, 0, 0)'; + }); + }; - var doDrag = function(e) { - if (e.defaultPrevented) { - return; - } - - var finger = e.gesture.touches[0]; - var dir = e.gesture.direction; + var doDrag = function(e) { + if (e.defaultPrevented || !$ionicSideMenuDelegate.canDragContent()) { + return; + } + + var finger = e.gesture.touches[0]; + var dir = e.gesture.direction; - if (!lastX) { - startX = finger.pageX; - } + if (!lastX) { + startX = finger.pageX; + } - lastX = finger.pageX; - - if (dir === 'down' || dir === 'up') { - return; - } + lastX = finger.pageX; + + if (dir === 'down' || dir === 'up') { + return; + } - if (!dragging) { - //here at just the beginning of drag - // Dragged 15 pixels and finger is by edge - if (Math.abs(lastX - startX) > thresholdX) { - if (side === SIDE_LEFT){ - if (isOpen()) { - if (dir === SIDE_RIGHT) { - return; + if (!dragging) { + //here at just the beginning of drag + // Dragged 15 pixels and finger is by edge + if (Math.abs(lastX - startX) > thresholdX) { + if (side === SIDE_LEFT){ + if (isOpen()) { + if (dir === SIDE_RIGHT) { + return; + } + } else { + if (dir === SIDE_LEFT) { + return; + } } - } else { - if (dir === SIDE_LEFT) { - return; + } else if (side === SIDE_RIGHT){ + if (isOpen()) { + if (dir === SIDE_LEFT) { + return; + } + } else { + if (dir === SIDE_RIGHT) { + return; + } } } - } else if (side === SIDE_RIGHT){ - if (isOpen()) { - if (dir === SIDE_LEFT) { - return; + + if (isTarget(e.target)) { + startTargetDrag(e); + } else if((startX < edgeX && side === SIDE_LEFT) || (startX > docWidth-edgeX && side === SIDE_RIGHT)) { + startDrag(e); + } + } + } else { + //here when we are dragging + e.gesture.srcEvent.stopImmediatePropagation(); + + // if fast gesture + if (e.gesture.deltaTime < 200) { + if (side === SIDE_LEFT){ + if (isOpen()) { + if (dir === SIDE_LEFT) { + return newX = -width; + } + } else { + if (dir === SIDE_RIGHT) { + return newX = 0; + } } - } else { - if (dir === SIDE_RIGHT) { - return; + } else if (side === SIDE_RIGHT){ + if (isOpen()) { + if (dir === SIDE_RIGHT) { + return newX = width; + } + } else { + if (dir === SIDE_LEFT) { + return newX = 0; + } } } } - if (isTarget(e.target)) { - startTargetDrag(e); - } else if((startX < edgeX && side === SIDE_LEFT) || (startX > docWidth-edgeX && side === SIDE_RIGHT)) { - startDrag(e); - } - } - } else { - //here when we are dragging - e.gesture.srcEvent.stopImmediatePropagation(); - - // if fast gesture - if (e.gesture.deltaTime < 200) { if (side === SIDE_LEFT){ - if (isOpen()) { - if (dir === SIDE_LEFT) { - return newX = -width; - } - } else { - if (dir === SIDE_RIGHT) { - return newX = 0; - } - } + newX = Math.min(0, (-width + (lastX - offsetX))); + var opacity = 1 + (newX / width); } else if (side === SIDE_RIGHT){ - if (isOpen()) { - if (dir === SIDE_RIGHT) { - return newX = width; - } - } else { - if (dir === SIDE_LEFT) { - return newX = 0; - } - } + newX = Math.max(0, (width - (docWidth - lastX + offsetX))); + var opacity = 1 - (newX / width); + } + + + if (opacity < 0) { + opacity = 0; } + + ionic.requestAnimationFrame(function() { + overlayEl.style.opacity = opacity; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (newX - width) + 'px, 0, 0)'; + }); } - if (side === SIDE_LEFT){ - newX = Math.min(0, (-width + (lastX - offsetX))); - var opacity = 1 + (newX / width); - } else if (side === SIDE_RIGHT){ - newX = Math.max(0, (width - (docWidth - lastX + offsetX))); - var opacity = 1 - (newX / width); + if (dragging) { + e.gesture.srcEvent.preventDefault(); } + }; + + var hardwareBackCallback = function() { + this.close(); + }.bind(this); + + this.close = function() { + drawerState = STATE_CLOSE; + enableAnimation(); + toggleOverlay(STATE_CLOSE); + ionic.requestAnimationFrame(function() { + overlayEl.style.opacity = 0; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(0%, 0, 0)'; + }); - if (opacity < 0) { - opacity = 0; + if (unregisterBackAction) { + unregisterBackAction(); } - - ionic.requestAnimationFrame(function() { - overlayEl.style.opacity = opacity; - el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (newX - width) + 'px, 0, 0)'; - }); - } + }; - if (dragging) { - e.gesture.srcEvent.preventDefault(); - } - }; - - var hardwareBackCallback = function() { - this.close(); - }.bind(this); - - this.close = function() { - drawerState = STATE_CLOSE; - enableAnimation(); - toggleOverlay(STATE_CLOSE); - - ionic.requestAnimationFrame(function() { - overlayEl.style.opacity = 0; - el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(0%, 0, 0)'; - }); - - if (unregisterBackAction) { - unregisterBackAction(); - } - }; - - this.open = function() { - drawerState = STATE_OPEN; - enableAnimation(); - toggleOverlay(STATE_OPEN); - ionic.requestAnimationFrame(function() { - overlayEl.style.opacity = 1; - el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + -width + 'px, 0, 0)'; - }); + this.open = function() { + drawerState = STATE_OPEN; + enableAnimation(); + toggleOverlay(STATE_OPEN); + ionic.requestAnimationFrame(function() { + overlayEl.style.opacity = 1; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + -width + 'px, 0, 0)'; + }); + + unregisterBackAction = $ionicPlatform.registerBackButtonAction(hardwareBackCallback, 100); + }; - unregisterBackAction = $ionicPlatform.registerBackButtonAction(hardwareBackCallback, 100); - }; - - this.isOpen = isOpen; + this.isOpen = isOpen; - $ionicGesture.on('drag', doDrag, $document); - $ionicGesture.on('dragend', doEndDrag, $document); - $overlay.on('click', this.close); -}]) + $ionicGesture.on('drag', doDrag, $document); + $ionicGesture.on('dragend', doEndDrag, $document); + $overlay.on('click', this.close); + } +]) .directive('drawer', ['$rootScope', '$ionicGesture', function($rootScope, $ionicGesture) { return { From b6bfd823887c06e7e2cb5ebc30f4250e3ca86b33 Mon Sep 17 00:00:00 2001 From: Russell Cheung Date: Wed, 5 Aug 2015 11:32:05 +0800 Subject: [PATCH 27/40] Allow overlay animation to run on drawer close --- ionic.contrib.drawer.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 950a9a5..7a1f972 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -15,6 +15,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) '$ionicGesture', '$ionicSideMenuDelegate', '$document', + '$timeout', '$ionicPlatform', function( $element, @@ -22,6 +23,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) $ionicGesture, $ionicSideMenuDelegate, $document, + $timeout, $ionicPlatform ) { var el = $element[0]; @@ -63,10 +65,13 @@ angular.module('ionic.contrib.drawer', ['ionic']) var toggleOverlay = function(state) { if (overlayState !== state) { - ionic.requestAnimationFrame(function() { - var translateX = state === STATE_CLOSE ? '-100' : '0'; - overlayEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; - }); + var timeToRemove = state == STATE_CLOSE ? 400 : 0; + $timeout(function() { + ionic.requestAnimationFrame(function() { + var translateX = state === STATE_CLOSE ? '-100' : '0'; + overlayEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; + }); + }, timeToRemove) overlayState = state; } }; From 03afb8cb91d1b3f896f455844b6da5e9af35a9d4 Mon Sep 17 00:00:00 2001 From: Russell Cheung Date: Wed, 5 Aug 2015 11:47:10 +0800 Subject: [PATCH 28/40] Compute content offset correctly when menu is on the left --- ionic.contrib.drawer.js | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 7a1f972..6f42d79 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -65,7 +65,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) var toggleOverlay = function(state) { if (overlayState !== state) { - var timeToRemove = state == STATE_CLOSE ? 400 : 0; + var timeToRemove = state === STATE_CLOSE ? 400 : 0; $timeout(function() { ionic.requestAnimationFrame(function() { var translateX = state === STATE_CLOSE ? '-100' : '0'; @@ -166,10 +166,13 @@ angular.module('ionic.contrib.drawer', ['ionic']) toggleOverlay(drawerState); + var contentOffsetX = side === SIDE_RIGHT ? + translateX - width : + width + translateX; ionic.requestAnimationFrame(function() { overlayEl.style.opacity = opacity; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (translateX - width) + 'px, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + contentOffsetX + 'px, 0, 0)'; }); }; @@ -260,15 +263,19 @@ angular.module('ionic.contrib.drawer', ['ionic']) var opacity = 1 - (newX / width); } - + if (opacity < 0) { opacity = 0; + return; } - + + var contentOffsetX = side === SIDE_RIGHT ? + newX - width : + width + newX; ionic.requestAnimationFrame(function() { overlayEl.style.opacity = opacity; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (newX - width) + 'px, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + contentOffsetX + 'px, 0, 0)'; }); } @@ -301,10 +308,13 @@ angular.module('ionic.contrib.drawer', ['ionic']) drawerState = STATE_OPEN; enableAnimation(); toggleOverlay(STATE_OPEN); + + var contentOffsetX = side === SIDE_LEFT ? width : -width; + ionic.requestAnimationFrame(function() { overlayEl.style.opacity = 1; el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + -width + 'px, 0, 0)'; + contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + contentOffsetX + 'px, 0, 0)'; }); unregisterBackAction = $ionicPlatform.registerBackButtonAction(hardwareBackCallback, 100); From 5bba4acef2754b829a61e6d02b45f6f3d0a58fb8 Mon Sep 17 00:00:00 2001 From: Russell Cheung Date: Wed, 5 Aug 2015 14:58:48 +0800 Subject: [PATCH 29/40] Handle box shadow better. Fix Android menu toggle performance. --- ionic.contrib.drawer.css | 4 ++++ ionic.contrib.drawer.js | 26 ++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/ionic.contrib.drawer.css b/ionic.contrib.drawer.css index f9aafa2..d737d95 100644 --- a/ionic.contrib.drawer.css +++ b/ionic.contrib.drawer.css @@ -26,6 +26,10 @@ drawer.right { box-shadow: -1px 0px 10px rgba(0,0,0,0.3); } +.drawer.closed { + box-shadow: none; +} + .drawer-overlay { background-color: rgba(0, 0, 0, 0.6); opacity: 0; diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 6f42d79..153cb73 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -31,9 +31,9 @@ angular.module('ionic.contrib.drawer', ['ionic']) var startX, lastX, offsetX, newX; // How far to drag before triggering - var thresholdX = 15; + var thresholdX = 7; // How far from edge before triggering - var edgeX = 40; + var edgeX = 60; var SIDE_LEFT = 'left'; var SIDE_RIGHT = 'right'; @@ -65,11 +65,23 @@ angular.module('ionic.contrib.drawer', ['ionic']) var toggleOverlay = function(state) { if (overlayState !== state) { - var timeToRemove = state === STATE_CLOSE ? 400 : 0; + var timeToRemove = state === STATE_CLOSE ? 300 : 0; + + if (state === STATE_OPEN) { + $element + .removeClass('closed') + .addClass('opened'); + } + $timeout(function() { ionic.requestAnimationFrame(function() { var translateX = state === STATE_CLOSE ? '-100' : '0'; overlayEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; + if (state === STATE_CLOSE) { + $element + .removeClass('opened') + .addClass('closed'); + } }); }, timeToRemove) overlayState = state; @@ -173,6 +185,9 @@ angular.module('ionic.contrib.drawer', ['ionic']) overlayEl.style.opacity = opacity; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + contentOffsetX + 'px, 0, 0)'; + $element + .removeClass('opened closed') + .addClass(drawerState === STATE_OPEN ? 'opened' : 'closed'); }); }; @@ -276,6 +291,9 @@ angular.module('ionic.contrib.drawer', ['ionic']) overlayEl.style.opacity = opacity; el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)'; contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + contentOffsetX + 'px, 0, 0)'; + $element + .removeClass('closed') + .addClass('opened'); }); } @@ -333,7 +351,7 @@ angular.module('ionic.contrib.drawer', ['ionic']) restrict: 'E', controller: 'drawerCtrl', link: function($scope, $element, $attr, ctrl) { - $element.addClass($attr.side); + $element.addClass($attr.side + ' closed'); $scope.openDrawer = function() { ctrl.open(); From 05e85a22335a6b728aba58ab0c13d3799470b8be Mon Sep 17 00:00:00 2001 From: Russell Cheung Date: Mon, 10 Aug 2015 15:18:49 +0800 Subject: [PATCH 30/40] Remove drag hotspot logic (allow drag to open from any point on screen) --- ionic.contrib.drawer.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 153cb73..b05ff9f 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -235,11 +235,11 @@ angular.module('ionic.contrib.drawer', ['ionic']) } } - if (isTarget(e.target)) { - startTargetDrag(e); - } else if((startX < edgeX && side === SIDE_LEFT) || (startX > docWidth-edgeX && side === SIDE_RIGHT)) { + // if (isTarget(e.target)) { + // startTargetDrag(e); + // } else if((startX < edgeX && side === SIDE_LEFT) || (startX > docWidth-edgeX && side === SIDE_RIGHT)) { startDrag(e); - } + // } } } else { //here when we are dragging From 1c388caedb621538ee47ac4434eaebeb81f44d4f Mon Sep 17 00:00:00 2001 From: Lukas Klizas Date: Wed, 9 Sep 2015 01:48:33 +0300 Subject: [PATCH 31/40] Performance improvements --- ionic.contrib.drawer.css | 2 +- ionic.contrib.drawer.js | 774 ++++++++++++++++++--------------------- 2 files changed, 348 insertions(+), 428 deletions(-) diff --git a/ionic.contrib.drawer.css b/ionic.contrib.drawer.css index d737d95..f805e4a 100644 --- a/ionic.contrib.drawer.css +++ b/ionic.contrib.drawer.css @@ -26,7 +26,7 @@ drawer.right { box-shadow: -1px 0px 10px rgba(0,0,0,0.3); } -.drawer.closed { +drawer.closed { box-shadow: none; } diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index b05ff9f..45ca7fd 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -1,433 +1,353 @@ -(function() { - -'use strict'; - -/** - * The ionic-contrib-frosted-glass is a fun frosted-glass effect - * that can be used in iOS apps to give an iOS 7 frosted-glass effect - * to any element. - */ -angular.module('ionic.contrib.drawer', ['ionic']) - -.controller('drawerCtrl', [ - '$element', - '$attrs', - '$ionicGesture', - '$ionicSideMenuDelegate', - '$document', - '$timeout', - '$ionicPlatform', - function( - $element, - $attr, - $ionicGesture, - $ionicSideMenuDelegate, - $document, - $timeout, - $ionicPlatform - ) { - var el = $element[0]; - var dragging = false; - var startX, lastX, offsetX, newX; - - // How far to drag before triggering - var thresholdX = 7; - // How far from edge before triggering - var edgeX = 60; - - var SIDE_LEFT = 'left'; - var SIDE_RIGHT = 'right'; - var STATE_CLOSE = 'close'; - var STATE_OPEN = 'open'; - - var isTargetDrag = false; - - var side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; - var width = el.clientWidth; - var docWidth = $document[0].body.clientWidth; - - // Handle back button - var unregisterBackAction; - - // Current State of Drawer - var drawerState = STATE_CLOSE; - - // Drawer overlay - var $overlay = angular.element('
'); - var overlayEl = $overlay[0]; - var overlayState = STATE_CLOSE; - - // Content container - var $content = $element.parent().find('drawer-content'); - var contentEl = $content[0]; - - $element.parent().prepend(overlayEl); - - var toggleOverlay = function(state) { - if (overlayState !== state) { - var timeToRemove = state === STATE_CLOSE ? 300 : 0; - - if (state === STATE_OPEN) { - $element - .removeClass('closed') - .addClass('opened'); - } - - $timeout(function() { - ionic.requestAnimationFrame(function() { - var translateX = state === STATE_CLOSE ? '-100' : '0'; - overlayEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; - if (state === STATE_CLOSE) { - $element - .removeClass('opened') - .addClass('closed'); +(function () { + + 'use strict'; + + /** + * The ionic-contrib-frosted-glass is a fun frosted-glass effect + * that can be used in iOS apps to give an iOS 7 frosted-glass effect + * to any element. + */ + angular.module('ionic.contrib.drawer', ['ionic']) + + .controller('drawerCtrl', [ + '$element', + '$attrs', + '$ionicGesture', + '$ionicSideMenuDelegate', + '$document', + '$timeout', + '$ionicPlatform', + function ($element, + $attr, + $ionicGesture, + $ionicSideMenuDelegate, + $document, + $timeout, + $ionicPlatform) { + var el = $element[0]; + var dragging = false; + var startX, lastX, offsetX, newX; + + // How far to drag before triggering + var thresholdX = 7; + + var SIDE_LEFT = 'left'; + var SIDE_RIGHT = 'right'; + var STATE_CLOSE = 'close'; + var STATE_OPEN = 'open'; + + var isTargetDrag = false; + + var side = $attr.side === SIDE_LEFT ? SIDE_LEFT : SIDE_RIGHT; + var width = el.clientWidth; + var docWidth = $document[0].body.clientWidth; + + // Handle back button + var unregisterBackAction; + + // Current State of Drawer + var drawerState = STATE_CLOSE; + + // Drawer overlay + var $overlay = angular.element('
'); + var overlayEl = $overlay[0]; + var overlayState = STATE_CLOSE; + + $element.parent().prepend(overlayEl); + + var toggleOverlay = function (state) { + if (overlayState !== state) { + var timeToRemove = state === STATE_CLOSE ? 400 : 0; + + if (state === STATE_OPEN) { + $element + .removeClass('closed') + .addClass('opened'); + } + + $timeout(function () { + ionic.requestAnimationFrame(function () { + var translateX = state === STATE_CLOSE ? '-100' : '0'; + overlayEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + '%, 0, 0)'; + if (state === STATE_CLOSE) { + $element + .removeClass('opened') + .addClass('closed'); + } + }); + }, timeToRemove); + overlayState = state; + } + }; + + var enableAnimation = function () { + $element.addClass('animate'); + $overlay.addClass('animate'); + }; + + var disableAnimation = function () { + $element.removeClass('animate'); + $overlay.removeClass('animate'); + }; + + var isOpen = function () { + return drawerState === STATE_OPEN; + }; + + var startDrag = function (e) { + if (!$ionicSideMenuDelegate.canDragContent()) { + return; + } + + disableAnimation(); + toggleOverlay(STATE_OPEN); + + dragging = true; + offsetX = lastX - startX; + }; + + var doEndDrag = function (e) { + if (!$ionicSideMenuDelegate.canDragContent()) { + return; + } + + startX = lastX = offsetX = null; + isTargetDrag = false; + + if (!dragging) { + return; + } + + dragging = false; + + enableAnimation(); + + var translateX = 0; + var opacity = 0; + + if (side === SIDE_RIGHT) { + if (newX > width / 2) { + translateX = width; + drawerState = STATE_CLOSE; + } else { + opacity = 1; + drawerState = STATE_OPEN; + } + } else if (side === SIDE_LEFT) { + if (newX < (-width / 2)) { + translateX = -width; + drawerState = STATE_CLOSE; + } else { + opacity = 1; + drawerState = STATE_OPEN; + } + } + + toggleOverlay(drawerState); + ionic.requestAnimationFrame(function () { + overlayEl.style.opacity = opacity; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; + $element + .removeClass('opened closed') + .addClass(drawerState === STATE_OPEN ? 'opened' : 'closed'); + }); + }; + + var doDrag = function (e) { + if (e.defaultPrevented || !$ionicSideMenuDelegate.canDragContent()) { + return; + } + + var finger = e.gesture.touches[0]; + var dir = e.gesture.direction; + + if (!lastX) { + startX = finger.pageX; + } + + lastX = finger.pageX; + + if (dir === 'down' || dir === 'up') { + return; + } + + if (!dragging) { + //here at just the beginning of drag + // Dragged 15 pixels and finger is by edge + if (Math.abs(lastX - startX) > thresholdX) { + if (side === SIDE_LEFT) { + if (isOpen()) { + if (dir === SIDE_RIGHT) { + return; + } + } else { + if (dir === SIDE_LEFT) { + return; + } + } + } else if (side === SIDE_RIGHT) { + if (isOpen()) { + if (dir === SIDE_LEFT) { + return; + } + } else { + if (dir === SIDE_RIGHT) { + return; + } + } + } + + startDrag(e); + } + } else { + //here when we are dragging + e.gesture.srcEvent.stopImmediatePropagation(); + + // if fast gesture + if (e.gesture.deltaTime < 200) { + if (side === SIDE_LEFT) { + if (isOpen()) { + if (dir === SIDE_LEFT) { + return newX = -width; + } + } else { + if (dir === SIDE_RIGHT) { + return newX = 0; + } + } + } else if (side === SIDE_RIGHT) { + if (isOpen()) { + if (dir === SIDE_RIGHT) { + return newX = width; + } + } else { + if (dir === SIDE_LEFT) { + return newX = 0; + } + } + } + } + + var opacity; + if (side === SIDE_LEFT) { + newX = Math.min(0, (-width + (lastX - offsetX))); + opacity = 1 + parseFloat(newX / width).toFixed(2); + } else if (side === SIDE_RIGHT) { + newX = Math.max(0, (width - (docWidth - lastX + offsetX))); + opacity = 1 - parseFloat(newX / width).toFixed(2); + } + + + if (opacity < 0) { + opacity = 0; + return; + } + + ionic.requestAnimationFrame(function () { + overlayEl.style.opacity = opacity; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)'; + $element + .removeClass('closed') + .addClass('opened'); + }); + } + + if (dragging) { + e.gesture.srcEvent.preventDefault(); + } + }; + + var hardwareBackCallback = function () { + this.close(); + }.bind(this); + + this.close = function () { + $timeout(function () { + drawerState = STATE_CLOSE; + enableAnimation(); + toggleOverlay(STATE_CLOSE); + + ionic.requestAnimationFrame(function () { + overlayEl.style.opacity = 0; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; + }); + + if (unregisterBackAction) { + unregisterBackAction(); + } + }, 300); + }; + + this.open = function () { + drawerState = STATE_OPEN; + enableAnimation(); + toggleOverlay(STATE_OPEN); + + ionic.requestAnimationFrame(function () { + overlayEl.style.opacity = 1; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, 0, 0)'; + }); + + unregisterBackAction = $ionicPlatform.registerBackButtonAction(hardwareBackCallback, 100); + }; + + this.isOpen = isOpen; + + $ionicGesture.on('drag', doDrag, $document); + $ionicGesture.on('dragend', doEndDrag, $document); + $overlay.on('click', this.close); } - }); - }, timeToRemove) - overlayState = state; - } - }; - - var enableAnimation = function() { - $element.addClass('animate'); - $overlay.addClass('animate'); - $content.addClass('animate menu-animated'); - }; - - var disableAnimation = function() { - $element.removeClass('animate'); - $overlay.removeClass('animate'); - $content.removeClass('animate menu-animated'); - }; - - // Check if this is on target or not - var isTarget = function(targetEl) { - while (targetEl) { - if (targetEl === el) { - return true; - } - targetEl = targetEl.parentNode; - } - }; - - var isOpen = function() { - return drawerState === STATE_OPEN; - }; - - var startDrag = function(e) { - if (!$ionicSideMenuDelegate.canDragContent()) { - return; - } - - disableAnimation(); - toggleOverlay(STATE_OPEN); - - dragging = true; - offsetX = lastX - startX; - }; - - var startTargetDrag = function(e) { - if (!$ionicSideMenuDelegate.canDragContent()) { - return; - } - - disableAnimation(); - toggleOverlay(STATE_OPEN); - - dragging = true; - isTargetDrag = true; - offsetX = lastX - startX; - }; - - var doEndDrag = function(e) { - if (!$ionicSideMenuDelegate.canDragContent()) { - return; - } - - startX = lastX = offsetX = null; - isTargetDrag = false; - - if (!dragging) { - return; - } - - dragging = false; - - enableAnimation(); - - var translateX = 0; - var opacity = 0; - - if (side === SIDE_RIGHT){ - if (newX > width / 2) { - translateX = width; - drawerState = STATE_CLOSE; - } else { - opacity = 1; - drawerState = STATE_OPEN; - } - } else if (side === SIDE_LEFT){ - if (newX < (-width / 2)) { - translateX = -width; - drawerState = STATE_CLOSE; - } else { - opacity = 1; - drawerState = STATE_OPEN; - } - } - - toggleOverlay(drawerState); - - var contentOffsetX = side === SIDE_RIGHT ? - translateX - width : - width + translateX; - ionic.requestAnimationFrame(function() { - overlayEl.style.opacity = opacity; - el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + translateX + 'px, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + contentOffsetX + 'px, 0, 0)'; - $element - .removeClass('opened closed') - .addClass(drawerState === STATE_OPEN ? 'opened' : 'closed'); - }); - }; - - var doDrag = function(e) { - if (e.defaultPrevented || !$ionicSideMenuDelegate.canDragContent()) { - return; - } - - var finger = e.gesture.touches[0]; - var dir = e.gesture.direction; - - if (!lastX) { - startX = finger.pageX; - } - - lastX = finger.pageX; - - if (dir === 'down' || dir === 'up') { - return; - } - - if (!dragging) { - //here at just the beginning of drag - // Dragged 15 pixels and finger is by edge - if (Math.abs(lastX - startX) > thresholdX) { - if (side === SIDE_LEFT){ - if (isOpen()) { - if (dir === SIDE_RIGHT) { - return; - } - } else { - if (dir === SIDE_LEFT) { - return; - } + ]) + + .directive('drawer', ['$rootScope', '$ionicGesture', function ($rootScope, $ionicGesture) { + return { + restrict: 'E', + controller: 'drawerCtrl', + link: function ($scope, $element, $attr, ctrl) { + $element.addClass($attr.side + ' closed'); + + $scope.openDrawer = function () { + ctrl.open(); + }; + + $scope.closeDrawer = function () { + ctrl.close(); + }; + + $scope.toggleDrawer = function () { + if (ctrl.isOpen()) { + ctrl.close(); + } else { + ctrl.open(); + } + }; + } } - } else if (side === SIDE_RIGHT){ - if (isOpen()) { - if (dir === SIDE_LEFT) { - return; - } - } else { - if (dir === SIDE_RIGHT) { - return; - } + }]) + .directive('drawerClose', ['$ionicHistory', function ($ionicHistory) { + return { + restrict: 'A', + link: function ($scope, $element, $attr, ctrl) { + $element.bind('click', function () { + $ionicHistory.nextViewOptions({ + disableAnimate: true, + disableBack: true + }); + $scope.closeDrawer(); + }); + } } - } - - // if (isTarget(e.target)) { - // startTargetDrag(e); - // } else if((startX < edgeX && side === SIDE_LEFT) || (startX > docWidth-edgeX && side === SIDE_RIGHT)) { - startDrag(e); - // } - } - } else { - //here when we are dragging - e.gesture.srcEvent.stopImmediatePropagation(); - - // if fast gesture - if (e.gesture.deltaTime < 200) { - if (side === SIDE_LEFT){ - if (isOpen()) { - if (dir === SIDE_LEFT) { - return newX = -width; - } - } else { - if (dir === SIDE_RIGHT) { - return newX = 0; - } + }]) + + .directive('drawerToggle', [function () { + return { + restrict: 'A', + link: function ($scope, $element, $attr, ctrl) { + $element.bind('click', function () { + $scope.toggleDrawer(); + }); + } } - } else if (side === SIDE_RIGHT){ - if (isOpen()) { - if (dir === SIDE_RIGHT) { - return newX = width; - } - } else { - if (dir === SIDE_LEFT) { - return newX = 0; - } - } - } - } - - if (side === SIDE_LEFT){ - newX = Math.min(0, (-width + (lastX - offsetX))); - var opacity = 1 + (newX / width); - } else if (side === SIDE_RIGHT){ - newX = Math.max(0, (width - (docWidth - lastX + offsetX))); - var opacity = 1 - (newX / width); - } - - - if (opacity < 0) { - opacity = 0; - return; - } - - var contentOffsetX = side === SIDE_RIGHT ? - newX - width : - width + newX; - ionic.requestAnimationFrame(function() { - overlayEl.style.opacity = opacity; - el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + newX + 'px, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + contentOffsetX + 'px, 0, 0)'; - $element - .removeClass('closed') - .addClass('opened'); - }); - } - - if (dragging) { - e.gesture.srcEvent.preventDefault(); - } - }; - - var hardwareBackCallback = function() { - this.close(); - }.bind(this); - - this.close = function() { - drawerState = STATE_CLOSE; - enableAnimation(); - toggleOverlay(STATE_CLOSE); - - ionic.requestAnimationFrame(function() { - overlayEl.style.opacity = 0; - el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(0%, 0, 0)'; - }); - - if (unregisterBackAction) { - unregisterBackAction(); - } - }; - - this.open = function() { - drawerState = STATE_OPEN; - enableAnimation(); - toggleOverlay(STATE_OPEN); - - var contentOffsetX = side === SIDE_LEFT ? width : -width; - - ionic.requestAnimationFrame(function() { - overlayEl.style.opacity = 1; - el.style[ionic.CSS.TRANSFORM] = 'translate3d(0, 0, 0)'; - contentEl.style[ionic.CSS.TRANSFORM] = 'translate3d(' + contentOffsetX + 'px, 0, 0)'; - }); - - unregisterBackAction = $ionicPlatform.registerBackButtonAction(hardwareBackCallback, 100); - }; - - this.isOpen = isOpen; - - $ionicGesture.on('drag', doDrag, $document); - $ionicGesture.on('dragend', doEndDrag, $document); - $overlay.on('click', this.close); - } -]) - -.directive('drawer', ['$rootScope', '$ionicGesture', function($rootScope, $ionicGesture) { - return { - restrict: 'E', - controller: 'drawerCtrl', - link: function($scope, $element, $attr, ctrl) { - $element.addClass($attr.side + ' closed'); - - $scope.openDrawer = function() { - ctrl.open(); - }; - - $scope.closeDrawer = function() { - ctrl.close(); - }; - - $scope.toggleDrawer = function() { - if (ctrl.isOpen()) { - ctrl.close(); - } else { - ctrl.open(); - } - }; - } - } -}]) - -.directive('drawerContent', [function() { - return { - restrict: 'E', - require: '^ionSideMenus', - scope: true, - compile: function(element, attr) { - element.addClass('menu-content pane'); - - return { pre: prelink }; - function prelink($scope, $element, $attr, sideMenuCtrl) { - var content = { - element: element[0], - getTranslateX: function() { - return $scope.sideMenuContentTranslateX || 0; - } - }; - - sideMenuCtrl.setContent(content); - - // Cleanup - $scope.$on('$destroy', function() { - if (content) { - content.element = null; - content = null; - } - }); - } - } - }; -}]) - -.directive('drawerClose', ['$ionicHistory', function($ionicHistory) { - return { - restrict: 'A', - link: function($scope, $element, $attr, ctrl) { - $element.bind('click', function() { - $ionicHistory.nextViewOptions({ - disableAnimate: true, - disableBack: true - }); - $scope.closeDrawer(); - }); - } - } -}]) - -.directive('drawerToggle', [function() { - return { - restrict: 'A', - link: function($scope, $element, $attr, ctrl) { - $element.bind('click', function() { - $scope.toggleDrawer(); - }); - } - } -}]) -; + }]); })(); From 88954d50d483d8e95e632b52d17cb32d10283597 Mon Sep 17 00:00:00 2001 From: Lukas Klizas Date: Wed, 9 Sep 2015 02:20:04 +0300 Subject: [PATCH 32/40] nativepagetransitions support tweaks --- ionic.contrib.drawer.js | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 45ca7fd..aa4e5a1 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -262,20 +262,18 @@ }.bind(this); this.close = function () { - $timeout(function () { - drawerState = STATE_CLOSE; - enableAnimation(); - toggleOverlay(STATE_CLOSE); + drawerState = STATE_CLOSE; + enableAnimation(); + toggleOverlay(STATE_CLOSE); - ionic.requestAnimationFrame(function () { - overlayEl.style.opacity = 0; - el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; - }); + ionic.requestAnimationFrame(function () { + overlayEl.style.opacity = 0; + el.style[ionic.CSS.TRANSFORM] = 'translate3d(' + (side === SIDE_LEFT ? '-' : '') + '100%, 0, 0)'; + }); - if (unregisterBackAction) { - unregisterBackAction(); - } - }, 300); + if (unregisterBackAction) { + unregisterBackAction(); + } }; this.open = function () { @@ -324,7 +322,7 @@ } } }]) - .directive('drawerClose', ['$ionicHistory', function ($ionicHistory) { + .directive('drawerClose', ['$ionicHistory', '$timeout', function ($ionicHistory, $timeout) { return { restrict: 'A', link: function ($scope, $element, $attr, ctrl) { @@ -333,7 +331,15 @@ disableAnimate: true, disableBack: true }); - $scope.closeDrawer(); + + if (($attr.goNative !== undefined) && window.plugins && window.plugins.nativepagetransitions) { + $timeout(function () { + $scope.closeDrawer(); + console.log('waited'); + }, window.plugins.nativepagetransitions.globalOptions.duration); + } else { + $scope.closeDrawer(); + } }); } } From f6ba2c4fb4dfe27f4dbf7057ff673a0384f9baf4 Mon Sep 17 00:00:00 2001 From: Lukas Klizas Date: Wed, 9 Sep 2015 12:26:41 +0300 Subject: [PATCH 33/40] Cleaned console.log --- ionic.contrib.drawer.js | 1 - 1 file changed, 1 deletion(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index aa4e5a1..f900667 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -335,7 +335,6 @@ if (($attr.goNative !== undefined) && window.plugins && window.plugins.nativepagetransitions) { $timeout(function () { $scope.closeDrawer(); - console.log('waited'); }, window.plugins.nativepagetransitions.globalOptions.duration); } else { $scope.closeDrawer(); From ba5e769b3b2cc32f0b6d879f39765ad7570c9096 Mon Sep 17 00:00:00 2001 From: Lukas Klizas Date: Mon, 21 Sep 2015 11:34:04 +0300 Subject: [PATCH 34/40] =?UTF-8?q?Veikia=20tik=20dragginant=2060px=20nuo=20?= =?UTF-8?q?kra=C5=A1telio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ionic.contrib.drawer.css | 2 +- ionic.contrib.drawer.js | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/ionic.contrib.drawer.css b/ionic.contrib.drawer.css index f805e4a..7f6f7e2 100644 --- a/ionic.contrib.drawer.css +++ b/ionic.contrib.drawer.css @@ -1,8 +1,8 @@ drawer { display: block; position: fixed; - width: 270px; height: 100%; + width: 90%; z-index: 100; background: #ffffff; } diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index f900667..81dcfbc 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -30,6 +30,7 @@ // How far to drag before triggering var thresholdX = 7; + var edgeX = 60; var SIDE_LEFT = 'left'; var SIDE_RIGHT = 'right'; @@ -90,6 +91,15 @@ $overlay.removeClass('animate'); }; + var isTarget = function(targetEl) { + while (targetEl) { + if (targetEl === el) { + return true; + } + targetEl = targetEl.parentNode; + } + }; + var isOpen = function () { return drawerState === STATE_OPEN; }; @@ -106,6 +116,19 @@ offsetX = lastX - startX; }; + var startTargetDrag = function(e) { + if (!$ionicSideMenuDelegate.canDragContent()) { + return; + } + + disableAnimation(); + toggleOverlay(STATE_OPEN); + + dragging = true; + isTargetDrag = true; + offsetX = lastX - startX; + }; + var doEndDrag = function (e) { if (!$ionicSideMenuDelegate.canDragContent()) { return; @@ -197,7 +220,11 @@ } } - startDrag(e); + if(isTarget(e.target)) { + startTargetDrag(e); + } else if((startX < edgeX && side === SIDE_LEFT) || (startX > docWidth-edgeX && side === SIDE_RIGHT)) { + startDrag(e); + } } } else { //here when we are dragging From d6542a85cc98c4a8a1d108d74402f09a3ffcc3fd Mon Sep 17 00:00:00 2001 From: Lukas Date: Fri, 2 Oct 2015 00:12:01 +0300 Subject: [PATCH 35/40] Timeout after menu item click --- ionic.contrib.drawer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 81dcfbc..c1ce6d7 100644 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -364,7 +364,9 @@ $scope.closeDrawer(); }, window.plugins.nativepagetransitions.globalOptions.duration); } else { - $scope.closeDrawer(); + $timeout(function() { + $scope.closeDrawer(); + }, 500); } }); } From a824e21333a3628476a1d7db45c88e65017ec004 Mon Sep 17 00:00:00 2001 From: Lukas Date: Sun, 15 Nov 2015 13:39:05 +0200 Subject: [PATCH 36/40] Removed history reset after clicking menu item --- .gitignore | 0 README.md | 0 bower.json | 0 index.html | 0 ionic.contrib.drawer.css | 0 ionic.contrib.drawer.js | 64 +++++++++++++++++++++++++++++++++------- 6 files changed, 54 insertions(+), 10 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 README.md mode change 100644 => 100755 bower.json mode change 100644 => 100755 index.html mode change 100644 => 100755 ionic.contrib.drawer.css mode change 100644 => 100755 ionic.contrib.drawer.js diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/bower.json b/bower.json old mode 100644 new mode 100755 diff --git a/index.html b/index.html old mode 100644 new mode 100755 diff --git a/ionic.contrib.drawer.css b/ionic.contrib.drawer.css old mode 100644 new mode 100755 diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js old mode 100644 new mode 100755 index c1ce6d7..9c75109 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -16,6 +16,7 @@ '$ionicSideMenuDelegate', '$document', '$timeout', + '$ionicHistory', '$ionicPlatform', function ($element, $attr, @@ -23,6 +24,7 @@ $ionicSideMenuDelegate, $document, $timeout, + $ionicHistory, $ionicPlatform) { var el = $element[0]; var dragging = false; @@ -56,6 +58,37 @@ $element.parent().prepend(overlayEl); + var closeDrawer = function () { + this.close(); + drawerState = STATE_CLOSE; + }.bind(this); + + var backButtonPressedOnceToExit = false; + + $ionicPlatform.registerBackButtonAction(function (e) { + if(drawerState == 'open') { + closeDrawer(); + } else { + if (backButtonPressedOnceToExit) { + ionic.Platform.exitApp(); + } + + else if ($ionicHistory.backView()) { + $ionicHistory.goBack(); + } + else { + backButtonPressedOnceToExit = true; + window.plugins.toast.showShortBottom("Vėl paspauskite atgal kad uždaryti aplikaciją"); + setTimeout(function () { + backButtonPressedOnceToExit = false; + }, 2000); + } + } + e.preventDefault(); + return false; + }, 101); + + var toggleOverlay = function (state) { if (overlayState !== state) { var timeToRemove = state === STATE_CLOSE ? 400 : 0; @@ -91,7 +124,7 @@ $overlay.removeClass('animate'); }; - var isTarget = function(targetEl) { + var isTarget = function (targetEl) { while (targetEl) { if (targetEl === el) { return true; @@ -116,7 +149,7 @@ offsetX = lastX - startX; }; - var startTargetDrag = function(e) { + var startTargetDrag = function (e) { if (!$ionicSideMenuDelegate.canDragContent()) { return; } @@ -220,9 +253,9 @@ } } - if(isTarget(e.target)) { + if (isTarget(e.target)) { startTargetDrag(e); - } else if((startX < edgeX && side === SIDE_LEFT) || (startX > docWidth-edgeX && side === SIDE_RIGHT)) { + } else if ((startX < edgeX && side === SIDE_LEFT) || (startX > docWidth - edgeX && side === SIDE_RIGHT)) { startDrag(e); } } @@ -354,17 +387,28 @@ restrict: 'A', link: function ($scope, $element, $attr, ctrl) { $element.bind('click', function () { - $ionicHistory.nextViewOptions({ - disableAnimate: true, - disableBack: true - }); + + var historyOptions = {}; + + if ($attr.uiSref == 'app.main') { + historyOptions = { + disableAnimate: true, + disableBack: true + }; + } else { + historyOptions = { + disableAnimate: true + }; + } + + $ionicHistory.nextViewOptions(historyOptions); if (($attr.goNative !== undefined) && window.plugins && window.plugins.nativepagetransitions) { $timeout(function () { $scope.closeDrawer(); }, window.plugins.nativepagetransitions.globalOptions.duration); } else { - $timeout(function() { + $timeout(function () { $scope.closeDrawer(); }, 500); } @@ -372,7 +416,6 @@ } } }]) - .directive('drawerToggle', [function () { return { restrict: 'A', @@ -384,4 +427,5 @@ } }]); + })(); From e5775f49789f78b87cd7f51759aa2205b1964314 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 17 Feb 2016 10:57:22 +0200 Subject: [PATCH 37/40] Some changes --- ionic.contrib.drawer.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ionic.contrib.drawer.js b/ionic.contrib.drawer.js index 9c75109..f0b4470 100755 --- a/ionic.contrib.drawer.js +++ b/ionic.contrib.drawer.js @@ -31,7 +31,7 @@ var startX, lastX, offsetX, newX; // How far to drag before triggering - var thresholdX = 7; + var thresholdX = 2; var edgeX = 60; var SIDE_LEFT = 'left'; @@ -66,7 +66,7 @@ var backButtonPressedOnceToExit = false; $ionicPlatform.registerBackButtonAction(function (e) { - if(drawerState == 'open') { + if (drawerState == 'open') { closeDrawer(); } else { if (backButtonPressedOnceToExit) { @@ -426,6 +426,4 @@ } } }]); - - })(); From 646c553cbc240ceff844f4ef98c2291bc93fd577 Mon Sep 17 00:00:00 2001 From: "lilong.yao" Date: Sun, 6 Mar 2016 19:56:34 +0800 Subject: [PATCH 38/40] added package.json --- package.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..09f13e0 --- /dev/null +++ b/package.json @@ -0,0 +1,4 @@ +{ + "name": "ionic-ion-drawer", + "version": "0.0.1" +} From 2b21469df061973abeda359211c459d032692c5d Mon Sep 17 00:00:00 2001 From: "Trafford, Russell" Date: Wed, 30 Mar 2016 13:24:08 +0100 Subject: [PATCH 39/40] Added gruntfile to easily run demo code Run demo code with 'grunt connect' command on command line --- .gitignore | 1 + Gruntfile.js | 20 ++++++++++++++++++++ package.json | 6 +++++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 Gruntfile.js diff --git a/.gitignore b/.gitignore index 726c3ca..4ed852c 100755 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .*.sw* +node_modules diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..7fcba18 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,20 @@ +module.exports = function(grunt) { + + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + connect: { + demo: { + options: { + open: true, + port: 8888, + keepalive: true, + base: '.' + } + } + } + }); + + grunt.loadNpmTasks('grunt-contrib-connect'); + grunt.registerTask('default', 'connect'); + +}; \ No newline at end of file diff --git a/package.json b/package.json index 09f13e0..b91a6ff 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,8 @@ { "name": "ionic-ion-drawer", - "version": "0.0.1" + "version": "0.0.1", + "devDependencies": { + "grunt": "^0.4.5", + "grunt-contrib-connect": "^1.0.1" + } } From d71a8b1bdf22167e7deb434a9469af0f72dc4549 Mon Sep 17 00:00:00 2001 From: "Trafford, Russell" Date: Wed, 30 Mar 2016 13:24:15 +0100 Subject: [PATCH 40/40] Control drawer from nav bar with $scope.drawerIsOpen() - Exposed isOpen function to the $scope - Example code to show control of drawer from nav bar - Example code to move drawer + drawer grey overlay down by 44px --- custom.css | 27 +++++++++++++++++++++++++++ index.html | 32 ++++++-------------------------- ionic.contrib.drawer.js | 2 ++ 3 files changed, 35 insertions(+), 26 deletions(-) create mode 100644 custom.css diff --git a/custom.css b/custom.css new file mode 100644 index 0000000..e9b5905 --- /dev/null +++ b/custom.css @@ -0,0 +1,27 @@ +drawer, drawer.left, drawer.right { + background-color: #222; + top: 44px; + width:20%; +} +.drawer-overlay { + top: 44px; +} +drawer h2 { + color: #fff; + margin-top: 40px !important; + margin-left: 15px; + font-weight: 200; +} + +.item { + background: none; + color: #fff; +} + +.item:first-child { + border-top: 0px; +} + +.item:last-child { + border-bottom: 0px; +} \ No newline at end of file diff --git a/index.html b/index.html index 1df22ca..c68d9a3 100755 --- a/index.html +++ b/index.html @@ -6,39 +6,16 @@ Ionic Seed App + - + -

Menu

- Friends Favorites @@ -48,7 +25,10 @@

Menu

- + + + +