import { json, type MetaFunction } from "@remix-run/node"; import { useLoaderData, Link, useNavigate, useSearchParams } from "@remix-run/react"; import { useState } from "react"; import indexStyles from "~/styles/pages/rule-groups_index.css?url"; import { Card } from "~/components/ui/Card"; import { Button } from "~/components/ui/Button"; import { StatusDot } from "~/components/ui/StatusDot"; import { Table } from "~/components/ui/Table"; import { FilterPanel, FilterSelect, SearchFilter } from "~/components/ui/FilterPanel"; import { Pagination } from "~/components/ui/Pagination"; // 定义数据类型 interface RuleGroup { id: string; name: string; code: string; ruleCount: number; subGroupCount: number; status: 'active' | 'inactive'; createdAt: string; children?: RuleGroup[]; } export const handle = { breadcrumb: "评查点分组" }; export const meta: MetaFunction = () => { return [ { title: "评查点分组 - 中国烟草AI合同及卷宗审核系统" }, { name: "description", content: "管理评查点分组,包括创建、编辑和删除分组" }, ]; }; export function links() { return [{ rel: "stylesheet", href: indexStyles }]; } // 模拟数据 const MOCK_GROUPS: RuleGroup[] = [ { id: "1", name: "合同基本要素检查", code: "contract-base", ruleCount: 18, subGroupCount: 12, status: "active", createdAt: "2023-10-01 14:30", children: [ { id: "2", name: "必备要素检查", code: "essential-elements", ruleCount: 7, subGroupCount: 0, status: "active", createdAt: "2023-10-02 10:15", }, { id: "3", name: "合同主体检查", code: "contract-parties", ruleCount: 5, subGroupCount: 0, status: "active", createdAt: "2023-10-03 16:20", } ] }, { id: "4", name: "销售合同专项检查", code: "contract-sales", ruleCount: 12, subGroupCount: 5, status: "active", createdAt: "2023-10-05 09:30", children: [ { id: "6", name: "付款条件检查", code: "payment-terms", ruleCount: 5, subGroupCount: 0, status: "active", createdAt: "2023-10-05 14:45", } ] }, { id: "5", name: "行政处罚规范性检查", code: "punishment", ruleCount: 8, subGroupCount: 0, status: "inactive", createdAt: "2023-10-08 11:45", } ]; export async function loader() { return json({ groups: MOCK_GROUPS }); } export default function RuleGroupsIndex() { const { groups } = useLoaderData(); const navigate = useNavigate(); const [searchParams, setSearchParams] = useSearchParams(); const [expandedGroups, setExpandedGroups] = useState([]); // 处理展开/收起 const toggleGroup = (groupId: string) => { setExpandedGroups(prev => prev.includes(groupId) ? prev.filter(id => id !== groupId) : [...prev, groupId] ); }; // 展开/收起全部 const toggleAll = (expand: boolean) => { setExpandedGroups(expand ? groups.map(g => g.id) : []); }; // 处理删除分组 const handleDeleteGroup = (groupId: string) => { if (confirm("确定要删除该分组吗?此操作将同时删除该分组下的所有评查点,且不可恢复。")) { console.log('删除分组ID:', groupId); // 实际应用中,这里会调用API删除数据 } }; // 处理搜索名称 const handleNameSearch = (value: string) => { const newParams = new URLSearchParams(searchParams); if (value) { newParams.set('name', value); } else { newParams.delete('name'); } newParams.set('page', '1'); setSearchParams(newParams); }; // 处理搜索编码 const handleCodeSearch = (value: string) => { const newParams = new URLSearchParams(searchParams); if (value) { newParams.set('code', value); } else { newParams.delete('code'); } newParams.set('page', '1'); setSearchParams(newParams); }; // 处理状态筛选变更 const handleStatusChange = (e: React.ChangeEvent) => { const { value } = e.target; const newParams = new URLSearchParams(searchParams); if (value) { newParams.set('status', value); } else { newParams.delete('status'); } newParams.set('page', '1'); setSearchParams(newParams); }; // 处理重置筛选 const handleReset = () => { setSearchParams(new URLSearchParams()); }; // 处理表格数据,包括父子级关系 const processedData = groups.flatMap(group => { // 先添加父级分组 const result: (RuleGroup & { isParent?: boolean, parentId?: string })[] = [ { ...group, isParent: true } ]; // 如果有子级分组并且当前已展开,则添加子级分组 if (group.children && expandedGroups.includes(group.id)) { group.children.forEach(child => { result.push({ ...child, parentId: group.id }); }); } return result; }); // 定义表格列配置 const columns = [ { title: "分组名称", key: "name", width: "400px", render: (_: unknown, record: (RuleGroup & { isParent?: boolean, parentId?: string })) => (
{record.isParent && ( toggleGroup(record.id)} role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleGroup(record.id); } }} > )} {record.name} {record.isParent ? '一级分组' : '二级分组'}
) }, { title: "分组编码", key: "code", render: (_: unknown, record: RuleGroup) => record.code }, { title: "评查点数量", key: "ruleCount", render: (_: unknown, record: RuleGroup) => ( <> {record.ruleCount} {record.subGroupCount > 0 && ( | 子分组: {record.subGroupCount} )} ) }, { title: "状态", key: "status", render: (_: unknown, record: RuleGroup) => ( ) }, { title: "创建时间", key: "createdAt", render: (_: unknown, record: RuleGroup) => record.createdAt }, { title: "操作", key: "operation", width: "180px", render: (_: unknown, record: RuleGroup) => ( <> ) } ]; return (
{/* 页面头部 */}

评查点分组管理

{/* 搜索栏 - 使用FilterPanel */} } noActionDivider={true} > {/* 数据表格 - 使用Table组件 */} {/* 分页 - 使用Pagination组件 */} {}} showTotal={true} /> ); }