"use client"; import { useMemo, useState } from "react"; import { Eye, Filter, Search } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Dialog } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Select } from "@/components/ui/select"; import { Table } from "@/components/ui/table"; export type CmsRecordTone = "success" | "warning" | "danger" | "secondary"; export type CmsRecord = { id: string; title: string; owner: string; status: string; statusTone: CmsRecordTone; category: string; updatedAt: string; priority: "高" | "中" | "低"; summary: string; }; type CmsModuleClientProps = { records: CmsRecord[]; }; const PAGE_SIZE = 5; const ALL_STATUS = "全部状态"; function matchesRecord(record: CmsRecord, query: string, status: string): boolean { const normalizedQuery = query.trim().toLowerCase(); const matchesSearch = normalizedQuery.length === 0 || [record.title, record.owner, record.category, record.summary] .join(" ") .toLowerCase() .includes(normalizedQuery); const matchesStatus = status === ALL_STATUS || record.status === status; return matchesSearch && matchesStatus; } export function CmsModuleClient({ records }: CmsModuleClientProps): React.ReactElement { const [query, setQuery] = useState(""); const [status, setStatus] = useState(ALL_STATUS); const [page, setPage] = useState(1); const [selectedRecord, setSelectedRecord] = useState(null); const statusOptions = useMemo(() => { const uniqueStatuses = new Set(records.map((record) => record.status)); return [ALL_STATUS, ...Array.from(uniqueStatuses)]; }, [records]); const filteredRecords = useMemo( () => records.filter((record) => matchesRecord(record, query, status)), [query, records, status], ); const pageCount = Math.max(1, Math.ceil(filteredRecords.length / PAGE_SIZE)); const safePage = Math.min(page, pageCount); const pageStart = (safePage - 1) * PAGE_SIZE; const visibleRecords = filteredRecords.slice(pageStart, pageStart + PAGE_SIZE); const highPriorityCount = filteredRecords.filter((record) => record.priority === "高").length; function updateQuery(value: string): void { setQuery(value); setPage(1); } function updateStatus(value: string): void { setStatus(value); setPage(1); } return (

数据列表

共 {filteredRecords.length} 条记录,{highPriorityCount} 条高优先级已标记。