React Grid Component
React is one the most popular JavaScript framework.
Almost all JavaScript libraries do some component wrapper for frameworks (React, Angular, Vue)
, we either.
To do component for React is simple thing.
Let us start from 2 samples of wrapper for FancyGrid on JSFiddle.
Link on sample React Grid Component
Link on sample React Form Component
If these 2 samples are complex for you than we advice to spend several hours with React Tutorial from official site QUICK START.
You can run them on JSFiddle that avoid complex issues with webpack and other tools.
If you feel ok with React than let us start
Add FancyGrid to Your Project
For the purposes of this tutorial, we are going to scaffold a react app with create-react-app. Don't worry if your project has a different configuration. FancyGrid and the React wrapper are distributed as NPM packages, which should work with any common React project module bundler setup. Let's follow the create-react-app instructions - run the following commands in your terminal:
npx create-react-app my-app
cd my-app
npm start
npx comes with npm 5.2+ and higher, see instructions for older npm versions
If everything goes well, npm start
has started the web server and conveniently opened a browser pointing to localhost:3000.
As a next step, let's add the FancyGrid NPM package. run the following command in my-app
(you may need a new instance of the terminal):
npm install --save fancygrid fancygrid-react
After a few seconds of waiting, you should be good to go. Let's get to the actual coding! Open src/App.js
in your favorite text editor and change its contents to the following:
import React, { Component } from 'react';
import { FancyGridReact } from 'fancygrid-react';
class App extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<FancyGridReact
config={this.getConfig()}>
</FancyGridReact>
</div>
);
}
getConfig() {
return {
height: 400,
width: 500,
columns: [{
index: 'company',
title: 'Company',
type: 'string',
width: 100
}, {
index: 'name',
title: 'Name',
type: 'string',
width: 100
}, {
index: 'surname',
title: 'Sur Name',
type: 'string',
width: 100
}, {
index: 'age',
title: 'Age',
type: 'number',
width: 100
}],
data: [
{name: 'Ted', surname: 'Smith', company: 'Electrical Systems', age: 30},
{name: 'Ed', surname: 'Johnson', company: 'Energy and Oil', age: 35},
{name: 'Sam', surname: 'Williams', company: 'Airbus', age: 38},
{name: 'Alexander', surname: 'Brown', company: 'Renault', age: 24},
{name: 'Nicholas', surname: 'Miller', company: 'Adobe', age: 33}
]
}
}
}
export default App;
If everything is correct, we should see a simple grid with several rows.
Let's go over the App.js changes we made.
import { FancyGridReact } from 'fancygrid-react';
The line above imports the FancyGridReact component.
For simplicity we can do like this:
import { Grid } from 'fancygrid-react';
FancyGrid React package contains 3 full and 3 short names of components:
FancyGridReact, FancyFormReact, FancyTabReact
and Grid, Form, Tab
.
In next samples we will use short version.
Continue study the sample.
render() {
return (
<div>
<FancyGridReact
config={this.getConfig()}>
</FancyGridReact>
</div>
);
}
Inside the container, we place an FancyGridReact component with the configuration object (config) that runs method getConfig
.
We place all grid options in one param for simplicity but it is possible to define each property seperately.
Let us change code a bit.
import React, { Component } from 'react';
import { Grid } from 'fancygrid-react';
class App extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<Grid
height={400}
width={500}
columns={this.getColumns()}
data={this.getData()}>
</Grid>
</div>
);
}
getColumns() {
return [{
index: 'company',
title: 'Company',
type: 'string',
width: 100
}, {
index: 'name',
title: 'Name',
type: 'string',
width: 100
}, {
index: 'surname',
title: 'Sur Name',
type: 'string',
width: 100
}, {
index: 'age',
title: 'Age',
type: 'number',
width: 100
}];
}
getData() {
return [
{name: 'Ted', surname: 'Smith', company: 'Electrical Systems', age: 30},
{name: 'Ed', surname: 'Johnson', company: 'Energy and Oil', age: 35},
{name: 'Sam', surname: 'Williams', company: 'Airbus', age: 38},
{name: 'Alexander', surname: 'Brown', company: 'Renault', age: 24},
{name: 'Nicholas', surname: 'Miller', company: 'Adobe', age: 33}
];
}
}
export default App;
What did we change?
Shot component name.
import { Grid } from 'fancygrid-react';
Multi properties instead of one(config).
render() {
return (
<div>
<Grid
height={400}
width={500}
columns={this.getColumns()}
data={this.getData()}>
</Grid>
</div>
);
}
And 2 methods that just return arrays of columns and data.
Next, let us add them, enable sorting for all columns, add row selecting and row trackOver.
Now our render method will looks like:
render() {
return (
<div>
<Grid
selModel='rows'
theme='gray'
height={400}
width={500}
defaults={{sortable: true}}
trackOver={true}
columns={this.getColumns()}
data={this.getData()}>
</Grid>
</div>
);
}
Also it needs to add one more column for row selection.
getColumns() {
return [{
type: 'select'
},{
index: 'company',
title: 'Company',
type: 'string',
width: 100
The final result will be like this:
import React, { Component } from 'react';
import { Grid } from 'fancygrid-react';
class App extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<Grid
selModel='rows'
theme='gray'
height={400}
width={500}
defaults={{sortable: true}}
trackOver={true}
columns={this.getColumns()}
data={this.getData()}>
</Grid>
</div>
);
}
getColumns() {
return [{
type: 'select'
},{
index: 'company',
title: 'Company',
type: 'string',
width: 100
}, {
index: 'name',
title: 'Name',
type: 'string',
width: 100
}, {
index: 'surname',
title: 'Sur Name',
type: 'string',
width: 100
}, {
index: 'age',
title: 'Age',
type: 'number',
width: 100
}];
}
getData() {
return [
{name: 'Ted', surname: 'Smith', company: 'Electrical Systems', age: 30},
{name: 'Ed', surname: 'Johnson', company: 'Energy and Oil', age: 35},
{name: 'Sam', surname: 'Williams', company: 'Airbus', age: 38},
{name: 'Alexander', surname: 'Brown', company: 'Renault', age: 24},
{name: 'Nicholas', surname: 'Miller', company: 'Adobe', age: 33}
];
}
}
export default App;
Events and API
To manipulate grid it requires to get link on it.
Read more about method here Methods.
To use events it requires to set param events.
So let us try.
render() {
return (
<div>
<Grid
title='My Grid'
id='myGrid'
selModel='rows'
theme='gray'
height={400}
width={500}
defaults={{sortable: true}}
trackOver={true}
events={this.getEvents()}
columns={this.getColumns()}
data={this.getData()}>
</Grid>
</div>
);
}
getEvents() {
return [{
init: this.onGridInit
}];
}
onGridInit = (grid) => {
setTimeout(function(){
grid.setTitle('New Title');
}, 1000);
}
In the code above we will change grid title in 1 second since grid was initialized.
Getting link on grid
Very often it requires to get link grid to use methods.
For that it requires to import object Fancy
, set id
for widget.
import { Fancy, Grid } from 'fancygrid-react';
...
render() {
return (
<div>
<Grid
id='myGrid'
...
</Grid>
</div>
);
}
...
//Somewhere in the code.
const grid = Fancy.getWidget('myGrid');
grid.setTitle('New Title');
Production
FancyGrid consists of modules. It helps much to keep bundle size small.
But for production it requires to execute extra complex steps.
If you installed FancyGrid over npm and uses ES6/TypeScript than this section is for you.
By default FancyGrid includes core small module that auto-detects which modules will be used.
Than modules will be loaded from path that was provided in Fancy.MODULESDIR
.
By default Fancy.MODULESDIR
is equal to https://cdn.fancygrid.com/modules/
You can study about modules by this link Modules.
JavaScript Modules
You would need to get list of all modules that are used. For that open run open Web Console in browser and run this.
Fancy.getModulesList();
You would get something like that: ["paging", "server-data", "sort", "grouping", "filter", "tree", "dom", "ajax", "menu", "form", "grid"]
.
Now, open src/App.js
and import modules.
import { Fancy, Grid } from 'fancygrid-react';
import 'fancygrid/client/modules/sort.min';
import 'fancygrid/client/modules/dom.min';
import 'fancygrid/client/modules/edit.min';
import 'fancygrid/client/modules/grid.min';
import 'fancygrid/client/modules/selection.min';
import 'fancygrid/client/modules/menu.min';
import 'fancygrid/client/modules/exporter';
import 'fancygrid/client/modules/excel.min';
If you would need to debug the code, than remove .min
from modules.
i18n
On case you use localization that you would need to include lang module.
Add this line.
import 'fancygrid/client/modules/i18n/de';
CSS file
The next thing to do is including css file.
For that after including modules add this lines.
import 'fancygrid/client/fancy.min.css';
Fancy.stylesLoaded = true;
The first line is including css file.
The second one is stoping FancyGrid from loading styles file by self.
That's it.