The @anitta-kv/material-table-component is a flexible and customizable multi-level table component for React applications. It provides comprehensive support for displaying hierarchical data with features like sorting, filtering, and pagination. This documentation provides detailed information on how to install, configure, and use the component effectively.
You can install the component from npm:
npm install @anitta-kv/material-table-componentor from yarn:
yarn add @anitta-kv/material-table-component- React v16.8+
 - TypeScript (recommended)
 
Here's a basic example of how to use the MultiLevelTable component:
import { MultiLevelTable } from '@anitta-kv/material-table-component';
const data = [
  {
    id: 1,
    name: 'Parent 1',
    value: 100,
    status: 'active',
    children: [
      {
        id: 2,
        name: 'Child 1',
        value: 50,
        status: 'pending',
      },
      {
        id: 3,
        name: 'Child 2',
        value: 50,
        status: 'completed',
      },
    ],
  },
];
const columns = [
  {
    key: 'name',
    title: 'Name',
    filterable: true,
  },
  {
    key: 'value',
    title: 'Value',
    filterable: true,
    render: (value) => `$${value}`,
  },
  {
    key: 'status',
    title: 'Status',
    filterable: true,
    render: (value) => (
      <span style={{ 
        padding: '4px 8px',
        borderRadius: '4px',
        backgroundColor: value === 'active' ? '#e6ffe6' : 
                        value === 'pending' ? '#fff3e6' : '#e6f3ff',
        color: value === 'active' ? '#006600' :
               value === 'pending' ? '#cc7700' : '#0066cc'
      }}>
        {value}
      </span>
    ),
  },
];
function App() {
  return (
    <MultiLevelTable 
      data={data} 
      columns={columns}
      pageSize={10}
    />
  );
}The MultiLevelTable component accepts the following props:
| Prop | Type | Required | Default | Description | 
|---|---|---|---|---|
| data | array | Yes | - | Array of data objects to display in the table | 
| columns | array | Yes | - | Array of column configurations | 
| pageSize | number | No | 10 | Number of rows to display per page | 
| theme | object | No | - | Custom theme object for styling the table | 
| renderCustomPagination | function | No | null | Custom pagination component render function | 
| sortable | boolean | No | false | Enable/disable sorting functionality | 
| ascendingIcon | ReactNode | No | - | Custom icon for ascending sort | 
| descendingIcon | ReactNode | No | - | Custom icon for descending sort | 
| expandIcon | ReactNode | No | - | Custom icon for expanding rows | 
| selectable | boolean | No | false | Enable/disable row selection | 
| onSelectionChange | function | No | - | Callback function when selection changes | 
Each column object should have the following properties:
| Property | Type | Required | Description | 
|---|---|---|---|
| key | string | Yes | Key to access the data in each row | 
| title | string | Yes | Column header text | 
| render | function | No | Custom render function for the column. Receives (value: string | number, item: DataItem) as parameters | 
| filterable | boolean | No | Whether the column can be filtered | 
| sortable | boolean | No | Whether the column can be sorted | 
| customSortFn | function | No | Custom sorting function. Receives (rowA: DataItem, rowB: DataItem, columnId: string) as parameters | 
You can customize the expand icon for rows with children using the expandIcon prop:
<MultiLevelTable
  data={data}
  columns={columns}
  expandIcon={<CustomExpandIcon />} // Your custom expand icon component
/>The expand icon will be displayed for rows that have children. You can provide any React component as the icon.
The table supports row selection with the following props:
<MultiLevelTable
  data={data}
  columns={columns}
  selectable={true} // Enable row selection
  onSelectionChange={(selectedRows) => {
    console.log('Selected rows:', selectedRows);
  }}
/>| Prop | Type | Description | 
|---|---|---|
| selectable | boolean | Enable/disable row selection functionality | 
| onSelectionChange | function | Callback function that receives a Set of selected row IDs | 
You can customize the sort icons for ascending and descending states:
<MultiLevelTable
  data={data}
  columns={columns}
  sortable={true}
  ascendingIcon={<CustomAscendingIcon />} // Custom icon for ascending sort
  descendingIcon={<CustomDescendingIcon />} // Custom icon for descending sort
/>| Prop | Type | Description | 
|---|---|---|
| ascendingIcon | ReactNode | Custom icon component for ascending sort state | 
| descendingIcon | ReactNode | Custom icon component for descending sort state | 
The table component provides comprehensive pagination functionality. You can either use the default pagination or create a custom one using the pagination props:
interface PaginationProps {
  page: Row<T>[];                    // Current page data
  canPreviousPage: boolean;          // Whether previous page is available
  canNextPage: boolean;              // Whether next page is available
  pageOptions: number[];             // Available page numbers
  pageCount: number;                 // Total number of pages
  gotoPage: (updater: number | ((pageIndex: number) => number)) => void;  // Go to specific page
  nextPage: () => void;              // Go to next page
  previousPage: () => void;          // Go to previous page
  setPageSize: (pageSize: number) => void;  // Change page size
  state: TableStateWithPagination<T>;  // Current table state
}Example of custom pagination:
const CustomPagination = ({ 
  canPreviousPage,
  canNextPage,
  pageOptions,
  pageCount,
  gotoPage,
  nextPage,
  previousPage,
  setPageSize,
  state: { pageIndex, pageSize }
}) => {
  return (
    <div className="pagination">
      <button onClick={() => previousPage()} disabled={!canPreviousPage}>
        Previous
      </button>
      <span>
        Page{' '}
        <strong>
          {pageIndex + 1} of {pageOptions.length}
        </strong>
      </span>
      <button onClick={() => nextPage()} disabled={!canNextPage}>
        Next
      </button>
      <select
        value={pageSize}
        onChange={e => setPageSize(Number(e.target.value))}
      >
        {[10, 20, 30, 40, 50].map(size => (
          <option key={size} value={size}>
            Show {size}
          </option>
        ))}
      </select>
    </div>
  );
};
// Usage in MultiLevelTable
<MultiLevelTable
  data={data}
  columns={columns}
  renderCustomPagination={CustomPagination}
