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; padding-top: 3px;
} }
row > label:first-child, .creator-type-label row > label:first-child, .creator-type-label, #more-creators-label
{ {
color: #7f7f7f; color: #7f7f7f;
} }

View file

@ -52,6 +52,9 @@
<field name="clickHandler"/> <field name="clickHandler"/>
<field name="blurHandler"/> <field name="blurHandler"/>
<field name="_initialVisibleCreators">10</field>
<field name="_displayAllCreators"/>
<!-- Modes are predefined settings groups for particular tasks --> <!-- Modes are predefined settings groups for particular tasks -->
<field name="_mode">"view"</field> <field name="_mode">"view"</field>
<property name="mode" onget="return this._mode;"> <property name="mode" onget="return this._mode;">
@ -113,6 +116,12 @@
if (!(val instanceof Zotero.Item)) { if (!(val instanceof Zotero.Item)) {
throw ("<zoteroitembox>.item must be a 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._item = val;
this.refresh(); this.refresh();
]]> ]]>
@ -509,20 +518,46 @@
} }
this._creatorCount = 0; this._creatorCount = 0;
if (this.item.numCreators() > 0) { var num = this.item.numCreators();
for (var i = 0, len=this.item.numCreators(); i<len; i++) { 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.addCreatorRow(this.item.getCreator(i).ref,
this.item.getCreator(i).creatorTypeID); this.item.getCreator(i).creatorTypeID);
if (i == max - 2) {
this.disableCreatorAddButtons();
}
} }
if (this._addCreatorRow) { // Additional creators not displayed
this.addCreatorRow(false, false, true); if (num > max) {
this._addCreatorRow = false; 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)) { else if (this.editable && Zotero.CreatorTypes.itemTypeHasCreators(this.item.itemTypeID)) {
// Add default row // Add default row
this.addCreatorRow(false, false, true, true); this.addCreatorRow(false, false, true, true);
this.disableCreatorAddButtons();
} }
// Move to next or previous field if (shift-)tab was pressed // 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) { if (creator.fieldMode == 1) {
var firstName = ''; var firstName = '';
var lastName = creator.lastName ? creator.lastName : this._defaultFullName; var lastName = creator.lastName ? creator.lastName : this._defaultFullName;
@ -774,6 +803,27 @@
</method> </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"> <method name="addDateRow">
<parameter name="field"/> <parameter name="field"/>
<parameter name="value"/> <parameter name="value"/>
@ -1117,18 +1167,31 @@
<![CDATA[ <![CDATA[
button.setAttribute('disabled', false); button.setAttribute('disabled', false);
button.setAttribute("onclick", button.setAttribute("onclick",
"document.getBindingParent(this).disableButton(this); " "var parent = document.getBindingParent(this); "
+ "parent.disableButton(this); "
+ "var creator = new Zotero.Creator; " + "var creator = new Zotero.Creator; "
+ "creator.fieldMode = " + (fieldMode ? fieldMode : 0) + "; " + "creator.fieldMode = " + (fieldMode ? fieldMode : 0) + "; "
+ "document.getBindingParent(this).addCreatorRow(creator, " + "parent.addCreatorRow("
+ (creatorTypeID ? creatorTypeID : 'false') + ", true);"); + "creator, "
+ (creatorTypeID ? creatorTypeID : 'false') + ", true"
+ ");"
);
]]> ]]>
</body> </body>
</method> </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"> <method name="createValueElement">

View file

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