甘特图(ant-gantt)

在项目管理中,甘特图的可视化操作界面,可以让项目规划与风险把控更便捷与清晰,同时该插件是一款基于HTML5、javasrcipt的一款js插件,支持在当前主流的前端框架中接入。

效果图:

image-20220902164829369

如何使用

1、下载插件

官网地址:https://www.aim.link/h5/KA.html

2、导入项目

将下载到的sdk拷贝至项目工程目录,如拷贝至:

externalSdk/ant-gantt/index.js

externalSdk/ant-gantt/index.css

3、开发实践

3.1 原生js嵌入
<html>
  <head>
    <meta charset="UTF-8">
  	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style type="text/css">
      html, body {
        width: 100%;
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #ant-gantt {
        width: 100%;
        height: 100%;
      }
    </style>
    <link rel="stylesheet" type="text/css" href="/externalSdk/ant-gantt/index.css"/>
    <script type="text/javascript" src="/externalSdk/ant-gantt/index.js" defer></script>
  </head>
  <body>
		<div id="ant-gantt"></div>
  </body>
</html>
// grid视图列自定义
const columns = [
   {
      title: '编号',
      dataIndex: 'wbs',
      width: 48,
    },
    {
      title: '任务名称',
      dataIndex: 'name',
      width: 200
    },
];
const config = { mode: 'day', grid: { columns } };
// 对象实例化
const instance = new Gantt('#ant-gantt', config);

// 数据渲染
const data = [
  {
    id: 'task.1',
    editable: true,
    wbs: '2',
    milestone:"1",
    name: '任务01',
    fzr: 'x先生',
    type: 't',
    status: 2,
    beginTime: "2021-06-02",
    children: []
  },
];
instance.render(data);
3.2 react嵌入
import React from 'react';
import ReactDOM from 'react-dom'
import AntGantt from '@/externalSdk/ant-gantt'; // @为项目资源目录的alias
import '@/externalSdk/ant-gantt/index.css'; 

const GanttView = (props) => {
  const gridRef = React.useRef(null);
  const handleClick = (record) => {
    console.log(record);
  };
  React.useLayoutEffect(() => {
    const columns = [
      {
        title: '编号',
        dataIndex: 'wbs',
        width: 48,
      },
      {
        title: '任务名称',
        dataIndex: 'name',
        width: 200,
        render: (text, record) => {
          /* 渲染react节点
          ** 如果渲染节点存在异步交互,需要传递callback
          */
          return (node, callback) => {
            ReactDOM.render(
              <span onClick={() => handleClick(record)}>{text}</span>,
              node,
              callback
            );
          };
        }
      },
      {
        title: '负责人',
        dataIndex: 'fzr',
        width: 120,
      }
    ];
    const config = {
      mode: 'day',
      grid: {
      	collapseIndex: 1,
        columns
      }
    };
    gridRef.current = new AntGantt('#ant-gantt', config);
  }, []);
  React.useEffect(() => {
    Promise.resolve().then(() => {
        const data = [
          {
            id: 'task.1',
            editable: true,
            wbs: '2',
            milestone:"1",
            name: '任务01',
            fzr: 'x先生',
            type: 't',
            status: 2,
            beginTime: "2021-06-02",
            children: []
          },
        ];
				const instance = gridRef.current;
				instance.render(data);
    })
    return () => instance && instance.destroy();
  }, []);
  return (
  	<div id="ant-gantt"></div>
  );
};

export default GanttView;
3.3 vue2嵌入
<template>
  <div id="gantt" class="m-gantt"></div>
</template>
<style scoped>
  .m-gantt {
    width: 100%;
    height: 100%;
  }
