49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
import type {
|
|
ReportRoot,
|
|
PerTaskRow,
|
|
ScenarioName,
|
|
} from "@duck/types";
|
|
import { SCENARIO_NAMES, SCENARIO_LABELS, SCENARIO_DESCS } from "@duck/types";
|
|
|
|
export { SCENARIO_NAMES, SCENARIO_LABELS, SCENARIO_DESCS };
|
|
|
|
export interface RowViewModel extends PerTaskRow {
|
|
model: string;
|
|
}
|
|
|
|
export function extractPerTask(report: ReportRoot): RowViewModel[] {
|
|
return Object.entries(report.models).flatMap(([model, rep]) =>
|
|
rep.perTask.map((row) => ({ ...row, model })),
|
|
);
|
|
}
|
|
|
|
export function modelShort(name: string): string {
|
|
const [base, ver] = String(name).split(":");
|
|
return ver ? `${base}:${ver}` : base;
|
|
}
|
|
|
|
export type PctTone = "safe" | "warn" | "bad";
|
|
|
|
export function pctTone(p: number): PctTone {
|
|
return p >= 70 ? "safe" : p >= 40 ? "warn" : "bad";
|
|
}
|
|
|
|
export function getReviewTotals(report: ReportRoot): { reviewed: number; pending: number } {
|
|
let reviewed = 0;
|
|
let pending = 0;
|
|
for (const rep of Object.values(report.models)) {
|
|
for (const s of SCENARIO_NAMES) {
|
|
const g = rep.scenarios[s];
|
|
if (g) {
|
|
reviewed += g.reviewed || 0;
|
|
pending += g.pending || 0;
|
|
}
|
|
}
|
|
}
|
|
return { reviewed, pending };
|
|
}
|
|
|
|
export function scenarioOrder(): ScenarioName[] {
|
|
return [...SCENARIO_NAMES];
|
|
}
|