From 6c7acedf2b09b9529b7c0ff9ce2f4f72537d6168 Mon Sep 17 00:00:00 2001 From: Mike Daly Date: Fri, 12 May 2017 12:25:26 -0700 Subject: [PATCH] Change to to handle case where .kill(true) is called when already in a cycle --- demo/angular-ui-notification.min.js | 2 +- dist/angular-ui-notification.js | 24 +++++++++++++----------- dist/angular-ui-notification.min.js | 2 +- src/angular-ui-notification.js | 24 +++++++++++++----------- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/demo/angular-ui-notification.min.js b/demo/angular-ui-notification.min.js index c864aea..7f7e8de 100644 --- a/demo/angular-ui-notification.min.js +++ b/demo/angular-ui-notification.min.js @@ -5,4 +5,4 @@ * @link https://github.com/alexcrack/angular-ui-notification * @license MIT */ -angular.module("ui-notification",[]),angular.module("ui-notification").provider("Notification",function(){this.options={delay:5e3,startTop:10,startRight:10,verticalSpacing:10,horizontalSpacing:10,positionX:"right",positionY:"top",replaceMessage:!1,templateUrl:"angular-ui-notification.html",onClose:void 0,closeOnClick:!0,maxCount:0,container:"body",priority:10},this.setOptions=function(t){if(!angular.isObject(t))throw new Error("Options should be an object!");this.options=angular.extend({},this.options,t)},this.$get=["$timeout","$http","$compile","$templateCache","$rootScope","$injector","$sce","$q","$window",function(t,i,e,n,o,s,a,r,l){var p=this.options,c=p.startTop,u=p.startRight,d=p.verticalSpacing,f=p.horizontalSpacing,m=p.delay,g=[],h=!1,y=function(s,y){function C(i){function n(t){["-webkit-transition","-o-transition","transition"].forEach(function(i){C.css(i,t)})}var o=s.scope.$new();o.message=a.trustAsHtml(s.message),o.title=a.trustAsHtml(s.title),o.t=s.type.substr(0,1),o.delay=s.delay,o.onClose=s.onClose;var r=function(t,i){return t._priority-i._priority},m=function(t,i){return i._priority-t._priority},y=function(){var t=0,i=0,e=c,n=u,o=[];"top"===s.positionY?g.sort(r):"bottom"===s.positionY&&g.sort(m);for(var a=g.length-1;a>=0;a--){var l=g[a];if(s.replaceMessage&&awindow.innerHeight&&(C=c,i++,t=0);var v=e=C?0===t?C:C+d:c,_=n+i*(f+y);l.css(l._positionY,v+"px"),"center"==l._positionX?l.css("left",parseInt(window.innerWidth/2-y/2)+"px"):l.css(l._positionX,_+"px"),o[l._positionY+l._positionX]=v+h,p.maxCount>0&&g.length>p.maxCount&&0===a&&l.scope().kill(!0),t++}}},C=e(i)(o);C._positionY=s.positionY,C._positionX=s.positionX,C._priority=s.priority,C.addClass(s.type);var _=function(t){t=t.originalEvent||t,("click"===t.type||"opacity"===t.propertyName&&t.elapsedTime>=1)&&(o.onClose&&o.$apply(o.onClose(C)),C.remove(),g.splice(g.indexOf(C),1),o.$destroy(),y())};s.closeOnClick&&(C.addClass("clickable"),C.bind("click",_)),C.bind("webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd",_),angular.isNumber(s.delay)&&t(function(){C.addClass("killed")},s.delay),n("none"),angular.element(document.querySelector(s.container)).append(C);var k=-(parseInt(C[0].offsetHeight)+50);if(C.css(C._positionY,k+"px"),g.push(C),"center"==s.positionX){var w=parseInt(C[0].offsetWidth);C.css("left",parseInt(window.innerWidth/2-w/2)+"px")}t(function(){n("")}),o._templateElement=C,o.kill=function(i){i?(o.onClose&&o.$apply(o.onClose(o._templateElement)),g.splice(g.indexOf(o._templateElement),1),o._templateElement.remove(),o.$destroy(),t(y)):o._templateElement.addClass("killed")},t(y),h||(angular.element(l).bind("resize",function(i){t(y)}),h=!0),v.resolve(o)}var v=r.defer();"object"==typeof s&&null!==s||(s={message:s}),s.scope=s.scope?s.scope:o,s.template=s.templateUrl?s.templateUrl:p.templateUrl,s.delay=angular.isUndefined(s.delay)?m:s.delay,s.type=y||s.type||p.type||"",s.positionY=s.positionY?s.positionY:p.positionY,s.positionX=s.positionX?s.positionX:p.positionX,s.replaceMessage=s.replaceMessage?s.replaceMessage:p.replaceMessage,s.onClose=s.onClose?s.onClose:p.onClose,s.closeOnClick=null!==s.closeOnClick&&void 0!==s.closeOnClick?s.closeOnClick:p.closeOnClick,s.container=s.container?s.container:p.container,s.priority=s.priority?s.priority:p.priority;var _=n.get(s.template);return _?C(_):i.get(s.template,{cache:!0}).then(function(t){C(t.data)})["catch"](function(t){throw new Error("Template ("+s.template+") could not be loaded. "+t)}),v.promise};return y.primary=function(t){return this(t,"primary")},y.error=function(t){return this(t,"error")},y.success=function(t){return this(t,"success")},y.info=function(t){return this(t,"info")},y.warning=function(t){return this(t,"warning")},y.clearAll=function(){angular.forEach(g,function(t){t.addClass("killed")})},y}]}),angular.module("ui-notification").run(["$templateCache",function(t){t.put("angular-ui-notification.html",'

