Offer autocomplete of same creator for different creator types
If a creator exists on an item but is a different creator type than the one being entered, show creator in autocomplete list.
This commit is contained in:
parent
39e92bacb3
commit
7572eebcd1
|
@ -1422,13 +1422,25 @@
|
||||||
|| fieldName == 'creator') {
|
|| fieldName == 'creator') {
|
||||||
t.setAttribute('type', 'autocomplete');
|
t.setAttribute('type', 'autocomplete');
|
||||||
t.setAttribute('autocompletesearch', 'zotero');
|
t.setAttribute('autocompletesearch', 'zotero');
|
||||||
let params = {
|
|
||||||
|
var params = {
|
||||||
fieldName: fieldName,
|
fieldName: fieldName,
|
||||||
libraryID: this.item.libraryID
|
libraryID: this.item.libraryID
|
||||||
};
|
};
|
||||||
if (field == 'creator') {
|
if (field == 'creator') {
|
||||||
params.fieldMode = parseInt(elem.getAttribute('fieldMode'));
|
params.fieldMode = parseInt(elem.getAttribute('fieldMode'));
|
||||||
params.itemID = itemID ? itemID : '';
|
|
||||||
|
// Include itemID and creatorTypeID so the autocomplete can
|
||||||
|
// avoid showing results for creators already set on the item
|
||||||
|
var row = Zotero.getAncestorByTagName(elem, 'row');
|
||||||
|
var creatorTypeID = parseInt(
|
||||||
|
row.getElementsByClassName('creator-type-label')[0]
|
||||||
|
.getAttribute('typeid')
|
||||||
|
);
|
||||||
|
if (itemID) {
|
||||||
|
params.itemID = itemID;
|
||||||
|
params.creatorTypeID = creatorTypeID;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
t.setAttribute(
|
t.setAttribute(
|
||||||
'autocompletesearchparam', JSON.stringify(params)
|
'autocompletesearchparam', JSON.stringify(params)
|
||||||
|
@ -2163,6 +2175,25 @@
|
||||||
</body>
|
</body>
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
|
|
||||||
|
<method name="_updateAutoCompleteParams">
|
||||||
|
<parameter name="row"/>
|
||||||
|
<parameter name="changedParams"/>
|
||||||
|
<body>
|
||||||
|
<![CDATA[
|
||||||
|
var textboxes = row.getElementsByTagName('textbox');
|
||||||
|
if (textboxes.length) {
|
||||||
|
var t = textboxes[0];
|
||||||
|
var params = JSON.parse(t.getAttribute('autocompletesearchparam'));
|
||||||
|
for (var param in changedParams) {
|
||||||
|
params[param] = changedParams[param];
|
||||||
|
}
|
||||||
|
t.setAttribute('autocompletesearchparam', JSON.stringify(params));
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</body>
|
||||||
|
</method>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
/*
|
/*
|
||||||
function modifyCreatorByID(index, creatorID, creatorTypeID) {
|
function modifyCreatorByID(index, creatorID, creatorTypeID) {
|
||||||
|
@ -2365,15 +2396,17 @@
|
||||||
oncommand="var typeBox = document.popupNode.localName == 'hbox' ? document.popupNode : document.popupNode.parentNode;
|
oncommand="var typeBox = document.popupNode.localName == 'hbox' ? document.popupNode : document.popupNode.parentNode;
|
||||||
var index = parseInt(typeBox.getAttribute('fieldname').split('-')[1]);
|
var index = parseInt(typeBox.getAttribute('fieldname').split('-')[1]);
|
||||||
|
|
||||||
|
var itemBox = document.getBindingParent(this);
|
||||||
|
|
||||||
if (event.explicitOriginalTarget.className == 'zotero-creator-move') {
|
if (event.explicitOriginalTarget.className == 'zotero-creator-move') {
|
||||||
var up = event.explicitOriginalTarget.id == 'zotero-creator-move-up';
|
var up = event.explicitOriginalTarget.id == 'zotero-creator-move-up';
|
||||||
document.getBindingParent(this).moveCreator(index, up);
|
itemBox.moveCreator(index, up);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var typeID = event.explicitOriginalTarget.getAttribute('typeid');
|
var typeID = event.explicitOriginalTarget.getAttribute('typeid');
|
||||||
var row = typeBox.parentNode;
|
var row = typeBox.parentNode;
|
||||||
var fields = document.getBindingParent(this).getCreatorFields(row);
|
var fields = itemBox.getCreatorFields(row);
|
||||||
fields.creatorTypeID = typeID;
|
fields.creatorTypeID = typeID;
|
||||||
typeBox.getElementsByTagName('label')[0].setAttribute(
|
typeBox.getElementsByTagName('label')[0].setAttribute(
|
||||||
'value',
|
'value',
|
||||||
|
@ -2382,7 +2415,16 @@
|
||||||
) + ':'
|
) + ':'
|
||||||
);
|
);
|
||||||
typeBox.setAttribute('typeid', typeID);
|
typeBox.setAttribute('typeid', typeID);
|
||||||
document.getBindingParent(this).modifyCreator(index, fields);"/>
|
|
||||||
|
// If a creator textbox is already open, we need to
|
||||||
|
// change its autocomplete parameters so that it
|
||||||
|
// completes on a creator with a different creator type
|
||||||
|
var changedParams = {
|
||||||
|
creatorTypeID: typeID
|
||||||
|
};
|
||||||
|
itemBox._updateAutoCompleteParams(row, changedParams);
|
||||||
|
|
||||||
|
itemBox.modifyCreator(index, fields);"/>
|
||||||
<menupopup id="zotero-field-transform-menu">
|
<menupopup id="zotero-field-transform-menu">
|
||||||
<menu label="&zotero.item.textTransform;">
|
<menu label="&zotero.item.textTransform;">
|
||||||
<menupopup>
|
<menupopup>
|
||||||
|
|
|
@ -140,23 +140,26 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParams,
|
||||||
}
|
}
|
||||||
|
|
||||||
var fromSQL = " FROM creators NATURAL JOIN creatorData "
|
var fromSQL = " FROM creators NATURAL JOIN creatorData "
|
||||||
+ "WHERE " + subField + " LIKE ?1 " + "AND fieldMode=?2";
|
+ "WHERE " + subField + " LIKE ? " + "AND fieldMode=?";
|
||||||
var sqlParams = [
|
var sqlParams = [
|
||||||
searchString + '%',
|
searchString + '%',
|
||||||
searchParams.fieldMode ? searchParams.fieldMode : 0
|
searchParams.fieldMode ? searchParams.fieldMode : 0
|
||||||
];
|
];
|
||||||
if (searchParams.itemID) {
|
if (searchParams.itemID) {
|
||||||
fromSQL += " AND creatorID NOT IN (SELECT creatorID FROM "
|
fromSQL += " AND creatorID NOT IN (SELECT creatorID FROM "
|
||||||
+ "itemCreators WHERE itemID=?3)";
|
+ "itemCreators WHERE itemID=?";
|
||||||
sqlParams.push(searchParams.itemID);
|
sqlParams.push(searchParams.itemID);
|
||||||
|
if (searchParams.creatorTypeID) {
|
||||||
|
fromSQL += " AND creatorTypeID=?";
|
||||||
|
sqlParams.push(searchParams.creatorTypeID);
|
||||||
|
}
|
||||||
|
fromSQL += ")";
|
||||||
}
|
}
|
||||||
if (typeof searchParams.libraryID != 'undefined') {
|
if (typeof searchParams.libraryID != 'undefined') {
|
||||||
if (searchParams.libraryID) {
|
if (searchParams.libraryID) {
|
||||||
fromSQL += " AND libraryID=?4";
|
fromSQL += " AND libraryID=?";
|
||||||
sqlParams.push(searchParams.libraryID);
|
sqlParams.push(searchParams.libraryID);
|
||||||
}
|
}
|
||||||
// The db query code doesn't properly replace numbered
|
|
||||||
// parameters with "IS NULL"
|
|
||||||
else {
|
else {
|
||||||
fromSQL += " AND libraryID IS NULL";
|
fromSQL += " AND libraryID IS NULL";
|
||||||
}
|
}
|
||||||
|
@ -170,6 +173,7 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParams,
|
||||||
sql = "SELECT * FROM (" + sql + " UNION SELECT DISTINCT "
|
sql = "SELECT * FROM (" + sql + " UNION SELECT DISTINCT "
|
||||||
+ subField + " AS val, creatorID || '-1' AS comment"
|
+ subField + " AS val, creatorID || '-1' AS comment"
|
||||||
+ fromSQL + ") GROUP BY val";
|
+ fromSQL + ") GROUP BY val";
|
||||||
|
sqlParams = sqlParams.concat(sqlParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
sql += " ORDER BY val";
|
sql += " ORDER BY val";
|
||||||
|
|
Loading…
Reference in New Issue
Block a user