Nicer, localized messages for various field-too-long sync errors

Closes #351
Closes #1177
This commit is contained in:
Dan Stillman 2018-02-18 15:21:13 -05:00
parent 63f206c80e
commit 2200badef2
2 changed files with 127 additions and 82 deletions

View file

@ -1059,95 +1059,133 @@ Zotero.Sync.Runner_Module = function (options = {}) {
else if (e.name && e.name == 'ZoteroObjectUploadError') {
let { code, data, objectType, object } = e;
// Tag too long
if (code == 413 && objectType == 'item') {
if (data && data.tag !== undefined) {
// Show long tag fixer and handle result
e.dialogButtonText = Zotero.getString('general.fix');
e.dialogButtonCallback = Zotero.Promise.coroutine(function* () {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var lastWin = wm.getMostRecentWindow("navigator:browser");
// Open long tag fixer for every long tag in every editable library we're syncing
var editableLibraries = options.libraries
.filter(x => Zotero.Libraries.get(x).editable);
for (let libraryID of editableLibraries) {
let oldTagIDs = yield Zotero.Tags.getLongTagsInLibrary(libraryID);
for (let oldTagID of oldTagIDs) {
let oldTag = Zotero.Tags.getName(oldTagID);
let dataOut = { result: null };
lastWin.openDialog(
'chrome://zotero/content/longTagFixer.xul',
'',
'chrome,modal,centerscreen',
oldTag,
dataOut
);
// If dialog was cancelled, stop
if (!dataOut.result) {
return;
}
switch (dataOut.result.op) {
case 'split':
for (let libraryID of editableLibraries) {
let itemIDs = yield Zotero.Tags.getTagItems(libraryID, oldTagID);
yield Zotero.DB.executeTransaction(function* () {
for (let itemID of itemIDs) {
let item = yield Zotero.Items.getAsync(itemID);
for (let tag of dataOut.result.tags) {
item.addTag(tag);
}
item.removeTag(oldTag);
yield item.save();
}
yield Zotero.Tags.purge(oldTagID);
});
}
break;
case 'edit':
for (let libraryID of editableLibraries) {
let itemIDs = yield Zotero.Tags.getTagItems(libraryID, oldTagID);
yield Zotero.DB.executeTransaction(function* () {
for (let itemID of itemIDs) {
let item = yield Zotero.Items.getAsync(itemID);
item.replaceTag(oldTag, dataOut.result.tag);
yield item.save();
}
});
}
break;
case 'delete':
for (let libraryID of editableLibraries) {
yield Zotero.Tags.removeFromLibrary(libraryID, oldTagID);
}
break;
}
}
}
options.restartSync = true;
});
}
// Note too long
else if (object.isNote() || object.isAttachment()) {
// Throw an error that adds a button for selecting the item to the sync error dialog
if (e.message.includes('<img src="data:image')) {
// TODO: Localize
e.message = "Notes with embedded images cannot currently be synced to "
+ `${ZOTERO_CONFIG.DOMAIN_NAME}.`
}
if (code == 413) {
// Collection name too long
if (objectType == 'collection' && data && data.value) {
e.message = Zotero.getString('sync.error.collectionTooLong', [data.value]);
e.dialogButtonText = Zotero.getString('pane.items.showItemInLibrary');
e.dialogButtonText = Zotero.getString('pane.collections.showCollectionInLibrary');
e.dialogButtonCallback = () => {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var win = wm.getMostRecentWindow("navigator:browser");
win.ZoteroPane.selectItem(object.id);
win.ZoteroPane.collectionsView.selectCollection(object.id);
};
}
else if (objectType == 'item') {
// Tag too long
if (data && data.tag !== undefined) {
// Show long tag fixer and handle result
e.dialogButtonText = Zotero.getString('general.fix');
e.dialogButtonCallback = Zotero.Promise.coroutine(function* () {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var lastWin = wm.getMostRecentWindow("navigator:browser");
// Open long tag fixer for every long tag in every editable library we're syncing
var editableLibraries = options.libraries
.filter(x => Zotero.Libraries.get(x).editable);
for (let libraryID of editableLibraries) {
let oldTagIDs = yield Zotero.Tags.getLongTagsInLibrary(libraryID);
for (let oldTagID of oldTagIDs) {
let oldTag = Zotero.Tags.getName(oldTagID);
let dataOut = { result: null };
lastWin.openDialog(
'chrome://zotero/content/longTagFixer.xul',
'',
'chrome,modal,centerscreen',
oldTag,
dataOut
);
// If dialog was cancelled, stop
if (!dataOut.result) {
return;
}
switch (dataOut.result.op) {
case 'split':
for (let libraryID of editableLibraries) {
let itemIDs = yield Zotero.Tags.getTagItems(libraryID, oldTagID);
yield Zotero.DB.executeTransaction(function* () {
for (let itemID of itemIDs) {
let item = yield Zotero.Items.getAsync(itemID);
for (let tag of dataOut.result.tags) {
item.addTag(tag);
}
item.removeTag(oldTag);
yield item.save();
}
yield Zotero.Tags.purge(oldTagID);
});
}
break;
case 'edit':
for (let libraryID of editableLibraries) {
let itemIDs = yield Zotero.Tags.getTagItems(libraryID, oldTagID);
yield Zotero.DB.executeTransaction(function* () {
for (let itemID of itemIDs) {
let item = yield Zotero.Items.getAsync(itemID);
item.replaceTag(oldTag, dataOut.result.tag);
yield item.save();
}
});
}
break;
case 'delete':
for (let libraryID of editableLibraries) {
yield Zotero.Tags.removeFromLibrary(libraryID, oldTagID);
}
break;
}
}
}
options.restartSync = true;
});
}
else {
// Note too long
if (object.isNote() || object.isAttachment()) {
// Throw an error that adds a button for selecting the item to the sync error dialog
if (e.message.includes('<img src="data:image')) {
e.message = Zotero.getString('sync.error.noteEmbeddedImage');
}
else if (e.message.match(/^Note '.*' too long for item/)) {
e.message = Zotero.getString(
'sync.error.noteTooLong',
Zotero.Utilities.ellipsize(object.getNoteTitle(), 40)
);
}
}
// Field or creator too long
else if (data && data.field) {
e.message = (data.field == 'creator'
? Zotero.getString(
'sync.error.creatorTooLong',
[data.value]
)
: Zotero.getString(
'sync.error.fieldTooLong',
[data.field, data.value]
))
+ '\n\n'
+ Zotero.getString(
'sync.error.reportSiteIssuesToForums',
Zotero.clientName
);
}
// Include "Show Item in Library" button
e.dialogButtonText = Zotero.getString('pane.items.showItemInLibrary');
e.dialogButtonCallback = () => {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var win = wm.getMostRecentWindow("navigator:browser");
win.ZoteroPane.selectItem(object.id);
};
}
}
// If not a background sync, show dialog immediately
if (!options.background && e.dialogButtonCallback) {

View file

@ -233,6 +233,7 @@ pane.collections.menu.export.feed = Export Feed…
pane.collections.menu.createBib.collection = Create Bibliography from Collection…
pane.collections.menu.createBib.savedSearch = Create Bibliography from Saved Search…
pane.collections.menu.createBib.feed = Create Bibliography from Feed…
pane.collections.showCollectionInLibrary = Show Collection in Library
pane.collections.menu.generateReport.collection = Generate Report from Collection…
pane.collections.menu.generateReport.savedSearch = Generate Report from Saved Search…
@ -908,6 +909,12 @@ sync.error.checkConnection = Error connecting to server. Check your Internet
sync.error.emptyResponseServer = Empty response from server.
sync.error.invalidCharsFilename = The filename '%S' contains invalid characters.\n\nRename the file and try again. If you rename the file via the OS, you will need to relink it in Zotero.
sync.error.apiKeyInvalid = %S could not authenticate your account. Please re-enter your account details.
sync.error.collectionTooLong = The collection name “%S” is too long to sync. Shorten the name and sync again.
sync.error.fieldTooLong = The %1$S value “%2$S” in one of your items is too long to sync. Shorten the field and sync again.
sync.error.creatorTooLong = The creator name “%S” in one of your items is too long to sync. Shorten the field and sync again.
sync.error.noteEmbeddedImage = Notes with embedded images cannot currently be synced. Syncing of embedded images may be supported in a future version.
sync.error.noteTooLong = The note “%S” is too long to sync. Shorten the note and sync again.
sync.error.reportSiteIssuesToForums = If you receive this message repeatedly for items saved from a particular site, you can report this issue in the %S Forums.
account.unlinkWarning = Unlinking your account will prevent %S from syncing your data.
account.unlinkWarning.removeData = Remove my %S data from this computer