c-data-grid-3.tsx
"use client"
import { useMemo, useState } from "react"
import {
DataGrid,
DataGridContainer,
dataGridFeatures,
type DataGridFeatures,
} from "@/components/reui/data-grid/data-grid"
import { DataGridPagination } from "@/components/reui/data-grid/data-grid-pagination"
import { DataGridScrollArea } from "@/components/reui/data-grid/data-grid-scroll-area"
import { DataGridTable } from "@/components/reui/data-grid/data-grid-table"
import {
ColumnDef,
PaginationState,
SortingState,
useTable,
} from "@tanstack/react-table"
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar"
interface IData {
id: string
name: string
availability: "online" | "away" | "busy" | "offline"
avatar: string
status: "active" | "inactive"
flag: string // Emoji flags
email: string
company: string
role: string
joined: string
location: string
balance: number
}
const users = [
{
id: "1",
name: "Alex Johnson",
email: "alex@example.com",
avatar:
"https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=96&h=96&dpr=2&q=80",
initials: "AJ",
},
{
id: "2",
name: "Sarah Chen",
email: "sarah@example.com",
avatar:
"https://images.unsplash.com/photo-1519699047748-de8e457a634e?w=96&h=96&dpr=2&q=80",
initials: "SC",
},
{
id: "3",
name: "Michael Rodriguez",
email: "michael@example.com",
avatar:
"https://images.unsplash.com/photo-1584308972272-9e4e7685e80f?w=96&h=96&dpr=2&q=80",
initials: "MR",
},
{
id: "4",
name: "Emma Wilson",
email: "emma@example.com",
avatar:
"https://images.unsplash.com/photo-1485893086445-ed75865251e0?w=96&h=96&dpr=2&q=80",
initials: "EW",
},
{
id: "5",
name: "David Kim",
email: "david@example.com",
avatar:
"https://images.unsplash.com/photo-1607990281513-2c110a25bd8c?w=96&h=96&dpr=2&q=80",
initials: "DK",
},
{
id: "6",
name: "Aron Thompson",
email: "lisa@example.com",
avatar:
"https://images.unsplash.com/photo-1527980965255-d3b416303d12?w=96&h=96&dpr=2&q=80",
initials: "LT",
},
{
id: "7",
name: "James Brown",
email: "james@example.com",
avatar:
"https://images.unsplash.com/photo-1543299750-19d1d6297053?w=96&h=96&dpr=2&q=80",
initials: "JB",
},
{
id: "8",
name: "Maria Garcia",
email: "maria@example.com",
avatar:
"https://images.unsplash.com/photo-1620075225255-8c2051b6c015?w=96&h=96&dpr=2&q=80",
initials: "MG",
},
{
id: "9",
name: "Nick Johnson",
email: "nick@example.com",
avatar:
"https://images.unsplash.com/photo-1485206412256-701ccc5b93ca?w=96&h=96&dpr=2&q=80",
initials: "NJ",
},
{
id: "10",
name: "Liam Thompson",
email: "liam@example.com",
avatar:
"https://images.unsplash.com/photo-1542595913-85d69b0edbaf?w=96&h=96&dpr=2&q=80",
initials: "LT",
},
]
const demoData: IData[] = users.map((user, index) => ({
...user,
availability: (["online", "away", "busy", "offline"] as const)[index % 4],
status: (index % 2 === 0 ? "active" : "inactive") as "active" | "inactive",
flag: (["us", "gb", "ca", "au", "de", "my", "es", "jp", "fr", "it"] as const)[
index % 10
],
company: (
[
"Apple",
"OpenAI",
"Meta",
"Tesla",
"SAP",
"Keenthemes",
"BBVA",
"Sony",
"LVMH",
"ENI",
] as const
)[index % 10],
role: (
[
"CEO",
"CTO",
"Designer",
"Developer",
"Lawyer",
"Director",
"Product Manager",
"Marketing Lead",
"Data Scientist",
"Engineer",
] as const
)[index % 10],
joined: "Jan, 2024",
location: (
[
"United States",
"United Kingdom",
"Canada",
"Australia",
"Germany",
"Malaysia",
"Spain",
"Japan",
"France",
"Italy",
] as const
)[index % 10],
balance: 5143.03 + index * 100,
}))
export function Pattern() {
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: 5,
})
const [sorting, setSorting] = useState<SortingState>([
{ id: "name", desc: true },
])
const columns = useMemo<ColumnDef<DataGridFeatures, IData>[]>(
() => [
{
accessorKey: "name",
id: "name",
header: "Name",
cell: ({ row }) => {
return (
<div className="flex items-center gap-2">
<Avatar className="size-6">
<AvatarImage
src={row.original.avatar}
alt={row.original.name}
/>
<AvatarFallback>
{row.original.name
.split(" ")
.map((n) => n[0])
.join("")}
</AvatarFallback>
</Avatar>
<a
href="#"
className="text-foreground hover:text-primary font-medium"
>
{row.original.name}
</a>
</div>
)
},
size: 200,
enableSorting: true,
enableHiding: false,
},
{
accessorKey: "email",
header: "Email",
cell: (info) => (
<a
href={`mailto:${info.getValue()}`}
className="hover:text-primary hover:underline"
>
{info.getValue() as string}
</a>
),
size: 175,
meta: {
headerClassName: "",
},
},
{
accessorKey: "location",
header: "Location",
cell: ({ row }) => {
return (
<div className="flex items-center gap-1.5">
<img
src={`https://flagcdn.com/${row.original.flag.toLowerCase()}.svg`}
alt={row.original.flag}
className="size-4 rounded-full object-cover"
/>
<div className="text-foreground font-medium">
{row.original.location}
</div>
</div>
)
},
size: 175,
meta: {
headerClassName: "",
cellClassName: "text-start",
},
},
{
accessorKey: "balance",
header: "Balance ($)",
cell: (info) => (
<span className="font-semibold">
${(info.getValue() as number).toFixed(2)}
</span>
),
size: 125,
meta: {
headerClassName: "text-right rtl:text-left",
cellClassName: "text-right rtl:text-left",
},
},
],
[]
)
const table = useTable({
features: dataGridFeatures,
columns,
data: demoData,
pageCount: Math.ceil((demoData?.length || 0) / pagination.pageSize),
getRowId: (row: IData) => row.id,
state: {
pagination,
sorting,
},
onPaginationChange: setPagination,
onSortingChange: setSorting,
})
return (
<DataGrid
table={table}
recordCount={demoData?.length || 0}
tableLayout={{ dense: true }}
>
<div className="w-full space-y-2.5">
<DataGridContainer>
<DataGridScrollArea>
<DataGridTable />
</DataGridScrollArea>
</DataGridContainer>
<DataGridPagination />
</div>
</DataGrid>
)
}





























