hardcoded adresar to general form
This commit is contained in:
@@ -33,11 +33,12 @@ pub struct UiState {
|
||||
pub struct AppState {
|
||||
// Core editor state
|
||||
pub current_dir: String,
|
||||
pub total_count: u64,
|
||||
pub current_position: u64,
|
||||
pub profile_tree: ProfileTreeResponse,
|
||||
pub selected_profile: Option<String>,
|
||||
pub current_mode: AppMode,
|
||||
pub current_view_profile_name: Option<String>,
|
||||
pub current_view_table_name: Option<String>,
|
||||
|
||||
pub focused_button_index: usize,
|
||||
pub pending_table_structure_fetch: Option<(String, String)>,
|
||||
|
||||
@@ -52,10 +53,10 @@ impl AppState {
|
||||
.to_string();
|
||||
Ok(AppState {
|
||||
current_dir,
|
||||
total_count: 0,
|
||||
current_position: 0,
|
||||
profile_tree: ProfileTreeResponse::default(),
|
||||
selected_profile: None,
|
||||
current_view_profile_name: None,
|
||||
current_view_table_name: None,
|
||||
current_mode: AppMode::General,
|
||||
focused_button_index: 0,
|
||||
pending_table_structure_fetch: None,
|
||||
@@ -63,18 +64,14 @@ impl AppState {
|
||||
})
|
||||
}
|
||||
|
||||
// Existing methods remain unchanged
|
||||
pub fn update_total_count(&mut self, total_count: u64) {
|
||||
self.total_count = total_count;
|
||||
}
|
||||
|
||||
pub fn update_current_position(&mut self, current_position: u64) {
|
||||
self.current_position = current_position;
|
||||
}
|
||||
|
||||
pub fn update_mode(&mut self, mode: AppMode) {
|
||||
self.current_mode = mode;
|
||||
}
|
||||
|
||||
pub fn set_current_view_table(&mut self, profile_name: String, table_name: String) {
|
||||
self.current_view_profile_name = Some(profile_name);
|
||||
self.current_view_table_name = Some(table_name);
|
||||
}
|
||||
|
||||
// Add dialog helper methods
|
||||
/// Shows a dialog with the given title, message, and buttons.
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
// src/state/pages/form.rs
|
||||
|
||||
use std::collections::HashMap; // NEW
|
||||
use crate::config::colors::themes::Theme;
|
||||
use ratatui::layout::Rect;
|
||||
use ratatui::Frame;
|
||||
@@ -7,7 +9,13 @@ use crate::state::pages::canvas_state::CanvasState;
|
||||
|
||||
pub struct FormState {
|
||||
pub id: i64,
|
||||
pub fields: Vec<String>,
|
||||
// NEW fields for dynamic table context
|
||||
pub profile_name: String,
|
||||
pub table_name: String,
|
||||
pub total_count: u64,
|
||||
pub current_position: u64, // 1-based index, 0 or total_count + 1 for new entry
|
||||
|
||||
pub fields: Vec<String>, // Already dynamic, which is good
|
||||
pub values: Vec<String>,
|
||||
pub current_field: usize,
|
||||
pub has_unsaved_changes: bool,
|
||||
@@ -15,11 +23,19 @@ pub struct FormState {
|
||||
}
|
||||
|
||||
impl FormState {
|
||||
/// Create a new FormState with dynamic fields.
|
||||
pub fn new(fields: Vec<String>) -> Self {
|
||||
let values = vec![String::new(); fields.len()]; // Initialize values for each field
|
||||
// MODIFIED constructor
|
||||
pub fn new(
|
||||
profile_name: String,
|
||||
table_name: String,
|
||||
fields: Vec<String>,
|
||||
) -> Self {
|
||||
let values = vec![String::new(); fields.len()];
|
||||
FormState {
|
||||
id: 0,
|
||||
id: 0, // Default to 0, indicating a new or unloaded record
|
||||
profile_name,
|
||||
table_name,
|
||||
total_count: 0, // Will be fetched after initialization
|
||||
current_position: 0, // Will be set after count is fetched (e.g., 1 or total_count + 1)
|
||||
fields,
|
||||
values,
|
||||
current_field: 0,
|
||||
@@ -35,31 +51,42 @@ impl FormState {
|
||||
theme: &Theme,
|
||||
is_edit_mode: bool,
|
||||
highlight_state: &HighlightState,
|
||||
total_count: u64,
|
||||
current_position: u64,
|
||||
// total_count and current_position are now part of self
|
||||
) {
|
||||
let fields: Vec<&str> = self.fields.iter().map(|s| s.as_str()).collect();
|
||||
let values: Vec<&String> = self.values.iter().collect();
|
||||
let fields_str_slice: Vec<&str> =
|
||||
self.fields.iter().map(|s| s.as_str()).collect();
|
||||
let values_str_slice: Vec<&String> = self.values.iter().collect();
|
||||
|
||||
crate::components::form::form::render_form(
|
||||
f,
|
||||
area,
|
||||
self,
|
||||
&fields,
|
||||
self, // Pass self as CanvasState
|
||||
&fields_str_slice,
|
||||
&self.current_field,
|
||||
&values,
|
||||
&values_str_slice,
|
||||
theme,
|
||||
is_edit_mode,
|
||||
highlight_state,
|
||||
total_count,
|
||||
current_position,
|
||||
self.total_count, // MODIFIED: Use self.total_count
|
||||
self.current_position, // MODIFIED: Use self.current_position
|
||||
);
|
||||
}
|
||||
|
||||
// MODIFIED: Reset now also considers table context for counts
|
||||
pub fn reset_to_empty(&mut self) {
|
||||
self.id = 0; // Reset ID to 0 for new entries
|
||||
self.values.iter_mut().for_each(|v| v.clear()); // Clear all values
|
||||
self.id = 0;
|
||||
self.values.iter_mut().for_each(|v| v.clear());
|
||||
self.current_field = 0;
|
||||
self.current_cursor_pos = 0;
|
||||
self.has_unsaved_changes = false;
|
||||
// current_position should be set to total_count + 1 for a new entry
|
||||
// This might be better handled by the logic that calls reset_to_empty
|
||||
// For now, let's ensure it's consistent with a "new" state.
|
||||
if self.total_count > 0 {
|
||||
self.current_position = self.total_count + 1;
|
||||
} else {
|
||||
self.current_position = 1; // If table is empty, new record is at position 1
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_current_input(&self) -> &str {
|
||||
@@ -75,15 +102,43 @@ impl FormState {
|
||||
.expect("Invalid current_field index")
|
||||
}
|
||||
|
||||
pub fn update_from_response(&mut self, response: common::proto::multieko2::adresar::AdresarResponse) {
|
||||
self.id = response.id;
|
||||
self.values = vec![
|
||||
response.firma, response.kz, response.drc,
|
||||
response.ulica, response.psc, response.mesto,
|
||||
response.stat, response.banka, response.ucet,
|
||||
response.skladm, response.ico, response.kontakt,
|
||||
response.telefon, response.skladu, response.fax,
|
||||
];
|
||||
// MODIFIED: Update from a generic HashMap response
|
||||
pub fn update_from_response(
|
||||
&mut self,
|
||||
response_data: &HashMap<String, String>,
|
||||
) {
|
||||
self.values = self.fields
|
||||
.iter()
|
||||
.map(|field_name| {
|
||||
response_data.get(field_name).cloned().unwrap_or_default()
|
||||
})
|
||||
.collect();
|
||||
|
||||
if let Some(id_str) = response_data.get("id") {
|
||||
match id_str.parse::<i64>() {
|
||||
Ok(parsed_id) => self.id = parsed_id,
|
||||
Err(e) => {
|
||||
tracing::error!(
|
||||
"Failed to parse 'id' field '{}' for table {}.{}: {}",
|
||||
id_str,
|
||||
self.profile_name,
|
||||
self.table_name,
|
||||
e
|
||||
);
|
||||
self.id = 0; // Default to 0 if parsing fails
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// If no ID is present, it might be a new record structure or an error
|
||||
// For now, assume it means the record doesn't have an ID from the server yet
|
||||
self.id = 0;
|
||||
}
|
||||
self.has_unsaved_changes = false;
|
||||
// current_field and current_cursor_pos might need resetting or adjusting
|
||||
// depending on the desired behavior after loading data.
|
||||
// For now, let's reset current_field to 0.
|
||||
self.current_field = 0;
|
||||
self.current_cursor_pos = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,31 +160,26 @@ impl CanvasState for FormState {
|
||||
}
|
||||
|
||||
fn get_current_input(&self) -> &str {
|
||||
self.values
|
||||
.get(self.current_field)
|
||||
.map(|s| s.as_str())
|
||||
.unwrap_or("")
|
||||
// Re-use the struct's own method
|
||||
FormState::get_current_input(self)
|
||||
}
|
||||
|
||||
fn get_current_input_mut(&mut self) -> &mut String {
|
||||
self.values
|
||||
.get_mut(self.current_field)
|
||||
.expect("Invalid current_field index")
|
||||
// Re-use the struct's own method
|
||||
FormState::get_current_input_mut(self)
|
||||
}
|
||||
|
||||
fn fields(&self) -> Vec<&str> {
|
||||
self.fields.iter().map(|s| s.as_str()).collect()
|
||||
}
|
||||
|
||||
// --- Implement the setter methods ---
|
||||
fn set_current_field(&mut self, index: usize) {
|
||||
if index < self.fields.len() { // Basic bounds check
|
||||
if index < self.fields.len() {
|
||||
self.current_field = index;
|
||||
}
|
||||
}
|
||||
|
||||
fn set_current_cursor_pos(&mut self, pos: usize) {
|
||||
// Optional: Add validation based on current input length if needed
|
||||
self.current_cursor_pos = pos;
|
||||
}
|
||||
|
||||
@@ -137,12 +187,11 @@ impl CanvasState for FormState {
|
||||
self.has_unsaved_changes = changed;
|
||||
}
|
||||
|
||||
// --- Autocomplete Support (Not Used for FormState) ---
|
||||
fn get_suggestions(&self) -> Option<&[String]> {
|
||||
None // FormState doesn't provide suggestions
|
||||
None
|
||||
}
|
||||
|
||||
fn get_selected_suggestion_index(&self) -> Option<usize> {
|
||||
None // FormState doesn't have selected suggestions
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user