diff --git a/app/controllers/project-version.js b/app/controllers/project-version.js index 48ecf66e..dee90c6c 100644 --- a/app/controllers/project-version.js +++ b/app/controllers/project-version.js @@ -8,6 +8,7 @@ import values from 'lodash.values'; import groupBy from 'lodash.groupby'; import semverCompare from 'semver-compare'; import getCompactVersion from '../utils/get-compact-version'; +import { inject as controller } from '@ember/controller' export default class ProjectVersionController extends Controller { @service @@ -19,6 +20,15 @@ export default class ProjectVersionController extends Controller { @service project; + @service + router; + + @service('project') + projectService; + + @controller('project-version.classes.class') + classesController; + @alias('filterData.sideNav.showPrivate') showPrivateClasses; @@ -128,4 +138,114 @@ export default class ProjectVersionController extends Controller { togglePrivateClasses() { set(this, 'showPrivateClasses', !this.showPrivateClasses); } + + @action + updateProject(ver /*, component */) { + let project = this.activeProject; + let projectVersionID = ver.compactVersion; + let endingRoute; + switch (this.router.currentRouteName) { + case 'project-version.classes.class': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}`; + break; + } + case 'project-version.classes.class.index': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}`; + break; + } + case 'project-version.modules.module.index': { + let moduleName = encodeURIComponent( + this.paramsFor('project-version.modules.module').module + ); + endingRoute = `modules/${moduleName}`; + break; + } + case 'project-version.namespaces.namespace.index': { + let namespaceName = this.paramsFor( + 'project-version.namespaces.namespace' + ).namespace; + endingRoute = `namespaces/${namespaceName}`; + break; + } + case 'project-version.classes.class.methods.index': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}/methods`; + break; + } + case 'project-version.classes.class.events.index': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}/events`; + break; + } + case 'project-version.classes.class.properties.index': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}/properties`; + break; + } + case 'project-version.classes.class.methods.method': { + let className = this._getEncodedNameForCurrentClass(); + let methodName = this.paramsFor( + 'project-version.classes.class.methods.method' + ).method; + endingRoute = `classes/${className}/methods/${methodName}?anchor=${methodName}`; + break; + } + case 'project-version.classes.class.events.event': { + let className = this._getEncodedNameForCurrentClass(); + let eventName = this.paramsFor( + 'project-version.classes.class.events.event' + ).event; + endingRoute = `classes/${className}/events/${eventName}?anchor=${eventName}`; + break; + } + case 'project-version.classes.class.properties.property': { + let className = this._getEncodedNameForCurrentClass(); + let propertyName = this.paramsFor( + 'project-version.classes.class.properties.property' + ).property; + endingRoute = `classes/${className}/properties/${propertyName}?anchor=${propertyName}`; + break; + } + default: + endingRoute = ''; + break; + } + // if the user is navigating to/from api versions >= 2.16, take them + // to the home page instead of trying to translate the url + let shouldConvertPackages = this.shouldConvertPackages( + ver, + this.projectService.version + ); + let isEmberProject = project === 'ember'; + if (!isEmberProject || !shouldConvertPackages) { + this.router.transitionTo( + `/${project}/${projectVersionID}/${endingRoute}` + ); + } else { + this.router.transitionTo(`/${project}/${projectVersionID}`); + } + } + + // Input some version info, returns a boolean based on + // whether the user is switching versions for a 2.16 docs release or later. + // The urls for pre-2.16 classes and later packages are quite different + shouldConvertPackages(targetVer, previousVer) { + let targetVersion = getCompactVersion(targetVer.id); + let previousVersion = getCompactVersion(previousVer); + let previousComparison = semverCompare(previousVersion, '2.16'); + let targetComparison = semverCompare(targetVersion, '2.16'); + return ( + (previousComparison < 0 && targetComparison >= 0) || + (previousComparison >= 0 && targetComparison < 0) + ); + } + + _getEncodedNameForCurrentClass() { + // escape any reserved characters for url, like slashes + return encodeURIComponent( + this.classesController.model.get('name') + ); + } } diff --git a/app/routes/project-version.js b/app/routes/project-version.js index 2fab46c7..dce78d46 100644 --- a/app/routes/project-version.js +++ b/app/routes/project-version.js @@ -144,94 +144,6 @@ export default class ProjectVersionRoute extends Route { }; } - @action - updateProject(project, ver /*, component */) { - let projectVersionID = ver.compactVersion; - let endingRoute; - switch (this.router.currentRouteName) { - case 'project-version.classes.class': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}`; - break; - } - case 'project-version.classes.class.index': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}`; - break; - } - case 'project-version.modules.module.index': { - let moduleName = encodeURIComponent( - this.paramsFor('project-version.modules.module').module - ); - endingRoute = `modules/${moduleName}`; - break; - } - case 'project-version.namespaces.namespace.index': { - let namespaceName = this.paramsFor( - 'project-version.namespaces.namespace' - ).namespace; - endingRoute = `namespaces/${namespaceName}`; - break; - } - case 'project-version.classes.class.methods.index': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}/methods`; - break; - } - case 'project-version.classes.class.events.index': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}/events`; - break; - } - case 'project-version.classes.class.properties.index': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}/properties`; - break; - } - case 'project-version.classes.class.methods.method': { - let className = this._getEncodedNameForCurrentClass(); - let methodName = this.paramsFor( - 'project-version.classes.class.methods.method' - ).method; - endingRoute = `classes/${className}/methods/${methodName}?anchor=${methodName}`; - break; - } - case 'project-version.classes.class.events.event': { - let className = this._getEncodedNameForCurrentClass(); - let eventName = this.paramsFor( - 'project-version.classes.class.events.event' - ).event; - endingRoute = `classes/${className}/events/${eventName}?anchor=${eventName}`; - break; - } - case 'project-version.classes.class.properties.property': { - let className = this._getEncodedNameForCurrentClass(); - let propertyName = this.paramsFor( - 'project-version.classes.class.properties.property' - ).property; - endingRoute = `classes/${className}/properties/${propertyName}?anchor=${propertyName}`; - break; - } - default: - endingRoute = ''; - break; - } - // if the user is navigating to/from api versions >= 2.16, take them - // to the home page instead of trying to translate the url - let shouldConvertPackages = this.shouldConvertPackages( - ver, - this.projectService.version - ); - let isEmberProject = project === 'ember'; - if (!isEmberProject || !shouldConvertPackages) { - this.router.transitionTo( - `/${project}/${projectVersionID}/${endingRoute}` - ); - } else { - this.router.transitionTo(`/${project}/${projectVersionID}`); - } - } - // Input some version info, returns a boolean based on // whether the user is switching versions for a 2.16 docs release or later. // The urls for pre-2.16 classes and later packages are quite different diff --git a/app/templates/project-version.hbs b/app/templates/project-version.hbs index b4ac9e8a..449ece3d 100644 --- a/app/templates/project-version.hbs +++ b/app/templates/project-version.hbs @@ -16,7 +16,7 @@
= 4'} - ember-factory-for-polyfill@1.3.1: - resolution: {integrity: sha512-y3iG2iCzH96lZMTWQw6LWNLAfOmDC4pXKbZP6FxG8lt7GGaNFkZjwsf+Z5GAe7kxfD7UG4lVkF7x37K82rySGA==} - engines: {node: ^4.5 || 6.* || >= 7.*} - ember-fetch@8.1.2: resolution: {integrity: sha512-TVx24/jrvDIuPL296DV0hBwp7BWLcSMf0I8464KGz01sPytAB+ZAePbc9ooBTJDkKZEGFgatJa4nj3yF1S9Bpw==} engines: {node: '>= 10'} @@ -3997,10 +3990,6 @@ packages: resolution: {integrity: sha512-uNmv1cPG/4qsac8oIf5txJ2FZ8p88LEpG4P3dNcjsJS98Y8hd0GPMFwVqpnzI78Lz7VYRGQWY4jnE4qm5R3j4g==} engines: {node: 12.* || 14.* || >= 16} - ember-getowner-polyfill@2.2.0: - resolution: {integrity: sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q==} - engines: {node: ^4.5 || 6.* || >= 7.*} - ember-in-element-polyfill@1.0.1: resolution: {integrity: sha512-eHs+7D7PuQr8a1DPqsJTsEyo3FZ1XuH6WEZaEBPDa9s0xLlwByCNKl8hi1EbXOgvgEZNHHi9Rh0vjxyfakrlgg==} engines: {node: 10.* || >= 12} @@ -4077,10 +4066,6 @@ packages: ember-rfc176-data@0.3.18: resolution: {integrity: sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==} - ember-route-action-helper@2.0.8: - resolution: {integrity: sha512-V+4uKwqaYveriVt2rl4e+9mzHJiQOr1B8dCPQQ2TS3iAcmi5RD2giRDFGtCK9d2XY9Arb/f9hJh0obP20iyt3A==} - engines: {node: ^4.5 || 6.* || >= 7.*} - ember-router-generator@2.0.0: resolution: {integrity: sha512-89oVHVJwmLDvGvAUWgS87KpBoRhy3aZ6U0Ql6HOmU4TrPkyaa8pM0W81wj9cIwjYprcQtN9EwzZMHnq46+oUyw==} engines: {node: 8.* || 10.* || >= 12} @@ -14330,10 +14315,6 @@ snapshots: ember-export-application-global@2.0.1: {} - ember-factory-for-polyfill@1.3.1: - dependencies: - ember-cli-version-checker: 2.2.0 - ember-fetch@8.1.2(encoding@0.1.13): dependencies: abortcontroller-polyfill: 1.7.5 @@ -14379,11 +14360,6 @@ snapshots: - '@glint/template' - supports-color - ember-getowner-polyfill@2.2.0: - dependencies: - ember-cli-version-checker: 2.2.0 - ember-factory-for-polyfill: 1.3.1 - ember-in-element-polyfill@1.0.1: dependencies: debug: 4.3.5(supports-color@8.1.1) @@ -14558,14 +14534,6 @@ snapshots: ember-rfc176-data@0.3.18: {} - ember-route-action-helper@2.0.8(@babel/core@7.24.7): - dependencies: - ember-cli-babel: 6.18.0(@babel/core@7.24.7) - ember-getowner-polyfill: 2.2.0 - transitivePeerDependencies: - - '@babel/core' - - supports-color - ember-router-generator@2.0.0: dependencies: '@babel/parser': 7.24.7