Load groups at startup, and make Zotero.Groups functions synchronous

Groups were already being loaded for the collections list, so we might
as well just store them initially and let Zotero.Libraries.getName() be
a synchronous call.
This commit is contained in:
Dan Stillman 2015-05-22 04:49:02 -04:00
parent f0b44b2047
commit 32abbe7c25
7 changed files with 61 additions and 49 deletions

View file

@ -48,12 +48,6 @@ var ZoteroAdvancedSearch = new function() {
io.dataIn.search.loadPrimaryData() io.dataIn.search.loadPrimaryData()
.then(function () { .then(function () {
return Zotero.Groups.getAll();
})
.then(function (groups) {
// Since the search box can be used as a modal dialog, which can't use promises,
// it expects groups to be passed in.
_searchBox.groups = groups;
_searchBox.search = io.dataIn.search; _searchBox.search = io.dataIn.search;
}); });
} }

View file

@ -95,8 +95,9 @@
menupopup.appendChild(menuitem); menupopup.appendChild(menuitem);
// Add groups // Add groups
for (let i = 0; i < this.groups.length; i++) { var groups = Zotero.Groups.getAll();
let group = this.groups[i]; for (let i = 0; i < groups.length; i++) {
let group = groups[i];
let menuitem = document.createElement('menuitem'); let menuitem = document.createElement('menuitem');
menuitem.setAttribute('label', group.name); menuitem.setAttribute('label', group.name);
menuitem.setAttribute('libraryID', group.libraryID); menuitem.setAttribute('libraryID', group.libraryID);

View file

@ -200,7 +200,7 @@ Zotero.CollectionTreeView.prototype.refresh = Zotero.Promise.coroutine(function*
); );
// Add groups // Add groups
var groups = yield Zotero.Groups.getAll(); var groups = Zotero.Groups.getAll();
if (groups.length) { if (groups.length) {
this._addRowToArray( this._addRowToArray(
newRows, newRows,

View file

@ -287,7 +287,7 @@ Zotero.Group.prototype.save = function () {
throw (e); throw (e);
} }
//Zotero.Groups.reload(this.id); Zotero.Groups.register(this);
Zotero.Notifier.trigger('add', 'group', this.id); Zotero.Notifier.trigger('add', 'group', this.id);
} }
@ -369,6 +369,7 @@ Zotero.Group.prototype.erase = Zotero.Promise.coroutine(function* () {
Zotero.Notifier.enable(); Zotero.Notifier.enable();
} }
Zotero.Groups.unregister(this.id);
Zotero.Notifier.trigger('delete', 'group', this.id, notifierData); Zotero.Notifier.trigger('delete', 'group', this.id, notifierData);
}); });
@ -391,7 +392,7 @@ Zotero.Group.prototype.serialize = function() {
Zotero.Group.prototype._requireLoad = function () { Zotero.Group.prototype._requireLoad = function () {
if (!this._loaded) { if (!this._loaded && Zotero.Groups.exists(this.id)) {
throw new Error("Group has not been loaded"); throw new Error("Group has not been loaded");
} }
} }

View file

@ -27,39 +27,38 @@
Zotero.Groups = new function () { Zotero.Groups = new function () {
this.__defineGetter__('addGroupURL', function () ZOTERO_CONFIG.WWW_BASE_URL + 'groups/new/'); this.__defineGetter__('addGroupURL', function () ZOTERO_CONFIG.WWW_BASE_URL + 'groups/new/');
var _cache = {};
var _groupIDsByLibraryID = {}; var _groupIDsByLibraryID = {};
var _libraryIDsByGroupID = {}; var _libraryIDsByGroupID = {};
this.init = function () { this.init = Zotero.Promise.coroutine(function* () {
_loadIDs(); yield _load();
}
this.get = Zotero.Promise.coroutine(function* (id) {
if (!id) {
throw new Error("groupID not provided");
}
var group = new Zotero.Group;
group.id = id;
if (!(yield group.load())) {
return false;
}
return group;
}); });
/**
* @param {Integer} id - Group id
* @return {Zotero.Group}
*/
this.get = function (id) {
if (!id) throw new Error("groupID not provided");
return _cache[id] ? _cache[id] : false;
}
this.getAll = Zotero.Promise.coroutine(function* () {
var groups = []; /**
var sql = "SELECT groupID FROM groups ORDER BY name COLLATE locale"; * Get all groups, sorted by name
var groupIDs = yield Zotero.DB.columnQueryAsync(sql); *
if (!groupIDs.length) { * @return {Zotero.Group[]}
*/
this.getAll = function () {
var groups = [for (id of Object.keys(_cache)) _cache[id]];
var collation = Zotero.getLocaleCollation();
groups.sort(function(a, b) {
return collation.compareString(1, a.name, b.name);
});
return groups; return groups;
} }
for each(var groupID in groupIDs) {
groups.push(this.get(groupID));
}
return Zotero.Promise.all(groups);
});
this.getByLibraryID = function (libraryID) { this.getByLibraryID = function (libraryID) {
@ -91,15 +90,32 @@ Zotero.Groups = new function () {
} }
function _loadIDs() { this.register = function (group) {
_libraryIDsByGroupID[group.id] = group.libraryID;
_groupIDsByLibraryID[group.libraryID] = group.id;
_cache[group.id] = group;
}
this.unregister = function (id) {
var libraryID = _libraryIDsByGroupID[groupID];
delete _groupIDsByLibraryID[libraryID];
delete _libraryIDsByGroupID[groupID];
delete _cache[id];
}
var _load = Zotero.Promise.coroutine(function* () {
var sql = "SELECT libraryID, groupID FROM groups"; var sql = "SELECT libraryID, groupID FROM groups";
return Zotero.DB.queryAsync(sql) var rows = yield Zotero.DB.queryAsync(sql)
.then(function (rows) {
for (let i=0; i<rows.length; i++) { for (let i=0; i<rows.length; i++) {
let row = rows[i]; let row = rows[i];
_groupIDsByLibraryID[row.libraryID] = row.groupID; _groupIDsByLibraryID[row.libraryID] = row.groupID;
_libraryIDsByGroupID[row.groupID] = row.libraryID; _libraryIDsByGroupID[row.groupID] = row.libraryID;
let group = new Zotero.Group;
group.id = row.groupID;
yield group.load();
_cache[row.groupID] = group;
} }
}.bind(this)); });
}
} }

View file

@ -604,7 +604,7 @@ Components.utils.import("resource://gre/modules/osfile.jsm");
Zotero.Collections.init(); Zotero.Collections.init();
Zotero.Items.init(); Zotero.Items.init();
yield Zotero.Searches.init(); yield Zotero.Searches.init();
Zotero.Groups.init(); yield Zotero.Groups.init();
yield Zotero.QuickCopy.init(); yield Zotero.QuickCopy.init();

View file

@ -596,7 +596,7 @@ function ZoteroProtocolHandler() {
// FIXME: Hack to exclude group libraries for now // FIXME: Hack to exclude group libraries for now
var search = new Zotero.Search(); var search = new Zotero.Search();
search.setScope(s); search.setScope(s);
var groups = yield Zotero.Groups.getAll(); var groups = Zotero.Groups.getAll();
for each(var group in groups) { for each(var group in groups) {
search.addCondition('libraryID', 'isNot', group.libraryID); search.addCondition('libraryID', 'isNot', group.libraryID);
} }