From a0b27ec105de0cfb9eb1c24ffe36703b81a2e2d4 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 3 Dec 2024 18:12:23 -0700 Subject: [PATCH] feat(ui): Support for modifying the indexer priority in Radarr --- src/models/servarr_data/radarr/modals.rs | 2 ++ .../servarr_data/radarr/modals_tests.rs | 4 +++ src/models/servarr_data/sonarr/modals.rs | 2 ++ .../servarr_data/sonarr/modals_tests.rs | 4 +++ src/network/radarr_network.rs | 6 ++-- src/network/sonarr_network.rs | 6 ++-- src/ui/radarr_ui/indexers/edit_indexer_ui.rs | 29 +++++++++++++------ src/ui/widgets/popup.rs | 2 +- src/ui/widgets/popup_tests.rs | 2 +- 9 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/models/servarr_data/radarr/modals.rs b/src/models/servarr_data/radarr/modals.rs index 1b9c0d9..b4f7f73 100644 --- a/src/models/servarr_data/radarr/modals.rs +++ b/src/models/servarr_data/radarr/modals.rs @@ -36,6 +36,7 @@ impl From<&RadarrData<'_>> for EditIndexerModal { enable_interactive_search, tags, fields, + priority, .. } = radarr_data.indexers.current_selection(); let seed_ratio_field_option = fields @@ -53,6 +54,7 @@ impl From<&RadarrData<'_>> for EditIndexerModal { edit_indexer_modal.enable_rss = Some(*enable_rss); edit_indexer_modal.enable_automatic_search = Some(*enable_automatic_search); edit_indexer_modal.enable_interactive_search = Some(*enable_interactive_search); + edit_indexer_modal.priority = *priority; edit_indexer_modal.url = fields .as_ref() .unwrap() diff --git a/src/models/servarr_data/radarr/modals_tests.rs b/src/models/servarr_data/radarr/modals_tests.rs index e19d8a9..91b920b 100644 --- a/src/models/servarr_data/radarr/modals_tests.rs +++ b/src/models/servarr_data/radarr/modals_tests.rs @@ -45,6 +45,7 @@ mod test { enable_interactive_search: true, tags: vec![Number::from(1), Number::from(2)], fields: Some(fields), + priority: 1, ..Indexer::default() }; radarr_data.indexers.set_items(vec![indexer]); @@ -55,6 +56,7 @@ mod test { assert_eq!(edit_indexer_modal.enable_rss, Some(true)); assert_eq!(edit_indexer_modal.enable_automatic_search, Some(true)); assert_eq!(edit_indexer_modal.enable_interactive_search, Some(true)); + assert_eq!(edit_indexer_modal.priority, 1); assert_str_eq!(edit_indexer_modal.url.text, "https://test.com"); assert_str_eq!(edit_indexer_modal.api_key.text, "1234"); @@ -93,6 +95,7 @@ mod test { enable_interactive_search: true, tags: vec![Number::from(1), Number::from(2)], fields: Some(fields), + priority: 1, ..Indexer::default() }; radarr_data.indexers.set_items(vec![indexer]); @@ -103,6 +106,7 @@ mod test { assert_eq!(edit_indexer_modal.enable_rss, Some(true)); assert_eq!(edit_indexer_modal.enable_automatic_search, Some(true)); assert_eq!(edit_indexer_modal.enable_interactive_search, Some(true)); + assert_eq!(edit_indexer_modal.priority, 1); assert_str_eq!(edit_indexer_modal.url.text, "https://test.com"); assert_str_eq!(edit_indexer_modal.api_key.text, "1234"); assert!(edit_indexer_modal.seed_ratio.text.is_empty()); diff --git a/src/models/servarr_data/sonarr/modals.rs b/src/models/servarr_data/sonarr/modals.rs index 848f199..3d96c05 100644 --- a/src/models/servarr_data/sonarr/modals.rs +++ b/src/models/servarr_data/sonarr/modals.rs @@ -84,6 +84,7 @@ impl From<&SonarrData<'_>> for EditIndexerModal { enable_interactive_search, tags, fields, + priority, .. } = sonarr_data.indexers.current_selection(); let seed_ratio_field_option = fields @@ -101,6 +102,7 @@ impl From<&SonarrData<'_>> for EditIndexerModal { edit_indexer_modal.enable_rss = Some(*enable_rss); edit_indexer_modal.enable_automatic_search = Some(*enable_automatic_search); edit_indexer_modal.enable_interactive_search = Some(*enable_interactive_search); + edit_indexer_modal.priority = *priority; edit_indexer_modal.url = fields .as_ref() .unwrap() diff --git a/src/models/servarr_data/sonarr/modals_tests.rs b/src/models/servarr_data/sonarr/modals_tests.rs index cbaecd8..28cd038 100644 --- a/src/models/servarr_data/sonarr/modals_tests.rs +++ b/src/models/servarr_data/sonarr/modals_tests.rs @@ -104,6 +104,7 @@ mod tests { enable_interactive_search: true, tags: vec![Number::from(1), Number::from(2)], fields: Some(fields), + priority: 1, ..Indexer::default() }; sonarr_data.indexers.set_items(vec![indexer]); @@ -114,6 +115,7 @@ mod tests { assert_eq!(edit_indexer_modal.enable_rss, Some(true)); assert_eq!(edit_indexer_modal.enable_automatic_search, Some(true)); assert_eq!(edit_indexer_modal.enable_interactive_search, Some(true)); + assert_eq!(edit_indexer_modal.priority, 1); assert_str_eq!(edit_indexer_modal.url.text, "https://test.com"); assert_str_eq!(edit_indexer_modal.api_key.text, "1234"); @@ -152,6 +154,7 @@ mod tests { enable_interactive_search: true, tags: vec![Number::from(1), Number::from(2)], fields: Some(fields), + priority: 1, ..Indexer::default() }; sonarr_data.indexers.set_items(vec![indexer]); @@ -162,6 +165,7 @@ mod tests { assert_eq!(edit_indexer_modal.enable_rss, Some(true)); assert_eq!(edit_indexer_modal.enable_automatic_search, Some(true)); assert_eq!(edit_indexer_modal.enable_interactive_search, Some(true)); + assert_eq!(edit_indexer_modal.priority, 1); assert_str_eq!(edit_indexer_modal.url.text, "https://test.com"); assert_str_eq!(edit_indexer_modal.api_key.text, "1234"); assert!(edit_indexer_modal.seed_ratio.text.is_empty()); diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index 10a86f6..66be974 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -927,9 +927,6 @@ impl<'a, 'b> Network<'a, 'b> { info!("Constructing edit indexer body"); let mut detailed_indexer_body: Value = serde_json::from_str(&response).unwrap(); - let priority = detailed_indexer_body["priority"] - .as_i64() - .expect("Unable to deserialize 'priority'"); let ( name, @@ -942,6 +939,9 @@ impl<'a, 'b> Network<'a, 'b> { tags, priority, ) = if let Some(params) = edit_indexer_params { + let priority = detailed_indexer_body["priority"] + .as_i64() + .expect("Unable to deserialize 'priority'"); let seed_ratio_field_option = detailed_indexer_body["fields"] .as_array() .unwrap() diff --git a/src/network/sonarr_network.rs b/src/network/sonarr_network.rs index 92ec2ba..38c4ef9 100644 --- a/src/network/sonarr_network.rs +++ b/src/network/sonarr_network.rs @@ -858,9 +858,6 @@ impl<'a, 'b> Network<'a, 'b> { info!("Constructing edit indexer body"); let mut detailed_indexer_body: Value = serde_json::from_str(&response).unwrap(); - let priority = detailed_indexer_body["priority"] - .as_i64() - .expect("Unable to deserialize 'priority'"); let ( name, @@ -873,6 +870,9 @@ impl<'a, 'b> Network<'a, 'b> { tags, priority, ) = if let Some(params) = edit_indexer_params { + let priority = detailed_indexer_body["priority"] + .as_i64() + .expect("Unable to deserialize 'priority'"); let seed_ratio_field_option = detailed_indexer_body["fields"] .as_array() .unwrap() diff --git a/src/ui/radarr_ui/indexers/edit_indexer_ui.rs b/src/ui/radarr_ui/indexers/edit_indexer_ui.rs index 085501c..2aa8f64 100644 --- a/src/ui/radarr_ui/indexers/edit_indexer_ui.rs +++ b/src/ui/radarr_ui/indexers/edit_indexer_ui.rs @@ -59,8 +59,9 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { if edit_indexer_modal_option.is_some() { let edit_indexer_modal = edit_indexer_modal_option.as_ref().unwrap(); - let [settings_area, _, buttons_area, help_area] = Layout::vertical([ - Constraint::Length(15), + let [_, settings_area, _, buttons_area, help_area] = Layout::vertical([ + Constraint::Fill(1), + Constraint::Length(18), Constraint::Fill(1), Constraint::Length(3), Constraint::Length(1), @@ -71,13 +72,15 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { Layout::horizontal([Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)]) .margin(1) .areas(settings_area); - let [name_area, rss_area, auto_search_area, interactive_search_area] = Layout::vertical([ - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - ]) - .areas(left_side_area); + let [name_area, rss_area, auto_search_area, interactive_search_area, priority_area] = + Layout::vertical([ + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + ]) + .areas(left_side_area); let [url_area, api_key_area, seed_ratio_area, tags_area] = Layout::vertical([ Constraint::Length(3), Constraint::Length(3), @@ -87,6 +90,7 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .areas(right_side_area); if let Route::Radarr(active_radarr_block, _) = app.get_current_route() { + let priority = edit_indexer_modal.priority.to_string(); let name_input_box = InputBox::new(&edit_indexer_modal.name.text) .offset(edit_indexer_modal.name.offset.load(Ordering::SeqCst)) .label("Name") @@ -107,6 +111,11 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .label("Tags") .highlighted(selected_block == ActiveRadarrBlock::EditIndexerTagsInput) .selected(active_radarr_block == ActiveRadarrBlock::EditIndexerTagsInput); + let priority_input_box = InputBox::new(&priority) + .cursor_after_string(false) + .label("Indexer Priority ▴▾") + .highlighted(selected_block == ActiveRadarrBlock::EditIndexerPriorityInput) + .selected(active_radarr_block == ActiveRadarrBlock::EditIndexerPriorityInput); render_selectable_input_box!(name_input_box, f, name_area); render_selectable_input_box!(url_input_box, f, url_area); @@ -126,8 +135,10 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { render_selectable_input_box!(seed_ratio_input_box, f, seed_ratio_area); render_selectable_input_box!(tags_input_box, f, tags_area); + render_selectable_input_box!(priority_input_box, f, priority_area); } else { render_selectable_input_box!(tags_input_box, f, seed_ratio_area); + render_selectable_input_box!(priority_input_box, f, tags_area); } let rss_checkbox = Checkbox::new("Enable RSS") diff --git a/src/ui/widgets/popup.rs b/src/ui/widgets/popup.rs index 43b36fb..0fcedd2 100644 --- a/src/ui/widgets/popup.rs +++ b/src/ui/widgets/popup.rs @@ -29,7 +29,7 @@ impl Size { match self { Size::SmallPrompt => (20, 20), Size::Prompt => (37, 37), - Size::LargePrompt => (70, 45), + Size::LargePrompt => (70, 50), Size::Message => (25, 8), Size::NarrowMessage => (50, 20), Size::LargeMessage => (25, 25), diff --git a/src/ui/widgets/popup_tests.rs b/src/ui/widgets/popup_tests.rs index d643a3f..1df6e11 100644 --- a/src/ui/widgets/popup_tests.rs +++ b/src/ui/widgets/popup_tests.rs @@ -8,7 +8,7 @@ mod tests { fn test_dimensions_to_percent() { assert_eq!(Size::SmallPrompt.to_percent(), (20, 20)); assert_eq!(Size::Prompt.to_percent(), (37, 37)); - assert_eq!(Size::LargePrompt.to_percent(), (70, 45)); + assert_eq!(Size::LargePrompt.to_percent(), (70, 50)); assert_eq!(Size::Message.to_percent(), (25, 8)); assert_eq!(Size::NarrowMessage.to_percent(), (50, 20)); assert_eq!(Size::LargeMessage.to_percent(), (25, 25));