aio-table (React js all in one table)
aio table options
- data table
- tree table
- support nested data
- support flat data
- keyboar navigation
- inline edit
- group by
- sortable
- filterable
- searchable
- use html or jsx in cells
- freeze mode
- resize columns
- swap columns position
- mobile support
- paging
Installation
Basic
countries JSON as aio table model:
[
...
{
"continent":"North America",
"name":"United States",
"population":"331853982",
"percent":"4.21",
"update":"16 Jun 2021"
},
...
]
also you can find contries json in repository (countries.js)
import React,{Component} from "react";
import Table from 'aio-table';
import countries from './countries';
import "./style.css";
export default class App extends Component {
state = {model:countries}
render(){
let {model} = this.state;
return (
<Table
className='table'
model={model}
columns={[
{
title:'Name',
getValue:(row)=>row.name,
justify:false,
titleJustify:false,
search:true
},
{
title:'Continent',
getValue:(row)=>row.continent,
width:120,
},
{
title:'Population',
getValue:(row)=>row.population,
justify:false,
width:120,
},
{
title:'Percent',
getValue:(row)=>row.percent,
template:(row)=>row.percent + '%',
width:90,
}
]}
paging={{
number:1,
size:20,
}}
padding={12}
/>
);
}
}
main props:
props |
type |
default |
description |
model |
json |
Required |
data model of table as rows. |
columns |
array of objects |
Required |
list of table columns. |
paging |
object |
optional |
configure table paging. |
groups |
array of objects |
optional |
grouping rows. |
sorts |
array of objects |
optional |
sorting rows |
className |
string |
optional |
class name of table. |
id |
string |
optional |
id of table. |
style |
css object |
optional |
set table css style. |
padding |
number |
12 |
set table padding using padding props.(for better styling dont set padding in style instead set padding props) |
headerHeight |
number |
36 |
height of header. |
rowHeight |
number |
36 |
height of cells. |
rowGap |
number |
6 |
gap between rows. |
columnGap |
number |
0 |
gap between columns. |
each column Object:
column property |
type |
default |
description |
title |
string |
"" |
title of column. |
getValue |
function |
optional if you set template property on column |
get row object as parameter and returns value of table cell based on row. |
titleJustify |
boolean |
true |
justifying column title. |
justify |
boolean |
true |
justifying cell content. |
search |
boolean |
false |
put search input in toolbar for searching rows based on column values. |
width |
number or string or 'auto' |
auto |
set width of column |
minWidth |
number or string |
optional |
set min width of column(use in resizing column) |
template |
function |
optional |
get row as parameter and return cell html |
resizable |
boolean |
false |
make column resizable |
movable |
boolean |
false |
male column movable. (swaping columns) |
show |
boolean |
true |
set column visibility |
toggleShow |
boolean |
false |
set visibility of column by user from toolbar |
before |
function |
optional |
get row as parameters and returns html as before cell content |
after |
function |
optional |
get row as parameters and returns html as after cell content |
Set column resizable
<Table
...
columns={[
...
{
title:'Continent',
getValue:(row)=>row.continent,
width:120,
resizable:true
},
...
]}
...
/>
Set column toggleShow
<Table
...
columns={[
...
{
title:'Population',
getValue:(row)=>row.population,
justify:false,
width:120,
toggleShow:true
},
...
]}
...
/>
Set column freeze (boolean)
default is false
<Table
...
columns={[
...
{
title:'Name',
getValue:(row)=>row.name,
width:'auto',
freeze:true
},
...
]}
...
/>
Set column toggleFreeze (boolean)
if true user can set column freeze from toolbar.
default is false
<Table
...
columns={[
...
{
title:'Name',
getValue:(row)=>row.name,
width:'auto',
toggleFreeze:true
},
{
title:'Population',resizable:true,
getValue:(row)=>row.population,
template:(row)=>numberWithCommas(row.population),
width:'160px',
toggleFreeze:true
}
...
]}
...
/>
sizing props (headerHeight,rowHeight,rowGap,columnGap,padding)
default value is 36
<Table
...
headerHeight={24}
rowHeight={36}
rowGap={8}
columnGap={1}
padding={12}
...
/>
set column movable (boolean)
drag and drop movable columns to swap and reorder.
default is true
for prevent move column set movable property false on column object
<Table
...
columns={[
...
{
title:'Population',
getValue:(row)=>row.population,
movable:false
}
...
]}
...
/>
set column filter (object)
filter rows by column value automatically.
for filter rows based on column , getValue property is required on column.
property |
type |
default |
description |
type |
string ('text' or 'number') |
'text' |
based on column values. |
<Table
...
columns={[
{
title:'Name',
getValue:(row)=>row.name,
justify:false,
titleJustify:false,
filter:{type:'text'}
},
{
title:'Continent',
getValue:(row)=>row.continent,
width:120,
resizable:true,
},
{
title:'Population',
getValue:(row)=>row.population,
justify:false,
width:120,
filter:{type:'number'}
},
{
title:'Percent',
getValue:(row)=>row.percent,
template:(row)=>row.percent + '%',
width:90,
}
]}
...
/>
if you want to filter rows outside of aio table , you can set onChangeFilter props (for example server side filtering)
<Table
...
onChangeFilter={(filters)=>{
....
}}
...
/>
filters is an array of objects . each object has 3 property (booleanType,items,column)
set paging (object)
paging rows.
properties:
property |
Type |
Default |
Description |
sizes |
Array |
[1,5,10,20,30] |
page sizes (dropdown) |
size |
number |
first index of sizes property |
rows count per page |
number |
number |
1 |
page number |
onChange |
function |
Optional |
if you set onChange , you must paging rows of model in parent component and aio table will not paging rows automatically |
onChange function get changed paging object as parameters
<Table
...
paging={{
number:1,
sizes:[5,10,15,20],
size:10,
onChange:(paging)=>{
//change model props
//if not set onChange , paging will be automatically on model
}
}}
...
/>
Set column before and after (function)
set html before and after cells of column content.
<Table
...
columns={[
...
{
title:'Name',
getValue:(row)=>row.name,
before:(row)=>{
return (
<div
style={{
background:'dodgerblue',
color:'#fff',
borderRadius:'100%',
width:20,
height:20,
display:'flex',
alignItems:'center',
justifyContent:'center',
fontSize:10
}}
>{row._index}</div>
)
},
after:(row)=>{
var colors = {
'Asia':'orange','North America':'blue','South America':'lightblue','Africa':'black','Europe':'green'
}
return (
<div
style={{
background:colors[row.continent],
color:'#fff',
padding:'0 6px',
height:'16px',
fontSize:'10px',
lineHeight:'16px',
textAlign:'center',
borderRadius:'3px'
}}
>{row.continent}</div>
)
}
},
...
]}
...
/>
Set groups (Array Of Objects)
group by rows.
each group properties:
Property |
Type |
Default |
Description |
title |
string |
Required |
uniqe title of group item |
getValue |
function |
Required |
this function get (row) as parameter and return a value category for group by rows. |
active |
boolean |
true |
active or deactive group item. |
toggle |
boolean |
true |
if true, user can toggle activity of group item from toolbar |
<Table
...
groups:[
{
title:'Continent',
getValue:(row)=>{
return row.continent;
}
}
}
...
/>
Other Example:
<Table
...
groups={[
{
title:'Populatuion',
getValue:(row)=>{
if(row.population > 1000000000){
return 'More than 1,000,000,000'
}
if(row.population > 500000000){
return 'Between 500,000,000 and 1,000,000,000'
}
if(row.population > 100000000){
return 'Between 100,000,000 and 500,000,000'
}
if(row.population > 50000000){
return 'Between 50,000,000 and 100,000,000'
}
if(row.population > 25000000){
return 'Between 25,000,000 and 50,000,000'
}
return 'Less Than 25,000,000'
}
}
]}
...
/>
Set sorts (Array Of Objects)
sort rows.
each sort properties:
Property |
Type |
Default |
Description |
title |
string |
Required |
uniqe title of sort item |
getValue |
function |
Required |
this function get (row) as parameter and return a value for sort rows. |
type |
string ('inc' or 'dec') |
'inc' |
set sort type as increase or decrease. |
active |
boolean |
true |
active or deactive sort item. |
toggle |
boolean |
true |
if true, user can toggle activity of sort item from toolbar |
<Table
...
sorts={[
{
title:'Name',
getValue:(row)=>row.name,
type:'inc'
}
]}
...
/>
Set column inlineEdit (Objects)
inline editing cells.
inlineEdit properties:
Property |
Type |
Default |
Description |
type |
'text' or 'number' or 'select' |
'text' |
type of inline edit input. |
disabled |
function |
Optional |
get row as parameter and return boolean. if return true this cell input will be disabled. |
options |
array of objects |
required if type is 'select' |
options of inline edit input by select type (each option have 2 property(text,value)). |
onChange |
function |
required |
get row and value as parameters. if return an string means there is an error and cell will show this string as error message. |
<Table
...
columns={[
{
title:'Name',
getValue:(row)=>row.name,
width:'auto',
inlineEdit:{
type:'text',
onChange:(row,value)=>{
row.name = value;
this.setState({model:this.state.model})
}
}
},
{
title:'Population',resizable:true,
getValue:(row)=>row.population,
template:(row)=>numberWithCommas(row.population),
width:'100px',
inlineEdit:{
type:'number',
onChange:(row,value)=>{
row.population = value;
this.setState({model:this.state.model})
}
}
},
{
title:'Percent',
getValue:(row)=>row.percent,
template:(row)=>row.percent + '%',
width:'70px'
},
{
title:'Continent',
getValue:(row)=>row.continent,
width:'120px',
inlineEdit:{
type:'select',
options:[
{text:'Asia',value:'Asia'},
{text:'Africa',value:'Africa'},
{text:'Europa',value:'Europa'},
{text:'North America',value:'North America'},
{text:'South America',value:'South America'}
],
onChange:(row,value)=>{
row.continent = value;
this.setState({model:this.state.model})
}
}
}
]}
...
/>
Tree data (nested json)
nested json example:
let nestedData = [
{
name:'Applications',id:'1',
childs:[
{name:'Calendar',id:'2',type:'app'},
{name:'Chrome',id:'3',type:'app'},
{name:'Webstorm',id:'4',type:'app'}
]
},
{
name:'Documents',id:'5',
childs:[
{
name:'Angular',id:'6',
childs:[
{
name:'SRC',id:'7',
childs:[
{name:'Compiler',id:'8',type:'ts'},
{name:'Core',id:'9',type:'ts'},
]
},
]
},
{
name:'Material2',id:'10',
childs:[
{
name:'SRC',id:'11',
childs:[
{name:'Button',id:'12',type:'ts'},
{name:'Checkbox',id:'13',type:'ts'},
{name:'Input',id:'14',type:'ts'}
]
}
]
},
]
},
{
name:'Downloads',id:'15',
childs:[
{name:'October',id:'16',type:'pdf'},
{name:'November',id:'17',type:'pdf'},
{name:'Tutorial',id:'18',type:'pdf'}
]
},
{
name:'Pictures',id:'19',
childs:[
{
name:'Library',id:'20',
childs:[
{name:'Contents',id:'21',type:'dir'},
{name:'Pictures',id:'22',type:'dir'}
]
},
{name:'Sun',id:'23',type:'png'},
{name:'Woods',id:'24',type:'jpg'}
]
}
]
set getRowChilds function for get rows childs.
set column treeMode for collapse and indent rows.
export default class App extends Component {
render(){
return (
<Table
className='table'
model={nestedData}
columns={[
{
title:'Name',
getValue:(row)=>row.name,
justify:false,
titleJustify:false,
treeMode:true
},
{
title:'Type',
getValue:(row)=>row.type
}
]}
getRowChilds={(row)=>row.childs}
/>
);
}
}
Tree data (flat json)
data as array with id and parent id.
flat json example:
let flatData = [
{name:'Applications',id:'1'},
{name:'Calendar',id:'2',type:'app',parentId:'1'},
{name:'Chrome',id:'3',type:'app',parentId:'1'},
{name:'Webstorm',id:'4',type:'app',parentId:'1'},
{name:'Documents',id:'5'},
{name:'Angular',id:'6',parentId:'5'},
{name:'SRC',id:'7',parentId:'6'},
{name:'Compiler',id:'8',type:'ts',parentId:'7'},
{name:'Core',id:'9',type:'ts',parentId:'7'},
{name:'Material2',id:'10',parentId:'5'},
{name:'SRC',id:'11',parentId:'10'},
{name:'Button',id:'12',type:'ts',parentId:'11'},
{name:'Checkbox',id:'13',type:'ts',parentId:'11'},
{name:'Input',id:'14',type:'ts',parentId:'11'},
{name:'Downloads',id:'15'},
{name:'October',id:'16',type:'pdf',parentId:'15'},
{name:'November',id:'17',type:'pdf',parentId:'15'},
{name:'Tutorial',id:'18',type:'pdf',parentId:'15'},
{name:'Pictures',id:'19'},
{name:'Library',id:'20',parentId:'19'},
{name:'Contents',id:'21',type:'dir',parentId:'20'},
{name:'Pictures',id:'22',type:'dir',parentId:'20'},
{name:'Sun',id:'23',type:'png',parentId:'19'},
{name:'Woods',id:'24',type:'jpg',parentId:'19'}
]
set getRowParentId function for get rows parent id.
set getRowId function for get rows id.
set column treeMode for collapse and indent rows.
export default class App extends Component {
render(){
return (
<Table
className='table'
model={flatData}
columns={[
{
title:'Name',
getValue:(row)=>row.name,
justify:false,
titleJustify:false,
treeMode:true
},
{
title:'Type',
getValue:(row)=>row.type
}
]}
getRowId={(row)=>row.id}
getRowParentId={(row)=>row.parentId}
/>
);
}
}
Gantt chrt example
for set column as gantt chart , you can set a column by template:'gantt'.
gantt column can have all column properties and must have this properties:
Property |
Type |
Default |
Description |
template |
string('gantt') |
Required |
define column as gantt. |
getKeys |
function |
Required |
return gantt keys array. |
getStart |
function |
required |
get row a parameter and return an string as start of row bar(one of keys). |
getEnd |
function |
required |
get row a parameter and return an string as end of row bar(one of keys). |
getProgress |
function |
Optional |
get row as parameter and return a number between 0 and 100 to show row percentage graphically. |
getText |
function |
Optional |
get row as parameter and return an string to show on row gantt bar. |
padding |
string(px) |
'36px' |
gantt horizontal padding. |
getBackgroundColor |
function |
a function that return '#69bedb' |
get row as parameter and return an string as gant bar background color. |
getColor |
function |
a function that return '#fff' |
get row as parameter and return an string as gant bar text color. |
getFlags |
function |
Optional |
return an array of objects (Examplae [{color:'red',value:'2022/6'}]) as gantt flags. |
export default class App extends Component {
state = {
model:[
{name:'a',startDate:'2022/1',endDate:'2022/6',progress:10},
{name:'b',startDate:'2022/1',endDate:'2022/3',progress:20},
{name:'c',startDate:'2022/3',endDate:'2022/6',progress:50},
{name:'d',startDate:'2022/6',endDate:'2022/9',progress:30},
{name:'e',startDate:'2022/9',endDate:'2022/12',progress:100},
{name:'f',startDate:'2022/1',endDate:'2022/9',progress:80},
{name:'g',startDate:'2022/3',endDate:'2022/9',progress:70},
{name:'h',startDate:'2022/6',endDate:'2022/12',progress:60},
{name:'i',startDate:'2022/9',endDate:'2022/12',progress:50},
]
}
render(){
var {model} = this.state;
return (
<Table
model={model}
columns={[
{
title:'Name',
getValue:(row)=>row.name,
width:'80px',
},
{
title:'My Gantt',
minWidth:'400px',
toggleShow:true,
template:'gantt',
getStart:(row)=>row.startDate,
getEnd:(row)=>row.endDate,
getKeys:()=>['2022/1','2022/2','2022/3','2022/4','2022/5','2022/6','2022/7','2022/8','2022/9','2022/10','2022/11','2022/12'],
getProgress:(row)=>row.progress,
getText:(row)=>row.name + ' ' + row.progress + '%',
padding:'24px',
getBackgroundColor:(row)=>'lightblue',
getColor:(row)=>'#fff',
getFlags:()=>[
{color:'red',value:'2022/6'},
{color:'red',value:'2022/9'},
]
}
]}
/>
);
}
}