From d3a959d2ddc75714396b86001045f9273aa21859 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Wed, 16 Sep 2026 12:25:00 -0600 Subject: [PATCH] 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. --- src/models/stateful_table.rs | 4 +-- src/models/stateful_table_tests.rs | 53 ++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/models/stateful_table.rs b/src/models/stateful_table.rs index 36488197..6ad579c5 100644 --- a/src/models/stateful_table.rs +++ b/src/models/stateful_table.rs @@ -100,7 +100,7 @@ where { fn page_down(&mut self) { let items_len = self.active_items().len(); - if items_len == 0 { + if items_len <= 1 { return; } @@ -113,7 +113,7 @@ where fn page_up(&mut self) { let items_len = self.active_items().len(); - if items_len == 0 { + if items_len <= 1 { return; } diff --git a/src/models/stateful_table_tests.rs b/src/models/stateful_table_tests.rs index 5e0311d0..c1851e69 100644 --- a/src/models/stateful_table_tests.rs +++ b/src/models/stateful_table_tests.rs @@ -239,6 +239,59 @@ mod tests { ); } + #[test] + fn test_stateful_table_pagination_on_single_item_table_performs_no_op() { + let mut stateful_table: StatefulTable = 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 = 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] fn test_stateful_table_pagination() { let mut stateful_table = StatefulTable::default();