fix(router): support outlets in non-absolute positions
This commit is contained in:
parent
d2d36c61f3
commit
afcb3c0035
|
@ -38,6 +38,11 @@ function validateCommands(n: NormalizedNavigationCommands): void {
|
||||||
if (n.isAbsolute && n.commands.length > 0 && isMatrixParams(n.commands[0])) {
|
if (n.isAbsolute && n.commands.length > 0 && isMatrixParams(n.commands[0])) {
|
||||||
throw new Error('Root segment cannot have matrix parameters');
|
throw new Error('Root segment cannot have matrix parameters');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const c = n.commands.filter(c => typeof c === 'object' && c.outlets !== undefined);
|
||||||
|
if (c.length > 0 && c[0] !== n.commands[n.commands.length - 1]) {
|
||||||
|
throw new Error('{outlets:{}} has to be the last command');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isMatrixParams(command: any): boolean {
|
function isMatrixParams(command: any): boolean {
|
||||||
|
@ -244,8 +249,14 @@ function prefixedWith(segmentGroup: UrlSegmentGroup, startIndex: number, command
|
||||||
function createNewSegmentGroup(
|
function createNewSegmentGroup(
|
||||||
segmentGroup: UrlSegmentGroup, startIndex: number, commands: any[]): UrlSegmentGroup {
|
segmentGroup: UrlSegmentGroup, startIndex: number, commands: any[]): UrlSegmentGroup {
|
||||||
const paths = segmentGroup.segments.slice(0, startIndex);
|
const paths = segmentGroup.segments.slice(0, startIndex);
|
||||||
|
|
||||||
let i = 0;
|
let i = 0;
|
||||||
while (i < commands.length) {
|
while (i < commands.length) {
|
||||||
|
if (typeof commands[i] === 'object' && commands[i].outlets !== undefined) {
|
||||||
|
const children = createNewSegmentChldren(commands[i].outlets);
|
||||||
|
return new UrlSegmentGroup(paths, children);
|
||||||
|
}
|
||||||
|
|
||||||
// if we start with an object literal, we need to reuse the path part from the segment
|
// if we start with an object literal, we need to reuse the path part from the segment
|
||||||
if (i === 0 && (typeof commands[0] === 'object')) {
|
if (i === 0 && (typeof commands[0] === 'object')) {
|
||||||
const p = segmentGroup.segments[startIndex];
|
const p = segmentGroup.segments[startIndex];
|
||||||
|
@ -267,6 +278,16 @@ function createNewSegmentGroup(
|
||||||
return new UrlSegmentGroup(paths, {});
|
return new UrlSegmentGroup(paths, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createNewSegmentChldren(outlets: {[name: string]: any}): any {
|
||||||
|
const children: {[key: string]: UrlSegmentGroup} = {};
|
||||||
|
forEach(outlets, (commands: any, outlet: string) => {
|
||||||
|
if (commands !== null) {
|
||||||
|
children[outlet] = createNewSegmentGroup(new UrlSegmentGroup([], {}), 0, commands);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
|
||||||
function stringify(params: {[key: string]: any}): {[key: string]: string} {
|
function stringify(params: {[key: string]: any}): {[key: string]: string} {
|
||||||
const res: {[key: string]: string} = {};
|
const res: {[key: string]: string} = {};
|
||||||
forEach(params, (v: any, k: string) => res[k] = `${v}`);
|
forEach(params, (v: any, k: string) => res[k] = `${v}`);
|
||||||
|
|
|
@ -72,6 +72,12 @@ describe('createUrlTree', () => {
|
||||||
expect(serializer.serialize(t)).toEqual('/a/(b//right:d/11/e)');
|
expect(serializer.serialize(t)).toEqual('/a/(b//right:d/11/e)');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should throw when outlets is not the last command', () => {
|
||||||
|
const p = serializer.parse('/a');
|
||||||
|
expect(() => createRoot(p, ['a', {outlets: {right: ['c']}}, 'c']))
|
||||||
|
.toThrowError('{outlets:{}} has to be the last command');
|
||||||
|
});
|
||||||
|
|
||||||
it('should support updating using a string', () => {
|
it('should support updating using a string', () => {
|
||||||
const p = serializer.parse('/a(right:b)');
|
const p = serializer.parse('/a(right:b)');
|
||||||
const t = createRoot(p, [{outlets: {right: 'c/11/d'}}]);
|
const t = createRoot(p, [{outlets: {right: 'c/11/d'}}]);
|
||||||
|
@ -188,6 +194,12 @@ describe('createUrlTree', () => {
|
||||||
expect(() => create(p.root.children[PRIMARY_OUTLET], 0, p, ['../../']))
|
expect(() => create(p.root.children[PRIMARY_OUTLET], 0, p, ['../../']))
|
||||||
.toThrowError('Invalid number of \'../\'');
|
.toThrowError('Invalid number of \'../\'');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should support updating secondary segments', () => {
|
||||||
|
const p = serializer.parse('/a/b');
|
||||||
|
const t = create(p.root.children[PRIMARY_OUTLET], 1, p, [{outlets: {right: ['c']}}]);
|
||||||
|
expect(serializer.serialize(t)).toEqual('/a/b/(right:c)');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set query params', () => {
|
it('should set query params', () => {
|
||||||
|
@ -209,7 +221,6 @@ describe('createUrlTree', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
function createRoot(tree: UrlTree, commands: any[], queryParams?: Params, fragment?: string) {
|
function createRoot(tree: UrlTree, commands: any[], queryParams?: Params, fragment?: string) {
|
||||||
const s = new ActivatedRouteSnapshot(
|
const s = new ActivatedRouteSnapshot(
|
||||||
[], <any>{}, <any>{}, '', <any>{}, PRIMARY_OUTLET, 'someComponent', null, tree.root, -1,
|
[], <any>{}, <any>{}, '', <any>{}, PRIMARY_OUTLET, 'someComponent', null, tree.root, -1,
|
||||||
|
|
Loading…
Reference in New Issue