Intelligentable is a highly customizable, fully-typed, performant, and feature-rich React component library built on top of handpicked industry-level production-grade UI Components for modern web applications.
npm install @shridey/intelligentableSee the CHANGELOG for all updates and release notes.
IntelligentTable is a Modern React TypeScript Table Component built on top of Ant Design, providing advanced, smart, and highly customizable table component.
- ๐ Automatic Sorting โ Enabled smart sorting by default for numbers, dates, days of week, currencies, percentages, ids and string.
- ๐ Automatic Summary Row โ Built-in support for sum, average, count, max, and min operations per column.
- ๐ Universal Search โ Out-of-the-box search across all columns, or plug in your own custom logic.
- ๐งฉ Composable Data Transformation Pipeline โ Chain and compose data transformation steps before rendering.
- ๐ Smart Numeric Filtering โ Out-of-the-box filter support for numbers, ids, percentages, and currencies. Supports exact match (42) and range queries (10-50).
- ๐จ Legends โ Dynamic legend generation based on column color rules, with customizable styles.
- ๐ค Export โ Export table data to Excel (XLSX), PDF, JSON, CSV, and TSV formats.
- ๐ท๏ธ Dynamic Cell Coloring โ Apply colors to cells based on value thresholds, string matches, or regex.
- ๐ Themeable โ Fully customize every visual aspect of the table, including legends, summary rows, search box, export buttons, and more.
- ๐ ๏ธ Type Safety โ All props and features are fully typed for maximum reliability.
import { IntelligentTable } from "@shridey/intelligentable";
import type { IntelligentTableColumnType } from "@shridey/intelligentable";
function App() {
const columns: IntelligentTableColumnType[] = [
{
title: "Name",
dataIndex: "name",
summaryOperation: "count",
},
{
title: "Salary",
dataIndex: "salary",
summaryOperation: "sum",
colorConfig: [
{ min: 0, max: 50000, color: "red" },
{ min: 50000, max: 100000, inclusiveMax: true, color: "green" },
],
},
];
const dataSource = [
{ key: 1, name: "Alice", salary: 40000 },
{ key: 2, name: "Bob", salary: 60000 },
];
return (
<IntelligentTable
columns={columns}
dataSource={dataSource}
defaultSummary={{ enable: true, fixed: "bottom" }}
enableLegends
search={{ enable: true }}
tableExport={{ enable: true, exportFileName: "MyTable" }}
tableThemeConfig={{
legends: { fontSize: "12px" },
}}
/>
);
}
export default App;| Prop | Type | Description |
|---|---|---|
columns |
IntelligentTableColumnType[] (extends AntD's TableColumnType) |
Table columns, supports extra fields: roundOff, colorConfig, summaryOperation, displaySummaryOperationInSummary |
dataSource |
readonly AnyObject[] (AntD's) |
Table data |
defaultSummary |
{ enable?: boolean; fixed?: "top" | "bottom" } |
Enables built-in summary row |
enableLegends |
boolean |
Show legend box |
search |
{ enable: boolean; placeholder: string; onSearch?: (searchText, row, columns) => boolean } |
Built-in search or custom logic |
tableExport |
{ enable: boolean; exportFileName?: string; pdfFontOptions?: IntelligentTableExportButtonPDFFontOptionsType |
Enables export options |
dataTransform |
(ctx: { pipeline }) => AnyObject[] |
Chain data transformations |
tableThemeConfig |
IntelligentTableThemeConfigType (Table Theme from AntD's ThemeConfig) |
Theme customization (legend, searchBox, exportButton etc) |
| ...other AntD Table props | Supported | All other props from AntD's <Table /> are supported |
...
IntelligentTable automatically detects the data type of each column and applies the most appropriate sorting logic:
- Numbers: Sorted numerically
- Strings: Sorted alphabetically
- Dates: Sorted chronologically
- Day of Week: Starting from Sunday to Saturday
- Currencies, Percentages, IDs: Sorted by their respective types
You do not need to specify a sorter manuallyโIntelligentTable does it for you!
import { IntelligentTable } from "@shridey/intelligentable";
import type { IntelligentTableColumnType } from "@shridey/intelligentable";
const columns: IntelligentTableColumnType[] = [
{
title: "Employee ID",
dataIndex: "id",
// Smart sorting will sort as numbers
},
{
title: "Name",
dataIndex: "name",
// Smart sorting will sort alphabetically
},
{
title: "Joining Date",
dataIndex: "joiningDate",
// Smart sorting will sort by date
},
{
title: "Joining Day",
dataIndex: "joiningDay",
// Smart sorting will sort by day of week
},
{
title: "Salary",
dataIndex: "salary",
// Smart sorting will sort numerically
},
];
const dataSource = [
{ key: 1, id: 101, name: "Alice", joiningDate: "2022-01-15", salary: 40000 },
{ key: 2, id: 102, name: "Bob", joiningDate: "2021-11-03", salary: 60000 },
];
<IntelligentTable columns={columns} dataSource={dataSource} />;If you want to override the automatic sorting for a column, simply provide your own sorter function:
const columns: IntelligentTableColumnType[] = [
{
title: "Name",
dataIndex: "name",
// Override smart sorting with custom sorter
sorter: (a, b) => a.name.length - b.name.length, // Sort by name length
},
// ...other columns
];Set via summaryOperation in column:
"sum"โ total"average"โ mean"count"โ count"max"โ max value"min"โ min value
Example:
{
title: "Score",
dataIndex: "score",
summaryOperation: "average",
}Add dynamic coloring rules to columns:
colorConfig: [
{ min: 0, max: 50, color: "red" },
{ min: 50, max: 100, inclusiveMax: true, color: "green" },
{ str: "Pending", color: "orange" },
{ regEx: "^Error", color: "red" },
];Legends are automatically generated and displayed when enableLegends is true.
Enable built-in search or provide your own logic:
<IntelligentTable
defaultUniversalSearch={{
enable: true,
onSearch: (searchText, row, columns) =>
columns.some((col) => String(row[col.dataIndex]).includes(searchText)),
}}
// ...
/>Export table data to:
- Excel (xlsx)
- JSON
- CSV
- TSV
Enable via tableExport prop:
import NotoSans from "@/assets/fonts/NotoSans-Regular.ttf";
<IntelligentTable
tableExport={{
enable: true,
exportFileName: "Report",
pdfFontOptions: {
// Optional
fontUrl: NotoSans,
fontName: "NotoSans",
fontFileName: "NotoSans-Regular.ttf",
fontStyles: ["normal", "bold"],
fallbackFont: "helvetiva", // Default
},
}}
// ...
/>;Chain multiple data transformation steps before rendering:
<IntelligentTable
dataTransform={({ pipeline }) =>
pipeline([
(data) => data.filter((row) => row.active),
(data) => data.sort((a, b) => a.score - b.score),
// ...other transformations
])
}
// ...
/><IntelligentTable
columns={[
{
title: "ID",
dataIndex: "id",
filters: [
{ text: "1", value: "1" },
{ text: "10โ50", value: "10-50" },
],
},
{
title: "Price",
dataIndex: "price",
filters: [
{ text: "100", value: "100" },
{ text: "500โ1000", value: "500-1000" },
],
// No need to write onFilters
},
]}
dataSource={[
// On activating column filter, below values will be
{ id: 1, price: 200 }, // Filtered
{ id: 25, price: 800 }, // Visible
{ id: 60, price: 1200 }, // Filtered
// Based on rules defined in filters above
]}
/>Customize table appearance via tableThemeConfig:
<IntelligentTable
tableThemeConfig={{
legends: { fontSize: "14px", backgroundColor: "#f0f0f0" },
searchBox: { colorText: "#333" },
exportButton: { defaultBg: "#1890ff", defaultColor: "#fff" },
defaultSummaryRow: { backgroundColor: "#fafafa", fontWeight: "bold" },
}}
// ...
/>MIT | Made with โค๏ธ in Mumbai ๐ฎ๐ณ
Stay tuned for updates and new components.
Wanna Talk: Start a discussion or Create an issue