')}]); \ No newline at end of file +angular.module("ui-notification",[]),angular.module("ui-notification").provider("Notification",function(){this.options={delay:5e3,startTop:10,startRight:10,verticalSpacing:10,horizontalSpacing:10,positionX:"right",positionY:"top",replaceMessage:!1,templateUrl:"angular-ui-notification.html",onClose:void 0,closeOnClick:!0,maxCount:0,container:"body",priority:10},this.setOptions=function(t){if(!angular.isObject(t))throw new Error("Options should be an object!");this.options=angular.extend({},this.options,t)},this.$get=["$timeout","$http","$compile","$templateCache","$rootScope","$injector","$sce","$q","$window",function(t,e,i,n,o,s,a,r,l){var p=this.options,c=p.startTop,u=p.startRight,d=p.verticalSpacing,m=p.horizontalSpacing,f=p.delay,g=[],h=!1,y=function(s,y){function C(e){function n(t){["-webkit-transition","-o-transition","transition"].forEach(function(e){C.css(e,t)})}var o=s.scope.$new();o.message=a.trustAsHtml(s.message),o.title=a.trustAsHtml(s.title),o.t=s.type.substr(0,1),o.delay=s.delay,o.onClose=s.onClose;var r=function(t,e){return t._priority-e._priority},f=function(t,e){return e._priority-t._priority},y=function(){var t=0,e=0,i=c,n=u,o=[];"top"===s.positionY?g.sort(r):"bottom"===s.positionY&&g.sort(f);for(var a=g.length-1;a>=0;a--){var l=g[a];if(s.replaceMessage&&awindow.innerHeight&&(C=c,e++,t=0);var v=i=C?0===t?C:C+d:c,_=n+e*(m+y);l.css(l._positionY,v+"px"),"center"==l._positionX?l.css("left",parseInt(window.innerWidth/2-y/2)+"px"):l.css(l._positionX,_+"px"),o[l._positionY+l._positionX]=v+h,p.maxCount>0&&g.length>p.maxCount&&0===a&&l.scope().kill(!0),t++}}},C=i(e)(o);C._positionY=s.positionY,C._positionX=s.positionX,C._priority=s.priority,C.addClass(s.type);var _=function(t){t=t.originalEvent||t,("click"===t.type||"opacity"===t.propertyName&&t.elapsedTime>=1)&&(o.onClose&&o.$apply(o.onClose(C)),C.remove(),g.splice(g.indexOf(C),1),o.$destroy(),y())};s.closeOnClick&&(C.addClass("clickable"),C.bind("click",_)),C.bind("webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd",_),angular.isNumber(s.delay)&&t(function(){C.addClass("killed")},s.delay),n("none"),angular.element(document.querySelector(s.container)).append(C);var k=-(parseInt(C[0].offsetHeight)+50);if(C.css(C._positionY,k+"px"),g.push(C),"center"==s.positionX){var w=parseInt(C[0].offsetWidth);C.css("left",parseInt(window.innerWidth/2-w/2)+"px")}t(function(){n("")}),o._templateElement=C,o.kill=function(e){e?(o.onClose?(o.$applyAsync(o.onClose(o._templateElement)),g.splice(g.indexOf(o._templateElement),1),o._templateElement.remove(),o.$destroy()):(g.splice(g.indexOf(o._templateElement),1),o._templateElement.remove(),o.$destroy()),t(y)):o._templateElement.addClass("killed")},t(y),h||(angular.element(l).bind("resize",function(e){t(y)}),h=!0),v.resolve(o)}var v=r.defer();"object"==typeof s&&null!==s||(s={message:s}),s.scope=s.scope?s.scope:o,s.template=s.templateUrl?s.templateUrl:p.templateUrl,s.delay=angular.isUndefined(s.delay)?f:s.delay,s.type=y||s.type||p.type||"",s.positionY=s.positionY?s.positionY:p.positionY,s.positionX=s.positionX?s.positionX:p.positionX,s.replaceMessage=s.replaceMessage?s.replaceMessage:p.replaceMessage,s.onClose=s.onClose?s.onClose:p.onClose,s.closeOnClick=null!==s.closeOnClick&&void 0!==s.closeOnClick?s.closeOnClick:p.closeOnClick,s.container=s.container?s.container:p.container,s.priority=s.priority?s.priority:p.priority;var _=n.get(s.template);return _?C(_):e.get(s.template,{cache:!0}).then(function(t){C(t.data)})["catch"](function(t){throw new Error("Template ("+s.template+") could not be loaded. "+t)}),v.promise};return y.primary=function(t){return this(t,"primary")},y.error=function(t){return this(t,"error")},y.success=function(t){return this(t,"success")},y.info=function(t){return this(t,"info")},y.warning=function(t){return this(t,"warning")},y.clearAll=function(){angular.forEach(g,function(t){t.addClass("killed")})},y}]}),angular.module("ui-notification").run(["$templateCache",function(t){t.put("angular-ui-notification.html",'

