From 38508e79a815b18f3037f43f0c091994c4bcd854 Mon Sep 17 00:00:00 2001 From: Ed1s0nZ Date: Tue, 6 Oct 2026 03:16:34 +0800 Subject: [PATCH] fix: keep list badges within table columns --- docs/bug-sheet-review.md | 4 ++++ docs/bug-sheet-status.md | 6 +++--- web/static/css/style.css | 23 ++++++++++++++++++++++- web/static/js/assets.js | 2 +- web/static/js/projects.js | 4 ++-- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/docs/bug-sheet-review.md b/docs/bug-sheet-review.md index 99d159e1..c7bab3c5 100644 --- a/docs/bug-sheet-review.md +++ b/docs/bug-sheet-review.md @@ -124,3 +124,7 @@ - Excel 第 60 行:真实数据库中创建会话/助手消息,启用人工审批,实际 waitHITLApproval 发出 pending 后通过 AgentTaskManager 取消;验证等待返回 context.Canceled、审批记录 cancelled、任务从活跃列表移除、历史与 done 均 cancelled。测试不调用真实模型或扫描目标,因此证明审批/任务收尾路径,不能重建截图中的远端模型过程。 - done 分支的进度控制按钮也按终态显示,不再再次写“已完成”。真实分支执行验证取消、失败和成功标题、控制文案与遗留工具状态;保留已收到工具终态的结果。 + +### 列表标签布局(表格第 12、13、43 行) + +事实列表置顶和关联信息改为统一的可换行容器,关联漏洞 ID 增加明确标签及完整 ID 提示。资产项目标签原最大宽度 180px 超出 126px 列宽,现限制为单元格内容宽度并显示省略号及完整名称提示。使用实际样式表和代表性长名称进行本地浏览器布局检查:项目标签宽 98px,右边界位于单元格内,相邻归属文本保持可见。此检查覆盖标签布局,未作为完整应用流程验证。JavaScript 语法与 diff 检查通过。 diff --git a/docs/bug-sheet-status.md b/docs/bug-sheet-status.md index ab23827d..5dad4dc2 100644 --- a/docs/bug-sheet-status.md +++ b/docs/bug-sheet-status.md @@ -14,8 +14,8 @@ | 9 | 8 | 接上一个,改成中国后,省份还是拼音 | 省市为手工输入字段,当前无自动地区联动;原描述误认示例或输入值 | | 10 | 9 | 资产导出的 语言问题,也是英文 | 已修复导出表头及枚举语言;三种语言的真实 CSV/XLSX 往返测试通过 | | 11 | 10 | 项目管理,添加事实提示词优化,表单里是没有summary | 当前表单已有摘要(summary)且保存必填,原描述未复现 | -| 12 | 11 | 样式问题 | 待核对 | -| 13 | 12 | 样式问题 | 待核对 | +| 12 | 11 | 样式问题 | 已修复:置顶与关联信息统一排列,避免独立徽标挤压 | +| 13 | 12 | 样式问题 | 已修复:关联漏洞 ID 显示明确标签,悬停可查看完整 ID | | 14 | 13 | 明文回显 API Key | 已修复并有针对性验证 | | 15 | 14 | 点击查看事实后,弹窗无事实,然后就跳转到事实页面了,觉得留在本页面合适 | 已修复查看入口强制跳页;直接打开事实详情,空关联仅提示,4 项脚本回归通过 | | 16 | 15 | 不同的项目保存漏洞时能有去重逻辑吗,待确认。隔离好像也没啥问题 | 跨项目全局去重属行为变更建议;现有按项目授权隔离,不改动 | @@ -45,7 +45,7 @@ | 40 | — | 无权限用户仍能看到“新建角色”“添加成员”等管理操作按钮;页面同时提示“权限不足”。应在前端按权 | 已补权限入口标记,按钮可见性验证通过 | | 41 | — | 点击“并发数”当前值进行编辑。 | 已修复并发越界提示,前后端回归通过 | | 42 | — | 设置页清空“项目名称”后点击保存,页面提示“已保存”,但名称被静默恢复成原值。 | 已修复空名称误报保存成功,前后端回归通过 | -| 43 | — | 样式问题 | 待核对 | +| 43 | — | 样式问题 | 已修复:项目标签按列宽截断,完整名称保留在悬停提示 | | 44 | — | 输入 目标地址 时,前端正确解析 IP/端口/协议,但提交提示“域名格式无效”,无法创建。 | 已修复 URL 与预填 IP 重复解析,IPv4/IPv6 回归通过 | | 45 | — | 无工具节点的工作流成功完成后,被误判为缺少执行证据 | 已修复无工具工作流终结与审批拒绝原因,实际运行回归通过 | | 46 | — | Agent ID 可重复- 两个不同文件可使用同一个 ID。 | 已修复并有针对性验证 | diff --git a/web/static/css/style.css b/web/static/css/style.css index ad1c5f15..cbde58ad 100644 --- a/web/static/css/style.css +++ b/web/static/css/style.css @@ -43102,7 +43102,7 @@ input.theme-checkbox:disabled { .asset-target-link:hover { text-decoration: underline; } .asset-table td small { margin-top: 4px; color: var(--text-secondary, #64748b); } .asset-tag { display: inline-block; margin: 5px 4px 0 0; padding: 2px 7px; border-radius: 999px; background: rgba(37,99,235,.1); color: #2563eb; font-size: 11px; } -.asset-project-badge { display: inline-flex; max-width: 180px; padding: 3px 8px; border-radius: 6px; background: rgba(99,102,241,.1); color: #4f46e5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.asset-project-badge { display: block; max-width: 100%; box-sizing: border-box; padding: 3px 8px; border-radius: 6px; background: rgba(99,102,241,.1); color: #4f46e5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .asset-service { display: block; max-width: 100%; overflow: hidden; color: inherit; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; text-overflow: ellipsis; white-space: nowrap; } .asset-status { display: inline-flex; padding: 3px 9px; border-radius: 999px; font-size: 12px; background: rgba(16,185,129,.12); color: #059669; } .asset-status--inactive { background: rgba(100,116,139,.12); color: #64748b; } @@ -46694,3 +46694,24 @@ html[data-theme="dark"] { --tool-blocked-color: #f4bc62; } background: rgba(220, 38, 38, 0.08); border-color: rgba(220, 38, 38, 0.25); } + +#project-panel-facts .projects-fact-meta { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 4px 6px; + margin-top: 5px; + min-width: 0; +} +#project-panel-facts .projects-fact-meta .projects-list-item-badge { + margin: 0; + line-height: 1.5; +} +#project-panel-facts .projects-fact-meta .projects-fact-vuln-link { + margin: 0; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + line-height: 1.5; +} diff --git a/web/static/js/assets.js b/web/static/js/assets.js index b24faf19..ae79ed69 100644 --- a/web/static/js/assets.js +++ b/web/static/js/assets.js @@ -812,7 +812,7 @@ function renderAssetRows() { ${escapeHtml(service)} - ${asset.project_name ? `${escapeHtml(asset.project_name)}` : '-'} + ${asset.project_name ? `${escapeHtml(asset.project_name)}` : '-'} ${assetOwnershipMarkup(asset)} ${escapeHtml(lastScan)}${vulnerabilityCount > 0 ? `` : '0'} ${escapeHtml(risk.label)} diff --git a/web/static/js/projects.js b/web/static/js/projects.js index 81be0739..9309afbd 100644 --- a/web/static/js/projects.js +++ b/web/static/js/projects.js @@ -1518,7 +1518,7 @@ async function loadProjectFacts() { const keyEsc = escapeHtml(f.fact_key); const idEsc = escapeHtml(f.id); const vulnLink = f.related_vulnerability_id - ? `${escapeHtml(f.related_vulnerability_id.slice(0, 8))}…` + ? `${escapeHtml(tp('projects.relatedVulnIdTitle'))}: ${escapeHtml(f.related_vulnerability_id.slice(0, 8))}…` : ''; const pinBadge = f.pinned ? `${escapeHtml(tp('projects.pinned'))}` @@ -1529,7 +1529,7 @@ async function loadProjectFacts() { ? `↑${lc.outgoing || 0} ↓${lc.incoming || 0}` : '—'; return ` - ${keyEsc}${pinBadge}${vulnLink} + ${keyEsc}${pinBadge || vulnLink ? `
${pinBadge}${vulnLink}
` : ''} ${formatCategoryBadge(f.category)} ${escapeHtml(f.summary)} ${linkBadge}