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 @@