/>The table component supports theme customization through the theme prop. Here's the complete theme interface:
interface ThemeProps {
  colors?: {
    background?: string;
    primaryColor?: string;
    textColor?: string;
    borderColor?: string;
  };
  table?: {
    header?: {
      background?: string;
      textColor?: string;
      borderColor?: string;
    };
    cell?: {
      textColor?: string;
      borderColor?: string;
      nestedPadding?: string;
    };
    row?: {
      levelColors?: {background: string}[];
    };
    filter?: {
      background?: string;
      textColor?: string;
      borderColor?: string;
      focusBorderColor?: string;
      placeholderColor?: string;
    };
  };
  pagination?: {
    button?: {
      background?: string;
      textColor?: string;
      disabledOpacity?: string;
    };
    select?: {
      background?: string;
      textColor?: string;
      borderColor?: string;
    };
    info?: {
      textColor?: string;
    };
  };
  expandIcon?: {
    color?: string;
  };
}Example usage:
const theme = {
  colors: {
    background: '#ffffff',
    primaryColor: '#1976d2',
    textColor: '#333333',
    borderColor: '#e0e0e0'
  },
  table: {
    header: {
      background: '#f5f5f5',
      textColor: '#333333',
      borderColor: '#e0e0e0'
    },
    cell: {
      textColor: '#333333',
      borderColor: '#e0e0e0',
      nestedPadding: '24px'
    },
    row: {
      levelColors: [
        { background: '#ffffff' },
        { background: '#f8f8f8' },
        { background: '#f5f5f5' }
      ]
    },
    filter: {
      background: '#ffffff',
      textColor: '#333333',
      borderColor: '#e0e0e0',
      focusBorderColor: '#1976d2',
      placeholderColor: '#757575'
    }
  },
  pagination: {
    button: {
      background: '#1976d2',
      textColor: '#ffffff',
      disabledOpacity: '0.5'
    },
    select: {
      background: '#ffffff',
      textColor: '#333333',
      borderColor: '#e0e0e0'
    },
    info: {
      textColor: '#333333'
    }
  },
  expandIcon: {
    color: '#757575'
  }
};
// Usage in MultiLevelTable
<MultiLevelTable
  data={data}
  columns={columns}
  theme={theme}
/>The theme customization allows you to:
- Customize global colors for the table
 - Style table components (header, cells, rows)
 - Configure nested level appearances
 - Customize filter and pagination components
 - Style the expand icon
 
src/App.tsx- A demo component that showcases the MultiLevelTable with sample datasrc/main.tsx- The entry point for the development environmentsrc/index.css- Basic styling for the table component
# Start the development server
npm run dev
# Build the package
npm run build
# Run linting
npm run lint- Hot Module Replacement (HMR) for instant feedback
 - TypeScript support with type checking
 - ESLint configuration for code quality
 - Sample data and configurations for testing
 - Basic styling for quick visualization
 
Here's a complete example showing how to use the component with custom styling and rendering:
import React from 'react';
import { MultiLevelTable } from '@anitta-kv/material-table-component';
function App() {
  const data = [
    {
      id: 1,
      name: 'Parent 1',
      value: 100,
      status: 'active',
      children: [
        {
          id: 2,
          name: 'Child 1',
          value: 50,
          status: 'pending',
        },
        {
          id: 3,
          name: 'Child 2',
          value: 50,
          status: 'completed',
        },
      ],
    },
  ];
  const columns = [
    {
      key: 'name',
      title: 'Name',
      filterable: true,
    },
    {
      key: 'value',
      title: 'Value',
      filterable: true,
      render: (value) => `$${value}`,
    },
    {
      key: 'status',
      title: 'Status',
      filterable: true,
      render: (value) => (
        <span style={{ 
          padding: '4px 8px',
          borderRadius: '4px',
          backgroundColor: value === 'active' ? '#e6ffe6' : 
                          value === 'pending' ? '#fff3e6' : '#e6f3ff',
          color: value === 'active' ? '#006600' :
                 value === 'pending' ? '#cc7700' : '#0066cc'
        }}>
          {value}
        </span>
      ),
    },
  ];
  return (
    <div>
      <MultiLevelTable 
        data={data} 
        columns={columns}
        pageSize={10}
      />
    </div>
  );
}
export default App;MIT