@@ -8,6 +8,7 @@ import values from 'lodash.values';
8
8
import groupBy from 'lodash.groupby' ;
9
9
import semverCompare from 'semver-compare' ;
10
10
import getCompactVersion from '../utils/get-compact-version' ;
11
+ import { inject as controller } from '@ember/controller'
11
12
12
13
export default class ProjectVersionController extends Controller {
13
14
@service
@@ -19,6 +20,15 @@ export default class ProjectVersionController extends Controller {
19
20
@service
20
21
project ;
21
22
23
+ @service
24
+ router ;
25
+
26
+ @service ( 'project' )
27
+ projectService ;
28
+
29
+ @controller ( 'project-version.classes.class' )
30
+ classesController ;
31
+
22
32
@alias ( 'filterData.sideNav.showPrivate' )
23
33
showPrivateClasses ;
24
34
@@ -128,4 +138,114 @@ export default class ProjectVersionController extends Controller {
128
138
togglePrivateClasses ( ) {
129
139
set ( this , 'showPrivateClasses' , ! this . showPrivateClasses ) ;
130
140
}
141
+
142
+ @action
143
+ updateProject ( ver /*, component */ ) {
144
+ let project = this . activeProject ;
145
+ let projectVersionID = ver . compactVersion ;
146
+ let endingRoute ;
147
+ switch ( this . router . currentRouteName ) {
148
+ case 'project-version.classes.class' : {
149
+ let className = this . _getEncodedNameForCurrentClass ( ) ;
150
+ endingRoute = `classes/${ className } ` ;
151
+ break ;
152
+ }
153
+ case 'project-version.classes.class.index' : {
154
+ let className = this . _getEncodedNameForCurrentClass ( ) ;
155
+ endingRoute = `classes/${ className } ` ;
156
+ break ;
157
+ }
158
+ case 'project-version.modules.module.index' : {
159
+ let moduleName = encodeURIComponent (
160
+ this . paramsFor ( 'project-version.modules.module' ) . module
161
+ ) ;
162
+ endingRoute = `modules/${ moduleName } ` ;
163
+ break ;
164
+ }
165
+ case 'project-version.namespaces.namespace.index' : {
166
+ let namespaceName = this . paramsFor (
167
+ 'project-version.namespaces.namespace'
168
+ ) . namespace ;
169
+ endingRoute = `namespaces/${ namespaceName } ` ;
170
+ break ;
171
+ }
172
+ case 'project-version.classes.class.methods.index' : {
173
+ let className = this . _getEncodedNameForCurrentClass ( ) ;
174
+ endingRoute = `classes/${ className } /methods` ;
175
+ break ;
176
+ }
177
+ case 'project-version.classes.class.events.index' : {
178
+ let className = this . _getEncodedNameForCurrentClass ( ) ;
179
+ endingRoute = `classes/${ className } /events` ;
180
+ break ;
181
+ }
182
+ case 'project-version.classes.class.properties.index' : {
183
+ let className = this . _getEncodedNameForCurrentClass ( ) ;
184
+ endingRoute = `classes/${ className } /properties` ;
185
+ break ;
186
+ }
187
+ case 'project-version.classes.class.methods.method' : {
188
+ let className = this . _getEncodedNameForCurrentClass ( ) ;
189
+ let methodName = this . paramsFor (
190
+ 'project-version.classes.class.methods.method'
191
+ ) . method ;
192
+ endingRoute = `classes/${ className } /methods/${ methodName } ?anchor=${ methodName } ` ;
193
+ break ;
194
+ }
195
+ case 'project-version.classes.class.events.event' : {
196
+ let className = this . _getEncodedNameForCurrentClass ( ) ;
197
+ let eventName = this . paramsFor (
198
+ 'project-version.classes.class.events.event'
199
+ ) . event ;
200
+ endingRoute = `classes/${ className } /events/${ eventName } ?anchor=${ eventName } ` ;
201
+ break ;
202
+ }
203
+ case 'project-version.classes.class.properties.property' : {
204
+ let className = this . _getEncodedNameForCurrentClass ( ) ;
205
+ let propertyName = this . paramsFor (
206
+ 'project-version.classes.class.properties.property'
207
+ ) . property ;
208
+ endingRoute = `classes/${ className } /properties/${ propertyName } ?anchor=${ propertyName } ` ;
209
+ break ;
210
+ }
211
+ default :
212
+ endingRoute = '' ;
213
+ break ;
214
+ }
215
+ // if the user is navigating to/from api versions >= 2.16, take them
216
+ // to the home page instead of trying to translate the url
217
+ let shouldConvertPackages = this . shouldConvertPackages (
218
+ ver ,
219
+ this . projectService . version
220
+ ) ;
221
+ let isEmberProject = project === 'ember' ;
222
+ if ( ! isEmberProject || ! shouldConvertPackages ) {
223
+ this . router . transitionTo (
224
+ `/${ project } /${ projectVersionID } /${ endingRoute } `
225
+ ) ;
226
+ } else {
227
+ this . router . transitionTo ( `/${ project } /${ projectVersionID } ` ) ;
228
+ }
229
+ }
230
+
231
+ // Input some version info, returns a boolean based on
232
+ // whether the user is switching versions for a 2.16 docs release or later.
233
+ // The urls for pre-2.16 classes and later packages are quite different
234
+ shouldConvertPackages ( targetVer , previousVer ) {
235
+ let targetVersion = getCompactVersion ( targetVer . id ) ;
236
+ let previousVersion = getCompactVersion ( previousVer ) ;
237
+ let previousComparison = semverCompare ( previousVersion , '2.16' ) ;
238
+ let targetComparison = semverCompare ( targetVersion , '2.16' ) ;
239
+ return (
240
+ ( previousComparison < 0 && targetComparison >= 0 ) ||
241
+ ( previousComparison >= 0 && targetComparison < 0 )
242
+ ) ;
243
+ }
244
+
245
+ _getEncodedNameForCurrentClass ( ) {
246
+ // escape any reserved characters for url, like slashes
247
+ return encodeURIComponent (
248
+ this . classesController . model . get ( 'name' )
249
+ ) ;
250
+ }
131
251
}
0 commit comments