')}]); \ No newline at end of file diff --git a/dist/angular-ui-notification.js b/dist/angular-ui-notification.js index 73b9e93..6f2a14d 100644 --- a/dist/angular-ui-notification.js +++ b/dist/angular-ui-notification.js @@ -61,7 +61,7 @@ angular.module('ui-notification').provider('Notification', function() { args.closeOnClick = (args.closeOnClick !== null && args.closeOnClick !== undefined) ? args.closeOnClick : options.closeOnClick; args.container = args.container ? args.container : options.container; args.priority = args.priority ? args.priority : options.priority; - + var template=$templateCache.get(args.template); if(template){ @@ -75,10 +75,10 @@ angular.module('ui-notification').provider('Notification', function() { }) .catch(function(data){ throw new Error('Template ('+args.template+') could not be loaded. ' + data); - }); - } - - + }); + } + + function processNotificationTemplate(template) { var scope = args.scope.$new(); @@ -204,13 +204,15 @@ angular.module('ui-notification').provider('Notification', function() { scope.kill = function(isHard) { if (isHard) { - if (scope.onClose) { - scope.$apply(scope.onClose(scope._templateElement)); - } + scope.$applyAsync(function() { + if (scope.onClose) { + scope.onClose(scope._templateElement); + } + messageElements.splice(messageElements.indexOf(scope._templateElement), 1); + scope._templateElement.remove(); + scope.$destroy(); + }); - messageElements.splice(messageElements.indexOf(scope._templateElement), 1); - scope._templateElement.remove(); - scope.$destroy(); $timeout(reposite); } else { scope._templateElement.addClass('killed'); diff --git a/dist/angular-ui-notification.min.js b/dist/angular-ui-notification.min.js index c864aea..7f7e8de 100644 --- a/dist/angular-ui-notification.min.js +++ b/dist/angular-ui-notification.min.js @@ -5,4 +5,4 @@ * @link https://github.com/alexcrack/angular-ui-notification * @license MIT */ -angular.module("ui-notification",[]),angular.module("ui-notification").provider("Notification",function(){this.options={delay:5e3,startTop:10,startRight:10,verticalSpacing:10,horizontalSpacing:10,positionX:"right",positionY:"top",replaceMessage:!1,templateUrl:"angular-ui-notification.html",onClose:void 0,closeOnClick:!0,maxCount:0,container:"body",priority:10},this.setOptions=function(t){if(!angular.isObject(t))throw new Error("Options should be an object!");this.options=angular.extend({},this.options,t)},this.$get=["$timeout","$http","$compile","$templateCache","$rootScope","$injector","$sce","$q","$window",function(t,i,e,n,o,s,a,r,l){var p=this.options,c=p.startTop,u=p.startRight,d=p.verticalSpacing,f=p.horizontalSpacing,m=p.delay,g=[],h=!1,y=function(s,y){function C(i){function n(t){["-webkit-transition","-o-transition","transition"].forEach(function(i){C.css(i,t)})}var o=s.scope.$new();o.message=a.trustAsHtml(s.message),o.title=a.trustAsHtml(s.title),o.t=s.type.substr(0,1),o.delay=s.delay,o.onClose=s.onClose;var r=function(t,i){return t._priority-i._priority},m=function(t,i){return i._priority-t._priority},y=function(){var t=0,i=0,e=c,n=u,o=[];"top"===s.positionY?g.sort(r):"bottom"===s.positionY&&g.sort(m);for(var a=g.length-1;a>=0;a--){var l=g[a];if(s.replaceMessage&&awindow.innerHeight&&(C=c,i++,t=0);var v=e=C?0===t?C:C+d:c,_=n+i*(f+y);l.css(l._positionY,v+"px"),"center"==l._positionX?l.css("left",parseInt(window.innerWidth/2-y/2)+"px"):l.css(l._positionX,_+"px"),o[l._positionY+l._positionX]=v+h,p.maxCount>0&&g.length>p.maxCount&&0===a&&l.scope().kill(!0),t++}}},C=e(i)(o);C._positionY=s.positionY,C._positionX=s.positionX,C._priority=s.priority,C.addClass(s.type);var _=function(t){t=t.originalEvent||t,("click"===t.type||"opacity"===t.propertyName&&t.elapsedTime>=1)&&(o.onClose&&o.$apply(o.onClose(C)),C.remove(),g.splice(g.indexOf(C),1),o.$destroy(),y())};s.closeOnClick&&(C.addClass("clickable"),C.bind("click",_)),C.bind("webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd",_),angular.isNumber(s.delay)&&t(function(){C.addClass("killed")},s.delay),n("none"),angular.element(document.querySelector(s.container)).append(C);var k=-(parseInt(C[0].offsetHeight)+50);if(C.css(C._positionY,k+"px"),g.push(C),"center"==s.positionX){var w=parseInt(C[0].offsetWidth);C.css("left",parseInt(window.innerWidth/2-w/2)+"px")}t(function(){n("")}),o._templateElement=C,o.kill=function(i){i?(o.onClose&&o.$apply(o.onClose(o._templateElement)),g.splice(g.indexOf(o._templateElement),1),o._templateElement.remove(),o.$destroy(),t(y)):o._templateElement.addClass("killed")},t(y),h||(angular.element(l).bind("resize",function(i){t(y)}),h=!0),v.resolve(o)}var v=r.defer();"object"==typeof s&&null!==s||(s={message:s}),s.scope=s.scope?s.scope:o,s.template=s.templateUrl?s.templateUrl:p.templateUrl,s.delay=angular.isUndefined(s.delay)?m:s.delay,s.type=y||s.type||p.type||"",s.positionY=s.positionY?s.positionY:p.positionY,s.positionX=s.positionX?s.positionX:p.positionX,s.replaceMessage=s.replaceMessage?s.replaceMessage:p.replaceMessage,s.onClose=s.onClose?s.onClose:p.onClose,s.closeOnClick=null!==s.closeOnClick&&void 0!==s.closeOnClick?s.closeOnClick:p.closeOnClick,s.container=s.container?s.container:p.container,s.priority=s.priority?s.priority:p.priority;var _=n.get(s.template);return _?C(_):i.get(s.template,{cache:!0}).then(function(t){C(t.data)})["catch"](function(t){throw new Error("Template ("+s.template+") could not be loaded. "+t)}),v.promise};return y.primary=function(t){return this(t,"primary")},y.error=function(t){return this(t,"error")},y.success=function(t){return this(t,"success")},y.info=function(t){return this(t,"info")},y.warning=function(t){return this(t,"warning")},y.clearAll=function(){angular.forEach(g,function(t){t.addClass("killed")})},y}]}),angular.module("ui-notification").run(["$templateCache",function(t){t.put("angular-ui-notification.html",'

