mirror of
https://github.com/SkalaraAI/beta.git
synced 2025-04-09 15:00:20 -04:00
178 lines
4.7 KiB
TypeScript
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} />,
|
|
},
|
|
];
|