diff --git a/dist/angular-permission-ng.js b/dist/angular-permission-ng.js index 174c22c..0bfcee0 100644 --- a/dist/angular-permission-ng.js +++ b/dist/angular-permission-ng.js @@ -1,218 +1,218 @@ -/** - * angular-permission-ng - * Extension module of angular-permission for access control within angular-route - * @version v5.3.2 - 2017-05-29 - * @link https://github.com/Narzerus/angular-permission - * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak - * @license MIT License, http://www.opensource.org/licenses/MIT - */ - -(function (window, angular, undefined) { - 'use strict'; - - /** - * @namespace permission.ng - */ - - /** - * @param $rootScope {Object} - * @param $location {Object} - * @param PermTransitionProperties {permission.PermTransitionProperties} - * @param PermTransitionEvents {permission.ng.PermTransitionEvents} - * @param PermAuthorization {permission.PermAuthorization} - * @param PermPermissionMap {permission.PermPermissionMap|Function} - */ - run.$inject = ['$rootScope', '$location', 'PermTransitionProperties', 'PermTransitionEvents', 'PermAuthorization', 'PermPermissionMap']; - PermTransitionEvents.$inject = ['$delegate', '$rootScope', 'PermTransitionProperties', 'PermTransitionEventNames']; - - function run($rootScope, $location, PermTransitionProperties, PermTransitionEvents, PermAuthorization, PermPermissionMap) { - 'ngInject'; - - /** - * State transition interceptor - */ - $rootScope.$on('$routeChangeStart', function (event, next, current) { - setTransitionProperties(); - - if (areSetRoutePermissions() && !PermTransitionEvents.areEventsDefaultPrevented()) { - - PermTransitionEvents.broadcastPermissionStartEvent(); - - next.$$route.resolve = next.$$route.resolve || {}; - next.$$route.resolve.$$permission = permissionResolver; - } - - /** - * Checks if route has set permissions restrictions - * @method - * @private - * - * @returns {boolean} - */ - function areSetRoutePermissions() { - try { - return !!next.$$route.data.permissions; - } catch (e) { - return false; - } - } - - /** - * Updates values of `PermTransitionProperties` holder object - * @method - * @private - */ - function setTransitionProperties() { - PermTransitionProperties.next = next; - PermTransitionProperties.current = current; - } - - function permissionResolver() { - var PermissionMap = new PermPermissionMap({ - only: next.$$route.data.permissions.only, - except: next.$$route.data.permissions.except, - redirectTo: next.$$route.data.permissions.redirectTo - }); - - var authorizationResult = PermAuthorization.authorizeByPermissionMap(PermissionMap); - - authorizationResult - .then(function () { - handleAuthorizedState(); - }) - .catch(function (rejectedPermission) { - handleUnauthorizedState(rejectedPermission, PermissionMap); - }); - - return authorizationResult; - } - - /** - * Handles redirection for authorized access - * @method - * @private - */ - function handleAuthorizedState() { - PermTransitionEvents.broadcastPermissionAcceptedEvent(); - } - - /** - * Handles redirection for unauthorized access - * @method - * @private - * - * @param rejectedPermission {String} Rejected access right - * @param permissionMap {permission.PermPermissionMap} State permission map - */ - function handleUnauthorizedState(rejectedPermission, permissionMap) { - PermTransitionEvents.broadcastPermissionDeniedEvent(); - - permissionMap - .resolveRedirectState(rejectedPermission) - .then(function (redirect) { - $location.path(redirect.state).replace(); - }); - } - }); - } - - var ngPermission = angular - .module('permission.ng', ['permission', 'ngRoute']) - .run(run); - - if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports) { - module.exports = ngPermission.name; - } - - /** - * Service responsible for managing and emitting events - * @name permission.ng.PermTransitionEvents - * - * @extends {permission.PermTransitionEvents} - * - * @param $delegate {Object} Parent instance being extended - * @param $rootScope {Object} Top-level angular scope - * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing transition parameters - * @param PermTransitionEventNames {permission.ng.PermTransitionEventNames} Constant storing event names - */ - function PermTransitionEvents($delegate, $rootScope, PermTransitionProperties, PermTransitionEventNames) { - 'ngInject'; - - $delegate.areEventsDefaultPrevented = areEventsDefaultPrevented; - $delegate.broadcastPermissionStartEvent = broadcastPermissionStartEvent; - $delegate.broadcastPermissionAcceptedEvent = broadcastPermissionAcceptedEvent; - $delegate.broadcastPermissionDeniedEvent = broadcastPermissionDeniedEvent; - - /** - * Checks if state events are not prevented by default - * @methodOf permission.ng.PermTransitionEvents - * - * @returns {boolean} - */ - function areEventsDefaultPrevented() { - return isRouteChangePermissionStartDefaultPrevented(); - } - - /** - * Broadcasts "$routeChangePermissionStart" event from $rootScope - * @methodOf permission.ng.PermTransitionEvents - */ - function broadcastPermissionStartEvent() { - $rootScope.$broadcast(PermTransitionEventNames.permissionStart, PermTransitionProperties.next); - } - - /** - * Broadcasts "$routeChangePermissionAccepted" event from $rootScope - * @methodOf permission.ng.PermTransitionEvents - */ - function broadcastPermissionAcceptedEvent() { - $rootScope.$broadcast(PermTransitionEventNames.permissionAccepted, PermTransitionProperties.next); - } - - /** - * Broadcasts "$routeChangePermissionDenied" event from $rootScope - * @methodOf permission.ng.PermTransitionEvents - */ - function broadcastPermissionDeniedEvent() { - $rootScope.$broadcast(PermTransitionEventNames.permissionDenied, PermTransitionProperties.next); - } - - /** - * Checks if event $routeChangePermissionStart hasn't been disabled by default - * @methodOf permission.ng.PermTransitionEvents - * @private - * - * @returns {boolean} - */ - function isRouteChangePermissionStartDefaultPrevented() { - return $rootScope.$broadcast(PermTransitionEventNames.permissionStart, PermTransitionProperties.next).defaultPrevented; - } - - return $delegate; - } - - angular - .module('permission.ng') - .decorator('PermTransitionEvents', PermTransitionEvents); - - /** - * Constant storing event names for ng-route - * @name permission.ng.PermTransitionEventNames - * - * @type {Object.} - * - * @property permissionStart {String} Event name called when started checking for permissions - * @property permissionAccepted {String} Event name called when authorized - * @property permissionDenied {String} Event name called when unauthorized - */ - var PermTransitionEventNames = { - permissionStart: '$routeChangePermissionStart', - permissionAccepted: '$routeChangePermissionAccepted', - permissionDenied: '$routeChangePermissionDenied' - }; - - angular - .module('permission.ng') - .value('PermTransitionEventNames', PermTransitionEventNames); - +/** + * angular-permission-ng + * Extension module of angular-permission for access control within angular-route + * @version v5.3.2 - 2018-02-27 + * @link https://github.com/Narzerus/angular-permission + * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak + * @license MIT License, http://www.opensource.org/licenses/MIT + */ + +(function (window, angular, undefined) { + 'use strict'; + + /** + * @namespace permission.ng + */ + + /** + * @param $rootScope {Object} + * @param $location {Object} + * @param PermTransitionProperties {permission.PermTransitionProperties} + * @param PermTransitionEvents {permission.ng.PermTransitionEvents} + * @param PermAuthorization {permission.PermAuthorization} + * @param PermPermissionMap {permission.PermPermissionMap|Function} + */ + run.$inject = ['$rootScope', '$location', 'PermTransitionProperties', 'PermTransitionEvents', 'PermAuthorization', 'PermPermissionMap']; + PermTransitionEvents.$inject = ['$delegate', '$rootScope', 'PermTransitionProperties', 'PermTransitionEventNames']; + + function run($rootScope, $location, PermTransitionProperties, PermTransitionEvents, PermAuthorization, PermPermissionMap) { + 'ngInject'; + + /** + * State transition interceptor + */ + $rootScope.$on('$routeChangeStart', function (event, next, current) { + setTransitionProperties(); + + if (areSetRoutePermissions() && !PermTransitionEvents.areEventsDefaultPrevented()) { + + PermTransitionEvents.broadcastPermissionStartEvent(); + + next.$$route.resolve = next.$$route.resolve || {}; + next.$$route.resolve.$$permission = permissionResolver; + } + + /** + * Checks if route has set permissions restrictions + * @method + * @private + * + * @returns {boolean} + */ + function areSetRoutePermissions() { + try { + return !!next.$$route.data.permissions; + } catch (e) { + return false; + } + } + + /** + * Updates values of `PermTransitionProperties` holder object + * @method + * @private + */ + function setTransitionProperties() { + PermTransitionProperties.next = next; + PermTransitionProperties.current = current; + } + + function permissionResolver() { + var PermissionMap = new PermPermissionMap({ + only: next.$$route.data.permissions.only, + except: next.$$route.data.permissions.except, + redirectTo: next.$$route.data.permissions.redirectTo + }); + + var authorizationResult = PermAuthorization.authorizeByPermissionMap(PermissionMap); + + authorizationResult + .then(function () { + handleAuthorizedState(); + }) + .catch(function (rejectedPermission) { + handleUnauthorizedState(rejectedPermission, PermissionMap); + }); + + return authorizationResult; + } + + /** + * Handles redirection for authorized access + * @method + * @private + */ + function handleAuthorizedState() { + PermTransitionEvents.broadcastPermissionAcceptedEvent(); + } + + /** + * Handles redirection for unauthorized access + * @method + * @private + * + * @param rejectedPermission {String} Rejected access right + * @param permissionMap {permission.PermPermissionMap} State permission map + */ + function handleUnauthorizedState(rejectedPermission, permissionMap) { + PermTransitionEvents.broadcastPermissionDeniedEvent(); + + permissionMap + .resolveRedirectState(rejectedPermission) + .then(function (redirect) { + $location.path(redirect.state).replace(); + }); + } + }); + } + + var ngPermission = angular + .module('permission.ng', ['permission', 'ngRoute']) + .run(run); + + if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports) { + module.exports = ngPermission.name; + } + + /** + * Service responsible for managing and emitting events + * @name permission.ng.PermTransitionEvents + * + * @extends {permission.PermTransitionEvents} + * + * @param $delegate {Object} Parent instance being extended + * @param $rootScope {Object} Top-level angular scope + * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing transition parameters + * @param PermTransitionEventNames {permission.ng.PermTransitionEventNames} Constant storing event names + */ + function PermTransitionEvents($delegate, $rootScope, PermTransitionProperties, PermTransitionEventNames) { + 'ngInject'; + + $delegate.areEventsDefaultPrevented = areEventsDefaultPrevented; + $delegate.broadcastPermissionStartEvent = broadcastPermissionStartEvent; + $delegate.broadcastPermissionAcceptedEvent = broadcastPermissionAcceptedEvent; + $delegate.broadcastPermissionDeniedEvent = broadcastPermissionDeniedEvent; + + /** + * Checks if state events are not prevented by default + * @methodOf permission.ng.PermTransitionEvents + * + * @returns {boolean} + */ + function areEventsDefaultPrevented() { + return isRouteChangePermissionStartDefaultPrevented(); + } + + /** + * Broadcasts "$routeChangePermissionStart" event from $rootScope + * @methodOf permission.ng.PermTransitionEvents + */ + function broadcastPermissionStartEvent() { + $rootScope.$broadcast(PermTransitionEventNames.permissionStart, PermTransitionProperties.next); + } + + /** + * Broadcasts "$routeChangePermissionAccepted" event from $rootScope + * @methodOf permission.ng.PermTransitionEvents + */ + function broadcastPermissionAcceptedEvent() { + $rootScope.$broadcast(PermTransitionEventNames.permissionAccepted, PermTransitionProperties.next); + } + + /** + * Broadcasts "$routeChangePermissionDenied" event from $rootScope + * @methodOf permission.ng.PermTransitionEvents + */ + function broadcastPermissionDeniedEvent() { + $rootScope.$broadcast(PermTransitionEventNames.permissionDenied, PermTransitionProperties.next); + } + + /** + * Checks if event $routeChangePermissionStart hasn't been disabled by default + * @methodOf permission.ng.PermTransitionEvents + * @private + * + * @returns {boolean} + */ + function isRouteChangePermissionStartDefaultPrevented() { + return $rootScope.$broadcast(PermTransitionEventNames.permissionStart, PermTransitionProperties.next).defaultPrevented; + } + + return $delegate; + } + + angular + .module('permission.ng') + .decorator('PermTransitionEvents', PermTransitionEvents); + + /** + * Constant storing event names for ng-route + * @name permission.ng.PermTransitionEventNames + * + * @type {Object.} + * + * @property permissionStart {String} Event name called when started checking for permissions + * @property permissionAccepted {String} Event name called when authorized + * @property permissionDenied {String} Event name called when unauthorized + */ + var PermTransitionEventNames = { + permissionStart: '$routeChangePermissionStart', + permissionAccepted: '$routeChangePermissionAccepted', + permissionDenied: '$routeChangePermissionDenied' + }; + + angular + .module('permission.ng') + .value('PermTransitionEventNames', PermTransitionEventNames); + }(window, window.angular)); diff --git a/dist/angular-permission-ng.min.js b/dist/angular-permission-ng.min.js index 6b42450..d0879fb 100644 --- a/dist/angular-permission-ng.min.js +++ b/dist/angular-permission-ng.min.js @@ -1,12 +1,12 @@ /** * angular-permission-ng * Extension module of angular-permission for access control within angular-route - * @version v5.3.2 - 2017-05-29 + * @version v5.3.2 - 2018-02-27 * @link https://github.com/Narzerus/angular-permission * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak * @license MIT License, http://www.opensource.org/licenses/MIT */ -!function(a,angular,b){"use strict";function c(a,b,c,d,e,f){"ngInject";a.$on("$routeChangeStart",function(a,g,h){function i(){try{return!!g.$$route.data.permissions}catch(a){return!1}}function j(){c.next=g,c.current=h}function k(){var a=new f({only:g.$$route.data.permissions.only,except:g.$$route.data.permissions.except,redirectTo:g.$$route.data.permissions.redirectTo}),b=e.authorizeByPermissionMap(a);return b.then(function(){l()}).catch(function(b){m(b,a)}),b}function l(){d.broadcastPermissionAcceptedEvent()}function m(a,c){d.broadcastPermissionDeniedEvent(),c.resolveRedirectState(a).then(function(a){b.path(a.state).replace()})}j(),i()&&!d.areEventsDefaultPrevented()&&(d.broadcastPermissionStartEvent(),g.$$route.resolve=g.$$route.resolve||{},g.$$route.resolve.$$permission=k)})}function d(a,b,c,d){"ngInject";function e(){return i()}function f(){b.$broadcast(d.permissionStart,c.next)}function g(){b.$broadcast(d.permissionAccepted,c.next)}function h(){b.$broadcast(d.permissionDenied,c.next)}function i(){return b.$broadcast(d.permissionStart,c.next).defaultPrevented}return a.areEventsDefaultPrevented=e,a.broadcastPermissionStartEvent=f,a.broadcastPermissionAcceptedEvent=g,a.broadcastPermissionDeniedEvent=h,a}c.$inject=["$rootScope","$location","PermTransitionProperties","PermTransitionEvents","PermAuthorization","PermPermissionMap"],d.$inject=["$delegate","$rootScope","PermTransitionProperties","PermTransitionEventNames"];var e=angular.module("permission.ng",["permission","ngRoute"]).run(c);"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports=e.name),angular.module("permission.ng").decorator("PermTransitionEvents",d);var f={permissionStart:"$routeChangePermissionStart",permissionAccepted:"$routeChangePermissionAccepted",permissionDenied:"$routeChangePermissionDenied"};angular.module("permission.ng").value("PermTransitionEventNames",f)}(window,window.angular); +!function(a,angular,b){"use strict";function c(a,b,c,d,e,f){"ngInject";a.$on("$routeChangeStart",function(a,g,h){function i(){try{return!!g.$$route.data.permissions}catch(a){return!1}}function j(){c.next=g,c.current=h}function k(){var a=new f({only:g.$$route.data.permissions.only,except:g.$$route.data.permissions.except,redirectTo:g.$$route.data.permissions.redirectTo}),b=e.authorizeByPermissionMap(a);return b.then(function(){l()})["catch"](function(b){m(b,a)}),b}function l(){d.broadcastPermissionAcceptedEvent()}function m(a,c){d.broadcastPermissionDeniedEvent(),c.resolveRedirectState(a).then(function(a){b.path(a.state).replace()})}j(),i()&&!d.areEventsDefaultPrevented()&&(d.broadcastPermissionStartEvent(),g.$$route.resolve=g.$$route.resolve||{},g.$$route.resolve.$$permission=k)})}function d(a,b,c,d){"ngInject";function e(){return i()}function f(){b.$broadcast(d.permissionStart,c.next)}function g(){b.$broadcast(d.permissionAccepted,c.next)}function h(){b.$broadcast(d.permissionDenied,c.next)}function i(){return b.$broadcast(d.permissionStart,c.next).defaultPrevented}return a.areEventsDefaultPrevented=e,a.broadcastPermissionStartEvent=f,a.broadcastPermissionAcceptedEvent=g,a.broadcastPermissionDeniedEvent=h,a}c.$inject=["$rootScope","$location","PermTransitionProperties","PermTransitionEvents","PermAuthorization","PermPermissionMap"],d.$inject=["$delegate","$rootScope","PermTransitionProperties","PermTransitionEventNames"];var e=angular.module("permission.ng",["permission","ngRoute"]).run(c);"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports=e.name),angular.module("permission.ng").decorator("PermTransitionEvents",d);var f={permissionStart:"$routeChangePermissionStart",permissionAccepted:"$routeChangePermissionAccepted",permissionDenied:"$routeChangePermissionDenied"};angular.module("permission.ng").value("PermTransitionEventNames",f)}(window,window.angular); //# sourceMappingURL=angular-permission-ng.min.js.map \ No newline at end of file diff --git a/dist/angular-permission-ng.min.js.map b/dist/angular-permission-ng.min.js.map index b4a0265..1e4e80b 100644 --- a/dist/angular-permission-ng.min.js.map +++ b/dist/angular-permission-ng.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["angular-permission-ng.js"],"names":["window","angular","undefined","run","$rootScope","$location","PermTransitionProperties","PermTransitionEvents","PermAuthorization","PermPermissionMap","$on","event","next","current","areSetRoutePermissions","$$route","data","permissions","e","setTransitionProperties","permissionResolver","PermissionMap","only","except","redirectTo","authorizationResult","authorizeByPermissionMap","then","handleAuthorizedState","catch","rejectedPermission","handleUnauthorizedState","broadcastPermissionAcceptedEvent","permissionMap","broadcastPermissionDeniedEvent","resolveRedirectState","redirect","path","state","replace","areEventsDefaultPrevented","broadcastPermissionStartEvent","resolve","$$permission","$delegate","PermTransitionEventNames","isRouteChangePermissionStartDefaultPrevented","$broadcast","permissionStart","permissionAccepted","permissionDenied","defaultPrevented","$inject","ngPermission","module","exports","name","decorator","value"],"mappings":";;;;;;;;;;CASC,SAAUA,EAAQC,QAASC,GAC1B,YAiBA,SAASC,GAAIC,EAAYC,EAAWC,EAA0BC,EAAsBC,EAAmBC,GACrG,UAKAL,GAAWM,IAAI,oBAAqB,SAAUC,EAAOC,EAAMC,GAkBzD,QAASC,KACP,IACE,QAASF,EAAKG,QAAQC,KAAKC,YAC3B,MAAOC,GACP,OAAO,GASX,QAASC,KACPb,EAAyBM,KAAOA,EAChCN,EAAyBO,QAAUA,EAGrC,QAASO,KACP,GAAIC,GAAgB,GAAIZ,IACtBa,KAAMV,EAAKG,QAAQC,KAAKC,YAAYK,KACpCC,OAAQX,EAAKG,QAAQC,KAAKC,YAAYM,OACtCC,WAAYZ,EAAKG,QAAQC,KAAKC,YAAYO,aAGxCC,EAAsBjB,EAAkBkB,yBAAyBL,EAUrE,OARAI,GACGE,KAAK,WACJC,MAEDC,MAAM,SAAUC,GACfC,EAAwBD,EAAoBT,KAGzCI,EAQT,QAASG,KACPrB,EAAqByB,mCAWvB,QAASD,GAAwBD,EAAoBG,GACnD1B,EAAqB2B,iCAErBD,EACGE,qBAAqBL,GACrBH,KAAK,SAAUS,GACd/B,EAAUgC,KAAKD,EAASE,OAAOC,YA9ErCpB,IAEIL,MAA6BP,EAAqBiC,8BAEpDjC,EAAqBkC,gCAErB7B,EAAKG,QAAQ2B,QAAU9B,EAAKG,QAAQ2B,YACpC9B,EAAKG,QAAQ2B,QAAQC,aAAevB,KAgG1C,QAASb,GAAqBqC,EAAWxC,EAAYE,EAA0BuC,GAC7E,UAaA,SAASL,KACP,MAAOM,KAOT,QAASL,KACPrC,EAAW2C,WAAWF,EAAyBG,gBAAiB1C,EAAyBM,MAO3F,QAASoB,KACP5B,EAAW2C,WAAWF,EAAyBI,mBAAoB3C,EAAyBM,MAO9F,QAASsB,KACP9B,EAAW2C,WAAWF,EAAyBK,iBAAkB5C,EAAyBM,MAU5F,QAASkC,KACP,MAAO1C,GAAW2C,WAAWF,EAAyBG,gBAAiB1C,EAAyBM,MAAMuC,iBAGxG,MAlDAP,GAAUJ,0BAA4BA,EACtCI,EAAUH,8BAAgCA,EAC1CG,EAAUZ,iCAAmCA,EAC7CY,EAAUV,+BAAiCA,EA+CpCU,EAtKTzC,EAAIiD,SAAW,aAAc,YAAa,2BAA4B,uBAAwB,oBAAqB,qBACnH7C,EAAqB6C,SAAW,YAAa,aAAc,2BAA4B,2BA6FvF,IAAIC,GAAepD,QAChBqD,OAAO,iBAAkB,aAAc,YACvCnD,IAAIA,EAEe,oBAAXmD,SAA6C,mBAAZC,UAA2BD,OAAOC,UAAYA,UACxFD,OAAOC,QAAUF,EAAaG,MAsEhCvD,QACGqD,OAAO,iBACPG,UAAU,uBAAwBlD,EAYrC,IAAIsC,IACFG,gBAAiB,8BACjBC,mBAAoB,iCACpBC,iBAAkB,+BAGpBjD,SACGqD,OAAO,iBACPI,MAAM,2BAA4Bb,IAErC7C,OAAQA,OAAOC","file":"angular-permission-ng.min.js"} \ No newline at end of file +{"version":3,"sources":["angular-permission-ng.js"],"names":["window","angular","undefined","run","$rootScope","$location","PermTransitionProperties","PermTransitionEvents","PermAuthorization","PermPermissionMap","$on","event","next","current","areSetRoutePermissions","$$route","data","permissions","e","setTransitionProperties","permissionResolver","PermissionMap","only","except","redirectTo","authorizationResult","authorizeByPermissionMap","then","handleAuthorizedState","rejectedPermission","handleUnauthorizedState","broadcastPermissionAcceptedEvent","permissionMap","broadcastPermissionDeniedEvent","resolveRedirectState","redirect","path","state","replace","areEventsDefaultPrevented","broadcastPermissionStartEvent","resolve","$$permission","$delegate","PermTransitionEventNames","isRouteChangePermissionStartDefaultPrevented","$broadcast","permissionStart","permissionAccepted","permissionDenied","defaultPrevented","$inject","ngPermission","module","exports","name","decorator","value"],"mappings":";;;;;;;;;;CASC,SAAUA,EAAQC,QAASC,GAC1B,YAiBA,SAASC,GAAIC,EAAYC,EAAWC,EAA0BC,EAAsBC,EAAmBC,GACrG,UAKAL,GAAWM,IAAI,oBAAqB,SAAUC,EAAOC,EAAMC,GAkBzD,QAASC,KACP,IACE,QAASF,EAAKG,QAAQC,KAAKC,YAC3B,MAAOC,GACP,OAAO,GASX,QAASC,KACPb,EAAyBM,KAAOA,EAChCN,EAAyBO,QAAUA,EAGrC,QAASO,KACP,GAAIC,GAAgB,GAAIZ,IACtBa,KAAMV,EAAKG,QAAQC,KAAKC,YAAYK,KACpCC,OAAQX,EAAKG,QAAQC,KAAKC,YAAYM,OACtCC,WAAYZ,EAAKG,QAAQC,KAAKC,YAAYO,aAGxCC,EAAsBjB,EAAkBkB,yBAAyBL,EAUrE,OARAI,GACGE,KAAK,WACJC,MAFJH,SAIS,SAAUI,GACfC,EAAwBD,EAAoBR,KAGzCI,EAQT,QAASG,KACPrB,EAAqBwB,mCAWvB,QAASD,GAAwBD,EAAoBG,GACnDzB,EAAqB0B,iCAErBD,EACGE,qBAAqBL,GACrBF,KAAK,SAAUQ,GACd9B,EAAU+B,KAAKD,EAASE,OAAOC,YA9ErCnB,IAEIL,MAA6BP,EAAqBgC,8BAEpDhC,EAAqBiC,gCAErB5B,EAAKG,QAAQ0B,QAAU7B,EAAKG,QAAQ0B,YACpC7B,EAAKG,QAAQ0B,QAAQC,aAAetB,KAgG1C,QAASb,GAAqBoC,EAAWvC,EAAYE,EAA0BsC,GAC7E,UAaA,SAASL,KACP,MAAOM,KAOT,QAASL,KACPpC,EAAW0C,WAAWF,EAAyBG,gBAAiBzC,EAAyBM,MAO3F,QAASmB,KACP3B,EAAW0C,WAAWF,EAAyBI,mBAAoB1C,EAAyBM,MAO9F,QAASqB,KACP7B,EAAW0C,WAAWF,EAAyBK,iBAAkB3C,EAAyBM,MAU5F,QAASiC,KACP,MAAOzC,GAAW0C,WAAWF,EAAyBG,gBAAiBzC,EAAyBM,MAAMsC,iBAGxG,MAlDAP,GAAUJ,0BAA4BA,EACtCI,EAAUH,8BAAgCA,EAC1CG,EAAUZ,iCAAmCA,EAC7CY,EAAUV,+BAAiCA,EA+CpCU,EAtKTxC,EAAIgD,SAAW,aAAc,YAAa,2BAA4B,uBAAwB,oBAAqB,qBACnH5C,EAAqB4C,SAAW,YAAa,aAAc,2BAA4B,2BA6FvF,IAAIC,GAAenD,QAChBoD,OAAO,iBAAkB,aAAc,YACvClD,IAAIA,EAEe,oBAAXkD,SAA6C,mBAAZC,UAA2BD,OAAOC,UAAYA,UACxFD,OAAOC,QAAUF,EAAaG,MAsEhCtD,QACGoD,OAAO,iBACPG,UAAU,uBAAwBjD,EAYrC,IAAIqC,IACFG,gBAAiB,8BACjBC,mBAAoB,iCACpBC,iBAAkB,+BAGpBhD,SACGoD,OAAO,iBACPI,MAAM,2BAA4Bb,IAErC5C,OAAQA,OAAOC","file":"angular-permission-ng.min.js"} \ No newline at end of file diff --git a/dist/angular-permission-ui.js b/dist/angular-permission-ui.js index 0dd1606..0bc4679 100644 --- a/dist/angular-permission-ui.js +++ b/dist/angular-permission-ui.js @@ -1,555 +1,578 @@ -/** - * angular-permission-ui - * Extension module of angular-permission for access control within ui-router - * @version v5.3.2 - 2017-05-29 - * @link https://github.com/Narzerus/angular-permission - * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak - * @license MIT License, http://www.opensource.org/licenses/MIT - */ - -(function (window, angular, undefined) { - 'use strict'; - - /** - * @namespace permission.ui - */ - - /** - * @param $stateProvider {Object} - */ - config.$inject = ['$stateProvider']; - run.$inject = ['$injector', '$rootScope', '$state', 'PermTransitionProperties', 'PermTransitionEvents', 'PermStateAuthorization', 'PermStatePermissionMap']; - PermTransitionEvents.$inject = ['$delegate', '$rootScope', 'PermTransitionProperties', 'PermTransitionEventNames']; - PermStateAuthorization.$inject = ['$q', '$state', 'PermStatePermissionMap']; - PermStatePermissionMap.$inject = ['PermPermissionMap']; - - function config($stateProvider) { - 'ngInject'; - - $stateProvider.decorator('$delegate', function ($delegate) { - - /** - * Property containing full state object definition - * - * This decorator is required to access full state object instead of just it's configuration - * Can be removed when implemented https://github.com/angular-ui/ui-router/issues/13. - * - * @returns {Object} - */ - $delegate.self.$$permissionState = function () { - return $delegate; - }; - - return $delegate; - }); - } - - /** - * @param $injector {Object} - * @param $rootScope {Object} - * @param $state {Object} - * @param PermTransitionProperties {permission.PermTransitionProperties} - * @param PermTransitionEvents {permission.ui.PermTransitionEvents} - * @param PermStateAuthorization {permission.ui.PermStateAuthorization} - * @param PermStatePermissionMap {permission.ui.PermStatePermissionMap} - */ - function run($injector, $rootScope, $state, PermTransitionProperties, PermTransitionEvents, PermStateAuthorization, PermStatePermissionMap) { - 'ngInject'; - - // For ui-router 1.x use $transitions web hook - if ($injector.has('$transitions')) { - var $transitions = $injector.get('$transitions'); - $transitions.onBefore({}, handleOnBeforeWebHook); - // For ui-router 0.x use old-style eventing - } else { - $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams, options) { - handleStateChangeStartEvent(event, toState, toParams, fromState, fromParams, options); - }); - } - - /** - * State transition web hook - * @param transition {Object} - */ - function handleOnBeforeWebHook(transition) { - setTransitionProperties(transition); - var statePermissionMap = new PermStatePermissionMap(PermTransitionProperties.toState); - - return PermStateAuthorization - .authorizeByPermissionMap(statePermissionMap) - .catch(function (rejectedPermission) { - return statePermissionMap - .resolveRedirectState(rejectedPermission) - .then(function (redirect) { - return transition.router.stateService.target(redirect.state, redirect.params, redirect.options); - }); - }); - - /** - * Updates values of `PermTransitionProperties` holder object - * @method - * @private - */ - function setTransitionProperties(transition) { - PermTransitionProperties.toState = transition.to(); - PermTransitionProperties.toParams = transition.params('to'); - PermTransitionProperties.fromState = transition.from(); - PermTransitionProperties.fromParams = transition.params('from'); - PermTransitionProperties.options = transition.options(); - } - } - - /** - * State transition event interceptor - */ - function handleStateChangeStartEvent(event, toState, toParams, fromState, fromParams, options) { - if (!isAuthorizationFinished()) { - setStateAuthorizationStatus(true); - setTransitionProperties(); - - if (!PermTransitionEvents.areEventsDefaultPrevented()) { - PermTransitionEvents.broadcastPermissionStartEvent(); - - event.preventDefault(); - var statePermissionMap = new PermStatePermissionMap(PermTransitionProperties.toState); - - PermStateAuthorization - .authorizeByPermissionMap(statePermissionMap) - .then(function () { - handleAuthorizedState(); - }) - .catch(function (rejectedPermission) { - handleUnauthorizedState(rejectedPermission, statePermissionMap); - }) - .finally(function () { - setStateAuthorizationStatus(false); - }); - } else { - setStateAuthorizationStatus(false); - } - } - - - /** - * Updates values of `PermTransitionProperties` holder object - * @method - * @private - */ - function setTransitionProperties() { - PermTransitionProperties.toState = toState; - PermTransitionProperties.toParams = toParams; - PermTransitionProperties.fromState = fromState; - PermTransitionProperties.fromParams = fromParams; - PermTransitionProperties.options = options; - } - - /** - * Sets internal state `$$finishedAuthorization` variable to prevent looping - * @method - * @private - * - * @param status {boolean} When true authorization has been already preceded - */ - function setStateAuthorizationStatus(status) { - angular.extend(toState, { - '$$isAuthorizationFinished': status - }); - } - - /** - * Checks if state has been already checked for authorization - * @method - * @private - * - * @returns {boolean} - */ - function isAuthorizationFinished() { - return toState.$$isAuthorizationFinished; - } - - /** - * Handles redirection for authorized access - * @method - * @private - */ - function handleAuthorizedState() { - PermTransitionEvents.broadcastPermissionAcceptedEvent(); - - // Overwrite notify option to broadcast it later - var transitionOptions = angular.extend({}, PermTransitionProperties.options, { - notify: false, - location: true - }); - - $state - .go(PermTransitionProperties.toState.name, PermTransitionProperties.toParams, transitionOptions) - .then(function () { - PermTransitionEvents.broadcastStateChangeSuccessEvent(); - }); - } - - /** - * Handles redirection for unauthorized access - * @method - * @private - * - * @param rejectedPermission {String} Rejected access right - * @param statePermissionMap {permission.ui.PermPermissionMap} State permission map - */ - function handleUnauthorizedState(rejectedPermission, statePermissionMap) { - PermTransitionEvents.broadcastPermissionDeniedEvent(); - - statePermissionMap - .resolveRedirectState(rejectedPermission) - .then(function (redirect) { - $state.go(redirect.state, redirect.params, redirect.options); - }); - } - } - } - - var uiPermission = angular - .module('permission.ui', ['permission', 'ui.router']) - .config(config) - .run(run); - - if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports) { - module.exports = uiPermission.name; - } - - - /** - * Service responsible for managing and emitting events - * @name permission.ui.PermTransitionEvents - * - * @extends permission.PermTransitionEvents - * - * @param $delegate {Object} Parent instance being extended - * @param $rootScope {Object} Top-level angular scope - * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing transition parameters - * @param PermTransitionEventNames {permission.ui.PermTransitionEventNames} Constant storing event names - */ - function PermTransitionEvents($delegate, $rootScope, PermTransitionProperties, PermTransitionEventNames) { - 'ngInject'; - - $delegate.areEventsDefaultPrevented = areEventsDefaultPrevented; - $delegate.broadcastStateChangeSuccessEvent = broadcastStateChangeSuccessEvent; - $delegate.broadcastPermissionStartEvent = broadcastPermissionStartEvent; - $delegate.broadcastPermissionAcceptedEvent = broadcastPermissionAcceptedEvent; - $delegate.broadcastPermissionDeniedEvent = broadcastPermissionDeniedEvent; - - /** - * Checks if state events are not prevented by default - * @methodOf permission.ui.PermTransitionEvents - * - * @returns {boolean} - */ - function areEventsDefaultPrevented() { - return isStateChangePermissionStartDefaultPrevented() || isStateChangeStartDefaultPrevented(); - } - - /** - * Broadcasts "$stateChangePermissionStart" event from $rootScope - * @methodOf permission.ui.PermTransitionEvents - */ - function broadcastPermissionStartEvent() { - $rootScope.$broadcast(PermTransitionEventNames.permissionStart, - PermTransitionProperties.toState, PermTransitionProperties.toParams, - PermTransitionProperties.options); - } - - /** - * Broadcasts "$stateChangePermissionAccepted" event from $rootScope - * @methodOf permission.ui.PermTransitionEvents - */ - function broadcastPermissionAcceptedEvent() { - $rootScope.$broadcast(PermTransitionEventNames.permissionAccepted, - PermTransitionProperties.toState, PermTransitionProperties.toParams, - PermTransitionProperties.options); - } - - /** - * Broadcasts "$tateChangePermissionDenied" event from $rootScope - * @methodOf permission.ui.PermTransitionEvents - */ - function broadcastPermissionDeniedEvent() { - $rootScope.$broadcast(PermTransitionEventNames.permissionDenies, - PermTransitionProperties.toState, PermTransitionProperties.toParams, - PermTransitionProperties.options); - } - - /** - * Broadcasts "$stateChangeSuccess" event from $rootScope - * @methodOf permission.ui.PermTransitionEvents - */ - function broadcastStateChangeSuccessEvent() { - $rootScope.$broadcast('$stateChangeSuccess', - PermTransitionProperties.toState, PermTransitionProperties.toParams, - PermTransitionProperties.fromState, PermTransitionProperties.fromParams); - } - - /** - * Checks if event $stateChangePermissionStart hasn't been disabled by default - * @methodOf permission.ui.PermTransitionEvents - * @private - * - * @returns {boolean} - */ - function isStateChangePermissionStartDefaultPrevented() { - return $rootScope.$broadcast(PermTransitionEventNames.permissionStart, - PermTransitionProperties.toState, PermTransitionProperties.toParams, - PermTransitionProperties.options).defaultPrevented; - } - - /** - * Checks if event $stateChangeStart hasn't been disabled by default - * @methodOf permission.ui.PermTransitionEvents - * @private - * - * @returns {boolean} - */ - function isStateChangeStartDefaultPrevented() { - return $rootScope.$broadcast('$stateChangeStart', - PermTransitionProperties.toState, PermTransitionProperties.toParams, - PermTransitionProperties.fromState, PermTransitionProperties.fromParams, - PermTransitionProperties.options).defaultPrevented; - } - - return $delegate; - } - - angular - .module('permission.ui') - .decorator('PermTransitionEvents', PermTransitionEvents); - - /** - * Constant storing event names for ng-route - * @name permission.ui.PermTransitionEventNames - * - * @type {Object.} - * - * @property permissionStart {String} Event name called when started checking for permissions - * @property permissionAccepted {String} Event name called when authorized - * @property permissionDenies {String} Event name called when unauthorized - */ - var PermTransitionEventNames = { - permissionStart: '$stateChangePermissionStart', - permissionAccepted: '$stateChangePermissionAccepted', - permissionDenies: '$stateChangePermissionDenied' - }; - - angular - .module('permission.ui') - .value('PermTransitionEventNames', PermTransitionEventNames); - - - /** - * Service responsible for handling inheritance-enabled state-based authorization in ui-router - * @extends permission.PermPermissionMap - * @name permission.ui.PermStateAuthorization - * - * @param $q {Object} Angular promise implementation - * @param $state {Object} State object - * @param PermStatePermissionMap {permission.ui.PermStatePermissionMap|Function} Angular promise implementation - */ - function PermStateAuthorization($q, $state, PermStatePermissionMap) { - 'ngInject'; - - this.authorizeByPermissionMap = authorizeByPermissionMap; - this.authorizeByStateName = authorizeByStateName; - - /** - * Handles authorization based on provided state permission map - * @methodOf permission.ui.PermStateAuthorization - * - * @param statePermissionMap - * - * @return {promise} - */ - function authorizeByPermissionMap(statePermissionMap) { - return authorizeStatePermissionMap(statePermissionMap); - } - - /** - * Authorizes uses by provided state name - * @methodOf permission.ui.PermStateAuthorization - * - * @param stateName {String} - * @returns {promise} - */ - function authorizeByStateName(stateName) { - var srefState = $state.get(stateName); - var permissionMap = new PermStatePermissionMap(srefState); - - return authorizeByPermissionMap(permissionMap); - } - - /** - * Checks authorization for complex state inheritance - * @methodOf permission.ui.PermStateAuthorization - * @private - * - * @param map {permission.ui.StatePermissionMap} State access rights map - * - * @returns {promise} $q.promise object - */ - function authorizeStatePermissionMap(map) { - var deferred = $q.defer(); - - resolveExceptStatePermissionMap(deferred, map); - - return deferred.promise; - } - - /** - * Resolves compensated set of "except" privileges - * @methodOf permission.ui.PermStateAuthorization - * @private - * - * @param deferred {Object} Promise defer - * @param map {permission.ui.StatePermissionMap} State access rights map - */ - function resolveExceptStatePermissionMap(deferred, map) { - var exceptPromises = resolveStatePermissionMap(map.except, map); - - $q.all(exceptPromises) - .then(function (rejectedPermissions) { - deferred.reject(rejectedPermissions[0]); - }) - .catch(function () { - resolveOnlyStatePermissionMap(deferred, map); - }); - } - - /** - * Resolves compensated set of "only" privileges - * @methodOf permission.ui.PermStateAuthorization - * @private - * - * @param deferred {Object} Promise defer - * @param map {permission.ui.StatePermissionMap} State access rights map - */ - function resolveOnlyStatePermissionMap(deferred, map) { - if (!map.only.length) { - deferred.resolve(); - return; - } - - var onlyPromises = resolveStatePermissionMap(map.only, map); - - $q.all(onlyPromises) - .then(function (resolvedPermissions) { - deferred.resolve(resolvedPermissions); - }) - .catch(function (rejectedPermission) { - deferred.reject(rejectedPermission); - }); - } - - /** - * Performs iteration over list of privileges looking for matches - * @methodOf permission.ui.PermStateAuthorization - * @private - * - * @param privilegesNames {Array} Array of sets of access rights - * @param map {permission.ui.StatePermissionMap} State access rights map - * - * @returns {Array} Promise collection - */ - function resolveStatePermissionMap(privilegesNames, map) { - if (!privilegesNames.length) { - return [$q.reject()]; - } - - return privilegesNames.map(function (statePrivileges) { - var resolvedStatePrivileges = map.resolvePropertyValidity(statePrivileges); - return $q.any(resolvedStatePrivileges) - .then(function (resolvedPermissions) { - if (angular.isArray(resolvedPermissions)) { - return resolvedPermissions[0]; - } - return resolvedPermissions; - }); - }); - } - } - - angular - .module('permission') - .service('PermStateAuthorization', PermStateAuthorization); - - /** - * State Access rights map factory - * @function - * @name permission.ui.PermStatePermissionMap - * - * @param PermPermissionMap {permission.PermPermissionMap|Function} - * - * @return {permission.ui.PermStatePermissionMap} - */ - function PermStatePermissionMap(PermPermissionMap) { - 'ngInject'; - - StatePermissionMap.prototype = new PermPermissionMap(); - - /** - * Constructs map instructing authorization service how to handle authorizing - * @constructor permission.ui.PermStatePermissionMap - * @extends permission.PermPermissionMap - */ - function StatePermissionMap(state) { - var toStateObject = state.$$permissionState(); - var toStatePath = toStateObject.path; - - angular.forEach(toStatePath, function (state) { - if (areSetStatePermissions(state)) { - var permissionMap = new PermPermissionMap(state.data.permissions); - this.extendPermissionMap(permissionMap); - } - }, this); - } - - /** - * Extends permission map by pushing to it state's permissions - * @methodOf permission.ui.StatePermissionMap - * - * @param permissionMap {permission.PermPermissionMap} Compensated permission map - */ - StatePermissionMap.prototype.extendPermissionMap = function (permissionMap) { - if (permissionMap.only.length) { - this.only = this.only.concat([permissionMap.only]); - } - if (permissionMap.except.length) { - this.except = this.except.concat([permissionMap.except]); - } - - if (angular.isDefined(permissionMap.redirectTo)) { - this.redirectTo = angular.extend({}, this.redirectTo, permissionMap.redirectTo); - } - }; - - - /** - * Checks if state has set permissions - * We check for hasOwnProperty, because ui-router lets the `data` property inherit from its parent - * @methodOf permission.ui.StatePermissionMap - * @private - * - * @returns {boolean} - */ - function areSetStatePermissions(state) { - try { - return Object.prototype.hasOwnProperty.call(state.data, 'permissions'); - } catch (e) { - return false; - } - } - - return StatePermissionMap; - } - - angular - .module('permission.ui') - .factory('PermStatePermissionMap', PermStatePermissionMap); - +/** + * angular-permission-ui + * Extension module of angular-permission for access control within ui-router + * @version v5.3.2 - 2018-02-27 + * @link https://github.com/Narzerus/angular-permission + * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak + * @license MIT License, http://www.opensource.org/licenses/MIT + */ + +(function (window, angular, undefined) { + 'use strict'; + + /** + * @namespace permission.ui + */ + + /** + * @param $stateProvider {Object} + */ + config.$inject = ['$stateProvider']; + run.$inject = ['$injector', '$rootScope', '$state', 'PermTransitionProperties', 'PermTransitionEvents', 'PermStateAuthorization', 'PermStatePermissionMap']; + PermTransitionEvents.$inject = ['$delegate', '$rootScope', 'PermTransitionProperties', 'PermTransitionEventNames']; + PermStateAuthorization.$inject = ['$q', '$state', 'PermStatePermissionMap']; + PermStatePermissionMap.$inject = ['PermPermissionMap']; + + function config($stateProvider) { + 'ngInject'; + + $stateProvider.decorator('$delegate', function ($delegate) { + + /** + * Property containing full state object definition + * + * This decorator is required to access full state object instead of just it's configuration + * Can be removed when implemented https://github.com/angular-ui/ui-router/issues/13. + * + * @returns {Object} + */ + $delegate.self.$$permissionState = function () { + return $delegate; + }; + + return $delegate; + }); + } + + /** + * @param $injector {Object} + * @param $rootScope {Object} + * @param $state {Object} + * @param PermTransitionProperties {permission.PermTransitionProperties} + * @param PermTransitionEvents {permission.ui.PermTransitionEvents} + * @param PermStateAuthorization {permission.ui.PermStateAuthorization} + * @param PermStatePermissionMap {permission.ui.PermStatePermissionMap} + */ + function run($injector, $rootScope, $state, PermTransitionProperties, PermTransitionEvents, PermStateAuthorization, PermStatePermissionMap) { + 'ngInject'; + + // For ui-router 1.x use $transitions web hook + if ($injector.has('$transitions')) { + var $transitions = $injector.get('$transitions'); + $transitions.onBefore({}, handleOnBeforeWebHook); + // For ui-router 0.x use old-style eventing + } else { + $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams, options) { + handleStateChangeStartEvent(event, toState, toParams, fromState, fromParams, options); + }); + } + + /** + * State transition web hook + * @param transition {Object} + */ + function handleOnBeforeWebHook(transition) { + setTransitionProperties(transition); + var statePermissionMap = new PermStatePermissionMap(PermTransitionProperties.toState); + + return PermStateAuthorization + .authorizeByPermissionMap(statePermissionMap) + .catch(function (rejectedPermission) { + return statePermissionMap + .resolveRedirectState(rejectedPermission) + .then(function (redirect) { + return transition.router.stateService.target(redirect.state, redirect.params, redirect.options); + }); + }); + + /** + * Updates values of `PermTransitionProperties` holder object + * @method + * @private + */ + function setTransitionProperties(transition) { + PermTransitionProperties.toState = transition.to(); + PermTransitionProperties.toParams = transition.params('to'); + PermTransitionProperties.fromState = transition.from(); + PermTransitionProperties.fromParams = transition.params('from'); + PermTransitionProperties.options = transition.options(); + } + } + + /** + * State transition event interceptor + */ + function handleStateChangeStartEvent(event, toState, toParams, fromState, fromParams, options) { + if (!isAuthorizationFinished()) { + setStateAuthorizationStatus(true); + setTransitionProperties(); + + if (!PermTransitionEvents.areEventsDefaultPrevented()) { + PermTransitionEvents.broadcastPermissionStartEvent(); + + event.preventDefault(); + var statePermissionMap = new PermStatePermissionMap(PermTransitionProperties.toState); + + PermStateAuthorization + .authorizeByPermissionMap(statePermissionMap) + .then(function () { + handleAuthorizedState(); + }) + .catch(function (rejectedPermission) { + handleUnauthorizedState(rejectedPermission, statePermissionMap); + }) + .finally(function () { + setStateAuthorizationStatus(false); + }); + } else { + setStateAuthorizationStatus(false); + } + } + + + /** + * Updates values of `PermTransitionProperties` holder object + * @method + * @private + */ + function setTransitionProperties() { + PermTransitionProperties.toState = toState; + PermTransitionProperties.toParams = toParams; + PermTransitionProperties.fromState = fromState; + PermTransitionProperties.fromParams = fromParams; + PermTransitionProperties.options = options; + } + + /** + * Sets internal state `$$finishedAuthorization` variable to prevent looping + * @method + * @private + * + * @param status {boolean} When true authorization has been already preceded + */ + function setStateAuthorizationStatus(status) { + angular.extend(toState, { + '$$isAuthorizationFinished': status + }); + } + + /** + * Checks if state has been already checked for authorization + * @method + * @private + * + * @returns {boolean} + */ + function isAuthorizationFinished() { + return toState.$$isAuthorizationFinished; + } + + /** + * Handles redirection for authorized access + * @method + * @private + */ + function handleAuthorizedState() { + PermTransitionEvents.broadcastPermissionAcceptedEvent(); + + // Overwrite notify option to broadcast it later + var transitionOptions = angular.extend({}, PermTransitionProperties.options, { + notify: false, + location: true + }); + + $state + .go(PermTransitionProperties.toState.name, PermTransitionProperties.toParams, transitionOptions) + .then(function () { + PermTransitionEvents.broadcastStateChangeSuccessEvent(); + }); + } + + /** + * Handles redirection for unauthorized access + * @method + * @private + * + * @param rejectedPermission {String} Rejected access right + * @param statePermissionMap {permission.ui.PermPermissionMap} State permission map + */ + function handleUnauthorizedState(rejectedPermission, statePermissionMap) { + PermTransitionEvents.broadcastPermissionDeniedEvent(); + + statePermissionMap + .resolveRedirectState(rejectedPermission) + .then(function (redirect) { + $state.go(redirect.state, redirect.params, redirect.options); + }); + } + } + } + + var uiPermission = angular + .module('permission.ui', ['permission', 'ui.router']) + .config(config) + .run(run); + + if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports) { + module.exports = uiPermission.name; + } + + + /** + * Service responsible for managing and emitting events + * @name permission.ui.PermTransitionEvents + * + * @extends permission.PermTransitionEvents + * + * @param $delegate {Object} Parent instance being extended + * @param $rootScope {Object} Top-level angular scope + * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing transition parameters + * @param PermTransitionEventNames {permission.ui.PermTransitionEventNames} Constant storing event names + */ + function PermTransitionEvents($delegate, $rootScope, PermTransitionProperties, PermTransitionEventNames) { + 'ngInject'; + + $delegate.areEventsDefaultPrevented = areEventsDefaultPrevented; + $delegate.broadcastStateChangeSuccessEvent = broadcastStateChangeSuccessEvent; + $delegate.broadcastPermissionStartEvent = broadcastPermissionStartEvent; + $delegate.broadcastPermissionAcceptedEvent = broadcastPermissionAcceptedEvent; + $delegate.broadcastPermissionDeniedEvent = broadcastPermissionDeniedEvent; + + /** + * Checks if state events are not prevented by default + * @methodOf permission.ui.PermTransitionEvents + * + * @returns {boolean} + */ + function areEventsDefaultPrevented() { + return isStateChangePermissionStartDefaultPrevented() || isStateChangeStartDefaultPrevented(); + } + + /** + * Broadcasts "$stateChangePermissionStart" event from $rootScope + * @methodOf permission.ui.PermTransitionEvents + */ + function broadcastPermissionStartEvent() { + $rootScope.$broadcast(PermTransitionEventNames.permissionStart, + PermTransitionProperties.toState, PermTransitionProperties.toParams, + PermTransitionProperties.options); + } + + /** + * Broadcasts "$stateChangePermissionAccepted" event from $rootScope + * @methodOf permission.ui.PermTransitionEvents + */ + function broadcastPermissionAcceptedEvent() { + $rootScope.$broadcast(PermTransitionEventNames.permissionAccepted, + PermTransitionProperties.toState, PermTransitionProperties.toParams, + PermTransitionProperties.options); + } + + /** + * Broadcasts "$tateChangePermissionDenied" event from $rootScope + * @methodOf permission.ui.PermTransitionEvents + */ + function broadcastPermissionDeniedEvent() { + $rootScope.$broadcast(PermTransitionEventNames.permissionDenies, + PermTransitionProperties.toState, PermTransitionProperties.toParams, + PermTransitionProperties.options); + } + + /** + * Broadcasts "$stateChangeSuccess" event from $rootScope + * @methodOf permission.ui.PermTransitionEvents + */ + function broadcastStateChangeSuccessEvent() { + $rootScope.$broadcast('$stateChangeSuccess', + PermTransitionProperties.toState, PermTransitionProperties.toParams, + PermTransitionProperties.fromState, PermTransitionProperties.fromParams); + } + + /** + * Checks if event $stateChangePermissionStart hasn't been disabled by default + * @methodOf permission.ui.PermTransitionEvents + * @private + * + * @returns {boolean} + */ + function isStateChangePermissionStartDefaultPrevented() { + return $rootScope.$broadcast(PermTransitionEventNames.permissionStart, + PermTransitionProperties.toState, PermTransitionProperties.toParams, + PermTransitionProperties.options).defaultPrevented; + } + + /** + * Checks if event $stateChangeStart hasn't been disabled by default + * @methodOf permission.ui.PermTransitionEvents + * @private + * + * @returns {boolean} + */ + function isStateChangeStartDefaultPrevented() { + return $rootScope.$broadcast('$stateChangeStart', + PermTransitionProperties.toState, PermTransitionProperties.toParams, + PermTransitionProperties.fromState, PermTransitionProperties.fromParams, + PermTransitionProperties.options).defaultPrevented; + } + + return $delegate; + } + + angular + .module('permission.ui') + .decorator('PermTransitionEvents', PermTransitionEvents); + + /** + * Constant storing event names for ng-route + * @name permission.ui.PermTransitionEventNames + * + * @type {Object.} + * + * @property permissionStart {String} Event name called when started checking for permissions + * @property permissionAccepted {String} Event name called when authorized + * @property permissionDenies {String} Event name called when unauthorized + */ + var PermTransitionEventNames = { + permissionStart: '$stateChangePermissionStart', + permissionAccepted: '$stateChangePermissionAccepted', + permissionDenies: '$stateChangePermissionDenied' + }; + + angular + .module('permission.ui') + .value('PermTransitionEventNames', PermTransitionEventNames); + + + /** + * Service responsible for handling inheritance-enabled state-based authorization in ui-router + * @extends permission.PermPermissionMap + * @name permission.ui.PermStateAuthorization + * + * @param $q {Object} Angular promise implementation + * @param $state {Object} State object + * @param PermStatePermissionMap {permission.ui.PermStatePermissionMap|Function} Angular promise implementation + */ + function PermStateAuthorization($q, $state, PermStatePermissionMap) { + 'ngInject'; + + this.authorizeByPermissionMap = authorizeByPermissionMap; + this.authorizeByStateName = authorizeByStateName; + + /** + * Handles authorization based on provided state permission map + * @methodOf permission.ui.PermStateAuthorization + * + * @param statePermissionMap + * + * @return {promise} + */ + function authorizeByPermissionMap(statePermissionMap, options) { + return authorizeStatePermissionMap(statePermissionMap, options); + } + + /** + * Authorizes uses by provided state name + * @methodOf permission.ui.PermStateAuthorization + * + * @param stateName {String} + * @returns {promise} + */ + function authorizeByStateName(stateName, options) { + var srefState = $state.get(stateName); + var permissionMap = new PermStatePermissionMap(srefState, options); + + return authorizeByPermissionMap(permissionMap, options); + } + + /** + * Checks authorization for complex state inheritance + * @methodOf permission.ui.PermStateAuthorization + * @private + * + * @param map {permission.ui.StatePermissionMap} State access rights map + * + * @returns {promise} $q.promise object + */ + function authorizeStatePermissionMap(map, options) { + var deferred = $q.defer(); + + resolveExceptStatePermissionMap(deferred, map, options); + + return deferred.promise; + } + + /** + * Resolves compensated set of "except" privileges + * @methodOf permission.ui.PermStateAuthorization + * @private + * + * @param deferred {Object} Promise defer + * @param map {permission.ui.StatePermissionMap} State access rights map + */ + function resolveExceptStatePermissionMap(deferred, map, options) { + var exceptPromises = resolveStatePermissionMap(map.except, map, options); + + // Reverse the promises, so if any "except" privileges are not met, the promise rejects + $q.all(reversePromises(exceptPromises)) + .then(function () { + resolveOnlyStatePermissionMap(deferred, map, options); + }) + .catch(function (rejectedPermissions) { + + if (!angular.isArray(rejectedPermissions)) { + rejectedPermissions = [rejectedPermissions]; + } + + deferred.reject(rejectedPermissions[0]); + }); + } + + /** + * Resolves compensated set of "only" privileges + * @methodOf permission.ui.PermStateAuthorization + * @private + * + * @param deferred {Object} Promise defer + * @param map {permission.ui.StatePermissionMap} State access rights map + */ + function resolveOnlyStatePermissionMap(deferred, map, options) { + if (!map.only.length) { + deferred.resolve(); + return; + } + + var onlyPromises = resolveStatePermissionMap(map.only, map, options); + + $q.all(onlyPromises) + .then(function (resolvedPermissions) { + deferred.resolve(resolvedPermissions); + }) + .catch(function (rejectedPermission) { + deferred.reject(rejectedPermission); + }); + } + + /** + * Performs iteration over list of privileges looking for matches + * @methodOf permission.ui.PermStateAuthorization + * @private + * + * @param privilegesNames {Array} Array of sets of access rights + * @param map {permission.ui.StatePermissionMap} State access rights map + * + * @returns {Array} Promise collection + */ + function resolveStatePermissionMap(privilegesNames, map, options) { + if (!privilegesNames.length) { + return [$q.reject()]; + } + + return privilegesNames.map(function (statePrivileges) { + var resolvedStatePrivileges = map.resolvePropertyValidity(statePrivileges, options); + return $q.any(resolvedStatePrivileges) + .then(function (resolvedPermissions) { + if (angular.isArray(resolvedPermissions)) { + return resolvedPermissions[0]; + } + return resolvedPermissions; + }); + }); + } + + /** + * Creates an Array of Promises that resolve when rejected, and reject when resolved + * @methodOf permission.ui.PermStateAuthorization + * @private + * + * @param promises {Array} Array of promises + * + * @returns {Array} Promise collection + */ + function reversePromises(promises) { + return promises.map(function (promise) { + var d = $q.defer(); + promise.then(d.reject, d.resolve); + return d.promise; + }); + } + } + + angular + .module('permission') + .service('PermStateAuthorization', PermStateAuthorization); + + /** + * State Access rights map factory + * @function + * @name permission.ui.PermStatePermissionMap + * + * @param PermPermissionMap {permission.PermPermissionMap|Function} + * + * @return {permission.ui.PermStatePermissionMap} + */ + function PermStatePermissionMap(PermPermissionMap) { + 'ngInject'; + + StatePermissionMap.prototype = new PermPermissionMap(); + + /** + * Constructs map instructing authorization service how to handle authorizing + * @constructor permission.ui.PermStatePermissionMap + * @extends permission.PermPermissionMap + */ + function StatePermissionMap(state) { + var toStateObject = state.$$permissionState(); + var toStatePath = toStateObject.path; + + angular.forEach(toStatePath, function (state) { + if (areSetStatePermissions(state)) { + var permissionMap = new PermPermissionMap(state.data.permissions); + this.extendPermissionMap(permissionMap); + } + }, this); + } + + /** + * Extends permission map by pushing to it state's permissions + * @methodOf permission.ui.StatePermissionMap + * + * @param permissionMap {permission.PermPermissionMap} Compensated permission map + */ + StatePermissionMap.prototype.extendPermissionMap = function (permissionMap) { + if (permissionMap.only.length) { + this.only = this.only.concat([permissionMap.only]); + } + if (permissionMap.except.length) { + this.except = this.except.concat([permissionMap.except]); + } + + if (angular.isDefined(permissionMap.redirectTo)) { + this.redirectTo = angular.extend({}, this.redirectTo, permissionMap.redirectTo); + } + }; + + + /** + * Checks if state has set permissions + * We check for hasOwnProperty, because ui-router lets the `data` property inherit from its parent + * @methodOf permission.ui.StatePermissionMap + * @private + * + * @returns {boolean} + */ + function areSetStatePermissions(state) { + try { + return Object.prototype.hasOwnProperty.call(state.data, 'permissions'); + } catch (e) { + return false; + } + } + + return StatePermissionMap; + } + + angular + .module('permission.ui') + .factory('PermStatePermissionMap', PermStatePermissionMap); + }(window, window.angular)); diff --git a/dist/angular-permission-ui.min.js b/dist/angular-permission-ui.min.js index 0d9f4aa..e3c2903 100644 --- a/dist/angular-permission-ui.min.js +++ b/dist/angular-permission-ui.min.js @@ -1,12 +1,12 @@ /** * angular-permission-ui * Extension module of angular-permission for access control within ui-router - * @version v5.3.2 - 2017-05-29 + * @version v5.3.2 - 2018-02-27 * @link https://github.com/Narzerus/angular-permission * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak * @license MIT License, http://www.opensource.org/licenses/MIT */ -!function(a,angular,b){"use strict";function c(a){"ngInject";a.decorator("$delegate",function(a){return a.self.$$permissionState=function(){return a},a})}function d(a,b,c,d,e,f,g){"ngInject";function h(a){function b(a){d.toState=a.to(),d.toParams=a.params("to"),d.fromState=a.from(),d.fromParams=a.params("from"),d.options=a.options()}b(a);var c=new g(d.toState);return f.authorizeByPermissionMap(c).catch(function(b){return c.resolveRedirectState(b).then(function(b){return a.router.stateService.target(b.state,b.params,b.options)})})}function i(a,b,h,i,j,k){function l(){d.toState=b,d.toParams=h,d.fromState=i,d.fromParams=j,d.options=k}function m(a){angular.extend(b,{$$isAuthorizationFinished:a})}function n(){return b.$$isAuthorizationFinished}function o(){e.broadcastPermissionAcceptedEvent();var a=angular.extend({},d.options,{notify:!1,location:!0});c.go(d.toState.name,d.toParams,a).then(function(){e.broadcastStateChangeSuccessEvent()})}function p(a,b){e.broadcastPermissionDeniedEvent(),b.resolveRedirectState(a).then(function(a){c.go(a.state,a.params,a.options)})}if(!n())if(m(!0),l(),e.areEventsDefaultPrevented())m(!1);else{e.broadcastPermissionStartEvent(),a.preventDefault();var q=new g(d.toState);f.authorizeByPermissionMap(q).then(function(){o()}).catch(function(a){p(a,q)}).finally(function(){m(!1)})}}if(a.has("$transitions")){var j=a.get("$transitions");j.onBefore({},h)}else b.$on("$stateChangeStart",function(a,b,c,d,e,f){i(a,b,c,d,e,f)})}function e(a,b,c,d){"ngInject";function e(){return j()||k()}function f(){b.$broadcast(d.permissionStart,c.toState,c.toParams,c.options)}function g(){b.$broadcast(d.permissionAccepted,c.toState,c.toParams,c.options)}function h(){b.$broadcast(d.permissionDenies,c.toState,c.toParams,c.options)}function i(){b.$broadcast("$stateChangeSuccess",c.toState,c.toParams,c.fromState,c.fromParams)}function j(){return b.$broadcast(d.permissionStart,c.toState,c.toParams,c.options).defaultPrevented}function k(){return b.$broadcast("$stateChangeStart",c.toState,c.toParams,c.fromState,c.fromParams,c.options).defaultPrevented}return a.areEventsDefaultPrevented=e,a.broadcastStateChangeSuccessEvent=i,a.broadcastPermissionStartEvent=f,a.broadcastPermissionAcceptedEvent=g,a.broadcastPermissionDeniedEvent=h,a}function f(a,b,c){"ngInject";function d(a){return f(a)}function e(a){var e=b.get(a),f=new c(e);return d(f)}function f(b){var c=a.defer();return g(c,b),c.promise}function g(b,c){var d=i(c.except,c);a.all(d).then(function(a){b.reject(a[0])}).catch(function(){h(b,c)})}function h(b,c){if(!c.only.length)return void b.resolve();var d=i(c.only,c);a.all(d).then(function(a){b.resolve(a)}).catch(function(a){b.reject(a)})}function i(b,c){return b.length?b.map(function(b){var d=c.resolvePropertyValidity(b);return a.any(d).then(function(a){return angular.isArray(a)?a[0]:a})}):[a.reject()]}this.authorizeByPermissionMap=d,this.authorizeByStateName=e}function g(a){"ngInject";function b(b){var d=b.$$permissionState(),e=d.path;angular.forEach(e,function(b){if(c(b)){var d=new a(b.data.permissions);this.extendPermissionMap(d)}},this)}function c(a){try{return Object.prototype.hasOwnProperty.call(a.data,"permissions")}catch(a){return!1}}return b.prototype=new a,b.prototype.extendPermissionMap=function(a){a.only.length&&(this.only=this.only.concat([a.only])),a.except.length&&(this.except=this.except.concat([a.except])),angular.isDefined(a.redirectTo)&&(this.redirectTo=angular.extend({},this.redirectTo,a.redirectTo))},b}c.$inject=["$stateProvider"],d.$inject=["$injector","$rootScope","$state","PermTransitionProperties","PermTransitionEvents","PermStateAuthorization","PermStatePermissionMap"],e.$inject=["$delegate","$rootScope","PermTransitionProperties","PermTransitionEventNames"],f.$inject=["$q","$state","PermStatePermissionMap"],g.$inject=["PermPermissionMap"];var h=angular.module("permission.ui",["permission","ui.router"]).config(c).run(d);"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports=h.name),angular.module("permission.ui").decorator("PermTransitionEvents",e);var i={permissionStart:"$stateChangePermissionStart",permissionAccepted:"$stateChangePermissionAccepted",permissionDenies:"$stateChangePermissionDenied"};angular.module("permission.ui").value("PermTransitionEventNames",i),angular.module("permission").service("PermStateAuthorization",f),angular.module("permission.ui").factory("PermStatePermissionMap",g)}(window,window.angular); +!function(a,angular,b){"use strict";function c(a){"ngInject";a.decorator("$delegate",function(a){return a.self.$$permissionState=function(){return a},a})}function d(a,b,c,d,e,f,g){"ngInject";function h(a){function b(a){d.toState=a.to(),d.toParams=a.params("to"),d.fromState=a.from(),d.fromParams=a.params("from"),d.options=a.options()}b(a);var c=new g(d.toState);return f.authorizeByPermissionMap(c)["catch"](function(b){return c.resolveRedirectState(b).then(function(b){return a.router.stateService.target(b.state,b.params,b.options)})})}function i(a,b,h,i,j,k){function l(){d.toState=b,d.toParams=h,d.fromState=i,d.fromParams=j,d.options=k}function m(a){angular.extend(b,{$$isAuthorizationFinished:a})}function n(){return b.$$isAuthorizationFinished}function o(){e.broadcastPermissionAcceptedEvent();var a=angular.extend({},d.options,{notify:!1,location:!0});c.go(d.toState.name,d.toParams,a).then(function(){e.broadcastStateChangeSuccessEvent()})}function p(a,b){e.broadcastPermissionDeniedEvent(),b.resolveRedirectState(a).then(function(a){c.go(a.state,a.params,a.options)})}if(!n())if(m(!0),l(),e.areEventsDefaultPrevented())m(!1);else{e.broadcastPermissionStartEvent(),a.preventDefault();var q=new g(d.toState);f.authorizeByPermissionMap(q).then(function(){o()})["catch"](function(a){p(a,q)})["finally"](function(){m(!1)})}}if(a.has("$transitions")){var j=a.get("$transitions");j.onBefore({},h)}else b.$on("$stateChangeStart",function(a,b,c,d,e,f){i(a,b,c,d,e,f)})}function e(a,b,c,d){"ngInject";function e(){return j()||k()}function f(){b.$broadcast(d.permissionStart,c.toState,c.toParams,c.options)}function g(){b.$broadcast(d.permissionAccepted,c.toState,c.toParams,c.options)}function h(){b.$broadcast(d.permissionDenies,c.toState,c.toParams,c.options)}function i(){b.$broadcast("$stateChangeSuccess",c.toState,c.toParams,c.fromState,c.fromParams)}function j(){return b.$broadcast(d.permissionStart,c.toState,c.toParams,c.options).defaultPrevented}function k(){return b.$broadcast("$stateChangeStart",c.toState,c.toParams,c.fromState,c.fromParams,c.options).defaultPrevented}return a.areEventsDefaultPrevented=e,a.broadcastStateChangeSuccessEvent=i,a.broadcastPermissionStartEvent=f,a.broadcastPermissionAcceptedEvent=g,a.broadcastPermissionDeniedEvent=h,a}function f(a,b,c){"ngInject";function d(a,b){return f(a,b)}function e(a,e){var f=b.get(a),g=new c(f,e);return d(g,e)}function f(b,c){var d=a.defer();return g(d,b,c),d.promise}function g(b,c,d){var e=i(c.except,c,d);a.all(j(e)).then(function(){h(b,c,d)})["catch"](function(a){angular.isArray(a)||(a=[a]),b.reject(a[0])})}function h(b,c,d){if(!c.only.length)return void b.resolve();var e=i(c.only,c,d);a.all(e).then(function(a){b.resolve(a)})["catch"](function(a){b.reject(a)})}function i(b,c,d){return b.length?b.map(function(b){var e=c.resolvePropertyValidity(b,d);return a.any(e).then(function(a){return angular.isArray(a)?a[0]:a})}):[a.reject()]}function j(b){return b.map(function(b){var c=a.defer();return b.then(c.reject,c.resolve),c.promise})}this.authorizeByPermissionMap=d,this.authorizeByStateName=e}function g(a){"ngInject";function b(b){var d=b.$$permissionState(),e=d.path;angular.forEach(e,function(b){if(c(b)){var d=new a(b.data.permissions);this.extendPermissionMap(d)}},this)}function c(a){try{return Object.prototype.hasOwnProperty.call(a.data,"permissions")}catch(b){return!1}}return b.prototype=new a,b.prototype.extendPermissionMap=function(a){a.only.length&&(this.only=this.only.concat([a.only])),a.except.length&&(this.except=this.except.concat([a.except])),angular.isDefined(a.redirectTo)&&(this.redirectTo=angular.extend({},this.redirectTo,a.redirectTo))},b}c.$inject=["$stateProvider"],d.$inject=["$injector","$rootScope","$state","PermTransitionProperties","PermTransitionEvents","PermStateAuthorization","PermStatePermissionMap"],e.$inject=["$delegate","$rootScope","PermTransitionProperties","PermTransitionEventNames"],f.$inject=["$q","$state","PermStatePermissionMap"],g.$inject=["PermPermissionMap"];var h=angular.module("permission.ui",["permission","ui.router"]).config(c).run(d);"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports=h.name),angular.module("permission.ui").decorator("PermTransitionEvents",e);var i={permissionStart:"$stateChangePermissionStart",permissionAccepted:"$stateChangePermissionAccepted",permissionDenies:"$stateChangePermissionDenied"};angular.module("permission.ui").value("PermTransitionEventNames",i),angular.module("permission").service("PermStateAuthorization",f),angular.module("permission.ui").factory("PermStatePermissionMap",g)}(window,window.angular); //# sourceMappingURL=angular-permission-ui.min.js.map \ No newline at end of file diff --git a/dist/angular-permission-ui.min.js.map b/dist/angular-permission-ui.min.js.map index be90499..c0fafe7 100644 --- a/dist/angular-permission-ui.min.js.map +++ b/dist/angular-permission-ui.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["angular-permission-ui.js"],"names":["window","angular","undefined","config","$stateProvider","decorator","$delegate","self","$$permissionState","run","$injector","$rootScope","$state","PermTransitionProperties","PermTransitionEvents","PermStateAuthorization","PermStatePermissionMap","handleOnBeforeWebHook","transition","setTransitionProperties","toState","to","toParams","params","fromState","from","fromParams","options","statePermissionMap","authorizeByPermissionMap","catch","rejectedPermission","resolveRedirectState","then","redirect","router","stateService","target","state","handleStateChangeStartEvent","event","setStateAuthorizationStatus","status","extend","$$isAuthorizationFinished","isAuthorizationFinished","handleAuthorizedState","broadcastPermissionAcceptedEvent","transitionOptions","notify","location","go","name","broadcastStateChangeSuccessEvent","handleUnauthorizedState","broadcastPermissionDeniedEvent","areEventsDefaultPrevented","broadcastPermissionStartEvent","preventDefault","finally","has","$transitions","get","onBefore","$on","PermTransitionEventNames","isStateChangePermissionStartDefaultPrevented","isStateChangeStartDefaultPrevented","$broadcast","permissionStart","permissionAccepted","permissionDenies","defaultPrevented","$q","authorizeStatePermissionMap","authorizeByStateName","stateName","srefState","permissionMap","map","deferred","defer","resolveExceptStatePermissionMap","promise","exceptPromises","resolveStatePermissionMap","except","all","rejectedPermissions","reject","resolveOnlyStatePermissionMap","only","length","resolve","onlyPromises","resolvedPermissions","privilegesNames","statePrivileges","resolvedStatePrivileges","resolvePropertyValidity","any","isArray","this","PermPermissionMap","StatePermissionMap","toStateObject","toStatePath","path","forEach","areSetStatePermissions","data","permissions","extendPermissionMap","Object","prototype","hasOwnProperty","call","e","concat","isDefined","redirectTo","$inject","uiPermission","module","exports","value","service","factory"],"mappings":"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","file":"angular-permission-ui.min.js"} \ No newline at end of file +{"version":3,"sources":["angular-permission-ui.js"],"names":["window","angular","undefined","config","$stateProvider","decorator","$delegate","self","$$permissionState","run","$injector","$rootScope","$state","PermTransitionProperties","PermTransitionEvents","PermStateAuthorization","PermStatePermissionMap","handleOnBeforeWebHook","transition","setTransitionProperties","toState","to","toParams","params","fromState","from","fromParams","options","statePermissionMap","authorizeByPermissionMap","rejectedPermission","resolveRedirectState","then","redirect","router","stateService","target","state","handleStateChangeStartEvent","event","setStateAuthorizationStatus","status","extend","$$isAuthorizationFinished","isAuthorizationFinished","handleAuthorizedState","broadcastPermissionAcceptedEvent","transitionOptions","notify","location","go","name","broadcastStateChangeSuccessEvent","handleUnauthorizedState","broadcastPermissionDeniedEvent","areEventsDefaultPrevented","broadcastPermissionStartEvent","preventDefault","has","$transitions","get","onBefore","$on","PermTransitionEventNames","isStateChangePermissionStartDefaultPrevented","isStateChangeStartDefaultPrevented","$broadcast","permissionStart","permissionAccepted","permissionDenies","defaultPrevented","$q","authorizeStatePermissionMap","authorizeByStateName","stateName","srefState","permissionMap","map","deferred","defer","resolveExceptStatePermissionMap","promise","exceptPromises","resolveStatePermissionMap","except","all","reversePromises","resolveOnlyStatePermissionMap","rejectedPermissions","isArray","reject","only","length","resolve","onlyPromises","resolvedPermissions","privilegesNames","statePrivileges","resolvedStatePrivileges","resolvePropertyValidity","any","promises","d","this","PermPermissionMap","StatePermissionMap","toStateObject","toStatePath","path","forEach","areSetStatePermissions","data","permissions","extendPermissionMap","Object","prototype","hasOwnProperty","call","e","concat","isDefined","redirectTo","$inject","uiPermission","module","exports","value","service","factory"],"mappings":"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","file":"angular-permission-ui.min.js"} \ No newline at end of file diff --git a/dist/angular-permission.js b/dist/angular-permission.js index 14f59a5..218f934 100644 --- a/dist/angular-permission.js +++ b/dist/angular-permission.js @@ -1,1238 +1,1241 @@ -/** - * angular-permission - * Fully featured role and permission based access control for your angular applications - * @version v5.3.2 - 2017-05-29 - * @link https://github.com/Narzerus/angular-permission - * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak - * @license MIT License, http://www.opensource.org/licenses/MIT - */ - -(function (window, angular, undefined) { - 'use strict'; - - /** - * @namespace permission - */ - - $q.$inject = ['$delegate']; - PermPermission.$inject = ['$q', '$injector', 'PermTransitionProperties']; - PermRole.$inject = ['$q', '$injector', 'PermPermissionStore', 'PermTransitionProperties']; - PermPermissionStore.$inject = ['PermPermission']; - PermRoleStore.$inject = ['PermRole']; - PermissionDirective.$inject = ['$log', '$injector', 'PermPermissionMap', 'PermPermissionStrategies']; - PermAuthorization.$inject = ['$q']; - PermPermissionMap.$inject = ['$q', '$log', '$injector', '$permission', 'PermTransitionProperties', 'PermRoleStore', 'PermPermissionStore']; - var permission = angular.module('permission', []); - - /* istanbul ignore if */ - if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports) { - module.exports = permission.name; - } - - /** - * Permission module configuration provider - * - * @name permission.permissionProvider - */ - function $permission() { - 'ngInject'; - - var defaultOnAuthorizedMethod = 'showElement'; - var defaultOnUnauthorizedMethod = 'hideElement'; - var suppressUndefinedPermissionWarning = false; - - /** - * Methods allowing to alter default directive onAuthorized behaviour in permission directive - * @methodOf permission.permissionProvider - * - * @param onAuthorizedMethod {String} One of permission.PermPermissionStrategies method names - */ - this.setDefaultOnAuthorizedMethod = function (onAuthorizedMethod) { // jshint ignore:line - defaultOnAuthorizedMethod = onAuthorizedMethod; - }; - - /** - * Methods allowing to alter default directive onUnauthorized behaviour in permission directive - * @methodOf permission.permissionProvider - * - * @param onUnauthorizedMethod {String} One of permission.PermPermissionStrategies method names - */ - this.setDefaultOnUnauthorizedMethod = function (onUnauthorizedMethod) { // jshint ignore:line - defaultOnUnauthorizedMethod = onUnauthorizedMethod; - }; - - - /** - * When set to true hides permission warning for undefined roles and permissions - * @methodOf permission.permissionProvider - * - * @param value {Boolean} - */ - this.suppressUndefinedPermissionWarning = function (value) { // jshint ignore:line - suppressUndefinedPermissionWarning = value; - }; - - - this.$get = function () { // jshint ignore:line - return { - defaultOnAuthorizedMethod: defaultOnAuthorizedMethod, - defaultOnUnauthorizedMethod: defaultOnUnauthorizedMethod, - suppressUndefinedPermissionWarning: suppressUndefinedPermissionWarning - }; - }; - } - - angular - .module('permission') - .provider('$permission', $permission); - - /** - * Extends $q implementation by A+ *any* method - * @name permission.$q - * - * @extends {angular.$q} - * - * @param $delegate {Object} Parent instance being extended - */ - function $q($delegate) { - 'ngInject'; - - $delegate.any = any; - - /** - * Implementation of missing $q `any` method that wits for first resolution of provided promise set - * @methodOf permission.$q - * - * @param promises {Array|promise} Single or set of promises - * - * @returns {Promise} Returns a single promise that will be rejected with an array/hash of values, - * each value corresponding to the promise at the same index/key in the `promises` array/hash. - * If any of the promises is resolved, this resulting promise will be returned - * with the same resolution value. - */ - function any(promises) { - var deferred = $delegate.defer(), - counter = 0, - results = angular.isArray(promises) ? [] : {}; - - angular.forEach(promises, function (promise, key) { - counter++; - $delegate - .when(promise) - .then(function (value) { - deferred.resolve(value); - }) - .catch(function (reason) { - results[key] = reason; - if (!(--counter)) { - deferred.reject(reason); - } - }); - }); - - if (counter === 0) { - deferred.reject(results); - } - - return deferred.promise; - } - - return $delegate; - } - - angular - .module('permission') - .decorator('$q', $q); - - - /** - * Pre-defined available configurable behaviours of directive `permission` - * @name permission.PermPermissionStrategies - * @readonly - * - * @example - *
- *
- * - * @property enableElement {Function} - * @property disableElement {Function} - * @property showElement {Function} - * @property hideElement {Function} - */ - var PermPermissionStrategies = { - enableElement: function ($element) { - $element.removeAttr('disabled'); - }, - disableElement: function ($element) { - $element.attr('disabled', 'disabled'); - }, - showElement: function ($element) { - $element.removeClass('ng-hide'); - }, - hideElement: function ($element) { - $element.addClass('ng-hide'); - } - }; - - angular - .module('permission') - .value('PermPermissionStrategies', PermPermissionStrategies) - .value('PermissionStrategies', PermPermissionStrategies); - - - /** - * Helper object used for storing ui-router/ng-route transition parameters - * @name permission.PermTransitionProperties - * - * @type {Object.} - * - * Transition properties for ui-router: - * @property toState {Object} Target state object [ui-router] - * @property toParams {Object} Target state params [ui-router] - * @property fromState {Object} Source state object [ui-router] - * @property fromParams {Object} Source state params [ui-router] - * @property options {Object} Transition options [ui-router] - * - * Transition properties for ng-route: - * @property current {Object} Current state properties [ng-route] - * @property next {Object} Next state properties [ng-route] - */ - var PermTransitionProperties = {}; - - angular - .module('permission') - .value('PermTransitionProperties', PermTransitionProperties); - - /** - * Interface responsible for managing and emitting events dependent on router implementation - * @name permission.PermTransitionEvents - */ - function PermTransitionEvents() { - 'ngInject'; - - this.broadcastPermissionStartEvent = function () { - throw new Error('Method broadcastPermissionStartEvent in PermTransitionEvents interface must be implemented'); - }; - - this.broadcastPermissionAcceptedEvent = function () { - throw new Error('Method broadcastPermissionAcceptedEvent in PermTransitionEvents interface must be implemented'); - }; - - this.broadcastPermissionDeniedEvent = function () { - throw new Error('Method broadcastPermissionDeniedEvent in PermTransitionEvents interface must be implemented'); - }; - } - - angular - .module('permission') - .service('PermTransitionEvents', PermTransitionEvents); - - - /** - * PermPermission definition factory - * @function - * - * @param $q {Object} Angular promise implementation - * @param $injector {Object} Dependency injection instance - * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing ui-router transition parameters - * - * @return {Permission} - */ - function PermPermission($q, $injector, PermTransitionProperties) { - 'ngInject'; - - /** - * PermPermission definition object constructor - * @constructor Permission - * - * @param permissionName {String} Name repressing permission - * @param validationFunction {Function} Function used to check if permission is valid - */ - function Permission(permissionName, validationFunction) { - validateConstructor(permissionName, validationFunction); - - this.permissionName = permissionName; - this.validationFunction = annotateValidationFunction(validationFunction); - } - - /** - * Checks if permission is still valid - * @methodOf permission.Permission - * - * @returns {Promise} - */ - Permission.prototype.validatePermission = function () { - var validationLocals = { - permissionName: this.permissionName, - transitionProperties: PermTransitionProperties - }; - var validationResult = $injector.invoke(this.validationFunction, null, validationLocals); - - if (!angular.isFunction(validationResult.then)) { - validationResult = wrapInPromise(validationResult, this.permissionName); - } - - return validationResult; - }; - - /** - * Converts a value into a promise, if the value is truthy it resolves it, otherwise it rejects it - * @methodOf permission.Permission - * @private - * - * @param result {Boolean} Function to be wrapped into promise - * @param permissionName {String} Returned value in promise - * - * @return {Promise} - */ - function wrapInPromise(result, permissionName) { - if (result) { - return $q.resolve(permissionName); - } - - return $q.reject(permissionName); - } - - /** - * Checks if provided permission has accepted parameter types - * @methodOf permission.Permission - * @private - * - * @throws {TypeError} - * - * @param permissionName {String} Name repressing permission - * @param validationFunction {Function} Function used to check if permission is valid - */ - function validateConstructor(permissionName, validationFunction) { - if (!angular.isString(permissionName)) { - throw new TypeError('Parameter "permissionName" name must be String'); - } - if (!angular.isFunction(validationFunction) && !angular.isArray(validationFunction)) { - throw new TypeError('Parameter "validationFunction" must be Function or an injectable Function using explicit annotation'); - } - } - - /** - * Ensures the validation is injectable using explicit annotation. - * Wraps a non-injectable function for backwards compatibility - * @methodOf permission.Permission - * @private - * - * @param validationFunction {Function} Function to wrap with injectable if needed - * - * @return {Function} Explicitly injectable function - */ - function annotateValidationFunction(validationFunction) { - if (!angular.isArray(validationFunction.$inject || validationFunction)) { - // The function is not explicitly annotated, so assume using old-style parameters - // and manually prepare for injection using our known old API parameters - validationFunction = ['permissionName', 'transitionProperties', validationFunction]; - } - - return validationFunction; - } - - return Permission; - } - - angular - .module('permission') - .factory('PermPermission', PermPermission); - - /** - * Role definition factory - * @function - * - * @param $q {Object} Angular promise implementation - * @param $injector {Object} Dependency injection instance - * @param PermPermissionStore {permission.PermPermissionStore} Permission definition storage - * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing ui-router transition parameters - * - * @return {Role} - */ - function PermRole($q, $injector, PermPermissionStore, PermTransitionProperties) { - 'ngInject'; - - /** - * Role definition constructor - * @constructor Role - * - * @param roleName {String} Name representing role - * @param validationFunction {Function|Array} Optional function used to validate if permissions are still - * valid or list of permission names representing role - */ - function Role(roleName, validationFunction) { - validateConstructor(roleName, validationFunction); - - this.roleName = roleName; - this.validationFunction = annotateValidationFunction(validationFunction); - } - - /** - * Checks if role is still valid - * @methodOf permission.Role - * - * @returns {Promise} $q.promise object - */ - Role.prototype.validateRole = function () { - var validationLocals = { - roleName: this.roleName, - transitionProperties: PermTransitionProperties - }; - var validationResult = $injector.invoke(this.validationFunction, null, validationLocals); - - if (!angular.isFunction(validationResult.then)) { - validationResult = wrapInPromise(validationResult, this.roleName); - } - - return validationResult; - }; - - /** - * Converts a value into a promise, if the value is truthy it resolves it, otherwise it rejects it - * @methodOf permission.Role - * @private - * - * @param result {Boolean} Function to be wrapped into promise - * @param [roleName] {String} Returned value in promise - * - * @return {Promise} - */ - function wrapInPromise(result, roleName) { - if (result) { - return $q.resolve(roleName); - } - - return $q.reject(roleName); - } - - /** - * Checks if provided permission has accepted parameter types - * @methodOf permission.Role - * @private - * - * @throws {TypeError} - * - * @param roleName {String} Name representing role - * @param validationFunction {Function|Array} Optional function used to validate if permissions are still - * valid or list of permission names representing role - */ - function validateConstructor(roleName, validationFunction) { - if (!angular.isString(roleName)) { - throw new TypeError('Parameter "roleName" name must be String'); - } - - if (!angular.isArray(validationFunction) && !angular.isFunction(validationFunction)) { - throw new TypeError('Parameter "validationFunction" must be array or function'); - } - } - - - /** - * Ensures the validation is injectable using explicit annotation. - * Wraps a non-injectable function for backwards compatibility - * @methodOf permission.Role - * @private - * - * @param validationFunction {Function|Array} Function to wrap with injectable if needed - * - * @return {Function} Explicitly injectable function - */ - function annotateValidationFunction(validationFunction) { - // Test if the validation function is just an array of permission names - if (angular.isArray(validationFunction) && !angular.isFunction(validationFunction[validationFunction.length - 1])) { - validationFunction = preparePermissionEvaluation(validationFunction); - } else if (!angular.isArray(validationFunction.$inject || validationFunction)) { - // The function is not explicitly annotated, so assume using old-style parameters - // and manually prepare for injection using our known old API parameters - validationFunction = ['roleName', 'transitionProperties', validationFunction]; - } - - return validationFunction; - } - - /** - * Creates an injectable function that evaluates a set of permissions in place of a role validation function - * @methodOf permission.Role - * @private - * - * @param permissions {Array} List of permissions to evaluate - * - * @return {Function} - */ - function preparePermissionEvaluation(permissions) { - return function () { - var promises = permissions.map(function (permissionName) { - if (PermPermissionStore.hasPermissionDefinition(permissionName)) { - var permission = PermPermissionStore.getPermissionDefinition(permissionName); - - return permission.validatePermission(); - } - - return $q.reject(permissionName); - }); - - return $q.all(promises); - }; - } - - return Role; - } - - angular - .module('permission') - .factory('PermRole', PermRole); - - /** - * Permission definition storage - * @name permission.PermPermissionStore - * - * @param PermPermission {permission.PermPermission|Function} - */ - function PermPermissionStore(PermPermission) { - 'ngInject'; - - /** - * @property permissionStore - * - * @type {Object} - */ - var permissionStore = {}; - - this.definePermission = definePermission; - this.defineManyPermissions = defineManyPermissions; - this.removePermissionDefinition = removePermissionDefinition; - this.hasPermissionDefinition = hasPermissionDefinition; - this.getPermissionDefinition = getPermissionDefinition; - this.getStore = getStore; - this.clearStore = clearStore; - - /** - * Allows to define permission on application configuration - * @methodOf permission.PermPermissionStore - * - * @param permissionName {String} Name of defined permission - * @param validationFunction {Function} Function used to validate if permission is valid - */ - function definePermission(permissionName, validationFunction) { - permissionStore[permissionName] = new PermPermission(permissionName, validationFunction); - } - - /** - * Allows to define set of permissionNames with shared validation function on application configuration - * @methodOf permission.PermPermissionStore - * @throws {TypeError} - * - * @param permissionNames {Array} Set of permission names - * @param validationFunction {Function} Function used to validate if permission is valid - */ - function defineManyPermissions(permissionNames, validationFunction) { - if (!angular.isArray(permissionNames)) { - throw new TypeError('Parameter "permissionNames" name must be Array'); - } - - angular.forEach(permissionNames, function (permissionName) { - definePermission(permissionName, validationFunction); - }); - } - - /** - * Deletes permission - * @methodOf permission.PermPermissionStore - * - * @param permissionName {String} Name of defined permission - */ - function removePermissionDefinition(permissionName) { - delete permissionStore[permissionName]; - } - - /** - * Checks if permission exists - * @methodOf permission.PermPermissionStore - * - * @param permissionName {String} Name of defined permission - * @returns {Boolean} - */ - function hasPermissionDefinition(permissionName) { - return angular.isDefined(permissionStore[permissionName]); - } - - /** - * Returns permission by it's name - * @methodOf permission.PermPermissionStore - * - * @returns {permission.Permission} Permissions definition object - */ - function getPermissionDefinition(permissionName) { - return permissionStore[permissionName]; - } - - /** - * Returns all permissions - * @methodOf permission.PermPermissionStore - * - * @returns {Object} Permissions collection - */ - function getStore() { - return permissionStore; - } - - /** - * Removes all permissions - * @methodOf permission.PermPermissionStore - */ - function clearStore() { - permissionStore = {}; - } - } - - angular - .module('permission') - .service('PermPermissionStore', PermPermissionStore); - - - /** - * Role definition storage - * @name permission.PermRoleStore - * - * @param PermRole {permission.PermRole} Role definition constructor - */ - function PermRoleStore(PermRole) { - 'ngInject'; - - var roleStore = {}; - - this.defineRole = defineRole; - this.defineManyRoles = defineManyRoles; - this.getRoleDefinition = getRoleDefinition; - this.hasRoleDefinition = hasRoleDefinition; - this.removeRoleDefinition = removeRoleDefinition; - this.getStore = getStore; - this.clearStore = clearStore; - - /** - * Allows to add single role definition to the store by providing it's name and validation function - * @methodOf permission.PermRoleStore - * - * @param roleName {String} Name of defined role - * @param [validationFunction] {Function|Array} Function used to validate if role is valid or set of - * permission names that has to be owned to have a role - */ - function defineRole(roleName, validationFunction) { - roleStore[roleName] = new PermRole(roleName, validationFunction); - } - - /** - * Allows to define set of roleNames with shared validation function - * @methodOf permission.PermPermissionStore - * @throws {TypeError} - * - * @param roleMap {String, Function|Array} Map of roles with matching validators - */ - function defineManyRoles(roleMap) { - if (!angular.isObject(roleMap)) { - throw new TypeError('Parameter "roleNames" name must be object'); - } - - angular.forEach(roleMap, function (validationFunction, roleName) { - defineRole(roleName, validationFunction); - }); - } - - /** - * Deletes role from store - * @method permission.PermRoleStore - * - * @param roleName {String} Name of defined permission - */ - function removeRoleDefinition(roleName) { - delete roleStore[roleName]; - } - - /** - * Checks if role is defined in store - * @method permission.PermRoleStore - * - * @param roleName {String} Name of role - * @returns {Boolean} - */ - function hasRoleDefinition(roleName) { - return angular.isDefined(roleStore[roleName]); - } - - /** - * Returns role definition object by it's name - * @method permission.PermRoleStore - * - * @returns {permission.PermRole} PermRole definition object - */ - function getRoleDefinition(roleName) { - return roleStore[roleName]; - } - - /** - * Returns all role definitions - * @method permission.PermRoleStore - * - * @returns {Object} Defined roles collection - */ - function getStore() { - return roleStore; - } - - /** - * Removes all role definitions - * @method permission.PermRoleStore - */ - function clearStore() { - roleStore = {}; - } - } - - angular - .module('permission') - .service('PermRoleStore', PermRoleStore); - - /** - * Handles authorization based on provided permissions/roles. - * @name permission.permissionDirective - * - * Directive accepts single or combined attributes `permission-only` and `permission-except` that checks on - * DOM rendering if permissions/roles are met. Attributes can be passed either as String, Array or variable from - * parent scope. Directive also will watch for changes if applied and automatically update the view. - * - * @example - *
- *
- *
- *
- *
- * - * By default directive will show/hide elements if provided permissions matches. - * You can override this behaviour by passing `permission-on-authorized` and `permission-on-unauthorized` - * attributes that will pass to your function `$element` as argument that you can freely manipulate your DOM - * behaviour. - * - * Important! Function should be as references - `vm.disableElement` not `vm.disableElement()` to be able to - * accept passed $element reference from inside of permissionDirective - * - * @example - *
- *
- * - * @param $log {Object} Logging service - * @param $injector {Object} Injector instance object - * @param PermPermissionMap {permission.permPermissionMap|Function} Map of state access rights - * @param PermPermissionStrategies {permission.permPermissionStrategies} Set of pre-defined directive behaviours - * - * @returns {{ - * restrict: string, - * bindToController: { - * sref: string - * only: string, - * except: string, - * onAuthorized: function, - * onUnauthorized: function - * }, - * controllerAs: string, - * controller: controller - * }} Directive instance - */ - function PermissionDirective($log, $injector, PermPermissionMap, PermPermissionStrategies) { - 'ngInject'; - - return { - restrict: 'A', - bindToController: { - sref: '=?permissionSref', - only: '=?permissionOnly', - except: '=?permissionExcept', - onAuthorized: '&?permissionOnAuthorized', - onUnauthorized: '&?permissionOnUnauthorized' - }, - controllerAs: 'permission', - controller: ['$scope', '$element', '$permission', function ($scope, $element, $permission) { - var permission = this; - - $scope.$watchGroup(['permission.only', 'permission.except', 'sref'], - function () { - try { - if (isSrefStateDefined()) { - var PermStateAuthorization = $injector.get('PermStateAuthorization'); - - PermStateAuthorization - .authorizeByStateName(permission.sref) - .then(function () { - onAuthorizedAccess(); - }) - .catch(function () { - onUnauthorizedAccess(); - }); - } else { - var PermAuthorization = $injector.get('PermAuthorization'); - var permissionMap = new PermPermissionMap({ - only: permission.only, - except: permission.except - }); - - PermAuthorization - .authorizeByPermissionMap(permissionMap) - .then(function () { - onAuthorizedAccess(); - }) - .catch(function () { - onUnauthorizedAccess(); - }); - } - } catch (e) { - onUnauthorizedAccess(); - $log.error(e.message); - } - }); - - /** - * Returns true when permissions should be checked based on state name - * @private - * - * @returns {boolean} - */ - function isSrefStateDefined() { - return $injector.has('$state') && permission.sref; - } - - /** - * Calls `onAuthorized` function if provided or show element - * @private - */ - function onAuthorizedAccess() { - if (angular.isFunction(permission.onAuthorized)) { - permission.onAuthorized()($element); - } else { - var onAuthorizedMethodName = $permission.defaultOnAuthorizedMethod; - PermPermissionStrategies[onAuthorizedMethodName]($element); - } - } - - /** - * Calls `onUnauthorized` function if provided or hide element - * @private - */ - function onUnauthorizedAccess() { - if (angular.isFunction(permission.onUnauthorized)) { - permission.onUnauthorized()($element); - } else { - var onUnauthorizedMethodName = $permission.defaultOnUnauthorizedMethod; - PermPermissionStrategies[onUnauthorizedMethodName]($element); - } - } - }] - }; - } - - angular - .module('permission') - .directive('permission', PermissionDirective); - - - /** - * Service responsible for handling view based authorization - * @name permission.PermAuthorization - * - * @param $q {Object} Angular promise implementation - */ - function PermAuthorization($q) { - 'ngInject'; - - this.authorizeByPermissionMap = authorizeByPermissionMap; - - /** - * Handles authorization based on provided permissions map - * @methodOf permission.PermAuthorization - * - * @param map {permission.PermissionMap} Map of permission names - * - * @returns {promise} $q.promise object - */ - function authorizeByPermissionMap(map) { - var deferred = $q.defer(); - - resolveExceptPrivilegeMap(deferred, map); - - return deferred.promise; - } - - /** - * Resolves flat set of "except" privileges - * @methodOf permission.PermAuthorization - * @private - * - * @param deferred {Object} Promise defer - * @param map {permission.PermissionMap} Access rights map - * - */ - function resolveExceptPrivilegeMap(deferred, map) { - var exceptPromises = map.resolvePropertyValidity(map.except); - - $q.any(exceptPromises) - .then(function (rejectedPermissions) { - deferred.reject(rejectedPermissions); - }) - .catch(function () { - resolveOnlyPermissionMap(deferred, map); - }); - } - - /** - * Resolves flat set of "only" privileges - * @methodOf permission.PermAuthorization - * @private - * - * @param deferred {Object} Promise defer - * @param map {permission.PermissionMap} Access rights map - */ - function resolveOnlyPermissionMap(deferred, map) { - if (!map.only.length) { - deferred.resolve(); - return; - } - - var onlyPromises = map.resolvePropertyValidity(map.only); - $q.any(onlyPromises) - .then(function (resolvedPermissions) { - deferred.resolve(resolvedPermissions); - }) - .catch(function (rejectedPermission) { - deferred.reject(rejectedPermission); - }); - } - } - - angular - .module('permission') - .service('PermAuthorization', PermAuthorization); - - - /** - * Access rights map factory - * @name permission.PermPermissionMap - * - * @param $q {Object} Angular promise implementation - * @param $log {Object} Angular logging utility - * @param $injector {Object} Dependency injection instance - * @param $permission {Object} Permission module configuration object - * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing ui-router transition parameters - * @param PermRoleStore {permission.PermRoleStore} Role definition storage - * @param PermPermissionStore {permission.PermPermissionStore} Permission definition storage - * - * @return {permission.PermissionMap} - */ - function PermPermissionMap($q, $log, $injector, $permission, PermTransitionProperties, PermRoleStore, PermPermissionStore) { - 'ngInject'; - - /** - * Constructs map object instructing authorization service how to handle authorizing - * @constructor permission.PermissionMap - * - * @param [permissionMap] {Object} Map of permissions provided to authorization service - * @param [permissionMap.only] {String|Array|Function} List of exclusive access right names allowed for - * authorization - * @param [permissionMap.except] {String|Array|Function} List of exclusive access right names denied for - * authorization - * @param [permissionMap.redirectTo] {String|Function|Object|promise} Handling redirection when rejected - * authorization - */ - function PermissionMap(permissionMap) { - // Suppress not defined object errors - permissionMap = permissionMap || {}; - - this.only = normalizeOnlyAndExceptProperty(permissionMap.only); - this.except = normalizeOnlyAndExceptProperty(permissionMap.except); - this.redirectTo = normalizeRedirectToProperty(permissionMap.redirectTo); - } - - /** - * Redirects to fallback states when permissions fail - * @methodOf permission.PermissionMap - * - * @param [rejectedPermissionName] {String} Permission name - * - * @return {Promise} - */ - PermissionMap.prototype.resolveRedirectState = function (rejectedPermissionName) { - - // If redirectTo definition is not found stay where you are - if (!angular.isDefined(this.redirectTo)) { - return $q.reject(); - } - - var redirectState = this.redirectTo[rejectedPermissionName] || this.redirectTo['default']; - - return resolveRedirectState(redirectState, rejectedPermissionName); - }; - - /** - * Resolves weather permissions set for "only" or "except" property are valid - * @methodOf permission.PermissionMap - * - * @param property {Array} "only" or "except" map property - * - * @return {Array} - */ - PermissionMap.prototype.resolvePropertyValidity = function (property) { - - return property.map(function (privilegeName) { - if (PermRoleStore.hasRoleDefinition(privilegeName)) { - var role = PermRoleStore.getRoleDefinition(privilegeName); - return role.validateRole(); - } - - if (PermPermissionStore.hasPermissionDefinition(privilegeName)) { - var permission = PermPermissionStore.getPermissionDefinition(privilegeName); - return permission.validatePermission(); - } - - if (!$permission.suppressUndefinedPermissionWarning) { - $log.warn('Permission or role ' + privilegeName + ' was not defined.'); - } - return $q.reject(privilegeName); - }); - }; - - /** - * Handles function based redirection for rejected permissions - * @methodOf permission.PermissionMap - * - * @throws {TypeError} - * - * @param redirectFunction {Function} Redirection function - * @param rejectedPermissionName {String} Rejected permission - * - * @return {Promise} - */ - function resolveRedirectState(redirectFunction, rejectedPermissionName) { - return $q - .when($injector.invoke(redirectFunction, null, { - rejectedPermission: rejectedPermissionName, - transitionProperties: PermTransitionProperties - })) - .then(function (redirectState) { - if (angular.isString(redirectState)) { - return { - state: redirectState - }; - } - - if (angular.isObject(redirectState)) { - return redirectState; - } - - return $q.reject(); - }); - } - - /** - * Handles extraction of permission map "only" and "except" properties and converts them into array objects - * @methodOf permission.PermissionMap - * @private - * - * @param property {String|Array|Function} PermPermission map property "only" or "except" - * - * @returns {Array} Array of permission "only" or "except" names - */ - function normalizeOnlyAndExceptProperty(property) { - if (angular.isString(property)) { - return [property]; - } - - if (angular.isArray(property)) { - return property; - } - - if (angular.isFunction(property)) { - return property.call(null, PermTransitionProperties); - } - - return []; - } - - /** - * Convert user provided input into key value dictionary with permission/role name as a key and injectable resolver - * function as a value - * @methodOf permission.PermissionMap - * @private - * - * @param redirectTo {String|Function|Array|Object} PermPermission map property "redirectTo" - * - * @returns {Object} Redirection dictionary object - */ - function normalizeRedirectToProperty(redirectTo) { - if (!angular.isDefined(redirectTo)) { - return; - } - - if (isInjectable(redirectTo) || angular.isFunction(redirectTo)) { - return normalizeFunctionRedirectionRule(redirectTo); - } - - if (angular.isObject(redirectTo)) { - if (isObjectSingleRedirectionRule(redirectTo)) { - return normalizeObjectSingleRedirectionRule(redirectTo); - } - - return normalizeObjectMultipleRedirectionRule(redirectTo); - } - - if (angular.isString(redirectTo)) { - return normalizeStringRedirectionRule(redirectTo); - } - - throw new ReferenceError('Property "redirectTo" must be String, Function, Array or Object'); - } - - /** - * Convert string redirection rule into single-element redirection dictionary - * @methodOf permission.PermissionMap - * @private - * - * @param redirectTo {String} PermPermission map property "redirectTo" - * - * @returns {Object} Redirection dictionary object - */ - function normalizeStringRedirectionRule(redirectTo) { - var redirectionMap = {}; - - redirectionMap.default = function () { - return { - state: redirectTo - }; - }; - redirectionMap.default.$inject = ['rejectedPermission', 'transitionProperties']; - - return redirectionMap; - } - - /** - * Checks if redirection object is single rule type - * @methodOf permission.PermissionMap - * @private - * - * @param redirectTo {Object} PermPermission map property "redirectTo" - * - * @returns {boolean} - */ - function isObjectSingleRedirectionRule(redirectTo) { - return angular.isDefined(redirectTo.state); - } - - /** - * Convert single redirection rule object into single-element redirection dictionary - * @methodOf permission.PermissionMap - * @private - * - * @param redirectTo {Object} PermPermission map property "redirectTo" - * - * @returns {Object} Redirection dictionary object - */ - function normalizeObjectSingleRedirectionRule(redirectTo) { - var redirectionMap = {}; - - redirectionMap.default = function () { - return redirectTo; - }; - - return redirectionMap; - } - - /** - * Convert multiple redirection rule object into redirection dictionary - * @methodOf permission.PermissionMap - * @private - * - * @param redirectTo {Object} PermPermission map property "redirectTo" - * - * @returns {Object} Redirection dictionary object - */ - function normalizeObjectMultipleRedirectionRule(redirectTo) { - var redirectionMap = {}; - - angular.forEach(redirectTo, function (redirection, permission) { - if (isInjectable(redirection)) { - redirectionMap[permission] = redirection; - } else { - if (angular.isFunction(redirection)) { - redirectionMap[permission] = redirection; - redirectionMap[permission].$inject = []; - } - } - - if (angular.isObject(redirection)) { - redirectionMap[permission] = function () { - return redirection; - }; - redirectionMap[permission].$inject = []; - } - - if (angular.isString(redirection)) { - redirectionMap[permission] = function () { - return { - state: redirection - }; - }; - redirectionMap[permission].$inject = []; - } - }); - - return redirectionMap; - } - - /** - * Checks if property is injectable - * @methodOf permission.PermissionMap - * @private - * - * @param property {Array|Object} - * - * @returns {boolean} - */ - function isInjectable(property) { - return angular.isArray(property) || (angular.isFunction(property) && angular.isArray(property.$inject)); - } - - /** - * Convert function redirection rule into redirection dictionary - * @methodOf permission.PermissionMap - * @private - * - * @param redirectTo {Function} PermPermission map property "redirectTo" - * - * @returns {Object} Redirection dictionary object - */ - function normalizeFunctionRedirectionRule(redirectTo) { - var redirectionMap = {}; - - redirectionMap.default = redirectTo; - - if (!angular.isDefined(redirectTo.$inject)) { - redirectionMap.default.$inject = ['rejectedPermission', 'transitionProperties']; - } - - return redirectionMap; - } - - return PermissionMap; - } - - angular - .module('permission') - .factory('PermPermissionMap', PermPermissionMap); - -}(window, window.angular)); +/** + * angular-permission + * Fully featured role and permission based access control for your angular applications + * @version v5.3.2 - 2018-02-27 + * @link https://github.com/Narzerus/angular-permission + * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak + * @license MIT License, http://www.opensource.org/licenses/MIT + */ + +(function (window, angular, undefined) { + 'use strict'; + + /** + * @namespace permission + */ + + $q.$inject = ['$delegate']; + PermPermission.$inject = ['$q', '$injector', 'PermTransitionProperties']; + PermRole.$inject = ['$q', '$injector', 'PermPermissionStore', 'PermTransitionProperties']; + PermPermissionStore.$inject = ['PermPermission']; + PermRoleStore.$inject = ['PermRole']; + PermissionDirective.$inject = ['$log', '$injector', 'PermPermissionMap', 'PermPermissionStrategies']; + PermAuthorization.$inject = ['$q']; + PermPermissionMap.$inject = ['$q', '$log', '$injector', '$permission', 'PermTransitionProperties', 'PermRoleStore', 'PermPermissionStore']; + var permission = angular.module('permission', []); + + /* istanbul ignore if */ + if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports) { + module.exports = permission.name; + } + + /** + * Permission module configuration provider + * + * @name permission.permissionProvider + */ + function $permission() { + 'ngInject'; + + var defaultOnAuthorizedMethod = 'showElement'; + var defaultOnUnauthorizedMethod = 'hideElement'; + var suppressUndefinedPermissionWarning = false; + + /** + * Methods allowing to alter default directive onAuthorized behaviour in permission directive + * @methodOf permission.permissionProvider + * + * @param onAuthorizedMethod {String} One of permission.PermPermissionStrategies method names + */ + this.setDefaultOnAuthorizedMethod = function (onAuthorizedMethod) { // jshint ignore:line + defaultOnAuthorizedMethod = onAuthorizedMethod; + }; + + /** + * Methods allowing to alter default directive onUnauthorized behaviour in permission directive + * @methodOf permission.permissionProvider + * + * @param onUnauthorizedMethod {String} One of permission.PermPermissionStrategies method names + */ + this.setDefaultOnUnauthorizedMethod = function (onUnauthorizedMethod) { // jshint ignore:line + defaultOnUnauthorizedMethod = onUnauthorizedMethod; + }; + + + /** + * When set to true hides permission warning for undefined roles and permissions + * @methodOf permission.permissionProvider + * + * @param value {Boolean} + */ + this.suppressUndefinedPermissionWarning = function (value) { // jshint ignore:line + suppressUndefinedPermissionWarning = value; + }; + + + this.$get = function () { // jshint ignore:line + return { + defaultOnAuthorizedMethod: defaultOnAuthorizedMethod, + defaultOnUnauthorizedMethod: defaultOnUnauthorizedMethod, + suppressUndefinedPermissionWarning: suppressUndefinedPermissionWarning + }; + }; + } + + angular + .module('permission') + .provider('$permission', $permission); + + /** + * Extends $q implementation by A+ *any* method + * @name permission.$q + * + * @extends {angular.$q} + * + * @param $delegate {Object} Parent instance being extended + */ + function $q($delegate) { + 'ngInject'; + + $delegate.any = any; + + /** + * Implementation of missing $q `any` method that wits for first resolution of provided promise set + * @methodOf permission.$q + * + * @param promises {Array|promise} Single or set of promises + * + * @returns {Promise} Returns a single promise that will be rejected with an array/hash of values, + * each value corresponding to the promise at the same index/key in the `promises` array/hash. + * If any of the promises is resolved, this resulting promise will be returned + * with the same resolution value. + */ + function any(promises) { + var deferred = $delegate.defer(), + counter = 0, + results = angular.isArray(promises) ? [] : {}; + + angular.forEach(promises, function (promise, key) { + counter++; + $delegate + .when(promise) + .then(function (value) { + deferred.resolve(value); + }) + .catch(function (reason) { + results[key] = reason; + if (!(--counter)) { + deferred.reject(reason); + } + }); + }); + + if (counter === 0) { + deferred.reject(results); + } + + return deferred.promise; + } + + return $delegate; + } + + angular + .module('permission') + .decorator('$q', $q); + + + /** + * Pre-defined available configurable behaviours of directive `permission` + * @name permission.PermPermissionStrategies + * @readonly + * + * @example + *
+ *
+ * + * @property enableElement {Function} + * @property disableElement {Function} + * @property showElement {Function} + * @property hideElement {Function} + */ + var PermPermissionStrategies = { + enableElement: function ($element) { + $element.removeAttr('disabled'); + }, + disableElement: function ($element) { + $element.attr('disabled', 'disabled'); + }, + showElement: function ($element) { + $element.removeClass('ng-hide'); + }, + hideElement: function ($element) { + $element.addClass('ng-hide'); + } + }; + + angular + .module('permission') + .value('PermPermissionStrategies', PermPermissionStrategies) + .value('PermissionStrategies', PermPermissionStrategies); + + + /** + * Helper object used for storing ui-router/ng-route transition parameters + * @name permission.PermTransitionProperties + * + * @type {Object.} + * + * Transition properties for ui-router: + * @property toState {Object} Target state object [ui-router] + * @property toParams {Object} Target state params [ui-router] + * @property fromState {Object} Source state object [ui-router] + * @property fromParams {Object} Source state params [ui-router] + * @property options {Object} Transition options [ui-router] + * + * Transition properties for ng-route: + * @property current {Object} Current state properties [ng-route] + * @property next {Object} Next state properties [ng-route] + */ + var PermTransitionProperties = {}; + + angular + .module('permission') + .value('PermTransitionProperties', PermTransitionProperties); + + /** + * Interface responsible for managing and emitting events dependent on router implementation + * @name permission.PermTransitionEvents + */ + function PermTransitionEvents() { + 'ngInject'; + + this.broadcastPermissionStartEvent = function () { + throw new Error('Method broadcastPermissionStartEvent in PermTransitionEvents interface must be implemented'); + }; + + this.broadcastPermissionAcceptedEvent = function () { + throw new Error('Method broadcastPermissionAcceptedEvent in PermTransitionEvents interface must be implemented'); + }; + + this.broadcastPermissionDeniedEvent = function () { + throw new Error('Method broadcastPermissionDeniedEvent in PermTransitionEvents interface must be implemented'); + }; + } + + angular + .module('permission') + .service('PermTransitionEvents', PermTransitionEvents); + + + /** + * PermPermission definition factory + * @function + * + * @param $q {Object} Angular promise implementation + * @param $injector {Object} Dependency injection instance + * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing ui-router transition parameters + * + * @return {Permission} + */ + function PermPermission($q, $injector, PermTransitionProperties) { + 'ngInject'; + + /** + * PermPermission definition object constructor + * @constructor Permission + * + * @param permissionName {String} Name repressing permission + * @param validationFunction {Function} Function used to check if permission is valid + */ + function Permission(permissionName, validationFunction) { + validateConstructor(permissionName, validationFunction); + + this.permissionName = permissionName; + this.validationFunction = annotateValidationFunction(validationFunction); + } + + /** + * Checks if permission is still valid + * @methodOf permission.Permission + * + * @returns {Promise} + */ + Permission.prototype.validatePermission = function (transitionProperties) { + var validationLocals = { + permissionName: this.permissionName, + transitionProperties: transitionProperties || PermTransitionProperties + }; + var validationResult = $injector.invoke(this.validationFunction, null, validationLocals); + + if (!angular.isFunction(validationResult.then)) { + validationResult = wrapInPromise(validationResult, this.permissionName); + } + + return validationResult; + }; + + /** + * Converts a value into a promise, if the value is truthy it resolves it, otherwise it rejects it + * @methodOf permission.Permission + * @private + * + * @param result {Boolean} Function to be wrapped into promise + * @param permissionName {String} Returned value in promise + * + * @return {Promise} + */ + function wrapInPromise(result, permissionName) { + if (result) { + return $q.resolve(permissionName); + } + + return $q.reject(permissionName); + } + + /** + * Checks if provided permission has accepted parameter types + * @methodOf permission.Permission + * @private + * + * @throws {TypeError} + * + * @param permissionName {String} Name repressing permission + * @param validationFunction {Function} Function used to check if permission is valid + */ + function validateConstructor(permissionName, validationFunction) { + if (!angular.isString(permissionName)) { + throw new TypeError('Parameter "permissionName" name must be String'); + } + if (!angular.isFunction(validationFunction) && !angular.isArray(validationFunction)) { + throw new TypeError('Parameter "validationFunction" must be Function or an injectable Function using explicit annotation'); + } + } + + /** + * Ensures the validation is injectable using explicit annotation. + * Wraps a non-injectable function for backwards compatibility + * @methodOf permission.Permission + * @private + * + * @param validationFunction {Function} Function to wrap with injectable if needed + * + * @return {Function} Explicitly injectable function + */ + function annotateValidationFunction(validationFunction) { + if (!angular.isArray(validationFunction.$inject || validationFunction)) { + // The function is not explicitly annotated, so assume using old-style parameters + // and manually prepare for injection using our known old API parameters + validationFunction = ['permissionName', 'transitionProperties', validationFunction]; + } + + return validationFunction; + } + + return Permission; + } + + angular + .module('permission') + .factory('PermPermission', PermPermission); + + /** + * Role definition factory + * @function + * + * @param $q {Object} Angular promise implementation + * @param $injector {Object} Dependency injection instance + * @param PermPermissionStore {permission.PermPermissionStore} Permission definition storage + * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing ui-router transition parameters + * + * @return {Role} + */ + function PermRole($q, $injector, PermPermissionStore, PermTransitionProperties) { + 'ngInject'; + + /** + * Role definition constructor + * @constructor Role + * + * @param roleName {String} Name representing role + * @param validationFunction {Function|Array} Optional function used to validate if permissions are still + * valid or list of permission names representing role + */ + function Role(roleName, validationFunction) { + validateConstructor(roleName, validationFunction); + + this.roleName = roleName; + this.validationFunction = annotateValidationFunction(validationFunction); + } + + /** + * Checks if role is still valid + * @methodOf permission.Role + * + * @returns {Promise} $q.promise object + */ + Role.prototype.validateRole = function (transitionProperties) { + var validationLocals = { + roleName: this.roleName, + transitionProperties: transitionProperties || PermTransitionProperties + }; + var validationResult = $injector.invoke(this.validationFunction, null, validationLocals); + + if (!angular.isFunction(validationResult.then)) { + validationResult = wrapInPromise(validationResult, this.roleName); + } + + return validationResult; + }; + + /** + * Converts a value into a promise, if the value is truthy it resolves it, otherwise it rejects it + * @methodOf permission.Role + * @private + * + * @param result {Boolean} Function to be wrapped into promise + * @param [roleName] {String} Returned value in promise + * + * @return {Promise} + */ + function wrapInPromise(result, roleName) { + if (result) { + return $q.resolve(roleName); + } + + return $q.reject(roleName); + } + + /** + * Checks if provided permission has accepted parameter types + * @methodOf permission.Role + * @private + * + * @throws {TypeError} + * + * @param roleName {String} Name representing role + * @param validationFunction {Function|Array} Optional function used to validate if permissions are still + * valid or list of permission names representing role + */ + function validateConstructor(roleName, validationFunction) { + if (!angular.isString(roleName)) { + throw new TypeError('Parameter "roleName" name must be String'); + } + + if (!angular.isArray(validationFunction) && !angular.isFunction(validationFunction)) { + throw new TypeError('Parameter "validationFunction" must be array or function'); + } + } + + + /** + * Ensures the validation is injectable using explicit annotation. + * Wraps a non-injectable function for backwards compatibility + * @methodOf permission.Role + * @private + * + * @param validationFunction {Function|Array} Function to wrap with injectable if needed + * + * @return {Function} Explicitly injectable function + */ + function annotateValidationFunction(validationFunction) { + // Test if the validation function is just an array of permission names + if (angular.isArray(validationFunction) && !angular.isFunction(validationFunction[validationFunction.length - 1])) { + validationFunction = preparePermissionEvaluation(validationFunction); + } else if (!angular.isArray(validationFunction.$inject || validationFunction)) { + // The function is not explicitly annotated, so assume using old-style parameters + // and manually prepare for injection using our known old API parameters + validationFunction = ['roleName', 'transitionProperties', validationFunction]; + } + + return validationFunction; + } + + /** + * Creates an injectable function that evaluates a set of permissions in place of a role validation function + * @methodOf permission.Role + * @private + * + * @param permissions {Array} List of permissions to evaluate + * + * @return {Function} + */ + function preparePermissionEvaluation(permissions, options) { + return function () { + var promises = permissions.map(function (permissionName) { + if (PermPermissionStore.hasPermissionDefinition(permissionName)) { + var permission = PermPermissionStore.getPermissionDefinition(permissionName); + + return permission.validatePermission(options); + } + + return $q.reject(permissionName); + }); + + return $q.all(promises); + }; + } + + return Role; + } + + angular + .module('permission') + .factory('PermRole', PermRole); + + /** + * Permission definition storage + * @name permission.PermPermissionStore + * + * @param PermPermission {permission.PermPermission|Function} + */ + function PermPermissionStore(PermPermission) { + 'ngInject'; + + /** + * @property permissionStore + * + * @type {Object} + */ + var permissionStore = {}; + + this.definePermission = definePermission; + this.defineManyPermissions = defineManyPermissions; + this.removePermissionDefinition = removePermissionDefinition; + this.hasPermissionDefinition = hasPermissionDefinition; + this.getPermissionDefinition = getPermissionDefinition; + this.getStore = getStore; + this.clearStore = clearStore; + + /** + * Allows to define permission on application configuration + * @methodOf permission.PermPermissionStore + * + * @param permissionName {String} Name of defined permission + * @param validationFunction {Function} Function used to validate if permission is valid + */ + function definePermission(permissionName, validationFunction) { + permissionStore[permissionName] = new PermPermission(permissionName, validationFunction); + } + + /** + * Allows to define set of permissionNames with shared validation function on application configuration + * @methodOf permission.PermPermissionStore + * @throws {TypeError} + * + * @param permissionNames {Array} Set of permission names + * @param validationFunction {Function} Function used to validate if permission is valid + */ + function defineManyPermissions(permissionNames, validationFunction) { + if (!angular.isArray(permissionNames)) { + throw new TypeError('Parameter "permissionNames" name must be Array'); + } + + angular.forEach(permissionNames, function (permissionName) { + definePermission(permissionName, validationFunction); + }); + } + + /** + * Deletes permission + * @methodOf permission.PermPermissionStore + * + * @param permissionName {String} Name of defined permission + */ + function removePermissionDefinition(permissionName) { + delete permissionStore[permissionName]; + } + + /** + * Checks if permission exists + * @methodOf permission.PermPermissionStore + * + * @param permissionName {String} Name of defined permission + * @returns {Boolean} + */ + function hasPermissionDefinition(permissionName) { + return angular.isDefined(permissionStore[permissionName]); + } + + /** + * Returns permission by it's name + * @methodOf permission.PermPermissionStore + * + * @returns {permission.Permission} Permissions definition object + */ + function getPermissionDefinition(permissionName) { + return permissionStore[permissionName]; + } + + /** + * Returns all permissions + * @methodOf permission.PermPermissionStore + * + * @returns {Object} Permissions collection + */ + function getStore() { + return permissionStore; + } + + /** + * Removes all permissions + * @methodOf permission.PermPermissionStore + */ + function clearStore() { + permissionStore = {}; + } + } + + angular + .module('permission') + .service('PermPermissionStore', PermPermissionStore); + + + /** + * Role definition storage + * @name permission.PermRoleStore + * + * @param PermRole {permission.PermRole} Role definition constructor + */ + function PermRoleStore(PermRole) { + 'ngInject'; + + var roleStore = {}; + + this.defineRole = defineRole; + this.defineManyRoles = defineManyRoles; + this.getRoleDefinition = getRoleDefinition; + this.hasRoleDefinition = hasRoleDefinition; + this.removeRoleDefinition = removeRoleDefinition; + this.getStore = getStore; + this.clearStore = clearStore; + + /** + * Allows to add single role definition to the store by providing it's name and validation function + * @methodOf permission.PermRoleStore + * + * @param roleName {String} Name of defined role + * @param [validationFunction] {Function|Array} Function used to validate if role is valid or set of + * permission names that has to be owned to have a role + */ + function defineRole(roleName, validationFunction) { + roleStore[roleName] = new PermRole(roleName, validationFunction); + } + + /** + * Allows to define set of roleNames with shared validation function + * @methodOf permission.PermPermissionStore + * @throws {TypeError} + * + * @param roleMap {String, Function|Array} Map of roles with matching validators + */ + function defineManyRoles(roleMap) { + if (!angular.isObject(roleMap)) { + throw new TypeError('Parameter "roleNames" name must be object'); + } + + angular.forEach(roleMap, function (validationFunction, roleName) { + defineRole(roleName, validationFunction); + }); + } + + /** + * Deletes role from store + * @method permission.PermRoleStore + * + * @param roleName {String} Name of defined permission + */ + function removeRoleDefinition(roleName) { + delete roleStore[roleName]; + } + + /** + * Checks if role is defined in store + * @method permission.PermRoleStore + * + * @param roleName {String} Name of role + * @returns {Boolean} + */ + function hasRoleDefinition(roleName) { + return angular.isDefined(roleStore[roleName]); + } + + /** + * Returns role definition object by it's name + * @method permission.PermRoleStore + * + * @returns {permission.PermRole} PermRole definition object + */ + function getRoleDefinition(roleName) { + return roleStore[roleName]; + } + + /** + * Returns all role definitions + * @method permission.PermRoleStore + * + * @returns {Object} Defined roles collection + */ + function getStore() { + return roleStore; + } + + /** + * Removes all role definitions + * @method permission.PermRoleStore + */ + function clearStore() { + roleStore = {}; + } + } + + angular + .module('permission') + .service('PermRoleStore', PermRoleStore); + + /** + * Handles authorization based on provided permissions/roles. + * @name permission.permissionDirective + * + * Directive accepts single or combined attributes `permission-only` and `permission-except` that checks on + * DOM rendering if permissions/roles are met. Attributes can be passed either as String, Array or variable from + * parent scope. Directive also will watch for changes if applied and automatically update the view. + * + * @example + *
+ *
+ *
+ *
+ *
+ * + * By default directive will show/hide elements if provided permissions matches. + * You can override this behaviour by passing `permission-on-authorized` and `permission-on-unauthorized` + * attributes that will pass to your function `$element` as argument that you can freely manipulate your DOM + * behaviour. + * + * Important! Function should be as references - `vm.disableElement` not `vm.disableElement()` to be able to + * accept passed $element reference from inside of permissionDirective + * + * @example + *
+ *
+ * + * @param $log {Object} Logging service + * @param $injector {Object} Injector instance object + * @param PermPermissionMap {permission.permPermissionMap|Function} Map of state access rights + * @param PermPermissionStrategies {permission.permPermissionStrategies} Set of pre-defined directive behaviours + * + * @returns {{ + * restrict: string, + * bindToController: { + * sref: string + * only: string, + * except: string, + * onAuthorized: function, + * onUnauthorized: function + * }, + * controllerAs: string, + * controller: controller + * }} Directive instance + */ + function PermissionDirective($log, $injector, PermPermissionMap, PermPermissionStrategies) { + 'ngInject'; + + return { + restrict: 'A', + bindToController: { + sref: '=?permissionSref', + options: '=?permissionOptions', + only: '=?permissionOnly', + except: '=?permissionExcept', + onAuthorized: '&?permissionOnAuthorized', + onUnauthorized: '&?permissionOnUnauthorized' + }, + controllerAs: 'permission', + controller: ['$scope', '$element', '$permission', function ($scope, $element, $permission) { + var permission = this; + + $scope.$watchGroup(['permission.only', 'permission.except', 'sref', 'permissionOptions'], + function () { + try { + var options=angular.copy(permission.options); + if (angular.isString(permission.options)){ + options=$scope.$eval(options); + } + if (isSrefStateDefined()) { + var PermStateAuthorization = $injector.get('PermStateAuthorization'); + PermStateAuthorization.authorizeByStateName(permission.sref,options) + .then(function () { + onAuthorizedAccess(); + }) + .catch(function () { + onUnauthorizedAccess(); + }); + } else { + var PermAuthorization = $injector.get('PermAuthorization'); + var permissionMap = new PermPermissionMap({ + only: permission.only, + except: permission.except + }); + + PermAuthorization + .authorizeByPermissionMap(permissionMap, permission.options) + .then(function () { + onAuthorizedAccess(); + }) + .catch(function () { + onUnauthorizedAccess(); + }); + } + } catch (e) { + onUnauthorizedAccess(); + $log.error(e.message); + } + }); + + /** + * Returns true when permissions should be checked based on state name + * @private + * + * @returns {boolean} + */ + function isSrefStateDefined() { + return $injector.has('$state') && permission.sref; + } + + /** + * Calls `onAuthorized` function if provided or show element + * @private + */ + function onAuthorizedAccess() { + if (angular.isFunction(permission.onAuthorized)) { + permission.onAuthorized()($element); + } else { + var onAuthorizedMethodName = $permission.defaultOnAuthorizedMethod; + PermPermissionStrategies[onAuthorizedMethodName]($element); + } + } + + /** + * Calls `onUnauthorized` function if provided or hide element + * @private + */ + function onUnauthorizedAccess() { + if (angular.isFunction(permission.onUnauthorized)) { + permission.onUnauthorized()($element); + } else { + var onUnauthorizedMethodName = $permission.defaultOnUnauthorizedMethod; + PermPermissionStrategies[onUnauthorizedMethodName]($element); + } + } + }] + }; + } + + angular + .module('permission') + .directive('permission', PermissionDirective); + + + /** + * Service responsible for handling view based authorization + * @name permission.PermAuthorization + * + * @param $q {Object} Angular promise implementation + */ + function PermAuthorization($q) { + 'ngInject'; + + this.authorizeByPermissionMap = authorizeByPermissionMap; + + /** + * Handles authorization based on provided permissions map + * @methodOf permission.PermAuthorization + * + * @param map {permission.PermissionMap} Map of permission names + * + * @returns {promise} $q.promise object + */ + function authorizeByPermissionMap(map, options) { + var deferred = $q.defer(); + + resolveExceptPrivilegeMap(deferred, map, options); + + return deferred.promise; + } + + /** + * Resolves flat set of "except" privileges + * @methodOf permission.PermAuthorization + * @private + * + * @param deferred {Object} Promise defer + * @param map {permission.PermissionMap} Access rights map + * + */ + function resolveExceptPrivilegeMap(deferred, map, options) { + var exceptPromises = map.resolvePropertyValidity(map.except, options); + + $q.any(exceptPromises) + .then(function (rejectedPermissions) { + deferred.reject(rejectedPermissions); + }) + .catch(function () { + resolveOnlyPermissionMap(deferred, map, options); + }); + } + + /** + * Resolves flat set of "only" privileges + * @methodOf permission.PermAuthorization + * @private + * + * @param deferred {Object} Promise defer + * @param map {permission.PermissionMap} Access rights map + */ + function resolveOnlyPermissionMap(deferred, map, options) { + if (!map.only.length) { + deferred.resolve(); + return; + } + + var onlyPromises = map.resolvePropertyValidity(map.only, options); + $q.any(onlyPromises) + .then(function (resolvedPermissions) { + deferred.resolve(resolvedPermissions); + }) + .catch(function (rejectedPermission) { + deferred.reject(rejectedPermission); + }); + } + } + + angular + .module('permission') + .service('PermAuthorization', PermAuthorization); + + + /** + * Access rights map factory + * @name permission.PermPermissionMap + * + * @param $q {Object} Angular promise implementation + * @param $log {Object} Angular logging utility + * @param $injector {Object} Dependency injection instance + * @param $permission {Object} Permission module configuration object + * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing ui-router transition parameters + * @param PermRoleStore {permission.PermRoleStore} Role definition storage + * @param PermPermissionStore {permission.PermPermissionStore} Permission definition storage + * + * @return {permission.PermissionMap} + */ + function PermPermissionMap($q, $log, $injector, $permission, PermTransitionProperties, PermRoleStore, PermPermissionStore) { + 'ngInject'; + + /** + * Constructs map object instructing authorization service how to handle authorizing + * @constructor permission.PermissionMap + * + * @param [permissionMap] {Object} Map of permissions provided to authorization service + * @param [permissionMap.only] {String|Array|Function} List of exclusive access right names allowed for + * authorization + * @param [permissionMap.except] {String|Array|Function} List of exclusive access right names denied for + * authorization + * @param [permissionMap.redirectTo] {String|Function|Object|promise} Handling redirection when rejected + * authorization + */ + function PermissionMap(permissionMap) { + // Suppress not defined object errors + permissionMap = permissionMap || {}; + + this.only = normalizeOnlyAndExceptProperty(permissionMap.only); + this.except = normalizeOnlyAndExceptProperty(permissionMap.except); + this.redirectTo = normalizeRedirectToProperty(permissionMap.redirectTo); + } + + /** + * Redirects to fallback states when permissions fail + * @methodOf permission.PermissionMap + * + * @param [rejectedPermissionName] {String} Permission name + * + * @return {Promise} + */ + PermissionMap.prototype.resolveRedirectState = function (rejectedPermissionName) { + + // If redirectTo definition is not found stay where you are + if (!angular.isDefined(this.redirectTo)) { + return $q.reject(); + } + + var redirectState = this.redirectTo[rejectedPermissionName] || this.redirectTo['default']; + + return resolveRedirectState(redirectState, rejectedPermissionName); + }; + + /** + * Resolves weather permissions set for "only" or "except" property are valid + * @methodOf permission.PermissionMap + * + * @param property {Array} "only" or "except" map property + * + * @return {Array} + */ + PermissionMap.prototype.resolvePropertyValidity = function (property, options) { + + return property.map(function (privilegeName) { + if (PermRoleStore.hasRoleDefinition(privilegeName)) { + var role = PermRoleStore.getRoleDefinition(privilegeName); + return role.validateRole(options); + } + + if (PermPermissionStore.hasPermissionDefinition(privilegeName)) { + var permission = PermPermissionStore.getPermissionDefinition(privilegeName); + return permission.validatePermission(options); + } + + if (!$permission.suppressUndefinedPermissionWarning) { + $log.warn('Permission or role ' + privilegeName + ' was not defined.'); + } + return $q.reject(privilegeName); + }); + }; + + /** + * Handles function based redirection for rejected permissions + * @methodOf permission.PermissionMap + * + * @throws {TypeError} + * + * @param redirectFunction {Function} Redirection function + * @param rejectedPermissionName {String} Rejected permission + * + * @return {Promise} + */ + function resolveRedirectState(redirectFunction, rejectedPermissionName) { + return $q + .when($injector.invoke(redirectFunction, null, { + rejectedPermission: rejectedPermissionName, + transitionProperties: PermTransitionProperties + })) + .then(function (redirectState) { + if (angular.isString(redirectState)) { + return { + state: redirectState + }; + } + + if (angular.isObject(redirectState)) { + return redirectState; + } + + return $q.reject(); + }); + } + + /** + * Handles extraction of permission map "only" and "except" properties and converts them into array objects + * @methodOf permission.PermissionMap + * @private + * + * @param property {String|Array|Function} PermPermission map property "only" or "except" + * + * @returns {Array} Array of permission "only" or "except" names + */ + function normalizeOnlyAndExceptProperty(property) { + if (angular.isString(property)) { + return [property]; + } + + if (angular.isArray(property)) { + return property; + } + + if (angular.isFunction(property)) { + return property.call(null, PermTransitionProperties); + } + + return []; + } + + /** + * Convert user provided input into key value dictionary with permission/role name as a key and injectable resolver + * function as a value + * @methodOf permission.PermissionMap + * @private + * + * @param redirectTo {String|Function|Array|Object} PermPermission map property "redirectTo" + * + * @returns {Object} Redirection dictionary object + */ + function normalizeRedirectToProperty(redirectTo) { + if (!angular.isDefined(redirectTo)) { + return; + } + + if (isInjectable(redirectTo) || angular.isFunction(redirectTo)) { + return normalizeFunctionRedirectionRule(redirectTo); + } + + if (angular.isObject(redirectTo)) { + if (isObjectSingleRedirectionRule(redirectTo)) { + return normalizeObjectSingleRedirectionRule(redirectTo); + } + + return normalizeObjectMultipleRedirectionRule(redirectTo); + } + + if (angular.isString(redirectTo)) { + return normalizeStringRedirectionRule(redirectTo); + } + + throw new ReferenceError('Property "redirectTo" must be String, Function, Array or Object'); + } + + /** + * Convert string redirection rule into single-element redirection dictionary + * @methodOf permission.PermissionMap + * @private + * + * @param redirectTo {String} PermPermission map property "redirectTo" + * + * @returns {Object} Redirection dictionary object + */ + function normalizeStringRedirectionRule(redirectTo) { + var redirectionMap = {}; + + redirectionMap.default = function () { + return { + state: redirectTo + }; + }; + redirectionMap.default.$inject = ['rejectedPermission', 'transitionProperties']; + + return redirectionMap; + } + + /** + * Checks if redirection object is single rule type + * @methodOf permission.PermissionMap + * @private + * + * @param redirectTo {Object} PermPermission map property "redirectTo" + * + * @returns {boolean} + */ + function isObjectSingleRedirectionRule(redirectTo) { + return angular.isDefined(redirectTo.state); + } + + /** + * Convert single redirection rule object into single-element redirection dictionary + * @methodOf permission.PermissionMap + * @private + * + * @param redirectTo {Object} PermPermission map property "redirectTo" + * + * @returns {Object} Redirection dictionary object + */ + function normalizeObjectSingleRedirectionRule(redirectTo) { + var redirectionMap = {}; + + redirectionMap.default = function () { + return redirectTo; + }; + + return redirectionMap; + } + + /** + * Convert multiple redirection rule object into redirection dictionary + * @methodOf permission.PermissionMap + * @private + * + * @param redirectTo {Object} PermPermission map property "redirectTo" + * + * @returns {Object} Redirection dictionary object + */ + function normalizeObjectMultipleRedirectionRule(redirectTo) { + var redirectionMap = {}; + + angular.forEach(redirectTo, function (redirection, permission) { + if (isInjectable(redirection)) { + redirectionMap[permission] = redirection; + } else { + if (angular.isFunction(redirection)) { + redirectionMap[permission] = redirection; + redirectionMap[permission].$inject = []; + } + } + + if (angular.isObject(redirection)) { + redirectionMap[permission] = function () { + return redirection; + }; + redirectionMap[permission].$inject = []; + } + + if (angular.isString(redirection)) { + redirectionMap[permission] = function () { + return { + state: redirection + }; + }; + redirectionMap[permission].$inject = []; + } + }); + + return redirectionMap; + } + + /** + * Checks if property is injectable + * @methodOf permission.PermissionMap + * @private + * + * @param property {Array|Object} + * + * @returns {boolean} + */ + function isInjectable(property) { + return angular.isArray(property) || (angular.isFunction(property) && angular.isArray(property.$inject)); + } + + /** + * Convert function redirection rule into redirection dictionary + * @methodOf permission.PermissionMap + * @private + * + * @param redirectTo {Function} PermPermission map property "redirectTo" + * + * @returns {Object} Redirection dictionary object + */ + function normalizeFunctionRedirectionRule(redirectTo) { + var redirectionMap = {}; + + redirectionMap.default = redirectTo; + + if (!angular.isDefined(redirectTo.$inject)) { + redirectionMap.default.$inject = ['rejectedPermission', 'transitionProperties']; + } + + return redirectionMap; + } + + return PermissionMap; + } + + angular + .module('permission') + .factory('PermPermissionMap', PermPermissionMap); + +}(window, window.angular)); diff --git a/dist/angular-permission.min.js b/dist/angular-permission.min.js index 810bfd1..ecdf339 100644 --- a/dist/angular-permission.min.js +++ b/dist/angular-permission.min.js @@ -1,12 +1,12 @@ /** * angular-permission * Fully featured role and permission based access control for your angular applications - * @version v5.3.2 - 2017-05-29 + * @version v5.3.2 - 2018-02-27 * @link https://github.com/Narzerus/angular-permission * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak * @license MIT License, http://www.opensource.org/licenses/MIT */ -!function(a,angular,b){"use strict";function c(){"ngInject";var a="showElement",b="hideElement",c=!1;this.setDefaultOnAuthorizedMethod=function(b){a=b},this.setDefaultOnUnauthorizedMethod=function(a){b=a},this.suppressUndefinedPermissionWarning=function(a){c=a},this.$get=function(){return{defaultOnAuthorizedMethod:a,defaultOnUnauthorizedMethod:b,suppressUndefinedPermissionWarning:c}}}function d(a){"ngInject";function b(b){var c=a.defer(),d=0,e=angular.isArray(b)?[]:{};return angular.forEach(b,function(b,f){d++,a.when(b).then(function(a){c.resolve(a)}).catch(function(a){e[f]=a,--d||c.reject(a)})}),0===d&&c.reject(e),c.promise}return a.any=b,a}function e(){"ngInject";this.broadcastPermissionStartEvent=function(){throw new Error("Method broadcastPermissionStartEvent in PermTransitionEvents interface must be implemented")},this.broadcastPermissionAcceptedEvent=function(){throw new Error("Method broadcastPermissionAcceptedEvent in PermTransitionEvents interface must be implemented")},this.broadcastPermissionDeniedEvent=function(){throw new Error("Method broadcastPermissionDeniedEvent in PermTransitionEvents interface must be implemented")}}function f(a,b,c){"ngInject";function d(a,b){f(a,b),this.permissionName=a,this.validationFunction=g(b)}function e(b,c){return b?a.resolve(c):a.reject(c)}function f(a,b){if(!angular.isString(a))throw new TypeError('Parameter "permissionName" name must be String');if(!angular.isFunction(b)&&!angular.isArray(b))throw new TypeError('Parameter "validationFunction" must be Function or an injectable Function using explicit annotation')}function g(a){return angular.isArray(a.$inject||a)||(a=["permissionName","transitionProperties",a]),a}return d.prototype.validatePermission=function(){var a={permissionName:this.permissionName,transitionProperties:c},d=b.invoke(this.validationFunction,null,a);return angular.isFunction(d.then)||(d=e(d,this.permissionName)),d},d}function g(a,b,c,d){"ngInject";function e(a,b){g(a,b),this.roleName=a,this.validationFunction=h(b)}function f(b,c){return b?a.resolve(c):a.reject(c)}function g(a,b){if(!angular.isString(a))throw new TypeError('Parameter "roleName" name must be String');if(!angular.isArray(b)&&!angular.isFunction(b))throw new TypeError('Parameter "validationFunction" must be array or function')}function h(a){return angular.isArray(a)&&!angular.isFunction(a[a.length-1])?a=i(a):angular.isArray(a.$inject||a)||(a=["roleName","transitionProperties",a]),a}function i(b){return function(){var d=b.map(function(b){if(c.hasPermissionDefinition(b)){var d=c.getPermissionDefinition(b);return d.validatePermission()}return a.reject(b)});return a.all(d)}}return e.prototype.validateRole=function(){var a={roleName:this.roleName,transitionProperties:d},c=b.invoke(this.validationFunction,null,a);return angular.isFunction(c.then)||(c=f(c,this.roleName)),c},e}function h(a){"ngInject";function b(b,c){i[b]=new a(b,c)}function c(a,c){if(!angular.isArray(a))throw new TypeError('Parameter "permissionNames" name must be Array');angular.forEach(a,function(a){b(a,c)})}function d(a){delete i[a]}function e(a){return angular.isDefined(i[a])}function f(a){return i[a]}function g(){return i}function h(){i={}}var i={};this.definePermission=b,this.defineManyPermissions=c,this.removePermissionDefinition=d,this.hasPermissionDefinition=e,this.getPermissionDefinition=f,this.getStore=g,this.clearStore=h}function i(a){"ngInject";function b(b,c){i[b]=new a(b,c)}function c(a){if(!angular.isObject(a))throw new TypeError('Parameter "roleNames" name must be object');angular.forEach(a,function(a,c){b(c,a)})}function d(a){delete i[a]}function e(a){return angular.isDefined(i[a])}function f(a){return i[a]}function g(){return i}function h(){i={}}var i={};this.defineRole=b,this.defineManyRoles=c,this.getRoleDefinition=f,this.hasRoleDefinition=e,this.removeRoleDefinition=d,this.getStore=g,this.clearStore=h}function j(a,b,c,d){"ngInject";return{restrict:"A",bindToController:{sref:"=?permissionSref",only:"=?permissionOnly",except:"=?permissionExcept",onAuthorized:"&?permissionOnAuthorized",onUnauthorized:"&?permissionOnUnauthorized"},controllerAs:"permission",controller:["$scope","$element","$permission",function(e,f,g){function h(){return b.has("$state")&&k.sref}function i(){if(angular.isFunction(k.onAuthorized))k.onAuthorized()(f);else{var a=g.defaultOnAuthorizedMethod;d[a](f)}}function j(){if(angular.isFunction(k.onUnauthorized))k.onUnauthorized()(f);else{var a=g.defaultOnUnauthorizedMethod;d[a](f)}}var k=this;e.$watchGroup(["permission.only","permission.except","sref"],function(){try{if(h()){var d=b.get("PermStateAuthorization");d.authorizeByStateName(k.sref).then(function(){i()}).catch(function(){j()})}else{var e=b.get("PermAuthorization"),f=new c({only:k.only,except:k.except});e.authorizeByPermissionMap(f).then(function(){i()}).catch(function(){j()})}}catch(b){j(),a.error(b.message)}})}]}}function k(a){"ngInject";function b(b){var d=a.defer();return c(d,b),d.promise}function c(b,c){var e=c.resolvePropertyValidity(c.except);a.any(e).then(function(a){b.reject(a)}).catch(function(){d(b,c)})}function d(b,c){if(!c.only.length)return void b.resolve();var d=c.resolvePropertyValidity(c.only);a.any(d).then(function(a){b.resolve(a)}).catch(function(a){b.reject(a)})}this.authorizeByPermissionMap=b}function l(a,b,c,d,e,f,g){"ngInject";function h(a){a=a||{},this.only=j(a.only),this.except=j(a.except),this.redirectTo=k(a.redirectTo)}function i(b,d){return a.when(c.invoke(b,null,{rejectedPermission:d,transitionProperties:e})).then(function(b){return angular.isString(b)?{state:b}:angular.isObject(b)?b:a.reject()})}function j(a){return angular.isString(a)?[a]:angular.isArray(a)?a:angular.isFunction(a)?a.call(null,e):[]}function k(a){if(angular.isDefined(a)){if(p(a)||angular.isFunction(a))return q(a);if(angular.isObject(a))return m(a)?n(a):o(a);if(angular.isString(a))return l(a);throw new ReferenceError('Property "redirectTo" must be String, Function, Array or Object')}}function l(a){var b={};return b.default=function(){return{state:a}},b.default.$inject=["rejectedPermission","transitionProperties"],b}function m(a){return angular.isDefined(a.state)}function n(a){var b={};return b.default=function(){return a},b}function o(a){var b={};return angular.forEach(a,function(a,c){p(a)?b[c]=a:angular.isFunction(a)&&(b[c]=a,b[c].$inject=[]),angular.isObject(a)&&(b[c]=function(){return a},b[c].$inject=[]),angular.isString(a)&&(b[c]=function(){return{state:a}},b[c].$inject=[])}),b}function p(a){return angular.isArray(a)||angular.isFunction(a)&&angular.isArray(a.$inject)}function q(a){var b={};return b.default=a,angular.isDefined(a.$inject)||(b.default.$inject=["rejectedPermission","transitionProperties"]),b}return h.prototype.resolveRedirectState=function(b){if(!angular.isDefined(this.redirectTo))return a.reject();var c=this.redirectTo[b]||this.redirectTo.default;return i(c,b)},h.prototype.resolvePropertyValidity=function(c){return c.map(function(c){if(f.hasRoleDefinition(c)){var e=f.getRoleDefinition(c);return e.validateRole()}if(g.hasPermissionDefinition(c)){var h=g.getPermissionDefinition(c);return h.validatePermission()}return d.suppressUndefinedPermissionWarning||b.warn("Permission or role "+c+" was not defined."),a.reject(c)})},h}d.$inject=["$delegate"],f.$inject=["$q","$injector","PermTransitionProperties"],g.$inject=["$q","$injector","PermPermissionStore","PermTransitionProperties"],h.$inject=["PermPermission"],i.$inject=["PermRole"],j.$inject=["$log","$injector","PermPermissionMap","PermPermissionStrategies"],k.$inject=["$q"],l.$inject=["$q","$log","$injector","$permission","PermTransitionProperties","PermRoleStore","PermPermissionStore"];var m=angular.module("permission",[]);"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports=m.name),angular.module("permission").provider("$permission",c),angular.module("permission").decorator("$q",d);var n={enableElement:function(a){a.removeAttr("disabled")},disableElement:function(a){a.attr("disabled","disabled")},showElement:function(a){a.removeClass("ng-hide")},hideElement:function(a){a.addClass("ng-hide")}};angular.module("permission").value("PermPermissionStrategies",n).value("PermissionStrategies",n);var o={};angular.module("permission").value("PermTransitionProperties",o),angular.module("permission").service("PermTransitionEvents",e),angular.module("permission").factory("PermPermission",f),angular.module("permission").factory("PermRole",g),angular.module("permission").service("PermPermissionStore",h),angular.module("permission").service("PermRoleStore",i),angular.module("permission").directive("permission",j),angular.module("permission").service("PermAuthorization",k),angular.module("permission").factory("PermPermissionMap",l)}(window,window.angular); +!function(a,angular,b){"use strict";function c(){"ngInject";var a="showElement",b="hideElement",c=!1;this.setDefaultOnAuthorizedMethod=function(b){a=b},this.setDefaultOnUnauthorizedMethod=function(a){b=a},this.suppressUndefinedPermissionWarning=function(a){c=a},this.$get=function(){return{defaultOnAuthorizedMethod:a,defaultOnUnauthorizedMethod:b,suppressUndefinedPermissionWarning:c}}}function d(a){"ngInject";function b(b){var c=a.defer(),d=0,e=angular.isArray(b)?[]:{};return angular.forEach(b,function(b,f){d++,a.when(b).then(function(a){c.resolve(a)})["catch"](function(a){e[f]=a,--d||c.reject(a)})}),0===d&&c.reject(e),c.promise}return a.any=b,a}function e(){"ngInject";this.broadcastPermissionStartEvent=function(){throw new Error("Method broadcastPermissionStartEvent in PermTransitionEvents interface must be implemented")},this.broadcastPermissionAcceptedEvent=function(){throw new Error("Method broadcastPermissionAcceptedEvent in PermTransitionEvents interface must be implemented")},this.broadcastPermissionDeniedEvent=function(){throw new Error("Method broadcastPermissionDeniedEvent in PermTransitionEvents interface must be implemented")}}function f(a,b,c){"ngInject";function d(a,b){f(a,b),this.permissionName=a,this.validationFunction=g(b)}function e(b,c){return b?a.resolve(c):a.reject(c)}function f(a,b){if(!angular.isString(a))throw new TypeError('Parameter "permissionName" name must be String');if(!angular.isFunction(b)&&!angular.isArray(b))throw new TypeError('Parameter "validationFunction" must be Function or an injectable Function using explicit annotation')}function g(a){return angular.isArray(a.$inject||a)||(a=["permissionName","transitionProperties",a]),a}return d.prototype.validatePermission=function(a){var d={permissionName:this.permissionName,transitionProperties:a||c},f=b.invoke(this.validationFunction,null,d);return angular.isFunction(f.then)||(f=e(f,this.permissionName)),f},d}function g(a,b,c,d){"ngInject";function e(a,b){g(a,b),this.roleName=a,this.validationFunction=h(b)}function f(b,c){return b?a.resolve(c):a.reject(c)}function g(a,b){if(!angular.isString(a))throw new TypeError('Parameter "roleName" name must be String');if(!angular.isArray(b)&&!angular.isFunction(b))throw new TypeError('Parameter "validationFunction" must be array or function')}function h(a){return angular.isArray(a)&&!angular.isFunction(a[a.length-1])?a=i(a):angular.isArray(a.$inject||a)||(a=["roleName","transitionProperties",a]),a}function i(b,d){return function(){var e=b.map(function(b){if(c.hasPermissionDefinition(b)){var e=c.getPermissionDefinition(b);return e.validatePermission(d)}return a.reject(b)});return a.all(e)}}return e.prototype.validateRole=function(a){var c={roleName:this.roleName,transitionProperties:a||d},e=b.invoke(this.validationFunction,null,c);return angular.isFunction(e.then)||(e=f(e,this.roleName)),e},e}function h(a){"ngInject";function b(b,c){i[b]=new a(b,c)}function c(a,c){if(!angular.isArray(a))throw new TypeError('Parameter "permissionNames" name must be Array');angular.forEach(a,function(a){b(a,c)})}function d(a){delete i[a]}function e(a){return angular.isDefined(i[a])}function f(a){return i[a]}function g(){return i}function h(){i={}}var i={};this.definePermission=b,this.defineManyPermissions=c,this.removePermissionDefinition=d,this.hasPermissionDefinition=e,this.getPermissionDefinition=f,this.getStore=g,this.clearStore=h}function i(a){"ngInject";function b(b,c){i[b]=new a(b,c)}function c(a){if(!angular.isObject(a))throw new TypeError('Parameter "roleNames" name must be object');angular.forEach(a,function(a,c){b(c,a)})}function d(a){delete i[a]}function e(a){return angular.isDefined(i[a])}function f(a){return i[a]}function g(){return i}function h(){i={}}var i={};this.defineRole=b,this.defineManyRoles=c,this.getRoleDefinition=f,this.hasRoleDefinition=e,this.removeRoleDefinition=d,this.getStore=g,this.clearStore=h}function j(a,b,c,d){"ngInject";return{restrict:"A",bindToController:{sref:"=?permissionSref",options:"=?permissionOptions",only:"=?permissionOnly",except:"=?permissionExcept",onAuthorized:"&?permissionOnAuthorized",onUnauthorized:"&?permissionOnUnauthorized"},controllerAs:"permission",controller:["$scope","$element","$permission",function(e,f,g){function h(){return b.has("$state")&&k.sref}function i(){if(angular.isFunction(k.onAuthorized))k.onAuthorized()(f);else{var a=g.defaultOnAuthorizedMethod;d[a](f)}}function j(){if(angular.isFunction(k.onUnauthorized))k.onUnauthorized()(f);else{var a=g.defaultOnUnauthorizedMethod;d[a](f)}}var k=this;e.$watchGroup(["permission.only","permission.except","sref","permissionOptions"],function(){try{if(h()){var d=b.get("PermStateAuthorization");d.authorizeByStateName(k.sref,e.$eval(k.options)).then(function(){i()})["catch"](function(){j()})}else{var f=b.get("PermAuthorization"),g=new c({only:k.only,except:k.except});f.authorizeByPermissionMap(g,e.$eval(k.options)).then(function(){i()})["catch"](function(){j()})}}catch(l){j(),a.error(l.message)}})}]}}function k(a){"ngInject";function b(b,d){var e=a.defer();return c(e,b,d),e.promise}function c(b,c,e){var f=c.resolvePropertyValidity(c.except,e);a.any(f).then(function(a){b.reject(a)})["catch"](function(){d(b,c,e)})}function d(b,c,d){if(!c.only.length)return void b.resolve();var e=c.resolvePropertyValidity(c.only,d);a.any(e).then(function(a){b.resolve(a)})["catch"](function(a){b.reject(a)})}this.authorizeByPermissionMap=b}function l(a,b,c,d,e,f,g){"ngInject";function h(a){a=a||{},this.only=j(a.only),this.except=j(a.except),this.redirectTo=k(a.redirectTo)}function i(b,d){return a.when(c.invoke(b,null,{rejectedPermission:d,transitionProperties:e})).then(function(b){return angular.isString(b)?{state:b}:angular.isObject(b)?b:a.reject()})}function j(a){return angular.isString(a)?[a]:angular.isArray(a)?a:angular.isFunction(a)?a.call(null,e):[]}function k(a){if(angular.isDefined(a)){if(p(a)||angular.isFunction(a))return q(a);if(angular.isObject(a))return m(a)?n(a):o(a);if(angular.isString(a))return l(a);throw new ReferenceError('Property "redirectTo" must be String, Function, Array or Object')}}function l(a){var b={};return b["default"]=function(){return{state:a}},b["default"].$inject=["rejectedPermission","transitionProperties"],b}function m(a){return angular.isDefined(a.state)}function n(a){var b={};return b["default"]=function(){return a},b}function o(a){var b={};return angular.forEach(a,function(a,c){p(a)?b[c]=a:angular.isFunction(a)&&(b[c]=a,b[c].$inject=[]),angular.isObject(a)&&(b[c]=function(){return a},b[c].$inject=[]),angular.isString(a)&&(b[c]=function(){return{state:a}},b[c].$inject=[])}),b}function p(a){return angular.isArray(a)||angular.isFunction(a)&&angular.isArray(a.$inject)}function q(a){var b={};return b["default"]=a,angular.isDefined(a.$inject)||(b["default"].$inject=["rejectedPermission","transitionProperties"]),b}return h.prototype.resolveRedirectState=function(b){if(!angular.isDefined(this.redirectTo))return a.reject();var c=this.redirectTo[b]||this.redirectTo["default"];return i(c,b)},h.prototype.resolvePropertyValidity=function(c,e){return c.map(function(c){if(f.hasRoleDefinition(c)){var h=f.getRoleDefinition(c);return h.validateRole(e)}if(g.hasPermissionDefinition(c)){var i=g.getPermissionDefinition(c);return i.validatePermission(e)}return d.suppressUndefinedPermissionWarning||b.warn("Permission or role "+c+" was not defined."),a.reject(c)})},h}d.$inject=["$delegate"],f.$inject=["$q","$injector","PermTransitionProperties"],g.$inject=["$q","$injector","PermPermissionStore","PermTransitionProperties"],h.$inject=["PermPermission"],i.$inject=["PermRole"],j.$inject=["$log","$injector","PermPermissionMap","PermPermissionStrategies"],k.$inject=["$q"],l.$inject=["$q","$log","$injector","$permission","PermTransitionProperties","PermRoleStore","PermPermissionStore"];var m=angular.module("permission",[]);"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports=m.name),angular.module("permission").provider("$permission",c),angular.module("permission").decorator("$q",d);var n={enableElement:function(a){a.removeAttr("disabled")},disableElement:function(a){a.attr("disabled","disabled")},showElement:function(a){a.removeClass("ng-hide")},hideElement:function(a){a.addClass("ng-hide")}};angular.module("permission").value("PermPermissionStrategies",n).value("PermissionStrategies",n);var o={};angular.module("permission").value("PermTransitionProperties",o),angular.module("permission").service("PermTransitionEvents",e),angular.module("permission").factory("PermPermission",f),angular.module("permission").factory("PermRole",g),angular.module("permission").service("PermPermissionStore",h),angular.module("permission").service("PermRoleStore",i),angular.module("permission").directive("permission",j),angular.module("permission").service("PermAuthorization",k),angular.module("permission").factory("PermPermissionMap",l)}(window,window.angular); //# sourceMappingURL=angular-permission.min.js.map \ No newline at end of file diff --git a/dist/angular-permission.min.js.map b/dist/angular-permission.min.js.map index f8a0db6..1106131 100644 --- a/dist/angular-permission.min.js.map +++ b/dist/angular-permission.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["angular-permission.js"],"names":["window","angular","undefined","$permission","defaultOnAuthorizedMethod","defaultOnUnauthorizedMethod","suppressUndefinedPermissionWarning","this","setDefaultOnAuthorizedMethod","onAuthorizedMethod","setDefaultOnUnauthorizedMethod","onUnauthorizedMethod","value","$get","$q","$delegate","any","promises","deferred","defer","counter","results","isArray","forEach","promise","key","when","then","resolve","catch","reason","reject","PermTransitionEvents","broadcastPermissionStartEvent","Error","broadcastPermissionAcceptedEvent","broadcastPermissionDeniedEvent","PermPermission","$injector","PermTransitionProperties","Permission","permissionName","validationFunction","validateConstructor","annotateValidationFunction","wrapInPromise","result","isString","TypeError","isFunction","$inject","prototype","validatePermission","validationLocals","transitionProperties","validationResult","invoke","PermRole","PermPermissionStore","Role","roleName","length","preparePermissionEvaluation","permissions","map","hasPermissionDefinition","permission","getPermissionDefinition","all","validateRole","definePermission","permissionStore","defineManyPermissions","permissionNames","removePermissionDefinition","isDefined","getStore","clearStore","PermRoleStore","defineRole","roleStore","defineManyRoles","roleMap","isObject","removeRoleDefinition","hasRoleDefinition","getRoleDefinition","PermissionDirective","$log","PermPermissionMap","PermPermissionStrategies","restrict","bindToController","sref","only","except","onAuthorized","onUnauthorized","controllerAs","controller","$scope","$element","isSrefStateDefined","has","onAuthorizedAccess","onAuthorizedMethodName","onUnauthorizedAccess","onUnauthorizedMethodName","$watchGroup","PermStateAuthorization","get","authorizeByStateName","PermAuthorization","permissionMap","authorizeByPermissionMap","e","error","message","resolveExceptPrivilegeMap","exceptPromises","resolvePropertyValidity","rejectedPermissions","resolveOnlyPermissionMap","onlyPromises","resolvedPermissions","rejectedPermission","PermissionMap","normalizeOnlyAndExceptProperty","redirectTo","normalizeRedirectToProperty","resolveRedirectState","redirectFunction","rejectedPermissionName","redirectState","state","property","call","isInjectable","normalizeFunctionRedirectionRule","isObjectSingleRedirectionRule","normalizeObjectSingleRedirectionRule","normalizeObjectMultipleRedirectionRule","normalizeStringRedirectionRule","ReferenceError","redirectionMap","default","redirection","privilegeName","role","warn","module","exports","name","provider","decorator","enableElement","removeAttr","disableElement","attr","showElement","removeClass","hideElement","addClass","service","factory","directive"],"mappings":";;;;;;;;;;CASC,SAAUA,EAAQC,QAASC,GAC1B,YA0BA,SAASC,KACP,UAEA,IAAIC,GAA4B,cAC5BC,EAA8B,cAC9BC,GAAqC,CAQzCC,MAAKC,6BAA+B,SAAUC,GAC5CL,EAA4BK,GAS9BF,KAAKG,+BAAiC,SAAUC,GAC9CN,EAA8BM,GAUhCJ,KAAKD,mCAAqC,SAAUM,GAClDN,EAAqCM,GAIvCL,KAAKM,KAAO,WACV,OACET,0BAA2BA,EAC3BC,4BAA6BA,EAC7BC,mCAAoCA,IAiB1C,QAASQ,GAAGC,GACV,UAeA,SAASC,GAAIC,GACX,GAAIC,GAAWH,EAAUI,QACvBC,EAAU,EACVC,EAAUpB,QAAQqB,QAAQL,QAqB5B,OAnBAhB,SAAQsB,QAAQN,EAAU,SAAUO,EAASC,GAC3CL,IACAL,EACGW,KAAKF,GACLG,KAAK,SAAUf,GACdM,EAASU,QAAQhB,KAElBiB,MAAM,SAAUC,GACfT,EAAQI,GAAOK,IACPV,GACNF,EAASa,OAAOD,OAKR,IAAZV,GACFF,EAASa,OAAOV,GAGXH,EAASM,QAGlB,MAxCAT,GAAUC,IAAMA,EAwCTD,EAyET,QAASiB,KACP,UAEAzB,MAAK0B,8BAAgC,WACnC,KAAM,IAAIC,OAAM,+FAGlB3B,KAAK4B,iCAAmC,WACtC,KAAM,IAAID,OAAM,kGAGlB3B,KAAK6B,+BAAiC,WACpC,KAAM,IAAIF,OAAM,gGAmBpB,QAASG,GAAevB,EAAIwB,EAAWC,GACrC,UASA,SAASC,GAAWC,EAAgBC,GAClCC,EAAoBF,EAAgBC,GAEpCnC,KAAKkC,eAAiBA,EACtBlC,KAAKmC,mBAAqBE,EAA2BF,GAiCvD,QAASG,GAAcC,EAAQL,GAC7B,MAAIK,GACKhC,EAAGc,QAAQa,GAGb3B,EAAGiB,OAAOU,GAanB,QAASE,GAAoBF,EAAgBC,GAC3C,IAAKzC,QAAQ8C,SAASN,GACpB,KAAM,IAAIO,WAAU,iDAEtB,KAAK/C,QAAQgD,WAAWP,KAAwBzC,QAAQqB,QAAQoB,GAC9D,KAAM,IAAIM,WAAU,uGAcxB,QAASJ,GAA2BF,GAOlC,MANKzC,SAAQqB,QAAQoB,EAAmBQ,SAAWR,KAGjDA,GAAsB,iBAAkB,uBAAwBA,IAG3DA,EAGT,MAvEAF,GAAWW,UAAUC,mBAAqB,WACxC,GAAIC,IACFZ,eAAgBlC,KAAKkC,eACrBa,qBAAsBf,GAEpBgB,EAAmBjB,EAAUkB,OAAOjD,KAAKmC,mBAAoB,KAAMW,EAMvE,OAJKpD,SAAQgD,WAAWM,EAAiB5B,QACvC4B,EAAmBV,EAAcU,EAAkBhD,KAAKkC,iBAGnDc,GA4DFf,EAkBT,QAASiB,GAAS3C,EAAIwB,EAAWoB,EAAqBnB,GACpD,UAUA,SAASoB,GAAKC,EAAUlB,GACtBC,EAAoBiB,EAAUlB,GAE9BnC,KAAKqD,SAAWA,EAChBrD,KAAKmC,mBAAqBE,EAA2BF,GAiCvD,QAASG,GAAcC,EAAQc,GAC7B,MAAId,GACKhC,EAAGc,QAAQgC,GAGb9C,EAAGiB,OAAO6B,GAcnB,QAASjB,GAAoBiB,EAAUlB,GACrC,IAAKzC,QAAQ8C,SAASa,GACpB,KAAM,IAAIZ,WAAU,2CAGtB,KAAK/C,QAAQqB,QAAQoB,KAAwBzC,QAAQgD,WAAWP,GAC9D,KAAM,IAAIM,WAAU,4DAexB,QAASJ,GAA2BF,GAUlC,MARIzC,SAAQqB,QAAQoB,KAAwBzC,QAAQgD,WAAWP,EAAmBA,EAAmBmB,OAAS,IAC5GnB,EAAqBoB,EAA4BpB,GACvCzC,QAAQqB,QAAQoB,EAAmBQ,SAAWR,KAGxDA,GAAsB,WAAY,uBAAwBA,IAGrDA,EAYT,QAASoB,GAA4BC,GACnC,MAAO,YACL,GAAI9C,GAAW8C,EAAYC,IAAI,SAAUvB,GACvC,GAAIiB,EAAoBO,wBAAwBxB,GAAiB,CAC/D,GAAIyB,GAAaR,EAAoBS,wBAAwB1B,EAE7D,OAAOyB,GAAWd,qBAGpB,MAAOtC,GAAGiB,OAAOU,IAGnB,OAAO3B,GAAGsD,IAAInD,IAIlB,MAtGA0C,GAAKR,UAAUkB,aAAe,WAC5B,GAAIhB,IACFO,SAAUrD,KAAKqD,SACfN,qBAAsBf,GAEpBgB,EAAmBjB,EAAUkB,OAAOjD,KAAKmC,mBAAoB,KAAMW,EAMvE,OAJKpD,SAAQgD,WAAWM,EAAiB5B,QACvC4B,EAAmBV,EAAcU,EAAkBhD,KAAKqD,WAGnDL,GA2FFI,EAaT,QAASD,GAAoBrB,GAC3B,UAwBA,SAASiC,GAAiB7B,EAAgBC,GACxC6B,EAAgB9B,GAAkB,GAAIJ,GAAeI,EAAgBC,GAWvE,QAAS8B,GAAsBC,EAAiB/B,GAC9C,IAAKzC,QAAQqB,QAAQmD,GACnB,KAAM,IAAIzB,WAAU,iDAGtB/C,SAAQsB,QAAQkD,EAAiB,SAAUhC,GACzC6B,EAAiB7B,EAAgBC,KAUrC,QAASgC,GAA2BjC,SAC3B8B,GAAgB9B,GAUzB,QAASwB,GAAwBxB,GAC/B,MAAOxC,SAAQ0E,UAAUJ,EAAgB9B,IAS3C,QAAS0B,GAAwB1B,GAC/B,MAAO8B,GAAgB9B,GASzB,QAASmC,KACP,MAAOL,GAOT,QAASM,KACPN,KArFF,GAAIA,KAEJhE,MAAK+D,iBAAmBA,EACxB/D,KAAKiE,sBAAwBA,EAC7BjE,KAAKmE,2BAA6BA,EAClCnE,KAAK0D,wBAA0BA,EAC/B1D,KAAK4D,wBAA0BA,EAC/B5D,KAAKqE,SAAWA,EAChBrE,KAAKsE,WAAaA,EA4FpB,QAASC,GAAcrB,GACrB,UAoBA,SAASsB,GAAWnB,EAAUlB,GAC5BsC,EAAUpB,GAAY,GAAIH,GAASG,EAAUlB,GAU/C,QAASuC,GAAgBC,GACvB,IAAKjF,QAAQkF,SAASD,GACpB,KAAM,IAAIlC,WAAU,4CAGtB/C,SAAQsB,QAAQ2D,EAAS,SAAUxC,EAAoBkB,GACrDmB,EAAWnB,EAAUlB,KAUzB,QAAS0C,GAAqBxB,SACrBoB,GAAUpB,GAUnB,QAASyB,GAAkBzB,GACzB,MAAO3D,SAAQ0E,UAAUK,EAAUpB,IASrC,QAAS0B,GAAkB1B,GACzB,MAAOoB,GAAUpB,GASnB,QAASgB,KACP,MAAOI,GAOT,QAASH,KACPG,KArFF,GAAIA,KAEJzE,MAAKwE,WAAaA,EAClBxE,KAAK0E,gBAAkBA,EACvB1E,KAAK+E,kBAAoBA,EACzB/E,KAAK8E,kBAAoBA,EACzB9E,KAAK6E,qBAAuBA,EAC5B7E,KAAKqE,SAAWA,EAChBrE,KAAKsE,WAAaA,EAwIpB,QAASU,GAAoBC,EAAMlD,EAAWmD,EAAmBC,GAC/D,UAEA,QACEC,SAAU,IACVC,kBACEC,KAAM,mBACNC,KAAM,mBACNC,OAAQ,qBACRC,aAAc,2BACdC,eAAgB,8BAElBC,aAAc,aACdC,YAAa,SAAU,WAAY,cAAe,SAAUC,EAAQC,EAAUlG,GA6C5E,QAASmG,KACP,MAAOhE,GAAUiE,IAAI,WAAarC,EAAW2B,KAO/C,QAASW,KACP,GAAIvG,QAAQgD,WAAWiB,EAAW8B,cAChC9B,EAAW8B,eAAeK,OACrB,CACL,GAAII,GAAyBtG,EAAYC,yBACzCsF,GAAyBe,GAAwBJ,IAQrD,QAASK,KACP,GAAIzG,QAAQgD,WAAWiB,EAAW+B,gBAChC/B,EAAW+B,iBAAiBI,OACvB,CACL,GAAIM,GAA2BxG,EAAYE,2BAC3CqF,GAAyBiB,GAA0BN,IAtEvD,GAAInC,GAAa3D,IAEjB6F,GAAOQ,aAAa,kBAAmB,oBAAqB,QAC1D,WACE,IACE,GAAIN,IAAsB,CACxB,GAAIO,GAAyBvE,EAAUwE,IAAI,yBAE3CD,GACGE,qBAAqB7C,EAAW2B,MAChClE,KAAK,WACJ6E,MAED3E,MAAM,WACL6E,UAEC,CACL,GAAIM,GAAoB1E,EAAUwE,IAAI,qBAClCG,EAAgB,GAAIxB,IACtBK,KAAM5B,EAAW4B,KACjBC,OAAQ7B,EAAW6B,QAGrBiB,GACGE,yBAAyBD,GACzBtF,KAAK,WACJ6E,MAED3E,MAAM,WACL6E,OAGN,MAAOS,GACPT,IACAlB,EAAK4B,MAAMD,EAAEE,eAsDzB,QAASL,GAAkBlG,GACzB,UAYA,SAASoG,GAAyBlD,GAChC,GAAI9C,GAAWJ,EAAGK,OAIlB,OAFAmG,GAA0BpG,EAAU8C,GAE7B9C,EAASM,QAYlB,QAAS8F,GAA0BpG,EAAU8C,GAC3C,GAAIuD,GAAiBvD,EAAIwD,wBAAwBxD,EAAI+B,OAErDjF,GAAGE,IAAIuG,GACJ5F,KAAK,SAAU8F,GACdvG,EAASa,OAAO0F,KAEjB5F,MAAM,WACL6F,EAAyBxG,EAAU8C,KAYzC,QAAS0D,GAAyBxG,EAAU8C,GAC1C,IAAKA,EAAI8B,KAAKjC,OAEZ,WADA3C,GAASU,SAIX,IAAI+F,GAAe3D,EAAIwD,wBAAwBxD,EAAI8B,KACnDhF,GAAGE,IAAI2G,GACJhG,KAAK,SAAUiG,GACd1G,EAASU,QAAQgG,KAElB/F,MAAM,SAAUgG,GACf3G,EAASa,OAAO8F,KA3DtBtH,KAAK2G,yBAA2BA,EAmFlC,QAASzB,GAAkB3E,EAAI0E,EAAMlD,EAAWnC,EAAaoC,EAA0BuC,EAAepB,GACpG,UAcA,SAASoE,GAAcb,GAErBA,EAAgBA,MAEhB1G,KAAKuF,KAAOiC,EAA+Bd,EAAcnB,MACzDvF,KAAKwF,OAASgC,EAA+Bd,EAAclB,QAC3DxF,KAAKyH,WAAaC,EAA4BhB,EAAce,YA8D9D,QAASE,GAAqBC,EAAkBC,GAC9C,MAAOtH,GACJY,KAAKY,EAAUkB,OAAO2E,EAAkB,MACvCN,mBAAoBO,EACpB9E,qBAAsBf,KAEvBZ,KAAK,SAAU0G,GACd,MAAIpI,SAAQ8C,SAASsF,IAEjBC,MAAOD,GAIPpI,QAAQkF,SAASkD,GACZA,EAGFvH,EAAGiB,WAahB,QAASgG,GAA+BQ,GACtC,MAAItI,SAAQ8C,SAASwF,IACXA,GAGNtI,QAAQqB,QAAQiH,GACXA,EAGLtI,QAAQgD,WAAWsF,GACdA,EAASC,KAAK,KAAMjG,MAgB/B,QAAS0F,GAA4BD,GACnC,GAAK/H,QAAQ0E,UAAUqD,GAAvB,CAIA,GAAIS,EAAaT,IAAe/H,QAAQgD,WAAW+E,GACjD,MAAOU,GAAiCV,EAG1C,IAAI/H,QAAQkF,SAAS6C,GACnB,MAAIW,GAA8BX,GACzBY,EAAqCZ,GAGvCa,EAAuCb,EAGhD,IAAI/H,QAAQ8C,SAASiF,GACnB,MAAOc,GAA+Bd,EAGxC,MAAM,IAAIe,gBAAe,oEAY3B,QAASD,GAA+Bd,GACtC,GAAIgB,KASJ,OAPAA,GAAeC,QAAU,WACvB,OACEX,MAAON,IAGXgB,EAAeC,QAAQ/F,SAAW,qBAAsB,wBAEjD8F,EAYT,QAASL,GAA8BX,GACrC,MAAO/H,SAAQ0E,UAAUqD,EAAWM,OAYtC,QAASM,GAAqCZ,GAC5C,GAAIgB,KAMJ,OAJAA,GAAeC,QAAU,WACvB,MAAOjB,IAGFgB,EAYT,QAASH,GAAuCb,GAC9C,GAAIgB,KA6BJ,OA3BA/I,SAAQsB,QAAQyG,EAAY,SAAUkB,EAAahF,GAC7CuE,EAAaS,GACfF,EAAe9E,GAAcgF,EAEzBjJ,QAAQgD,WAAWiG,KACrBF,EAAe9E,GAAcgF,EAC7BF,EAAe9E,GAAYhB,YAI3BjD,QAAQkF,SAAS+D,KACnBF,EAAe9E,GAAc,WAC3B,MAAOgF,IAETF,EAAe9E,GAAYhB,YAGzBjD,QAAQ8C,SAASmG,KACnBF,EAAe9E,GAAc,WAC3B,OACEoE,MAAOY,IAGXF,EAAe9E,GAAYhB,cAIxB8F,EAYT,QAASP,GAAaF,GACpB,MAAOtI,SAAQqB,QAAQiH,IAActI,QAAQgD,WAAWsF,IAAatI,QAAQqB,QAAQiH,EAASrF,SAYhG,QAASwF,GAAiCV,GACxC,GAAIgB,KAQJ,OANAA,GAAeC,QAAUjB,EAEpB/H,QAAQ0E,UAAUqD,EAAW9E,WAChC8F,EAAeC,QAAQ/F,SAAW,qBAAsB,yBAGnD8F,EAGT,MArQAlB,GAAc3E,UAAU+E,qBAAuB,SAAUE,GAGvD,IAAKnI,QAAQ0E,UAAUpE,KAAKyH,YAC1B,MAAOlH,GAAGiB,QAGZ,IAAIsG,GAAgB9H,KAAKyH,WAAWI,IAA2B7H,KAAKyH,WAAoB,OAExF,OAAOE,GAAqBG,EAAeD,IAW7CN,EAAc3E,UAAUqE,wBAA0B,SAAUe,GAE1D,MAAOA,GAASvE,IAAI,SAAUmF,GAC5B,GAAIrE,EAAcO,kBAAkB8D,GAAgB,CAClD,GAAIC,GAAOtE,EAAcQ,kBAAkB6D,EAC3C,OAAOC,GAAK/E,eAGd,GAAIX,EAAoBO,wBAAwBkF,GAAgB,CAC9D,GAAIjF,GAAaR,EAAoBS,wBAAwBgF,EAC7D,OAAOjF,GAAWd,qBAMpB,MAHKjD,GAAYG,oCACfkF,EAAK6D,KAAK,sBAAwBF,EAAgB,qBAE7CrI,EAAGiB,OAAOoH,MAiOdrB,EA9rCThH,EAAGoC,SAAW,aACdb,EAAea,SAAW,KAAM,YAAa,4BAC7CO,EAASP,SAAW,KAAM,YAAa,sBAAuB,4BAC9DQ,EAAoBR,SAAW,kBAC/B4B,EAAc5B,SAAW,YACzBqC,EAAoBrC,SAAW,OAAQ,YAAa,oBAAqB,4BACzE8D,EAAkB9D,SAAW,MAC7BuC,EAAkBvC,SAAW,KAAM,OAAQ,YAAa,cAAe,2BAA4B,gBAAiB,sBACpH,IAAIgB,GAAajE,QAAQqJ,OAAO,gBAGV,oBAAXA,SAA6C,mBAAZC,UAA2BD,OAAOC,UAAYA,UACxFD,OAAOC,QAAUrF,EAAWsF,MAwD9BvJ,QACGqJ,OAAO,cACPG,SAAS,cAAetJ,GAwD3BF,QACGqJ,OAAO,cACPI,UAAU,KAAM5I,EAoBnB,IAAI4E,IACFiE,cAAe,SAAUtD,GACvBA,EAASuD,WAAW,aAEtBC,eAAgB,SAAUxD,GACxBA,EAASyD,KAAK,WAAY,aAE5BC,YAAa,SAAU1D,GACrBA,EAAS2D,YAAY,YAEvBC,YAAa,SAAU5D,GACrBA,EAAS6D,SAAS,YAItBjK,SACGqJ,OAAO,cACP1I,MAAM,2BAA4B8E,GAClC9E,MAAM,uBAAwB8E,EAoBjC,IAAInD,KAEJtC,SACGqJ,OAAO,cACP1I,MAAM,2BAA4B2B,GAsBrCtC,QACGqJ,OAAO,cACPa,QAAQ,uBAAwBnI,GA8GnC/B,QACGqJ,OAAO,cACPc,QAAQ,iBAAkB/H,GA8I7BpC,QACGqJ,OAAO,cACPc,QAAQ,WAAY3G,GAyGvBxD,QACGqJ,OAAO,cACPa,QAAQ,sBAAuBzG,GAqGlCzD,QACGqJ,OAAO,cACPa,QAAQ,gBAAiBrF,GAgJ5B7E,QACGqJ,OAAO,cACPe,UAAU,aAAc9E,GA4E3BtF,QACGqJ,OAAO,cACPa,QAAQ,oBAAqBnD,GAyThC/G,QACGqJ,OAAO,cACPc,QAAQ,oBAAqB3E,IAEhCzF,OAAQA,OAAOC","file":"angular-permission.min.js"} \ No newline at end of file +{"version":3,"sources":["angular-permission.js"],"names":["window","angular","undefined","$permission","defaultOnAuthorizedMethod","defaultOnUnauthorizedMethod","suppressUndefinedPermissionWarning","this","setDefaultOnAuthorizedMethod","onAuthorizedMethod","setDefaultOnUnauthorizedMethod","onUnauthorizedMethod","value","$get","$q","$delegate","any","promises","deferred","defer","counter","results","isArray","forEach","promise","key","when","then","resolve","reason","reject","PermTransitionEvents","broadcastPermissionStartEvent","Error","broadcastPermissionAcceptedEvent","broadcastPermissionDeniedEvent","PermPermission","$injector","PermTransitionProperties","Permission","permissionName","validationFunction","validateConstructor","annotateValidationFunction","wrapInPromise","result","isString","TypeError","isFunction","$inject","prototype","validatePermission","transitionProperties","validationLocals","validationResult","invoke","PermRole","PermPermissionStore","Role","roleName","length","preparePermissionEvaluation","permissions","options","map","hasPermissionDefinition","permission","getPermissionDefinition","all","validateRole","definePermission","permissionStore","defineManyPermissions","permissionNames","removePermissionDefinition","isDefined","getStore","clearStore","PermRoleStore","defineRole","roleStore","defineManyRoles","roleMap","isObject","removeRoleDefinition","hasRoleDefinition","getRoleDefinition","PermissionDirective","$log","PermPermissionMap","PermPermissionStrategies","restrict","bindToController","sref","only","except","onAuthorized","onUnauthorized","controllerAs","controller","$scope","$element","isSrefStateDefined","has","onAuthorizedAccess","onAuthorizedMethodName","onUnauthorizedAccess","onUnauthorizedMethodName","$watchGroup","PermStateAuthorization","get","authorizeByStateName","$eval","PermAuthorization","permissionMap","authorizeByPermissionMap","e","error","message","resolveExceptPrivilegeMap","exceptPromises","resolvePropertyValidity","rejectedPermissions","resolveOnlyPermissionMap","onlyPromises","resolvedPermissions","rejectedPermission","PermissionMap","normalizeOnlyAndExceptProperty","redirectTo","normalizeRedirectToProperty","resolveRedirectState","redirectFunction","rejectedPermissionName","redirectState","state","property","call","isInjectable","normalizeFunctionRedirectionRule","isObjectSingleRedirectionRule","normalizeObjectSingleRedirectionRule","normalizeObjectMultipleRedirectionRule","normalizeStringRedirectionRule","ReferenceError","redirectionMap","redirection","privilegeName","role","warn","module","exports","name","provider","decorator","enableElement","removeAttr","disableElement","attr","showElement","removeClass","hideElement","addClass","service","factory","directive"],"mappings":"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","file":"angular-permission.min.js"} \ No newline at end of file diff --git a/index.js b/index.js index ba56afd..6fb070b 100644 --- a/index.js +++ b/index.js @@ -1,12 +1,12 @@ -/** - * angular-permission - * Fully featured role and permission based access control for your angular applications - * @version v5.3.2 - 2017-05-29 - * @link https://github.com/Narzerus/angular-permission - * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak - * @license MIT License, http://www.opensource.org/licenses/MIT - */ - +/** + * angular-permission + * Fully featured role and permission based access control for your angular applications + * @version v5.3.2 - 2018-02-27 + * @link https://github.com/Narzerus/angular-permission + * @author Rafael Vidaurre (http://www.rafaelvidaurre.com), Blazej Krysiak + * @license MIT License, http://www.opensource.org/licenses/MIT + */ + (function () { 'use strict'; diff --git a/src/permission-ui/authorization/StateAuthorization.js b/src/permission-ui/authorization/StateAuthorization.js index 248dd36..1f56393 100644 --- a/src/permission-ui/authorization/StateAuthorization.js +++ b/src/permission-ui/authorization/StateAuthorization.js @@ -23,8 +23,8 @@ function PermStateAuthorization($q, $state, PermStatePermissionMap) { * * @return {promise} */ - function authorizeByPermissionMap(statePermissionMap) { - return authorizeStatePermissionMap(statePermissionMap); + function authorizeByPermissionMap(statePermissionMap,options) { + return authorizeStatePermissionMap(statePermissionMap,options); } /** @@ -34,11 +34,11 @@ function PermStateAuthorization($q, $state, PermStatePermissionMap) { * @param stateName {String} * @returns {promise} */ - function authorizeByStateName(stateName) { + function authorizeByStateName(stateName,options) { var srefState = $state.get(stateName); - var permissionMap = new PermStatePermissionMap(srefState); + var permissionMap = new PermStatePermissionMap(srefState,options); - return authorizeByPermissionMap(permissionMap); + return authorizeByPermissionMap(permissionMap,options); } /** @@ -50,10 +50,10 @@ function PermStateAuthorization($q, $state, PermStatePermissionMap) { * * @returns {promise} $q.promise object */ - function authorizeStatePermissionMap(map) { + function authorizeStatePermissionMap(map,options) { var deferred = $q.defer(); - resolveExceptStatePermissionMap(deferred, map); + resolveExceptStatePermissionMap(deferred, map,options); return deferred.promise; } @@ -66,13 +66,13 @@ function PermStateAuthorization($q, $state, PermStatePermissionMap) { * @param deferred {Object} Promise defer * @param map {permission.ui.StatePermissionMap} State access rights map */ - function resolveExceptStatePermissionMap(deferred, map) { - var exceptPromises = resolveStatePermissionMap(map.except, map); + function resolveExceptStatePermissionMap(deferred, map,options) { + var exceptPromises = resolveStatePermissionMap(map.except, map,options); // Reverse the promises, so if any "except" privileges are not met, the promise rejects $q.all(reversePromises(exceptPromises)) .then(function () { - resolveOnlyStatePermissionMap(deferred, map); + resolveOnlyStatePermissionMap(deferred, map,options); }) .catch(function (rejectedPermissions) { @@ -92,13 +92,13 @@ function PermStateAuthorization($q, $state, PermStatePermissionMap) { * @param deferred {Object} Promise defer * @param map {permission.ui.StatePermissionMap} State access rights map */ - function resolveOnlyStatePermissionMap(deferred, map) { + function resolveOnlyStatePermissionMap(deferred, map,options) { if (!map.only.length) { deferred.resolve(); return; } - var onlyPromises = resolveStatePermissionMap(map.only, map); + var onlyPromises = resolveStatePermissionMap(map.only, map,options); $q.all(onlyPromises) .then(function (resolvedPermissions) { @@ -119,13 +119,13 @@ function PermStateAuthorization($q, $state, PermStatePermissionMap) { * * @returns {Array} Promise collection */ - function resolveStatePermissionMap(privilegesNames, map) { + function resolveStatePermissionMap(privilegesNames, map,options) { if (!privilegesNames.length) { return [$q.reject()]; } return privilegesNames.map(function (statePrivileges) { - var resolvedStatePrivileges = map.resolvePropertyValidity(statePrivileges); + var resolvedStatePrivileges = map.resolvePropertyValidity(statePrivileges,options); return $q.any(resolvedStatePrivileges) .then(function (resolvedPermissions) { if (angular.isArray(resolvedPermissions)) { diff --git a/src/permission/authorization/Authorization.js b/src/permission/authorization/Authorization.js index 5647b00..5af198b 100644 --- a/src/permission/authorization/Authorization.js +++ b/src/permission/authorization/Authorization.js @@ -19,10 +19,10 @@ function PermAuthorization($q) { * * @returns {promise} $q.promise object */ - function authorizeByPermissionMap(map) { + function authorizeByPermissionMap(map,options) { var deferred = $q.defer(); - resolveExceptPrivilegeMap(deferred, map); + resolveExceptPrivilegeMap(deferred, map,options); return deferred.promise; } @@ -36,15 +36,15 @@ function PermAuthorization($q) { * @param map {permission.PermissionMap} Access rights map * */ - function resolveExceptPrivilegeMap(deferred, map) { - var exceptPromises = map.resolvePropertyValidity(map.except); + function resolveExceptPrivilegeMap(deferred, map,options) { + var exceptPromises = map.resolvePropertyValidity(map.except,options); $q.any(exceptPromises) .then(function (rejectedPermissions) { deferred.reject(rejectedPermissions); }) .catch(function () { - resolveOnlyPermissionMap(deferred, map); + resolveOnlyPermissionMap(deferred, map,options); }); } @@ -56,13 +56,13 @@ function PermAuthorization($q) { * @param deferred {Object} Promise defer * @param map {permission.PermissionMap} Access rights map */ - function resolveOnlyPermissionMap(deferred, map) { + function resolveOnlyPermissionMap(deferred, map,options) { if (!map.only.length) { deferred.resolve(); return; } - var onlyPromises = map.resolvePropertyValidity(map.only); + var onlyPromises = map.resolvePropertyValidity(map.only,options); $q.any(onlyPromises) .then(function (resolvedPermissions) { deferred.resolve(resolvedPermissions); diff --git a/src/permission/authorization/PermissionMap.js b/src/permission/authorization/PermissionMap.js index 830afb9..4163e63 100644 --- a/src/permission/authorization/PermissionMap.js +++ b/src/permission/authorization/PermissionMap.js @@ -66,17 +66,17 @@ function PermPermissionMap($q, $log, $injector, $permission, PermTransitionPrope * * @return {Array} */ - PermissionMap.prototype.resolvePropertyValidity = function (property) { + PermissionMap.prototype.resolvePropertyValidity = function (property,options) { return property.map(function (privilegeName) { if (PermRoleStore.hasRoleDefinition(privilegeName)) { var role = PermRoleStore.getRoleDefinition(privilegeName); - return role.validateRole(); + return role.validateRole(options); } if (PermPermissionStore.hasPermissionDefinition(privilegeName)) { var permission = PermPermissionStore.getPermissionDefinition(privilegeName); - return permission.validatePermission(); + return permission.validatePermission(options); } if (!$permission.suppressUndefinedPermissionWarning) { diff --git a/src/permission/directives/permission.js b/src/permission/directives/permission.js index facb38e..228f1d1 100644 --- a/src/permission/directives/permission.js +++ b/src/permission/directives/permission.js @@ -58,6 +58,7 @@ function PermissionDirective($log, $injector, PermPermissionMap, PermPermissionS restrict: 'A', bindToController: { sref: '=?permissionSref', + options: '=?permissionOptions', only: '=?permissionOnly', except: '=?permissionExcept', onAuthorized: '&?permissionOnAuthorized', @@ -67,32 +68,30 @@ function PermissionDirective($log, $injector, PermPermissionMap, PermPermissionS controller: function ($scope, $element, $permission) { var permission = this; - $scope.$watchGroup(['permission.only', 'permission.except', 'sref'], + $scope.$watchGroup(['permission.only', 'permission.except', 'sref','permissionOptions'], function () { try { if (isSrefStateDefined()) { var PermStateAuthorization = $injector.get('PermStateAuthorization'); - - PermStateAuthorization - .authorizeByStateName(permission.sref) - .then(function () { - onAuthorizedAccess(); - }) - .catch(function () { - onUnauthorizedAccess(); - }); + PermStateAuthorization.authorizeByStateName(permission.sref, $scope.$eval(permission.options)) + .then(function () { + onAuthorizedAccess(); + }) + .catch(function () { + onUnauthorizedAccess(); + }); } else { var PermAuthorization = $injector.get('PermAuthorization'); var permissionMap = new PermPermissionMap({only: permission.only, except: permission.except}); PermAuthorization - .authorizeByPermissionMap(permissionMap) - .then(function () { - onAuthorizedAccess(); - }) - .catch(function () { - onUnauthorizedAccess(); - }); + .authorizeByPermissionMap(permissionMap,$scope.$eval(permission.options)) + .then(function () { + onAuthorizedAccess(); + }) + .catch(function () { + onUnauthorizedAccess(); + }); } } catch (e) { onUnauthorizedAccess(); diff --git a/src/permission/models/Permission.js b/src/permission/models/Permission.js index 975f906..89ea1f9 100644 --- a/src/permission/models/Permission.js +++ b/src/permission/models/Permission.js @@ -33,10 +33,10 @@ function PermPermission($q, $injector, PermTransitionProperties) { * * @returns {Promise} */ - Permission.prototype.validatePermission = function () { + Permission.prototype.validatePermission = function (transitionProperties) { var validationLocals = { permissionName: this.permissionName, - transitionProperties: PermTransitionProperties + transitionProperties: transitionProperties||PermTransitionProperties }; var validationResult = $injector.invoke(this.validationFunction, null, validationLocals); diff --git a/src/permission/models/Role.js b/src/permission/models/Role.js index 462ee20..2486c2d 100644 --- a/src/permission/models/Role.js +++ b/src/permission/models/Role.js @@ -35,10 +35,10 @@ function PermRole($q, $injector, PermPermissionStore, PermTransitionProperties) * * @returns {Promise} $q.promise object */ - Role.prototype.validateRole = function () { + Role.prototype.validateRole = function (transitionProperties) { var validationLocals = { roleName: this.roleName, - transitionProperties: PermTransitionProperties + transitionProperties: transitionProperties||PermTransitionProperties }; var validationResult = $injector.invoke(this.validationFunction, null, validationLocals); @@ -121,13 +121,13 @@ function PermRole($q, $injector, PermPermissionStore, PermTransitionProperties) * * @return {Function} */ - function preparePermissionEvaluation(permissions) { + function preparePermissionEvaluation(permissions,options) { return function () { var promises = permissions.map(function (permissionName) { if (PermPermissionStore.hasPermissionDefinition(permissionName)) { var permission = PermPermissionStore.getPermissionDefinition(permissionName); - return permission.validatePermission(); + return permission.validatePermission(options); } return $q.reject(permissionName); diff --git a/test/unit/permission/directives/permissionDirective.test.js b/test/unit/permission/directives/permissionDirective.test.js index 689978e..df80574 100644 --- a/test/unit/permission/directives/permissionDirective.test.js +++ b/test/unit/permission/directives/permissionDirective.test.js @@ -49,6 +49,7 @@ describe('permission', function () { PermRoleStore.defineRole('ADMIN', function () { return false; }); + }); it('should show element if authorized when permissions are passed as string array', function () { @@ -179,7 +180,7 @@ describe('permission', function () { only: undefined, except: ['USER'], redirectTo: undefined - })); + }),undefined); }); it('should resolve multiple authorization calls properly', function () { @@ -203,19 +204,19 @@ describe('permission', function () { only: ['USER'], except: undefined, redirectTo: undefined - })); + }),undefined); expect(PermAuthorization.authorizeByPermissionMap).toHaveBeenCalledWith(new PermPermissionMap({ only: ['ADMIN'], except: undefined, redirectTo: undefined - })); + }),undefined); expect(PermAuthorization.authorizeByPermissionMap).toHaveBeenCalledWith(new PermPermissionMap({ only: ['AUTHORIZED'], except: undefined, redirectTo: undefined - })); + }),undefined); expect(angular.element(element[0]).hasClass('ng-hide')).toBeTruthy(); expect(angular.element(element[1]).hasClass('ng-hide')).toBeFalsy();