使用JavaScript日历小部件和DHTMLX Gantt的应用场景(三)

DHTMLX Suite UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件,这些组件可以轻松组合到单个应用程序界面中。

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

DHTMLX Gantt 8.0正式版下载

在项目管理中,合理利用时间起着至关重要的作用。当在甘特图中处理大量任务时,有必要腾出时间来指定它们的持续时间。因此,用日历功能来补充它是一个好主意,这样可以更方便地进行时间管理,您可以依赖经过时间验证的DHTMLX Calendar,替代使用某些第三方工具。

在这篇博文中,您将学习使用Suite UI库中的JavaScript日历小部件和DHTMLX Gantt的场景。

在上文中(点击这里回顾>>),我们为大家介绍了“开始日期和结束日期”这个使用场景,接下来将介绍第三个场景,一起来看看吧~

日历在弹出式菜单编辑截止日期

使用JavaScript日历小部件和DHTMLX Gantt的应用场景

最后我们想与您分享如何使用DHTMLX Suite库中的Calendar小部件在甘特图时间轴中演示任务截止日期。

这种自定义看起来很不寻常,所以让我们介绍一下它在实践中应该如何工作。在时间轴上双击截止日期元素后,可以更改截止日期或将其删除。如果给定的任务没有截止日期,而最终用户希望添加此参数,则只需双击时间轴中所需的任务行并添加截止日期。

现在,我们进入这个自定义的实现阶段。

在这种情况下,使用额外的层绘制最后期限。自定义元素使用属性进行补充,其中应该指定任务ID。

gantt.attachEvent("onGanttReady", function () {
gantt.addTaskLayer(function drawPlanned(task) {
if (task.deadline) {
const sizes = gantt.getTaskPosition(task, task.deadline, task.deadline);
const el = document.createElement('div');
el.className = 'deadline';
el.setAttribute("data-taskId", task.id);
el.style.left = sizes.left + 'px';
el.style.top = sizes.top + 7 + 'px';
return el;
}
return false;
});
});

双击鼠标的事件处理程序以以下方式添加:

