首页 > 其他分享 >vue2项目中使用dhtmlx gantt甘特图插件

vue2项目中使用dhtmlx gantt甘特图插件

时间:2023-06-01 16:13:48浏览次数:62  
标签:插件 task return text dhtmlx 甘特图 gantt date font

官网示例地址:https://docs.dhtmlx.com/gantt/samples/
可以在这里查看绑定数据的格式


安装依赖

npm install dhtmlx-gantt --save 

创建一个甘特图组件

<template>
  <el-scrollbar ref="gantt_scrollbar" class="gantt-box">
    <div ref="gantt" class="gantt-container"></div>
  </el-scrollbar>
</template>

<script>
import { gantt } from 'dhtmlx-gantt';
import "dhtmlx-gantt/codebase/dhtmlxgantt.css"
export default {
	name: "gantt",
	props: {
		ganttTasks: {
			type: Array,
			default () {
				return []
			}
		}
	},
	data() {
		return {
			ganttData: []
		}
	},
	mounted() {
		this.initGantt() // gantt初始化配置
		this.getGanttData() // 数据format以及gantt reload
	},
	methods: {
		initGantt() {
			let _this = this
			// 在初始化前设置配置项

			// 初始化gantt
			gantt.init(this.$refs.gantt);
			// 绑定数据
			gantt.parse({
				data: [], // 时间轴上横条的数据
				link: [] // 连接线的数据
			});
		},
		reload() {
			gantt.clearAll();// 从甘特图中删除所有任务和其他元素(包括标记)
			gantt.parse({
				data: this.ganttData,
				link: []
			}); // 数据解析
			gantt.render(); // 呈现整个甘特图
		},
		getGanttData() {
			let ganttData = []
			// toDo
			// formatGanttData()
			this.ganttData = ganttData
			this.reload()
		}
	}
}
</script>

<style lang="less" scoped>
	/*@import "dhtmlx-gantt/codebase/dhtmlxgantt.css"*/
	.gantt-container {
		width: 10000px;
		height: 400px;
	}

.gantt-box {
	width: calc(100% - 10px);
	overflow-y: scroll;
	overflow-x: scroll;
	height: 400px;
}
</style>

到这里传入数据就可以显示甘特图啦


配置

gantt.init()

以下是需要在gantt.init前配置好的,放在initGantt()方法里

  • 设置甘特图只读
initGantt() {
	let _this = this
	// gantt只读
	gantt.config.readonly = true;
	
	// 初始化gantt
	gantt.init(this.$refs.gantt);
	// 绑定数据
	gantt.parse({
		data: [], // 时间轴上横条的数据
		link: [] // 连接线的数据
	});
},
  • 设置甘特图的row是否可以选中
gantt.config.select_task  = false;
  • 设置表格列宽自适应
gantt.config.autofit = false;
  • 设置日期格式
gantt.config.xml_date = "%Y/%m/%d";
  • 自定义表格列
    表格列的内容可以通过template返回
gantt.config.columns=[
	{
		name:"text", width: 160, label:"标题", align: "left", tree:true,
		template: function (obj) {
			// 通过 template 回调可以指定返回内容值
			return `
                <div class="gantt-span-${obj.taskType}" style="width:130px;text-overflow:ellipsis;overflow: hidden;">${obj.taskNum}  ${obj.text}</div>
              `;
		},
	}
];

这里要注意,数据有一些字段是必须保留的,包括:

id: stage.id, // id-gantt必填字段
text: stage.stageName, // 名称-gantt必填字段
start_date: stage.createDate.substring(0, 10), // 开始时间-gantt必填字段
duration: stage.duration, //工作时长-gantt必填字段

这里duration字段也可以用end_date代替

  • 添加自定义class,可以用来设置一些特定日期的样式
// 今日高亮
// 周末高亮
// 这里在时间轴表头添加class
var daysStyle = function(date){
	let todayDate = new Date().setHours(0,0,0,0)
	let paramsDate = new Date(date).setHours(0,0,0,0)
	if (todayDate === paramsDate) {
		return "today";
	}
	if (date.getDay() === 0 || date.getDay() === 6){
		return "weekend";
	}
	return "";
};
//这里在时间轴表格内的cell上添加class
gantt.templates.timeline_cell_class = function (item, date) {
	if (date.getDay() == 0 || date.getDay() == 6) {
		return "weekend"
	}
};

