diff --git a/chrome/content/zotero/xpcom/data/dataObject.js b/chrome/content/zotero/xpcom/data/dataObject.js index 4ab4ba805..010e1a9a0 100644 --- a/chrome/content/zotero/xpcom/data/dataObject.js +++ b/chrome/content/zotero/xpcom/data/dataObject.js @@ -575,6 +575,50 @@ Zotero.DataObject.prototype._initSave = Zotero.Promise.coroutine(function* (env) return true; }); +/** + * Delete object from database + */ +Zotero.DataObject.prototype.erase = Zotero.Promise.coroutine(function* () { + var env = {}; + + var proceed = yield this._eraseInit(env); + if (!proceed) return false; + + Zotero.debug('Deleting ' + this.objectType + ' ' + this.id); + + yield Zotero.DB.executeTransaction(function* () { + yield this._eraseData(env); + yield this._erasePreCommit(env); + }.bind(this)) + .catch(e => { + return this._eraseRecoverFromFailure(env); + }); + + return this._erasePostCommit(env); +}); + +Zotero.DataObject.prototype._eraseInit = function(env) { + if (!this.id) return Zotero.Promise.resolve(false); + + return Zotero.Promise.resolve(true); +}; + +Zotero.DataObject.prototype._eraseData = function(env) { + throw new Error("Zotero.DataObject.prototype._eraseData is an abstract method"); +}; + +Zotero.DataObject.prototype._erasePreCommit = function(env) { + return Zotero.Promise.resolve(); +}; + +Zotero.DataObject.prototype._erasePostCommit = function(env) { + return Zotero.Promise.resolve(); +}; + +Zotero.DataObject.prototype._eraseRecoverFromFailure = function(env) { + throw new Error("Zotero.DataObject.prototype._eraseRecoverFromFailure is an abstract method"); +}; + /** * Generates data object key * @return {String} key diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js index 5ea577abb..16e6435bc 100644 --- a/chrome/content/zotero/xpcom/data/item.js +++ b/chrome/content/zotero/xpcom/data/item.js @@ -3780,99 +3780,89 @@ Zotero.Item.prototype.copy = Zotero.Promise.coroutine(function* () { });; -/** - * Delete item from database and clear from Zotero.Items internal array - * - * Items.erase() should be used for multiple items - */ -Zotero.Item.prototype.erase = Zotero.Promise.coroutine(function* () { - if (!this.id) { - return false; +Zotero.Item.prototype._eraseInit = Zotero.Promise.coroutine(function* (env) { + var proceed = yield Zotero.Item._super.prototype._eraseInit.apply(this, arguments); + if (!proceed) return false; + + env.deletedItemNotifierData = {}; + env.deletedItemNotifierData[this.id] = { old: this.toJSON() }; + + return true; +}); + +Zotero.Item.prototype._eraseData = Zotero.Promise.coroutine(function* (env) { + // Remove item from parent collections + var parentCollectionIDs = this.collections; + if (parentCollectionIDs) { + for (var i=0; i