</style>
<script>
  import AntGantt from '@/externalSdk/ant-gantt';
	import '@/externalSdk/ant-gantt/index.css';
	export default {
    data() {
      return {
        config: {
          mode: 'day',
          grid: {
            collapseIndex: 1
          }
        }
      }
    },
    mounted() {
      this.init()
    },
    beforeDestroy() {
      this.gInstance?.destroy();
    },
    methods: {
      init() {
        const { grid } = this.config;
        grid.columns = this.getColumns();
        this.gInstance = new AntGantt('#gantt', this.config);
        this.getData().then(data => this.gInstance.render(data));
      },
      getColumns() {
        return [
          {
            title: '编号',
            dataIndex: 'wbs',
            width: 48,
          },
          {
            title: '任务名称',
            dataIndex: 'name',
            width: 200,
            render: (text, record) => {
              const el = document.creactElement('span');
              span.innerText = text;
              el.onClick = () => {
                this.handleClick(record);
              };
              return el;
            }
          },
        ];
      },
      getData() {
        return Promise.resolve([
          {
            id: 'task.1',
            editable: true,
            wbs: '2',
            milestone:"1",
            name: '任务01',
            fzr: 'x先生',
            type: 't',
            status: 2,
            beginTime: "2021-06-02",
            children: []
          },
        ]);
      }
    }
  }
</script>

数据格式(dataItem)

1、基本类型

type为i、t、itemNew时,通用的节点字段

参数说明类型默认值
id节点id - 必填string必填项
name节点名称string必填项
type节点类型i - 组节点、t - 节点、itemNew - 临时节点(基本字段同类型t)必填项
total子节点数量number-
children子节点列表dataItem[]-
hasMore是否有更多子节点 - 用于显示加载更多boolean-
isLeaf是否是叶子节点 - 用于显示是否可展开boolean-

2、标准类型(type === t)

参数说明类型默认值
beginTime计划开始日期string-
endTime计划结束日期string-
realityBeginTime实际开始日期string-
realityEndTime实际结束日期string-
rangeBeginTime范围开始日期 - 自身以及子节点时的日期范围string-
rangeEndTime范围结束日期 - 自身以及子节点时的日期范围string-
milestone是否是里程碑boolean-
status节点状态,字段名称可由calendarConfig.statusKey定义string-
createFS/createSF/createFF createSS是否可关联不同的节点关系boolean-
FS/SF/FF/SS节点关系object[]-
disabled是否可编辑Boolean-

3、分组类型(type === i)

  • 该数据类型,只显示gridConfig.expandedWidthKey配置的字段
参数说明类型默认值
rangeBeginTime范围开始日期 - 自身以及子节点时的日期范围string-
rangeEndTime范围结束日期 - 自身以及子节点时的日期范围string-

配置相关

1、基础配置 - config

参数说明类型默认值
locale显示语言 - zh-CN、en-US、zh-TWstringzh-CN
mode视图类型 - year、halfYear、season、month、week、daystringday
format日期格式stringYYYY-MM-DD
rowKey数据的唯一键值stringid
showExpand是否可展开booleantrue
expandedKeys展开的节点rowKey[][]
collapse表格视图是否可收起booleantrue
parentChild父子节点是否可关联booleanfalse
autoPairing是否开启自动编排,开启后,booleanfalse
colWidth列宽 - 描述一天表示的宽度number32
rowHeight行高 - 描述数据行的高度number32
hasMore是否有更多数据booleanfalse
loadMore是否支持加载更多booleanfalse
loadMoreText显示文案string加载更多
grid表格视图配置项gridConfig详细配置
calendar日期视图配置项calendarConfig详细配置
link关联关系linkConfig详细配置
resizer列调节器resizerConfig详细配置
exportImg导出甘特图,可导出png图片。size为支持的图片大小,name导出图片的名称(size, name) => Promise<{url, name, …other}>-
onExpand展开收起子节点的回调(expandedKeys, row) => void-
onCollapse展开/收起表格视图的回调(collapse) => void-
onLoadMore点击加载更多是,加载数据的回调(record) => void-
onLoadData节点展开时,加载数据的回调(record) => void-
onItemClick点击行时的回调(record) => void-
onItemLinkChange关联关系发生变化时的回调, 第二个参数err,提供回调函数onError,当异步更新失败后,调用onError来重置数据状态(linkData, err) => void-
onItemChange数据发生变化时的回调, 第二个参数err,提供回调函数onError,当异步更新失败后,调用onError来重置数据状态(params, record, err) => void-

