1.2.0 • Published 5 months ago

@abaktiar/datagrid v1.2.0

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

@abaktiar/datagrid

A powerful, feature-rich React DataGrid component with TypeScript support, built on TanStack Table.

npm version License: MIT

🚀 Features

  • 🎯 TypeScript Support - Fully typed with comprehensive TypeScript definitions
  • ⚡ High Performance - Built on TanStack Table with virtualization support
  • 🎨 Customizable Styling - Multiple themes (light/dark) and density options
  • 📊 Rich Data Operations - Sorting, filtering, pagination, and global search
  • 🖱️ Context Menus - Powerful right-click context menus for cells and tables
  • 📤 Export Capabilities - Export to CSV, JSON, and Excel formats
  • 🚀 Floating Action Dock - Customizable floating buttons for bulk operations
  • 🎨 Button Customization - Custom icons, variants, and complete button components
  • � Flexible Configuration - Extensive customization options
  • 📱 Responsive Design - Mobile-friendly with overflow handling
  • 🎛️ Advanced Features - Row selection, column resizing, and more

📦 Installation

npm install @abaktiar/datagrid

or

yarn add @abaktiar/datagrid

or

pnpm add @abaktiar/datagrid

🏗️ Peer Dependencies

Make sure you have the required peer dependencies installed:

npm install react react-dom

📚 Basic Usage

import React from 'react';
import { DataGrid, DataGridColumn } from '@abaktiar/datagrid';
import '@abaktiar/datagrid/styles';

interface User {
  id: number;
  name: string;
  email: string;
  age: number;
}

const data: User[] = [
  { id: 1, name: 'John Doe', email: 'john@example.com', age: 30 },
  { id: 2, name: 'Jane Smith', email: 'jane@example.com', age: 25 },
  // ... more data
];

const columns: DataGridColumn<User>[] = [
  {
    accessorKey: 'id',
    header: 'ID',
    size: 80,
  },
  {
    accessorKey: 'name',
    header: 'Name',
    size: 200,
  },
  {
    accessorKey: 'email',
    header: 'Email',
    size: 250,
  },
  {
    accessorKey: 'age',
    header: 'Age',
    size: 100,
  },
];

function App() {
  return (
    <DataGrid
      data={data}
      columns={columns}
      enableSorting
      enableFiltering
      enablePagination
      enableRowSelection
      pageSize={10}
    />
  );
}

export default App;

🎨 Styling

Import the CSS file in your application:

import '@abaktiar/datagrid/styles';

🔧 Advanced Usage

Context Menus

import { 
  DataGrid, 
  createCopyValueAction, 
  createEmailAction,
  createCommonCellActions 
} from '@abaktiar/datagrid';

const columns: DataGridColumn<User>[] = [
  {
    accessorKey: 'email',
    header: 'Email',
    cellConfig: {
      contextMenu: {
        items: [
          createCopyValueAction(),
          createEmailAction(),
          ...createCommonCellActions(),
        ],
      },
    },
  },
];

Excel Export

import { 
  DataGrid, 
  createExportExcelAction,
  createExcelExportBundle 
} from '@abaktiar/datagrid';

const tableContextMenu = {
  items: [
    createExportExcelAction('users.xlsx'),
    ...createExcelExportBundle(),
  ],
};

<DataGrid
  data={data}
  columns={columns}
  tableContextMenu={tableContextMenu}
/>

Floating Action Dock

The Floating Action Dock provides customizable floating buttons for bulk operations on selected rows:

import {
  DataGrid,
  createCommonFloatingActions,
  createExportSelectedToExcelAction,
  createFloatingActionSeparator
} from '@abaktiar/datagrid';

// Basic floating dock with built-in actions
<DataGrid
  data={data}
  columns={columns}
  enableRowSelection={true}
  floatingActionDock={{
    enabled: true,
    position: 'bottom-center',
    showCount: true,
    items: createCommonFloatingActions({
      enableExportExcel: true,
      enableExportCSV: true,
    }),
  }}
/>

