From 24c59fbf40d5af58905890f5fbadc9de69ec2b44 Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Thu, 9 Apr 2026 01:56:34 -0700 Subject: [PATCH] fix: Model::add_formula auto-adds target item; fix formula panel display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Model::add_formula now ensures the formula target exists as an item in the target category (same fix as AddFormula effect, but at the model level — covers file loading and headless paths). Formula panel now shows raw formula text instead of debug-formatted string with redundant target name and quotes. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/model/types.rs | 29 +++++++++++++++++++++++++++++ src/ui/formula_panel.rs | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/model/types.rs b/src/model/types.rs index 9a3600f..04b5699 100644 --- a/src/model/types.rs +++ b/src/model/types.rs @@ -172,6 +172,11 @@ impl Model { } pub fn add_formula(&mut self, formula: Formula) { + // Ensure the formula target exists as an item in the target category + // so the grid layout includes cells for it. + if let Some(cat) = self.categories.get_mut(&formula.target_category) { + cat.add_item(&formula.target); + } // Replace if same target within the same category if let Some(pos) = self.formulas.iter().position(|f| { f.target == formula.target && f.target_category == formula.target_category @@ -731,6 +736,30 @@ mod model_tests { assert_eq!(result, Some(CellValue::Number(150.0))); } + /// Model::add_formula should add the formula target as an item to the + /// target category so the grid layout includes cells for it. + #[test] + fn add_formula_adds_target_item() { + use crate::formula::parse_formula; + + let mut m = Model::new("Test"); + m.add_category("Measure").unwrap(); + m.add_category("Region").unwrap(); + m.category_mut("Region").unwrap().add_item("East"); + m.category_mut("Measure").unwrap().add_item("Revenue"); + m.category_mut("Measure").unwrap().add_item("Cost"); + + m.add_formula(parse_formula("Profit = Revenue - Cost", "Measure").unwrap()); + + assert!( + m.category("Measure") + .unwrap() + .ordered_item_names() + .contains(&"Profit"), + "add_formula should add target item to category" + ); + } + #[test] fn evaluate_aggregated_no_hidden_delegates_to_evaluate() { let mut m = Model::new("Test"); diff --git a/src/ui/formula_panel.rs b/src/ui/formula_panel.rs index e7cb5c1..16e35e8 100644 --- a/src/ui/formula_panel.rs +++ b/src/ui/formula_panel.rs @@ -50,7 +50,7 @@ impl PanelContent for FormulaContent<'_> { } else { Style::default().fg(Color::Green) }; - let text = format!(" {} = {:?}", formula.target, formula.raw); + let text = format!(" {}", formula.raw); let truncated = if text.len() > inner.width as usize { format!("{}…", &text[..inner.width as usize - 1]) } else {