mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-10-18 21:47:17 +02:00
fix: keep list badges within table columns
This commit is contained in:
1 parent
9090e75a67
commit
38508e79a8
5 files changed
+32
-7
No files matched your search
@@ -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 检查通过。
|
||||
@@ -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。 | 已修复并有针对性验证 |
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -812,7 +812,7 @@ function renderAssetRows() {
|
||||
<td class="asset-check-cell"><input type="checkbox" class="theme-checkbox" ${assetPageState.selected.has(asset.id) ? 'checked' : ''} onchange="toggleAssetSelection(${index},this.checked)" aria-label="${escapeHtml(assetT('assets.selectAsset', '选择资产'))}"></td>
|
||||
<td><button class="asset-target-link" title="${escapeHtml(targetHint)}" onclick="openAssetDetail(${index})">${escapeHtml(assetTargetLabel(asset))}</button></td>
|
||||
<td><span class="asset-service" title="${escapeHtml(service)}">${escapeHtml(service)}</span></td>
|
||||
<td>${asset.project_name ? `<span class="asset-project-badge">${escapeHtml(asset.project_name)}</span>` : '<span class="muted">-</span>'}</td>
|
||||
<td>${asset.project_name ? `<span class="asset-project-badge" title="${escapeHtml(asset.project_name)}">${escapeHtml(asset.project_name)}</span>` : '<span class="muted">-</span>'}</td>
|
||||
<td>${assetOwnershipMarkup(asset)}</td>
|
||||
<td>${escapeHtml(lastScan)}</td><td>${vulnerabilityCount > 0 ? `<button class="asset-vulnerability-link" onclick="openAssetVulnerabilities(${index})">${vulnerabilityCount}</button>` : '<span class="muted">0</span>'}</td>
|
||||
<td><span class="asset-risk asset-risk--${risk.level}">${escapeHtml(risk.label)}</span></td>
|
||||
|
||||
@@ -1518,7 +1518,7 @@ async function loadProjectFacts() {
|
||||
const keyEsc = escapeHtml(f.fact_key);
|
||||
const idEsc = escapeHtml(f.id);
|
||||
const vulnLink = f.related_vulnerability_id
|
||||
? `<span class="projects-fact-vuln-link" title="${escapeHtml(tp('projects.relatedVulnIdTitle'))}">${escapeHtml(f.related_vulnerability_id.slice(0, 8))}…</span>`
|
||||
? `<span class="projects-fact-vuln-link" title="${escapeHtml(tp('projects.relatedVulnIdTitle') + ': ' + f.related_vulnerability_id)}">${escapeHtml(tp('projects.relatedVulnIdTitle'))}: ${escapeHtml(f.related_vulnerability_id.slice(0, 8))}…</span>`
|
||||
: '';
|
||||
const pinBadge = f.pinned
|
||||
? `<span class="projects-list-item-badge" title="${escapeHtml(tp('projects.pinned'))}">${escapeHtml(tp('projects.pinned'))}</span>`
|
||||
@@ -1529,7 +1529,7 @@ async function loadProjectFacts() {
|
||||
? `<span class="projects-fact-link-badge" title="${escapeHtml(tp('projects.linkCountsTitle'))}">↑${lc.outgoing || 0} ↓${lc.incoming || 0}</span>`
|
||||
: '<span class="projects-fact-link-badge projects-fact-link-badge--empty">—</span>';
|
||||
return `<tr>
|
||||
<td class="cell-fact-key"><code class="projects-fact-key-chip" title="${keyEsc}">${keyEsc}</code>${pinBadge}${vulnLink}</td>
|
||||
<td class="cell-fact-key"><code class="projects-fact-key-chip" title="${keyEsc}">${keyEsc}</code>${pinBadge || vulnLink ? `<div class="projects-fact-meta">${pinBadge}${vulnLink}</div>` : ''}</td>
|
||||
<td class="cell-fact-category">${formatCategoryBadge(f.category)}</td>
|
||||
<td class="cell-summary" title="${escapeHtml(f.summary)}">${escapeHtml(f.summary)}</td>
|
||||
<td class="cell-fact-links">${linkBadge}</td>
|
||||
|
||||
Reference in new issue
Block a user