From e0dfb55c5457aec489fc084c4567e791b4c65eb1 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Wed, 26 Mar 2025 00:37:41 +0000 Subject: 3/25 까지의 대표님 작업사항 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-table/data-table-advanced-toolbar.tsx | 104 +++ components/data-table/data-table-column-header.tsx | 109 +++ .../data-table/data-table-column-resizable.tsx | 57 ++ .../data-table/data-table-column-simple-header.tsx | 61 ++ .../data-table/data-table-faceted-filter.tsx | 151 ++++ components/data-table/data-table-filter-list.tsx | 787 +++++++++++++++++++++ components/data-table/data-table-grobal-filter.tsx | 49 ++ components/data-table/data-table-group-list.tsx | 317 +++++++++ components/data-table/data-table-pagination.tsx | 132 ++++ components/data-table/data-table-pin-left.tsx | 95 +++ components/data-table/data-table-pin-right.tsx | 88 +++ components/data-table/data-table-pin.tsx | 146 ++++ components/data-table/data-table-resizer.tsx | 98 +++ components/data-table/data-table-skeleton.tsx | 169 +++++ components/data-table/data-table-sort-list.tsx | 370 ++++++++++ components/data-table/data-table-toolbar.tsx | 119 ++++ components/data-table/data-table-view-options.tsx | 191 +++++ components/data-table/data-table.tsx | 209 ++++++ 18 files changed, 3252 insertions(+) create mode 100644 components/data-table/data-table-advanced-toolbar.tsx create mode 100644 components/data-table/data-table-column-header.tsx create mode 100644 components/data-table/data-table-column-resizable.tsx create mode 100644 components/data-table/data-table-column-simple-header.tsx create mode 100644 components/data-table/data-table-faceted-filter.tsx create mode 100644 components/data-table/data-table-filter-list.tsx create mode 100644 components/data-table/data-table-grobal-filter.tsx create mode 100644 components/data-table/data-table-group-list.tsx create mode 100644 components/data-table/data-table-pagination.tsx create mode 100644 components/data-table/data-table-pin-left.tsx create mode 100644 components/data-table/data-table-pin-right.tsx create mode 100644 components/data-table/data-table-pin.tsx create mode 100644 components/data-table/data-table-resizer.tsx create mode 100644 components/data-table/data-table-skeleton.tsx create mode 100644 components/data-table/data-table-sort-list.tsx create mode 100644 components/data-table/data-table-toolbar.tsx create mode 100644 components/data-table/data-table-view-options.tsx create mode 100644 components/data-table/data-table.tsx (limited to 'components/data-table') diff --git a/components/data-table/data-table-advanced-toolbar.tsx b/components/data-table/data-table-advanced-toolbar.tsx new file mode 100644 index 00000000..7c126c51 --- /dev/null +++ b/components/data-table/data-table-advanced-toolbar.tsx @@ -0,0 +1,104 @@ +"use client" + +import * as React from "react" +import type { DataTableAdvancedFilterField } from "@/types/table" +import { type Table } from "@tanstack/react-table" + +import { cn } from "@/lib/utils" +import { DataTableFilterList } from "@/components/data-table/data-table-filter-list" +import { DataTableSortList } from "@/components/data-table/data-table-sort-list" +import { DataTableViewOptions } from "@/components/data-table/data-table-view-options" +import { DataTablePinList } from "./data-table-pin" +import { PinLeftButton } from "./data-table-pin-left" +import { PinRightButton } from "./data-table-pin-right" +import { DataTableGlobalFilter } from "./data-table-grobal-filter" +import { DataTableGroupList } from "./data-table-group-list" + +interface DataTableAdvancedToolbarProps + extends React.HTMLAttributes { + /** + * The table instance returned from useDataTable hook with pagination, sorting, filtering, etc. + * @type Table + */ + table: Table + + /** + * An array of filter field configurations for the data table. + * @type DataTableAdvancedFilterField[] + * @example + * const filterFields = [ + * { + * id: 'name', + * label: 'Name', + * type: 'text', + * placeholder: 'Filter by name...' + * }, + * { + * id: 'status', + * label: 'Status', + * type: 'select', + * options: [ + * { label: 'Active', value: 'active', count: 10 }, + * { label: 'Inactive', value: 'inactive', count: 5 } + * ] + * } + * ] + */ + filterFields: DataTableAdvancedFilterField[] + + /** + * Debounce time (ms) for filter updates to enhance performance during rapid input. + * @default 300 + */ + debounceMs?: number + + /** + * Shallow mode keeps query states client-side, avoiding server calls. + * Setting to `false` triggers a network request with the updated querystring. + * @default true + */ + shallow?: boolean +} + +export function DataTableAdvancedToolbar({ + table, + filterFields = [], + debounceMs = 300, + shallow = true, + children, + className, + ...props +}: DataTableAdvancedToolbarProps) { + return ( +
+
+ + + + + + + +
+
+ {children} + +
+
+ ) +} diff --git a/components/data-table/data-table-column-header.tsx b/components/data-table/data-table-column-header.tsx new file mode 100644 index 00000000..aa0c754b --- /dev/null +++ b/components/data-table/data-table-column-header.tsx @@ -0,0 +1,109 @@ +"use client" + +import { SelectIcon } from "@radix-ui/react-select" +import { type Column } from "@tanstack/react-table" +import { ArrowDown, ArrowUp, ChevronsUpDown, EyeOff } from "lucide-react" + +import { cn } from "@/lib/utils" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, +} from "@/components/ui/select" + +interface DataTableColumnHeaderProps + extends React.HTMLAttributes { + column: Column + title: string +} + +export function DataTableColumnHeader({ + column, + title, + className, +}: DataTableColumnHeaderProps) { + if (!column.getCanSort() && !column.getCanHide()) { + return
{title}
+ } + + const ascValue = `${column.id}-asc` + const descValue = `${column.id}-desc` + const hideValue = `${column.id}-hide` + + return ( +
+ +
+ ) +} diff --git a/components/data-table/data-table-column-resizable.tsx b/components/data-table/data-table-column-resizable.tsx new file mode 100644 index 00000000..2a91c998 --- /dev/null +++ b/components/data-table/data-table-column-resizable.tsx @@ -0,0 +1,57 @@ +"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 DataTableColumnHeaderProps + extends React.HTMLAttributes { + column: Column + title: string +} + +export function DataTableColumnHeaderResizable({ + column, + title, + className, +}: DataTableColumnHeaderProps) { + // 정렬 상태: "asc" | "desc" | false + const sorted = column.getIsSorted() + + // 아이콘 결정 + let icon =