diff --git a/app/controllers/project-version.js b/app/controllers/project-version.js index 48ecf66e..e3374b9e 100644 --- a/app/controllers/project-version.js +++ b/app/controllers/project-version.js @@ -2,7 +2,7 @@ import { action, computed, set } from '@ember/object'; import { inject as service } from '@ember/service'; import { readOnly, alias } from '@ember/object/computed'; -import Controller from '@ember/controller'; +import Controller, { inject as controller } from '@ember/controller'; import { A } from '@ember/array'; import values from 'lodash.values'; import groupBy from 'lodash.groupby'; @@ -19,6 +19,16 @@ export default class ProjectVersionController extends Controller { @service project; + @service router; + @service('project') projectService; + + @controller('project-version.classes.class') classController; + @controller('project-version.modules.module') moduleController; + @controller('project-version.namespaces.namespace') namespaceController; + @controller('project-version.classes.class.methods') methodsController; + @controller('project-version.classes.class.events') eventsController; + @controller('project-version.classes.class.properties') propertiesController; + @alias('filterData.sideNav.showPrivate') showPrivateClasses; @@ -128,4 +138,102 @@ export default class ProjectVersionController extends Controller { togglePrivateClasses() { set(this, 'showPrivateClasses', !this.showPrivateClasses); } + + @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.moduleController.model.name); + endingRoute = `modules/${moduleName}`; + break; + } + case 'project-version.namespaces.namespace.index': { + let namespaceName = this.namespaceController.model.name; + 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.methodsController.anchor; + endingRoute = `classes/${className}/methods/${methodName}?anchor=${methodName}`; + break; + } + case 'project-version.classes.class.events.event': { + let className = this._getEncodedNameForCurrentClass(); + let eventName = this.eventsController.anchor; + endingRoute = `classes/${className}/events/${eventName}?anchor=${eventName}`; + break; + } + case 'project-version.classes.class.properties.property': { + let className = this._getEncodedNameForCurrentClass(); + let propertyName = this.propertiesController.anchor; + 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}`); + } + } + + _getEncodedNameForCurrentClass() { + // escape any reserved characters for url, like slashes + return encodeURIComponent(this.classController.model.get('name')); + } + + // 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) + ); + } } diff --git a/app/routes/project-version.js b/app/routes/project-version.js index 15248125..c6f806df 100644 --- a/app/routes/project-version.js +++ b/app/routes/project-version.js @@ -1,8 +1,6 @@ -import { action } from '@ember/object'; import { inject as service } from '@ember/service'; import Route from '@ember/routing/route'; import semverCompare from 'semver-compare'; -import getCompactVersion from 'ember-api-docs/utils/get-compact-version'; import getFullVersion from 'ember-api-docs/utils/get-full-version'; import getLastVersion from 'ember-api-docs/utils/get-last-version'; import config from 'ember-api-docs/config/environment'; @@ -132,13 +130,6 @@ export default class ProjectVersionRoute extends Route { } } - _getEncodedNameForCurrentClass() { - // escape any reserved characters for url, like slashes - return encodeURIComponent( - this.modelFor('project-version.classes.class').get('name') - ); - } - serialize(model) { return { project: model.get('project.id'), @@ -146,108 +137,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 - 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) - ); - } - /** splits the first encoded revision string in the list and takes the string after the version (which is the encoded name), then decodes the result. */ diff --git a/app/templates/project-version.hbs b/app/templates/project-version.hbs index 396b21ba..2baa4509 100644 --- a/app/templates/project-version.hbs +++ b/app/templates/project-version.hbs @@ -4,7 +4,7 @@