diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js index 3a78fa6ff1..bbf536a755 100644 --- a/chrome/content/zotero/zoteroPane.js +++ b/chrome/content/zotero/zoteroPane.js @@ -2358,6 +2358,31 @@ var ZoteroPane = new function () { }; + this.relateSelectedItems = async function () { + if (!this.canEdit()) { + this.displayCannotEditLibraryMessage(); + return; + } + + let selectedItems = this.getSelectedItems(); + let saveOptions = { + skipDateModifiedUpdate: true + }; + await Zotero.DB.executeTransaction(async () => { + for (let index1 = 0; index1 < selectedItems.length; index1++) { + for (let index2 = index1 + 1; index2 < selectedItems.length; index2++) { + let item1 = selectedItems[index1]; + let item2 = selectedItems[index2]; + item1.addRelatedItem(item2); + item2.addRelatedItem(item1); + await item1.save(saveOptions); + await item2.save(saveOptions); + } + } + }); + }; + + this.deleteSelectedCollection = function (deleteItems) { var collectionTreeRow = this.getCollectionTreeRow(); @@ -3664,6 +3689,7 @@ var ZoteroPane = new function () { 'moveToTrash', 'deleteFromLibrary', 'mergeItems', + 'relateItems', 'sep4', 'exportItems', 'createBib', @@ -3726,6 +3752,7 @@ var ZoteroPane = new function () { multiple = '.multiple'; var canMerge = true, + showRelate = true, canRelate = true, canIndex = true, canRecognize = true, canUnrecognize = true, @@ -3733,12 +3760,20 @@ var ZoteroPane = new function () { var canMarkRead = collectionTreeRow.isFeedsOrFeed(); var markUnread = true; - for (let i = 0; i < items.length; i++) { - let item = items[i]; + for (let item of items) { if (canMerge && (!item.isRegularItem() || item.isFeedItem || collectionTreeRow.isDuplicates())) { canMerge = false; } + if (showRelate) { + if (item.isFeedItem) { + showRelate = false; + } + else if (canRelate && items.every(otherItem => otherItem === item || otherItem.relatedItems.includes(item.key))) { + canRelate = false; + } + } + if (canIndex && !((await Zotero.Fulltext.canReindex(item)))) { canIndex = false; } @@ -3764,6 +3799,13 @@ var ZoteroPane = new function () { if (canMerge) { show.add(m.mergeItems); } + + if (showRelate) { + show.add(m.relateItems); + if (!canRelate) { + disable.add(m.relateItems); + } + } if (canIndex) { show.add(m.reindexItem); diff --git a/chrome/content/zotero/zoteroPane.xhtml b/chrome/content/zotero/zoteroPane.xhtml index 3f5003b73e..82b3096db0 100644 --- a/chrome/content/zotero/zoteroPane.xhtml +++ b/chrome/content/zotero/zoteroPane.xhtml @@ -986,6 +986,7 @@ + diff --git a/chrome/locale/en-US/zotero/zotero.ftl b/chrome/locale/en-US/zotero/zotero.ftl index 8e7410efcd..a8d6e71285 100644 --- a/chrome/locale/en-US/zotero/zotero.ftl +++ b/chrome/locale/en-US/zotero/zotero.ftl @@ -205,6 +205,8 @@ item-menu-add-url = .label = Web Link item-menu-change-parent-item = .label = Change Parent Item… +item-menu-relate-items = + .label = Relate Items view-online = View Online item-menu-option-view-online =