')}]); \ No newline at end of file +angular.module("ui-notification",[]),angular.module("ui-notification").provider("Notification",function(){this.options={delay:5e3,startTop:10,startRight:10,verticalSpacing:10,horizontalSpacing:10,positionX:"right",positionY:"top",replaceMessage:!1,templateUrl:"angular-ui-notification.html",onClose:void 0,closeOnClick:!0,maxCount:0,container:"body",priority:10},this.setOptions=function(t){if(!angular.isObject(t))throw new Error("Options should be an object!");this.options=angular.extend({},this.options,t)},this.$get=["$timeout","$http","$compile","$templateCache","$rootScope","$injector","$sce","$q","$window",function(t,e,i,n,o,s,a,r,l){var p=this.options,c=p.startTop,u=p.startRight,d=p.verticalSpacing,m=p.horizontalSpacing,f=p.delay,g=[],h=!1,y=function(s,y){function C(e){function n(t){["-webkit-transition","-o-transition","transition"].forEach(function(e){C.css(e,t)})}var o=s.scope.$new();o.message=a.trustAsHtml(s.message),o.title=a.trustAsHtml(s.title),o.t=s.type.substr(0,1),o.delay=s.delay,o.onClose=s.onClose;var r=function(t,e){return t._priority-e._priority},f=function(t,e){return e._priority-t._priority},y=function(){var t=0,e=0,i=c,n=u,o=[];"top"===s.positionY?g.sort(r):"bottom"===s.positionY&&g.sort(f);for(var a=g.length-1;a>=0;a--){var l=g[a];if(s.replaceMessage&&awindow.innerHeight&&(C=c,e++,t=0);var v=i=C?0===t?C:C+d:c,_=n+e*(m+y);l.css(l._positionY,v+"px"),"center"==l._positionX?l.css("left",parseInt(window.innerWidth/2-y/2)+"px"):l.css(l._positionX,_+"px"),o[l._positionY+l._positionX]=v+h,p.maxCount>0&&g.length>p.maxCount&&0===a&&l.scope().kill(!0),t++}}},C=i(e)(o);C._positionY=s.positionY,C._positionX=s.positionX,C._priority=s.priority,C.addClass(s.type);var _=function(t){t=t.originalEvent||t,("click"===t.type||"opacity"===t.propertyName&&t.elapsedTime>=1)&&(o.onClose&&o.$apply(o.onClose(C)),C.remove(),g.splice(g.indexOf(C),1),o.$destroy(),y())};s.closeOnClick&&(C.addClass("clickable"),C.bind("click",_)),C.bind("webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd",_),angular.isNumber(s.delay)&&t(function(){C.addClass("killed")},s.delay),n("none"),angular.element(document.querySelector(s.container)).append(C);var k=-(parseInt(C[0].offsetHeight)+50);if(C.css(C._positionY,k+"px"),g.push(C),"center"==s.positionX){var w=parseInt(C[0].offsetWidth);C.css("left",parseInt(window.innerWidth/2-w/2)+"px")}t(function(){n("")}),o._templateElement=C,o.kill=function(e){e?(o.onClose?(o.$applyAsync(o.onClose(o._templateElement)),g.splice(g.indexOf(o._templateElement),1),o._templateElement.remove(),o.$destroy()):(g.splice(g.indexOf(o._templateElement),1),o._templateElement.remove(),o.$destroy()),t(y)):o._templateElement.addClass("killed")},t(y),h||(angular.element(l).bind("resize",function(e){t(y)}),h=!0),v.resolve(o)}var v=r.defer();"object"==typeof s&&null!==s||(s={message:s}),s.scope=s.scope?s.scope:o,s.template=s.templateUrl?s.templateUrl:p.templateUrl,s.delay=angular.isUndefined(s.delay)?f:s.delay,s.type=y||s.type||p.type||"",s.positionY=s.positionY?s.positionY:p.positionY,s.positionX=s.positionX?s.positionX:p.positionX,s.replaceMessage=s.replaceMessage?s.replaceMessage:p.replaceMessage,s.onClose=s.onClose?s.onClose:p.onClose,s.closeOnClick=null!==s.closeOnClick&&void 0!==s.closeOnClick?s.closeOnClick:p.closeOnClick,s.container=s.container?s.container:p.container,s.priority=s.priority?s.priority:p.priority;var _=n.get(s.template);return _?C(_):e.get(s.template,{cache:!0}).then(function(t){C(t.data)})["catch"](function(t){throw new Error("Template ("+s.template+") could not be loaded. "+t)}),v.promise};return y.primary=function(t){return this(t,"primary")},y.error=function(t){return this(t,"error")},y.success=function(t){return this(t,"success")},y.info=function(t){return this(t,"info")},y.warning=function(t){return this(t,"warning")},y.clearAll=function(){angular.forEach(g,function(t){t.addClass("killed")})},y}]}),angular.module("ui-notification").run(["$templateCache",function(t){t.put("angular-ui-notification.html",'

