feat(readarr): add a scrollable overview popup to author details
An author's overview renders as the last line of a description box that does not scroll, so a long overview overflows with no way to read the rest. Pressing v on the author details Books tab now opens a popup holding the full overview. The popup owns its own ScrollableText, built fresh from the author's overview when it opens and torn down on Esc so a reopened popup starts at the top. Scrolling mutates only that owned state. The background paragraph renders the Author record's overview, which carries no scroll offset, so it cannot scroll along with the popup. Add a view keybinding bound to v, cite it from the author details context clues, and give the popup its own clue set so it does not inherit the hints of the view underneath.
This commit is contained in:
59 files changed
+1493
-97
No files matched your search
@@ -13,6 +13,7 @@ use crate::models::readarr_models::{Book, ReadarrHistoryItem, ReadarrRelease};
|
||||
use crate::models::servarr_data::readarr::readarr_data::{
|
||||
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock,
|
||||
};
|
||||
use crate::ui::readarr_ui::library::author_overview_ui::AuthorOverviewUi;
|
||||
use crate::ui::readarr_ui::library::book_details_ui::BookDetailsUi;
|
||||
use crate::ui::readarr_ui::library::delete_book_ui::DeleteBookUi;
|
||||
use crate::ui::readarr_ui::readarr_ui_utils::create_history_event_details;
|
||||
@@ -45,6 +46,7 @@ impl DrawUi for AuthorDetailsUi {
|
||||
};
|
||||
BookDetailsUi::accepts(route)
|
||||
|| DeleteBookUi::accepts(route)
|
||||
|| AuthorOverviewUi::accepts(route)
|
||||
|| AUTHOR_DETAILS_BLOCKS.contains(&active_readarr_block)
|
||||
}
|
||||
|
||||
@@ -134,6 +136,10 @@ impl DrawUi for AuthorDetailsUi {
|
||||
if BookDetailsUi::accepts(route) {
|
||||
BookDetailsUi::draw(f, app, _area);
|
||||
}
|
||||
|
||||
if AuthorOverviewUi::accepts(route) {
|
||||
AuthorOverviewUi::draw(f, app, _area);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@ mod tests {
|
||||
|
||||
use crate::models::readarr_models::{Book, BookStatistics};
|
||||
use crate::models::servarr_data::readarr::readarr_data::{
|
||||
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock, BOOK_DETAILS_BLOCKS, DELETE_BOOK_BLOCKS,
|
||||
EDITION_DETAILS_BLOCKS,
|
||||
AUTHOR_DETAILS_BLOCKS, AUTHOR_OVERVIEW_BLOCKS, ActiveReadarrBlock, BOOK_DETAILS_BLOCKS,
|
||||
DELETE_BOOK_BLOCKS, EDITION_DETAILS_BLOCKS,
|
||||
};
|
||||
use crate::ui::DrawUi;
|
||||
use crate::ui::readarr_ui::library::author_details_ui::{
|
||||
@@ -22,6 +22,7 @@ mod tests {
|
||||
author_details_blocks.extend(BOOK_DETAILS_BLOCKS);
|
||||
author_details_blocks.extend(EDITION_DETAILS_BLOCKS);
|
||||
author_details_blocks.extend(DELETE_BOOK_BLOCKS);
|
||||
author_details_blocks.extend(AUTHOR_OVERVIEW_BLOCKS);
|
||||
|
||||
ActiveReadarrBlock::iter().for_each(|active_readarr_block| {
|
||||
if author_details_blocks.contains(&active_readarr_block) {
|
||||
@@ -149,6 +150,7 @@ mod tests {
|
||||
}
|
||||
|
||||
mod snapshot_tests {
|
||||
use pretty_assertions::assert_str_eq;
|
||||
use rstest::rstest;
|
||||
|
||||
use crate::app::App;
|
||||
@@ -337,6 +339,46 @@ mod tests {
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_author_details_ui_renders_author_overview_over_author_details() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::AuthorDetails.into());
|
||||
app.push_navigation_stack(ActiveReadarrBlock::AuthorOverview.into());
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_scrolling_the_author_overview_does_not_scroll_the_author_details_background() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::AuthorDetails.into());
|
||||
let before = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
app
|
||||
.data
|
||||
.readarr_data
|
||||
.author_overview_modal
|
||||
.as_mut()
|
||||
.unwrap()
|
||||
.overview
|
||||
.offset = 3;
|
||||
|
||||
let after = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
assert_str_eq!(before, after);
|
||||
assert_contains!(
|
||||
before,
|
||||
"Overview: some interesting description of the author"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_author_details_ui_renders_delete_book_over_author_details() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
use crate::app::App;
|
||||
use crate::models::Route;
|
||||
use crate::models::readarr_models::Author;
|
||||
use crate::models::servarr_data::readarr::readarr_data::AUTHOR_OVERVIEW_BLOCKS;
|
||||
use crate::ui::styles::{primary_style, unmonitored_style};
|
||||
use crate::ui::utils::title_block_centered;
|
||||
use crate::ui::widgets::loading_block::LoadingBlock;
|
||||
use crate::ui::widgets::popup::Size;
|
||||
use crate::ui::{DrawUi, draw_popup};
|
||||
use ratatui::Frame;
|
||||
use ratatui::layout::Rect;
|
||||
use ratatui::style::Style;
|
||||
use ratatui::text::{Line, Span, Text};
|
||||
use ratatui::widgets::{Paragraph, Wrap};
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "author_overview_ui_tests.rs"]
|
||||
mod author_overview_ui_tests;
|
||||
|
||||
pub(super) struct AuthorOverviewUi;
|
||||
|
||||
impl DrawUi for AuthorOverviewUi {
|
||||
fn accepts(route: Route) -> bool {
|
||||
let Route::Readarr(active_readarr_block, _) = route else {
|
||||
return false;
|
||||
};
|
||||
AUTHOR_OVERVIEW_BLOCKS.contains(&active_readarr_block)
|
||||
}
|
||||
|
||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
|
||||
if app.data.readarr_data.author_overview_modal.is_some() {
|
||||
let draw_author_overview_popup = |f: &mut Frame<'_>, app: &mut App<'_>, popup_area: Rect| {
|
||||
draw_author_overview(f, app, popup_area);
|
||||
};
|
||||
|
||||
draw_popup(f, app, draw_author_overview_popup, Size::Large);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_author_overview(f: &mut Frame<'_>, app: &App<'_>, area: Rect) {
|
||||
let block = title_block_centered("Overview");
|
||||
|
||||
match app.data.readarr_data.author_overview_modal.as_ref() {
|
||||
Some(author_overview_modal) if !app.is_loading => {
|
||||
let style = if app.data.readarr_data.authors.is_empty() {
|
||||
primary_style()
|
||||
} else {
|
||||
style_from_author(app.data.readarr_data.authors.current_selection())
|
||||
};
|
||||
let overview = &author_overview_modal.overview;
|
||||
let text = Text::from(
|
||||
overview
|
||||
.items
|
||||
.iter()
|
||||
.map(|line| overview_line(line, style))
|
||||
.collect::<Vec<Line<'static>>>(),
|
||||
);
|
||||
|
||||
let paragraph = Paragraph::new(text)
|
||||
.block(block)
|
||||
.wrap(Wrap { trim: false })
|
||||
.scroll((overview.offset, 0));
|
||||
|
||||
f.render_widget(paragraph, area);
|
||||
}
|
||||
_ => f.render_widget(
|
||||
LoadingBlock::new(
|
||||
app.is_loading || app.data.readarr_data.author_overview_modal.is_none(),
|
||||
block,
|
||||
),
|
||||
area,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn style_from_author(author: &Author) -> Style {
|
||||
if !author.monitored {
|
||||
return unmonitored_style();
|
||||
}
|
||||
|
||||
primary_style()
|
||||
}
|
||||
|
||||
fn overview_line(line: &str, style: Style) -> Line<'static> {
|
||||
Line::from(Span::styled(line.trim_end().to_owned(), style))
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use pretty_assertions::assert_eq;
|
||||
use ratatui::style::Modifier;
|
||||
use ratatui::text::Line;
|
||||
use strum::IntoEnumIterator;
|
||||
|
||||
use crate::app::App;
|
||||
use crate::models::readarr_models::Author;
|
||||
use crate::models::servarr_data::readarr::readarr_data::{
|
||||
AUTHOR_OVERVIEW_BLOCKS, ActiveReadarrBlock,
|
||||
};
|
||||
use crate::ui::DrawUi;
|
||||
use crate::ui::readarr_ui::library::author_overview_ui::{
|
||||
AuthorOverviewUi, overview_line, style_from_author,
|
||||
};
|
||||
use crate::ui::styles::{primary_style, unmonitored_style};
|
||||
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||
|
||||
#[test]
|
||||
fn test_author_overview_ui_accepts() {
|
||||
ActiveReadarrBlock::iter().for_each(|active_readarr_block| {
|
||||
if AUTHOR_OVERVIEW_BLOCKS.contains(&active_readarr_block) {
|
||||
assert!(AuthorOverviewUi::accepts(active_readarr_block.into()));
|
||||
} else {
|
||||
assert!(!AuthorOverviewUi::accepts(active_readarr_block.into()));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_style_from_author_monitored() {
|
||||
let author = Author {
|
||||
monitored: true,
|
||||
..Author::default()
|
||||
};
|
||||
|
||||
let style = style_from_author(&author);
|
||||
|
||||
assert_eq!(style, primary_style());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_style_from_author_unmonitored() {
|
||||
let author = Author {
|
||||
monitored: false,
|
||||
..Author::default()
|
||||
};
|
||||
|
||||
let style = style_from_author(&author);
|
||||
|
||||
assert_eq!(style, unmonitored_style());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_overview_line_does_not_split_a_label_from_a_colon_in_the_prose() {
|
||||
let line = overview_line(
|
||||
"He was born in Madison, Wisconsin: a city he has never really left.",
|
||||
primary_style(),
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
span_contents(&line),
|
||||
vec!["He was born in Madison, Wisconsin: a city he has never really left."]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_overview_line_renders_the_prose_without_bolding_it() {
|
||||
let line = overview_line("Overview: a prose line", primary_style());
|
||||
|
||||
assert_eq!(line.spans.len(), 1);
|
||||
assert!(!line.spans[0].style.add_modifier.contains(Modifier::BOLD));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_overview_line_applies_the_given_style() {
|
||||
let line = overview_line("an unmonitored author", unmonitored_style());
|
||||
|
||||
assert_eq!(line.spans[0].style.fg, unmonitored_style().fg);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_overview_line_trims_a_trailing_carriage_return() {
|
||||
let line = overview_line(
|
||||
"His first novel took him seven years to finish.\r",
|
||||
primary_style(),
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
span_contents(&line),
|
||||
vec!["His first novel took him seven years to finish."]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_overview_line_renders_a_carriage_return_only_line_as_blank() {
|
||||
let line = overview_line("\r", primary_style());
|
||||
|
||||
assert_eq!(span_contents(&line), vec![""]);
|
||||
}
|
||||
|
||||
fn span_contents(line: &Line<'_>) -> Vec<String> {
|
||||
line
|
||||
.spans
|
||||
.iter()
|
||||
.map(|span| span.content.to_string())
|
||||
.collect()
|
||||
}
|
||||
|
||||
mod snapshot_tests {
|
||||
use crate::models::ScrollableText;
|
||||
use crate::models::servarr_data::readarr::modals::AuthorOverviewModal;
|
||||
use crate::models::stateful_table::StatefulTable;
|
||||
use crate::ui::ui_test_utils::test_utils::TerminalSize;
|
||||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_author_overview_ui_renders() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::AuthorOverview.into());
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorOverviewUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_author_overview_ui_renders_loading() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.is_loading = true;
|
||||
app.push_navigation_stack(ActiveReadarrBlock::AuthorOverview.into());
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorOverviewUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_author_overview_ui_renders_scrolled() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::AuthorOverview.into());
|
||||
app
|
||||
.data
|
||||
.readarr_data
|
||||
.author_overview_modal
|
||||
.as_mut()
|
||||
.unwrap()
|
||||
.overview
|
||||
.offset = 2;
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorOverviewUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_author_overview_ui_renders_an_author_with_no_overview() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::AuthorOverview.into());
|
||||
app.data.readarr_data.author_overview_modal = Some(AuthorOverviewModal {
|
||||
overview: ScrollableText::with_string(String::new()),
|
||||
});
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorOverviewUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_author_overview_ui_renders_nothing_when_the_author_overview_modal_is_undefined() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::AuthorOverview.into());
|
||||
app.data.readarr_data.author_overview_modal = None;
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorOverviewUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_author_overview_ui_renders_with_zero_authors() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.data.readarr_data.authors = StatefulTable::default();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::AuthorOverview.into());
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorOverviewUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
assert_contains!(output, "some interesting description of the author");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,9 +4,9 @@ mod tests {
|
||||
|
||||
use crate::models::readarr_models::{Author, AuthorStatistics, AuthorStatus};
|
||||
use crate::models::servarr_data::readarr::readarr_data::{
|
||||
ADD_AUTHOR_BLOCKS, AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock, BOOK_DETAILS_BLOCKS,
|
||||
DELETE_AUTHOR_BLOCKS, DELETE_BOOK_BLOCKS, EDIT_AUTHOR_BLOCKS, EDITION_DETAILS_BLOCKS,
|
||||
LIBRARY_BLOCKS,
|
||||
ADD_AUTHOR_BLOCKS, AUTHOR_DETAILS_BLOCKS, AUTHOR_OVERVIEW_BLOCKS, ActiveReadarrBlock,
|
||||
BOOK_DETAILS_BLOCKS, DELETE_AUTHOR_BLOCKS, DELETE_BOOK_BLOCKS, EDIT_AUTHOR_BLOCKS,
|
||||
EDITION_DETAILS_BLOCKS, LIBRARY_BLOCKS,
|
||||
};
|
||||
use crate::ui::DrawUi;
|
||||
use crate::ui::readarr_ui::library::{LibraryUi, decorate_author_row_with_style};
|
||||
@@ -18,6 +18,7 @@ mod tests {
|
||||
fn test_library_ui_accepts() {
|
||||
let mut blocks = LIBRARY_BLOCKS.to_vec();
|
||||
blocks.extend(AUTHOR_DETAILS_BLOCKS);
|
||||
blocks.extend(AUTHOR_OVERVIEW_BLOCKS);
|
||||
blocks.extend(BOOK_DETAILS_BLOCKS);
|
||||
blocks.extend(EDITION_DETAILS_BLOCKS);
|
||||
blocks.extend(ADD_AUTHOR_BLOCKS);
|
||||
|
||||
@@ -30,6 +30,7 @@ use crate::{
|
||||
|
||||
mod add_author_ui;
|
||||
mod author_details_ui;
|
||||
mod author_overview_ui;
|
||||
mod book_details_ui;
|
||||
mod delete_author_ui;
|
||||
mod delete_book_ui;
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ─────────────╭─────────────────────────────────── Details ───────────────────────────────────╮───────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────╭──────────────── Automatic Author Search ────────────────╮───────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────╭──────────────── Automatic Author Search ────────────────╮───────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────╭──────────────── Automatic Author Search ────────────────╮───────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ ╭───────────────── Download Rejected Release ──────────────────╮ │
|
||||
│╭ Author Details ──────────────────────│ Do you really want to download the rejected release: Test │───────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────╭──────────────────── Update and Scan ────────────────────╮───────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────╭──────────────────── Update and Scan ────────────────────╮───────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────╭──────────────────── Update and Scan ────────────────────╮───────────────────────────────────────────╮│
|
||||
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/author_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
╭ Test Author ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│Author: Test Author │
|
||||
│Status: Continuing │
|
||||
│Genres: sci╭─────────────────────────────────────────────────────── Overview ───────────────────────────────────────────────────────╮ │
|
||||
│Rating: N/A│some interesting description of the author │ │
|
||||
│Path: /nfs/│ │ │
|
||||
│Quality Pro│He was born in Madison, Wisconsin: a city he has never really left. │ │
|
||||
│Metadata Pr│ │ │
|
||||
│Monitored: │His first novel took him seven years to finish. │ │
|
||||
│Overview: s│ │took him │
|
||||
│seven years│ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│╭ Author D│ │───────────╮│
|
||||
││ Books │ H│ │ ││
|
||||
││──────────│ │───────────││
|
||||
││ Monitor│ │ ││
|
||||
││=> 🏷 │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││
|
||||
││ ││
|
||||
││ ││
|
||||
│╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────╭──────────────── Automatic Author Search ────────────────╮───────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Qual│ │ │
|
||||
│Meta│ │ │
|
||||
│Moni│ │ │
|
||||
│Over│ │ │
|
||||
│ │ │ │
|
||||
│Over│ │im │
|
||||
│seve│ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│╭ A│ │─────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────╭────────────────────── Delete Book ──────────────────────╮───────────────────────────────────────────╮│
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ expression: output
|
||||
│Books: 3 │
|
||||
│Files: 2/3 │
|
||||
│Size on Disk: 3.30 GB │
|
||||
│Overview: some interesting description of the author │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
││ Books │ History │ Author Search ││
|
||||
││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────╭──────────────────── Update and Scan ────────────────────╮───────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ─────────────╭─────────────────────────────────── Details ───────────────────────────────────╮───────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/author_overview_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
╭─────────────────────────────────────────────────────── Overview ───────────────────────────────────────────────────────╮
|
||||
│some interesting description of the author │
|
||||
│ │
|
||||
│He was born in Madison, Wisconsin: a city he has never really left. │
|
||||
│ │
|
||||
│His first novel took him seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/author_overview_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
╭─────────────────────────────────────────────────────── Overview ───────────────────────────────────────────────────────╮
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/author_overview_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
╭─────────────────────────────────────────────────────── Overview ───────────────────────────────────────────────────────╮
|
||||
│ │
|
||||
│ │
|
||||
│ Loading ... │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/author_overview_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/author_overview_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
╭─────────────────────────────────────────────────────── Overview ───────────────────────────────────────────────────────╮
|
||||
│He was born in Madison, Wisconsin: a city he has never really left. │
|
||||
│ │
|
||||
│His first novel took him seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: St│ │ │
|
||||
│Metadata Profile: S│ │ │
|
||||
│Monitored: Yes │ │ │
|
||||
│Overview: some inte│ │ │
|
||||
│ │ │ │
|
||||
│Overview: some inte│ │st novel took him │
|
||||
│seven years to fini│ │ │
|
||||
│ │ │ │
|
||||
│ │ ╭───╮ │ │
|
||||
│╭ Author Details │ Monitored: │ ✔ │ │────────────────────╮│
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ expression: output
|
||||
│Quality Profile: Standard │
|
||||
│Metadata Profile: Standard │
|
||||
│Monitored: Yes │
|
||||
│Overview: some interesting description of the author │
|
||||
│ │
|
||||
│Overview: some interesting description of the authorHe was born in Madison, Wisconsin: a city he has never really left.His first novel took him │
|
||||
│seven years to finish. │
|
||||
│ │
|
||||
│ │
|
||||
│╭ Author Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│
|
||||
|
||||
Reference in new issue
Block a user