zotero/chrome/content/zotero/integration/editBibliographyDialog.js
Adomas Venčkauskas 5805c7e562 Integration refactor megacommit
- Removed obsolete logic for citation.properties.deleted, which is no
  longer set anywhere
- Introduced a bibliography class
- BibliographyEditInterface no longer edits state
- Fields._processFields() now has linear flow because:
- Exception handling for missing items and corrupt fields reworked to be
  handled in relevant Field classes, so that the flow remains linear
- Document modifying functions (i.e. Fields.updateDocument()) now only
  called in Zotero.Integration.Interface functions instead of all over
  the place
- document.setDocPrefs() now called after every execCommand() since
  the cost is trivial, but that simplifies a bunch of logic
- Misc code cleanup

TODO at some point in the future:
- Move Integration.(init/delete)Pipe out
- Decouple references and clarify functions in Integration.Fields and
  Integration.Session
2018-01-03 14:27:16 +02:00

328 lines
9.3 KiB
JavaScript

/*
***** BEGIN LICENSE BLOCK *****
Copyright © 2009 Center for History and New Media
George Mason University, Fairfax, Virginia, USA
http://zotero.org
This file is part of Zotero.
Zotero is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Zotero is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
***** END LICENSE BLOCK *****
*/
var Zotero_Bibliography_Dialog = new function () {
var bibEditInterface;
var _lastSelectedItemID = false;
var _lastSelectedIndex = false;
var _lastSelectedValue = false;
var _accepted = false;
var _revertButton, _revertAllButton, _addButton, _removeButton;
var _itemList;
var _suppressAllSelectEvents = false;
/**
* Initializes add citation dialog
*/
this.load = function() {
bibEditInterface = window.arguments[0].wrappedJSObject;
_revertAllButton = document.documentElement.getButton("extra2");
_revertButton = document.documentElement.getButton("extra1");
_addButton = document.getElementById("add");
_removeButton = document.getElementById("remove");
_itemList = document.getElementById("item-list");
_itemTree = document.getElementById("zotero-items-tree");
_revertAllButton.label = Zotero.getString("integration.revertAll.button");
_revertAllButton.disabled = bibEditInterface.isAnyEdited();
_revertButton.label = Zotero.getString("integration.revert.button");
_revertButton.disabled = true;
document.getElementById('editor').format = "RTF";
// load (from selectItemsDialog.js)
doLoad();
// load bibliography entires
_loadItems();
}
/**
* Called when an item in the item selection tree is clicked
*/
this.treeItemSelected = function() {
if(_suppressAllSelectEvents) return;
var selectedItemIDs = itemsView.getSelectedItems(true); // treeview from selectItemsDialog.js
// if all selected items are available in the list box on the right, select them there
// otherwise, clear the list box selection
var clearListItems = false;
var itemsToSelect = [];
if(selectedItemIDs.length) {
for (let itemID of selectedItemIDs) {
var itemIndexToSelect = false;
for(var i in bibEditInterface.bib[0].entry_ids) {
if(bibEditInterface.bib[0].entry_ids[i].indexOf(itemID) !== -1) {
itemIndexToSelect = i;
continue;
}
}
if(itemIndexToSelect !== false) {
itemsToSelect.push(_itemList.getItemAtIndex(itemIndexToSelect));
} else {
clearListItems = true;
break;
}
}
}
_suppressAllSelectEvents = true;
_itemList.clearSelection();
if(clearListItems) {
_addButton.disabled = (itemsToSelect.length > 0);
_revertButton.disabled = _removeButton.disabled = true;
} else {
_addButton.disabled = true;
_removeButton.disabled = false;
_updateRevertButtonStatus();
itemsToSelect.forEach(item => _itemList.toggleItemSelection(item));
_itemList.ensureIndexIsVisible(itemsToSelect[0]);
}
_suppressAllSelectEvents = false;
_updatePreview();
}
/**
* Called when an item in the reference list is clicked
*/
this.listItemSelected = function() {
if(_suppressAllSelectEvents) return;
// enable remove if at least one item is selected
_addButton.disabled = true;
_removeButton.disabled = !_itemList.selectedItems.length;
if(_itemList.selectedItems.length) {
_suppressAllSelectEvents = true;
_itemTree.view.selection.clearSelection();
_suppressAllSelectEvents = false;
// only show revert button if at least one selected item has been edited
_updateRevertButtonStatus();
}
// update preview to blank if no items or multiple items are selected; otherwise show
// preview for selected items
_updatePreview();
}
/**
* Adds references to the reference list
*/
this.add = function() {
for (let itemID of itemsView.getSelectedItems(true)) {
bibEditInterface.add(itemID);
}
document.getElementById("add").disabled = true;
_loadItems();
}
/**
* Clears all customizations
*/
this.revertAll = function() {
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
var out = {};
var regenerate = promptService.confirmEx(
window,
Zotero.getString('integration.revertAll.title'),
Zotero.getString('integration.revertAll.body'),
promptService.STD_OK_CANCEL_BUTTONS+promptService.BUTTON_POS_1_DEFAULT,
null, null, null, null, out
);
if(regenerate != 0) return;
bibEditInterface.revertAll();
_loadItems();
_updatePreview(true);
}
/**
* Clears customizations to selected entry
*/
this.revert = function() {
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
var out = {};
var regenerate = promptService.confirmEx(
window,
Zotero.getString('integration.revert.title'),
Zotero.getString('integration.revert.body'),
promptService.STD_OK_CANCEL_BUTTONS+promptService.BUTTON_POS_1_DEFAULT,
null, null, null, null, out
);
if(regenerate != 0) return;
for (let itemID of _getSelectedListItemIDs()) {
bibEditInterface.revert(itemID);
}
_updatePreview();
}
/**
* Deletes selected references from the reference list
*/
this.remove = function() {
var selectedListItemIDs = _getSelectedListItemIDs();
// if cited in bibliography, warn before removing
var isCited = false;
for (let itemID of selectedListItemIDs) {
isCited |= bibEditInterface.isCited(itemID);
}
if(isCited) {
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
var out = {};
var regenerate = promptService.confirmEx(
window,
Zotero.getString('integration.removeBibEntry.title'),
Zotero.getString('integration.removeBibEntry.body'),
promptService.STD_OK_CANCEL_BUTTONS+promptService.BUTTON_POS_1_DEFAULT,
null, null, null, null, out
);
if(regenerate != 0) return;
}
// remove
for (let itemID of selectedListItemIDs) {
bibEditInterface.remove(itemID);
}
_loadItems();
}
/**
* Called when the user edits the currently selected bibliography entry
*/
this.textChanged = function() {
_revertButton.disabled = _revertAllButton.disabled = false;
}
/**
* Called when OK button is pressed
*/
this.accept = function() {
if(_accepted) return;
_updatePreview(true);
_accepted = true;
}
/**
* Called when Cancel button is pressed
*/
this.close = function() {
if(_accepted) return;
bibEditInterface.cancel();
_accepted = true;
}
/**
* Gets selected item IDs from list box on right
*/
function _getSelectedListItemIDs() {
return Array.from(_itemList.selectedItems)
.map(item => bibEditInterface.bib[0].entry_ids[item.value][0]);
}
/**
* Update status of "Revert" button to match modification status of current item
*/
function _updateRevertButtonStatus() {
_revertButton.disabled = true;
var selectedListItemIDs = _getSelectedListItemIDs();
for (let itemID of selectedListItemIDs) {
if(bibEditInterface.isEdited(itemID)) {
_revertButton.disabled = false;
break;
}
}
}
/**
* Updates the contents of the preview pane
*/
function _updatePreview(ignoreSelection) {
var index = !ignoreSelection && _itemList.selectedItems.length == 1 ? _itemList.selectedIndex : undefined;
var editor = document.getElementById('editor');
if(_lastSelectedItemID) {
var newValue = editor.value;
if(_lastSelectedValue != newValue) {
bibEditInterface.setCustomText(_lastSelectedItemID, newValue);
}
}
editor.readonly = index === undefined;
if(index !== undefined) {
var itemID = bibEditInterface.bib[0].entry_ids[index];
editor.value = bibEditInterface.bib[1][index];
_lastSelectedIndex = index;
_lastSelectedItemID = itemID;
_lastSelectedValue = editor.value;
} else {
editor.value = "";
_lastSelectedIndex = _lastSelectedItemID = _lastSelectedValue = false;
}
_revertAllButton.disabled = !bibEditInterface.isAnyEdited();
}
/*
* loads items from itemSet
*/
function _loadItems() {
var itemIDs = bibEditInterface.bib[0].entry_ids;
var items = itemIDs.map(itemID => Zotero.Cite.getItem(itemID[0]));
// delete all existing items from list
var itemList = document.getElementById("item-list");
while(itemList.firstChild) {
itemList.removeChild(itemList.firstChild);
}
// add new items
for(var i=0; i<items.length; i++) {
var itemNode = document.createElement("listitem");
itemNode.setAttribute("value", i);
itemNode.setAttribute("label", items[i].getDisplayTitle());
itemNode.setAttribute("class", "listitem-iconic");
itemNode.setAttribute("image", items[i].getImageSrc());
itemList.appendChild(itemNode);
}
_updatePreview();
}
}