This commit is contained in:
2026-01-07 10:45:49 -07:00
parent 9b4eda6a9d
commit 3c1634d1e3
65 changed files with 2355 additions and 100 deletions
+88 -15
View File
@@ -1,3 +1,5 @@
use serde_json::Number;
use crate::app::lidarr::lidarr_context_clues::ARTISTS_CONTEXT_CLUES;
use crate::models::{
BlockSelectionState, Route, TabRoute, TabState,
@@ -8,9 +10,17 @@ use crate::models::{
use crate::network::lidarr_network::LidarrEvent;
use bimap::BiMap;
use chrono::{DateTime, Utc};
use strum::EnumIter;
use strum::{EnumIter};
use super::modals::EditArtistModal;
#[cfg(test)]
use strum::{Display, EnumString};
use {
strum::{Display, EnumString, IntoEnumIterator},
crate::models::lidarr_models::NewItemMonitorType,
crate::models::stateful_table::SortOption,
crate::network::lidarr_network::lidarr_network_test_utils::test_utils::quality_profile_map,
crate::network::servarr_test_utils::diskspace,
crate::network::lidarr_network::lidarr_network_test_utils::test_utils::{download_record, metadata_profile, metadata_profile_map, quality_profile, root_folder, tags_map},
};
#[cfg(test)]
#[path = "lidarr_data_tests.rs"]
@@ -22,6 +32,7 @@ pub struct LidarrData<'a> {
pub delete_artist_files: bool,
pub disk_space_vec: Vec<DiskSpace>,
pub downloads: StatefulTable<DownloadRecord>,
pub edit_artist_modal: Option<EditArtistModal>,
pub main_tabs: TabState,
pub metadata_profile_map: BiMap<i64, String>,
pub prompt_confirm: bool,
@@ -39,6 +50,31 @@ impl LidarrData<'_> {
self.delete_artist_files = false;
self.add_import_list_exclusion = false;
}
pub fn tag_ids_to_display(&self, tag_ids: &[Number]) -> String {
tag_ids
.iter()
.filter_map(|id| {
let id = id.as_i64()?;
self.tags_map.get_by_left(&id).cloned()
})
.collect::<Vec<String>>()
.join(", ")
}
pub fn sorted_quality_profile_names(&self) -> Vec<String> {
let mut quality_profile_names: Vec<String> =
self.quality_profile_map.right_values().cloned().collect();
quality_profile_names.sort();
quality_profile_names
}
pub fn sorted_metadata_profile_names(&self) -> Vec<String> {
let mut metadata_profile_names: Vec<String> =
self.metadata_profile_map.right_values().cloned().collect();
metadata_profile_names.sort();
metadata_profile_names
}
}
impl<'a> Default for LidarrData<'a> {
@@ -49,6 +85,7 @@ impl<'a> Default for LidarrData<'a> {
delete_artist_files: false,
disk_space_vec: Vec::new(),
downloads: StatefulTable::default(),
edit_artist_modal: None,
metadata_profile_map: BiMap::new(),
prompt_confirm: false,
prompt_confirm_action: None,
@@ -71,11 +108,25 @@ impl<'a> Default for LidarrData<'a> {
#[cfg(test)]
impl LidarrData<'_> {
pub fn test_default_fully_populated() -> Self {
use crate::models::lidarr_models::{Artist, DownloadRecord};
use crate::models::servarr_models::{DiskSpace, RootFolder};
use crate::models::stateful_table::SortOption;
let mut edit_artist_modal = EditArtistModal {
monitored: Some(true),
path: "/nfs/music".into(),
tags: "alex".into(),
..EditArtistModal::default()
};
edit_artist_modal.monitor_list.set_items(NewItemMonitorType::iter().collect());
edit_artist_modal.quality_profile_list.set_items(vec![quality_profile().name]);
edit_artist_modal.metadata_profile_list.set_items(vec![metadata_profile().name]);
let mut lidarr_data = LidarrData::default();
let mut lidarr_data = LidarrData {
delete_artist_files: true,
disk_space_vec: vec![diskspace()],
quality_profile_map: quality_profile_map(),
metadata_profile_map: metadata_profile_map(),
edit_artist_modal: Some(edit_artist_modal),
tags_map: tags_map(),
..LidarrData::default()
};
lidarr_data.artists.set_items(vec![Artist::default()]);
lidarr_data.artists.sorting(vec![SortOption {
name: "Name",
@@ -83,19 +134,12 @@ impl LidarrData<'_> {
}]);
lidarr_data.artists.search = Some("artist search".into());
lidarr_data.artists.filter = Some("artist filter".into());
lidarr_data.quality_profile_map = BiMap::from_iter([(1i64, "Lossless".to_owned())]);
lidarr_data.metadata_profile_map = BiMap::from_iter([(1i64, "Standard".to_owned())]);
lidarr_data.tags_map = BiMap::from_iter([(1i64, "usenet".to_owned())]);
lidarr_data.disk_space_vec = vec![DiskSpace {
free_space: 50000000000,
total_space: 100000000000,
}];
lidarr_data
.downloads
.set_items(vec![DownloadRecord::default()]);
.set_items(vec![download_record()]);
lidarr_data
.root_folders
.set_items(vec![RootFolder::default()]);
.set_items(vec![root_folder()]);
lidarr_data.version = "1.0.0".to_owned();
lidarr_data
@@ -112,6 +156,14 @@ pub enum ActiveLidarrBlock {
DeleteArtistConfirmPrompt,
DeleteArtistToggleDeleteFile,
DeleteArtistToggleAddListExclusion,
EditArtistPrompt,
EditArtistConfirmPrompt,
EditArtistPathInput,
EditArtistSelectMetadataProfile,
EditArtistSelectMonitorNewItems,
EditArtistSelectQualityProfile,
EditArtistTagsInput,
EditArtistToggleMonitored,
FilterArtists,
FilterArtistsError,
SearchArtists,
@@ -142,6 +194,27 @@ pub const DELETE_ARTIST_SELECTION_BLOCKS: &[&[ActiveLidarrBlock]] = &[
&[ActiveLidarrBlock::DeleteArtistConfirmPrompt],
];
pub static EDIT_ARTIST_BLOCKS: [ActiveLidarrBlock; 8] = [
ActiveLidarrBlock::EditArtistPrompt,
ActiveLidarrBlock::EditArtistConfirmPrompt,
ActiveLidarrBlock::EditArtistPathInput,
ActiveLidarrBlock::EditArtistSelectMetadataProfile,
ActiveLidarrBlock::EditArtistSelectMonitorNewItems,
ActiveLidarrBlock::EditArtistSelectQualityProfile,
ActiveLidarrBlock::EditArtistTagsInput,
ActiveLidarrBlock::EditArtistToggleMonitored,
];
pub const EDIT_ARTIST_SELECTION_BLOCKS: &[&[ActiveLidarrBlock]] = &[
&[ActiveLidarrBlock::EditArtistToggleMonitored],
&[ActiveLidarrBlock::EditArtistSelectMonitorNewItems],
&[ActiveLidarrBlock::EditArtistSelectQualityProfile],
&[ActiveLidarrBlock::EditArtistSelectMetadataProfile],
&[ActiveLidarrBlock::EditArtistPathInput],
&[ActiveLidarrBlock::EditArtistTagsInput],
&[ActiveLidarrBlock::EditArtistConfirmPrompt],
];
impl From<ActiveLidarrBlock> for Route {
fn from(active_lidarr_block: ActiveLidarrBlock) -> Route {
Route::Lidarr(active_lidarr_block, None)