editBibliographyDialog.js (9496B)
1 /* 2 ***** BEGIN LICENSE BLOCK ***** 3 4 Copyright © 2009 Center for History and New Media 5 George Mason University, Fairfax, Virginia, USA 6 http://zotero.org 7 8 This file is part of Zotero. 9 10 Zotero is free software: you can redistribute it and/or modify 11 it under the terms of the GNU Affero General Public License as published by 12 the Free Software Foundation, either version 3 of the License, or 13 (at your option) any later version. 14 15 Zotero is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU Affero General Public License for more details. 19 20 You should have received a copy of the GNU Affero General Public License 21 along with Zotero. If not, see <http://www.gnu.org/licenses/>. 22 23 ***** END LICENSE BLOCK ***** 24 */ 25 26 var Zotero_Bibliography_Dialog = new function () { 27 var bibEditInterface; 28 var _lastSelectedItemID = false; 29 var _lastSelectedIndex = false; 30 var _lastSelectedValue = false; 31 var _accepted = false; 32 var _revertButton, _revertAllButton, _addButton, _removeButton; 33 var _itemList; 34 var _suppressAllSelectEvents = false; 35 36 /** 37 * Initializes add citation dialog 38 */ 39 this.load = function() { 40 bibEditInterface = window.arguments[0].wrappedJSObject; 41 42 _revertAllButton = document.documentElement.getButton("extra2"); 43 _revertButton = document.documentElement.getButton("extra1"); 44 _addButton = document.getElementById("add"); 45 _removeButton = document.getElementById("remove"); 46 _itemList = document.getElementById("item-list"); 47 _itemTree = document.getElementById("zotero-items-tree"); 48 49 _revertAllButton.label = Zotero.getString("integration.revertAll.button"); 50 _revertAllButton.disabled = bibEditInterface.isAnyEdited(); 51 _revertButton.label = Zotero.getString("integration.revert.button"); 52 _revertButton.disabled = true; 53 54 document.getElementById('editor').format = "RTF"; 55 56 // load (from selectItemsDialog.js) 57 doLoad(); 58 59 // load bibliography entires 60 _loadItems(); 61 } 62 63 /** 64 * Called when an item in the item selection tree is clicked 65 */ 66 this.treeItemSelected = function() { 67 if(_suppressAllSelectEvents) return; 68 var selectedItemIDs = itemsView.getSelectedItems(true); // treeview from selectItemsDialog.js 69 70 // if all selected items are available in the list box on the right, select them there 71 // otherwise, clear the list box selection 72 var clearListItems = false; 73 var itemsToSelect = []; 74 if(selectedItemIDs.length) { 75 for (let itemID of selectedItemIDs) { 76 var itemIndexToSelect = false; 77 for(var i in bibEditInterface.bib[0].entry_ids) { 78 if(bibEditInterface.bib[0].entry_ids[i].indexOf(itemID) !== -1) { 79 itemIndexToSelect = i; 80 continue; 81 } 82 } 83 84 if(itemIndexToSelect !== false) { 85 itemsToSelect.push(_itemList.getItemAtIndex(itemIndexToSelect)); 86 } else { 87 clearListItems = true; 88 break; 89 } 90 } 91 } 92 93 _suppressAllSelectEvents = true; 94 _itemList.clearSelection(); 95 if(clearListItems) { 96 _addButton.disabled = (itemsToSelect.length > 0); 97 _revertButton.disabled = _removeButton.disabled = true; 98 } else { 99 _addButton.disabled = true; 100 _removeButton.disabled = false; 101 _updateRevertButtonStatus(); 102 itemsToSelect.forEach(item => _itemList.toggleItemSelection(item)); 103 _itemList.ensureIndexIsVisible(itemsToSelect[0]); 104 } 105 _suppressAllSelectEvents = false; 106 107 _updatePreview(); 108 } 109 110 /** 111 * Called when an item in the reference list is clicked 112 */ 113 this.listItemSelected = function() { 114 if(_suppressAllSelectEvents) return; 115 116 // enable remove if at least one item is selected 117 _addButton.disabled = true; 118 _removeButton.disabled = !_itemList.selectedItems.length; 119 120 if(_itemList.selectedItems.length) { 121 _suppressAllSelectEvents = true; 122 _itemTree.view.selection.clearSelection(); 123 _suppressAllSelectEvents = false; 124 125 // only show revert button if at least one selected item has been edited 126 _updateRevertButtonStatus(); 127 } 128 129 // update preview to blank if no items or multiple items are selected; otherwise show 130 // preview for selected items 131 _updatePreview(); 132 } 133 134 /** 135 * Adds references to the reference list 136 */ 137 this.add = function() { 138 for (let itemID of itemsView.getSelectedItems(true)) { 139 bibEditInterface.add(itemID); 140 } 141 document.getElementById("add").disabled = true; 142 _loadItems(); 143 } 144 145 /** 146 * Clears all customizations 147 */ 148 this.revertAll = function() { 149 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] 150 .getService(Components.interfaces.nsIPromptService); 151 152 var out = {}; 153 var regenerate = promptService.confirmEx( 154 window, 155 Zotero.getString('integration.revertAll.title'), 156 Zotero.getString('integration.revertAll.body'), 157 promptService.STD_OK_CANCEL_BUTTONS+promptService.BUTTON_POS_1_DEFAULT, 158 null, null, null, null, out 159 ); 160 161 if(regenerate != 0) return; 162 163 bibEditInterface.revertAll(); 164 165 _loadItems(); 166 _updatePreview(true); 167 } 168 169 /** 170 * Clears customizations to selected entry 171 */ 172 this.revert = function() { 173 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] 174 .getService(Components.interfaces.nsIPromptService); 175 176 var out = {}; 177 var regenerate = promptService.confirmEx( 178 window, 179 Zotero.getString('integration.revert.title'), 180 Zotero.getString('integration.revert.body'), 181 promptService.STD_OK_CANCEL_BUTTONS+promptService.BUTTON_POS_1_DEFAULT, 182 null, null, null, null, out 183 ); 184 185 if(regenerate != 0) return; 186 187 for (let itemID of _getSelectedListItemIDs()) { 188 bibEditInterface.revert(itemID); 189 } 190 191 _updatePreview(); 192 } 193 194 /** 195 * Deletes selected references from the reference list 196 */ 197 this.remove = function() { 198 var selectedListItemIDs = _getSelectedListItemIDs(); 199 200 // if cited in bibliography, warn before removing 201 var isCited = false; 202 for (let itemID of selectedListItemIDs) { 203 isCited |= bibEditInterface.isCited(itemID); 204 } 205 if(isCited) { 206 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] 207 .getService(Components.interfaces.nsIPromptService); 208 209 var out = {}; 210 var regenerate = promptService.confirmEx( 211 window, 212 Zotero.getString('integration.removeBibEntry.title'), 213 Zotero.getString('integration.removeBibEntry.body'), 214 promptService.STD_OK_CANCEL_BUTTONS+promptService.BUTTON_POS_1_DEFAULT, 215 null, null, null, null, out 216 ); 217 if(regenerate != 0) return; 218 } 219 220 // remove 221 for (let itemID of selectedListItemIDs) { 222 bibEditInterface.remove(itemID); 223 } 224 _loadItems(); 225 } 226 227 /** 228 * Called when the user edits the currently selected bibliography entry 229 */ 230 this.textChanged = function() { 231 _revertButton.disabled = _revertAllButton.disabled = false; 232 } 233 234 /** 235 * Called when OK button is pressed 236 */ 237 this.accept = function() { 238 if(_accepted) return; 239 _updatePreview(true); 240 _accepted = true; 241 } 242 243 /** 244 * Called when Cancel button is pressed 245 */ 246 this.close = function() { 247 if(_accepted) return; 248 bibEditInterface.cancel(); 249 _accepted = true; 250 } 251 252 /** 253 * Gets selected item IDs from list box on right 254 */ 255 function _getSelectedListItemIDs() { 256 return Array.from(_itemList.selectedItems) 257 .map(item => bibEditInterface.bib[0].entry_ids[item.value][0]); 258 } 259 260 /** 261 * Update status of "Revert" button to match modification status of current item 262 */ 263 function _updateRevertButtonStatus() { 264 _revertButton.disabled = true; 265 var selectedListItemIDs = _getSelectedListItemIDs(); 266 for (let itemID of selectedListItemIDs) { 267 if(bibEditInterface.isEdited(itemID)) { 268 _revertButton.disabled = false; 269 break; 270 } 271 } 272 } 273 274 /** 275 * Updates the contents of the preview pane 276 */ 277 function _updatePreview(ignoreSelection) { 278 var index = !ignoreSelection && _itemList.selectedItems.length == 1 ? _itemList.selectedIndex : undefined; 279 var editor = document.getElementById('editor'); 280 281 if(_lastSelectedItemID) { 282 var newValue = editor.value; 283 if(_lastSelectedValue != newValue) { 284 bibEditInterface.setCustomText(_lastSelectedItemID, newValue); 285 } 286 } 287 288 editor.readonly = index === undefined; 289 if(index !== undefined) { 290 var itemID = bibEditInterface.bib[0].entry_ids[index]; 291 editor.value = bibEditInterface.bib[1][index]; 292 _lastSelectedIndex = index; 293 _lastSelectedItemID = itemID; 294 _lastSelectedValue = editor.value; 295 } else { 296 editor.value = ""; 297 _lastSelectedIndex = _lastSelectedItemID = _lastSelectedValue = false; 298 } 299 300 _revertAllButton.disabled = !bibEditInterface.isAnyEdited(); 301 } 302 303 /* 304 * loads items from itemSet 305 */ 306 function _loadItems() { 307 var itemIDs = bibEditInterface.bib[0].entry_ids; 308 var items = itemIDs.map(itemID => Zotero.Cite.getItem(itemID[0])); 309 310 // delete all existing items from list 311 var itemList = document.getElementById("item-list"); 312 while(itemList.firstChild) { 313 itemList.removeChild(itemList.firstChild); 314 } 315 316 // add new items 317 for(var i=0; i<items.length; i++) { 318 var itemNode = document.createElement("listitem"); 319 itemNode.setAttribute("value", i); 320 itemNode.setAttribute("label", items[i].getDisplayTitle()); 321 itemNode.setAttribute("class", "listitem-iconic"); 322 itemNode.setAttribute("image", items[i].getImageSrc()); 323 itemList.appendChild(itemNode); 324 } 325 326 _updatePreview(); 327 } 328 }