fix(style): Addressed linter complaints on formatting

This commit is contained in:
2024-12-13 19:48:22 -07:00
parent 682bc91855
commit 412cb2408e
51 changed files with 343 additions and 259 deletions
+8 -2
View File
@@ -31,7 +31,10 @@ pub static SERIES_DETAILS_CONTEXT_CLUES: [ContextClue; 8] = [
DEFAULT_KEYBINDINGS.refresh.desc, DEFAULT_KEYBINDINGS.refresh.desc,
), ),
(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc), (DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc),
(DEFAULT_KEYBINDINGS.toggle_monitoring, DEFAULT_KEYBINDINGS.toggle_monitoring.desc), (
DEFAULT_KEYBINDINGS.toggle_monitoring,
DEFAULT_KEYBINDINGS.toggle_monitoring.desc,
),
(DEFAULT_KEYBINDINGS.submit, "season details"), (DEFAULT_KEYBINDINGS.submit, "season details"),
(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc), (DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc),
(DEFAULT_KEYBINDINGS.update, DEFAULT_KEYBINDINGS.update.desc), (DEFAULT_KEYBINDINGS.update, DEFAULT_KEYBINDINGS.update.desc),
@@ -82,7 +85,10 @@ pub static SEASON_DETAILS_CONTEXT_CLUES: [ContextClue; 5] = [
DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh,
DEFAULT_KEYBINDINGS.refresh.desc, DEFAULT_KEYBINDINGS.refresh.desc,
), ),
(DEFAULT_KEYBINDINGS.toggle_monitoring, DEFAULT_KEYBINDINGS.toggle_monitoring.desc), (
DEFAULT_KEYBINDINGS.toggle_monitoring,
DEFAULT_KEYBINDINGS.toggle_monitoring.desc,
),
(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc), (DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc),
( (
DEFAULT_KEYBINDINGS.auto_search, DEFAULT_KEYBINDINGS.auto_search,
+8 -5
View File
@@ -120,9 +120,7 @@ pub enum SonarrCommand {
}, },
#[command(about = "Test all Sonarr indexers")] #[command(about = "Test all Sonarr indexers")]
TestAllIndexers, TestAllIndexers,
#[command( #[command(about = "Toggle monitoring for the specified episode")]
about = "Toggle monitoring for the specified episode"
)]
ToggleEpisodeMonitoring { ToggleEpisodeMonitoring {
#[arg( #[arg(
long, long,
@@ -280,10 +278,15 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrCommand> for SonarrCliHandler<'a, '
.await?; .await?;
serde_json::to_string_pretty(&resp)? serde_json::to_string_pretty(&resp)?
} }
SonarrCommand::ToggleSeasonMonitoring {series_id, season_number } => { SonarrCommand::ToggleSeasonMonitoring {
series_id,
season_number,
} => {
let resp = self let resp = self
.network .network
.handle_network_event(SonarrEvent::ToggleSeasonMonitoring(Some((series_id, season_number))).into()) .handle_network_event(
SonarrEvent::ToggleSeasonMonitoring(Some((series_id, season_number))).into(),
)
.await?; .await?;
serde_json::to_string_pretty(&resp)? serde_json::to_string_pretty(&resp)?
} }
+20 -17
View File
@@ -145,11 +145,8 @@ mod tests {
#[test] #[test]
fn test_toggle_episode_monitoring_requires_episode_id() { fn test_toggle_episode_monitoring_requires_episode_id() {
let result = Cli::command().try_get_matches_from([ let result =
"managarr", Cli::command().try_get_matches_from(["managarr", "sonarr", "toggle-episode-monitoring"]);
"sonarr",
"toggle-episode-monitoring",
]);
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
@@ -710,14 +707,16 @@ mod tests {
))) )))
}); });
let app_arc = Arc::new(Mutex::new(App::default())); let app_arc = Arc::new(Mutex::new(App::default()));
let toggle_episode_monitoring_command = SonarrCommand::ToggleEpisodeMonitoring { let toggle_episode_monitoring_command =
episode_id: 1, SonarrCommand::ToggleEpisodeMonitoring { episode_id: 1 };
};
let result = let result = SonarrCliHandler::with(
SonarrCliHandler::with(&app_arc, toggle_episode_monitoring_command, &mut mock_network) &app_arc,
.handle() toggle_episode_monitoring_command,
.await; &mut mock_network,
)
.handle()
.await;
assert!(result.is_ok()); assert!(result.is_ok());
} }
@@ -730,7 +729,8 @@ mod tests {
mock_network mock_network
.expect_handle_network_event() .expect_handle_network_event()
.with(eq::<NetworkEvent>( .with(eq::<NetworkEvent>(
SonarrEvent::ToggleSeasonMonitoring(Some((expected_series_id, expected_season_number))).into(), SonarrEvent::ToggleSeasonMonitoring(Some((expected_series_id, expected_season_number)))
.into(),
)) ))
.times(1) .times(1)
.returning(|_| { .returning(|_| {
@@ -744,10 +744,13 @@ mod tests {
season_number: 1, season_number: 1,
}; };
let result = let result = SonarrCliHandler::with(
SonarrCliHandler::with(&app_arc, toggle_season_monitoring_command, &mut mock_network) &app_arc,
.handle() toggle_season_monitoring_command,
.await; &mut mock_network,
)
.handle()
.await;
assert!(result.is_ok()); assert!(result.is_ok());
} }
+75 -24
View File
@@ -331,38 +331,89 @@ mod test_utils {
macro_rules! test_handler_delegation { macro_rules! test_handler_delegation {
($handler:ident, $base:expr, $active_block:expr) => { ($handler:ident, $base:expr, $active_block:expr) => {
let mut app = App::default(); let mut app = App::default();
app.data.sonarr_data.history.set_items(vec![$crate::models::sonarr_models::SonarrHistoryItem::default()]); app.data.sonarr_data.history.set_items(vec![
app.data.sonarr_data.root_folders.set_items(vec![$crate::models::servarr_models::RootFolder::default()]); $crate::models::sonarr_models::SonarrHistoryItem::default(),
app.data.sonarr_data.indexers.set_items(vec![$crate::models::servarr_models::Indexer::default()]); ]);
app.data.sonarr_data.blocklist.set_items(vec![$crate::models::sonarr_models::BlocklistItem::default()]); app
app.data.sonarr_data.add_searched_series = Some($crate::models::stateful_table::StatefulTable::default()); .data
app.data.radarr_data.movies.set_items(vec![$crate::models::radarr_models::Movie::default()]); .sonarr_data
app.data.radarr_data.collections.set_items(vec![$crate::models::radarr_models::Collection::default()]); .root_folders
app.data.radarr_data.collection_movies.set_items(vec![$crate::models::radarr_models::CollectionMovie::default()]); .set_items(vec![$crate::models::servarr_models::RootFolder::default()]);
app.data.radarr_data.indexers.set_items(vec![$crate::models::servarr_models::Indexer::default()]); app
app.data.radarr_data.root_folders.set_items(vec![$crate::models::servarr_models::RootFolder::default()]); .data
app.data.radarr_data.blocklist.set_items(vec![$crate::models::radarr_models::BlocklistItem::default()]); .sonarr_data
app.data.radarr_data.add_searched_movies = Some($crate::models::stateful_table::StatefulTable::default()); .indexers
let mut movie_details_modal = $crate::models::servarr_data::radarr::modals::MovieDetailsModal::default(); .set_items(vec![$crate::models::servarr_models::Indexer::default()]);
app
.data
.sonarr_data
.blocklist
.set_items(vec![$crate::models::sonarr_models::BlocklistItem::default()]);
app.data.sonarr_data.add_searched_series =
Some($crate::models::stateful_table::StatefulTable::default());
app
.data
.radarr_data
.movies
.set_items(vec![$crate::models::radarr_models::Movie::default()]);
app
.data
.radarr_data
.collections
.set_items(vec![$crate::models::radarr_models::Collection::default()]);
app.data.radarr_data.collection_movies.set_items(vec![
$crate::models::radarr_models::CollectionMovie::default(),
]);
app
.data
.radarr_data
.indexers
.set_items(vec![$crate::models::servarr_models::Indexer::default()]);
app
.data
.radarr_data
.root_folders
.set_items(vec![$crate::models::servarr_models::RootFolder::default()]);
app
.data
.radarr_data
.blocklist
.set_items(vec![$crate::models::radarr_models::BlocklistItem::default()]);
app.data.radarr_data.add_searched_movies =
Some($crate::models::stateful_table::StatefulTable::default());
let mut movie_details_modal =
$crate::models::servarr_data::radarr::modals::MovieDetailsModal::default();
movie_details_modal.movie_history.set_items(vec![
$crate::models::radarr_models::MovieHistoryItem::default(),
]);
movie_details_modal movie_details_modal
.movie_history .movie_cast
.set_items(vec![$crate::models::radarr_models::MovieHistoryItem::default()]); .set_items(vec![$crate::models::radarr_models::Credit::default()]);
movie_details_modal.movie_cast.set_items(vec![$crate::models::radarr_models::Credit::default()]); movie_details_modal
movie_details_modal.movie_crew.set_items(vec![$crate::models::radarr_models::Credit::default()]); .movie_crew
movie_details_modal.movie_releases.set_items(vec![$crate::models::radarr_models::RadarrRelease::default()]); .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); app.data.radarr_data.movie_details_modal = Some(movie_details_modal);
let mut season_details_modal = $crate::models::servarr_data::sonarr::modals::SeasonDetailsModal::default(); let mut season_details_modal =
season_details_modal.season_history.set_items(vec![$crate::models::sonarr_models::SonarrHistoryItem::default()]); $crate::models::servarr_data::sonarr::modals::SeasonDetailsModal::default();
season_details_modal.episode_details_modal = Some($crate::models::servarr_data::sonarr::modals::EpisodeDetailsModal::default()); season_details_modal.season_history.set_items(vec![
$crate::models::sonarr_models::SonarrHistoryItem::default(),
]);
season_details_modal.episode_details_modal =
Some($crate::models::servarr_data::sonarr::modals::EpisodeDetailsModal::default());
app.data.sonarr_data.season_details_modal = Some(season_details_modal); app.data.sonarr_data.season_details_modal = Some(season_details_modal);
let mut series_history = $crate::models::stateful_table::StatefulTable::default(); let mut series_history = $crate::models::stateful_table::StatefulTable::default();
series_history.set_items(vec![ series_history.set_items(vec![
$crate::models::sonarr_models::SonarrHistoryItem::default(), $crate::models::sonarr_models::SonarrHistoryItem::default(),
]); ]);
app.data.sonarr_data.series_history = Some(series_history); app.data.sonarr_data.series_history = Some(series_history);
app.data.sonarr_data.series.set_items(vec![ app
$crate::models::sonarr_models::Series::default(), .data
]); .sonarr_data
.series
.set_items(vec![$crate::models::sonarr_models::Series::default()]);
app.push_navigation_stack($base.into()); app.push_navigation_stack($base.into());
app.push_navigation_stack($active_block.into()); app.push_navigation_stack($active_block.into());
@@ -577,7 +577,7 @@ mod tests {
ActiveSonarrBlock::ManualEpisodeSearchConfirmPrompt, ActiveSonarrBlock::ManualEpisodeSearchConfirmPrompt,
None, None,
) )
.handle(); .handle();
assert!(app.data.sonarr_data.prompt_confirm); assert!(app.data.sonarr_data.prompt_confirm);
assert_eq!( assert_eq!(
@@ -10,7 +10,10 @@ mod tests {
use crate::event::Key; use crate::event::Key;
use crate::handlers::sonarr_handlers::library::{series_sorting_options, LibraryHandler}; use crate::handlers::sonarr_handlers::library::{series_sorting_options, LibraryHandler};
use crate::handlers::KeyEventHandler; use crate::handlers::KeyEventHandler;
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, EPISODE_DETAILS_BLOCKS, LIBRARY_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS}; use crate::models::servarr_data::sonarr::sonarr_data::{
ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS,
EPISODE_DETAILS_BLOCKS, LIBRARY_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS,
};
use crate::models::sonarr_models::{Series, SeriesStatus, SeriesType}; use crate::models::sonarr_models::{Series, SeriesStatus, SeriesType};
use crate::test_handler_delegation; use crate::test_handler_delegation;
@@ -556,7 +559,7 @@ mod tests {
ActiveSonarrBlock::SeasonHistoryDetails, ActiveSonarrBlock::SeasonHistoryDetails,
ActiveSonarrBlock::ManualSeasonSearch, ActiveSonarrBlock::ManualSeasonSearch,
ActiveSonarrBlock::ManualSeasonSearchSortPrompt, ActiveSonarrBlock::ManualSeasonSearchSortPrompt,
ActiveSonarrBlock::DeleteEpisodeFilePrompt, ActiveSonarrBlock::DeleteEpisodeFilePrompt
)] )]
active_sonarr_block: ActiveSonarrBlock, active_sonarr_block: ActiveSonarrBlock,
) { ) {
@@ -576,7 +579,7 @@ mod tests {
ActiveSonarrBlock::EpisodeHistoryDetails, ActiveSonarrBlock::EpisodeHistoryDetails,
ActiveSonarrBlock::ManualEpisodeSearch, ActiveSonarrBlock::ManualEpisodeSearch,
ActiveSonarrBlock::ManualEpisodeSearchSortPrompt, ActiveSonarrBlock::ManualEpisodeSearchSortPrompt,
ActiveSonarrBlock::DeleteEpisodeFilePrompt, ActiveSonarrBlock::DeleteEpisodeFilePrompt
)] )]
active_sonarr_block: ActiveSonarrBlock, active_sonarr_block: ActiveSonarrBlock,
) { ) {
+2 -2
View File
@@ -30,12 +30,12 @@ use crate::handlers::table_handler::TableHandlingConfig;
mod add_series_handler; mod add_series_handler;
mod delete_series_handler; mod delete_series_handler;
mod episode_details_handler;
#[cfg(test)] #[cfg(test)]
#[path = "library_handler_tests.rs"] #[path = "library_handler_tests.rs"]
mod library_handler_tests; mod library_handler_tests;
mod series_details_handler;
mod season_details_handler; mod season_details_handler;
mod episode_details_handler; mod series_details_handler;
pub(super) struct LibraryHandler<'a, 'b> { pub(super) struct LibraryHandler<'a, 'b> {
key: Key, key: Key,
@@ -343,7 +343,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler
self.app.data.sonarr_data.prompt_confirm_action = self.app.data.sonarr_data.prompt_confirm_action =
Some(SonarrEvent::ToggleEpisodeMonitoring(None)); Some(SonarrEvent::ToggleEpisodeMonitoring(None));
self.app.pop_and_push_navigation_stack(self.active_sonarr_block.into()); self
.app
.pop_and_push_navigation_stack(self.active_sonarr_block.into());
} }
ActiveSonarrBlock::SeasonDetails ActiveSonarrBlock::SeasonDetails
| ActiveSonarrBlock::SeasonHistory | ActiveSonarrBlock::SeasonHistory
@@ -416,7 +418,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler
} }
} }
pub(in crate::handlers::sonarr_handlers::library) fn releases_sorting_options() -> Vec<SortOption<SonarrRelease>> { pub(in crate::handlers::sonarr_handlers::library) fn releases_sorting_options(
) -> Vec<SortOption<SonarrRelease>> {
vec![ vec![
SortOption { SortOption {
name: "Source", name: "Source",
@@ -559,7 +559,7 @@ mod tests {
ActiveSonarrBlock::SeasonDetails, ActiveSonarrBlock::SeasonDetails,
None, None,
) )
.handle(); .handle();
assert_eq!( assert_eq!(
app.get_current_route(), app.get_current_route(),
@@ -586,9 +586,12 @@ mod tests {
ActiveSonarrBlock::SeasonDetails, ActiveSonarrBlock::SeasonDetails,
None, None,
) )
.handle(); .handle();
assert_eq!(app.get_current_route(), ActiveSonarrBlock::SeasonDetails.into()); assert_eq!(
app.get_current_route(),
ActiveSonarrBlock::SeasonDetails.into()
);
assert!(!app.data.sonarr_data.prompt_confirm); assert!(!app.data.sonarr_data.prompt_confirm);
assert!(app.data.sonarr_data.prompt_confirm_action.is_none()); assert!(app.data.sonarr_data.prompt_confirm_action.is_none());
assert!(!app.is_routing); assert!(!app.is_routing);
@@ -262,7 +262,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeriesDetailsHandler
self.app.data.sonarr_data.prompt_confirm_action = self.app.data.sonarr_data.prompt_confirm_action =
Some(SonarrEvent::ToggleSeasonMonitoring(None)); Some(SonarrEvent::ToggleSeasonMonitoring(None));
self.app.pop_and_push_navigation_stack(self.active_sonarr_block.into()); self
.app
.pop_and_push_navigation_stack(self.active_sonarr_block.into());
} }
_ => (), _ => (),
}, },
@@ -388,7 +388,7 @@ mod tests {
ActiveSonarrBlock::SeriesDetails, ActiveSonarrBlock::SeriesDetails,
None, None,
) )
.handle(); .handle();
assert_eq!( assert_eq!(
app.get_current_route(), app.get_current_route(),
@@ -415,9 +415,12 @@ mod tests {
ActiveSonarrBlock::SeriesDetails, ActiveSonarrBlock::SeriesDetails,
None, None,
) )
.handle(); .handle();
assert_eq!(app.get_current_route(), ActiveSonarrBlock::SeriesDetails.into()); assert_eq!(
app.get_current_route(),
ActiveSonarrBlock::SeriesDetails.into()
);
assert!(!app.data.sonarr_data.prompt_confirm); assert!(!app.data.sonarr_data.prompt_confirm);
assert!(app.data.sonarr_data.prompt_confirm_action.is_none()); assert!(app.data.sonarr_data.prompt_confirm_action.is_none());
assert!(!app.is_routing); assert!(!app.is_routing);
+1 -1
View File
@@ -40,7 +40,7 @@ mod tests {
} }
_ => { _ => {
self.handle_movies_table_events(movie_table_handling_config); self.handle_movies_table_events(movie_table_handling_config);
}, }
} }
} }
@@ -1,11 +1,14 @@
#[cfg(test)] #[cfg(test)]
pub mod utils { pub mod utils {
use crate::models::radarr_models::{AddMovieSearchResult, BlocklistItem, Collection, CollectionMovie, Credit, DownloadRecord, Movie, MovieHistoryItem, RadarrRelease}; use crate::models::radarr_models::{
AddMovieSearchResult, BlocklistItem, Collection, CollectionMovie, Credit, DownloadRecord,
Movie, MovieHistoryItem, RadarrRelease,
};
use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::modals::MovieDetailsModal;
use crate::models::servarr_data::radarr::radarr_data::RadarrData; use crate::models::servarr_data::radarr::radarr_data::RadarrData;
use crate::models::servarr_models::{Indexer, RootFolder};
use crate::models::stateful_table::StatefulTable; use crate::models::stateful_table::StatefulTable;
use crate::models::{HorizontallyScrollableText, ScrollableText}; use crate::models::{HorizontallyScrollableText, ScrollableText};
use crate::models::servarr_models::{Indexer, RootFolder};
pub fn create_test_radarr_data<'a>() -> RadarrData<'a> { pub fn create_test_radarr_data<'a>() -> RadarrData<'a> {
let mut movie_details_modal = MovieDetailsModal { let mut movie_details_modal = MovieDetailsModal {
@@ -35,11 +38,21 @@ pub mod utils {
..RadarrData::default() ..RadarrData::default()
}; };
radarr_data.movies.set_items(vec![Movie::default()]); radarr_data.movies.set_items(vec![Movie::default()]);
radarr_data.collection_movies.set_items(vec![CollectionMovie::default()]); radarr_data
radarr_data.collections.set_items(vec![Collection::default()]); .collection_movies
radarr_data.downloads.set_items(vec![DownloadRecord::default()]); .set_items(vec![CollectionMovie::default()]);
radarr_data.blocklist.set_items(vec![BlocklistItem::default()]); radarr_data
radarr_data.root_folders.set_items(vec![RootFolder::default()]); .collections
.set_items(vec![Collection::default()]);
radarr_data
.downloads
.set_items(vec![DownloadRecord::default()]);
radarr_data
.blocklist
.set_items(vec![BlocklistItem::default()]);
radarr_data
.root_folders
.set_items(vec![RootFolder::default()]);
radarr_data.indexers.set_items(vec![Indexer::default()]); radarr_data.indexers.set_items(vec![Indexer::default()]);
radarr_data.movie_info_tabs.index = 1; radarr_data.movie_info_tabs.index = 1;
radarr_data radarr_data
+9 -9
View File
@@ -1,13 +1,15 @@
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
use super::sonarr_data::{ActiveSonarrBlock, SonarrData};
use crate::models::sonarr_models::EpisodeFile;
use crate::{ use crate::{
app::{ app::{
context_clues::build_context_clue_string, context_clues::build_context_clue_string,
sonarr::sonarr_context_clues::{ sonarr::sonarr_context_clues::{
DETAILS_CONTEXTUAL_CONTEXT_CLUES, EPISODE_DETAILS_CONTEXT_CLUES, DETAILS_CONTEXTUAL_CONTEXT_CLUES, EPISODE_DETAILS_CONTEXT_CLUES,
MANUAL_EPISODE_SEARCH_CONTEXT_CLUES, MANUAL_EPISODE_SEARCH_CONTEXT_CLUES, MANUAL_SEASON_SEARCH_CONTEXT_CLUES,
MANUAL_SEASON_SEARCH_CONTEXT_CLUES, SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES, SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES, SEASON_DETAILS_CONTEXT_CLUES,
SEASON_DETAILS_CONTEXT_CLUES, SEASON_HISTORY_CONTEXT_CLUES, SEASON_HISTORY_CONTEXT_CLUES,
}, },
}, },
models::{ models::{
@@ -19,8 +21,6 @@ use crate::{
HorizontallyScrollableText, ScrollableText, TabRoute, TabState, HorizontallyScrollableText, ScrollableText, TabRoute, TabState,
}, },
}; };
use crate::models::sonarr_models::EpisodeFile;
use super::sonarr_data::{ActiveSonarrBlock, SonarrData};
#[cfg(test)] #[cfg(test)]
#[path = "modals_tests.rs"] #[path = "modals_tests.rs"]
@@ -330,7 +330,9 @@ impl Default for SeasonDetailsModal {
title: "Episodes", title: "Episodes",
route: ActiveSonarrBlock::SeasonDetails.into(), route: ActiveSonarrBlock::SeasonDetails.into(),
help: build_context_clue_string(&SEASON_DETAILS_CONTEXT_CLUES), help: build_context_clue_string(&SEASON_DETAILS_CONTEXT_CLUES),
contextual_help: Some(build_context_clue_string(&SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES)), contextual_help: Some(build_context_clue_string(
&SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES,
)),
}, },
TabRoute { TabRoute {
title: "History", title: "History",
@@ -341,9 +343,7 @@ impl Default for SeasonDetailsModal {
TabRoute { TabRoute {
title: "Manual Search", title: "Manual Search",
route: ActiveSonarrBlock::ManualSeasonSearch.into(), route: ActiveSonarrBlock::ManualSeasonSearch.into(),
help: build_context_clue_string( help: build_context_clue_string(&MANUAL_SEASON_SEARCH_CONTEXT_CLUES),
&MANUAL_SEASON_SEARCH_CONTEXT_CLUES,
),
contextual_help: Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES)), contextual_help: Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES)),
}, },
]), ]),
@@ -342,7 +342,9 @@ mod tests {
); );
assert_eq!( assert_eq!(
season_details_modal.season_details_tabs.tabs[0].contextual_help, season_details_modal.season_details_tabs.tabs[0].contextual_help,
Some(build_context_clue_string(&SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES)) Some(build_context_clue_string(
&SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES
))
); );
assert_str_eq!( assert_str_eq!(
@@ -376,9 +378,7 @@ mod tests {
); );
assert_eq!( assert_eq!(
season_details_modal.season_details_tabs.tabs[2].contextual_help, season_details_modal.season_details_tabs.tabs[2].contextual_help,
Some(build_context_clue_string( Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES))
&DETAILS_CONTEXTUAL_CONTEXT_CLUES
))
); );
} }
} }
@@ -222,7 +222,14 @@ mod tests {
} }
mod active_sonarr_block_tests { mod active_sonarr_block_tests {
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS, BLOCKLIST_BLOCKS, DELETE_SERIES_BLOCKS, DELETE_SERIES_SELECTION_BLOCKS, DOWNLOADS_BLOCKS, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, EDIT_SERIES_BLOCKS, EDIT_SERIES_SELECTION_BLOCKS, EPISODE_DETAILS_BLOCKS, HISTORY_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, LIBRARY_BLOCKS, ROOT_FOLDERS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, SYSTEM_DETAILS_BLOCKS}; use crate::models::servarr_data::sonarr::sonarr_data::{
ActiveSonarrBlock, ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS, BLOCKLIST_BLOCKS,
DELETE_SERIES_BLOCKS, DELETE_SERIES_SELECTION_BLOCKS, DOWNLOADS_BLOCKS, EDIT_INDEXER_BLOCKS,
EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, EDIT_SERIES_BLOCKS,
EDIT_SERIES_SELECTION_BLOCKS, EPISODE_DETAILS_BLOCKS, HISTORY_BLOCKS, INDEXERS_BLOCKS,
INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, LIBRARY_BLOCKS,
ROOT_FOLDERS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, SYSTEM_DETAILS_BLOCKS,
};
#[test] #[test]
fn test_library_blocks_contents() { fn test_library_blocks_contents() {
@@ -1,5 +1,7 @@
#[cfg(test)] #[cfg(test)]
pub mod utils { pub mod utils {
use crate::models::servarr_models::{Indexer, RootFolder};
use crate::models::sonarr_models::{BlocklistItem, Series};
use crate::models::{ use crate::models::{
servarr_data::sonarr::{ servarr_data::sonarr::{
modals::{EpisodeDetailsModal, SeasonDetailsModal}, modals::{EpisodeDetailsModal, SeasonDetailsModal},
@@ -9,8 +11,6 @@ pub mod utils {
stateful_table::StatefulTable, stateful_table::StatefulTable,
HorizontallyScrollableText, ScrollableText, HorizontallyScrollableText, ScrollableText,
}; };
use crate::models::servarr_models::{Indexer, RootFolder};
use crate::models::sonarr_models::{BlocklistItem, Series};
pub fn create_test_sonarr_data<'a>() -> SonarrData<'a> { pub fn create_test_sonarr_data<'a>() -> SonarrData<'a> {
let mut episode_details_modal = EpisodeDetailsModal { let mut episode_details_modal = EpisodeDetailsModal {
@@ -27,7 +27,9 @@ pub mod utils {
season_details_modal season_details_modal
.episodes .episodes
.set_items(vec![Episode::default()]); .set_items(vec![Episode::default()]);
season_details_modal.season_history.set_items(vec![SonarrHistoryItem::default()]); season_details_modal
.season_history
.set_items(vec![SonarrHistoryItem::default()]);
season_details_modal season_details_modal
.season_releases .season_releases
.set_items(vec![SonarrRelease::default()]); .set_items(vec![SonarrRelease::default()]);
@@ -50,9 +52,15 @@ pub mod utils {
..SonarrData::default() ..SonarrData::default()
}; };
sonarr_data.series.set_items(vec![Series::default()]); sonarr_data.series.set_items(vec![Series::default()]);
sonarr_data.history.set_items(vec![SonarrHistoryItem::default()]); sonarr_data
sonarr_data.blocklist.set_items(vec![BlocklistItem::default()]); .history
sonarr_data.root_folders.set_items(vec![RootFolder::default()]); .set_items(vec![SonarrHistoryItem::default()]);
sonarr_data
.blocklist
.set_items(vec![BlocklistItem::default()]);
sonarr_data
.root_folders
.set_items(vec![RootFolder::default()]);
sonarr_data.indexers.set_items(vec![Indexer::default()]); sonarr_data.indexers.set_items(vec![Indexer::default()]);
sonarr_data.series_info_tabs.index = 1; sonarr_data.series_info_tabs.index = 1;
sonarr_data sonarr_data
@@ -18,6 +18,12 @@ mod tests {
} }
}); });
assert!(CollectionDetailsUi::accepts((ActiveRadarrBlock::CollectionDetails, Some(ActiveRadarrBlock::CollectionDetails)).into())); assert!(CollectionDetailsUi::accepts(
(
ActiveRadarrBlock::CollectionDetails,
Some(ActiveRadarrBlock::CollectionDetails)
)
.into()
));
} }
} }
@@ -18,6 +18,12 @@ mod tests {
} }
}); });
assert!(EditCollectionUi::accepts((ActiveRadarrBlock::EditCollectionPrompt, Some(ActiveRadarrBlock::CollectionDetails)).into())); assert!(EditCollectionUi::accepts(
(
ActiveRadarrBlock::EditCollectionPrompt,
Some(ActiveRadarrBlock::CollectionDetails)
)
.into()
));
} }
} }
+1 -6
View File
@@ -34,12 +34,7 @@ impl DrawUi for EditIndexerUi {
} }
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
draw_popup( draw_popup(f, app, draw_edit_indexer_prompt, Size::WideLargePrompt);
f,
app,
draw_edit_indexer_prompt,
Size::WideLargePrompt,
);
} }
} }
+6 -1
View File
@@ -61,7 +61,12 @@ impl DrawUi for IndexersUi {
f.render_widget(loading_popup, f.area()); f.render_widget(loading_popup, f.area());
} else { } else {
let popup = { let popup = {
let result = app.data.radarr_data.indexer_test_errors.as_ref().expect("Test result is unpopulated"); let result = app
.data
.radarr_data
.indexer_test_errors
.as_ref()
.expect("Test result is unpopulated");
if !result.is_empty() { if !result.is_empty() {
Popup::new(Message::new(result.clone())).size(Size::LargeMessage) Popup::new(Message::new(result.clone())).size(Size::LargeMessage)
+2 -7
View File
@@ -13,6 +13,7 @@ use crate::models::radarr_models::AddMovieSearchResult;
use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::modals::AddMovieModal;
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS};
use crate::models::{EnumDisplayStyle, Route}; use crate::models::{EnumDisplayStyle, Route};
use crate::ui::radarr_ui::collections::CollectionsUi;
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{ use crate::ui::utils::{
borderless_block, get_width_from_percentage, layout_block, layout_paragraph_borderless, borderless_block, get_width_from_percentage, layout_block, layout_paragraph_borderless,
@@ -27,7 +28,6 @@ use crate::ui::widgets::selectable_list::SelectableList;
use crate::ui::{draw_popup, DrawUi}; use crate::ui::{draw_popup, DrawUi};
use crate::utils::convert_runtime; use crate::utils::convert_runtime;
use crate::{render_selectable_input_box, App}; use crate::{render_selectable_input_box, App};
use crate::ui::radarr_ui::collections::CollectionsUi;
#[cfg(test)] #[cfg(test)]
#[path = "add_movie_ui_tests.rs"] #[path = "add_movie_ui_tests.rs"]
@@ -59,12 +59,7 @@ impl DrawUi for AddMovieUi {
| ActiveRadarrBlock::AddMovieSelectQualityProfile | ActiveRadarrBlock::AddMovieSelectQualityProfile
| ActiveRadarrBlock::AddMovieSelectRootFolder | ActiveRadarrBlock::AddMovieSelectRootFolder
| ActiveRadarrBlock::AddMovieTagsInput => { | ActiveRadarrBlock::AddMovieTagsInput => {
draw_popup( draw_popup(f, app, draw_confirmation_popup, Size::Medium);
f,
app,
draw_confirmation_popup,
Size::Medium,
);
} }
ActiveRadarrBlock::AddMovieAlreadyInLibrary => { ActiveRadarrBlock::AddMovieAlreadyInLibrary => {
f.render_widget( f.render_widget(
+5 -7
View File
@@ -12,7 +12,10 @@ use crate::models::servarr_data::radarr::modals::MovieDetailsModal;
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
use crate::models::Route; use crate::models::Route;
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{borderless_block, decorate_peer_style, get_width_from_percentage, layout_block_bottom_border, layout_block_top_border}; use crate::ui::utils::{
borderless_block, decorate_peer_style, get_width_from_percentage, layout_block_bottom_border,
layout_block_top_border,
};
use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt; use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt;
use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::loading_block::LoadingBlock;
use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::managarr_table::ManagarrTable;
@@ -84,12 +87,7 @@ impl DrawUi for MovieDetailsUi {
} }
}; };
draw_popup( draw_popup(f, app, draw_movie_info_popup, Size::Large);
f,
app,
draw_movie_info_popup,
Size::Large,
);
} }
} }
} }
@@ -6,7 +6,8 @@ mod tests {
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
use crate::ui::radarr_ui::library::movie_details_ui::{style_from_download_status, MovieDetailsUi, use crate::ui::radarr_ui::library::movie_details_ui::{
style_from_download_status, MovieDetailsUi,
}; };
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
use crate::ui::DrawUi; use crate::ui::DrawUi;
+3 -6
View File
@@ -34,12 +34,9 @@ impl DrawUi for RootFoldersUi {
draw_root_folders(f, app, area); draw_root_folders(f, app, area);
match active_radarr_block { match active_radarr_block {
ActiveRadarrBlock::AddRootFolderPrompt => draw_popup( ActiveRadarrBlock::AddRootFolderPrompt => {
f, draw_popup(f, app, draw_add_root_folder_prompt_box, Size::InputBox)
app, }
draw_add_root_folder_prompt_box,
Size::InputBox,
),
ActiveRadarrBlock::DeleteRootFolderPrompt => { ActiveRadarrBlock::DeleteRootFolderPrompt => {
let prompt = format!( let prompt = format!(
"Do you really want to delete this root folder: \n{}?", "Do you really want to delete this root folder: \n{}?",
+5 -14
View File
@@ -10,8 +10,7 @@ use crate::models::radarr_models::RadarrTask;
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS};
use crate::models::Route; use crate::models::Route;
use crate::ui::radarr_ui::system::{ use crate::ui::radarr_ui::system::{
draw_queued_events, extract_task_props, TASK_TABLE_CONSTRAINTS, draw_queued_events, extract_task_props, TASK_TABLE_CONSTRAINTS, TASK_TABLE_HEADERS,
TASK_TABLE_HEADERS,
}; };
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{borderless_block, style_log_list_item, title_block}; use crate::ui::utils::{borderless_block, style_log_list_item, title_block};
@@ -44,19 +43,11 @@ impl DrawUi for SystemDetailsUi {
draw_logs_popup(f, app); draw_logs_popup(f, app);
} }
ActiveRadarrBlock::SystemTasks | ActiveRadarrBlock::SystemTaskStartConfirmPrompt => { ActiveRadarrBlock::SystemTasks | ActiveRadarrBlock::SystemTaskStartConfirmPrompt => {
draw_popup( draw_popup(f, app, draw_tasks_popup, Size::Large)
f, }
app, ActiveRadarrBlock::SystemQueuedEvents => {
draw_tasks_popup, draw_popup(f, app, draw_queued_events, Size::Medium)
Size::Large,
)
} }
ActiveRadarrBlock::SystemQueuedEvents => draw_popup(
f,
app,
draw_queued_events,
Size::Medium,
),
ActiveRadarrBlock::SystemUpdates => { ActiveRadarrBlock::SystemUpdates => {
draw_updates_popup(f, app); draw_updates_popup(f, app);
} }
+1 -6
View File
@@ -34,12 +34,7 @@ impl DrawUi for EditIndexerUi {
} }
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
draw_popup( draw_popup(f, app, draw_edit_indexer_prompt, Size::WideLargePrompt);
f,
app,
draw_edit_indexer_prompt,
Size::WideLargePrompt,
);
} }
} }
@@ -34,12 +34,7 @@ impl DrawUi for IndexerSettingsUi {
} }
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
draw_popup( draw_popup(f, app, draw_edit_indexer_settings_prompt, Size::LargePrompt);
f,
app,
draw_edit_indexer_settings_prompt,
Size::LargePrompt,
);
} }
} }
+8 -3
View File
@@ -57,11 +57,16 @@ impl DrawUi for IndexersUi {
app.is_loading || app.data.sonarr_data.indexer_test_errors.is_none(), app.is_loading || app.data.sonarr_data.indexer_test_errors.is_none(),
title_block("Testing Indexer"), title_block("Testing Indexer"),
)) ))
.size(Size::LargeMessage); .size(Size::LargeMessage);
f.render_widget(loading_popup, f.area()); f.render_widget(loading_popup, f.area());
} else { } else {
let popup = { let popup = {
let result = app.data.sonarr_data.indexer_test_errors.as_ref().expect("Test result is unpopulated"); let result = app
.data
.sonarr_data
.indexer_test_errors
.as_ref()
.expect("Test result is unpopulated");
if !result.is_empty() { if !result.is_empty() {
Popup::new(Message::new(result.clone())).size(Size::LargeMessage) Popup::new(Message::new(result.clone())).size(Size::LargeMessage)
@@ -99,7 +104,7 @@ impl DrawUi for IndexersUi {
); );
} }
_ => (), _ => (),
} },
_ => (), _ => (),
} }
} }
@@ -28,12 +28,7 @@ impl DrawUi for TestAllIndexersUi {
} }
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
draw_popup( draw_popup(f, app, draw_test_all_indexers_test_results, Size::Large);
f,
app,
draw_test_all_indexers_test_results,
Size::Large,
);
} }
} }
+14 -15
View File
@@ -49,23 +49,22 @@ impl DrawUi for EditSeriesUi {
} }
} }
let draw_edit_series_prompt = let draw_edit_series_prompt = |f: &mut Frame<'_>, app: &mut App<'_>, prompt_area: Rect| {
|f: &mut Frame<'_>, app: &mut App<'_>, prompt_area: Rect| { draw_edit_series_confirmation_prompt(f, app, prompt_area);
draw_edit_series_confirmation_prompt(f, app, prompt_area);
match active_sonarr_block { match active_sonarr_block {
ActiveSonarrBlock::EditSeriesSelectSeriesType => { ActiveSonarrBlock::EditSeriesSelectSeriesType => {
draw_edit_series_select_series_type_popup(f, app); draw_edit_series_select_series_type_popup(f, app);
}
ActiveSonarrBlock::EditSeriesSelectQualityProfile => {
draw_edit_series_select_quality_profile_popup(f, app);
}
ActiveSonarrBlock::EditSeriesSelectLanguageProfile => {
draw_edit_series_select_language_profile_popup(f, app);
}
_ => (),
} }
}; ActiveSonarrBlock::EditSeriesSelectQualityProfile => {
draw_edit_series_select_quality_profile_popup(f, app);
}
ActiveSonarrBlock::EditSeriesSelectLanguageProfile => {
draw_edit_series_select_language_profile_popup(f, app);
}
_ => (),
}
};
draw_popup(f, app, draw_edit_series_prompt, Size::Long); draw_popup(f, app, draw_edit_series_prompt, Size::Long);
} }
@@ -1,18 +1,20 @@
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS}; use crate::models::servarr_data::sonarr::sonarr_data::{
use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi; ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS,
use crate::ui::DrawUi; };
use strum::IntoEnumIterator; use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi;
use crate::ui::DrawUi;
use strum::IntoEnumIterator;
#[test] #[test]
fn test_episode_details_ui_accepts() { fn test_episode_details_ui_accepts() {
ActiveSonarrBlock::iter().for_each(|active_sonarr_block| { ActiveSonarrBlock::iter().for_each(|active_sonarr_block| {
if EPISODE_DETAILS_BLOCKS.contains(&active_sonarr_block) { if EPISODE_DETAILS_BLOCKS.contains(&active_sonarr_block) {
assert!(EpisodeDetailsUi::accepts(active_sonarr_block.into())); assert!(EpisodeDetailsUi::accepts(active_sonarr_block.into()));
} else { } else {
assert!(!EpisodeDetailsUi::accepts(active_sonarr_block.into())); assert!(!EpisodeDetailsUi::accepts(active_sonarr_block.into()));
} }
}); });
} }
} }
@@ -1,22 +1,24 @@
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS}; use crate::models::servarr_data::sonarr::sonarr_data::{
use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi; ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS,
use crate::ui::DrawUi; };
use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi;
use crate::ui::DrawUi;
#[test] #[test]
fn test_season_details_ui_accepts() { fn test_season_details_ui_accepts() {
let mut blocks = SEASON_DETAILS_BLOCKS.clone().to_vec(); let mut blocks = SEASON_DETAILS_BLOCKS.clone().to_vec();
blocks.extend(EPISODE_DETAILS_BLOCKS); blocks.extend(EPISODE_DETAILS_BLOCKS);
ActiveSonarrBlock::iter().for_each(|active_sonarr_block| { ActiveSonarrBlock::iter().for_each(|active_sonarr_block| {
if blocks.contains(&active_sonarr_block) { if blocks.contains(&active_sonarr_block) {
assert!(SeasonDetailsUi::accepts(active_sonarr_block.into())); assert!(SeasonDetailsUi::accepts(active_sonarr_block.into()));
} else { } else {
assert!(!SeasonDetailsUi::accepts(active_sonarr_block.into())); assert!(!SeasonDetailsUi::accepts(active_sonarr_block.into()));
} }
}); });
} }
} }
@@ -2,7 +2,9 @@
mod tests { mod tests {
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS}; use crate::models::servarr_data::sonarr::sonarr_data::{
ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS,
};
use crate::ui::sonarr_ui::library::series_details_ui::SeriesDetailsUi; use crate::ui::sonarr_ui::library::series_details_ui::SeriesDetailsUi;
use crate::ui::DrawUi; use crate::ui::DrawUi;
+3 -6
View File
@@ -34,12 +34,9 @@ impl DrawUi for RootFoldersUi {
draw_root_folders(f, app, area); draw_root_folders(f, app, area);
match active_sonarr_block { match active_sonarr_block {
ActiveSonarrBlock::AddRootFolderPrompt => draw_popup( ActiveSonarrBlock::AddRootFolderPrompt => {
f, draw_popup(f, app, draw_add_root_folder_prompt_box, Size::InputBox)
app, }
draw_add_root_folder_prompt_box,
Size::InputBox,
),
ActiveSonarrBlock::DeleteRootFolderPrompt => { ActiveSonarrBlock::DeleteRootFolderPrompt => {
let prompt = format!( let prompt = format!(
"Do you really want to delete this root folder: \n{}?", "Do you really want to delete this root folder: \n{}?",
+5 -14
View File
@@ -10,8 +10,7 @@ use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SYSTEM
use crate::models::sonarr_models::SonarrTask; use crate::models::sonarr_models::SonarrTask;
use crate::models::Route; use crate::models::Route;
use crate::ui::sonarr_ui::system::{ use crate::ui::sonarr_ui::system::{
draw_queued_events, extract_task_props, TASK_TABLE_CONSTRAINTS, draw_queued_events, extract_task_props, TASK_TABLE_CONSTRAINTS, TASK_TABLE_HEADERS,
TASK_TABLE_HEADERS,
}; };
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{borderless_block, style_log_list_item, title_block}; use crate::ui::utils::{borderless_block, style_log_list_item, title_block};
@@ -44,19 +43,11 @@ impl DrawUi for SystemDetailsUi {
draw_logs_popup(f, app); draw_logs_popup(f, app);
} }
ActiveSonarrBlock::SystemTasks | ActiveSonarrBlock::SystemTaskStartConfirmPrompt => { ActiveSonarrBlock::SystemTasks | ActiveSonarrBlock::SystemTaskStartConfirmPrompt => {
draw_popup( draw_popup(f, app, draw_tasks_popup, Size::Large)
f, }
app, ActiveSonarrBlock::SystemQueuedEvents => {
draw_tasks_popup, draw_popup(f, app, draw_queued_events, Size::Medium)
Size::Large,
)
} }
ActiveSonarrBlock::SystemQueuedEvents => draw_popup(
f,
app,
draw_queued_events,
Size::Medium,
),
ActiveSonarrBlock::SystemUpdates => { ActiveSonarrBlock::SystemUpdates => {
draw_updates_popup(f, app); draw_updates_popup(f, app);
} }
+1 -4
View File
@@ -20,10 +20,7 @@ mod test {
#[test] #[test]
fn test_style_indeterminate() { fn test_style_indeterminate() {
assert_eq!( assert_eq!(Style::new().indeterminate(), Style::new().fg(COLOR_ORANGE));
Style::new().indeterminate(),
Style::new().fg(COLOR_ORANGE)
);
} }
#[test] #[test]
+6 -1
View File
@@ -1,12 +1,17 @@
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use crate::ui::utils::{
borderless_block, centered_rect, convert_to_minutes_hours_days, decorate_peer_style,
get_width_from_percentage, layout_block, layout_block_bottom_border, layout_block_top_border,
layout_block_top_border_with_title, layout_block_with_title, logo_block, style_block_highlight,
style_log_list_item, title_block, title_block_centered, title_style,
};
use pretty_assertions::{assert_eq, assert_str_eq}; use pretty_assertions::{assert_eq, assert_str_eq};
use ratatui::layout::{Alignment, Rect}; use ratatui::layout::{Alignment, Rect};
use ratatui::style::{Color, Modifier, Style, Stylize}; use ratatui::style::{Color, Modifier, Style, Stylize};
use ratatui::text::{Span, Text}; use ratatui::text::{Span, Text};
use ratatui::widgets::{Block, BorderType, Borders, ListItem}; use ratatui::widgets::{Block, BorderType, Borders, ListItem};
use rstest::rstest; use rstest::rstest;
use crate::ui::utils::{borderless_block, centered_rect, convert_to_minutes_hours_days, decorate_peer_style, get_width_from_percentage, layout_block, layout_block_bottom_border, layout_block_top_border, layout_block_top_border_with_title, layout_block_with_title, logo_block, style_block_highlight, style_log_list_item, title_block, title_block_centered, title_style};
#[test] #[test]
fn test_layout_block() { fn test_layout_block() {
+1 -1
View File
@@ -1,6 +1,6 @@
use derive_setters::Setters;
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{borderless_block, layout_block, style_block_highlight}; use crate::ui::utils::{borderless_block, layout_block, style_block_highlight};
use derive_setters::Setters;
use ratatui::buffer::Buffer; use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::prelude::Text; use ratatui::prelude::Text;
+1 -1
View File
@@ -3,12 +3,12 @@ use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{layout_paragraph_borderless, title_block_centered}; use crate::ui::utils::{layout_paragraph_borderless, title_block_centered};
use crate::ui::widgets::button::Button; use crate::ui::widgets::button::Button;
use crate::ui::widgets::checkbox::Checkbox; use crate::ui::widgets::checkbox::Checkbox;
use derive_setters::Setters;
use ratatui::buffer::Buffer; use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Flex, Layout, Rect}; use ratatui::layout::{Constraint, Flex, Layout, Rect};
use ratatui::text::Text; use ratatui::text::Text;
use ratatui::widgets::{Paragraph, Widget}; use ratatui::widgets::{Paragraph, Widget};
use std::iter; use std::iter;
use derive_setters::Setters;
#[cfg(test)] #[cfg(test)]
#[path = "confirmation_prompt_tests.rs"] #[path = "confirmation_prompt_tests.rs"]
+4 -4
View File
@@ -1,3 +1,6 @@
use super::input_box_popup::InputBoxPopup;
use super::message::Message;
use super::popup::Size;
use crate::models::stateful_table::StatefulTable; use crate::models::stateful_table::StatefulTable;
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{centered_rect, layout_block_top_border, title_block_centered}; use crate::ui::utils::{centered_rect, layout_block_top_border, title_block_centered};
@@ -5,6 +8,7 @@ use crate::ui::widgets::loading_block::LoadingBlock;
use crate::ui::widgets::popup::Popup; use crate::ui::widgets::popup::Popup;
use crate::ui::widgets::selectable_list::SelectableList; use crate::ui::widgets::selectable_list::SelectableList;
use crate::ui::HIGHLIGHT_SYMBOL; use crate::ui::HIGHLIGHT_SYMBOL;
use derive_setters::Setters;
use ratatui::buffer::Buffer; use ratatui::buffer::Buffer;
use ratatui::layout::{Alignment, Constraint, Layout, Position, Rect}; use ratatui::layout::{Alignment, Constraint, Layout, Position, Rect};
use ratatui::prelude::{Style, Stylize, Text}; use ratatui::prelude::{Style, Stylize, Text};
@@ -12,10 +16,6 @@ use ratatui::widgets::{Block, ListItem, Paragraph, Row, StatefulWidget, Table, W
use ratatui::Frame; use ratatui::Frame;
use std::fmt::Debug; use std::fmt::Debug;
use std::sync::atomic::Ordering; use std::sync::atomic::Ordering;
use derive_setters::Setters;
use super::input_box_popup::InputBoxPopup;
use super::message::Message;
use super::popup::Size;
#[cfg(test)] #[cfg(test)]
#[path = "managarr_table_tests.rs"] #[path = "managarr_table_tests.rs"]
+1 -1
View File
@@ -2,9 +2,9 @@ pub(super) mod button;
pub(super) mod checkbox; pub(super) mod checkbox;
pub(super) mod confirmation_prompt; pub(super) mod confirmation_prompt;
pub(super) mod input_box; pub(super) mod input_box;
mod input_box_popup;
pub(super) mod loading_block; pub(super) mod loading_block;
pub(super) mod managarr_table; pub(super) mod managarr_table;
pub(super) mod message; pub(super) mod message;
pub(super) mod popup; pub(super) mod popup;
pub(super) mod selectable_list; pub(super) mod selectable_list;
mod input_box_popup;