Fix a few test failures/warnings
And simplify tree view load event handling, which may or may not have been contributing to intermittent test failures, but is cleaner this way regardless.
This commit is contained in:
parent
4f12c71e3e
commit
ef3bf8d596
6 changed files with 86 additions and 108 deletions
|
@ -909,7 +909,7 @@ Zotero.CollectionTreeView.prototype.selectLibrary = Zotero.Promise.coroutine(fun
|
|||
var row = this._rowMap['L' + libraryID];
|
||||
if (row !== undefined) {
|
||||
this._treebox.ensureRowIsVisible(row);
|
||||
this.selectWait(row);
|
||||
yield this.selectWait(row);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1621,7 +1621,9 @@ Zotero.CollectionTreeView.prototype.drop = Zotero.Promise.coroutine(function* (r
|
|||
yield linkedItem.loadCollections();
|
||||
linkedItem.setCollections();
|
||||
linkedItem.deleted = false;
|
||||
yield linkedItem.save();
|
||||
yield linkedItem.save({
|
||||
skipSelect: true
|
||||
});
|
||||
}
|
||||
return linkedItem.id;
|
||||
|
||||
|
@ -1691,7 +1693,9 @@ Zotero.CollectionTreeView.prototype.drop = Zotero.Promise.coroutine(function* (r
|
|||
}
|
||||
}
|
||||
|
||||
var newItemID = yield newItem.save();
|
||||
var newItemID = yield newItem.save({
|
||||
skipSelect: true
|
||||
});
|
||||
|
||||
// Record link
|
||||
yield newItem.addLinkedItem(item);
|
||||
|
@ -1710,7 +1714,9 @@ Zotero.CollectionTreeView.prototype.drop = Zotero.Promise.coroutine(function* (r
|
|||
for each(var note in notes) {
|
||||
let newNote = yield note.clone(targetLibraryID);
|
||||
newNote.parentID = newItemID;
|
||||
yield newNote.save()
|
||||
yield newNote.save({
|
||||
skipSelect: true
|
||||
})
|
||||
|
||||
yield newNote.addLinkedItem(note);
|
||||
}
|
||||
|
|
|
@ -528,14 +528,16 @@ Zotero.DataObject.prototype._addLinkedObject = Zotero.Promise.coroutine(function
|
|||
if (this.libraryID == userLibraryID || object.libraryID != userLibraryID) {
|
||||
this.addRelation(predicate, objectURI);
|
||||
yield this.save({
|
||||
skipDateModifiedUpdate: true
|
||||
skipDateModifiedUpdate: true,
|
||||
skipSelect: true
|
||||
});
|
||||
}
|
||||
else {
|
||||
yield object.loadRelations();
|
||||
object.addRelation(predicate, thisURI);
|
||||
yield object.save({
|
||||
skipDateModifiedUpdate: true
|
||||
skipDateModifiedUpdate: true,
|
||||
skipSelect: true
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ Zotero.LibraryTreeView.prototype = {
|
|||
if (event == 'load') {
|
||||
// If already initialized run now
|
||||
if (this._initialized) {
|
||||
listener();
|
||||
listener.call(this);
|
||||
}
|
||||
else {
|
||||
this._listeners[event].push(listener);
|
||||
|
@ -60,7 +60,7 @@ Zotero.LibraryTreeView.prototype = {
|
|||
if (!this._listeners[event]) return;
|
||||
var listener;
|
||||
while (listener = this._listeners[event].shift()) {
|
||||
yield Zotero.Promise.resolve(listener());
|
||||
yield Zotero.Promise.resolve(listener.call(this));
|
||||
}
|
||||
}),
|
||||
|
||||
|
|
|
@ -1123,9 +1123,7 @@ var ZoteroPane = new function()
|
|||
//
|
||||
// TODO: Cancel loading
|
||||
let deferred = Zotero.Promise.defer();
|
||||
this.itemsView.addEventListener('load', function () {
|
||||
deferred.resolve();
|
||||
});
|
||||
this.itemsView.addEventListener('load', () => deferred.resolve());
|
||||
if (deferred.promise.isPending()) {
|
||||
Zotero.debug("Waiting for items view " + this.itemsView.id + " to finish loading");
|
||||
yield deferred.promise;
|
||||
|
@ -1192,13 +1190,6 @@ var ZoteroPane = new function()
|
|||
this.itemsView.onError = function () {
|
||||
ZoteroPane_Local.displayErrorMessage();
|
||||
};
|
||||
// If any queued load listeners, set them to run when the tree is ready
|
||||
if (this._listeners.itemsLoaded) {
|
||||
let listener;
|
||||
while (listener = this._listeners.itemsLoaded.shift()) {
|
||||
this.itemsView.addEventListener('load', listener);
|
||||
}
|
||||
}
|
||||
this.itemsView.addEventListener('load', this.setTagScope);
|
||||
document.getElementById('zotero-items-tree').view = this.itemsView;
|
||||
|
||||
|
@ -2047,81 +2038,48 @@ var ZoteroPane = new function()
|
|||
throw new Error("Collections view not loaded");
|
||||
}
|
||||
|
||||
var self = this;
|
||||
var cv = this.collectionsView;
|
||||
|
||||
var deferred = Zotero.Promise.defer();
|
||||
this.collectionsView.addEventListener('load', function () {
|
||||
Zotero.spawn(function* () {
|
||||
try {
|
||||
self.addEventListener('itemsLoaded', function () {
|
||||
Zotero.spawn(function* () {
|
||||
var selected = yield self.itemsView.selectItem(itemID, expand);
|
||||
if (!selected) {
|
||||
if (item.deleted) {
|
||||
Zotero.debug("Item is deleted; switching to trash");
|
||||
yield self.collectionsView.selectTrash(item.libraryID);
|
||||
}
|
||||
else {
|
||||
Zotero.debug("Item was not selected; switching to library");
|
||||
yield self.collectionsView.selectLibrary(item.libraryID);
|
||||
}
|
||||
yield self.itemsView.selectItem(itemID, expand);
|
||||
}
|
||||
deferred.resolve(true);
|
||||
})
|
||||
.catch(function(e) {
|
||||
deferred.reject(e);
|
||||
});
|
||||
});
|
||||
|
||||
var currentLibraryID = self.getSelectedLibraryID();
|
||||
// If in a different library
|
||||
if (item.libraryID != currentLibraryID) {
|
||||
Zotero.debug("Library ID differs; switching library");
|
||||
yield self.collectionsView.selectLibrary(item.libraryID);
|
||||
}
|
||||
// Force switch to library view
|
||||
else if (!self.collectionsView.selectedTreeRow.isLibrary() && inLibrary) {
|
||||
Zotero.debug("Told to select in library; switching to library");
|
||||
yield self.collectionsView.selectLibrary(item.libraryID);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
deferred.reject(e);
|
||||
}
|
||||
})
|
||||
});
|
||||
cv.addEventListener('load', () => deferred.resolve());
|
||||
yield deferred.promise;
|
||||
|
||||
var currentLibraryID = this.getSelectedLibraryID();
|
||||
// If in a different library
|
||||
if (item.libraryID != currentLibraryID) {
|
||||
Zotero.debug("Library ID differs; switching library");
|
||||
yield cv.selectLibrary(item.libraryID);
|
||||
}
|
||||
// Force switch to library view
|
||||
else if (!cv.selectedTreeRow.isLibrary() && inLibrary) {
|
||||
Zotero.debug("Told to select in library; switching to library");
|
||||
yield cv.selectLibrary(item.libraryID);
|
||||
}
|
||||
|
||||
deferred = Zotero.Promise.defer();
|
||||
this.itemsView.addEventListener('load', () => deferred.resolve());
|
||||
yield deferred.promise;
|
||||
|
||||
var selected = yield this.itemsView.selectItem(itemID, expand);
|
||||
if (!selected) {
|
||||
if (item.deleted) {
|
||||
Zotero.debug("Item is deleted; switching to trash");
|
||||
yield cv.selectTrash(item.libraryID);
|
||||
}
|
||||
else {
|
||||
Zotero.debug("Item was not selected; switching to library");
|
||||
yield cv.selectLibrary(item.libraryID);
|
||||
}
|
||||
|
||||
deferred = Zotero.Promise.defer();
|
||||
this.itemsView.addEventListener('load', () => deferred.resolve());
|
||||
yield deferred.promise;
|
||||
|
||||
yield this.itemsView.selectItem(itemID, expand);
|
||||
}
|
||||
|
||||
// open Zotero pane
|
||||
this.show();
|
||||
|
||||
return deferred.promise;
|
||||
});
|
||||
|
||||
|
||||
this.addEventListener = function (event, listener) {
|
||||
if (event == 'itemsLoaded') {
|
||||
if (this.itemsView) {
|
||||
this.itemsView.addEventListener('load', listener);
|
||||
}
|
||||
else {
|
||||
if (!this._listeners.itemsLoaded) {
|
||||
this._listeners.itemsLoaded = [];
|
||||
}
|
||||
this._listeners.itemsLoaded.push(listener);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
this._runListeners = Zotero.Promise.coroutine(function* (event) {
|
||||
if (!this._listeners[event]) {
|
||||
return;
|
||||
}
|
||||
|
||||
var listener;
|
||||
while (listener = this._listeners[event].shift()) {
|
||||
yield Zotero.Promise.resolve(listener());
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
|
|
@ -95,21 +95,20 @@ var selectLibrary = Zotero.Promise.coroutine(function* (win, libraryID) {
|
|||
yield waitForItemsLoad(win);
|
||||
});
|
||||
|
||||
var waitForItemsLoad = function (win, collectionRowToSelect) {
|
||||
var resolve;
|
||||
var promise = new Zotero.Promise(() => resolve = arguments[0]);
|
||||
var waitForItemsLoad = Zotero.Promise.coroutine(function* (win, collectionRowToSelect) {
|
||||
var zp = win.ZoteroPane;
|
||||
var cv = zp.collectionsView;
|
||||
cv.addEventListener('load', function () {
|
||||
if (collectionRowToSelect !== undefined) {
|
||||
cv.selection.select(collectionRowToSelect);
|
||||
}
|
||||
zp.addEventListener('itemsLoaded', function () {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
return promise;
|
||||
}
|
||||
|
||||
var deferred = Zotero.Promise.defer();
|
||||
cv.addEventListener('load', () => deferred.resolve());
|
||||
yield deferred.promise;
|
||||
if (collectionRowToSelect !== undefined) {
|
||||
yield cv.selectWait(collectionRowToSelect);
|
||||
}
|
||||
deferred = Zotero.Promise.defer();
|
||||
zp.itemsView.addEventListener('load', () => deferred.resolve());
|
||||
return deferred.promise;
|
||||
});
|
||||
|
||||
/**
|
||||
* Waits for a single item event. Returns a promise for the item ID(s).
|
||||
|
|
|
@ -54,7 +54,7 @@ describe("Zotero.CollectionTreeView", function() {
|
|||
var collection1 = yield createDataObject('collection');
|
||||
var collection2 = createUnsavedDataObject('collection');
|
||||
collection2.parentID = collection1.id;
|
||||
yield collection2.save({
|
||||
yield collection2.saveTx({
|
||||
skipSelect: true
|
||||
});
|
||||
var row = cv.getRowIndexByID("C" + collection1.id);
|
||||
|
@ -279,6 +279,7 @@ describe("Zotero.CollectionTreeView", function() {
|
|||
var ids = yield drop("C" + collection.id, [item.id], deferred.promise);
|
||||
|
||||
Zotero.Notifier.unregisterObserver(observerID);
|
||||
|
||||
yield collectionsView.selectCollection(collection.id);
|
||||
yield waitForItemsLoad(win);
|
||||
|
||||
|
@ -289,7 +290,7 @@ describe("Zotero.CollectionTreeView", function() {
|
|||
})
|
||||
|
||||
it("should copy an item with an attachment to a group", function* () {
|
||||
var group = yield getGroup();
|
||||
var group = yield createGroup();
|
||||
|
||||
var item = yield createDataObject('item', false, { skipSelect: true });
|
||||
var file = getTestDataDirectory();
|
||||
|
@ -310,15 +311,27 @@ describe("Zotero.CollectionTreeView", function() {
|
|||
yield collectionsView.selectLibrary(group.libraryID);
|
||||
yield waitForItemsLoad(win);
|
||||
|
||||
var itemsView = win.ZoteroPane.itemsView
|
||||
// Check parent
|
||||
var itemsView = win.ZoteroPane.itemsView;
|
||||
assert.equal(itemsView.rowCount, 1);
|
||||
var treeRow = itemsView.getRow(0);
|
||||
assert.equal(treeRow.ref.libraryID, group.libraryID);
|
||||
assert.equal(treeRow.ref.id, ids[0]);
|
||||
|
||||
// New item should link back to original
|
||||
var linked = yield item.getLinkedItem(group.libraryID);
|
||||
assert.equal(linked.id, treeRow.ref.id);
|
||||
|
||||
// Check attachment
|
||||
assert.isTrue(itemsView.isContainer(0));
|
||||
yield itemsView.toggleOpenState(0);
|
||||
assert.equal(itemsView.rowCount, 2);
|
||||
treeRow = itemsView.getRow(1);
|
||||
assert.equal(treeRow.ref.id, ids[1]);
|
||||
// New attachment should link back to original
|
||||
linked = yield attachment.getLinkedItem(group.libraryID);
|
||||
assert.equal(linked.id, treeRow.ref.id);
|
||||
|
||||
yield group.erase()
|
||||
})
|
||||
|
||||
it("should not copy an item or its attachment to a group twice", function* () {
|
||||
|
@ -334,7 +347,7 @@ describe("Zotero.CollectionTreeView", function() {
|
|||
});
|
||||
var attachmentTitle = Zotero.Utilities.randomString();
|
||||
attachment.setField('title', attachmentTitle);
|
||||
yield attachment.save();
|
||||
yield attachment.saveTx();
|
||||
|
||||
var ids = yield drop("L" + group.libraryID, [item.id]);
|
||||
assert.isFalse(yield canDrop("L" + group.libraryID, [item.id]));
|
||||
|
@ -350,7 +363,7 @@ describe("Zotero.CollectionTreeView", function() {
|
|||
var droppedItem = yield item.getLinkedItem(group.libraryID);
|
||||
droppedItem.setCollections([collection.id]);
|
||||
droppedItem.deleted = true;
|
||||
yield droppedItem.save();
|
||||
yield droppedItem.saveTx();
|
||||
|
||||
// Add observer to wait for collection add
|
||||
var deferred = Zotero.Promise.defer();
|
||||
|
|
Loading…
Reference in a new issue