@xpyjs/gantt-core
Version:
A powerful and flexible Gantt chart component library for modern web applications with TypeScript support
354 lines (353 loc) • 12.1 kB
TypeScript
import { IOptionConfig, IOptions } from "./types";
import { EventMap } from "./types/event";
import { DataChain } from "./types/link";
/**
* XGantt 甘特图组件的主要接口
*
* @description 这是 XGantt 甘特图组件的核心接口,提供了创建、配置、渲染和管理甘特图的所有功能。
* XGantt 是一个功能强大的甘特图组件,支持任务管理、时间轴显示、关联线、进度跟踪等功能。
*
* @example
* ```typescript
* // 基本使用
* const gantt = new XGantt('#container', {
* data: [
* {
* id: 1,
* name: '任务1',
* startTime: '2023-01-01',
* endTime: '2023-01-10',
* progress: 50
* }
* ]
* });
*
* // 监听事件
* gantt.on('select', (data, checked, all) => {
* console.log('选择了任务:', data);
* });
*
* // 更新配置
* gantt.update({
* unit: 'week',
* primaryColor: '#007acc'
* });
*
* // 跳转到指定日期
* gantt.jumpTo('2023-06-01');
*
* // 销毁组件
* gantt.destroy();
* ```
*/
export declare class XGantt {
private context;
private events;
constructor(element: string | HTMLElement, options?: IOptions);
/**
* 更新 XGantt 的配置选项
*
* @param options - 新的配置选项,支持部分更新
* @param config - 配置更新参数的方式
*
* @description 此方法允许在运行时动态更新甘特图的配置。
* 只需要传入需要更改的配置项,其他配置项将保持不变。
* 更新后会自动重新渲染相关部分以反映新的配置。
*
* @example
* ```typescript
* // 更新数据源。数据会被完全替换,除非原数据的 key 一致
* gantt.update({
* data: newTaskData
* });
*
* // 更新显示单位
* gantt.update({
* unit: 'month'
* });
*
* // 更新主题色
* gantt.update({
* primaryColor: '#ff6b6b'
* });
*
* // 批量更新多个配置
* gantt.update({
* unit: 'week',
* primaryColor: '#4ecdc4',
* dateFormat: 'YYYY-MM-DD',
* row: {
* height: 40
* }
* });
*
* // 完全替换配置(不合并)
* gantt.update(newOptions, { merge: false });
* ```
*
*/
update(options: IOptions, config?: IOptionConfig): void;
/**
* 渲染甘特图视图
*
* @description 此方法通常不需要主动调用,初始化以及 `update` 中都会自动更新。 如果你需要强制刷新页面,可以在合适的时候调用此方法
*/
render(): void;
/**
* 销毁甘特图实例,清理所有资源
*
* @description 完全销毁甘特图实例并清理所有相关资源,包括:
* - 移除所有事件监听器
* - 清理 DOM 元素和事件绑定
* - 释放内存中的数据引用
* - 停止所有动画和定时器
* - 清理渲染上下文
*
* 调用此方法后,甘特图实例将不再可用,需要重新创建新实例。
* 这对于防止内存泄漏和确保组件的正确生命周期管理非常重要。
*
* @example
* ```typescript
* const gantt = new XGantt('#container', options);
* gantt.render();
*
* // 在组件卸载或页面离开时销毁
* gantt.destroy();
*
* // React 组件中的使用示例
* useEffect(() => {
* const gantt = new XGantt('#gantt-container', options);
* gantt.render();
*
* return () => {
* gantt.destroy(); // 组件卸载时清理
* };
* }, []);
* ```
*
* @warning 销毁后的实例不能再次使用,调用任何方法都可能导致错误
*/
destroy(): void;
/**
* 跳转到指定日期
*
* @param date - 要跳转到的日期,支持多种格式:
* - Date 对象
* - ISO 日期字符串 (如 '2023-06-01')
* - 时间戳数字
* - 其他可被 Date 构造函数解析的格式
* - 如果不传入参数或传入 undefined,则跳转到今天
*
* @returns 是否成功跳转到指定日期
* - `true`: 成功跳转,视图已更新到指定日期
* - `false`: 跳转失败,可能是日期无效或超出数据范围
*
* @description 此方法将甘特图的视图定位到指定日期,使该日期在当前视窗中可见。
* 具体行为取决于当前的显示单位和视图范围:
* - 如果指定日期在当前视图范围内,视图会滚动到该日期
* - 如果指定日期超出当前数据范围,可能会扩展时间轴或返回 false
* - 跳转会触发相应的滚动动画(如果启用)
*
* @example
* ```typescript
* // 跳转到今天(默认行为)
* const success1 = gantt.jumpTo();
* const success2 = gantt.jumpTo(undefined);
*
* // 跳转到指定日期
* const success3 = gantt.jumpTo('2023-06-01');
* const success4 = gantt.jumpTo(new Date('2023-06-01'));
* const success5 = gantt.jumpTo(1685577600000); // 时间戳
*
* // 检查跳转结果
* if (gantt.jumpTo('2023-12-25')) {
* console.log('成功跳转到圣诞节');
* } else {
* console.log('跳转失败,日期可能超出范围');
* }
*
* // 跳转到项目开始日期
* const projectStartDate = data[0]?.startTime;
* if (projectStartDate) {
* gantt.jumpTo(projectStartDate);
* }
* ```
*/
jumpTo(date?: any): boolean;
/**
* 滚动到指定任务
* @param id - 任务 ID,如果不传入则滚动到顶部
* @param highlight - 是否高亮任务,默认为 false
*
* @returns 是否成功滚动到指定任务
* - `true`: 成功滚动,任务已在视图中可见
* - `false`: 滚动失败,可能是任务 ID 无效或任务不可见
*
* @description 此方法将甘特图的视图滚动到指定任务的位置,使该任务在当前视窗中可见。并且支持跳转后高亮当前任务。
*
* @example
* ```typescript
* // 滚动到指定任务
* const success1 = gantt.scrollTo('task-1');
* const success2 = gantt.scrollTo('non-existent-id'); // 任务不存在,返回 false
*
* // 滚动到顶部
* const success3 = gantt.scrollTo();
*
* // 检查滚动结果
* if (gantt.scrollTo('task-2')) {
* console.log('成功滚动到任务 task-2');
* } else {
* console.log('滚动失败,任务 ID 可能无效');
* }
*
* // 滚动到任务并高亮
* gantt.scrollTo('task-3', true);
* ```
*/
scrollTo(id?: string, highlight?: boolean): boolean;
/**
* 获取指定任务的所有相关联的完整路径,包含所有连接线与任务节点
*
* 结果集中包含前置链路信息、后置链路信息、所有节点、关联线的信息等
* - prev: 前置链路信息
* - chain: 所有源 -> 当前任务的完整路径(每条路径末尾为当前节点)
* - nodes: 前置方向所有唯一节点
* - links: 前置方向所有连线
* - next: 后置链路信息
* - chain: 当前任务 -> 所有汇的完整路径(每条路径首元素为当前节点)
* - nodes: 后置方向所有唯一节点
* - links: 后置方向所有连线
* - allNodes: 所有相关联的节点
* - allLinks: 所有相关联的连线
* - current: 当前任务
*/
getDataChain(id: string): DataChain;
/**
* 注册事件监听器
*
* @template K - 事件名称的类型
* @param event - 要监听的事件名称
* @param cb - 事件回调函数
*
* @description 为甘特图注册事件监听器,支持监听各种用户交互和状态变化事件。
*
* 支持的事件类型包括:
* - `loaded`: 加载完成事件,组件初始化完成后触发
* - `error`: 错误事件,当组件发生错误时触发
* - `update:link`: 关联线更新事件
* - `create:link`: 关联线创建事件
* - `select:link`: 关联线选择事件
* - `select`: 任务选择事件
* - `click:row`: 行点击事件
* - `dblclick:row`: 行双击事件
* - `contextmenu:row`: 行右键菜单事件
* - `click:slider`: 任务条点击事件
* - `dblclick:slider`: 任务条双击事件
* - `contextmenu:slider`: 任务条右键菜单事件
* - `move`: 任务移动事件
*
* @see {@link EventMap} 查看所有可用事件及其参数类型
*
* @example
* ```typescript
* // 监听任务选择事件
* gantt.on('select', (selectedData, isChecked, allSelectedData) => {
* console.log('选择状态:', isChecked);
* console.log('当前选择的数据:', selectedData);
* console.log('所有选择的数据:', allSelectedData);
* });
*
* // 监听行点击事件
* gantt.on('click:row', (event, rowData) => {
* console.log('点击了行:', rowData.name);
* console.log('鼠标事件:', event);
* });
*
* // 监听任务条双击事件
* gantt.on('dblclick:slider', (event, taskData) => {
* console.log('双击了任务条:', taskData.name);
* // 可以打开任务详情弹窗
* openTaskDetailModal(taskData);
* });
*
* // 监听任务移动事件
* gantt.on('move', (moveData) => {
* moveData.forEach(item => {
* console.log(`任务 ${item.row.name} 从 ${item.old.startTime} 移动到 ${item.row.startTime}`);
* });
* });
*
* // 监听关联线创建事件
* gantt.on('create:link', (link) => {
* console.log('创建了新的关联线:', link);
* // 可以保存到后端
* saveLinkToServer(link);
* });
*
* // 监听错误事件
* gantt.on('error', (error) => {
* console.error('甘特图发生错误:', error);
* // 可以上报错误或显示用户友好的错误信息
* showErrorNotification(error.message);
* });
* ```
*
*/
on<K extends keyof EventMap>(event: K, cb: EventMap[K]): void;
/**
* 移除事件监听器
*
* @template K - 事件名称的类型
* @param event - 要移除的事件名称
* @param cb - 可选,指定要移除的回调函数。如果不传入,则移除所有该事件的监听器
*
* @description 从甘特图中移除指定的事件监听器。
* 如果不传入回调函数,则会移除该事件的所有监听器。
*
* @example
* ```typescript
* // 移除特定的任务选择事件监听器
* const selectHandler = (data, checked, all) => {
* console.log('选择了任务:', data);
* };
* gantt.on('select', selectHandler);
*
* // 当不再需要时,可以移除该监听器
* gantt.off('select', selectHandler);
*
* // 移除所有任务选择事件监听器
* gantt.off('select');
* ```
*/
off<K extends keyof EventMap>(event: K, cb?: EventMap[K]): void;
/**
* 根据任务 ID 获取对应的任务数据
* @param id 任务 ID
* @returns 任务数据
*
* @example
* ```typescript
* const data = gantt.getDataById('task-1');
* if (data) {
* console.log('任务名称:', data.name);
* }
* ```
*/
getDataById(id: string): any | undefined;
/**
* 获取当前数据量总数。该数量为所有数据展开后的数据条数
*/
getDataSize(): number;
/**
* 移除指定 ID 的数据。该操作会直接修改当前数据源,并且不可逆,请谨慎使用
* @param id 数据 ID
* @returns 是否成功移除
*
* @example
* ```typescript
* const success = gantt.removeDataById('task-1');
* ```
*/
removeDataById(id: string): boolean;
}