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"]
enter_edit_mode = ["i", "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 {
// 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);
}
}
}
}

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_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<dyn std::error::Error>> {
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;
}