From 481d84795111af162eeb94e530d5c2629bad4752 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Fri, 29 May 2009 11:49:55 +0000 Subject: [PATCH] Long tag fixer tool -- runs automatically if server returns a long tag error, giving the option to split, edit, or delete the offending tag Needs testing and refinement - Also fixes server unlock after sync errors --- chrome/content/zotero/longTagFixer.js | 185 ++++++++++++++++++++ chrome/content/zotero/longTagFixer.xul | 74 ++++++++ chrome/content/zotero/xpcom/sync.js | 49 ++++-- chrome/skin/default/zotero/longTagFixer.css | 8 + defaults/preferences/zotero.js | 1 + 5 files changed, 304 insertions(+), 13 deletions(-) create mode 100644 chrome/content/zotero/longTagFixer.js create mode 100644 chrome/content/zotero/longTagFixer.xul create mode 100644 chrome/skin/default/zotero/longTagFixer.css diff --git a/chrome/content/zotero/longTagFixer.js b/chrome/content/zotero/longTagFixer.js new file mode 100644 index 000000000..8113de980 --- /dev/null +++ b/chrome/content/zotero/longTagFixer.js @@ -0,0 +1,185 @@ +var Zotero_Long_Tag_Fixer = new function () { + var _oldTag = window.arguments[0]; + var _callback = window.arguments[1]; + + this.init = function () { + document.getElementById('zotero-old-tag').value = _oldTag; + + var lastMode = Zotero.Prefs.get('lastLongTagMode'); + if (!lastMode) { + lastMode = 0; + } + this.switchMode(lastMode); + } + + this.switchMode = function (index) { + var dialog = document.getElementById('zotero-long-tag-fixer'); + + document.getElementById('zotero-new-tag-actions').selectedIndex = index; + + // TODO: localize + switch (index) { + case 0: + var buttonLabel = "Save Tags"; + this.updateTagList(); + break; + + case 1: + var buttonLabel = "Save Tag"; + document.getElementById('zotero-new-tag-editor').value = _oldTag; + this.updateEditLength(_oldTag.length) + break; + + case 2: + var buttonLabel = "Delete Tag"; + dialog.getButton('accept').disabled = false; + break; + } + + document.getElementById('zotero-long-tag-fixer').getButton('accept').label = buttonLabel; + + Zotero.Prefs.set('lastLongTagMode', index); + } + + + /** + * Split tags and populate list + */ + this.updateTagList = function () { + var listbox = document.getElementById('zotero-new-tag-list'); + while (listbox.childNodes.length) { + listbox.removeChild(listbox.lastChild); + } + + var delimiter = document.getElementById('zotero-old-tag-delimiter').value; + if (delimiter) { + var re = new RegExp("\\s*" + delimiter + "\\s*"); + var tags = _oldTag.split(re); + } + + var acceptButton = document.getElementById('zotero-long-tag-fixer').getButton('accept'); + if (!delimiter || tags.length < 2) { + acceptButton.disabled = true; + return; + } + else { + acceptButton.disabled = false; + } + + tags.sort(); + for (var i=0; i 255; + document.getElementById('zotero-new-tag-characters').setAttribute('invalid', invalid); + document.getElementById('zotero-long-tag-fixer').getButton('accept').disabled = invalid; + } + + + this.cancel = function () { + if (_callback) { + _callback(false); + } + } + + + this.save = function () { + try { + + var index = document.getElementById('zotero-new-tag-actions').selectedIndex; + + // Search for all matching tags across all libraries + var sql = "SELECT tagID FROM tags WHERE name=?"; + var oldTagIDs = Zotero.DB.columnQuery(sql, _oldTag); + + switch (index) { + // Split + case 0: + // Get checked tags + var listbox = document.getElementById('zotero-new-tag-list'); + var len = Zotero.isFx3 ? listbox.childNodes.length : listbox.childElementCount; + var newTags = []; + for (var i=0; i + + + + + +