window.addEventListener('dblclick', function (e) {

使用此处理程序,您可以检查是否已经打开了用于编辑截止日期的对话框窗口。如果是,则必须使用return语句终止函数。

if (document.querySelector(".deadline_editor")) {
return
}

接下来应该做的是获取截止日期的DOM元素或时间轴中的任务行。

const deadlineNode = e.target.closest(".deadline");
const taskRowNode = e.target.closest(".gantt_task_row");const targetNode = deadlineNode || taskRowNode;

DOM元素的属性帮助您获取任务ID,该ID将在getTask()方法中用于获取任务对象。

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

如果在时间轴上双击单元格后,它已经有了截止日期,那么该操作很可能不是为了更改截止日期,而是为了更改其他内容。因此在这种情况下,应该用return语句结束函数。

if (taskRowNode && task.deadline) {
return
}

然后您必须为一项任务设定截止日期,从任务的相应截止日期属性中获取。如果任务没有截止日期,则需要从时间轴中的单击中获取日期,为此使用getRelativeEventPosition()方法。该方法的第一个参数是click事件itself (`e`),第二个参数是时间轴的DOM元素,该方法将返回时间轴中的点击位置。接下来,使用dateFromPos()方法从单击位置获取日期。

let deadlineDate;
if (task.deadline){
deadlineDate = new Date(task.deadline);
}
else {
const clickPos = gantt.utils.dom.getRelativeEventPosition(e, gantt.$task_data);
deadlineDate = gantt.dateFromPos(clickPos.x);
}

下面的步骤是创建一个弹出实例并向其添加HTML内容,将有保存更改、删除截止日期的按钮,以及用于选择日期和时间的日历本身。

const popup = new dhx.Popup({
css: "deadline_editor dhx_widget--bordered"
});
popup.attachHTML("<div id='form_container'></div><div id='calendar_container'></div>");

之后,日历显示在单击的元素下面。

popup.show(targetNode);

日历只有在重新绘制后才能添加到弹出框中,因此您需要将以下代码放入函数中,该函数将在弹出式重绘后启动:

dhx.awaitRedraw().then(function () {
// code
});

当重新绘制弹出窗口时,需要添加一个新的日历实例。在本例中,您指定容器的ID,日历应该在容器中初始化。

const calendar = new dhx.Calendar("calendar_container", {
value: deadlineDate,
dateFormat: gantt.config.date_format,
timePicker: true,
css: "dhx_widget--bordered"
});

下一步是添加一个事件处理程序,该处理程序将在日历中选择日期或时间时触发,并将所选日期添加到deadlineDate变量。

calendar.events.on("change", function (date) {
deadlineDate = date;
});

现在是时候创建一个表单了,您可以在其中显示两个按钮。在CSS属性中,指定dhx_widget-border_bottom来在按钮下呈现框架,并在视觉上将带有按钮的表单与日历分开。在align参数中,可以设置页面宽度的对齐方式。

const form = new dhx.Form("form_container", {
rows: [
{
css: "dhx_widget--border_bottom",
align: "evenly",
cols: [
{ name: "save", view: "flat", text: "Save", type: "button", },
{ name: "delete", view: "link", text: "Delete", type: "button", },
]
},
]
});

最后您必须向表单添加事件处理程序,当按钮被点击时,这些处理程序将被触发。在一个事件处理程序中,您可以为任务指定截止日期值,而在另一个事件处理程序中,您应该删除截止日期属性。之后,更新任务并隐藏弹出窗口。

form.getItem("save").events.on("click", function (events) {
task.deadline = deadlineDate;
gantt.updateTask(task.id);
popup.hide();
});form.getItem("delete").events.on("click", function (events) {
if (task.deadline) {
delete task.deadline;
gantt.updateTask(task.id);
}
popup.hide();
});

这就是使用DHTMLX Suite库中的日历小部件在甘特图时间轴中实现任务截止日期的方法。

总结

根据上面指南提供的说明,您可以在基于DHTMLX Gantt的项目管理应用程序中有效使用DHTMLX Suite的日历小部件的三个选项。

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

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

相关文章

匝间冲击耐压试验仪产品介绍及工作原理

产品简介 武汉凯迪正大KD2684S匝间冲击耐压试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题&#xff0c;以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等&#xff0c;都会造…

在线投票系统源码 网上投票平台创建 安全稳定 支持自定义投票规则+礼物道具功能

分享一款在线投票系统源码&#xff0c;是一款功能丰富、安全稳定的网络投票平台解决方案。通过本源码&#xff0c;用户可以轻松创建并管理各种在线投票活动&#xff0c;支持自定义投票规则&#xff0c;同时集成礼物道具功能&#xff0c;增强用户参与度和投票活动的趣味性&#…

2024 年 电工杯(B题)大学生数学建模挑战赛 | 平衡膳食食谱 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 CS团队倾注了大量时间和心血&#xff0c;深入挖掘解决方案。通…

常用的框架——— Android UtilCode

AndroidUtilCode是一个功能强大且易于使用的Android库。该库封装了Android开发中经常使用的具备完整演示和单元测试的功能。经过使用其封装的API&#xff0c;能够大大提升开发效率。该程序主要由两个模块组成&#xff0c;utilcode&#xff08;一般在开发中使用&#xff09;和su…

【真人Q版手办风】线稿手绘+ AI绘图 Stable Diffusion 完整制作过程分享

大家好&#xff0c;我是设计师阿威。 今天给大家分享一篇【真人Q版卡通手办】风格的制作过程&#xff0c;话不多说&#xff0c;进入正题。 成品预览 手绘线稿 首先&#xff0c;我使用的是老款手绘软件【SAI】&#xff0c;用[钢笔工具]进行了人物的线稿Q版描绘。&#x1f447…

巨控无线通讯模块在煤化工皮带保护系统中的应用

一、项目介绍 近年来由于煤矿化工行业在实际生产过程中事故频发&#xff0c;国家安监部门自2022年起开展了为其三年的专项整治行动&#xff0c;皮带运输系统作为煤矿化工行业自动化系统的重要组成部分成为此次专项整治重点。 兖矿新疆能化有限公司作为山能集团在新疆分部的龙…

如何为海量计数场景设计缓存体系?no.34

计数常规方案 计数服务在互联网系统中非常常见&#xff0c;用户的关注粉丝数、帖子数、评论数等都需要进行计数存储。计数的存储格式也很简单&#xff0c;key 一般是用户 uid 或者帖子 id 加上后缀&#xff0c;value 一般是 8 字节的 long 型整数。 最常见的计数方案是采用缓存…

常见的100个Shell命令,超级实用!

在大多数的Linux和Unix系统、及其他类Unix系统中&#xff0c;Shell是用户与操作系统内核交互的主要方式。作为一种强大的命令行解释器&#xff0c;它也支持编程功能&#xff0c;用户可以写脚本来处理各种任务。 熟悉shell脚本&#xff0c;首先要对shell指令熟悉&#xff0c;今…

Vue3学习-用 vite@latest 初始化项目后,遇到无法识别 .vue 文件

引入app界面遇到 我的解决方案 1.根目录创建 env.d.ts&#xff0c;添加 declare module "*.vue" {import type { DefineComponent } from "vue"const vueComponent: DefineComponent<{}, {}, any>export default vueComponent }2.在 tsconfig.json…

基于ARM|DSP+FPGA+NVIDIA AI平台的摄像头ISP图像画质调试定制服务

基本框架及算法介绍 ISP(Image Signal Processor)&#xff0c;即图像处理&#xff0c;主要作用是对前端图像传感器输出的信号做后期处理&#xff0c;主要功能有线性纠正、噪声去除、坏点去除、内插、白平衡、自动曝光控制等&#xff0c;依赖于ISP才能在不同的光学条件下都…

scroll-snap-type——有滚动容器下吸附至吸附点的严格程度——css基础

scroll-snap-type有滚动容器下吸附至吸附点的严格程度&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/CSS/scroll-snap-type 此属性不为吸附点指定任何确切的动画或运行规律&#xff0c;留待用户代理处理。 //不吸附 scroll-snap-type:none; //表示吸附轴的关键字…

IPD在卷烟工业企业研发管理中应用

一、 什么是IPD IPD是Integrated Product Development几个英文单词的缩写&#xff0c;译成汉语就是“集成产品研发”&#xff0c;是上世纪九十年代以来世界上盛行的企业产品研发管理的成功模式。下文中汉捷咨询对IPD的由来进行分享。 最先将IPD付诸实践的是美国IBM公司。1992…

AI绘图副业创收,热门擦边变现赛道怎么玩?网友:瑟瑟才是人类前进的动力!

大家好&#xff0c;我是设计师阿威 今天给大家介绍一个用 AI 搞擦边的变现赛道 而且可以说是0 成本变现的 现在真的越来越多的人都想 0 成本变现&#xff0c;那么 0 成本到底能不能变现&#xff0c;变现的上下限又是多少&#xff1f; 今天这个案例就可以很好的进行说明 可以…

路由引入实验(华为)

思科设备参考&#xff1a;路由引入实验&#xff08;思科&#xff09; 技术简介 路由引入技术在网络通信中起着重要的作用&#xff0c;能够实现不同路由协议之间的路由传递&#xff0c;并在路由引入时部署路由控制&#xff0c;实现路径或策略的控制 实验目的 不同的路由协议之…

python web自动化(Pytest实战)

1.UnitTest框架与Pytest框架对⽐ 1&#xff09; unittest框架介绍 Unittest则是Python语⾔的标准单元测试框架。 Unittest⽀持⾃动化测试&#xff0c;测试⽤例的初 始化、关闭和测试⽤例的聚合等功能&#xff0c;它有⼀个很重要的特性&#xff…

深度学习-转置卷积

转置卷积 转置卷积&#xff08;Transposed Convolution&#xff09;&#xff0c;也被称为反卷积&#xff08;Deconvolution&#xff09;&#xff0c;是深度学习中的一种操作&#xff0c;特别是在卷积神经网络&#xff08;CNN&#xff09;中。它可以将一个低维度的特征图&#x…

Java面试八股之有哪些线程安全的集合类

Java中有哪些线程安全的集合类 在Java中&#xff0c;并非所有的集合类都是线程安全的&#xff0c;但在多线程环境下&#xff0c;确保集合操作的线程安全性至关重要。以下是几个典型的线程安全集合类&#xff1a; Vector: 类似于ArrayList&#xff0c;但它是线程安全的。它通过…

搭建python环境

要想能够进行python开发&#xff0c;就需要搭建好python的环境。 需要安装的环境主要是两个部分&#xff1a; 运行环境&#xff1a;python 开发环境&#xff1a;pycharm 官方网站&#xff1a;https&#xff1a;//www.python.org pycharm软件调节字体大小 pycharm 软件调节背…

QT C++ QTableWidget 演示

本文演示了 QTableWidget的初始化以及单元格值改变时响应槽函数&#xff0c;打印单元格。 并且&#xff0c;最后列不一样,是combobox &#xff0c;此列的槽函数用lambda函数。 在QT6.2.4 MSVC2019 调试通过。 1.界面效果 2.头文件 #ifndef MAINWINDOW_H #define MAINWINDOW…

vue小记——小组件(1)

代码&#xff1a; <template><div><el-steps :active"active" finish-status"success" simple><el-step title"数据导入"><i class"fa fa-cloud-upload fa-icon-custom" slot"icon"></i…