angular-resource-url-type-factory
Version:
A factory used to build ui-router URL types that fetch data from RESTful APIs.
1 lines • 2.66 kB
JavaScript
!function(root,factory){var i,resolved=[],required=["require","exports","module","angular"],len=required.length;if("function"==typeof define&&define.amd)define("ngresourceurltypefactory",["require","exports","module","angular"],factory);else if("object"==typeof exports){for(i=0;i<len;i+=1)resolved.push(require(required[i]));module.exports=factory.apply({},resolved)}else{for(i=0;i<len;i+=1)resolved.push(root[required[i]]);root.ngresourceurltypefactory=factory.apply({},resolved)}}(this,function(require,exports,module,angular){return function(){"use strict";angular.module("ngResourceUrlTypeFactory",["ui.router"])}(),function(){"use strict";var module=angular.module("ngResourceUrlTypeFactory");module.provider("ResourceUrlTypeFactoryService",["$urlMatcherFactoryProvider",function($urlMatcherFactoryProvider){"ngInject";var provider=this,typeNames=[];provider.registerType=function(typeName,pattern,pkAttr,fetchFn){$urlMatcherFactoryProvider.type(typeName,{pattern:pattern},["$injector",function($injector){return{encode:function(obj){return String(obj[pkAttr])},decode:function(pk){var promise=$injector.invoke(fetchFn,null,{$pk:pk});return promise[pkAttr]=pk,promise},equals:function(objA,objB){return objA&&objB?String(objA[pkAttr]).toUpperCase()===String(objB[pkAttr]).toUpperCase():!objA&&!objB},is:function(obj){return angular.isObject(obj)}}}]),typeNames.push(typeName)},provider.$get=["$q","$transitions",function($q,$transitions){var self=this,getPromise=function(obj){return obj&&"function"==typeof obj.then?obj:obj&&obj.$promise&&"function"==typeof obj.$promise.then?obj.$promise:$q.resolve(obj)};return self.getTypeNames=function(){return angular.copy(typeNames)},self.getParams=function(paramDefinitions){var paramNames=[];for(var paramName in paramDefinitions)if(paramDefinitions.hasOwnProperty(paramName)){var param=paramDefinitions[paramName],paramType=param.type,paramTypeName=paramType.name;-1!==typeNames.indexOf(paramTypeName)&¶mNames.push(paramName)}return paramNames},self.registerTransition=function(){$transitions.onStart({to:function(state){return 0!==self.getParams(state.params).length}},function(trans){for(var targetState=trans._targetState,paramDefinitions=targetState._definition.params,paramNames=self.getParams(paramDefinitions),promises=[],i=0;i<paramNames.length;i++){var paramName=paramNames[i],param=targetState._params[paramName],promise=getPromise(param);promises.push(promise)}return $q.all(promises)})},self}]}]),module.run(["ResourceUrlTypeFactoryService",function(ResourceUrlTypeFactoryService){"ngInject";ResourceUrlTypeFactoryService.registerTransition()}])}(),angular.module("ngResourceUrlTypeFactory")});