From aa6388d8b05864d8187b1449a16a4c32cbcac3b5 Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Sat, 28 Jan 2017 23:16:22 -0600 Subject: [PATCH] handle local deletion relationships --- .../javascripts/app/frontend/models/api/item.js | 4 ++++ .../javascripts/app/frontend/models/app/note.js | 7 +++++++ .../javascripts/app/frontend/models/app/tag.js | 7 +++++++ .../javascripts/app/services/modelManager.js | 16 ++++++---------- .../javascripts/app/services/syncManager.js | 6 ------ app/assets/templates/frontend/notes.html.haml | 2 +- 6 files changed, 25 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/app/frontend/models/api/item.js b/app/assets/javascripts/app/frontend/models/api/item.js index b87e66c8d..0409580eb 100644 --- a/app/assets/javascripts/app/frontend/models/api/item.js +++ b/app/assets/javascripts/app/frontend/models/api/item.js @@ -107,6 +107,10 @@ class Item { // must override } + isBeingRemovedLocally() { + + } + removeAllRelationships() { // must override this.setDirty(true); diff --git a/app/assets/javascripts/app/frontend/models/app/note.js b/app/assets/javascripts/app/frontend/models/app/note.js index 31d27cf80..b7b4a6c06 100644 --- a/app/assets/javascripts/app/frontend/models/app/note.js +++ b/app/assets/javascripts/app/frontend/models/app/note.js @@ -56,6 +56,13 @@ class Note extends Item { this.tags = []; } + isBeingRemovedLocally() { + this.tags.forEach(function(tag){ + _.pull(tag.notes, this); + }.bind(this)) + super.isBeingRemovedLocally(); + } + static filterDummyNotes(notes) { var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null}); return filtered; diff --git a/app/assets/javascripts/app/frontend/models/app/tag.js b/app/assets/javascripts/app/frontend/models/app/tag.js index f94c2eba4..f8361ca5a 100644 --- a/app/assets/javascripts/app/frontend/models/app/tag.js +++ b/app/assets/javascripts/app/frontend/models/app/tag.js @@ -55,6 +55,13 @@ class Tag extends Item { this.notes = []; } + isBeingRemovedLocally() { + this.notes.forEach(function(note){ + _.pull(note.tags, this); + }.bind(this)) + super.isBeingRemovedLocally(); + } + get content_type() { return "Tag"; } diff --git a/app/assets/javascripts/app/services/modelManager.js b/app/assets/javascripts/app/services/modelManager.js index b919c2712..e07cd0893 100644 --- a/app/assets/javascripts/app/services/modelManager.js +++ b/app/assets/javascripts/app/services/modelManager.js @@ -76,7 +76,6 @@ class ModelManager { this.notifySyncObserversOfModels(models); - // this.sortItems(); return models; } @@ -133,7 +132,9 @@ class ModelManager { } } else if(item.content_type == "Note") { if(!_.find(this.notes, {uuid: item.uuid})) { - this.notes.unshift(item); + this.notes.splice(_.sortedLastIndexBy(this.notes, item, function(item){ + return -item.created_at; + }), 0, item); } } else if(item.content_type == "Extension") { if(!_.find(this._extensions, {uuid: item.uuid})) { @@ -170,14 +171,6 @@ class ModelManager { } } - sortItems() { - Item.sortItemsByDate(this.notes); - - this.tags.forEach(function(tag){ - Item.sortItemsByDate(tag.notes); - }) - } - addItemSyncObserver(id, type, callback) { this.itemSyncObservers.push({id: id, type: type, callback: callback}); } @@ -223,10 +216,13 @@ class ModelManager { removeItemLocally(item) { _.pull(this.items, item); + item.isBeingRemovedLocally(); + if(item.content_type == "Tag") { _.pull(this.tags, item); } else if(item.content_type == "Note") { _.pull(this.notes, item); + } else if(item.content_type == "Extension") { _.pull(this._extensions, item); } diff --git a/app/assets/javascripts/app/services/syncManager.js b/app/assets/javascripts/app/services/syncManager.js index 035d69247..b774cf615 100644 --- a/app/assets/javascripts/app/services/syncManager.js +++ b/app/assets/javascripts/app/services/syncManager.js @@ -107,8 +107,6 @@ class SyncManager { var allDirtyItems = this.modelManager.getDirtyItems(); - console.log("Syncing dirty items", allDirtyItems); - // we want to write all dirty items to disk only if the user is offline, or if the sync op fails // if the sync op succeeds, these items will be written to disk by handling the "saved_items" response from the server if(this.authManager.offline()) { @@ -147,11 +145,7 @@ class SyncManager { request.sync_token = this.syncToken; request.cursor_token = this.cursorToken; - console.log("Syncing with token", request.sync_token, request.cursor_token); - request.post().then(function(response) { - console.log("Sync completion", response.plain()); - this.modelManager.clearDirtyItems(subItems); this.syncStatus.error = null; diff --git a/app/assets/templates/frontend/notes.html.haml b/app/assets/templates/frontend/notes.html.haml index a185c4b90..28fb4654b 100644 --- a/app/assets/templates/frontend/notes.html.haml +++ b/app/assets/templates/frontend/notes.html.haml @@ -20,7 +20,7 @@ %div{"infinite-scroll" => "ctrl.paginate()", "can-load" => "true", "threshold" => "200"} .note{"ng-repeat" => "note in ctrl.tag.notes | limitTo:ctrl.notesToDisplay | filter: ctrl.filterNotes", - "ng-click" => "ctrl.selectNote(note)"} + "ng-click" => "ctrl.selectNote(note)", "ng-class" => "{'selected' : ctrl.selectedNote == note}"} .name{"ng-if" => "note.title"} {{note.title}} .note-preview