fix(style): Addressed linter complaints on formatting
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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)?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -342,8 +342,10 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler
|
|||||||
self.app.data.sonarr_data.prompt_confirm = true;
|
self.app.data.sonarr_data.prompt_confirm = true;
|
||||||
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 -> bool {
|
fn [<handle_ $name _table_scroll_up>](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool {
|
||||||
use $crate::models::Scrollable;
|
use $crate::models::Scrollable;
|
||||||
|
|
||||||
match $self.app.get_current_route() {
|
match $self.app.get_current_route() {
|
||||||
_ if config.table_block == $self.app.get_current_route() => {
|
_ if config.table_block == $self.app.get_current_route() => {
|
||||||
$table.scroll_up();
|
$table.scroll_up();
|
||||||
@@ -96,7 +96,7 @@ macro_rules! handle_table_events {
|
|||||||
|
|
||||||
fn [<handle_ $name _table_scroll_down>](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool {
|
fn [<handle_ $name _table_scroll_down>](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool {
|
||||||
use $crate::models::Scrollable;
|
use $crate::models::Scrollable;
|
||||||
|
|
||||||
match $self.app.get_current_route() {
|
match $self.app.get_current_route() {
|
||||||
_ if config.table_block == $self.app.get_current_route() => {
|
_ if config.table_block == $self.app.get_current_route() => {
|
||||||
$table.scroll_down();
|
$table.scroll_down();
|
||||||
@@ -118,7 +118,7 @@ macro_rules! handle_table_events {
|
|||||||
|
|
||||||
fn [<handle_ $name _table_home>](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool {
|
fn [<handle_ $name _table_home>](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool {
|
||||||
use $crate::models::Scrollable;
|
use $crate::models::Scrollable;
|
||||||
|
|
||||||
match $self.app.get_current_route() {
|
match $self.app.get_current_route() {
|
||||||
_ if config.table_block == $self.app.get_current_route() => {
|
_ if config.table_block == $self.app.get_current_route() => {
|
||||||
$table.scroll_to_top();
|
$table.scroll_to_top();
|
||||||
@@ -160,7 +160,7 @@ macro_rules! handle_table_events {
|
|||||||
|
|
||||||
fn [<handle_ $name _table_end>](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool {
|
fn [<handle_ $name _table_end>](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool {
|
||||||
use $crate::models::Scrollable;
|
use $crate::models::Scrollable;
|
||||||
|
|
||||||
match $self.app.get_current_route() {
|
match $self.app.get_current_route() {
|
||||||
_ if config.table_block == $self.app.get_current_route() => {
|
_ if config.table_block == $self.app.get_current_route() => {
|
||||||
$table.scroll_to_bottom();
|
$table.scroll_to_bottom();
|
||||||
|
|||||||
@@ -37,10 +37,10 @@ mod tests {
|
|||||||
match self.active_radarr_block {
|
match self.active_radarr_block {
|
||||||
ActiveRadarrBlock::MovieDetails => {
|
ActiveRadarrBlock::MovieDetails => {
|
||||||
self.handle_movies_table_events(minimal_movie_table_handling_config);
|
self.handle_movies_table_events(minimal_movie_table_handling_config);
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
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
|
||||||
|
|||||||
@@ -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)),
|
||||||
},
|
},
|
||||||
]),
|
]),
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ mod tests {
|
|||||||
|
|
||||||
use crate::app::context_clues::build_context_clue_string;
|
use crate::app::context_clues::build_context_clue_string;
|
||||||
use crate::app::sonarr::sonarr_context_clues::{
|
use crate::app::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_SEASON_SEARCH_CONTEXT_CLUES,
|
MANUAL_EPISODE_SEARCH_CONTEXT_CLUES, MANUAL_SEASON_SEARCH_CONTEXT_CLUES,
|
||||||
SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES, SEASON_DETAILS_CONTEXT_CLUES,
|
SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES, SEASON_DETAILS_CONTEXT_CLUES,
|
||||||
SEASON_HISTORY_CONTEXT_CLUES,
|
SEASON_HISTORY_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
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ impl DrawUi for BlocklistUi {
|
|||||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
if let Route::Radarr(active_radarr_block, _) = app.get_current_route() {
|
if let Route::Radarr(active_radarr_block, _) = app.get_current_route() {
|
||||||
draw_blocklist_table(f, app, area);
|
draw_blocklist_table(f, app, area);
|
||||||
|
|
||||||
match active_radarr_block {
|
match active_radarr_block {
|
||||||
ActiveRadarrBlock::BlocklistItemDetails => {
|
ActiveRadarrBlock::BlocklistItemDetails => {
|
||||||
draw_blocklist_item_details_popup(f, app);
|
draw_blocklist_item_details_popup(f, app);
|
||||||
|
|||||||
@@ -17,7 +17,13 @@ mod tests {
|
|||||||
assert!(!CollectionDetailsUi::accepts(active_radarr_block.into()));
|
assert!(!CollectionDetailsUi::accepts(active_radarr_block.into()));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
assert!(CollectionDetailsUi::accepts((ActiveRadarrBlock::CollectionDetails, Some(ActiveRadarrBlock::CollectionDetails)).into()));
|
assert!(CollectionDetailsUi::accepts(
|
||||||
|
(
|
||||||
|
ActiveRadarrBlock::CollectionDetails,
|
||||||
|
Some(ActiveRadarrBlock::CollectionDetails)
|
||||||
|
)
|
||||||
|
.into()
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ impl DrawUi for EditCollectionUi {
|
|||||||
return EDIT_COLLECTION_BLOCKS.contains(&active_radarr_block)
|
return EDIT_COLLECTION_BLOCKS.contains(&active_radarr_block)
|
||||||
&& context == ActiveRadarrBlock::CollectionDetails;
|
&& context == ActiveRadarrBlock::CollectionDetails;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EDIT_COLLECTION_BLOCKS.contains(&active_radarr_block);
|
return EDIT_COLLECTION_BLOCKS.contains(&active_radarr_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
assert!(EditCollectionUi::accepts((ActiveRadarrBlock::EditCollectionPrompt, Some(ActiveRadarrBlock::CollectionDetails)).into()));
|
assert!(EditCollectionUi::accepts(
|
||||||
|
(
|
||||||
|
ActiveRadarrBlock::EditCollectionPrompt,
|
||||||
|
Some(ActiveRadarrBlock::CollectionDetails)
|
||||||
|
)
|
||||||
|
.into()
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ impl DrawUi for DownloadsUi {
|
|||||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
if let Route::Radarr(active_radarr_block, _) = app.get_current_route() {
|
if let Route::Radarr(active_radarr_block, _) = app.get_current_route() {
|
||||||
draw_downloads(f, app, area);
|
draw_downloads(f, app, area);
|
||||||
|
|
||||||
match active_radarr_block {
|
match active_radarr_block {
|
||||||
ActiveRadarrBlock::DeleteDownloadPrompt => {
|
ActiveRadarrBlock::DeleteDownloadPrompt => {
|
||||||
let prompt = format!(
|
let prompt = format!(
|
||||||
|
|||||||
@@ -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,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,8 +61,13 @@ 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)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ impl DrawUi for EditMovieUi {
|
|||||||
draw_popup(f, app, MovieDetailsUi::draw, Size::Large);
|
draw_popup(f, app, MovieDetailsUi::draw, Size::Large);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
draw_popup(f, app, draw_edit_movie_confirmation_prompt, Size::Medium);
|
draw_popup(f, app, draw_edit_movie_confirmation_prompt, Size::Medium);
|
||||||
|
|
||||||
match active_radarr_block {
|
match active_radarr_block {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -32,14 +32,11 @@ impl DrawUi for RootFoldersUi {
|
|||||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
if let Route::Radarr(active_radarr_block, _) = app.get_current_route() {
|
if let Route::Radarr(active_radarr_block, _) = app.get_current_route() {
|
||||||
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{}?",
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ impl DrawUi for SystemUi {
|
|||||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
let route = app.get_current_route();
|
let route = app.get_current_route();
|
||||||
draw_system_ui_layout(f, app, area);
|
draw_system_ui_layout(f, app, area);
|
||||||
|
|
||||||
if SystemDetailsUi::accepts(route) {
|
if SystemDetailsUi::accepts(route) {
|
||||||
SystemDetailsUi::draw(f, app, area);
|
SystemDetailsUi::draw(f, app, area);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ impl DrawUi for BlocklistUi {
|
|||||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
if let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() {
|
if let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() {
|
||||||
draw_blocklist_table(f, app, area);
|
draw_blocklist_table(f, app, area);
|
||||||
|
|
||||||
match active_sonarr_block {
|
match active_sonarr_block {
|
||||||
ActiveSonarrBlock::BlocklistItemDetails => {
|
ActiveSonarrBlock::BlocklistItemDetails => {
|
||||||
draw_blocklist_item_details_popup(f, app);
|
draw_blocklist_item_details_popup(f, app);
|
||||||
|
|||||||
@@ -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,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ impl DrawUi for AddSeriesUi {
|
|||||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
|
||||||
if let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() {
|
if let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() {
|
||||||
draw_popup(f, app, draw_add_series_search, Size::Large);
|
draw_popup(f, app, draw_add_series_search, Size::Large);
|
||||||
|
|
||||||
match active_sonarr_block {
|
match active_sonarr_block {
|
||||||
ActiveSonarrBlock::AddSeriesPrompt
|
ActiveSonarrBlock::AddSeriesPrompt
|
||||||
| ActiveSonarrBlock::AddSeriesSelectMonitor
|
| ActiveSonarrBlock::AddSeriesSelectMonitor
|
||||||
|
|||||||
@@ -48,24 +48,23 @@ impl DrawUi for EditSeriesUi {
|
|||||||
draw_popup(f, app, SeriesDetailsUi::draw, Size::Large);
|
draw_popup(f, app, SeriesDetailsUi::draw, Size::Large);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
@@ -11,7 +13,7 @@ mod tests {
|
|||||||
let mut blocks = SERIES_DETAILS_BLOCKS.clone().to_vec();
|
let mut blocks = SERIES_DETAILS_BLOCKS.clone().to_vec();
|
||||||
blocks.extend(SEASON_DETAILS_BLOCKS);
|
blocks.extend(SEASON_DETAILS_BLOCKS);
|
||||||
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!(SeriesDetailsUi::accepts(active_sonarr_block.into()));
|
assert!(SeriesDetailsUi::accepts(active_sonarr_block.into()));
|
||||||
|
|||||||
@@ -32,14 +32,11 @@ impl DrawUi for RootFoldersUi {
|
|||||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
if let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() {
|
if let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() {
|
||||||
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{}?",
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ impl DrawUi for SystemUi {
|
|||||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||||
let route = app.get_current_route();
|
let route = app.get_current_route();
|
||||||
draw_system_ui_layout(f, app, area);
|
draw_system_ui_layout(f, app, area);
|
||||||
|
|
||||||
if SystemDetailsUi::accepts(route) {
|
if SystemDetailsUi::accepts(route) {
|
||||||
SystemDetailsUi::draw(f, app, area);
|
SystemDetailsUi::draw(f, app, area);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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,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;
|
||||||
|
|||||||
@@ -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"]
|
||||||
|
|||||||
@@ -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"]
|
||||||
|
|||||||
@@ -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;
|
|
||||||
|
|||||||
Reference in New Issue
Block a user