zotero/chrome/content/zotero/itemPane.js
Dan Stillman f932f312eb Overhaul tags box
- 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)
2013-03-09 03:05:29 -05:00

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);