From ec5f08420c70425d1f364365b87e358a3d162d38 Mon Sep 17 00:00:00 2001 From: Marcus Bernales Date: Wed, 24 Jun 2015 21:51:45 +0000 Subject: [PATCH] Added ability to reset changes --- dist/dataloader.min.js | 169 +++++++++++++++++++++++------ lib/actions/DataActionGenerator.js | 3 +- lib/services/nsynchronizer.js | 6 +- lib/stores/LokiStore.js | 51 +++++++-- lib/stores/StaleCache.js | 38 +++++++ public/assets/js/dataloader.min.js | 169 +++++++++++++++++++++++------ 6 files changed, 356 insertions(+), 80 deletions(-) create mode 100755 lib/stores/StaleCache.js diff --git a/dist/dataloader.min.js b/dist/dataloader.min.js index b91386f..805d215 100755 --- a/dist/dataloader.min.js +++ b/dist/dataloader.min.js @@ -57,10 +57,10 @@ return /******/ (function(modules) { // webpackBootstrap 'use strict'; var Datasource = __webpack_require__(1); - var DependentDatasource = __webpack_require__(43); - var FilteredDatasource = __webpack_require__(44); - var Collection = __webpack_require__(45); - var ObjectTest = __webpack_require__(46); + var DependentDatasource = __webpack_require__(44); + var FilteredDatasource = __webpack_require__(45); + var Collection = __webpack_require__(46); + var ObjectTest = __webpack_require__(47); var DSManager = __webpack_require__(29); var uuid = __webpack_require__(33); // Exports components @@ -3480,21 +3480,21 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var Reflux = __webpack_require__(3); - var DataActionGenerator = __webpack_require__(34); - var nsync = __webpack_require__(35); - var client = __webpack_require__(36); + var DataActionGenerator = __webpack_require__(35); + var nsync = __webpack_require__(36); + var client = __webpack_require__(37); var storeTemplates = { // Shared/persistent stores are Loki shared: __webpack_require__(30), // Unique/ephemeral stores are Immutable - unique: __webpack_require__(39) + unique: __webpack_require__(40) }; var urlBuilders = { - 'default': __webpack_require__(41), - dependent: __webpack_require__(42) + 'default': __webpack_require__(42), + dependent: __webpack_require__(43) }; /** @@ -3753,6 +3753,7 @@ return /******/ (function(modules) { // webpackBootstrap var loki = __webpack_require__(31); var _ = __webpack_require__(27); var uuid = __webpack_require__(33); + var StaleCache = __webpack_require__(34); /** * @class LowkeySource * @description Manages Loki datasource @@ -3821,12 +3822,38 @@ return /******/ (function(modules) { // webpackBootstrap name: name, collection: collection, dynamicViews: {}, + staleCache: new StaleCache(options), /** * Initializes store */ init: function init() {}, + undoChanges: function undoChanges() { + var _this = this; + + var n = arguments[0] === undefined ? 1 : arguments[0]; + + var staleData = this.staleCache.getCollection(n); + var memoized = {}; + staleData.forEach(function (obj) { + var formatted = _.clone(obj); + + if (formatted.$type === "add") { + delete formatted.$type; + _this.destroy(formatted[idAttr], false); + } else { + delete formatted.$type; + _this.setObject(formatted); + } + }); + this.flushStale(); + }, + + flushStale: function flushStale() { + this.staleCache.flush(); + }, + /** * Adds an object to the store * @param {object} object Object to add @@ -3850,6 +3877,8 @@ return /******/ (function(modules) { // webpackBootstrap object[idAttr] = "temp" + uuid.v4(); } this.collection.insert(object); + + this.staleCache.push("add", object); this.trigger("add", object, trigger); } }, @@ -3860,16 +3889,17 @@ return /******/ (function(modules) { // webpackBootstrap * @return {event} Triggers event */ setCollection: function setCollection(collection) { - var _this = this; + var _this2 = this; _.map(collection, function (object) { - var stale = _this.getDatabaseEntity(object); + var stale = _this2.getDatabaseEntity(object); if (stale) { - _this.collection.update(_.extend(stale, object)); + _this2.collection.update(_.extend(stale, object)); } else { - _this.collection.insert(object); + _this2.collection.insert(object); } }); + this.staleCache.flush(); this.trigger("setCollection", this.getCollection()); }, @@ -3880,10 +3910,16 @@ return /******/ (function(modules) { // webpackBootstrap setObject: function setObject(object) { var stale = this.getDatabaseEntity(object); if (stale) { - this.update(object, false); + if (!object.$loki) { + object.$loki = stale.$loki; + object.meta = stale.meta; + } + this.collection.update(object); + this.trigger("update", object, false); } else { this.add(object, false); } + this.staleCache.flush(); }, /** @@ -3894,7 +3930,12 @@ return /******/ (function(modules) { // webpackBootstrap destroy: function destroy(id) { var trigger = arguments[1] === undefined ? true : arguments[1]; - this.collection.remove(this.get(id)); + var object = this.get(id); + + // @TODO: StaleCache should just listen for triggers + this.staleCache.push("destroy", object); + + this.collection.remove(object); this.trigger("destroy", id, trigger); }, @@ -3921,6 +3962,8 @@ return /******/ (function(modules) { // webpackBootstrap if (!stale) { console.warn("ProcoreReact: Trying to update an inexisting element."); } else { + /// @TODO: StaleCache should just listen for triggers + this.staleCache.push("update", stale); var updated = _.extend({}, stale, updates); this.collection.update(updated); this.trigger("update", updated, trigger); @@ -7969,6 +8012,65 @@ return /******/ (function(modules) { // webpackBootstrap 'use strict'; + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _ = __webpack_require__(27); + + var StaleCache = (function () { + function StaleCache(options) { + _classCallCheck(this, StaleCache); + + this.collection = []; + this.idAttr = options.idAttr; + } + + _createClass(StaleCache, [{ + key: 'getCollection', + value: function getCollection(n) { + var memoized = {}; + var idAttr = this.idAttr; + + // this.collection.reverse().forEach(obj=> { + // if (!memoized[obj[idAttr]]) { memoized[obj[idAttr]] = 1; } + // else if (memoized[obj[idAttr]] === n) { + // this.setObject(obj) + // } + // else { memoized[obj[idAttr]] += 1 } + // }); + + return this.collection.reverse(); + } + }, { + key: 'push', + value: function push($type, object) { + var formatted = _.extend({}, { $type: $type }, object); + this.collection.push(formatted); + } + }, { + key: 'pop', + value: function pop(object) { + this.collection = this.collection.without(object); + } + }, { + key: 'flush', + value: function flush() { + this.collection = []; + } + }]); + + return StaleCache; + })(); + + module.exports = StaleCache; + +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + var Reflux = __webpack_require__(3); var cached = {}; @@ -7982,7 +8084,7 @@ return /******/ (function(modules) { // webpackBootstrap return cached[resourceName]; } - var actions = Reflux.createActions(['add', 'update', 'destroy', 'filter', 'sort', 'search', 'registerView', 'resetView', 'reload', 'populate', 'destroyAll', 'setObject', 'setCollection']); + var actions = Reflux.createActions(['add', 'update', 'destroy', 'filter', 'sort', 'search', 'registerView', 'resetView', 'reload', 'populate', 'destroyAll', 'setObject', 'setCollection', 'undoChanges']); if (resourceName) { cached[resourceName] = actions; @@ -7994,7 +8096,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = DataActionGenerator; /***/ }, -/* 35 */ +/* 36 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -8095,6 +8197,7 @@ return /******/ (function(modules) { // webpackBootstrap this.client.update(object, this.serializer).then(function (responseObject) { _this3._updateSuccess(object, responseObject); + _this3.store.flushStale(); }).fail(function (err) { console.error(err); }); @@ -8114,6 +8217,7 @@ return /******/ (function(modules) { // webpackBootstrap this.client.destroy(id).then(function (result) { _this4.trigger('destroy', result); + _this4.store.flushStale(); }).fail(function (err) { console.error(err); }); @@ -8127,6 +8231,7 @@ return /******/ (function(modules) { // webpackBootstrap this.client.add(object, this.serializer).then(function (responseObject) { _this5.store.listenables.setObject(_.extend({}, object, responseObject)); + _this5.store.flushStale(); _this5.trigger('add', responseObject); }).fail(function (err) { console.error(err); @@ -8141,7 +8246,7 @@ return /******/ (function(modules) { // webpackBootstrap }; /***/ }, -/* 36 */ +/* 37 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -8150,9 +8255,9 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var q = __webpack_require__(37); + var q = __webpack_require__(38); var _ = __webpack_require__(27); - var reqwest = __webpack_require__(38); + var reqwest = __webpack_require__(39); /** * @class Client @@ -8349,7 +8454,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Client; /***/ }, -/* 37 */ +/* 38 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(process, setImmediate) {// vim:ts=4:sts=4:sw=4: @@ -10404,7 +10509,7 @@ return /******/ (function(modules) { // webpackBootstrap /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(12), __webpack_require__(11).setImmediate)) /***/ }, -/* 38 */ +/* 39 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -11025,7 +11130,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 39 */ +/* 40 */ /***/ function(module, exports, __webpack_require__) { /** @@ -11033,7 +11138,7 @@ return /******/ (function(modules) { // webpackBootstrap */ "use strict"; - var _require = __webpack_require__(40); + var _require = __webpack_require__(41); var List = _require.List; @@ -11140,7 +11245,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = generateStore; /***/ }, -/* 40 */ +/* 41 */ /***/ function(module, exports, __webpack_require__) { /** @@ -16072,7 +16177,7 @@ return /******/ (function(modules) { // webpackBootstrap })); /***/ }, -/* 41 */ +/* 42 */ /***/ function(module, exports) { "use strict"; @@ -16101,7 +16206,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = defaultUrlBuilder; /***/ }, -/* 42 */ +/* 43 */ /***/ function(module, exports) { "use strict"; @@ -16133,7 +16238,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = dependentUrlBuilder; /***/ }, -/* 43 */ +/* 44 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -16277,7 +16382,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = DependentDatasource; /***/ }, -/* 44 */ +/* 45 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -16501,7 +16606,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = FilteredDatasource; /***/ }, -/* 45 */ +/* 46 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -16599,7 +16704,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Collection; /***/ }, -/* 46 */ +/* 47 */ /***/ function(module, exports, __webpack_require__) { "use strict"; diff --git a/lib/actions/DataActionGenerator.js b/lib/actions/DataActionGenerator.js index e5e8146..985aed3 100755 --- a/lib/actions/DataActionGenerator.js +++ b/lib/actions/DataActionGenerator.js @@ -24,7 +24,8 @@ var DataActionGenerator = function(resourceName) { 'populate', 'destroyAll', 'setObject', - 'setCollection' + 'setCollection', + "undoChanges" ]); if (resourceName) { diff --git a/lib/services/nsynchronizer.js b/lib/services/nsynchronizer.js index 04fc47c..7fc9c36 100755 --- a/lib/services/nsynchronizer.js +++ b/lib/services/nsynchronizer.js @@ -94,7 +94,7 @@ var Nsynchronizer = { this.client.update(object, this.serializer) .then((responseObject) => { this._updateSuccess(object, responseObject); - this.store.flushChanges(); + this.store.flushStale(); }) .fail(err => { console.error(err); @@ -114,7 +114,7 @@ var Nsynchronizer = { this.client.destroy(id) .then((result) => { this.trigger("destroy", result); - this.store.flushChanges(); + this.store.flushStale(); }) .fail(err => { console.error(err); @@ -128,7 +128,7 @@ var Nsynchronizer = { this.client.add(object, this.serializer) .then((responseObject) => { this.store.listenables.setObject(_.extend({}, object, responseObject)); - this.store.flushChanges(); + this.store.flushStale(); this.trigger("add", responseObject); }) .fail(err => { diff --git a/lib/stores/LokiStore.js b/lib/stores/LokiStore.js index 70e3aaa..3d1d50b 100755 --- a/lib/stores/LokiStore.js +++ b/lib/stores/LokiStore.js @@ -6,6 +6,7 @@ var loki = require('lokijs'); var _ = require("underscore"); var uuid = require('../utils/uuid'); +var StaleCache = require('./StaleCache'); /** * @class LowkeySource * @description Manages Loki datasource @@ -61,6 +62,7 @@ function generateStore(options) { name: name, collection: collection, dynamicViews: {}, + staleCache: new StaleCache(options), /** * Initializes store @@ -68,16 +70,26 @@ function generateStore(options) { init() { }, - resetChanges() { - var changes = this.collection.getChanges(); - changes.forEach(change=> { - var {obj} = change; - this.setObject(obj); + undoChanges(n = 1) { + var staleData = this.staleCache.getCollection(n); + var memoized = {}; + staleData.forEach(obj=> { + var formatted = _.clone(obj); + + if (formatted.$type === "add") { + delete formatted.$type; + this.destroy(formatted[idAttr], false); + } + else { + delete formatted.$type; + this.setObject(formatted); + } }); + this.flushStale(); }, - flushChanges() { - this.collection.flushChanges(); + flushStale() { + this.staleCache.flush(); }, /** @@ -101,6 +113,8 @@ function generateStore(options) { object[idAttr] = `temp${uuid.v4()}`; } this.collection.insert(object); + + this.staleCache.push('add', object); this.trigger("add", object, trigger); } }, @@ -119,7 +133,7 @@ function generateStore(options) { this.collection.insert(object); } }); - this.flushChanges(); + this.staleCache.flush(); this.trigger("setCollection", this.getCollection()); }, @@ -130,11 +144,17 @@ function generateStore(options) { setObject(object) { var stale = this.getDatabaseEntity(object); if (stale) { - this.update(object, false); - }else{ + if (!object.$loki) { + object.$loki = stale.$loki; + object.meta = stale.meta; + } + this.collection.update(object); + this.trigger("update", object, false); + } + else{ this.add(object, false); } - this.flushChanges(); + this.staleCache.flush(); }, /** @@ -143,7 +163,12 @@ function generateStore(options) { * @return {event} Triggers event */ destroy(id, trigger=true) { - this.collection.remove(this.get(id)); + var object = this.get(id); + + // @TODO: StaleCache should just listen for triggers + this.staleCache.push('destroy', object); + + this.collection.remove(object); this.trigger("destroy", id, trigger); }, @@ -166,6 +191,8 @@ function generateStore(options) { if (!stale) { console.warn("ProcoreReact: Trying to update an inexisting element."); }else{ + /// @TODO: StaleCache should just listen for triggers + this.staleCache.push('update', stale); let updated = _.extend({}, stale, updates); this.collection.update(updated); this.trigger("update", updated, trigger); diff --git a/lib/stores/StaleCache.js b/lib/stores/StaleCache.js new file mode 100755 index 0000000..e55d882 --- /dev/null +++ b/lib/stores/StaleCache.js @@ -0,0 +1,38 @@ +var _ = require('underscore'); + +class StaleCache { + constructor(options) { + this.collection = []; + this.idAttr = options.idAttr; + } + + getCollection(n) { + var memoized = {}; + var idAttr = this.idAttr; + + // this.collection.reverse().forEach(obj=> { + // if (!memoized[obj[idAttr]]) { memoized[obj[idAttr]] = 1; } + // else if (memoized[obj[idAttr]] === n) { + // this.setObject(obj) + // } + // else { memoized[obj[idAttr]] += 1 } + // }); + + return this.collection.reverse(); + } + + push($type, object) { + var formatted = _.extend({}, {$type}, object); + this.collection.push(formatted); + } + + pop(object) { + this.collection = this.collection.without(object); + } + + flush() { + this.collection = []; + } +} + +module.exports = StaleCache; \ No newline at end of file diff --git a/public/assets/js/dataloader.min.js b/public/assets/js/dataloader.min.js index b91386f..805d215 100644 --- a/public/assets/js/dataloader.min.js +++ b/public/assets/js/dataloader.min.js @@ -57,10 +57,10 @@ return /******/ (function(modules) { // webpackBootstrap 'use strict'; var Datasource = __webpack_require__(1); - var DependentDatasource = __webpack_require__(43); - var FilteredDatasource = __webpack_require__(44); - var Collection = __webpack_require__(45); - var ObjectTest = __webpack_require__(46); + var DependentDatasource = __webpack_require__(44); + var FilteredDatasource = __webpack_require__(45); + var Collection = __webpack_require__(46); + var ObjectTest = __webpack_require__(47); var DSManager = __webpack_require__(29); var uuid = __webpack_require__(33); // Exports components @@ -3480,21 +3480,21 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var Reflux = __webpack_require__(3); - var DataActionGenerator = __webpack_require__(34); - var nsync = __webpack_require__(35); - var client = __webpack_require__(36); + var DataActionGenerator = __webpack_require__(35); + var nsync = __webpack_require__(36); + var client = __webpack_require__(37); var storeTemplates = { // Shared/persistent stores are Loki shared: __webpack_require__(30), // Unique/ephemeral stores are Immutable - unique: __webpack_require__(39) + unique: __webpack_require__(40) }; var urlBuilders = { - 'default': __webpack_require__(41), - dependent: __webpack_require__(42) + 'default': __webpack_require__(42), + dependent: __webpack_require__(43) }; /** @@ -3753,6 +3753,7 @@ return /******/ (function(modules) { // webpackBootstrap var loki = __webpack_require__(31); var _ = __webpack_require__(27); var uuid = __webpack_require__(33); + var StaleCache = __webpack_require__(34); /** * @class LowkeySource * @description Manages Loki datasource @@ -3821,12 +3822,38 @@ return /******/ (function(modules) { // webpackBootstrap name: name, collection: collection, dynamicViews: {}, + staleCache: new StaleCache(options), /** * Initializes store */ init: function init() {}, + undoChanges: function undoChanges() { + var _this = this; + + var n = arguments[0] === undefined ? 1 : arguments[0]; + + var staleData = this.staleCache.getCollection(n); + var memoized = {}; + staleData.forEach(function (obj) { + var formatted = _.clone(obj); + + if (formatted.$type === "add") { + delete formatted.$type; + _this.destroy(formatted[idAttr], false); + } else { + delete formatted.$type; + _this.setObject(formatted); + } + }); + this.flushStale(); + }, + + flushStale: function flushStale() { + this.staleCache.flush(); + }, + /** * Adds an object to the store * @param {object} object Object to add @@ -3850,6 +3877,8 @@ return /******/ (function(modules) { // webpackBootstrap object[idAttr] = "temp" + uuid.v4(); } this.collection.insert(object); + + this.staleCache.push("add", object); this.trigger("add", object, trigger); } }, @@ -3860,16 +3889,17 @@ return /******/ (function(modules) { // webpackBootstrap * @return {event} Triggers event */ setCollection: function setCollection(collection) { - var _this = this; + var _this2 = this; _.map(collection, function (object) { - var stale = _this.getDatabaseEntity(object); + var stale = _this2.getDatabaseEntity(object); if (stale) { - _this.collection.update(_.extend(stale, object)); + _this2.collection.update(_.extend(stale, object)); } else { - _this.collection.insert(object); + _this2.collection.insert(object); } }); + this.staleCache.flush(); this.trigger("setCollection", this.getCollection()); }, @@ -3880,10 +3910,16 @@ return /******/ (function(modules) { // webpackBootstrap setObject: function setObject(object) { var stale = this.getDatabaseEntity(object); if (stale) { - this.update(object, false); + if (!object.$loki) { + object.$loki = stale.$loki; + object.meta = stale.meta; + } + this.collection.update(object); + this.trigger("update", object, false); } else { this.add(object, false); } + this.staleCache.flush(); }, /** @@ -3894,7 +3930,12 @@ return /******/ (function(modules) { // webpackBootstrap destroy: function destroy(id) { var trigger = arguments[1] === undefined ? true : arguments[1]; - this.collection.remove(this.get(id)); + var object = this.get(id); + + // @TODO: StaleCache should just listen for triggers + this.staleCache.push("destroy", object); + + this.collection.remove(object); this.trigger("destroy", id, trigger); }, @@ -3921,6 +3962,8 @@ return /******/ (function(modules) { // webpackBootstrap if (!stale) { console.warn("ProcoreReact: Trying to update an inexisting element."); } else { + /// @TODO: StaleCache should just listen for triggers + this.staleCache.push("update", stale); var updated = _.extend({}, stale, updates); this.collection.update(updated); this.trigger("update", updated, trigger); @@ -7969,6 +8012,65 @@ return /******/ (function(modules) { // webpackBootstrap 'use strict'; + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _ = __webpack_require__(27); + + var StaleCache = (function () { + function StaleCache(options) { + _classCallCheck(this, StaleCache); + + this.collection = []; + this.idAttr = options.idAttr; + } + + _createClass(StaleCache, [{ + key: 'getCollection', + value: function getCollection(n) { + var memoized = {}; + var idAttr = this.idAttr; + + // this.collection.reverse().forEach(obj=> { + // if (!memoized[obj[idAttr]]) { memoized[obj[idAttr]] = 1; } + // else if (memoized[obj[idAttr]] === n) { + // this.setObject(obj) + // } + // else { memoized[obj[idAttr]] += 1 } + // }); + + return this.collection.reverse(); + } + }, { + key: 'push', + value: function push($type, object) { + var formatted = _.extend({}, { $type: $type }, object); + this.collection.push(formatted); + } + }, { + key: 'pop', + value: function pop(object) { + this.collection = this.collection.without(object); + } + }, { + key: 'flush', + value: function flush() { + this.collection = []; + } + }]); + + return StaleCache; + })(); + + module.exports = StaleCache; + +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + var Reflux = __webpack_require__(3); var cached = {}; @@ -7982,7 +8084,7 @@ return /******/ (function(modules) { // webpackBootstrap return cached[resourceName]; } - var actions = Reflux.createActions(['add', 'update', 'destroy', 'filter', 'sort', 'search', 'registerView', 'resetView', 'reload', 'populate', 'destroyAll', 'setObject', 'setCollection']); + var actions = Reflux.createActions(['add', 'update', 'destroy', 'filter', 'sort', 'search', 'registerView', 'resetView', 'reload', 'populate', 'destroyAll', 'setObject', 'setCollection', 'undoChanges']); if (resourceName) { cached[resourceName] = actions; @@ -7994,7 +8096,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = DataActionGenerator; /***/ }, -/* 35 */ +/* 36 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -8095,6 +8197,7 @@ return /******/ (function(modules) { // webpackBootstrap this.client.update(object, this.serializer).then(function (responseObject) { _this3._updateSuccess(object, responseObject); + _this3.store.flushStale(); }).fail(function (err) { console.error(err); }); @@ -8114,6 +8217,7 @@ return /******/ (function(modules) { // webpackBootstrap this.client.destroy(id).then(function (result) { _this4.trigger('destroy', result); + _this4.store.flushStale(); }).fail(function (err) { console.error(err); }); @@ -8127,6 +8231,7 @@ return /******/ (function(modules) { // webpackBootstrap this.client.add(object, this.serializer).then(function (responseObject) { _this5.store.listenables.setObject(_.extend({}, object, responseObject)); + _this5.store.flushStale(); _this5.trigger('add', responseObject); }).fail(function (err) { console.error(err); @@ -8141,7 +8246,7 @@ return /******/ (function(modules) { // webpackBootstrap }; /***/ }, -/* 36 */ +/* 37 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -8150,9 +8255,9 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var q = __webpack_require__(37); + var q = __webpack_require__(38); var _ = __webpack_require__(27); - var reqwest = __webpack_require__(38); + var reqwest = __webpack_require__(39); /** * @class Client @@ -8349,7 +8454,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Client; /***/ }, -/* 37 */ +/* 38 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(process, setImmediate) {// vim:ts=4:sts=4:sw=4: @@ -10404,7 +10509,7 @@ return /******/ (function(modules) { // webpackBootstrap /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(12), __webpack_require__(11).setImmediate)) /***/ }, -/* 38 */ +/* 39 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -11025,7 +11130,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 39 */ +/* 40 */ /***/ function(module, exports, __webpack_require__) { /** @@ -11033,7 +11138,7 @@ return /******/ (function(modules) { // webpackBootstrap */ "use strict"; - var _require = __webpack_require__(40); + var _require = __webpack_require__(41); var List = _require.List; @@ -11140,7 +11245,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = generateStore; /***/ }, -/* 40 */ +/* 41 */ /***/ function(module, exports, __webpack_require__) { /** @@ -16072,7 +16177,7 @@ return /******/ (function(modules) { // webpackBootstrap })); /***/ }, -/* 41 */ +/* 42 */ /***/ function(module, exports) { "use strict"; @@ -16101,7 +16206,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = defaultUrlBuilder; /***/ }, -/* 42 */ +/* 43 */ /***/ function(module, exports) { "use strict"; @@ -16133,7 +16238,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = dependentUrlBuilder; /***/ }, -/* 43 */ +/* 44 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -16277,7 +16382,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = DependentDatasource; /***/ }, -/* 44 */ +/* 45 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -16501,7 +16606,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = FilteredDatasource; /***/ }, -/* 45 */ +/* 46 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -16599,7 +16704,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = Collection; /***/ }, -/* 46 */ +/* 47 */ /***/ function(module, exports, __webpack_require__) { "use strict";