Stage 305: PR #1747 — fix: wait for model catalog before opening picker by @Michaelyklam

This commit is contained in:
test
2026-05-06 17:24:23 +00:00
3 changed files with 43 additions and 1 deletions
+11 -1
View File
@@ -563,6 +563,11 @@ async function populateModelDropdown(){
_applyModelToDropdown(data.default_model, sel, data.active_provider||null);
}
if(typeof syncModelChip==='function') syncModelChip();
const dd=$('composerModelDropdown');
if(dd&&dd.classList.contains('open')&&typeof renderModelDropdown==='function'){
renderModelDropdown();
_positionModelDropdown();
}
// Kick off a background live-model fetch for the active provider.
// This runs after the static list is already shown (no blocking flicker).
if(data.active_provider) _fetchLiveModels(data.active_provider, sel);
@@ -963,7 +968,7 @@ async function selectModelFromDropdown(value){
if(typeof sel.onchange==='function') await sel.onchange();
}
function toggleModelDropdown(){
async function toggleModelDropdown(){
const dd=$('composerModelDropdown');
const chip=$('composerModelChip');
const sel=$('modelSelect');
@@ -974,6 +979,11 @@ function toggleModelDropdown(){
if(typeof closeWsDropdown==='function') closeWsDropdown();
if(typeof closeReasoningDropdown==='function') closeReasoningDropdown();
if(typeof closeToolsetsDropdown==='function') closeToolsetsDropdown();
const ready=window._modelDropdownReady;
if(ready&&typeof ready.then==='function'){
try{await ready;}catch(_){}
}
if(dd.classList.contains('open')) return;
renderModelDropdown();
dd.classList.add('open');
_positionModelDropdown();
+30
View File
@@ -0,0 +1,30 @@
"""Regression coverage for #1743 model picker async catalog race."""
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
UI_JS = (ROOT / "static" / "ui.js").read_text()
def _body_between(src: str, start: str, end: str) -> str:
start_idx = src.index(start)
end_idx = src.index(end, start_idx)
return src[start_idx:end_idx]
def test_model_picker_open_waits_for_async_model_catalog_before_rendering():
"""Opening the visible picker must not render stale static <select> options."""
body = _body_between(UI_JS, "async function toggleModelDropdown", "function closeModelDropdown")
assert "window._modelDropdownReady" in body
assert "await" in body
assert body.index("await") < body.index("renderModelDropdown()")
def test_populate_model_dropdown_rerenders_if_picker_is_already_open():
"""If the async catalog finishes while open, refresh the visible custom rows."""
body = _body_between(UI_JS, "async function populateModelDropdown", "// Cache so we don't re-fetch")
assert "composerModelDropdown" in body
assert "classList.contains('open')" in body or 'classList.contains("open")' in body
assert "renderModelDropdown()" in body
@@ -14,6 +14,8 @@ def test_select_model_custom_option_uses_friendly_label_helper():
start = src.find("async function selectModelFromDropdown(value)")
assert start != -1, "selectModelFromDropdown() not found"
end = src.find("\nfunction toggleModelDropdown()", start)
if end == -1:
end = src.find("\nasync function toggleModelDropdown()", start)
assert end != -1, "toggleModelDropdown() boundary not found"
body = src[start:end]