// Advanced customization with custom buttons
const CustomExcelButton = ({ onClick, disabled, children }) => (
  <button
    onClick={onClick}
    disabled={disabled}
    style={{
      background: 'linear-gradient(135deg, #2E8B57, #228B22)',
      color: 'white',
      border: 'none',
      borderRadius: '8px',
      padding: '10px 16px',
      fontSize: '13px',
      fontWeight: '600',
      display: 'flex',
      alignItems: 'center',
      gap: '8px',
    }}
  >
    {children}
  </button>
);

<DataGrid
  data={data}
  columns={columns}
  enableRowSelection={true}
  floatingActionDock={{
    enabled: true,
    position: 'bottom-center',
    items: [
      // Customized built-in actions
      ...createCommonFloatingActions({
        excelOptions: {
          label: 'Premium Excel Export',
          icon: '🚀',
          customButton: CustomExcelButton,
        },
        csvOptions: {
          label: 'Export CSV',
          icon: '📊',
          variant: 'primary',
        },
      }),
      
      // Add separator
      createFloatingActionSeparator(),
      
      // Custom business actions
      {
        label: 'Archive Selected',
        icon: '📦',
        variant: 'default',
        onClick: (selectedData) => {
          console.log('Archiving:', selectedData);
        },
      },
    ],
  }}
/>

Floating Dock Configuration

OptionTypeDefaultDescription
enabledbooleanfalseEnable the floating dock
position'bottom-left' \| 'bottom-center' \| 'bottom-right' \| 'top-left' \| 'top-center' \| 'top-right''bottom-center'Dock position
showCountbooleantrueShow selected items count
itemsFloatingActionItem[][]Array of action items

Creating Custom Floating Actions

// Built-in export actions with customization
createExportSelectedToExcelAction({
  // File options
  filename: 'my-export.xlsx',
  columnMapping: { id: 'ID', name: 'Full Name' },
  
  // Visual customization
  label: 'Download Excel',
  icon: '💾',
  variant: 'success',
  className: 'my-custom-class',
  customButton: MyCustomButton,
})

// Completely custom action
{
  label: 'Custom Action',
  icon: '⭐',
  variant: 'primary',
  onClick: (selectedData, selectedIndices) => {
    // Your custom logic here
    console.log('Selected:', selectedData);
  },
  customButton: MyCustomButtonComponent, // Optional
}

Custom Cell Formatting

const columns: DataGridColumn<User>[] = [
  {
    accessorKey: 'age',
    header: 'Age',
    cellConfig: {
      format: (value) => `${value} years old`,
      style: (value) => ({
        color: value < 30 ? 'green' : 'blue',
        fontWeight: 'bold',
      }),
    },
  },
];

Controlled State

import React, { useState } from 'react';
import { DataGrid, SortingState, PaginationState } from '@abaktiar/datagrid';

function ControlledDataGrid() {
  const [sorting, setSorting] = useState<SortingState>([]);
  const [pagination, setPagination] = useState<PaginationState>({
    pageIndex: 0,
    pageSize: 10,
  });

  return (
    <DataGrid
      data={data}
      columns={columns}
      sorting={sorting}
      onSortingChange={setSorting}
      pagination={pagination}
      onPaginationChange={setPagination}
      manualPagination
      rowCount={totalRows}
    />
  );
}

📖 API Reference

DataGrid Props

PropTypeDefaultDescription
dataT[]requiredArray of data objects
columnsDataGridColumn<T>[]requiredColumn definitions
enableSortingbooleantrueEnable column sorting
enableFilteringbooleantrueEnable column filtering
enablePaginationbooleantrueEnable pagination
enableRowSelectionbooleanfalseEnable row selection
enableColumnResizingbooleantrueEnable column resizing
enableGlobalSearchbooleantrueEnable global search
pageSizenumber10Default page size
density'compact' \| 'comfortable' \| 'spacious''comfortable'Table density
theme'light' \| 'dark' \| 'auto''light'Theme
loadingbooleanfalseShow loading indicator
floatingActionDockFloatingActionDockConfigundefinedFloating action dock configuration

Column Configuration

