Files
ctms/frontend/src/audit/export/auditExportService.ts
T
Cheng Zhou d5279b124f
Storage Persistence Guard / storage-persistence-audit (push) Has been cancelled
Client Quality Gates / Shared client and Web (push) Has been cancelled
Client Quality Gates / macOS Desktop (push) Has been cancelled
Client Quality Gates / Shared client and Web (pull_request) Has been cancelled
Client Quality Gates / macOS Desktop (pull_request) Has been cancelled
Storage Persistence Guard / storage-persistence-audit (pull_request) Has been cancelled
release(main): 同步 dev 最新候选改动
2026-07-16 17:15:50 +08:00

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: "导出文件已保存",
},
);
};