Data Table Sheet Detail Panel
data-table-filters/data-table-sheetFreeBlock
Row detail side panel with cell renderers, keyboard navigation, and copy-to-clipboard.
Install it
npx shadcn@latest add https://logs.run/r/data-table-sheet.jsonSource
1"use client";23import {4 Sheet,5 SheetClose,6 SheetContent,7 SheetDescription,8 SheetHeader,9 SheetTitle,10} from "@/components/custom/sheet";11import { useDataTable } from "@/components/data-table/data-table-provider";12import { Button } from "@/components/ui/button";13import { Kbd } from "@/components/ui/kbd";14import { Separator } from "@/components/ui/separator";15import { Skeleton } from "@/components/ui/skeleton";16import {17 Tooltip,18 TooltipContent,19 TooltipProvider,20 TooltipTrigger,21} from "@/components/ui/tooltip";22import { useFilterActions } from "@/lib/store/hooks/useFilterActions";23import { useFilterState } from "@/lib/store/hooks/useFilterState";24import { cn } from "@/lib/utils";25import { ChevronDown, ChevronUp, X } from "lucide-react";26import * as React from "react";2728export interface DataTableSheetDetailsProps {29 title?: React.ReactNode;30 titleClassName?: string;31 children?: React.ReactNode;32}3334export function DataTableSheetDetails({35 title,36 titleClassName,37 children,38}: DataTableSheetDetailsProps) {39 const { table, rowSelection, isLoading } = useDataTable();40 const { setFilters } = useFilterActions();4142 const isMultiSelect = !!table.options.enableMultiRowSelection;4344 // Read the detail row ID from BYOS uuid when multi-select is enabled,45 // otherwise fall back to rowSelection (existing single-select behavior)46 const uuid = useFilterState((s) => s.uuid) as string | null | undefined;47 const selectedRowKey = isMultiSelect48 ? (uuid ?? undefined)49 : Object.keys(rowSelection)?.[0];5051 const selectedRow = React.useMemo(() => {52 if (isLoading && !selectedRowKey) return;53 return table54 .getRowModel()55 .flatRows.find((row) => row.id === selectedRowKey);56 }, [selectedRowKey, isLoading, table]);5758 const index = table59 .getRowModel()60 .flatRows.findIndex((row) => row.id === selectedRow?.id);6162 const nextId = React.useMemo(63 () => table.getRowModel().flatRows[index + 1]?.id,64 [index, isLoading, table],65 );6667 const prevId = React.useMemo(68 () => table.getRowModel().flatRows[index - 1]?.id,69 [index, isLoading, table],70 );7172 const onPrev = React.useCallback(() => {73 if (!prevId) return;74 if (isMultiSelect) {75 setFilters({ uuid: prevId });76 } else {77 table.setRowSelection({ [prevId]: true });78 }79 }, [prevId, isLoading, table, isMultiSelect, setFilters]);8081 const onNext = React.useCallback(() => {82 if (!nextId) return;83 if (isMultiSelect) {84// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from data-table-filters
All 11 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Data Table with Filtersdata-table | data-table-filters | Blocks | Free | 17 deps · 53 files | |
| Data Table Cell Renderersdata-table-cell | data-table-filters | Blocks | Free | 4 deps · 17 files | |
| Data Table Drizzle ORM Helpersdata-table-drizzle | data-table-filters | Blocks | Free | 2 deps · 7 files | |
| Data Table Filter Command Palettedata-table-filter-command | data-table-filters | Blocks | Free | 2 deps · 2 files | |
| Data Table AI Filter Command Palettedata-table-filter-command-ai | data-table-filters | Blocks | Free | 6 deps · 11 files | |
| Data Table MCP Serverdata-table-mcp | data-table-filters | Blocks | Free | 2 deps · 5 files | |
| Data Table nuqs Store Adapterdata-table-nuqs | data-table-filters | Blocks | Free | 1 dep · 4 files | |
| Data Table Query Layerdata-table-query | data-table-filters | Blocks | Free | 3 deps · 3 files |
