Column menu in React Gantt component
15 Nov 202524 minutes to read
The column menu in the React Gantt component offers built-in actions including sorting, filtering, column chooser, and autofit. When you click the column menu icon, a menu appears with these features.
To activate the column menu feature, set the showColumnMenu property to true in the Gantt configuration and inject the ColumnMenu service in the Gantt component.
The following built-in column menu items are available:
| Item | Description |
|---|---|
| SortAscending | Sorts the column in ascending order. |
| SortDescending | Sorts the column in descending order. |
| AutoFit | Adjusts the width of the current column. |
| AutoFitAll | Adjusts the width of all columns. |
| ColumnChooser | Allows toggling column visibility . |
| Filter | Displays filter options based on filterSettings.type. |
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, Inject, Sort, Filter, Resize, ColumnMenu } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App(){
const taskFields = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
return <GanttComponent dataSource={data} taskFields={taskFields}
allowSorting={true} allowFiltering={true} allowResizing={true} showColumnMenu = {true} height = '450px'>
<Inject services={[Sort, Filter, Resize, ColumnMenu]} />
</GanttComponent>
};
ReactDOM.render(<App />, document.getElementById('root'));import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, Inject, Sort, Filter, Resize, ColumnMenu } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App(){
const taskFields: any = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
return <GanttComponent dataSource={data} taskFields={taskFields}
allowSorting={true} allowFiltering={true} allowResizing={true} showColumnMenu = {true} height = '450px'>
<Inject services={[Sort, Filter, Resize, ColumnMenu]} />
</GanttComponent>
};
ReactDOM.render(<App />, document.getElementById('root'));<!DOCTYPE html>
<html lang="en">
<head>
<title>Syncfusion React Gantt</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Essential JS 2 for React Components" />
<meta name="author" content="Syncfusion" />
<link href="https://cdn.syncfusion.com/ej2/31.2.12/material.css" rel="stylesheet" type="text/css"/>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<style>
#loader {
color: #008cff;
height: 40px;
left: 45%;
position: absolute;
top: 45%;
width: 30%;
}
</style>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='root'>
<div id='loader'>Loading....</div>
</div>
</body>
</html>
- You can disable the column menu for specific columns by setting columns.showColumnMenu to false.
- You can customize the default column menu items by defining columnMenuItems with only the required items.
Add a custom column menu item
The React Gantt component allows adding custom items to the column menu using the columnMenuItems property, which accepts a set of columnMenuItemModel objects.
Define the behavior of custom items through the columnMenuClick event.
The following example demonstrates how to add a custom column menu item to clear the sorting in the Gantt chart.
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, ColumnMenu, ColumnDirective, ColumnsDirective } from '@syncfusion/ej2-react-gantt';
import { Inject, Sort } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App(){
let ganttInstance;
const taskFields = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
const columnMenuItems = [{text:'Clear Sorting', id:'ganttclearsorting'}];
const sortSettings = { columns:[{direction: "Ascending", field: "TaskName"}] };
function columnMenuClick(args){
if(args.item.id === 'ganttclearsorting'){
ganttInstance.clearSorting();
}
}
const splitterSettings = {
columnIndex : 5
};
return (<div>
<GanttComponent dataSource={data} taskFields={taskFields} showColumnMenu={true}
columnMenuItems={columnMenuItems} columnMenuClick={columnMenuClick} sortSettings={sortSettings} allowSorting={true}
splitterSettings={splitterSettings} height = '450px' ref={gantt =>ganttInstance = gantt}>
<ColumnsDirective>
<ColumnDirective field='TaskID' width='100' ></ColumnDirective>
<ColumnDirective field='TaskName' headerText='Task Name'></ColumnDirective>
<ColumnDirective field='StartDate'></ColumnDirective>
<ColumnDirective field='Duration'></ColumnDirective>
<ColumnDirective field='Progress'></ColumnDirective>
</ColumnsDirective>
<Inject services={[ColumnMenu, Sort]} />
</GanttComponent></div>)
};
ReactDOM.render(<App />, document.getElementById('root'));import { createElement } from '@syncfusion/ej2-base';
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, ColumnMenu, ColumnDirective, ColumnsDirective } from '@syncfusion/ej2-react-gantt';
import { ColumnMenuItemModel, Inject, Sort, SortSettingsModel } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App(){
let ganttInstance: any;
const taskFields: any = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
const columnMenuItems: ColumnMenuItemModel[] = [{text:'Clear Sorting', id:'ganttclearsorting'}];
const sortSettings: SortSettingsModel = { columns:[{direction: "Ascending", field: "TaskName"}] };
function columnMenuClick(args: any){
if(args.item.id === 'ganttclearsorting'){
ganttInstance.clearSorting();
}
}
const splitterSettings: any = {
columnIndex : 5
};
return (<div>
<GanttComponent dataSource={data} taskFields={taskFields} showColumnMenu={true}
columnMenuItems={columnMenuItems} columnMenuClick={columnMenuClick} sortSettings={sortSettings} allowSorting={true}
splitterSettings={splitterSettings} height = '450px' ref={gantt =>ganttInstance = gantt}>
<ColumnsDirective>
<ColumnDirective field='TaskID' width='100' ></ColumnDirective>
<ColumnDirective field='TaskName' headerText='Task Name'></ColumnDirective>
<ColumnDirective field='StartDate'></ColumnDirective>
<ColumnDirective field='Duration'></ColumnDirective>
<ColumnDirective field='Progress'></ColumnDirective>
</ColumnsDirective>
<Inject services={[ColumnMenu, Sort]} />
</GanttComponent></div>)
};
ReactDOM.render(<App />, document.getElementById('root'));<!DOCTYPE html>
<html lang="en">
<head>
<title>Syncfusion React Gantt</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Essential JS 2 for React Components" />
<meta name="author" content="Syncfusion" />
<link href="https://cdn.syncfusion.com/ej2/31.2.12/material.css" rel="stylesheet" type="text/css"/>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<style>
#loader {
color: #008cff;
height: 40px;
left: 45%;
position: absolute;
top: 45%;
width: 30%;
}
</style>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='root'>
<div id='loader'>Loading....</div>
</div>
</body>
</html>Customize column menu items per column
Control the visibility of column menu items for specific columns by using the columnMenuOpen event. To hide an item, set args.hide to true for the target item.
The following example demonstrates hiding the Filter item when the column menu opens for the TaskName column.
import { createElement } from '@syncfusion/ej2-base';
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, ColumnMenu, ColumnDirective, ColumnsDirective } from '@syncfusion/ej2-react-gantt';
import { Inject, Sort, Filter } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App(){
const taskFields = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
function columnMenuOpen (args) {
for (const item of args.items) {
if (item.text === 'Filter' && (args.column ).field === 'TaskName') {
(item ).hide = true;
} else {
(item ).hide = false;
}
}
}
const splitterSettings = {
columnIndex : 5
};
return (<div>
<GanttComponent dataSource={data} taskFields={taskFields} showColumnMenu={true}
columnMenuOpen={columnMenuOpen} allowFiltering={true} allowSorting={true}
splitterSettings={splitterSettings} height = '450px'>
<ColumnsDirective>
<ColumnDirective field='TaskID' width='100' ></ColumnDirective>
<ColumnDirective field='TaskName' headerText='Task Name'></ColumnDirective>
<ColumnDirective field='StartDate'></ColumnDirective>
<ColumnDirective field='Duration'></ColumnDirective>
<ColumnDirective field='Progress'></ColumnDirective>
</ColumnsDirective>
<Inject services={[ColumnMenu, Sort, Filter]} />
</GanttComponent></div>)
};
ReactDOM.render(<App />, document.getElementById('root'));import { createElement } from '@syncfusion/ej2-base';
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, ColumnMenu, ColumnDirective, ColumnsDirective, ColumnMenuOpenEventArgs } from '@syncfusion/ej2-react-gantt';
import { ColumnMenuItemModel, Inject, Sort, Filter } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App(){
const taskFields: any = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
function columnMenuOpen (args: ColumnMenuOpenEventArgs) {
for (const item of args.items) {
if (item.text === 'Filter' && (args.column).field === 'TaskName') {
(item as ColumnMenuItemModel).hide = true;
} else {
(item as ColumnMenuItemModel).hide = false;
}
}
}
const splitterSettings: any = {
columnIndex : 5
};
return (<div>
<GanttComponent dataSource={data} taskFields={taskFields} showColumnMenu={true}
columnMenuOpen={columnMenuOpen} allowFiltering={true} allowSorting={true}
splitterSettings={splitterSettings} height = '450px'>
<ColumnsDirective>
<ColumnDirective field='TaskID' width='100' ></ColumnDirective>
<ColumnDirective field='TaskName' headerText='Task Name'></ColumnDirective>
<ColumnDirective field='StartDate'></ColumnDirective>
<ColumnDirective field='Duration'></ColumnDirective>
<ColumnDirective field='Progress'></ColumnDirective>
</ColumnsDirective>
<Inject services={[ColumnMenu, Sort, Filter]} />
</GanttComponent></div>)
};
ReactDOM.render(<App />, document.getElementById('root'));<!DOCTYPE html>
<html lang="en">
<head>
<title>Syncfusion React Gantt</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Essential JS 2 for React Components" />
<meta name="author" content="Syncfusion" />
<link href="https://cdn.syncfusion.com/ej2/31.2.12/material.css" rel="stylesheet" type="text/css"/>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<style>
#loader {
color: #008cff;
height: 40px;
left: 45%;
position: absolute;
top: 45%;
width: 30%;
}
</style>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='root'>
<div id='loader'>Loading....</div>
</div>
</body>
</html>
- You can disable the column menu for a specific column by setting column.showColumnMenu to false.
Render nested column menu items
Extend the column menu in Gantt component by adding nested items using the columnMenuItems property. This property accepts an array of built-in item names or custom objects to define additional actions.
The following example demonstrates how to configure columnMenuItems to include a nested menu.
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, Inject, Sort, Filter, Resize, ColumnMenu } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App() {
const taskFields = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
const columnMenuItems = [
'SortAscending',
'SortDescending',
'Group',
'Ungroup',
'Filter',
{
text: 'Sub Menu',
items: [
{ text: 'Option 1', id: 'option1' },
{ text: 'Option 2', id: 'option2' },
{ text: 'Option 3', id: 'option3' },
{
text: 'Nested Sub Menu',
items: [
{ text: 'Nested Option 1', id: 'nestedoption1' },
{ text: 'Nested Option 2', id: 'nestedoption2' },
],
},
],
},
];
const columnMenuClick = ((args) => {
if (args.item.id === 'option1') {
// custom function
}
});
return <GanttComponent dataSource={data} taskFields={taskFields}
allowSorting={true} allowFiltering={true} allowResizing={true} showColumnMenu={true} columnMenuItems={columnMenuItems} contextMenuClick={columnMenuClick} height='450px'>
<Inject services={[Sort, Filter, Resize, ColumnMenu]} />
</GanttComponent>
};
ReactDOM.render(<App />, document.getElementById('root'));import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, Inject, Sort, Filter, Resize, ColumnMenu, ColumnMenuClickEventArgs } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App() {
const taskFields: any = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
const columnMenuItems = [
'SortAscending',
'SortDescending',
'Group',
'Ungroup',
'Filter',
{
text: 'Sub Menu',
items: [
{ text: 'Option 1', id: 'option1' },
{ text: 'Option 2', id: 'option2' },
{ text: 'Option 3', id: 'option3' },
{
text: 'Nested Sub Menu',
items: [
{ text: 'Nested Option 1', id: 'nestedoption1' },
{ text: 'Nested Option 2', id: 'nestedoption2' },
],
},
],
},
];
const columnMenuClick = ((args: ColumnMenuClickEventArgs) => {
if (args.item.id === 'option1') {
// custom function
}
});
return <GanttComponent dataSource={data} taskFields={taskFields}
allowSorting={true} allowFiltering={true} allowResizing={true} showColumnMenu={true} columnMenuItems={columnMenuItems} contextMenuClick={columnMenuClick} height='450px'>
<Inject services={[Sort, Filter, Resize, ColumnMenu]} />
</GanttComponent>
};
ReactDOM.render(<App />, document.getElementById('root'));<!DOCTYPE html>
<html lang="en">
<head>
<title>Syncfusion React Gantt</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Essential JS 2 for React Components" />
<meta name="author" content="Syncfusion" />
<link href="https://cdn.syncfusion.com/ej2/31.2.12/material.css" rel="stylesheet" type="text/css"/>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<style>
#loader {
color: #008cff;
height: 40px;
left: 45%;
position: absolute;
top: 45%;
width: 30%;
}
</style>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='root'>
<div id='loader'>Loading....</div>
</div>
</body>
</html>Customize the column menu icon
Customize the default column menu icon in Gantt component by overriding the .e-icons.e-columnmenu class using the content CSS property. This allows you to use a Unicode character or a custom icon font.
To customize the column menu icon, follow these steps:
1. Add custom CSS to override the default icon:
.e-gantt .e-columnheader .e-icons.e-columnmenu::before {
content: "\e99a";
}2. Import the required icon stylesheets (e.g., Material or Bootstrap5):
<link href="https://cdn.syncfusion.com/ej2/ej2-icons/styles/material.css" rel="stylesheet" />
<link href="https://cdn.syncfusion.com/ej2/ej2-icons/styles/bootstrap5.css" rel="stylesheet" />import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, Inject, Sort, Filter, Resize, ColumnMenu } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App(){
const taskFields = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
return <GanttComponent dataSource={data} taskFields={taskFields}
allowSorting={true} allowFiltering={true} allowResizing={true} showColumnMenu = {true} height = '450px'>
<Inject services={[Sort, Filter, Resize, ColumnMenu]} />
</GanttComponent>
};
ReactDOM.render(<App />, document.getElementById('root'));import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { GanttComponent, Inject, Sort, Filter, Resize, ColumnMenu } from '@syncfusion/ej2-react-gantt';
import { data } from './datasource';
function App(){
const taskFields: any = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
return <GanttComponent dataSource={data} taskFields={taskFields}
allowSorting={true} allowFiltering={true} allowResizing={true} showColumnMenu = {true} height = '450px'>
<Inject services={[Sort, Filter, Resize, ColumnMenu]} />
</GanttComponent>
};
ReactDOM.render(<App />, document.getElementById('root'));<!DOCTYPE html>
<html lang="en">
<head>
<title>Syncfusion React Gantt</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Essential JS 2 for React Components" />
<meta name="author" content="Syncfusion" />
<link href="https://cdn.syncfusion.com/ej2/31.2.12/material.css" rel="stylesheet" type="text/css" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://cdn.syncfusion.com/ej2/ej2-icons/styles/material.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<style>
#loader {
color: #008cff;
height: 40px;
left: 45%;
position: absolute;
top: 45%;
width: 30%;
}
.e-gantt .e-columnheader .e-icons.e-columnmenu::before {
content: "\e99a";
}
</style>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='root'>
<div id='loader'>Loading....</div>
</div>
</body>
</html>