summaryrefslogtreecommitdiff
path: root/components/data-table/data-table-column-simple-header.tsx
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-03-25 15:55:45 +0900
committerjoonhoekim <26rote@gmail.com>2025-03-25 15:55:45 +0900
commit1a2241c40e10193c5ff7008a7b7b36cc1d855d96 (patch)
tree8a5587f10ca55b162d7e3254cb088b323a34c41b /components/data-table/data-table-column-simple-header.tsx
initial commit
Diffstat (limited to 'components/data-table/data-table-column-simple-header.tsx')
-rw-r--r--components/data-table/data-table-column-simple-header.tsx61
1 files changed, 61 insertions, 0 deletions
diff --git a/components/data-table/data-table-column-simple-header.tsx b/components/data-table/data-table-column-simple-header.tsx
new file mode 100644
index 00000000..a865df24
--- /dev/null
+++ b/components/data-table/data-table-column-simple-header.tsx
@@ -0,0 +1,61 @@
+"use client"
+
+import * as React from "react"
+import { cn } from "@/lib/utils"
+import { type Column } from "@tanstack/react-table"
+import { ArrowDown, ArrowUp, ChevronsUpDown } from "lucide-react"
+
+interface DataTableColumnHeaderSimpleProps<TData, TValue>
+ extends React.HTMLAttributes<HTMLDivElement> {
+ column: Column<TData, TValue>
+ title: string
+}
+
+export function DataTableColumnHeaderSimple<TData, TValue>({
+ column,
+ title,
+ className,
+}: DataTableColumnHeaderSimpleProps<TData, TValue>) {
+ // 정렬 불가능 시 → 제목만 보여주기
+ if (!column.getCanSort()) {
+ return <div className={cn(className)}>{title}</div>
+ }
+
+ // 정렬 상태: "asc" | "desc" | false
+ const sorted = column.getIsSorted()
+
+ // 아이콘 결정
+ let icon = <ChevronsUpDown className="w-4 h-4" aria-hidden="true" />
+ if (sorted === "asc") {
+ icon = <ArrowUp className="w-4 h-4" aria-hidden="true" />
+ } else if (sorted === "desc") {
+ icon = <ArrowDown className="w-4 h-4" aria-hidden="true" />
+ }
+
+ // 클릭 핸들러: 무정렬 → asc → desc → 무정렬
+ function handleClick() {
+ if (!sorted) {
+ // 현재 무정렬 → asc
+ column.toggleSorting(false)
+ } else if (sorted === "asc") {
+ // asc → desc
+ column.toggleSorting(true)
+ } else {
+ // desc → 무정렬
+ column.toggleSorting(false)
+ }
+ }
+
+ return (
+ <div
+ onClick={handleClick}
+ className={cn(
+ "flex items-center justify-between cursor-pointer select-none gap-2",
+ className
+ )}
+ >
+ <span>{title}</span>
+ {icon}
+ </div>
+ )
+} \ No newline at end of file