add breadcrumbs, adapt tests, fix issue on page loading

This commit is contained in:
FrancescoMolinaro
2024-01-25 19:32:12 +01:00
parent 604d355902
commit 80174817fd
8 changed files with 155 additions and 13 deletions

View File

@@ -0,0 +1,31 @@
import { PublicationClaimBreadcrumbResolver } from './publication-claim-breadcrumb.resolver';
describe('PublicationClaimBreadcrumbResolver', () => {
describe('resolve', () => {
let resolver: PublicationClaimBreadcrumbResolver;
let publicationClaimBreadcrumbService: any;
const fullPath = '/test/publication-claim/openaire:6bee076d-4f2a-4555-a475-04a267769b2a';
const expectedKey = '6bee076d-4f2a-4555-a475-04a267769b2a';
const expectedId = 'openaire:6bee076d-4f2a-4555-a475-04a267769b2a';
let route;
beforeEach(() => {
route = {
paramMap: {
get: function (param) {
return this[param];
},
targetId: expectedId,
}
};
publicationClaimBreadcrumbService = {};
resolver = new PublicationClaimBreadcrumbResolver(publicationClaimBreadcrumbService);
});
it('should resolve the breadcrumb config', () => {
const resolvedConfig = resolver.resolve(route as any, {url: fullPath } as any);
const expectedConfig = { provider: publicationClaimBreadcrumbService, key: expectedKey };
expect(resolvedConfig).toEqual(expectedConfig);
});
});
});

View File

@@ -0,0 +1,24 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
import {BreadcrumbConfig} from '../../breadcrumbs/breadcrumb/breadcrumb-config.model';
import { PublicationClaimBreadcrumbService } from './publication-claim-breadcrumb.service';
@Injectable({
providedIn: 'root'
})
export class PublicationClaimBreadcrumbResolver implements Resolve<BreadcrumbConfig<string>> {
constructor(protected breadcrumbService: PublicationClaimBreadcrumbService) {
}
/**
* Method that resolve Publication Claim item into a breadcrumb
* The parameter are retrieved by the url since part of the Publication Claim route config
* @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot
* @param {RouterStateSnapshot} state The current RouterStateSnapshot
* @returns BreadcrumbConfig object
*/
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): BreadcrumbConfig<string> {
const targetId = route.paramMap.get('targetId').split(':')[1];
return { provider: this.breadcrumbService, key: targetId };
}
}

View File

@@ -0,0 +1,46 @@
import { TestBed, waitForAsync } from '@angular/core/testing';
import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model';
import { getTestScheduler } from 'jasmine-marbles';
import { PublicationClaimBreadcrumbService } from './publication-claim-breadcrumb.service';
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
describe('PublicationClaimBreadcrumbService', () => {
let service: PublicationClaimBreadcrumbService;
let dsoNameService: any = {
getName: (str) => str
};
let translateService: any = {
instant: (str) => str,
};
let dataService: any = {
findById: (str) => createSuccessfulRemoteDataObject$(str),
};
let exampleKey;
const ADMIN_PUBLICATION_CLAIMS_PATH = 'admin/notifications/publication-claim';
const ADMIN_PUBLICATION_CLAIMS_BREADCRUMB_KEY = 'admin.notifications.publicationclaim.page.title';
function init() {
exampleKey = '6bee076d-4f2a-4555-a475-04a267769b2a';
}
beforeEach(waitForAsync(() => {
init();
TestBed.configureTestingModule({}).compileComponents();
}));
beforeEach(() => {
service = new PublicationClaimBreadcrumbService(dataService,dsoNameService,translateService);
});
describe('getBreadcrumbs', () => {
it('should return a breadcrumb based on a string', () => {
const breadcrumbs = service.getBreadcrumbs(exampleKey);
getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [new Breadcrumb(ADMIN_PUBLICATION_CLAIMS_BREADCRUMB_KEY, ADMIN_PUBLICATION_CLAIMS_PATH),
new Breadcrumb(exampleKey, undefined)]
});
});
});
});

View File

@@ -0,0 +1,42 @@
import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model';
import { BreadcrumbsProviderService } from './breadcrumbsProviderService';
import { Observable } from 'rxjs';
import { Injectable } from '@angular/core';
import { ItemDataService } from '../data/item-data.service';
import { getFirstCompletedRemoteData } from '../shared/operators';
import { map } from 'rxjs/operators';
import { DSONameService } from './dso-name.service';
import { TranslateService } from '@ngx-translate/core';
/**
* Service to calculate Publication claims breadcrumbs
*/
@Injectable({
providedIn: 'root'
})
export class PublicationClaimBreadcrumbService implements BreadcrumbsProviderService<string> {
private ADMIN_PUBLICATION_CLAIMS_PATH = 'admin/notifications/publication-claim';
private ADMIN_PUBLICATION_CLAIMS_BREADCRUMB_KEY = 'admin.notifications.publicationclaim.page.title';
constructor(private dataService: ItemDataService,
private dsoNameService: DSONameService,
private tranlsateService: TranslateService) {
}
/**
* Method to calculate the breadcrumbs
* @param key The key used to resolve the breadcrumb
*/
getBreadcrumbs(key: string): Observable<Breadcrumb[]> {
return this.dataService.findById(key).pipe(
getFirstCompletedRemoteData(),
map((item) => {
return [new Breadcrumb(this.tranlsateService.instant(this.ADMIN_PUBLICATION_CLAIMS_BREADCRUMB_KEY), this.ADMIN_PUBLICATION_CLAIMS_PATH),
new Breadcrumb(this.dsoNameService.getName(item.payload), undefined)];
})
);
}
}

