Powerful, simple, fast and API-friendly CSS-grid component (based on React/MobX)
npm install mobx-react-table-grid
simple API (just use as data input plain-objects and data-getters, mostly see TableDataColumn
and TableDataRow
interfaces)
table rows virtualization (you can easily handle 50k+ items (e.g. k8s resources) without slowness in UI while having access to data)
most of the layout done via display: grid
with some help of css-variables (works really fast!)
multi-columns sorting (powered by lodash/orderBy
)
reordering columns: drag the heading column (powered by react-dnd
)
filtering columns (show/hide/search)
resizing columns + reset to default (css-grid min-content)
lightweight rows search implementation (see demo.tsx
)
rows/data selection state management (see demo.tsx
)
import/export grid-state to external storage (e.g. window.localStorage
, see demo.tsx
)
customize column sizes via css-variables --grid-col-size-${columnId}
(see usage in demo.module.css
)
mobx
observability for grid state management under the hood
git clone https://github.com/ixrock/mobx-react-table-grid.git
npm install
npm run dev
import "mobx-react-table-grid/index.css" ; // or @import in *.css
import React from "react"
import { createRoot } from "react-dom/client" // react@18+
import { observer } from "mobx-react"
import { createTableState , Table } from "mobx-react-table-grid" ;
interface ResourceItem {
id : string | number ;
name : string ;
hobby : string [ ] ;
renderName ( ) : React . ReactNode ;
} ;
const tableState = createTableState < ResourceItem > ( {
items : [
{
id : 1 ,
name : "Joe" ,
hobby : [ "hacking" , "martial-arts" ] ,
renderName ( ) { return < b > Joel White< / b > } ,
} ,
{
id : 2 ,
name : "Ann" ,
hobby : [ "dancing" ] ,
renderName ( ) { return < b > Anna Dark< / b > } ,
}
] ,
columns : [
{
id : "index" ,
title : < b > #< / b > ,
renderValue : ( row , col ) => row . index ,
} ,
{
id : ResourceColumnId . name ,
title : < > Name< / > ,
renderValue : ( row , col ) => row . data . renderName ( ) ,
sortValue : ( row , col ) => row . data . name ,
} ,
{
id : ResourceColumnId . hobby ,
title : < > Hobby< / > ,
renderValue : ( row , col ) => < b > { row . data . hobby . join ( ", " ) } < / b > ,
sortValue : ( row , col ) => row . data . hobby . join ( "" ) ,
searchValue : ( row , col ) => row . data . hobby . join ( " " ) ,
} ,
]
} ) ;
const Demo = observer ( ( ) => {
const { tableColumns, searchResultTableRows } = tableState ;
return (
< Table
id = "table-grid-demo"
columns = { tableColumns . get ( ) }
rows = { searchResultTableRows . get ( ) }
/ >
) ;
} ) ;
// react@18+
const appRootElem = document . getElementById ( "app" ) ;
createRoot ( appRootElem ) . render ( < Demo / > ) ;