前端甘特图组件开发(二)

news2024/11/27 6:20:00

自定义时间轴功能

请添加图片描述

由于常见的甘特图时间轴只支持按照天/周/月/年或者固定的时间单位进行划分,但实际使用场景下有时候会需要按照特定且不规则的时间段对进度数据进行直观划分。因此本组件在原时间轴的基础上添加新的自定义时间轴,可通过数据配置自定义时间段及其标题,具体内容如下。

// 自定义时间轴数据
export const customisedList: Array<any> = [
  { title: '版本1.0', startDate: '2022/9/7', endDate: '2022/9/15' },
  { title: '版本1.1', startDate: '2022/9/15', endDate: '2022/9/24' },
  { title: '版本2.0', startDate: '2022/9/24', endDate: '2022/9/30' },
  { title: '版本2.1', startDate: '2022/9/30', endDate: '2022/10/5' },
  { title: '版本2.2', startDate: '2022/10/5', endDate: '2022/10/13' },
]
<!-- 自定义时间轴 -->
<svg [attr.width]="dateConfig.svgWidth" [attr.height]="timeLineHeight">
  <g *ngFor="let item of dateConfig.customisedList; let i = index;">
    <rect [attr.x]="item.start * squareWidth" [attr.y]="0" [attr.width]="item.length * squareWidth"
      [attr.height]="timeLineHeight" [attr.fill]="i % 2 === 0 ? '#ddd' : '#eee'"></rect>
    <text [attr.x]="(item.start + item.length / 2) * squareWidth - 12" [attr.y]="timeLineHeight / 2 + 4"
      style="font-size: 12px;">{{item.title}}</text>
  </g>
</svg>
// 配置自定义时间轴
private setCustomisedData(): void {
  customisedList.forEach(item => {
    const start = (new Date(item.startDate).getTime() - this.dateConfig.startDate.getTime()) / (24 * 60 * 60 * 1000);
    const length = (new Date(item.endDate).getTime() - new Date(item.startDate).getTime()) / (24 * 60 * 60 * 1000);
    this.dateConfig.customisedList.push({
      title: item.title,
      start,
      length
    })
  })
}

数据交互处理逻辑预留

本甘特图涉及数据的增删改查功能。其中具体的新增、编辑、删除均通过弹窗形式操作,本组件进行预留,此处仅提供点击事件。
① 添加新增按钮列,放置 + 符号
② 为 + 符号绑定单击事件(创建)
③ 为表格行添加双击事件(编辑)
④ 通过 Angular EventEmitter 将事件触发的方法暴露给调用的父组件

注意:双击事件需要特殊处理,以避免重复触发单击事件

// 7. 点击任务自动滚动(单击)
private time: number = 200;
private timeout: any = null;
public scrollToBar(row: any): void {
  clearTimeout(this.timeout); // 清除第一个单击事件
  this.timeout = setTimeout(() => {
    // 单击事件
  }, this.time)
}
// 8. 创建/编辑任务(双击)
@Output() createTask = new EventEmitter();
@Output() createSubTask = new EventEmitter();
@Output() editTask = new EventEmitter();
public editRow(row: any = null, isCreate: boolean = false): void {
  clearTimeout(this.timeout);
  if (isCreate) {
    // 创建数据处理
    if (row) {
      // 创建二级数据
      this.createSubTask.emit(row);
    } else {
      // 创建一级数据
      this.createTask.emit(row);
    }
  } else {
    // 双击编辑数据处理
    this.editTask.emit(row);
  }
}

调用该组件时,定义并传入几个点击事件触发的内容即可。

<app-m-gantt 
  (createSubTask)="createSubTask($event)" 
  (createTask)="createTask($event)"
  (editTask)="editTask($event)">
</app-m-gantt>
// 需要自定义的样式(仅传入需要更改的属性)
public styleOptions = {
  containerWidth: '1600px',
}
// 几个事件触发的函数
public createTask(e: any): void {
  console.log('创建一级数据');
}
public createSubTask(e: any): void {
  console.log('创建二级数据', e);
}
public editTask(e: any): void {
  console.log('编辑数据', e);
}

