Closes #1464, Limit number of creators in metadata pane

Displays "[x] more..." label that can be clicked to show all creators. Switching away from the item resets. This might need some further tweaking.

Untruncated display of large creator lists is probably faster now as well, though definitely not enough for the ATLAS Experiment.
This commit is contained in:
Dan Stillman 2011-09-06 06:13:26 +00:00
parent c45198c90b
commit 263439c6ab
3 changed files with 85 additions and 17 deletions

View file

@ -3,7 +3,7 @@ scrollbox
padding-top: 3px;
}
row > label:first-child, .creator-type-label
row > label:first-child, .creator-type-label, #more-creators-label
{
color: #7f7f7f;
}

View file

@ -52,6 +52,9 @@
<field name="clickHandler"/>
<field name="blurHandler"/>
<field name="_initialVisibleCreators">10</field>
<field name="_displayAllCreators"/>
<!-- Modes are predefined settings groups for particular tasks -->
<field name="_mode">"view"</field>
<property name="mode" onget="return this._mode;">
@ -113,6 +116,12 @@
if (!(val instanceof Zotero.Item)) {
throw ("<zoteroitembox>.item must be a Zotero.Item");
}
// When changing items, reset truncation of creator list
if (!this._item || val.id != this._item.id) {
this._displayAllCreators = false;
}
this._item = val;
this.refresh();
]]>
@ -509,20 +518,46 @@
}
this._creatorCount = 0;
if (this.item.numCreators() > 0) {
for (var i = 0, len=this.item.numCreators(); i<len; i++) {
var num = this.item.numCreators();
if (num > 0) {
var max = Math.min(num, this._initialVisibleCreators);
// If fewer than five more, just display
if (num < max + 5 || this._displayAllCreators) {
max = num;
}
for (var i = 0; i < max; i++) {
this.addCreatorRow(this.item.getCreator(i).ref,
this.item.getCreator(i).creatorTypeID);
if (i == max - 2) {
this.disableCreatorAddButtons();
}
}
if (this._addCreatorRow) {
this.addCreatorRow(false, false, true);
this._addCreatorRow = false;
// Additional creators not displayed
if (num > max) {
this.addMoreCreatorsRow(num - max);
this.disableCreatorAddButtons();
}
else {
// If we didn't start with creators truncated,
// don't truncate for as long as we're viewing
// this item, so that added creators aren't
// immediately hidden
this._displayAllCreators = true;
if (this._addCreatorRow) {
this.addCreatorRow(false, false, true);
this._addCreatorRow = false;
this.disableCreatorAddButtons();
}
}
}
else if (this.editable && Zotero.CreatorTypes.itemTypeHasCreators(this.item.itemTypeID)) {
// Add default row
this.addCreatorRow(false, false, true, true);
this.disableCreatorAddButtons();
}
// Move to next or previous field if (shift-)tab was pressed
@ -636,12 +671,6 @@
};
}
// Disable the "+" button on previous rows
var elems = this._dynamicFields.getElementsByAttribute('value', '+');
if (elems.length) {
this.disableButton(elems[elems.length-1]);
}
if (creator.fieldMode == 1) {
var firstName = '';
var lastName = creator.lastName ? creator.lastName : this._defaultFullName;
@ -774,6 +803,27 @@
</method>
<method name="addMoreCreatorsRow">
<parameter name="num"/>
<body>
<![CDATA[
var box = document.createElement('box');
var label = document.createElement('label');
label.id = 'more-creators-label';
// TODO: localize
label.setAttribute('value', num + " more…");
label.setAttribute('onclick',
"var binding = document.getBindingParent(this); "
+ "binding._displayAllCreators = true; "
+ "binding.refresh()"
);
this.addDynamicRow(box, label, true);
]]>
</body>
</method>
<method name="addDateRow">
<parameter name="field"/>
<parameter name="value"/>
@ -1117,18 +1167,31 @@
<![CDATA[
button.setAttribute('disabled', false);
button.setAttribute("onclick",
"document.getBindingParent(this).disableButton(this); "
"var parent = document.getBindingParent(this); "
+ "parent.disableButton(this); "
+ "var creator = new Zotero.Creator; "
+ "creator.fieldMode = " + (fieldMode ? fieldMode : 0) + "; "
+ "document.getBindingParent(this).addCreatorRow(creator, "
+ (creatorTypeID ? creatorTypeID : 'false') + ", true);");
+ "parent.addCreatorRow("
+ "creator, "
+ (creatorTypeID ? creatorTypeID : 'false') + ", true"
+ ");"
);
]]>
</body>
</method>
<method name="disableCreatorAddButtons">
<body>
<![CDATA[
// Disable the "+" button on all creator rows
var elems = this._dynamicFields.getElementsByAttribute('value', '+');
for (var i = 0, len = elems.length; i < len; i++) {
this.disableButton(elems[i]);
}
]]>
</body>
</method>
<method name="createValueElement">

View file

@ -30,6 +30,11 @@ row > label:first-child, .creator-type-label
margin-right: 0 !important;
}
#more-creators-label
{
font-weight: bold;
}
row > label
{
border: 1px solid transparent;