dropdown is being triggered

This commit is contained in:
filipriec
2025-06-15 12:15:25 +02:00
parent 8ace9bc4d1
commit b49dce3334
6 changed files with 202 additions and 108 deletions

View File

@@ -9,7 +9,7 @@ use crate::modes::common::commands::CommandHandler;
use crate::modes::handlers::event::{EventHandler, EventOutcome};
use crate::modes::handlers::mode_manager::{AppMode, ModeManager};
use crate::state::pages::canvas_state::CanvasState;
use crate::state::pages::form::FormState;
use crate::state::pages::form::{FormState, FieldDefinition}; // Import FieldDefinition
use crate::state::pages::auth::AuthState;
use crate::state::pages::auth::LoginState;
use crate::state::pages::auth::RegisterState;
@@ -92,13 +92,19 @@ pub async fn run_ui() -> Result<()> {
.await
.context("Failed to initialize app state and form")?;
let filtered_columns = filter_user_columns(initial_columns_from_service);
let initial_field_defs: Vec<FieldDefinition> = filter_user_columns(initial_columns_from_service)
.into_iter()
.map(|col_name| FieldDefinition {
display_name: col_name.clone(),
data_key: col_name,
is_link: false,
})
.collect();
let mut form_state = FormState::new(
initial_profile.clone(),
initial_table.clone(),
filtered_columns,
vec![], // FIX 1: Provide the missing 4th argument
initial_field_defs,
);
UiService::fetch_and_set_table_count(&mut grpc_client, &mut form_state)
@@ -334,36 +340,54 @@ pub async fn run_ui() -> Result<()> {
.await
{
Ok(structure_response) => {
let new_columns: Vec<String> = structure_response
// --- START OF MODIFIED LOGIC ---
let all_columns: Vec<String> = structure_response
.columns
.iter()
.map(|c| c.name.clone())
.collect();
// FIX 2: Look up links in the profile_tree
let new_links: Vec<String> = app_state
// 1. Process regular columns first, filtering out FKs
let mut field_definitions: Vec<FieldDefinition> =
filter_user_columns(all_columns)
.into_iter()
.filter(|col_name| !col_name.ends_with("_id")) // Exclude FKs
.map(|col_name| FieldDefinition {
display_name: col_name.clone(),
data_key: col_name,
is_link: false, // Regular fields are not links
})
.collect();
// 2. Process linked tables to create the correct labels
let linked_tables: Vec<String> = app_state
.profile_tree
.profiles
.iter()
.find(|p| p.name == *prof_name)
.and_then(|profile| {
profile
.tables
.iter()
.find(|t| t.name == *tbl_name)
profile.tables.iter().find(|t| t.name == *tbl_name)
})
.map_or(vec![], |table| {
table.depends_on.clone()
.map_or(vec![], |table| table.depends_on.clone());
for linked_table_name in linked_tables {
let base_name = linked_table_name
.split_once('_')
.map_or(linked_table_name.as_str(), |(_, rest)| rest);
let data_key = format!("{}_id", base_name);
let display_name = linked_table_name;
field_definitions.push(FieldDefinition {
display_name,
data_key,
is_link: true, // These fields ARE links
});
let filtered_columns =
filter_user_columns(new_columns);
}
// --- END OF MODIFIED LOGIC ---
form_state = FormState::new(
prof_name.clone(),
tbl_name.clone(),
filtered_columns,
new_links,
field_definitions,
);
if let Err(e) = UiService::fetch_and_set_table_count(
@@ -401,6 +425,7 @@ pub async fn run_ui() -> Result<()> {
prev_view_table_name = current_view_table;
table_just_switched = true;
}
Err(e) => {
app_state.update_dialog_content(
&format!("Error fetching table structure: {}", e),