build: Upgraded to Ratatui v0.30.0 and fixed a new security vulnerability [#13]
This commit is contained in:
@@ -3,7 +3,7 @@ use crate::models::Route;
|
||||
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS};
|
||||
use crate::models::sonarr_models::BlocklistItem;
|
||||
use crate::ui::DrawUi;
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::styles::{ManagarrStyle, secondary_style};
|
||||
use crate::ui::utils::layout_block_top_border;
|
||||
use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt;
|
||||
use crate::ui::widgets::managarr_table::ManagarrTable;
|
||||
@@ -11,7 +11,7 @@ use crate::ui::widgets::message::Message;
|
||||
use crate::ui::widgets::popup::{Popup, Size};
|
||||
use ratatui::Frame;
|
||||
use ratatui::layout::{Alignment, Constraint, Rect};
|
||||
use ratatui::style::{Style, Stylize};
|
||||
use ratatui::style::Stylize;
|
||||
use ratatui::text::{Line, Text};
|
||||
use ratatui::widgets::{Cell, Row};
|
||||
|
||||
@@ -163,7 +163,7 @@ fn draw_blocklist_item_details_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
|
||||
|
||||
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), f.area());
|
||||
|
||||
@@ -4,14 +4,13 @@ use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTOR
|
||||
use crate::models::servarr_models::Language;
|
||||
use crate::models::sonarr_models::{SonarrHistoryEventType, SonarrHistoryItem};
|
||||
use crate::ui::DrawUi;
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::styles::{ManagarrStyle, secondary_style};
|
||||
use crate::ui::utils::{get_width_from_percentage, layout_block_top_border};
|
||||
use crate::ui::widgets::managarr_table::ManagarrTable;
|
||||
use crate::ui::widgets::message::Message;
|
||||
use crate::ui::widgets::popup::{Popup, Size};
|
||||
use ratatui::Frame;
|
||||
use ratatui::layout::{Alignment, Constraint, Rect};
|
||||
use ratatui::style::Style;
|
||||
use ratatui::text::Text;
|
||||
use ratatui::widgets::{Cell, Row};
|
||||
|
||||
@@ -151,7 +150,7 @@ fn draw_history_item_details_popup(f: &mut Frame<'_>, app: &mut App<'_>) {
|
||||
|
||||
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), f.area());
|
||||
|
||||
@@ -4,7 +4,6 @@ use crate::app::App;
|
||||
use crate::models::Route;
|
||||
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS};
|
||||
use crate::render_selectable_input_box;
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::utils::title_block_centered;
|
||||
use crate::ui::widgets::button::Button;
|
||||
use crate::ui::widgets::checkbox::Checkbox;
|
||||
@@ -151,10 +150,10 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||
.flex(Flex::Center)
|
||||
.areas(buttons_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);
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ use crate::models::servarr_data::sonarr::sonarr_data::{
|
||||
ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS,
|
||||
};
|
||||
use crate::render_selectable_input_box;
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::utils::title_block_centered;
|
||||
use crate::ui::widgets::button::Button;
|
||||
use crate::ui::widgets::input_box::InputBox;
|
||||
@@ -103,10 +102,10 @@ fn draw_edit_indexer_settings_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area:
|
||||
.flex(Flex::Center)
|
||||
.areas(buttons_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);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use crate::ui::styles::success_style;
|
||||
use ratatui::Frame;
|
||||
use ratatui::layout::{Constraint, Rect};
|
||||
use ratatui::style::{Style, Stylize};
|
||||
use ratatui::text::Text;
|
||||
use ratatui::widgets::{Cell, Row};
|
||||
|
||||
@@ -73,7 +73,7 @@ impl DrawUi for IndexersUi {
|
||||
} else {
|
||||
let message = Message::new("Indexer test succeeded!")
|
||||
.title("Success")
|
||||
.style(Style::new().success().bold());
|
||||
.style(success_style().bold());
|
||||
Popup::new(message).size(Size::Message)
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -173,7 +173,7 @@ fn draw_stats_context(f: &mut Frame<'_>, app: &App<'_>, area: Rect) {
|
||||
let space: f64 = convert_to_gb(*free_space);
|
||||
let root_folder_space = Paragraph::new(format!("{path}: {space:.2} GB free"))
|
||||
.block(borderless_block())
|
||||
.default();
|
||||
.default_color();
|
||||
|
||||
f.render_widget(
|
||||
root_folder_space,
|
||||
@@ -224,7 +224,7 @@ fn draw_sonarr_logo(f: &mut Frame<'_>, area: Rect) {
|
||||
let logo_text = Text::from(SONARR_LOGO);
|
||||
let logo = Paragraph::new(logo_text)
|
||||
.light_cyan()
|
||||
.block(layout_block().default())
|
||||
.block(layout_block().default_color())
|
||||
.centered();
|
||||
f.render_widget(logo, area);
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use crate::ui::styles::default_style;
|
||||
use std::ops::Sub;
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -5,7 +6,6 @@ use crate::ui::ui_test_utils::test_utils::Utc;
|
||||
#[cfg(not(test))]
|
||||
use chrono::Utc;
|
||||
use ratatui::layout::Layout;
|
||||
use ratatui::style::Style;
|
||||
use ratatui::text::{Span, Text};
|
||||
use ratatui::widgets::{Cell, Row};
|
||||
use ratatui::{
|
||||
@@ -171,7 +171,7 @@ fn draw_logs(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
|
||||
style_log_list_item(ListItem::new(Text::from(Span::raw(log_line))), level)
|
||||
})
|
||||
.block(block)
|
||||
.highlight_style(Style::new().default());
|
||||
.highlight_style(default_style());
|
||||
|
||||
f.render_widget(logs_box, area);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user