当前位置: 首页 > news >正文

「实战应用」如何用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式的项目路线图(二)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 在web项目中使用DHTMLX Gantt时&#xff0c;开发人员经常需要满足与UI外观相关的各种需求。因此他们必须确定JavaScript甘特图库的…...

Webpack5入门到原理18:Plugin 原理

Plugin 的作用 通过插件我们可以扩展 webpack&#xff0c;加入自定义的构建行为&#xff0c;使 webpack 可以执行更广泛的任务&#xff0c;拥有更强的构建能力。 Plugin 工作原理 webpack 就像一条生产线&#xff0c;要经过一系列处理流程后才能将源文件转换成输出结果。 这条…...

PWM之舵机

舵机又称直流电机&#xff0c;如下图 本节承接上节&#xff0c;具体的PWM技术已经在上一节讲的很详细了&#xff0c;本节就不再讲了&#xff0c;那么我们的重点就放在直流电机的工作原理上了。 一、工作原理 我们研究直流电机&#xff0c;主要式研究直流电机旋转速度的调节&a…...

Python并发与多线程:IO并发(阻塞IO、非阻塞IO、IO多路复用、异步IO)

在Python中&#xff0c;有多种处理并发的方式&#xff0c;其中之一就是使用多线程进行IO并发操作。在IO操作中&#xff0c;有四种常见的方式&#xff1a;阻塞IO、非阻塞IO、IO多路复用和异步IO。 阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;当执行一个IO操作时&…...

React16源码: React中的IndeterminateComponent的源码实现

IndeterminateComponent 1 &#xff09;概述 这是一个比较特殊的component的类型&#xff0c; 就是还没有被指定类型的component在一个fibrer被创建的时候&#xff0c;它的tag可能会是 IndeterminateComponent在 packages/react-reconciler/src/ReactFiber.js 中&#xff0c;有…...

SpringBoot:详解Bean生命周期和作用域

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、生命周期二…...

【图解数据结构】顺序表实战指南:手把手教你详细实现(超详细解析)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;图解数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️线性表1.1 &#x1f514;线性表的定义1.2 &#x1f514;线性表的存储结构 二. ⛳️顺序表…...

WordPress怎么禁用文章和页面古腾堡块编辑器?如何恢复经典小工具?

现在下载WordPress最新版来搭建网站&#xff0c;默认的文章和页面编辑器&#xff0c;以及小工具都是使用古腾堡编辑器&#xff08;Gutenberg块编辑器&#xff09;。虽然有很多站长说这个编辑器很好用&#xff0c;但是仍然有很多站长用不习惯&#xff0c;觉得操作太难了&#xf…...

【HarmonyOS】掌握布局组件,提升应用体验

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…...

第4周:Pytorch——综合应用和实战项目 Day 28-30: 学习资源和社区参与

第4周&#xff1a;综合应用和实战项目 Day 28-30: 学习资源和社区参与 在这个阶段&#xff0c;我们将探索更多的学习资源并鼓励参与PyTorch和TensorFlow的社区&#xff0c;以进一步提升技术和融入开发者社群。 学习资源&#xff1a; 论文&#xff1a;阅读最新的机器学习和深度…...

TypeScript教程(一)在vscode中的配置TypeScript环境

TypeScript教程&#xff08;一&#xff09;在vscode中的配置TypeScript环境 文章目录 TypeScript教程&#xff08;一&#xff09;在vscode中的配置TypeScript环境一、前言二、具体步骤1、Node.js安装2、TypeScript安装3、helloworld 一、前言 未来的开发者们请上座&#xff0c…...

sshpass的安装与使用

一.简介 1.定义&#xff1a; ssh 登陆不能在命令行中指定密码&#xff0c;sshpass 的出现则解决了这一问题。它允许你用 -p 参数指定明文密码&#xff0c;然后直接登录远程服务器&#xff0c;它支持密码从命令行、文件、环境变量中读取。 2.使用 sshpass 原因 使用 sshpass…...

Excel·VBA合并工作簿2

其他合并工作簿的方法&#xff0c;见之前的文章《ExcelVBA合并工作簿》 目录 8&#xff0c;合并文件夹下所有工作簿中所有工作表&#xff0c;按表头汇总举例 8&#xff0c;合并文件夹下所有工作簿中所有工作表&#xff0c;按表头汇总 与之前的文章《ExcelVBA合并工作簿&#x…...

linux内核原理--分页,页表,内核线性地址空间,伙伴系统,内核不连续页框分配,内核态小块内存分配器

1.分页&#xff0c;页表 linux启动阶段&#xff0c;最初运行于实模式&#xff0c;此阶段利用段寄存器&#xff0c;段内偏移&#xff0c;计算得到物理地址直接访问物理内存。 内核启动后期会切换到保护模式&#xff0c;此阶段会开启分页机制。一旦开启分页机制后&#xff0c;内…...

【MongoDB】下载安装、指令操作

目录 1.下载安装 2.指令 2.1.基础操作指令 2.2.增加 2.3.查询 2.4.修改 2.5.删除 前言&#xff1a; 关于MongoDB的核心概念请移步&#xff1a; 【文档数据库】ES和MongoDB的对比-CSDN博客 1.下载安装 本文以安装Windows版本的mongodb为例&#xff0c;Linux版本的其实…...

k8s-pvc/pv扩容记录

背景 一次聊天过程中&#xff0c;对方提及pvc的扩容&#xff0c;虽然有注意过 storageclass 有个AllowVolumeExpansion的配置&#xff08;有些csi插件是不支持该配置的&#xff0c;比如local-volume-provisoner&#xff09;&#xff0c;但是没有实际用过&#xff0c;所以还是心…...

