41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
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<string, string>[]) => {
|
|
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: "导出文件已保存",
|
|
},
|
|
);
|
|
};
|