This commit is contained in:
Priec
2025-07-30 12:45:13 +02:00
parent 0d291fcf57
commit 969ad229e4
8 changed files with 36 additions and 44 deletions

View File

@@ -15,7 +15,8 @@ use ratatui::{
}; };
use crate::state::app::highlight::HighlightState; use crate::state::app::highlight::HighlightState;
use canvas::canvas::{render_canvas, HighlightState as CanvasHighlightState}; // Use canvas library's render function 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 // Helper function to convert between HighlightState types
fn convert_highlight_state(local: &HighlightState) -> CanvasHighlightState { fn convert_highlight_state(local: &HighlightState) -> CanvasHighlightState {

View File

@@ -1,12 +1,13 @@
// src/functions/modes/edit/auth_e.rs // src/functions/modes/edit/auth_e.rs
use crate::services::grpc_client::GrpcClient; use crate::services::grpc_client::GrpcClient;
use crate::state::pages::canvas_state::CanvasState;
use crate::state::pages::form::FormState; use crate::state::pages::form::FormState;
use crate::state::pages::auth::RegisterState; use crate::state::pages::auth::RegisterState;
use crate::state::app::state::AppState; use crate::state::app::state::AppState;
use crate::tui::functions::common::form::{revert, save}; use crate::tui::functions::common::form::{revert, save};
use crossterm::event::{KeyCode, KeyEvent}; use crossterm::event::{KeyCode, KeyEvent};
use canvas::autocomplete::AutocompleteCanvasState;
use canvas::canvas::CanvasState;
use std::any::Any; use std::any::Any;
use anyhow::Result; use anyhow::Result;
@@ -295,53 +296,42 @@ pub async fn execute_edit_action<S: CanvasState + Any + Send>(
"suggestion_down" | "suggestion_up" | "select_suggestion" | "exit_suggestion_mode" => { "suggestion_down" | "suggestion_up" | "select_suggestion" | "exit_suggestion_mode" => {
// Attempt to downcast to RegisterState to handle suggestion logic here // Attempt to downcast to RegisterState to handle suggestion logic here
if let Some(register_state) = (state as &mut dyn Any).downcast_mut::<RegisterState>() { if let Some(register_state) = (state as &mut dyn Any).downcast_mut::<RegisterState>() {
// Only handle if it's the role field (index 4) // Only handle if it's the role field (index 4) and autocomplete is active
if register_state.current_field() == 4 { if register_state.current_field() == 4 && register_state.is_autocomplete_active() {
match action { match action {
"suggestion_down" if register_state.in_suggestion_mode => { "suggestion_down" => {
let max_index = register_state.role_suggestions.len().saturating_sub(1); if let Some(autocomplete_state) = register_state.autocomplete_state_mut() {
let current_index = register_state.selected_suggestion_index.unwrap_or(0); autocomplete_state.select_next();
register_state.selected_suggestion_index = Some(if current_index >= max_index { 0 } else { current_index + 1 });
Ok("Suggestion changed down".to_string()) Ok("Suggestion changed down".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())
}
"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 { } else {
Ok("Selected suggestion index out of bounds.".to_string()) // Error case Ok("No autocomplete state".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 let Some(message) = register_state.apply_autocomplete_selection() {
Ok(message)
} else { } else {
Ok("No suggestion selected".to_string()) Ok("No suggestion selected".to_string())
} }
} }
"exit_suggestion_mode" => { // Handle Esc or other conditions "exit_suggestion_mode" => {
register_state.show_role_suggestions = false; register_state.deactivate_autocomplete();
register_state.selected_suggestion_index = None;
register_state.in_suggestion_mode = false;
Ok("Suggestions hidden".to_string()) Ok("Suggestions hidden".to_string())
} }
_ => { _ => Ok("Suggestion action ignored: State mismatch.".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())
}
} }
} else { } else {
// It's RegisterState, but not the role field Ok("Suggestion action ignored: Not on role field or autocomplete not active.".to_string())
Ok("Suggestion action ignored: Not on role field.".to_string())
} }
} else { } else {
// Downcast failed - this action is only for RegisterState
Ok(format!("Action '{}' not applicable for this state type.", action)) Ok(format!("Action '{}' not applicable for this state type.", action))
} }
} }

View File

