import React, { Component } from 'react';
import { gantt } from 'dhtmlx-gantt';
import { DoubleRightOutlined } from '@ant-design/icons';
import 'dhtmlx-gantt/codebase/dhtmlxgantt.css';
import './Gantt.css';
/* eslint-disable */
class Gantt extends Component {
state = { expanded: true };
tableHeight = 60;
componentDidMount() {
gantt.plugins({
tooltip: true, // 鼠标划过任务是否显示明细
// auto_scheduling: true,//根据任务之间的关系自动安排任务
// multiselect: true, //为任务激活多任务选择
});
gantt.config.xml_date = '%Y-%m-%d %H:%i'; /* 时间格式 年月日 时分 */
gantt.config.reorder_grid_columns = true; /* 左侧列可拖动 */
gantt.config.grid_elastic_columns = true;
gantt.config.drag_mode = { ignore: 'ignore'};
gantt.config.scale_height = this.tableHeight;
gantt.i18n.setLocale('cn');
// gantt.config.readonly = true;// 只读模式的甘特图
const { tasks } = this.props;
this.setTemplate();
gantt.init(this.ganttContainer);
this.initGanttDataProcessor();
gantt.parse(tasks);
}
shouldComponentUpdate(nextProps, nextState) {
// const { tasks } = nextProps;
// return tasks !== undefined;
return this.props.zoom !== nextProps.zoom || this.state.expanded !== nextState.expanded;
}
componentDidUpdate() {
gantt.clearAll();
const { tasks } = this.props;
this.setTemplate();
gantt.init(this.ganttContainer);
this.initGanttDataProcessor();
gantt.parse(tasks);
}
componentWillUnmount() {
if (this.dataProcessor) {
this.dataProcessor.destructor();
this.dataProcessor = null;
}
}
setZoom = (value) => {
const scale = value.scale !== undefined ? value.scale : 'Minutes';
const step = value.step !== undefined ? value.step : 10;
switch (scale) {
case 'Minutes':
gantt.config.duration_unit = 'minute';
gantt.config.scale_unit = 'day';
gantt.config.date_scale = '%Y-%m-%d';
gantt.setWorkTime({ hours: ['00:30-03:30'] });
gantt.config.scale_height = 60;
gantt.config.min_column_width = 40;
gantt.config.subscales = [
{ unit: 'minute', step, date: '%H:%i' },
];
break;
case 'Hours':
gantt.config.scale_unit = 'day';
gantt.config.date_scale = '%M %d';
gantt.config.scale_height = 60;
gantt.config.min_column_width = 30;
gantt.config.subscales = [
{ unit: 'hour', step, date: '%H' },
];
break;
case 'Days':
gantt.config.min_column_width = 70;
gantt.config.scale_unit = 'week';
gantt.config.date_scale = '%Y-%m-%d';
gantt.config.subscales = [
{ unit: 'day', step, date: '%M %d' },
];
gantt.config.scale_height = 60;
break;
case 'Months':
gantt.config.min_column_width = 70;
gantt.config.scale_unit = 'month';
gantt.config.date_scale = '%F';
gantt.config.scale_height = 60;
gantt.config.subscales = [
{ unit: 'week', step, date: '#%W' },
];
break;
default:
break;
}
}
initGanttDataProcessor =() => {
// eslint-disable-next-line prefer-destructuring
const onDataUpdated = this.props.onDataUpdated;
if (this.dataProcessor) {
this.dataProcessor.destructor();
this.dataProcessor = null;
}
this.dataProcessor = gantt.createDataProcessor((type, action, item, id) => {
return new Promise((resolve) => {
if (onDataUpdated) {
onDataUpdated(type, action, item, id);
}
// if onDataUpdated changes returns a permanent id of the created item, you can return it from here so dhtmlxGantt could apply it
// resolve({id: databaseId});
return resolve();
});
});
}
setTemplate = () => {
const { tasks } = this.props;
if (Array.isArray(tasks?.columns)) {
gantt.config.columns = tasks?.columns;
}
gantt.config.show_grid = this.state.expanded;
gantt.templates.tooltip_text = function (start, end, task) {
return (
'标题: ' +
task.text +
'
开始: ' +
gantt.templates.tooltip_date_format(start) +
'
结束: ' +
gantt.templates.tooltip_date_format(end) +
'
进度: ' +
Math.round(task.progress * 100) +
'%'
);
};
}
render() {
const { zoom } = this.props;
this.setZoom(zoom);
return (