Deselect tags when deleted (regression from Reactification)

This commit is contained in:
Dan Stillman 2019-03-05 07:27:57 -05:00
parent 3a777dcf40
commit fc43514ff0
2 changed files with 58 additions and 20 deletions

View file

@ -74,17 +74,21 @@ Zotero.TagSelector = class TagSelectorContainer extends React.Component {
if (type == 'item' && (event == 'trash')) { if (type == 'item' && (event == 'trash')) {
return this.setState({tags: await this.getTags()}); return this.setState({tags: await this.getTags()});
} }
// If a selected tag no longer exists, deselect it // If a selected tag no longer exists, deselect it
if (type == 'item-tag') { if (type == 'tag' && (event == 'modify' || event == 'delete')) {
if (event == 'delete' || event == 'trash' || event == 'modify') { let changed = false;
for (let tag of this.selectedTags) { for (let id of ids) {
if (tag == extraData[ids[0]].old.tag) { let tag = extraData[id].old.tag;
this.selectedTags.delete(tag); if (this.selectedTags.has(tag)) {
} this.selectedTags.delete(tag);
changed = true;
} }
} }
return this.setState({tags: await this.getTags()}); if (changed && typeof(this.props.onSelection) === 'function') {
this.props.onSelection(this.selectedTags);
}
return;
} }
this.setState({tags: await this.getTags()}); this.setState({tags: await this.getTags()});

View file

@ -189,32 +189,36 @@ describe("Tag Selector", function () {
describe("#notify()", function () { describe("#notify()", function () {
it("should add a tag when added to an item in the library root", function* () { it("should add a tag when added to an item in the library root", async function () {
var promise; var promise;
if (collectionsView.selection.currentIndex != 0) { if (collectionsView.selection.currentIndex != 0) {
promise = waitForTagSelector(win); promise = waitForTagSelector(win);
yield collectionsView.selectLibrary(); await collectionsView.selectLibrary();
yield promise; await promise;
} }
// Add item with tag to library root // Add item with tag to library root
var item = createUnsavedDataObject('item'); promise = waitForTagSelector(win);
var item = await createDataObject('item');
await promise
var tagA = Zotero.Utilities.randomString();
var tagB = Zotero.Utilities.randomString();
item.setTags([ item.setTags([
{ {
tag: 'A' tag: tagA
}, },
{ {
tag: 'B', tag: tagB,
type: 1 type: 1
} }
]); ]);
promise = waitForTagSelector(win); promise = waitForTagSelector(win);
yield item.saveTx(); await item.saveTx();
yield promise; await promise;
// Tag selector should have at least one tag assert.includeMembers(getRegularTags(), [tagA, tagB]);
assert.isAbove(getRegularTags().length, 1);
}); });
it("should add a tag when an item is added in a collection", function* () { it("should add a tag when an item is added in a collection", function* () {
@ -394,7 +398,7 @@ describe("Tag Selector", function () {
yield item.saveTx(); yield item.saveTx();
yield promise; yield promise;
// Tag selector should show the new item's tag // Tag selector should show the new tag
assert.include(getRegularTags(), "A"); assert.include(getRegularTags(), "A");
// Remove tag from library // Remove tag from library
@ -404,8 +408,38 @@ describe("Tag Selector", function () {
yield tagSelector.openDeletePrompt(); yield tagSelector.openDeletePrompt();
yield promise; yield promise;
// Tag selector shouldn't show the deleted item's tag // Tag selector shouldn't show the deleted tag
assert.notInclude(getRegularTags(), "A"); assert.notInclude(getRegularTags(), "A");
});
it("should deselect a tag when deleted from a library", async function () {
var libraryID = Zotero.Libraries.userLibraryID;
await selectLibrary(win);
var promise = waitForTagSelector(win);
var item1 = await createDataObject('item', { tags: [{ tag: 'A' }] });
var item2 = await createDataObject('item', { tags: [{ tag: 'B' }] });
await promise;
tagSelector.handleTagSelected('A');
await waitForTagSelector(win);
// Tag selector should show the selected tag
assert.include(getRegularTags(), 'A');
// And not the unselected one
assert.notInclude(getRegularTags(), 'B');
// Remove tag from library
promise = waitForTagSelector(win);
await Zotero.Tags.removeFromLibrary(libraryID, Zotero.Tags.getID('A'));
await promise;
// Deleted tag should no longer be shown or selected
assert.notInclude(getRegularTags(), 'A');
assert.notInclude(Array.from(tagSelector.getTagSelection()), 'A');
// Other tags should be shown again
assert.include(getRegularTags(), 'B');
}) })
}) })