81 lines
3.5 KiB
Rust
81 lines
3.5 KiB
Rust
// src/tui/functions/form.rs
|
|
use crate::state::pages::form::FormState;
|
|
use crate::services::grpc_client::GrpcClient;
|
|
use crate::state::canvas_state::CanvasState;
|
|
|
|
pub async fn handle_action(
|
|
action: &str,
|
|
form_state: &mut FormState,
|
|
grpc_client: &mut GrpcClient,
|
|
current_position: &mut u64,
|
|
total_count: u64,
|
|
ideal_cursor_column: &mut usize,
|
|
) -> Result<String, Box<dyn std::error::Error>> {
|
|
match action {
|
|
"previous_entry" => {
|
|
let new_position = current_position.saturating_sub(1);
|
|
if new_position >= 1 {
|
|
*current_position = new_position;
|
|
let response = grpc_client.get_adresar_by_position(*current_position).await?;
|
|
|
|
// Direct field assignments
|
|
form_state.id = response.id;
|
|
form_state.values = vec![
|
|
response.firma, response.kz, response.drc,
|
|
response.ulica, response.psc, response.mesto,
|
|
response.stat, response.banka, response.ucet,
|
|
response.skladm, response.ico, response.kontakt,
|
|
response.telefon, response.skladu, response.fax,
|
|
];
|
|
|
|
let current_input = form_state.get_current_input();
|
|
let max_cursor_pos = if !current_input.is_empty() {
|
|
current_input.len() - 1
|
|
} else { 0 };
|
|
form_state.current_cursor_pos = std::cmp::min(*ideal_cursor_column, max_cursor_pos);
|
|
form_state.has_unsaved_changes = false;
|
|
|
|
Ok(format!("Loaded form entry {}", *current_position))
|
|
} else {
|
|
Ok("Already at first form entry".into())
|
|
}
|
|
}
|
|
"next_entry" => {
|
|
if *current_position <= total_count {
|
|
*current_position += 1;
|
|
if *current_position <= total_count {
|
|
let response = grpc_client.get_adresar_by_position(*current_position).await?;
|
|
|
|
// Direct field assignments
|
|
form_state.id = response.id;
|
|
form_state.values = vec![
|
|
response.firma, response.kz, response.drc,
|
|
response.ulica, response.psc, response.mesto,
|
|
response.stat, response.banka, response.ucet,
|
|
response.skladm, response.ico, response.kontakt,
|
|
response.telefon, response.skladu, response.fax,
|
|
];
|
|
|
|
let current_input = form_state.get_current_input();
|
|
let max_cursor_pos = if !current_input.is_empty() {
|
|
current_input.len() - 1
|
|
} else { 0 };
|
|
form_state.current_cursor_pos = std::cmp::min(*ideal_cursor_column, max_cursor_pos);
|
|
form_state.has_unsaved_changes = false;
|
|
|
|
Ok(format!("Loaded form entry {}", *current_position))
|
|
} else {
|
|
form_state.reset_to_empty();
|
|
form_state.current_field = 0;
|
|
form_state.current_cursor_pos = 0;
|
|
*ideal_cursor_column = 0;
|
|
Ok("New form entry mode".into())
|
|
}
|
|
} else {
|
|
Ok("Already at last entry".into())
|
|
}
|
|
}
|
|
_ => Err("Unknown form action".into())
|
|
}
|
|
}
|