feat(readarr): render the book details popup
Draw the book details popup over the author details view, with the editions table, book history, the book file info tab, and the manual search releases table, plus the automatic search, delete book file, download release, and history details prompts. Edition row styling is extracted into a named function so each branch is unit tested; text snapshots discard colour and cannot see it. The shared test fixture now populates the edition format, ISBN13, ASIN, and publisher, and the book file media info, so the rendered columns are exercised rather than blank.
This commit is contained in:
40 files changed
+2437
-6
No files matched your search
@@ -29,7 +29,7 @@ use strum::EnumIter;
|
||||
use {
|
||||
super::modals::EditionDetailsModal,
|
||||
crate::models::readarr_models::{
|
||||
AuthorStatus, BookFile, DownloadStatus, Edition, MonitorType, NewItemMonitorType,
|
||||
AuthorStatus, BookFile, DownloadStatus, Edition, MediaInfo, MonitorType, NewItemMonitorType,
|
||||
ReadarrHistoryEventType, ReadarrTaskName,
|
||||
},
|
||||
crate::models::servarr_models::{IndexerField, Quality, QualityWrapper},
|
||||
@@ -461,6 +461,10 @@ impl ReadarrData<'_> {
|
||||
monitored: true,
|
||||
is_ebook: true,
|
||||
title: "Test Edition".to_owned(),
|
||||
format: Some("Hardcover".to_owned()),
|
||||
publisher: Some("DAW Books".to_owned()),
|
||||
isbn13: Some("9780756404079".to_owned()),
|
||||
asin: Some("B0043RSJ9S".to_owned()),
|
||||
page_count: Some(288),
|
||||
release_date: Some(date),
|
||||
..Edition::default()
|
||||
@@ -474,7 +478,13 @@ impl ReadarrData<'_> {
|
||||
size: 3543348019,
|
||||
date_added: date,
|
||||
quality: quality.clone(),
|
||||
media_info: None,
|
||||
media_info: Some(MediaInfo {
|
||||
audio_bit_rate: Some("128 kbps".to_owned()),
|
||||
audio_channels: 2,
|
||||
audio_codec: Some("MP3".to_owned()),
|
||||
audio_bits: Some("16".to_owned()),
|
||||
audio_sample_rate: Some("44100".to_owned()),
|
||||
}),
|
||||
quality_cutoff_not_met: false,
|
||||
}]);
|
||||
book_details_modal
|
||||
|
||||
@@ -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::book_details_ui::BookDetailsUi;
|
||||
use crate::ui::readarr_ui::readarr_ui_utils::create_history_event_details;
|
||||
use crate::ui::styles::{ManagarrStyle, secondary_style};
|
||||
use crate::ui::utils::decorate_peer_style;
|
||||
@@ -41,7 +42,7 @@ impl DrawUi for AuthorDetailsUi {
|
||||
let Route::Readarr(active_readarr_block, _) = route else {
|
||||
return false;
|
||||
};
|
||||
AUTHOR_DETAILS_BLOCKS.contains(&active_readarr_block)
|
||||
BookDetailsUi::accepts(route) || AUTHOR_DETAILS_BLOCKS.contains(&active_readarr_block)
|
||||
}
|
||||
|
||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
|
||||
@@ -125,6 +126,10 @@ impl DrawUi for AuthorDetailsUi {
|
||||
};
|
||||
|
||||
draw_popup(f, app, draw_author_details_popup, Size::XXLarge);
|
||||
|
||||
if BookDetailsUi::accepts(route) {
|
||||
BookDetailsUi::draw(f, app, _area);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ mod tests {
|
||||
|
||||
use crate::models::readarr_models::{Book, BookStatistics};
|
||||
use crate::models::servarr_data::readarr::readarr_data::{
|
||||
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock,
|
||||
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock, BOOK_DETAILS_BLOCKS,
|
||||
};
|
||||
use crate::ui::DrawUi;
|
||||
use crate::ui::readarr_ui::library::author_details_ui::{
|
||||
@@ -17,8 +17,11 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_author_details_ui_accepts() {
|
||||
let mut author_details_blocks = AUTHOR_DETAILS_BLOCKS.to_vec();
|
||||
author_details_blocks.extend(BOOK_DETAILS_BLOCKS);
|
||||
|
||||
ActiveReadarrBlock::iter().for_each(|active_readarr_block| {
|
||||
if AUTHOR_DETAILS_BLOCKS.contains(&active_readarr_block) {
|
||||
if author_details_blocks.contains(&active_readarr_block) {
|
||||
assert!(AuthorDetailsUi::accepts(active_readarr_block.into()));
|
||||
} else {
|
||||
assert!(!AuthorDetailsUi::accepts(active_readarr_block.into()));
|
||||
@@ -295,5 +298,17 @@ mod tests {
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_author_details_ui_renders_book_details_over_author_details() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
AuthorDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,550 @@
|
||||
use crate::app::App;
|
||||
use crate::models::Route;
|
||||
use crate::models::readarr_models::{BookFile, Edition, ReadarrHistoryItem, ReadarrRelease};
|
||||
use crate::models::servarr_data::readarr::readarr_data::{ActiveReadarrBlock, BOOK_DETAILS_BLOCKS};
|
||||
use crate::ui::readarr_ui::readarr_ui_utils::create_history_event_details;
|
||||
use crate::ui::styles::{ManagarrStyle, secondary_style};
|
||||
use crate::ui::utils::{
|
||||
borderless_block, decorate_peer_style, get_width_from_percentage, layout_block_top_border,
|
||||
};
|
||||
use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt;
|
||||
use crate::ui::widgets::loading_block::LoadingBlock;
|
||||
use crate::ui::widgets::managarr_table::ManagarrTable;
|
||||
use crate::ui::widgets::message::Message;
|
||||
use crate::ui::widgets::popup::{Popup, Size};
|
||||
use crate::ui::{DrawUi, draw_popup, draw_tabs};
|
||||
use crate::utils::convert_to_gb;
|
||||
use ratatui::Frame;
|
||||
use ratatui::layout::{Alignment, Constraint, Rect};
|
||||
use ratatui::prelude::{Line, Stylize, Text};
|
||||
use ratatui::widgets::{Cell, Paragraph, Row, Wrap};
|
||||
use serde_json::Number;
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "book_details_ui_tests.rs"]
|
||||
mod book_details_ui_tests;
|
||||
|
||||
pub(super) struct BookDetailsUi;
|
||||
|
||||
impl DrawUi for BookDetailsUi {
|
||||
fn accepts(route: Route) -> bool {
|
||||
let Route::Readarr(active_readarr_block, _) = route else {
|
||||
return false;
|
||||
};
|
||||
BOOK_DETAILS_BLOCKS.contains(&active_readarr_block)
|
||||
}
|
||||
|
||||
fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) {
|
||||
if app.data.readarr_data.book_details_modal.is_some()
|
||||
&& let Route::Readarr(active_readarr_block, _) = app.get_current_route()
|
||||
{
|
||||
let draw_book_details_popup = |f: &mut Frame<'_>, app: &mut App<'_>, popup_area: Rect| {
|
||||
let content_area = draw_tabs(
|
||||
f,
|
||||
popup_area,
|
||||
&format!(
|
||||
"{} Details",
|
||||
app.data.readarr_data.books.current_selection().title.text
|
||||
),
|
||||
&app
|
||||
.data
|
||||
.readarr_data
|
||||
.book_details_modal
|
||||
.as_ref()
|
||||
.expect("Book details modal is undefined")
|
||||
.book_details_tabs,
|
||||
);
|
||||
draw_book_details(f, app, content_area);
|
||||
|
||||
match active_readarr_block {
|
||||
ActiveReadarrBlock::AutomaticallySearchBookPrompt => {
|
||||
let prompt = format!(
|
||||
"Do you want to trigger an automatic search of your indexers for the book: {}?",
|
||||
app.data.readarr_data.books.current_selection().title.text
|
||||
);
|
||||
let confirmation_prompt = ConfirmationPrompt::new()
|
||||
.title("Automatic Book Search")
|
||||
.prompt(&prompt)
|
||||
.yes_no_value(app.data.readarr_data.prompt_confirm);
|
||||
|
||||
f.render_widget(
|
||||
Popup::new(confirmation_prompt).size(Size::MediumPrompt),
|
||||
f.area(),
|
||||
);
|
||||
}
|
||||
ActiveReadarrBlock::DeleteBookFilePrompt => {
|
||||
let prompt = format!(
|
||||
"Do you really want to delete this book file: \n{}?",
|
||||
app.data.readarr_data.books.current_selection().title.text
|
||||
);
|
||||
let confirmation_prompt = ConfirmationPrompt::new()
|
||||
.title("Delete Book File")
|
||||
.prompt(&prompt)
|
||||
.yes_no_value(app.data.readarr_data.prompt_confirm);
|
||||
|
||||
f.render_widget(
|
||||
Popup::new(confirmation_prompt).size(Size::MediumPrompt),
|
||||
f.area(),
|
||||
);
|
||||
}
|
||||
ActiveReadarrBlock::ManualBookSearchConfirmPrompt => {
|
||||
draw_manual_book_search_confirm_prompt(f, app);
|
||||
}
|
||||
ActiveReadarrBlock::BookHistoryDetails => {
|
||||
draw_history_item_details_popup(f, app);
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
};
|
||||
|
||||
draw_popup(f, app, draw_book_details_popup, Size::XLarge);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_book_details(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||
if let Some(book_details_modal) = app.data.readarr_data.book_details_modal.as_ref()
|
||||
&& let Route::Readarr(active_readarr_block, _) =
|
||||
book_details_modal.book_details_tabs.get_active_route()
|
||||
{
|
||||
match active_readarr_block {
|
||||
ActiveReadarrBlock::BookDetails => draw_editions_table(f, app, area),
|
||||
ActiveReadarrBlock::BookHistory => draw_book_history_table(f, app, area),
|
||||
ActiveReadarrBlock::BookFileInfo => draw_book_file_info(f, app, area),
|
||||
ActiveReadarrBlock::ManualBookSearch => draw_book_releases(f, app, area),
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_editions_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||
if let Route::Readarr(active_readarr_block, _) = app.get_current_route() {
|
||||
let content = Some(
|
||||
&mut app
|
||||
.data
|
||||
.readarr_data
|
||||
.book_details_modal
|
||||
.as_mut()
|
||||
.expect("Book details modal is undefined")
|
||||
.editions,
|
||||
);
|
||||
|
||||
let edition_row_mapping = |edition: &Edition| {
|
||||
let Edition {
|
||||
format,
|
||||
isbn13,
|
||||
asin,
|
||||
publisher,
|
||||
page_count,
|
||||
release_date,
|
||||
monitored,
|
||||
..
|
||||
} = edition;
|
||||
|
||||
let page_count = page_count
|
||||
.map(|count| count.to_string())
|
||||
.unwrap_or_default();
|
||||
let release_date = release_date
|
||||
.map(|date| date.format("%Y-%m-%d").to_string())
|
||||
.unwrap_or_default();
|
||||
let monitored = if *monitored { "🏷" } else { "" };
|
||||
|
||||
decorate_edition_row_with_style(
|
||||
edition,
|
||||
Row::new(vec![
|
||||
Cell::from(format.clone().unwrap_or_default()),
|
||||
Cell::from(isbn13.clone().unwrap_or_default()),
|
||||
Cell::from(asin.clone().unwrap_or_default()),
|
||||
Cell::from(publisher.clone().unwrap_or_default()),
|
||||
Cell::from(page_count),
|
||||
Cell::from(release_date),
|
||||
Cell::from(monitored.to_owned()),
|
||||
]),
|
||||
)
|
||||
};
|
||||
|
||||
let is_searching = active_readarr_block == ActiveReadarrBlock::SearchEditions;
|
||||
let editions_table = ManagarrTable::new(content, edition_row_mapping)
|
||||
.block(layout_block_top_border())
|
||||
.loading(app.is_loading)
|
||||
.searching(is_searching)
|
||||
.search_produced_empty_results(
|
||||
active_readarr_block == ActiveReadarrBlock::SearchEditionsError,
|
||||
)
|
||||
.headers([
|
||||
"Format",
|
||||
"ISBN13",
|
||||
"ASIN",
|
||||
"Publisher",
|
||||
"Page Count",
|
||||
"Release Date",
|
||||
"Monitored",
|
||||
])
|
||||
.constraints([
|
||||
Constraint::Percentage(14),
|
||||
Constraint::Percentage(16),
|
||||
Constraint::Percentage(14),
|
||||
Constraint::Percentage(21),
|
||||
Constraint::Percentage(11),
|
||||
Constraint::Percentage(14),
|
||||
Constraint::Percentage(10),
|
||||
]);
|
||||
|
||||
if is_searching {
|
||||
editions_table.show_cursor(f, area);
|
||||
}
|
||||
|
||||
f.render_widget(editions_table, area);
|
||||
}
|
||||
}
|
||||
|
||||
fn decorate_edition_row_with_style<'a>(edition: &Edition, row: Row<'a>) -> Row<'a> {
|
||||
if edition.monitored {
|
||||
row.primary()
|
||||
} else {
|
||||
row.unmonitored()
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_book_file_info(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||
match app.data.readarr_data.book_details_modal.as_ref() {
|
||||
Some(book_details_modal) if !app.is_loading && !book_details_modal.book_files.is_empty() => {
|
||||
let content = Some(
|
||||
&mut app
|
||||
.data
|
||||
.readarr_data
|
||||
.book_details_modal
|
||||
.as_mut()
|
||||
.expect("Book details modal is undefined")
|
||||
.book_files,
|
||||
);
|
||||
|
||||
let book_file_row_mapping = |book_file: &BookFile| {
|
||||
let BookFile {
|
||||
path,
|
||||
size,
|
||||
quality,
|
||||
media_info,
|
||||
..
|
||||
} = book_file;
|
||||
|
||||
let size = convert_to_gb(*size);
|
||||
let audio_info = media_info
|
||||
.as_ref()
|
||||
.map(|media_info| {
|
||||
let codec = media_info.audio_codec.as_deref().unwrap_or("");
|
||||
let channels = format!("{}.0", media_info.audio_channels);
|
||||
let bitrate = media_info.audio_bit_rate.as_deref().unwrap_or("");
|
||||
let sample_rate = media_info.audio_sample_rate.as_deref().unwrap_or("");
|
||||
let bits = media_info.audio_bits.as_deref().unwrap_or("");
|
||||
format!("{codec} - {channels} - {bitrate} - {sample_rate} - {bits}")
|
||||
})
|
||||
.unwrap_or_default();
|
||||
|
||||
Row::new(vec![
|
||||
Cell::from(path.clone()),
|
||||
Cell::from(format!("{size:.2} GB")),
|
||||
Cell::from(quality.quality.name.clone()),
|
||||
Cell::from(audio_info),
|
||||
])
|
||||
.primary()
|
||||
};
|
||||
|
||||
let book_files_table = ManagarrTable::new(content, book_file_row_mapping)
|
||||
.block(layout_block_top_border())
|
||||
.loading(app.is_loading)
|
||||
.headers(["Path", "Size", "Quality", "Media Info"])
|
||||
.constraints([
|
||||
Constraint::Percentage(45),
|
||||
Constraint::Percentage(11),
|
||||
Constraint::Percentage(14),
|
||||
Constraint::Percentage(30),
|
||||
]);
|
||||
|
||||
f.render_widget(book_files_table, area);
|
||||
}
|
||||
_ => f.render_widget(
|
||||
LoadingBlock::new(
|
||||
app.is_loading || app.data.readarr_data.book_details_modal.is_none(),
|
||||
layout_block_top_border(),
|
||||
),
|
||||
area,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_book_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||
match app.data.readarr_data.book_details_modal.as_ref() {
|
||||
Some(book_details_modal) if !app.is_loading => {
|
||||
let current_selection = if book_details_modal.book_history.is_empty() {
|
||||
ReadarrHistoryItem::default()
|
||||
} else {
|
||||
book_details_modal.book_history.current_selection().clone()
|
||||
};
|
||||
|
||||
if let Route::Readarr(active_readarr_block, _) = app.get_current_route() {
|
||||
let history_row_mapping = |history_item: &ReadarrHistoryItem| {
|
||||
let ReadarrHistoryItem {
|
||||
source_title,
|
||||
quality,
|
||||
event_type,
|
||||
date,
|
||||
..
|
||||
} = history_item;
|
||||
|
||||
source_title.scroll_left_or_reset(
|
||||
get_width_from_percentage(area, 40),
|
||||
current_selection == *history_item,
|
||||
app.should_text_scroll,
|
||||
);
|
||||
|
||||
Row::new(vec![
|
||||
Cell::from(source_title.to_string()),
|
||||
Cell::from(event_type.to_string()),
|
||||
Cell::from(quality.quality.name.to_owned()),
|
||||
Cell::from(date.to_string()),
|
||||
])
|
||||
.primary()
|
||||
};
|
||||
let mut book_history_table = &mut app
|
||||
.data
|
||||
.readarr_data
|
||||
.book_details_modal
|
||||
.as_mut()
|
||||
.expect("Book details modal is undefined")
|
||||
.book_history;
|
||||
let history_table = ManagarrTable::new(Some(&mut book_history_table), history_row_mapping)
|
||||
.block(layout_block_top_border())
|
||||
.loading(app.is_loading)
|
||||
.sorting(active_readarr_block == ActiveReadarrBlock::BookHistorySortPrompt)
|
||||
.searching(active_readarr_block == ActiveReadarrBlock::SearchBookHistory)
|
||||
.search_produced_empty_results(
|
||||
active_readarr_block == ActiveReadarrBlock::SearchBookHistoryError,
|
||||
)
|
||||
.filtering(active_readarr_block == ActiveReadarrBlock::FilterBookHistory)
|
||||
.filter_produced_empty_results(
|
||||
active_readarr_block == ActiveReadarrBlock::FilterBookHistoryError,
|
||||
)
|
||||
.headers(["Source Title", "Event Type", "Quality", "Date"])
|
||||
.constraints([
|
||||
Constraint::Percentage(40),
|
||||
Constraint::Percentage(20),
|
||||
Constraint::Percentage(15),
|
||||
Constraint::Percentage(25),
|
||||
]);
|
||||
|
||||
if [
|
||||
ActiveReadarrBlock::SearchBookHistory,
|
||||
ActiveReadarrBlock::FilterBookHistory,
|
||||
]
|
||||
.contains(&active_readarr_block)
|
||||
{
|
||||
history_table.show_cursor(f, area);
|
||||
}
|
||||
|
||||
f.render_widget(history_table, area);
|
||||
}
|
||||
}
|
||||
_ => f.render_widget(
|
||||
LoadingBlock::new(
|
||||
app.is_loading || app.data.readarr_data.book_details_modal.is_none(),
|
||||
layout_block_top_border(),
|
||||
),
|
||||
area,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_book_releases(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||
match app.data.readarr_data.book_details_modal.as_ref() {
|
||||
Some(book_details_modal) if !app.is_loading => {
|
||||
let (current_selection, is_empty) = if book_details_modal.book_releases.is_empty() {
|
||||
(ReadarrRelease::default(), true)
|
||||
} else {
|
||||
(
|
||||
book_details_modal.book_releases.current_selection().clone(),
|
||||
book_details_modal.book_releases.is_empty(),
|
||||
)
|
||||
};
|
||||
|
||||
if let Route::Readarr(active_readarr_block, _) = app.get_current_route() {
|
||||
let book_release_row_mapping = |release: &ReadarrRelease| {
|
||||
let ReadarrRelease {
|
||||
protocol,
|
||||
age,
|
||||
title,
|
||||
indexer,
|
||||
size,
|
||||
rejected,
|
||||
seeders,
|
||||
leechers,
|
||||
quality,
|
||||
..
|
||||
} = release;
|
||||
|
||||
let age = format!("{age} days");
|
||||
title.scroll_left_or_reset(
|
||||
get_width_from_percentage(area, 35),
|
||||
current_selection == *release
|
||||
&& active_readarr_block != ActiveReadarrBlock::ManualBookSearchConfirmPrompt,
|
||||
app.should_text_scroll,
|
||||
);
|
||||
let size = convert_to_gb(*size);
|
||||
let rejected_str = if *rejected { "⛔" } else { "" };
|
||||
let peers = if seeders.is_none() || leechers.is_none() {
|
||||
Text::from("")
|
||||
} else {
|
||||
let seeders = seeders
|
||||
.clone()
|
||||
.unwrap_or(Number::from(0u64))
|
||||
.as_u64()
|
||||
.unwrap_or_default();
|
||||
let leechers = leechers
|
||||
.clone()
|
||||
.unwrap_or(Number::from(0u64))
|
||||
.as_u64()
|
||||
.unwrap_or_default();
|
||||
|
||||
decorate_peer_style(
|
||||
seeders,
|
||||
leechers,
|
||||
Text::from(format!("{seeders} / {leechers}")),
|
||||
)
|
||||
};
|
||||
|
||||
let quality_name = quality.quality.name.clone();
|
||||
|
||||
Row::new(vec![
|
||||
Cell::from(protocol.clone()),
|
||||
Cell::from(age),
|
||||
Cell::from(rejected_str),
|
||||
Cell::from(title.to_string()),
|
||||
Cell::from(indexer.clone()),
|
||||
Cell::from(format!("{size:.1} GB")),
|
||||
Cell::from(peers),
|
||||
Cell::from(quality_name),
|
||||
])
|
||||
.primary()
|
||||
};
|
||||
let mut book_release_table = &mut app
|
||||
.data
|
||||
.readarr_data
|
||||
.book_details_modal
|
||||
.as_mut()
|
||||
.expect("Book details modal is undefined")
|
||||
.book_releases;
|
||||
let release_table =
|
||||
ManagarrTable::new(Some(&mut book_release_table), book_release_row_mapping)
|
||||
.block(layout_block_top_border())
|
||||
.loading(app.is_loading || is_empty)
|
||||
.sorting(active_readarr_block == ActiveReadarrBlock::ManualBookSearchSortPrompt)
|
||||
.headers([
|
||||
"Source", "Age", "⛔", "Title", "Indexer", "Size", "Peers", "Quality",
|
||||
])
|
||||
.constraints([
|
||||
Constraint::Length(9),
|
||||
Constraint::Length(10),
|
||||
Constraint::Length(5),
|
||||
Constraint::Percentage(35),
|
||||
Constraint::Percentage(15),
|
||||
Constraint::Length(12),
|
||||
Constraint::Length(12),
|
||||
Constraint::Percentage(10),
|
||||
]);
|
||||
|
||||
f.render_widget(release_table, area);
|
||||
}
|
||||
}
|
||||
_ => f.render_widget(
|
||||
LoadingBlock::new(
|
||||
app.is_loading || app.data.readarr_data.book_details_modal.is_none(),
|
||||
layout_block_top_border(),
|
||||
),
|
||||
area,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_manual_book_search_confirm_prompt(f: &mut Frame<'_>, app: &mut App<'_>) {
|
||||
let current_selection = app
|
||||
.data
|
||||
.readarr_data
|
||||
.book_details_modal
|
||||
.as_ref()
|
||||
.expect("Book details modal is undefined")
|
||||
.book_releases
|
||||
.current_selection();
|
||||
let title = if current_selection.rejected {
|
||||
"Download Rejected Release"
|
||||
} else {
|
||||
"Download Release"
|
||||
};
|
||||
let prompt = if current_selection.rejected {
|
||||
format!(
|
||||
"Do you really want to download the rejected release: {}?",
|
||||
current_selection.title.text
|
||||
)
|
||||
} else {
|
||||
format!(
|
||||
"Do you want to download the release: {}?",
|
||||
current_selection.title.text
|
||||
)
|
||||
};
|
||||
|
||||
if current_selection.rejected {
|
||||
let mut lines_vec = vec![Line::from("Rejection reasons: ".primary().bold())];
|
||||
let mut rejections_spans = current_selection
|
||||
.rejections
|
||||
.clone()
|
||||
.unwrap_or_default()
|
||||
.iter()
|
||||
.map(|item| Line::from(format!("• {item}").primary().bold()))
|
||||
.collect::<Vec<Line<'_>>>();
|
||||
lines_vec.append(&mut rejections_spans);
|
||||
|
||||
let content_paragraph = Paragraph::new(lines_vec)
|
||||
.block(borderless_block())
|
||||
.wrap(Wrap { trim: false })
|
||||
.left_aligned();
|
||||
let confirmation_prompt = ConfirmationPrompt::new()
|
||||
.title(title)
|
||||
.prompt(&prompt)
|
||||
.content(content_paragraph)
|
||||
.yes_no_value(app.data.readarr_data.prompt_confirm);
|
||||
|
||||
f.render_widget(Popup::new(confirmation_prompt).size(Size::Small), f.area());
|
||||
} else {
|
||||
let confirmation_prompt = ConfirmationPrompt::new()
|
||||
.title(title)
|
||||
.prompt(&prompt)
|
||||
.yes_no_value(app.data.readarr_data.prompt_confirm);
|
||||
|
||||
f.render_widget(
|
||||
Popup::new(confirmation_prompt).size(Size::MediumPrompt),
|
||||
f.area(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_history_item_details_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
|
||||
let current_selection =
|
||||
if let Some(book_details_modal) = app.data.readarr_data.book_details_modal.as_ref() {
|
||||
if book_details_modal.book_history.is_empty() {
|
||||
ReadarrHistoryItem::default()
|
||||
} else {
|
||||
book_details_modal.book_history.current_selection().clone()
|
||||
}
|
||||
} else {
|
||||
ReadarrHistoryItem::default()
|
||||
};
|
||||
|
||||
let line_vec = create_history_event_details(current_selection);
|
||||
let text = Text::from(line_vec);
|
||||
|
||||
let message = Message::new(text)
|
||||
.title("Details")
|
||||
.style(secondary_style())
|
||||
.alignment(Alignment::Left);
|
||||
|
||||
f.render_widget(Popup::new(message).size(Size::NarrowLongMessage), f.area());
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use pretty_assertions::assert_eq;
|
||||
use ratatui::widgets::{Cell, Row};
|
||||
use strum::IntoEnumIterator;
|
||||
|
||||
use crate::app::App;
|
||||
use crate::models::readarr_models::Edition;
|
||||
use crate::models::servarr_data::readarr::readarr_data::{
|
||||
ActiveReadarrBlock, BOOK_DETAILS_BLOCKS,
|
||||
};
|
||||
use crate::ui::DrawUi;
|
||||
use crate::ui::readarr_ui::library::book_details_ui::{
|
||||
BookDetailsUi, decorate_edition_row_with_style,
|
||||
};
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||
|
||||
#[test]
|
||||
fn test_book_details_ui_accepts() {
|
||||
ActiveReadarrBlock::iter().for_each(|active_readarr_block| {
|
||||
if BOOK_DETAILS_BLOCKS.contains(&active_readarr_block) {
|
||||
assert!(BookDetailsUi::accepts(active_readarr_block.into()));
|
||||
} else {
|
||||
assert!(!BookDetailsUi::accepts(active_readarr_block.into()));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_decorate_edition_row_with_style_monitored() {
|
||||
let edition = Edition {
|
||||
monitored: true,
|
||||
..Edition::default()
|
||||
};
|
||||
let row = Row::new(vec![Cell::from("test".to_owned())]);
|
||||
|
||||
let style = decorate_edition_row_with_style(&edition, row.clone());
|
||||
|
||||
assert_eq!(style, row.primary());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_decorate_edition_row_with_style_unmonitored() {
|
||||
let edition = Edition {
|
||||
monitored: false,
|
||||
..Edition::default()
|
||||
};
|
||||
let row = Row::new(vec![Cell::from("test".to_owned())]);
|
||||
|
||||
let style = decorate_edition_row_with_style(&edition, row.clone());
|
||||
|
||||
assert_eq!(style, row.unmonitored());
|
||||
}
|
||||
|
||||
mod snapshot_tests {
|
||||
use crate::models::stateful_table::StatefulTable;
|
||||
use crate::ui::ui_test_utils::test_utils::TerminalSize;
|
||||
use rstest::rstest;
|
||||
|
||||
use super::*;
|
||||
|
||||
#[rstest]
|
||||
#[case(ActiveReadarrBlock::BookDetails, 0)]
|
||||
#[case(ActiveReadarrBlock::SearchEditions, 0)]
|
||||
#[case(ActiveReadarrBlock::SearchEditionsError, 0)]
|
||||
#[case(ActiveReadarrBlock::AutomaticallySearchBookPrompt, 0)]
|
||||
#[case(ActiveReadarrBlock::AutomaticallySearchBookPrompt, 1)]
|
||||
#[case(ActiveReadarrBlock::AutomaticallySearchBookPrompt, 2)]
|
||||
#[case(ActiveReadarrBlock::AutomaticallySearchBookPrompt, 3)]
|
||||
#[case(ActiveReadarrBlock::DeleteBookFilePrompt, 0)]
|
||||
#[case(ActiveReadarrBlock::DeleteBookFilePrompt, 2)]
|
||||
#[case(ActiveReadarrBlock::BookHistory, 1)]
|
||||
#[case(ActiveReadarrBlock::SearchBookHistory, 1)]
|
||||
#[case(ActiveReadarrBlock::SearchBookHistoryError, 1)]
|
||||
#[case(ActiveReadarrBlock::FilterBookHistory, 1)]
|
||||
#[case(ActiveReadarrBlock::FilterBookHistoryError, 1)]
|
||||
#[case(ActiveReadarrBlock::BookHistorySortPrompt, 1)]
|
||||
#[case(ActiveReadarrBlock::BookHistoryDetails, 1)]
|
||||
#[case(ActiveReadarrBlock::BookFileInfo, 2)]
|
||||
#[case(ActiveReadarrBlock::ManualBookSearch, 3)]
|
||||
#[case(ActiveReadarrBlock::ManualBookSearchConfirmPrompt, 3)]
|
||||
#[case(ActiveReadarrBlock::ManualBookSearchSortPrompt, 3)]
|
||||
fn test_book_details_ui_renders(
|
||||
#[case] active_readarr_block: ActiveReadarrBlock,
|
||||
#[case] index: usize,
|
||||
) {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(active_readarr_block.into());
|
||||
app
|
||||
.data
|
||||
.readarr_data
|
||||
.book_details_modal
|
||||
.as_mut()
|
||||
.unwrap()
|
||||
.book_details_tabs
|
||||
.set_index(index);
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
BookDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(
|
||||
format!("book_details_renders_{active_readarr_block}_{index}"),
|
||||
output
|
||||
);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case(ActiveReadarrBlock::BookDetails, 0)]
|
||||
#[case(ActiveReadarrBlock::BookHistory, 1)]
|
||||
#[case(ActiveReadarrBlock::BookFileInfo, 2)]
|
||||
#[case(ActiveReadarrBlock::ManualBookSearch, 3)]
|
||||
fn test_book_details_ui_renders_loading(
|
||||
#[case] active_readarr_block: ActiveReadarrBlock,
|
||||
#[case] index: usize,
|
||||
) {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.is_loading = true;
|
||||
app.push_navigation_stack(active_readarr_block.into());
|
||||
{
|
||||
let book_details_modal = app.data.readarr_data.book_details_modal.as_mut().unwrap();
|
||||
book_details_modal.editions = StatefulTable::default();
|
||||
book_details_modal.book_files = StatefulTable::default();
|
||||
book_details_modal.book_history = StatefulTable::default();
|
||||
book_details_modal.book_releases = StatefulTable::default();
|
||||
book_details_modal.book_details_tabs.set_index(index);
|
||||
}
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
BookDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(
|
||||
format!("loading_book_details_{active_readarr_block}_{index}"),
|
||||
output
|
||||
);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case(ActiveReadarrBlock::BookDetails, 0)]
|
||||
#[case(ActiveReadarrBlock::BookHistory, 1)]
|
||||
#[case(ActiveReadarrBlock::BookFileInfo, 2)]
|
||||
#[case(ActiveReadarrBlock::ManualBookSearch, 3)]
|
||||
fn test_book_details_ui_renders_empty(
|
||||
#[case] active_readarr_block: ActiveReadarrBlock,
|
||||
#[case] index: usize,
|
||||
) {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(active_readarr_block.into());
|
||||
{
|
||||
let book_details_modal = app.data.readarr_data.book_details_modal.as_mut().unwrap();
|
||||
book_details_modal.editions = StatefulTable::default();
|
||||
book_details_modal.book_files = StatefulTable::default();
|
||||
book_details_modal.book_history = StatefulTable::default();
|
||||
book_details_modal.book_releases = StatefulTable::default();
|
||||
book_details_modal.book_details_tabs.set_index(index);
|
||||
}
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
BookDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(
|
||||
format!("empty_book_details_{active_readarr_block}_{index}"),
|
||||
output
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_book_details_ui_renders_editions_table_with_zero_editions() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||
app
|
||||
.data
|
||||
.readarr_data
|
||||
.book_details_modal
|
||||
.as_mut()
|
||||
.unwrap()
|
||||
.editions = StatefulTable::default();
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
BookDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_book_details_ui_renders_editions_table_with_a_single_edition() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
BookDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_book_details_ui_renders_editions_table_with_an_unmonitored_edition() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||
app
|
||||
.data
|
||||
.readarr_data
|
||||
.book_details_modal
|
||||
.as_mut()
|
||||
.unwrap()
|
||||
.editions
|
||||
.set_items(vec![Edition {
|
||||
monitored: false,
|
||||
format: Some("Paperback".to_owned()),
|
||||
isbn13: Some("9780756404741".to_owned()),
|
||||
asin: Some("B0043RSJ9S".to_owned()),
|
||||
publisher: Some("DAW Books".to_owned()),
|
||||
page_count: Some(662),
|
||||
..Edition::default()
|
||||
}]);
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
BookDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_book_details_ui_renders_nothing_when_the_book_details_modal_is_undefined() {
|
||||
let mut app = App::test_default_fully_populated();
|
||||
app.push_navigation_stack(ActiveReadarrBlock::BookDetails.into());
|
||||
app.data.readarr_data.book_details_modal = None;
|
||||
|
||||
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
|
||||
BookDetailsUi::draw(f, app, f.area());
|
||||
});
|
||||
|
||||
insta::assert_snapshot!(output);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ mod tests {
|
||||
|
||||
use crate::models::readarr_models::{Author, AuthorStatistics, AuthorStatus};
|
||||
use crate::models::servarr_data::readarr::readarr_data::{
|
||||
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock, LIBRARY_BLOCKS,
|
||||
AUTHOR_DETAILS_BLOCKS, ActiveReadarrBlock, BOOK_DETAILS_BLOCKS, LIBRARY_BLOCKS,
|
||||
};
|
||||
use crate::ui::DrawUi;
|
||||
use crate::ui::readarr_ui::library::{LibraryUi, decorate_author_row_with_style};
|
||||
@@ -16,6 +16,7 @@ mod tests {
|
||||
fn test_library_ui_accepts() {
|
||||
let mut blocks = LIBRARY_BLOCKS.to_vec();
|
||||
blocks.extend(AUTHOR_DETAILS_BLOCKS);
|
||||
blocks.extend(BOOK_DETAILS_BLOCKS);
|
||||
|
||||
for active_readarr_block in ActiveReadarrBlock::iter() {
|
||||
if blocks.contains(&active_readarr_block) {
|
||||
|
||||
@@ -26,6 +26,7 @@ use crate::{
|
||||
};
|
||||
|
||||
mod author_details_ui;
|
||||
mod book_details_ui;
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "library_ui_tests.rs"]
|
||||
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/author_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
╭ Test Author ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│Auth╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
|
||||
│Over│ Editions │ History │ File │ Manual Search │ │
|
||||
│Stat│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ │
|
||||
│Genr│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │ │
|
||||
│Rati│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │ │
|
||||
│Path│ │ │
|
||||
│Qual│ │ │
|
||||
│Meta│ │ │
|
||||
│Moni│ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│╭ A│ │─────╮│
|
||||
││ Bo│ │ ││
|
||||
││───│ │─────││
|
||||
││ │ │ ││
|
||||
││=> │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ │ │ ││
|
||||
││ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││
|
||||
│╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭───────────────── Automatic Book Search ─────────────────╮ │
|
||||
│ │Do you want to trigger an automatic search of your indexers│ │
|
||||
│ │ for the book: Test Book? │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||
│ ││ Yes ││ No ││ │
|
||||
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source Title ▼ Event Type Quality Date │
|
||||
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭───────────────── Automatic Book Search ─────────────────╮ │
|
||||
│ │Do you want to trigger an automatic search of your indexers│ │
|
||||
│ │ for the book: Test Book? │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||
│ ││ Yes ││ No ││ │
|
||||
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Path Size Quality Media Info │
|
||||
│=> /nfs/books/Test Author/Test Book.epub 3.30 GB EPUB MP3 - 2.0 - 128 kbps - 44100 - 16 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭───────────────── Automatic Book Search ─────────────────╮ │
|
||||
│ │Do you want to trigger an automatic search of your indexers│ │
|
||||
│ │ for the book: Test Book? │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||
│ ││ Yes ││ No ││ │
|
||||
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source ▼ Age ⛔ Title Indexer Size Peers Quality │
|
||||
│=> torrent 1 days ⛔ Test Torrent Release kickass torrents 0.0 GB 2 / 1 EPUB │
|
||||
│ usenet 1 days ⛔ Test Usenet Release DrunkenSlug 0.0 GB EPUB │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭───────────────── Automatic Book Search ─────────────────╮ │
|
||||
│ │Do you want to trigger an automatic search of your indexers│ │
|
||||
│ │ for the book: Test Book? │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||
│ ││ Yes ││ No ││ │
|
||||
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Path Size Quality Media Info │
|
||||
│=> /nfs/books/Test Author/Test Book.epub 3.30 GB EPUB MP3 - 2.0 - 128 kbps - 44100 - 16 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source Title ▼ Event Type Quality Date │
|
||||
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭─────────────────────────────────── Details ───────────────────────────────────╮ │
|
||||
│ │Source Title: Test Source Title │ │
|
||||
│ │Event Type: grabbed │ │
|
||||
│ │Quality: EPUB │ │
|
||||
│ │Date: 2023-05-20 21:29:16 UTC │ │
|
||||
│ │Indexer: │ │
|
||||
│ │NZB Info URL: │ │
|
||||
│ │Release Group: │ │
|
||||
│ │Age: 0 days │ │
|
||||
│ │Published Date: 1970-01-01 00:00:00 UTC │ │
|
||||
│ │Download Client: │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ ╰─────────────────────────────────────────────────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source Title Event Type Quality Date │
|
||||
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭─────────────────────────╮ │
|
||||
│ │Something │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ ╰─────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source Title ▼ Event Type Quality Date │
|
||||
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭─────────────────── Delete Book File ────────────────────╮ │
|
||||
│ │ Do you really want to delete this book file: │ │
|
||||
│ │ Test Book? │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||
│ ││ Yes ││ No ││ │
|
||||
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Path Size Quality Media Info │
|
||||
│=> /nfs/books/Test Author/Test Book.epub 3.30 GB EPUB MP3 - 2.0 - 128 kbps - 44100 - 16 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭─────────────────── Delete Book File ────────────────────╮ │
|
||||
│ │ Do you really want to delete this book file: │ │
|
||||
│ │ Test Book? │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │╭────────────────────────────╮╭───────────────────────────╮│ │
|
||||
│ ││ Yes ││ No ││ │
|
||||
│ │╰────────────────────────────╯╰───────────────────────────╯│ │
|
||||
│ ╰───────────────────────────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source Title ▼ Event Type Quality Date │
|
||||
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭─────────── Error ────────────╮ │
|
||||
│ │ The given filter produced empty│ │
|
||||
│ ╰────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source Title ▼ Event Type Quality Date │
|
||||
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭───────────── Filter ──────────────╮ │
|
||||
│ │book history filter │ │
|
||||
│ ╰─────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source ▼ Age ⛔ Title Indexer Size Peers Quality │
|
||||
│=> torrent 1 days ⛔ Test Torrent Release kickass torrents 0.0 GB 2 / 1 EPUB │
|
||||
│ usenet 1 days ⛔ Test Usenet Release DrunkenSlug 0.0 GB EPUB │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭───────────────── Download Rejected Release ──────────────────╮ │
|
||||
│ │ Do you really want to download the rejected release: Test │ │
|
||||
│ │ Torrent Release? │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │Rejection reasons: │ │
|
||||
│ │• Unknown quality profile │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │╭──────────────────────────────╮╭──────────────────────────────╮│ │
|
||||
│ ││ Yes ││ No ││ │
|
||||
│ │╰──────────────────────────────╯╰──────────────────────────────╯│ │
|
||||
│ ╰────────────────────────────────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source Age ⛔ Title Indexer Size Peers Quality │
|
||||
│=> torrent 1 days ⛔ Test Torrent Release kickass torrents 0.0 GB 2 / 1 EPUB │
|
||||
│ usenet 1 days ⛔ Test Usenet Release DrunkenSlug 0.0 GB EPUB │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭─────────────────────────╮ │
|
||||
│ │Something │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
│ ╰─────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source ▼ Age ⛔ Title Indexer Size Peers Quality │
|
||||
│=> torrent 1 days ⛔ Test Torrent Release kickass torrents 0.0 GB 2 / 1 EPUB │
|
||||
│ usenet 1 days ⛔ Test Usenet Release DrunkenSlug 0.0 GB EPUB │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source Title ▼ Event Type Quality Date │
|
||||
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭─────────── Error ────────────╮ │
|
||||
│ │ No items found matching search │ │
|
||||
│ ╰────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Source Title ▼ Event Type Quality Date │
|
||||
│=> Test Source Title grabbed EPUB 2023-05-20 21:29:16 UTC │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭───────────── Search ──────────────╮ │
|
||||
│ │book history search │ │
|
||||
│ ╰─────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭─────────── Error ────────────╮ │
|
||||
│ │ No items found matching search │ │
|
||||
│ ╰────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ ╭───────────── Search ──────────────╮ │
|
||||
│ │edition search │ │
|
||||
│ ╰─────────────────────────────────────╯ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||
│=> Hardcover 9780756404079 B0043RSJ9S DAW Books 288 2023-05-20 🏷 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ Format ISBN13 ASIN Publisher Page Count Release Date Monitored │
|
||||
│=> Paperback 9780756404741 B0043RSJ9S DAW Books 662 │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ │
|
||||
│ │
|
||||
│ Loading ... │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ │
|
||||
│ │
|
||||
│ Loading ... │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ │
|
||||
│ │
|
||||
│ Loading ... │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ │
|
||||
│ │
|
||||
│ Loading ... │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
---
|
||||
source: src/ui/readarr_ui/library/book_details_ui_tests.rs
|
||||
expression: output
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
╭ Test Book Details ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ Editions │ History │ File │ Manual Search │
|
||||
│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||
│ │
|
||||
│ │
|
||||
│ Loading ... │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
Reference in new issue
Block a user