Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit ce49edc

Browse files
chore(docs): improve version picker
Closes #15385
1 parent 0f45ade commit ce49edc

13 files changed

+150
-71
lines changed

Gruntfile.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ module.exports = function(grunt) {
346346

347347
grunt.registerTask('minify', ['bower', 'clean', 'build', 'minall']);
348348
grunt.registerTask('webserver', ['connect:devserver']);
349-
grunt.registerTask('package', ['bower', 'validate-angular-files', 'clean', 'buildall', 'minall', 'collect-errors', 'docs', 'copy', 'write', 'compress']);
349+
grunt.registerTask('package', ['bower', 'validate-angular-files', 'clean', 'buildall', 'minall', 'collect-errors', 'write', 'docs', 'copy', 'compress']);
350350
grunt.registerTask('ci-checks', ['ddescribe-iit', 'merge-conflict', 'eslint']);
351351
grunt.registerTask('default', ['package']);
352352
};

docs/app/src/app.js

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ angular.module('docsApp', [
66
'ngSanitize',
77
'ngAnimate',
88
'DocsController',
9-
'versionsData',
109
'pagesData',
1110
'navData',
1211
'directives',

docs/app/src/docs.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
'use strict';
22

3-
angular.module('DocsController', [])
3+
angular.module('DocsController', ['currentVersionData'])
44

55
.controller('DocsController', [
66
'$scope', '$rootScope', '$location', '$window', '$cookies',
7-
'NG_PAGES', 'NG_NAVIGATION', 'NG_VERSION',
7+
'NG_PAGES', 'NG_NAVIGATION', 'CURRENT_NG_VERSION',
88
function($scope, $rootScope, $location, $window, $cookies,
9-
NG_PAGES, NG_NAVIGATION, NG_VERSION) {
9+
NG_PAGES, NG_NAVIGATION, CURRENT_NG_VERSION) {
1010

1111
$scope.navClass = function(navItem) {
1212
return {
@@ -58,8 +58,8 @@ angular.module('DocsController', [])
5858
Initialize
5959
***********************************/
6060

61-
$scope.versionNumber = NG_VERSION.full;
62-
$scope.version = NG_VERSION.full + ' ' + NG_VERSION.codeName;
61+
$scope.versionNumber = CURRENT_NG_VERSION.full;
62+
$scope.version = CURRENT_NG_VERSION.full + ' ' + CURRENT_NG_VERSION.codeName;
6363
$scope.loading = 0;
6464

6565

docs/app/src/versions.js

+34-29
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,42 @@
11
'use strict';
2+
/* global console */
23

3-
angular.module('versions', [])
4+
angular.module('versions', ['currentVersionData', 'allVersionsData'])
45

5-
.controller('DocsVersionsCtrl', ['$scope', '$location', '$window', 'NG_VERSIONS', function($scope, $location, $window, NG_VERSIONS) {
6-
$scope.docs_version = NG_VERSIONS[0];
7-
$scope.docs_versions = NG_VERSIONS;
6+
.directive('versionPicker', function() {
7+
return {
8+
restrict: 'E',
9+
scope: true,
10+
controllerAs: '$ctrl',
11+
controller: ['$location', '$window', 'CURRENT_NG_VERSION', 'ALL_NG_VERSIONS',
12+
/** @this VersionPickerController */
13+
function VersionPickerController($location, $window, CURRENT_NG_VERSION, ALL_NG_VERSIONS) {
814

9-
for (var i = 0, minor = NaN; i < NG_VERSIONS.length; i++) {
10-
var version = NG_VERSIONS[i];
11-
if (version.isSnapshot) {
12-
version.isLatest = true;
13-
continue;
14-
}
15-
// NaN will give false here
16-
if (minor <= version.minor) {
17-
continue;
18-
}
19-
version.isLatest = true;
20-
minor = version.minor;
21-
}
15+
var versionStr = CURRENT_NG_VERSION.isSnapshot ? 'snapshot' : CURRENT_NG_VERSION.version;
2216

23-
$scope.getGroupName = function(v) {
24-
return v.isLatest ? 'Latest' : ('v' + v.major + '.' + v.minor + '.x');
17+
this.versions = ALL_NG_VERSIONS;
18+
this.selectedVersion = find(ALL_NG_VERSIONS, function(value) { return value.version.version === versionStr; });
19+
20+
this.jumpToDocsVersion = function(value) {
21+
var currentPagePath = $location.path().replace(/\/$/, '');
22+
$window.location = value.docsUrl + currentPagePath;
23+
};
24+
}],
25+
template:
26+
'<div class="picker version-picker">' +
27+
' <select ng-options="v as v.label group by v.group for v in $ctrl.versions"' +
28+
' ng-model="$ctrl.selectedVersion"' +
29+
' ng-change="$ctrl.jumpToDocsVersion($ctrl.selectedVersion)"' +
30+
' class="docs-version-jump">' +
31+
' </select>' +
32+
'</div>'
2533
};
2634

27-
$scope.jumpToDocsVersion = function(version) {
28-
var currentPagePath = $location.path().replace(/\/$/, ''),
29-
url = '';
30-
if (version.isOldDocsUrl) {
31-
url = version.docsUrl;
32-
} else {
33-
url = version.docsUrl + currentPagePath;
35+
function find(collection, matcherFn) {
36+
for (var i = 0, ii = collection.length; i < ii; ++i) {
37+
if (matcherFn(collection[i])) {
38+
return collection[i];
39+
}
3440
}
35-
$window.location = url;
36-
};
37-
}]);
41+
}
42+
});

docs/app/test/docsSpec.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@ describe('DocsController', function() {
66
angular.module('fake', [])
77
.value('$cookies', {})
88
.value('NG_PAGES', {})
9-
.value('NG_NAVIGATION', {})
10-
.value('NG_VERSION', {});
9+
.value('NG_NAVIGATION', {});
10+
11+
angular.module('currentVersionData', [])
12+
.value('CURRENT_NG_VERSION', {});
13+
14+
angular.module('allVersionsData', [])
15+
.value('ALL_NG_VERSIONS', {});
1116

1217
beforeEach(module('fake', 'DocsController'));
1318
beforeEach(inject(function($rootScope, $controller) {
+90-16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22

3-
var _ = require('lodash');
3+
var exec = require('shelljs').exec;
4+
var semver = require('semver');
45

56
/**
67
* @dgProcessor generateVersionDocProcessor
@@ -12,23 +13,96 @@ module.exports = function generateVersionDocProcessor(gitData) {
1213
return {
1314
$runAfter: ['generatePagesDataProcessor'],
1415
$runBefore: ['rendering-docs'],
16+
// the blacklist is to remove rogue builds that are in npm but not on code.angularjs.org
17+
blacklist: ['1.3.4-build.3588'],
1518
$process: function(docs) {
1619

17-
var versionDoc = {
18-
docType: 'versions-data',
19-
id: 'versions-data',
20-
template: 'versions-data.template.js',
21-
outputPath: 'js/versions-data.js',
22-
currentVersion: gitData.version
23-
};
24-
25-
versionDoc.versions = _(gitData.versions)
26-
.filter(function(version) { return version.major > 0; })
27-
.push(gitData.version)
28-
.reverse()
29-
.value();
30-
31-
docs.push(versionDoc);
20+
var blacklist = this.blacklist;
21+
var currentVersion = require('../../../build/version.json');
22+
var output = exec('npm info angular versions --json', { silent: true }).stdout;
23+
var allVersions = processAllVersionsResponse(JSON.parse(output));
24+
25+
docs.push({
26+
docType: 'current-version-data',
27+
id: 'current-version-data',
28+
template: 'angular-service.template.js',
29+
outputPath: 'js/current-version-data.js',
30+
ngModuleName: 'currentVersionData',
31+
serviceName: 'CURRENT_NG_VERSION',
32+
serviceValue: currentVersion
33+
});
34+
35+
docs.push({
36+
docType: 'allversions-data',
37+
id: 'allversions-data',
38+
template: 'angular-service.template.js',
39+
outputPath: 'js/all-versions-data.js',
40+
ngModuleName: 'allVersionsData',
41+
serviceName: 'ALL_NG_VERSIONS',
42+
serviceValue: allVersions
43+
});
44+
45+
46+
function processAllVersionsResponse(versions) {
47+
48+
var latestMap = {};
49+
50+
versions = versions
51+
.filter(function(versionStr) {
52+
return blacklist.indexOf(versionStr) === -1;
53+
})
54+
.map(function(versionStr) {
55+
return semver.parse(versionStr);
56+
})
57+
.filter(function(version) {
58+
return version && version.major > 0;
59+
})
60+
.map(function(version) {
61+
var key = version.major + '.' + version.minor;
62+
var latest = latestMap[key];
63+
if (!latest || version.compare(latest) > 0) {
64+
latestMap[key] = version;
65+
}
66+
return version;
67+
})
68+
.map(function(version) {
69+
return makeOption(version);
70+
})
71+
.reverse();
72+
73+
var latest = sortObject(latestMap, reverse(semver.compare))
74+
.map(function(version) { return makeOption(version, 'Latest'); });
75+
76+
return [makeOption({version: 'snapshot'}, 'Latest', 'master')]
77+
.concat(latest)
78+
.concat(versions);
79+
}
80+
81+
function makeOption(version, group, label) {
82+
return {
83+
version: version,
84+
label: label || 'v' + version.raw,
85+
group: group || 'v' + version.major + '.' + version.minor,
86+
docsUrl: createDocsUrl(version)
87+
};
88+
}
89+
90+
function createDocsUrl(version) {
91+
var url = 'https://code.angularjs.org/' + version.version + '/docs';
92+
// Versions before 1.0.2 had a different docs folder name
93+
if (version.major === 1 && version.minor === 0 && version.patch < 2) {
94+
url += '-' + version.version;
95+
}
96+
return url;
97+
}
98+
99+
function reverse(fn) {
100+
return function(left, right) { return -fn(left, right); };
101+
}
102+
103+
function sortObject(obj, cmp) {
104+
return Object.keys(obj).map(function(key) { return obj[key]; }).sort(cmp);
105+
}
32106
}
33107
};
34108
};

docs/config/services/deployments/debug.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ module.exports = function debugDeployment(getVersion) {
2222
'components/lunr.js-' + getVersion('lunr.js') + '/lunr.js',
2323
'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/prettify.js',
2424
'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/lang-css.js',
25-
'js/versions-data.js',
25+
'js/current-version-data.js',
26+
'js/all-versions-data.js',
2627
'js/pages-data.js',
2728
'js/nav-data.js',
2829
'js/docs.js'

docs/config/services/deployments/default.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ module.exports = function defaultDeployment(getVersion) {
2222
'components/lunr.js-' + getVersion('lunr.js') + '/lunr.min.js',
2323
'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/prettify.js',
2424
'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/lang-css.js',
25-
'js/versions-data.js',
25+
'js/current-version-data.js',
26+
'js/all-versions-data.js',
2627
'js/pages-data.js',
2728
'js/nav-data.js',
2829
'js/docs.min.js'

docs/config/services/deployments/jquery.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ module.exports = function jqueryDeployment(getVersion) {
2626
'components/lunr.js-' + getVersion('lunr.js') + '/lunr.min.js',
2727
'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/prettify.js',
2828
'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/lang-css.js',
29-
'js/versions-data.js',
29+
'js/current-version-data.js',
30+
'js/all-versions-data.js',
3031
'js/pages-data.js',
3132
'js/nav-data.js',
3233
'js/docs.min.js'

docs/config/services/deployments/production.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ module.exports = function productionDeployment(getVersion) {
3939
'components/lunr.js-' + getVersion('lunr.js') + '/lunr.min.js',
4040
'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/prettify.js',
4141
'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/lang-css.js',
42-
'js/versions-data.js',
42+
'js/current-version-data.js',
43+
'https://code.angularjs.org/snapshot/docs/js/all-versions-data.js',
4344
'js/pages-data.js',
4445
'js/nav-data.js',
4546
'js/docs.min.js'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
'use strict';
2+
3+
angular.module('{$ doc.ngModuleName $}', [])
4+
.value('{$ doc.serviceName $}', {$ doc.serviceValue | json $});

docs/config/templates/indexPage.template.html

+1-7
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,7 @@ <h4 class="search-results-group-heading">{{ key }}</h4>
165165
<section class="sup-header">
166166
<div class="container main-grid main-header-grid">
167167
<div class="grid-left">
168-
<div ng-controller="DocsVersionsCtrl" class="picker version-picker">
169-
<select ng-options="v as (v.isSnapshot ? v.branch : ('v' + v.version)) group by getGroupName(v) for v in docs_versions"
170-
ng-model="docs_version"
171-
ng-change="jumpToDocsVersion(docs_version)"
172-
class="docs-version-jump">
173-
</select>
174-
</div>
168+
<version-picker></version-picker>
175169
</div>
176170
<div class="grid-right">
177171
<ul class="nav-breadcrumb">

docs/config/templates/versions-data.template.js

-6
This file was deleted.

0 commit comments

Comments
 (0)