feat: Pagination support for jumping 20 items at a time in all table views [#45]

This commit is contained in:
2025-08-08 17:04:28 -06:00
parent 345bb8ce03
commit e96af7410e
11 changed files with 362 additions and 7 deletions
+76 -1
View File
@@ -1,5 +1,7 @@
use crate::models::stateful_list::StatefulList;
use crate::models::{strip_non_search_characters, HorizontallyScrollableText, Scrollable};
use crate::models::{
strip_non_search_characters, HorizontallyScrollableText, Paginated, Scrollable,
};
use ratatui::widgets::TableState;
use std::cmp::Ordering;
use std::fmt::Debug;
@@ -151,6 +153,79 @@ where
}
}
impl<T> Paginated for StatefulTable<T>
where
T: Clone + PartialEq + Eq + Debug,
{
fn page_down(&mut self) {
if let Some(filtered_items) = self.filtered_items.as_ref() {
if filtered_items.is_empty() {
return;
}
match self.filtered_state.as_ref().unwrap().selected() {
Some(i) => {
self
.filtered_state
.as_mut()
.unwrap()
.select(Some(i.saturating_add(20) % (filtered_items.len() - 1)));
}
None => self.filtered_state.as_mut().unwrap().select_first(),
};
return;
}
if self.items.is_empty() {
return;
}
match self.state.selected() {
Some(i) => {
self
.state
.select(Some(i.saturating_add(20) % (self.items.len() - 1)));
}
None => self.state.select_first(),
};
}
fn page_up(&mut self) {
if let Some(filtered_items) = self.filtered_items.as_ref() {
if filtered_items.is_empty() {
return;
}
match self.filtered_state.as_ref().unwrap().selected() {
Some(i) => {
let len = filtered_items.len() - 1;
self
.filtered_state
.as_mut()
.unwrap()
.select(Some((i + len - (20 % len)) % len));
}
None => self.filtered_state.as_mut().unwrap().select_last(),
};
return;
}
if self.items.is_empty() {
return;
}
match self.state.selected() {
Some(i) => {
let len = self.items.len() - 1;
self.state.select(Some((i + len - (20 % len)) % len));
}
None => self.state.select_last(),
};
}
}
impl<T> StatefulTable<T>
where
T: Clone + PartialEq + Eq + Debug + Default,