brackt/app/lib/audit-log-display.ts

106 lines
3.4 KiB
TypeScript

import type { AuditLogEntry } from "~/models/audit-log";
export const AUDIT_ACTION_LABELS: Record<string, string> = {
league_settings_changed: "League Settings Changed",
draft_settings_changed: "Draft Settings Changed",
scoring_rules_changed: "Scoring Rules Changed",
draft_order_set: "Draft Order Set",
draft_order_randomized: "Draft Order Randomized",
draft_started: "Draft Started",
draft_paused: "Draft Paused",
draft_resumed: "Draft Resumed",
draft_reset: "Draft Reset",
draft_rollback: "Draft Rolled Back",
force_autopick: "Forced Auto-Pick",
force_manual_pick: "Forced Manual Pick",
draft_pick_changed: "Pick Replaced",
time_bank_edited: "Time Bank Edited",
};
function formatSeconds(seconds: number): string {
const m = Math.floor(Math.abs(seconds) / 60);
const s = Math.abs(seconds) % 60;
const sign = seconds < 0 ? "-" : "+";
if (m === 0) return `${sign}${s}s`;
return `${sign}${m}m ${s}s`;
}
function formatTimeRemaining(seconds: number): string {
const m = Math.floor(seconds / 60);
const s = seconds % 60;
return `${m}:${String(s).padStart(2, "0")}`;
}
/**
* Returns a concise human-readable summary of an audit log entry.
* Shared between the league home page summary widget and the full audit log page.
*/
export function formatAuditDetail(entry: AuditLogEntry): string {
const d = (entry.details ?? {}) as Record<string, unknown>;
switch (entry.action) {
case "draft_rollback":
return `Rolled back to pick #${d.rolledBackToPickNumber}`;
case "time_bank_edited": {
const adj = Number(d.adjustment ?? 0);
const remaining = Number(d.newTimeRemaining ?? 0);
return `${formatSeconds(adj)} for ${d.teamName ?? "team"} (now ${formatTimeRemaining(remaining)})`;
}
case "draft_pick_changed":
return `Pick #${d.pickNumber}: ${d.oldParticipantName}${d.newParticipantName}`;
case "force_autopick":
return `Auto-picked ${d.participantName} for ${d.teamName} at pick #${d.pickNumber}`;
case "force_manual_pick":
return `Picked ${d.participantName} for ${d.teamName} at pick #${d.pickNumber}`;
case "draft_order_set":
return "Draft order manually set";
case "draft_order_randomized":
return "Draft order randomized";
case "draft_reset": {
const prev = d.previousPickNumber;
return prev !== null && prev !== undefined
? `Draft reset (was at pick #${prev})`
: "Draft reset";
}
case "league_settings_changed": {
const fields = (d.changedFields as string[] | undefined) ?? [];
return fields.length > 0
? `Changed: ${fields.join(", ")}`
: "League settings updated";
}
case "draft_settings_changed": {
const fields = (d.changedFields as string[] | undefined) ?? [];
return fields.length > 0
? `Changed: ${fields.join(", ")}`
: "Draft settings updated";
}
case "scoring_rules_changed":
return "Scoring rules updated";
case "draft_started":
return "Draft started";
case "draft_paused":
return d.pickNumber !== null && d.pickNumber !== undefined
? `Draft paused at pick #${d.pickNumber}`
: "Draft paused";
case "draft_resumed":
return d.pickNumber !== null && d.pickNumber !== undefined
? `Draft resumed at pick #${d.pickNumber}`
: "Draft resumed";
default:
return (entry.action as string).replace(/_/g, " ");
}
}