Skip to content

Commit 24b0ea9

Browse files
authored
feat: Stay on the same page when switching version
Closes gh-269
1 parent f104861 commit 24b0ea9

File tree

5 files changed

+123
-10
lines changed

5 files changed

+123
-10
lines changed

gulp.d/tasks/build-preview-pages.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ module.exports =
5050
const siteRootPath = path.relative(ospath.dirname(file.path), ospath.resolve(previewSrc))
5151
const uiModel = { ...baseUiModel }
5252
const sharedPageModel = page.component ? baseUiModel.shared[page.component.name][page.version] : {}
53-
uiModel.page = { ...uiModel.page, ...page, ...sharedPageModel }
53+
uiModel.page = { ...uiModel.page, ...sharedPageModel, ...page }
5454
uiModel.siteRootPath = siteRootPath
5555
uiModel.siteRootUrl = path.join(siteRootPath, 'index.html')
5656
uiModel.uiRootPath = path.join(siteRootPath, '_')

preview-src/samples/edge-cases/index.adoc.yml

+5
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,8 @@ breadcrumbs:
2525
- content: Edge cases
2626
url: '#'
2727
urlType: fragment
28+
versions:
29+
- url: '/samples/edge-cases.html'
30+
displayVersion: 2.0.0
31+
- url: '/1.0.0/samples/edge-cases.html'
32+
displayVersion: 1.0.0

src/helpers/versionTree.js

+28-7
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,42 @@
11
'use strict'
22

3-
module.exports = (components) => versionTree(components)
3+
module.exports = (components, page) => versionTree(components, page)
44

5-
function versionTree (components) {
5+
function versionTree (components, page) {
6+
const versionToUrl = {}
7+
if (page && page.versions) {
8+
page.versions.forEach((v) => {
9+
versionToUrl[v.displayVersion] = v.url
10+
})
11+
}
612
for (const [, component] of Object.entries(components)) {
7-
component.versionTree = splitVersions(component.versions)
13+
const componentVersionToUrl = component &&
14+
page &&
15+
page.component &&
16+
component.name === page.component.name ? versionToUrl : {}
17+
component.versionTree = splitVersions(component.versions, componentVersionToUrl)
818
}
919
return components
1020
}
1121

12-
function splitVersions (versions) {
13-
const snapshot = versions.filter((v) => v.displayVersion.includes('SNAPSHOT'))
14-
const stable = versions.filter((v) => !v.displayVersion.includes('-'))
15-
const preview = versions.filter((v) => !snapshot.includes(v) && !stable.includes(v))
22+
function splitVersions (versions, versionToUrl) {
23+
const snapshot = versions.filter((v) => v.displayVersion.includes('SNAPSHOT')).map((v) => navVersion(v, versionToUrl))
24+
const stable = versions.filter((v) => !v.displayVersion.includes('-')).map((v) => navVersion(v, versionToUrl))
25+
const preview = versions.filter((v) => !v.displayVersion.includes('SNAPSHOT') &&
26+
v.displayVersion.includes('-')).map((v) => navVersion(v, versionToUrl))
1627
return {
1728
snapshot: snapshot.length > 0 ? snapshot : null,
1829
stable: stable.length > 0 ? stable : null,
1930
preview: preview.length > 0 ? preview : null,
2031
}
2132
}
33+
34+
function navVersion (v, versionToUrl) {
35+
const navVersion =
36+
v.latest ? { latest: v.latest, url: v.url, displayVersion: v.displayVersion }
37+
: { url: v.url, displayVersion: v.displayVersion }
38+
if (versionToUrl[v.displayVersion]) {
39+
navVersion.url = versionToUrl[v.displayVersion]
40+
}
41+
return navVersion
42+
}

src/partials/version.hbs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<div class="col-left">
1010

1111
<ul class="nav-versions">
12-
{{#each (versionTree site.components)}}
12+
{{#each (versionTree site.components @root.page)}}
1313
<li class="component">
1414
<div>
1515
<a class="title" href="{{{relativize ./url}}}">{{{./title}}}</a>

test/versionTree-test.js

+88-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const { expect } = require('./harness')
55
const versionTree = require('../src/helpers/versionTree.js')
66

77
describe('versionTree', () => {
8-
it('should return stable, preview and snapshot versions', () => {
8+
it('should return stable, preview and snapshot versions', () => {
99
const result = versionTree({
1010
test: {
1111
versions: [
@@ -45,6 +45,93 @@ describe('versionTree', () => {
4545
expect(tree.snapshot[1].displayVersion).is.eql('3.0.0-SNAPSHOT')
4646
})
4747

48+
it('page version overrides urls when component names are the same', () => {
49+
const result = versionTree({
50+
test: {
51+
name: 'test',
52+
versions: [
53+
{
54+
displayVersion: '2.0.0',
55+
url: './version.html',
56+
},
57+
],
58+
},
59+
}, {
60+
component: {
61+
name: 'test',
62+
},
63+
versions: [
64+
{
65+
displayVersion: '2.0.0',
66+
url: './page.html',
67+
},
68+
],
69+
})
70+
71+
const tree = result.test.versionTree
72+
expect(tree.stable.length).is.eql(1)
73+
expect(tree.stable[0].displayVersion).is.eql('2.0.0')
74+
expect(tree.stable[0].url).is.eql('./page.html')
75+
})
76+
77+
it('does not override if page does not define same version', () => {
78+
const result = versionTree({
79+
test: {
80+
name: 'test',
81+
versions: [
82+
{
83+
displayVersion: '2.0.0',
84+
url: './version.html',
85+
},
86+
],
87+
},
88+
}, {
89+
component: {
90+
name: 'test',
91+
},
92+
versions: [
93+
{
94+
displayVersion: '1.0.0',
95+
url: './page.html',
96+
},
97+
],
98+
})
99+
100+
const tree = result.test.versionTree
101+
expect(tree.stable.length).is.eql(1)
102+
expect(tree.stable[0].displayVersion).is.eql('2.0.0')
103+
expect(tree.stable[0].url).is.eql('./version.html')
104+
})
105+
106+
it('page versions do not override if different component name', () => {
107+
const result = versionTree({
108+
test: {
109+
name: 'test',
110+
versions: [
111+
{
112+
displayVersion: '2.0.0',
113+
url: './version.html',
114+
},
115+
],
116+
},
117+
}, {
118+
component: {
119+
name: 'baz',
120+
},
121+
versions: [
122+
{
123+
displayVersion: '2.0.0',
124+
url: './page.html',
125+
},
126+
],
127+
})
128+
129+
const tree = result.test.versionTree
130+
expect(tree.stable.length).is.eql(1)
131+
expect(tree.stable[0].displayVersion).is.eql('2.0.0')
132+
expect(tree.stable[0].url).is.eql('./version.html')
133+
})
134+
48135
it('should return an empty structure', () => {
49136
const result = versionTree({
50137
test: {

0 commit comments

Comments
 (0)