IT评测·应用市场-qidao123.com技术社区
标题:
vue前端实现 dhtmlxgantt 甘特图(个人需求,不完全)
[打印本页]
作者:
千千梦丶琪
时间:
2025-1-19 15:46
标题:
vue前端实现 dhtmlxgantt 甘特图(个人需求,不完全)
官网地点: dhtmlx-gantt - npm chinese-days - npm
安装:npm i dhtmlx-gantt npm i chinese-days
开发过程中需要判断节假日并置灰显示,利用了插件chinese-days(用于查询中国节假日、调休日、工作日、24节气、以及夏历阳历互转)实现
this.task = { data:[],type: "tasks"}
//获取甘特图数据
public getData(data){
if(data.length){
data.forEach((val:any,index:any)=>{
this.tasks.data.push({
id: val.OBJ_ID,
name: val.TDSB,
start_date: new Date(this.timestampToTime(val.STARTTIME)),
end_date: new Date(this.timestampToTime(val.ENDTIME)),
duration: 20,
open: true, //默认打开,
toolTipsTxt: val.TDSB,
fxdj: val.FXDJ,
index:index,
editable:true,
// progress: 0.6,
//status: "parent",
})
})
}
}
// 判断节假日并设置特殊样式,这里是给节假日设置了特殊的css类名,具体样式具需求自行添加
// chineseDays.isHoliday -- 使用插件 判断这一日期是否为周末节假日
public daysStyle(date: any){
if (chineseDays.isHoliday(date)) return "weekend";
};
// 根据传入数据判断甘特图渲染的颜色
public setDataColor = () => {
this.tasks.data.forEach((item: any) => {
// if (item.fxdj) {
//存在type字段 说明非一级菜单,判断阶段的具体类型 设置不同颜色
if (item.fxdj == 1) {
item.color = "rgba(255, 0, 0,.75)";
item.fxdjmc = "一级(+)";
} else if (item.fxdj == 2) {
item.fxdjmc = "一级";
item.color = "rgb(255, 136, 20,.75)";
} else if (item.fxdj == 3) {
item.fxdjmc = "二级";
item.color = "rgba(86, 146, 240,.75)";
} else if (item.fxdj == 0) {
item.fxdjmc = "无";
item.color = "rgba(0, 176, 80,.75)";
}
// }
});
};
// 初始化渲染甘特图
public initData(){
//自适应甘特图的尺寸大小, 使得在不出现滚动条的情况下, 显示全部任务
// gantt.config.autosize = "xy";
// gantt.config.open_tree_initially = true;
// gantt.config.scale_unit = "day";
gantt.config.min_column_width = 60;
gantt.config.scale_height = 30 * 3;
gantt.config.row_height = 30;
gantt.config.drag_links = false;
gantt.config.drag_move = false;
gantt.config.drag_resize = false;
gantt.config.drag_progress = false;
gantt.config.correct_work_time = false;
gantt.config.editable = true; // 允许编辑(内联编辑)
// 是否有新增弹窗
gantt.config.details_on_create = false;
// 点击进度
gantt.config.details_on_dblclick = false;
gantt.config.order_branch = false;
gantt.config.scroll_size = 15;
// 不同字段对应的编辑配置
var textEditor = {type: "text", map_to: "name"};
var dateEditorS = {type: "date", map_to: "start_date"};
var dateEditorE = {type: "date", map_to: "start_date"};
var durationEditor = {type: "select", map_to: "fxdjmc",options: [
{label:"无",value:'0'},
{label:"一级风险(+)",value:'1'},
{label:"一级风险",value:'2'},
{label:"二级风险",value:'3'},
]};
// 左侧目录菜单展示内容
gantt.config.columns = [
{ name: "check", label: "", width: 40,
template: function(task) {
// 创建一个复选框,并为其添加一个唯一的ID,以便后续操作
var checkboxId = "checkbox_" + task.id;
return "<input type='checkbox' id='" + checkboxId + "' class='gantt_checkbox' />";
},
align: "center" },
{ name: "index", label: "序号", align: "center", width: 40 },
{ name: "name", label: "停电设备", align: "left", width: 230, },
{ name: "start_date", label: "开始时间", align: "center", width: 180 },
{ name: "end_date", label: "结束时间", align: "center", width: 180 },
{ name: "fxdjmc", label: "风险等级", align: "center" },
{ name: "add",label: "", onrender: (item: any) => {return " ";},},
];
// 指向展示详情 -- 鼠标悬浮是否显示
gantt.plugins({
tooltip: true,
});
// 鼠标悬浮内容
gantt.templates.tooltip_text = function (start, end, task) {
return (
"<b>设备名称:</b> " +
task.name +
"<br/><b>开始时间:</b> " +
gantt.templates.tooltip_date_format(start) +
"<br/><b>结束时间:</b> " +
gantt.templates.tooltip_date_format(end)
);
};
gantt.config.auto_types = true;
gantt.config.xml_date = "%Y-%m-%d";
gantt.config.step = 1;
gantt.config.start_on_monday = true;
gantt.config.autoscroll = false;
gantt.config.scroll_on_click = true;
gantt.config.calendar_property = "start_date";
gantt.config.calendar_property = "end_date";
// 左侧表格宽度
gantt.config.autofit = true;
gantt.config.grid_width = 500;
// 右侧表头
gantt.config.scales = [
{ unit: "month", step: 1, format: "%F, %Y" },
{ unit: "week", step: 1, template: this.weekScaleTemplate },
{ unit: "day", step: 1, format: "%d", css: this.daysStyle },
];
// 表单判断假期
gantt.templates.timeline_cell_class = (task, date): any => {
if (chineseDays.isHoliday(date)) {
return "holiday";
}
};
// 设置任务条进度内容 -- 功能不需要
// gantt.templates.progress_text = (start, end, task: any) => {
// return (
// "<div style='text-align:left;color:#fff;padding-left:20px'>" +
// Math.round(task.progress * 100) +
// "% </div>"
// );
// };
//任务条显示内容
gantt.templates.task_text = function (start, end, task) {
// return task.name + '(' + task.duration + '天)';
return "";
};
gantt.i18n.setLocale("cn");
// 设置进度颜色
this.setDataColor();
// 清除缓存
gantt.clearAll();
// 初始化 gantt_here 为dom的Id
gantt.init("gantt_here");
// 数据解析
gantt.parse(this.tasks);
// 监听新增事件
let _this = this;
gantt.attachEvent("onTaskCreated", function (task) {
//console.log(task, "task");
_this.flag = true;
return false;
});
// 为每个复选框添加事件监听器
gantt.eachTask(function(task:any) {
var checkboxId = "checkbox_" + task.id;
var checkbox = document.getElementById(checkboxId);
if (checkbox) {
// 添加change事件监听器
checkbox.addEventListener('change', function() {
// 这里可以执行一些操作,比如更新任务状态或发送Ajax请求
console.log('Task ' + task.id + ' is ' + (_this.checked ? 'checked' : 'unchecked'));
});
}
});
}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4