feat(app): Model and modal support for the season and episode details popups

This commit is contained in:
2024-12-09 15:15:09 -07:00
parent 6427a80bd1
commit f3b7f155b7
8 changed files with 240 additions and 66 deletions
+15 -10
View File
@@ -4,9 +4,10 @@ use crate::{
app::{
context_clues::build_context_clue_string,
sonarr::sonarr_context_clues::{
EPISODE_DETAILS_CONTEXT_CLUES, MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES,
MANUAL_EPISODE_SEARCH_CONTEXT_CLUES, MANUAL_SEASON_SEARCH_CONTEXT_CLUES,
SEASON_DETAILS_CONTEXT_CLUES,
DETAILS_CONTEXTUAL_CONTEXT_CLUES, EPISODE_DETAILS_CONTEXT_CLUES,
EPISODE_HISTORY_CONTEXT_CLUES, MANUAL_EPISODE_SEARCH_CONTEXT_CLUES,
MANUAL_SEASON_SEARCH_CONTEXT_CLUES, SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES,
SEASON_DETAILS_CONTEXT_CLUES, SEASON_HISTORY_CONTEXT_CLUES,
},
},
models::{
@@ -287,8 +288,8 @@ impl Default for EpisodeDetailsModal {
TabRoute {
title: "History",
route: ActiveSonarrBlock::EpisodeHistory.into(),
help: build_context_clue_string(&EPISODE_DETAILS_CONTEXT_CLUES),
contextual_help: None,
help: build_context_clue_string(&EPISODE_HISTORY_CONTEXT_CLUES),
contextual_help: Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES)),
},
TabRoute {
title: "File",
@@ -300,9 +301,7 @@ impl Default for EpisodeDetailsModal {
title: "Manual Search",
route: ActiveSonarrBlock::ManualEpisodeSearch.into(),
help: build_context_clue_string(&MANUAL_EPISODE_SEARCH_CONTEXT_CLUES),
contextual_help: Some(build_context_clue_string(
&MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES,
)),
contextual_help: Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES)),
},
]),
}
@@ -328,13 +327,19 @@ impl Default for SeasonDetailsModal {
TabRoute {
title: "Episodes",
route: ActiveSonarrBlock::SeasonDetails.into(),
help: String::new(),
help: build_context_clue_string(&SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES),
contextual_help: Some(build_context_clue_string(&SEASON_DETAILS_CONTEXT_CLUES)),
},
TabRoute {
title: "History",
route: ActiveSonarrBlock::SeasonHistory.into(),
help: build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES),
contextual_help: Some(build_context_clue_string(&SEASON_HISTORY_CONTEXT_CLUES)),
},
TabRoute {
title: "Manual Search",
route: ActiveSonarrBlock::ManualSeasonSearch.into(),
help: String::new(),
help: build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES),
contextual_help: Some(build_context_clue_string(
&MANUAL_SEASON_SEARCH_CONTEXT_CLUES,
)),
+37 -18
View File
@@ -7,9 +7,10 @@ mod tests {
use crate::app::context_clues::build_context_clue_string;
use crate::app::sonarr::sonarr_context_clues::{
EPISODE_DETAILS_CONTEXT_CLUES, MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES,
DETAILS_CONTEXTUAL_CONTEXT_CLUES, EPISODE_DETAILS_CONTEXT_CLUES, EPISODE_HISTORY_CONTEXT_CLUES,
MANUAL_EPISODE_SEARCH_CONTEXT_CLUES, MANUAL_SEASON_SEARCH_CONTEXT_CLUES,
SEASON_DETAILS_CONTEXT_CLUES,
SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES, SEASON_DETAILS_CONTEXT_CLUES,
SEASON_HISTORY_CONTEXT_CLUES,
};
use crate::models::servarr_data::sonarr::modals::{
EditSeriesModal, EpisodeDetailsModal, SeasonDetailsModal,
@@ -274,11 +275,12 @@ mod tests {
);
assert_str_eq!(
episode_details_modal.episode_details_tabs.tabs[1].help,
build_context_clue_string(&EPISODE_DETAILS_CONTEXT_CLUES)
build_context_clue_string(&EPISODE_HISTORY_CONTEXT_CLUES)
);
assert_eq!(
episode_details_modal.episode_details_tabs.tabs[1].contextual_help,
Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES))
);
assert!(episode_details_modal.episode_details_tabs.tabs[1]
.contextual_help
.is_none());
assert_str_eq!(
episode_details_modal.episode_details_tabs.tabs[2].title,
@@ -310,9 +312,7 @@ mod tests {
);
assert_eq!(
episode_details_modal.episode_details_tabs.tabs[3].contextual_help,
Some(build_context_clue_string(
&MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES
))
Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES))
);
}
@@ -325,7 +325,7 @@ mod tests {
assert!(season_details_modal.season_releases.is_empty());
assert!(season_details_modal.season_history.is_empty());
assert_eq!(season_details_modal.season_details_tabs.tabs.len(), 2);
assert_eq!(season_details_modal.season_details_tabs.tabs.len(), 3);
assert_str_eq!(
season_details_modal.season_details_tabs.tabs[0].title,
@@ -335,9 +335,10 @@ mod tests {
season_details_modal.season_details_tabs.tabs[0].route,
ActiveSonarrBlock::SeasonDetails.into()
);
assert!(season_details_modal.season_details_tabs.tabs[0]
.help
.is_empty());
assert_str_eq!(
season_details_modal.season_details_tabs.tabs[0].help,
build_context_clue_string(&SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES)
);
assert_eq!(
season_details_modal.season_details_tabs.tabs[0].contextual_help,
Some(build_context_clue_string(&SEASON_DETAILS_CONTEXT_CLUES))
@@ -345,17 +346,35 @@ mod tests {
assert_str_eq!(
season_details_modal.season_details_tabs.tabs[1].title,
"Manual Search"
"History"
);
assert_eq!(
season_details_modal.season_details_tabs.tabs[1].route,
ActiveSonarrBlock::ManualSeasonSearch.into()
ActiveSonarrBlock::SeasonHistory.into()
);
assert_str_eq!(
season_details_modal.season_details_tabs.tabs[1].help,
build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES)
);
assert!(season_details_modal.season_details_tabs.tabs[1]
.help
.is_empty());
assert_eq!(
season_details_modal.season_details_tabs.tabs[1].contextual_help,
Some(build_context_clue_string(&SEASON_HISTORY_CONTEXT_CLUES))
);
assert_str_eq!(
season_details_modal.season_details_tabs.tabs[2].title,
"Manual Search"
);
assert_eq!(
season_details_modal.season_details_tabs.tabs[2].route,
ActiveSonarrBlock::ManualSeasonSearch.into()
);
assert_str_eq!(
season_details_modal.season_details_tabs.tabs[2].help,
build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES)
);
assert_eq!(
season_details_modal.season_details_tabs.tabs[2].contextual_help,
Some(build_context_clue_string(
&MANUAL_SEASON_SEARCH_CONTEXT_CLUES
))
@@ -254,6 +254,8 @@ pub enum ActiveSonarrBlock {
FilterSeriesError,
FilterSeriesHistory,
FilterSeriesHistoryError,
FilterSeasonHistory,
FilterSeasonHistoryError,
History,
HistoryItemDetails,
HistorySortPrompt,
@@ -280,7 +282,12 @@ pub enum ActiveSonarrBlock {
SearchSeriesError,
SearchSeriesHistory,
SearchSeriesHistoryError,
SearchSeasonHistory,
SearchSeasonHistoryError,
SeasonDetails,
SeasonHistory,
SeasonHistoryDetails,
SeasonHistorySortPrompt,
#[default]
Series,
SeriesDetails,
@@ -326,6 +333,23 @@ pub static SERIES_DETAILS_BLOCKS: [ActiveSonarrBlock; 12] = [
ActiveSonarrBlock::SeriesHistoryDetails,
];
pub static SEASON_DETAILS_BLOCKS: [ActiveSonarrBlock; 14] = [
ActiveSonarrBlock::SeasonDetails,
ActiveSonarrBlock::SeasonHistory,
ActiveSonarrBlock::SearchSeason,
ActiveSonarrBlock::SearchSeasonError,
ActiveSonarrBlock::AutomaticallySearchSeasonPrompt,
ActiveSonarrBlock::SearchSeasonHistory,
ActiveSonarrBlock::SearchSeasonHistoryError,
ActiveSonarrBlock::FilterSeasonHistory,
ActiveSonarrBlock::FilterSeasonHistoryError,
ActiveSonarrBlock::SeasonHistorySortPrompt,
ActiveSonarrBlock::SeasonHistoryDetails,
ActiveSonarrBlock::ManualSeasonSearch,
ActiveSonarrBlock::ManualSeasonSearchConfirmPrompt,
ActiveSonarrBlock::ManualSeasonSearchSortPrompt,
];
pub static ADD_SERIES_BLOCKS: [ActiveSonarrBlock; 13] = [
ActiveSonarrBlock::AddSeriesAlreadyInLibrary,
ActiveSonarrBlock::AddSeriesConfirmPrompt,
@@ -228,7 +228,7 @@ mod tests {
EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, EDIT_SERIES_BLOCKS,
EDIT_SERIES_SELECTION_BLOCKS, HISTORY_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS,
INDEXER_SETTINGS_SELECTION_BLOCKS, LIBRARY_BLOCKS, ROOT_FOLDERS_BLOCKS,
SERIES_DETAILS_BLOCKS, SYSTEM_DETAILS_BLOCKS,
SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, SYSTEM_DETAILS_BLOCKS,
};
#[test]
@@ -605,5 +605,24 @@ mod tests {
assert!(SERIES_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SeriesHistorySortPrompt));
assert!(SERIES_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SeriesHistoryDetails));
}
#[test]
fn test_season_details_blocks_contents() {
assert_eq!(SEASON_DETAILS_BLOCKS.len(), 14);
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SeasonDetails));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SeasonHistory));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SearchSeason));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SearchSeasonError));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::AutomaticallySearchSeasonPrompt));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SearchSeasonHistory));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SearchSeasonHistoryError));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::FilterSeasonHistory));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::FilterSeasonHistoryError));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SeasonHistorySortPrompt));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SeasonHistoryDetails));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::ManualSeasonSearch));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::ManualSeasonSearchConfirmPrompt));
assert!(SEASON_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::ManualSeasonSearchSortPrompt));
}
}
}