diff --git a/app/assets/javascripts/app/models/api/item.js b/app/assets/javascripts/app/models/api/item.js index caf061735..fe85f5504 100644 --- a/app/assets/javascripts/app/models/api/item.js +++ b/app/assets/javascripts/app/models/api/item.js @@ -55,6 +55,13 @@ class Item { } } + refreshContentObject() { + // Before an item can be duplicated or cloned, we must update this.content (if it is an object) with the object's + // current physical properties, because updateFromJSON, which is what all new items must go through, + // will call this.mapContentToLocalProperties(this.contentObject), which may have stale values if not explicitly updated. + + this.content = this.structureParams(); + } /* Allows the item to handle the case where the item is deleted and the content is null */ handleDeletedContent() { diff --git a/app/assets/javascripts/app/services/modelManager.js b/app/assets/javascripts/app/services/modelManager.js index 68d2a926c..3fc57cca4 100644 --- a/app/assets/javascripts/app/services/modelManager.js +++ b/app/assets/javascripts/app/services/modelManager.js @@ -44,7 +44,11 @@ class ModelManager { } alternateUUIDForItem(item, callback, removeOriginal) { - // 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) + // We need to clone this item and give it a new uuid, then delete item with old uuid from db (you can't modify uuid's in our indexeddb setup) + + // Collapse in memory properties to item's content object, as the new item will be created based on the content object, and not the physical properties. (like note.text or note.title) + item.refreshContentObject(); + var newItem = this.createItem(item); newItem.uuid = SFJS.crypto.generateUUID(); @@ -54,6 +58,7 @@ class ModelManager { this.informModelsOfUUIDChangeForItem(newItem, item.uuid, newItem.uuid); + console.log(item.uuid, "-->", newItem.uuid); var block = () => { @@ -261,7 +266,14 @@ class ModelManager { return item; } - createDuplicateItem(itemResponse, sourceItem) { + /* + Be sure itemResponse is a generic Javascript object, and not an Item. + An Item needs to collapse its properties into its content object before it can be duplicated. + Note: the reason we need this function is specificallty for the call to resolveReferencesForItem. + This method creates but does not add the item to the global inventory. It's used by syncManager + to check if this prospective duplicate item is identical to another item, including the references. + */ + createDuplicateItem(itemResponse) { var dup = this.createItem(itemResponse, true); this.resolveReferencesForItem(dup); return dup; diff --git a/app/assets/javascripts/app/services/syncManager.js b/app/assets/javascripts/app/services/syncManager.js index 18c515e07..28217d80b 100644 --- a/app/assets/javascripts/app/services/syncManager.js +++ b/app/assets/javascripts/app/services/syncManager.js @@ -475,7 +475,7 @@ class SyncManager { // We want a new uuid for the new item. Note that this won't neccessarily adjust references. itemResponse.uuid = null; - var dup = this.modelManager.createDuplicateItem(itemResponse, item); + var dup = this.modelManager.createDuplicateItem(itemResponse); if(!itemResponse.deleted && !item.isItemContentEqualWith(dup)) { this.modelManager.addItem(dup); dup.conflict_of = item.uuid;