Skip to content

Commit 9351b58

Browse files
FrancescoMolinaroatarix83
authored andcommitted
Merged in CST-12904-breadcrumbs-qa (pull request DSpace#1107)
CST-12904 breadcrumbs qa Approved-by: Giuseppe Digilio
2 parents 2d2ca20 + fd4ca45 commit 9351b58

6 files changed

Lines changed: 166 additions & 8 deletions

src/app/admin/admin-notifications/admin-notifications-routing.module.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ import { AdminQualityAssuranceTopicsPageResolver } from './admin-quality-assuran
1111
import { AdminQualityAssuranceEventsPageResolver } from './admin-quality-assurance-events-page/admin-quality-assurance-events-page.resolver';
1212
import { AdminQualityAssuranceSourcePageComponent } from './admin-quality-assurance-source-page-component/admin-quality-assurance-source-page.component';
1313
import { AdminQualityAssuranceSourcePageResolver } from './admin-quality-assurance-source-page-component/admin-quality-assurance-source-page-resolver.service';
14-
import { SourceDataResolver } from './admin-quality-assurance-source-page-component/admin-quality-assurance-source-data.resolver';
14+
import {QualityAssuranceBreadcrumbResolver} from '../../core/breadcrumbs/quality-assurance-breadcrumb.resolver';
15+
import {QualityAssuranceBreadcrumbService} from '../../core/breadcrumbs/quality-assurance-breadcrumb.service';
16+
import {
17+
SourceDataResolver
18+
} from "./admin-quality-assurance-source-page-component/admin-quality-assurance-source-data.resolver";
1519

1620
@NgModule({
1721
imports: [
@@ -22,7 +26,7 @@ import { SourceDataResolver } from './admin-quality-assurance-source-page-compon
2226
component: AdminQualityAssuranceTopicsPageComponent,
2327
pathMatch: 'full',
2428
resolve: {
25-
breadcrumb: I18nBreadcrumbResolver,
29+
breadcrumb: QualityAssuranceBreadcrumbResolver,
2630
openaireQualityAssuranceTopicsParams: AdminQualityAssuranceTopicsPageResolver
2731
},
2832
data: {
@@ -53,7 +57,7 @@ import { SourceDataResolver } from './admin-quality-assurance-source-page-compon
5357
component: AdminQualityAssuranceEventsPageComponent,
5458
pathMatch: 'full',
5559
resolve: {
56-
breadcrumb: I18nBreadcrumbResolver,
60+
breadcrumb: QualityAssuranceBreadcrumbResolver,
5761
openaireQualityAssuranceEventsParams: AdminQualityAssuranceEventsPageResolver
5862
},
5963
data: {
@@ -70,7 +74,9 @@ import { SourceDataResolver } from './admin-quality-assurance-source-page-compon
7074
SourceDataResolver,
7175
AdminQualityAssuranceTopicsPageResolver,
7276
AdminQualityAssuranceEventsPageResolver,
73-
AdminQualityAssuranceSourcePageResolver
77+
AdminQualityAssuranceSourcePageResolver,
78+
QualityAssuranceBreadcrumbResolver,
79+
QualityAssuranceBreadcrumbService
7480
]
7581
})
7682
/**
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import {QualityAssuranceBreadcrumbResolver} from './quality-assurance-breadcrumb.resolver';
2+
3+
describe('QualityAssuranceBreadcrumbResolver', () => {
4+
describe('resolve', () => {
5+
let resolver: QualityAssuranceBreadcrumbResolver;
6+
let qualityAssuranceBreadcrumbService: any;
7+
let route: any;
8+
const fullPath = '/test/quality-assurance/';
9+
const expectedKey = 'testSourceId:testTopicId';
10+
11+
beforeEach(() => {
12+
route = {
13+
paramMap: {
14+
get: function (param) {
15+
return this[param]
16+
},
17+
sourceId: 'testSourceId',
18+
topicId: 'testTopicId'
19+
}
20+
};
21+
qualityAssuranceBreadcrumbService = {};
22+
resolver = new QualityAssuranceBreadcrumbResolver(qualityAssuranceBreadcrumbService);
23+
});
24+
25+
it('should resolve the breadcrumb config', () => {
26+
const resolvedConfig = resolver.resolve(route as any, {url: fullPath + 'testSourceId'} as any);
27+
const expectedConfig = { provider: qualityAssuranceBreadcrumbService, key: expectedKey, url: fullPath };
28+
expect(resolvedConfig).toEqual(expectedConfig);
29+
});
30+
});
31+
});
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { Injectable } from '@angular/core';
2+
import {QualityAssuranceBreadcrumbService} from './quality-assurance-breadcrumb.service';
3+
import {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} from '@angular/router';
4+
import {BreadcrumbConfig} from '../../breadcrumbs/breadcrumb/breadcrumb-config.model';
5+
6+
@Injectable({
7+
providedIn: 'root'
8+
})
9+
export class QualityAssuranceBreadcrumbResolver implements Resolve<BreadcrumbConfig<string>> {
10+
constructor(protected breadcrumbService: QualityAssuranceBreadcrumbService) {}
11+
12+
/**
13+
* Method that resolve QA item into a breadcrumb
14+
* The parameter are retrieved by the url since part of the QA route config
15+
* @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot
16+
* @param {RouterStateSnapshot} state The current RouterStateSnapshot
17+
* @returns BreadcrumbConfig object
18+
*/
19+
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): BreadcrumbConfig<string> {
20+
const sourceId = route.paramMap.get('sourceId');
21+
const topicId = route.paramMap.get('topicId');
22+
let key = sourceId;
23+
24+
if (topicId) {
25+
key += `:${topicId}`;
26+
}
27+
const fullPath = state.url;
28+
const url = fullPath.substr(0, fullPath.indexOf(sourceId));
29+
30+
return { provider: this.breadcrumbService, key, url };
31+
}
32+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { TestBed, waitForAsync } from '@angular/core/testing';
2+
import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model';
3+
import { getTestScheduler } from 'jasmine-marbles';
4+
import {QualityAssuranceBreadcrumbService} from './quality-assurance-breadcrumb.service';
5+
6+
describe('QualityAssuranceBreadcrumbService', () => {
7+
let service: QualityAssuranceBreadcrumbService;
8+
let dataService: any;
9+
let translateService: any = {
10+
instant: (str) => str,
11+
};
12+
13+
let exampleString;
14+
let exampleURL;
15+
let exampleQaKey;
16+
17+
function init() {
18+
exampleString = 'sourceId';
19+
exampleURL = '/test/quality-assurance/';
20+
exampleQaKey = 'admin.quality-assurance.breadcrumbs';
21+
}
22+
23+
beforeEach(waitForAsync(() => {
24+
init();
25+
TestBed.configureTestingModule({}).compileComponents();
26+
}));
27+
28+
beforeEach(() => {
29+
service = new QualityAssuranceBreadcrumbService(dataService,translateService);
30+
});
31+
32+
describe('getBreadcrumbs', () => {
33+
it('should return a breadcrumb based on a string', () => {
34+
const breadcrumbs = service.getBreadcrumbs(exampleString, exampleURL);
35+
getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [new Breadcrumb(exampleQaKey, exampleURL),
36+
new Breadcrumb(exampleString, exampleURL + exampleString)]
37+
});
38+
});
39+
});
40+
});
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model';
2+
import { BreadcrumbsProviderService } from './breadcrumbsProviderService';
3+
import { Observable, of as observableOf } from 'rxjs';
4+
import { Injectable } from '@angular/core';
5+
import {map} from 'rxjs/operators';
6+
import {getFirstCompletedRemoteData} from '../shared/operators';
7+
import {TranslateService} from '@ngx-translate/core';
8+
import {QualityAssuranceTopicDataService} from "../notifications/qa/topics/quality-assurance-topic-data.service";
9+
10+
11+
12+
/**
13+
* Service to calculate QA breadcrumbs for a single part of the route
14+
*/
15+
@Injectable({
16+
providedIn: 'root'
17+
})
18+
export class QualityAssuranceBreadcrumbService implements BreadcrumbsProviderService<string> {
19+
20+
private QUALITY_ASSURANCE_BREADCRUMB_KEY = 'admin.quality-assurance.breadcrumbs';
21+
constructor(
22+
protected qualityAssuranceService: QualityAssuranceTopicDataService,
23+
private translationService: TranslateService,
24+
) {
25+
26+
}
27+
28+
29+
/**
30+
* Method to calculate the breadcrumbs
31+
* @param key The key used to resolve the breadcrumb
32+
* @param url The url to use as a link for this breadcrumb
33+
*/
34+
getBreadcrumbs(key: string, url: string): Observable<Breadcrumb[]> {
35+
const sourceId = key.split(':')[0];
36+
const topicId = key.split(':')[1];
37+
38+
if (topicId) {
39+
return this.qualityAssuranceService.getTopic(topicId).pipe(
40+
getFirstCompletedRemoteData(),
41+
map((topic) => {
42+
return [new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url),
43+
new Breadcrumb(sourceId, `${url}${sourceId}`),
44+
new Breadcrumb(topicId, undefined)];
45+
})
46+
);
47+
} else {
48+
return observableOf([new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url),
49+
new Breadcrumb(sourceId, `${url}${sourceId}`)]);
50+
}
51+
52+
}
53+
}

src/app/notifications/qa/events/quality-assurance-events.component.html

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@
44
<h2 class="border-bottom pb-2">
55
<div class="d-flex justify-content-between">
66
{{'notifications.events.title'| translate}}
7-
<a class="btn btn-outline-secondary" [routerLink]="['/admin/notifications/quality-assurance']">
8-
<i class="fas fa-angle-double-left"></i>
9-
{{'quality-assurance.events.back' | translate}}
10-
</a>
117
</div>
128
</h2>
139
<ds-alert [type]="'alert-info'" [content]="'quality-assurance.events.description'"></ds-alert>

0 commit comments

Comments
 (0)