Add ability to create Zotero Commons buckets via the UI

- "zc-test-" is currently prepended to bucket names
This commit is contained in:
Dan Stillman 2010-08-06 17:42:14 +00:00
parent 6ea7e3dd65
commit bbc8f7812c
3 changed files with 173 additions and 101 deletions

View file

@ -1466,7 +1466,111 @@ var ZoteroPane = new function()
Zotero.purgeDataObjects(true); Zotero.purgeDataObjects(true);
} }
} }
this.createCommonsBucket = function () {
var prompt = Components.classes["@mozilla.org/network/default-prompt;1"]
.createInstance(Components.interfaces.nsIPrompt);
var invalid = false;
while (true) {
if (invalid) {
// TODO: localize
prompt.alert("", "Invalid title. Please try again.");
invalid = false;
}
var newTitle = {};
var result = prompt.prompt(
"",
// TODO: localize
"Enter a title for this Zotero Commons collection:",
newTitle,
"", {}
);
if (!result) {
return;
}
var title = Zotero.Utilities.prototype.trim(newTitle.value);
if (!title) {
return;
}
if (!Zotero.Commons.isValidBucketTitle(title)) {
invalid = true;
continue;
}
break;
}
invalid = false;
var origName = title.toLowerCase();
origName = origName.replace(/[^a-z0-9 ._-]/g, '');
origName = origName.replace(/ /g, '-');
origName = origName.substr(0, 32);
while (true) {
if (invalid) {
// TODO: localize
var msg = "'" + name + "' is not a valid Zotero Commons collection identifier.\n\n"
+ "Collection identifiers can contain basic Latin letters, numbers,"
+ "hyphens, and underscores. Spaces and other characters are not allowed.";
prompt.alert("", msg);
invalid = false;
}
var newName = { value: origName };
var result = prompt.prompt(
"",
// TODO: localize
"Enter an identifier for the collection '" + title + "'.\n\n"
+ "The identifier will form the collection's URL "
+ "(e.g., http://www.archive.org/details/" + origName + ") "
+ "and can contain basic Latin letters, numbers, hyphens, and underscores. "
+ "Spaces and other characters are not allowed.",
newName,
"", {}
);
if (!result) {
return;
}
var name = Zotero.Utilities.prototype.trim(newName.value);
if (!name) {
return;
}
if (!Zotero.Commons.isValidBucketName(name)) {
invalid = true;
continue;
}
break;
}
// TEMP
var name = "zc-test-" + name;
// TODO: localize
var progressWin = new Zotero.ProgressWindow();
progressWin.changeHeadline("Creating Zotero Commons Collection");
var icon = this.collectionsView.getImageSrc(this.collectionsView.selection.currentIndex);
progressWin.addLines(title, icon)
progressWin.show();
Zotero.Commons.createBucket(name, title, function () {
progressWin.startCloseTimer();
});
}
this.refreshCommonsBucket = function() { this.refreshCommonsBucket = function() {
if (!this.collectionsView if (!this.collectionsView
|| !this.collectionsView.selection || !this.collectionsView.selection
@ -1776,7 +1880,8 @@ var ZoteroPane = new function()
exportFile: 9, exportFile: 9,
loadReport: 10, loadReport: 10,
emptyTrash: 11, emptyTrash: 11,
refreshCommonsBucket: 12 createCommonsBucket: 12,
refreshCommonsBucket: 13
}; };
var itemGroup = this.collectionsView._getItemAtRow(this.collectionsView.selection.currentIndex); var itemGroup = this.collectionsView._getItemAtRow(this.collectionsView.selection.currentIndex);
@ -1845,7 +1950,9 @@ var ZoteroPane = new function()
show = [m.emptyTrash]; show = [m.emptyTrash];
} }
else if (itemGroup.isHeader()) { else if (itemGroup.isHeader()) {
// Don't show menu for headers if (itemGroup.ref.id == 'commons-header') {
show = [m.createCommonsBucket];
}
} }
else if (itemGroup.isBucket()) { else if (itemGroup.isBucket()) {
show = [m.refreshCommonsBucket]; show = [m.refreshCommonsBucket];

View file

@ -107,6 +107,7 @@
<menuitem label="&zotero.toolbar.export.label;" oncommand="Zotero_File_Interface.exportFile()"/> <menuitem label="&zotero.toolbar.export.label;" oncommand="Zotero_File_Interface.exportFile()"/>
<menuitem oncommand="Zotero_Report_Interface.loadCollectionReport()"/> <menuitem oncommand="Zotero_Report_Interface.loadCollectionReport()"/>
<menuitem label="&zotero.toolbar.emptyTrash.label;" oncommand="ZoteroPane.emptyTrash();"/> <menuitem label="&zotero.toolbar.emptyTrash.label;" oncommand="ZoteroPane.emptyTrash();"/>
<menuitem label="&zotero.toolbar.newCollection.label;" oncommand="ZoteroPane.createCommonsBucket();"/><!--TODO localize -->
<menuitem label="Refresh" oncommand="ZoteroPane.refreshCommonsBucket();"/><!--TODO localize --> <menuitem label="Refresh" oncommand="ZoteroPane.refreshCommonsBucket();"/><!--TODO localize -->
</popup> </popup>
<popup id="zotero-itemmenu" onpopupshowing="ZoteroPane.buildItemContextMenu();"> <popup id="zotero-itemmenu" onpopupshowing="ZoteroPane.buildItemContextMenu();">

View file

@ -173,8 +173,30 @@ Zotero.Commons = new function() {
}; };
// outdated this.isValidBucketTitle = function (title) {
this.createBucket = function (item, onBucketQueued, onBucketCreated, waitForCreation) { if (!title) {
return false;
}
if (title.constructor.name != 'String') {
return false;
}
return title.length <= 255;
}
this.isValidBucketName = function (name) {
if (!name) {
return false;
}
if (name.constructor.name != 'String') {
return false;
}
return name.match(/^[a-z0-9_-]{0,32}$/); // TODO: check IA pattern
}
this.createBucket = function (name, title, onBucketCreated) {
var headers = { var headers = {
"x-archive-auto-make-bucket":"1", "x-archive-auto-make-bucket":"1",
"x-archive-meta01-collection":"zoterocommons", "x-archive-meta01-collection":"zoterocommons",
@ -183,111 +205,49 @@ Zotero.Commons = new function() {
"x-archive-meta01-language":"eng" "x-archive-meta01-language":"eng"
}; };
var itemTitle = item.getDisplayTitle(); if (!this.isValidBucketName(name)) {
if (itemTitle) { throw ("Bucket name '" + name + "' must be ASCII in Zotero.Commons.createBucket()");
headers["x-archive-meta-title"] = itemTitle;
} }
var itemLanguage = item.getField('language'); if (!title) {
title = name;
}
if (!this.isValidBucketTitle(title)) {
throw ("Invalid title '" + title + "' in Zotero.Commons.createBucket()");
}
headers["x-archive-meta-title"] = title;
// TODO: use proper language code? // TODO: use proper language code?
if (itemLanguage) { //if (itemLanguage) {
headers["x-archive-meta01-language"] = itemLanguage; // headers["x-archive-meta01-language"] = itemLanguage;
} //}
var itemType = Zotero.ItemTypes.getName(item.itemTypeID); headers["x-archive-meta-mediatype"] = "texts";
switch (itemType) {
case 'artwork':
case 'map':
headers["x-archive-meta-mediatype"] = "image";
break;
case 'radioBroadcast':
case 'audioRecording':
headers["x-archive-meta-mediatype"] = "audio";
break;
case 'tvBroadcast':
case 'videoRecording':
headers["x-archive-meta-mediatype"] = "movies";
break;
default:
headers["x-archive-meta-mediatype"] = "texts";
}
var requestCallback = function (req, id, tries) { Zotero.Commons.createAuthenticatedRequest(
Zotero.debug(req.status); "PUT", "/" + name, headers, this.accessKey, this.secretKey,
function (req) {
if (req.status == 201) { Zotero.debug(req.status);
var bucket = new Zotero.Commons.Bucket(id);
if (waitForCreation) { if (req.status == 201) {
Zotero.debug('Waiting for bucket creation'); var bucket = new Zotero.Commons.Bucket(name);
_buckets[name] = bucket;
setTimeout(function () { Zotero.Notifier.trigger('add', 'bucket', [name]);
var tries = 15;
bucket.exists(function (found) {
if (found == 1) {
onBucketCreated(bucket);
}
else if (!found) {
alert("Commons: Bucket " + bucket.name + " not found after creation");
}
else {
alert("Commons: Error checking for bucket " + bucket.name + " after creation");
}
}, tries);
}, Zotero.Commons.postCreateBucketDelay);
if (onBucketQueued) {
onBucketQueued();
}
}
else {
if (onBucketQueued) {
onBucketQueued();
}
if (onBucketCreated) { if (onBucketCreated) {
onBucketCreated(bucket); onBucketCreated();
} }
} }
}
else {
Zotero.debug(req.responseText);
// DEBUG: What is this for?
if (req.status == 409) {
tries++;
// Max tries
if (tries > 3) {
alert("Upload failed");
return;
}
id = Zotero.Commons.getNewBucketName();
Zotero.Commons.createAuthenticatedRequest(
"PUT", "/" + id, headers, this.accessKey, this.secretKey,
function (req) {
requestCallback(req, id, tries);
}
);
}
else { else {
Zotero.debug(req.status); Zotero.debug(req.status);
Zotero.debug(req.responseText); Zotero.debug(req.responseText);
alert("Upload failed"); Zotero.Commons.error("Error creating bucket '" + name + "'");
} }
} }
};
var id = Zotero.Commons.getNewBucketName();
Zotero.Commons.createAuthenticatedRequest(
"PUT", "/" + id, headers, this.accessKey, this.secretKey,
function (req) {
requestCallback(req, id, 1);
}
); );
} }
@ -358,11 +318,11 @@ Zotero.Commons = new function() {
var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Components.interfaces.nsIXMLHttpRequest); .createInstance(Components.interfaces.nsIXMLHttpRequest);
req.open(method, Zotero.Commons.apiUrl + resource, false); req.open(method, Zotero.Commons.apiUrl + resource, false);
for(var header in headers) { for(var header in headers) {
req.setRequestHeader(header, headers[header]); req.setRequestHeader(header, headers[header]);
} }
return req; return req;
} }
@ -396,8 +356,11 @@ Zotero.Commons = new function() {
} }
this.debug = function (message, level) { this.error = function (message) {
Zotero.debug("Commons: " + message, level); Components.utils.reportError(message);
var prompt = Components.classes["@mozilla.org/network/default-prompt;1"]
.createInstance(Components.interfaces.nsIPrompt);
prompt.alert("Zotero Commons Error", message);
} }
} }
@ -591,7 +554,7 @@ Zotero.Commons.Bucket.prototype.getItems = function (callback) {
var rdfURI = self.downloadURI + '/' var rdfURI = self.downloadURI + '/'
// Strip characters IA strips // Strip characters IA strips
+ zip.key.replace(/[^-A-Za-z0-9_.]/g, '-').replace(/-+/g, '-'); + zip.key.replace(/[^-A-Za-z0-9_\.]/g, '-').replace(/-+/g, '-');
rdfURI = rdfURI.replace(/\.zip$/, "_zotero.rdf"); rdfURI = rdfURI.replace(/\.zip$/, "_zotero.rdf");
Zotero.Utilities.HTTP.doGet(rdfURI, function (xmlhttp) { Zotero.Utilities.HTTP.doGet(rdfURI, function (xmlhttp) {
@ -673,14 +636,15 @@ Zotero.Commons.Bucket.prototype.getItems = function (callback) {
Zotero.debug("Downloading OCRed PDF " + iaFileName); Zotero.debug("Downloading OCRed PDF " + iaFileName);
var title = Zotero.localeJoin([child.title, '(OCR)']); var baseName = child.title.replace(/\.pdf$/, '')
var baseName = child.key; baseName += ' (OCR)';
var title = baseName + '.pdf';
if (!progressWin) { if (!progressWin) {
progressWin = new Zotero.ProgressWindow(); progressWin = new Zotero.ProgressWindow();
progressWin.changeHeadline("Downloading OCRed PDFs"); // TODO: localize progressWin.changeHeadline("Downloading OCRed PDFs"); // TODO: localize
} }
progressWin.addLines([child.title], [progressWinIcon]); progressWin.addLines([title], [progressWinIcon]);
progressWin.show(); progressWin.show();
progressWin.startCloseTimer(8000); progressWin.startCloseTimer(8000);