Skip to content

Commit 77c30af

Browse files
committed
Replace scroll-tracker mixin with class decorator
NOTE: there may be an issue with this on FastBoot (there is a report to that effect in the output in the console). It is not clear *why*, though, since the behavior in this decorated class *should* be the same as in the mixin. Possibly the difference between the route events and the router events is coming into play?
1 parent b9ad3df commit 77c30af

File tree

8 files changed

+76
-62
lines changed

8 files changed

+76
-62
lines changed

app/mixins/scroll-tracker.js

Lines changed: 0 additions & 42 deletions
This file was deleted.

app/routes/project-version/classes/class.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ import { inject as service } from '@ember/service';
22
import { resolve, all } from 'rsvp';
33
import Route from '@ember/routing/route';
44
import { set } from '@ember/object';
5-
import ScrollTracker from 'ember-api-docs/mixins/scroll-tracker';
65
import { pluralize } from 'ember-inflector';
76
import getFullVersion from 'ember-api-docs/utils/get-full-version';
87
import createExcerpt from 'ember-api-docs/utils/create-excerpt';
8+
import { withScrollReset } from '../../../utils/with-scroll-reset';
99

10-
export default class ClassRoute extends Route.extend(ScrollTracker) {
10+
@withScrollReset
11+
export default class ClassRoute extends Route {
1112
/** @type {import('@ember/routing/router-service').default} */
1213
@service
1314
router;

app/routes/project-version/modules/module.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import ClassRoute from '../classes/class';
2-
import ScrollTracker from 'ember-api-docs/mixins/scroll-tracker';
32
import getFullVersion from 'ember-api-docs/utils/get-full-version';
3+
import { withScrollReset } from '../../../utils/with-scroll-reset';
44

5-
export default class ModuleRoute extends ClassRoute.extend(ScrollTracker) {
5+
@withScrollReset
6+
export default class ModuleRoute extends ClassRoute {
67
async model(params) {
78
const { project, project_version: compactVersion } =
89
this.paramsFor('project-version');

app/routes/project-version/namespaces/namespace.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import ClassRoute from '../classes/class';
2-
import ScrollTracker from 'ember-api-docs/mixins/scroll-tracker';
32
import getFullVersion from 'ember-api-docs/utils/get-full-version';
3+
import { withScrollReset } from '../utils/with-scroll-reset';
44

5-
export default class NamespaceRoute extends ClassRoute.extend(ScrollTracker) {
5+
@withScrollReset
6+
export default class NamespaceRoute extends ClassRoute {
67
templateName = 'project-version/classes/class';
78

89
async model(params) {

app/routes/project.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import Route from '@ember/routing/route';
2-
import ScrollTracker from 'ember-api-docs/mixins/scroll-tracker';
32
import { inject as service } from '@ember/service';
3+
import { withScrollReset } from '../utils/with-scroll-reset';
44

5-
export default class ProjectRoute extends Route.extend(ScrollTracker) {
5+
@withScrollReset
6+
export default class ProjectRoute extends Route {
67
/** @type {import('@ember/routing/router-service').default} */
78
@service
89
router;

app/services/scroll-position-reset.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ export default class ScrollPositionResetService extends Service {
3434
//TODO: Use routeInfo for reliable behavior
3535
const dynamicSlugLocation = 3;
3636

37+
// These will be unset when first entering the app, in which case we know we
38+
// are not changing tabs.
39+
if (!transition.from || !transition.to) {
40+
return false;
41+
}
42+
3743
let fromRoutePathParts = transition.from.name.split('.');
3844
let toRoutePathParts = transition.to.name.split('.');
3945

app/utils/with-scroll-reset.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { inject as service } from '@ember/service';
2+
import config from 'ember-api-docs/config/environment';
3+
import getOffset from 'ember-api-docs/utils/get-offset';
4+
5+
/**
6+
* Add scroll reset behavior to a `Route`.
7+
*
8+
* @param {import('@ember/routing/route').default} SomeRoute A Route class to
9+
* decorate with the scroll position handling.
10+
* @returns the decorated class
11+
*/
12+
export function withScrollReset(SomeRoute) {
13+
class WithScrollReset extends SomeRoute {
14+
/** @type {import('@ember/routing/router-service').default} */
15+
@service
16+
router;
17+
18+
/** @type {import('../services/scroll-position-reset').default} */
19+
@service
20+
scrollPositionReset;
21+
22+
constructor() {
23+
super(...arguments);
24+
this.router.on('routeWillChange', (transition) =>
25+
this.scrollPositionReset.scheduleReset(transition)
26+
);
27+
28+
this.router.on('routeDidChange', () => {
29+
if (
30+
typeof FastBoot === 'undefined' &&
31+
window.location.search === '?anchor='
32+
) {
33+
let elem = document.querySelector('#methods');
34+
35+
if (elem && elem.offsetHeight) {
36+
const offsetToScroll = getOffset(
37+
elem,
38+
config.APP.scrollContainerSelector
39+
);
40+
const scrollContainer = document.querySelector(
41+
config.APP.scrollContainerSelector
42+
);
43+
if (scrollContainer.scrollTo) {
44+
scrollContainer.scrollTo(0, offsetToScroll - 10);
45+
} else {
46+
// fallback for IE11
47+
scrollContainer.scrollTop = offsetToScroll - 10;
48+
}
49+
return;
50+
}
51+
}
52+
this.scrollPositionReset.doReset();
53+
});
54+
}
55+
}
56+
57+
return WithScrollReset;
58+
}

tests/unit/mixins/scroll-tracker-test.js

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)