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

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

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

DHTMLX Gantt v8.0正式版下载

在这个系列的文章中,您将学习如何使用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}" data-status=${item.key}></div>`;
html += el;}

使用onTaskClick事件处理程序使状态任务在点击状态列中的方块后发生变化:

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;

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经典目标检测YOLO系列(三)YOLOv3的复现(2)正样本的匹配、损失函数的实现

经典目标检测YOLO系列(三)YOLOv3的复现(2)正样本的匹配、损失函数的实现 我们在之前实现YOLOv2的基础上&#xff0c;加入了多级检测及FPN&#xff0c;快速的实现了YOLOv3的网络架构&#xff0c;并且实现了前向推理过程。 经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构…

将应用的log4j换成logback

将应用的log4j换成logback 考虑到log4j很久不更新、性能相对弱&#xff0c;以及一些项目本身的原因&#xff0c;经过较为谨慎的考虑&#xff0c;决定改用logback。迁移还是比较顺利的&#xff0c;花了1个小时左右就搞定了&#xff0c;做个简单的笔记。 (1) 首先去掉所有log4j…

MFC串行化的应用实例

之前写过一篇MFC串行化的博文;下面看一个具体例子; 新建一个单文档应用程序;在最后一步,把View类的基类改为CFormView; 然后在资源面板编辑自己的字段; 然后到doc类的头文件添加对应变量, public:CString name;int age;CString sex;CString dept;CString zhiwu;CStrin…

C#中的装箱和拆箱操作详解

在C#中&#xff0c;“装箱”&#xff08;Boxing&#xff09;和"拆箱"&#xff08;Unboxing&#xff09;是类型转换的过程&#xff0c;特别是在值类型和引用类型之间的转换。 1、 装箱&#xff08;Boxing&#xff09; 装箱是指将一个值类型&#xff08;例如整数、浮…

蓝桥杯2024/1/31----第十届省赛题笔记

题目要求&#xff1a; 1、 基本要求 1.1 使用大赛组委会提供的国信长天单片机竞赛实训平台&#xff0c;完成本试题的程序设计 与调试。 1.2 选手在程序设计与调试过程中&#xff0c;可参考组委会提供的“资源数据包”。 1.3 请注意&#xff1a; 程序编写、调试完成后选手…

JAVA Web 学习(二)ServLet

二、动态web 资源开发技术——Servlet Servlet&#xff08;小服务程序&#xff09;是一个与协议无关的、跨平台的Web组件&#xff0c;由Servlet容器所管理。运行在服务器端&#xff0c;可以动态地扩展服务器的功能&#xff0c;并采用“请求一响应”模式提供Web服务。 Servlet的…

将java对象转换为json字符串的几种常用方法

目录 1.关于json 2.实现方式 1.Gson 2.jackson 3.fastjson 3.与前端的联系 1.关于json JSON是一种轻量级的数据交换格式。它由Douglas Crockford在2001年创造。JSON的全称是JavaScript Object Notation&#xff0c;它是一种文本格式&#xff0c;可以轻松地在各种平台之间传…

一文详解docker compose

文章目录 1、前言2、Compose 简介3、compose的安装和卸载3.1、安装3.2、卸载3.3、使用 4、yml 配置指令参考5、Compose 命令说明5.1、命令对象与格式5.2、命令选项5.3、命令使用详细说明 6、compose使用案例6.1、准备6.2、Dockerfile 文件6.3、docker-compose.yml6.4、使用 Com…

C#学习笔记_类(Class)

类的定义 类的定义是以关键字 class 开始&#xff0c;后跟类的名称。类的主体&#xff0c;包含在一对花括号内。 语法格式如下&#xff1a; 访问标识符 class 类名 {//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方…

基于低代码的管理系统模板库的设计与实现

近年来&#xff0c;随着企业管理需求的不断增长&#xff0c;传统的软件开发方式显得过于繁琐&#xff0c;低代码开发平台应运而生。本文基于低代码开发理念&#xff0c;探讨了管理系统模板库的设计与实现&#xff0c;旨在提高开发效率、降低系统维护成本&#xff0c;并使管理系…

EXCEL VBA调用百度API翻译

EXCEL VBA调用百度API翻译 Public Function translateZh_En(ByVal str As String) As String调用百度翻译API&#xff0c;将指定内容由中文翻译为英文Dim par As StringDim data() As Stringpar generateReqStr(str, "zh", "en")data() translateJson(g…

正则表达式与文本三剑客

目录 一、正则表达式 1. 定义 2. 字符匹配 3. 重复限定符 4. 位置锚点 5. 分组和引用 6. 扩展正则表达式 二、文本三剑客 1. grep 1.1 定义 1.2 语法 1.3 选项 1.4 示例 2. sed 2.1 定义 2.2 通式 2.3 选项 2.4 脚本格式&#xff08;脚本语法&#xff09; 2.…

【Unity3D小功能】Unity3D中Text使用超链接并绑定点击事件

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中遇到了要给Text加超链接的需求&#xff0c;研究了实现…

什么样的评论更容易得到别人的关注

要发表吸引人的评论&#xff0c;可以注意这些个方面&#xff1a; 合适的软件&#xff1a;用DT浏览器的笔记本写文本&#xff0c;保存为图片&#xff0c;用图片的方式评论更容易得到别人的关注。 特别的观点&#xff1a;发表与众不同的观点&#xff0c;或者从不同的角度看待问…

USACO 1月比赛 铜组题解

比赛链接&#xff1a;http://usaco.org/ 第一题&#xff1a;MAJORITY OPINION 标签&#xff1a;思维、模拟题意&#xff1a;给定一个长度为 n n n的序列 a a a&#xff0c;操作&#xff1a;若区间 [ i , j ] [i,j] [i,j]内某个数字 k k k出现的次数 大于区间长度的一半&#…

已解决解决java.util.concurrent.BrokenBarrierException异常的正确解决方法,亲测有效!!!

已解决解决java.util.concurrent.BrokenBarrierException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 总结 在并发编程中&#xff0c;CyclicBarrier是Java提供的一个同步辅助工具类&#xff…

WiFi基础知识介绍(超详细)

1.WiFi专业名词概念 AP(Access Point):无线接入点&#xff1a;这个概念特别广&#xff0c;在这里&#xff0c;用大白话说&#xff0c;你可以把CC3200当做一个无线路由器&#xff0c;这个路由器的特点不能插入网线&#xff0c;没有接入Internet&#xff0c;只能等待其他设备的链…

C语言中的数组操作技巧:提升程序的效率和可读性

1. 概念 数组是C语言中常见且重要的数据结构&#xff0c;在许多应用中都被广泛使用。合理地处理数组操作可以提高程序的效率和可读性。本文将介绍C语言中常用的数组操作方法和技巧&#xff0c;帮助读者优化数组操作并提升程序效果。 2.常用的数组操作方法 2.1 数组的初始化 C…

canvas自定义扩展方法:文字自动换行

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

hyperf 二十四 模型缓存

教程&#xff1a;Hyperf 一 安装及配置 1.1 安装 目前仅支持redis。 composer require hyperf/model-cache 1.2 配置 配置位置&#xff1a;config/autoload/databases.php 配置类型默认值备注handlerstringHyperf\ModelCache\Handler\RedisHandler::class无cache_keystri…