<style lang="less" scope>
/* 周末高亮 */
/deep/ .weekend {
	background: #F8F8F8;
	color: #999999!important;
	// height: 47px!important;
}
/* 今日高亮 */
/deep/ .gantt_task_scale {
	.gantt_scale_line > .gantt_scale_cell {
		color: #333333;
		&.today {
			background: #0066FF;
			color: #FFFFFF;
		}
	}
}
</style>
  • 设置时间轴多层表头
gantt.config.scales = [
	{unit: "month", step: 1, format: "%Y/%M"},
	{unit: "day", format: "%d", css:daysStyle}
];
  • 设置条形图里要显示的文字和自定义的class,实现文字、颜色等自定义
// 条形图里的文字
gantt.templates.task_text = function (start, end, task) {
	return `<span style='text-align:left;'>${task.text} # ${task.taskHolder}</span>`;
};
// 条形图自定义class
gantt.templates.task_class = function (start, end, task) {
	return `task-${task.taskType}-${task.status}`
};
  • 行高
gantt.config.scale_height = 60;
gantt.config.task_height = 24;
gantt.config.row_height = 48;
gantt.config.min_column_width = 50;
  • 添加今日标线
// 今日标线需要用到插件marker
// gantt需要用到的插件
gantt.plugins({
	marker: true,
});
let today = new Date();
gantt.addMarker({
	start_date: today,
	css: 'today',
	text: '',
});
  • 添加tooltip
gantt.plugins({
	tooltip: true
});
// 自定义tooltip内容
gantt.templates.tooltip_text = function (start, end, task) {
	const t = gantt;
	const output = `<div style="font-size:14px;padding: 0 10px;width:250px;line-height:20px;white-space:normal;">
		<p style="font-weight:bold;margin: 8px 0;">${task.text}</p>
		<p style="margin: 4px 0;">当前进度:${task.progress*100}%</p>
		<p style="margin: 4px 0;">标准工时:${task.standardTime}</p>
		<p style="margin: 4px 0;">实际工时:${task.actualTime}</p>
		<p style="margin: 4px 0;">工作状态:${task.statusText}</p>
	</div>`;
	return output;
}
  • 设置表头显示中文
gantt.i18n.setLocale("cn");
  • 树形是否自动展开
gantt.config.open_tree_initially = false;
  • 自定义的点击事件
gantt.attachEvent("onTaskClick", function(id,e){
	let box = document.querySelector('.gantt_tooltip');
	if (box) {
		box.parentNode.removeChild(box);
	}
	let classList = e.target.className.split(' ')
	// 这里自定义了展开/收起树形的点击事件
	if (classList.includes('gantt_open')) {
		gantt.open(id); // 展开
		return true
	}
	if (classList.includes('gantt_close')) {
		gantt.close(id); // 收起
		return true
	}
	// 这里是其他的点击事件
	let task = _this.ganttData.find(item => {return item.id == id})
	if (task.taskType === 'stage') {
		// toDo()
		return true
	}
});

gantt.render()

这里因为我的数据需要异步请求格式化,这是gantt已经初始化了,所以需要使用gantt.render()重新渲染
在gantt重新render前,要清除缓存
这里会把一些配置项也清掉,比如今日标线

reload() {
	gantt.clearAll();// 从甘特图中删除所有任务和其他元素(包括标记)
	gantt.parse({
		data: this.ganttData,
		link: []
	}); // 数据解析
	// 今日标线
	let today = new Date();
	gantt.addMarker({
		start_date: today,
		css: 'today',
		text: '',
	});
	gantt.render(); // 呈现整个甘特图
},

style

  • 去掉树形的文件夹图标
/* 去掉文件夹图标 */
/deep/ .gantt_tree_icon {
	&.gantt_folder_closed, &.gantt_file, &.gantt_folder_open {
		display:none
	}
}
/* 把展开收起图标替换成element-ui的icon */
/* 这里没有找到在js中配置图标的方法,为省事,使用css */
/* 扒了element-ui的icon样式表 */
/deep/ .gantt_tree_icon.gantt_open {
	background-image: none;
	font-family: element-icons!important;
	speak: none;
	font-style: normal;
	font-weight: 400;
	font-variant: normal;
	text-transform: none;
	vertical-align: baseline;
	display: inline-block;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	&::before {
		content: "\e6df";
	}
}
/deep/ .gantt_tree_icon.gantt_close {
	background-image: none;
	font-family: element-icons!important;
	speak: none;
	font-style: normal;
	font-weight: 400;
	font-variant: normal;
	text-transform: none;
	vertical-align: baseline;
	display: inline-block;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	&::before {
		content: "\e6e1";
	}
}

