Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Editor / Associated resources panel / Extend DOI to support Crossref in addition to Datacite searches #8610

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -1069,6 +1069,16 @@
"isTemplate": "n"
}
},
"doiapi": {
"datacite": {
"url": "https://api.datacite.org/dois",
"params": {"query": "titles.title:{query}* OR doi:{query} OR id:{query}"}
},
"crossref": {
"url": "https://api.crossref.org/[email protected]",
"params": {"query": "rows=10&query={query}"}
}
},
"remoteurl": {"multiple": true}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2452,14 +2452,17 @@
*/
.directive("gnDoiSearchPanel", [
"gnDoiSearchService",
function (gnDoiSearchService) {
"$q",
function (gnDoiSearchService, $q) {
return {
restrict: "A",
replace: true,
scope: {
doiUrl: "=?",
doiPrefix: "=?",
doiQueryPattern: "=?",
doiCrossrefUrl: "=?",
doiCrossrefQueryPattern: "=?",
mode: "@",
addToSelectionCb: "&?",
removeFromSelectionCb: "&?"
Expand All @@ -2469,6 +2472,7 @@
link: function (scope, element, attrs) {
// select (single value) / add mode (used in siblings dialog)
scope.mode = scope.mode || "select";
scope.searchedValue = false;
scope.updateSelection = angular.isFunction(scope.addToSelectionCb)
? function (md) {
if (scope.isSelected(md)) {
Expand All @@ -2491,49 +2495,133 @@
scope.isSearching = false;

scope.clearSearch = function () {
scope.searchedValue = false;
scope.queryValue = "";
scope.results = [];
};

scope.$on("resetSearch", scope.clearSearch);

scope.search = function () {
var searchQuery =
scope.queryValue !== ""
? scope.doiQueryPattern.replaceAll("{query}", scope.queryValue)
: "";
var processResultsDatacite = function (resultsDatacite) {
var results = [];

angular.forEach(resultsDatacite, function (r) {
results.push({
uuid: r.id,
remoteUrl: r.attributes.url,
resourceTitle:
r.attributes.titles.length > 0 ? r.attributes.titles[0].title : r.url,
title:
r.attributes.titles.length > 0 ? r.attributes.titles[0].title : r.url,
description:
r.attributes.descriptions.length > 0
? r.attributes.descriptions[0].descriptions
: "",
source: "Datacite"
});
});

return results;
};

var processResultsCrossref = function (resultsCrossref) {
var results = [];

angular.forEach(resultsCrossref, function (r) {
results.push({
uuid: r.DOI,
remoteUrl: r.URL,
resourceTitle: r.title && r.title.length > 0 ? r.title[0] : "",
title: r.title && r.title.length > 0 ? r.title[0] : "",
description: r.abstract && r.abstract.length > 0 ? r.abstract[0] : "",
source: "Crossref"
});
});

return results;
};

var sortResults = function () {
scope.results.sort(function (a, b) {
if (a.resourceTitle < b.resourceTitle) {
return -1;
}
if (a.resourceTitle > b.resourceTitle) {
return 1;
}
return 0;
});
};
var dataciteQuery = function () {
return scope.queryValue !== ""
? scope.doiQueryPattern.replaceAll(
"{query}",
encodeURIComponent(scope.queryValue)
)
: "";
};

var crossrefQuery = function () {
return scope.crossrefQueryValue !== ""
? scope.doiCrossrefQueryPattern
.replaceAll("{query}", encodeURIComponent(scope.queryValue))
.replaceAll("{prefix}", scope.doiPrefix)
: "";
};

var internalSearch = function (doDataciteSearch, doCrossrefSearch) {
scope.isSearching = true;
gnDoiSearchService.search(scope.doiUrl, scope.doiPrefix, searchQuery).then(
var results = [];
var promises = [];
if (doDataciteSearch) {
promises.push(
gnDoiSearchService.search(
scope.doiUrl,
scope.doiPrefix,
dataciteQuery()
)
);
}
if (doCrossrefSearch) {
promises.push(
gnDoiSearchService.searchCrossref(
scope.doiCrossrefUrl,
scope.doiPrefix,
crossrefQuery()
)
);
}
$q.all(promises).then(
function (response) {
scope.isSearching = false;
var results = [];

angular.forEach(response.data.data, function (r) {
results.push({
uuid: r.id,
remoteUrl: r.attributes.url,
resourceTitle:
r.attributes.titles.length > 0
? r.attributes.titles[0].title
: r.url,
title:
r.attributes.titles.length > 0
? r.attributes.titles[0].title
: r.url,
description:
r.attributes.descriptions.length > 0
? r.attributes.descriptions[0].descriptions
: ""
});
});

scope.results = results;
for (var i = 0; i < response.length; i++) {
if (response[i].data.data) {
results = results.concat(
processResultsDatacite(response[i].data.data)
);
} else if (response[i].data.message.items) {
results = results.concat(
processResultsCrossref(response[i].data.message.items)
);
}
scope.results = results;
sortResults();
scope.isSearching = false;
}
},
function (response) {
scope.isSearching = false;
}
);
};

scope.search = function () {
scope.searchedValue = true;

var doDataciteSearch = scope.doiUrl !== "";
var doCrossrefSearch = scope.doiCrossrefUrl !== "";

internalSearch(doDataciteSearch, doCrossrefSearch);
};
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -930,14 +930,25 @@
module.service("gnDoiSearchService", [
"$http",
function ($http) {
function buildBaseUrl(url) {
var containsQuestionMark = url.indexOf("?") >= 0;
return url + (containsQuestionMark ? "&" : "?");
}
return {
search: function (url, prefix, query) {
var url = buildBaseUrl(url);
if (prefix) {
url += "prefix=" + prefix + "&";
}
return $http.get(
url +
"?prefix=" +
prefix +
"&query=" +
query.replaceAll("https://doi.org/", "")
url + "query=" + query.replaceAll(encodeURIComponent("https://doi.org/"), "")
);
},
searchCrossref: function (url, prefix, query) {
return $http.get(
buildBaseUrl(url) +
"select=DOI%2Ctitle%2Ctype%2Cprefix%2Cabstract%2CURL&" +
query
);
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,35 +32,37 @@
<i data-ng-show="isSearching" class="fa fa-spinner fa-spin gn-margin-top-sm"></i>
<p
class="gn-margin-top-sm"
data-ng-show="!isSearching && results.length == 0"
data-translate=""
data-ng-show="(searchedValue && !isSearching && results.length == 0 )"
>
zarooResult
{{ 'zarooResult' | translate }}
</p>

<ul class="list-group gn-nopadding-left gn-nopadding-right">
<li
data-ng-repeat="md in results"
class="list-group-item"
data-ng-class="(mode == 'select' && isSelected(md)) ? 'active' : ''"
>
<div class="d-inline pull-right gn-margin-left-sm">
<a target="_blank" href="{{md.remoteUrl}}" rel="noopener noreferrer">
<span class="fa fa-eye"></span
></a>
</div>
<div
class="d-inline"
style="cursor: pointer"
data-ng-click="updateSelection(md, associationType, initiativeType)"
<div>
<ul class="list-group gn-nopadding-left gn-nopadding-right">
<li
data-ng-repeat="md in results"
class="list-group-item"
data-ng-class="(mode == 'select' && isSelected(md)) ? 'active' : ''"
>
{{md.resourceTitle}}
<div data-ng-if="mode == 'add'" class="pull-right">
<span class="fa fa-plus"></span>
<div class="d-inline pull-right gn-margin-left-sm">
<a target="_blank" href="{{md.remoteUrl}}" rel="noopener noreferrer">
<span class="fa fa-eye"></span
></a>
</div>
</div>
</li>
</ul>
<div
class="d-inline"
style="cursor: pointer"
data-ng-click="updateSelection(md, associationType, initiativeType)"
title="{{md.source}}"
>
{{md.resourceTitle}}
<div data-ng-if="mode == 'add'" class="pull-right">
<span class="fa fa-plus"></span>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@
<div
class="form-group gn-nomargin-bottom"
data-gn-doi-search-panel=""
data-doi-url="config.sources['doiapi'].url"
data-doi-prefix="config.sources['doiapi'].params.prefix"
data-doi-query-pattern="config.sources['doiapi'].params.query"
data-doi-url="config.sources['doiapi']['datacite'].url"
data-doi-prefix="config.sources['doiapi'].prefix"
data-doi-query-pattern="config.sources['doiapi']['datacite'].params.query"
data-doi-crossref-url="config.sources['doiapi']['crossref'].url"
data-doi-crossref-query-pattern="config.sources['doiapi']['crossref'].params.query"
data-add-to-selection-cb="addToSelection(record)"
data-remove-from-selection-cb="removeFromSelection(record)"
data-ng-show="config.sources['doiapi']"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@
<div
class="form-group gn-nomargin-bottom"
data-gn-doi-search-panel=""
data-doi-url="config.sources['doiapi'].url"
data-doi-prefix="config.sources['doiapi'].params.prefix"
data-doi-query-pattern="config.sources['doiapi'].params.query"
data-doi-url="config.sources['doiapi']['datacite'].url"
data-doi-prefix="config.sources['doiapi'].prefix"
data-doi-query-pattern="config.sources['doiapi']['datacite'].params.query"
data-doi-crossref-url="config.sources['doiapi']['crossref'].url"
data-doi-crossref-query-pattern="config.sources['doiapi']['crossref'].params.query"
data-add-to-selection-cb="addToSelection(record)"
data-remove-from-selection-cb="removeFromSelection(record)"
data-ng-show="config.sources['doiapi']"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,11 @@
<div
class="form-group gn-nomargin-bottom"
data-gn-doi-search-panel=""
data-doi-url="config.sources['doiapi'].url"
data-doi-prefix="config.sources['doiapi'].params.prefix"
data-doi-query-pattern="config.sources['doiapi'].params.query"
data-doi-url="config.sources['doiapi']['datacite'].url"
data-doi-prefix="config.sources['doiapi'].prefix"
data-doi-query-pattern="config.sources['doiapi']['datacite'].params.query"
data-doi-crossref-url="config.sources['doiapi']['crossref'].url"
data-doi-crossref-query-pattern="config.sources['doiapi']['crossref'].params.query"
data-mode="add"
data-add-to-selection-cb="addToSelection(record, config.associationType, config.initiativeType)"
data-remove-from-selection-cb="removeFromSelection(record)"
Expand Down