feat: Display total disk usage for series in the Library view to mirror Radarr functionality [#44]
This commit is contained in:
@@ -14,15 +14,11 @@ pub fn build_context_clue_string(context_clues: &[(KeyBinding, &str)]) -> String
|
|||||||
.join(" | ")
|
.join(" | ")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub static SERVARR_CONTEXT_CLUES: [ContextClue; 3] = [
|
pub static SERVARR_CONTEXT_CLUES: [ContextClue; 2] = [
|
||||||
(
|
(
|
||||||
DEFAULT_KEYBINDINGS.next_servarr,
|
DEFAULT_KEYBINDINGS.next_servarr,
|
||||||
DEFAULT_KEYBINDINGS.next_servarr.desc,
|
DEFAULT_KEYBINDINGS.next_servarr.desc,
|
||||||
),
|
),
|
||||||
(
|
|
||||||
DEFAULT_KEYBINDINGS.previous_servarr,
|
|
||||||
DEFAULT_KEYBINDINGS.previous_servarr.desc,
|
|
||||||
),
|
|
||||||
(DEFAULT_KEYBINDINGS.quit, DEFAULT_KEYBINDINGS.quit.desc),
|
(DEFAULT_KEYBINDINGS.quit, DEFAULT_KEYBINDINGS.quit.desc),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -33,11 +33,6 @@ mod test {
|
|||||||
|
|
||||||
let (key_binding, description) = servarr_context_clues_iter.next().unwrap();
|
let (key_binding, description) = servarr_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.previous_servarr);
|
|
||||||
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.previous_servarr.desc);
|
|
||||||
|
|
||||||
let (key_binding, description) = servarr_context_clues_iter.next().unwrap();
|
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.quit);
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.quit);
|
||||||
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.quit.desc);
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.quit.desc);
|
||||||
assert_eq!(servarr_context_clues_iter.next(), None);
|
assert_eq!(servarr_context_clues_iter.next(), None);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ mod tests {
|
|||||||
ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS,
|
ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS,
|
||||||
EPISODE_DETAILS_BLOCKS, LIBRARY_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_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, SeriesStatistics, SeriesStatus, SeriesType};
|
||||||
use crate::test_handler_delegation;
|
use crate::test_handler_delegation;
|
||||||
|
|
||||||
mod test_handle_delete {
|
mod test_handle_delete {
|
||||||
@@ -826,13 +826,32 @@ mod tests {
|
|||||||
assert_str_eq!(sort_option.name, "Language");
|
assert_str_eq!(sort_option.name, "Language");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_series_sorting_options_size() {
|
||||||
|
let expected_cmp_fn: fn(&Series, &Series) -> Ordering = |a, b| {
|
||||||
|
a.statistics
|
||||||
|
.as_ref()
|
||||||
|
.map_or(0, |stats| stats.size_on_disk)
|
||||||
|
.cmp(&b.statistics.as_ref().map_or(0, |stats| stats.size_on_disk))
|
||||||
|
};
|
||||||
|
let mut expected_series_vec = series_vec();
|
||||||
|
expected_series_vec.sort_by(expected_cmp_fn);
|
||||||
|
|
||||||
|
let sort_option = series_sorting_options()[8].clone();
|
||||||
|
let mut sorted_series_vec = series_vec();
|
||||||
|
sorted_series_vec.sort_by(sort_option.cmp_fn.unwrap());
|
||||||
|
|
||||||
|
assert_eq!(sorted_series_vec, expected_series_vec);
|
||||||
|
assert_str_eq!(sort_option.name, "Size");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_series_sorting_options_monitored() {
|
fn test_series_sorting_options_monitored() {
|
||||||
let expected_cmp_fn: fn(&Series, &Series) -> Ordering = |a, b| a.monitored.cmp(&b.monitored);
|
let expected_cmp_fn: fn(&Series, &Series) -> Ordering = |a, b| a.monitored.cmp(&b.monitored);
|
||||||
let mut expected_series_vec = series_vec();
|
let mut expected_series_vec = series_vec();
|
||||||
expected_series_vec.sort_by(expected_cmp_fn);
|
expected_series_vec.sort_by(expected_cmp_fn);
|
||||||
|
|
||||||
let sort_option = series_sorting_options()[8].clone();
|
let sort_option = series_sorting_options()[9].clone();
|
||||||
let mut sorted_series_vec = series_vec();
|
let mut sorted_series_vec = series_vec();
|
||||||
sorted_series_vec.sort_by(sort_option.cmp_fn.unwrap());
|
sorted_series_vec.sort_by(sort_option.cmp_fn.unwrap());
|
||||||
|
|
||||||
@@ -861,7 +880,7 @@ mod tests {
|
|||||||
let mut expected_series_vec = series_vec();
|
let mut expected_series_vec = series_vec();
|
||||||
expected_series_vec.sort_by(expected_cmp_fn);
|
expected_series_vec.sort_by(expected_cmp_fn);
|
||||||
|
|
||||||
let sort_option = series_sorting_options()[9].clone();
|
let sort_option = series_sorting_options()[10].clone();
|
||||||
let mut sorted_series_vec = series_vec();
|
let mut sorted_series_vec = series_vec();
|
||||||
sorted_series_vec.sort_by(sort_option.cmp_fn.unwrap());
|
sorted_series_vec.sort_by(sort_option.cmp_fn.unwrap());
|
||||||
|
|
||||||
@@ -973,6 +992,10 @@ mod tests {
|
|||||||
certification: Some("TV-MA".to_owned()),
|
certification: Some("TV-MA".to_owned()),
|
||||||
series_type: SeriesType::Daily,
|
series_type: SeriesType::Daily,
|
||||||
tags: vec![1.into(), 2.into()],
|
tags: vec![1.into(), 2.into()],
|
||||||
|
statistics: Some(SeriesStatistics {
|
||||||
|
size_on_disk: 789,
|
||||||
|
..SeriesStatistics::default()
|
||||||
|
}),
|
||||||
..Series::default()
|
..Series::default()
|
||||||
},
|
},
|
||||||
Series {
|
Series {
|
||||||
@@ -988,6 +1011,10 @@ mod tests {
|
|||||||
certification: Some("TV-PG".to_owned()),
|
certification: Some("TV-PG".to_owned()),
|
||||||
series_type: SeriesType::Anime,
|
series_type: SeriesType::Anime,
|
||||||
tags: vec![1.into(), 3.into()],
|
tags: vec![1.into(), 3.into()],
|
||||||
|
statistics: Some(SeriesStatistics {
|
||||||
|
size_on_disk: 456,
|
||||||
|
..SeriesStatistics::default()
|
||||||
|
}),
|
||||||
..Series::default()
|
..Series::default()
|
||||||
},
|
},
|
||||||
Series {
|
Series {
|
||||||
|
|||||||
@@ -302,6 +302,15 @@ fn series_sorting_options() -> Vec<SortOption<Series>> {
|
|||||||
name: "Language",
|
name: "Language",
|
||||||
cmp_fn: Some(|a, b| a.language_profile_id.cmp(&b.language_profile_id)),
|
cmp_fn: Some(|a, b| a.language_profile_id.cmp(&b.language_profile_id)),
|
||||||
},
|
},
|
||||||
|
SortOption {
|
||||||
|
name: "Size",
|
||||||
|
cmp_fn: Some(|a, b| {
|
||||||
|
a.statistics
|
||||||
|
.as_ref()
|
||||||
|
.map_or(0, |stats| stats.size_on_disk)
|
||||||
|
.cmp(&b.statistics.as_ref().map_or(0, |stats| stats.size_on_disk))
|
||||||
|
}),
|
||||||
|
},
|
||||||
SortOption {
|
SortOption {
|
||||||
name: "Monitored",
|
name: "Monitored",
|
||||||
cmp_fn: Some(|a, b| a.monitored.cmp(&b.monitored)),
|
cmp_fn: Some(|a, b| a.monitored.cmp(&b.monitored)),
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ use crate::ui::widgets::{
|
|||||||
confirmation_prompt::ConfirmationPrompt,
|
confirmation_prompt::ConfirmationPrompt,
|
||||||
popup::{Popup, Size},
|
popup::{Popup, Size},
|
||||||
};
|
};
|
||||||
|
use crate::utils::convert_to_gb;
|
||||||
use crate::{
|
use crate::{
|
||||||
app::App,
|
app::App,
|
||||||
models::{
|
models::{
|
||||||
@@ -104,6 +105,10 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
|||||||
let monitored = if series.monitored { "🏷" } else { "" };
|
let monitored = if series.monitored { "🏷" } else { "" };
|
||||||
let certification = series.certification.clone().unwrap_or_default();
|
let certification = series.certification.clone().unwrap_or_default();
|
||||||
let network = series.network.clone().unwrap_or_default();
|
let network = series.network.clone().unwrap_or_default();
|
||||||
|
let size = series
|
||||||
|
.statistics
|
||||||
|
.as_ref()
|
||||||
|
.map_or(0f64, |stats| convert_to_gb(stats.size_on_disk));
|
||||||
let quality_profile = quality_profile_map
|
let quality_profile = quality_profile_map
|
||||||
.get_by_left(&series.quality_profile_id)
|
.get_by_left(&series.quality_profile_id)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@@ -140,6 +145,7 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
|||||||
Cell::from(series.series_type.to_display_str()),
|
Cell::from(series.series_type.to_display_str()),
|
||||||
Cell::from(quality_profile),
|
Cell::from(quality_profile),
|
||||||
Cell::from(language_profile),
|
Cell::from(language_profile),
|
||||||
|
Cell::from(format!("{size:.2} GB")),
|
||||||
Cell::from(monitored.to_owned()),
|
Cell::from(monitored.to_owned()),
|
||||||
Cell::from(tags),
|
Cell::from(tags),
|
||||||
]),
|
]),
|
||||||
@@ -162,19 +168,21 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
|||||||
"Rating",
|
"Rating",
|
||||||
"Type",
|
"Type",
|
||||||
"Quality Profile",
|
"Quality Profile",
|
||||||
"Language Profile",
|
"Language",
|
||||||
|
"Size",
|
||||||
"Monitored",
|
"Monitored",
|
||||||
"Tags",
|
"Tags",
|
||||||
])
|
])
|
||||||
.constraints([
|
.constraints([
|
||||||
Constraint::Percentage(23),
|
Constraint::Percentage(20),
|
||||||
Constraint::Percentage(4),
|
Constraint::Percentage(4),
|
||||||
Constraint::Percentage(14),
|
Constraint::Percentage(14),
|
||||||
Constraint::Percentage(6),
|
Constraint::Percentage(6),
|
||||||
Constraint::Percentage(6),
|
Constraint::Percentage(6),
|
||||||
Constraint::Percentage(6),
|
Constraint::Percentage(6),
|
||||||
Constraint::Percentage(13),
|
Constraint::Percentage(11),
|
||||||
Constraint::Percentage(10),
|
Constraint::Percentage(8),
|
||||||
|
Constraint::Percentage(7),
|
||||||
Constraint::Percentage(6),
|
Constraint::Percentage(6),
|
||||||
Constraint::Percentage(12),
|
Constraint::Percentage(12),
|
||||||
]);
|
]);
|
||||||
|
|||||||
Reference in New Issue
Block a user