From 7f7b08b7af2d08c628c061a199798d5f56330c76 Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Tue, 23 Jul 2024 02:17:45 +0300 Subject: [PATCH] [develop | DONE | ADDED]: Added the option to claim works to ORCID without pids, but with OpenAIRE id. 1. myOrcidLinks.component.ts & orcid.service.ts: Added functionality for orcid claim with openaireId. 2. orcid-work.component.ts: Added functionality for orcid claim with openaireId & added (missing from previous commit) @Input() compactView to show or not the word "claim". 3. orcidWork.ts: Set openaireId (relcanId) as external-id with "external-id-type": "source-work-id". 4. newSearchPage.component.ts: Added field public isLoggedIn: boolean = false; and initialize it by calling userManagementService.getUserInfo(). 5. newSearchPage.component.html: In set isLoggedIn parameter. 6. searchResult.component.ts: Added functionality for orcid claim with openaireId & Added field @Input() isLoggedIn: boolean = false; and replaced Session check. 7. result-preview.component.ts & result-preview.component.html: Removed checks to orcid claim only when there are pids. --- .../my-orcid-links/myOrcidLinks.component.ts | 16 ++++-- orcid/orcid-work.component.ts | 56 ++++++++++++------- orcid/orcid.service.ts | 24 ++++---- orcid/orcidWork.ts | 9 +++ .../searchUtils/newSearchPage.component.html | 3 +- .../searchUtils/newSearchPage.component.ts | 16 +++++- .../searchUtils/searchResult.component.ts | 21 ++++--- .../result-preview.component.html | 4 +- .../result-preview.component.ts | 2 +- 9 files changed, 103 insertions(+), 48 deletions(-) diff --git a/orcid/my-orcid-links/myOrcidLinks.component.ts b/orcid/my-orcid-links/myOrcidLinks.component.ts index 0e71b330..c4cb03f0 100644 --- a/orcid/my-orcid-links/myOrcidLinks.component.ts +++ b/orcid/my-orcid-links/myOrcidLinks.component.ts @@ -206,7 +206,7 @@ export class MyOrcidLinksComponent { this.subscriptions.push(this._orcidService.getPersonalDetails().subscribe( details => { let author: string = ""; -console.log(details) + if(details && details['name']) { let name: string = details['name']; if(name['given-names'] && name['given-names']['value']) { @@ -303,9 +303,13 @@ console.log(details) let works = this.works.slice(from, to); for(let work of works) { - for(let pid of work['pids']) { - let identifier: Identifier = Identifier.getIdentifierFromString(pid, false); - this.orcidQuery += (this.orcidQuery ? " or " : "") + ('(pid="'+StringUtils.URIEncode(identifier.id)+'")'); + if(work['pids'] && work['pids'].length > 0) { + for (let pid of work['pids']) { + let identifier: Identifier = Identifier.getIdentifierFromString(pid, false); + this.orcidQuery += (this.orcidQuery ? " or " : "") + ('(pid="' + StringUtils.URIEncode(identifier.id) + '")'); + } + } else { + this.orcidQuery += (this.orcidQuery ? " or " : "") + ('(objIdentifier="' + StringUtils.URIEncode(work['openaireId']) + '")'); } } this.showLoading = false; @@ -344,8 +348,8 @@ console.log(details) let relatedResults = []; this.currentResults.push({"work": work, "results" : relatedResults}) results.forEach(result => { - let identifierValues: string[] = [].concat(...Array.from(result.identifiers.values())); - if(work['pids'].some(pid => identifierValues.includes(pid))) { + let identifierValues: string[] = result.identifiers ? [].concat(...Array.from(result.identifiers.values())) : []; + if((work['pids'] && work['pids'].some(pid => identifierValues.includes(pid))) || work['openaireId'] === result.relcanId) { let index: number = resultsFound.get(identifierValues); if(!index) { diff --git a/orcid/orcid-work.component.ts b/orcid/orcid-work.component.ts index 8473be66..fbb996f5 100644 --- a/orcid/orcid-work.component.ts +++ b/orcid/orcid-work.component.ts @@ -24,7 +24,7 @@ declare var UIkit: any; + [title]="!isLoggedIn ? tooltipNoLoggedInUser : tooltipAdd"> @@ -32,21 +32,21 @@ declare var UIkit: any; [ngClass]="isMobile && !(pageType == 'landing') ? 'uk-margin-left' : ''" [class.uk-text-bolder]="!(isMobile && pageType == 'landing')" [class.uk-text-muted]="isDisabled"> - - Claim + Claim
+ [innerHTML]="!isLoggedIn ? tooltipNoLoggedInUser : tooltipAdd">
+ [title]="!isLoggedIn ? tooltipNoLoggedInUser : tooltipDelete"> @@ -54,15 +54,15 @@ declare var UIkit: any; [ngClass]="isMobile && !(pageType == 'landing') ? 'uk-margin-left' : ''" [class.uk-text-bolder]="!(isMobile && pageType == 'landing')" [class.uk-text-muted]="isDisabled"> - - Remove + Remove
+ [innerHTML]="!isLoggedIn ? tooltipNoLoggedInUser : tooltipDelete">
@@ -192,8 +192,16 @@ declare var UIkit: any;

-
+
+ + Source-work-id: + + + {{openaireId.value}} + + +
@@ -300,6 +308,8 @@ export class OrcidWorkComponent { //for myorcid links page @Input() showOnlyUpdateButton: boolean = false; @Input() showUpdateButton: boolean = true; + @Input() compactView: boolean = false; // if true, do not show label for actions + public subscriptions: Subscription[] = []; @ViewChild('workModal') workModal; // @ViewChild('saveWorkModal') saveWorkModal; @@ -317,6 +327,7 @@ export class OrcidWorkComponent { public works: any[] = []; public orcidWorks: any[] = []; + public openaireId: {value: string, url: string} = null; public window: any; public isLoggedIn: boolean = false; @@ -395,10 +406,14 @@ export class OrcidWorkComponent { public parseIdentifiers(identifiers: ExternalIDV3_0[]): Map { let identifiersMap: Map = new Map(); for (let identifier of identifiers) { - if (!identifiersMap.has(identifier['external-id-type'])) { - identifiersMap.set(identifier['external-id-type'], new Array()); + if(identifier['external-id-type'] == "source-work-id") { + this.openaireId = {value: identifier['external-id-value'], url: identifier['external-id-url'].value}; + } else { + if (!identifiersMap.has(identifier['external-id-type'])) { + identifiersMap.set(identifier['external-id-type'], new Array()); + } + identifiersMap.get(identifier['external-id-type']).push(identifier['external-id-value']); } - identifiersMap.get(identifier['external-id-type']).push(identifier['external-id-value']); } return identifiersMap; } @@ -442,7 +457,7 @@ export class OrcidWorkComponent { } private getPutCode() { - this.subscriptions.push(this.orcidService.getPutCode(this.pids).subscribe( + this.subscriptions.push(this.orcidService.getPutCode(this.resultLandingInfo.relcanId, this.pids).subscribe( putCodes => { this.putCodes = putCodes; this.cdr.markForCheck(); @@ -511,7 +526,7 @@ export class OrcidWorkComponent { } private saveWork() { - this.subscriptions.push(this.orcidService.saveWork(this.resultLandingInfo, this.pids).subscribe( + this.subscriptions.push(this.orcidService.saveWork(this.resultLandingInfo, this.resultLandingInfo.relcanId,this.pids).subscribe( response => { if(this.properties.logServiceUrl) { this.subscriptions.push(this._logService.logOrcidLink(this.properties, "added", this.resultLandingInfo.title, this.resultLandingInfo.identifiers.get('doi')[0]).subscribe(res => { })); @@ -564,7 +579,7 @@ export class OrcidWorkComponent { } private updateWorkPreparation() { - if (!Session.isLoggedIn()) { + if (!this.isLoggedIn) { this._router.navigate(['/user-info'], { queryParams: { "errorCode": LoginErrorCodes.NOT_VALID, @@ -590,7 +605,7 @@ export class OrcidWorkComponent { } private updateWork() { - this.subscriptions.push(this.orcidService.updateWork(this.resultLandingInfo, this.pids, this.putCodes[0]).subscribe( + this.subscriptions.push(this.orcidService.updateWork(this.resultLandingInfo, this.resultLandingInfo.relcanId, this.pids, this.putCodes[0]).subscribe( response => { if (response) { this.updateDates[0] = response['last-modified-date'].value; @@ -626,7 +641,8 @@ export class OrcidWorkComponent { } public getOrcidWorks() { - if (!Session.isLoggedIn()) { + this.openaireId = null; + if (!this.isLoggedIn) { this._router.navigate(['/user-info'], { queryParams: { "errorCode": LoginErrorCodes.NOT_VALID, @@ -668,7 +684,7 @@ export class OrcidWorkComponent { public deleteWorks(confirmed: boolean = false) { - if (!Session.isLoggedIn()) { + if (!this.isLoggedIn) { this._router.navigate(['/user-info'], { queryParams: { "errorCode": LoginErrorCodes.NOT_VALID, @@ -833,7 +849,7 @@ export class OrcidWorkComponent { this.message += "There was an error getting work \"" + this.resultTitle + "\" from your ORCID record.
Please try again later."; } else if (this.currentAction == "add") { // this.message += "There was an error adding work with pids: "+this.pids+" to your ORCID record.
Please try again later."; - this.message += "There was an error adding work with pids: \"" + this.pids + "\" to your ORCID record.
Please try again later."; + this.message += "There was an error adding work with openaireId: \""+this.resultLandingInfo.relcanId+(this.pids?.length > 0 ? "\" and pids: \"" + this.pids : "") +"\" to your ORCID record.
Please try again later."; } else if (this.currentAction == "update") { // this.message += "There was an error updating work with pids: "+this.pids+" to your ORCID record.
Please try again later."; this.message += "There was an error updating work \"" + this.resultTitle + "\" to your ORCID record.
Please try again later."; @@ -877,7 +893,7 @@ export class OrcidWorkComponent { } get isDisabled() { - return (this.properties.environment == 'beta' || this.showLoading || !this.isLoggedIn || (!this.pids && (!this.identifiers || this.identifiers.size == 0))); + return (this.properties.environment == 'beta' || this.showLoading || !this.isLoggedIn); } get noPids() { diff --git a/orcid/orcid.service.ts b/orcid/orcid.service.ts index 8a48da02..999ffcd6 100644 --- a/orcid/orcid.service.ts +++ b/orcid/orcid.service.ts @@ -11,19 +11,21 @@ import {ConnectHelper} from "../connect/connectHelper"; export class OrcidService { constructor(private http: HttpClient) {} - getPutCode(pids: string) { - let url: string = properties.orcidAPIURL+"local/put-code?pids="+pids; + getPutCode(openaireId: string, pids: string) { + let url: string = properties.orcidAPIURL+"local/put-code?openaireId="+openaireId+(pids ? ("&pids="+pids) : ""); return this.http.get(url, CustomOptions.registryOptions()); } - getPutCodes(pids: string[][]) { + getPutCodes(openaireIds: string[], pids: string[][]) { let url: string = properties.orcidAPIURL+"local/put-codes"; - return this.http.post(url, JSON.stringify(pids), CustomOptions.registryOptions()); + let map = {"pids": pids, "openaireIds": openaireIds}; + return this.http.post(url, JSON.stringify(map), CustomOptions.registryOptions()); } - getLocalWorksByPids(pids: string[][]) { + getLocalWorksByPids(openaireIds: string[], pids: string[][]) { let url: string = properties.orcidAPIURL+"local/works"; - return this.http.post(url, JSON.stringify(pids), CustomOptions.registryOptions()); + let map = {"pids": pids, "openaireIds": openaireIds}; + return this.http.post(url, JSON.stringify(map), CustomOptions.registryOptions()); } getToken(code: string) { @@ -47,14 +49,15 @@ export class OrcidService { return this.http.get(url, CustomOptions.registryOptions()); } - saveWork(resultLandingInfo: ResultLandingInfo, pids: string) { + saveWork(resultLandingInfo: ResultLandingInfo, openaireId: string, pids: string) { let work = WorkV3_0.resultLandingInfoConvert(resultLandingInfo, null); let portalId: string = ConnectHelper.getCommunityFromDomain(properties.domain); // if dashboard format changes, check in API the metrics service ("calculateMetrics" method) for orcid KPIs let dashboard: string = properties.environment + "_" + properties.dashboard + (portalId? "_" + portalId : ""); let result = { "dashboard": dashboard, - "pids": pids.split(","), + "openaireId": openaireId, + "pids": pids? pids.split(",") : [], "work": work }; let url: string = properties.orcidAPIURL+"orcid/work/save"; @@ -93,10 +96,11 @@ export class OrcidService { // return this.http.post(url, JSON.stringify(work), CustomOptions.registryOptions()) // .pipe(map(res => work)); // } - updateWork(resultLandingInfo: ResultLandingInfo, pids: string, putCode: string) { + updateWork(resultLandingInfo: ResultLandingInfo, openaireId: string, pids: string, putCode: string) { let work = WorkV3_0.resultLandingInfoConvert(resultLandingInfo, putCode); let result = { - "pids": pids.split(","), + "openaireId": openaireId, + "pids": pids ? pids.split(",") : [], "work": work }; diff --git a/orcid/orcidWork.ts b/orcid/orcidWork.ts index 054384a0..e92fbcb2 100644 --- a/orcid/orcidWork.ts +++ b/orcid/orcidWork.ts @@ -154,6 +154,15 @@ export class WorkV3_0 { ) }) })) + } else { + work['external-ids'] = { 'external-id': [{ + "external-id-type": "source-work-id", + "external-id-value": resultLandingInfo.relcanId, + "external-id-relationship": "self", + "external-id-url": { + "value": "https://explore.openaire.eu/search/"+resultLandingInfo.resultType+"?id="+resultLandingInfo.relcanId + }, + }] }; } // url (UrlV3_0, optional), diff --git a/searchPages/searchUtils/newSearchPage.component.html b/searchPages/searchUtils/newSearchPage.component.html index 67044711..054997ae 100644 --- a/searchPages/searchUtils/newSearchPage.component.html +++ b/searchPages/searchUtils/newSearchPage.component.html @@ -409,7 +409,8 @@ [status]=searchUtils.status [type]="entityType" [showLoading]="true" [properties]=properties - [compactView]="compactView"> + [compactView]="compactView" + [isLoggedIn]="isLoggedIn"> { + if (user) { + this.isLoggedIn = true; + } else { + this.isLoggedIn = false; + } + }, error => { + this.isLoggedIn = false; + })); + if(properties.adminToolsPortalType !== "explore") { //this.getDivContents(); this.getPageContents(); diff --git a/searchPages/searchUtils/searchResult.component.ts b/searchPages/searchUtils/searchResult.component.ts index cd2467d5..1914bf8d 100644 --- a/searchPages/searchUtils/searchResult.component.ts +++ b/searchPages/searchUtils/searchResult.component.ts @@ -26,6 +26,8 @@ export class SearchResultComponent implements OnInit, OnChanges { @Input() showEnermaps: boolean; @Input() compactView: boolean = false; // if true, show less info (e.g. hide description) on each result + @Input() isLoggedIn: boolean = false; + public isMobile: boolean = false; private subscriptions: any[] = []; @@ -60,25 +62,30 @@ export class SearchResultComponent implements OnInit, OnChanges { } if ((properties.adminToolsPortalType == "explore" || properties.adminToolsPortalType == "community" || properties.adminToolsPortalType == "aggregator" || properties.dashboard == "irish") - && Session.isLoggedIn() && this.results && this.results.length > 0 + && this.isLoggedIn && this.results && this.results.length > 0 && (this.type == "result" || this.type == "publication" || this.type == "dataset" || this.type == "software" || this.type == "other") ) { - this.subscriptions.push(this.orcidService.getPutCodes(this.previewResults.map( + this.subscriptions.push(this.orcidService.getPutCodes( + this.previewResults.map(previewResult => {return previewResult.relcanId}), + this.previewResults.map( previewResult => { if (previewResult.identifiers) { - let pidsArray: string[] = []; - for (let key of Array.from(previewResult.identifiers.keys())) { - pidsArray = pidsArray.concat(previewResult.identifiers.get(key)); + let pidsArray: string[] = null; + if(previewResult.identifiers?.size > 0) { + pidsArray = []; + for (let key of Array.from(previewResult.identifiers.keys())) { + pidsArray = pidsArray.concat(previewResult.identifiers.get(key)); + } } return pidsArray;//.join(); } })).subscribe( putCodes => { for (let i = 0; i < this.previewResults.length; i++) { - if (this.previewResults[i].identifiers) { + //if (this.previewResults[i].identifiers) { this.previewResults[i].orcidPutCodes = putCodes[i]; // console.debug(i, this.previewResults[i].orcidPutCodes); - } + //} } this.previewResults = JSON.parse(JSON.stringify(this.previewResults, this.replacer), this.reviver); }, error => { diff --git a/utils/result-preview/result-preview.component.html b/utils/result-preview/result-preview.component.html index 01ebc125..717ca160 100644 --- a/utils/result-preview/result-preview.component.html +++ b/utils/result-preview/result-preview.component.html @@ -193,7 +193,7 @@ [url]="properties.domain + properties.baseLink + url + '?' + urlParam + '=' + result.id" [showTooltip]="false" [compactView]="compactView"> - - 0; + this.showOrcid; } projectActions() {