展开promotion证据行

结论:workflow overview promotion candidate drilldown 现在展示8条evidence-ready候选的family、G-code path、source count和manifest-backed状态,hard block仍保持locked,baseline保持28/28/131/0。
This commit is contained in:
2026-06-18 19:41:40 +08:00
parent 9ce8ad6f12
commit 31c83db696
2 changed files with 77 additions and 3 deletions

View File

@@ -3990,6 +3990,20 @@ export function createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownVi
sourceKind: classifyPromotionFamilySource(sourceFile),
manifestBacked: candidate?.manifestChecked === true,
}));
const evidenceRows = candidateRows.map((row, index) => ({
id: `evidence-${index + 1}`,
label: row.id ?? `Evidence ${index + 1}`,
value: row.gcodePath ?? "not provided",
familyId: row.simConfigTarget ?? "not provided",
sourceFileCount: Array.isArray(row.sourceFiles) ? row.sourceFiles.length : 0,
manifestBacked: row.manifestChecked === true,
status: row.complete === true &&
row.currentNodeInventoryStatus === "PASS" &&
row.blockedKind === "-" &&
row.targetBrowserEvidence === "explicit-browser-diagnostics"
? "evidence-ready"
: "blocked",
}));
return {
apiName: "ini-panel-shell-workflow-overview-promotion-candidate-drilldown-view-model",
viewModelVersion: 1,
@@ -4005,7 +4019,9 @@ export function createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownVi
candidate,
rows,
sourceRows,
evidenceRows,
sourceFileCount: sourceRows.length,
evidenceRowCount: evidenceRows.length,
requiredReports,
blockedFamilyExcluded,
nodeInventoryReady,
@@ -4029,11 +4045,19 @@ export function createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownRe
...row,
label: `${row.label} (${row.sourceKind})`,
})),
].map(({ id, label, value, sourceKind, manifestBacked }) => ({
...(Array.isArray(viewModel?.evidenceRows) ? viewModel.evidenceRows : []).map((row) => ({
...row,
label: `${row.label} (${row.familyId})`,
evidenceReady: row.status === "evidence-ready",
})),
].map(({ id, label, value, sourceKind, manifestBacked, familyId, sourceFileCount, evidenceReady }) => ({
id,
label,
value: value == null ? "" : String(value),
...(sourceKind ? { sourceKind } : {}),
...(familyId ? { familyId } : {}),
...(sourceFileCount != null ? { sourceFileCount: Number(sourceFileCount) } : {}),
...(evidenceReady != null ? { evidenceReady: evidenceReady === true } : {}),
...(manifestBacked != null ? { manifestBacked: manifestBacked === true } : {}),
}));
const ready = viewModel?.ready === true;
@@ -4050,6 +4074,7 @@ export function createIniPanelShellWorkflowOverviewPromotionCandidateDrilldownRe
rows,
rowCount: rows.length,
sourceFileCount: viewModel?.sourceFileCount ?? 0,
evidenceRowCount: viewModel?.evidenceRowCount ?? 0,
dataset: viewModel?.dataset ?? {
handoffPhase: ready ? "ready" : "blocked",
handoffReady: ready ? "true" : "false",
@@ -4154,6 +4179,12 @@ export function renderIniPanelShellWorkflowOverviewPromotionCandidateDrilldownSt
term.dataset[`${effectiveRowDatasetPrefix}SourceKind`] = row.sourceKind;
term.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
}
if (row.familyId) {
term.dataset[`${effectiveRowDatasetPrefix}FamilyId`] = row.familyId;
term.dataset[`${effectiveRowDatasetPrefix}EvidenceReady`] = row.evidenceReady ? "true" : "false";
term.dataset[`${effectiveRowDatasetPrefix}SourceFileCount`] = String(row.sourceFileCount ?? 0);
term.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
}
term.textContent = row.label;
const detail = documentRef.createElement("dd");
detail.dataset[`${effectiveRowDatasetPrefix}Value`] = row.id;
@@ -4162,6 +4193,12 @@ export function renderIniPanelShellWorkflowOverviewPromotionCandidateDrilldownSt
detail.dataset[`${effectiveRowDatasetPrefix}SourceKind`] = row.sourceKind;
detail.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
}
if (row.familyId) {
detail.dataset[`${effectiveRowDatasetPrefix}FamilyId`] = row.familyId;
detail.dataset[`${effectiveRowDatasetPrefix}EvidenceReady`] = row.evidenceReady ? "true" : "false";
detail.dataset[`${effectiveRowDatasetPrefix}SourceFileCount`] = String(row.sourceFileCount ?? 0);
detail.dataset[`${effectiveRowDatasetPrefix}ManifestBacked`] = row.manifestBacked ? "true" : "false";
}
detail.textContent = row.value;
rowsNode.append(term, detail);
}
@@ -4171,6 +4208,7 @@ export function renderIniPanelShellWorkflowOverviewPromotionCandidateDrilldownSt
rowCount: rows.length,
rowIds: rows.map(({ id }) => id),
sourceFileCount: rows.filter(({ sourceKind }) => Boolean(sourceKind)).length,
evidenceRowCount: rows.filter(({ familyId }) => Boolean(familyId)).length,
dataset: {
handoffPhase: mountNode.dataset.handoffPhase,
handoffReady: mountNode.dataset.handoffReady,