From 5f41e9aa6fb0ec12484f057352de98772ade787d Mon Sep 17 00:00:00 2001 From: filipriec Date: Thu, 27 Feb 2025 10:36:06 +0100 Subject: [PATCH] working split of event.rs --- client/src/modes/handlers.rs | 1 + client/src/modes/handlers/edit.rs | 240 ++++++++++++++++++++++++++ client/src/modes/handlers/event.rs | 263 +++-------------------------- 3 files changed, 261 insertions(+), 243 deletions(-) diff --git a/client/src/modes/handlers.rs b/client/src/modes/handlers.rs index 09942a9..ed0e5d1 100644 --- a/client/src/modes/handlers.rs +++ b/client/src/modes/handlers.rs @@ -1,2 +1,3 @@ // src/client/modes/handlers.rs pub mod event; +pub mod edit; diff --git a/client/src/modes/handlers/edit.rs b/client/src/modes/handlers/edit.rs index e69de29..7254b54 100644 --- a/client/src/modes/handlers/edit.rs +++ b/client/src/modes/handlers/edit.rs @@ -0,0 +1,240 @@ +// src/modes/handlers/edit.rs + +use crossterm::event::{KeyEvent, KeyCode, KeyModifiers}; +use crate::tui::terminal::AppTerminal; +use crate::config::config::Config; +use common::proto::multieko2::adresar::{PostAdresarRequest, PutAdresarRequest}; +use crate::ui::handlers::form::FormState; + +pub async fn handle_edit_event( + key: KeyEvent, + config: &Config, + form_state: &mut FormState, + is_edit_mode: &mut bool, + edit_mode_cooldown: &mut bool, + ideal_cursor_column: &mut usize, + command_message: &mut String, + command_mode: &mut bool, + command_input: &mut String, + app_terminal: &mut AppTerminal, + is_saved: &mut bool, + current_position: &mut u64, + total_count: u64, +) -> Result<(bool, String), Box> { + if *command_mode { + match key.code { + KeyCode::Enter => { + let command = command_input.trim(); + if command.is_empty() { + *command_message = "Empty command".to_string(); + return Ok((false, command_message.clone())); + } + + let action = config.get_action_for_command(command) + .unwrap_or("unknown"); + + if action == "save" { + let is_new = *current_position == total_count + 1; + + let message = if is_new { + let post_request = PostAdresarRequest { + firma: form_state.values[0].clone(), + kz: form_state.values[1].clone(), + drc: form_state.values[2].clone(), + ulica: form_state.values[3].clone(), + psc: form_state.values[4].clone(), + mesto: form_state.values[5].clone(), + stat: form_state.values[6].clone(), + banka: form_state.values[7].clone(), + ucet: form_state.values[8].clone(), + skladm: form_state.values[9].clone(), + ico: form_state.values[10].clone(), + kontakt: form_state.values[11].clone(), + telefon: form_state.values[12].clone(), + skladu: form_state.values[13].clone(), + fax: form_state.values[14].clone(), + }; + let response = app_terminal.post_adresar(post_request).await?; + let new_total = app_terminal.get_adresar_count().await?; + *current_position = new_total; + form_state.id = response.into_inner().id; + "New entry created".to_string() + } else { + let put_request = PutAdresarRequest { + id: form_state.id, + firma: form_state.values[0].clone(), + kz: form_state.values[1].clone(), + drc: form_state.values[2].clone(), + ulica: form_state.values[3].clone(), + psc: form_state.values[4].clone(), + mesto: form_state.values[5].clone(), + stat: form_state.values[6].clone(), + banka: form_state.values[7].clone(), + ucet: form_state.values[8].clone(), + skladm: form_state.values[9].clone(), + ico: form_state.values[10].clone(), + kontakt: form_state.values[11].clone(), + telefon: form_state.values[12].clone(), + skladu: form_state.values[13].clone(), + fax: form_state.values[14].clone(), + }; + let _ = app_terminal.put_adresar(put_request).await?; + "Entry updated".to_string() + }; + + *is_saved = true; + form_state.has_unsaved_changes = false; + command_input.clear(); + *command_mode = false; + command_message.clear(); + return Ok((false, message)); + } else { + let (should_exit, message) = app_terminal + .handle_command(action, is_saved) + .await?; + *command_message = message; + command_input.clear(); + *command_mode = false; + return Ok((should_exit, command_message.clone())); + } + } + KeyCode::Char(c) => command_input.push(c), + KeyCode::Backspace => { + command_input.pop(); + } + KeyCode::Esc => { + *command_mode = false; + command_input.clear(); + command_message.clear(); + } + _ => {} + } + } else { + match key.code { + KeyCode::Left => { + form_state.current_cursor_pos = form_state.current_cursor_pos.saturating_sub(1); + *ideal_cursor_column = form_state.current_cursor_pos; + return Ok((false, "".to_string())); + } + KeyCode::Right => { + let current_input = form_state.get_current_input(); + if form_state.current_cursor_pos < current_input.len() { + form_state.current_cursor_pos += 1; + *ideal_cursor_column = form_state.current_cursor_pos; + } + return Ok((false, "".to_string())); + } + KeyCode::Char(':') => { + *command_mode = true; + command_input.clear(); + command_message.clear(); + } + KeyCode::Esc => { + if config.is_exit_edit_mode(key.code, key.modifiers) { + if form_state.has_unsaved_changes { + *command_message = "Unsaved changes! Use :w to save or :q! to discard".to_string(); + return Ok((false, command_message.clone())); + } + *is_edit_mode = false; + *edit_mode_cooldown = true; + *command_message = "Read-only mode".to_string(); + + let current_input = form_state.get_current_input(); + if !current_input.is_empty() && form_state.current_cursor_pos >= current_input.len() { + form_state.current_cursor_pos = current_input.len() - 1; + *ideal_cursor_column = form_state.current_cursor_pos; + } + + return Ok((false, command_message.clone())); + } + } + KeyCode::Down => { + form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::Up => { + if form_state.current_field == 0 { + form_state.current_field = form_state.fields.len() - 1; + } else { + form_state.current_field = form_state.current_field.saturating_sub(1); + } + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::Tab => { + if key.modifiers.contains(KeyModifiers::SHIFT) { + if form_state.current_field == 0 { + form_state.current_field = form_state.fields.len() - 1; + } else { + 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(); + } + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::BackTab => { + if form_state.current_field == 0 { + form_state.current_field = form_state.fields.len() - 1; + } else { + form_state.current_field = form_state.current_field.saturating_sub(1); + } + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::Enter => { + form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::Char(c) => { + let cursor_pos = form_state.current_cursor_pos; + let field_value = form_state.get_current_input_mut(); + let mut chars: Vec = field_value.chars().collect(); + if cursor_pos <= chars.len() { + chars.insert(cursor_pos, c); + *field_value = chars.into_iter().collect(); + form_state.current_cursor_pos = cursor_pos + 1; + *ideal_cursor_column = form_state.current_cursor_pos; + form_state.has_unsaved_changes = true; + } + } + KeyCode::Backspace => { + if form_state.current_cursor_pos > 0 { + let cursor_pos = form_state.current_cursor_pos; + let field_value = form_state.get_current_input_mut(); + let mut chars: Vec = field_value.chars().collect(); + if cursor_pos <= chars.len() && cursor_pos > 0 { + chars.remove(cursor_pos - 1); + *field_value = chars.into_iter().collect(); + form_state.current_cursor_pos = cursor_pos - 1; + *ideal_cursor_column = form_state.current_cursor_pos; + form_state.has_unsaved_changes = true; + } + } + } + KeyCode::Delete => { + let cursor_pos = form_state.current_cursor_pos; + let field_value = form_state.get_current_input_mut(); + let chars: Vec = field_value.chars().collect(); + if cursor_pos < chars.len() { + let mut new_chars = chars.clone(); + new_chars.remove(cursor_pos); + *field_value = new_chars.into_iter().collect(); + form_state.has_unsaved_changes = true; + } + } + _ => {} + } + } + + *edit_mode_cooldown = false; + Ok((false, command_message.clone())) +} diff --git a/client/src/modes/handlers/event.rs b/client/src/modes/handlers/event.rs index 69127e6..f53438f 100644 --- a/client/src/modes/handlers/event.rs +++ b/client/src/modes/handlers/event.rs @@ -1,11 +1,11 @@ -// src/client/ui/handlers/event.rs +// src/modes/handlers/event.rs use crossterm::event::{Event, KeyCode, KeyModifiers}; use crossterm::cursor::{SetCursorStyle}; use crate::tui::terminal::AppTerminal; use crate::config::config::Config; -use common::proto::multieko2::adresar::{PostAdresarRequest, PutAdresarRequest}; use crate::ui::handlers::form::FormState; +use crate::modes::handlers::edit::handle_edit_event; pub struct EventHandler { pub command_mode: bool, @@ -80,7 +80,24 @@ impl EventHandler { return Ok((false, self.command_message.clone())); } - if !self.is_edit_mode { + if self.is_edit_mode { + // Delegate edit mode event handling to edit.rs + return handle_edit_event( + key, + config, + form_state, + &mut self.is_edit_mode, + &mut self.edit_mode_cooldown, + &mut self.ideal_cursor_column, + &mut self.command_message, + &mut self.command_mode, + &mut self.command_input, + app_terminal, + is_saved, + current_position, + total_count, + ).await; + } else { // Handle navigation between entries if key.code == KeyCode::Left { let new_position = current_position.saturating_sub(1); @@ -323,246 +340,6 @@ impl EventHandler { } } } - } else { - // Edit mode handling - if self.command_mode { - match key.code { - KeyCode::Enter => { - let command = self.command_input.trim(); - if command.is_empty() { - self.command_message = "Empty command".to_string(); - return Ok((false, self.command_message.clone())); - } - - let action = config.get_action_for_command(command) - .unwrap_or("unknown"); - - if action == "save" { - let is_new = *current_position == total_count + 1; - - let message = if is_new { - // POST new entry - let post_request = PostAdresarRequest { - firma: form_state.values[0].clone(), - kz: form_state.values[1].clone(), - drc: form_state.values[2].clone(), - ulica: form_state.values[3].clone(), - psc: form_state.values[4].clone(), - mesto: form_state.values[5].clone(), - stat: form_state.values[6].clone(), - banka: form_state.values[7].clone(), - ucet: form_state.values[8].clone(), - skladm: form_state.values[9].clone(), - ico: form_state.values[10].clone(), - kontakt: form_state.values[11].clone(), - telefon: form_state.values[12].clone(), - skladu: form_state.values[13].clone(), - fax: form_state.values[14].clone(), - }; - let response = app_terminal.post_adresar(post_request).await?; - // Update state - let new_total = app_terminal.get_adresar_count().await?; - *current_position = new_total; - form_state.id = response.into_inner().id; - "New entry created".to_string() - } else { - // PUT existing entry - let put_request = PutAdresarRequest { - id: form_state.id, - firma: form_state.values[0].clone(), - kz: form_state.values[1].clone(), - drc: form_state.values[2].clone(), - ulica: form_state.values[3].clone(), - psc: form_state.values[4].clone(), - mesto: form_state.values[5].clone(), - stat: form_state.values[6].clone(), - banka: form_state.values[7].clone(), - ucet: form_state.values[8].clone(), - skladm: form_state.values[9].clone(), - ico: form_state.values[10].clone(), - kontakt: form_state.values[11].clone(), - telefon: form_state.values[12].clone(), - skladu: form_state.values[13].clone(), - fax: form_state.values[14].clone(), - }; - let _ = app_terminal.put_adresar(put_request).await?; - "Entry updated".to_string() - }; - - *is_saved = true; - form_state.has_unsaved_changes = false; - self.command_input.clear(); // Clear the command input - self.command_mode = false; // Reset command mode - self.command_message.clear(); // Clear the command message - return Ok((false, message)); - } else { - let (should_exit, message) = app_terminal - .handle_command(action, is_saved) - .await?; - self.command_message = message; - self.command_input.clear(); // Clear the command input - self.command_mode = false; // Reset command mode - return Ok((should_exit, self.command_message.clone())); - } - } - KeyCode::Char(c) => self.command_input.push(c), - KeyCode::Backspace => { - self.command_input.pop(); - } - KeyCode::Esc => { - self.command_mode = false; - self.command_input.clear(); - self.command_message.clear(); - } - _ => {} - } - } else { - // Handle arrow keys in edit mode - match key.code { - KeyCode::Left => { - form_state.current_cursor_pos = form_state.current_cursor_pos.saturating_sub(1); - self.ideal_cursor_column = form_state.current_cursor_pos; - return Ok((false, "".to_string())); - } - KeyCode::Right => { - let current_input = form_state.get_current_input(); - if form_state.current_cursor_pos < current_input.len() { - form_state.current_cursor_pos += 1; - self.ideal_cursor_column = form_state.current_cursor_pos; - } - return Ok((false, "".to_string())); - } - KeyCode::Char(':') => { - self.command_mode = true; - self.command_input.clear(); - self.command_message.clear(); - } - KeyCode::Esc => { - if config.is_exit_edit_mode(key.code, key.modifiers) { - if form_state.has_unsaved_changes { - self.command_message = "Unsaved changes! Use :w to save or :q! to discard".to_string(); - return Ok((false, self.command_message.clone())); - } - self.is_edit_mode = false; - self.edit_mode_cooldown = true; - self.command_message = "Read-only mode".to_string(); - - // ADD THIS CODE RIGHT HERE: - let current_input = form_state.get_current_input(); - if !current_input.is_empty() && form_state.current_cursor_pos >= current_input.len() { - form_state.current_cursor_pos = current_input.len() - 1; - self.ideal_cursor_column = form_state.current_cursor_pos; - } - - return Ok((false, self.command_message.clone())); - } - }, - KeyCode::Down => { - form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); - let current_input = form_state.get_current_input(); - let max_cursor_pos = if !self.is_edit_mode && !current_input.is_empty() { - current_input.len() - 1 // In readonly mode, limit to last character - } else { - current_input.len() - }; - form_state.current_cursor_pos = self.ideal_cursor_column.min(max_cursor_pos); - } - KeyCode::Up => { - if form_state.current_field == 0 { - form_state.current_field = form_state.fields.len() - 1; - } else { - form_state.current_field = form_state.current_field.saturating_sub(1); - } - let current_input = form_state.get_current_input(); - let max_cursor_pos = if !self.is_edit_mode && !current_input.is_empty() { - current_input.len() - 1 // In readonly mode, limit to last character - } else { - current_input.len() - }; - form_state.current_cursor_pos = self.ideal_cursor_column.min(max_cursor_pos); - } - KeyCode::Tab => { - if key.modifiers.contains(KeyModifiers::SHIFT) { - if form_state.current_field == 0 { - form_state.current_field = form_state.fields.len() - 1; - } else { - 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(); - } - let current_input = form_state.get_current_input(); - let max_cursor_pos = if !self.is_edit_mode && !current_input.is_empty() { - current_input.len() - 1 // In readonly mode, limit to last character - } else { - current_input.len() - }; - form_state.current_cursor_pos = self.ideal_cursor_column.min(max_cursor_pos); - } - KeyCode::BackTab => { - if form_state.current_field == 0 { - form_state.current_field = form_state.fields.len() - 1; - } else { - form_state.current_field = form_state.current_field.saturating_sub(1); - } - let current_input = form_state.get_current_input(); - let max_cursor_pos = if !self.is_edit_mode && !current_input.is_empty() { - current_input.len() - 1 // In readonly mode, limit to last character - } else { - current_input.len() - }; - form_state.current_cursor_pos = self.ideal_cursor_column.min(max_cursor_pos); - } - KeyCode::Enter => { - form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); - let current_input = form_state.get_current_input(); - let max_cursor_pos = if !self.is_edit_mode && !current_input.is_empty() { - current_input.len() - 1 // In readonly mode, limit to last character - } else { - current_input.len() - }; - form_state.current_cursor_pos = self.ideal_cursor_column.min(max_cursor_pos); - } - KeyCode::Char(c) => { - let cursor_pos = form_state.current_cursor_pos; - let field_value = form_state.get_current_input_mut(); - let mut chars: Vec = field_value.chars().collect(); - if cursor_pos <= chars.len() { - chars.insert(cursor_pos, c); - *field_value = chars.into_iter().collect(); - form_state.current_cursor_pos = cursor_pos + 1; - self.ideal_cursor_column = form_state.current_cursor_pos; - form_state.has_unsaved_changes = true; - } - } - KeyCode::Backspace => { - if form_state.current_cursor_pos > 0 { - let cursor_pos = form_state.current_cursor_pos; - let field_value = form_state.get_current_input_mut(); - let mut chars: Vec = field_value.chars().collect(); - if cursor_pos <= chars.len() && cursor_pos > 0 { - chars.remove(cursor_pos - 1); - *field_value = chars.into_iter().collect(); - form_state.current_cursor_pos = cursor_pos - 1; - self.ideal_cursor_column = form_state.current_cursor_pos; - form_state.has_unsaved_changes = true; - } - } - } - KeyCode::Delete => { - let cursor_pos = form_state.current_cursor_pos; - let field_value = form_state.get_current_input_mut(); - let chars: Vec = field_value.chars().collect(); - if cursor_pos < chars.len() { - let mut new_chars = chars.clone(); - new_chars.remove(cursor_pos); - *field_value = new_chars.into_iter().collect(); - form_state.has_unsaved_changes = true; - } - } - _ => {} - } - } } }