在时间轴中拖动任务
拖动功能可以轻松调整任务的开始或结束日期,以及任务的持续时间。
默认情况下,拖拽功能是启用的,允许用户在时间轴的行内移动任务。
如需定制拖拽行为,可以使用以下事件:
- onBeforeTaskDrag - 用于阻止特定任务的拖动
- onTaskDrag - 用于限制拖动区域或在任务拖动过程中应用自定义逻辑
- onAfterTaskDrag - 用于处理任务被移动后的操作
以下是一些常见的自定义拖动行为的场景:
阻止特定任务被拖动
要禁用某些任务的拖动,可以使用 onBeforeTaskDrag 事件:
gantt.attachEvent("onBeforeTaskDrag", function(id, mode, e){
if(gantt.getGlobalTaskIndex(id)%2==0){
return false; // 如果全局任务索引为偶数,则阻止拖动
}
return true; // 如果全局任务索引为奇数,则允许拖动
});
防止任务被拖动到特定日期范围之外
如需限制任务只能在指定日期范围内拖动,可以使用 onTaskDrag 事件。
onTaskDrag 事件说明:
- 每当用户在时间轴中拖动、调整大小或更新任务进度时都会触发。
- 拖动操作的类型作为第二个参数 mode 提供。
- 所有可能的拖动模式在 drag_mode 属性中有列出。
简要流程如下:
- 用户拖动任务。
- dhtmlxGantt 根据新位置重新计算任务日期。
- dhtmlxGantt 触发 onTaskDrag 事件。
- dhtmlxGantt 在图表中重绘任务。由于 onTaskDrag 事件在重新计算之后触发,可以放心地在事件处理器中为被拖动的任务设置自定义值,无需担心被覆盖。这样可以确保任务显示在您希望的位置。
例如,要防止用户将任务拖动到 "2020年3月31日 - 2020年4月11日" 之外的范围:
可以使用如下代码:
[限制任务拖动区间 - [31.03.2020, 11.04.2020]](限制任务拖动区间 - [31.03.2020, 11.04.2020])
var leftLimit = new Date(2020, 2 ,31), rightLimit = new Date(2020, 3 ,12);
gantt.attachEvent("onTaskDrag", function(id, mode, task, original){
var modes = gantt.config.drag_mode;
if(mode == modes.move || mode == modes.resize){
var diff = original.duration*(1000*60*60*24);
if(+task.end_date > +rightLimit){
task.end_date = new Date(rightLimit);
if(mode == modes.move)
task.start_date = new Date(task.end_date - diff);
}
if(+task.start_date < +leftLimit){
task.start_date = new Date(leftLimit);
if(mode == modes.move)
task.end_date = new Date(+task.start_date + diff);
}
}
});
Drag parent task with its children
拖动父任务时同时拖动子任务
如需在父任务被移动时同时拖动其所有子任务,可以使用 onTaskDrag 事件(该事件的详细说明见上文):
gantt.attachEvent("onTaskDrag", function(id, mode, task, original){
var modes = gantt.config.drag_mode;
if(mode == modes.move){
var diff = task.start_date - original.start_date;
gantt.eachTask(function(child){
child.start_date = new Date(+child.start_date + diff);
child.end_date = new Date(+child.end_date + diff);
gantt.refreshTask(child.id, true);
},id );
}
});
// 将子任务位置对齐到当前刻度
gantt.attachEvent("onAfterTaskDrag", function(id, mode, e){
var modes = gantt.config.drag_mode;
if(mode == modes.move ){
var state = gantt.getState();
gantt.eachTask(function(child){
child.start_date = gantt.roundDate({
date:child.start_date,
unit:state.scale_unit,
step:state.scale_step
});
child.end_date = gantt.calculateEndDate(child.start_date,
child.duration, gantt.config.duration_unit);
gantt.updateTask(child.id);
},id );
}
});
拖动项目时同时拖动其子任务
信息
此功能仅在 Gantt PRO 版本中可用。
默认情况下,被标记为 project type 的任务无法被拖动。 可以通过设置 drag_project 选项来启用项目拖动:
gantt.config.drag_project = true;
与独立任务一起拖动依赖任务
有多种方法可以将任务与其依赖任务一起移动。 详细信息请参见专门的文章:종속 작업과 함께 작업 드래그하기。