interface DataGridColumn<T> {
  accessorKey: string;
  header: string;
  size?: number;
  minSize?: number;
  maxSize?: number;
  enableSorting?: boolean;
  enableFiltering?: boolean;
  enableResizing?: boolean;
  
  // Cell configuration
  cellConfig?: {
    format?: (value: any, row: T) => React.ReactNode;
    style?: React.CSSProperties | ((value: any, row: T) => React.CSSProperties);
    className?: string | ((value: any, row: T) => string);
    align?: 'left' | 'center' | 'right';
    tooltip?: boolean | ((value: any, row: T) => string);
    contextMenu?: {
      items: ContextMenuItem<T>[];
    };
  };
  
  // Header configuration
  headerConfig?: {
    align?: 'left' | 'center' | 'right';
    className?: string;
    tooltip?: string;
  };
}

🛠️ Utility Functions

Context Menu Actions

  • createCopyValueAction() - Copy cell value to clipboard
  • createCopyRowAction() - Copy entire row data
  • createEmailAction() - Open email client
  • createPhoneAction() - Handle phone number actions
  • createOpenUrlAction() - Open URLs in new tab
  • createGoogleSearchAction() - Search value on Google

Table Actions

  • createExportCsvAction() - Export table to CSV
  • createExportJsonAction() - Export table to JSON
  • createExportExcelAction() - Export table to Excel
  • createPrintAction() - Print table
  • createRefreshAction() - Refresh table data

Floating Action Utilities

  • createExportSelectedToExcelAction() - Excel export for selected rows
  • createExportSelectedToCSVAction() - CSV export for selected rows
  • createFloatingActionSeparator() - Visual separator for floating actions
  • createCommonFloatingActions() - Bundle of common floating actions

Excel Export Utilities

  • createExcelExportBundle() - Complete Excel export menu
  • createQuickExcelExport() - Quick export function
  • excelExportPresets - Predefined export configurations

🎨 Theming & Customization

The DataGrid supports multiple themes and customization options:

<DataGrid
  data={data}
  columns={columns}
  theme="dark"
  density="compact"
  className="my-custom-grid"
  tableClassName="my-table"
  headerClassName="my-header"
  bodyClassName="my-body"
/>

CSS Custom Properties

You can customize the appearance using CSS custom properties:

:root {
  --datagrid-primary-color: #3b82f6;
  --datagrid-border-color: #e5e7eb;
  --datagrid-header-bg: #f9fafb;
  --datagrid-row-hover-bg: #f3f4f6;
}

🔍 Search Configuration

<DataGrid
  data={data}
  columns={columns}
  searchConfig={{
    enabled: true,
    placeholder: 'Search users...',
    position: 'top',
    showIcon: true,
    debounceMs: 300,
  }}
/>

📱 Responsive Design

The DataGrid automatically handles overflow and provides smooth scrolling on mobile devices:

<DataGrid
  data={data}
  columns={columns}
  density="compact" // Better for mobile
  searchConfig={{ position: 'top' }}
/>

🚀 Performance Tips

  1. Use memo for custom cell renderers
  2. Virtualization is automatically handled for large datasets
  3. Debounced search reduces unnecessary re-renders
  4. Column sizing - Set appropriate default sizes

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🔗 Links

📝 Changelog

1.1.0

  • 🚀 NEW: Floating Action Dock - Customizable floating buttons for bulk operations
  • 🎨 NEW: Button Customization - Custom icons, variants, and complete button components
  • 📊 Enhanced Export - Floating Excel and CSV export for selected rows
  • Smooth Animations - Polished enter/exit animations for floating dock
  • 🔧 Flexible Configuration - Extensive customization options for floating actions
  • 📚 Comprehensive Examples - Multiple styling themes (Material, Glass, Neon)

1.0.1

  • Bug fixes and performance improvements
  • Enhanced TypeScript definitions

1.0.0

  • Initial release
  • Full TypeScript support
  • TanStack Table integration
  • Context menu functionality
  • Excel export capabilities
  • Responsive design
  • Multiple themes and densities

Made with ❤️ by abaktiar