From 98e824b9e64f4671e9135f675aef538dad70227a Mon Sep 17 00:00:00 2001 From: Patrick Young Date: Wed, 13 Apr 2016 14:01:46 -0500 Subject: [PATCH] Adds update with PATCH feature. --- activeAngular.js | 38 +++-- activeAngular.min.js | 323 +------------------------------------------ 2 files changed, 34 insertions(+), 327 deletions(-) diff --git a/activeAngular.js b/activeAngular.js index 2445a8c..b45cf48 100644 --- a/activeAngular.js +++ b/activeAngular.js @@ -1,6 +1,6 @@ (function() { angular - .module('activeAngular', []); + .module('activeAngular', ["ngSanitize"]); })(); angular @@ -39,6 +39,7 @@ angular self.$get = $get; self.$query = $query; self.$save = $save; + self.$update = $update; self.$remove = $remove; self.$create = $create; self.$$http = $$http; @@ -145,7 +146,7 @@ angular var item = this; if (!options) { - return; + options = item; } if (options && !options.id) { @@ -162,6 +163,27 @@ angular }); } + function $update(options) { + var item = this; + + if (!options) { + return; + } + + if (options && !options.id) { + options.id = item.id; + } + + var oldCopy = angular.copy(item); + var savedChanges = _.extend(item, options); + self.$cache.set(savedChanges.id, savedChanges); + + return self.$$http('PATCH', options) + .catch(function() { + self.$cache.set(oldCopy.id, oldCopy); + }); + } + function $remove(options) { var item = this; @@ -250,12 +272,7 @@ angular } function _hydrateCollection(collection) { - var data = {}; - - _.forEach(collection[self._collectionKey], function(value, key) { - data[key] = value - }); - return data; + return collection[self._collectionKey]; } function _hideMetadata(ref, data) { @@ -533,6 +550,11 @@ angular value: instance.$save }); + Object.defineProperty(self, '$update', { + enumerable: false, + value: instance.$update + }); + Object.defineProperty(self, '$edge', { enumerable: false, value: instance.$edge diff --git a/activeAngular.min.js b/activeAngular.min.js index 710694f..0e11d7d 100644 --- a/activeAngular.min.js +++ b/activeAngular.min.js @@ -1,323 +1,8 @@ /** - * active-angular - ng-resource on steroids + * active-angular-dev - ng-resource on steroids * @authors - * @version v0.2.0 + * @version v0.2.1 * @link - * @license + * @license MIT */ -! function() { - angular.module("activeAngular", []) -}(), angular.module("activeAngular").constant("activeAngularConstant", { - NO_ID: "noId" - }), - function() { - function e() { - var e = "", - r = "items"; - this.setBaseUrl = function(r) { - e = r - }, this.setCollectionKey = function(e) { - r = e - }, this.$get = ["$http", "$log", "$httpParamSerializerJQLike", "activeAngularCache", "ActiveArray", "ActiveObject", "activeAngularConstant", "ActiveAngularUtilities", function(t, n, i, a, o, c, u, d) { - function l(l, f) { - function s(e, r) { - return r = r || "", e && (r = i(e) + r), $.call(this, e, r, !0) - } - - function v(e, r) { - var t = this; - this instanceof c && (r = this.id, t = T); - var n = t._edges[e], - i = n.model, - a = d.replaceUrlIdWithOptionsId(t.url, r); - return i.edgeUrl = a + "/" + d.removeIdParam(i.url), i - } - - function m(e, r) { - return $.call(this, e, r, !1) - } - - function $(e, r, t) { - var n = this; - e = d.stringToObject(e), e = d.undefinedToObject(e); - var i = P(n.edgeUrl || e.id) + P(e.url) + P(r); - i = _.toLower(i); - var a = n.$cache.get(i); - return a && !a.$isExpired ? (a.$deferPromise.resolve(a), a) : (a || (a = t ? o.decorateArray([], n) : new c({}, n)), n.$cache.set(i, a), g(e, a, t), a) - } - - function g(e, r, t) { - T.$$http("GET", e).then(function(e) { - var n = e.data; - T._formatResponse && (n = T._formatResponse(n)); - var i = angular.isArray(n); - if (i != t) { - if (!n[T._collectionKey]) return O(e, i); - r = j(r, n), n = E(n) - } - n = d.inheritActiveClass(n, T), i ? (_.forEach(n, function(e, r) { - n[r] = b(e) - }), n = T.$cache.setArray(n)) : n = b(n), _.assign(r, _.omit(n, "$promise", "$deferPromise")), _.forEach(r, function(e) { - e.$deferPromise && e.$deferPromise.resolve(e) - }), r.$deferPromise.resolve(r) - }) - } - - function h(e) { - var r = this; - if (e) { - e && !e.id && (e.id = r.id); - var t = angular.copy(r), - n = _.extend(r, e); - return T.$cache.set(n.id, n), T.$$http("PUT", e)["catch"](function() { - T.$cache.set(t.id, t) - }) - } - } - - function p(e) { - var r = this; - return e = d.stringToObject(e), e = d.undefinedToObject(e, r), T.$$http("DELETE", e).then(function(e) { - T.$cache.remove(e.data.id), r.$array || _.forOwn(r, function(e, t) { - delete r[t] - }) - }) - } - - function y(e) { - return T.$$http("POST", e).then(function(e) { - var r = e.data; - return r = d.inheritActiveClass(r, T), r = b(r) - }) - } - - function A(r, n) { - var a = this, - o = n.id, - c = n.url; - return a.edgeUrl && (c = a.edgeUrl, a.edgeUrl = ""), n = { - method: r, - url: c || a.url, - id: o, - data: _.omit(n, "id", "url") - }, n.id && n.id !== u.NO_ID || (n.url = d.removeIdParam(n.url), delete n.id), n.url = d.replaceUrlIdWithOptionsId(n.url, n.id), delete n.id, "GET" === n.method && Object.keys(n.data).length && (n.url += -1 == n.url.indexOf("?") ? "?" : "&", n.url += i(n.data)), n.url = e + "/" + n.url, t(n) - } - - function O(e, r) { - return r ? void n.error(e.config.url + " Expected an Object and got an Array from server.") : void n.error(e.config.url + " Expected an Array and got an Object from server with collection key " + T._collectionKey + " not set.") - } - - function b(e) { - return T.$hydrate ? (_.forEach(T.$hydrate, function(r, t) { - var n = T._edges; - if (n && n[t]) { - var i = n[t].model; - return void(e[t] = i.$edge.call(T, t, e.id).$query()) - } - e[t] = r.$get(e[t]) - }), e) : e - } - - function E(e) { - var r = {}; - return _.forEach(e[T._collectionKey], function(e, t) { - r[t] = e - }), r - } - - function j(e, r) { - return _.forEach(r, function(r, t) { - t !== T._collectionKey && Object.defineProperty(e, t, { - enumerable: !1, - value: r - }) - }), e - } - - function P(e) { - return e || "" - } - m.$inject = ["options", "reference"], f = f || {}; - var T = this; - T.url = l, T.edgeUrl = "", T.$cache = a.create(f), T.$hydrate = f.hydrate, T.$edge = v, T.$get = m, T.$query = s, T.$save = h, T.$remove = p, T.$create = y, T.$$http = A, T._formatResponse = f.formatResponse, T._collectionKey = f.collectionKey || r, T._edges = f.edges, T._get = $, T._hydrateCollection = E, T._hideMetadata = j, T._hydyrateData = b, T._logMismatchError = O - } - return l - }] - } - angular.module("activeAngular").provider("ActiveAngular", e) - }(), - function() { - angular.module("activeAngular").factory("activeAngularCache", function() { - function e(e) { - function r(e) { - var r = d[e]; - return f.isExpired(r) && (r.$isExpired = !0), r - } - - function t(e, r) { - return d[e] ? (d[e].$isExpired = !1, d[e] = f.setTimestamp(d[e]), d[e] = _.extend(d[e], r)) : (f.setTimestamp(r), f.setIsExpired(r), d[e] = r) - } - - function n(e) { - return _.forEach(e, function(r, t) { - e[t] = f.set(r.id, r) - }), e - } - - function i(e) { - var r = d; - delete r[e], f.findAndRemove(r, e) - } - - function a(e, r) { - _.forEach(e, function(t, n) { - angular.isArray(t) && _.forOwn(t, function(t, i) { - return t.id === r ? void delete e[n][i] : void 0 - }) - }) - } - - function o(e) { - if (!e) return !1; - var r = e.$timestamp; - if (!r) return !1; - var t = (new Date).getTime(); - return t - r > f.cachedTime - } - - function c(e) { - var r = (new Date).getTime(); - return angular.isDefined(e.$timestamp) || Object.defineProperty(e, "$timestamp", { - enumerable: !1, - get: function() { - return r - }, - set: function(e) { - r = e - } - }), e.$timestamp = r, e - } - - function u(e) { - var r = !1; - angular.isDefined(e.$isExpired) || Object.defineProperty(e, "$isExpired", { - enumerable: !1, - get: function() { - return r - }, - set: function(e) { - r = e - } - }) - } - var d = {}, - l = 3e5; - e && e.cacheTime && (l = e.cacheTime); - var f = { - get: r, - set: t, - setArray: n, - setTimestamp: c, - setIsExpired: u, - remove: i, - findAndRemove: a, - isExpired: o, - cached: d, - cachedTime: l - }; - return f - } - var r = { - create: e - }; - return r - }) - }(), - function() { - function e(e, r, t) { - function n(e, n) { - return angular.isArray(e) ? (e = t.decorateArray(e, n), _.forEach(e, function(t, i) { - e[i] = new r(t, n) - }), e) : new r(e, n) - } - - function i(e) { - return e = e.replace(":id", ""), e = e.replace("//", "/"), e = _.trimEnd(e, "/") - } - - function a(e, r) { - return e.indexOf(":id") > -1 && r && (e = e.replace(":id", r)), e - } - - function o(e) { - if (angular.isString(e)) { - var r = e; - e = {}, e.id = r - } - return e - } - - function c(r, t) { - if (angular.isUndefined(r)) { - r = {}; - var n = t ? t.id : e.NO_ID; - r.id = n - } - return r - } - var u = { - inheritActiveClass: n, - removeIdParam: i, - replaceUrlIdWithOptionsId: a, - stringToObject: o, - undefinedToObject: c - }; - return u - } - e.$inject = ["activeAngularConstant", "ActiveObject", "ActiveArray"], angular.module("activeAngular").factory("ActiveAngularUtilities", e) - }(), - function() { - angular.module("activeAngular").factory("ActiveArray", ["$q", function(e) { - function r(r, t) { - var n = e.defer(); - return r.$remove = function(e) { - t.$remove(e) - }, r.$create = function(e) { - t.$create(e) - }, r.$get = function(e, r) { - t.$get(e, r) - }, r.$promise = n.promise, r.$deferPromise = n, r - } - var t = { - decorateArray: r - }; - return t - }]) - }(), - function() { - angular.module("activeAngular").factory("ActiveObject", ["$q", function(e) { - function r(r, t) { - var n = this, - i = e.defer(); - _.forOwn(r, function(e, r) { - n[r] = e - }), Object.defineProperty(n, "$remove", { - enumerable: !1, - value: t.$remove - }), Object.defineProperty(n, "$save", { - enumerable: !1, - value: t.$save - }), Object.defineProperty(n, "$edge", { - enumerable: !1, - value: t.$edge - }), Object.defineProperty(n, "$promise", { - enumerable: !1, - value: i.promise - }), Object.defineProperty(n, "$deferPromise", { - enumerable: !1, - value: i - }) - } - return r - }]) - }(); +!function(){angular.module("activeAngular",["ngSanitize"])}(),angular.module("activeAngular").constant("activeAngularConstant",{NO_ID:"noId"}),function(){function e(){var e="",r="items";this.setBaseUrl=function(r){e=r},this.setCollectionKey=function(e){r=e},this.$get=["$http","$log","$httpParamSerializerJQLike","activeAngularCache","ActiveArray","ActiveObject","activeAngularConstant","ActiveAngularUtilities",function(t,n,i,a,c,o,u,d){function l(l,f){function s(e,r){return r=r||"",e&&(r=i(e)+r),$.call(this,e,r,!0)}function v(e,r){var t=this;this instanceof o&&(r=this.id,t=x);var n=t._edges[e],i=n.model,a=d.replaceUrlIdWithOptionsId(t.url,r);return i.edgeUrl=a+"/"+d.removeIdParam(i.url),i}function m(e,r){return $.call(this,e,r,!1)}function $(e,r,t){var n=this;e=d.stringToObject(e),e=d.undefinedToObject(e);var i=T(n.edgeUrl||e.id)+T(e.url)+T(r);i=_.toLower(i);var a=n.$cache.get(i);return a&&!a.$isExpired?(a.$deferPromise.resolve(a),a):(a||(a=t?c.decorateArray([],n):new o({},n)),n.$cache.set(i,a),g(e,a,t),a)}function g(e,r,t){x.$$http("GET",e).then(function(e){var n=e.data;x._formatResponse&&(n=x._formatResponse(n));var i=angular.isArray(n);if(i!=t){if(!n[x._collectionKey])return b(e,i);r=P(r,n),n=j(n)}n=d.inheritActiveClass(n,x),i?(_.forEach(n,function(e,r){n[r]=E(e)}),n=x.$cache.setArray(n)):n=E(n),_.assign(r,_.omit(n,"$promise","$deferPromise")),_.forEach(r,function(e){e.$deferPromise&&e.$deferPromise.resolve(e)}),r.$deferPromise.resolve(r)})}function h(e){var r=this;e||(e=r),e&&!e.id&&(e.id=r.id);var t=angular.copy(r),n=_.extend(r,e);return x.$cache.set(n.id,n),x.$$http("PUT",e)["catch"](function(){x.$cache.set(t.id,t)})}function p(e){var r=this;if(e){e&&!e.id&&(e.id=r.id);var t=angular.copy(r),n=_.extend(r,e);return x.$cache.set(n.id,n),x.$$http("PATCH",e)["catch"](function(){x.$cache.set(t.id,t)})}}function y(e){var r=this;return e=d.stringToObject(e),e=d.undefinedToObject(e,r),x.$$http("DELETE",e).then(function(e){x.$cache.remove(e.data.id),r.$array||_.forOwn(r,function(e,t){delete r[t]})})}function A(e){return x.$$http("POST",e).then(function(e){var r=e.data;return r=d.inheritActiveClass(r,x),r=E(r)})}function O(r,n){var a=this,c=n.id,o=n.url;return a.edgeUrl&&(o=a.edgeUrl,a.edgeUrl=""),n={method:r,url:o||a.url,id:c,data:_.omit(n,"id","url")},n.id&&n.id!==u.NO_ID||(n.url=d.removeIdParam(n.url),delete n.id),n.url=d.replaceUrlIdWithOptionsId(n.url,n.id),delete n.id,"GET"===n.method&&Object.keys(n.data).length&&(n.url+=-1==n.url.indexOf("?")?"?":"&",n.url+=i(n.data)),n.url=e+"/"+n.url,t(n)}function b(e,r){return r?void n.error(e.config.url+" Expected an Object and got an Array from server."):void n.error(e.config.url+" Expected an Array and got an Object from server with collection key "+x._collectionKey+" not set.")}function E(e){return x.$hydrate?(_.forEach(x.$hydrate,function(r,t){var n=x._edges;if(n&&n[t]){var i=n[t].model;return void(e[t]=i.$edge.call(x,t,e.id).$query())}e[t]=r.$get(e[t])}),e):e}function j(e){return e[x._collectionKey]}function P(e,r){return _.forEach(r,function(r,t){t!==x._collectionKey&&Object.defineProperty(e,t,{enumerable:!1,value:r})}),e}function T(e){return e||""}m.$inject=["options","reference"],f=f||{};var x=this;x.url=l,x.edgeUrl="",x.$cache=a.create(f),x.$hydrate=f.hydrate,x.$edge=v,x.$get=m,x.$query=s,x.$save=h,x.$update=p,x.$remove=y,x.$create=A,x.$$http=O,x._formatResponse=f.formatResponse,x._collectionKey=f.collectionKey||r,x._edges=f.edges,x._get=$,x._hydrateCollection=j,x._hideMetadata=P,x._hydyrateData=E,x._logMismatchError=b}return l}]}angular.module("activeAngular").provider("ActiveAngular",e)}(),function(){angular.module("activeAngular").factory("activeAngularCache",function(){function e(e){function r(e){var r=d[e];return f.isExpired(r)&&(r.$isExpired=!0),r}function t(e,r){return d[e]?(d[e].$isExpired=!1,d[e]=f.setTimestamp(d[e]),d[e]=_.extend(d[e],r)):(f.setTimestamp(r),f.setIsExpired(r),d[e]=r)}function n(e){return _.forEach(e,function(r,t){e[t]=f.set(r.id,r)}),e}function i(e){var r=d;delete r[e],f.findAndRemove(r,e)}function a(e,r){_.forEach(e,function(t,n){angular.isArray(t)&&_.forOwn(t,function(t,i){return t.id===r?void delete e[n][i]:void 0})})}function c(e){if(!e)return!1;var r=e.$timestamp;if(!r)return!1;var t=(new Date).getTime();return t-r>f.cachedTime}function o(e){var r=(new Date).getTime();return angular.isDefined(e.$timestamp)||Object.defineProperty(e,"$timestamp",{enumerable:!1,get:function(){return r},set:function(e){r=e}}),e.$timestamp=r,e}function u(e){var r=!1;angular.isDefined(e.$isExpired)||Object.defineProperty(e,"$isExpired",{enumerable:!1,get:function(){return r},set:function(e){r=e}})}var d={},l=3e5;e&&e.cacheTime&&(l=e.cacheTime);var f={get:r,set:t,setArray:n,setTimestamp:o,setIsExpired:u,remove:i,findAndRemove:a,isExpired:c,cached:d,cachedTime:l};return f}var r={create:e};return r})}(),function(){function e(e,r,t){function n(e,n){return angular.isArray(e)?(e=t.decorateArray(e,n),_.forEach(e,function(t,i){e[i]=new r(t,n)}),e):new r(e,n)}function i(e){return e=e.replace(":id",""),e=e.replace("//","/"),e=_.trimEnd(e,"/")}function a(e,r){return e.indexOf(":id")>-1&&r&&(e=e.replace(":id",r)),e}function c(e){if(angular.isString(e)){var r=e;e={},e.id=r}return e}function o(r,t){if(angular.isUndefined(r)){r={};var n=t?t.id:e.NO_ID;r.id=n}return r}var u={inheritActiveClass:n,removeIdParam:i,replaceUrlIdWithOptionsId:a,stringToObject:c,undefinedToObject:o};return u}e.$inject=["activeAngularConstant","ActiveObject","ActiveArray"],angular.module("activeAngular").factory("ActiveAngularUtilities",e)}(),function(){angular.module("activeAngular").factory("ActiveArray",["$q",function(e){function r(r,t){var n=e.defer();return r.$remove=function(e){t.$remove(e)},r.$create=function(e){t.$create(e)},r.$get=function(e,r){t.$get(e,r)},r.$promise=n.promise,r.$deferPromise=n,r}var t={decorateArray:r};return t}])}(),function(){angular.module("activeAngular").factory("ActiveObject",["$q",function(e){function r(r,t){var n=this,i=e.defer();_.forOwn(r,function(e,r){n[r]=e}),Object.defineProperty(n,"$remove",{enumerable:!1,value:t.$remove}),Object.defineProperty(n,"$save",{enumerable:!1,value:t.$save}),Object.defineProperty(n,"$update",{enumerable:!1,value:t.$update}),Object.defineProperty(n,"$edge",{enumerable:!1,value:t.$edge}),Object.defineProperty(n,"$promise",{enumerable:!1,value:i.promise}),Object.defineProperty(n,"$deferPromise",{enumerable:!1,value:i})}return r}])}();