From 77cd95901acd726aba068c0a2bb67c0ac8caeb9c Mon Sep 17 00:00:00 2001 From: ThearchyHelios Date: Thu, 15 Oct 2026 07:27:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=95=B4=E5=85=B3=E5=8F=A3=E6=94=B6?= =?UTF-8?q?=E5=B0=BE=EF=BC=9A=E7=AB=AF=E7=82=B9=E8=AE=A4=E8=AF=81=E5=A4=B4?= =?UTF-8?q?=E9=87=8D=E5=90=8D=E5=8F=AA=E6=A0=87=E5=90=8E=E5=8A=A0=E7=9A=84?= =?UTF-8?q?=E9=82=A3=E4=B8=80=E8=A1=8C=EF=BC=88=E5=8E=9F=E6=9C=89=E7=9A=84?= =?UTF-8?q?=E9=82=A3=E8=A1=8C=E6=9C=AC=E8=BA=AB=E6=B2=A1=E9=94=99=EF=BC=89?= =?UTF-8?q?=EF=BC=9Bcheck-apps=20=E5=AE=9E=E4=BE=8B=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=8F=AA=E8=AE=A4=E7=8A=B6=E6=80=81=E6=A0=87=E7=AD=BE=E6=9C=AC?= =?UTF-8?q?=E8=BA=AB=EF=BC=88=E6=A0=87=E7=AD=BE=E9=87=8C=E5=B5=8C=E7=9D=80?= =?UTF-8?q?=E5=B8=A6=20data-status=20=E7=9A=84=E5=9B=BE=E6=A0=87=EF=BC=89?= =?UTF-8?q?=EF=BC=9Bcheck-app-editor=20=E9=80=89=E4=BA=BA=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E6=A1=86=E6=8C=82=E4=BA=86=E5=80=99=E9=80=89=E5=88=97?= =?UTF-8?q?=E8=A1=A8=EF=BC=8C=E8=A7=92=E8=89=B2=E6=98=AF=20combobox?= =?UTF-8?q?=EF=BC=8C=E6=8C=89=E8=BE=93=E5=85=A5=E6=A1=86=E5=AE=9A=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/tools/EndpointsTab.tsx | 9 +++++---- scripts/check-app-editor.mjs | 3 ++- scripts/check-apps.mjs | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/tools/EndpointsTab.tsx b/frontend/src/pages/tools/EndpointsTab.tsx index 21dfa747..1eeb0b6a 100644 --- a/frontend/src/pages/tools/EndpointsTab.tsx +++ b/frontend/src/pages/tools/EndpointsTab.tsx @@ -30,10 +30,11 @@ const rowsOf = (env?: EndpointEnv): HeaderRow[] => Object.entries(env?.headers ? /** 请求头名称:HTTP 的 token(和服务端 capabilities/secrets.header_problem 同一条规矩,服务端为准) */ const HEADER_NAME = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/ -function headerProblem(row: HeaderRow, rows: HeaderRow[]): string | null { +/** 一行认证头的问题。重名只标后来的那一行:前面那一行本身没错,删掉或改掉后加的就好 */ +function headerProblem(row: HeaderRow, rows: HeaderRow[], index: number): string | null { if (!row.k.trim()) return T.headerEmpty if (!HEADER_NAME.test(row.k)) return T.headerInvalid - if (rows.filter((r) => r.k.toLowerCase() === row.k.toLowerCase()).length > 1) return T.headerDuplicate + if (rows.slice(0, index).some((r) => r.k.toLowerCase() === row.k.toLowerCase())) return T.headerDuplicate return null } @@ -168,7 +169,7 @@ function EndpointEditor({ row, onClose, onSaved, onConflict }: { const [timeout, setTimeoutS] = useState(row?.timeout_s ?? 20) const [busy, setBusy] = useState(false) // 配了的环境里有标红的请求头(名称空、不合法、重复):不让保存 - const headerBlocked = ENVS.some((env) => envs[env] && headers[env].some((r) => headerProblem(r, headers[env]))) + const headerBlocked = ENVS.some((env) => envs[env] && headers[env].some((r, i) => headerProblem(r, headers[env], i))) const idemProblem = HEADER_NAME.test(idem) ? null : T.headerInvalid const setEnv = (env: EnvKey, patch: Partial | null) => setEnvs((cur) => { @@ -259,7 +260,7 @@ function EnvEditor({ env, value, onChange, headers, onHeaders }: {
{T.headers} · {T.headersHint}
{headers.map((r, i) => { - const problem = headerProblem(r, headers) + const problem = headerProblem(r, headers, i) const errorId = `endpoint-${env}-header-${i}-error` return (
diff --git a/scripts/check-app-editor.mjs b/scripts/check-app-editor.mjs index 90e7a960..5ad406c0 100644 --- a/scripts/check-app-editor.mjs +++ b/scripts/check-app-editor.mjs @@ -585,7 +585,8 @@ await section('岗位与授权:三档各写标题和说明;搭建者从名 && (await rows.nth(1).innerText()).includes('全部实例') && (await rows.nth(2).innerText()).includes('编辑、发布')) const use = rows.first() check('已选的名录里没有:标签上标出来', await waitFor(page, async () => await use.locator('[data-principal-problem="missing"]').count() === 1)) - const input = use.getByRole('textbox') + // 挂了候选列表(list)的输入框角色是 combobox,不是 textbox + const input = use.locator('input').first() const chips = () => use.locator('li[data-principal]').count() await input.fill('nobody') await input.press('Enter') diff --git a/scripts/check-apps.mjs b/scripts/check-apps.mjs index 0356bae1..7d53ea85 100644 --- a/scripts/check-apps.mjs +++ b/scripts/check-apps.mjs @@ -468,7 +468,7 @@ await section('实例页:状态、进度、待办卡、动作状态', async () await page.locator('[data-view-renderer]').waitFor({ timeout: 15000 }) check('写出发起人', (await page.locator('[data-instance-page]').innerText()).includes('由「张三」发起')) check('实例状态按服务端的说法写(结果未知:等待核实写入结果,不是「等待审批」)', - (await page.locator('[data-component="instance_header"] [data-status]').innerText()).includes('等待核实写入结果') + (await page.locator('[data-component="instance_header"] span[data-status]').first().innerText()).includes('等待核实写入结果') && !(await page.locator('[data-component="instance_header"]').innerText()).includes('等待审批')) check('进度按节点列出', (await page.locator('[data-timeline-step]').count()) === 3) check('结果未知的那一步写「结果未知」,不写「完成」',