Skip to content

Commit fd59ca8

Browse files
authored
Merge pull request DSpace#4017 from 4Science/task/main/CST-18016
OpenAlex Integration
2 parents a18e03d + 02516f2 commit fd59ca8

68 files changed

Lines changed: 850 additions & 286 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<ds-publication-claim [source]="'openaire'"></ds-publication-claim>
1+
<ds-suggestion-sources></ds-suggestion-sources>

src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.spec.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import {
66
waitForAsync,
77
} from '@angular/core/testing';
88
import { TranslateModule } from '@ngx-translate/core';
9+
import { MockComponent } from 'ng-mocks';
910

10-
import { PublicationClaimComponent } from '../../../notifications/suggestion-targets/publication-claim/publication-claim.component';
11+
import { SuggestionSourcesComponent } from '../../../notifications/suggestions/sources/suggestion-sources.component';
1112
import { AdminNotificationsPublicationClaimPageComponent } from './admin-notifications-publication-claim-page.component';
1213

1314
describe('AdminNotificationsPublicationClaimPageComponent', () => {
@@ -20,17 +21,10 @@ describe('AdminNotificationsPublicationClaimPageComponent', () => {
2021
CommonModule,
2122
TranslateModule.forRoot(),
2223
AdminNotificationsPublicationClaimPageComponent,
23-
],
24-
providers: [
25-
AdminNotificationsPublicationClaimPageComponent,
24+
MockComponent(SuggestionSourcesComponent),
2625
],
2726
schemas: [NO_ERRORS_SCHEMA],
28-
}).overrideComponent(AdminNotificationsPublicationClaimPageComponent, {
29-
remove: {
30-
imports: [PublicationClaimComponent],
31-
},
32-
})
33-
.compileComponents();
27+
}).compileComponents();
3428
}));
3529

