From 80c723b4002474807ee8c41e286048881fe7e00f Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Sat, 29 Apr 2017 12:24:44 -0500 Subject: [PATCH] fix import uuid change, export all items --- .../javascripts/app/frontend/models/api/item.js | 8 ++++++++ .../javascripts/app/frontend/models/app/editor.js | 7 +++++++ .../javascripts/app/frontend/models/app/note.js | 7 +++++++ .../javascripts/app/frontend/models/app/tag.js | 7 +++++++ .../app/services/directives/views/accountMenu.js | 2 +- app/assets/javascripts/app/services/modelManager.js | 12 ++++++++++++ 6 files changed, 42 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/app/frontend/models/api/item.js b/app/assets/javascripts/app/frontend/models/api/item.js index 4cc38b8fc..8520d9d08 100644 --- a/app/assets/javascripts/app/frontend/models/api/item.js +++ b/app/assets/javascripts/app/frontend/models/api/item.js @@ -121,6 +121,14 @@ class Item { _.merge(this, _.omit(item, ["content"])); } + informReferencesOfUUIDChange(oldUUID, newUUID) { + // optional override + } + + potentialItemOfInterestHasChangedItsUUID(newItem, oldUUID, newUUID) { + // optional override + } + allReferencedObjects() { // must override return []; diff --git a/app/assets/javascripts/app/frontend/models/app/editor.js b/app/assets/javascripts/app/frontend/models/app/editor.js index 74fc06868..0a38c20bc 100644 --- a/app/assets/javascripts/app/frontend/models/app/editor.js +++ b/app/assets/javascripts/app/frontend/models/app/editor.js @@ -66,6 +66,13 @@ class Editor extends Item { this.notes = []; } + potentialItemOfInterestHasChangedItsUUID(newItem, oldUUID, newUUID) { + if(newItem.content_type === "Note" && _.find(this.notes, {uuid: oldUUID})) { + _.pull(this.notes, {uuid: oldUUID}); + this.notes.push(newItem); + } + } + allReferencedObjects() { return this.notes; } diff --git a/app/assets/javascripts/app/frontend/models/app/note.js b/app/assets/javascripts/app/frontend/models/app/note.js index 58cd84292..4e0da8d2c 100644 --- a/app/assets/javascripts/app/frontend/models/app/note.js +++ b/app/assets/javascripts/app/frontend/models/app/note.js @@ -76,6 +76,13 @@ class Note extends Item { return filtered; } + informReferencesOfUUIDChange(oldUUID, newUUID) { + for(var tag of this.tags) { + _.pull(tag.notes, {uuid: oldUUID}); + tag.notes.push(this); + } + } + allReferencedObjects() { return this.tags; } diff --git a/app/assets/javascripts/app/frontend/models/app/tag.js b/app/assets/javascripts/app/frontend/models/app/tag.js index be36360c9..85b84c739 100644 --- a/app/assets/javascripts/app/frontend/models/app/tag.js +++ b/app/assets/javascripts/app/frontend/models/app/tag.js @@ -71,6 +71,13 @@ class Tag extends Item { super.isBeingRemovedLocally(); } + informReferencesOfUUIDChange(oldUUID, newUUID) { + for(var note of this.notes) { + _.pull(note.tags, {uuid: oldUUID}); + note.tags.push(this); + } + } + get content_type() { return "Tag"; } diff --git a/app/assets/javascripts/app/services/directives/views/accountMenu.js b/app/assets/javascripts/app/services/directives/views/accountMenu.js index a3c94ade4..a4e38408b 100644 --- a/app/assets/javascripts/app/services/directives/views/accountMenu.js +++ b/app/assets/javascripts/app/services/directives/views/accountMenu.js @@ -337,7 +337,7 @@ class AccountMenu { } $scope.itemsData = function(keys) { - var items = _.map(modelManager.allItemsMatchingTypes(["Tag", "Note"]), function(item){ + var items = _.map(modelManager.allItems, function(item){ var itemParams = new ItemParams(item, keys); return itemParams.paramsForExportFile(); }.bind(this)); diff --git a/app/assets/javascripts/app/services/modelManager.js b/app/assets/javascripts/app/services/modelManager.js index 128f2a2ac..a012cc205 100644 --- a/app/assets/javascripts/app/services/modelManager.js +++ b/app/assets/javascripts/app/services/modelManager.js @@ -27,6 +27,8 @@ class ModelManager { // we need to clone this item and give it a new uuid, then delete item with old uuid from db (you can't mofidy uuid's in our indexeddb setup) var newItem = this.createItem(item); newItem.uuid = Neeto.crypto.generateUUID(); + newItem.informReferencesOfUUIDChange(item.uuid, newItem.uuid); + this.informModelsOfUUIDChangeForItem(newItem, item.uuid, newItem.uuid); this.removeItemLocally(item, function(){ this.addItem(newItem); newItem.setDirty(true); @@ -35,6 +37,16 @@ class ModelManager { }.bind(this)); } + informModelsOfUUIDChangeForItem(newItem, oldUUID, newUUID) { + // some models that only have one-way relationships might be interested to hear that an item has changed its uuid + // for example, editors have a one way relationship with notes. When a note changes its UUID, it has no way to inform the editor + // to update its relationships + + for(var model of this.items) { + model.potentialItemOfInterestHasChangedItsUUID(newItem, oldUUID, newUUID); + } + } + allItemsMatchingTypes(contentTypes) { return this.items.filter(function(item){ return (_.includes(contentTypes, item.content_type) || _.includes(contentTypes, "*")) && !item.dummy;