UNPKG

hyphen-js

Version:

Hyphen Js - Generic Angular application data layer

6 lines 8.09 kB
/** * Hyphen Js - Generic Angular application data layer * @version v2.0.4 - 2018-01-29 * @link * @author Blazej Grzelinski * @license MIT License, http://www.opensource.org/licenses/MIT */var jsHyphen=angular.module("jsHyphen",[]);jsHyphen.provider("Hyphen",[function(){var a={},b={};return a.initialize=function(){},a.$get=["$rootScope","$http","$q","$injector","$timeout","HyphenDataProvider","HyphenAPI","HyphenCache",function(a,c,d,e,f,g,h,i){var j={};return b=j,j.initialize=function(a){this.configuration=a,_(a.model).each(function(b,c,d){b.name=c,j[b.name]={},j[b.name].provider=new g(j,b,a)}),_(a.model).each(function(b,c,d){b.name=c,j[b.name].api=new h(j,b,a)})},j.dispose=function(){_(this.configuration.model).forEach(function(a){j[a.name].provider.clearData()}),i.clearCache()},j}],a}]),jsHyphen.factory("HyphenAPI",["ApiCallFactory","$injector","$q",function(a,b,c){var d=function(b,d,e){this.hyphen=b,this.loading=0,this.modelConfiguration=d,this.globalConfiguration=e;var f=this;_(d.rest).each(function(g){var h=this,i=new a(g,e,d.name);this[g.name]=function(a,d){var e=c.defer();e.promise.save=function(a,c){return e.promise.then(function(d){a||(a=f.modelConfiguration.model);var e=d.data;c&&(e=d.data[c]),b[f.modelConfiguration.name].provider.addData(e,a)}),e.promise},e.promise["delete"]=function(a,c){return e.promise.then(function(d){a||(a=f.modelConfiguration.model);var e=d.data;c&&(e=d.data[c]),b[f.modelConfiguration.name].provider.deleteData(e,a)}),e.promise};var j=i.getApiCall(a,d);return h[g.name].loading++,h.loading++,h[g.name].loaded=!1,j.then(function(a){h[g.name].loading--,h.loading--,h[g.name].loaded=!0,e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),e.promise},h[g.name].loading=0},this)};return d}]),jsHyphen.factory("ApiCallFactory",["HyphenPost","HyphenGet","HyphenPut","HyphenDelete","HyphenFilePost","$q","HyphenCache",function(a,b,c,d,e,f,g){var h=function(f,g,h){switch(this.apiCallConfiguration=f,this.modelName=h,f.method){case"get":this.callType=b;break;case"post":this.callType=a;break;case"put":this.callType=c;break;case"delete":this.callType=d;break;case"filePost":this.callType=e}this.apiCall=new this.callType(f,g)};return h.prototype.getApiCall=function(a,b){var c=this.apiCallConfiguration.name+this.modelName+JSON.stringify(a);return g.isCached(c)?f.resolve({data:{cached:!0}}):(this.apiCallConfiguration.cache&&"get"===this.apiCallConfiguration.method&&g.addUrl(c),this.apiCall.invoke.call(this.apiCall,a,b))},h}]),jsHyphen.factory("HyphenCache",[function(){var a={};return this.addUrl=function(b){a[b]=!0},this.isCached=function(b){return a[b]},this.clearCache=function(){a={}},this}]),jsHyphen.factory("HyphenDataProvider",["$rootScope","$injector",function(a,b){var c={},d=function(a,d,e){if(this.modelConfiguration=d,c=a,this.globalConfiguration=e,this.clearData(),!b.has(d.model))throw new Error("Model not defined for: "+d.model);this.modelClass=b.get(d.model);var f=this;f.modelClass.indexes&&Object.keys(f.modelClass.indexes).forEach(function(a){f["getBy"+f.modelClass.indexes[a]]=function(b){return f.getIndexedData(a,b)}}),f.modelClass.groups&&Object.keys(f.modelClass.groups).forEach(function(a){f["getGroupBy"+f.modelClass.groups[a]]=function(b){return f.getGroupedData(a,b)}})};return d.prototype.data=[],d.prototype.clearData=function(){this.data=[],this.clearIndexes()},d.prototype.clearIndexes=function(){this.indexedData={},this.groupedData={},this.sorted=!1},d.prototype.getIndexedData=function(a,b){return this.indexedData[a]||(this.indexedData[a]=_(this.getData()).indexBy(a)),this.indexedData[a][b]},d.prototype.getGroupedData=function(a,b){return this.groupedData[a]||(this.groupedData[a]=_(this.getData()).groupBy(a)),this.groupedData[a][b]?this.groupedData[a][b]:[]},d.prototype.where=function(a){var b="",c="";for(var d in a)b+=d+"|",c+=a[d]+"|";return this.groupedData[b]||(this.groupedData[b]=_(this.getData()).groupBy(function(b){var c="";for(var d in a)c+=b[d]+"|";return c})),this.groupedData[b][c]?this.groupedData[b][c]:[]},d.prototype.findOne=function(a){var b=this.where(a);return b.length>0?b[0]:null},d.prototype.getData=function(){var a=this;return a.modelClass.sort&&!a.sorted&&(this.data=this.data=_(this.data).sortBy(function(b){return a.modelClass.sort.desc?b[a.modelClass.sort.desc]?b[a.modelClass.sort.desc].toLowerCase():b[a.modelClass.sort.desc]:a.modelClass.sort.asc?b[a.modelClass.sort.asc]?b[a.modelClass.sort.asc].toLowerCase():b[a.modelClass.sort.asc]:void 0}),a.modelClass.sort.desc&&(this.data=this.data.reverse()),a.sorted=!0),this.data},d.prototype["delete"]=function(a){var b=this,c=a&&a[b.modelConfiguration.key]?a[b.modelConfiguration.key]:a;this.data=_(this.data).filter(function(a){return a[b.modelConfiguration.key]!==c})},d.prototype.save=function(a){var b=this,c=_(b.data).find(function(c){return c[b.modelConfiguration.key]===a[b.modelConfiguration.key]});if(c){var d=_.extend(new b.modelClass(a),a);b.data=_([d].concat(b.data)).uniq(!1,function(a){return a[b.modelConfiguration.key]})}else{var e=_.extend(new b.modelClass(a),a);b.data.push(e)}},d.prototype.addData=function(a,b){var d=this,e=null;e=b?this.globalConfiguration.model[b]:this.modelConfiguration;var a=Array.isArray(a)?a:[a];_(a).each(function(a){for(var b in e.embedObjects){var f=e.embedObjects[b];if(a[b]){var g=Array.isArray(a[b])?a[b]:[a[b]];d.addData(g,f),delete a[b]}}c[e.name].provider.save(a)}),c[e.name].provider.clearIndexes()},d.prototype.deleteData=function(a,b){var d=this;b?model=this.globalConfiguration.model[b]:model=this.modelConfiguration;var a=Array.isArray(a)?a:[a];_(a).each(function(a){for(var b in model.embedObjects){var e=model.embedObjects[b];if(a[b]){var f=Array.isArray(a[b])?a[b]:[a[b]];d.deleteData(f,e),delete a[b]}}c[model.name].provider["delete"](a)}),c[model.name].provider.clearIndexes()},d}]),jsHyphen.factory("HyphenCallBase",[function(){var a=function(a,b){this.httpOptions=a,this.hyphenConfiguration=b,this.config={}};a.prototype.urlParser=function(a,b){for(var c in b)a=a.replace(":"+c,b[c]);return a};var b=function(a,b){return a.match(b+"$")===b};return a.prototype.invoke=function(a,c){this.config=angular.copy(this.httpOptions);var d="";return b(this.hyphenConfiguration.baseUrl,"/")||(d=this.hyphenConfiguration.baseUrl),a?this.config.url=d+this.urlParser(this.httpOptions.url,a):this.config.url=d+this.httpOptions.url,this.config.data=c,this.hyphenConfiguration.requestInterceptor&&(this.config=this.hyphenConfiguration.requestInterceptor(this.config)),this.config.cache=!1,this.$http(this.config)},a}]),jsHyphen.factory("HyphenGet",["HyphenCallBase","$http",function(a,b){var c=function(c,d){a.call(this,c,d),this.$http=b};return c.prototype=Object.create(a.prototype),c}]),jsHyphen.factory("HyphenPost",["HyphenCallBase","$http",function(a,b){var c=function(c,d){a.call(this,c,d),this.$http=b};return c.prototype=Object.create(a.prototype),c}]),jsHyphen.factory("HyphenPut",["HyphenCallBase","$http",function(a,b){var c=function(c,d){a.call(this,c,d),this.$http=b};return c.prototype=Object.create(a.prototype),c}]),jsHyphen.factory("HyphenDelete",["HyphenCallBase","$http",function(a,b){var c=function(c,d){a.call(this,c,d),this.$http=b};return c.prototype=Object.create(a.prototype),c}]),jsHyphen.factory("HyphenFilePost",["HyphenCallBase","$http","$q",function(a,b,c){var d=function(b,d){a.call(this,b,d),this.httpOptions.method="POST",this.$http=function(a){var b=new XMLHttpRequest;b.open("POST",a.url,!0);var d=c.defer();return b.upload.addEventListener("progress",function(a){a.progress=Math.round(100*(a.loaded/a.total).toFixed(2)),d.notify(a)},!0),b.addEventListener("error",function(a){d.reject(a)},!0),b.addEventListener("abort",function(a){a.aborted=!0,d.reject(a)},!0),b.onreadystatechange=function(a){if((403==b.status||404==b.status||500==b.status||422==b.status)&&d.reject(a),4==b.readyState&&200==b.status){var a=JSON.parse(b.response);a.errors&&a.errors.file?d.reject(a):d.resolve({data:a})}},b.send(a.data),d.promise.abort=function(){b.abort()},d.promise}};return d.prototype=Object.create(a.prototype),d}]);