mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
add breadcrumbs, adapt tests, fix issue on page loading
This commit is contained in:
@@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -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 };
|
||||||
|
}
|
||||||
|
}
|
@@ -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)]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -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)];
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@@ -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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -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}}">
|
||||||
|
@@ -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)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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 {
|
||||||
|
Reference in New Issue
Block a user