diff --git a/config.toml b/config.toml index c189cba..d6f4007 100644 --- a/config.toml +++ b/config.toml @@ -6,3 +6,5 @@ force_quit = [":q!", "ctrl+shift+q"] save_and_quit = [":wq", "ctrl+shift+s"] enter_edit_mode = ["i", "ctrl+e"] exit_edit_mode = ["esc", "ctrl+e"] +previous_position = ["Left", "9"] +next_position = ["Right", "8"] diff --git a/src/client/ui/handlers/event.rs b/src/client/ui/handlers/event.rs index bb014d5..9bed1ad 100644 --- a/src/client/ui/handlers/event.rs +++ b/src/client/ui/handlers/event.rs @@ -53,32 +53,101 @@ impl EventHandler { } if !self.is_edit_mode { - // Read-only mode handling - match key.code { - KeyCode::Char(':') => { - self.command_mode = true; - self.command_input.clear(); - self.command_message.clear(); - } - KeyCode::Esc => { - self.command_mode = false; - self.command_input.clear(); - self.command_message.clear(); - } - KeyCode::Tab | KeyCode::BackTab | KeyCode::Down | KeyCode::Up => { - if key.modifiers.contains(KeyModifiers::SHIFT) { - form_state.current_field = form_state.current_field.saturating_sub(1); - } else { - form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); + // Check if key is for navigation + if key.code == KeyCode::Left { + let new_position = current_position.saturating_sub(1); + if new_position >= 1 { + *current_position = new_position; + match app_terminal.get_adresar_by_position(*current_position).await { + Ok(response) => { + // Update all form fields from the response + form_state.firma = response.firma; + form_state.kz = response.kz; + form_state.drc = response.drc; + form_state.ulica = response.ulica; + form_state.psc = response.psc; + form_state.mesto = response.mesto; + form_state.stat = response.stat; + form_state.banka = response.banka; + form_state.ucet = response.ucet; + form_state.skladm = response.skladm; + form_state.ico = response.ico; + form_state.kontakt = response.kontakt; + form_state.telefon = response.telefon; + form_state.skladu = response.skladu; + form_state.fax = response.fax; + + // Reset form state + form_state.current_field = 0; + form_state.has_unsaved_changes = false; + self.command_message = format!("Loaded entry {}", *current_position); + } + Err(e) => { + self.command_message = format!("Error loading entry: {}", e); + } } + return Ok((false, self.command_message.clone())); } - _ => { - if !self.edit_mode_cooldown { - let default_key = "i".to_string(); - let edit_key = config.keybindings.get("enter_edit_mode") - .and_then(|keys| keys.first()) - .unwrap_or(&default_key); - self.command_message = format!("Read-only mode - press {} to edit", edit_key); + } else if key.code == KeyCode::Right { + if *current_position < total_count { + *current_position += 1; + match app_terminal.get_adresar_by_position(*current_position).await { + Ok(response) => { + // Update all form fields + form_state.firma = response.firma; + form_state.kz = response.kz; + form_state.drc = response.drc; + form_state.ulica = response.ulica; + form_state.psc = response.psc; + form_state.mesto = response.mesto; + form_state.stat = response.stat; + form_state.banka = response.banka; + form_state.ucet = response.ucet; + form_state.skladm = response.skladm; + form_state.ico = response.ico; + form_state.kontakt = response.kontakt; + form_state.telefon = response.telefon; + form_state.skladu = response.skladu; + form_state.fax = response.fax; + + form_state.current_field = 0; + form_state.has_unsaved_changes = false; + self.command_message = format!("Loaded entry {}", *current_position); + } + Err(e) => { + self.command_message = format!("Error loading entry: {}", e); + } + } + return Ok((false, self.command_message.clone())); + } + } else { + // Handle other read-only mode keys + match key.code { + KeyCode::Char(':') => { + self.command_mode = true; + self.command_input.clear(); + self.command_message.clear(); + } + KeyCode::Esc => { + self.command_mode = false; + self.command_input.clear(); + self.command_message.clear(); + } + KeyCode::Tab | KeyCode::BackTab | KeyCode::Down | KeyCode::Up => { + if key.modifiers.contains(KeyModifiers::SHIFT) { + form_state.current_field = form_state.current_field.saturating_sub(1); + } else { + form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); + } + } + _ => { + if !self.edit_mode_cooldown { + let default_key = "i".to_string(); + let edit_key = config.keybindings.get("enter_edit_mode") + .and_then(|keys| keys.first()) + .unwrap_or(&default_key); + self.command_message = format!("Read-only mode - press {} to edit", edit_key); + } } } } diff --git a/src/client/ui/handlers/ui.rs b/src/client/ui/handlers/ui.rs index a953530..c4c4392 100644 --- a/src/client/ui/handlers/ui.rs +++ b/src/client/ui/handlers/ui.rs @@ -26,6 +26,14 @@ pub async fn run_ui() -> Result<(), Box> { app_state.update_total_count(total_count); app_state.update_current_position(total_count + 1); + // Load initial data if there are existing entries + if total_count > 0 { + let response = app_terminal + .get_adresar_by_position(total_count) + .await?; + update_form_state_from_response(&mut form_state, response); + } + loop { let total_count = app_terminal.get_adresar_count().await?; app_state.update_total_count(total_count); @@ -55,10 +63,54 @@ pub async fn run_ui() -> Result<(), Box> { app_state.total_count, &mut app_state.current_position, ).await?; - + + // Handle position changes and update form state + if !event_handler.is_edit_mode { + if app_state.current_position > total_count { + app_state.current_position = total_count; + } + + if app_state.current_position >= 1 && app_state.current_position <= total_count { + match app_terminal + .get_adresar_by_position(app_state.current_position) + .await + { + Ok(response) => { + update_form_state_from_response(&mut form_state, response); + } + Err(e) => { + event_handler.command_message = + format!("Error loading entry: {}", e); + } + } + } + } + event_handler.command_message = message; if should_exit { return Ok(()); } } } + +// Helper function to update form state from gRPC response +fn update_form_state_from_response(form_state: &mut FormState, response: crate::proto::multieko2::AdresarResponse) { + form_state.firma = response.firma; + form_state.kz = response.kz; + form_state.drc = response.drc; + form_state.ulica = response.ulica; + form_state.psc = response.psc; + form_state.mesto = response.mesto; + form_state.stat = response.stat; + form_state.banka = response.banka; + form_state.ucet = response.ucet; + form_state.skladm = response.skladm; + form_state.ico = response.ico; + form_state.kontakt = response.kontakt; + form_state.telefon = response.telefon; + form_state.skladu = response.skladu; + form_state.fax = response.fax; + + form_state.current_field = 0; + form_state.has_unsaved_changes = false; +}