import { useState } from 'react'; import type { RuleGroup, DocTypeInfo } from '~/api/evaluation_points/rule-groups'; interface RebindModalProps { /** 是否显示弹窗 */ visible: boolean; /** 要删除的分组ID */ groupId: string; /** 要删除的分组名称 */ groupName: string; /** 关联的评查点数量 */ pointsCount: number; /** 只绑定当前分组的文档类型(换绑时会替换为新分组) */ singleBoundDocTypes: DocTypeInfo[]; /** 绑定多个分组的文档类型(换绑时会移除当前分组) */ multiBoundDocTypes: DocTypeInfo[]; /** 所有一级分组列表(用于选择新分组) */ allFirstLevelGroups: RuleGroup[]; /** 换绑并删除操作是否加载中 */ loading?: boolean; /** 关闭弹窗 */ onClose: () => void; /** 确认换绑并删除 */ onConfirm: (newGroupId: string) => void; } export function RebindModal({ visible, groupId, groupName, pointsCount, singleBoundDocTypes, multiBoundDocTypes, allFirstLevelGroups, loading = false, onClose, onConfirm }: RebindModalProps) { // 选中的新一级分组ID const [selectedGroupId, setSelectedGroupId] = useState(''); // 过滤掉当前要删除的一级分组 const availableGroups = allFirstLevelGroups.filter(g => g.id !== groupId); // 处理确认换绑 const handleConfirm = () => { if (!selectedGroupId) { return; } onConfirm(selectedGroupId); }; // 重置状态 const handleClose = () => { setSelectedGroupId(''); onClose(); }; if (!visible) return null; return (
{/* 遮罩层 */}
{/* 弹窗内容 */}
{/* 标题栏 */}

分组换绑

{/* 主体内容 */}
{/* 提示信息 */}

一级分组「{groupName}」下有 {pointsCount} 个评查点

请选择新的一级分组进行换绑后,才能删除该分组。

{/* 两栏布局 */}
{/* 左侧:需要更换绑定的文档类型 */}

需要更换绑定的文档类型

{singleBoundDocTypes.length > 0 ? ( <>

以下文档类型只绑定了当前分组,换绑后将绑定到新选择的分组:

{singleBoundDocTypes.map(docType => ( {docType.name} ))}
) : (

无需要更换绑定的文档类型

)}
{/* 右侧:选择新的一级分组 */}

选择新的一级分组

请选择一个一级分组作为换绑目标(单选):

{availableGroups.length > 0 ? (
{availableGroups.map(group => ( ))}
) : (

暂无可选的一级分组

)}
{/* 下方:会移除绑定的文档类型 */} {multiBoundDocTypes.length > 0 && (

会移除当前分组绑定的文档类型

以下文档类型绑定了多个一级分组,换绑后将移除当前分组的绑定关系:

{multiBoundDocTypes.map(docType => ( {docType.name} ))}
)}
{/* 底部按钮 */}
); } export default RebindModal;