diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js index c90a1be65..c0a35b979 100644 --- a/chrome/content/zotero/xpcom/collectionTreeView.js +++ b/chrome/content/zotero/xpcom/collectionTreeView.js @@ -262,6 +262,7 @@ Zotero.CollectionTreeView.prototype.refresh = Zotero.Promise.coroutine(function* new Zotero.CollectionTreeRow('group', group), added++ ); + added += yield this._expandRow(newRows, added - 1); } } diff --git a/test/tests/collectionTreeViewTest.js b/test/tests/collectionTreeViewTest.js index f4b15dfe4..b1b05558c 100644 --- a/test/tests/collectionTreeViewTest.js +++ b/test/tests/collectionTreeViewTest.js @@ -37,6 +37,35 @@ describe("Zotero.CollectionTreeView", function() { assert.strictEqual(Zotero.Prefs.get('duplicateLibraries'), ""); assert.strictEqual(Zotero.Prefs.get('unfiledLibraries'), ""); }); + + it("should maintain open state of group", function* () { + var group1 = yield createGroup(); + var group2 = yield createGroup(); + var group1Row = cv.getRowIndexByID(group1.treeViewID); + var group2Row = cv.getRowIndexByID(group2.treeViewID); + + // Open group 1 and close group 2 + if (!cv.isContainerOpen(group1Row)) { + yield cv.toggleOpenState(group1Row); + } + if (cv.isContainerOpen(group2Row)) { + yield cv.toggleOpenState(group2Row); + } + // Don't wait for delayed save + cv._saveOpenStates(); + + group1Row = cv.getRowIndexByID(group1.treeViewID); + group2Row = cv.getRowIndexByID(group2.treeViewID); + + yield cv.refresh(); + + // Group rows shouldn't have changed + assert.equal(cv.getRowIndexByID(group1.treeViewID), group1Row); + assert.equal(cv.getRowIndexByID(group2.treeViewID), group2Row); + // Group open states shouldn't have changed + assert.isTrue(cv.isContainerOpen(group1Row)); + assert.isFalse(cv.isContainerOpen(group2Row)); + }); }); describe("collapse/expand", function () {