// src/tui/functions/common/form.rs use crate::services::grpc_client::GrpcClient; use crate::state::pages::form::FormState; use common::proto::multieko2::adresar::{PostAdresarRequest, PutAdresarRequest}; use anyhow::Result; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum SaveOutcome { NoChange, // Nothing needed saving UpdatedExisting, // An existing record was updated CreatedNew(i64), // A new record was created (include its new ID) } /// Shared logic for saving the current form state pub async fn save( form_state: &mut FormState, grpc_client: &mut GrpcClient, current_position: &mut u64, total_count: u64, ) -> Result { // <-- Return SaveOutcome if !form_state.has_unsaved_changes { return Ok(SaveOutcome::NoChange); // Early exit if no changes } let is_new = *current_position == total_count + 1; let outcome = 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_id = response.into_inner().id; form_state.id = new_id; SaveOutcome::CreatedNew(new_id) // <-- Return CreatedNew with ID } 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?; SaveOutcome::UpdatedExisting }; form_state.has_unsaved_changes = false; Ok(outcome) } /// 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()) }