diff --git a/chrome/content/zotero/xpcom/data/tags.js b/chrome/content/zotero/xpcom/data/tags.js index 59db23a3d..55250db05 100644 --- a/chrome/content/zotero/xpcom/data/tags.js +++ b/chrome/content/zotero/xpcom/data/tags.js @@ -235,6 +235,9 @@ Zotero.Tags = new function() { } var oldTagID = this.getID(oldName); + if (!oldTagID) { + throw new Error(`Tag '${oldName}' not found`); + } // We need to know if the old tag has a color assigned so that // we can assign it to the new name @@ -255,10 +258,12 @@ Zotero.Tags = new function() { + 'WHERE tagID=? AND itemID IN (' + placeholders + ')'; yield Zotero.DB.queryAsync(sql, [newTagID, oldTagID].concat(chunk)); - sql = 'UPDATE items SET clientDateModified=? ' + sql = 'UPDATE items SET clientDateModified=?, synced=0 ' + 'WHERE itemID IN (' + placeholders + ')' yield Zotero.DB.queryAsync(sql, [Zotero.DB.transactionDateTime].concat(chunk)); + chunk.forEach(id => Zotero.Items.get(id).updateSynced(false, true)); + yield Zotero.Items.reload(oldItemIDs, ['tags'], true); }) ); diff --git a/test/content/support.js b/test/content/support.js index 9f6f5dd40..05fddf8c8 100644 --- a/test/content/support.js +++ b/test/content/support.js @@ -414,6 +414,9 @@ function createUnsavedDataObject(objectType, params = {}) { if (params.collections !== undefined) { obj.setCollections(params.collections); } + if (params.tags !== undefined) { + obj.setTags(params.tags); + } break; case 'collection': diff --git a/test/tests/tagsTest.js b/test/tests/tagsTest.js index 46d7c340e..1bffdf670 100644 --- a/test/tests/tagsTest.js +++ b/test/tests/tagsTest.js @@ -25,6 +25,19 @@ describe("Zotero.Tags", function () { }) }) + describe("#rename()", function () { + it("should mark items as changed", function* () { + var item1 = yield createDataObject('item', { tags: [{ tag: "A" }], synced: true }); + var item2 = yield createDataObject('item', { tags: [{ tag: "A" }, { tag: "B" }], synced: true }); + var item3 = yield createDataObject('item', { tags: [{ tag: "B" }, { tag: "C" }], synced: true }); + + yield Zotero.Tags.rename(item1.libraryID, "A", "D"); + assert.isFalse(item1.synced); + assert.isFalse(item2.synced); + assert.isTrue(item3.synced); + }); + }); + describe("#removeFromLibrary()", function () { it("should reload tags of associated items", function* () { var libraryID = Zotero.Libraries.userLibraryID;