/** * 导出列选择弹窗 —— 勾选要写进 CSV 的列。 * * 列清单由后端 /audit/options 下发(value=后端列 key,label=中文表头), * 前端不硬编码表头:否则两端各维护一份,迟早出现「导出的列和页面对不上」。 * * 默认全选 —— 大多数人只是想"全部导出来",不该逼他们先勾一遍。 */ import { useEffect, useState } from "react"; import { Modal, Checkbox, Button } from "antd"; import type { AuditOption } from "../../services/auditApi"; export default function ExportColumnsModal({ open, columns, submitting, onCancel, onConfirm, }: { open: boolean; columns: AuditOption[]; submitting?: boolean; onCancel: () => void; /** 传出当前勾选的列 key(顺序 = 后端下发顺序,保证表头稳定) */ onConfirm: (keys: string[]) => void; }) { const [checked, setChecked] = useState([]); // 每次打开都重置为全选:上一次的勾选残留会让用户莫名少导几列 useEffect(() => { if (open) setChecked(columns.map((c) => c.value)); }, [open, columns]); return (
} > {checked.length === 0 && (

至少勾选一列才能导出。

)} setChecked(v as string[])} className="grid grid-cols-3 gap-y-2" options={columns.map((c) => ({ value: c.value, label: c.label }))} />
); }