fetching data into the form
This commit is contained in:
@@ -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"]
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user