样式布局调整&样式可配置化

  • 样式布局调整
    ① 时间轴高度从表格高度获取
ngAfterViewInit(): void {
  // 根据表格高度设置进度条行高
  this.lineHeight = document.querySelectorAll('.row')[0].clientHeight;
}

② 表格高度调整
由于表格 td 天然具有 padding: 1px,故需要将其取消,防止表格行高不一致,造成与右侧甘特图行数据无法对齐的问题。

  • 样式可配置化
    ① 将部分样式(例如进度条颜色、高度、表格高度等)进行整合,统一在ts文件中控制。
    ② 使用 Angular 的 @Input 接收调用本组件的父组件传入的样式值进行部分替换,达到自定义的效果。
// 自定义样式(父组件传入)
@Input() options: any;
// 1. 可定义变量
public containerWidth: string = '1500px'; // 容器宽度
// ....

ngOnInit(): void {
  this.preprocessStyles(this.options);
  // ...
}
private preprocessStyles(styles: any): void {
  this.containerWidth = styles.containerWidth || this.containerWidth;
  // ...
}

调用该组件时传入即可

<app-m-gantt [options]="styleOptions"></app-m-gantt>
  • 可配置样式列表
    请添加图片描述
public containerWidth: string = '1500px'; // 1.容器宽度 
public containerHeight: string = 'auto'; // 2.容器高度
public lineHeight: number = 43; // 3.行高
public timeLineHeight: number = 30; // 4.时间轴高度(单层)
public squareWidth: number = 40; // 5.格子宽度
public barHeight: number = 24; // 6.进度条高度
public headHeight: number = 90; // 7.头部整体高度
public progressBarColor: string = '#1e80ff'; // 8.进度颜色
public barColor: string = '#91beff'; // 9.进度条颜色
public subBarColor: string = '#e6a23c'; // 10.子进度颜色
public subProgressBarColor: string = '#f56c6c'; // 11.子进度条颜色
public barFontColor: string = '#fff'; // 12.进度条文字颜色

数据传入&&配置

使用 @Input 接收父组件传入的数据及配置项

  • 数据格式
// 任务数据
public data: Array<any> = [
  { id: '0', name: '任务1', startDate: '2022/9/10', endDate: '2022/9/20', status: '进行中', duration: 10, progress: 0.6 },
  { id: '01', name: '子任务1', startDate: '2022/9/10', endDate: '2022/9/15', status: '进行中', duration: 5, progress: 0.9, parentId: '0' },
  ...
]
// 自定义时间轴数据
public customisedList: Array<any> = [
  { title: '版本1.0', startDate: '2022/9/7', endDate: '2022/9/15' },
  { title: '版本1.1', startDate: '2022/9/15', endDate: '2022/9/24' },
  ...
]
  • 数据预处理
    传入的数据由于有父子级关系,需提前增加部分属性。说明:
    • open:是否展开下属子项
    • show:是否需要显示该项
    • config.openSub:是否在初始化时展开所有子项
// 有下属子项的父项集合
const parents: Array<any> = [];
// 展开子项
if (this.config.openSub) {
  data.forEach(row => {
    row.show = true;
    if (!row.parentId) {
      if (parents.indexOf(row.id) !== -1) {
        row.open = true
      } else {
        row.open = false
      }
    }
  })
} else {
  // 收起子项
  data.forEach(row => {
    if (!row.parentId) {
      row.open = false;
      row.show = true;
    } else {
      row.show = false;
    }
  })
}

其他

部分样式、显示内容暂未实现可配置化,后面有时间会持续完善。
本组件的开发流程希望能提供一种开发各类图表的思路,后续有类似的需求可以参考此思路进行高效开发。

【项目GitHub地址】⭐️

原文地址
【个人博客】⭐️

相关文章
【前端甘特图组件开发(一)】

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

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

