-
Notifications
You must be signed in to change notification settings - Fork 135
/
Copy pathmobile-nav.min.js
1 lines (1 loc) · 6.27 KB
/
mobile-nav.min.js
1
angular.module("ajoslin.mobile-navigate",[]).run(["$navigate","$rootScope",function($navigate,$rootScope){document.addEventListener("deviceready",function(){document.addEventListener("backbutton",function(){$rootScope.$apply(function(){var backSuccess=$navigate.back();if(!backSuccess){navigator.app.exitApp()}})})})}]);angular.module("ajoslin.mobile-navigate").provider("$change",function(){var transitionPresets={modal:["modal",""],none:["",""]};var defaultOptions={prefix:"mb-"};var IN_CLASS="in";var OUT_CLASS="out";var REVERSE_CLASS="reverse";var DONE_CLASS="done";var ANIMATION_END="animationName"in document.documentElement.style?"animationend":"webkitAnimationEnd";this.setTransitionPreset=function(transitionName,inClass,outClass){inClass=inClass||"";outClass=outClass||inClass;transitionPresets[transitionName]=[inClass,outClass]};this.options=function(opts){defaultOptions=angular.extend(defaultOptions,opts||{})};this.$get=["$q","$rootScope",function($q,$rootScope){return function change(next,prev,transType,reverse,options){options=angular.extend(options||{},defaultOptions);var deferred=$q.defer(),nextTransClass,prevTransClass;function buildClassString(classes){return classes.reduce(function(accumulator,cls){return accumulator+(cls?" "+options.prefix+cls:"")},"")}var transition=transitionPresets[transType]?transitionPresets[transType]:[transType,transType];next.css("z-index","-100");next[0].offsetWidth+=0;var nextClasses=buildClassString([reverse?OUT_CLASS:IN_CLASS,nextTransClass=transition[reverse?1:0],reverse&&REVERSE_CLASS||""]);next.addClass(nextClasses);var prevClasses;if(prev){prevClasses=buildClassString([reverse?IN_CLASS:OUT_CLASS,prevTransClass=transition[reverse?0:1],reverse&&REVERSE_CLASS||""]);prev.addClass(prevClasses)}next.css("z-index","");next[0].offsetWidth+=0;function done(){$rootScope.$apply(function(){deferred.resolve()})}var boundElement;if(nextTransClass&&nextTransClass.length){(boundElement=next).bind(ANIMATION_END,done)}else if(prev&&prevTransClass&&prevTransClass.length){(boundElement=prev).bind(ANIMATION_END,done)}else{deferred.resolve()}deferred.promise.then(function(){boundElement&&boundElement.unbind(ANIMATION_END,done);next.removeClass(nextClasses);prev&&prev.removeClass(prevClasses)});deferred.promise.cancel=function(){deferred.resolve()};return deferred.promise}}]});angular.module("ajoslin.mobile-navigate").provider("$navigate",function(){this.$get=["$rootScope","$location","$route",function($rootScope,$location,$route){var nav={},navHistory=[];function Page(path,transition,isReverse){var _path=path,_transition=transition||"slide",_isReverse=isReverse,_onceTransition;this.transition=function(){var trans;if(_onceTransition){trans=_onceTransition;_onceTransition=null}else{trans=_transition}return trans};this.path=function(){return _path};this.reverse=function(){return _isReverse};this.transitionOnce=function(trans){_onceTransition=trans}}function navigate(destination,source,isBack){$rootScope.$broadcast("$pageTransitionStart",destination,source,isBack);nav.current=nav.next}nav.onRouteSuccess=null;function defaultRouteSuccess($event,next,last){nav.current&&navHistory.push(nav.current);nav.next=new Page($location.path());nav.next.transitionOnce("none");navigate(nav.next);nav.onRouteSuccess=null}$rootScope.$on("$routeChangeSuccess",function($event,next,last){if(!next.$$route||!next.$$route.redirectTo){(nav.onRouteSuccess||defaultRouteSuccess)($event,next,last)}});nav.go=function go(path,transition,isReverse){if(typeof transition=="boolean"){isReverse=transition;transition=null}$location.path(path);nav.onRouteSuccess=function($event,next,last){nav.current&&navHistory.push(nav.current);nav.next=new Page(path,transition||next.$$route&&next.$$route.transition,isReverse);navigate(nav.next,nav.current,false)}};nav.eraseHistory=function(){navHistory.length=0};nav.back=function(){if(navHistory.length>0){var previous=navHistory[navHistory.length-1];$location.path(previous.path());nav.onRouteSuccess=function(){navHistory.pop();nav.next=previous;navigate(nav.next,nav.current,true)};return true}return false};return nav}]});angular.module("ajoslin.mobile-navigate").directive("mobileView",["$rootScope","$compile","$controller","$route","$change","$q",function($rootScope,$compile,$controller,$route,$change,$q){function link(scope,viewElement,attrs){function insertPage(page){var current=$route.current,locals=current&¤t.locals;page.element=angular.element(document.createElement("div"));page.element.html(locals.$template);page.element.addClass("mb-page");page.scope=scope.$new();if(current.controller){locals.$scope=page.scope;page.controller=$controller(current.controller,locals);page.element.contents().data("$ngControllerController",page.controller)}$compile(page.element.contents())(page.scope);if(locals&&locals.$template){viewElement.append(page.element)}page.scope.$emit("$viewContentLoaded");page.scope.$eval(attrs.onLoad);return page}var currentTrans;scope.$on("$pageTransitionStart",function($event,dest,source,reverse){function changePage(){var current=$route.current&&$route.current.$$route||{};var transition=reverse?source.transition():dest.transition();insertPage(dest);if(dest.reverse()||current.reverse){reverse=!reverse}function doTransition(){var promise=$change(dest.element,source?source.element:null,transition,reverse);promise.then(function(){if(source){$rootScope.$broadcast("$pageTransitionSuccess",dest,source);source.scope.$destroy();source.element.remove();source=undefined}});return promise}dest.element.css("display","none");var deferTransitionPromise=scope.$eval(attrs.deferTransition)||$q.when();deferTransitionPromise.cancel=function(){cancelled=true;dest.element.css("display","")};var cancelled=false;deferTransitionPromise.then(function(){if(!cancelled){dest.element.css("display","");return doTransition()}});return deferTransitionPromise}currentTrans&¤tTrans.cancel();currentTrans=changePage(dest,source,reverse)})}return{restrict:"EA",link:link}}]).directive("scrollable",["$route",function($route){var scrollCache={};return{restrict:"EA",link:function(scope,elm,attrs){var route=$route.current?$route.current.$$route:{};var template=route.templateUrl||route.template;var rawElm=elm[0];if(template){setTimeout(function(){var oldScroll=scrollCache[template];if(oldScroll){rawElm.scrollTop=oldScroll}});scope.$on("$destroy",function(){scrollCache[template]=rawElm.scrollTop})}}}}]);