From 42eb087363b6896ead8348e8b16df7a45a727d56 Mon Sep 17 00:00:00 2001 From: Priec Date: Tue, 19 Aug 2025 13:25:10 +0200 Subject: [PATCH] canvas fixes3 --- client/src/components/admin/add_table.rs | 9 +- client/src/state/pages/add_table.rs | 138 +------------------- client/src/tui/functions/common/login.rs | 1 - client/src/tui/functions/common/register.rs | 1 - client/src/tui/functions/form.rs | 1 - 5 files changed, 5 insertions(+), 145 deletions(-) diff --git a/client/src/components/admin/add_table.rs b/client/src/components/admin/add_table.rs index 47ac9d6..ab4e482 100644 --- a/client/src/components/admin/add_table.rs +++ b/client/src/components/admin/add_table.rs @@ -3,7 +3,7 @@ use crate::config::colors::themes::Theme; use crate::state::app::highlight::HighlightState; use crate::state::app::state::AppState; use crate::state::pages::add_table::{AddTableFocus, AddTableState}; -use canvas::canvas::{render_canvas, CanvasState, HighlightState as CanvasHighlightState}; +use canvas::{render_canvas_default, HighlightState as CanvasHighlightState}; use ratatui::{ layout::{Alignment, Constraint, Direction, Layout, Rect}, style::{Modifier, Style}, @@ -358,13 +358,10 @@ pub fn render_add_table( // --- Canvas Rendering (Column Definition Input) - USING CANVAS LIBRARY --- let canvas_highlight_state = convert_highlight_state(highlight_state); - let _active_field_rect = render_canvas( + let _active_field_rect = render_canvas_default( f, canvas_area, - add_table_state, // AddTableState implements CanvasState - theme, // Theme implements CanvasTheme - is_edit_mode && focus_on_canvas_inputs, - &canvas_highlight_state, + add_table_state, // will later be wrapped in FormEditor ); // --- Button Style Helpers --- diff --git a/client/src/state/pages/add_table.rs b/client/src/state/pages/add_table.rs index a3439c6..1e2a5e7 100644 --- a/client/src/state/pages/add_table.rs +++ b/client/src/state/pages/add_table.rs @@ -1,5 +1,6 @@ // src/state/pages/add_table.rs -use canvas::canvas::{CanvasState, ActionContext, CanvasAction, AppMode}; + +use canvas::{DataProvider, CanvasAction, AppMode}; use ratatui::widgets::TableState; use serde::{Deserialize, Serialize}; @@ -169,138 +170,3 @@ impl AddTableState { } } } - -// Implement external library's CanvasState for AddTableState -impl CanvasState for AddTableState { - fn current_field(&self) -> usize { - match self.current_focus { - AddTableFocus::InputTableName => 0, - AddTableFocus::InputColumnName => 1, - AddTableFocus::InputColumnType => 2, - // If focus is elsewhere, return the last canvas field used - _ => self.last_canvas_field, - } - } - - fn current_cursor_pos(&self) -> usize { - match self.current_focus { - AddTableFocus::InputTableName => self.table_name_cursor_pos, - AddTableFocus::InputColumnName => self.column_name_cursor_pos, - AddTableFocus::InputColumnType => self.column_type_cursor_pos, - _ => 0, // Default if focus is not on an input field - } - } - - fn set_current_field(&mut self, index: usize) { - // Update both current focus and last canvas field - self.current_focus = match index { - 0 => { - self.last_canvas_field = 0; - AddTableFocus::InputTableName - }, - 1 => { - self.last_canvas_field = 1; - AddTableFocus::InputColumnName - }, - 2 => { - self.last_canvas_field = 2; - AddTableFocus::InputColumnType - }, - _ => self.current_focus, // Stay on current focus if index is out of bounds - }; - } - - fn set_current_cursor_pos(&mut self, pos: usize) { - match self.current_focus { - AddTableFocus::InputTableName => self.table_name_cursor_pos = pos, - AddTableFocus::InputColumnName => self.column_name_cursor_pos = pos, - AddTableFocus::InputColumnType => self.column_type_cursor_pos = pos, - _ => {} // Do nothing if focus is not on an input field - } - } - - fn get_current_input(&self) -> &str { - match self.current_focus { - AddTableFocus::InputTableName => &self.table_name_input, - AddTableFocus::InputColumnName => &self.column_name_input, - AddTableFocus::InputColumnType => &self.column_type_input, - _ => "", // Should not happen if called correctly - } - } - - fn get_current_input_mut(&mut self) -> &mut String { - match self.current_focus { - AddTableFocus::InputTableName => &mut self.table_name_input, - AddTableFocus::InputColumnName => &mut self.column_name_input, - AddTableFocus::InputColumnType => &mut self.column_type_input, - _ => &mut self.table_name_input, // Fallback - } - } - - fn inputs(&self) -> Vec<&String> { - vec![&self.table_name_input, &self.column_name_input, &self.column_type_input] - } - - fn fields(&self) -> Vec<&str> { - // These must match the order used in render_add_table - vec!["Table name", "Name", "Type"] - } - - fn has_unsaved_changes(&self) -> bool { - self.has_unsaved_changes - } - - fn set_has_unsaved_changes(&mut self, changed: bool) { - self.has_unsaved_changes = changed; - } - - fn handle_feature_action(&mut self, action: &CanvasAction, _context: &ActionContext) -> Option { - match action { - // Handle adding column when user presses Enter on the Add button or uses specific action - CanvasAction::Custom(action_str) if action_str == "add_column" => { - self.add_column_from_inputs() - } - - // Handle table saving - CanvasAction::Custom(action_str) if action_str == "save_table" => { - if self.table_name_input.trim().is_empty() { - Some("Table name is required".to_string()) - } else if self.columns.is_empty() { - Some("At least one column is required".to_string()) - } else { - Some(format!("Saving table: {}", self.table_name_input)) - } - } - - // Handle deleting selected items - CanvasAction::Custom(action_str) if action_str == "delete_selected" => { - self.delete_selected_items() - } - - // Handle canceling (clear form) - CanvasAction::Custom(action_str) if action_str == "cancel" => { - // Reset to defaults but keep profile_name - let profile = self.profile_name.clone(); - *self = Self::default(); - self.profile_name = profile; - Some("Form cleared".to_string()) - } - - // Custom validation when moving between fields - CanvasAction::NextField => { - // When leaving table name field, update the table_name for display - if self.current_field() == 0 && !self.table_name_input.trim().is_empty() { - self.table_name = self.table_name_input.trim().to_string(); - } - None // Let canvas library handle the normal field movement - } - - // Let canvas library handle everything else - _ => None, - } - } - - fn current_mode(&self) -> AppMode { - self.app_mode - } -} diff --git a/client/src/tui/functions/common/login.rs b/client/src/tui/functions/common/login.rs index 93a8d31..fa1065a 100644 --- a/client/src/tui/functions/common/login.rs +++ b/client/src/tui/functions/common/login.rs @@ -8,7 +8,6 @@ use crate::state::app::buffer::{AppView, BufferState}; use crate::config::storage::storage::{StoredAuthData, save_auth_data}; 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 72779c3..fc894e7 100644 --- a/client/src/tui/functions/common/register.rs +++ b/client/src/tui/functions/common/register.rs @@ -8,7 +8,6 @@ use crate::state::{ 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; diff --git a/client/src/tui/functions/form.rs b/client/src/tui/functions/form.rs index f261be5..1b1b83d 100644 --- a/client/src/tui/functions/form.rs +++ b/client/src/tui/functions/form.rs @@ -1,7 +1,6 @@ // src/tui/functions/form.rs use crate::state::pages::form::FormState; use crate::services::grpc_client::GrpcClient; -use canvas::canvas::CanvasState; use anyhow::{anyhow, Result}; pub async fn handle_action(