fetching data into the form

This commit is contained in:
filipriec
2025-02-19 16:20:16 +01:00
parent dc21be86e7
commit 5954382206
3 changed files with 148 additions and 25 deletions

View File

@@ -6,3 +6,5 @@ force_quit = [":q!", "ctrl+shift+q"]
save_and_quit = [":wq", "ctrl+shift+s"] save_and_quit = [":wq", "ctrl+shift+s"]
enter_edit_mode = ["i", "ctrl+e"] enter_edit_mode = ["i", "ctrl+e"]
exit_edit_mode = ["esc", "ctrl+e"] exit_edit_mode = ["esc", "ctrl+e"]
previous_position = ["Left", "9"]
next_position = ["Right", "8"]

View File

@@ -53,32 +53,101 @@ impl EventHandler {
} }
if !self.is_edit_mode { if !self.is_edit_mode {
// Read-only mode handling // Check if key is for navigation
match key.code { if key.code == KeyCode::Left {
KeyCode::Char(':') => { let new_position = current_position.saturating_sub(1);
self.command_mode = true; if new_position >= 1 {
self.command_input.clear(); *current_position = new_position;
self.command_message.clear(); match app_terminal.get_adresar_by_position(*current_position).await {
} Ok(response) => {
KeyCode::Esc => { // Update all form fields from the response
self.command_mode = false; form_state.firma = response.firma;
self.command_input.clear(); form_state.kz = response.kz;
self.command_message.clear(); form_state.drc = response.drc;
} form_state.ulica = response.ulica;
KeyCode::Tab | KeyCode::BackTab | KeyCode::Down | KeyCode::Up => { form_state.psc = response.psc;
if key.modifiers.contains(KeyModifiers::SHIFT) { form_state.mesto = response.mesto;
form_state.current_field = form_state.current_field.saturating_sub(1); form_state.stat = response.stat;
} else { form_state.banka = response.banka;
form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); 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()));
} }
_ => { } else if key.code == KeyCode::Right {
if !self.edit_mode_cooldown { if *current_position < total_count {
let default_key = "i".to_string(); *current_position += 1;
let edit_key = config.keybindings.get("enter_edit_mode") match app_terminal.get_adresar_by_position(*current_position).await {
.and_then(|keys| keys.first()) Ok(response) => {
.unwrap_or(&default_key); // Update all form fields
self.command_message = format!("Read-only mode - press {} to edit", edit_key); 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);
}
} }
} }
} }

View File

@@ -26,6 +26,14 @@ pub async fn run_ui() -> Result<(), Box<dyn std::error::Error>> {
app_state.update_total_count(total_count); app_state.update_total_count(total_count);
app_state.update_current_position(total_count + 1); 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 { loop {
let total_count = app_terminal.get_adresar_count().await?; let total_count = app_terminal.get_adresar_count().await?;
app_state.update_total_count(total_count); app_state.update_total_count(total_count);
@@ -56,9 +64,53 @@ pub async fn run_ui() -> Result<(), Box<dyn std::error::Error>> {
&mut app_state.current_position, &mut app_state.current_position,
).await?; ).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; event_handler.command_message = message;
if should_exit { if should_exit {
return Ok(()); 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;
}