2
2
import { action , computed , set } from '@ember/object' ;
3
3
import { inject as service } from '@ember/service' ;
4
4
import { readOnly , alias } from '@ember/object/computed' ;
5
- import Controller from '@ember/controller' ;
5
+ import Controller , { inject as controller } from '@ember/controller' ;
6
6
import { A } from '@ember/array' ;
7
7
import values from 'lodash.values' ;
8
8
import groupBy from 'lodash.groupby' ;
@@ -19,6 +19,16 @@ export default class ProjectVersionController extends Controller {
19
19
@service
20
20
project ;
21
21
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
+
22
32
@alias ( 'filterData.sideNav.showPrivate' )
23
33
showPrivateClasses ;
24
34
@@ -128,4 +138,102 @@ export default class ProjectVersionController extends Controller {
128
138
togglePrivateClasses ( ) {
129
139
set ( this , 'showPrivateClasses' , ! this . showPrivateClasses ) ;
130
140
}
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
+ }
131
239
}
0 commit comments