实现的效果

image

标签:插件,task,return,text,dhtmlx,甘特图,gantt,date,font
From: https://www.cnblogs.com/ibeyondi/p/17448943.html

相关文章

  • Unity转出FBX模型(Exporter插件)
    Unity转出FBX模型为了解决在Unity场景修改过导出的模型,以后给美工修改不了预制体的问题Unity版本要求:2021.3.6f1c1(包括但不限于此版本以上)下载插件场景中选中模型任意模型点击导出FBX导出模型设置路径......
  • jQuery 是javascript的一个库(常用插件、处理器)
    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validationjQuery就是javascript的一个库,把我们常用的一些功能进行了封装,方便我们来调用,提高我们的开发效率。极大地简化了JavaScript编程。Javascipt跟jQuery的区别:Javascript是一门编程语言,我们用......
  • HTML5 CANVAS 弹幕插件
    概述修改了普通弹幕运动的算法,新增了部分功能详细修改了普通弹幕运动的算法,新增了部分功能,具体请参看附件里的CHANGELOG.md和README.md一、概述说实话,从第二版到现在又过了半年,本来以为可能不会写第三版的,顶多将第二版的代码重构下就可以了,没想到还是花了一个星期左......
  • 使用Paste Image插件来方便的给Markdown添加截图的功能
    日常用vscode写markdown时可能会需要添加截图,这时一般的做法有两种,一种是把图片上传到图床,然后把图片链接写到![]()里另一种是,把图片保存到本地某个目录下,使用相对路径添加图片这两种方式操作起来都比较麻烦,因为都需要先把截图保存下来,所以有没有类似qq,wechat那种可以直接使用截......
  • 别再满屏找日志了!推荐一款 IDEA 日志管理插件,看日志轻松多了!
    1.简介GrepConsole是一款方便开发者对idea控制台输出日志进行个性化管理的插件。2.功能特性GrepConsole的主要功能特性:支持自定义规则来过滤日志信息;支持不同级别的日志的输出样式的个性化配置;总结:通过过滤功能、输出日志样式配置功能,可以更方便开发者在大量的日志信......
  • 利用谷歌浏览器插件Autofill一键提取QQ裙所有QQ邮箱
     众所周知,QQ号是公开的,QQ号加上后缀@qq.com就是QQ邮箱。因此只要获取到一批QQ号就意味着获取到一批QQ邮箱,进而利用邮件群发技术来批量发送邮件获取客户。QQ群是QQ用户最集中的地方,在这里可以快速获取大量精准用户,下面详细讲解方法。如题,第一步:下载谷歌浏览器,然后安装Autofill插件......
  • SOLIDWORKS配置修改插件Solidkits.BOMs工具
    使用SOLIDWORKS配置可以实现在同一个文件中表现不同的产品状态,在某些情况下是非常有用的。当我们想要删除多配置时,就需要一个一个打开模型,选中删除的配置删除,比较麻烦。SOLIDWORKS配置修改插件-Solidkits.BOMs工具就可以实现批量删除配置,比如模型中只想保留默认配置,就可以将模型......
  • 辅助测试和研发人员的一款小插件【数据安全】
    一、为什么要做一款这样的小插件数据,一直在思考如何让数据更安全的流转和服务于客户,围绕这样的想法,我们做过许多方面的扩展。我们落地了服务端的数据切片支持场景化的设计,实现了基于JDBC协议对SQL的拦截与切片,实现了在应用层的全链路数据库审计方案和实现,实现了WEB端明暗水印和文......
  • docker rabbitMQ 安装延时队列插件
    1下载插件到容器内在这个网站上找到插件的下载链接容器内wget或使用dockercp复制到容器内dockercp/rabbitmq_delayed_message_exchange-3.8.0.ezrabbit:/plugins2启用插件#进入容器启用插件dockerexec-itrabbit/bin/bashrabbitmq-pluginsenablera......
  • 辅助测试和研发人员的一款小插件【数据安全】 | 京东云技术团队
    一、为什么要做一款这样的小插件数据,一直在思考如何让数据更安全的流转和服务于客户,围绕这样的想法,我们做过许多方面的扩展。我们落地了服务端的数据切片支持场景化的设计,实现了基于JDBC协议对SQL的拦截与切片,实现了在应用层的全链路数据库审计方案和实现,实现了WEB端明暗水印和文档......