2、表格配置 - gridConfig

参数说明类型默认值
show是否显示表格booleantrue
columns表格列,如果show为true,该值不能为空columnType[]详细配置
layout表格列是否可拖拽booleantrue
width表格最大宽度。超出时,则支持滚动number400
defColW默认列宽 - 每列最小宽度number80
expandedWidthKey支持展开的列字段stringname
collapseIndex收起时,显示列的位置number1
2.1 列配置 - columnType
参数说明类型默认值
name列名称string-
dataIndex列字段,唯一值string-
width自定义列宽number80
hidden列是否显示booleanfalse
render自定义渲染方法(text, record) => string |htmlElement | function-
// function 使用方法
render = (text, record) => {
  return (node, callback) => {
    // node为当前数据行在该列的容器
    // callback为异步渲染的回调方法,具体可参考开发用例
    Promise.resolve().then(() => {
      node.appendChild(document.createElement('div'));
      callback && callback();
    });
  };
}

3、日历配置 - calendarConfig

参数说明类型默认值
showYear是否显示年份booleantrue
beginTime描述项目的开始日期,在视图上绘制起始线string-
endTime描述项目的结束日期,在视图上绘制截止线string-
statusKey视图色块对应的DataItem字段stringstatus
statusMap不同状态,对应的颜色string[][“#16AD31”, “#B5C5CD”, “#4463ED”, “#1990FF”, “#DCDADD”, “#DCDADD”, “#DCDADD”, “#F6313B”, “#B5C5CD”, “#B5C5CD”, “#88AD8E”]
showTimeline是否显示当前时间线booleantrue
endTimePlaceholder超出结束日期的提示文案string‘’
getDisableDate获取非工作日期的方法(beginTime, endTime) => (YYYY-MM-DD)[]默认以周六、周日为节点日

4、列调节器 - resizerConfig

参数说明类型默认值
show是否显示调节器booleantrue
width调节器占位宽度number20

5、关联关系配置 - linkConfig

参数说明类型默认值
type可关联的关系类型,默认为空,支持全部关系FS/FF/SF/SS‘’
typesMap不同关联关系类型对应的字段映射typeMap[]详细配置
show是否显示操作栏booleantrue
delayConfig延迟项配置delayConfig详细配置
deleteConfig删除项配置deleteConfig详细配置
5.1 typeMap
参数说明类型默认值
type关联关系类型FS/FF/SF/SS‘’
field关联关系类型对应的字段stringFS/FF/SF/SS
5.2 delayConfig
参数说明类型默认值
min延迟最小值number0
max延迟最大值number99
decimals延迟值的精确度number0
show是否显示延迟操作栏booleantrue
5.3 deleteConfig
参数说明类型默认值
show是否显示删除栏booleantrue

api 相关

destroy

// 用于实例内部事件的销毁,以及实例dom的卸载
const instance = new AntGantt('#app', { grid: { show: false } });
instance.destroy();

render

// 当数据以及配置都更新时,需要调用render重新渲染
const instance = new AntGantt('#app', { grid: { show: false } });
const data = [];
const config = {};
instance.render(data, config);

refresh

// 数据更新时属性
const instance = new AntGantt('#app', { grid: { show: false } });
const data = [];
instance.refresh(data, { expandKeys: [] });

updateConfig

// 更新配置项, 但是不会刷新视图
const instance = new AntGantt('#app', { grid: { show: false } });
const config = { showYear: false };
instance.updateConfig(config);

refreshConfig

// 视图数据更新
const instance = new AntGantt('#app', { grid: { show: false } });
const config = { showYear: false };
/* viewType: null、Grid、Calendar
** viewType为空时,表格、日期都会刷新
*/
const viewType = null;
instance.refreshConfig(config, viewType);
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