@@ -25,8 +25,15 @@ interface PodViewProps {
2525}
2626
2727export type PodGroupType = 'topLevelResource' | 'parentResource' | 'node' ;
28+ export type SortOrder = 'asc' | 'desc' ;
29+
30+ const labelForSortOrder : Record < SortOrder , string > = {
31+ asc : 'Oldest First' ,
32+ desc : 'Newest First'
33+ } ;
2834
2935export interface PodGroup extends Partial < ResourceNode > {
36+ timestamp ?: number ;
3037 type : PodGroupType ;
3138 pods : Pod [ ] ;
3239 info ?: InfoItem [ ] ;
@@ -53,6 +60,18 @@ export class PodView extends React.Component<PodViewProps> {
5360 const podPrefs = prefs . appDetails . podView || ( { } as PodViewPreferences ) ;
5461 const groups = this . processTree ( podPrefs . sortMode , this . props . tree . hosts || [ ] ) || [ ] ;
5562
63+ if ( podPrefs . sortMode !== 'node' && podPrefs . sortOrder ) {
64+ // Sort the groups in place based on precomputed timestamps
65+ groups . sort ( ( a , b ) => {
66+ const timeA = Date . parse ( a . createdAt || '0' ) ;
67+ const timeB = Date . parse ( b . createdAt || '0' ) ;
68+ a . timestamp = timeA ;
69+ b . timestamp = timeB ;
70+
71+ return podPrefs . sortOrder === 'asc' ? timeA - timeB : timeB - timeA ;
72+ } ) ;
73+ }
74+
5675 return (
5776 < React . Fragment >
5877 < div className = 'pod-view__settings' >
@@ -68,6 +87,20 @@ export class PodView extends React.Component<PodViewProps> {
6887 items = { this . menuItemsFor ( [ 'node' , 'parentResource' , 'topLevelResource' ] , prefs ) }
6988 />
7089 </ div >
90+ { podPrefs . sortMode !== 'node' && (
91+ < div className = 'pod-view__settings__section' >
92+ SORT BY AGE:
93+ < DropDownMenu
94+ anchor = { ( ) => (
95+ < button className = 'argo-button argo-button--base-o' >
96+ { labelForSortOrder [ podPrefs . sortOrder || 'desc' ] }
97+ < i className = 'fa fa-chevron-circle-down' />
98+ </ button >
99+ ) }
100+ items = { this . sortOrderItemsFor ( [ 'asc' , 'desc' ] , prefs ) }
101+ />
102+ </ div >
103+ ) }
71104 { podPrefs . sortMode === 'node' && (
72105 < div className = 'pod-view__settings__section' >
73106 < button
@@ -218,6 +251,26 @@ export class PodView extends React.Component<PodViewProps> {
218251 ) ;
219252 }
220253
254+ private sortOrderItemsFor ( orders : SortOrder [ ] , prefs : ViewPreferences ) : MenuItem [ ] {
255+ const podPrefs = prefs . appDetails . podView || ( { } as PodViewPreferences ) ;
256+ return orders . map ( order => ( {
257+ title : (
258+ < React . Fragment >
259+ { podPrefs . sortOrder === order && < i className = 'fa fa-check' /> } { labelForSortOrder [ order ] } { ' ' }
260+ </ React . Fragment >
261+ ) ,
262+ action : ( ) => {
263+ this . appContext . apis . navigation . goto ( '.' , { podSortOrder : order } ) ;
264+ services . viewPreferences . updatePreferences ( {
265+ appDetails : {
266+ ...prefs . appDetails ,
267+ podView : { ...podPrefs , sortOrder : order }
268+ }
269+ } ) ;
270+ }
271+ } ) ) ;
272+ }
273+
221274 private menuItemsFor ( modes : PodGroupType [ ] , prefs : ViewPreferences ) : MenuItem [ ] {
222275 const podPrefs = prefs . appDetails . podView || ( { } as PodViewPreferences ) ;
223276 return modes . map ( mode => ( {
0 commit comments