refactor(movie_details_handler): Use the new handle_table_events macro

This commit is contained in:
2024-12-08 14:04:34 -07:00
parent f1d934b0a6
commit d6863dc1fd
4 changed files with 84 additions and 224 deletions
+3
View File
@@ -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![
@@ -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<ActiveRadarrBlock>,
}
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 => {
@@ -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);
+3 -2
View File
@@ -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();