'use client'; import { useEffect, useState } from 'react'; import { AnimatePresence, motion, Reorder } from 'framer-motion'; import { createPortal } from 'react-dom'; import ConfirmModal from './ConfirmModal'; import { CloseIcon, DragIcon, ResetIcon, SettingsIcon } from './Icons'; /** * PC 表格个性化设置侧弹框 * @param {Object} props * @param {boolean} props.open - 是否打开 * @param {() => void} props.onClose - 关闭回调 * @param {Array<{id: string, header: string}>} props.columns - 非冻结列(id + 表头名称) * @param {Record} [props.columnVisibility] - 列显示状态映射(id => 是否显示) * @param {(newOrder: string[]) => void} props.onColumnReorder - 列顺序变更回调,参数为新的列 id 顺序 * @param {(id: string, visible: boolean) => void} props.onToggleColumnVisibility - 列显示/隐藏切换回调 * @param {() => void} props.onResetColumnOrder - 重置列顺序回调,需二次确认 * @param {() => void} props.onResetColumnVisibility - 重置列显示/隐藏回调 * @param {() => void} props.onResetSizing - 点击重置列宽时的回调(通常用于打开确认弹框) * @param {boolean} [props.showFullFundName] - 是否展示完整基金名称 * @param {(show: boolean) => void} [props.onToggleShowFullFundName] - 切换是否展示完整基金名称回调 */ export default function PcTableSettingModal({ open, onClose, columns = [], columnVisibility, onColumnReorder, onToggleColumnVisibility, onResetColumnOrder, onResetColumnVisibility, onResetSizing, showFullFundName, onToggleShowFullFundName, }) { const [resetOrderConfirmOpen, setResetOrderConfirmOpen] = useState(false); useEffect(() => { if (!open) setResetOrderConfirmOpen(false); }, [open]); useEffect(() => { if (open) { const prev = document.body.style.overflow; document.body.style.overflow = 'hidden'; return () => { document.body.style.overflow = prev; }; } }, [open]); const handleReorder = (newItems) => { const newOrder = newItems.map((item) => item.id); onColumnReorder?.(newOrder); }; const content = ( {open && ( e.stopPropagation()} >
个性化设置
{onToggleShowFullFundName && (
展示完整基金名称
)}

表头设置

拖拽调整列顺序

{onResetColumnOrder && ( )}
{columns.length === 0 ? (
暂无可配置列
) : ( {columns.map((item, index) => (
{item.header} {onToggleColumnVisibility && ( )}
))}
)} {onResetSizing && ( )}
)} {resetOrderConfirmOpen && ( { onResetColumnOrder?.(); onResetColumnVisibility?.(); setResetOrderConfirmOpen(false); }} onCancel={() => setResetOrderConfirmOpen(false)} confirmText="重置" /> )}
); if (typeof document === 'undefined') return null; return createPortal(content, document.body); }