fix: stop paging up or down on a single row table from crashing
page_up and page_down wrap the selection with a modulus of items_len - 1, which is a remainder by zero when the table holds exactly one row. Ctrl-U or Ctrl-D on such a table panicked the TUI. Both now return early for tables of one row or fewer, mirroring the existing empty-table guard; tables of two or more rows keep their existing paging arithmetic.
This commit is contained in:
2 files changed
+55
-2
No files matched your search
@@ -100,7 +100,7 @@ where
|
|||||||
{
|
{
|
||||||
fn page_down(&mut self) {
|
fn page_down(&mut self) {
|
||||||
let items_len = self.active_items().len();
|
let items_len = self.active_items().len();
|
||||||
if items_len == 0 {
|
if items_len <= 1 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,7 +113,7 @@ where
|
|||||||
|
|
||||||
fn page_up(&mut self) {
|
fn page_up(&mut self) {
|
||||||
let items_len = self.active_items().len();
|
let items_len = self.active_items().len();
|
||||||
if items_len == 0 {
|
if items_len <= 1 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -239,6 +239,59 @@ mod tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_stateful_table_pagination_on_single_item_table_performs_no_op() {
|
||||||
|
let mut stateful_table: StatefulTable<String> = StatefulTable::default();
|
||||||
|
stateful_table.set_items(vec!["Test 1".to_owned()]);
|
||||||
|
|
||||||
|
assert_some_eq_x!(stateful_table.state.selected(), 0);
|
||||||
|
|
||||||
|
stateful_table.page_down();
|
||||||
|
|
||||||
|
assert_some_eq_x!(stateful_table.state.selected(), 0);
|
||||||
|
|
||||||
|
stateful_table.page_up();
|
||||||
|
|
||||||
|
assert_some_eq_x!(stateful_table.state.selected(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_stateful_table_filtered_pagination_on_single_item_table_performs_no_op() {
|
||||||
|
let mut filtered_stateful_table: StatefulTable<String> = StatefulTable::default();
|
||||||
|
filtered_stateful_table.set_filtered_items(vec!["Test 1".to_owned()]);
|
||||||
|
|
||||||
|
assert_some_eq_x!(
|
||||||
|
filtered_stateful_table
|
||||||
|
.filtered_state
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.selected(),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
filtered_stateful_table.page_down();
|
||||||
|
|
||||||
|
assert_some_eq_x!(
|
||||||
|
filtered_stateful_table
|
||||||
|
.filtered_state
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.selected(),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
filtered_stateful_table.page_up();
|
||||||
|
|
||||||
|
assert_some_eq_x!(
|
||||||
|
filtered_stateful_table
|
||||||
|
.filtered_state
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.selected(),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_stateful_table_pagination() {
|
fn test_stateful_table_pagination() {
|
||||||
let mut stateful_table = StatefulTable::default();
|
let mut stateful_table = StatefulTable::default();
|
||||||
|
|||||||
Reference in new issue
Block a user