From d6863dc1fd681289a4e1fc80da0ed871770bde3d Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Sun, 8 Dec 2024 14:04:34 -0700 Subject: [PATCH] refactor(movie_details_handler): Use the new handle_table_events macro --- src/handlers/handler_test_utils.rs | 3 + .../library/movie_details_handler.rs | 277 ++++-------------- .../library/movie_details_handler_tests.rs | 23 +- src/handlers/table_handler.rs | 5 +- 4 files changed, 84 insertions(+), 224 deletions(-) diff --git a/src/handlers/handler_test_utils.rs b/src/handlers/handler_test_utils.rs index 72f14dc..b4b537f 100644 --- a/src/handlers/handler_test_utils.rs +++ b/src/handlers/handler_test_utils.rs @@ -344,6 +344,9 @@ mod test_utils { movie_details_modal .movie_history .set_items(vec![$crate::models::radarr_models::MovieHistoryItem::default()]); + movie_details_modal.movie_cast.set_items(vec![$crate::models::radarr_models::Credit::default()]); + movie_details_modal.movie_crew.set_items(vec![$crate::models::radarr_models::Credit::default()]); + movie_details_modal.movie_releases.set_items(vec![$crate::models::radarr_models::RadarrRelease::default()]); app.data.radarr_data.movie_details_modal = Some(movie_details_modal); let mut series_history = $crate::models::stateful_table::StatefulTable::default(); series_history.set_items(vec![ diff --git a/src/handlers/radarr_handlers/library/movie_details_handler.rs b/src/handlers/radarr_handlers/library/movie_details_handler.rs index 71264df..cdbf7e6 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler.rs @@ -1,10 +1,13 @@ +use crate::models::HorizontallyScrollableText; use serde_json::Number; use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; use crate::event::Key; +use crate::handle_table_events; +use crate::handlers::table_handler::TableHandlingProps; use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; -use crate::models::radarr_models::RadarrRelease; +use crate::models::radarr_models::{Credit, MovieHistoryItem, RadarrRelease}; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_MOVIE_SELECTION_BLOCKS, MOVIE_DETAILS_BLOCKS, }; @@ -24,7 +27,58 @@ pub(super) struct MovieDetailsHandler<'a, 'b> { _context: Option, } +impl<'a, 'b> MovieDetailsHandler<'a, 'b> { + handle_table_events!( + self, + movie_releases, + self + .app + .data + .radarr_data + .movie_details_modal + .as_mut() + .unwrap() + .movie_releases, + RadarrRelease + ); + handle_table_events!( + self, + movie_history, + self + .app + .data + .radarr_data + .movie_details_modal + .as_mut() + .unwrap() + .movie_history, + MovieHistoryItem + ); + handle_table_events!(self, movie_cast, self.app.data.radarr_data.movie_details_modal.as_mut().unwrap().movie_cast, Credit); + handle_table_events!(self, movie_crew, self.app.data.radarr_data.movie_details_modal.as_mut().unwrap().movie_crew, Credit); +} + impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<'a, 'b> { + fn handle(&mut self) { + let movie_history_table_handling_props = + TableHandlingProps::new(ActiveRadarrBlock::MovieHistory.into()); + let movie_releases_table_handling_props = + TableHandlingProps::new(ActiveRadarrBlock::ManualSearch.into()) + .sorting_block(ActiveRadarrBlock::ManualSearchSortPrompt.into()) + .sort_options(releases_sorting_options()); + let movie_cast_table_handling_props = + TableHandlingProps::new(ActiveRadarrBlock::Cast.into()); + let movie_crew_table_handling_props = TableHandlingProps::new(ActiveRadarrBlock::Crew.into()); + + if !self.handle_movie_history_table_events(movie_history_table_handling_props) + && !self.handle_movie_releases_table_events(movie_releases_table_handling_props) + && !self.handle_movie_cast_table_events(movie_cast_table_handling_props) + && !self.handle_movie_crew_table_events(movie_crew_table_handling_props) + { + self.handle_key_event(); + } + } + fn accepts(active_block: ActiveRadarrBlock) -> bool { MOVIE_DETAILS_BLOCKS.contains(&active_block) } @@ -83,54 +137,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< .unwrap() .movie_details .scroll_up(), - ActiveRadarrBlock::MovieHistory => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_history - .scroll_up(), - ActiveRadarrBlock::Cast => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_cast - .scroll_up(), - ActiveRadarrBlock::Crew => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_crew - .scroll_up(), - ActiveRadarrBlock::ManualSearch => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .scroll_up(), - ActiveRadarrBlock::ManualSearchSortPrompt => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .sort - .as_mut() - .unwrap() - .scroll_up(), _ => (), } } @@ -146,54 +152,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< .unwrap() .movie_details .scroll_down(), - ActiveRadarrBlock::MovieHistory => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_history - .scroll_down(), - ActiveRadarrBlock::Cast => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_cast - .scroll_down(), - ActiveRadarrBlock::Crew => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_crew - .scroll_down(), - ActiveRadarrBlock::ManualSearch => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .scroll_down(), - ActiveRadarrBlock::ManualSearchSortPrompt => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .sort - .as_mut() - .unwrap() - .scroll_down(), _ => (), } } @@ -209,54 +167,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< .unwrap() .movie_details .scroll_to_top(), - ActiveRadarrBlock::MovieHistory => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_history - .scroll_to_top(), - ActiveRadarrBlock::Cast => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_cast - .scroll_to_top(), - ActiveRadarrBlock::Crew => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_crew - .scroll_to_top(), - ActiveRadarrBlock::ManualSearch => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .scroll_to_top(), - ActiveRadarrBlock::ManualSearchSortPrompt => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .sort - .as_mut() - .unwrap() - .scroll_to_top(), _ => (), } } @@ -272,54 +182,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< .unwrap() .movie_details .scroll_to_bottom(), - ActiveRadarrBlock::MovieHistory => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_history - .scroll_to_bottom(), - ActiveRadarrBlock::Cast => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_cast - .scroll_to_bottom(), - ActiveRadarrBlock::Crew => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_crew - .scroll_to_bottom(), - ActiveRadarrBlock::ManualSearch => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .scroll_to_bottom(), - ActiveRadarrBlock::ManualSearchSortPrompt => self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .sort - .as_mut() - .unwrap() - .scroll_to_bottom(), _ => (), } } @@ -385,18 +247,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< self.app.pop_navigation_stack(); } - ActiveRadarrBlock::ManualSearchSortPrompt => { - self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .apply_sorting(); - self.app.pop_navigation_stack(); - } _ => (), } } @@ -414,8 +264,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< } ActiveRadarrBlock::AutomaticallySearchMoviePrompt | ActiveRadarrBlock::UpdateAndScanPrompt - | ActiveRadarrBlock::ManualSearchConfirmPrompt - | ActiveRadarrBlock::ManualSearchSortPrompt => { + | ActiveRadarrBlock::ManualSearchConfirmPrompt => { self.app.pop_navigation_stack(); self.app.data.radarr_data.prompt_confirm = false; } @@ -459,20 +308,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< .app .pop_and_push_navigation_stack(self.active_radarr_block.into()); } - _ if key == DEFAULT_KEYBINDINGS.sort.key => { - self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .sorting(releases_sorting_options()); - self - .app - .push_navigation_stack(ActiveRadarrBlock::ManualSearchSortPrompt.into()); - } _ => (), }, ActiveRadarrBlock::AutomaticallySearchMoviePrompt => { diff --git a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs index 4a90954..319ced6 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs @@ -135,6 +135,7 @@ mod tests { #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, ) { let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::MovieHistory.into()); let mut movie_details_modal = MovieDetailsModal::default(); movie_details_modal .movie_history @@ -232,6 +233,7 @@ mod tests { #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, ) { let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::Cast.into()); let mut movie_details_modal = MovieDetailsModal::default(); movie_details_modal .movie_cast @@ -317,6 +319,7 @@ mod tests { #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, ) { let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::Crew.into()); let mut movie_details_modal = MovieDetailsModal::default(); movie_details_modal .movie_crew @@ -402,6 +405,7 @@ mod tests { #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, ) { let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::ManualSearch.into()); let mut movie_details_modal = MovieDetailsModal::default(); movie_details_modal .movie_releases @@ -666,6 +670,7 @@ mod tests { #[test] fn test_movie_history_home_end() { let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::MovieHistory.into()); let mut movie_details_modal = MovieDetailsModal::default(); movie_details_modal .movie_history @@ -783,6 +788,7 @@ mod tests { #[test] fn test_cast_home_end() { let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::Cast.into()); let mut movie_details_modal = MovieDetailsModal::default(); movie_details_modal .movie_cast @@ -888,6 +894,7 @@ mod tests { #[test] fn test_crew_home_end() { let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::Crew.into()); let mut movie_details_modal = MovieDetailsModal::default(); movie_details_modal .movie_crew @@ -993,6 +1000,7 @@ mod tests { #[test] fn test_manual_search_home_end() { let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::ManualSearch.into()); let mut movie_details_modal = MovieDetailsModal::default(); movie_details_modal .movie_releases @@ -1430,12 +1438,12 @@ mod tests { ActiveRadarrBlock::AutomaticallySearchMoviePrompt, ActiveRadarrBlock::UpdateAndScanPrompt, ActiveRadarrBlock::ManualSearchConfirmPrompt, - ActiveRadarrBlock::ManualSearchSortPrompt )] prompt_block: ActiveRadarrBlock, #[values(true, false)] is_ready: bool, ) { let mut app = App::default(); + app.data.radarr_data = create_test_radarr_data(); app.is_loading = is_ready; app.data.radarr_data.prompt_confirm = true; app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); @@ -1446,6 +1454,18 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); } + + #[rstest] + fn test_manual_search_sort_prompt_esc() { + let mut app = App::default(); + app.data.radarr_data = create_test_radarr_data(); + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + app.push_navigation_stack(ActiveRadarrBlock::ManualSearchSortPrompt.into()); + + MovieDetailsHandler::with(ESC_KEY, &mut app, ActiveRadarrBlock::ManualSearchSortPrompt, None).handle(); + + assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + } } mod test_handle_key_char { @@ -1542,6 +1562,7 @@ mod tests { #[test] fn test_sort_key() { let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::ManualSearch.into()); let mut modal = MovieDetailsModal::default(); modal.movie_releases.set_items(release_vec()); app.data.radarr_data.movie_details_modal = Some(modal); diff --git a/src/handlers/table_handler.rs b/src/handlers/table_handler.rs index b05759f..78d1e70 100644 --- a/src/handlers/table_handler.rs +++ b/src/handlers/table_handler.rs @@ -216,9 +216,10 @@ macro_rules! handle_table_events { _ if props.sorting_block.is_some() && $self.app.get_current_route() == *props.sorting_block.as_ref().unwrap() => { - let sort_by_fn = props.sort_by_fn.expect("Sort by function is required"); + if let Some(sort_by_fn) = props.sort_by_fn { + $table.items.sort_by(sort_by_fn); + } - $table.items.sort_by(sort_by_fn); $table.apply_sorting(); $self.app.pop_navigation_stack();