// src/modes/canvas/common.rs use crate::tui::terminal::grpc_client::GrpcClient; use crate::ui::handlers::form::FormState; use common::proto::multieko2::adresar::{PostAdresarRequest, PutAdresarRequest}; /// Shared logic for saving the current form state pub async fn save( form_state: &mut FormState, grpc_client: &mut GrpcClient, is_saved: &mut bool, current_position: &mut u64, total_count: u64, ) -> Result> { 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 = grpc_client.post_adresar(post_request).await?; let new_total = grpc_client.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 _ = grpc_client.put_adresar(put_request).await?; "Entry updated".to_string() }; *is_saved = true; form_state.has_unsaved_changes = false; Ok(message) } /// Shared logic for force quitting the application pub fn force_quit() -> (bool, String) { (true, "Force quitting application".to_string()) } /// Shared logic for saving and quitting pub async fn save_and_quit( form_state: &mut FormState, grpc_client: &mut GrpcClient, current_position: &mut u64, total_count: u64, ) -> Result<(bool, String), Box> { let is_new = *current_position == total_count + 1; 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 _ = grpc_client.post_adresar(post_request).await?; } 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 _ = grpc_client.put_adresar(put_request).await?; } Ok((true, "Saved and exiting application".to_string())) } /// Discard changes since last save pub async fn revert( form_state: &mut FormState, grpc_client: &mut GrpcClient, current_position: &mut u64, total_count: u64, ) -> Result> { let is_new = *current_position == total_count + 1; if is_new { // Clear all fields for new entries form_state.values.iter_mut().for_each(|v| *v = String::new()); form_state.has_unsaved_changes = false; return Ok("New entry cleared".to_string()); } let data = grpc_client.get_adresar_by_position(*current_position).await?; // Update form fields with saved values form_state.values = vec![ data.firma, data.kz, data.drc, data.ulica, data.psc, data.mesto, data.stat, data.banka, data.ucet, data.skladm, data.ico, data.kontakt, data.telefon, data.skladu, data.fax, ]; form_state.has_unsaved_changes = false; Ok("Changes discarded, reloaded last saved version".to_string()) }