Data Grid Sort Menu
tablecn/data-grid-sort-menuFreeComponent
A sort menu component for the data grid with drag-and-drop reordering
Install it
npx shadcn@latest add https://tablecn.com/r/data-grid-sort-menu.jsonSource
1"use client";23import type { ColumnSort, SortDirection, Table } from "@tanstack/react-table";4import {5 ArrowDownUp,6 ChevronsUpDown,7 GripVertical,8 Trash2,9} from "lucide-react";10import * as React from "react";11import { Badge } from "@/components/ui/badge";12import { Button } from "@/components/ui/button";13import {14 Command,15 CommandEmpty,16 CommandGroup,17 CommandInput,18 CommandItem,19 CommandList,20} from "@/components/ui/command";21import { useDirection } from "@/components/ui/direction";22import {23 Popover,24 PopoverContent,25 PopoverTrigger,26} from "@/components/ui/popover";27import {28 Select,29 SelectContent,30 SelectGroup,31 SelectItem,32 SelectTrigger,33 SelectValue,34} from "@/components/ui/select";35import {36 Sortable,37 SortableContent,38 SortableItem,39 SortableItemHandle,40 SortableOverlay,41} from "@/components/ui/sortable";42import { cn } from "@/lib/utils";4344const SORT_SHORTCUT_KEY = "s";45const REMOVE_SORT_SHORTCUTS = new Set(["backspace", "delete"]);46const SORT_ORDERS = [47 { label: "Asc", value: "asc" },48 { label: "Desc", value: "desc" },49];5051interface DataGridSortMenuProps<TData>52 extends React.ComponentProps<typeof PopoverContent> {53 table: Table<TData>;54 disabled?: boolean;55}5657export function DataGridSortMenu<TData>({58 table,59 disabled,60 className,61 ...props62}: DataGridSortMenuProps<TData>) {63 const dir = useDirection();64 const id = React.useId();65 const labelId = React.useId();66 const descriptionId = React.useId();67 const [open, setOpen] = React.useState(false);68 const addButtonRef = React.useRef<HTMLButtonElement>(null);6970 const sorting = table.getState().sorting;71 const onSortingChange = table.setSorting;7273 const { columnLabels, columns } = React.useMemo(() => {74 const labels = new Map<string, string>();75 const sortingIds = new Set(sorting.map((s) => s.id));76 const availableColumns: { id: string; label: string }[] = [];7778 for (const column of table.getAllColumns()) {79 if (!column.getCanSort()) continue;8081 const label = column.columnDef.meta?.label ?? column.id;82 labels.set(column.id, label);8384 if (!sortingIds.has(column.id)) {85 availableColumns.push({ id: column.id, label });86 }87 }8889 return {90 columnLabels: labels,91 columns: availableColumns,92 };93 }, [sorting, table]);9495 const onSortAdd = React.useCallback(() => {96 const firstColumn = columns[0];97 if (!firstColumn) return;9899 onSortingChange((prevSorting) => [100 ...prevSorting,101// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from tablecn
All 13 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Data Griddata-grid | tablecn | Components | Free | 4 deps · 21 files | |
| Data Grid Filter Menudata-grid-filter-menu | tablecn | Components | Free | 2 deps · 8 files | |
| Data Grid Keyboard Shortcutsdata-grid-keyboard-shortcuts | tablecn | Components | Free | 1 dep · 2 files | |
| Data Grid Row Height Menudata-grid-row-height-menu | tablecn | Components | Free | 2 deps | |
| Data Grid Select Columndata-grid-select-column | tablecn | Components | Free | 1 dep | |
| Data Grid Skeletondata-grid-skeleton | tablecn | Components | Free | no deps | |
| Data Grid View Menudata-grid-view-menu | tablecn | Components | Free | 2 deps · 2 files | |
| Data Tabledata-table | tablecn | Components | Free | 3 deps · 17 files |
