angular-resource-factory
Advanced tools
Comparing version 0.8.0 to 0.8.1
@@ -1,1 +0,1 @@ | ||
!function(root,factory){var i,resolved=[],required=["require","exports","module","angular"],len=required.length;if("function"==typeof define&&define.amd)define("ngresourcefactory",["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.ngresourcefactory=factory.apply({},resolved)}}(this,function(require,exports,module,angular){return function(){"use strict";angular.module("ngResourceFactory",["ngResource"])}(),function(){"use strict";angular.module("ngResourceFactory").factory("ResourceFactoryService",["$q","$resource","ResourceCacheService","ResourcePhantomIdNegativeInt",function($q,$resource,ResourceCacheService,ResourcePhantomIdNegativeInt){"ngInject";function ResourceStore(resource,managedInstances,parentStore){function addResourceInstance(instances,instance){var matchingInstances=resource.filterInstancesByAttr(instances,resource.getPkAttr(),instance[resource.getPkAttr()]);if(matchingInstances.length)for(var i=0;i<matchingInstances.length;i++){var matchingInstanceIndex=instances.indexOf(matchingInstances[i]),matchingInstanceFound=matchingInstanceIndex!==-1;matchingInstanceFound&&instances.splice(matchingInstanceIndex,1,instance)}else instances.push(instance)}function removeResourceInstance(instances,instance){var matchingInstances=resource.filterInstancesByAttr(instances,resource.getPkAttr(),instance[resource.getPkAttr()]);if(matchingInstances.length)for(var i=0;i<matchingInstances.length;i++){var matchingInstanceIndex=instances.indexOf(matchingInstances[i]),matchingInstanceFound=matchingInstanceIndex!==-1;matchingInstanceFound&&instances.splice(matchingInstanceIndex,1)}}function isPromiseLike(obj){return obj&&angular.isFunction(obj.then)}function baseExtend(dst,objs,deep){for(var i=0,ii=objs.length;i<ii;++i){var obj=objs[i],isMoment=moment?moment.isMoment:function(){return!1};if(angular.isObject(obj)||angular.isFunction(obj))for(var keys=Object.keys(obj),j=0,jj=keys.length;j<jj;j++){var key=keys[j],src=obj[key];"$"!==key[0]&&(deep&&angular.isObject(src)?angular.isDate(src)?dst[key]=new Date(src.valueOf()):isMoment(src)?dst[key]=moment(src):"[object RegExp]"===toString.call(src)?dst[key]=new RegExp(src):src instanceof ResourceStore||(src.nodeName?dst[key]=src.cloneNode(!0):angular.isElement(src)?dst[key]=src.clone():(angular.isObject(dst[key])||(dst[key]=angular.isArray(src)?[]:{}),baseExtend(dst[key],[src],!0))):dst[key]=src)}}return dst}function merge(dst,src){return baseExtend(dst,[src],!0)}function copy(src,dst){if(angular.isArray(src)){dst||(dst=[]),dst.length=0;for(var i=0;i<src.length;i++)dst.push(copy(src[i]))}else{if(angular.isObject(src)){var filterPrivate=function(key){return"$"===String(key)[0]&&"$$hashKey"!==key},keys=Object.keys(src),privateKeys=keys.filter(filterPrivate);dst=angular.copy(src);for(var j=0;j<privateKeys.length;j++)delete dst[privateKeys[j]];return dst}dst=angular.copy(src)}return dst}var self=this,executionRunning=(resource.getResourceName(),!1),relations=[],visibleQueue=[],persistQueue=[],removeQueue=[],beforePersistListeners=[],afterPersistListeners=[],beforeRemoveListeners=[],afterRemoveListeners=[];self.manage=function(newInstances){var doManage=function(newInstances){angular.isArray(newInstances)||(newInstances=[newInstances]);for(var i=0;i<newInstances.length;i++){var newInstance=newInstances[i];newInstance.$store?newInstance.$store:(newInstance.$store=self,addResourceInstance(managedInstances,newInstance),addResourceInstance(visibleQueue,newInstance))}};if(isPromiseLike(newInstances)||isPromiseLike(newInstances.$promise)){var promise=isPromiseLike(newInstances)?newInstances:newInstances.$promise,defer=$q.defer();return promise.then(doManage).then(function(){defer.resolve(newInstances)}),defer.promise}return doManage(newInstances),$q.resolve(newInstances)},self.forget=function(oldInstances){var doForget=function(oldInstances){angular.isArray(oldInstances)||(oldInstances=[oldInstances]);for(var i=0;i<oldInstances.length;i++){var oldInstance=oldInstances[i];oldInstance.$store===self?(delete oldInstance.$store,removeResourceInstance(managedInstances,oldInstance),removeResourceInstance(visibleQueue,oldInstance),removeResourceInstance(persistQueue,oldInstance),removeResourceInstance(removeQueue,oldInstance)):oldInstance.$store}};if(isPromiseLike(oldInstances)||isPromiseLike(oldInstances.$promise)){var promise=isPromiseLike(oldInstances)?oldInstances:oldInstances.$promise,defer=$q.defer();return promise.then(doForget).then(function(){defer.resolve(oldInstances)}),defer.promise}return doForget(oldInstances),$q.resolve(oldInstances)},self.new=function(params){var newInstance=resource.new(params);return self.manage(newInstance),newInstance},self.persist=function(instances){angular.isArray(instances)||(instances=[instances]);for(var i=0;i<instances.length;i++){var instance=instances[i];instance.$store===self&&(addResourceInstance(persistQueue,instance),addResourceInstance(visibleQueue,instance),removeResourceInstance(removeQueue,instance))}},self.remove=function(instances){angular.isArray(instances)||(instances=[instances]);for(var i=0;i<instances.length;i++){var instance=instances[i];instance.$store===self&&(removeResourceInstance(persistQueue,instance),removeResourceInstance(visibleQueue,instance),addResourceInstance(removeQueue,instance))}},self.commit=function(){if(parentStore){for(var i=0;i<persistQueue.length;i++){var childPersistInstance=copy(persistQueue[i]),parentPersistInstance=parentStore.getByInstance(childPersistInstance);delete childPersistInstance.$store,parentPersistInstance?(merge(parentPersistInstance,childPersistInstance),parentPersistInstance.$store=parentStore):(parentPersistInstance=copy(childPersistInstance),parentStore.manage(parentPersistInstance)),parentStore.persist(parentPersistInstance)}for(var j=0;j<removeQueue.length;j++){var childRemoveInstance=copy(removeQueue[i]),parentRemoveInstance=parentStore.getByInstance(childRemoveInstance);delete childRemoveInstance.$store,parentRemoveInstance?(merge(parentRemoveInstance,childRemoveInstance),parentRemoveInstance.$store=parentStore):(parentRemoveInstance=copy(childRemoveInstance),parentStore.manage(parentRemoveInstance)),parentStore.remove(parentRemoveInstance)}}},self.executeAll=function(clearAfter){clearAfter=angular.isUndefined(clearAfter)||!!clearAfter;var defer=$q.defer(),executeRelated=function(){for(var promises=[],i=0;i<relations.length;i++){var relation=relations[i],relatedStore=relation.getRelatedStore();promises.push(relatedStore.executeAll(clearAfter))}return $q.all(promises)};return self.execute(clearAfter).then(executeRelated).then(defer.resolve).catch(defer.reject),defer.promise},self.execute=function(clearAfter){if(clearAfter=angular.isUndefined(clearAfter)||!!clearAfter,executionRunning)return $q.reject("Another execution is already running.");if(parentStore)throw"Executing the store is only possible on the topmost store";executionRunning=!0;var defer=$q.defer(),handleError=function(reason){executionRunning=!1,defer.reject(reason)},callListeners=function(item,listeners){for(var i=0;i<listeners.length;i++)listeners[i](item)},relationsRemove=function(pkValue){for(var i=0;i<relations.length;i++)relations[i].handleRemove(pkValue)},relationsUpdate=function(oldPkValue,newPkValue){for(var i=0;i<relations.length;i++)relations[i].handleUpdate(oldPkValue,newPkValue)},executeSingle=function(item,execFn,beforeListeners,afterListeners,defer,isRemove){callListeners(item,beforeListeners),execFn({},item).$promise.then(function(response){if(isRemove&&item&&relationsRemove(item[resource.getPkAttr()]),response.data&&response.data[resource.getPkAttr()]){var oldPkValue=item?item[resource.getPkAttr()]:null,newPkValue=response.data?response.data[resource.getPkAttr()]:null;isRemove||relationsUpdate(oldPkValue,newPkValue),item[resource.getPkAttr()]=newPkValue}callListeners(item,afterListeners),defer.resolve(item)}).catch(defer.reject)},executeRemoves=function(){for(var promises=[],queue=self.getRemoveQueue(),i=0;i<queue.length;i++){var item=queue[i];if(!item.$isPhantom()){var defer=$q.defer();promises.push(defer.promise),executeSingle(item,resource.remove,beforeRemoveListeners,afterRemoveListeners,defer,!0)}}return $q.all(promises)},executeUpdates=function(){for(var promises=[],queue=self.getUpdateQueue(),i=0;i<queue.length;i++){var item=queue[i],defer=$q.defer();promises.push(defer.promise),executeSingle(item,resource.update,beforePersistListeners,afterPersistListeners,defer,!1)}return $q.all(promises)},executeSaves=function(){for(var promises=[],queue=self.getSaveQueue(),i=0;i<queue.length;i++){var item=queue[i],defer=$q.defer();promises.push(defer.promise),executeSingle(item,resource.save,beforePersistListeners,afterPersistListeners,defer,!1)}return $q.all(promises)},clear=function(){clearAfter&&(persistQueue.length=0,removeQueue.length=0),executionRunning=!1};return $q.when().then(executeRemoves).then(executeUpdates).then(executeSaves).then(clear).then(defer.resolve).catch(handleError),defer.promise},self.createChildStore=function(instances){instances=instances||managedInstances;for(var childStoreManagedInstances=copy(instances),i=0;i<childStoreManagedInstances.length;i++)delete childStoreManagedInstances[i].$store;return new ResourceStore(resource,childStoreManagedInstances,self)},self.createRelation=function(config){config=angular.extend({relatedStore:null,fkAttr:null,onDelete:"forget",onUpdate:"update"},config);var relation=new ResourceStoreRelation(self,config.relatedStore,config.fkAttr,config.onUpdate,config.onDelete);return relations.push(relation),relation},self.removeRelation=function(relation){var relationIndex=relations.indexOf(relation);relationIndex!==-1&&relations.splice(relationIndex,1)},self.getByPk=function(pkValue){return resource.getInstanceByPk(managedInstances,pkValue)},self.getByInstance=function(instance){var pkValue=instance?instance[resource.getPkAttr()]:void 0;return self.getByPk(pkValue)},self.getManagedInstances=function(){return managedInstances.slice()},self.getVisibleQueue=function(){return visibleQueue.slice()},self.getPersistQueue=function(){return persistQueue.slice()},self.getRemoveQueue=function(){return removeQueue.slice()},self.getSaveQueue=function(){var filterPhantom=function(instance){return instance.$isPhantom()};return persistQueue.filter(filterPhantom)},self.getUpdateQueue=function(){var filterNonPhantom=function(instance){return!instance.$isPhantom()};return persistQueue.filter(filterNonPhantom)},self.getResource=function(){return resource},self.addBeforePersistListener=function(fn){beforePersistListeners.push(fn)},self.removeBeforePersistListener=function(fn){var fnIndex=beforePersistListeners.indexOf(fn);fnIndex!==-1&&beforePersistListeners.splice(fnIndex,1)},self.addAfterPersistListener=function(fn){afterPersistListeners.push(fn)},self.removeAfterPersistListener=function(fn){var fnIndex=afterPersistListeners.indexOf(fn);fnIndex!==-1&&afterPersistListeners.splice(fnIndex,1)},self.removeBeforeRemoveListener=function(fn){var fnIndex=beforeRemoveListeners.indexOf(fn);fnIndex!==-1&&beforeRemoveListeners.splice(fnIndex,1)},self.addAfterRemoveListener=function(fn){afterRemoveListeners.push(fn)},self.removeAfterRemoveListener=function(fn){var fnIndex=afterRemoveListeners.indexOf(fn);fnIndex!==-1&&afterRemoveListeners.splice(fnIndex,1)},function(){managedInstances=managedInstances||[],parentStore=parentStore||null;var managed=self.manage(managedInstances),mapPk=function(instance){return instance?String(instance[resource.getPkAttr()]):void 0},filterPks=function(pks){return function(instance){return!!instance&&pks.indexOf(String(instance[resource.getPkAttr()]))!==-1}};parentStore&&managed.then(function(){var parentVisibleQueuePks=parentStore.getVisibleQueue().map(mapPk),parentPersistQueuePks=parentStore.getPersistQueue().map(mapPk),parentRemoveQueuePks=parentStore.getRemoveQueue().map(mapPk);visibleQueue=managedInstances.filter(filterPks(parentVisibleQueuePks)),persistQueue=managedInstances.filter(filterPks(parentPersistQueuePks)),removeQueue=managedInstances.filter(filterPks(parentRemoveQueuePks))})}()}function ResourceStoreRelation(store,relatedStore,fkAttr,onUpdate,onRemove){var self=this;switch(onUpdate){case"update":onUpdate=function(referencingStore,referencingInstance,oldReferencedInstancePk,newReferencedInstancePk,fkAttr){referencingInstance[fkAttr]=newReferencedInstancePk};break;case"null":onUpdate=function(referencingStore,referencingInstance,oldReferencedInstancePk,newReferencedInstancePk,fkAttr){referencingInstance[fkAttr]=null}}switch(onRemove){case"forget":onRemove=function(referencingStore,referencingInstance,oldReferencedInstancePk,fkAttr){referencingStore.forget(referencingInstance)};break;case"null":onRemove=function(referencingStore,referencingInstance,oldReferencedInstancePk,fkAttr){referencingInstance[fkAttr]=null}}self.getStore=function(){return store},self.getRelatedStore=function(){return relatedStore},self.getFkAttr=function(){return fkAttr},self.handleUpdate=function(oldPkValue,newPkValue){for(var referencingInstances=relatedStore.getManagedInstances(),i=0;i<referencingInstances.length;i++){var referencingInstance=referencingInstances[i];referencingInstance&&referencingInstance[fkAttr]==oldPkValue&&oldPkValue!=newPkValue&&onUpdate(relatedStore,referencingInstance,oldPkValue,newPkValue,fkAttr)}},self.handleRemove=function(pkValue){for(var referencingInstances=relatedStore.getManagedInstances(),i=0;i<referencingInstances.length;i++){var referencingInstance=referencingInstances[i];referencingInstance&&referencingInstance[fkAttr]==pkValue&&onRemove(relatedStore,referencingInstance,pkValue,fkAttr)}}}return function(name,url,options){options=angular.extend({stripTrailingSlashes:!1,ignoreLoadingBar:!1,generatePhantomIds:!0,phantomIdGenerator:ResourcePhantomIdNegativeInt,dependent:[],extraMethods:{},extraFunctions:{},pkAttr:"pk",urlAttr:"url",queryDataAttr:null,queryTotalAttr:null,queryFilter:{},toInternal:function(obj,headersGetter,status){return obj},fromInternal:function(obj,headersGetter){return obj}},options||{});var resource,paramsDefaults={},saveParams={},cache=new ResourceCacheService(name,options.pkAttr,{dataAttr:options.queryDataAttr,pkAttr:options.pkAttr,urlAttr:options.urlAttr,dependent:options.dependent,ttl:900}),insertingInterceptor={response:function(response){var data=response.data;return cache.removeAllLists(),cache.removeAllDependent(),cache.insert(data[options.urlAttr],data,!1),response}},modifyingInterceptor={response:function(response){var data=response.data,url=data[options.urlAttr];return cache.removeAllLists(),cache.removeAllDependent(),cache.insert(url,data,!1),response}},deletingInterceptor={response:function(response){return cache.removeAllLists(),cache.removeAllDependent(),cache.remove(response.config.url),response}},transformResponseFromJson=function(responseText,headersGetter,status){return responseText?angular.fromJson(responseText):null},queryTransformResponseToInternal=function(responseData,headersGetter,status){if(angular.isArray(responseData))for(var i=0;i<responseData.length;i++)responseData[i]=options.toInternal(responseData[i],headersGetter,status);else responseData=options.toInternal(responseData,headersGetter,status);return responseData},singleTransformResponseToInternal=function(responseData,headersGetter,status){return options.toInternal(responseData,headersGetter,status)},queryTransformResponseData=function(responseData,headersGetter,status){var result=null;return status>=200&&status<300?(options.queryDataAttr&&responseData&&responseData[options.queryDataAttr]&&(result=responseData[options.queryDataAttr]),options.queryTotalAttr&&responseData&&responseData[options.queryTotalAttr]&&(result.total=responseData[options.queryTotalAttr])):result=responseData,result},transformRequestToJson=function(requestData,headersGetter){for(var filterPrivate=function(key){return"$"===String(key)[0]},keys=angular.isObject(requestData)?Object.keys(requestData):[],privateKeys=keys.filter(filterPrivate),i=0;i<privateKeys.length;i++)delete requestData[privateKeys[i]];return angular.toJson(requestData)},singleTransformRequestFromInternal=function(requestData,headersGetter){return options.fromInternal(angular.copy(requestData),headersGetter)},methods={restore:{method:"GET",isArray:!1,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,cache:cache.withoutDataAttrNoTtl,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},get:{method:"GET",isArray:!1,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,cache:cache.withoutDataAttr,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},getNoCache:{method:"GET",isArray:!1,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},query:{method:"GET",isArray:!0,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,cache:cache.withDataAttr,transformResponse:[transformResponseFromJson,queryTransformResponseData,queryTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},queryNoCache:{method:"GET",isArray:!0,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,transformResponse:[transformResponseFromJson,queryTransformResponseData,queryTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},save:{method:"POST",isArray:!1,withCredentials:!0,cancellable:!1,ignoreLoadingBar:options.ignoreLoadingBar,interceptor:insertingInterceptor,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},update:{method:"PATCH",isArray:!1,withCredentials:!0,cancellable:!1,ignoreLoadingBar:options.ignoreLoadingBar,interceptor:modifyingInterceptor,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},remove:{method:"DELETE",isArray:!1,withCredentials:!0,cancellable:!1,ignoreLoadingBar:options.ignoreLoadingBar,interceptor:deletingInterceptor,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]}};angular.extend(methods,options.extraMethods);for(var methodName in methods)if(methods.hasOwnProperty(methodName)){var bgMethodName=methodName+"Bg",bgMethodConfig=angular.copy(methods[methodName]);bgMethodConfig.ignoreLoadingBar=!0,methods[bgMethodName]=bgMethodConfig}return paramsDefaults[options.pkAttr]="@"+options.pkAttr,saveParams[options.pkAttr]=null,methods.save.params=saveParams,resource=$resource(url,paramsDefaults,methods,{stripTrailingSlashes:options.stripTrailingSlashes}),resource.getPkAttr=function(){return options.pkAttr},resource.getDataAttr=function(){return options.dataAttr},resource.getQueryFilters=function(){return options.queryFilter},resource.setQueryFilters=function(filters){return angular.copy(filters,options.queryFilter)},resource.setDefaultQueryFilters=function(defaultFilters){var filters=angular.extend({},defaultFilters,options.queryFilter);return angular.copy(filters,options.queryFilter)},resource.filter=function(filters){return filters=angular.extend({},resource.getQueryFilters(),filters),resource.query(filters)},resource.filterNoCache=function(filters){return filters=angular.extend({},resource.getQueryFilters(),filters),resource.queryNoCache(filters)},resource.new=function(params){var phantomInstance=new resource(params);return options.pkAttr&&options.generatePhantomIds&&options.phantomIdGenerator&&(phantomInstance[options.pkAttr]=options.phantomIdGenerator.generate(phantomInstance)),phantomInstance},resource.isPhantom=function(instance){var pkValue=instance?instance[options.pkAttr]:void 0;if(options.pkAttr&&options.generatePhantomIds&&options.phantomIdGenerator)return options.phantomIdGenerator.isPhantom(pkValue,instance)},resource.filterInstancesByAttr=function(instances,attrName,attrValue){var filterAttrValue=function(item){return!!item&&item[attrName]==attrValue};return instances.filter(filterAttrValue)},resource.getInstanceByAttr=function(instances,attrName,attrValue){var result=null,filteredInstances=resource.filterInstancesByAttr(instances,attrName,attrValue);return filteredInstances.length&&(filteredInstances.length,result=filteredInstances[0]),result},resource.getInstanceByPk=function(instances,pkValue){return resource.getInstanceByAttr(instances,options.pkAttr,pkValue)},resource.getResourceName=function(){return name},resource.createStore=function(instances){return new ResourceStore(resource,instances,null)},resource.persist=function(instance,params){instance=instance||{};var saveFn=resource.isPhantom(instance)?resource.save:resource.update;if(saveFn)return saveFn({},instance,params);var reject=$q.reject(instance);return reject.$promise=reject,reject},angular.extend(resource.prototype,{$persist:function(params){var result=resource.persist(this,params);return result.$promise||result},$isPhantom:function(){return resource.isPhantom(this)}}),angular.extend(resource.prototype,options.extraFunctions),resource}}])}(),function(){"use strict";angular.module("ngResourceFactory").factory("ResourceCacheService",function(){"ngInject";function constructor(name,pkAttr,options){function getDataForKey(key){if(cache.hasOwnProperty(key))return getDataForEntry(cache[key],cacheUseDataAttr[key])}function getDataForEntry(value,useDataAttr){var data=value[1];return useDataAttr&&options.dataAttr&&data?data[options.dataAttr]:data}function setDataForKey(key,newData){if(cache.hasOwnProperty(key)){var entry=cache[key],entryUseDataAttr=cacheUseDataAttr[key],entryData=entry[1];entryUseDataAttr&&options.dataAttr&&entryData?entryData[options.dataAttr]=newData:entryData=newData,entry[1]=entryData}}function getCurrentTimestamp(){return Math.floor(Date.now()/1e3)}function createOrUpdateTimestamp(key){return cacheTimestamps[key]=getCurrentTimestamp(),cacheTimestamps[key]}function isEntryAlive(key){return!!cache.hasOwnProperty(key)&&getCurrentTimestamp()-cacheTimestamps[key]<=options.ttl}function refreshSingle(newData){var urlAttr=options.urlAttr;urlAttr&&newData&&newData[urlAttr]&&self.insert(newData[urlAttr],newData,!1,!1);for(var key in cache)if(cache.hasOwnProperty(key)&&cacheIsManaged[key]){var entry=cache[key],entryUseDataAttr=cacheUseDataAttr[key],entryData=getDataForEntry(entry,entryUseDataAttr),isList=angular.isArray(entryData);if(isList){for(var i=0;i<entryData.length;i++)entryData[i][pkAttr]===newData[pkAttr]&&(!urlAttr||urlAttr&&entryData[i][urlAttr]===newData[urlAttr])&&(entryData[i]=newData);setDataForKey(key,entryData)}else entryData[pkAttr]===newData[pkAttr]&&(!urlAttr||urlAttr&&entryData[urlAttr]===newData[urlAttr])&&(setDataForKey(key,newData),createOrUpdateTimestamp(key))}}function refreshEach(newEntries){for(var i=0;i<newEntries.length;i++)refreshSingle(newEntries[i])}var self=this,cache={},cacheUseDataAttr={},cacheIsManaged={},cacheTimestamps={};options=angular.extend({pkAttr:null,urlAttr:null,dataAttr:null,dependent:[],ttl:3600},options||{}),function(){if(caches.hasOwnProperty(name))throw Error("Name '"+name+"' is already used by another cache.");caches[name]=self}(),self.refresh=function(value){angular.isArray(value)?refreshEach(value):angular.isObject(value)&&refreshSingle(value)},self.insert=function(key,value,useDataAttr,refresh){var isManaged=angular.isObject(value)||angular.isArray(value),headers=isManaged?{"content-type":"application/json"}:{},entry=[200,value,headers,"OK"];useDataAttr=!!useDataAttr,refresh=!!angular.isUndefined(refresh)||!!refresh,key&&(cache[key]=entry,cacheUseDataAttr[key]=useDataAttr&&isManaged,cacheIsManaged[key]=isManaged,createOrUpdateTimestamp(key),refresh&&self.refresh(getDataForEntry(entry,useDataAttr)))},self.put=function(key,value,useDataAttr){useDataAttr=!!useDataAttr;var isManaged=!1;key&&(value&&value[2]&&"application/json"===value[2]["content-type"]?(value[1]=value[1]?angular.fromJson(value[1]):null,isManaged=!0):(useDataAttr=!1,isManaged=!1),cache[key]=value,cacheUseDataAttr[key]=useDataAttr,cacheIsManaged[key]=isManaged,createOrUpdateTimestamp(key),isManaged&&self.refresh(getDataForEntry(value,useDataAttr)))},self.get=function(key,useCacheTtl){var value=void 0;return useCacheTtl=!(!angular.isUndefined(useCacheTtl)&&!useCacheTtl),cache.hasOwnProperty(key)&&(!useCacheTtl||isEntryAlive(key)?(value=cache[key],cacheIsManaged[key]&&(value=angular.copy(value),value[1]=angular.toJson(value[1]))):self.remove(key)),value},self.remove=function(key){cache.hasOwnProperty(key)&&(delete cache[key],delete cacheTimestamps[key],delete cacheUseDataAttr[key],delete cacheIsManaged[key])},self.removeAll=function(){for(var key in cache)cache.hasOwnProperty(key)&&(delete cache[key],delete cacheTimestamps[key],delete cacheUseDataAttr[key],delete cacheIsManaged[key])},self.removeAllLists=function(){for(var key in cache)cache.hasOwnProperty(key)&&angular.isArray(getDataForKey(key))&&(delete cache[key],delete cacheTimestamps[key],delete cacheUseDataAttr[key],delete cacheIsManaged[key])},self.removeAllObjects=function(){for(var key in cache)cache.hasOwnProperty(key)&&angular.isObject(getDataForKey(key))&&(delete cache[key],delete cacheTimestamps[key],delete cacheUseDataAttr[key],delete cacheIsManaged[key])},self.removeAllDependent=function(){for(var dependentCacheNames=collectDependentCacheNames(self,[]),i=0;i<dependentCacheNames.length;i++)caches[dependentCacheNames[i]].removeAll()},self.destroy=function(){var cacheIndex=caches.indexOf(self);cacheIndex!==-1&&(self.removeAll(),caches.splice(cacheIndex,1))},self.info=function(){var size=0;for(var key in cache)cache.hasOwnProperty(key)&&size++;return{id:name,size:size,options:options}},self.withDataAttr={put:function(key,value){return self.put(key,value,!0)},get:function(key){return self.get(key,!0)},remove:self.remove,removeAll:self.removeAll,info:self.info},self.withoutDataAttr={put:function(key,value){return self.put(key,value,!1)},get:function(key){return self.get(key,!0)},remove:self.remove,removeAll:self.removeAll,info:self.info},self.withDataAttrNoTtl={put:function(key,value){return self.put(key,value,!0)},get:function(key){return self.get(key,!1)},remove:self.remove,removeAll:self.removeAll,info:self.info},self.withoutDataAttrNoTtl={put:function(key,value){return self.put(key,value,!1)},get:function(key){return self.get(key,!1)},remove:self.remove,removeAll:self.removeAll,info:self.info}}function collectDependentCacheNames(cache,collectedDependentCacheNames){var cacheDependentCacheNames=cache.info().options.dependent;collectedDependentCacheNames=collectedDependentCacheNames||[];for(var i=0;i<cacheDependentCacheNames.length;i++){var cacheDependentCacheName=cacheDependentCacheNames[i],cacheDependentCache=caches[cacheDependentCacheName];cacheDependentCache&&(collectedDependentCacheNames.push(cacheDependentCacheName),collectedDependentCacheNames.indexOf(cacheDependentCacheName)===-1&&collectDependentCacheNames(cacheDependentCache,collectedDependentCacheNames))}return collectedDependentCacheNames}var caches={};return constructor.removeAll=function(){for(var key in caches)caches.hasOwnProperty(key)&&caches[key].removeAll()},constructor.get=function(key){return caches.hasOwnProperty(key)?caches[key]:null},constructor.info=function(){var infos={};for(var key in caches)if(caches.hasOwnProperty(key)){var info=caches[key].info();infos[info.id]=info}return infos},constructor})}(),function(){"use strict";var module=angular.module("ngResourceFactory");module.service("ResourcePhantomIdFactoryService",function(){"ngInject";function ResourcePhantomIdFactory(generateFn,isPhantomFn){var self=this;self.generate=function(instance){return generateFn(instance)},self.isPhantom=function(pkValue,instance){return isPhantomFn(pkValue,instance)}}this.createPhantomIdFactory=function(config){return config=angular.extend({generate:function(){},is:function(){}},config),new ResourcePhantomIdFactory(config.generate,config.is)}}),module.factory("ResourcePhantomIdNegativeInt",["ResourcePhantomIdFactoryService",function(ResourcePhantomIdFactoryService){"ngInject";var lastPkValue=0;return ResourcePhantomIdFactoryService.createPhantomIdFactory({generate:function(){return--lastPkValue},is:function(pkValue){return pkValue<0}})}]),module.factory("ResourcePhantomIdUuid4",["ResourcePhantomIdFactoryService",function(ResourcePhantomIdFactoryService){"ngInject";function uuid4(){"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(c){var r=16*Math.random()|0;return("x"===c?r:3&r|8).toString(16)})}var generatedIds=[];return ResourcePhantomIdFactoryService.createPhantomIdFactory({generate:function(){var pkValue=uuid4();return generatedIds.push(pkValue),pkValue},is:function(pkValue){return generatedIds.indexOf(pkValue)!==-1}})}])}(),angular.module("ngResourceFactory")}); | ||
!function(root,factory){var i,resolved=[],required=["require","exports","module","angular"],len=required.length;if("function"==typeof define&&define.amd)define("ngresourcefactory",["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.ngresourcefactory=factory.apply({},resolved)}}(this,function(require,exports,module,angular){return function(){"use strict";angular.module("ngResourceFactory",["ngResource"])}(),function(){"use strict";angular.module("ngResourceFactory").factory("ResourceCacheService",function(){"ngInject";function constructor(name,pkAttr,options){function getDataForKey(key){if(cache.hasOwnProperty(key))return getDataForEntry(cache[key],cacheUseDataAttr[key])}function getDataForEntry(value,useDataAttr){var data=value[1];return useDataAttr&&options.dataAttr&&data?data[options.dataAttr]:data}function setDataForKey(key,newData){if(cache.hasOwnProperty(key)){var entry=cache[key],entryUseDataAttr=cacheUseDataAttr[key],entryData=entry[1];entryUseDataAttr&&options.dataAttr&&entryData?entryData[options.dataAttr]=newData:entryData=newData,entry[1]=entryData}}function getCurrentTimestamp(){return Math.floor(Date.now()/1e3)}function createOrUpdateTimestamp(key){return cacheTimestamps[key]=getCurrentTimestamp(),cacheTimestamps[key]}function isEntryAlive(key){return!!cache.hasOwnProperty(key)&&getCurrentTimestamp()-cacheTimestamps[key]<=options.ttl}function refreshSingle(newData){var urlAttr=options.urlAttr;urlAttr&&newData&&newData[urlAttr]&&self.insert(newData[urlAttr],newData,!1,!1);for(var key in cache)if(cache.hasOwnProperty(key)&&cacheIsManaged[key]){var entry=cache[key],entryUseDataAttr=cacheUseDataAttr[key],entryData=getDataForEntry(entry,entryUseDataAttr),isList=angular.isArray(entryData);if(isList){for(var i=0;i<entryData.length;i++)entryData[i][pkAttr]===newData[pkAttr]&&(!urlAttr||urlAttr&&entryData[i][urlAttr]===newData[urlAttr])&&(entryData[i]=newData);setDataForKey(key,entryData)}else entryData[pkAttr]===newData[pkAttr]&&(!urlAttr||urlAttr&&entryData[urlAttr]===newData[urlAttr])&&(setDataForKey(key,newData),createOrUpdateTimestamp(key))}}function refreshEach(newEntries){for(var i=0;i<newEntries.length;i++)refreshSingle(newEntries[i])}var self=this,cache={},cacheUseDataAttr={},cacheIsManaged={},cacheTimestamps={};options=angular.extend({pkAttr:null,urlAttr:null,dataAttr:null,dependent:[],ttl:3600},options||{}),function(){if(caches.hasOwnProperty(name))throw Error("Name '"+name+"' is already used by another cache.");caches[name]=self}(),self.refresh=function(value){angular.isArray(value)?refreshEach(value):angular.isObject(value)&&refreshSingle(value)},self.insert=function(key,value,useDataAttr,refresh){var isManaged=angular.isObject(value)||angular.isArray(value),headers=isManaged?{"content-type":"application/json"}:{},entry=[200,value,headers,"OK"];useDataAttr=!!useDataAttr,refresh=!!angular.isUndefined(refresh)||!!refresh,key&&(cache[key]=entry,cacheUseDataAttr[key]=useDataAttr&&isManaged,cacheIsManaged[key]=isManaged,createOrUpdateTimestamp(key),refresh&&self.refresh(getDataForEntry(entry,useDataAttr)))},self.put=function(key,value,useDataAttr){useDataAttr=!!useDataAttr;var isManaged=!1;key&&(value&&value[2]&&"application/json"===value[2]["content-type"]?(value[1]=value[1]?angular.fromJson(value[1]):null,isManaged=!0):(useDataAttr=!1,isManaged=!1),cache[key]=value,cacheUseDataAttr[key]=useDataAttr,cacheIsManaged[key]=isManaged,createOrUpdateTimestamp(key),isManaged&&self.refresh(getDataForEntry(value,useDataAttr)))},self.get=function(key,useCacheTtl){var value=void 0;return useCacheTtl=!(!angular.isUndefined(useCacheTtl)&&!useCacheTtl),cache.hasOwnProperty(key)&&(!useCacheTtl||isEntryAlive(key)?(value=cache[key],cacheIsManaged[key]&&(value=angular.copy(value),value[1]=angular.toJson(value[1]))):self.remove(key)),value},self.remove=function(key){cache.hasOwnProperty(key)&&(delete cache[key],delete cacheTimestamps[key],delete cacheUseDataAttr[key],delete cacheIsManaged[key])},self.removeAll=function(){for(var key in cache)cache.hasOwnProperty(key)&&(delete cache[key],delete cacheTimestamps[key],delete cacheUseDataAttr[key],delete cacheIsManaged[key])},self.removeAllLists=function(){for(var key in cache)cache.hasOwnProperty(key)&&angular.isArray(getDataForKey(key))&&(delete cache[key],delete cacheTimestamps[key],delete cacheUseDataAttr[key],delete cacheIsManaged[key])},self.removeAllObjects=function(){for(var key in cache)cache.hasOwnProperty(key)&&angular.isObject(getDataForKey(key))&&(delete cache[key],delete cacheTimestamps[key],delete cacheUseDataAttr[key],delete cacheIsManaged[key])},self.removeAllDependent=function(){for(var dependentCacheNames=collectDependentCacheNames(self,[]),i=0;i<dependentCacheNames.length;i++)caches[dependentCacheNames[i]].removeAll()},self.destroy=function(){var cacheIndex=caches.indexOf(self);cacheIndex!==-1&&(self.removeAll(),caches.splice(cacheIndex,1))},self.info=function(){var size=0;for(var key in cache)cache.hasOwnProperty(key)&&size++;return{id:name,size:size,options:options}},self.withDataAttr={put:function(key,value){return self.put(key,value,!0)},get:function(key){return self.get(key,!0)},remove:self.remove,removeAll:self.removeAll,info:self.info},self.withoutDataAttr={put:function(key,value){return self.put(key,value,!1)},get:function(key){return self.get(key,!0)},remove:self.remove,removeAll:self.removeAll,info:self.info},self.withDataAttrNoTtl={put:function(key,value){return self.put(key,value,!0)},get:function(key){return self.get(key,!1)},remove:self.remove,removeAll:self.removeAll,info:self.info},self.withoutDataAttrNoTtl={put:function(key,value){return self.put(key,value,!1)},get:function(key){return self.get(key,!1)},remove:self.remove,removeAll:self.removeAll,info:self.info}}function collectDependentCacheNames(cache,collectedDependentCacheNames){var cacheDependentCacheNames=cache.info().options.dependent;collectedDependentCacheNames=collectedDependentCacheNames||[];for(var i=0;i<cacheDependentCacheNames.length;i++){var cacheDependentCacheName=cacheDependentCacheNames[i],cacheDependentCache=caches[cacheDependentCacheName];cacheDependentCache&&(collectedDependentCacheNames.push(cacheDependentCacheName),collectedDependentCacheNames.indexOf(cacheDependentCacheName)===-1&&collectDependentCacheNames(cacheDependentCache,collectedDependentCacheNames))}return collectedDependentCacheNames}var caches={};return constructor.removeAll=function(){for(var key in caches)caches.hasOwnProperty(key)&&caches[key].removeAll()},constructor.get=function(key){return caches.hasOwnProperty(key)?caches[key]:null},constructor.info=function(){var infos={};for(var key in caches)if(caches.hasOwnProperty(key)){var info=caches[key].info();infos[info.id]=info}return infos},constructor})}(),function(){"use strict";angular.module("ngResourceFactory").factory("ResourceFactoryService",["$q","$resource","ResourceCacheService","ResourcePhantomIdNegativeInt",function($q,$resource,ResourceCacheService,ResourcePhantomIdNegativeInt){"ngInject";function ResourceStore(resource,managedInstances,parentStore){function addResourceInstance(instances,instance){var matchingInstances=resource.filterInstancesByAttr(instances,resource.getPkAttr(),instance[resource.getPkAttr()]);if(matchingInstances.length)for(var i=0;i<matchingInstances.length;i++){var matchingInstanceIndex=instances.indexOf(matchingInstances[i]),matchingInstanceFound=matchingInstanceIndex!==-1;matchingInstanceFound&&instances.splice(matchingInstanceIndex,1,instance)}else instances.push(instance)}function removeResourceInstance(instances,instance){var matchingInstances=resource.filterInstancesByAttr(instances,resource.getPkAttr(),instance[resource.getPkAttr()]);if(matchingInstances.length)for(var i=0;i<matchingInstances.length;i++){var matchingInstanceIndex=instances.indexOf(matchingInstances[i]),matchingInstanceFound=matchingInstanceIndex!==-1;matchingInstanceFound&&instances.splice(matchingInstanceIndex,1)}}function isPromiseLike(obj){return obj&&angular.isFunction(obj.then)}function populate(dst,src,keepMissing){keepMissing=!!angular.isUndefined(keepMissing)||!!keepMissing,dst=dst||void 0;var key,preserve=!!dst,preservedObjects={};src=angular.copy(src);for(key in src)src.hasOwnProperty(key)&&"$"===key[0]&&delete src[key];if(preserve)for(key in dst)dst.hasOwnProperty(key)&&("$"===key[0]?preservedObjects[key]=dst[key]:keepMissing&&!src.hasOwnProperty(key)&&(preservedObjects[key]=dst[key]));if(dst=angular.copy(src,dst),preserve)for(key in preservedObjects)preservedObjects.hasOwnProperty(key)&&(dst[key]=preservedObjects[key]);return dst}function copy(src,dst){if(angular.isArray(src)){dst=angular.isArray(dst)?dst:[],dst.length=0;for(var i=0;i<src.length;i++)dst.push(populate(null,src[i],!1))}else dst=populate(dst,src,!1);return dst}function merge(src,dst){if(angular.isArray(src)){dst=angular.isArray(dst)?dst:[],dst.length=0;for(var i=0;i<src.length;i++)dst.push(populate(null,src[i],!0))}else dst=populate(dst,src,!0);return dst}var self=this,executionRunning=(resource.getResourceName(),!1),relations=[],visibleQueue=[],persistQueue=[],removeQueue=[],beforePersistListeners=[],afterPersistListeners=[],beforeRemoveListeners=[],afterRemoveListeners=[];self.manage=function(newInstances){var doManage=function(newInstances){angular.isArray(newInstances)||(newInstances=[newInstances]);for(var i=0;i<newInstances.length;i++){var newInstance=newInstances[i];newInstance.$store?newInstance.$store:(newInstance.$store=self,addResourceInstance(managedInstances,newInstance),addResourceInstance(visibleQueue,newInstance))}};if(isPromiseLike(newInstances)||isPromiseLike(newInstances.$promise)){var promise=isPromiseLike(newInstances)?newInstances:newInstances.$promise,defer=$q.defer();return promise.then(doManage).then(function(){defer.resolve(newInstances)}),defer.promise}return doManage(newInstances),$q.resolve(newInstances)},self.forget=function(oldInstances){var doForget=function(oldInstances){angular.isArray(oldInstances)||(oldInstances=[oldInstances]);for(var i=0;i<oldInstances.length;i++){var oldInstance=oldInstances[i];oldInstance.$store===self?(delete oldInstance.$store,removeResourceInstance(managedInstances,oldInstance),removeResourceInstance(visibleQueue,oldInstance),removeResourceInstance(persistQueue,oldInstance),removeResourceInstance(removeQueue,oldInstance)):oldInstance.$store}};if(isPromiseLike(oldInstances)||isPromiseLike(oldInstances.$promise)){var promise=isPromiseLike(oldInstances)?oldInstances:oldInstances.$promise,defer=$q.defer();return promise.then(doForget).then(function(){defer.resolve(oldInstances)}),defer.promise}return doForget(oldInstances),$q.resolve(oldInstances)},self.new=function(params){var newInstance=resource.new(params);return self.manage(newInstance),newInstance},self.persist=function(instances){angular.isArray(instances)||(instances=[instances]);for(var i=0;i<instances.length;i++){var instance=instances[i];instance.$store===self&&(addResourceInstance(persistQueue,instance),addResourceInstance(visibleQueue,instance),removeResourceInstance(removeQueue,instance))}},self.remove=function(instances){angular.isArray(instances)||(instances=[instances]);for(var i=0;i<instances.length;i++){var instance=instances[i];instance.$store===self&&(removeResourceInstance(persistQueue,instance),removeResourceInstance(visibleQueue,instance),addResourceInstance(removeQueue,instance))}},self.commit=function(){if(parentStore){for(var i=0;i<persistQueue.length;i++){var childPersistInstance=copy(persistQueue[i]),parentPersistInstance=parentStore.getByInstance(childPersistInstance);delete childPersistInstance.$store,parentPersistInstance?merge(parentPersistInstance,childPersistInstance):(parentPersistInstance=copy(childPersistInstance),parentStore.manage(parentPersistInstance)),parentStore.persist(parentPersistInstance)}for(var j=0;j<removeQueue.length;j++){var childRemoveInstance=copy(removeQueue[i]),parentRemoveInstance=parentStore.getByInstance(childRemoveInstance);delete childRemoveInstance.$store,parentRemoveInstance?merge(parentRemoveInstance,childRemoveInstance):(parentRemoveInstance=copy(childRemoveInstance),parentStore.manage(parentRemoveInstance)),parentStore.remove(parentRemoveInstance)}}},self.executeAll=function(clearAfter){clearAfter=angular.isUndefined(clearAfter)||!!clearAfter;var defer=$q.defer(),executeRelated=function(){for(var promises=[],i=0;i<relations.length;i++){var relation=relations[i],relatedStore=relation.getRelatedStore();promises.push(relatedStore.executeAll(clearAfter))}return $q.all(promises)};return self.execute(clearAfter).then(executeRelated).then(defer.resolve).catch(defer.reject),defer.promise},self.execute=function(clearAfter){if(clearAfter=angular.isUndefined(clearAfter)||!!clearAfter,executionRunning)return $q.reject("Another execution is already running.");if(parentStore)throw"Executing the store is only possible on the topmost store";executionRunning=!0;var defer=$q.defer(),handleError=function(reason){executionRunning=!1,defer.reject(reason)},callListeners=function(item,listeners){for(var i=0;i<listeners.length;i++)listeners[i](item)},relationsRemove=function(pkValue){for(var i=0;i<relations.length;i++)relations[i].handleRemove(pkValue)},relationsUpdate=function(oldPkValue,newPkValue){for(var i=0;i<relations.length;i++)relations[i].handleUpdate(oldPkValue,newPkValue)},executeSingle=function(item,execFn,beforeListeners,afterListeners,defer,isRemove){callListeners(item,beforeListeners),execFn({},item).$promise.then(function(response){if(isRemove&&item&&relationsRemove(item[resource.getPkAttr()]),response.data&&response.data[resource.getPkAttr()]){var oldPkValue=item?item[resource.getPkAttr()]:null,newPkValue=response.data?response.data[resource.getPkAttr()]:null;isRemove||relationsUpdate(oldPkValue,newPkValue),item[resource.getPkAttr()]=newPkValue}callListeners(item,afterListeners),defer.resolve(item)}).catch(defer.reject)},executeRemoves=function(){for(var promises=[],queue=self.getRemoveQueue(),i=0;i<queue.length;i++){var item=queue[i];if(!item.$isPhantom()){var defer=$q.defer();promises.push(defer.promise),executeSingle(item,resource.remove,beforeRemoveListeners,afterRemoveListeners,defer,!0)}}return $q.all(promises)},executeUpdates=function(){for(var promises=[],queue=self.getUpdateQueue(),i=0;i<queue.length;i++){var item=queue[i],defer=$q.defer();promises.push(defer.promise),executeSingle(item,resource.update,beforePersistListeners,afterPersistListeners,defer,!1)}return $q.all(promises)},executeSaves=function(){for(var promises=[],queue=self.getSaveQueue(),i=0;i<queue.length;i++){var item=queue[i],defer=$q.defer();promises.push(defer.promise),executeSingle(item,resource.save,beforePersistListeners,afterPersistListeners,defer,!1)}return $q.all(promises)},clear=function(){clearAfter&&(persistQueue.length=0,removeQueue.length=0),executionRunning=!1};return $q.when().then(executeRemoves).then(executeUpdates).then(executeSaves).then(clear).then(defer.resolve).catch(handleError),defer.promise},self.createChildStore=function(instances){return instances=instances||managedInstances,new ResourceStore(resource,copy(instances),self)},self.createRelation=function(config){config=angular.extend({relatedStore:null,fkAttr:null,onDelete:"forget",onUpdate:"update"},config);var relation=new ResourceStoreRelation(self,config.relatedStore,config.fkAttr,config.onUpdate,config.onDelete);return relations.push(relation),relation},self.removeRelation=function(relation){var relationIndex=relations.indexOf(relation);relationIndex!==-1&&relations.splice(relationIndex,1)},self.getByPk=function(pkValue){return resource.getInstanceByPk(managedInstances,pkValue)},self.getByInstance=function(instance){var pkValue=instance?instance[resource.getPkAttr()]:void 0;return self.getByPk(pkValue)},self.getManagedInstances=function(){return managedInstances.slice()},self.getVisibleQueue=function(){return visibleQueue.slice()},self.getPersistQueue=function(){return persistQueue.slice()},self.getRemoveQueue=function(){return removeQueue.slice()},self.getSaveQueue=function(){var filterPhantom=function(instance){return instance.$isPhantom()};return persistQueue.filter(filterPhantom)},self.getUpdateQueue=function(){var filterNonPhantom=function(instance){return!instance.$isPhantom()};return persistQueue.filter(filterNonPhantom)},self.getResource=function(){return resource},self.addBeforePersistListener=function(fn){beforePersistListeners.push(fn)},self.removeBeforePersistListener=function(fn){var fnIndex=beforePersistListeners.indexOf(fn);fnIndex!==-1&&beforePersistListeners.splice(fnIndex,1)},self.addAfterPersistListener=function(fn){afterPersistListeners.push(fn)},self.removeAfterPersistListener=function(fn){var fnIndex=afterPersistListeners.indexOf(fn);fnIndex!==-1&&afterPersistListeners.splice(fnIndex,1)},self.removeBeforeRemoveListener=function(fn){var fnIndex=beforeRemoveListeners.indexOf(fn);fnIndex!==-1&&beforeRemoveListeners.splice(fnIndex,1)},self.addAfterRemoveListener=function(fn){afterRemoveListeners.push(fn)},self.removeAfterRemoveListener=function(fn){var fnIndex=afterRemoveListeners.indexOf(fn);fnIndex!==-1&&afterRemoveListeners.splice(fnIndex,1)},function(){managedInstances=managedInstances||[],parentStore=parentStore||null;var managed=self.manage(managedInstances),mapPk=function(instance){return instance?String(instance[resource.getPkAttr()]):void 0},filterPks=function(pks){return function(instance){return!!instance&&pks.indexOf(String(instance[resource.getPkAttr()]))!==-1}};parentStore&&managed.then(function(){var parentVisibleQueuePks=parentStore.getVisibleQueue().map(mapPk),parentPersistQueuePks=parentStore.getPersistQueue().map(mapPk),parentRemoveQueuePks=parentStore.getRemoveQueue().map(mapPk);visibleQueue=managedInstances.filter(filterPks(parentVisibleQueuePks)),persistQueue=managedInstances.filter(filterPks(parentPersistQueuePks)),removeQueue=managedInstances.filter(filterPks(parentRemoveQueuePks))})}()}function ResourceStoreRelation(store,relatedStore,fkAttr,onUpdate,onRemove){var self=this;switch(onUpdate){case"update":onUpdate=function(referencingStore,referencingInstance,oldReferencedInstancePk,newReferencedInstancePk,fkAttr){referencingInstance[fkAttr]=newReferencedInstancePk};break;case"null":onUpdate=function(referencingStore,referencingInstance,oldReferencedInstancePk,newReferencedInstancePk,fkAttr){referencingInstance[fkAttr]=null}}switch(onRemove){case"forget":onRemove=function(referencingStore,referencingInstance,oldReferencedInstancePk,fkAttr){referencingStore.forget(referencingInstance)};break;case"null":onRemove=function(referencingStore,referencingInstance,oldReferencedInstancePk,fkAttr){referencingInstance[fkAttr]=null}}self.getStore=function(){return store},self.getRelatedStore=function(){return relatedStore},self.getFkAttr=function(){return fkAttr},self.handleUpdate=function(oldPkValue,newPkValue){for(var referencingInstances=relatedStore.getManagedInstances(),i=0;i<referencingInstances.length;i++){var referencingInstance=referencingInstances[i];referencingInstance&&referencingInstance[fkAttr]==oldPkValue&&oldPkValue!=newPkValue&&onUpdate(relatedStore,referencingInstance,oldPkValue,newPkValue,fkAttr)}},self.handleRemove=function(pkValue){for(var referencingInstances=relatedStore.getManagedInstances(),i=0;i<referencingInstances.length;i++){var referencingInstance=referencingInstances[i];referencingInstance&&referencingInstance[fkAttr]==pkValue&&onRemove(relatedStore,referencingInstance,pkValue,fkAttr)}}}return function(name,url,options){options=angular.extend({stripTrailingSlashes:!1,ignoreLoadingBar:!1,generatePhantomIds:!0,phantomIdGenerator:ResourcePhantomIdNegativeInt,dependent:[],extraMethods:{},extraFunctions:{},pkAttr:"pk",urlAttr:"url",queryDataAttr:null,queryTotalAttr:null,queryFilter:{},toInternal:function(obj,headersGetter,status){return obj},fromInternal:function(obj,headersGetter){return obj}},options||{});var resource,paramsDefaults={},saveParams={},cache=new ResourceCacheService(name,options.pkAttr,{dataAttr:options.queryDataAttr,pkAttr:options.pkAttr,urlAttr:options.urlAttr,dependent:options.dependent,ttl:900}),insertingInterceptor={response:function(response){var data=response.data;return cache.removeAllLists(),cache.removeAllDependent(),cache.insert(data[options.urlAttr],data,!1),response}},modifyingInterceptor={response:function(response){var data=response.data,url=data[options.urlAttr];return cache.removeAllLists(),cache.removeAllDependent(),cache.insert(url,data,!1),response}},deletingInterceptor={response:function(response){return cache.removeAllLists(),cache.removeAllDependent(),cache.remove(response.config.url),response}},transformResponseFromJson=function(responseText,headersGetter,status){return responseText?angular.fromJson(responseText):null},queryTransformResponseToInternal=function(responseData,headersGetter,status){if(angular.isArray(responseData))for(var i=0;i<responseData.length;i++)responseData[i]=options.toInternal(responseData[i],headersGetter,status);else responseData=options.toInternal(responseData,headersGetter,status);return responseData},singleTransformResponseToInternal=function(responseData,headersGetter,status){return options.toInternal(responseData,headersGetter,status)},queryTransformResponseData=function(responseData,headersGetter,status){var result=null;return status>=200&&status<300?(options.queryDataAttr&&responseData&&responseData[options.queryDataAttr]&&(result=responseData[options.queryDataAttr]),options.queryTotalAttr&&responseData&&responseData[options.queryTotalAttr]&&(result.total=responseData[options.queryTotalAttr])):result=responseData,result},transformRequestToJson=function(requestData,headersGetter){for(var filterPrivate=function(key){return"$"===String(key)[0]},keys=angular.isObject(requestData)?Object.keys(requestData):[],privateKeys=keys.filter(filterPrivate),i=0;i<privateKeys.length;i++)delete requestData[privateKeys[i]];return angular.toJson(requestData)},singleTransformRequestFromInternal=function(requestData,headersGetter){return options.fromInternal(angular.copy(requestData),headersGetter)},methods={restore:{method:"GET",isArray:!1,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,cache:cache.withoutDataAttrNoTtl,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},get:{method:"GET",isArray:!1,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,cache:cache.withoutDataAttr,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},getNoCache:{method:"GET",isArray:!1,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},query:{method:"GET",isArray:!0,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,cache:cache.withDataAttr,transformResponse:[transformResponseFromJson,queryTransformResponseData,queryTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},queryNoCache:{method:"GET",isArray:!0,withCredentials:!0,cancellable:!0,ignoreLoadingBar:options.ignoreLoadingBar,transformResponse:[transformResponseFromJson,queryTransformResponseData,queryTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},save:{method:"POST",isArray:!1,withCredentials:!0,cancellable:!1,ignoreLoadingBar:options.ignoreLoadingBar,interceptor:insertingInterceptor,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},update:{method:"PATCH",isArray:!1,withCredentials:!0,cancellable:!1,ignoreLoadingBar:options.ignoreLoadingBar,interceptor:modifyingInterceptor,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]},remove:{method:"DELETE",isArray:!1,withCredentials:!0,cancellable:!1,ignoreLoadingBar:options.ignoreLoadingBar,interceptor:deletingInterceptor,transformResponse:[transformResponseFromJson,singleTransformResponseToInternal],transformRequest:[singleTransformRequestFromInternal,transformRequestToJson]}};angular.extend(methods,options.extraMethods);for(var methodName in methods)if(methods.hasOwnProperty(methodName)){var bgMethodName=methodName+"Bg",bgMethodConfig=angular.copy(methods[methodName]);bgMethodConfig.ignoreLoadingBar=!0,methods[bgMethodName]=bgMethodConfig}return paramsDefaults[options.pkAttr]="@"+options.pkAttr,saveParams[options.pkAttr]=null,methods.save.params=saveParams,resource=$resource(url,paramsDefaults,methods,{stripTrailingSlashes:options.stripTrailingSlashes}),resource.getPkAttr=function(){return options.pkAttr},resource.getDataAttr=function(){return options.dataAttr},resource.getQueryFilters=function(){return options.queryFilter},resource.setQueryFilters=function(filters){return angular.copy(filters,options.queryFilter)},resource.setDefaultQueryFilters=function(defaultFilters){var filters=angular.extend({},defaultFilters,options.queryFilter);return angular.copy(filters,options.queryFilter)},resource.filter=function(filters){return filters=angular.extend({},resource.getQueryFilters(),filters),resource.query(filters)},resource.filterNoCache=function(filters){return filters=angular.extend({},resource.getQueryFilters(),filters),resource.queryNoCache(filters)},resource.new=function(params){var phantomInstance=new resource(params);return options.pkAttr&&options.generatePhantomIds&&options.phantomIdGenerator&&(phantomInstance[options.pkAttr]=options.phantomIdGenerator.generate(phantomInstance)),phantomInstance},resource.isPhantom=function(instance){var pkValue=instance?instance[options.pkAttr]:void 0;if(options.pkAttr&&options.generatePhantomIds&&options.phantomIdGenerator)return options.phantomIdGenerator.isPhantom(pkValue,instance)},resource.filterInstancesByAttr=function(instances,attrName,attrValue){var filterAttrValue=function(item){return!!item&&item[attrName]==attrValue};return instances.filter(filterAttrValue)},resource.getInstanceByAttr=function(instances,attrName,attrValue){var result=null,filteredInstances=resource.filterInstancesByAttr(instances,attrName,attrValue);return filteredInstances.length&&(filteredInstances.length,result=filteredInstances[0]),result},resource.getInstanceByPk=function(instances,pkValue){return resource.getInstanceByAttr(instances,options.pkAttr,pkValue)},resource.getResourceName=function(){return name},resource.createStore=function(instances){return new ResourceStore(resource,instances,null)},resource.persist=function(instance,params){instance=instance||{};var saveFn=resource.isPhantom(instance)?resource.save:resource.update;if(saveFn)return saveFn({},instance,params);var reject=$q.reject(instance);return reject.$promise=reject,reject},angular.extend(resource.prototype,{$persist:function(params){var result=resource.persist(this,params);return result.$promise||result},$isPhantom:function(){return resource.isPhantom(this)}}),angular.extend(resource.prototype,options.extraFunctions),resource}}])}(),function(){"use strict";var module=angular.module("ngResourceFactory");module.service("ResourcePhantomIdFactoryService",function(){"ngInject";function ResourcePhantomIdFactory(generateFn,isPhantomFn){var self=this;self.generate=function(instance){return generateFn(instance)},self.isPhantom=function(pkValue,instance){return isPhantomFn(pkValue,instance)}}this.createPhantomIdFactory=function(config){return config=angular.extend({generate:function(){},is:function(){}},config),new ResourcePhantomIdFactory(config.generate,config.is)}}),module.factory("ResourcePhantomIdNegativeInt",["ResourcePhantomIdFactoryService",function(ResourcePhantomIdFactoryService){"ngInject";var lastPkValue=0;return ResourcePhantomIdFactoryService.createPhantomIdFactory({generate:function(){return--lastPkValue},is:function(pkValue){return pkValue<0}})}]),module.factory("ResourcePhantomIdUuid4",["ResourcePhantomIdFactoryService",function(ResourcePhantomIdFactoryService){"ngInject";function uuid4(){"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(c){var r=16*Math.random()|0;return("x"===c?r:3&r|8).toString(16)})}var generatedIds=[];return ResourcePhantomIdFactoryService.createPhantomIdFactory({generate:function(){var pkValue=uuid4();return generatedIds.push(pkValue),pkValue},is:function(pkValue){return generatedIds.indexOf(pkValue)!==-1}})}])}(),angular.module("ngResourceFactory")}); |
{ | ||
"name": "angular-resource-factory", | ||
"version": "0.8.0", | ||
"version": "0.8.1", | ||
"description": "A factory build upon $resource helping you to interact with RESTful APIs with advanced features as caches and data stores.", | ||
@@ -5,0 +5,0 @@ "main": "dist/ngresourcefactory.min.js", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
1284619
8790