Skip to content

Commit 390cfff

Browse files
committed
Add version selector
1 parent ded622f commit 390cfff

File tree

23 files changed

+490
-37
lines changed

23 files changed

+490
-37
lines changed

.eslintrc.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
module.exports = {
2+
globals: {
3+
server: true,
4+
},
25
root: true,
36
parserOptions: {
47
ecmaVersion: 2017,

addon/components/docs-header/component.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import config from 'dummy/config/environment';
44
import { computed } from '@ember/object';
55
import { classify } from '@ember/string';
66
import { addonLogo } from 'ember-cli-addon-docs/utils/computed';
7+
import { inject as service } from '@ember/service';
8+
import { reads } from '@ember/object/computed';
79

810
const packageJson = config['ember-cli-addon-docs'].packageJson;
911

@@ -32,6 +34,12 @@ export default Component.extend({
3234
tagName: '',
3335

3436
packageJson: packageJson,
37+
projectVersion: service(),
38+
39+
didInsertElement() {
40+
this._super(...arguments);
41+
this.get('projectVersion').loadAvailableVersions();
42+
},
3543

3644
logo: addonLogo(packageJson),
3745

@@ -44,6 +52,8 @@ export default Component.extend({
4452
return classify(name);
4553
}),
4654

55+
currentVersion: reads('projectVersion.currentVersion'),
56+
4757
actions: {
4858
didVisitPage() {
4959
this.set('query', null);

addon/components/docs-header/link/template.hbs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
px-4 py-3 transition uppercase text-xs font-semibold
66
text-grey-darkest no-underline opacity-50 hover:opacity-100
77
{{if push 'ml-auto'}}
8-
'>
8+
'
9+
data-test-id={{data-test-id}}>
910
{{yield}}
1011
</a>
1112

@@ -17,7 +18,8 @@
1718
px-4 py-3 transition uppercase text-xs font-semibold
1819
text-grey-darkest no-underline opacity-50 hover:opacity-100
1920
{{if push 'ml-auto'}}
20-
'>
21+
'
22+
data-test-id={{data-test-id}}>
2123
{{yield}}
2224
</a>
2325

@@ -29,6 +31,7 @@
2931
text-grey-darkest no-underline '
3032
(if (and (not isActive) (not (eq route 'index'))) 'opacity-50 hover:opacity-100')
3133
)
34+
data-test-id=data-test-id
3235
}}
3336
{{yield}}
3437
{{/link-to}}

addon/components/docs-header/template.hbs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,21 @@
2222

2323
{{docs-header/search-box query=query on-input=(action (mut query))}}
2424

25-
{{#docs-header/link href=(concat packageJson.repository '/releases')}}
26-
v{{packageJson.version}}
25+
{{#docs-header/link on-click=(action (toggle 'isShowingVersionSelector' this)) data-test-id='current-version'}}
26+
<span data-version-selector class='flex items-center'>
27+
28+
{{#if (or (eq currentVersion.name 'latest'))}}
29+
{{#if currentVersion.tag}}
30+
{{currentVersion.tag}}
31+
{{else}}
32+
Latest
33+
{{/if}}
34+
{{else}}
35+
{{currentVersion.name}}
36+
{{/if}}
37+
38+
{{svg-jar 'caret' height=12 width=12}}
39+
</span>
2740
{{/docs-header/link}}
2841

2942
{{#if packageJson.repository}}
@@ -41,6 +54,9 @@
4154
</header>
4255

4356
{{#if query}}
44-
{{docs-header/search-results query=query
45-
on-visit=(action 'didVisitPage')}}
57+
{{docs-header/search-results query=query on-visit=(action 'didVisitPage')}}
58+
{{/if}}
59+
60+
{{#if isShowingVersionSelector}}
61+
{{docs-header/version-selector on-close=(action (mut isShowingVersionSelector false))}}
4662
{{/if}}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import Component from '@ember/component';
2+
import { inject as service } from '@ember/service';
3+
import layout from './template';
4+
import { sort } from '@ember/object/computed';
5+
import { reads } from '@ember/object/computed';
6+
7+
export default Component.extend({
8+
layout,
9+
10+
projectVersion: service(),
11+
'on-close'() {},
12+
13+
currentVersion: reads('projectVersion.currentVersion'),
14+
15+
sortedVersions: sort('projectVersion.versions', function(a, b) {
16+
if (['latest', 'master'].includes(a.name) || ['latest', 'master'].includes(b.name) ) {
17+
return a.name > b.name;
18+
} else {
19+
return a.name < b.name;
20+
}
21+
}),
22+
23+
actions: {
24+
changeVersion(version) {
25+
this.get('projectVersion').redirectTo(version);
26+
}
27+
}
28+
29+
});
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{{#modal-dialog
2+
tetherTarget='[data-version-selector]'
3+
attachment='top right'
4+
clickOutsideToClose=true
5+
onClose=(action on-close)
6+
targetAttachment='bottom right'}}
7+
<ul class="list-reset mt-2 bg-white shadow-md text-sm rounded z-10">
8+
{{#each sortedVersions as |version|}}
9+
<li data-test-id='version'>
10+
<a {{action 'changeVersion' version}} href='#' class='text-black no-underline flex items-center px-4 py-3 hover:bg-grey-lighter'>
11+
<span class='w-6 flex'>
12+
{{#if (eq version currentVersion)}}
13+
{{svg-jar 'check' height=16 width=16}}
14+
{{/if}}
15+
</span>
16+
<span class='font-medium'>
17+
{{if (eq version.name 'latest') 'Latest' version.name}}
18+
</span>
19+
20+
<span class="ml-auto pl-8 flex items-center opacity-50">
21+
{{#if (or (eq version.name 'latest') (eq version.name 'master'))}}
22+
{{svg-jar (if version.tag 'git-tag' 'git-sha') height=16 width=16}}
23+
{{else}}
24+
{{svg-jar 'git-sha' height=16 width=16}}
25+
{{/if}}
26+
27+
<span class='text-xs font-mono pl-1'>
28+
{{#if (or (eq version.name 'latest') (eq version.name 'master'))}}
29+
{{#if version.tag}}
30+
{{version.tag}}
31+
{{else}}
32+
{{version.truncatedSha}}
33+
{{/if}}
34+
{{else}}
35+
{{version.truncatedSha}}
36+
{{/if}}
37+
</span>
38+
</span>
39+
</a>
40+
</li>
41+
{{/each}}
42+
</ul>
43+
{{/modal-dialog}}

addon/components/docs-viewer/x-nav/component.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ const packageJson = config['ember-cli-addon-docs'].packageJson;
1111
export default Component.extend({
1212
layout,
1313
tagName: '',
14-
// classNames: 'docs-viewer__nav',
1514

1615
root: 'docs',
1716

@@ -26,8 +25,6 @@ export default Component.extend({
2625
return classify(packageJson.name.replace(`${logo}-`, ''));
2726
}),
2827

29-
releasesUrl: `${packageJson.repository}/releases`,
30-
3128
project: computed(function() {
3229
return this.get('store').peekRecord('project', packageJson.name);
3330
})
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import ModalDialog from 'ember-modal-dialog/components/modal-dialog';
2+
import { computed } from '@ember/object';
3+
import { getOwner } from '@ember/application';
4+
5+
export default ModalDialog.extend({
6+
7+
renderInPlace: computed(function() {
8+
let config = getOwner(this).resolveRegistration('config:environment')
9+
10+
return config.environment === 'test';
11+
})
12+
13+
});

addon/services/project-version.js

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,48 @@
11
import Service from '@ember/service';
22
import { getOwner } from '@ember/application';
3-
import { resolve } from 'rsvp';
43
import fetch from 'fetch';
4+
import { computed } from '@ember/object';
5+
import { task } from 'ember-concurrency';
56

67
export default Service.extend({
78
current: null,
89
root: null,
910

10-
init() {
11-
this._super(...arguments);
12-
11+
_loadAvailableVersions: task(function*() {
1312
let { rootURL } = getOwner(this).resolveRegistration('config:environment');
1413
let slash = rootURL.indexOf('/', 1);
1514

1615
// TODO deal with apps deployed to custom domains, so their pathnames don't have a leading
1716
// segmenet for the project name. This will impact this service and the 404 page.
1817
this.set('root', rootURL.slice(0, slash));
18+
let currentFromURL = rootURL.substring(slash + 1).replace(/\/$/, '');
19+
this.set('current', currentFromURL || 'latest'); // dev-time guard. Think of a better way?
1920

20-
if (slash === -1) {
21-
this.set('current', 'development');
22-
this.set('_versionsPromise', resolve([{ name: 'development', path: '' }]));
23-
} else {
24-
this.set('current', rootURL.substring(slash + 1).replace(/\/$/, ''));
25-
this.set('_versionsPromise', fetch(`${this.get('root')}/versions.json`)
26-
.then(result => result.json())
27-
.then(json => Object.keys(json).map(key => json[key])));
28-
}
29-
},
21+
let response = yield fetch(`${this.get('root')}/versions.json`);
22+
let json = yield response.json();
23+
24+
this.set('versions', Object.keys(json).map(key => {
25+
let version = json[key];
26+
version.truncatedSha = version.sha.substr(0,5);
27+
28+
return version;
29+
}));
30+
}),
3031

3132
redirectTo(version) {
3233
window.location.href = `${this.get('root')}/${version.path || version}`;
3334
},
3435

35-
getAvailableVersions() {
36-
return this.get('_versionsPromise');
37-
}
36+
loadAvailableVersions() {
37+
return this.get('_loadAvailableVersions').perform();
38+
},
39+
40+
currentVersion: computed('versions.[]', function() {
41+
let versions = this.get('versions');
42+
43+
if (versions) {
44+
return versions.find(version => version.name === this.get('current'));
45+
}
46+
})
47+
3848
});

addon/styles/addon.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,7 @@ svg {
3434
.sticky {
3535
position: sticky;
3636
}
37+
38+
.ember-modal-dialog {
39+
z-index: 10;
40+
}

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
"ember-cli-htmlbars": "^2.0.3",
3939
"ember-cli-sass": "7.1.3",
4040
"ember-cli-string-helpers": "^1.7.0",
41-
"ember-code-snippet": "^2.1.0",
4241
"ember-cli-tailwind": "0.4.0",
42+
"ember-code-snippet": "^2.1.0",
4343
"ember-component-css": "^0.3.5",
4444
"ember-concurrency": "^0.8.16",
4545
"ember-data": "^2.18.0",
@@ -89,6 +89,7 @@
8989
"ember-cli-eslint": "^4.2.3",
9090
"ember-cli-htmlbars-inline-precompile": "^1.0.2",
9191
"ember-cli-inject-live-reload": "^1.7.0",
92+
"ember-cli-mirage": "^0.4.5",
9293
"ember-cli-qunit": "^4.3.0",
9394
"ember-cli-shims": "^1.2.0",
9495
"ember-cli-sri": "^2.1.0",

public/icons/caret.svg

Lines changed: 10 additions & 0 deletions
Loading

public/icons/check.svg

Lines changed: 10 additions & 0 deletions
Loading

public/icons/git-sha.svg

Lines changed: 10 additions & 0 deletions
Loading

public/icons/git-tag.svg

Lines changed: 10 additions & 0 deletions
Loading

tests/acceptance/docs-route-test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { module, test } from 'qunit';
22
import { setupApplicationTest } from 'ember-qunit';
3+
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
34
import { visit, click, currentURL } from '@ember/test-helpers';
45

56
module('Acceptance | Docs route test', function(hooks) {
67
setupApplicationTest(hooks);
8+
setupMirage(hooks);
79

810
test('the docs route renders', async function(assert) {
911
await visit('/docs');

tests/acceptance/sandbox/api/helpers-test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { module, test } from 'qunit';
22
import { setupApplicationTest } from 'ember-qunit';
3+
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
34
import { currentURL, visit } from '@ember/test-helpers';
45

56
import modulePage from '../../../pages/api/module';
67
import classPage from '../../../pages/api/class';
78

89
module('Acceptance | API | helpers', function(hooks) {
910
setupApplicationTest(hooks);
11+
setupMirage(hooks);
1012

1113
module('standard helpers', function() {
1214
for (let documenter of ['esdoc', 'yuidoc']) {
@@ -76,5 +78,3 @@ module('Acceptance | API | helpers', function(hooks) {
7678
}
7779
});
7880
});
79-
80-

0 commit comments

Comments
 (0)