beta/components/task-table/columns.tsx
Christopher Arraya bcf3f113ad i'm done
2023-11-05 07:34:37 -05:00

178 lines
4.7 KiB
TypeScript

"use client";
import { ColumnDef } from "@tanstack/react-table";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
SheetTrigger,
} from "@/components/ui/sheet";
import { Checkbox } from "@/components/ui/checkbox";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import {
// labels,
priorities,
statuses,
} from "@/components/task-table/data";
import { Task } from "@/components/task-table/schema";
import { DataTableColumnHeader } from "./data-table-column-header";
import { DataTableRowActions } from "./data-table-row-actions";
import Chat from "@/components/chat";
export const columns: ColumnDef<Task>[] = [
{
id: "select",
header: ({ table }) => (
<Checkbox
checked={table.getIsAllPageRowsSelected()}
onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}
aria-label="Select all"
className="translate-y-[2px]"
/>
),
cell: ({ row }) => (
<Checkbox
checked={row.getIsSelected()}
onCheckedChange={(value) => row.toggleSelected(!!value)}
aria-label="Select row"
className="translate-y-[2px]"
/>
),
enableSorting: false,
enableHiding: false,
},
{
accessorKey: "id",
header: ({ column }) => (
<DataTableColumnHeader column={column} title="Task ID" />
),
cell: ({ row }) => (
<div className="w-[80px]">TASK-{row.getValue("id")}</div>
),
enableSorting: false,
enableHiding: false,
},
{
accessorKey: "name",
header: ({ column }) => (
<DataTableColumnHeader column={column} title="Name" />
),
cell: ({ row }) => {
const { project, feature, ...rest } = row.original;
return (
<div className="flex space-x-2">
{row.original.feature_name && (
<Badge variant="outline">FEAT-{row.original.feature_id}</Badge>
)}
<Sheet>
<TooltipProvider>
<Tooltip>
<SheetTrigger>
<TooltipTrigger>
<span className="max-w-[500px] truncate font-medium">
{row.getValue("name")}
</span>
</TooltipTrigger>
</SheetTrigger>
<TooltipContent>
<p className="truncate">{row.original.description}</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
<SheetContent>
<SheetHeader>
<SheetTitle>{row.getValue("name")}</SheetTitle>
<SheetDescription className="flex flex-col space-y-4">
<p className="truncate">{row.original.description}</p>
<Chat
projectInfo={project}
featureInfo={feature}
taskInfo={rest}
/>
</SheetDescription>
</SheetHeader>
</SheetContent>
</Sheet>
</div>
);
},
},
{
accessorKey: "status",
header: ({ column }) => (
<DataTableColumnHeader column={column} title="Status" />
),
cell: ({ row }) => {
const status = statuses.find(
(status) => status.value === row.getValue("status")
);
if (!status) {
return null;
}
return (
<div className="flex w-[100px] items-center">
{status.icon && (
<status.icon className="mr-2 h-4 w-4 text-muted-foreground" />
)}
<span>{status.label}</span>
</div>
);
},
filterFn: (row, id, value) => {
return value.includes(row.getValue(id));
},
},
{
accessorKey: "priority",
header: ({ column }) => (
<DataTableColumnHeader column={column} title="Priority" />
),
cell: ({ row }) => {
const priority = priorities.find(
(priority) => priority.value === row.getValue("priority")
);
if (!priority) {
return (
<div className="flex items-center">
<Button variant="outline" size="sm">
Set Priority
</Button>
</div>
);
}
return (
<div className="flex items-center">
{priority.icon && (
<priority.icon className="mr-2 h-4 w-4 text-muted-foreground" />
)}
<span>{priority.label}</span>
</div>
);
},
filterFn: (row, id, value) => {
return value.includes(row.getValue(id));
},
},
{
id: "actions",
cell: ({ row }) => <DataTableRowActions row={row} />,
},
];