From 1e0f200eedc1e9793f8ea1b37a9eb3187c416abf Mon Sep 17 00:00:00 2001 From: Macon Date: Sat, 16 Jan 2016 05:07:24 +0800 Subject: [PATCH 1/3] Card 563 - resend method request if no response --- firefox/data/js/vendor/ddp.js | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/firefox/data/js/vendor/ddp.js b/firefox/data/js/vendor/ddp.js index fe3002b..f819892 100644 --- a/firefox/data/js/vendor/ddp.js +++ b/firefox/data/js/vendor/ddp.js @@ -46,6 +46,10 @@ this._onUpdatedCallbacks = {}; this._events = {}; this._queue = []; + this._waitingMethodResultStack = { + minId: 0, + methods: {} + }; // Setup this.readyState = -1; this._reconnect_count = 0; @@ -70,6 +74,14 @@ var id = uniqueId(); this._onResultCallbacks[id] = onResult; this._onUpdatedCallbacks[id] = onUpdated; + if (this._waitingMethodResultStack.minId == 0) { + this._waitingMethodResultStack.minId = id; + } + this._waitingMethodResultStack.methods[id] = { + method: name, + params: params + }; + this._send({ msg: "method", id: id, @@ -164,6 +176,31 @@ }; DDP.prototype._on_result = function (data) { + delete this._waitingMethodResultStack.methods[data.id]; + // some method did not get response, we assume that those method were sent failed. + // and we resend the method here. + if (this._waitingMethodResultStack.minId > 0 && data.id > this._waitingMethodResultStack.minId) { + var methodInfo = null; + for (var methodId in this._waitingMethodResultStack.methods) { + if (methodId < data.id) { + methodInfo = this._waitingMethodResultStack.methods[methodId]; + this._send({ + msg: "method", + id: methodId, + method: methodInfo.method, + params: methodInfo.params + }); + // only re-try one time + delete this._waitingMethodResultStack.methods[methodId]; + } + } + } + var waitingMethodIds = Object.keys(this._waitingMethodResultStack.methods); + if (waitingMethodIds.length) { + this._waitingMethodResultStack.minId = Math.min.apply(null, waitingMethodIds); + } else { + this._waitingMethodResultStack.minId = 0; + } if (this._onResultCallbacks[data.id]) { this._onResultCallbacks[data.id](data.error, data.result); delete this._onResultCallbacks[data.id]; From 2e2cfdacded51b679d60f1660d656176ceac424b Mon Sep 17 00:00:00 2001 From: Macon Date: Mon, 18 Jan 2016 23:04:38 +0800 Subject: [PATCH 2/3] Card 563 - fixed: task options would be lost before the ext was notified internet was disconnected --- firefox/data/js/background/asteroid.js | 15 ++++++++++- .../data/js/background/reactive_controller.js | 22 ++++++++++++++- .../js/knotable-views/knotableView-init.js | 5 ---- firefox/data/js/knotable-views/knotes-view.js | 27 ++++++++++++++++--- 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/firefox/data/js/background/asteroid.js b/firefox/data/js/background/asteroid.js index 514afce..1e4252d 100644 --- a/firefox/data/js/background/asteroid.js +++ b/firefox/data/js/background/asteroid.js @@ -310,9 +310,22 @@ window.asteroid = (function(){ } updateOption.updated_date = Date.now(); console.log("updateList - ", updateOption); - knotes.update(options.knoteId, updateOption).local; + if (!options.knoteId && _.isNumber(options.order)) { + if (!asteroid.backupUpdateListStack[options.order]) { + asteroid.backupUpdateListStack[options.order] = {} + } + asteroid.backupUpdateListStack[options.order].title = options.title; + switch(options.case) { + case "updateItems": + asteroid.backupUpdateListStack[options.order].options = options.options; + break; + } + } + return knotes.update(options.knoteId, updateOption).local; }; + exports.backupUpdateListStack = {}; + exports.init(config.server); return exports; })(); diff --git a/firefox/data/js/background/reactive_controller.js b/firefox/data/js/background/reactive_controller.js index 7cef51e..be2b44d 100644 --- a/firefox/data/js/background/reactive_controller.js +++ b/firefox/data/js/background/reactive_controller.js @@ -6,6 +6,7 @@ window.reactiveController = (function(){ var exports = {}; + var knotes = null; @@ -19,7 +20,7 @@ window.reactiveController = (function(){ var initKnoteWatchers = function() { console.log('initWatchers'); - var knotes = asteroid.getCollection('knotes'); + knotes = asteroid.getCollection('knotes'); var knotesQuery = knotes.reactiveQuery({}); _watchKnotes(knotesQuery); _sendCachedKnotes(knotesQuery); @@ -47,6 +48,25 @@ window.reactiveController = (function(){ return knoteId.match(knote._id); }); + if (knote.type == 'checklist') { + var updateOption = asteroid.backupUpdateListStack[knote.order]; + var option; + if (!updateOption) { + for (var order in asteroid.backupUpdateListStack) { + option = asteroid.backupUpdateListStack[order]; + if (option.title == knote.title) { + updateOption = option; + delete asteroid.backupUpdateListStack[order]; + } + } + } + if (updateOption) { + console.log('[Update offline task] id: ', knote._id, ', title: ', knote.title); + delete asteroid.backupUpdateListStack[knote.order]; + knotes.update(knote._id, updateOption); + } + } + if (knoteId.match('__upd__') && knote){ _idOfKnoteToUpdate = knote._id; } else if (knoteId.match('__del__')){ diff --git a/firefox/data/js/knotable-views/knotableView-init.js b/firefox/data/js/knotable-views/knotableView-init.js index f982a28..0648d67 100644 --- a/firefox/data/js/knotable-views/knotableView-init.js +++ b/firefox/data/js/knotable-views/knotableView-init.js @@ -36,11 +36,6 @@ var _addKnoteOnView = function(knotesView, newKnote) { if(knote.get('type') == "checklist" && moment(knote.get('updated_date')).isBefore(newKnote.updated_date, 'second')){ console.log("#GC - _addKnoteOnView - updating checklist", knote.get('updated_date'), newKnote.updated_date); knote.set({title: newKnote.title, options: newKnote.options, order: newKnote.order, timestamp: newKnote.timestamp, updated_date: newKnote.updated_date}); - // if list is currently on active view, - // update the view - if (knotesView.activeKnote && knotesView.activeKnote.get('knoteId') == newKnote._id ){ - $('.list-knote[data-knoteid=' + newKnote._id + ']').click(); - } } // update the last sync time diff --git a/firefox/data/js/knotable-views/knotes-view.js b/firefox/data/js/knotable-views/knotes-view.js index a5e09f3..5e94cce 100644 --- a/firefox/data/js/knotable-views/knotes-view.js +++ b/firefox/data/js/knotable-views/knotes-view.js @@ -406,6 +406,8 @@ var KnotesView = Backbone.View.extend({ var oldOptions = KnoteHelper.getKnoteOptions(this.activeKnote.get('content')); var content = $("#knote-edit-area").html().trim(); + if (this.activeKnote.get('type') != 'knote') return; + if (options.title === oldOptions.title && options.htmlBody === oldOptions.htmlBody){ if (_.isFunction(callback)) { callback(false); @@ -521,9 +523,21 @@ var KnotesView = Backbone.View.extend({ onKnoteChanged: function(model, collection, idx) { var newContent = model.get('content'); var editArea = $('#knote-edit-area'); + var self = this; if (this.activeKnote == model) { - if (editArea.is(':visible') && newContent != editArea.html().trim()) { - editArea.html(newContent); + if (editArea.is(':visible')) { + if (newContent != editArea.html().trim()) { + editArea.html(newContent); + } + } else { + this.cleanAddingListArea(); + $('#knote-list-title').val(model.get('title')); + var options = model.get('options'); + if(typeof options != 'undefined') { + options.forEach(function(item, index){ + self.addListItemToUI(item.name, item.checked, item.voters[0]) + }) + } } } this._sortKnotesList(); @@ -898,14 +912,19 @@ var KnotesView = Backbone.View.extend({ updateListItem: function(){ - var options = KnoteHelper.getListData(); + var options = KnoteHelper.getListData(); + var knoteId = this.activeKnote.get('knoteId'); this.activeKnote.set({ 'title': options.title, 'options': options.options, 'updated_date': Date.now() }); - options.knoteId = this.activeKnote.get('knoteId'); options.case = "updateItems"; + options.knoteId = knoteId; + if (!knoteId) { + options.order = this.activeKnote.get('order'); + options.title = options.title; + } knoteClient.updateList(options); }, From 7e463dec8ce1900b4b1595f54ed01d2ddd25e5fd Mon Sep 17 00:00:00 2001 From: Macon Date: Wed, 20 Jan 2016 21:48:21 +0800 Subject: [PATCH 3/3] Card 563 - bug fixed: the last edit was not shown in offline mode --- firefox/data/js/background/reactive_controller.js | 14 +++++++++++++- firefox/data/js/knotable-views/knotes-view.js | 6 ------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/firefox/data/js/background/reactive_controller.js b/firefox/data/js/background/reactive_controller.js index be2b44d..fa0539c 100644 --- a/firefox/data/js/background/reactive_controller.js +++ b/firefox/data/js/background/reactive_controller.js @@ -30,7 +30,19 @@ window.reactiveController = (function(){ var _sendCachedKnotes = function(knotesQuery){ // send knotes from cache - _.each(knotesQuery.result, function(knote){ + var results = _.groupBy(knotesQuery.result, function(knote) { + return knote._id; + }); + _.each(_.values(results), function(knote){ + // if the knote was created in offline mode, there will be + // two knotes here: the newest knote and the backup knote + if (knote.length > 1) { + knote = _.max(knote, function(k) { + return k.updated_date; + }); + } else { + knote = knote[0]; + } if(!knote.archived){ _addedKnote(knote); } diff --git a/firefox/data/js/knotable-views/knotes-view.js b/firefox/data/js/knotable-views/knotes-view.js index 5e94cce..7da6669 100644 --- a/firefox/data/js/knotable-views/knotes-view.js +++ b/firefox/data/js/knotable-views/knotes-view.js @@ -495,12 +495,6 @@ var KnotesView = Backbone.View.extend({ return this; } - var id = model.get('knoteId') || model.get('_id'); - var $knote = $('.list-knote[data-knoteid=' + id + ']'); - if ($knote.length) { - return; - } - var knoteView = new KnoteView(model); knoteView = knoteView.render().$el;