-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathangular-model.min.js
More file actions
24 lines (24 loc) · 11.8 KB
/
angular-model.min.js
File metadata and controls
24 lines (24 loc) · 11.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
angular.module("model",["ngResource"]).provider("Model",function(){var ns={config:{},cache:{},actions:{"jsonp":{method:"JSONP",isArray:false},"get":{method:"GET",headers:{"Accept":"application/json"}},"save":{method:"POST",headers:{"Accept":"application/json"}},"query":{method:"GET",isArray:true,headers:{"Accept":"application/json"}},"remove":{method:"DELETE",headers:{"Accept":"application/json"}},"delete":{method:"DELETE",headers:{"Accept":"application/json"}}}};this.configureModels=function(obj){angular.extend(ns.config,
obj)};this.$get=["$resource","$q","$timeout","$location","$rootScope",function($resource,$q,$timeout,$location,$rootScope){$rootScope.Model={};angular.forEach(ns.config,function(val,key){if(angular.isDefined(val.data))$rootScope.Model[key]=val.data});var pub={},pri={};pub={addModel:function(parent,def){var defaultOpts={};if(angular.isDefined(def.name)){var config={};config[def.name]={};angular.extend(config[def.name],def);angular.extend(ns.config,config);pri.prepopulateData(def.name)}else{var models=
pri._keys(def);for(var m=0;m<models.length;m++){ns.config[models[m]]={};angular.extend(ns.config[models[m]],def[models[m]]);pri.prepopulateData(def.name)}}},set:function(parent,model,data,target,index){if(angular.isUndefined(target))target="update";if(angular.isUndefined($rootScope.Model[model])){if(angular.isDefined(ns.config[model])&&angular.isDefined(ns.config[model].type)&&ns.config[model].type=="array"){$rootScope.Model[model]=[];if(angular.isDefined(index))if(angular.isArray(data))$rootScope.Model[model][index]=
[];else $rootScope.Model[model][index]={}}else $rootScope.Model[model]={};target="replace"}if(target=="replace")if(angular.isArray(data))if(angular.isDefined(index))$rootScope.Model[model][index].length=0;else $rootScope.Model[model].length=0;else if(angular.isDefined(index))$rootScope.Model[model][index]={};else $rootScope.Model[model]={};if(target=="replace"||target=="update")if(angular.isArray(data))if(angular.isDefined(index)&&angular.isArray($rootScope.Model[model])){$rootScope.Model[model][index].length=
0;Array.prototype.push.apply($rootScope.Model[model][index],data)}else{$rootScope.Model[model].length=0;Array.prototype.push.apply($rootScope.Model[model],data)}else if(angular.isDefined(index)&&angular.isArray($rootScope.Model[model]))$.extend(true,$rootScope.Model[model][index],data);else $.extend(true,$rootScope.Model[model],data);if(target=="append")if(angular.isDefined(index))Array.prototype.push.apply($rootScope.Model[model][index],data);else Array.prototype.push.apply($rootScope.Model[model],
data);if(angular.isDefined(ns.config[model].aliases))if(angular.isDefined(index))pri.doAliasing($rootScope.Model[model],ns.config[model].type,ns.config[model].aliases,"["+index+"]");else pri.doAliasing($rootScope.Model[model],ns.config[model].type,ns.config[model].aliases);return $rootScope.Model[model]},update:function(parent,model,par,target){var params={},resource={},action="query",data=null,defer=$q.defer(),acts=angular.copy(ns.actions,acts);if(angular.isDefined(par))angular.extend(params,par);
if(pri.useCache(model)){pri.restoreCache(model);defer.resolve(pub.value(parent,model));return defer.promise}if(angular.isDefined(ns.config[model].action))action=ns.config[model].action;if(action=="jsonp")angular.extend(params,{callback:"JSON_CALLBACK"});if(angular.isUndefined(ns.config[model].type)||ns.config[model].type!="array")acts[action].isArray=false;if(angular.isUndefined(ns.config[model].resource))ns.config[model].resource=$resource(ns.config[model].endpoint,{},acts);data=ns.config[model].resource[action](params,
function(){pub.set(parent,model,data,target);if(angular.isDefined(ns.config[model].resolve)&&ns.config[model].resolve=="parent")defer.resolve($rootScope.Model[model]);pri.doNesting($rootScope.Model[model],ns.config[model].nested).then(function(){if(ns.config[model].cache)pri.setCache(model);defer.resolve($rootScope.Model[model])})},function(error){defer.resolve($rootScope.Model[model])});return defer.promise},append:function(parent,model,params){return pub.update(parent,model,params,"append")},clearCache:function(parent,
model){if(angular.isDefined(ns.cache[model]))if(angular.isDefined(ns.config[model].type)&&ns.config[model].type=="array")ns.cache[model].length=0;else ns.cache[model]={}},clear:function(parent,model){if(angular.isDefined($rootScope.Model[model]))if(angular.isDefined(ns.config[model].type)&&ns.config[model].type=="array")$rootScope.Model[model].length=0;else $rootScope.Model[model]={};pub.clearCache(parent,model)},value:function(parent,key){if(angular.isUndefined(key))return $rootScope.Model;if(key.indexOf(".")==
-1)return $rootScope.Model[key];return pri.getObjValue($rootScope.Model,key)},startIntervalUpdate:function(parent,model,seconds,params,target){if(angular.isDefined(ns.config[model]))ns.config[model].intervalUpdateTimer=$timeout(function(){pub.update(parent,model,params,target).then(function(){pub.startIntervalUpdate(parent,model,seconds,params,target)})},seconds*1E3,true)},stopIntervalUpdate:function(parent,model){if(angular.isDefined(ns.config[model].intervalUpdateTimer)){$timeout.cancel(ns.config[model].intervalUpdateTimer);
delete ns.config[model].intervalUpdateTimer}},save:function(parent,model,params,data){},remove:function(parent,model,params){}};pri={prepopulateData:function(model){if(angular.isDefined(model)){if(angular.isDefined(ns.config[model])){if(angular.isUndefined($rootScope.Model[model]))if(angular.isDefined(ns.config[model].type&&ns.config[model].type=="array"))$rootScope.Model[model]=[];else $rootScope.Model[model]={};if(angular.isDefined(ns.config[model].data))if(angular.isArray(ns.config[model].data))Array.prototype.push.apply($rootScope.Model[model],
ns.config[model].data);else angular.extend($rootScope.Model[model],ns.config[model].data)}}else angular.forEach(ns.config,function(config,model){if(angular.isDefined(config.data))pri.prepopulateData(model)})},doNesting:function(data,config){if(angular.isUndefined(config)||config.length==0){var defer=$q.defer();defer.resolve();return defer.promise}var nest=0,promises=[];pri.buildNestingConfig(data,config);for(nest=0;nest<config.length;nest++)promises=promises.concat(pri.populateNestingEndpoints(data,
config[nest].config));return $q.all(promises)},buildNestingConfig:function(data,config){for(var n=0;n<config.length;n++){if(angular.isDefined(config[n].config))continue;var nesting=config[n],parts=nesting.path.split("[]"),i=0,c={},cProto={path:"",isArray:false,type:nesting.type,action:nesting.action,inject:nesting.inject,nested:angular.isDefined(nesting.nested)?nesting.nested:[],aliases:angular.isDefined(nesting.aliases)?nesting.aliases:[]};config[n].config=[];if(angular.isArray(data)){c=angular.copy(cProto,
{});c.path="";c.isArray=true;config[n].config.push(c)}for(i=0;i<parts.length;i++){c=angular.copy(cProto,{});c.path=parts[i];c.isArray=false;if(c.path=="")continue;if(angular.isDefined(parts[i+1]))c.isArray=true;c.path=c.path.replace(/^\.+/g,"");config[n].config.push(c)}}return true},populateNestingEndpoints:function(data,nestConfig,nestPath,configIndex){var nestedData=null,endpoint="",resource=null,data_i=0,nestingParams={},nestingActions={},nestingAction="query",nestingInject="",defer=$q.defer(),
promises=[];if(angular.isUndefined(configIndex))configIndex=0;if(angular.isUndefined(nestConfig[configIndex]))return promises;nestingAction=nestConfig[configIndex].action;nestingInject=nestConfig[configIndex].inject;if(angular.isUndefined(nestPath))nestPath="";if(nestConfig[configIndex].isArray){nestPath=nestPath+(nestPath==""?"":".")+nestConfig[configIndex].path;nestedData=pri.getObjValue(data,nestPath);for(data_i=0;data_i<nestedData.length;data_i++){var path=nestPath+"["+data_i+"]";promises=promises.concat(pri.populateNestingEndpoints(data,
nestConfig,path,configIndex+1))}}else{var path=(nestPath==""?"":nestPath+".")+nestConfig[configIndex].path;endpoint=pri.getObjValue(data,path);if(angular.isString(endpoint)){if(nestingAction=="jsonp")angular.extend(nestingParams,{callback:"JSON_CALLBACK"});angular.extend(nestingActions,ns.actions);resource=$resource(endpoint,nestingParams,nestingActions);var nestedResults=resource[nestingAction](function(){pri.doNesting(nestedResults,nestConfig[configIndex].nested).then(function(){pri.setObjValue(data,
nestPath+"."+nestingInject,nestedResults);pri.doAliasing(data,"object",nestConfig[configIndex].aliases,nestPath);defer.resolve(data)})},function(){defer.resolve()});promises.push(defer.promise)}}return promises},doAliasing:function(data,type,aliases,basePath){if(angular.isDefined(aliases)&&angular.isArray(aliases))for(var i=0;i<aliases.length;i++)if(angular.isDefined(aliases[i].src)&&angular.isDefined(aliases[i].dest)){var srcPath=(angular.isDefined(basePath)?basePath+".":"")+aliases[i].src,destPath=
(angular.isDefined(basePath)?basePath+".":"")+aliases[i].dest;if(type=="array")for(var x=0;x<data.length;x++)pri.setObjValue(data[x],destPath,pri.getObjValue(data[x],srcPath));else pri.setObjValue(data,destPath,pri.getObjValue(data,srcPath))}},setCache:function(model){var id=pri.serializeURI();if(angular.isUndefined(ns.cache[model]))ns.cache[model]={};if(angular.isUndefined(ns.cache[model][id]))ns.cache[model][id]={};angular.extend(ns.cache[model][id],pub.value(null,model))},restoreCache:function(model){var id=
pri.serializeURI();if(angular.isDefined(ns.cache[model][id]))pub.set(null,model,ns.cache[model][id],"replace")},useCache:function(model){if(angular.isUndefined(ns.config[model].cache)||!ns.config[model].cache||angular.isUndefined(ns.cache[model]))return false;var id=pri.serializeURI();if(angular.isDefined(ns.cache[model][id]))return true;return false},serializeURI:function(){var params=$location.search(),serial=[],keys=pri._keys(params).sort(),i=0;serial.push('"'+$location.path()+'"');for(i=0;i<keys.length;i++)serial.push('"'+
keys[i]+"="+params[keys[i]]+'"');return serial.join(",")},getObjValue:function(obj,p){if(p==""){if(angular.isArray(obj))return obj.slice();return $.extend(true,{},obj)}var val=null,path=p.split("."),i=0,node="",index=0,patt=/\[(.*)\]$/;if(angular.isArray(obj))val=obj.slice();else val=$.extend(true,{},obj);for(i=0;i<path.length;i++){node=path[i];if(node.indexOf("[")>-1){index=parseInt(node.match(patt)[1]);node=node.replace(patt,"");if(node=="")val=val[index];else val=val[node][index]}else if(node!=
""&&angular.isDefined(val[node]))val=val[node]}return val},setObjValue:function(obj,p,value){if(p==""){if(angular.isArray(obj)&&angular.isArray(value))obj=value.slice();else if(angular.isObject(obj)&&angular.isObject(value))$.extend(true,obj,value);else obj=value;return}var path=p.split("."),i=0,node="",index=0,patt=/\[(.*)\]$/;for(i=0;i<path.length;i++){node=path[i];if(node.indexOf("[")>-1){index=parseInt(node.match(patt)[1]);node=node.replace(patt,"");if(node==""){if(i==path.length-1){obj[index]=
value;break}obj=obj[index]}else{if(node in obj===false){obj[node]=[];obj[node][index]={}}if(i==path.length-1){obj[node][index]=value;break}obj=obj[node][index]}}else if(node!=""){if(node in obj===false)obj[node]={};if(i==path.length-1){obj[node]=value;break}obj=obj[node]}}},_keys:Object.keys||function(obj){if(obj!==Object(obj))throw new TypeError("Invalid object");var keys=[];for(var key in obj)if(hasOwnProperty.call(obj,key))keys[keys.length]=key;return keys}};pri.prepopulateData();var service={};
service.addModel=angular.bind(service,pub.addModel,null);service.set=angular.bind(service,pub.set,null);service.update=angular.bind(service,pub.update,null);service.value=angular.bind(service,pub.value,null);service.append=angular.bind(service,pub.append,null);service.clearCache=angular.bind(service,pub.clearCache,null);service.clear=angular.bind(service,pub.clear,null);service.startIntervalUpdate=angular.bind(service,pub.startIntervalUpdate,null);service.stopIntervalUpdate=angular.bind(service,pub.stopIntervalUpdate,
null);service.save=angular.bind(service,pub.save,null);service.remove=angular.bind(service,pub.remove,null);return service}]});