import { auditExportColumns } from "./auditExportColumns"; import { formatAuditRows } from "./auditExportFormatter"; import type { AuditEvent } from ".."; import { saveFileWithFeedback } from "../../utils/fileTaskFeedback"; const BOM = "\ufeff"; const escapeCsv = (val: string) => { const safe = (val ?? "").replace(/"/g, '""'); return `"${safe}"`; }; const buildCsv = (rows: Record[]) => { const header = auditExportColumns.map((c) => escapeCsv(c.label)).join(","); const body = rows.map((row) => auditExportColumns.map((c) => escapeCsv(row[c.key] || "")).join(",")).join("\n"); return `${BOM}${header}\n${body}`; }; export interface AuditExportOptions { fileName: string; } export const exportAuditCsv = async (events: AuditEvent[], options: AuditExportOptions) => { const rows = formatAuditRows(events); const csv = buildCsv(rows); const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" }); await saveFileWithFeedback( { suggestedName: options.fileName.endsWith(".csv") ? options.fileName : `${options.fileName}.csv`, mimeType: "text/csv;charset=utf-8", data: blob, }, { kind: "export", title: "导出审计记录", pendingDetail: "等待选择保存位置", completedDetail: "导出文件已保存", }, ); };