build: Upgraded to Ratatui v0.30.0 and fixed a new security vulnerability [#13]

This commit is contained in:
2026-01-07 17:15:54 -07:00
parent 243de47cae
commit f0ed71b436
43 changed files with 1532 additions and 828 deletions
+10 -10
View File
@@ -144,14 +144,14 @@ fn draw_add_series_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
.block(title_block_centered("Add Series"));
search_box.show_cursor(f, search_box_area);
f.render_widget(layout_block().default(), results_area);
f.render_widget(layout_block().default_color(), results_area);
f.render_widget(search_box, search_box_area);
}
ActiveSonarrBlock::AddSeriesEmptySearchResults => {
let error_message = Message::new("No series found matching your query!");
let error_message_popup = Popup::new(error_message).size(Size::Message);
f.render_widget(layout_block().default(), results_area);
f.render_widget(layout_block().default_color(), results_area);
f.render_widget(error_message_popup, f.area());
}
ActiveSonarrBlock::AddSeriesSearchResults
@@ -168,7 +168,7 @@ fn draw_add_series_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
search_results_row_mapping,
)
.loading(is_loading)
.block(layout_block().default())
.block(layout_block().default_color())
.headers([
"", "Title", "Year", "Network", "Seasons", "Rating", "Genres",
])
@@ -314,27 +314,27 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
let use_season_folder_checkbox = Checkbox::new("Season Folder")
.checked(*use_season_folder)
.highlighted(selected_block == ActiveSonarrBlock::AddSeriesToggleUseSeasonFolder);
let root_folder_drop_down_button = Button::new()
let root_folder_drop_down_button = Button::default()
.title(&selected_root_folder.path)
.label("Root Folder")
.icon("")
.selected(selected_block == ActiveSonarrBlock::AddSeriesSelectRootFolder);
let monitor_drop_down_button = Button::new()
let monitor_drop_down_button = Button::default()
.title(selected_monitor.to_display_str())
.label("Monitor")
.icon("")
.selected(selected_block == ActiveSonarrBlock::AddSeriesSelectMonitor);
let series_type_drop_down_button = Button::new()
let series_type_drop_down_button = Button::default()
.title(selected_series_type.to_display_str())
.label("Series Type")
.icon("")
.selected(selected_block == ActiveSonarrBlock::AddSeriesSelectSeriesType);
let quality_profile_drop_down_button = Button::new()
let quality_profile_drop_down_button = Button::default()
.title(selected_quality_profile)
.label("Quality Profile")
.icon("")
.selected(selected_block == ActiveSonarrBlock::AddSeriesSelectQualityProfile);
let language_profile_drop_down_button = Button::new()
let language_profile_drop_down_button = Button::default()
.title(selected_language_profile)
.label("Language Profile")
.icon("")
@@ -356,10 +356,10 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
render_selectable_input_box!(tags_input_box, f, tags_area);
}
let add_button = Button::new()
let add_button = Button::default()
.title("Add")
.selected(yes_no_value && highlight_yes_no);
let cancel_button = Button::new()
let cancel_button = Button::default()
.title("Cancel")
.selected(!yes_no_value && highlight_yes_no);
+5 -6
View File
@@ -13,7 +13,6 @@ use crate::models::servarr_data::sonarr::sonarr_data::{
};
use crate::render_selectable_input_box;
use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{layout_paragraph_borderless, title_block_centered};
use crate::ui::widgets::button::Button;
use crate::ui::widgets::checkbox::Checkbox;
@@ -145,17 +144,17 @@ fn draw_edit_series_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, ar
let season_folder_checkbox = Checkbox::new("Season Folder")
.checked(use_season_folders.unwrap_or_default())
.highlighted(selected_block == ActiveSonarrBlock::EditSeriesToggleSeasonFolder);
let series_type_drop_down_button = Button::new()
let series_type_drop_down_button = Button::default()
.title(selected_series_type.to_display_str())
.label("Series Type")
.icon("")
.selected(selected_block == ActiveSonarrBlock::EditSeriesSelectSeriesType);
let quality_profile_drop_down_button = Button::new()
let quality_profile_drop_down_button = Button::default()
.title(selected_quality_profile)
.label("Quality Profile")
.icon("")
.selected(selected_block == ActiveSonarrBlock::EditSeriesSelectQualityProfile);
let language_profile_drop_down_button = Button::new()
let language_profile_drop_down_button = Button::default()
.title(selected_language_profile)
.label("Language Profile")
.icon("")
@@ -183,10 +182,10 @@ fn draw_edit_series_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, ar
render_selectable_input_box!(tags_input_box, f, tags_area);
}
let save_button = Button::new()
let save_button = Button::default()
.title("Save")
.selected(yes_no_value && highlight_yes_no);
let cancel_button = Button::new()
let cancel_button = Button::default()
.title("Cancel")
.selected(!yes_no_value && highlight_yes_no);
+12 -8
View File
@@ -13,6 +13,10 @@ use crate::ui::sonarr_ui::sonarr_ui_utils::{
create_no_data_history_event_details,
};
use crate::ui::styles::ManagarrStyle;
use crate::ui::styles::{
awaiting_import_style, downloaded_style, downloading_style, missing_style, secondary_style,
unmonitored_missing_style, unmonitored_style, unreleased_style,
};
use crate::ui::utils::{
borderless_block, decorate_peer_style, get_width_from_percentage, layout_block_bottom_border,
layout_block_top_border,
@@ -388,7 +392,7 @@ fn draw_history_item_details_popup(f: &mut Frame<'_>, app: &mut App<'_>, area: R
let message = Message::new(text)
.title("Details")
.style(Style::new().secondary())
.style(secondary_style())
.alignment(Alignment::Left);
f.render_widget(Popup::new(message).size(Size::NarrowMessage), area);
@@ -602,29 +606,29 @@ fn style_from_status(download: Option<&DownloadRecord>, episode: &Episode) -> St
if !episode.has_file {
if let Some(download) = download {
if download.status == DownloadStatus::Downloading {
return Style::new().downloading();
return downloading_style();
}
if download.status == DownloadStatus::Completed {
return Style::new().awaiting_import();
return awaiting_import_style();
}
}
if !episode.monitored {
return Style::new().unmonitored_missing();
return unmonitored_missing_style();
}
if let Some(air_date) = episode.air_date_utc.as_ref()
&& air_date > &Utc::now()
{
return Style::new().unreleased();
return unreleased_style();
}
return Style::new().missing();
return missing_style();
}
if !episode.monitored {
Style::new().unmonitored()
unmonitored_style()
} else {
Style::new().downloaded()
downloaded_style()
}
}
@@ -13,6 +13,7 @@ use crate::ui::sonarr_ui::sonarr_ui_utils::{
create_no_data_history_event_details,
};
use crate::ui::styles::ManagarrStyle;
use crate::ui::styles::secondary_style;
use crate::ui::utils::{
borderless_block, decorate_peer_style, get_width_from_percentage, layout_block_top_border,
};
@@ -26,7 +27,7 @@ use crate::utils::convert_to_gb;
use chrono::Utc;
use ratatui::Frame;
use ratatui::layout::{Alignment, Constraint, Rect};
use ratatui::prelude::{Line, Style, Stylize, Text};
use ratatui::prelude::{Line, Stylize, Text};
use ratatui::widgets::{Cell, Paragraph, Row, Wrap};
use serde_json::Number;
@@ -567,7 +568,7 @@ fn draw_history_item_details_popup(f: &mut Frame<'_>, app: &mut App<'_>, area: R
let message = Message::new(text)
.title("Details")
.style(Style::new().secondary())
.style(secondary_style())
.alignment(Alignment::Left);
f.render_widget(Popup::new(message).size(Size::NarrowMessage), area);
+21 -14
View File
@@ -1,8 +1,9 @@
use crate::ui::styles::secondary_style;
use chrono::Utc;
use deunicode::deunicode;
use ratatui::Frame;
use ratatui::layout::{Alignment, Constraint, Layout, Rect};
use ratatui::style::{Style, Stylize};
use ratatui::style::Stylize;
use ratatui::text::{Line, Text};
use ratatui::widgets::{Cell, Paragraph, Row, Wrap};
use regex::Regex;
@@ -157,54 +158,60 @@ fn draw_series_description(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
"Title: ".primary().bold(),
current_selection.title.text.clone().primary().bold(),
]),
Line::from(vec!["Overview: ".primary().bold(), overview.default()]),
Line::from(vec![
"Overview: ".primary().bold(),
overview.default_color(),
]),
Line::from(vec![
"Network: ".primary().bold(),
current_selection
.network
.clone()
.unwrap_or_default()
.default(),
.default_color(),
]),
Line::from(vec![
"Status: ".primary().bold(),
current_selection.status.to_display_str().default(),
current_selection.status.to_display_str().default_color(),
]),
Line::from(vec![
"Genres: ".primary().bold(),
current_selection.genres.join(", ").default(),
current_selection.genres.join(", ").default_color(),
]),
Line::from(vec![
"Rating: ".primary().bold(),
format!("{}%", (current_selection.ratings.value * 10.0) as i32).default(),
format!("{}%", (current_selection.ratings.value * 10.0) as i32).default_color(),
]),
Line::from(vec![
"Year: ".primary().bold(),
current_selection.year.to_string().default(),
current_selection.year.to_string().default_color(),
]),
Line::from(vec![
"Runtime: ".primary().bold(),
format!("{} minutes", current_selection.runtime).default(),
format!("{} minutes", current_selection.runtime).default_color(),
]),
Line::from(vec![
"Path: ".primary().bold(),
current_selection.path.clone().default(),
current_selection.path.clone().default_color(),
]),
Line::from(vec![
"Quality Profile: ".primary().bold(),
quality_profile.default(),
quality_profile.default_color(),
]),
Line::from(vec![
"Language Profile: ".primary().bold(),
language_profile.default(),
language_profile.default_color(),
]),
Line::from(vec![
"Monitored: ".primary().bold(),
monitored.default_color(),
]),
Line::from(vec!["Monitored: ".primary().bold(), monitored.default()]),
];
if let Some(stats) = current_selection.statistics.as_ref() {
let size = convert_to_gb(stats.size_on_disk);
series_description.extend(vec![Line::from(vec![
"Size on Disk: ".primary().bold(),
format!("{size:.2} GB").default(),
format!("{size:.2} GB").default_color(),
])]);
}
@@ -421,7 +428,7 @@ fn draw_history_item_details_popup(f: &mut Frame<'_>, app: &mut App<'_>, area: R
let message = Message::new(text)
.title("Details")
.style(Style::new().secondary())
.style(secondary_style())
.alignment(Alignment::Left);
f.render_widget(Popup::new(message).size(Size::NarrowMessage), area);