Refactored tables and loading blocks to use the new dedicated widgets for Tables and Loading blocks

This commit is contained in:
2024-02-10 19:23:19 -07:00
parent 68de986c48
commit 51b789fd0f
19 changed files with 1174 additions and 1150 deletions
+3 -2
View File
@@ -8,7 +8,8 @@ use crate::ui::utils::title_block_centered;
use crate::ui::widgets::button::Button;
use crate::ui::widgets::checkbox::Checkbox;
use crate::ui::widgets::input_box::InputBox;
use crate::ui::{draw_popup_over, loading, DrawUi};
use crate::ui::widgets::loading_block::LoadingBlock;
use crate::ui::{draw_popup_over, DrawUi};
use ratatui::layout::{Constraint, Flex, Layout, Rect};
use ratatui::Frame;
@@ -160,6 +161,6 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
f.render_widget(cancel_button, cancel_area);
}
} else {
loading(f, block, area, app.is_loading);
f.render_widget(LoadingBlock::new(app.is_loading, block), area);
}
}
@@ -13,7 +13,8 @@ use crate::ui::utils::title_block_centered;
use crate::ui::widgets::button::Button;
use crate::ui::widgets::checkbox::Checkbox;
use crate::ui::widgets::input_box::InputBox;
use crate::ui::{draw_popup_over, loading, DrawUi};
use crate::ui::widgets::loading_block::LoadingBlock;
use crate::ui::{draw_popup_over, DrawUi};
#[cfg(test)]
#[path = "indexer_settings_ui_tests.rs"]
@@ -155,6 +156,6 @@ fn draw_edit_indexer_settings_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area:
f.render_widget(save_button, save_area);
f.render_widget(cancel_button, cancel_area);
} else {
loading(f, block, area, app.is_loading);
f.render_widget(LoadingBlock::new(app.is_loading, block), area);
}
}
+73 -74
View File
@@ -12,7 +12,8 @@ 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::{draw_prompt_box, draw_prompt_popup_over, draw_table, DrawUi, TableProps};
use crate::ui::widgets::managarr_table::ManagarrTable;
use crate::ui::{draw_prompt_box, draw_prompt_popup_over, DrawUi};
mod edit_indexer_ui;
mod indexer_settings_ui;
@@ -59,83 +60,81 @@ impl DrawUi for IndexersUi {
}
fn draw_indexers(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
draw_table(
f,
area,
layout_block_top_border(),
TableProps {
content: Some(&mut app.data.radarr_data.indexers),
wrapped_content: None,
table_headers: vec![
"Indexer",
"RSS",
"Automatic Search",
"Interactive Search",
"Priority",
"Tags",
],
constraints: vec![
Constraint::Percentage(25),
Constraint::Percentage(13),
Constraint::Percentage(13),
Constraint::Percentage(13),
Constraint::Percentage(13),
Constraint::Percentage(23),
],
help: app
.data
.radarr_data
.main_tabs
.get_active_tab_contextual_help(),
},
|indexer: &'_ Indexer| {
let Indexer {
name,
enable_rss,
enable_automatic_search,
enable_interactive_search,
priority,
tags,
..
} = indexer;
let bool_to_text = |flag: bool| {
if flag {
return Text::from("Enabled").success();
}
let indexers_row_mapping = |indexer: &'_ Indexer| {
let Indexer {
name,
enable_rss,
enable_automatic_search,
enable_interactive_search,
priority,
tags,
..
} = indexer;
let bool_to_text = |flag: bool| {
if flag {
return Text::from("Enabled").success();
}
Text::from("Disabled").failure()
};
Text::from("Disabled").failure()
};
let rss = bool_to_text(*enable_rss);
let automatic_search = bool_to_text(*enable_automatic_search);
let interactive_search = bool_to_text(*enable_interactive_search);
let tags: String = tags
.iter()
.map(|tag_id| {
app
.data
.radarr_data
.tags_map
.get_by_left(&tag_id.as_i64().unwrap())
.unwrap()
.clone()
})
.collect::<Vec<String>>()
.join(", ");
let rss = bool_to_text(*enable_rss);
let automatic_search = bool_to_text(*enable_automatic_search);
let interactive_search = bool_to_text(*enable_interactive_search);
let tags: String = tags
.iter()
.map(|tag_id| {
app
.data
.radarr_data
.tags_map
.get_by_left(&tag_id.as_i64().unwrap())
.unwrap()
.clone()
})
.collect::<Vec<String>>()
.join(", ");
Row::new(vec![
Cell::from(name.clone().unwrap_or_default()),
Cell::from(rss),
Cell::from(automatic_search),
Cell::from(interactive_search),
Cell::from(priority.to_string()),
Cell::from(tags),
])
.primary()
},
app.is_loading,
true,
Row::new(vec![
Cell::from(name.clone().unwrap_or_default()),
Cell::from(rss),
Cell::from(automatic_search),
Cell::from(interactive_search),
Cell::from(priority.to_string()),
Cell::from(tags),
])
.primary()
};
let indexers_table_footer = app
.data
.radarr_data
.main_tabs
.get_active_tab_contextual_help();
let indexers_table = ManagarrTable::new(
Some(&mut app.data.radarr_data.indexers),
indexers_row_mapping,
)
.block(layout_block_top_border())
.footer(indexers_table_footer)
.loading(app.is_loading)
.headers([
"Indexer",
"RSS",
"Automatic Search",
"Interactive Search",
"Priority",
"Tags",
])
.constraints([
Constraint::Percentage(25),
Constraint::Percentage(13),
Constraint::Percentage(13),
Constraint::Percentage(13),
Constraint::Percentage(13),
Constraint::Percentage(23),
]);
f.render_widget(indexers_table, area);
}
fn draw_delete_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
@@ -6,10 +6,9 @@ use crate::models::Route;
use crate::ui::radarr_ui::indexers::draw_indexers;
use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{borderless_block, get_width_from_percentage, title_block};
use crate::ui::{
draw_help_footer_and_get_content_area, draw_large_popup_over, draw_table, DrawUi, TableProps,
};
use ratatui::layout::{Constraint, Rect};
use crate::ui::widgets::managarr_table::ManagarrTable;
use crate::ui::{draw_large_popup_over, DrawUi};
use ratatui::layout::{Alignment, Constraint, Rect};
use ratatui::widgets::{Cell, Row};
use ratatui::Frame;
@@ -47,47 +46,45 @@ fn draw_test_all_indexers_test_results(f: &mut Frame<'_>, app: &mut App<'_>, are
IndexerTestResultModalItem::default()
};
f.render_widget(title_block("Test All Indexers"), area);
let help = Some(format!(
let help_footer = format!(
"<↑↓> scroll | {}",
build_context_clue_string(&BARE_POPUP_CONTEXT_CLUES)
));
let content_area = draw_help_footer_and_get_content_area(f, area, help);
draw_table(
f,
content_area,
borderless_block(),
TableProps {
content: app.data.radarr_data.indexer_test_all_results.as_mut(),
wrapped_content: None,
table_headers: vec!["Indexer", "Pass/Fail", "Failure Messages"],
constraints: vec![
Constraint::Percentage(20),
Constraint::Percentage(10),
Constraint::Percentage(70),
],
help: None,
},
|result| {
result.validation_failures.scroll_left_or_reset(
get_width_from_percentage(area, 86),
*result == current_selection,
app.tick_count % app.ticks_until_scroll == 0,
);
let pass_fail = if result.is_valid { "" } else { "" };
let row = Row::new(vec![
Cell::from(result.name.to_owned()),
Cell::from(pass_fail.to_owned()),
Cell::from(result.validation_failures.to_string()),
]);
if result.is_valid {
row.success()
} else {
row.failure()
}
},
app.is_loading,
true,
);
let test_results_row_mapping = |result: &IndexerTestResultModalItem| {
result.validation_failures.scroll_left_or_reset(
get_width_from_percentage(area, 86),
*result == current_selection,
app.tick_count % app.ticks_until_scroll == 0,
);
let pass_fail = if result.is_valid { "" } else { "" };
let row = Row::new(vec![
Cell::from(result.name.to_owned()),
Cell::from(pass_fail.to_owned()),
Cell::from(result.validation_failures.to_string()),
]);
if result.is_valid {
row.success()
} else {
row.failure()
}
};
let indexers_test_results_table = ManagarrTable::new(
app.data.radarr_data.indexer_test_all_results.as_mut(),
test_results_row_mapping,
)
.block(borderless_block())
.loading(app.is_loading)
.footer(Some(help_footer))
.footer_alignment(Alignment::Center)
.margin(1)
.headers(["Indexer", "Pass/Fail", "Failure Messages"])
.constraints([
Constraint::Percentage(20),
Constraint::Percentage(10),
Constraint::Percentage(70),
]);
f.render_widget(indexers_test_results_table, area);
}