npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dynamic-table-builder

v1.0.8

Published

A dynamic table library with backend-driven configuration

Readme

Dynamic Table Builder

A powerful and flexible React table library that supports backend-driven configuration, built on top of Ant Design. This document provides a comprehensive guide to the DynamicTable component and its JSON configuration structure.

Features

  • Backend-Driven Configuration: Define table structure, filters, sorting, and more from a JSON object, usually fetched from a backend.
  • Global and Column-Level Filters: Supports various filter types like search, select, and date range.
  • Sortable Columns: Enable sorting on specified columns.
  • Pagination: Complete pagination support, configurable from the JSON.
  • State Persistence: Persist table state (filters, sorting, pagination) to localStorage.
  • Custom Rendering: Render cell content as links, statuses with colors, formatted dates, and numbers.
  • Action Buttons: Configurable action buttons for functionalities like Export and Refresh.
  • Row Selection: Support for checkbox-based row selection.

Installation

First, make sure you have the required peer dependencies installed:

npm install antd @ant-design/icons dayjs

Then, install the library:

npm install dynamic-table-builder

How to Use

Here's a basic example of how to integrate the DynamicTable component.

import React from 'react';
import DynamicTable from 'dynamic-table-builder';
import 'dynamic-table-builder/dist/index.css'; // Don't forget to import styles

const YourComponent = () => {
  // This config would typically come from an API
  const tableConfiguration = { /* ... Your JSON config ... */ };

  const handleDataFetch = async (params) => {
    console.log('Fetching data with params:', params);
    // 'params' will contain { pagination, filters, sorter }
    // Fetch data from your API and return it in the expected format.
    // Example:
    // const response = await yourApi.getData(params);
    // return { data: response.items, pagination: { totalCount: response.total } };
    return Promise.resolve({ data: [], pagination: { totalCount: 0 } });
  };

  const handleExport = async (params) => {
    console.log('Exporting data with params:', params);
    // 'params' will contain { filters, sort }
    // Call your API to get the export data (e.g., a CSV blob).
    // Example:
    // const blob = await yourApi.exportData(params);
    // return blob;
    return Promise.resolve(new Blob(["Success"]));
  };

  return (
    <DynamicTable
      config={tableConfiguration}
      onDataFetch={handleDataFetch}
      onExport={handleExport}
      className="custom-table-class"
    />
  );
};

export default YourComponent;

JSON Configuration Structure

The DynamicTable is configured through a single JSON object. Here is the breakdown of its main properties.

{
  "data": [],
  "columns": [],
  "pagination": {},
  "tableConfig": {},
  "tableFeatures": {}
}
  • data: An array of objects, where each object represents a row in the table. While it can be provided initially, the component is designed to fetch data dynamically via the onDataFetch prop.
  • columns: (Required) An array of objects defining the table's columns.
  • pagination: Configuration for the table's pagination.
  • tableConfig: General table settings like title, action buttons, and global filters.
  • tableFeatures: Enables or configures special features like row selection and state management.

columns

Each object in the columns array defines a column.

| Key | Type | Description | |---|---|---| | title | string | The text displayed in the column header. | | key | string | A unique identifier for the column. This should match a key in the data objects. | | width| number | The width of the column in pixels. | | sortable| boolean| If true, the column can be sorted. | | render | object | Defines how to render the data in this column's cells. See Render Configuration below. | | filter | object | Defines a filter for this column. See Column Filter Configuration below. | | fixed | 'left' \| 'right' | Fixes the column to the left or right side of the table. |

Render Configuration (render)

| Key | Type | Description | |---|---|---| | type | string | The render type. Can be text, link, status, datetime, or number. | | urlTemplate | string | For type: 'link'. A template for the URL. Use {key} to insert data from the row (e.g., /users/{id}). | | urlType | 'internal' \| 'external' | For type: 'link'. 'internal' opens in the same tab, 'external' opens in a new tab. Defaults to 'internal'. | | colorMapping| object | For type: 'status'. Maps cell values to colors (e.g., {"active": "success", "inactive": "error"}). | | textMapping | object | For type: 'status'. Maps cell values to display text (e.g., {"PRS_PENDING": "Pending"}). | | format | string | For type: 'datetime', it's a date format string (e.g., DD-MM-YYYY HH:mm:ss). For type: 'number', it's the number of decimal places. |

Column Filter Configuration (filter)

| Key | Type | Description | |---|---|---| | type | string | The filter type. Can be search or select. | | placeholder| string | Placeholder text for the filter input. | | mode | string | For type: 'select'. Set to 'multiple' to allow multiple selections. | | options| array | For type: 'select'. An array of { label: string, value: any } objects. | | validation| object | For type: 'search'. Validation rules, e.g., {"minChars": 3}. Currently informational. |


pagination

Configures the table's pagination controls.

