UNPKG

@shakibdshy/react-tablegrid

Version:

A modern, flexible, headless and advanced table component for React with grid layout

301 lines (250 loc) 8.38 kB
# React Table Grid A powerful and flexible table grid component for React applications with TailwindCSS support. Built with TypeScript and modern React patterns. [![npm version](https://img.shields.io/npm/v/@shakibdshy/react-tablegrid.svg)](https://www.npmjs.com/package/@shakibdshy/react-tablegrid) [![npm downloads](https://img.shields.io/npm/dm/@shakibdshy/react-tablegrid.svg)](https://www.npmjs.com/package/@shakibdshy/react-tablegrid) [![License](https://img.shields.io/npm/l/@shakibdshy/react-tablegrid.svg)](https://github.com/shakibdshy/react-tablegrid/blob/main/LICENSE) ## Demo & Documentation (Updated) [Example Demo](https://react-packages-doc.vercel.app/docs/react-tablegrid) ## Prerequisites Before installing this package, make sure you have the following peer dependencies installed in your project: ```bash # Required peer dependencies npm install react@>=18.0.0 react-dom@>=18.0.0 tailwindcss@^3.4.1 # If using TypeScript (recommended) npm install @types/react@^19.0.0 ``` ## Installation ```bash # Install with npm npm install @shakibdshy/react-tablegrid # Or with yarn yarn add @shakibdshy/react-tablegrid # Or with pnpm pnpm add @shakibdshy/react-tablegrid ``` ## Usage 1. Import the CSS styles (required for `withoutTailwind` prop): ```typescript // Method 1: Import styles import '@shakibdshy/react-tablegrid/styles'; // OR Method 2: Import CSS file directly import '@shakibdshy/react-tablegrid/dist/table-grid.css'; ``` 2. Import and use the component: ```typescript import { TableGrid } from '@shakibdshy/react-tablegrid'; ``` ## Setup ```tsx /** @type {import('tailwindcss').Config} */ export default { content: [ // ... your content configuration "node_modules/@shakibdshy/react-tablegrid/dist/**/*.{js,ts,jsx,tsx}", ], }; ``` ## Features - 🔄 Dynamic Sorting & Server-side Sorting - 🔍 Advanced Filtering with Fuzzy Search - 📌 Column Pinning (Left/Right) - 📏 Column Resizing with Drag & Drop - 👥 Header Groups & Nested Headers - 🎨 Custom Cell & Header Rendering - 🎯 Full TypeScript Support - 💅 TailwindCSS Integration - 📱 Responsive Design - 📱 Customized Table without using any TailwindCSS - 📱 Accessibility with ARIA attributes and roles - ⚡ Virtualization Support for Large Datasets - 🎛️ Customizable Components & Styling - 🎨 Multiple Style Variants - 🔄 Column Visibility Toggle - 📍 Dynamic Column Pinning - 🔄 Row Selection & Bulk Actions - 📊 Row Grouping - 🔍 Advanced Search with Multiple Fields - 💾 Persistent State Management - 🔄 Server-side Pagination - 📱 Touch & Mobile Support ## Basic Usage ```tsx type DataItem = { id: number; name: string; age: number; email: string; }; const columnHelper = createColumnHelper<DataItem>(); const columns: Column<DataItem>[] = [ columnHelper.accessor("name", { header: "Name", sortable: false, }), columnHelper.accessor("age", { header: "Age", sortable: false, }), columnHelper.accessor("email", { header: "Email", sortable: false, }), ]; const BasicTable = () => { return ( <div className="p-4"> <TableContainer columns={columns} data={dummyData} maxHeight="400px" variant="modern" onStateChange={(state) => { console.log("Table state changed:", state); }} /> </div> ); }; export default BasicTable; ``` ## API Reference ### TableProps | Prop | Type | Default | Description | |------|------|---------|-------------| | `columns` | `Column[]` | Required | Array of column definitions | | `data` | `T[]` | Required | Array of data objects | | `variant` | `"modern" \| "minimal" \| "classic"` | `"modern"` | Table style variant | | `enableFiltering` | `boolean` | `false` | Enable basic filtering | | `enableFuzzySearch` | `boolean` | `false` | Enable fuzzy search | | `fuzzySearchKeys` | `Array<keyof T>` | All columns | Keys to include in fuzzy search | | `fuzzySearchThreshold` | `number` | `0.3` | Fuzzy search sensitivity | | `maxHeight` | `string` | `"400px"` | Maximum height of table | | `gridTemplateColumns` | `string` | `"1fr"` | CSS grid template columns | | `headerGroups` | `boolean` | `false` | Enable header grouping | | `isLoading` | `boolean` | `false` | Show loading state | | `serverSideConfig` | `ServerSideConfig` | - | Server-side data handling configuration | | `virtualizationConfig` | `VirtualizationConfig` | - | Configuration for virtualization | | `enableRowSelection` | `boolean` | `false` | Enable row selection | | `enableRowGrouping` | `boolean` | `false` | Enable row grouping | | `persistState` | `boolean` | `false` | Enable state persistence | | `stateKey` | `string` | - | Key for persisting state | | `onBulkAction` | `(selectedRows: T[]) => void` | - | Handler for bulk actions | | `touchConfig` | `TouchConfig` | - | Touch interaction configuration | ### Column Definition ```tsx interface Column<T> { id: keyof T; header: ReactNode | (() => ReactNode); accessorKey: keyof T; sortable?: boolean; className?: string; width?: string; group?: string; pinned?: 'left' | 'right' | false; groupable?: boolean; nestedHeaders?: Column<T>[]; cell?: (props: { value: T[keyof T]; row: T; onChange?: (value: T[keyof T]) => void; onDelete?: () => void; }) => ReactNode; } ``` ### Server-Side Configuration ```tsx interface ServerSideConfig { enabled: boolean; totalRows: number; pageSize: number; onFetch: (params: { page: number; sortBy?: string; sortDirection?: 'asc' | 'desc'; filters?: Record<string, any>; }) => Promise<T[]>; } ``` ### Virtualization Configuration ```tsx interface VirtualizationConfig { enabled: boolean; rowHeight: number; overscan?: number; scrollThreshold?: number; } ``` ### Touch Configuration ```tsx interface TouchConfig { enabled: boolean; swipeThreshold?: number; longPressDelay?: number; dragEnabled?: boolean; } ``` ### Style Configuration ```tsx interface TableStyleConfig { container?: { className?: string; style?: React.CSSProperties; }; header?: { className?: string; style?: React.CSSProperties; }; row?: { className?: string; style?: React.CSSProperties; }; cell?: { className?: string; style?: React.CSSProperties; }; selectedRow?: { className?: string; style?: React.CSSProperties; }; groupRow?: { className?: string; style?: React.CSSProperties; }; } ``` ### Additional Props | Prop | Type | Default | Description | |------|------|---------|-------------| | `columnResizeMode` | `"onChange" \| "onResize" \| "drag"` | `"onChange"` | When to update column sizes | | `onColumnResize` | `(columnId: string, width: number) => void` | - | Column resize handler | | `columnSizing` | `{ columnSizes: { [key: string]: number } }` | - | Column width states | | `onColumnPin` | `(columnId: keyof T, position: 'left' \| 'right' \| false) => void` | - | Column pin handler | | `onStateChange` | `(state: TableState) => void` | - | Table state change handler | | `onRowSelect` | `(selectedRows: T[]) => void` | - | Row selection handler | | `onGroupChange` | `(groups: string[]) => void` | - | Row grouping change handler | ## Version History - v2.1.0 - Enhance table component styling and customization - Added new className and style props for more granular styling control - Introduced rtg-* class names for better semantic targeting - Updated TableStyleConfig to support more detailed styling options - Improved hover and transition effects across table components - Added support for custom row and cell styling in table body - v2.0.0 - Major Release - Added server-side data handling - Enhanced virtualization for large datasets - Improved column management with drag & drop - Added row grouping functionality - Enhanced TypeScript support - Added persistent state management - Improved mobile & touch support - Added bulk actions for selected rows - Enhanced search capabilities - Added nested header groups - Performance optimizations - v1.2.0-beta.1 - Added column resizing and toggle column pinning features - v1.1.0 - Initial stable release - v1.0.0 - Initial release ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## License MIT © [Md. Habibur Rahman]