diff --git a/chrome/content/zotero/integration/citationDialog.js b/chrome/content/zotero/integration/citationDialog.js
index b33c13d26f..da00a1545e 100644
--- a/chrome/content/zotero/integration/citationDialog.js
+++ b/chrome/content/zotero/integration/citationDialog.js
@@ -2079,19 +2079,19 @@ const CitationPreview = {
let prefShown = Zotero.Prefs.get("integration.citationPreviewShown");
let isCitingItems = DIALOG_STATE.isCitingItems();
let hasPreview = !!io.preview;
- let shouldShow = isCitingItems && prefShown && hasPreview;
- _id("citation-preview").hidden = !shouldShow;
let isEmpty = !CitationDataManager.items.length;
- _id("citation-preview-empty").hidden = !isEmpty;
- _id("citation-preview-content").hidden = isEmpty;
+ // The preview pane appears when citing at least one item and the caller has
+ // provided a preview function
+ let isRelevant = isCitingItems && hasPreview && !isEmpty;
+ _id("citation-preview").hidden = !(isRelevant && prefShown);
if (isEmpty) {
_id("citation-preview-content").innerHTML = "";
_id("citation-preview-error").hidden = true;
}
- // The toggle button only makes sense while citing items with a backing
- // preview function. It reflects the pref directly.
+ // The toggle button is hidden when there's no preview and is restored to its last
+ // state when the preview pane appears
let toggleBtn = _id("display-preview-button");
- toggleBtn.hidden = !(isCitingItems && hasPreview);
+ toggleBtn.hidden = !isRelevant;
toggleBtn.setAttribute("aria-pressed", prefShown ? "true" : "false");
if (!isEmpty) {
CitationPreview._renderDebounced();
diff --git a/chrome/content/zotero/integration/citationDialog.xhtml b/chrome/content/zotero/integration/citationDialog.xhtml
index e0eea906a5..6cd90058a6 100644
--- a/chrome/content/zotero/integration/citationDialog.xhtml
+++ b/chrome/content/zotero/integration/citationDialog.xhtml
@@ -111,7 +111,6 @@
diff --git a/chrome/locale/en-US/zotero/integration.ftl b/chrome/locale/en-US/zotero/integration.ftl
index 6980e84cf2..cd1142ae5c 100644
--- a/chrome/locale/en-US/zotero/integration.ftl
+++ b/chrome/locale/en-US/zotero/integration.ftl
@@ -50,7 +50,6 @@ integration-citationDialog-lib-message-annotations = { $search ->
*[other] No selected or open items with annotations
}
integration-citationDialog-settings-keepSorted = Keep sources sorted
-integration-citationDialog-preview-empty = Preview
integration-citationDialog-preview-error = Preview unavailable
integration-citationDialog-btn-displayPreview =
.title = Display citation preview
diff --git a/scss/components/_citationDialog.scss b/scss/components/_citationDialog.scss
index ac9bd26792..9abef5df43 100644
--- a/scss/components/_citationDialog.scss
+++ b/scss/components/_citationDialog.scss
@@ -587,7 +587,7 @@
font-size: 1.1rem;
}
- #citation-preview-empty, #citation-preview-error {
+ #citation-preview-error {
padding-top: 2px;
color: var(--fill-secondary);
font-family: $font-family-base;
diff --git a/test/tests/citationDialogTest.js b/test/tests/citationDialogTest.js
index 9ec08a2bcc..e7ae2f6f94 100644
--- a/test/tests/citationDialogTest.js
+++ b/test/tests/citationDialogTest.js
@@ -448,6 +448,24 @@ describe("Citation Dialog", function () {
assert.isTrue(dialog.document.getElementById("list-layout").hidden);
});
+ it("should show the citation preview only when the citation has items", async function () {
+ let prefWas = Zotero.Prefs.get("integration.citationPreviewShown");
+ Zotero.Prefs.set("integration.citationPreviewShown", true);
+ try {
+ IOManager.updateBubbleInput();
+ assert.isTrue(dialog.document.getElementById("citation-preview").hidden);
+ assert.isTrue(dialog.document.getElementById("display-preview-button").hidden);
+
+ let item = await createDataObject('item');
+ await IOManager.addItemsToCitation([item]);
+ assert.isFalse(dialog.document.getElementById("citation-preview").hidden);
+ assert.isFalse(dialog.document.getElementById("display-preview-button").hidden);
+ }
+ finally {
+ Zotero.Prefs.set("integration.citationPreviewShown", prefWas);
+ }
+ });
+
it("should highlight bubbles whose items are selected", async function () {
let itemOne = await createDataObject('item');
let itemTwo = await createDataObject('item');