关于Unity插件TriLib使用的一点儿心得

最近做一个项目的时候&#xff0c;由于要求动态加载fbx或者glb等格式文件&#xff0c;而我们自己开发加载插件难度又有点大&#xff0c;所以最后使用了TriLib这个插件&#xff0c;现在说一点使用心得。 由于文件加载之后要对加载的内容进行复制&#xff0c;比如加载一个柱子&am…...

计算机二级Python基本排序题-序号45(补充)

1. 文件"singup.txt”中保存了若干条参加运动会学生的报名记录&#xff0c;每条记录的形式为“班级号_学号”&#xff0c;例如"A1_12”&#xff0c;将每个班级报名情按参加运动会人数从多到少排列&#xff08;假设不存在人数相同的情况&#xff09;并输出&#xff0c…...

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-6 fieldset

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>fieldset</title> </head><body> <form action"#"><fieldset><legend>学生信息</legend>姓名&#xff1a;&…...

html渲染优先级

在前端开发中&#xff0c;优先布局是指在设计和构建页面时&#xff0c;将页面的各个部分按照其重要性和优先级进行排序&#xff0c;并依次进行布局和开发。这种方法可以帮助开发团队在项目初期就确定页面结构的核心部分&#xff0c;从而更好地掌控项目的整体进度和优先级。且确…...

OpenClaw+GLM-4.7-Flash低成本方案:自建模型替代SaaS API

OpenClawGLM-4.7-Flash低成本方案&#xff1a;自建模型替代SaaS API 1. 为什么选择自建模型替代商业API 去年夏天&#xff0c;当我第一次尝试用OpenClaw自动化处理公司周报时&#xff0c;被OpenAI的API账单吓了一跳——简单的文档整理和摘要生成&#xff0c;一个月竟然消耗了…...

步进电机复位翻车实录:从堵转到精准归位的5个调试技巧

步进电机复位翻车实录&#xff1a;从堵转到精准归位的5个调试技巧 去年夏天&#xff0c;我接手了一个工业自动化项目&#xff0c;需要精确控制12台42步进电机同步复位。本以为是个常规任务&#xff0c;结果第一周就遭遇了集体"罢工"——有的电机原地抖动不归零&#…...

谷歌DeepMind与卡内基梅隆大学揭秘声音背后的脸

这项由谷歌DeepMind与卡内基梅隆大学联合开展的研究&#xff0c;发表于2024年的计算机视觉与模式识别顶级会议CVPR&#xff08;IEEE/CVF Conference on Computer Vision and Pattern Recognition&#xff09;&#xff0c;论文编号为arXiv:2404.01975&#xff0c;有兴趣深入了解…...

Windows下Go-FastDFS对象存储系统:从零搭建到可视化管理的完整指南

1. Go-FastDFS简介与核心优势 Go-FastDFS是一个基于HTTP协议的轻量级分布式文件存储系统&#xff0c;特别适合中小型项目快速搭建文件存储服务。我第一次接触这个系统是在2019年&#xff0c;当时需要一个简单易用的文件存储方案来支撑公司内部的文件共享需求。经过对比多个方案…...

基于粒子群优化算法的地表水源热泵机组优化调度 以水源热泵机组角度对地表水源热泵系统建模

基于粒子群优化算法的地表水源热泵机组优化调度 以水源热泵机组角度对地表水源热泵系统建模&#xff0c; 并采用粒子群优化算法优化算法求解热泵机组每小时最佳制冷量和制热量 最近帮朋友做了个小区地表水源热泵的调度优化项目&#xff0c;一开始以为就是调调空调温度&#xf…...

深入解析Cache工作原理与多核一致性机制

深入理解Cache工作原理与技术实现1. 计算机体系中的Cache基础1.1 Cache存在的必要性现代计算机系统中&#xff0c;处理器性能与存储器访问性能之间存在显著差距。从历史发展数据来看&#xff0c;CPU计算性能每18个月翻一番&#xff08;遵循摩尔定律&#xff09;&#xff0c;而D…...

Stable Diffusion ComfyUI进阶:局部重绘与智能扩图的实战技巧与创意应用

1. 局部重绘的核心原理与实战技巧 局部重绘是Stable Diffusion ComfyUI中最实用的功能之一&#xff0c;它允许你在不改变整体构图的情况下&#xff0c;对图像的特定区域进行重新绘制。这个功能背后的技术原理其实很有意思——它利用了潜在空间&#xff08;latent space&#xf…...

MybatisPlus分页插件PaginationInnerInterceptor原理解析与实战配置指南

MybatisPlus分页插件PaginationInnerInterceptor深度剖析与高效实践 当你在Spring Boot项目中处理海量数据时&#xff0c;分页查询就像给数据装上精准导航——而MybatisPlus的PaginationInnerInterceptor正是这个导航系统的核心引擎。不同于简单配置就能用的工具类&#xff0c;…...

LeetCodehot100-2 两数相加

class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {if (l1 nullptr) return l2;if (l2 nullptr) return l1;ListNode* head l1; // 保存头节点ListNode* prev nullptr; // 记录上一个节点&#xff0c;用于连接int carry 0;// 同时遍历…...

3个核心方法实现暗影精灵硬件控制与性能调优:告别原厂软件烦恼

3个核心方法实现暗影精灵硬件控制与性能调优&#xff1a;告别原厂软件烦恼 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 一、痛点解析&#xff1a;原厂游戏控制软件的三大致命伤 1.1 隐私安全隐患&#xff1a;网络连接背…...