mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-26 11:40:26 +00:00
Stage 305: PR #1747 — fix: wait for model catalog before opening picker by @Michaelyklam
This commit is contained in:
+11
-1
@@ -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();
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user