「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(二)

2024-01-18 13:20

本文主要是介绍「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

在web项目中使用DHTMLX Gantt时,开发人员经常需要满足与UI外观相关的各种需求。因此他们必须确定JavaScript甘特图库的自定义能力,因此本文仅继续介绍DHTMLX Gantt的自定义用例。

DHTMLX Gantt v8.0正式版下载

在这个系列的文章中,您将学习如何使用DHTMLX Gantt组件构建类似jira的项目路线图。在上文中(点击这里回顾>>)主要介绍了项目路线图的用例、时间刻度和Today标记定制等,本文将继续讲解如何实现定制,持续关注我们哦~

定制指南
工作项的自定义图标

在路线图时间线中显示的工作项自定义图标可能是这个场景中最奇怪的元素,我们在之前的文章中解释了它们的含义,现在想揭开这些图标是如何实现的。

在实践中,这些方形图标被添加到时间轴区域的任务中,并使用addTaskLayer方法添加了一个带有自定义元素的附加层。为了确保这些元素在重新初始化后不会消失,您需要在ongantready事件处理程序中添加代码。

gantt.attachEvent("onGanttReady", function () {
gantt.addTaskLayer(function (task) {

addTaskLayer方法适用于所有项目任务,因此您应该首先检查特定任务属性(项)中是否存在已保存的值。

if (task.items) {

对于这样保存的值,您必须为任务创建附加层的主元素。该元素将在函数结束时返回,并且工作项的自定义图标将被添加到其中。

const mainEl = document.createElement('div');

之后,需要遍历task.items中的所有值:

for (timestamp in task.items) {

下一步是获取unix时间戳值并将其转换为日期,结果值应该存储在一个单独的变量中。

const itemDate = new Date(+timestamp);
const value = task.items[timestamp];

使用getTaskPosition方法来指定任务对象和应该显示自定义图标的日期,需要确定图标方块在时间轴上的坐标。

const sizes = gantt.getTaskPosition(task, itemDate, itemDate);

然后需要创建一个HTML元素,在其中指定一个特定的类名和一个值(数字),并添加一个带有任务ID的属性。

const el = document.createElement('div');
el.className = 'work_item';
el.innerHTML = value;
el.setAttribute("data-taskId", task.id);

自定义图标必须显示在单元格的中心,默认情况下,元素宽度为15px。

let elWidth = 15;

因此,如果时间轴单元格宽度的一半小于自定义元素的宽度,则该元素将自动缩小。

let cellWidth = gantt.getScale().col_width;if (elWidth > cellWidth / 2) {
elWidth = cellWidth / 2
}

考虑到元素的宽度和时间轴单元格的宽度,计算将元素放置在单元格中心所需的左边距的数量:

let marginLeft = (cellWidth - elWidth) / 2;

元素的位置(坐标)是用styles指定的:

el.style.left = sizes.left + 'px';
el.style.top = sizes.top + 'px';
el.style.marginLeft = marginLeft + 'px';
el.style.width = elWidth + "px"

工作项的自定义图标默认颜色是灰色的,此选项在未为任务指定其他颜色时使用。如果图标的日期不包括在任务的日期范围内,它将以红色突出显示。

let background = "Gray";
if (+itemDate < +task.start_date || +itemDate > +task.end_date) {
background = "DarkRed";
}

如果自定义图标放置在时间轴上的任务日期内,则其颜色必须取自此任务的父任务。在单个任务和父任务中,自定义图标将具有这些任务的颜色。

else {
if (task.parent) {
const parent = gantt.getTask(task.parent);
background = parent.color || background;
}
else {
background = task.color || background;
}
}

之后使用样式设置图标的颜色,并将其附加到任务附加图层的主要元素上:

el.style.background = background;
el.style.color = "#eee"mainEl.appendChild(el);

为了使自定义图标看起来与任务栏有所不同,我们添加了一个样式规则,使颜色更饱和:

filter: saturate(180%);

这样无论文本的颜色是白色、黑色还是灰色,它都不会影响文本的颜色。

然后,您必须为onEmptyClick事件添加一个事件处理程序。当单击任何时间轴单元格以及没有与任务(如任务栏和任务行)相关联的元素的路线图界面的任何点时,将调用此事件。

gantt.attachEvent("onEmptyClick", function (e) {

首先,尝试使用close()方法获取任务行或自定义图标元素:

const taskRow = e.target.closest(".gantt_task_row");
const customElement = e.target.closest(".work_item");

相对于时间轴的点击位置被保存到一个变量中。

const position = gantt.utils.dom.getRelativeEventPosition(e, gantt.$task_data).x

单击任务行或自定义图标后,您将从HTML元素获得任务ID,然后使用getTask()方法获得任务本身。

const taskId = targetElement.dataset.taskId || targetElement.dataset.taskid;
const task = gantt.getTask(taskId);

之后,需要使用dateFromPos()方法获取点击位置的时间轴日期。日期带有时间参数,因此使用gantt.date.day_start()方法将时间四舍五入到一天的开始会更方便。这一步使得在addTaskLayer()方法中迭代日期元素变得更加容易。

const clickDate = +gantt.date.day_start(gantt.dateFromPos(position));

更多教程内容请下期再见,记得点赞关注收藏哦!

这篇关于「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/619125

相关文章

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

Vue中插槽slot的使用示例详解

《Vue中插槽slot的使用示例详解》:本文主要介绍Vue中插槽slot的使用示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、插槽是什么二、插槽分类2.1 匿名插槽2.2 具名插槽2.3 作用域插槽三、插槽的基本使用3.1 匿名插槽