@@ -1,8 +1,8 @@
// src/functions/modes/read_only/auth_ro.rs // src/functions/modes/read_only/auth_ro.rs
use crate::config::binds::key_sequences::KeySequenceTracker; use crate::config::binds::key_sequences::KeySequenceTracker;
use crate::state::pages::canvas_state::CanvasState;
use crate::state::app::state::AppState; use crate::state::app::state::AppState;
use canvas::canvas::CanvasState;
use anyhow::Result; use anyhow::Result;
#[derive(PartialEq)] #[derive(PartialEq)]

View File

@@ -3,14 +3,15 @@
use crate::config::binds::config::Config; use crate::config::binds::config::Config;
use crate::config::binds::key_sequences::KeySequenceTracker; use crate::config::binds::key_sequences::KeySequenceTracker;
use crate::services::grpc_client::GrpcClient; 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::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::form::FormState;
use crate::state::pages::add_logic::AddLogicState; use crate::state::pages::add_logic::AddLogicState;
use crate::state::pages::add_table::AddTableState; use crate::state::pages::add_table::AddTableState;
use crate::state::app::state::AppState; use crate::state::app::state::AppState;
use crate::functions::modes::read_only::{add_logic_ro, auth_ro, form_ro, add_table_ro}; 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 crossterm::event::KeyEvent;
use anyhow::Result; use anyhow::Result;

View File

@@ -2,7 +2,7 @@
use crate::tui::terminal::core::TerminalCore; use crate::tui::terminal::core::TerminalCore;
use crate::state::app::state::AppState; use crate::state::app::state::AppState;
use crate::state::pages::{form::FormState, auth::LoginState, auth::RegisterState}; use crate::state::pages::{form::FormState, auth::LoginState, auth::RegisterState};
use crate::state::pages::canvas_state::CanvasState; use canvas::canvas::CanvasState;
use anyhow::Result; use anyhow::Result;
pub struct CommandHandler; pub struct CommandHandler;

View File

@@ -8,10 +8,10 @@ use crate::state::pages::auth::LoginState;
use crate::state::pages::auth::RegisterState; use crate::state::pages::auth::RegisterState;
use crate::state::pages::intro::IntroState; use crate::state::pages::intro::IntroState;
use crate::state::pages::admin::AdminState; use crate::state::pages::admin::AdminState;
use crate::state::pages::canvas_state::CanvasState;
use crate::ui::handlers::context::UiContext; use crate::ui::handlers::context::UiContext;
use crate::modes::handlers::event::EventOutcome; use crate::modes::handlers::event::EventOutcome;
use crate::modes::general::command_navigation::{handle_command_navigation_event, NavigationState}; use crate::modes::general::command_navigation::{handle_command_navigation_event, NavigationState};
use canvas::canvas::CanvasState;
use anyhow::Result; use anyhow::Result;
pub async fn handle_navigation_event( pub async fn handle_navigation_event(

View File

@@ -6,9 +6,9 @@ use crate::state::pages::auth::LoginState;
use crate::state::app::state::AppState; use crate::state::app::state::AppState;
use crate::state::app::buffer::{AppView, BufferState}; use crate::state::app::buffer::{AppView, BufferState};
use crate::config::storage::storage::{StoredAuthData, save_auth_data}; use crate::config::storage::storage::{StoredAuthData, save_auth_data};
use crate::state::pages::canvas_state::CanvasState;
use crate::ui::handlers::context::DialogPurpose; use crate::ui::handlers::context::DialogPurpose;
use common::proto::komp_ac::auth::LoginResponse; use common::proto::komp_ac::auth::LoginResponse;
use canvas::canvas::CanvasState;
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use tokio::spawn; use tokio::spawn;
use tokio::sync::mpsc; use tokio::sync::mpsc;

View File

@@ -4,11 +4,11 @@ use crate::services::auth::AuthClient;
use crate::state::{ use crate::state::{
pages::auth::RegisterState, pages::auth::RegisterState,
app::state::AppState, app::state::AppState,
pages::canvas_state::CanvasState,
}; };
use crate::ui::handlers::context::DialogPurpose; use crate::ui::handlers::context::DialogPurpose;
use crate::state::app::buffer::{AppView, BufferState}; use crate::state::app::buffer::{AppView, BufferState};
use common::proto::komp_ac::auth::AuthResponse; use common::proto::komp_ac::auth::AuthResponse;
use canvas::canvas::CanvasState;
use anyhow::Context; use anyhow::Context;
use tokio::spawn; use tokio::spawn;
use tokio::sync::mpsc; use tokio::sync::mpsc;