Skip to content

Commit b9c4ca8

Browse files
committed
Keep anchors when switching versions
1 parent 2fee012 commit b9c4ca8

File tree

2 files changed

+107
-51
lines changed

2 files changed

+107
-51
lines changed

app/controllers/project-version.js

Lines changed: 70 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -141,61 +141,80 @@ export default class ProjectVersionController extends Controller {
141141

142142
@action
143143
updateProject(project, ver /*, component */) {
144-
let projectVersionID = ver.compactVersion;
145-
let endingRoute;
146-
switch (this.router.currentRouteName) {
147-
case 'project-version.classes.class': {
148-
let className = this._getEncodedNameForCurrentClass();
149-
endingRoute = `classes/${className}`;
150-
break;
151-
}
152-
case 'project-version.modules.module': {
153-
let moduleName = encodeURIComponent(this.moduleController.model.name);
154-
endingRoute = `modules/${moduleName}`;
155-
break;
156-
}
157-
case 'project-version.namespaces.namespace': {
158-
let namespaceName = this.namespaceController.model.name;
159-
endingRoute = `namespaces/${namespaceName}`;
160-
break;
161-
}
162-
default:
163-
endingRoute = '';
164-
break;
165-
}
166-
// if the user is navigating to/from api versions >= 2.16, take them
167-
// to the home page instead of trying to translate the url
168-
let shouldConvertPackages = this._shouldConvertPackages(
169-
ver,
170-
this.projectService.version,
144+
this.router.transitionTo(
145+
findEndingRoute({
146+
project,
147+
targetVersion: ver.id,
148+
currentVersion: this.projectService.version,
149+
currentRouteName: this.router.currentRouteName,
150+
classModelName: this.classController?.model?.get('name'),
151+
moduleModelName: this.moduleController?.model?.name,
152+
namespaceModelName: this.namespaceController?.model?.name,
153+
currentAnchor: window.location.hash,
154+
}),
171155
);
172-
let isEmberProject = project === 'ember';
173-
174-
if (!isEmberProject || !shouldConvertPackages) {
175-
this.router.transitionTo(
176-
`/${project}/${projectVersionID}/${endingRoute}`,
177-
);
178-
} else {
179-
this.router.transitionTo(`/${project}/${projectVersionID}`);
180-
}
181156
}
157+
}
182158

183-
_getEncodedNameForCurrentClass() {
184-
// escape any reserved characters for url, like slashes
185-
return encodeURIComponent(this.classController.model.get('name'));
159+
export function findEndingRoute({
160+
project,
161+
targetVersion,
162+
currentVersion,
163+
currentRouteName,
164+
classModelName,
165+
moduleModelName,
166+
namespaceModelName,
167+
currentAnchor,
168+
}) {
169+
let projectVersionID = getCompactVersion(targetVersion);
170+
let endingRoute;
171+
switch (currentRouteName) {
172+
case 'project-version.classes.class': {
173+
let className = encodeURIComponent(classModelName);
174+
endingRoute = `classes/${className}`;
175+
break;
176+
}
177+
case 'project-version.modules.module': {
178+
let moduleName = encodeURIComponent(moduleModelName);
179+
endingRoute = `modules/${moduleName}`;
180+
break;
181+
}
182+
case 'project-version.namespaces.namespace': {
183+
let namespaceName = namespaceModelName;
184+
endingRoute = `namespaces/${namespaceName}`;
185+
break;
186+
}
187+
default:
188+
endingRoute = '';
189+
break;
186190
}
187191

188-
// Input some version info, returns a boolean based on
189-
// whether the user is switching versions for a 2.16 docs release or later.
190-
// The urls for pre-2.16 classes and later packages are quite different
191-
_shouldConvertPackages(targetVer, previousVer) {
192-
let targetVersion = getCompactVersion(targetVer.id);
193-
let previousVersion = getCompactVersion(previousVer);
194-
let previousComparison = semverCompare(previousVersion, '2.16');
195-
let targetComparison = semverCompare(targetVersion, '2.16');
196-
return (
197-
(previousComparison < 0 && targetComparison >= 0) ||
198-
(previousComparison >= 0 && targetComparison < 0)
199-
);
192+
let isEmberProject = project === 'ember';
193+
194+
// if the user is navigating to/from api versions >= 2.16, take them
195+
// to the home page instead of trying to translate the url
196+
let shouldConvertPackages = _shouldConvertPackages(
197+
targetVersion,
198+
currentVersion,
199+
);
200+
201+
if (!isEmberProject || !shouldConvertPackages) {
202+
return `/${project}/${projectVersionID}/${endingRoute}${currentAnchor}`;
203+
} else {
204+
return `/${project}/${projectVersionID}`;
200205
}
201206
}
207+
208+
// Input some version info, returns a boolean based on
209+
// whether the user is switching versions for a 2.16 docs release or later.
210+
// The urls for pre-2.16 classes and later packages are quite different
211+
function _shouldConvertPackages(targetVer, previousVer) {
212+
let targetVersion = getCompactVersion(targetVer);
213+
let previousVersion = getCompactVersion(previousVer);
214+
let previousComparison = semverCompare(previousVersion, '2.16');
215+
let targetComparison = semverCompare(targetVersion, '2.16');
216+
return (
217+
(previousComparison < 0 && targetComparison >= 0) ||
218+
(previousComparison >= 0 && targetComparison < 0)
219+
);
220+
}

tests/unit/controllers/project-version-test.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { module, test } from 'qunit';
22
/* eslint-disable ember/no-restricted-resolver-tests */
33
import { setupTest } from 'ember-qunit';
4+
import { findEndingRoute } from 'ember-api-docs/controllers/project-version';
45

56
const moduleIds = [
67
'ember-2.10.0-ember',
@@ -45,4 +46,40 @@ module('Unit | Controller | project version', function (hooks) {
4546
let moduleNames = controller.getModuleRelationships('ember-2.10.1');
4647
assert.deepEqual(moduleNames, expectedModuleNames);
4748
});
49+
50+
module('findEndingRoute', function () {
51+
test('Maintains anchors', function (assert) {
52+
let endingRoute = findEndingRoute({
53+
project: 'ember',
54+
targetVersion: '6.4.0',
55+
currentVersion: '6.5.0',
56+
currentRouteName: 'project-version.classes.class',
57+
classModelName: 'Component',
58+
moduleModelName: null,
59+
namespaceModelName: null,
60+
currentAnchor: '#didInsertElement',
61+
});
62+
63+
assert.strictEqual(
64+
endingRoute,
65+
'/ember/6.4/classes/Component#didInsertElement',
66+
);
67+
68+
endingRoute = findEndingRoute({
69+
project: 'ember',
70+
targetVersion: '6.4.0',
71+
currentVersion: '6.5.0',
72+
currentRouteName: 'project-version.modules.module',
73+
classModelName: null,
74+
moduleModelName: '@ember/application',
75+
namespaceModelName: null,
76+
currentAnchor: '#classes',
77+
});
78+
79+
assert.strictEqual(
80+
endingRoute,
81+
'/ember/6.4/modules/%40ember%2Fapplication#classes',
82+
);
83+
});
84+
});
4885
});

0 commit comments

Comments
 (0)