@@ -115,6 +115,7 @@ var ui_builder = function () {
115
115
var docPattern = patternlab . subtypePatterns [ pattern . patternGroup + ( isSubtypePattern ? '-' + pattern . patternSubGroup : '' ) ] ;
116
116
if ( docPattern ) {
117
117
docPattern . isDocPattern = true ;
118
+ docPattern . order = - Number . MAX_SAFE_INTEGER ;
118
119
return docPattern ;
119
120
}
120
121
@@ -130,7 +131,8 @@ var ui_builder = function () {
130
131
isPattern : false ,
131
132
engine : null ,
132
133
flatPatternPath : pattern . flatPatternPath ,
133
- isDocPattern : true
134
+ isDocPattern : true ,
135
+ order : - Number . MAX_SAFE_INTEGER
134
136
} ,
135
137
patternlab
136
138
) ;
@@ -199,16 +201,16 @@ var ui_builder = function () {
199
201
* @param pattern - the pattern to register
200
202
*/
201
203
function addPatternSubType ( patternlab , pattern ) {
204
+ let newSubType = {
205
+ patternSubtypeLC : pattern . patternSubGroup . toLowerCase ( ) ,
206
+ patternSubtypeUC : pattern . patternSubGroup . charAt ( 0 ) . toUpperCase ( ) + pattern . patternSubGroup . slice ( 1 ) ,
207
+ patternSubtype : pattern . patternSubType ,
208
+ patternSubtypeDash : pattern . patternSubGroup , //todo verify
209
+ patternSubtypeItems : [ ]
210
+ } ;
202
211
var patternType = getPatternType ( patternlab , pattern ) ;
203
- patternType . patternTypeItems . push (
204
- {
205
- patternSubtypeLC : pattern . patternSubGroup . toLowerCase ( ) ,
206
- patternSubtypeUC : pattern . patternSubGroup . charAt ( 0 ) . toUpperCase ( ) + pattern . patternSubGroup . slice ( 1 ) ,
207
- patternSubtype : pattern . patternSubType ,
208
- patternSubtypeDash : pattern . patternSubGroup , //todo verify
209
- patternSubtypeItems : [ ]
210
- }
211
- ) ;
212
+ let insertIndex = _ . sortedIndexBy ( patternType . patternTypeItems , newSubType , 'patternSubtype' ) ;
213
+ patternType . patternTypeItems . splice ( insertIndex , 0 , newSubType ) ;
212
214
}
213
215
214
216
/**
@@ -230,7 +232,8 @@ var ui_builder = function () {
230
232
patternName : pattern . patternName ,
231
233
patternState : pattern . patternState ,
232
234
patternSrcPath : encodeURI ( pattern . subdir + '/' + pattern . fileName ) ,
233
- patternPath : patternPath
235
+ patternPath : patternPath ,
236
+ order : pattern . order
234
237
} ;
235
238
}
236
239
@@ -242,23 +245,25 @@ var ui_builder = function () {
242
245
* @param createViewAllVariant - whether or not to create the special view all item
243
246
*/
244
247
function addPatternSubTypeItem ( patternlab , pattern , createSubtypeViewAllVarient ) {
245
- var patternSubType = getPatternSubType ( patternlab , pattern ) ;
248
+ let newSubTypeItem ;
249
+
246
250
if ( createSubtypeViewAllVarient ) {
247
- patternSubType . patternSubtypeItems . push (
248
- {
249
- patternPartial : 'viewall-' + pattern . patternGroup + '-' + pattern . patternSubGroup ,
250
- patternName : 'View All' ,
251
- patternPath : encodeURI ( pattern . flatPatternPath + '/index.html' ) ,
252
- patternType : pattern . patternType ,
253
- patternSubtype : pattern . patternSubtype
254
- }
255
- ) ;
251
+ newSubTypeItem = {
252
+ patternPartial : 'viewall-' + pattern . patternGroup + '-' + pattern . patternSubGroup ,
253
+ patternName : 'View All' ,
254
+ patternPath : encodeURI ( pattern . flatPatternPath + '/index.html' ) ,
255
+ patternType : pattern . patternType ,
256
+ patternSubtype : pattern . patternSubtype ,
257
+ order : 0
258
+ } ;
256
259
}
257
260
else {
258
- patternSubType . patternSubtypeItems . push (
259
- createPatternSubTypeItem ( pattern )
260
- ) ;
261
+ newSubTypeItem = createPatternSubTypeItem ( pattern ) ;
261
262
}
263
+
264
+ let patternSubType = getPatternSubType ( patternlab , pattern ) ;
265
+ patternSubType . patternSubtypeItems . push ( newSubTypeItem ) ;
266
+ patternSubType . patternSubtypeItems = _ . sortBy ( patternSubType . patternSubtypeItems , [ 'order' , 'name' ] ) ;
262
267
}
263
268
264
269
/**
@@ -284,13 +289,15 @@ var ui_builder = function () {
284
289
patternType . patternItems . push ( {
285
290
patternPartial : 'viewall-' + pattern . patternGroup + '-all' ,
286
291
patternName : 'View All' ,
287
- patternPath : encodeURI ( pattern . patternType + '/index.html' )
292
+ patternPath : encodeURI ( pattern . patternType + '/index.html' ) ,
293
+ order : - Number . MAX_SAFE_INTEGER
288
294
} ) ;
289
295
}
290
296
291
297
} else {
292
298
patternType . patternItems . push ( createPatternSubTypeItem ( pattern ) ) ;
293
299
}
300
+ patternType . patternItems = _ . sortBy ( patternType . patternItems , [ 'order' , 'name' ] ) ;
294
301
}
295
302
296
303
// function getPatternItems(patternlab, patternType) {
@@ -302,20 +309,54 @@ var ui_builder = function () {
302
309
// }
303
310
304
311
/**
305
- * Sorts patterns based on name.
306
- * Will be expanded to use explicit order in the near future
312
+ * Sorts patterns based on order property found within pattern markdown, falling back on name.
307
313
* @param patternsArray - patterns to sort
308
314
* @returns sorted patterns
309
315
*/
310
316
function sortPatterns ( patternsArray ) {
311
317
return patternsArray . sort ( function ( a , b ) {
312
318
313
- if ( a . name > b . name ) {
314
- return 1 ;
319
+ let aOrder = parseInt ( a . order , 10 ) ;
320
+ let bOrder = parseInt ( b . order , 10 ) ;
321
+
322
+ if ( aOrder === NaN ) {
323
+ aOrder = Number . MAX_SAFE_INTEGER ;
324
+ }
325
+
326
+ if ( bOrder === NaN ) {
327
+ aOrder = Number . MAX_SAFE_INTEGER ;
315
328
}
316
- if ( a . name < b . name ) {
329
+
330
+ //alwasy return a docPattern first
331
+ if ( a . isDocPattern && ! b . isDocPattern ) {
317
332
return - 1 ;
318
333
}
334
+
335
+ if ( ! a . isDocPattern && b . isDocPattern ) {
336
+ return 1 ;
337
+ }
338
+
339
+ //use old alphabetical ordering if we have nothing else to use
340
+ //pattern.order will be Number.MAX_SAFE_INTEGER if never defined by markdown, or markdown parsing fails
341
+ if ( aOrder === Number . MAX_SAFE_INTEGER && bOrder === Number . MAX_SAFE_INTEGER ) {
342
+
343
+ if ( a . name > b . name ) {
344
+ return 1 ;
345
+ }
346
+ if ( a . name < b . name ) {
347
+ return - 1 ;
348
+ }
349
+ }
350
+
351
+ //if we get this far, we can sort safely
352
+ if ( aOrder && bOrder ) {
353
+ if ( aOrder > bOrder ) {
354
+ return 1 ;
355
+ }
356
+ if ( aOrder < bOrder ) {
357
+ return - 1 ;
358
+ }
359
+ }
319
360
return 0 ;
320
361
} ) ;
321
362
}
@@ -330,7 +371,7 @@ var ui_builder = function () {
330
371
patternGroups : { }
331
372
} ;
332
373
333
- _ . forEach ( sortPatterns ( patternlab . patterns ) , function ( pattern ) {
374
+ _ . forEach ( patternlab . patterns , function ( pattern ) {
334
375
335
376
//ignore patterns we can omit from rendering directly
336
377
pattern . omitFromStyleguide = isPatternExcluded ( pattern , patternlab ) ;
@@ -459,8 +500,8 @@ var ui_builder = function () {
459
500
//render the footer needed for the viewall template
460
501
var footerHTML = buildFooterHTML ( patternlab , 'viewall-' + patternPartial ) ;
461
502
462
- //render the viewall template
463
- var subtypePatterns = _ . values ( patternSubtypes ) ;
503
+ //render the viewall template by finding these smallest subtype-grouped patterns
504
+ var subtypePatterns = sortPatterns ( _ . values ( patternSubtypes ) ) ;
464
505
465
506
//determine if we should write at this time by checking if these are flat patterns or grouped patterns
466
507
p = _ . find ( subtypePatterns , function ( pat ) {
0 commit comments