From 3c8ea28da192b4b1102401e34773b3c0ba6f5847 Mon Sep 17 00:00:00 2001 From: filipriec Date: Wed, 23 Apr 2025 12:04:54 +0200 Subject: [PATCH] dialog on add table save working --- client/src/modes/general/dialog.rs | 12 +++++++- client/src/state/app/state.rs | 15 ++++++++- client/src/ui/handlers/context.rs | 1 + client/src/ui/handlers/ui.rs | 49 +++++++++++++++--------------- 4 files changed, 50 insertions(+), 27 deletions(-) diff --git a/client/src/modes/general/dialog.rs b/client/src/modes/general/dialog.rs index 82d47e5..b8fa2b7 100644 --- a/client/src/modes/general/dialog.rs +++ b/client/src/modes/general/dialog.rs @@ -3,7 +3,7 @@ use crossterm::event::{Event, KeyCode}; use crate::config::binds::config::Config; use crate::ui::handlers::context::DialogPurpose; -use crate::state::app::state::AppState; +use crate::state::app::{state::AppState, buffer::AppView}; use crate::state::app::buffer::BufferState; use crate::state::pages::auth::{LoginState, RegisterState}; use crate::state::pages::admin::AdminState; @@ -129,6 +129,16 @@ pub async fn handle_dialog_event( _ => { /* Handle unexpected index */ } } } + DialogPurpose::SaveTableSuccess => { + match selected_index { + 0 => { // "OK" button selected + app_state.hide_dialog(); + buffer_state.update_history(AppView::Admin); // Navigate back + return Some(Ok(EventOutcome::Ok("Save success dialog dismissed.".to_string()))); + } + _ => { /* Handle unexpected index */ } + } + } } } _ => {} // Ignore other general actions when dialog is shown diff --git a/client/src/state/app/state.rs b/client/src/state/app/state.rs index c7e2422..4407b23 100644 --- a/client/src/state/app/state.rs +++ b/client/src/state/app/state.rs @@ -3,7 +3,7 @@ use std::env; use common::proto::multieko2::table_definition::ProfileTreeResponse; use crate::modes::handlers::mode_manager::AppMode; -use crate::ui::handlers::context::DialogPurpose; +use crate::ui::handlers::context::{DialogPurpose, UiContext}; use anyhow::Result; pub struct DialogState { @@ -123,6 +123,19 @@ impl AppState { } } + /// Shows a standard success dialog after saving a table. + pub fn show_save_success_dialog(&mut self, message: &str) { + self.ui.dialog.dialog_show = true; + self.ui.dialog.dialog_title = "Save Successful".to_string(); + self.ui.dialog.dialog_message = message.to_string(); + self.ui.dialog.dialog_buttons = vec!["OK".to_string()]; + self.ui.dialog.dialog_active_button_index = 0; + self.ui.dialog.purpose = Some(DialogPurpose::SaveTableSuccess); + self.ui.dialog.is_loading = false; + self.ui.focus_outside_canvas = true; + self.focused_button_index = 0; // Focus the first (only) button + } + /// Hides the dialog and clears its content. pub fn hide_dialog(&mut self) { self.ui.dialog.dialog_show = false; diff --git a/client/src/ui/handlers/context.rs b/client/src/ui/handlers/context.rs index 02ee602..cfbc303 100644 --- a/client/src/ui/handlers/context.rs +++ b/client/src/ui/handlers/context.rs @@ -16,6 +16,7 @@ pub enum DialogPurpose { RegisterSuccess, RegisterFailed, ConfirmDeleteColumns, // add_table delete selected Columns + SaveTableSuccess, // add_table save table // TODO in the future: // ConfirmQuit, } diff --git a/client/src/ui/handlers/ui.rs b/client/src/ui/handlers/ui.rs index 7eb9602..a9d0930 100644 --- a/client/src/ui/handlers/ui.rs +++ b/client/src/ui/handlers/ui.rs @@ -166,28 +166,31 @@ pub async fn run_ui() -> Result<()> { // --- 1. Handle Terminal Events --- let mut event_outcome_result = Ok(EventOutcome::Ok(String::new())); + let mut event_processed = false; // Poll for events *after* drawing and checking pending actions if crossterm_event::poll(std::time::Duration::from_millis(1))? { let event = event_reader.read_event().context("Failed to read terminal event")?; - event_outcome_result = event_handler - .handle_event( - event, - &config, - &mut terminal, - &mut grpc_client, - &mut command_handler, - &mut form_state, - &mut auth_state, - &mut login_state, - &mut register_state, - &mut intro_state, - &mut admin_state, - &mut buffer_state, - &mut app_state, - total_count, - &mut current_position, - ) - .await; + event_processed = true; // Mark that we received and will process an event + event_outcome_result = event_handler.handle_event( + event, + &config, + &mut terminal, + &mut grpc_client, + &mut command_handler, + &mut form_state, + &mut auth_state, + &mut login_state, + &mut register_state, + &mut intro_state, + &mut admin_state, + &mut buffer_state, + &mut app_state, + total_count, + &mut current_position, + ).await; + } + + if event_processed { needs_redraw = true; } @@ -226,13 +229,9 @@ pub async fn run_ui() -> Result<()> { Ok(result) => { app_state.hide_dialog(); // Hide loading indicator match result { - Ok(success_message) => { - event_handler.command_message = success_message; + Ok(ref success_message) => { + app_state.show_save_success_dialog(success_message); admin_state.add_table_state.has_unsaved_changes = false; - // Optionally refresh profile tree if needed - // let _ = UiService::initialize_app_state(&mut grpc_client, &mut app_state).await; - // Navigate back to Admin view - buffer_state.update_history(AppView::Admin); } Err(e) => { event_handler.command_message = format!("Save failed: {}", e);