From 969ad229e4314d1d66adfa1fd381a2f7a10bd3cd Mon Sep 17 00:00:00 2001 From: Priec Date: Wed, 30 Jul 2025 12:45:13 +0200 Subject: [PATCH] compiled --- client/src/components/auth/register.rs | 3 +- client/src/functions/modes/edit/auth_e.rs | 62 ++++++++----------- .../src/functions/modes/read_only/auth_ro.rs | 2 +- client/src/modes/canvas/read_only.rs | 5 +- client/src/modes/common/commands.rs | 2 +- client/src/modes/general/navigation.rs | 2 +- client/src/tui/functions/common/login.rs | 2 +- client/src/tui/functions/common/register.rs | 2 +- 8 files changed, 36 insertions(+), 44 deletions(-) diff --git a/client/src/components/auth/register.rs b/client/src/components/auth/register.rs index b0b3c08..8c7ac61 100644 --- a/client/src/components/auth/register.rs +++ b/client/src/components/auth/register.rs @@ -15,7 +15,8 @@ use ratatui::{ }; use crate::state::app::highlight::HighlightState; use canvas::canvas::{render_canvas, HighlightState as CanvasHighlightState}; // Use canvas library's render function -use canvas::autocomplete::gui::render_autocomplete_dropdown; // Use canvas library's autocomplete dropdown +use canvas::autocomplete::gui::render_autocomplete_dropdown; +use canvas::autocomplete::AutocompleteCanvasState; // Helper function to convert between HighlightState types fn convert_highlight_state(local: &HighlightState) -> CanvasHighlightState { diff --git a/client/src/functions/modes/edit/auth_e.rs b/client/src/functions/modes/edit/auth_e.rs index 68b2301..b9febb1 100644 --- a/client/src/functions/modes/edit/auth_e.rs +++ b/client/src/functions/modes/edit/auth_e.rs @@ -1,12 +1,13 @@ // src/functions/modes/edit/auth_e.rs use crate::services::grpc_client::GrpcClient; -use crate::state::pages::canvas_state::CanvasState; use crate::state::pages::form::FormState; use crate::state::pages::auth::RegisterState; use crate::state::app::state::AppState; use crate::tui::functions::common::form::{revert, save}; use crossterm::event::{KeyCode, KeyEvent}; +use canvas::autocomplete::AutocompleteCanvasState; +use canvas::canvas::CanvasState; use std::any::Any; use anyhow::Result; @@ -295,53 +296,42 @@ pub async fn execute_edit_action( "suggestion_down" | "suggestion_up" | "select_suggestion" | "exit_suggestion_mode" => { // Attempt to downcast to RegisterState to handle suggestion logic here if let Some(register_state) = (state as &mut dyn Any).downcast_mut::() { - // Only handle if it's the role field (index 4) - if register_state.current_field() == 4 { + // Only handle if it's the role field (index 4) and autocomplete is active + if register_state.current_field() == 4 && register_state.is_autocomplete_active() { match action { - "suggestion_down" if register_state.in_suggestion_mode => { - let max_index = register_state.role_suggestions.len().saturating_sub(1); - let current_index = register_state.selected_suggestion_index.unwrap_or(0); - register_state.selected_suggestion_index = Some(if current_index >= max_index { 0 } else { current_index + 1 }); - Ok("Suggestion changed down".to_string()) + "suggestion_down" => { + if let Some(autocomplete_state) = register_state.autocomplete_state_mut() { + autocomplete_state.select_next(); + Ok("Suggestion changed down".to_string()) + } else { + Ok("No autocomplete state".to_string()) + } } - "suggestion_up" if register_state.in_suggestion_mode => { - let max_index = register_state.role_suggestions.len().saturating_sub(1); - let current_index = register_state.selected_suggestion_index.unwrap_or(0); - register_state.selected_suggestion_index = Some(if current_index == 0 { max_index } else { current_index.saturating_sub(1) }); - Ok("Suggestion changed up".to_string()) + "suggestion_up" => { + if let Some(autocomplete_state) = register_state.autocomplete_state_mut() { + autocomplete_state.select_previous(); + Ok("Suggestion changed up".to_string()) + } else { + Ok("No autocomplete state".to_string()) + } } - "select_suggestion" if register_state.in_suggestion_mode => { - if let Some(index) = register_state.selected_suggestion_index { - if let Some(selected_role) = register_state.role_suggestions.get(index).cloned() { - register_state.role = selected_role.clone(); // Update the role field - register_state.in_suggestion_mode = false; // Exit suggestion mode - register_state.show_role_suggestions = false; // Hide suggestions - register_state.selected_suggestion_index = None; // Clear selection - Ok(format!("Selected role: {}", selected_role)) // Return success message - } else { - Ok("Selected suggestion index out of bounds.".to_string()) // Error case - } + "select_suggestion" => { + if let Some(message) = register_state.apply_autocomplete_selection() { + Ok(message) } else { Ok("No suggestion selected".to_string()) } } - "exit_suggestion_mode" => { // Handle Esc or other conditions - register_state.show_role_suggestions = false; - register_state.selected_suggestion_index = None; - register_state.in_suggestion_mode = false; + "exit_suggestion_mode" => { + register_state.deactivate_autocomplete(); Ok("Suggestions hidden".to_string()) } - _ => { - // Action is suggestion-related but state doesn't match (e.g., not in suggestion mode) - Ok("Suggestion action ignored: State mismatch.".to_string()) - } + _ => Ok("Suggestion action ignored: State mismatch.".to_string()) } } else { - // It's RegisterState, but not the role field - Ok("Suggestion action ignored: Not on role field.".to_string()) - } + Ok("Suggestion action ignored: Not on role field or autocomplete not active.".to_string()) + } } else { - // Downcast failed - this action is only for RegisterState Ok(format!("Action '{}' not applicable for this state type.", action)) } } diff --git a/client/src/functions/modes/read_only/auth_ro.rs b/client/src/functions/modes/read_only/auth_ro.rs index 29997f1..337105f 100644 --- a/client/src/functions/modes/read_only/auth_ro.rs +++ b/client/src/functions/modes/read_only/auth_ro.rs @@ -1,8 +1,8 @@ // src/functions/modes/read_only/auth_ro.rs use crate::config::binds::key_sequences::KeySequenceTracker; -use crate::state::pages::canvas_state::CanvasState; use crate::state::app::state::AppState; +use canvas::canvas::CanvasState; use anyhow::Result; #[derive(PartialEq)] diff --git a/client/src/modes/canvas/read_only.rs b/client/src/modes/canvas/read_only.rs index 05b5edd..92b7f10 100644 --- a/client/src/modes/canvas/read_only.rs +++ b/client/src/modes/canvas/read_only.rs @@ -3,14 +3,15 @@ use crate::config::binds::config::Config; use crate::config::binds::key_sequences::KeySequenceTracker; use crate::services::grpc_client::GrpcClient; -use crate::state::pages::{canvas_state::CanvasState, auth::RegisterState}; use crate::state::pages::auth::LoginState; +use crate::state::pages::auth::RegisterState; +use crate::state::pages::canvas_state::CanvasState as LocalCanvasState; use crate::state::pages::form::FormState; use crate::state::pages::add_logic::AddLogicState; use crate::state::pages::add_table::AddTableState; use crate::state::app::state::AppState; use crate::functions::modes::read_only::{add_logic_ro, auth_ro, form_ro, add_table_ro}; -use canvas::{canvas::CanvasAction, dispatcher::ActionDispatcher, canvas::ActionResult}; +use canvas::{canvas::{CanvasAction, CanvasState, ActionResult}, dispatcher::ActionDispatcher}; use crossterm::event::KeyEvent; use anyhow::Result; diff --git a/client/src/modes/common/commands.rs b/client/src/modes/common/commands.rs index 9a623e2..e464030 100644 --- a/client/src/modes/common/commands.rs +++ b/client/src/modes/common/commands.rs @@ -2,7 +2,7 @@ use crate::tui::terminal::core::TerminalCore; use crate::state::app::state::AppState; use crate::state::pages::{form::FormState, auth::LoginState, auth::RegisterState}; -use crate::state::pages::canvas_state::CanvasState; +use canvas::canvas::CanvasState; use anyhow::Result; pub struct CommandHandler; diff --git a/client/src/modes/general/navigation.rs b/client/src/modes/general/navigation.rs index 7c464f2..9e06216 100644 --- a/client/src/modes/general/navigation.rs +++ b/client/src/modes/general/navigation.rs @@ -8,10 +8,10 @@ use crate::state::pages::auth::LoginState; use crate::state::pages::auth::RegisterState; use crate::state::pages::intro::IntroState; use crate::state::pages::admin::AdminState; -use crate::state::pages::canvas_state::CanvasState; use crate::ui::handlers::context::UiContext; use crate::modes::handlers::event::EventOutcome; use crate::modes::general::command_navigation::{handle_command_navigation_event, NavigationState}; +use canvas::canvas::CanvasState; use anyhow::Result; pub async fn handle_navigation_event( diff --git a/client/src/tui/functions/common/login.rs b/client/src/tui/functions/common/login.rs index c58d915..93a8d31 100644 --- a/client/src/tui/functions/common/login.rs +++ b/client/src/tui/functions/common/login.rs @@ -6,9 +6,9 @@ use crate::state::pages::auth::LoginState; use crate::state::app::state::AppState; use crate::state::app::buffer::{AppView, BufferState}; use crate::config::storage::storage::{StoredAuthData, save_auth_data}; -use crate::state::pages::canvas_state::CanvasState; use crate::ui::handlers::context::DialogPurpose; use common::proto::komp_ac::auth::LoginResponse; +use canvas::canvas::CanvasState; use anyhow::{Context, Result}; use tokio::spawn; use tokio::sync::mpsc; diff --git a/client/src/tui/functions/common/register.rs b/client/src/tui/functions/common/register.rs index a20f0e8..72779c3 100644 --- a/client/src/tui/functions/common/register.rs +++ b/client/src/tui/functions/common/register.rs @@ -4,11 +4,11 @@ use crate::services::auth::AuthClient; use crate::state::{ pages::auth::RegisterState, app::state::AppState, - pages::canvas_state::CanvasState, }; use crate::ui::handlers::context::DialogPurpose; use crate::state::app::buffer::{AppView, BufferState}; use common::proto::komp_ac::auth::AuthResponse; +use canvas::canvas::CanvasState; use anyhow::Context; use tokio::spawn; use tokio::sync::mpsc;