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 =