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"]
|
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"]
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user