f932f312eb
- Improvements to #20, with the tags box switching to a multiline textbox in the style of #164 on a multiline paste or Shift-Return. In the multiline box, Return is a newline and Shift-Return saves - Allow tabbing through tags via keyboard (and keep the last empty textbox open on tab, so you can hold down the tab key to get all the way to the end) - Fix various post-update focusing issues (though the wrong textbox is still selected for some multiline updates via Tab/Shift-Tab) - Make (single-line) tag entering much faster by not reloading the whole tags list and just placing the new tag in the correct sorted position. This could be made even faster with tag selector optimizations. - Allow the Add button to focus when switching to the Tags pane (and the same for the Related pane, for good measure)
186 lines
4.9 KiB
JavaScript
186 lines
4.9 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 ZoteroItemPane = new function() {
|
|
this.onLoad = onLoad;
|
|
|
|
var _lastItem, _itemBox, _notesLabel, _notesButton, _notesList, _tagsBox, _relatedBox;
|
|
|
|
function onLoad()
|
|
{
|
|
if (!Zotero || !Zotero.initialized) {
|
|
return;
|
|
}
|
|
|
|
// Not in item pane, so skip the introductions
|
|
if (!document.getElementById('zotero-view-tabbox')) {
|
|
return;
|
|
}
|
|
|
|
_itemBox = document.getElementById('zotero-editpane-item-box');
|
|
_notesLabel = document.getElementById('zotero-editpane-notes-label');
|
|
_notesButton = document.getElementById('zotero-editpane-notes-add');
|
|
_notesList = document.getElementById('zotero-editpane-dynamic-notes');
|
|
_tagsBox = document.getElementById('zotero-editpane-tags');
|
|
_relatedBox = document.getElementById('zotero-editpane-related');
|
|
}
|
|
|
|
|
|
/*
|
|
* Load a top-level item
|
|
*/
|
|
this.viewItem = function (item, mode, index) {
|
|
if (!index) {
|
|
index = 0;
|
|
}
|
|
|
|
Zotero.debug('Viewing item in pane ' + index);
|
|
|
|
switch (index) {
|
|
case 0:
|
|
var box = _itemBox;
|
|
break;
|
|
|
|
case 2:
|
|
var box = _tagsBox;
|
|
break;
|
|
|
|
case 3:
|
|
var box = _relatedBox;
|
|
break;
|
|
}
|
|
|
|
// Force blur() when clicking off a textbox to another item in middle
|
|
// pane, since for some reason it's not being called automatically
|
|
if (_lastItem && _lastItem != item) {
|
|
switch (index) {
|
|
case 0:
|
|
case 2:
|
|
box.blurOpenField();
|
|
// DEBUG: Currently broken
|
|
//box.scrollToTop();
|
|
break;
|
|
}
|
|
}
|
|
|
|
_lastItem = item;
|
|
|
|
if (index == 1) {
|
|
var editable = ZoteroPane_Local.canEdit();
|
|
_notesButton.hidden = !editable;
|
|
|
|
while(_notesList.hasChildNodes()) {
|
|
_notesList.removeChild(_notesList.firstChild);
|
|
}
|
|
|
|
var notes = Zotero.Items.get(item.getNotes());
|
|
if (notes.length) {
|
|
for(var i = 0; i < notes.length; i++) {
|
|
let id = notes[i].id;
|
|
|
|
var icon = document.createElement('image');
|
|
icon.className = "zotero-box-icon";
|
|
icon.setAttribute('src','chrome://zotero/skin/treeitem-note.png');
|
|
|
|
var label = document.createElement('label');
|
|
label.className = "zotero-box-label";
|
|
var title = Zotero.Notes.noteToTitle(notes[i].getNote());
|
|
title = title ? title : Zotero.getString('pane.item.notes.untitled');
|
|
label.setAttribute('value', title);
|
|
label.setAttribute('flex','1'); //so that the long names will flex smaller
|
|
label.setAttribute('crop','end');
|
|
|
|
var box = document.createElement('box');
|
|
box.setAttribute('class','zotero-clicky');
|
|
box.addEventListener('click', function () { ZoteroPane_Local.selectItem(id); });
|
|
box.appendChild(icon);
|
|
box.appendChild(label);
|
|
|
|
if (editable) {
|
|
var removeButton = document.createElement('label');
|
|
removeButton.setAttribute("value","-");
|
|
removeButton.setAttribute("class","zotero-clicky zotero-clicky-minus");
|
|
removeButton.addEventListener('click', function () { ZoteroItemPane.removeNote(id); });
|
|
}
|
|
|
|
var row = document.createElement('row');
|
|
row.appendChild(box);
|
|
if (editable) {
|
|
row.appendChild(removeButton);
|
|
}
|
|
|
|
_notesList.appendChild(row);
|
|
}
|
|
}
|
|
|
|
_updateNoteCount();
|
|
return;
|
|
}
|
|
|
|
if (mode) {
|
|
box.mode = mode;
|
|
}
|
|
else {
|
|
box.mode = 'edit';
|
|
}
|
|
box.item = item;
|
|
}
|
|
|
|
|
|
this.addNote = function (popup) {
|
|
ZoteroPane_Local.newNote(popup, _lastItem.id);
|
|
}
|
|
|
|
|
|
this.removeNote = function (id) {
|
|
var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
|
|
.getService(Components.interfaces.nsIPromptService);
|
|
if (ps.confirm(null, '', Zotero.getString('pane.item.notes.delete.confirm'))) {
|
|
Zotero.Items.trash(id);
|
|
}
|
|
}
|
|
|
|
|
|
function _updateNoteCount() {
|
|
var c = _notesList.childNodes.length;
|
|
|
|
var str = 'pane.item.notes.count.';
|
|
switch (c){
|
|
case 0:
|
|
str += 'zero';
|
|
break;
|
|
case 1:
|
|
str += 'singular';
|
|
break;
|
|
default:
|
|
str += 'plural';
|
|
break;
|
|
}
|
|
|
|
_notesLabel.value = Zotero.getString(str, [c]);
|
|
}
|
|
}
|
|
|
|
addEventListener("load", function(e) { ZoteroItemPane.onLoad(e); }, false);
|