fix(HEL-233): 去掉系统管理按钮属性多余引号,恢复点击
五个无值 data-system-* 属性名后多写了引号,选择器匹配失败导致按钮完全无效。 toast 改为在未打开抽屉时也能挂载,并补源码与真实点击回归。 Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
co-authored by
Cursor
multica-agent
parent
13cd9940f7
commit
cefc86917d
@@ -3466,7 +3466,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function showToast(message) {
|
function showToast(message) {
|
||||||
const root = document.getElementById("m-sheet-root");
|
const root = ensureSheetRoot();
|
||||||
if (!root) return;
|
if (!root) return;
|
||||||
let toast = document.getElementById("m-toast");
|
let toast = document.getElementById("m-toast");
|
||||||
if (!toast) {
|
if (!toast) {
|
||||||
@@ -4966,7 +4966,7 @@
|
|||||||
const page = document.querySelector(".m-page");
|
const page = document.querySelector(".m-page");
|
||||||
if (page) {
|
if (page) {
|
||||||
page.innerHTML = '<div class="m-scroll" id="m-scroll">' + html + "</div>" +
|
page.innerHTML = '<div class="m-scroll" id="m-scroll">' + html + "</div>" +
|
||||||
'<div class="m-form-bar"><button class="m-btn-primary" type="button" data-system-save-birth">保存资料</button></div>';
|
'<div class="m-form-bar"><button class="m-btn-primary" type="button" data-system-save-birth>保存资料</button></div>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4981,7 +4981,7 @@
|
|||||||
const page = document.querySelector(".m-page");
|
const page = document.querySelector(".m-page");
|
||||||
if (page) {
|
if (page) {
|
||||||
page.innerHTML = '<div class="m-scroll" id="m-scroll">' + html + "</div>" +
|
page.innerHTML = '<div class="m-scroll" id="m-scroll">' + html + "</div>" +
|
||||||
'<div class="m-form-bar"><button class="m-btn-primary" type="button" data-system-save-password">更新密码</button></div>';
|
'<div class="m-form-bar"><button class="m-btn-primary" type="button" data-system-save-password>更新密码</button></div>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5058,13 +5058,13 @@
|
|||||||
formFieldHtml("主模型", '<select id="m-sys-primary-model"></select>', false) +
|
formFieldHtml("主模型", '<select id="m-sys-primary-model"></select>', false) +
|
||||||
formFieldHtml("辅助模型", '<select id="m-sys-fallback-model"></select>', false) +
|
formFieldHtml("辅助模型", '<select id="m-sys-fallback-model"></select>', false) +
|
||||||
'<div id="m-sys-model-list">' + renderModelPoolHtml(llm.models || []) + "</div>" +
|
'<div id="m-sys-model-list">' + renderModelPoolHtml(llm.models || []) + "</div>" +
|
||||||
'<button class="m-btn-primary" type="button" data-system-add-model">添加模型</button>' +
|
'<button class="m-btn-primary" type="button" data-system-add-model>添加模型</button>' +
|
||||||
"</div>";
|
"</div>";
|
||||||
const page = document.querySelector(".m-page");
|
const page = document.querySelector(".m-page");
|
||||||
if (!page) return;
|
if (!page) return;
|
||||||
const bar = tab === "models"
|
const bar = tab === "models"
|
||||||
? '<div class="m-form-bar"><button class="m-btn-primary" type="button" data-system-save-models">保存模型池</button></div>'
|
? '<div class="m-form-bar"><button class="m-btn-primary" type="button" data-system-save-models>保存模型池</button></div>'
|
||||||
: '<div class="m-form-bar"><button class="m-btn-primary" type="button" data-system-save-market">保存行情配置</button></div>';
|
: '<div class="m-form-bar"><button class="m-btn-primary" type="button" data-system-save-market>保存行情配置</button></div>';
|
||||||
page.innerHTML = adminTabHtml() + '<div class="m-scroll" id="m-scroll">' + (tab === "models" ? modelsHtml : marketHtml) + "</div>" + bar;
|
page.innerHTML = adminTabHtml() + '<div class="m-scroll" id="m-scroll">' + (tab === "models" ? modelsHtml : marketHtml) + "</div>" + bar;
|
||||||
if (tab === "models") updateSystemModelRoleOptions(llm.primary_model_id || "", llm.fallback_model_id || "");
|
if (tab === "models") updateSystemModelRoleOptions(llm.primary_model_id || "", llm.fallback_model_id || "");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -355,6 +355,18 @@ test("system management pages render real content instead of placeholders", asyn
|
|||||||
await expect(page.locator("#m-sys-member-limit")).toBeVisible();
|
await expect(page.locator("#m-sys-member-limit")).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("empty profile save click shows a toast instead of a dead button", async ({ page }) => {
|
||||||
|
await mockMobileApi(page);
|
||||||
|
await openMobile(page);
|
||||||
|
await navigateToFeature(page, "system/profile");
|
||||||
|
await expect(page.locator("[data-system-save-birth]")).toBeVisible();
|
||||||
|
await page.locator("#m-sys-birth-date").fill("");
|
||||||
|
await page.locator("#m-sys-birth-time").fill("");
|
||||||
|
await page.locator("[data-system-save-birth]").click();
|
||||||
|
await expect(page.locator("#m-toast.is-visible")).toBeVisible();
|
||||||
|
await expect(page.locator("#m-toast")).toContainText("请填写完整出生日期和时间");
|
||||||
|
});
|
||||||
|
|
||||||
test("non-admin cannot open system admin pages as placeholders", async ({ page }) => {
|
test("non-admin cannot open system admin pages as placeholders", async ({ page }) => {
|
||||||
await mockMobileApi(page, { auth: authSession("user", true) });
|
await mockMobileApi(page, { auth: authSession("user", true) });
|
||||||
await openMobile(page);
|
await openMobile(page);
|
||||||
|
|||||||
@@ -57,3 +57,22 @@ class MobileSystemPagesRegressionTests(unittest.TestCase):
|
|||||||
'location.assign("/login/")',
|
'location.assign("/login/")',
|
||||||
):
|
):
|
||||||
self.assertIn(marker, pages)
|
self.assertIn(marker, pages)
|
||||||
|
|
||||||
|
def test_system_boolean_attrs_do_not_have_stray_quotes(self) -> None:
|
||||||
|
pages = PAGES.read_text(encoding="utf-8")
|
||||||
|
stray = re.findall(r'data-system-[a-z-]*"(?=[>\s])', pages)
|
||||||
|
self.assertEqual(
|
||||||
|
stray,
|
||||||
|
[],
|
||||||
|
"boolean data-system attributes must not have a trailing quote before > or space",
|
||||||
|
)
|
||||||
|
for name in (
|
||||||
|
"data-system-save-birth",
|
||||||
|
"data-system-save-password",
|
||||||
|
"data-system-add-model",
|
||||||
|
"data-system-save-models",
|
||||||
|
"data-system-save-market",
|
||||||
|
"data-system-refresh",
|
||||||
|
):
|
||||||
|
self.assertIn(name, pages)
|
||||||
|
self.assertNotIn(name + '">', pages)
|
||||||
|
|||||||
Reference in New Issue
Block a user