相关文章

Spring Bean的作用域

1.写在前面 前面的博客我们已经介绍完Spring的依赖的查找来源&#xff0c;依赖注入的来源等等相关知识&#xff0c;今天我们继续来介绍Spring的Bean的作用域。 2.Spring Bean作用域 作用域 3.“singleton” Bean作用域 配置 4.“prototype” Bean作用域 配置 注意事项 Sp…

[Redis]-持久化方式

[Redis]-持久化方式 森格 | 2022年11月 本文是在学习Redis中&#xff0c;对Redis持久化的个人总结。 一、 持久化与Redis 1.1 什么是持久化 持久化是一种将程序数据在瞬时状态和持久状态间的转换机制&#xff0c;也就是把数据保存到可永久保存的存储设备中去。 1.2 Redis的持…

【Hack The Box】linux练习-- Writer

HTB 学习笔记 【Hack The Box】linux练习-- Writer &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f3…

《web课程设计》使用HTML+CSS制作大学生校园二手交易网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

阿里P8现身说法,解密“架构”原理与实战笔记:从分布式到微服务

分布式架构与微服务平台是当今IT界的关键技术&#xff0c;也是资深软件工程师和系统架构师必须掌握的核心技术。 微服务、云原生、Kubernetes、Service Mesh是分布式领域的热点技术&#xff0c;它们并不是凭空出现的&#xff0c;一定继承了某些“前辈”的优点。我们不仅要了解…

十万部冷知识:足球踢进了观众席,观众能把球拿走吗?

在看足球比赛的时候&#xff0c;我们经常会看到球员一脚射门踢偏了&#xff0c;球被打飞的情况&#xff0c;这时候球可就奔着观众席去了。就是因为考虑到有这种情况的发生&#xff0c;在比赛之前&#xff0c;比赛组织者&#xff0c;都会提前准备很多的备用球&#xff0c;当球被…

R11.8-11.8-11.8-11.8-BABSL

R11.8-11.8-11.8-11.8-BABSL R11.8-11.8-11.8-11.8-BABSL哈威柱塞泵宁波秉圣&#xff0c;主要特点是高自吸转速&#xff0c;工作效率高&#xff0c;结构紧凑&#xff0c;工作压力高等。广泛用于压力机器具&#xff0c;测试和实验室设施&#xff0c;润滑装置等设备&#xff0c;在…

Home Assistant添加ESPHome设备(IO控制继电器)

文章目录1.在加载项商店中安装ESPHome2.添加设备2.1 编译并下载.bin到电脑2.2 下载固件到ESP82662.3 在Home Assistant添加并配置设备2.4 在设备与服务中配置3.再添加一个设备1.在加载项商店中安装ESPHome 点击配置-加载项 点击加载项商店 搜索ESPHome 2.添加设备 这里…

为什么我在公司里访问不了家里的电脑?

本文为掘金社区首发签约文章&#xff0c;14天内禁止转载&#xff0c;14天后未获授权禁止转载&#xff0c;侵权必究&#xff01; 上篇文章「为什么我们家里的IP都是192.168开头的&#xff1f;」提到&#xff0c;因为IPv4地址有限&#xff0c;最大42亿个。为了更好的利用这有限的…

前端学习一、准备工作

一、电脑 首先想学习前端肯定是需要一台电脑&#xff0c;配置方面目前市面上3千左右的电脑就差不多了&#xff0c;如果有能力的话肯定是越高越好&#xff0c;如何挑选笔记本可自行搜索&#xff0c;我在这方面不专业就不讲了。 二、安装软件 谷歌浏览器 如果无法访问谷歌浏览…

你知道MySQL是如何解决幻读的吗?

前言 SQL标准中定义了4种隔离级别&#xff0c;分别是读未提交、读已提交、可重复读以及序列化。不同的隔离级别下&#xff0c;可以解决不同的并发问题&#xff0c;如下图所示。当然MySQL也基本遵循了这个标准&#xff0c;但是在实现上稍有不同。 本文重点探讨下MySQL是如何解…

