使用JavaScript日历小部件和DHTMLX Gantt的应用场景(二)
DHTMLX Suite UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件,这些组件可以轻松组合到单个应用程序界面中。
DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理应用程序的所有需求,是完善的甘特图图表库。
DHTMLX Gantt 8.0正式版下载
在项目管理中,合理利用时间起着至关重要的作用。当在甘特图中处理大量任务时,有必要腾出时间来指定它们的持续时间。因此,用日历功能来补充它是一个好主意,这样可以更方便地进行时间管理,您可以依赖经过时间验证的DHTMLX Calendar,替代使用某些第三方工具。
在这篇博文中,您将学习使用Suite UI库中的JavaScript日历小部件和DHTMLX Gantt的场景。
在上文中(点击这里回顾>>),我们为大家介绍了“开始日期的甘特图内联编辑器中的日历”这个使用场景,接下来将介绍第二个场景,一起来看看吧~
甘特图任务Lightbox中的两个日历用于开始日期和结束日期

第二个场景将让您了解如何在任务中用start_date和end_date参数两个日历来丰富lightbox的功能。
在lightbox中,您可以为给定任务设置开始和结束日期。因此您可以显示两个相互关联的日历,一个与开始日期绑定,另一个与结束日期绑定。
标准lightbox部分不适合这个目的,所以您需要创建一个自定义的lightbox部分。
从render()方法开始,您应该在其中添加HTML元素,以显示具有任务持续时间的两个日历,该函数在lightbox打开时被调用。
render: function (sns) {
return `<div class='dhx_calendar_cont'>
<input type="text" id="startDateCalendar" readonly data-widget-control style="margin-left: 10px;">
–
<input type="text" id="endDateCalendar" readonly data-widget-control style="margin-left: 10px;">
<label id='duration'></label>
</div>`;
},
在set_value中,将日历添加到为它们准备的容器中。
首先,为开始日期创建一个新的日历对象。我们在上面解释了这些参数的目的,所以我们不会再讨论这个问题,继续往下。
const startDateCalendar = new dhx.Calendar(null, { value: task.start_date, dateFormat: "%d %F %Y %H:%i", timePicker: true, css: "dhx_widget--bordered" });
之后,创建一个新的弹出对象,并在其中添加startDate日历。
const startDatePopup = new dhx.Popup();
startDatePopup.attach(startDateCalendar);
后续的操作算法类似于使用内联编辑器的场景。您需要为输入元素指定日期值,当单击该元素时,应该显示带有日历的弹出菜单。
const startDateInput = node.querySelector("#startDateCalendar");
startDateInput.value = startDateCalendar.getValue();startDateInput.addEventListener("click", function () {
startDatePopup.show(startDateInput);
});
当日历中的日期或时间发生变化时,使用updateDuration()方法更新输入元素的日期值。
startDateCalendar.events.on("change", function () {
startDateInput.value = startDateCalendar.getValue();
updateDuration()
});
您还必须调用一个函数,该函数根据start_date和end_date输入元素的值计算新的任务持续时间。计算出值后,更新duration元素的值。当持续时间大于1时,需要添加“s”,表示任务持续时间为几天。
function updateDuration() {
const startDate = strToDate(startDateCalendar.getValue());
const endDate = strToDate(endDateCalendar.getValue());const duration = gantt.calculateDuration({ start_date: startDate, end_date: endDate, task });
const durationEl = node.querySelector("#duration");
let postfix = " day";
if (duration > 1) {
postfix += "s"
}
durationEl.innerHTML = duration + postfix;
}
end_date的日历以同样的方式添加,只是变量名不同。
const endDateCalendar = new dhx.Calendar(null, { value: task.end_date, dateFormat: "%d %F %Y %H:%i", timePicker: true, css: "dhx_widget--bordered" });const endDatePopup = new dhx.Popup();
endDatePopup.attach(endDateCalendar);const endDateInput = node.querySelector("#endDateCalendar");
endDateInput.value = endDateCalendar.getValue();endDateInput.addEventListener("click", function () {
endDatePopup.show(endDateInput);
});endDateCalendar.events.on("change", function () {
endDateInput.value = endDateCalendar.getValue();
// uncomment to hide the popup with calendar after changing the date
// endDatePopup.hide();
updateDuration()
});
现在是连接日历的时候了。这里的一个基本条件是,第一个日历(start_date日历)的日期不能大于第二个日历(end_date日历)的日期。因此如果您必须将一个特定的任务推迟到一个较晚的日期,首先您必须更改它的结束日期。如果日历没有相互链接,则可能会为任务设置不正确的日期,并且它们不会显示在时间轴中。
startDateCalendar.link(endDateCalendar);
当数据保存在lightbox中时调用get_value()方法,在此方法中,您根据输入元素的值更新任务日期。
get_value: function (node, task) {
const startDateInput = node.querySelector("#startDateCalendar");
const endDateInput = node.querySelector("#endDateCalendar");
task.start_date = strToDate(startDateInput.value);
task.end_date = strToDate(endDateInput.value);
return task;
},
要成功地用DHTMLX Calendar扩展lightbox功能,您应该知道的就是这些。
未完待续,篇幅有限,下期继续讲~
相关文章:
使用JavaScript日历小部件和DHTMLX Gantt的应用场景(二)
DHTMLX Suite UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件,这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理应用…...
springboot整合redis多数据源(附带RedisUtil)
单数据源RedisUtil(静态) 单数据源RedisUtil,我这里implements ApplicationContextAware在setApplicationContext注入redisTemplate,工具类可以直接类RedisUtil.StringOps.get()使用 package com.vehicle.manager.core.util;import com.alibaba.fastjson.JSON; import lombok.e…...
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
文章目录 一、什么是SSE二、SSE技术的基本原理三、SSE适用于场景四、Node服务端示例1、协议2、格式3、事件3.1、事件3.2、事件唯一标识符3.3、重连事件 4、具体示例 五、客户端示例1、检测客户端是否支持SSE2、创建客户端连接3、事件监听4、接收事件5、自定义事件6、错误处理7、…...
Apache Flume事务
Apache Flume 中的事务处理是指 Flume Agent 在处理事件流时的一种机制,用于确保数据的可靠传输和处理。 1. 事务概述: Flume 中的事务是指一组事件的传输和处理,这些事件在传输过程中要么全部成功完成,要么全部失败࿰…...
根据部门id删除该部门下的员工(事务)
application.properties: 或: application.yml: 新表: 日志对象类: 日志service类: 日志service接口: 日志mapper类: 部门service类: 员工mapper类:...
Java之String类
一、String类常用方法 1.引用类型的比较 我们知道在Java中两个引用遍历是不能用" "号来比较的,而String类重写了父类objects的equals方法, 实现了引用类型的比较 例子 import java.util.Scanner; public class Main { public static void…...
es终止快照恢复进程的方法
方法1、删除索引可以终止,恢复进程。 DELETE index_* // 按通配符删除以index_开头的索引 DELETE _all // 删除全部索引 POST *,-.*/_close 关闭索引 POST *,-.*/_open 打开索引 DELETE *,-.* 删除全部索引方法2、强制重启es 集群也可也终…...
ubantu安装rabbbitmq
ubantu安装rabbbitmq 安装Erlang1、在linux下直接安装2、上传Erlang文件后解压 安装rabbitmq开启web管理接口创建用户及修改guest密码,删除guest默认账号 安装Erlang 1、在linux下直接安装 #运行以下命令直接安装: sudo apt-get install erlang#可运行…...
了解 条码工具 Dynamsoft 在条码读取器中的形态运算
在图像处理中,术语形态学是指分析形状以填充小孔、去除噪声、提取轮廓等的一组操作。形态学操作很像空间卷积中的过滤过程。有两个部分在起作用:结构元素和预定义的计算规则。 点击下载Dynamsoft最新版https://www.evget.com/product/3691/download 结…...
NIO和NIO.2对比
Java NIO (New Input/Output) 是从Java 1.4版本开始引入的一个新的I/O API,用于替代原来的BIO(Blocking I/O)API。NIO提供了更加灵活和高效的网络通信方式,特别适合于高吞吐量的网络编程。NIO的主要特点是非阻塞模式,它…...
Google准备好了吗?OpenAI发布ChatGPT驱动搜索引擎|TodayAI
在科技界波澜壮阔的发展中,OpenAI正式宣布其最新突破——一个全新的基于ChatGPT技术的搜索引擎,旨在直接挑战谷歌在搜索领域的统治地位。这一创新将可能彻底改变用户上网搜索的方式。 据悉,这款AI驱动的搜索引擎利用了ChatGPT的强大功能&…...
乐观锁、悲观锁、互斥锁、读写锁
乐观锁和悲观锁是两种不同的锁机制,用于在多线程环境下解决资源竞争问题。互斥锁和读写锁是两种常见的锁类型,它们都可以用来实现乐观锁或悲观锁。 乐观锁 是一种无锁机制,它假设在多线程环境下对共享资源的操作不会发生冲突,因…...
Gin入门指南:从零开始快速掌握Go Web框架Gin
官网:https://gin-gonic.com/ GitHub:https://github.com/gin-gonic 了解 Gin Gin 是一个使用 Go 语言开发的 Web 框架,它非常轻量级且具有高性能。Gin 提供了快速构建 Web 应用程序所需的基本功能和丰富的中间件支持。 以下是 Gin 框架的一些特点和功能: 快速而高效:…...
Scala里的class、object、case class、case object 、trait
Class(类) 定义和作用 Scala 中的 class 是一种蓝图,用于创建对象(实例)。它定义了对象的状态和行为。类可以包含字段(属性)和方法(函数)。类可以有构造器,…...
移动端自动化测试工具 Appium 之 main 启动
文章目录 一、背景二、生成xml文件2.1、创建xml方法2.2、执行主类MainTest2.3、自动生成的xml2.4、工程目录2.5、执行结果 三、命令行执行appium服务四、主方法启动类五、集成Jenkins六、总结 一、背景 Jenkins 做集成测试是不错的工具,那么UI自动化是否可以&#…...
WT32-ETH01作为TCP Client进行通讯
目录 模块简介WT32-ETH01作为TCP Client设置电脑作为TCP Server设置连接并进行通讯总结 模块简介 WT32-ETH01网关主要功能特点: 采用双核Xtensa⑧32-bit LX6 MCU.集成SPI flash 32Mbit\ SRAM 520KB 支持TCP Server. TCP Client, UDP Server. UDP Client工作模式 支持串口、wif…...
jni 返回二维byte数组
在JNI中返回二维byte数组,你需要在Java中准备一个相应的二维数组来接收这个返回值。在JNI层面,你可以创建一个二维的byte数组,并使用GetByteArrayRegion和SetByteArrayRegion来操作它。 以下是一个简单的例子: public class Jni…...
“webpack-dev-server --config build/webpack.dev.conf.js” 请问这个问题要如何修复
解决方案 修改部署方式: 使用 webpack 来打包你的项目,生成静态文件。在生产环境中,使用 Nginx 或其他 HTTP 服务器来提供服务,而不是使用 webpack-dev-server。 Dockerfile 调整: 确保 Dockerfile 中使用的命令是用于…...
TOOL使用fiddler导出的har文件导入到postman测试接口
在fiddler操作 export → File → Export Sessions → alls-->http arch v1.1 导出的har文件直接拖入到浏览器的调试工具中, 然后复制为curl,导入到postman中即可!...
第十三届蓝桥杯决赛(国赛)真题 Java A 组【原卷】
文章目录 发现宝藏【考生须知】试题 A: 火柴棒数字试题 B: 小蓝与钥匙试题 C: 内存空间试题 D: 斐波那契数组试题 E: 交通信号试题 F: 数组个数试题 G: 六六大顺试题 H : \mathrm{H}: H: 选素数试题 I: 图书借阅试题 J \mathrm{J} J : 括号序列树 发现宝藏 前些天发现了一个…...
Mamba模型实战:如何用Python快速搭建一个长序列处理Demo(附代码)
Mamba模型实战:如何用Python快速搭建一个长序列处理Demo(附代码) 在自然语言处理和时间序列分析领域,处理长序列数据一直是个棘手的问题。传统Transformer架构虽然表现出色,但随着序列长度增加,其计算复杂度…...
5分钟搞定Qwen2-7B本地部署:从GGUF下载到API调用的保姆级教程
5分钟极速部署Qwen2-7B:从模型下载到API调用的实战手册 在人工智能技术快速迭代的今天,能够在本地高效运行大语言模型已成为开发者的一项核心竞争力。Qwen2-7B作为当前最受关注的中等规模开源模型之一,以其出色的中文理解能力和适中的硬件需求…...
为Jetson AGX添加自定义硬件:手把手编写设备树节点驱动LED与PPS
Jetson AGX硬件扩展实战:从设备树节点到LED与PPS驱动开发 在嵌入式开发领域,Jetson AGX Xavier凭借其强大的计算能力和丰富的接口资源,成为工业控制、机器人视觉等高性能场景的首选平台。但要让这块开发板真正发挥潜力,掌握自定义…...
OpenClaw备份策略:ollama-QwQ-32B自动化管理NAS存储的方案
OpenClaw备份策略:ollama-QwQ-32B自动化管理NAS存储的方案 1. 为什么需要自动化备份方案 去年冬天的一次硬盘故障让我彻底改变了数据管理方式。当时我的NAS中存储着近5年的家庭照片和视频,由于没有完善的备份机制,差点永久丢失这些珍贵记忆…...
163MusicLyrics全能工具:三步搞定音乐歌词高效解决方案
163MusicLyrics全能工具:三步搞定音乐歌词高效解决方案 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 163MusicLyrics是一款专注于音乐歌词获取与管理的开源…...
零基础极速上手:十分钟用AI建站工具做出你的第一个网站
# 痛点共情:完全不懂技术,真的能自己做出吗?\你可能连“域名”和“服务器”都分不清,看到代码就头疼,更别说设计排版了。但心里又确实需要个网站:不管是展示作品、推广小店,还是给简历加分。你担…...
Android TTS自定义开发:从0到1打造专属语音引擎
Android TTS自定义开发:从0到1打造专属语音引擎 【免费下载链接】tts-server-android 这是一个Android系统TTS应用,内置微软演示接口,可自定义HTTP请求,可导入其他本地TTS引擎,以及根据中文双引号的简单旁白/对话识别朗…...
SAR ADC与Sigma Delta ADC:速度与精度的技术博弈
1. ADC基础:模拟世界与数字世界的桥梁 当你用手机录音时,麦克风捕捉到的声波是连续变化的模拟信号,但手机存储的却是0101的数字文件。这个神奇转换的背后功臣就是模数转换器(ADC)。作为连接物理世界与数字系统的关键部…...
RocketMQ Dashboard监控告警配置全攻略:集成Prometheus+Grafana+钉钉
RocketMQ企业级监控告警体系构建指南:从Dashboard到智能预警 1. 监控体系架构设计基础 在分布式消息中间件的运维实践中,一套完善的监控告警系统如同人体的神经系统,能够实时感知集群状态并及时响应异常。RocketMQ Dashboard作为官方提供的管…...
告别AP离线!深入浅出解析神州数码AC/AP注册机制:二层发现 vs. DHCP Option 43实战选型
神州数码无线网络部署实战:AC与AP注册机制深度解析 在企业无线网络部署中,AC(无线控制器)与AP(无线接入点)的注册机制是构建稳定无线网络的基础环节。神州数码作为国内领先的网络设备提供商,其A…...