')}]); \ No newline at end of file diff --git a/src/angular-ui-notification.js b/src/angular-ui-notification.js index 71f2a8c..91daafe 100644 --- a/src/angular-ui-notification.js +++ b/src/angular-ui-notification.js @@ -54,7 +54,7 @@ angular.module('ui-notification').provider('Notification', function() { args.closeOnClick = (args.closeOnClick !== null && args.closeOnClick !== undefined) ? args.closeOnClick : options.closeOnClick; args.container = args.container ? args.container : options.container; args.priority = args.priority ? args.priority : options.priority; - + var template=$templateCache.get(args.template); if(template){ @@ -68,10 +68,10 @@ angular.module('ui-notification').provider('Notification', function() { }) .catch(function(data){ throw new Error('Template ('+args.template+') could not be loaded. ' + data); - }); - } - - + }); + } + + function processNotificationTemplate(template) { var scope = args.scope.$new(); @@ -197,13 +197,15 @@ angular.module('ui-notification').provider('Notification', function() { scope.kill = function(isHard) { if (isHard) { - if (scope.onClose) { - scope.$apply(scope.onClose(scope._templateElement)); - } + scope.$applyAsync(function() { + if (scope.onClose) { + scope.onClose(scope._templateElement); + } + messageElements.splice(messageElements.indexOf(scope._templateElement), 1); + scope._templateElement.remove(); + scope.$destroy(); + }); - messageElements.splice(messageElements.indexOf(scope._templateElement), 1); - scope._templateElement.remove(); - scope.$destroy(); $timeout(reposite); } else { scope._templateElement.addClass('killed');