「实战应用」如何可视化 DHTMLX Scheduler 中的资源工作量?

DHTMLX Scheduler是一个全面的 UI 组件,用于处理面向业务的 Web 应用程序中复杂的调度和任务管理需求。但是,某些场景可能需要自定义解决方案。例如,如果项目的资源(即劳动力)有限,则需要确保以更高的精度分配他们的工作量。为此,应用条形图等数据可视化工具会很有用。

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

DHTMLX Scheduler 最新版下载   DHTMLX Suite 最新版下载

在本教程中,您将学习如何将我们的 Scheduler 组件连接到DHTMLX Suite中的 JavaScript Chart 库,从而增强对调度应用程序任何视图中的资源工作负载的控制。

DHTMLX Scheduler 与 Suite 图表库的连接指南

如果您需要在我们的JavaScript 调度库中添加一种用于管理资源工作量的辅助机制,您可以使用基于 Suite 的 Chart 小部件的条形图对其进行补充,如下面的示例所示。使用此示例,您可以更改员工的工作时间,这些更改将动态显示在图表中。此外,您还可以通过单击图表图例中的员工姓名来隐藏和显示两个小部件中特定员工的数据。

步骤 1:初始化并配置调度程序

一般来说,DHTMLX Scheduler 可以通过调度程序的标记或标头配置属性在页面上初始化。

在这篇文章中,我们使用第二种选择:

scheduler.init ( " scheduler_here " , new Date ( 2024 , 5 , 24 ) , "week" ) ;

现在,我们进行调度程序配置:

  • 限制显示的工作时间,并将时间步长设置为30分钟:
scheduler.config.first_hour = 9;
scheduler.config.last_hour = 22;
scheduler.config.time_step = 30;
scheduler.config.cascade_event_display = true;
  • 添加通过灯箱将事件分配给不同人员/员工的功能,并根据他们的工作场所为其着色。为此,您需要创建一个员工数组 ( owner_opts ),并将他们的选择控件添加到灯箱:
let owners = [{ key: 1, label: 'John' },{ key: 2, label: 'Hannah' },{ key: 3, label: 'David' }
];scheduler.locale.labels.section_select = 'Owner';scheduler.config.lightbox.sections = [{ name:"text", height:50, map_to:"text", type:"textarea", focus:true },{ name:"select", height:40, map_to:"owner_id", type:"select", options:owners},{ name:"time", height:72, type:"time", map_to:"auto"}
];scheduler.templates.event_class = function(start, end, ev){return `owner_${ev.owner_id}`;
}
  • 在 CSS 文件中设置这些事件的样式:
