refactor(ui): Tweaked some of the color schemes in the series table

This commit is contained in:
2024-12-13 13:10:57 -07:00
parent 39f8ad2106
commit 98619664cf
6 changed files with 60 additions and 47 deletions
-6
View File
@@ -65,12 +65,6 @@ impl<'a> App<'a> {
} }
} }
ActiveSonarrBlock::EpisodeDetails | ActiveSonarrBlock::EpisodeFile => { ActiveSonarrBlock::EpisodeDetails | ActiveSonarrBlock::EpisodeFile => {
self
.dispatch_network_event(SonarrEvent::GetEpisodes(None).into())
.await;
self
.dispatch_network_event(SonarrEvent::GetDownloads.into())
.await;
self self
.dispatch_network_event(SonarrEvent::GetEpisodeDetails(None).into()) .dispatch_network_event(SonarrEvent::GetEpisodeDetails(None).into())
.await; .await;
-16
View File
@@ -176,14 +176,6 @@ mod tests {
.await; .await;
assert!(app.is_loading); assert!(app.is_loading);
assert_eq!(
sync_network_rx.recv().await.unwrap(),
SonarrEvent::GetEpisodes(None).into()
);
assert_eq!(
sync_network_rx.recv().await.unwrap(),
SonarrEvent::GetDownloads.into()
);
assert_eq!( assert_eq!(
sync_network_rx.recv().await.unwrap(), sync_network_rx.recv().await.unwrap(),
SonarrEvent::GetEpisodeDetails(None).into() SonarrEvent::GetEpisodeDetails(None).into()
@@ -201,14 +193,6 @@ mod tests {
.await; .await;
assert!(app.is_loading); assert!(app.is_loading);
assert_eq!(
sync_network_rx.recv().await.unwrap(),
SonarrEvent::GetEpisodes(None).into()
);
assert_eq!(
sync_network_rx.recv().await.unwrap(),
SonarrEvent::GetDownloads.into()
);
assert_eq!( assert_eq!(
sync_network_rx.recv().await.unwrap(), sync_network_rx.recv().await.unwrap(),
SonarrEvent::GetEpisodeDetails(None).into() SonarrEvent::GetEpisodeDetails(None).into()
@@ -226,7 +226,7 @@ fn draw_file_info(f: &mut Frame<'_>, app: &App<'_>, area: Rect) {
f.render_widget(video_details_title_paragraph, video_details_title_area); f.render_widget(video_details_title_paragraph, video_details_title_area);
f.render_widget(video_details_paragraph, video_details_area); f.render_widget(video_details_paragraph, video_details_area);
} }
_ => (), _ => f.render_widget(layout_block_top_border(), area),
}, },
_ => f.render_widget( _ => f.render_widget(
LoadingBlock::new(app.is_loading, layout_block_top_border()), LoadingBlock::new(app.is_loading, layout_block_top_border()),
+34 -13
View File
@@ -1,6 +1,9 @@
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, EPISODE_DETAILS_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, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS,
};
use crate::models::{ use crate::models::{
servarr_data::sonarr::sonarr_data::LIBRARY_BLOCKS, sonarr_models::SeriesStatus, servarr_data::sonarr::sonarr_data::LIBRARY_BLOCKS, sonarr_models::SeriesStatus,
}; };
@@ -36,14 +39,24 @@ mod tests {
}); });
} }
#[test]
fn test_decorate_row_with_style_unmonitored() {
let series = Series::default();
let row = Row::new(vec![Cell::from("test".to_owned())]);
let style = decorate_series_row_with_style(&series, row.clone());
assert_eq!(style, row.unmonitored());
}
#[test] #[test]
fn test_decorate_row_with_style_downloaded_when_ended_and_all_monitored_episodes_are_present() { fn test_decorate_row_with_style_downloaded_when_ended_and_all_monitored_episodes_are_present() {
let seasons = vec![ let seasons = vec![
Season { Season {
monitored: false, monitored: false,
statistics: SeasonStatistics { statistics: SeasonStatistics {
episode_count: 1, episode_file_count: 1,
total_episode_count: 3, episode_count: 3,
..SeasonStatistics::default() ..SeasonStatistics::default()
}, },
..Season::default() ..Season::default()
@@ -51,14 +64,15 @@ mod tests {
Season { Season {
monitored: true, monitored: true,
statistics: SeasonStatistics { statistics: SeasonStatistics {
episode_file_count: 3,
episode_count: 3, episode_count: 3,
total_episode_count: 3,
..SeasonStatistics::default() ..SeasonStatistics::default()
}, },
..Season::default() ..Season::default()
}, },
]; ];
let series = Series { let series = Series {
monitored: true,
status: SeriesStatus::Ended, status: SeriesStatus::Ended,
seasons: Some(seasons), seasons: Some(seasons),
..Series::default() ..Series::default()
@@ -76,8 +90,8 @@ mod tests {
Season { Season {
monitored: true, monitored: true,
statistics: SeasonStatistics { statistics: SeasonStatistics {
episode_count: 1, episode_file_count: 1,
total_episode_count: 3, episode_count: 3,
..SeasonStatistics::default() ..SeasonStatistics::default()
}, },
..Season::default() ..Season::default()
@@ -85,14 +99,15 @@ mod tests {
Season { Season {
monitored: true, monitored: true,
statistics: SeasonStatistics { statistics: SeasonStatistics {
episode_file_count: 3,
episode_count: 3, episode_count: 3,
total_episode_count: 3,
..SeasonStatistics::default() ..SeasonStatistics::default()
}, },
..Season::default() ..Season::default()
}, },
]; ];
let series = Series { let series = Series {
monitored: true,
status: SeriesStatus::Ended, status: SeriesStatus::Ended,
seasons: Some(seasons), seasons: Some(seasons),
..Series::default() ..Series::default()
@@ -107,6 +122,7 @@ mod tests {
#[test] #[test]
fn test_decorate_row_with_style_indeterminate_when_ended_and_seasons_is_empty() { fn test_decorate_row_with_style_indeterminate_when_ended_and_seasons_is_empty() {
let series = Series { let series = Series {
monitored: true,
status: SeriesStatus::Ended, status: SeriesStatus::Ended,
..Series::default() ..Series::default()
}; };
@@ -124,8 +140,8 @@ mod tests {
Season { Season {
monitored: false, monitored: false,
statistics: SeasonStatistics { statistics: SeasonStatistics {
episode_count: 1, episode_file_count: 1,
total_episode_count: 3, episode_count: 3,
..SeasonStatistics::default() ..SeasonStatistics::default()
}, },
..Season::default() ..Season::default()
@@ -133,14 +149,15 @@ mod tests {
Season { Season {
monitored: true, monitored: true,
statistics: SeasonStatistics { statistics: SeasonStatistics {
episode_file_count: 3,
episode_count: 3, episode_count: 3,
total_episode_count: 3,
..SeasonStatistics::default() ..SeasonStatistics::default()
}, },
..Season::default() ..Season::default()
}, },
]; ];
let series = Series { let series = Series {
monitored: true,
status: SeriesStatus::Continuing, status: SeriesStatus::Continuing,
seasons: Some(seasons), seasons: Some(seasons),
..Series::default() ..Series::default()
@@ -158,8 +175,8 @@ mod tests {
Season { Season {
monitored: true, monitored: true,
statistics: SeasonStatistics { statistics: SeasonStatistics {
episode_count: 1, episode_file_count: 1,
total_episode_count: 3, episode_count: 3,
..SeasonStatistics::default() ..SeasonStatistics::default()
}, },
..Season::default() ..Season::default()
@@ -167,14 +184,15 @@ mod tests {
Season { Season {
monitored: true, monitored: true,
statistics: SeasonStatistics { statistics: SeasonStatistics {
episode_file_count: 3,
episode_count: 3, episode_count: 3,
total_episode_count: 3,
..SeasonStatistics::default() ..SeasonStatistics::default()
}, },
..Season::default() ..Season::default()
}, },
]; ];
let series = Series { let series = Series {
monitored: true,
status: SeriesStatus::Continuing, status: SeriesStatus::Continuing,
seasons: Some(seasons), seasons: Some(seasons),
..Series::default() ..Series::default()
@@ -189,6 +207,7 @@ mod tests {
#[test] #[test]
fn test_decorate_row_with_style_indeterminate_when_continuing_and_seasons_is_empty() { fn test_decorate_row_with_style_indeterminate_when_continuing_and_seasons_is_empty() {
let series = Series { let series = Series {
monitored: true,
status: SeriesStatus::Continuing, status: SeriesStatus::Continuing,
..Series::default() ..Series::default()
}; };
@@ -202,6 +221,7 @@ mod tests {
#[test] #[test]
fn test_decorate_row_with_style_unreleased_when_upcoming() { fn test_decorate_row_with_style_unreleased_when_upcoming() {
let series = Series { let series = Series {
monitored: true,
status: SeriesStatus::Upcoming, status: SeriesStatus::Upcoming,
..Series::default() ..Series::default()
}; };
@@ -215,6 +235,7 @@ mod tests {
#[test] #[test]
fn test_decorate_row_with_style_defaults_to_indeterminate() { fn test_decorate_row_with_style_defaults_to_indeterminate() {
let series = Series { let series = Series {
monitored: true,
status: SeriesStatus::Deleted, status: SeriesStatus::Deleted,
..Series::default() ..Series::default()
}; };
+10 -6
View File
@@ -32,11 +32,11 @@ mod delete_series_ui;
mod edit_series_ui; mod edit_series_ui;
mod series_details_ui; mod series_details_ui;
mod episode_details_ui;
#[cfg(test)] #[cfg(test)]
#[path = "library_ui_tests.rs"] #[path = "library_ui_tests.rs"]
mod library_ui_tests; mod library_ui_tests;
mod season_details_ui; mod season_details_ui;
mod episode_details_ui;
pub(super) struct LibraryUi; pub(super) struct LibraryUi;
@@ -192,20 +192,24 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
} }
fn decorate_series_row_with_style<'a>(series: &Series, row: Row<'a>) -> Row<'a> { fn decorate_series_row_with_style<'a>(series: &Series, row: Row<'a>) -> Row<'a> {
if !series.monitored {
return row.unmonitored();
}
match series.status { match series.status {
SeriesStatus::Ended => { SeriesStatus::Ended => {
if let Some(ref seasons) = series.seasons { if let Some(ref seasons) = series.seasons {
return if seasons return if seasons
.iter() .iter()
.filter(|season| season.monitored) .filter(|season| season.monitored)
.all(|season| season.statistics.episode_count == season.statistics.total_episode_count) .all(|season| season.statistics.episode_file_count == season.statistics.episode_count)
{ {
row.downloaded() row.downloaded()
} else { } else {
row.missing() row.missing()
} };
} }
row.indeterminate() row.indeterminate()
} }
SeriesStatus::Continuing => { SeriesStatus::Continuing => {
@@ -213,7 +217,7 @@ fn decorate_series_row_with_style<'a>(series: &Series, row: Row<'a>) -> Row<'a>
return if seasons return if seasons
.iter() .iter()
.filter(|season| season.monitored) .filter(|season| season.monitored)
.all(|season| season.statistics.episode_count == season.statistics.total_episode_count) .all(|season| season.statistics.episode_file_count == season.statistics.episode_count)
{ {
row.unreleased() row.unreleased()
} else { } else {
+15 -5
View File
@@ -1,3 +1,4 @@
use chrono::Utc;
use deunicode::deunicode; use deunicode::deunicode;
use ratatui::layout::{Alignment, Constraint, Layout, Rect}; use ratatui::layout::{Alignment, Constraint, Layout, Rect};
use ratatui::style::{Style, Stylize}; use ratatui::style::{Style, Stylize};
@@ -12,6 +13,7 @@ use crate::models::sonarr_models::{
Season, SeasonStatistics, SonarrHistoryEventType, SonarrHistoryItem, Season, SeasonStatistics, SonarrHistoryEventType, SonarrHistoryItem,
}; };
use crate::models::{EnumDisplayStyle, Route}; use crate::models::{EnumDisplayStyle, Route};
use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi;
use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi; use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi;
use crate::ui::sonarr_ui::sonarr_ui_utils::{ use crate::ui::sonarr_ui::sonarr_ui_utils::{
create_download_failed_history_event_details, create_download_failed_history_event_details,
@@ -30,7 +32,6 @@ use crate::ui::widgets::managarr_table::ManagarrTable;
use crate::ui::widgets::message::Message; use crate::ui::widgets::message::Message;
use crate::ui::widgets::popup::{Popup, Size}; use crate::ui::widgets::popup::{Popup, Size};
use crate::ui::{draw_popup, draw_tabs, DrawUi}; use crate::ui::{draw_popup, draw_tabs, DrawUi};
use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi;
use crate::utils::convert_to_gb; use crate::utils::convert_to_gb;
#[cfg(test)] #[cfg(test)]
@@ -42,7 +43,9 @@ pub(super) struct SeriesDetailsUi;
impl DrawUi for SeriesDetailsUi { impl DrawUi for SeriesDetailsUi {
fn accepts(route: Route) -> bool { fn accepts(route: Route) -> bool {
if let Route::Sonarr(active_sonarr_block, _) = route { if let Route::Sonarr(active_sonarr_block, _) = route {
return SeasonDetailsUi::accepts(route) || EpisodeDetailsUi::accepts(route) || SERIES_DETAILS_BLOCKS.contains(&active_sonarr_block); return SeasonDetailsUi::accepts(route)
|| EpisodeDetailsUi::accepts(route)
|| SERIES_DETAILS_BLOCKS.contains(&active_sonarr_block);
} }
false false
@@ -239,9 +242,10 @@ fn draw_seasons_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
.. ..
} = season; } = season;
let SeasonStatistics { let SeasonStatistics {
episode_file_count,
episode_count, episode_count,
total_episode_count,
size_on_disk, size_on_disk,
next_airing,
.. ..
} = statistics; } = statistics;
let season_monitored = if season.monitored { "🏷" } else { "" }; let season_monitored = if season.monitored { "🏷" } else { "" };
@@ -250,13 +254,19 @@ fn draw_seasons_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
let row = Row::new(vec![ let row = Row::new(vec![
Cell::from(season_monitored.to_owned()), Cell::from(season_monitored.to_owned()),
Cell::from(title.clone().unwrap()), Cell::from(title.clone().unwrap()),
Cell::from(format!("{}/{}", episode_count, total_episode_count)), Cell::from(format!("{}/{}", episode_file_count, episode_count)),
Cell::from(format!("{size:.2} GB")), Cell::from(format!("{size:.2} GB")),
]); ]);
if episode_count == total_episode_count { if episode_file_count == episode_count {
row.downloaded() row.downloaded()
} else if !monitored { } else if !monitored {
row.unmonitored() row.unmonitored()
} else if let Some(next_airing_utc) = next_airing.as_ref() {
if next_airing_utc > &Utc::now() {
return row.unreleased();
} else {
return row.missing();
}
} else { } else {
row.missing() row.missing()
} }