| Key | Type | Description | |---|---|---| | pageSize | number | The default number of items per page. | | pageSizeOptions | number[]| An array of numbers for the page size selector (e.g., [10, 20, 50]). | | showQuickJumper| boolean | If true, shows an input field to jump to a specific page. | | showTotal | boolean | If true, displays the total number of items. | | position | string[] | An array specifying the position of the pagination controls (e.g., ['bottomRight']). | | showSizeChanger| boolean | If true, allows the user to change the page size. | | totalCount | number | The total number of items available, which is used to calculate the number of pages. This is usually returned from the API. | | requestParams| object | Maps the table's internal pagination state to keys for the API request (e.g., {"page": "pageNumber", "pageSize": "pageSize"}). |


tableConfig

General table configuration.

| Key | Type | Description | |---|---|---| | title | string | The title displayed above the table. | | defaultPageSize| number | Default page size if not specified in pagination. | | actionButtons | object[] | An array of action buttons. See Action Button Configuration below. | | globalFilters | object[] | An array of global filters. See Global Filter Configuration below. | | exportFileName| string | The default filename for exports (e.g., 'data.csv'). |

Action Button Configuration

| Key | Type | Description | |---|---|---| | key | string | A unique key. Pre-defined keys export, refresh, and clearFilters have built-in functionality. | | title | string | The button's text. | | icon | string | The name of an Ant Design icon to display. | | iconSource| 'internal' | Specifies that the icon is from Ant Design. | | type | string | Ant Design button type (primary, default, etc.). | | enabled | boolean | Whether the button is enabled. | | position | 'left' \| 'right' | Positions the button on the left or right side of the action bar. Defaults to left. | | onClick | function | Custom click handler. If provided, this overrides default behavior for keys like export. |

Global Filter Configuration

| Key | Type | Description | |---|---|---| | key | string | A unique key for the filter. | | type | string | The filter type: dateRange, select, or search. | | title | string | A label displayed for the filter. | | placeholder| string | Placeholder text for the filter input. | | required | boolean | For type: 'dateRange', if a date range is mandatory. | | showTime | boolean | For type: 'dateRange', includes a time picker. | | format | string | For type: 'dateRange', the date format (e.g., DD-MM-YYYY). | | presets | object[]| For type: 'dateRange', predefined date ranges like "Today" or "This Month". | | mode | string | For type: 'select', set to multiple for multi-select. | | options | object[]| For type: 'select', an array of { label: string, value: any } objects. | | defaultValue | any | Default value for the filter when the table loads. For date ranges, use dayjs objects: [dayjs().subtract(30, 'days'), dayjs()]. For selects, use string or array of strings. | | position | 'left' \| 'right'| Positions the filter on the left or right. Defaults to the left. |

Setting Default Values for Global Filters

You can set default values for any global filter using the defaultValue property:

// Date Range - Last 30 days
{
  key: 'dateRange',
  type: 'dateRange',
  title: 'Date Range',
  defaultValue: [
    dayjs().subtract(30, 'days'), // Start date
    dayjs() // End date
  ]
}

// Single Select - Default to specific value
{
  key: 'status',
  type: 'select',
  title: 'Status',
  options: [
    { label: 'Active', value: 'ACTIVE' },
    { label: 'Inactive', value: 'INACTIVE' }
  ],
  defaultValue: 'ACTIVE'
}

// Multi-Select - Default to multiple values
{
  key: 'roles',
  type: 'select',
  mode: 'multiple',
  title: 'Roles',
  options: [
    { label: 'Admin', value: 'ADMIN' },
    { label: 'User', value: 'USER' }
  ],
  defaultValue: ['ADMIN', 'USER']
}

// Search - Default search term
{
  key: 'search',
  type: 'search',
  title: 'Search',
  defaultValue: 'john'
}

tableFeatures

Enables or configures special table features.

| Key | Type | Description | |---|---|---| | rowKey | string | The unique identifier field for each row in the data array (e.g., id, prsNumber). This is crucial for selection and performance. | | stateManagement | object | Configures state persistence. See State Management Configuration below. | | rowSelection| object | Configures row selection. See Row Selection Configuration below. |

State Management Configuration

| Key | Type | Description | |---|---|---| | enabled | boolean | If true, enables state persistence. | | storageKey| string | The key to use for storing the table's state in localStorage. | | persistColumns| boolean | If true, persists column visibility and order (future feature). | | persistFilters| boolean | If true, persists active filters. | | persistSort| boolean | If true, persists the current sorting. | | persistPagination| boolean | If true, persists the current page number and size. |

Row Selection Configuration

| Key | Type | Description | |---|---|---| | enabled | boolean | If true, enables row selection. | | type | 'checkbox' \| 'radio' | The type of selection. |

Component Props

| Prop | Type | Description | |---|---|---| | config | object | The main JSON configuration object for the table. | | onDataFetch | (params) => Promise<{ data: any[], pagination?: { totalCount: number } }> | A function that is called to fetch table data. It receives pagination, filters, and sorter info and should return the data and total count. | | onExport| (params) => Promise<Blob \| { success: boolean, message?: string }> | A function to handle data exporting. It receives the current filters and sort info. | | className| string | An optional CSS class to apply to the main table container. | | style | React.CSSProperties | Optional inline styles to apply to the main container. |