diff --git a/client/src/modes/canvas/read_only.rs b/client/src/modes/canvas/read_only.rs index 2d9f76c..e8729ec 100644 --- a/client/src/modes/canvas/read_only.rs +++ b/client/src/modes/canvas/read_only.rs @@ -163,73 +163,15 @@ async fn execute_action( grpc_client: &mut GrpcClient, ) -> Result> { match action { - "previous_entry" => { - let new_position = current_position.saturating_sub(1); - if new_position >= 1 { - *current_position = new_position; - match grpc_client.get_adresar_by_position(*current_position).await { - Ok(response) => { - // Replace update_from_response with 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; - *command_message = format!("Loaded entry {}", *current_position); - } - Err(e) => { - *command_message = format!("Error loading entry: {}", e); - } - } - key_sequence_tracker.reset(); - } - Ok(command_message.clone()) + "previous_entry" | "next_entry" => { + // This will only be called when no component is active + key_sequence_tracker.reset(); + Ok(format!("Navigation only available in form mode")) } - "next_entry" => { - if *current_position <= total_count { - *current_position += 1; - if *current_position <= total_count { - match grpc_client.get_adresar_by_position(*current_position).await { - Ok(response) => { - 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; - *command_message = format!("Loaded entry {}", *current_position); - } - Err(e) => { - *command_message = format!("Error loading entry: {}", e); - } - } - } else { - form_state.reset_to_empty(); - form_state.current_field = 0; - form_state.current_cursor_pos = 0; - *ideal_cursor_column = 0; - *command_message = "New entry mode".to_string(); - } - key_sequence_tracker.reset(); - } - Ok(command_message.clone()) + "exit_edit_mode" => { + key_sequence_tracker.reset(); + command_message.clear(); + Ok("".to_string()) } "exit_edit_mode" => { key_sequence_tracker.reset(); diff --git a/client/src/tui/functions/form.rs b/client/src/tui/functions/form.rs index da62771..295fbce 100644 --- a/client/src/tui/functions/form.rs +++ b/client/src/tui/functions/form.rs @@ -1,7 +1,7 @@ // src/tui/functions/form.rs - use crate::state::pages::form::FormState; use crate::tui::terminal::GrpcClient; +use common::proto::multieko2::adresar::AdresarResponse; pub async fn handle_action( action: &str, @@ -13,18 +13,68 @@ pub async fn handle_action( ) -> Result> { match action { "previous_entry" => { - // Form-specific previous entry logic 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?; - form_state.update_from_response(response); + + // 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()) } } - // Other form-specific actions... + "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()) } }