Skip to content

Commit bb37b10

Browse files
feat(ui): allow to sort by age in Pod-view (#20783)
Signed-off-by: Surajyadav <[email protected]>
1 parent ceec669 commit bb37b10

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

ui/src/app/applications/components/application-pod-view/pod-view.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,15 @@ interface PodViewProps {
2525
}
2626

2727
export 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

2935
export 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:&nbsp;
93+
<DropDownMenu
94+
anchor={() => (
95+
<button className='argo-button argo-button--base-o'>
96+
{labelForSortOrder[podPrefs.sortOrder || 'desc']}&nbsp;&nbsp;
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 => ({

ui/src/app/shared/services/view-preferences-service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export interface AppDetailsPreferences {
3737
export interface PodViewPreferences {
3838
sortMode: PodGroupType;
3939
hideUnschedulable: boolean;
40+
sortOrder?: 'asc' | 'desc';
4041
}
4142

4243
export interface HealthStatusBarPreferences {

0 commit comments

Comments
 (0)