fix: sort created_at clash, closes #22

Additionally sort by name, so that if a clash of first comparison, the order will be consistent
This commit is contained in:
Jack Wills
2023-11-19 11:05:17 +00:00
parent 0e9b65f6c5
commit 3a6489396e
+69 -66
View File
@@ -156,78 +156,81 @@ impl AppData {
self.sorted_by self.sorted_by
} }
/// Sort the containers vec, based on a heading, either ascending or descending, /// Sort the containers vec, based on a heading (and if clash, then by name), either ascending or descending,
/// If not sort set, then sort by created time /// If not sort set, then sort by created time
pub fn sort_containers(&mut self) { pub fn sort_containers(&mut self) {
if let Some((head, ord)) = self.sorted_by { if let Some((head, ord)) = self.sorted_by {
match head { let sort_closure = |a: &ContainerItem, b: &ContainerItem| -> std::cmp::Ordering {
Header::State => match ord { match head {
SortedOrder::Asc => self Header::State => match ord {
.containers SortedOrder::Asc => {
.items a.status.cmp(&b.status).then_with(|| a.name.cmp(&b.name))
.sort_by(|a, b| b.state.order().cmp(&a.state.order())), }
SortedOrder::Desc => self SortedOrder::Desc => {
.containers b.status.cmp(&a.status).then_with(|| b.name.cmp(&a.name))
.items }
.sort_by(|a, b| a.state.order().cmp(&b.state.order())), },
}, Header::Status => match ord {
Header::Status => match ord { SortedOrder::Asc => {
SortedOrder::Asc => self a.status.cmp(&b.status).then_with(|| a.name.cmp(&b.name))
.containers }
.items SortedOrder::Desc => {
.sort_by(|a, b| a.status.cmp(&b.status)), b.status.cmp(&a.status).then_with(|| b.name.cmp(&a.name))
SortedOrder::Desc => self }
.containers },
.items Header::Cpu => match ord {
.sort_by(|a, b| b.status.cmp(&a.status)), SortedOrder::Asc => a
}, .cpu_stats
Header::Cpu => match ord { .back()
SortedOrder::Asc => self .cmp(&b.cpu_stats.back())
.containers .then_with(|| a.name.cmp(&b.name)),
.items SortedOrder::Desc => b
.sort_by(|a, b| a.cpu_stats.back().cmp(&b.cpu_stats.back())), .cpu_stats
SortedOrder::Desc => self .back()
.containers .cmp(&a.cpu_stats.back())
.items .then_with(|| b.name.cmp(&a.name)),
.sort_by(|a, b| b.cpu_stats.back().cmp(&a.cpu_stats.back())), },
}, Header::Memory => match ord {
Header::Memory => match ord { SortedOrder::Asc => a
SortedOrder::Asc => self .mem_stats
.containers .back()
.items .cmp(&b.mem_stats.back())
.sort_by(|a, b| a.mem_stats.back().cmp(&b.mem_stats.back())), .then_with(|| a.name.cmp(&b.name)),
SortedOrder::Desc => self SortedOrder::Desc => b
.containers .mem_stats
.items .back()
.sort_by(|a, b| b.mem_stats.back().cmp(&a.mem_stats.back())), .cmp(&a.mem_stats.back())
}, .then_with(|| b.name.cmp(&a.name)),
Header::Id => match ord { },
SortedOrder::Asc => self.containers.items.sort_by(|a, b| a.id.cmp(&b.id)), Header::Id => match ord {
SortedOrder::Desc => self.containers.items.sort_by(|a, b| b.id.cmp(&a.id)), SortedOrder::Asc => a.id.cmp(&b.id).then_with(|| a.name.cmp(&b.name)),
}, SortedOrder::Desc => b.id.cmp(&a.id).then_with(|| b.name.cmp(&a.name)),
Header::Image => match ord { },
SortedOrder::Asc => self.containers.items.sort_by(|a, b| a.image.cmp(&b.image)), Header::Image => match ord {
SortedOrder::Desc => { SortedOrder::Asc => a.image.cmp(&b.image).then_with(|| a.name.cmp(&b.name)),
self.containers.items.sort_by(|a, b| b.image.cmp(&a.image)); SortedOrder::Desc => {
} b.image.cmp(&a.image).then_with(|| b.name.cmp(&a.name))
}, }
Header::Name => match ord { },
SortedOrder::Asc => self.containers.items.sort_by(|a, b| a.name.cmp(&b.name)), Header::Name => match ord {
SortedOrder::Desc => self.containers.items.sort_by(|a, b| b.name.cmp(&a.name)), SortedOrder::Asc => a.name.cmp(&b.name).then_with(|| a.name.cmp(&b.name)),
}, SortedOrder::Desc => b.name.cmp(&a.name).then_with(|| b.name.cmp(&a.name)),
Header::Rx => match ord { },
SortedOrder::Asc => self.containers.items.sort_by(|a, b| a.rx.cmp(&b.rx)), Header::Rx => match ord {
SortedOrder::Desc => self.containers.items.sort_by(|a, b| b.rx.cmp(&a.rx)), SortedOrder::Asc => a.rx.cmp(&b.rx).then_with(|| a.name.cmp(&b.name)),
}, SortedOrder::Desc => b.rx.cmp(&a.rx).then_with(|| b.name.cmp(&a.name)),
Header::Tx => match ord { },
SortedOrder::Asc => self.containers.items.sort_by(|a, b| a.tx.cmp(&b.tx)), Header::Tx => match ord {
SortedOrder::Desc => self.containers.items.sort_by(|a, b| b.tx.cmp(&a.tx)), SortedOrder::Asc => a.tx.cmp(&b.tx).then_with(|| a.name.cmp(&b.name)),
}, SortedOrder::Desc => b.tx.cmp(&a.tx).then_with(|| b.name.cmp(&a.name)),
} },
}
};
self.containers.items.sort_by(sort_closure);
} else { } else {
self.containers self.containers
.items .items
.sort_by(|a, b| a.created.cmp(&b.created)); .sort_by(|a, b| a.created.cmp(&b.created).then_with(|| a.name.cmp(&b.name)));
} }
} }