Multi-metric compare templates with presence mode and batch workbook results.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-09-17 17:47:51 +08:00
parent 14f5870e19
commit ea6e0041c1
11 changed files with 1060 additions and 453 deletions

View file

@ -238,7 +238,7 @@ const en = {
confirmDeleteTemplate: "Delete this compare template?",
emptyTemplates: "No templates yet. Create one or use built-ins.",
templateHint:
"Field roles: Key aligns rows; interface fields use port mapping; compare fields show pre/post; ignore skips diff.",
"A template holds multiple metric sheets. Key: row identity (no separate compare). Interface: port mapping. Compare: value checks after key match. Leave compare empty for presence-only (entry set match).",
keyFields: "Key",
ifaceFields: "Interface",
compareFields: "Compare",
@ -246,9 +246,20 @@ const en = {
field: "Field",
note: "Note",
keyRequired: "Select at least one key field",
keyIsIdentity: "Key aligns rows; not used as a value-compare field",
metricsRequired: "Add at least one metric sheet",
noMetricFields: "No fields for this metric",
templateFilterPh: "Filter template / metric",
jobFilterPh: "Filter job / template / status",
addMetric: "Add metric",
pickMetric: "Pick metric…",
addSheet: "Add to template",
removeSheet: "Remove sheet",
colSheets: "Sheets",
sheetsUnit: "sheets",
presenceShort: "presence",
modeFields: "Mode: compare selected field values",
modePresence: "Mode: presence-only (entry set match)",
mapping: "Port mapping",
newMapping: "New mapping…",
mapName: "Mapping name",
@ -284,7 +295,8 @@ const en = {
runs: "Run history",
noRuns: "No runs yet — run a compare first",
result: "Result",
pickRun: "Pick a run below or click Run now",
pickBatchRun: "Select compare batch",
pickRun: "Select batch…",
resultEmpty: "No matching diff rows",
resultFilterPh: "Filter key / values…",
kindAll: "All kinds",

View file

@ -237,7 +237,8 @@ const zh = {
templateDeleted: "模板已删除",
confirmDeleteTemplate: "删除该比对模板?",
emptyTemplates: "暂无模板。可新建或使用系统默认。",
templateHint: "勾选字段角色:Key 用于对齐行;接口字段参与端口映射;比对字段左右对照;忽略字段不参与 diff。",
templateHint:
"一个模板可包含多张监控表。Key:对齐前后条目(选中后即为行身份,无需再勾比对);接口:参与端口映射;比对:勾选具体参数做值检查。若不勾任何比对字段,则只校验条目是否一致(存在性)。",
keyFields: "Key",
ifaceFields: "接口",
compareFields: "比对",
@ -245,9 +246,20 @@ const zh = {
field: "字段",
note: "备注",
keyRequired: "至少选择一个 Key 字段",
keyIsIdentity: "Key 用于对齐行,不作为值比对字段",
metricsRequired: "请至少添加一张监控表",
noMetricFields: "该 metric 无字段定义",
templateFilterPh: "筛选模板名 / metric",
jobFilterPh: "筛选任务名 / 模板 / 状态",
addMetric: "添加监控项",
pickMetric: "选择监控项…",
addSheet: "加入模板",
removeSheet: "移出本表",
colSheets: "监控表",
sheetsUnit: "张表",
presenceShort: "仅条目",
modeFields: "模式:按比对字段检查值",
modePresence: "模式:仅校验前后条目一致(不比具体值)",
mapping: "端口映射",
newMapping: "新建映射…",
mapName: "映射名称",
@ -283,7 +295,8 @@ const zh = {
runs: "历史 Run",
noRuns: "尚无比对记录,请先执行比对",
result: "比对结果",
pickRun: "选择底部 Run 或点「立即比对」",
pickBatchRun: "选择比对批次",
pickRun: "选择批次…",
resultEmpty: "无匹配差异行",
resultFilterPh: "筛选 key / 字段值…",
kindAll: "全部类型",

View file

@ -9917,6 +9917,28 @@ html.login-page--paused .login-page__flare {
margin-bottom: 10px;
}
.nm-page-panel .nm-config-modal__tabs button.is-active,
.bs-cmp-job-body .nm-config-modal__tabs button.is-active {
outline: 2px solid rgba(37, 99, 235, 0.55);
outline-offset: 1px;
box-shadow: 0 0 0 1px rgba(37, 99, 235, 0.25);
font-weight: 600;
}
.bs-cmp-metric-chips {
display: flex;
flex-wrap: wrap;
gap: 4px;
}
.bs-cmp-metric-chip {
display: inline-block;
padding: 2px 6px;
border-radius: 4px;
background: rgba(148, 163, 184, 0.14);
font-size: 12px;
}
/* biz_state batch workbook (Excel-like sheets) */
.bs-workbook-modal .bs-workbook-body {
min-height: min(62vh, 640px);

File diff suppressed because it is too large Load diff