3630
beforeEach(() => {

src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import { Component } from '@angular/core';
22

3-
import { PublicationClaimComponent } from '../../../notifications/suggestion-targets/publication-claim/publication-claim.component';
3+
import { SuggestionSourcesComponent } from '../../../notifications/suggestions/sources/suggestion-sources.component';
44

55
@Component({
66
selector: 'ds-admin-notifications-publication-claim-page',
77
templateUrl: './admin-notifications-publication-claim-page.component.html',
88
styleUrls: ['./admin-notifications-publication-claim-page.component.scss'],
9-
imports: [
10-
PublicationClaimComponent,
11-
],
9+
imports: [ SuggestionSourcesComponent ],
1210
standalone: true,
1311
})
1412
export class AdminNotificationsPublicationClaimPageComponent {

src/app/admin/admin-notifications/admin-notifications-routes.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { Route } from '@angular/router';
22

33
import { authenticatedGuard } from '../../core/auth/authenticated.guard';
44
import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver';
5-
import { qualityAssuranceBreadcrumbResolver } from '../../core/breadcrumbs/quality-assurance-breadcrumb.resolver';
5+
import { sourcesBreadcrumbResolver } from '../../core/breadcrumbs/sources-breadcrumb.resolver';
6+
import { PublicationClaimComponent } from '../../notifications/suggestions/targets/publication-claim/publication-claim.component';
67
import { AdminNotificationsPublicationClaimPageResolver } from '../../quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service';
78
import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component';
89
import { qualityAssuranceEventsPageResolver } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.resolver';
@@ -33,13 +34,28 @@ export const ROUTES: Route[] = [
3334
showBreadcrumbsFluid: false,
3435
},
3536
},
37+
{
38+
canActivate: [ authenticatedGuard ],
39+
path: `${PUBLICATION_CLAIMS_PATH}/:sourceId`,
40+
pathMatch: 'full',
41+
component: PublicationClaimComponent,
42+
resolve: {
43+
breadcrumb: sourcesBreadcrumbResolver,
44+
openaireQualityAssuranceEventsParams: AdminNotificationsPublicationClaimPageResolver,
45+
},
46+
data: {
47+
title: 'admin.notifications.publicationclaim.page.title',
48+
breadcrumbKey: 'admin.notifications.publicationclaim',
49+
showBreadcrumbsFluid: false,
50+
},
51+
},
3652
{
3753
canActivate: [authenticatedGuard],
3854
path: `${QUALITY_ASSURANCE_EDIT_PATH}/:sourceId`,
3955
component: QualityAssuranceTopicsPageComponent,
4056
pathMatch: 'full',
4157
resolve: {
42-
breadcrumb: qualityAssuranceBreadcrumbResolver,
58+
breadcrumb: sourcesBreadcrumbResolver,
4359
openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver,
4460
},
4561
data: {
@@ -85,7 +101,7 @@ export const ROUTES: Route[] = [
85101
component: QualityAssuranceEventsPageComponent,
86102
pathMatch: 'full',
87103
resolve: {
88-
breadcrumb: qualityAssuranceBreadcrumbResolver,
104+
breadcrumb: sourcesBreadcrumbResolver,
89105
openaireQualityAssuranceEventsParams: qualityAssuranceEventsPageResolver,
90106
},
91107
data: {

src/app/app.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import {
1111
NoPreloading,
1212
provideRouter,
13+
withComponentInputBinding,
1314
withEnabledBlockingInitialNavigation,
1415
withInMemoryScrolling,
1516
withPreloading,
@@ -109,6 +110,7 @@ export const commonAppConfig: ApplicationConfig = {
109110
withInMemoryScrolling(APP_ROUTING_SCROLL_CONF),
110111
withEnabledBlockingInitialNavigation(),
111112
withPreloading(NoPreloading),
113+
withComponentInputBinding(),
112114
),
113115
{
114116
provide: APP_BASE_HREF,

src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.spec.ts

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/app/core/breadcrumbs/quality-assurance-breadcrumb.resolver.spec.ts renamed to src/app/core/breadcrumbs/sources-breadcrumb.resolver.spec.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
import { qualityAssuranceBreadcrumbResolver } from './quality-assurance-breadcrumb.resolver';
1+
import { sourcesBreadcrumbResolver } from './sources-breadcrumb.resolver';
22

3-
describe('qualityAssuranceBreadcrumbResolver', () => {
3+
describe('sourcesBreadcrumbResolver', () => {
44
describe('resolve', () => {
55
let resolver: any;
6-
let qualityAssuranceBreadcrumbService: any;
6+
let sourcesBreadcrumbService: any;
77
let route: any;
8+
const i18nKey = 'breadcrumbKey';
89
const fullPath = '/test/quality-assurance/';
9-
const expectedKey = 'testSourceId:testTopicId';
10+
const expectedKey = 'breadcrumbKey:testSourceId:testTopicId';
1011

1112
beforeEach(() => {
1213
route = {
14+
data: { breadcrumbKey: i18nKey },
1315
paramMap: {
1416
get: function (param) {
1517
return this[param];
@@ -18,13 +20,13 @@ describe('qualityAssuranceBreadcrumbResolver', () => {
1820
topicId: 'testTopicId',
1921
},
2022
};
21-
qualityAssuranceBreadcrumbService = {};
22-
resolver = qualityAssuranceBreadcrumbResolver;
23+
sourcesBreadcrumbService = {};
24+
resolver = sourcesBreadcrumbResolver;
2325
});
2426

2527
it('should resolve the breadcrumb config', () => {
26-
const resolvedConfig = resolver(route as any, { url: fullPath + 'testSourceId' } as any, qualityAssuranceBreadcrumbService);
27-
const expectedConfig = { provider: qualityAssuranceBreadcrumbService, key: expectedKey, url: fullPath };
28+
const resolvedConfig = resolver(route as any, { url: fullPath + 'testSourceId' } as any, sourcesBreadcrumbService);
29+
const expectedConfig = { provider: sourcesBreadcrumbService, key: expectedKey, url: fullPath };
2830
expect(resolvedConfig).toEqual(expectedConfig);
2931
});
3032
});

src/app/core/breadcrumbs/quality-assurance-breadcrumb.resolver.ts renamed to src/app/core/breadcrumbs/sources-breadcrumb.resolver.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@ import {
66
} from '@angular/router';
77

88
import { BreadcrumbConfig } from '../../breadcrumbs/breadcrumb/breadcrumb-config.model';
9-
import { QualityAssuranceBreadcrumbService } from './quality-assurance-breadcrumb.service';
9+
import { SourcesBreadcrumbService } from './sources-breadcrumb.service';
1010

11-
export const qualityAssuranceBreadcrumbResolver: ResolveFn<BreadcrumbConfig<string>> = (
11+
export const sourcesBreadcrumbResolver: ResolveFn<BreadcrumbConfig<string>> = (
1212
route: ActivatedRouteSnapshot,
1313
state: RouterStateSnapshot,
14-
breadcrumbService: QualityAssuranceBreadcrumbService = inject(QualityAssuranceBreadcrumbService),
14+
breadcrumbService: SourcesBreadcrumbService = inject(SourcesBreadcrumbService),
1515
): BreadcrumbConfig<string> => {
16+
const breadcrumbKey = route.data.breadcrumbKey;
1617
const sourceId = route.paramMap.get('sourceId');
1718
const topicId = route.paramMap.get('topicId');
18-
let key = sourceId;
19+
let key = `${breadcrumbKey}:${sourceId}`;
1920

2021
if (topicId) {
2122
key += `:${topicId}`;
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import {
2+
TestBed,
3+
waitForAsync,
4+
} from '@angular/core/testing';
5+
import { getTestScheduler } from 'jasmine-marbles';
6+
7+
import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model';
8+
import { SourcesBreadcrumbService } from './sources-breadcrumb.service';
9+
10+
describe('SourcesBreadcrumbService', () => {
11+
let service: SourcesBreadcrumbService;
12+
let translateService: any = {
13+
instant: (str) => str,
14+
};
15+
16+
let exampleString;
17+
let exampleSource;
18+
let exampleTopic;
19+
let exampleArg;
20+
let exampleArgTopic;
21+
let exampleURL;
22+
let exampleQaKey;
23+
24+
function init() {
25+
exampleString = 'admin.quality-assurance';
26+
exampleSource = 'sourceId';
27+
exampleTopic = 'topic';
28+
exampleArg = `${exampleString}:${exampleSource}`;
29+
exampleArgTopic = `${exampleString}:${exampleSource}:${exampleTopic}`;
30+
exampleURL = '/test/quality-assurance/';
31+
exampleQaKey = 'admin.quality-assurance.breadcrumbs';
32+
}
33+
34+
beforeEach(waitForAsync(() => {
35+
init();
36+
TestBed.configureTestingModule({}).compileComponents();
37+
}));
38+
39+
beforeEach(() => {
40+
service = new SourcesBreadcrumbService(translateService);
41+
});
42+
43+
describe('getBreadcrumbs', () => {
44+
45+
it('should return a breadcrumb based on source only', () => {
46+
const breadcrumbs = service.getBreadcrumbs(exampleArg, exampleURL);
47+
getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [new Breadcrumb(exampleQaKey, exampleURL),
48+
new Breadcrumb(exampleSource, exampleURL + exampleSource)],
49+
});
50+
});
51+
52+
it('should return a breadcrumb based also on topic', () => {
53+
const breadcrumbs = service.getBreadcrumbs(exampleArgTopic, exampleURL);
54+
getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [new Breadcrumb(exampleQaKey, exampleURL),
55+
new Breadcrumb(exampleSource, exampleURL + exampleSource),
56+
new Breadcrumb(exampleTopic, undefined)],
57+
});
58+
});
59+
});
60+
});

src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.ts renamed to src/app/core/breadcrumbs/sources-breadcrumb.service.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import { BreadcrumbsProviderService } from './breadcrumbsProviderService';
1414
@Injectable({
1515
providedIn: 'root',
1616
})
17-
export class QualityAssuranceBreadcrumbService implements BreadcrumbsProviderService<string> {
17+
export class SourcesBreadcrumbService implements BreadcrumbsProviderService<string> {
1818

19-
private QUALITY_ASSURANCE_BREADCRUMB_KEY = 'admin.quality-assurance.breadcrumbs';
19+
private BREADCRUMB_SUFFIX = '.breadcrumbs';
2020
constructor(
2121
private translationService: TranslateService,
2222
) {
@@ -31,15 +31,16 @@ export class QualityAssuranceBreadcrumbService implements BreadcrumbsProviderSer
3131
*/
3232
getBreadcrumbs(key: string, url: string): Observable<Breadcrumb[]> {
3333
const args = key.split(':');
34-
const sourceId = args[0];
35-
const topicId = args.length > 2 ? args[args.length - 1] : args[1];
34+
const breadcrumbKey = args[0] + this.BREADCRUMB_SUFFIX;
35+
const sourceId = args[1];
36+
const topicId = args.length > 3 ? args[args.length - 1] : args[2];
3637

3738
if (topicId) {
38-
return observableOf( [new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url),
39+
return observableOf( [new Breadcrumb(this.translationService.instant(breadcrumbKey), url),
3940
new Breadcrumb(sourceId, `${url}${sourceId}`),
4041
new Breadcrumb(topicId, undefined)]);
4142
} else {
42-
return observableOf([new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url),
43+
return observableOf([new Breadcrumb(this.translationService.instant(breadcrumbKey), url),
4344
new Breadcrumb(sourceId, `${url}${sourceId}`)]);
4445
}
4546

0 commit comments

Comments
 (0)