Merge storytold/gridcraft#2504: Circular references: Error Checking and the status bar quote sheet names that need quotes

This commit is contained in:
aiongg
2026-10-25 02:24:49 +00:00
4 changed files with 33 additions and 3 deletions
+6 -2
View File
@@ -664,8 +664,12 @@ fn error_checking(s: &mut Session, _: &Json) -> Result<Json> {
}
}
}
let circ: Vec<String> =
d.calc.circular.iter().map(|(si, c)| format!("{}!{}", d.wb.sheet(*si).map(|s| s.name.clone()).unwrap_or_default(), c.a1())).collect();
let circ: Vec<String> = d
.calc
.circular
.iter()
.map(|(si, c)| format!("{}!{}", d.wb.sheet(*si).map(|s| gridcraft_formula::quote_sheet(&s.name)).unwrap_or_default(), c.a1()))
.collect();
Ok(json!({"errors": out, "circular": circ}))
}
+17
View File
@@ -2784,6 +2784,23 @@ fn calculation_options_enable_iterative_calculation() {
near(&s, "A1", 10.0);
}
#[test]
fn error_checking_quotes_sheet_names_in_circular_references() {
let mut s = s();
s.execute("home.insertSheet", json!({"name": "Bob's Q1"})).unwrap();
s.execute("cell.set", json!({"cell": "B2", "input": "=B2+1"})).unwrap();
let r = s.execute("formulas.errorChecking", json!({})).unwrap();
assert_eq!(r["circular"], json!(["'Bob''s Q1'!B2"]));
// The reference reads back in a formula and in Go To.
let reference = r["circular"][0].as_str().unwrap().to_string();
s.execute("sheet.activate", json!({"sheet": 0})).unwrap();
s.execute("cell.set", json!({"cell": "A1", "input": format!("=ROW({reference})")})).unwrap();
assert_eq!(v(&s, "A1"), Value::Number(2.0));
s.execute("edit.goTo", json!({"reference": reference})).unwrap();
let d = s.doc().unwrap();
assert_eq!((d.wb.active_sheet, d.selection.active.a1()), (1, "B2".to_string()));
}
fn chart_data(s: &mut Session) {
s.execute(
"range.setValues",
+1 -1
View File
@@ -282,7 +282,7 @@ pub fn status_bar(app: &mut SheetApp, ui: &mut Ui) {
if !d.calc.circular.is_empty() {
ui.add_space(12.0);
let (si, c) = d.calc.circular[0];
let name = d.wb.sheet(si).map(|s| s.name.clone()).unwrap_or_default();
let name = d.wb.sheet(si).map(|s| gridcraft_engine::formula::quote_sheet(&s.name)).unwrap_or_default();
ui.label(egui::RichText::new(format!("Circular References: {name}!{}", c.a1())).font(theme::ui_font(12.5)).color(t.danger));
}
if app.session.clipboard.is_some() && app.editor.is_none() {
+9
View File
@@ -922,6 +922,15 @@ fn status_bar_shows_macro_badge() {
h.run_steps(2);
}
#[test]
fn status_bar_quotes_the_sheet_name_of_a_circular_reference() {
let mut s = blank();
s.execute("home.insertSheet", json!({"name": "Bob's Q1"})).unwrap();
s.execute("cell.set", json!({"cell": "B2", "input": "=B2+1"})).unwrap();
let h = harness(s);
assert!(h.query_by_label("Circular References: 'Bob''s Q1'!B2").is_some(), "the status bar names the cell as a reference");
}
#[test]
fn alt_f8_opens_the_macros_dialog() {
let mut h = harness(blank());