feat(app): Model and modal support for the season and episode details popups
This commit is contained in:
@@ -34,6 +34,11 @@ impl<'a> App<'a> {
|
|||||||
.dispatch_network_event(SonarrEvent::GetEpisodes(None).into())
|
.dispatch_network_event(SonarrEvent::GetEpisodes(None).into())
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
ActiveSonarrBlock::SeasonHistory => {
|
||||||
|
self
|
||||||
|
.dispatch_network_event(SonarrEvent::GetSeasonHistory(None).into())
|
||||||
|
.await;
|
||||||
|
}
|
||||||
ActiveSonarrBlock::ManualSeasonSearch => {
|
ActiveSonarrBlock::ManualSeasonSearch => {
|
||||||
self
|
self
|
||||||
.dispatch_network_event(SonarrEvent::GetSeasonReleases(None).into())
|
.dispatch_network_event(SonarrEvent::GetSeasonReleases(None).into())
|
||||||
|
|||||||
@@ -71,25 +71,49 @@ pub static SERIES_HISTORY_CONTEXT_CLUES: [ContextClue; 9] = [
|
|||||||
(DEFAULT_KEYBINDINGS.esc, "cancel filter/close"),
|
(DEFAULT_KEYBINDINGS.esc, "cancel filter/close"),
|
||||||
];
|
];
|
||||||
|
|
||||||
pub static SEASON_DETAILS_CONTEXT_CLUES: [ContextClue; 5] = [
|
pub static SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES: [ContextClue; 2] = [
|
||||||
|
(DEFAULT_KEYBINDINGS.submit, "episode details"),
|
||||||
|
(DEFAULT_KEYBINDINGS.delete, "delete episode"),
|
||||||
|
];
|
||||||
|
|
||||||
|
pub static SEASON_DETAILS_CONTEXT_CLUES: [ContextClue; 4] = [
|
||||||
(
|
(
|
||||||
DEFAULT_KEYBINDINGS.refresh,
|
DEFAULT_KEYBINDINGS.refresh,
|
||||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||||
),
|
),
|
||||||
(DEFAULT_KEYBINDINGS.submit, "details"),
|
(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc),
|
||||||
(DEFAULT_KEYBINDINGS.search, "auto search"),
|
(
|
||||||
(DEFAULT_KEYBINDINGS.delete, "delete episode"),
|
DEFAULT_KEYBINDINGS.auto_search,
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search.desc,
|
||||||
|
),
|
||||||
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
||||||
];
|
];
|
||||||
|
|
||||||
pub static MANUAL_SEASON_SEARCH_CONTEXT_CLUES: [ContextClue; 5] = [
|
pub static SEASON_HISTORY_CONTEXT_CLUES: [ContextClue; 6] = [
|
||||||
(
|
(
|
||||||
DEFAULT_KEYBINDINGS.refresh,
|
DEFAULT_KEYBINDINGS.refresh,
|
||||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||||
),
|
),
|
||||||
(DEFAULT_KEYBINDINGS.search, "auto search"),
|
|
||||||
(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc),
|
(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc),
|
||||||
(DEFAULT_KEYBINDINGS.submit, "details"),
|
(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc),
|
||||||
|
(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc),
|
||||||
|
(
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search,
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search.desc,
|
||||||
|
),
|
||||||
|
(DEFAULT_KEYBINDINGS.esc, "cancel filter/close"),
|
||||||
|
];
|
||||||
|
|
||||||
|
pub static MANUAL_SEASON_SEARCH_CONTEXT_CLUES: [ContextClue; 4] = [
|
||||||
|
(
|
||||||
|
DEFAULT_KEYBINDINGS.refresh,
|
||||||
|
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search,
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search.desc,
|
||||||
|
),
|
||||||
|
(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc),
|
||||||
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -98,12 +122,15 @@ pub static MANUAL_EPISODE_SEARCH_CONTEXT_CLUES: [ContextClue; 4] = [
|
|||||||
DEFAULT_KEYBINDINGS.refresh,
|
DEFAULT_KEYBINDINGS.refresh,
|
||||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||||
),
|
),
|
||||||
(DEFAULT_KEYBINDINGS.search, "auto search"),
|
(
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search,
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search.desc,
|
||||||
|
),
|
||||||
(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc),
|
(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc),
|
||||||
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
||||||
];
|
];
|
||||||
|
|
||||||
pub static MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES: [ContextClue; 1] =
|
pub static DETAILS_CONTEXTUAL_CONTEXT_CLUES: [ContextClue; 1] =
|
||||||
[(DEFAULT_KEYBINDINGS.submit, "details")];
|
[(DEFAULT_KEYBINDINGS.submit, "details")];
|
||||||
|
|
||||||
pub static EPISODE_DETAILS_CONTEXT_CLUES: [ContextClue; 3] = [
|
pub static EPISODE_DETAILS_CONTEXT_CLUES: [ContextClue; 3] = [
|
||||||
@@ -111,10 +138,28 @@ pub static EPISODE_DETAILS_CONTEXT_CLUES: [ContextClue; 3] = [
|
|||||||
DEFAULT_KEYBINDINGS.refresh,
|
DEFAULT_KEYBINDINGS.refresh,
|
||||||
DEFAULT_KEYBINDINGS.refresh.desc,
|
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||||
),
|
),
|
||||||
(DEFAULT_KEYBINDINGS.search, "auto search"),
|
(
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search,
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search.desc,
|
||||||
|
),
|
||||||
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
pub static EPISODE_HISTORY_CONTEXT_CLUES: [ContextClue; 6] = [
|
||||||
|
(
|
||||||
|
DEFAULT_KEYBINDINGS.refresh,
|
||||||
|
DEFAULT_KEYBINDINGS.refresh.desc,
|
||||||
|
),
|
||||||
|
(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc),
|
||||||
|
(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc),
|
||||||
|
(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc),
|
||||||
|
(
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search,
|
||||||
|
DEFAULT_KEYBINDINGS.auto_search.desc,
|
||||||
|
),
|
||||||
|
(DEFAULT_KEYBINDINGS.esc, "cancel filter/close"),
|
||||||
|
];
|
||||||
|
|
||||||
pub static SYSTEM_TASKS_CONTEXT_CLUES: [ContextClue; 2] = [
|
pub static SYSTEM_TASKS_CONTEXT_CLUES: [ContextClue; 2] = [
|
||||||
(DEFAULT_KEYBINDINGS.submit, "start task"),
|
(DEFAULT_KEYBINDINGS.submit, "start task"),
|
||||||
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc),
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ mod tests {
|
|||||||
use crate::app::{
|
use crate::app::{
|
||||||
key_binding::DEFAULT_KEYBINDINGS,
|
key_binding::DEFAULT_KEYBINDINGS,
|
||||||
sonarr::sonarr_context_clues::{
|
sonarr::sonarr_context_clues::{
|
||||||
ADD_SERIES_SEARCH_RESULTS_CONTEXT_CLUES, EPISODE_DETAILS_CONTEXT_CLUES,
|
ADD_SERIES_SEARCH_RESULTS_CONTEXT_CLUES, DETAILS_CONTEXTUAL_CONTEXT_CLUES,
|
||||||
HISTORY_CONTEXT_CLUES, MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES,
|
EPISODE_DETAILS_CONTEXT_CLUES, HISTORY_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_CONTEXT_CLUES, SERIES_CONTEXT_CLUES, SERIES_DETAILS_CONTEXT_CLUES,
|
SEASON_DETAILS_CONTEXT_CLUES, SEASON_HISTORY_CONTEXT_CLUES, SERIES_CONTEXT_CLUES,
|
||||||
SERIES_HISTORY_CONTEXT_CLUES, SYSTEM_TASKS_CONTEXT_CLUES,
|
SERIES_DETAILS_CONTEXT_CLUES, SERIES_HISTORY_CONTEXT_CLUES, SYSTEM_TASKS_CONTEXT_CLUES,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -225,18 +225,13 @@ mod tests {
|
|||||||
|
|
||||||
let (key_binding, description) = season_details_context_clues_iter.next().unwrap();
|
let (key_binding, description) = season_details_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit);
|
|
||||||
assert_str_eq!(*description, "details");
|
|
||||||
|
|
||||||
let (key_binding, description) = season_details_context_clues_iter.next().unwrap();
|
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search);
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search);
|
||||||
assert_str_eq!(*description, "auto search");
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc);
|
||||||
|
|
||||||
let (key_binding, description) = season_details_context_clues_iter.next().unwrap();
|
let (key_binding, description) = season_details_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete);
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search);
|
||||||
assert_str_eq!(*description, "delete episode");
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc);
|
||||||
|
|
||||||
let (key_binding, description) = season_details_context_clues_iter.next().unwrap();
|
let (key_binding, description) = season_details_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
@@ -245,6 +240,57 @@ mod tests {
|
|||||||
assert_eq!(season_details_context_clues_iter.next(), None);
|
assert_eq!(season_details_context_clues_iter.next(), None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_season_details_contextual_context_clues() {
|
||||||
|
let mut season_details_contextual_context_clues_iter =
|
||||||
|
SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES.iter();
|
||||||
|
let (key_binding, description) = season_details_contextual_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit);
|
||||||
|
assert_str_eq!(*description, "episode details");
|
||||||
|
|
||||||
|
let (key_binding, description) = season_details_contextual_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete);
|
||||||
|
assert_str_eq!(*description, "delete episode");
|
||||||
|
assert_eq!(season_details_contextual_context_clues_iter.next(), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_season_history_context_clues() {
|
||||||
|
let mut season_history_context_clues_iter = SEASON_HISTORY_CONTEXT_CLUES.iter();
|
||||||
|
let (key_binding, description) = season_history_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh);
|
||||||
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc);
|
||||||
|
|
||||||
|
let (key_binding, description) = season_history_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort);
|
||||||
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc);
|
||||||
|
|
||||||
|
let (key_binding, description) = season_history_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search);
|
||||||
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc);
|
||||||
|
|
||||||
|
let (key_binding, description) = season_history_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.filter);
|
||||||
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.filter.desc);
|
||||||
|
|
||||||
|
let (key_binding, description) = season_history_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search);
|
||||||
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc);
|
||||||
|
|
||||||
|
let (key_binding, description) = season_history_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc);
|
||||||
|
assert_str_eq!(*description, "cancel filter/close");
|
||||||
|
assert_eq!(season_history_context_clues_iter.next(), None);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_manual_season_search_context_clues() {
|
fn test_manual_season_search_context_clues() {
|
||||||
let mut manual_season_search_context_clues_iter = MANUAL_SEASON_SEARCH_CONTEXT_CLUES.iter();
|
let mut manual_season_search_context_clues_iter = MANUAL_SEASON_SEARCH_CONTEXT_CLUES.iter();
|
||||||
@@ -256,8 +302,8 @@ mod tests {
|
|||||||
|
|
||||||
let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap();
|
let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search);
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search);
|
||||||
assert_str_eq!(*description, "auto search");
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc);
|
||||||
|
|
||||||
let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap();
|
let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
@@ -266,11 +312,6 @@ mod tests {
|
|||||||
|
|
||||||
let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap();
|
let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit);
|
|
||||||
assert_str_eq!(*description, "details");
|
|
||||||
|
|
||||||
let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap();
|
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc);
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc);
|
||||||
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc);
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc);
|
||||||
assert_eq!(manual_season_search_context_clues_iter.next(), None);
|
assert_eq!(manual_season_search_context_clues_iter.next(), None);
|
||||||
@@ -287,8 +328,8 @@ mod tests {
|
|||||||
|
|
||||||
let (key_binding, description) = manual_episode_search_context_clues_iter.next().unwrap();
|
let (key_binding, description) = manual_episode_search_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search);
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search);
|
||||||
assert_str_eq!(*description, "auto search");
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc);
|
||||||
|
|
||||||
let (key_binding, description) = manual_episode_search_context_clues_iter.next().unwrap();
|
let (key_binding, description) = manual_episode_search_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
@@ -303,9 +344,8 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_manual_episode_search_contextual_context_clues() {
|
fn details_contextual_context_clues() {
|
||||||
let mut manual_search_contextual_context_clues_iter =
|
let mut manual_search_contextual_context_clues_iter = DETAILS_CONTEXTUAL_CONTEXT_CLUES.iter();
|
||||||
MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES.iter();
|
|
||||||
let (key_binding, description) = manual_search_contextual_context_clues_iter.next().unwrap();
|
let (key_binding, description) = manual_search_contextual_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit);
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit);
|
||||||
@@ -324,8 +364,8 @@ mod tests {
|
|||||||
|
|
||||||
let (key_binding, description) = episode_details_context_clues_iter.next().unwrap();
|
let (key_binding, description) = episode_details_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search);
|
assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search);
|
||||||
assert_str_eq!(*description, "auto search");
|
assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc);
|
||||||
|
|
||||||
let (key_binding, description) = episode_details_context_clues_iter.next().unwrap();
|
let (key_binding, description) = episode_details_context_clues_iter.next().unwrap();
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,23 @@ mod tests {
|
|||||||
assert_eq!(app.tick_count, 0);
|
assert_eq!(app.tick_count, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_dispatch_by_season_history_block() {
|
||||||
|
let (mut app, mut sync_network_rx) = construct_app_unit();
|
||||||
|
|
||||||
|
app
|
||||||
|
.dispatch_by_sonarr_block(&ActiveSonarrBlock::SeasonHistory)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
assert!(app.is_loading);
|
||||||
|
assert_eq!(
|
||||||
|
sync_network_rx.recv().await.unwrap(),
|
||||||
|
SonarrEvent::GetSeasonHistory(None).into()
|
||||||
|
);
|
||||||
|
assert!(!app.data.sonarr_data.prompt_confirm);
|
||||||
|
assert_eq!(app.tick_count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_dispatch_by_manual_season_search_block() {
|
async fn test_dispatch_by_manual_season_search_block() {
|
||||||
let (mut app, mut sync_network_rx) = construct_app_unit();
|
let (mut app, mut sync_network_rx) = construct_app_unit();
|
||||||
|
|||||||
@@ -4,9 +4,10 @@ use crate::{
|
|||||||
app::{
|
app::{
|
||||||
context_clues::build_context_clue_string,
|
context_clues::build_context_clue_string,
|
||||||
sonarr::sonarr_context_clues::{
|
sonarr::sonarr_context_clues::{
|
||||||
EPISODE_DETAILS_CONTEXT_CLUES, MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES,
|
DETAILS_CONTEXTUAL_CONTEXT_CLUES, EPISODE_DETAILS_CONTEXT_CLUES,
|
||||||
MANUAL_EPISODE_SEARCH_CONTEXT_CLUES, MANUAL_SEASON_SEARCH_CONTEXT_CLUES,
|
EPISODE_HISTORY_CONTEXT_CLUES, MANUAL_EPISODE_SEARCH_CONTEXT_CLUES,
|
||||||
SEASON_DETAILS_CONTEXT_CLUES,
|
MANUAL_SEASON_SEARCH_CONTEXT_CLUES, SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES,
|
||||||
|
SEASON_DETAILS_CONTEXT_CLUES, SEASON_HISTORY_CONTEXT_CLUES,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
models::{
|
models::{
|
||||||
@@ -287,8 +288,8 @@ impl Default for EpisodeDetailsModal {
|
|||||||
TabRoute {
|
TabRoute {
|
||||||
title: "History",
|
title: "History",
|
||||||
route: ActiveSonarrBlock::EpisodeHistory.into(),
|
route: ActiveSonarrBlock::EpisodeHistory.into(),
|
||||||
help: build_context_clue_string(&EPISODE_DETAILS_CONTEXT_CLUES),
|
help: build_context_clue_string(&EPISODE_HISTORY_CONTEXT_CLUES),
|
||||||
contextual_help: None,
|
contextual_help: Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES)),
|
||||||
},
|
},
|
||||||
TabRoute {
|
TabRoute {
|
||||||
title: "File",
|
title: "File",
|
||||||
@@ -300,9 +301,7 @@ impl Default for EpisodeDetailsModal {
|
|||||||
title: "Manual Search",
|
title: "Manual Search",
|
||||||
route: ActiveSonarrBlock::ManualEpisodeSearch.into(),
|
route: ActiveSonarrBlock::ManualEpisodeSearch.into(),
|
||||||
help: build_context_clue_string(&MANUAL_EPISODE_SEARCH_CONTEXT_CLUES),
|
help: build_context_clue_string(&MANUAL_EPISODE_SEARCH_CONTEXT_CLUES),
|
||||||
contextual_help: Some(build_context_clue_string(
|
contextual_help: Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES)),
|
||||||
&MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES,
|
|
||||||
)),
|
|
||||||
},
|
},
|
||||||
]),
|
]),
|
||||||
}
|
}
|
||||||
@@ -328,13 +327,19 @@ impl Default for SeasonDetailsModal {
|
|||||||
TabRoute {
|
TabRoute {
|
||||||
title: "Episodes",
|
title: "Episodes",
|
||||||
route: ActiveSonarrBlock::SeasonDetails.into(),
|
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)),
|
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 {
|
TabRoute {
|
||||||
title: "Manual Search",
|
title: "Manual Search",
|
||||||
route: ActiveSonarrBlock::ManualSeasonSearch.into(),
|
route: ActiveSonarrBlock::ManualSeasonSearch.into(),
|
||||||
help: String::new(),
|
help: build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES),
|
||||||
contextual_help: Some(build_context_clue_string(
|
contextual_help: Some(build_context_clue_string(
|
||||||
&MANUAL_SEASON_SEARCH_CONTEXT_CLUES,
|
&MANUAL_SEASON_SEARCH_CONTEXT_CLUES,
|
||||||
)),
|
)),
|
||||||
|
|||||||
@@ -7,9 +7,10 @@ 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::{
|
||||||
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,
|
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::{
|
use crate::models::servarr_data::sonarr::modals::{
|
||||||
EditSeriesModal, EpisodeDetailsModal, SeasonDetailsModal,
|
EditSeriesModal, EpisodeDetailsModal, SeasonDetailsModal,
|
||||||
@@ -274,11 +275,12 @@ mod tests {
|
|||||||
);
|
);
|
||||||
assert_str_eq!(
|
assert_str_eq!(
|
||||||
episode_details_modal.episode_details_tabs.tabs[1].help,
|
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!(
|
assert_str_eq!(
|
||||||
episode_details_modal.episode_details_tabs.tabs[2].title,
|
episode_details_modal.episode_details_tabs.tabs[2].title,
|
||||||
@@ -310,9 +312,7 @@ mod tests {
|
|||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
episode_details_modal.episode_details_tabs.tabs[3].contextual_help,
|
episode_details_modal.episode_details_tabs.tabs[3].contextual_help,
|
||||||
Some(build_context_clue_string(
|
Some(build_context_clue_string(&DETAILS_CONTEXTUAL_CONTEXT_CLUES))
|
||||||
&MANUAL_EPISODE_SEARCH_CONTEXTUAL_CONTEXT_CLUES
|
|
||||||
))
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -325,7 +325,7 @@ mod tests {
|
|||||||
assert!(season_details_modal.season_releases.is_empty());
|
assert!(season_details_modal.season_releases.is_empty());
|
||||||
assert!(season_details_modal.season_history.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!(
|
assert_str_eq!(
|
||||||
season_details_modal.season_details_tabs.tabs[0].title,
|
season_details_modal.season_details_tabs.tabs[0].title,
|
||||||
@@ -335,9 +335,10 @@ mod tests {
|
|||||||
season_details_modal.season_details_tabs.tabs[0].route,
|
season_details_modal.season_details_tabs.tabs[0].route,
|
||||||
ActiveSonarrBlock::SeasonDetails.into()
|
ActiveSonarrBlock::SeasonDetails.into()
|
||||||
);
|
);
|
||||||
assert!(season_details_modal.season_details_tabs.tabs[0]
|
assert_str_eq!(
|
||||||
.help
|
season_details_modal.season_details_tabs.tabs[0].help,
|
||||||
.is_empty());
|
build_context_clue_string(&SEASON_DETAILS_CONTEXTUAL_CONTEXT_CLUES)
|
||||||
|
);
|
||||||
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_CONTEXT_CLUES))
|
Some(build_context_clue_string(&SEASON_DETAILS_CONTEXT_CLUES))
|
||||||
@@ -345,17 +346,35 @@ mod tests {
|
|||||||
|
|
||||||
assert_str_eq!(
|
assert_str_eq!(
|
||||||
season_details_modal.season_details_tabs.tabs[1].title,
|
season_details_modal.season_details_tabs.tabs[1].title,
|
||||||
"Manual Search"
|
"History"
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
season_details_modal.season_details_tabs.tabs[1].route,
|
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!(
|
assert_eq!(
|
||||||
season_details_modal.season_details_tabs.tabs[1].contextual_help,
|
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(
|
Some(build_context_clue_string(
|
||||||
&MANUAL_SEASON_SEARCH_CONTEXT_CLUES
|
&MANUAL_SEASON_SEARCH_CONTEXT_CLUES
|
||||||
))
|
))
|
||||||
|
|||||||
@@ -254,6 +254,8 @@ pub enum ActiveSonarrBlock {
|
|||||||
FilterSeriesError,
|
FilterSeriesError,
|
||||||
FilterSeriesHistory,
|
FilterSeriesHistory,
|
||||||
FilterSeriesHistoryError,
|
FilterSeriesHistoryError,
|
||||||
|
FilterSeasonHistory,
|
||||||
|
FilterSeasonHistoryError,
|
||||||
History,
|
History,
|
||||||
HistoryItemDetails,
|
HistoryItemDetails,
|
||||||
HistorySortPrompt,
|
HistorySortPrompt,
|
||||||
@@ -280,7 +282,12 @@ pub enum ActiveSonarrBlock {
|
|||||||
SearchSeriesError,
|
SearchSeriesError,
|
||||||
SearchSeriesHistory,
|
SearchSeriesHistory,
|
||||||
SearchSeriesHistoryError,
|
SearchSeriesHistoryError,
|
||||||
|
SearchSeasonHistory,
|
||||||
|
SearchSeasonHistoryError,
|
||||||
SeasonDetails,
|
SeasonDetails,
|
||||||
|
SeasonHistory,
|
||||||
|
SeasonHistoryDetails,
|
||||||
|
SeasonHistorySortPrompt,
|
||||||
#[default]
|
#[default]
|
||||||
Series,
|
Series,
|
||||||
SeriesDetails,
|
SeriesDetails,
|
||||||
@@ -326,6 +333,23 @@ pub static SERIES_DETAILS_BLOCKS: [ActiveSonarrBlock; 12] = [
|
|||||||
ActiveSonarrBlock::SeriesHistoryDetails,
|
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] = [
|
pub static ADD_SERIES_BLOCKS: [ActiveSonarrBlock; 13] = [
|
||||||
ActiveSonarrBlock::AddSeriesAlreadyInLibrary,
|
ActiveSonarrBlock::AddSeriesAlreadyInLibrary,
|
||||||
ActiveSonarrBlock::AddSeriesConfirmPrompt,
|
ActiveSonarrBlock::AddSeriesConfirmPrompt,
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ mod tests {
|
|||||||
EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, EDIT_SERIES_BLOCKS,
|
EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, EDIT_SERIES_BLOCKS,
|
||||||
EDIT_SERIES_SELECTION_BLOCKS, HISTORY_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS,
|
EDIT_SERIES_SELECTION_BLOCKS, HISTORY_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS,
|
||||||
INDEXER_SETTINGS_SELECTION_BLOCKS, LIBRARY_BLOCKS, ROOT_FOLDERS_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]
|
#[test]
|
||||||
@@ -605,5 +605,24 @@ mod tests {
|
|||||||
assert!(SERIES_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SeriesHistorySortPrompt));
|
assert!(SERIES_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SeriesHistorySortPrompt));
|
||||||
assert!(SERIES_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::SeriesHistoryDetails));
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user