# react-gantt-demos
**Repository Path**: qi-jia/react-gantt-demos
## Basic Information
- **Project Name**: react-gantt-demos
- **Description**: react 甘特图 demo
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 1
- **Created**: 2021-04-01
- **Last Updated**: 2024-04-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: gantt, 甘特图
## README
# React Gantt Demos
[](https://www.npmjs.com/package/@dhtmlx/trial-react-gantt)
- Online demo: https://dhtmlx.com/react/demos/gantt/#/base/default
- Code of demos: https://github.com/web-widgets/react-gantt-demos
- Minimal project: https://stackblitz.com/edit/react-gantt-basic
## Getting Started
```npm run start``` Runs the app in the development mode.
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
## Supported functionality
#### Common with DHTMLX Gantt
- adding/editing/deleting tasks and links
- tasks, projects and milestones
- configurable scales and grids
- configurable tooltips
- time markers
#### Unique features
- react widgets can be used for tasks rendering, tooltips and form controls
- all configuration properties are reactive
- full react sources are provided
## Usage
### Installation
- add library to your react project
```js
npm install @dhtmlx/trial-react-gantt
```
This will install trial version, for commercial one, use "@dhx/react-gantt"
- place Gantt tag into the desired page
```jsx
import { Gantt, DefaultTheme } from "@dhtmlx/trial-react-gantt";
export default function GanttBasic() {
return (
);
}
```
You can check the demo of mininal project here - https://stackblitz.com/edit/react-gantt-basic
Source code of the gantt can be checked in node_modules/@dhtmlx/trial-react-gantt/src
### Themes
Package contains two predefined themes - Default and Material.
You can apply theme by wrapping Gantt into DefaultTheme or MaterialTheme tags
```jsx
```
or you can just add theme tag on the page and add skin class to one of Gantt's parent tags
```jsx
```
### Initialization
You can define scales/columns/tasks/links during Gantt initialization
```jsx
```
where data may look like next
```js
const scales = [
{ unit: "month", step: 1, format: "MMMM yyy" },
{ unit: "day", step: 1, format: "d" }
];
const columns = [
{ name: "text", label: "Task name", width: "100%" },
{ name: "start", label: "Start time", align: "center" },
{ name: "duration", label: "Duration", width: "70px", align: "center" },
{ name: "add-task", label: "", width: "50px", align: "center" }
];
const tasks = [
{
id: 1,
open: true,
start_date: "2020-11-06",
duration: 8,
text: "React Gantt Widget",
progress: 60,
type: "project"
},
{
id: 2,
parent: 1,
start_date: "2020-11-06",
duration: 4,
text: "Lib-Gantt",
progress: 80
}
];
const links = [
{ source: 2, target: 1, type: 0 }
];
```
### Integration with backend
Check
https://github.com/web-widgets/react-gantt-demos/blob/master/src/GanttBackend.js
Code defines the action handler through **save** property. This handler will be triggered on any update and may be used to save changes to the persistent storage.
In the above example, the RestDataProvider is used
https://github.com/web-widgets/gantt-data-provider/blob/master/src/providers/rest.ts You are not limited to this solution, though, and can extend the provided class or define a custom handler.
We provide 2 demo backends, with nodejs and go
- https://github.com/web-widgets/gantt-go
- https://github.com/web-widgets/gantt-node
again, you are not limited to this solution. The above RestDataProvider can work with any REST like service and you can implement a fully custom solution ( sockets, graphql, etc. ) through custom save handler.
### Templates
The next elements can be customized through templates
- task text
- sidebar form
check https://github.com/web-widgets/react-gantt-demos/blob/master/src/GanttText.js
- tooltip content
check https://github.com/web-widgets/react-gantt-demos/blob/master/src/GanttTooltips.js
## API
### Properties
```js
// templates for different elements of gantt
let templates = {};
// array of markers
let markers = [];
// supported task types
let taskTypes = ["task", "project", "milestone"];
// tasks data
let tasks = [];
// links data
let links = [];
// time scales configuration
let scales = [
{ unit: "month", step: 1, format: "MMMM yyy" },
{ unit: "day", step: 1, format: "d" },
];
// grid configuration
let columns = [
{ name: "text", label: "Task name", width: "100%" },
{ name: "add-task", label: "", width: "50px", align: "center" },
];
// time scale start
let start = null;
// time scale end
let end = null;
// width of scale cell
let cellWidth = 100;
// height of chart bar
let cellHeight = 38;
// height of scale cell
let scaleHeight = 30;
// readonly mode flag
let readonly = false;
// show or hide grid
let grid = true;
// show or hide tooltips
let tooltip = null;
// show or hide borders in the chart area
let borders = "full";
```
### Callbacks
```js
// will be called with DataStore value on Gantt initalization
let store = null;
// will be called on any action in the Gantt
let actions = null;
// will be called on any data modification in the Gantt
let save = null;
```
### Actions
**Data modifications** ( both *action* and *save* )
- add-link
- update-link
- delete-link
- add-task
- update-task
- delete-task
**UI State** ( *action* )
- data-request
- hide-details
- move-task
- scroll-chart
- select-task
- show-details
- task-toggle
- update-task-time
#### Example of callback usage
```jsx
function handler({ action, obj, id }){
if (action === "select-task")
console.log(`Task ${id} was selected`);
}
```
### Methods
```jsx
let store;
store = v}/>
```
and now you can use store's API to get or modify data.
```ts
interface IStore {
getTask(id:number):GanttItemData;
updateTask(id:number, obj:any, noSave:boolean):void;
updateLink(id:number, obj: any, noSave:boolean):void;
action(id:number, action:string, obj:StringHash, noSave?: boolean):number;
}
```
action method can be used to trigger any of above actions
```js
store.action(taskId, "tasks-toggle");
store.action(linkId, "delete-link");
store.action(null, "add-link", { source: 1, target 2, type: 0 });
```