@shridey/intelligentable
Version:
Intelligentable is a highly customizable, fully-types, performant, and feature-rich React component library built on top of handpicked industry-level production-grade UI Components for modern web applications.
324 lines (248 loc) โข 10.1 kB
Markdown
# Intelligentable by @shridey
> Intelligentable is a highly customizable, fully-types, performant, and feature-rich React component library built on top of handpicked industry-level production-grade UI Components for modern web applications.
## ๐ฆ Installation
```bash
npm install @shridey/intelligentable
```
## Changelog
See the [CHANGELOG](./CHANGELOG.md) for all updates and release notes.
## ๐ง IntelligentTable
IntelligentTable is a Modern React TypeScript Table Component built on top of Ant Design, providing advanced, smart, and highly customizable table component.
## โจ Features
- ๐ **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.
- ๐จ **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.
## ๐ Quick Start Example
```tsx
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;
```
## โ๏ธ Full Props Reference
| 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 |
...
## ๐ข Automatic Smart Sorting
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!**
### Example: Smart Sorting
```tsx
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}
/>
```
### Overriding Smart Sorting with a Custom Sorter
If you want to override the automatic sorting for a column, simply provide your own `sorter` function:
```tsx
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
];
```
## ๐งฎ Summary Operations
Set via `summaryOperation` in column:
- `"sum"` โ total
- `"average"` โ mean
- `"count"` โ count
- `"max"` โ max value
- `"min"` โ min value
**Example:**
```ts
{
title: "Score",
dataIndex: "score",
summaryOperation: "average",
}
```
## ๐จ Dynamic Cell Coloring & Legends
Add dynamic coloring rules to columns:
```ts
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.
## ๐ Universal Search
Enable built-in search or provide your own logic:
```tsx
<IntelligentTable
defaultUniversalSearch={{
enable: true,
onSearch: (searchText, row, columns) =>
columns.some((col) => String(row[col.dataIndex]).includes(searchText)),
}}
// ...
/>
```
## ๐ค Export
Export table data to:
- Excel (xlsx)
- PDF
- JSON
- CSV
- TSV
Enable via `tableExport` prop:
```tsx
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
}
}
}
// ...
/>
```
## ๐งฉ Data Transformation Pipeline
Chain multiple data transformation steps before rendering:
```tsx
<IntelligentTable
dataTransform={({ pipeline }) =>
pipeline([
(data) => data.filter((row) => row.active),
(data) => data.sort((a, b) => a.score - b.score),
// ...other transformations
])
}
// ...
/>
```
## ๐ Theme Customization
Customize table appearance via `tableThemeConfig`:
```tsx
<IntelligentTable
tableThemeConfig={{
legends: { fontSize: "14px", backgroundColor: "#f0f0f0" },
searchBox: { colorText: "#333", placeholderText: "Type to search..." },
exportButton: { defaultBg: "#1890ff", defaultColor: "#fff" },
defaultSummaryRow: { backgroundColor: "#fafafa", fontWeight: "bold" },
}}
// ...
/>
```
## ๐ License
MIT ยฉ @shridey | Made with โค๏ธ in Mumbai ๐ฎ๐ณ
## โจ More IntelligentComponents Coming Soon!
Stay tuned for updates and new components.
> _Questions or suggestions?_
> Create an issue or start a discussion on [GitHub](https://github.com/shridey/intelligentable/issues)