"use client"; import type { ColumnDef, RowSelectionState } from "@tanstack/react-table"; import { flexRender, getCoreRowModel, useReactTable, } from "@tanstack/react-table"; import { Text } from "lucide-react"; import { useEffect, useState } from "react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { cn } from "@/lib/utils"; interface User { firstName?: string; lastName?: string; image?: string; company?: string; jobTitle?: string; email?: string; } const DUMMY_USERS: User[] = [ { firstName: "الینا", image: "/block-media/shadcnblocks/block/avatar/avatar1.jpg", company: "آکمه", jobTitle: "طراح تجربه کاربری", email: "elina.brooks@acme.com", }, { firstName: "ناهید", lastName: "پارسا", image: "/block-media/shadcnblocks/block/avatar/avatar2.jpg", jobTitle: "مهندس بکاند", }, { firstName: "مایا", lastName: "تهرانی", jobTitle: "مدیر خلاقیت", email: "maya@pixelworks.io", }, { firstName: "امیر", lastName: "رضایی", image: "/block-media/shadcnblocks/block/avatar/avatar4.jpg", company: "استریملاین", }, { lastName: "احمدی", image: "/block-media/shadcnblocks/block/avatar/avatar5.jpg", company: "کلودنست", jobTitle: "مدیر محصول", }, { firstName: "آوا", company: "وندورا", jobTitle: "توسعهدهنده فرانتاند", email: "ava.wright@vendora.com", }, ]; interface LetterAvatarProps { children: React.ReactNode; } const LetterAvatar = ({ children }: LetterAvatarProps) => { return ( {children} ); }; const columns: ColumnDef[] = [ { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="انتخاب همه" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="انتخاب ردیف" /> ), }, { header: "نام", accessorKey: "firstName", cell: ({ row }) => { return ( {row.original.image ? ( ) : ( {(row.original.firstName ?? row.original.lastName) ?.charAt(0) .toUpperCase()} )} {row.original.firstName} {row.original.lastName} ); }, }, { header: "شرکت", cell: ({ row }) => row.original.company && ( {row.original.company?.charAt(0).toUpperCase()} {row.original.company} ), }, { header: "نقش", accessorKey: "jobTitle", }, { header: "ایمیل", cell: ({ row }) => row.original.email && ( {row.original.email} ), }, ]; interface UserCardProps { user: User; variant?: "merged" | "selected"; onSelect?: (key: string, value: string) => void; mergedUser?: User | null; } const UserCard = ({ user, variant = "selected", onSelect, mergedUser, }: UserCardProps) => { const mergeableKeys = [ "firstName", "lastName", "jobTitle", "email", "company", ]; return ( {user.image ? ( ) : ( {(user.firstName ?? user.lastName)?.charAt(0).toUpperCase()} )} {user.firstName} {user.lastName} {mergeableKeys.map((key) => { const value = user[key as keyof User]; if (!value) return null; const id = `${key}-${value}`; if (variant === "selected") { return ( onSelect?.(key, value)} value={id} id={id} /> {value} ); } return ( {value} ); })} ); }; interface FieldMerging1Props { className?: string; } const FieldMerging1 = ({ className }: FieldMerging1Props) => { const [rowSelection, setRowSelection] = useState({}); const [mergedUser, setMergedUser] = useState(null); const selectedCount = Object.keys(rowSelection).length; useEffect(() => { if (selectedCount === 0) { setMergedUser(null); } else { setMergedUser(DUMMY_USERS[Number(Object.keys(rowSelection)[0])]); } }, [rowSelection, selectedCount]); const table = useReactTable({ data: DUMMY_USERS, columns, getCoreRowModel: getCoreRowModel(), onRowSelectionChange: setRowSelection, state: { rowSelection, }, }); return ( ادغام کاربران ترکیب {selectedCount.toLocaleString("fa-IR")} رکورد انتخابشده از هر رکورد فیلدهای مورد نظر را انتخاب کنید تا یک ورودی یکپارچه بسازید {Object.keys(rowSelection).map((key) => { const user = DUMMY_USERS[Number(key)]; return ( setMergedUser((prev) => ({ ...prev, [fieldKey]: value })) } mergedUser={mergedUser} /> ); })} {mergedUser && ( ادغام )} {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext(), )} ))} ))} {table.getRowModel().rows.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext(), )} ))} )) ) : ( رکوردی یافت نشد. )} ); }; export { FieldMerging1 };
{row.original.company}
{user.firstName} {user.lastName}