Midday / apps /dashboard /src /components /tables /tracker /data-table-header.tsx
Jules
Final deployment with all fixes and verified content
c09f67c
"use client";
import { Button } from "@midday/ui/button";
import { cn } from "@midday/ui/cn";
import { TableHead, TableHeader, TableRow } from "@midday/ui/table";
import { ArrowDown, ArrowUp } from "lucide-react";
import { HorizontalPagination } from "@/components/horizontal-pagination";
import { useSortParams } from "@/hooks/use-sort-params";
interface Props {
tableScroll?: {
canScrollLeft: boolean;
canScrollRight: boolean;
isScrollable: boolean;
scrollLeft: () => void;
scrollRight: () => void;
};
}
export function DataTableHeader({ tableScroll }: Props) {
const { params, setParams } = useSortParams();
const [column, value] = params.sort || [];
const createSortQuery = (name: string) => {
const [currentColumn, currentValue] = params.sort || [];
if (name === currentColumn) {
if (currentValue === "asc") {
setParams({ sort: [name, "desc"] });
} else if (currentValue === "desc") {
setParams({ sort: null });
} else {
setParams({ sort: [name, "asc"] });
}
} else {
setParams({ sort: [name, "asc"] });
}
};
return (
<TableHeader className="border-l-0 border-r-0">
<TableRow className="h-[45px]">
<TableHead className="w-[420px] min-w-[420px] md:sticky md:left-0 bg-background z-20 border-r border-border before:absolute before:right-0 before:top-0 before:bottom-0 before:w-px before:bg-border after:absolute after:right-[-24px] after:top-0 after:bottom-0 after:w-6 after:bg-gradient-to-l after:from-transparent after:to-background after:z-[-1]">
<div className="flex items-center justify-between">
<Button
className="p-0 hover:bg-transparent space-x-2"
variant="ghost"
onClick={() => createSortQuery("name")}
>
<span>Project</span>
{"name" === column && value === "asc" && <ArrowDown size={16} />}
{"name" === column && value === "desc" && <ArrowUp size={16} />}
</Button>
{tableScroll?.isScrollable && (
<HorizontalPagination
canScrollLeft={tableScroll.canScrollLeft}
canScrollRight={tableScroll.canScrollRight}
onScrollLeft={tableScroll.scrollLeft}
onScrollRight={tableScroll.scrollRight}
className="ml-auto hidden md:flex"
/>
)}
</div>
</TableHead>
<TableHead className="w-[180px]">
<Button
className="p-0 hover:bg-transparent space-x-2"
variant="ghost"
onClick={() => createSortQuery("customer")}
>
<span>Customer</span>
{"customer" === column && value === "asc" && (
<ArrowDown size={16} />
)}
{"customer" === column && value === "desc" && <ArrowUp size={16} />}
</Button>
</TableHead>
<TableHead className="w-[180px] min-w-[180px]">
<Button
className="p-0 hover:bg-transparent space-x-2"
variant="ghost"
onClick={() => createSortQuery("time")}
>
<span>Total Time</span>
{"time" === column && value === "asc" && <ArrowDown size={16} />}
{"time" === column && value === "desc" && <ArrowUp size={16} />}
</Button>
</TableHead>
<TableHead className="w-[190px] min-w-[190px]">
<Button
className="p-0 hover:bg-transparent space-x-2"
variant="ghost"
onClick={() => createSortQuery("amount")}
>
<span>Total Amount</span>
{"amount" === column && value === "asc" && <ArrowDown size={16} />}
{"amount" === column && value === "desc" && <ArrowUp size={16} />}
</Button>
</TableHead>
<TableHead className="w-[200px] min-w-[200px]">
<Button
className="p-0 hover:bg-transparent space-x-2"
variant="ghost"
onClick={() => createSortQuery("description")}
>
<span className="line-clamp-1 text-ellipsis">Description</span>
{"description" === column && value === "asc" && (
<ArrowDown size={16} />
)}
{"description" === column && value === "desc" && (
<ArrowUp size={16} />
)}
</Button>
</TableHead>
<TableHead className="min-w-[170px]">
<Button
className="p-0 hover:bg-transparent space-x-2"
variant="ghost"
onClick={() => createSortQuery("tags")}
>
<span>Tags</span>
{"tags" === column && value === "asc" && <ArrowDown size={16} />}
{"tags" === column && value === "desc" && <ArrowUp size={16} />}
</Button>
</TableHead>
<TableHead className="w-[140px]">
<Button
className="p-0 hover:bg-transparent space-x-2"
variant="ghost"
onClick={() => createSortQuery("assigned")}
>
<span>Assigned</span>
{"assigned" === column && value === "asc" && (
<ArrowDown size={16} />
)}
{"assigned" === column && value === "desc" && <ArrowUp size={16} />}
</Button>
</TableHead>
<TableHead className="w-[150px] min-w-[150px]">
<Button
className="p-0 hover:bg-transparent space-x-2"
variant="ghost"
onClick={() => createSortQuery("status")}
>
<span>Status</span>
{"status" === column && value === "asc" && <ArrowDown size={16} />}
{"status" === column && value === "desc" && <ArrowUp size={16} />}
</Button>
</TableHead>
<TableHead
className={cn(
"w-[100px] md:sticky md:right-0 bg-background z-30",
"before:absolute before:left-0 before:top-0 before:bottom-0 before:w-px before:bg-border",
"after:absolute after:left-[-24px] after:top-0 after:bottom-0 after:w-6 after:bg-gradient-to-r after:from-transparent after:to-background after:z-[-1]",
)}
>
Actions
</TableHead>
</TableRow>
</TableHeader>
);
}