Refactored the ErrorMessage widget into a generic Message widget for enhanced reuse. Added support for testing a single indexer at a time.
This commit is contained in:
@@ -13,8 +13,8 @@ use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi;
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::utils::{get_width_from_percentage, layout_block_top_border};
|
||||
use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt;
|
||||
use crate::ui::widgets::error_message::ErrorMessage;
|
||||
use crate::ui::widgets::managarr_table::ManagarrTable;
|
||||
use crate::ui::widgets::message::Message;
|
||||
use crate::ui::widgets::popup::{Popup, Size};
|
||||
use crate::ui::{draw_input_box_popup, draw_popup_over, DrawUi};
|
||||
|
||||
@@ -52,7 +52,7 @@ impl DrawUi for CollectionsUi {
|
||||
Size::InputBox,
|
||||
),
|
||||
ActiveRadarrBlock::SearchCollectionError => {
|
||||
let popup = Popup::new(ErrorMessage::new("Collection not found!")).size(Size::Error);
|
||||
let popup = Popup::new(Message::new("Collection not found!")).size(Size::Message);
|
||||
|
||||
draw_collections(f, app, area);
|
||||
f.render_widget(popup, f.size());
|
||||
@@ -66,10 +66,10 @@ impl DrawUi for CollectionsUi {
|
||||
Size::InputBox,
|
||||
),
|
||||
ActiveRadarrBlock::FilterCollectionsError => {
|
||||
let popup = Popup::new(ErrorMessage::new(
|
||||
let popup = Popup::new(Message::new(
|
||||
"No collections found matching the given filter!",
|
||||
))
|
||||
.size(Size::Error);
|
||||
.size(Size::Message);
|
||||
|
||||
draw_collections(f, app, area);
|
||||
f.render_widget(popup, f.size());
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use ratatui::layout::{Constraint, Rect};
|
||||
use ratatui::style::{Style, Stylize};
|
||||
use ratatui::text::Text;
|
||||
use ratatui::widgets::{Cell, Row};
|
||||
use ratatui::Frame;
|
||||
@@ -11,9 +12,11 @@ use crate::ui::radarr_ui::indexers::edit_indexer_ui::EditIndexerUi;
|
||||
use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi;
|
||||
use crate::ui::radarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi;
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::utils::layout_block_top_border;
|
||||
use crate::ui::utils::{layout_block_top_border, title_block};
|
||||
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;
|
||||
|
||||
@@ -43,6 +46,28 @@ impl DrawUi for IndexersUi {
|
||||
let route = *app.get_current_route();
|
||||
let mut indexers_matchers = |active_radarr_block| match active_radarr_block {
|
||||
ActiveRadarrBlock::Indexers => draw_indexers(f, app, area),
|
||||
ActiveRadarrBlock::TestIndexer => {
|
||||
draw_indexers(f, app, area);
|
||||
if app.is_loading {
|
||||
let loading_popup = Popup::new(LoadingBlock::new(
|
||||
app.is_loading,
|
||||
title_block("Testing Indexer"),
|
||||
))
|
||||
.size(Size::LargeMessage);
|
||||
f.render_widget(loading_popup, f.size());
|
||||
} else {
|
||||
let popup = if let Some(result) = app.data.radarr_data.indexer_test_error.as_ref() {
|
||||
Popup::new(Message::new(result.clone())).size(Size::LargeMessage)
|
||||
} else {
|
||||
let message = Message::new("Indexer test succeeded!")
|
||||
.title("Success")
|
||||
.style(Style::new().success().bold());
|
||||
Popup::new(message).size(Size::Message)
|
||||
};
|
||||
|
||||
f.render_widget(popup, f.size());
|
||||
}
|
||||
}
|
||||
ActiveRadarrBlock::DeleteIndexerPrompt => {
|
||||
let prompt = format!(
|
||||
"Do you really want to delete this indexer: \n{}?",
|
||||
|
||||
@@ -17,9 +17,9 @@ use crate::ui::utils::{
|
||||
title_block_centered,
|
||||
};
|
||||
use crate::ui::widgets::button::Button;
|
||||
use crate::ui::widgets::error_message::ErrorMessage;
|
||||
use crate::ui::widgets::input_box::InputBox;
|
||||
use crate::ui::widgets::managarr_table::ManagarrTable;
|
||||
use crate::ui::widgets::message::Message;
|
||||
use crate::ui::widgets::popup::{Popup, Size};
|
||||
use crate::ui::widgets::selectable_list::SelectableList;
|
||||
use crate::ui::{draw_popup_over, DrawUi};
|
||||
@@ -79,8 +79,7 @@ impl DrawUi for AddMovieUi {
|
||||
ActiveRadarrBlock::AddMovieAlreadyInLibrary => {
|
||||
draw_add_movie_search(f, app, area);
|
||||
f.render_widget(
|
||||
Popup::new(ErrorMessage::new("This film is already in your library"))
|
||||
.size(Size::Error),
|
||||
Popup::new(Message::new("This film is already in your library")).size(Size::Message),
|
||||
f.size(),
|
||||
);
|
||||
}
|
||||
@@ -220,8 +219,8 @@ fn draw_add_movie_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||
let help_paragraph = Paragraph::new(help_text)
|
||||
.block(borderless_block())
|
||||
.alignment(Alignment::Center);
|
||||
let error_message = ErrorMessage::new("No movies found matching your query!");
|
||||
let error_message_popup = Popup::new(error_message).size(Size::Error);
|
||||
let error_message = Message::new("No movies found matching your query!");
|
||||
let error_message_popup = Popup::new(error_message).size(Size::Message);
|
||||
|
||||
f.render_widget(layout_block(), results_area);
|
||||
f.render_widget(error_message_popup, f.size());
|
||||
|
||||
@@ -13,8 +13,8 @@ use crate::ui::radarr_ui::library::edit_movie_ui::EditMovieUi;
|
||||
use crate::ui::radarr_ui::library::movie_details_ui::MovieDetailsUi;
|
||||
use crate::ui::utils::{get_width_from_percentage, layout_block_top_border};
|
||||
use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt;
|
||||
use crate::ui::widgets::error_message::ErrorMessage;
|
||||
use crate::ui::widgets::managarr_table::ManagarrTable;
|
||||
use crate::ui::widgets::message::Message;
|
||||
use crate::ui::widgets::popup::{Popup, Size};
|
||||
use crate::ui::{draw_input_box_popup, draw_popup_over, DrawUi};
|
||||
use crate::utils::{convert_runtime, convert_to_gb};
|
||||
@@ -57,7 +57,7 @@ impl DrawUi for LibraryUi {
|
||||
Size::InputBox,
|
||||
),
|
||||
ActiveRadarrBlock::SearchMovieError => {
|
||||
let popup = Popup::new(ErrorMessage::new("Movie not found!")).size(Size::Error);
|
||||
let popup = Popup::new(Message::new("Movie not found!")).size(Size::Message);
|
||||
|
||||
draw_library(f, app, area);
|
||||
f.render_widget(popup, f.size());
|
||||
@@ -71,10 +71,8 @@ impl DrawUi for LibraryUi {
|
||||
Size::InputBox,
|
||||
),
|
||||
ActiveRadarrBlock::FilterMoviesError => {
|
||||
let popup = Popup::new(ErrorMessage::new(
|
||||
"No movies found matching the given filter!",
|
||||
))
|
||||
.size(Size::Error);
|
||||
let popup = Popup::new(Message::new("No movies found matching the given filter!"))
|
||||
.size(Size::Message);
|
||||
|
||||
draw_library(f, app, area);
|
||||
f.render_widget(popup, f.size());
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::utils::title_block_centered;
|
||||
use ratatui::buffer::Buffer;
|
||||
use ratatui::layout::{Alignment, Rect};
|
||||
use ratatui::style::Stylize;
|
||||
use ratatui::text::Text;
|
||||
use ratatui::widgets::{Paragraph, Widget};
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "error_message_tests.rs"]
|
||||
mod error_message_tests;
|
||||
|
||||
pub struct ErrorMessage<'a> {
|
||||
text: Text<'a>,
|
||||
}
|
||||
|
||||
impl<'a> ErrorMessage<'a> {
|
||||
pub fn new<T>(message: T) -> Self
|
||||
where
|
||||
T: Into<Text<'a>>,
|
||||
{
|
||||
ErrorMessage {
|
||||
text: message.into(),
|
||||
}
|
||||
}
|
||||
|
||||
fn render_error_message(self, area: Rect, buf: &mut Buffer) {
|
||||
Paragraph::new(self.text)
|
||||
.failure()
|
||||
.alignment(Alignment::Center)
|
||||
.block(title_block_centered("Error").failure().bold())
|
||||
.render(area, buf);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Widget for ErrorMessage<'a> {
|
||||
fn render(self, area: Rect, buf: &mut Buffer) {
|
||||
self.render_error_message(area, buf);
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::ui::widgets::error_message::ErrorMessage;
|
||||
use pretty_assertions::assert_eq;
|
||||
use ratatui::text::Text;
|
||||
|
||||
#[test]
|
||||
fn test_error_message_new() {
|
||||
let message = "This is an error message";
|
||||
let error_message = ErrorMessage::new(message);
|
||||
|
||||
assert_eq!(error_message.text, Text::from(message));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::utils::title_block_centered;
|
||||
use ratatui::buffer::Buffer;
|
||||
use ratatui::layout::{Alignment, Rect};
|
||||
use ratatui::style::{Style, Stylize};
|
||||
use ratatui::text::Text;
|
||||
use ratatui::widgets::{Paragraph, Widget, Wrap};
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "message_tests.rs"]
|
||||
mod message_tests;
|
||||
|
||||
pub struct Message<'a> {
|
||||
text: Text<'a>,
|
||||
title: &'a str,
|
||||
style: Style,
|
||||
}
|
||||
|
||||
impl<'a> Message<'a> {
|
||||
pub fn new<T>(message: T) -> Self
|
||||
where
|
||||
T: Into<Text<'a>>,
|
||||
{
|
||||
Message {
|
||||
text: message.into(),
|
||||
title: "Error",
|
||||
style: Style::new().failure().bold(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn title(mut self, title: &'a str) -> Self {
|
||||
self.title = title;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn style(mut self, style: Style) -> Self {
|
||||
self.style = style;
|
||||
self
|
||||
}
|
||||
|
||||
fn render_message(self, area: Rect, buf: &mut Buffer) {
|
||||
Paragraph::new(self.text)
|
||||
.style(self.style)
|
||||
.alignment(Alignment::Center)
|
||||
.block(title_block_centered(self.title).style(self.style))
|
||||
.wrap(Wrap { trim: true })
|
||||
.render(area, buf);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Widget for Message<'a> {
|
||||
fn render(self, area: Rect, buf: &mut Buffer) {
|
||||
self.render_message(area, buf);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::widgets::message::Message;
|
||||
use pretty_assertions::{assert_eq, assert_str_eq};
|
||||
use ratatui::style::{Style, Stylize};
|
||||
use ratatui::text::Text;
|
||||
|
||||
#[test]
|
||||
fn test_error_message_new() {
|
||||
let test_message = "This is a message";
|
||||
|
||||
let message = Message::new(test_message);
|
||||
|
||||
assert_eq!(message.text, Text::from(test_message));
|
||||
assert_str_eq!(message.title, "Error");
|
||||
assert_eq!(message.style, Style::new().failure().bold());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_message_title() {
|
||||
let test_message = "This is a message";
|
||||
let title = "Success";
|
||||
|
||||
let message = Message::new(test_message).title(title);
|
||||
|
||||
assert_str_eq!(message.title, title);
|
||||
assert_eq!(message.text, Text::from(test_message));
|
||||
assert_eq!(message.style, Style::new().failure().bold());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_message_style() {
|
||||
let test_message = "This is a message";
|
||||
let style = Style::new().success().bold();
|
||||
|
||||
let message = Message::new(test_message).style(style);
|
||||
|
||||
assert_eq!(message.style, style);
|
||||
assert_eq!(message.text, Text::from(test_message));
|
||||
assert_str_eq!(message.title, "Error");
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
pub(super) mod button;
|
||||
pub(super) mod checkbox;
|
||||
pub(super) mod confirmation_prompt;
|
||||
pub(super) mod error_message;
|
||||
pub(super) mod input_box;
|
||||
pub(super) mod loading_block;
|
||||
pub(super) mod managarr_table;
|
||||
pub(super) mod message;
|
||||
pub(super) mod popup;
|
||||
pub(super) mod selectable_list;
|
||||
|
||||
@@ -12,7 +12,8 @@ mod popup_tests;
|
||||
pub enum Size {
|
||||
Prompt,
|
||||
LargePrompt,
|
||||
Error,
|
||||
Message,
|
||||
LargeMessage,
|
||||
InputBox,
|
||||
Dropdown,
|
||||
Small,
|
||||
@@ -25,7 +26,8 @@ impl Size {
|
||||
match self {
|
||||
Size::Prompt => (35, 35),
|
||||
Size::LargePrompt => (70, 45),
|
||||
Size::Error => (25, 8),
|
||||
Size::Message => (25, 8),
|
||||
Size::LargeMessage => (25, 25),
|
||||
Size::InputBox => (30, 13),
|
||||
Size::Dropdown => (20, 30),
|
||||
Size::Small => (40, 40),
|
||||
|
||||
@@ -8,7 +8,8 @@ mod tests {
|
||||
fn test_dimensions_to_percent() {
|
||||
assert_eq!(Size::Prompt.to_percent(), (35, 35));
|
||||
assert_eq!(Size::LargePrompt.to_percent(), (70, 45));
|
||||
assert_eq!(Size::Error.to_percent(), (25, 8));
|
||||
assert_eq!(Size::Message.to_percent(), (25, 8));
|
||||
assert_eq!(Size::LargeMessage.to_percent(), (25, 25));
|
||||
assert_eq!(Size::InputBox.to_percent(), (30, 13));
|
||||
assert_eq!(Size::Dropdown.to_percent(), (20, 30));
|
||||
assert_eq!(Size::Small.to_percent(), (40, 40));
|
||||
|
||||
Reference in New Issue
Block a user