<style>.owner_1 {--dhx-scheduler-event-background: #394E79;--dhx-scheduler-event-color: white;}.owner_2 {--dhx-scheduler-event-background: #5E83BA;--dhx-scheduler-event-color: white;}.owner_3 {--dhx-scheduler-event-background: #C2D2E9;--dhx-scheduler-event-color: white;}
</style>

接下来,我们转到 DHTMLX 图表。

步骤 2:初始化和配置图表

首先,您需要创建一个配置,在其中指定图表的类型和其他设置。使用getConfig函数:

function getConfig() {return {type: "bar",css: "dhx_widget--bg_white dhx_widget--bordered",
// Set the coordinate axes in accordance with the displayed datascales: {"bottom": {text: "day",textTemplate: function(day) {return day;}},"left":{title: "Hours",max: 24}},
// Configure the chart series  series: [{id: "A",value: "John",fill: "#394E79",color: "none"},{id: "B",value: "Hannah",fill: "#5E83BA",color: "none"},{id: "C",value: "David",fill: "#C2D2E9",color: "none"}],
// Add the chart legend configurationlegend: {series: ["A", "B", "C"],form: "rect",valign: "top",halign: "right"}}
}

之后,使用dhx.Chart对象构造函数初始化条形图:

const chart = new dhx.Chart ( " chart " , getConfig ( ) ) ;

步骤 3:将数据从 Scheduler 传输到 Chart

由于 Scheduler 和 Chart 使用不同的数据格式,因此您需要先转换 Scheduler 数据,然后再将其传输到 Chart。为此,您需要获取一周中每一天的所有事件,计算每个事件的持续时间(以小时为单位),并将这些小时数分配给 3 个不同的对象(您的场景中的对象数量可能不同,我们的演示中有 3 个),具体取决于这些事件分配给哪个所有者。

您需要编写自定义函数并使用部分 Scheduler API:

1.创建calculateEventsLoad()函数:

function calculateEventsLoad(){

2.通过 API 获取调度程序视图日期:

 let state = scheduler.getState();let min = state.min_date;

3.声明变量来存储计算的数据:

  let tempDuration_a, tempDuration_b, tempDuration_c;let workload = [];

4.计算每个业主的工作量:

 for(let i = 0; i<7; i++){tempDuration_a = 0;tempDuration_b = 0;tempDuration_c = 0;

5.获取一周中每一天的活动:

 let dayEvs = scheduler.getEvents(scheduler.date.add(new Date(min), i, "day"), scheduler.date.add(new Date(min), i+1, "day"));

6.计算每个业主的活动工作量:

              dayEvs.forEach(ev => {const duration = (ev.end_date - ev.start_date) / (1000 * 60 * 60);switch (ev.owner_id) {case "1":tempDuration_a += duration;break;case "2":tempDuration_b += duration;break;case "3":tempDuration_c += duration;break;}});

7.将结果数据推送到数组中,并将该数据传递给图表组件:

workload[i] = {"workload_a": tempDuration_a,"workload_b": tempDuration_b,"workload_c": tempDuration_c,"day": scheduler.date.add(new Date(min), i, "day").getDate()};}generateChartData(workload);
}

8.创建将准备好的数据转换为图表格式并将其解析为图表的函数:

function generateChartData(workload){// Generate and parse prepared chart's dataconst chartData = workload.map(el => ({day : el.day,"John" : el.workload_a,"Hannah" : el.workload_b,"David" : el.workload_c,}));chart.data.parse(chartData);

调用calculateEventsLoad()函数时,您将看到包含准确数据的图表和调度程序。

步骤 4:将 Scheduler 与 Chart 同步

最后,您需要同步组件以确保在调度日历中所做的更改将立即显示在条形图中。您应该使用调度程序事件侦听器将调度程序更新同步到图表中,如下例所示:

scheduler.attachEvent("onEventChanged", function(id,ev){calculateEventsLoad();
});scheduler.attachEvent("onEventAdded", function(id,ev){calculateEventsLoad();
});scheduler.attachEvent("onEventSave",function(id,ev,is_new){calculateEventsLoad();return true;
})scheduler.attachEvent("onViewChange", function (new_mode , new_date){calculateEventsLoad();
});

步骤 5:同步 Chart 和 Scheduler 中的过滤功能

条形图带有过滤功能,可以通过单击图表的图例来显示和隐藏特定员工的数据。您可以将此过滤功能与调度程序同步,以在那里过滤事件。

首先,您需要创建一个变量来存储过滤器值:

const filterOptions = new Set([1, 2, 3]);

然后,创建一个辅助函数来改变这个变量:

function setFilter(ownerID){if(filterOptions.has(ownerID)){filterOptions.delete(ownerID);}else{filterOptions.add(ownerID);}scheduler.setCurrentView();
}

使用图表组件的toggleSeries事件单击图表图例中的复选框后,将调用此辅助函数:

chart.events.on("toggleSeries", function(id){switch (id) {case "A":setFilter(1);break;case "B":setFilter(2);break;case "C":setFilter(3);break;}
});

现在,您应该使用结果数组在调度程序中进行过滤:

scheduler.filter_week = function(id, event){return filterOptions.has(parseInt(event.owner_id));
}

就是这样。按照上述步骤,您可以像我们的示例中那样使用条形图来丰富您的 JavaScript 调度程序,以更准确地管理资源工作负载。

总结

正确使用资源是任何项目中有效任务管理的关键方面。使用 JavaScript 调度日历,您必须确保资源(员工、房间、设备)以最佳方式加载任务或约会。使用附加工具(例如 Suite 的 Chart 小部件)可以更全面地了解此事,本教程提供了快速顺利完成集成所需的所有信息。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

RNA-seq 差异分析的点点滴滴(2)

引言 本系列[1]将开展全新的转录组分析专栏&#xff0c;主要针对使用DESeq2时可能出现的问题和方法进行展开。 Tximeta&#xff1a;自动导入并附加元数据 Bioconductor 家族中的 tximeta 包&#xff0c;在 tximport 的基础上进行了扩展&#xff0c;不仅保留了原有功能&#xff…

Pycharm PyQt5 环境搭建创建第一个Hello程序

第一步: 创建Pycharm项目,下载包: pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/下载好了之后,可以看到相应包: PyQt5:PyQt5是一套Python绑定Digia QT5应用的框架。Qt库是最…

安装luasocket模块时提示“sudo: luarocks:找不到命令“问题,该如何解决?

大家好&#xff0c;我是袁庭新。分享一个我在使用luarocks来安装luarocks模块报错的解决方法。 在Unix系统中安装LuaRocks。本文我以CentOS 7.x系统为例&#xff0c;来讲解如何安装LuaRocks。 $ cd /opt $ wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz $ tar …

Axure安装步骤及免费替代方案

Axure作为一款强大的原型设计工具&#xff0c;因其丰富的功能而受到设计师的青睐。它包括动态面板、复杂表格编辑、协同设计和高保真原型设计等&#xff0c;这些功能可以简化复杂的设计流程&#xff0c;提高团队效率。本文将介绍Axure的安装方法&#xff0c;并探索一款新兴的Ax…

分布式数据库:架构、优势与实践应用

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 分布式数据库在现代信息技术中扮演着至关重要的角色&#xff0c;尤其在需要处理大规模数据和实现高可用性、可扩展性的应用中更是…

小试银河麒麟系统OCR软件

0 前言 今天在国产电脑上办公&#xff0c;需要从一些PDF文件中复制文字内容&#xff0c;但是这些PDF文件是图片转换生成的&#xff0c;不支持文字选择和复制&#xff0c;除了手工输入&#xff0c;我们还可以使用OCR。 1 什么是OCR OCR &#xff08;Optical Character Recogni…

np.zeros_like奇怪的bug

import numpy as np aa np.array([[1,2,3],[2,3,3]]) cc np.random.randn(2,3) print(aa) print(cc)bb np.zeros_like(aa) print(bb)for i in range(bb.shape[0]):for j in range(bb.shape[1]):bb[i,j] cc[i,j]print(bb)结果如下 这里发现这个bb的结果是没有赋值的 正确做…

C++(Qt)软件调试---内存泄漏分析工具MTuner (25)

C(Qt)软件调试—内存泄漏分析工具MTuner &#xff08;25&#xff09; 文章目录 C(Qt)软件调试---内存泄漏分析工具MTuner &#xff08;25&#xff09;[toc]1、概述&#x1f41c;2、下载MTuner&#x1fab2;3、使用MTuner分析qt程序内存泄漏&#x1f9a7;4、相关地址&#x1f41…

apk反编译修改教程系列-----apk应用反编译中AndroidManifest.xml详细代码释义解析 包含各种权限 代码含义

在反编译apk应用中。需要增加或者减少有些apk功能或者权限类的修改。其中大多都在于 AndroidManifest.xml文件中。了解AndroidManifest.xml其中每串代码代表的含义对修改apk有着至关重要的作用。 通过博文了解💝💝💝💝 1💝💝💝💝----AndroidManifest.xml中代…

项目功能--运营数据统计

一、需求分析 通过运营数据统计可以展示出体检机构的运营情况&#xff0c;包括会员数据、预约到诊数据、热门套餐等信息。我们要通过一个表格的形式来展示这些运营数据。如下图&#xff1a; 二、代码实现 实现步骤&#xff1a; 步骤一&#xff1a;定义数据模型&#xff0c;通过…

电子制造行业Top5贴片机品牌

在电子制造业的快速发展中&#xff0c;SMT&#xff08;Surface Mount Technology&#xff09;表面贴装技术扮演着至关重要的角色。贴片机作为SMT生产线的核心设备&#xff0c;其性能直接关系到整个生产线的效率和产品质量。 SPEA作为全球领先的自动化测试设备服务商&#xff0…

【maven踩坑】一个坑 junit报错 但真正导致这个的不是junit的原因

目录 事件起因环境和工具操作过程解决办法结束语 事件起因 报错一&#xff1a; Internal Error occurred. org.junit.platform.commons.JUnitException: TestEngine with ID junit-vintage failed to discover tests报错二&#xff1a; Internal Error occurred. org.junit.pl…

拷贝和浅拷贝的区别,以及对于循环引用如何处理深拷贝

深拷贝和浅拷贝的区别&#xff0c;以及对于循环引用如何处理深拷贝 浅拷贝仅拷贝对象的第一层属性值&#xff0c;对于基本数据类型&#xff0c;会复制其值&#xff1b;对于引用数据类型&#xff0c;仅复制引用地址而不复制实际的对象内容。浅拷贝后的新对象与原对象中的引用类…

gitlab与jenkins

一 gitlab代码仓库 1.1 gitlab简介 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用 Git 作为代码管理工具&#xff0c;并在此基础上搭建起来的 web 服务。GitLab 具有很多功能&#xff0c;比如代码托管、持续集成和持续部署&#xff08;CI/CD&#xff09;、问题跟踪…

LeetCode 86.分隔链表

题目&#xff1a; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 思路&#xff1a; 代码&#xff1a; /*** Definiti…

Qt/C++ 开源控件 可折叠的标签管理控件

在 Qt 开发中&#xff0c;许多项目需要处理标签管理功能&#xff0c;例如分类管理、标签筛选等需求。本文将分享如何利用 Qt/C 实现一个具备动态增删标签、展开折叠功能的控件。此控件由 TagWindow 和 TagItemWidget 两个类组成&#xff0c;前者负责整个标签管理窗口的布局与逻…

Jmeter中的监听器(三)

9--断言结果 功能特点 显示断言结果&#xff1a;列出所有断言的结果&#xff0c;包括通过和失败的断言。详细信息&#xff1a;显示每个断言的详细信息&#xff0c;如断言类型、实际结果和期望结果。错误信息&#xff1a;显示断言失败时的错误信息&#xff0c;帮助调试。颜色编…

七牛云上传图片成功,但是无法访问显示{error : document not found}

上传图片成功&#xff0c;但是访问不了的问题&#xff0c;直接把地址放进浏览器显示{error : document not found}&#xff0c;直接访问 DCNF 404是符合预期的&#xff0c;因为还没有去空间复制外链&#xff0c;要访问实际存在的资源才可以的. 配置区域和访问域名 设置没问题了…

虚拟与现实交融,线上元宇宙会议应用场景有哪些?

随着科技的飞速发展&#xff0c;元宇宙技术正逐渐渗透到我们生活的各个领域&#xff0c;为企业会议、学术会议、行业展会以及文化娱乐等带来了前所未有的变革。线上元宇宙会议打破了地域和物理空间的限制&#xff0c;让人们能够在虚拟世界中实现跨时空的交互与合作。本文将深入…

构建高效在线商店:Spring Boot框架应用

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&#…