Skip to content

Commit b9085d5

Browse files
add QA breadcrumb resolver and service
1 parent eed9896 commit b9085d5

6 files changed

Lines changed: 149 additions & 38 deletions

src/app/core/breadcrumbs/qa-breadcrumbs.resolver.ts

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

src/app/core/breadcrumbs/qa-breadcrumbs.service.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.
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 () {
15+
return this;
16+
},
17+
sourceId: 'testSourceId',
18+
topicId: 'testSourceId: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, {url: fullPath} as any);
27+
const expectedConfig = { provider: qualityAssuranceBreadcrumbService, key: expectedKey, url: fullPath };
28+
expect(resolvedConfig).toEqual(expectedConfig);
29+
});
30+
});
31+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
const key = topicId ?? sourceId;
23+
const fullPath = state.url;
24+
const url = fullPath.substr(0, fullPath.indexOf(sourceId));
25+
26+
return { provider: this.breadcrumbService, key, url };
27+
}
28+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
11+
let exampleString;
12+
let exampleURL;
13+
let exampleQaKey;
14+
15+
function init() {
16+
exampleString = 'sourceId';
17+
exampleURL = '/test/quality-assurance/';
18+
exampleQaKey = 'admin.quality-assurance.breadcrumbs';
19+
}
20+
21+
beforeEach(waitForAsync(() => {
22+
init();
23+
TestBed.configureTestingModule({}).compileComponents();
24+
}));
25+
26+
beforeEach(() => {
27+
service = new QualityAssuranceBreadcrumbService(dataService,translateService);
28+
});
29+
30+
describe('getBreadcrumbs', () => {
31+
it('should return a breadcrumb based on a string', () => {
32+
const breadcrumbs = service.getBreadcrumbs(exampleString, exampleURL);
33+
getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [new Breadcrumb(exampleQaKey, exampleURL),
34+
new Breadcrumb(exampleString, exampleURL + exampleString)]
35+
});
36+
});
37+
});
38+
});
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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 {QualityAssuranceTopicRestService} from "../notifications/qa/topics/quality-assurance-topic-rest.service";
9+
10+
11+
/**
12+
* Service to calculate QA breadcrumbs for a single part of the route
13+
*/
14+
@Injectable({
15+
providedIn: 'root'
16+
})
17+
export class QualityAssuranceBreadcrumbService implements BreadcrumbsProviderService<string> {
18+
19+
private QUALITY_ASSURANCE_BREADCRUMB_KEY = 'admin.quality-assurance.breadcrumbs';
20+
constructor(
21+
protected qualityAssuranceService: QualityAssuranceTopicRestService,
22+
private translationService: TranslateService,
23+
) {
24+
25+
}
26+
27+
28+
/**
29+
* Method to calculate the breadcrumbs
30+
* @param key The key used to resolve the breadcrumb
31+
* @param url The url to use as a link for this breadcrumb
32+
*/
33+
getBreadcrumbs(key: string, url: string): Observable<Breadcrumb[]> {
34+
const sourceId = key.split(':')[0];
35+
const topicId = key.split(':')[1];
36+
37+
if (topicId) {
38+
return this.qualityAssuranceService.getTopic(`${sourceId}:${topicId}`).pipe(
39+
getFirstCompletedRemoteData(),
40+
map((topic) => {
41+
return [new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url),
42+
new Breadcrumb(sourceId, `${url}${sourceId}`),
43+
new Breadcrumb(topic.payload.name, undefined)];
44+
})
45+
);
46+
} else {
47+
return observableOf([new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url),
48+
new Breadcrumb(sourceId, `${url}${sourceId}`)]);
49+
}
50+
51+
}
52+
}

0 commit comments

Comments
 (0)