View File

@@ -1,7 +1,7 @@
import { HALLink } from '../../shared/hal-link.model'; import { HALLink } from '../../shared/hal-link.model';
import { HALResource } from '../../shared/hal-resource.model'; import { HALResource } from '../../shared/hal-resource.model';
import { ResourceType } from '../../shared/resource-type'; import { ResourceType } from '../../shared/resource-type';
import { dataService, getLinkDefinition, link } from './build-decorators'; import { dataService, getDataServiceFor, getLinkDefinition, link } from './build-decorators';
class TestHALResource implements HALResource { class TestHALResource implements HALResource {
_links: { _links: {
@@ -51,6 +51,12 @@ describe('build decorators', () => {
it(`should throw error`, () => { it(`should throw error`, () => {
expect(dataService(null)).toThrow(); expect(dataService(null)).toThrow();
}); });
it(`should set properly data service for type`, () => {
const target = new TestHALResource();
dataService(testType)(target);
expect(getDataServiceFor(testType)).toEqual(target);
});
}); });
}); });
}); });

View File

@@ -31,7 +31,7 @@
</td> </td>
<td> <td>
<div class="btn-group edit-field"> <div class="btn-group edit-field">
<button (click)="redirectToSuggestions(targetElement.id, targetElement.display)" <button (click)="redirectToSuggestions(targetElement.id)"
class="btn btn-outline-primary btn-sm" class="btn btn-outline-primary btn-sm"
title="{{('suggestion.button.review.title' | translate: { total: targetElement.total.toString() }) + title="{{('suggestion.button.review.title' | translate: { total: targetElement.total.toString() }) +
targetElement.display}}"> targetElement.display}}">

View File

@@ -71,12 +71,7 @@ export class PublicationClaimComponent implements OnInit {
ngOnInit(): void { ngOnInit(): void {
this.targets$ = this.suggestionTargetsStateService.getSuggestionTargets(); this.targets$ = this.suggestionTargetsStateService.getSuggestionTargets();
this.totalElements$ = this.suggestionTargetsStateService.getSuggestionTargetsTotals(); this.totalElements$ = this.suggestionTargetsStateService.getSuggestionTargetsTotals();
}
/**
* First Suggestion Targets loading after view initialization.
*/
ngAfterViewInit(): void {
this.subs.push( this.subs.push(
this.suggestionTargetsStateService.isSuggestionTargetsLoaded().pipe( this.suggestionTargetsStateService.isSuggestionTargetsLoaded().pipe(
take(1) take(1)
@@ -111,10 +106,8 @@ export class PublicationClaimComponent implements OnInit {
* *
* @param {string} id * @param {string} id
* the id of suggestion target * the id of suggestion target
* @param {string} name
* the name of suggestion target
*/ */
public redirectToSuggestions(id: string, name: string) { public redirectToSuggestions(id: string) {
this.router.navigate([getSuggestionPageRoute(id)]); this.router.navigate([getSuggestionPageRoute(id)]);
} }

View File

@@ -4,7 +4,7 @@ import { RouterModule } from '@angular/router';
import { SuggestionsPageResolver } from './suggestions-page.resolver'; import { SuggestionsPageResolver } from './suggestions-page.resolver';
import { SuggestionsPageComponent } from './suggestions-page.component'; import { SuggestionsPageComponent } from './suggestions-page.component';
import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard';
import { ItemBreadcrumbResolver } from '../core/breadcrumbs/item-breadcrumb.resolver'; import { PublicationClaimBreadcrumbResolver } from '../core/breadcrumbs/publication-claim-breadcrumb.resolver';
@NgModule({ @NgModule({
imports: [ imports: [
@@ -13,7 +13,7 @@ import { ItemBreadcrumbResolver } from '../core/breadcrumbs/item-breadcrumb.reso
path: ':targetId', path: ':targetId',
resolve: { resolve: {
suggestionTargets: SuggestionsPageResolver, suggestionTargets: SuggestionsPageResolver,
breadcrumb: ItemBreadcrumbResolver//I18nBreadcrumbResolver breadcrumb: PublicationClaimBreadcrumbResolver//I18nBreadcrumbResolver
}, },
data: { data: {
title: 'admin.notifications.publicationclaim.page.title', title: 'admin.notifications.publicationclaim.page.title',
@@ -28,7 +28,7 @@ import { ItemBreadcrumbResolver } from '../core/breadcrumbs/item-breadcrumb.reso
], ],
providers: [ providers: [
SuggestionsPageResolver, SuggestionsPageResolver,
ItemBreadcrumbResolver PublicationClaimBreadcrumbResolver
] ]
}) })
export class SuggestionsPageRoutingModule { export class SuggestionsPageRoutingModule {