甘特图组件DHTMLX Gantt用例 - 如何自定义任务、月标记和网格新外观

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。

本文将为大家揭示DHTMLX Gantt自定义的典型用例,包括自定义任务、网格的新外观等,来展示其功能的强大性!

DHTMLX Gantt正式版下载

用例 - 新建项目外观、当前月份标记和可折叠网格

DHTMLX Gantt的默认视图显示写在条形内的项目和任务名称中,项目栏通常具有矩形形状,就像任务栏一样,并且在颜色上与任务不同。然而这并不是在DHTMLX Gantt中显示项目和任务的唯一方法,我们的甘特图库在定制方面非常灵活,并允许多种方式可视化数据。

甘特图组件DHTMLX Gantt用例 - 如何自定义任务、月标记和网格新外观

在这里您可以看到项目用彩色且细的线条和标签很好地描述在顶部,项目日期和持续时间标记在项目名称旁边。因此,最终用户可以很快地掌握每个项目将花费多少时间。

任务标签也位于任务栏的右侧,当前月份在时间标度上清晰地突出显示,以免在时间轴上丢失。此外,还有一个切换按钮,用于折叠网格部分,以便为甘特图腾出更多空间。

这样的自定义有助于工作流的透明性,对于中小型项目尤其有用。它还使您的甘特图更加用户友好,更容易管理,在视图与扩展的网格部分和全屏图表之间切换。

自定义指南

让我们深入研究一下DHTMLX制作的甘特图。

当前月份标记

我们从甘特图时间轴中使用的时间尺度和垂直标记开始,scales的配置通过scales属性指定:

gantt.config.scales = [
{
unit: "quarter", step: 1, format: function (date) {
const quarter = (date.getMonth() % 3) + 1;
const year = date.getFullYear();
return `<b>Q${quarter}</b> ${year}`;
}
},
{
unit: "month", step: 1, format: function (date) {
const monthName = gantt.date.date_to_str("%F")(date)
const nextDate = gantt.date.add(date, 1, "month");
if (+date <= +today && +today <= +nextDate) {
return `<div class="current_month">${monthName}</div>`;
}
else {
return monthName;
}
}
},
]

在scales配置的数组中,我们指定了两种内置的scale类型,“quarter”和“month”。在这两种比例类型的单元格中,可以显示任何值或HTML元素,但它们不会改变单元格的宽度。例如,较低刻度中的一个单元格包含一个自定义元素,该元素带有一个特定的类,用于用CSS样式为该单元格着色。该元素突出显示当前月份,在today参数中指定:

const today = new Date(2023, 05, 18)
const todayMarker = gantt.addMarker({
start_date: today,
css: "today",
});

addMarker()方法中还使用today参数来添加一个突出显示当前月份的垂直标记。在标记配置中,我们指定用于设置标记日期的Date对象和用于添加标记颜色的CSS类。由于没有在addMarker()方法中应用text参数,因此标记将显示为一条简单的线。

任务行为

有必要对与甘特图时间轴上的任务交互多说几句,最终用户可以沿着时间轴将给定的任务移动到任何特定的点,它不会捕捉到任何单元格的开始或结束。为了实现这一点,我们在甘特图中将round_dnd_dates参数的值更改为false。配置对象:

gantt.config.round_dnd_dates = false;

根据这个演示项目的需求,我们还添加了移动项目任务的功能,并禁用了任务之间的依赖关系(链接)和任务进度的显示:

gantt.config.drag_project = true;
gantt.config.drag_progress = false;
gantt.config.drag_links = false;
网格

在甘特图的网格部分,有两列。第一列包含任务的名称,第二列提供任务的时间框架。使用模板函数,您可以在网格列的单元格中添加任何文本或HTML元素:

gantt.config.columns = [
{ name: "text", label: " ", width: 300, tree: true },
{
name: "dates", label: getToggleButton(), align: "center", template: function (task) {
if (task.type == "project") {
return ""
}

return taskDatesFormat(task)
}
},
];

现在我们要关注taskDatesFormat函数,它从任务对象返回所需的字符串:

function taskDatesFormat(task) {
let startMonth = gantt.date.date_to_str("%M");
let endMonth = startMonth;
let day = gantt.date.date_to_str("%j");

if (task.start_date.getMonth() == task.end_date.getMonth()) {
endMonth = gantt.date.date_to_str("");
}
const start_date = `${startMonth(task.start_date)} ${day(task.start_date)} - `;
const end_date = `${endMonth(task.end_date)} ${day(task.end_date)}`;
return start_date + end_date;

}

这个函数的工作原理如下:

  • 它将任务开始日期转换为字符串,从而只显示月份的名称。
  • 如果一个任务在同一个月开始和结束,那么这个月的名称将只在开始日期之前显示。如果开始日期和结束日期属于不同的月份,则开始月份显示在开始日期之前,结束月份显示在结束日期之前。
  • 日期跟在月份的名称后面。

有一个特殊的切换按钮,允许折叠和展开网格部分。为了添加这个按钮,我们在label参数中指定了getToggleButton()函数。根据网格的当前状态,此函数返回不同的值。当按钮被点击时,我们改变grid_width配置中的返回值和宽度:

function toggleGrid() {
if (gridToggleText == "lt") {
gantt.config.grid_width = 80;
gridToggleText = "gt"
}
else {
gantt.config.grid_width = initialGridWidth;
gridToggleText = "lt"
}
gantt.config.columns[1].label = getToggleButton();
gantt.render();
}

或者,可以使用调整大小器更改网格大小。min_grid_column_width参数设置每个列的最小宽度,因此不能使网格小于指定的大小。因为我们的甘特图有两列,min_grid_column_width参数的值是30px,所以最小的网格宽度是60px。

gantt.config.min_grid_column_width = 30;

网格区域中的彩色圆圈在grid_folder模板中指定:

gantt.templates.grid_folder = function (task) {
return `<div style="color:${task.color}" class="project_icon">&nbsp;•&nbsp;</div>`;
};

返回的自定义元素包含一个特殊符号“•”,圆圈的颜色和大小由CSS样式指定。

对于具有子元素的任务,grid_folder模板显示,而对于其他任务,grid_file模板返回空字符串(" "):

gantt.templates.grid_file = function (item) {
return "";
};

task_row_class模板在带有子元素的任务下面隐藏了一个边框:

gantt.templates.task_row_class = function (start, end, task) {
if (task.type == "project") {
return "project_row";
}
};
任务外观

最后让我们介绍一下如何在甘特图中自定义项目和任务,由于任务栏中不应该有文本,task_text模板返回一个空字符串:

gantt.templates.task_text = function (start, end, task) {
return "";
};

在rightside_text模板的帮助下,文本标签显示在右侧:

gantt.templates.rightside_text = function (start, end, task) {
if (task.type != "project") {
return task.text;
}
};

在我们的演示中,rightside_text模板不返回任何项目任务。相反,我们使用addTaskLayer()方法,它允许在甘特图时间轴中显示任何文本或HTML元素。对于项目任务,我们在自定义taskDatesFormat函数的帮助下,以甘特图网格中使用的相同格式返回任务名称、持续时间和日期,这些值用一个特殊的点符号“•”分开,自定义元素的位置是使用getTaskPosition()方法计算的:

gantt.addTaskLayer(function (task) {
if (task.type == "project") {
const sizes = gantt.getTaskPosition(task, task.start_date, task.end_date);
const el = document.createElement('div');
const dot = `<span class="dot">•</span>`
el.innerHTML = task.text + dot + taskDatesFormat(task) + dot + task.duration + "days";
el.style.left = sizes.left + 10 + 'px';
el.style.top = sizes.top + 'px';
el.style.zIndex = 1;
el.style.marginTop = "7px";
el.style.position = "absolute";
el.style.lineHeight = "16px";
return el;
}
});

就是这样!通过这个分步指南,您可以实现相同的结果,并创建一个自定义甘特图,就像我们的用例一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/105391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电力物联网关智能通讯管理机-安科瑞黄安南

众所周知&#xff0c;网关应用于各种行业的终端设备的数据采集与数据分析&#xff0c;然后去实现设备的监测、控制、计算&#xff0c;为系统与设备之间建立通讯联系&#xff0c;达到双向的数据通讯。 网关可以实时监测并及时发现异常数据&#xff0c;同时自身根据用户规则进行…

[AutoSar NVM] 存储服务层(Service)详解

专栏 《深入浅出AutoSAR》。全文 3400 字&#xff0c; 依AutoSAR及公开知识辛苦整理&#xff0c;禁止转载。 接上一讲 [AutoSar NVM] 存储架构 "数据是新时代的石油" -- 克莱门特•M•杜森堡&#xff08;Clement M. Dusenbury&#xff09; 我们深入了解下存储服务层 …

国际腾讯云自主拼装直播 URL教程!!!

注意事项 创建转码模板 并与播放域名进行 绑定 后&#xff0c;转码配置后的直播流&#xff0c;需将播放地址的 StreamName 拼接为 StreamName_转码模板名称&#xff0c;更多详情请参见 播放配置。 前提条件 已注册腾讯云账号&#xff0c;并开通 腾讯云直播服务。 已在 域名…

python二次开发Solidworks:方程式驱动曲线

1、渐开线 import win32com.client as win32 import pythoncomswApp win32.Dispatch(sldworks.application) swApp.Visible True Nothing win32.VARIANT(pythoncom.VT_DISPATCH, None) swModel swApp.ActiveDoc swExt swModel.Extension swSelMgr swModel.SelectionManag…

竞赛 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

Mysql在ubuntu22.04上安装配置

更新并下载Mysql sudo apt update sudo apt install mysql-server启动Mysql服务 sudo systemctl start mysql安全配置 包括设置密码、删除匿名用户、禁止远程root登录等&#xff0c;按提示进行即可。 sudo mysql_secure_installation是否设置密码&#xff1a;是 三种强度密…

Node.js中的单线程服务器

