diff --git a/chrome/content/zotero/bindings/noteeditor.xml b/chrome/content/zotero/bindings/noteeditor.xml index 6925a2828..15fa5030d 100644 --- a/chrome/content/zotero/bindings/noteeditor.xml +++ b/chrome/content/zotero/bindings/noteeditor.xml @@ -416,6 +416,12 @@ var x = this.boxObject.screenX; var y = this.boxObject.screenY; this.id('tagsPopup').openPopupAtScreen(x, y, false); + + // If editable and no existing tags, open new empty row + var tagsBox = this.id('tags'); + if (tagsBox.mode == 'edit' && tagsBox.count == 0) { + this.id('tags').new(); + } ]]> diff --git a/chrome/content/zotero/bindings/tagsbox.xml b/chrome/content/zotero/bindings/tagsbox.xml index bfc7c0737..f94520355 100644 --- a/chrome/content/zotero/bindings/tagsbox.xml +++ b/chrome/content/zotero/bindings/tagsbox.xml @@ -82,6 +82,7 @@ return; } this._item = val; + this._lastTabIndex = false; this.reload(); ]]> @@ -95,13 +96,15 @@ if (this.item) { var tags = this.item.getTags(); - if (tags) { - for(var i = 0; i < tags.length; i++) - { - r = r + tags[i].tag + ", "; - } - r = r.substr(0,r.length-2); + + // Sort tags alphabetically + var collation = Zotero.getLocaleCollation(); + tags.sort((a, b) => collation.compareString(1, a.tag, b.tag)); + + for (let i = 0; i < tags.length; i++) { + r = r + tags[i].tag + ", "; } + r = r.substr(0,r.length-2); } return r; @@ -725,6 +728,14 @@ this.count) { + return; + } + var row = this.addDynamicRow(); row.firstChild.nextSibling.click(); return row; diff --git a/test/tests/noteeditorTest.js b/test/tests/noteeditorTest.js new file mode 100644 index 000000000..04ae3cde0 --- /dev/null +++ b/test/tests/noteeditorTest.js @@ -0,0 +1,54 @@ +"use strict"; + +describe("Note Editor", function () { + var win, zp; + + before(function* () { + win = yield loadZoteroPane(); + zp = win.ZoteroPane; + }); + + after(function () { + win.close(); + }); + + describe("Tags box", function () { + it("should open new row for editing if no tags", function* () { + var note = yield createDataObject('item', { itemType: 'note' }); + var noteEditor = win.document.getElementById('zotero-note-editor'); + var linksBox = noteEditor._id('links-box'); + linksBox.tagsClick(); + var tagsBox = linksBox.id('tagsPopup').firstChild; + var tagRows = tagsBox.id('tagRows'); + assert.equal(tagRows.childNodes.length, 1); + }); + + it("should only open one new row for editing", function* () { + var note = yield createDataObject('item', { itemType: 'note' }); + var noteEditor = win.document.getElementById('zotero-note-editor'); + var linksBox = noteEditor._id('links-box'); + linksBox.tagsClick(); + // Close and reopen + linksBox.id('tagsPopup').hidePopup(); + linksBox.tagsClick(); + + // Should still be only one empty row + var tagsBox = linksBox.id('tagsPopup').firstChild; + var tagRows = tagsBox.id('tagRows'); + assert.equal(tagRows.childNodes.length, 1); + }); + + it("should show tags in alphabetical order", function* () { + var note = new Zotero.Item('note'); + note.addTag('B'); + yield note.saveTx(); + note.addTag('A'); + note.addTag('C'); + yield note.saveTx(); + + var noteEditor = win.document.getElementById('zotero-note-editor'); + var linksBox = noteEditor._id('links-box'); + assert.equal(linksBox.id('tags').summary, "A, B, C"); + }); + }); +});