diff --git a/src/app/core/data/feature-authorization/feature-id.ts b/src/app/core/data/feature-authorization/feature-id.ts index b553923c5a..3cb18bf515 100644 --- a/src/app/core/data/feature-authorization/feature-id.ts +++ b/src/app/core/data/feature-authorization/feature-id.ts @@ -28,7 +28,6 @@ export enum FeatureID { CanCreateVersion = 'canCreateVersion', CanViewUsageStatistics = 'canViewUsageStatistics', CanSendFeedback = 'canSendFeedback', - ShowClaimItem = 'showClaimItem', CanClaimItem = 'canClaimItem', CanSynchronizeWithORCID = 'canSynchronizeWithORCID' } diff --git a/src/app/core/profile/researcher-profile.service.ts b/src/app/core/profile/researcher-profile.service.ts index 100fa459a1..b7035a921f 100644 --- a/src/app/core/profile/researcher-profile.service.ts +++ b/src/app/core/profile/researcher-profile.service.ts @@ -162,7 +162,7 @@ export class ResearcherProfileService { * @returns the check result */ isLinkedToOrcid(item: Item): boolean { - return item.hasMetadata('cris.orcid.authenticated'); + return item.hasMetadata('dspace.orcid.authenticated'); } /** @@ -214,7 +214,7 @@ export class ResearcherProfileService { op:'remove' }]; - return this.findById(item.firstMetadata('cris.owner').authority).pipe( + return this.findById(item.firstMetadata('dspace.object.owner').authority).pipe( switchMap((profile) => this.patch(profile, operations)), getFinishedRemoteData() ); @@ -227,7 +227,7 @@ export class ResearcherProfileService { this.configurationService.findByPropertyName('orcid.scope').pipe(getFirstSucceededRemoteDataPayload())] ).pipe( map(([authorizeUrl, clientId, scopes]) => { - const redirectUri = environment.rest.baseUrl + '/api/cris/orcid/' + profile.id + '/?url=' + encodeURIComponent(this.router.url); + const redirectUri = environment.rest.baseUrl + '/api/eperson/orcid/' + profile.id + '/?url=' + encodeURIComponent(this.router.url); return authorizeUrl.values[0] + '?client_id=' + clientId.values[0] + '&redirect_uri=' + redirectUri + '&response_type=code&scope=' + scopes.values.join(' '); })); diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts index 42eb4ec7e6..33db18681f 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts @@ -40,7 +40,7 @@ export class PersonComponent extends ItemComponent implements OnInit { ngOnInit(): void { super.ngOnInit(); - this.authorizationService.isAuthorized(FeatureID.ShowClaimItem, this.object._links.self.href).pipe( + this.authorizationService.isAuthorized(FeatureID.CanClaimItem, this.object._links.self.href).pipe( take(1) ).subscribe((isAuthorized: boolean) => { this.claimable$.next(isAuthorized); @@ -48,21 +48,10 @@ export class PersonComponent extends ItemComponent implements OnInit { } + /** + * Create a new researcher profile claiming the current item. + */ claim() { - - this.authorizationService.isAuthorized(FeatureID.CanClaimItem, this.object._links.self.href).pipe( - take(1) - ).subscribe((isAuthorized: boolean) => { - if (!isAuthorized) { - this.notificationsService.warning(this.translate.get('researcherprofile.claim.not-authorized')); - } else { - this.createFromExternalSource(); - } - }); - - } - - createFromExternalSource() { this.researcherProfileService.createFromExternalSource(this.object._links.self.href).pipe( getFirstSucceededRemoteData(), mergeMap((rd: RemoteData) => { @@ -81,10 +70,16 @@ export class PersonComponent extends ItemComponent implements OnInit { }); } + /** + * Returns true if the item is claimable, false otherwise. + */ isClaimable(): Observable { return this.claimable$; } + /** + * Returns the metadata values to be used for the page title. + */ getTitleMetadataValues(): MetadataValue[]{ const metadataValues = []; const familyName = this.object?.firstMetadata('person.familyName'); diff --git a/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.ts b/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.ts index 9651215dc6..8594cba9f5 100644 --- a/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.ts +++ b/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.ts @@ -33,7 +33,7 @@ export class OrcidAuthComponent implements OnInit { private itemService: ItemDataService, private route: ActivatedRoute, @Inject(NativeWindowService) private _window: NativeWindowRef, - ) { + ) { this.itemService.findById(this.route.snapshot.paramMap.get('id'), true, true).pipe(getFirstCompletedRemoteData()).subscribe((data: RemoteData) => { this.item = data.payload; }); @@ -49,10 +49,10 @@ export class OrcidAuthComponent implements OnInit { } getOrcidAuthorizations(): string[] { - return this.item.allMetadataValues('cris.orcid.scope'); + return this.item.allMetadataValues('dspace.orcid.scope'); } - isLinkedToOrcid(): boolean { + isLinkedToOrcid(): boolean { return this.researcherProfileService.isLinkedToOrcid(this.item); } diff --git a/src/app/item-page/orcid-page/orcid-page.component.html b/src/app/item-page/orcid-page/orcid-page.component.html index 33c1dd158d..dd6f455a61 100644 --- a/src/app/item-page/orcid-page/orcid-page.component.html +++ b/src/app/item-page/orcid-page/orcid-page.component.html @@ -1,3 +1,3 @@ - - + + diff --git a/src/app/item-page/orcid-page/orcid-page.component.ts b/src/app/item-page/orcid-page/orcid-page.component.ts index 32b47e069f..eed5ebc276 100644 --- a/src/app/item-page/orcid-page/orcid-page.component.ts +++ b/src/app/item-page/orcid-page/orcid-page.component.ts @@ -1,4 +1,14 @@ -import { Component } from '@angular/core'; +import {Component, Inject} from '@angular/core'; +import {ConfigurationDataService} from '../../core/data/configuration-data.service'; +import {ResearcherProfileService} from '../../core/profile/researcher-profile.service'; +import {TranslateService} from '@ngx-translate/core'; +import {NotificationsService} from '../../shared/notifications/notifications.service'; +import {ItemDataService} from '../../core/data/item-data.service'; +import {ActivatedRoute} from '@angular/router'; +import {NativeWindowRef, NativeWindowService} from '../../core/services/window.service'; +import {getFirstCompletedRemoteData} from '../../core/shared/operators'; +import {RemoteData} from '../../core/data/remote-data'; +import {Item} from '../../core/shared/item.model'; @Component({ selector: 'ds-orcid-page', @@ -6,4 +16,22 @@ import { Component } from '@angular/core'; styleUrls: ['./orcid-page.component.scss'] }) export class OrcidPageComponent { + + item: Item; + + constructor( + private itemService: ItemDataService, + private researcherProfileService: ResearcherProfileService, + private route: ActivatedRoute, + @Inject(NativeWindowService) private _window: NativeWindowRef, + ) { + this.itemService.findById(this.route.snapshot.paramMap.get('id'), true, true).pipe(getFirstCompletedRemoteData()).subscribe((data: RemoteData) => { + this.item = data.payload; + }); + } + + isLinkedToOrcid(): boolean { + return this.researcherProfileService.isLinkedToOrcid(this.item); + } + } diff --git a/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.ts b/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.ts index 87385f0780..45ec48e788 100644 --- a/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.ts +++ b/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.ts @@ -77,9 +77,9 @@ export class OrcidSettingComponent implements OnInit { }; }); - const syncProfilePreferences = this.item.allMetadataValues('cris.orcid.sync-profile'); + const syncProfilePreferences = this.item.allMetadataValues('dspace.orcid.sync-profile'); - this.syncProfileOptions = ['AFFILIATION', 'EDUCATION', 'BIOGRAPHICAL', 'IDENTIFIERS'] + this.syncProfileOptions = ['BIOGRAPHICAL', 'IDENTIFIERS'] .map((value) => { return { label: this.messagePrefix + '.sync-profile.' + value.toLowerCase(), @@ -88,9 +88,9 @@ export class OrcidSettingComponent implements OnInit { }; }); - this.currentSyncMode = this.getCurrentPreference('cris.orcid.sync-mode', ['BATCH, MANUAL'], 'MANUAL'); - this.currentSyncPublications = this.getCurrentPreference('cris.orcid.sync-publications', ['DISABLED', 'ALL'], 'DISABLED'); - this.currentSyncFundings = this.getCurrentPreference('cris.orcid.sync-fundings', ['DISABLED', 'ALL'], 'DISABLED'); + this.currentSyncMode = this.getCurrentPreference('dspace.orcid.sync-mode', ['BATCH, MANUAL'], 'MANUAL'); + this.currentSyncPublications = this.getCurrentPreference('dspace.orcid.sync-publications', ['DISABLED', 'ALL'], 'DISABLED'); + this.currentSyncFundings = this.getCurrentPreference('dspace.orcid.sync-fundings', ['DISABLED', 'ALL'], 'DISABLED'); } onSubmit(form: FormGroup) { @@ -110,7 +110,7 @@ export class OrcidSettingComponent implements OnInit { return; } - this.researcherProfileService.findById(this.item.firstMetadata('cris.owner').authority).pipe( + this.researcherProfileService.findById(this.item.firstMetadata('dspace.object.owner').authority).pipe( switchMap((profile) => this.researcherProfileService.patch(profile, operations)), getFinishedRemoteData() ).subscribe((remoteData) => { diff --git a/src/app/profile-page/profile-claim/profile-claim.service.ts b/src/app/profile-page/profile-claim/profile-claim.service.ts index 1c86ba29f1..9ee2462778 100644 --- a/src/app/profile-page/profile-claim/profile-claim.service.ts +++ b/src/app/profile-page/profile-claim/profile-claim.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { Observable, of } from 'rxjs'; -import { mergeMap, switchMap, take } from 'rxjs/operators'; +import { mergeMap, take } from 'rxjs/operators'; import { ConfigurationDataService } from '../../core/data/configuration-data.service'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { RemoteData } from '../../core/data/remote-data'; @@ -12,6 +12,9 @@ import { PaginatedSearchOptions } from '../../shared/search/models/paginated-sea import { SearchResult } from '../../shared/search/models/search-result.model'; import { getFirstSucceededRemoteData } from './../../core/shared/operators'; +/** + * Service that handle profiles claim. + */ @Injectable() export class ProfileClaimService { @@ -19,6 +22,11 @@ export class ProfileClaimService { private configurationService: ConfigurationDataService) { } + /** + * Returns true if it is possible to suggest profiles to be claimed to the given eperson. + * + * @param eperson the eperson + */ canClaimProfiles(eperson: EPerson): Observable { const query = this.personQueryData(eperson); @@ -33,6 +41,10 @@ export class ProfileClaimService { } + /** + * Returns profiles that could be associated with the given user. + * @param eperson the user + */ search(eperson: EPerson): Observable>>> { const query = this.personQueryData(eperson); if (!hasValue(query) || query.length === 0) { @@ -41,6 +53,10 @@ export class ProfileClaimService { return this.lookup(query); } + /** + * Search object by the given query. + * @param query the query for the search + */ private lookup(query: string): Observable>>> { if (!hasValue(query)) { return of(null); @@ -55,16 +71,7 @@ export class ProfileClaimService { } private personQueryData(eperson: EPerson): string { - const querySections = []; - this.queryParam(querySections, 'dc.title', eperson.name); - this.queryParam(querySections, 'crisrp.name', eperson.name); - return querySections.join(' OR '); + return 'dc.title:' + eperson.name; } - private queryParam(query: string[], metadata: string, value: string) { - if (!hasValue(value)) {return;} - query.push(metadata + ':' + value); - } - - } diff --git a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts index e9d9cb6d05..9bb3028ff4 100644 --- a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts +++ b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts @@ -152,6 +152,9 @@ export class ProfilePageResearcherFormComponent implements OnInit { return this.processingCreate$.asObservable(); } + /** + * Create a new profile related to the current user from scratch. + */ createProfileFromScratch() { this.processingCreate$.next(true); this.researcherProfileService.create().pipe( @@ -167,6 +170,9 @@ export class ProfilePageResearcherFormComponent implements OnInit { }); } + /** + * Initializes the researcherProfile and researcherProfileItemId attributes using the profile of the current user. + */ private initResearchProfile(): void { this.researcherProfileService.findById(this.user.id).pipe( take(1), diff --git a/src/app/profile-page/profile-page.component.ts b/src/app/profile-page/profile-page.component.ts index ed032fb9d9..9c22c8c950 100644 --- a/src/app/profile-page/profile-page.component.ts +++ b/src/app/profile-page/profile-page.component.ts @@ -172,6 +172,9 @@ export class ProfilePageComponent implements OnInit { this.updateProfile(); } + /** + * Returns true if the researcher profile feature is enabled, false otherwise. + */ isResearcherProfileEnabled(){ return this.isResearcherProfileEnabled$; } diff --git a/src/app/shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.ts index 5c5ee42037..3744f6d054 100644 --- a/src/app/shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.ts @@ -14,8 +14,9 @@ import { ViewMode } from '../../../../core/shared/view-mode.model'; import { ProfileClaimService } from '../../../../profile-page/profile-claim/profile-claim.service'; import { CollectionElementLinkType } from '../../../object-collection/collection-element-link.type'; - - +/** + * Component + */ @Component({ selector: 'ds-claim-item-selector', templateUrl: './claim-item-selector.component.html'