116 lines
3.7 KiB
Rust
116 lines
3.7 KiB
Rust
// src/components/form/form.rs
|
|
use crate::components::common::autocomplete;
|
|
use crate::components::handlers::canvas::render_canvas;
|
|
use crate::config::colors::themes::Theme;
|
|
use crate::state::app::highlight::HighlightState;
|
|
use crate::state::pages::canvas_state::CanvasState;
|
|
use crate::state::pages::form::FormState;
|
|
use ratatui::{
|
|
layout::{Alignment, Constraint, Direction, Layout, Margin, Rect},
|
|
style::Style,
|
|
widgets::{Block, Borders, Paragraph},
|
|
Frame,
|
|
};
|
|
|
|
pub fn render_form(
|
|
f: &mut Frame,
|
|
area: Rect,
|
|
form_state: &FormState, // <--- CHANGE THIS to the concrete type
|
|
fields: &[&str],
|
|
current_field_idx: &usize,
|
|
inputs: &[&String],
|
|
table_name: &str,
|
|
theme: &Theme,
|
|
is_edit_mode: bool,
|
|
highlight_state: &HighlightState,
|
|
total_count: u64,
|
|
current_position: u64,
|
|
) {
|
|
let card_title = format!(" {} ", table_name);
|
|
|
|
let adresar_card = Block::default()
|
|
.borders(Borders::ALL)
|
|
.border_style(Style::default().fg(theme.border))
|
|
.title(card_title)
|
|
.style(Style::default().bg(theme.bg).fg(theme.fg));
|
|
|
|
f.render_widget(adresar_card, area);
|
|
|
|
let inner_area = area.inner(Margin {
|
|
horizontal: 1,
|
|
vertical: 1,
|
|
});
|
|
|
|
let main_layout = Layout::default()
|
|
.direction(Direction::Vertical)
|
|
.constraints([Constraint::Length(1), Constraint::Min(1)])
|
|
.split(inner_area);
|
|
|
|
let count_position_text = if total_count == 0 && current_position == 1 {
|
|
"Total: 0 | New Entry".to_string()
|
|
} else if current_position > total_count && total_count > 0 {
|
|
format!("Total: {} | New Entry ({})", total_count, current_position)
|
|
} else if total_count == 0 && current_position > 1 {
|
|
format!("Total: 0 | New Entry ({})", current_position)
|
|
} else {
|
|
format!(
|
|
"Total: {} | Position: {}/{}",
|
|
total_count, current_position, total_count
|
|
)
|
|
};
|
|
let count_para = Paragraph::new(count_position_text)
|
|
.style(Style::default().fg(theme.fg))
|
|
.alignment(Alignment::Left);
|
|
f.render_widget(count_para, main_layout[0]);
|
|
|
|
// Get the active field's rect from render_canvas
|
|
let active_field_rect = render_canvas(
|
|
f,
|
|
main_layout[1],
|
|
form_state,
|
|
fields,
|
|
current_field_idx,
|
|
inputs,
|
|
theme,
|
|
is_edit_mode,
|
|
highlight_state,
|
|
);
|
|
|
|
// --- NEW: RENDER AUTOCOMPLETE ---
|
|
if form_state.autocomplete_active {
|
|
if let Some(active_rect) = active_field_rect {
|
|
let selected_index = form_state.get_selected_suggestion_index();
|
|
|
|
if let Some(rich_suggestions) = form_state.get_rich_suggestions() {
|
|
if !rich_suggestions.is_empty() {
|
|
// CHANGE THIS to call the renamed function
|
|
autocomplete::render_hit_autocomplete_dropdown(
|
|
f,
|
|
active_rect,
|
|
f.area(),
|
|
theme,
|
|
rich_suggestions,
|
|
selected_index,
|
|
form_state,
|
|
);
|
|
}
|
|
}
|
|
// The fallback to simple suggestions is now correctly handled
|
|
// because the original render_autocomplete_dropdown exists again.
|
|
else if let Some(simple_suggestions) = form_state.get_suggestions() {
|
|
if !simple_suggestions.is_empty() {
|
|
autocomplete::render_autocomplete_dropdown(
|
|
f,
|
|
active_rect,
|
|
f.area(),
|
|
theme,
|
|
simple_suggestions,
|
|
selected_index,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|