22import { action , computed , set } from '@ember/object' ;
33import { inject as service } from '@ember/service' ;
44import { readOnly , alias } from '@ember/object/computed' ;
5- import Controller from '@ember/controller' ;
5+ import Controller , { inject as controller } from '@ember/controller' ;
66import { A } from '@ember/array' ;
77import values from 'lodash.values' ;
88import groupBy from 'lodash.groupby' ;
@@ -19,6 +19,16 @@ export default class ProjectVersionController extends Controller {
1919 @service
2020 project ;
2121
22+ @service router ;
23+ @service ( 'project' ) projectService ;
24+
25+ @controller ( 'project-version.classes.class' ) classController ;
26+ @controller ( 'project-version.modules.module' ) moduleController ;
27+ @controller ( 'project-version.namespaces.namespace' ) namespaceController ;
28+ @controller ( 'project-version.classes.class.methods' ) methodsController ;
29+ @controller ( 'project-version.classes.class.events' ) eventsController ;
30+ @controller ( 'project-version.classes.class.properties' ) propertiesController ;
31+
2232 @alias ( 'filterData.sideNav.showPrivate' )
2333 showPrivateClasses ;
2434
@@ -128,4 +138,102 @@ export default class ProjectVersionController extends Controller {
128138 togglePrivateClasses ( ) {
129139 set ( this , 'showPrivateClasses' , ! this . showPrivateClasses ) ;
130140 }
141+
142+ @action
143+ updateProject ( project , ver /*, component */ ) {
144+ let projectVersionID = ver . compactVersion ;
145+ let endingRoute ;
146+ switch ( this . router . currentRouteName ) {
147+ case 'project-version.classes.class' : {
148+ let className = this . _getEncodedNameForCurrentClass ( ) ;
149+ endingRoute = `classes/${ className } ` ;
150+ break ;
151+ }
152+ case 'project-version.classes.class.index' : {
153+ let className = this . _getEncodedNameForCurrentClass ( ) ;
154+ endingRoute = `classes/${ className } ` ;
155+ break ;
156+ }
157+ case 'project-version.modules.module.index' : {
158+ let moduleName = encodeURIComponent ( this . moduleController . model . name ) ;
159+ endingRoute = `modules/${ moduleName } ` ;
160+ break ;
161+ }
162+ case 'project-version.namespaces.namespace.index' : {
163+ let namespaceName = this . namespaceController . model . name ;
164+ endingRoute = `namespaces/${ namespaceName } ` ;
165+ break ;
166+ }
167+ case 'project-version.classes.class.methods.index' : {
168+ let className = this . _getEncodedNameForCurrentClass ( ) ;
169+ endingRoute = `classes/${ className } /methods` ;
170+ break ;
171+ }
172+ case 'project-version.classes.class.events.index' : {
173+ let className = this . _getEncodedNameForCurrentClass ( ) ;
174+ endingRoute = `classes/${ className } /events` ;
175+ break ;
176+ }
177+ case 'project-version.classes.class.properties.index' : {
178+ let className = this . _getEncodedNameForCurrentClass ( ) ;
179+ endingRoute = `classes/${ className } /properties` ;
180+ break ;
181+ }
182+ case 'project-version.classes.class.methods.method' : {
183+ let className = this . _getEncodedNameForCurrentClass ( ) ;
184+ let methodName = this . methodsController . anchor ;
185+ endingRoute = `classes/${ className } /methods/${ methodName } ?anchor=${ methodName } ` ;
186+ break ;
187+ }
188+ case 'project-version.classes.class.events.event' : {
189+ let className = this . _getEncodedNameForCurrentClass ( ) ;
190+ let eventName = this . eventsController . anchor ;
191+ endingRoute = `classes/${ className } /events/${ eventName } ?anchor=${ eventName } ` ;
192+ break ;
193+ }
194+ case 'project-version.classes.class.properties.property' : {
195+ let className = this . _getEncodedNameForCurrentClass ( ) ;
196+ let propertyName = this . propertiesController . anchor ;
197+ endingRoute = `classes/${ className } /properties/${ propertyName } ?anchor=${ propertyName } ` ;
198+ break ;
199+ }
200+ default :
201+ endingRoute = '' ;
202+ break ;
203+ }
204+ // if the user is navigating to/from api versions >= 2.16, take them
205+ // to the home page instead of trying to translate the url
206+ let shouldConvertPackages = this . _shouldConvertPackages (
207+ ver ,
208+ this . projectService . version
209+ ) ;
210+ let isEmberProject = project === 'ember' ;
211+
212+ if ( ! isEmberProject || ! shouldConvertPackages ) {
213+ this . router . transitionTo (
214+ `/${ project } /${ projectVersionID } /${ endingRoute } `
215+ ) ;
216+ } else {
217+ this . router . transitionTo ( `/${ project } /${ projectVersionID } ` ) ;
218+ }
219+ }
220+
221+ _getEncodedNameForCurrentClass ( ) {
222+ // escape any reserved characters for url, like slashes
223+ return encodeURIComponent ( this . classController . model . get ( 'name' ) ) ;
224+ }
225+
226+ // Input some version info, returns a boolean based on
227+ // whether the user is switching versions for a 2.16 docs release or later.
228+ // The urls for pre-2.16 classes and later packages are quite different
229+ _shouldConvertPackages ( targetVer , previousVer ) {
230+ let targetVersion = getCompactVersion ( targetVer . id ) ;
231+ let previousVersion = getCompactVersion ( previousVer ) ;
232+ let previousComparison = semverCompare ( previousVersion , '2.16' ) ;
233+ let targetComparison = semverCompare ( targetVersion , '2.16' ) ;
234+ return (
235+ ( previousComparison < 0 && targetComparison >= 0 ) ||
236+ ( previousComparison >= 0 && targetComparison < 0 )
237+ ) ;
238+ }
131239}
0 commit comments