From d77cde4500cefc902a1f0642ce3bad6ef6cbfe8c Mon Sep 17 00:00:00 2001 From: Peter Kurajsky Date: Thu, 15 Nov 2018 10:52:40 +0100 Subject: [PATCH] Multiple path parameters do not get replaced in view url (#211) Multiple path parameter replacement in the viewUrl fixed. --- core/package-lock.json | 24 +++++----- core/src/services/routing.js | 23 +++++++--- core/test/routing.spec.js | 87 ++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 18 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index 63fb440719..51777d2040 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,6 +1,6 @@ { "name": "luigi-core-private", - "version": "0.3.5", + "version": "0.3.7", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1442,7 +1442,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -1630,7 +1630,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -2586,7 +2586,7 @@ }, "eslint": { "version": "4.19.1", - "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { @@ -3939,7 +3939,7 @@ "dependencies": { "axios": { "version": "0.15.3", - "resolved": "http://registry.npmjs.org/axios/-/axios-0.15.3.tgz", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", "dev": true, "requires": { @@ -5186,7 +5186,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -5344,7 +5344,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, @@ -5389,7 +5389,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -6014,7 +6014,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -6861,7 +6861,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -7074,7 +7074,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -9334,7 +9334,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/core/src/services/routing.js b/core/src/services/routing.js index 857d7a2558..101701935a 100644 --- a/core/src/services/routing.js +++ b/core/src/services/routing.js @@ -119,20 +119,30 @@ const escapeRegExp = string => { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }; -const replaceVars = (viewUrl, params, prefix) => { +const replaceVars = (viewUrl, params, prefix, parenthesis = true) => { let processedUrl = viewUrl; if (params) { Object.entries(params).forEach(entry => { processedUrl = processedUrl.replace( - new RegExp(escapeRegExp('{' + prefix + entry[0] + '}'), 'g'), + new RegExp( + escapeRegExp( + (parenthesis ? '{' : '') + + prefix + + entry[0] + + (parenthesis ? '}' : '') + ), + 'g' + ), encodeURIComponent(entry[1]) ); }); } - processedUrl = processedUrl.replace( - new RegExp('\\{' + escapeRegExp(prefix) + '[^\\}]+\\}', 'g'), - '' - ); + if (parenthesis) { + processedUrl = processedUrl.replace( + new RegExp('\\{' + escapeRegExp(prefix) + '[^\\}]+\\}', 'g'), + '' + ); + } return processedUrl; }; @@ -141,6 +151,7 @@ const navigateIframe = (config, component, node) => { const componentData = component.get(); let viewUrl = componentData.viewUrl; if (viewUrl) { + viewUrl = replaceVars(viewUrl, componentData.pathParams, ':', false); viewUrl = replaceVars(viewUrl, componentData.context, contextVarPrefix); viewUrl = replaceVars( viewUrl, diff --git a/core/test/routing.spec.js b/core/test/routing.spec.js index bb87555fb7..7c3c9927e4 100644 --- a/core/test/routing.spec.js +++ b/core/test/routing.spec.js @@ -70,6 +70,21 @@ describe('Routing', () => { viewUrl: 't2.html' } ] + }, + { + pathSegment: 'categories', + children: [ + { + pathSegment: ':category', + viewUrl: 'cats/:category#details', + children: [ + { + pathSegment: ':sub', + viewUrl: 'cats/:category/:sub' + } + ] + } + ] } ], context: { @@ -376,6 +391,78 @@ describe('Routing', () => { ); }); + it('should set component data with path param', async () => { + // given + const path = '#/projects/categories/cat1'; + const expectedViewUrl = 'cats/cat1#details'; + const mockBrowser = new MockBrowser(); + const window = mockBrowser.getWindow(); + global.window = window; + const document = mockBrowser.getDocument(); + global.document = document; + + const node = { + style: {}, + prepend: sinon.spy() + }; + + const config = { + iframe: null, + builderCompatibilityMode: false, + navigateOk: null + }; + + // when + window.Luigi = {}; + window.Luigi.config = sampleLuigiConfig; + const iframeMock = { src: null }; + sinon.stub(document, 'createElement').callsFake(() => iframeMock); + await routing.handleRouteChange(path, component, node, config, window); + + // then + assert.equal(iframeMock.src, expectedViewUrl); + assert.equal( + component.get().hideNav, + window.Luigi.config.settings.hideNavigation + ); + }); + + it('should set component data with multiple path params', async () => { + // given + const path = '#/projects/categories/cat1/sub23'; + const expectedViewUrl = 'cats/cat1/sub23'; + const mockBrowser = new MockBrowser(); + const window = mockBrowser.getWindow(); + global.window = window; + const document = mockBrowser.getDocument(); + global.document = document; + + const node = { + style: {}, + prepend: sinon.spy() + }; + + const config = { + iframe: null, + builderCompatibilityMode: false, + navigateOk: null + }; + + // when + window.Luigi = {}; + window.Luigi.config = sampleLuigiConfig; + const iframeMock = { src: null }; + sinon.stub(document, 'createElement').callsFake(() => iframeMock); + await routing.handleRouteChange(path, component, node, config, window); + + // then + assert.equal(iframeMock.src, expectedViewUrl); + assert.equal( + component.get().hideNav, + window.Luigi.config.settings.hideNavigation + ); + }); + it('should get DefaultChildNode if viewUrl is not defined', async () => { // given const path = '#/projects/teams';