From 6c80325abe74f362aadc22fdefc94be49c65f798 Mon Sep 17 00:00:00 2001 From: filipriec Date: Wed, 19 Feb 2025 21:22:21 +0100 Subject: [PATCH] compiled without error --- proto/api.proto | 2 +- src/client/terminal.rs | 28 +++++++----- src/client/ui/handlers/event.rs | 77 ++++++++++++++++++++++++++------ src/client/ui/handlers/form.rs | 3 ++ src/proto/descriptor.bin | Bin 5985 -> 5944 bytes 5 files changed, 85 insertions(+), 25 deletions(-) diff --git a/proto/api.proto b/proto/api.proto index 6dc98d9..4143ada 100644 --- a/proto/api.proto +++ b/proto/api.proto @@ -62,7 +62,7 @@ message AdresarResponse { } message PutAdresarRequest { - int64 id = 1; // The ID of the Adresar entry to update + int64 id = 1; string firma = 2; string kz = 3; string drc = 4; diff --git a/src/client/terminal.rs b/src/client/terminal.rs index 29d8993..9311bb5 100644 --- a/src/client/terminal.rs +++ b/src/client/terminal.rs @@ -10,7 +10,7 @@ use tonic::transport::Channel; use crate::proto::multieko2::{ adresar_client::AdresarClient, Empty, CountResponse, PositionRequest, - AdresarResponse, PostAdresarRequest + AdresarResponse, PostAdresarRequest, PutAdresarRequest, }; use crate::client::config::Config; @@ -59,15 +59,6 @@ impl AppTerminal { form_data: &PostAdresarRequest, ) -> Result<(bool, String), Box> { match action { - "save" => { - // Send data to the server - let request = tonic::Request::new(form_data.clone()); - let response = self.grpc_client.post_adresar(request).await?; - - // form_state.has_unsaved_changes = false; - *is_saved = true; - Ok((false, format!("State saved. Response: {:?}", response))) - } "quit" => { if *is_saved { self.cleanup()?; @@ -102,4 +93,21 @@ impl AppTerminal { let response: AdresarResponse = self.grpc_client.get_adresar_by_position(request).await?.into_inner(); Ok(response) } + pub async fn post_adresar( + &mut self, + request: PostAdresarRequest, + ) -> Result, Box> { + let request = tonic::Request::new(request); + let response = self.grpc_client.post_adresar(request).await?; + Ok(response) + } + + pub async fn put_adresar( + &mut self, + request: PutAdresarRequest, + ) -> Result, Box> { + let request = tonic::Request::new(request); + let response = self.grpc_client.put_adresar(request).await?; + Ok(response) + } } diff --git a/src/client/ui/handlers/event.rs b/src/client/ui/handlers/event.rs index 9bed1ad..2f62eee 100644 --- a/src/client/ui/handlers/event.rs +++ b/src/client/ui/handlers/event.rs @@ -2,7 +2,7 @@ use crossterm::event::{Event, KeyCode, KeyModifiers}; use crate::client::terminal::AppTerminal; use crate::client::config::Config; -use crate::proto::multieko2::PostAdresarRequest; +use crate::proto::multieko2::{PostAdresarRequest, PutAdresarRequest}; use super::form::FormState; pub struct EventHandler { @@ -60,7 +60,8 @@ impl EventHandler { *current_position = new_position; match app_terminal.get_adresar_by_position(*current_position).await { Ok(response) => { - // Update all form fields from the response + // Update all form fields + form_state.id = response.id; form_state.firma = response.firma; form_state.kz = response.kz; form_state.drc = response.drc; @@ -77,7 +78,6 @@ impl EventHandler { 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); @@ -94,6 +94,7 @@ impl EventHandler { match app_terminal.get_adresar_by_position(*current_position).await { Ok(response) => { // Update all form fields + form_state.id = response.id; form_state.firma = response.firma; form_state.kz = response.kz; form_state.drc = response.drc; @@ -183,20 +184,68 @@ impl EventHandler { let action = config.get_action_for_command(command) .unwrap_or("unknown"); - let (should_exit, message) = app_terminal - .handle_command(action, is_saved, &form_data) - .await?; + if action == "save" { + let is_new = *current_position == total_count + 1; - self.command_message = message; - self.command_mode = false; - self.command_input.clear(); + let message = if is_new { + // POST new entry + let post_request = PostAdresarRequest { + firma: form_state.firma.clone(), + kz: form_state.kz.clone(), + drc: form_state.drc.clone(), + ulica: form_state.ulica.clone(), + psc: form_state.psc.clone(), + mesto: form_state.mesto.clone(), + stat: form_state.stat.clone(), + banka: form_state.banka.clone(), + ucet: form_state.ucet.clone(), + skladm: form_state.skladm.clone(), + ico: form_state.ico.clone(), + kontakt: form_state.kontakt.clone(), + telefon: form_state.telefon.clone(), + skladu: form_state.skladu.clone(), + fax: form_state.fax.clone(), + }; + let response = app_terminal.post_adresar(post_request).await?; + // Update state + let new_total = app_terminal.get_adresar_count().await?; + *current_position = new_total; + form_state.id = response.into_inner().id; + "New entry created".to_string() + } else { + // PUT existing entry + let put_request = PutAdresarRequest { + id: form_state.id, + firma: form_state.firma.clone(), + kz: form_state.kz.clone(), + drc: form_state.drc.clone(), + ulica: form_state.ulica.clone(), + psc: form_state.psc.clone(), + mesto: form_state.mesto.clone(), + stat: form_state.stat.clone(), + banka: form_state.banka.clone(), + ucet: form_state.ucet.clone(), + skladm: form_state.skladm.clone(), + ico: form_state.ico.clone(), + kontakt: form_state.kontakt.clone(), + telefon: form_state.telefon.clone(), + skladu: form_state.skladu.clone(), + fax: form_state.fax.clone(), + }; + let response = app_terminal.put_adresar(put_request).await?; + "Entry updated".to_string() + }; - if action == "save" && *is_saved { - *current_position = total_count + 1; - form_state.has_unsaved_changes = false; // Reset unsaved changes flag + *is_saved = true; + form_state.has_unsaved_changes = false; + return Ok((false, message)); + } else { + let (should_exit, message) = app_terminal + .handle_command(action, is_saved, &form_data) + .await?; + self.command_message = message; + return Ok((should_exit, self.command_message.clone())); } - - return Ok((should_exit, self.command_message.clone())); } KeyCode::Char(c) => self.command_input.push(c), KeyCode::Backspace => { diff --git a/src/client/ui/handlers/form.rs b/src/client/ui/handlers/form.rs index 0e0fc75..3338685 100644 --- a/src/client/ui/handlers/form.rs +++ b/src/client/ui/handlers/form.rs @@ -6,6 +6,8 @@ use ratatui::layout::Rect; use ratatui::Frame; pub struct FormState { + pub id: i64, + pub firma: String, pub kz: String, pub drc: String, @@ -30,6 +32,7 @@ pub struct FormState { impl FormState { pub fn new() -> Self { FormState { + id: 0, firma: String::new(), kz: String::new(), drc: String::new(), diff --git a/src/proto/descriptor.bin b/src/proto/descriptor.bin index 3d50045a97378c8db773e24faf704e63476c43bf..29076a184c772e13ecd1e97928053aed3bc7ea9d 100644 GIT binary patch delta 36 scmaE;w?mJKYwJd)26o0Zo1596a`JF)uAD26o1)o1596a&nn)v9Pc(F$gg`OjhJlVJ|I6Ni0d_+FT-dgcSft C#tl6H