为了解决多线程服务器在高并发的I/O密集型应用中的不足&#xff0c;同时避免早期简单单线程服务器的性能障碍&#xff0c;Node.js采用了基于"事件循环"的非阻塞式单线程模型&#xff0c;实现了如下两个目标&#xff1a; &#xff08;1&#xff09;保证每个请求都可以…

DAY35 435. 无重叠区间 + 763.划分字母区间 + 56. 合并区间

435. 无重叠区间 题目要求&#xff1a;给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 示例 1: 输入: [ […

Babylonjs学习笔记(六)——贴图的使用

书接上回&#xff0c;这里讨论贴图的运用&#xff01;&#xff01;&#xff01; // 创建球网格const ball MeshBuilder.CreateSphere(ball,{diameter:1},scene)ball.position new Vector3(0,1,0)// 创建PRB材质const ballMat new PBRMaterial(pbr,scene)// albedoTexture 反…

LVS-DR模式+keepalived+nginx+tomcat实现动静分离、负载均衡、高可用实验

实验条件&#xff1a; test2——20.0.0.20——主服务器——ipvsadm、keepalived服务 test3——20.0.0.30——备服务器——ipvsadm、keepalived服务 nginx5——20.0.0.51——后端真实服务器1&#xff08;tomcat的代理服务器&#xff09;——nginx服务 nginx6——20.0.0.61—…

python re 使用非捕获组来忽略第一个value的匹配结果

import retext " value1,value2,value3 "pattern r"(?:value\d,){2}value(\d)"match re.search(pattern, text) print(match.group(1)) 其中&#xff0c;(?:...)表示非捕获组&#xff0c;{1}表示匹配前面的模式一次。该正则表达式的含义是&#xff1a…

基于.Net CEF 实现 Vue 等前端技术栈构建 Windows 窗体应用

零、参考资料 1、https://github.com/cefsharp/CefSharp/wiki/Quick-Start-For-MS-.Net-5.0-or-greater 2、https://github.com/cefsharp/CefSharp/wiki/Quick-Start 3、https://github.com/cefsharp/CefSharp/wiki/General-Usage#javascript-integration 一、安装 Nuget 包…

@AutoConfigurationPackage注解类

包名package org.springframework.boot.autoconfigure 方法 String[] basePackages() 向AutoConfigurationPackages中注册的基本包&#xff0c;使用basePackageClasses作为基于字符串的包的类型安全替代方案 Class<?>[] basePackageClasses() 键入basePackage…

抽丝剥茧,Redis使用事件总线EventBus或AOP优化健康检测

目录 前言 Lettuce 什么是事件总线EventBus&#xff1f; Connected Connection activated Disconnected Connection deactivated Reconnect failed 使用 一种另类方法—AOP 具体实现 前言 在上一篇深入浅出&#xff0c;SpringBoot整合Quartz实现定时任务与Redis健康…

使用GoQuery实现头条新闻采集

概述 在本文中&#xff0c;我们将介绍如何使用Go语言和GoQuery库实现一个简单的爬虫程序&#xff0c;用于抓取头条新闻的网页内容。我们还将使用爬虫代理服务&#xff0c;提高爬虫程序的性能和安全性。我们将使用多线程技术&#xff0c;提高采集效率。最后&#xff0c;我们将展…

高等数学教材重难点题型总结(五)定积分

总的来说&#xff0c;只要不定积分掌握得好&#xff0c;基础的定积分肯定没问题&#xff1b;对于考研的话&#xff0c;在定积分定义、牛莱公式、反常积分、审敛法的理解要求更高一些&#xff08;数一还会涉及到伽马函数~&#xff09; 1.利用定义计算定积分 2.定积分的近似计算 …

前端使用 printJS 插件打印多页:第一页空白问题解决

printJS({printable: [data:image/jpg;base64,${this.printData.url}],type: image,style: media print { page {size: auto; margin: 0; } body{margin:0 5px}} // 解决出现多页打印时第一页空白问题 })

Kafka - 深入了解Kafka基础架构:Kafka的基本概念

文章目录 Kafka的基本概念 Kafka的基本概念 我们首先了解一些Kafka的基本概念。 1&#xff09;Producer &#xff1a;消息生产者&#xff0c;就是向kafka broker发消息的客户端2&#xff09;Consumer &#xff1a;消息消费者&#xff0c;向kafka broker获取消息的客户端3&…

linux性能分析(五)如何学习linux性能优化

一 如何学习linux性能优化 强调&#xff1a; 由于知识记忆曲线以及某些知识点不常用,所以一定要注重复习思考&#xff1a; 如何进行能力转义以及能力嫁接? --> 真正站在巨人的肩膀上性能调优的目的&#xff1a; 不影响系统稳定性的资源最大利用化补充&#xff1a; 性能…

数据清洗与规范化详解

数据处理流程&#xff0c;也称数据处理管道&#xff0c;是将原始数据转化为有意义的信息和知识的一系列操作步骤。它包括数据采集、清洗、转换、分析和可视化等环节&#xff0c;旨在提供有用的见解和决策支持。在数据可视化中数据处理是可视化展示前非常重要的一步&#xff0c;…