news 2026/7/24 20:22:58

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(三)

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

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

在这个系列的文章中,您将学习如何使用DHTMLX Gantt组件构建类似jira的项目路线图。在上文中主要介绍了如何实现工作项的自定义图标,本文将继续介绍如何实现工作项的自定义对话框窗口、自定义网格列等,欢迎持续关注!

定制指南
工作项的自定义对话框窗口

在工作项的自定义图标中,可以动态更改显示的数值。为此有必要单击所需的图标,并在打开的对话框窗口中使用三个按钮进行必要的更改。接下来,我们将向您解释如何实现此功能。

您需要使用modalbox()方法来显示自定义对话框窗口,需要指定一个类型为“number”的输入元素,以便更方便地设置值。此窗口还包括保存和取消更改的按钮,以及删除图标值和图标本身的按钮。

将对话框窗口保存为一个变量,以便以后能够访问它并从HTML元素中获取值,而无需在屏幕上看到对话框窗口。

let modalbox = gantt.modalbox({ title: "Work Item", text: `<div><label>Value: <input type='number' min=0 class='items_value' /></label></div>`, buttons: [ { label: "Save", css: "items_button", value: "save" }, { label: "Cancel", css: "items_button", value: "cancel" }, { label: "Delete", css: "items_button", value: "delete" } ],

对话框窗口出现在屏幕上之后,您应该设置任务属性的值。如果给定日期的任务没有值,则将其设置为0。

modalbox.querySelector(".items_value").value = task.items[clickDate] || 0;

在callback()方法中,有必要指定在自定义图标的对话框窗口中的每个按钮被点击后应该发生什么:

  • save – 从HTML元素中获取值,并为自定义图标日期添加/更新该值;
  • delete – 检查任务是否有自定义图标日期的值,如果有,删除该值;
  • cancel – 在我们的示例中没有为这个按钮指定逻辑,但是仍然将它包含在代码中,以便您更容易在这里实现逻辑。
callback: function (result) { switch (result) { case "save": const newValue = modalbox.querySelector(".items_value").value; task.items[clickDate] = +newValue; gantt.updateTask(task.id); break; case "cancel": break; case "delete": if (task.items[clickDate]) { delete task.items[clickDate]; gantt.updateTask(task.id); } break; } }
自定义网格列

路线图的网格部分还包括一些应该从编程角度解释的专栏,本文中我们讨论的是三列——物品、故事点和状态。

我们从“Items” 一栏开始,每个任务的工作项总数可以在相应的网格列中找到。由于在列配置中使用了模板函数,因此可以显示这些值。应该提到的是,“故事点”列中的值是有依赖关系的,没有描述点的任务也应该有0个工作项。

name: "items", label: "Items", align: "center", width: 40, resize: true, template: function (task) { let total = 0; if (task.story_points && task.items) { for (item in task.items) { total += task.items[item]; } } return total; }

为了简化故事点的编辑,您需要向相应的网格列添加一个内联编辑器。

const storyPointsEditor = { type: "number", map_to: "story_points", min: 0 }; ... { name: "story_points", label: "Story Points", align: "center", width: 40, resize: true, editor: storyPointsEditor, template: function (task) { return task.story_points || 0; } },

路线图网格中的“Status” 列显示任务的进度条,可以通过单击所需的状态选项动态更改此参数,状态数据存储在一个单独的数组中:

gantt.serverList("status", [ { key: 0, label: "Pending" }, { key: 1, label: "Ready to Start" }, { key: 2, label: "In Progress" }, { key: 3, label: "Done" }, { key: 4, label: "On Review" }, { key: 5, label: "Accepted" }, ]);

lightbox配置有一个“select”类型的标准部分(即这种类型的部分在甘特图中可用),该列表取自数组gantt.serverList(" status ")。

{ name: "status", height: 22, map_to: "status", type: "select", options: gantt.serverList("status") },

要在网格中显示自定义状态值,必须在列配置中使用模板选项。然后添加主HTML元素,所有其他元素都应该放在这里,文本状态显示在单元格的顶部。

let statusName = byId(gantt.serverList('status'), task.status); let html = `<div class="status_column"><div class="status_name">${statusName}</div><div class="status_progress">`

配置任务时,需要指定状态值(而不是状态名)。要匹配状态号及其文本,请应用自定义byId函数,它有助于通过状态名的编号找到所需的状态名。

function byId(list, id) { for (var i = 0; i < list.length; i++) { if (list[i].key == id) { return list[i].label || ""; } } return "Pending"; }

每个任务状态都有一个序号,彩色方块的数量由这个序号决定。

在编程上,它以以下方式实现:

  • 使用状态遍历数组中的所有元素,每次添加一个方形HTML元素。
  • 向状态框添加CSS样式,以便在状态数小于或与任务状态数相同时为其上色。
const statuses = gantt.serverList('status'); for (var i = 1; i < statuses.length; i++) { const item = statuses[i]; let filled = ""; if (item.key <= task.status) { filled = "filled" } const el = `<div class="bar ${filled}">gantt.attachEvent("onTaskClick", function (id, e) {

在方形元素中,需要从HTML元素中获取状态号并更改任务对象的状态。之后,应该更新任务以呈现更改。最后,您需要返回false,以便在任务状态改变时不会触发onTaskClick事件。否则,甘特图将从单击的行中选择任务,而不再选择前一个任务。

const statusBar = e.target.closest(".status_progress .bar"); if (statusBar) { const task = gantt.getTask(id); task.status = statusBar.dataset.status; gantt.updateTask(id); return false; } return true;

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 20:22:49

3分钟免费快速汉化Figma:设计师必备的FigmaCN中文插件完整指南

3分钟免费快速汉化Figma&#xff1a;设计师必备的FigmaCN中文插件完整指南 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面烦恼吗&#xff1f;面对复杂的英文菜单…

作者头像 李华
网站建设 2026/7/24 20:20:48

Oracle Create user

sqlplus /nologconn sys/pw123456orcl as sysdbaCREATE USER zengwenfeng IDENTIFIED BY zengwenfeng ; GRANT ALL PRIVILEGES TO zengwenfeng ; COMMIT;C:\Users\Administrator>sqlplus /nologSQL*Plus: Release 11.2.0.1.0 Production on 星期日 12月 24 21:38:24 2023Cop…

作者头像 李华
网站建设 2026/7/24 20:19:35

C++初级项目webserver项目流程介绍(2)

一、引言 C的webserver项目是自己在学完网络编程后根据网课的内容做的一个初级的网络编程项目。 这个项目的效果是可以在浏览器通过输入网络IP地址和端口&#xff0c;然后打开对应的文件目录 效果如下&#xff1a; 也可以打开文件夹后点击目录&#xff0c;打开到对应的文件夹…

作者头像 李华
网站建设 2026/7/24 20:18:43

企业 RAG 的检索注入:让知识库吐出机密文档的攻击面

企业 RAG 的检索注入&#xff1a;让知识库吐出机密文档的攻击面 一、检索结果成为新的攻击入口 RAG 系统让大模型用企业私有知识回答问题。有人觉得只要不把机密写进模型权重&#xff0c;把知识放向量库按权限检索就够安全&#xff0c;这个判断只对了一半。问题在于&#xff1a…

作者头像 李华
网站建设 2026/7/24 20:17:48

PHY 芯片接口直连(不使用变压器)的设计

1.基础知识网口 PHY 芯片对 TX 和 RX 信号有两种驱动方式&#xff1a;电压驱动和电流驱动。不同的驱动方式决定了 PHY 在与变压器连接的时候&#xff0c;变压器的中心抽头的接法。电压型中心抽头通过电容接到地&#xff0c;电流型中心抽头上拉至VDD&#xff0c;VDD为PHY的供电电…

作者头像 李华
网站建设 2026/7/24 20:17:25

【TSP问题】基于遗传算法求解旅行商问题matlab代码

1 算法介绍1.1 TSP介绍“旅行商问题”(Traveling Salesman Problem,TSP)可简单描述为&#xff1a;一位销售商从n个城市中的某一城市出发&#xff0c;不重复地走完其余n-1个城市并回到原出发点&#xff0c;在所有可能路径中求出路径长度最短的一条。旅行商的路线可以看作是对n城…

作者头像 李华