feat: Full support for adding a root folder in Lidarr from both the CLI and TUI

This commit is contained in:
2026-01-14 09:06:27 -07:00
parent d2217509f2
commit 8abcf44866
31 changed files with 3495 additions and 461 deletions
@@ -0,0 +1,245 @@
use std::sync::atomic::Ordering;
use ratatui::Frame;
use ratatui::layout::{Constraint, Rect};
use ratatui::prelude::Layout;
use ratatui::widgets::ListItem;
use crate::app::App;
use crate::models::Route;
use crate::models::servarr_data::lidarr::lidarr_data::{ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock};
use crate::models::servarr_data::lidarr::modals::AddRootFolderModal;
use crate::render_selectable_input_box;
use crate::ui::utils::title_block_centered;
use crate::ui::widgets::button::Button;
use crate::ui::widgets::input_box::InputBox;
use crate::ui::widgets::popup::{Popup, Size};
use crate::ui::widgets::selectable_list::SelectableList;
use crate::ui::{DrawUi, draw_popup};
#[cfg(test)]
#[path = "add_root_folder_ui_tests.rs"]
mod add_root_folder_ui_tests;
pub(super) struct AddRootFolderUi;
impl DrawUi for AddRootFolderUi {
fn accepts(route: Route) -> bool {
let Route::Lidarr(active_lidarr_block, _) = route else {
return false;
};
ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block)
}
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
if let Route::Lidarr(active_lidarr_block, _) = app.get_current_route() {
let draw_add_root_folder_prompt =
|f: &mut Frame<'_>, app: &mut App<'_>, prompt_area: Rect| {
draw_add_root_folder_confirmation_prompt(f, app, prompt_area);
match active_lidarr_block {
ActiveLidarrBlock::AddRootFolderSelectMonitor => {
draw_add_root_folder_select_monitor_popup(f, app);
}
ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems => {
draw_add_root_folder_select_monitor_new_items_popup(f, app);
}
ActiveLidarrBlock::AddRootFolderSelectQualityProfile => {
draw_add_root_folder_select_quality_profile_popup(f, app);
}
ActiveLidarrBlock::AddRootFolderSelectMetadataProfile => {
draw_add_root_folder_select_metadata_profile_popup(f, app);
}
_ => (),
}
};
draw_popup(f, app, draw_add_root_folder_prompt, Size::Long);
}
}
}
fn draw_add_root_folder_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
let title = "Add Root Folder";
f.render_widget(title_block_centered(title), area);
let yes_no_value = app.data.lidarr_data.prompt_confirm;
let selected_block = app.data.lidarr_data.selected_block.get_active_block();
let highlight_yes_no = selected_block == ActiveLidarrBlock::AddRootFolderConfirmPrompt;
let AddRootFolderModal {
name,
path,
monitor_list,
monitor_new_items_list,
quality_profile_list,
metadata_profile_list,
tags,
} = app
.data
.lidarr_data
.add_root_folder_modal
.as_ref()
.expect("add_root_folder_modal must exist in this context");
let selected_monitor = monitor_list.current_selection();
let selected_monitor_new_items = monitor_new_items_list.current_selection();
let selected_quality_profile = quality_profile_list.current_selection();
let selected_metadata_profile = metadata_profile_list.current_selection();
let [
_,
name_area,
path_area,
monitor_area,
monitor_new_items_area,
quality_profile_area,
metadata_profile_area,
tags_area,
_,
buttons_area,
] = Layout::vertical([
Constraint::Fill(1),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Length(3),
Constraint::Fill(1),
Constraint::Length(3),
])
.margin(1)
.areas(area);
let [save_area, cancel_area] =
Layout::horizontal([Constraint::Percentage(50), Constraint::Percentage(50)])
.areas(buttons_area);
let monitor_drop_down_button = Button::default()
.title(selected_monitor.to_display_str())
.label("Monitor")
.icon("")
.selected(selected_block == ActiveLidarrBlock::AddRootFolderSelectMonitor);
let monitor_new_items_drop_down_button = Button::default()
.title(selected_monitor_new_items.to_display_str())
.label("Monitor New Albums")
.icon("")
.selected(selected_block == ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems);
let quality_profile_drop_down_button = Button::default()
.title(selected_quality_profile)
.label("Quality Profile")
.icon("")
.selected(selected_block == ActiveLidarrBlock::AddRootFolderSelectQualityProfile);
let metadata_profile_drop_down_button = Button::default()
.title(selected_metadata_profile)
.label("Metadata Profile")
.icon("")
.selected(selected_block == ActiveLidarrBlock::AddRootFolderSelectMetadataProfile);
if let Route::Lidarr(active_lidarr_block, _) = app.get_current_route() {
let name_input_box = InputBox::new(&name.text)
.offset(name.offset.load(Ordering::SeqCst))
.label("Name")
.highlighted(selected_block == ActiveLidarrBlock::AddRootFolderNameInput)
.selected(active_lidarr_block == ActiveLidarrBlock::AddRootFolderNameInput);
let path_input_box = InputBox::new(&path.text)
.offset(path.offset.load(Ordering::SeqCst))
.label("Path")
.highlighted(selected_block == ActiveLidarrBlock::AddRootFolderPathInput)
.selected(active_lidarr_block == ActiveLidarrBlock::AddRootFolderPathInput);
let tags_input_box = InputBox::new(&tags.text)
.offset(tags.offset.load(Ordering::SeqCst))
.label("Tags")
.highlighted(selected_block == ActiveLidarrBlock::AddRootFolderTagsInput)
.selected(active_lidarr_block == ActiveLidarrBlock::AddRootFolderTagsInput);
match active_lidarr_block {
ActiveLidarrBlock::AddRootFolderNameInput => name_input_box.show_cursor(f, name_area),
ActiveLidarrBlock::AddRootFolderPathInput => path_input_box.show_cursor(f, path_area),
ActiveLidarrBlock::AddRootFolderTagsInput => tags_input_box.show_cursor(f, tags_area),
_ => (),
}
render_selectable_input_box!(name_input_box, f, name_area);
render_selectable_input_box!(path_input_box, f, path_area);
render_selectable_input_box!(tags_input_box, f, tags_area);
}
let save_button = Button::default()
.title("Save")
.selected(yes_no_value && highlight_yes_no);
let cancel_button = Button::default()
.title("Cancel")
.selected(!yes_no_value && highlight_yes_no);
f.render_widget(monitor_drop_down_button, monitor_area);
f.render_widget(monitor_new_items_drop_down_button, monitor_new_items_area);
f.render_widget(quality_profile_drop_down_button, quality_profile_area);
f.render_widget(metadata_profile_drop_down_button, metadata_profile_area);
f.render_widget(save_button, save_area);
f.render_widget(cancel_button, cancel_area);
}
fn draw_add_root_folder_select_monitor_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
let monitor_list = SelectableList::new(
&mut app
.data
.lidarr_data
.add_root_folder_modal
.as_mut()
.expect("add_root_folder_modal must exist in this context")
.monitor_list,
|monitor_type| ListItem::new(monitor_type.to_display_str().to_owned()),
);
let popup = Popup::new(monitor_list).size(Size::Dropdown);
f.render_widget(popup, f.area());
}
fn draw_add_root_folder_select_monitor_new_items_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
let monitor_new_items_list = SelectableList::new(
&mut app
.data
.lidarr_data
.add_root_folder_modal
.as_mut()
.expect("add_root_folder_modal must exist in this context")
.monitor_new_items_list,
|monitor_type| ListItem::new(monitor_type.to_display_str().to_owned()),
);
let popup = Popup::new(monitor_new_items_list).size(Size::Dropdown);
f.render_widget(popup, f.area());
}
fn draw_add_root_folder_select_quality_profile_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
let quality_profile_list = SelectableList::new(
&mut app
.data
.lidarr_data
.add_root_folder_modal
.as_mut()
.expect("add_root_folder_modal must exist in this context")
.quality_profile_list,
|quality_profile| ListItem::new(quality_profile.clone()),
);
let popup = Popup::new(quality_profile_list).size(Size::Dropdown);
f.render_widget(popup, f.area());
}
fn draw_add_root_folder_select_metadata_profile_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
let metadata_profile_list = SelectableList::new(
&mut app
.data
.lidarr_data
.add_root_folder_modal
.as_mut()
.expect("add_root_folder_modal must exist in this context")
.metadata_profile_list,
|metadata_profile| ListItem::new(metadata_profile.clone()),
);
let popup = Popup::new(metadata_profile_list).size(Size::Dropdown);
f.render_widget(popup, f.area());
}
@@ -0,0 +1,51 @@
#[cfg(test)]
mod tests {
use strum::IntoEnumIterator;
use crate::app::App;
use crate::models::BlockSelectionState;
use crate::models::servarr_data::lidarr::lidarr_data::{
ADD_ROOT_FOLDER_BLOCKS, ADD_ROOT_FOLDER_SELECTION_BLOCKS, ActiveLidarrBlock,
};
use crate::ui::DrawUi;
use crate::ui::lidarr_ui::root_folders::add_root_folder_ui::AddRootFolderUi;
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
#[test]
fn test_add_root_folder_ui_accepts() {
ActiveLidarrBlock::iter().for_each(|active_lidarr_block| {
if ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block) {
assert!(AddRootFolderUi::accepts(active_lidarr_block.into()));
} else {
assert!(!AddRootFolderUi::accepts(active_lidarr_block.into()));
}
});
}
mod snapshot_tests {
use crate::ui::ui_test_utils::test_utils::TerminalSize;
use rstest::rstest;
use super::*;
#[rstest]
#[case(ActiveLidarrBlock::AddRootFolderPrompt)]
#[case(ActiveLidarrBlock::AddRootFolderConfirmPrompt)]
#[case(ActiveLidarrBlock::AddRootFolderSelectMonitor)]
#[case(ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems)]
#[case(ActiveLidarrBlock::AddRootFolderSelectQualityProfile)]
#[case(ActiveLidarrBlock::AddRootFolderSelectMetadataProfile)]
fn test_add_root_folder_ui_renders(#[case] active_lidarr_block: ActiveLidarrBlock) {
let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_lidarr_block.into());
app.data.lidarr_data.selected_block =
BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS);
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
AddRootFolderUi::draw(f, app, f.area());
});
insta::assert_snapshot!(format!("add_root_folder_{active_lidarr_block}"), output);
}
}
}
+24 -31
View File
@@ -1,19 +1,24 @@
use add_root_folder_ui::AddRootFolderUi;
use ratatui::Frame;
use ratatui::layout::{Constraint, Rect};
use ratatui::widgets::{Cell, Row};
use crate::app::App;
use crate::models::Route;
use crate::models::servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS};
use crate::models::servarr_data::lidarr::lidarr_data::{
ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS,
};
use crate::models::servarr_models::RootFolder;
use crate::ui::DrawUi;
use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::layout_block_top_border;
use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt;
use crate::ui::widgets::managarr_table::ManagarrTable;
use crate::ui::widgets::popup::{Popup, Size};
use crate::ui::{DrawUi, draw_input_box_popup, draw_popup};
use crate::utils::convert_to_gb;
mod add_root_folder_ui;
#[cfg(test)]
#[path = "root_folders_ui_tests.rs"]
mod root_folders_ui_tests;
@@ -23,7 +28,8 @@ pub(super) struct RootFoldersUi;
impl DrawUi for RootFoldersUi {
fn accepts(route: Route) -> bool {
if let Route::Lidarr(active_lidarr_block, _) = route {
return ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block);
return ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block)
|| ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block);
}
false
@@ -33,26 +39,22 @@ impl DrawUi for RootFoldersUi {
if let Route::Lidarr(active_lidarr_block, _) = app.get_current_route() {
draw_root_folders(f, app, area);
match active_lidarr_block {
ActiveLidarrBlock::AddRootFolderPrompt => {
draw_popup(f, app, draw_add_root_folder_prompt_box, Size::InputBox)
}
ActiveLidarrBlock::DeleteRootFolderPrompt => {
let prompt = format!(
"Do you really want to delete this root folder: \n{}?",
app.data.lidarr_data.root_folders.current_selection().path
);
let confirmation_prompt = ConfirmationPrompt::new()
.title("Delete Root Folder")
.prompt(&prompt)
.yes_no_value(app.data.lidarr_data.prompt_confirm);
if ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block) {
AddRootFolderUi::draw(f, app, area);
} else if active_lidarr_block == ActiveLidarrBlock::DeleteRootFolderPrompt {
let prompt = format!(
"Do you really want to delete this root folder: \n{}?",
app.data.lidarr_data.root_folders.current_selection().path
);
let confirmation_prompt = ConfirmationPrompt::new()
.title("Delete Root Folder")
.prompt(&prompt)
.yes_no_value(app.data.lidarr_data.prompt_confirm);
f.render_widget(
Popup::new(confirmation_prompt).size(Size::MediumPrompt),
f.area(),
);
}
_ => (),
f.render_widget(
Popup::new(confirmation_prompt).size(Size::MediumPrompt),
f.area(),
);
}
}
}
@@ -98,12 +100,3 @@ fn draw_root_folders(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
f.render_widget(root_folders_table, area);
}
fn draw_add_root_folder_prompt_box(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
draw_input_box_popup(
f,
area,
"Add Root Folder",
app.data.lidarr_data.edit_root_folder.as_ref().unwrap(),
);
}
@@ -3,7 +3,9 @@ mod tests {
use strum::IntoEnumIterator;
use crate::app::App;
use crate::models::servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS};
use crate::models::servarr_data::lidarr::lidarr_data::{
ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS,
};
use crate::ui::DrawUi;
use crate::ui::lidarr_ui::root_folders::RootFoldersUi;
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
@@ -11,7 +13,9 @@ mod tests {
#[test]
fn test_root_folders_ui_accepts() {
ActiveLidarrBlock::iter().for_each(|active_lidarr_block| {
if ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block) {
if ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block)
|| ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block)
{
assert!(RootFoldersUi::accepts(active_lidarr_block.into()));
} else {
assert!(!RootFoldersUi::accepts(active_lidarr_block.into()));
@@ -20,11 +24,12 @@ mod tests {
}
mod snapshot_tests {
use super::*;
use crate::models::BlockSelectionState;
use crate::models::servarr_data::lidarr::lidarr_data::ADD_ROOT_FOLDER_SELECTION_BLOCKS;
use crate::ui::ui_test_utils::test_utils::TerminalSize;
use rstest::rstest;
use super::*;
#[test]
fn test_root_folders_ui_renders_loading() {
let mut app = App::test_default();
@@ -54,7 +59,6 @@ mod tests {
fn test_root_folders_ui_renders_root_folders_tab(
#[values(
ActiveLidarrBlock::RootFolders,
ActiveLidarrBlock::AddRootFolderPrompt,
ActiveLidarrBlock::DeleteRootFolderPrompt
)]
active_lidarr_block: ActiveLidarrBlock,
@@ -68,5 +72,30 @@ mod tests {
insta::assert_snapshot!(active_lidarr_block.to_string(), output);
}
#[rstest]
fn test_root_folders_ui_renders_add_root_folders_popup_over_root_folders_table(
#[values(
ActiveLidarrBlock::AddRootFolderPrompt,
ActiveLidarrBlock::AddRootFolderConfirmPrompt,
ActiveLidarrBlock::AddRootFolderSelectMonitor,
ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems,
ActiveLidarrBlock::AddRootFolderSelectQualityProfile,
ActiveLidarrBlock::AddRootFolderSelectMetadataProfile
)]
active_lidarr_block: ActiveLidarrBlock,
) {
let mut app = App::test_default_fully_populated();
app.data.lidarr_data.selected_block =
BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS);
app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into());
app.push_navigation_stack(active_lidarr_block.into());
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
RootFoldersUi::draw(f, app, f.area());
});
insta::assert_snapshot!(active_lidarr_block.to_string(), output);
}
}
}
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs
expression: output
---
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Monitor: │All Albums ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Monitor New Albums: │All Albums ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Quality Profile: │Lossless ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Metadata Profile: │Standard ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Tags: │test │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs
expression: output
---
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Monitor: │All Albums ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Monitor New Albums: │All Albums ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Quality Profile: │Lossless ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Metadata Profile: │Standard ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Tags: │test │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs
expression: output
---
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╭───────────────────────────────╮──────────────────────────────╯ │
│ │Standard │──────────────────────────────╮ │
│ │ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Monitor│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Qual│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Metad│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ ╰───────────────────────────────╯ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs
expression: output
---
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╭───────────────────────────────╮──────────────────────────────╯ │
│ │All Albums │──────────────────────────────╮ │
│ │Future Albums │ ▼ │ │
│ │Missing Albums │──────────────────────────────╯ │
│ │Existing Albums │──────────────────────────────╮ │
│ Monitor│First Album │ ▼ │ │
│ │Latest Album │──────────────────────────────╯ │
│ │None │──────────────────────────────╮ │
│ Qual│Unknown │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Metad│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ ╰───────────────────────────────╯ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs
expression: output
---
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╭───────────────────────────────╮──────────────────────────────╯ │
│ │All Albums │──────────────────────────────╮ │
│ │No New Albums │ ▼ │ │
│ │New Albums │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Monitor│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Qual│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Metad│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ ╰───────────────────────────────╯ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs
expression: output
---
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╭───────────────────────────────╮──────────────────────────────╯ │
│ │Lossless │──────────────────────────────╮ │
│ │ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Monitor│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Qual│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Metad│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ ╰───────────────────────────────╯ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs
expression: output
---
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Path Free Space Unmapped Folders
=> /nfs 204800.00 GB 0
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Monitor: │All Albums ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Monitor New Albums: │All Albums ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Quality Profile: │Lossless ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Metadata Profile: │Standard ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Tags: │test │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -8,24 +8,41 @@ expression: output
╭───────────── Add Root Folder ─────────────╮
/nfs
─────────────────────────────────────────────
<esc> cancel
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Monitor: │All Albums ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Monitor New Albums: │All Albums ▼ │ │
╰─────────────────────────────────────────────────╯
─────────────────────────────────────────────────╮ │
│ Quality Profile: │Lossless ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Metadata Profile: │Standard ▼ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Tags: │test │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs
expression: output
---
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Path Free Space Unmapped Folders
=> /nfs 204800.00 GB 0
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╭───────────────────────────────╮──────────────────────────────╯ │
│ │Standard │──────────────────────────────╮ │
│ │ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Monitor│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Qual│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Metad│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ ╰───────────────────────────────╯ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs
expression: output
---
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Path Free Space Unmapped Folders
=> /nfs 204800.00 GB 0
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╭───────────────────────────────╮──────────────────────────────╯ │
│ │All Albums │──────────────────────────────╮ │
│ │Future Albums │ ▼ │ │
│ │Missing Albums │──────────────────────────────╯ │
│ │Existing Albums │──────────────────────────────╮ │
│ Monitor│First Album │ ▼ │ │
│ │Latest Album │──────────────────────────────╯ │
│ │None │──────────────────────────────╮ │
│ Qual│Unknown │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Metad│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ ╰───────────────────────────────╯ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs
expression: output
---
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Path Free Space Unmapped Folders
=> /nfs 204800.00 GB 0
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╭───────────────────────────────╮──────────────────────────────╯ │
│ │All Albums │──────────────────────────────╮ │
│ │No New Albums │ ▼ │ │
│ │New Albums │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Monitor│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Qual│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Metad│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ ╰───────────────────────────────╯ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -0,0 +1,48 @@
---
source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs
expression: output
---
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Path Free Space Unmapped Folders
=> /nfs 204800.00 GB 0
╭─────────────────────────────────────────── Add Root Folder ───────────────────────────────────────────╮
│ │
│ │
│ │
│ │
│ │
│ │
│ ╭─────────────────────────────────────────────────╮ │
│ Name: │Test Root Folder │ │
│ ╰─────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────╮ │
│ Path: │/nfs/music │ │
│ ╭───────────────────────────────╮──────────────────────────────╯ │
│ │Lossless │──────────────────────────────╮ │
│ │ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Monitor│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Qual│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ Metad│ │ ▼ │ │
│ │ │──────────────────────────────╯ │
│ │ │──────────────────────────────╮ │
│ ╰───────────────────────────────╯ │ │
│ ╰─────────────────────────────────────────────────╯ │
│ │
│ │
│ │
│ │
│ │
│ │
│╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│
││ Save ││ Cancel ││
│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