MySQL线程池

概述 池化技术&#xff0c;包括线程池、连接池、内存池、对象池等。作用就是提前保存大量的资源&#xff0c;或将用过的资源保存起来&#xff0c;等下一次需要使用该资源时再取出来重复使用。 线程池&#xff1a;通过预先创建一定数量的线程&#xff0c;当有请求达到时&#…

黑苹果之技嘉(GIGABYTE)主板BIOS设置篇

很多童鞋安装黑苹果的时候会卡住&#xff0c;大部分原因是cfg lock 没有关闭&#xff0c;以及USB端口或SATA模式设置错误。 为了避免这些安装阶段报错的情况发生&#xff0c;今天给大家分享一下超详细的BIOS防踩坑设置指南--技嘉&#xff08;GIGABYTE&#xff09;主板BIOS篇&am…

OpenGL官方文档中的入门教程源代码:在3维空间中自由移动

OpenGL官方文档中的入门教程源代码&#xff1a;在3维空间中自由移动项目总览&#xff1a;一、开发前的准备工作1.将以上链接中的三个文件分别放到自己硬盘的一个文件夹中&#xff1a;例如D盘/OpenGL/...2.打开VS2022创建一个项目&#xff0c;右击窗体选择属性3.配置这3个文件的…

SQL Server全套教程(基于SQL语句----预览版)

SQL Server全套教程全程干货1. 数据库的基础操作1.1.0 创建数据库1.1.1 查看及修改数据库1.1.3 分离、附加和删除数据库1.1.4 数据库的备份和还原2.数据库表的相关操作2.1.0 常用数据类型2.1.1 表结构的创建2.1.2 表结构的查看及修改2.1.3 表约束的创建2.1.4 表约束的修改2.1.5…

2013款别克凯越危险警告灯不亮故障诊断方案设计

目 录 一、预约与准备工作 1 &#xff08;一&#xff09;工作描述 1 &#xff08;二&#xff09;预约 1 &#xff08;三&#xff09;准备工作 1 1、分析故障可能原因 1 2、工具、量具准备 1 3、辅料准备 2 二、接车、问诊与制单 2 &#xff08;一&#xff09;接车、问诊 2 &am…

mysql笔记

幻读 概念 一个事务中的两次同样的查询不一致。 解决幻读&#xff1a; RR&#xff1a;使用select ... for update加排他锁 for update的引入是为了幂等性问题&#xff0c;如果不加for update可能出现并发问题。 【参考&#xff1a;MySQL幻读详解及解决方法_学而不思则忘的博…

Word处理控件Aspose.Words功能演示:从 Java 中的 Word 文档中提取图像

图像通常用于表示 Word 文档中的重要信息。在文本旁边包含图像使内容更具吸引力。在某些情况下&#xff0c;您可能需要以编程方式提取嵌入在 Word 文档中的图像。为此&#xff0c;本文介绍了如何使用 Java 从 Word 文档中提取图像。 Aspose.Words for . java 最新下载&#xf…

著名歌唱家大衣哥太豪横了,参加商演被主办方请到五星级酒店就餐

自从农民歌唱家大衣哥&#xff0c;被前好友谷传民起诉后&#xff0c;他的人气不降反升&#xff0c;各种商演邀约也都不断。就在前几天&#xff0c;农民歌唱家大衣哥在商演结束后&#xff0c;被主办方邀请到五星级大酒店&#xff0c;享受了一顿丰盛的晚餐。 作为普通老百姓来说&…

【场景化解决方案】北极星深度集成钉钉PaaS,让OKR管理更加敏捷高效

方案简介 北极星OKR作为一款企业数字化目标管理软件&#xff0c;致力于为企业客户提供专业高效的数字化系统和一站式服务支持&#xff0c;助力企业管理转型升级。如今通过与钉钉的深度融合&#xff0c;在信息的反馈与交互和团队的协作上&#xff0c;营造了更加敏捷的场景&…