dialog on add table save working

This commit is contained in:
filipriec
2025-04-23 12:04:54 +02:00
parent 5c352eb863
commit 3c8ea28da1
4 changed files with 50 additions and 27 deletions

View File

@@ -3,7 +3,7 @@
use crossterm::event::{Event, KeyCode}; use crossterm::event::{Event, KeyCode};
use crate::config::binds::config::Config; use crate::config::binds::config::Config;
use crate::ui::handlers::context::DialogPurpose; 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::app::buffer::BufferState;
use crate::state::pages::auth::{LoginState, RegisterState}; use crate::state::pages::auth::{LoginState, RegisterState};
use crate::state::pages::admin::AdminState; use crate::state::pages::admin::AdminState;
@@ -129,6 +129,16 @@ pub async fn handle_dialog_event(
_ => { /* Handle unexpected index */ } _ => { /* 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 _ => {} // Ignore other general actions when dialog is shown

View File

@@ -3,7 +3,7 @@
use std::env; use std::env;
use common::proto::multieko2::table_definition::ProfileTreeResponse; use common::proto::multieko2::table_definition::ProfileTreeResponse;
use crate::modes::handlers::mode_manager::AppMode; use crate::modes::handlers::mode_manager::AppMode;
use crate::ui::handlers::context::DialogPurpose; use crate::ui::handlers::context::{DialogPurpose, UiContext};
use anyhow::Result; use anyhow::Result;
pub struct DialogState { 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. /// Hides the dialog and clears its content.
pub fn hide_dialog(&mut self) { pub fn hide_dialog(&mut self) {
self.ui.dialog.dialog_show = false; self.ui.dialog.dialog_show = false;

View File

@@ -16,6 +16,7 @@ pub enum DialogPurpose {
RegisterSuccess, RegisterSuccess,
RegisterFailed, RegisterFailed,
ConfirmDeleteColumns, // add_table delete selected Columns ConfirmDeleteColumns, // add_table delete selected Columns
SaveTableSuccess, // add_table save table
// TODO in the future: // TODO in the future:
// ConfirmQuit, // ConfirmQuit,
} }

View File

@@ -166,11 +166,12 @@ pub async fn run_ui() -> Result<()> {
// --- 1. Handle Terminal Events --- // --- 1. Handle Terminal Events ---
let mut event_outcome_result = Ok(EventOutcome::Ok(String::new())); let mut event_outcome_result = Ok(EventOutcome::Ok(String::new()));
let mut event_processed = false;
// Poll for events *after* drawing and checking pending actions // Poll for events *after* drawing and checking pending actions
if crossterm_event::poll(std::time::Duration::from_millis(1))? { if crossterm_event::poll(std::time::Duration::from_millis(1))? {
let event = event_reader.read_event().context("Failed to read terminal event")?; let event = event_reader.read_event().context("Failed to read terminal event")?;
event_outcome_result = event_handler event_processed = true; // Mark that we received and will process an event
.handle_event( event_outcome_result = event_handler.handle_event(
event, event,
&config, &config,
&mut terminal, &mut terminal,
@@ -186,8 +187,10 @@ pub async fn run_ui() -> Result<()> {
&mut app_state, &mut app_state,
total_count, total_count,
&mut current_position, &mut current_position,
) ).await;
.await; }
if event_processed {
needs_redraw = true; needs_redraw = true;
} }
@@ -226,13 +229,9 @@ pub async fn run_ui() -> Result<()> {
Ok(result) => { Ok(result) => {
app_state.hide_dialog(); // Hide loading indicator app_state.hide_dialog(); // Hide loading indicator
match result { match result {
Ok(success_message) => { Ok(ref success_message) => {
event_handler.command_message = success_message; app_state.show_save_success_dialog(success_message);
admin_state.add_table_state.has_unsaved_changes = false; 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) => { Err(e) => {
event_handler.command_message = format!("Save failed: {}", e); event_handler.command_message = format!("Save failed: {}", e);