diff --git a/client/src/functions/modes/navigation/add_logic_nav.rs b/client/src/functions/modes/navigation/add_logic_nav.rs index 7e8df25..5d4087c 100644 --- a/client/src/functions/modes/navigation/add_logic_nav.rs +++ b/client/src/functions/modes/navigation/add_logic_nav.rs @@ -12,7 +12,7 @@ use tokio::sync::mpsc; use anyhow::Result; use crate::components::common::text_editor::TextEditor; use crate::services::ui_service::UiService; -use tui_textarea::CursorMove; +use tui_textarea::CursorMove; // Ensure this import is present pub type SaveLogicResultSender = mpsc::Sender>; @@ -125,11 +125,13 @@ pub fn handle_add_logic_navigation( if let Some(pos) = trigger_pos { let mut editor_borrow = add_logic_state.script_content_editor.borrow_mut(); - + if suggestion == "sql" { replace_autocomplete_text(&mut editor_borrow, pos, filter_len, "sql"); editor_borrow.insert_str("('')"); - editor_borrow.move_cursor(CursorMove::Back); // Move cursor between '' + // Move cursor back twice to be between the single quotes + editor_borrow.move_cursor(CursorMove::Back); // Before ')' + editor_borrow.move_cursor(CursorMove::Back); // Before ''' (inside '') *command_message = "Inserted: @sql('')".to_string(); } else { let is_table_selection = add_logic_state.is_table_name_suggestion(&suggestion); @@ -144,15 +146,14 @@ pub fn handle_add_logic_navigation( add_logic_state.script_editor_autocomplete_active = true; add_logic_state.script_editor_filter_text.clear(); add_logic_state.trigger_column_autocomplete_for_table(suggestion.clone()); - - // Asynchronous column fetch (remains the same) + let profile_name = add_logic_state.profile_name.clone(); - let table_name_for_fetch = suggestion.clone(); // Use a new variable for clarity + let table_name_for_fetch = suggestion.clone(); let mut client_clone = grpc_client.clone(); tokio::spawn(async move { match UiService::fetch_columns_for_table(&mut client_clone, &profile_name, &table_name_for_fetch).await { Ok(_columns) => { - // Result handled by main UI loop checking script_editor_awaiting_column_autocomplete + // Result handled by main UI loop } Err(e) => { tracing::error!("Failed to fetch columns for {}.{}: {}", profile_name, table_name_for_fetch, e); @@ -168,7 +169,6 @@ pub fn handle_add_logic_navigation( return true; } } - // Fallthrough: No suggestion selected, pass Enter to editor add_logic_state.deactivate_script_editor_autocomplete(); { let mut editor_borrow = add_logic_state.script_content_editor.borrow_mut(); @@ -181,11 +181,9 @@ pub fn handle_add_logic_navigation( } return true; } - // ... (Esc and _ cases remain the same) ... KeyCode::Esc => { add_logic_state.deactivate_script_editor_autocomplete(); *command_message = "Autocomplete cancelled".to_string(); - // Fall through to normal Esc handling } _ => { add_logic_state.deactivate_script_editor_autocomplete(); @@ -204,7 +202,6 @@ pub fn handle_add_logic_navigation( } } - // ... (AUTOCOMPLETE TRIGGER, Escape to exit fullscreen, ALL OTHER KEYS remain the same) ... if key_event.code == KeyCode::Char('@') && key_event.modifiers == KeyModifiers::NONE { let should_trigger = match add_logic_state.editor_keybinding_mode { EditorKeybindingMode::Vim => *is_edit_mode, @@ -227,7 +224,7 @@ pub fn handle_add_logic_navigation( add_logic_state.script_editor_trigger_position = Some(cursor_before); add_logic_state.script_editor_autocomplete_active = true; add_logic_state.script_editor_filter_text.clear(); - add_logic_state.update_script_editor_suggestions(); // This will now use the new logic + add_logic_state.update_script_editor_suggestions(); add_logic_state.has_unsaved_changes = true; *command_message = "Autocomplete: @ (Tab/↑↓ to navigate, Enter to select, Esc to cancel)".to_string(); return true; @@ -290,9 +287,7 @@ pub fn handle_add_logic_navigation( } return true; } - // === END FULLSCREEN ISOLATION === - // ... (Regular navigation logic for non-fullscreen elements remains the same) ... let action = config.get_general_action(key_event.code, key_event.modifiers); let current_focus = add_logic_state.current_focus; let mut handled = true; @@ -373,8 +368,8 @@ pub fn handle_add_logic_navigation( match current_focus { AddLogicFocus::ScriptContentPreview => { new_focus = AddLogicFocus::InsideScriptContent; - *is_edit_mode = false; - app_state.ui.focus_outside_canvas = false; + *is_edit_mode = false; + app_state.ui.focus_outside_canvas = false; let mode_hint = match add_logic_state.editor_keybinding_mode { EditorKeybindingMode::Vim => "VIM mode - 'i'/'a'/'o' to edit", _ => "Enter/Ctrl+E to edit", @@ -429,14 +424,13 @@ pub fn handle_add_logic_navigation( handled } -// ... (replace_autocomplete_text helper function remains the same) ... fn replace_autocomplete_text( editor: &mut tui_textarea::TextArea, trigger_pos: (usize, usize), filter_len: usize, replacement: &str, ) { - use tui_textarea::CursorMove; + // use tui_textarea::CursorMove; // Already imported at the top of the module let filter_start_pos = (trigger_pos.0, trigger_pos.1 + 1); editor.move_cursor(CursorMove::Jump(filter_start_pos.0 as u16, filter_start_pos.1 as u16)); for _ in 0..filter_len {