proper postiion of the cursor when using sql

This commit is contained in:
filipriec
2025-05-26 20:53:05 +02:00
parent b770240f0d
commit d255e4abb6

View File

@@ -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<Result<String>>;
@@ -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 {