+ @* Wider than the site select beside it: the field carries a whole instance
+ name, not a short site name. The script-entry branch still sums to 8 of 12
+ (site 2 + instance 3 + script 3) alongside the auto-width toolbar columns. *@
+
@* A site can hold hundreds of instances, so this is the shared area-tree
combobox, not a flat list (design 2026-09-08). _areas/_instances are
loaded once per site — the picker treats a new list as a site change. *@
+ Disabled="@(_running || _selectedSiteId == 0)"
+ Placeholder="Search instances…" DataTestPrefix="flow-instance" />
diff --git a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Deployment/FlowDebuggerPageTests.cs b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Deployment/FlowDebuggerPageTests.cs
index 0a368c08..ed738665 100644
--- a/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Deployment/FlowDebuggerPageTests.cs
+++ b/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Deployment/FlowDebuggerPageTests.cs
@@ -815,4 +815,31 @@ public class FlowDebuggerPageTests : BunitContext
cut.WaitForAssertion(() =>
Assert.Equal("Sim01", cut.Find("[data-test='flow-instance-input']").GetAttribute("value")));
}
+
+ [Fact]
+ public void ScriptEntry_SiteChange_ClearsThePickedInstance()
+ {
+ RegisterServices();
+ WireInstance();
+ // A second site the operator can switch to, with no instances of its own.
+ _sites.GetAllSitesAsync(Arg.Any()).Returns(Task.FromResult>(
+ [new Site("Plant A", "site-a") { Id = 1 }, new Site("Plant B", "site-b") { Id = 2 }]));
+ _templates.GetInstancesBySiteIdAsync(2, Arg.Any())
+ .Returns(Task.FromResult>([]));
+ _templates.GetAreasBySiteIdAsync(2, Arg.Any())
+ .Returns(Task.FromResult>([]));
+
+ var cut = Render();
+ cut.Find("button[data-test='flow-entry-script']").Click();
+ cut.Find("select[data-test='flow-site-select']").Change("1");
+ PickInstance(cut, 7);
+ Assert.Equal("Sim01", cut.Find("[data-test='flow-instance-input']").GetAttribute("value"));
+
+ cut.Find("select[data-test='flow-site-select']").Change("2");
+
+ // The pick is dropped on both sides: the page's id and the picker's field text, which
+ // it re-derives because the new site handed it a different instance list.
+ Assert.Equal(string.Empty, cut.Find("[data-test='flow-instance-input']").GetAttribute("value"));
+ Assert.Equal(["— choose —"], cut.FindAll("select[data-test='flow-script-select'] option").Select(o => o.TextContent.Trim()).ToList());
+ }
}