Added matcher function to router that supports handle paths (eliminates the need to encode the forward slash).

Fixed comment.
This commit is contained in:
Michael W Spalti
2019-10-17 14:55:45 -07:00
parent b695da8487
commit 6b26506d88
5 changed files with 35 additions and 11 deletions

View File

@@ -1,12 +1,36 @@
import { LookupGuard } from './lookup-guard'; import { LookupGuard } from './lookup-guard';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router'; import { RouterModule, UrlSegment } from '@angular/router';
import { ObjectNotFoundComponent } from './objectnotfound/objectnotfound.component'; import { ObjectNotFoundComponent } from './objectnotfound/objectnotfound.component';
import { hasValue } from '../shared/empty.util';
@NgModule({ @NgModule({
imports: [ imports: [
RouterModule.forChild([ RouterModule.forChild([
{ path: ':idType/:id', canActivate: [LookupGuard], component: ObjectNotFoundComponent } {
matcher: (url) => {
// The expected path is :idType/:id
const idType = url[0].path;
let id;
// Allow for handles that are delimited with a forward slash.
if (url.length === 3) {
id = url[1].path + '/' + url[2].path;
} else {
id = url[1].path;
}
if (hasValue(idType) && hasValue(id)) {
return {
consumed: url,
posParams: {
idType: new UrlSegment(idType, {}),
id: new UrlSegment(id, {})
}
};
}
return null;
},
canActivate: [LookupGuard],
component: ObjectNotFoundComponent }
]) ])
], ],
providers: [ providers: [

View File

@@ -3,7 +3,7 @@ import { CommonModule } from '@angular/common';
import { SharedModule } from '../shared/shared.module'; import { SharedModule } from '../shared/shared.module';
import { LookupRoutingModule } from './lookup-by-id-routing.module'; import { LookupRoutingModule } from './lookup-by-id-routing.module';
import { ObjectNotFoundComponent } from './objectnotfound/objectnotfound.component'; import { ObjectNotFoundComponent } from './objectnotfound/objectnotfound.component';
import { DsoDataRedirectService } from '../core/data/dso-data-redirect.service'; import { DsoRedirectDataService } from '../core/data/dso-redirect-data.service';
@NgModule({ @NgModule({
imports: [ imports: [
@@ -15,7 +15,7 @@ import { DsoDataRedirectService } from '../core/data/dso-data-redirect.service';
ObjectNotFoundComponent ObjectNotFoundComponent
], ],
providers: [ providers: [
DsoDataRedirectService DsoRedirectDataService
] ]
}) })
export class LookupIdModule { export class LookupIdModule {

View File

@@ -1,5 +1,5 @@
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { DsoDataRedirectService } from '../core/data/dso-data-redirect.service'; import { DsoRedirectDataService } from '../core/data/dso-redirect-data.service';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { IdentifierType } from '../core/index/index.reducer'; import { IdentifierType } from '../core/index/index.reducer';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
@@ -14,7 +14,7 @@ interface LookupParams {
@Injectable() @Injectable()
export class LookupGuard implements CanActivate { export class LookupGuard implements CanActivate {
constructor(private dsoService: DsoDataRedirectService) { constructor(private dsoService: DsoRedirectDataService) {
} }
canActivate(route: ActivatedRouteSnapshot, state:RouterStateSnapshot): Observable<boolean> { canActivate(route: ActivatedRouteSnapshot, state:RouterStateSnapshot): Observable<boolean> {

View File

@@ -9,13 +9,13 @@ import { NotificationsService } from '../../shared/notifications/notifications.s
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service'; import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { IdentifierType } from '../index/index.reducer'; import { IdentifierType } from '../index/index.reducer';
import { DsoDataRedirectService } from './dso-data-redirect.service'; import { DsoRedirectDataService } from './dso-redirect-data.service';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { CoreState } from '../core.reducers'; import { CoreState } from '../core.reducers';
describe('DsoDataRedirectService', () => { describe('DsoRedirectDataService', () => {
let scheduler: TestScheduler; let scheduler: TestScheduler;
let service: DsoDataRedirectService; let service: DsoRedirectDataService;
let halService: HALEndpointService; let halService: HALEndpointService;
let requestService: RequestService; let requestService: RequestService;
let rdbService: RemoteDataBuildService; let rdbService: RemoteDataBuildService;
@@ -66,7 +66,7 @@ describe('DsoDataRedirectService', () => {
a: remoteData a: remoteData
}) })
}); });
service = new DsoDataRedirectService( service = new DsoRedirectDataService(
requestService, requestService,
rdbService, rdbService,
dataBuildService, dataBuildService,

View File

@@ -20,7 +20,7 @@ import { getFinishedRemoteData } from '../shared/operators';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
@Injectable() @Injectable()
export class DsoDataRedirectService extends DataService<any> { export class DsoRedirectDataService extends DataService<any> {
protected linkPath = 'pid'; protected linkPath = 'pid';
protected forceBypassCache = false; protected forceBypassCache = false;