Available only in PRO Edition
此功能仅在 PRO 版本中可用。
如果你有一个较大的任务,该任务不是连续进行的,可以暂停和恢复,那么你可以将其拆分为多个部分。你可以创建任意数量的部分,没有数量限制。
在数据层面,这类任务表现为一个汇总任务(项目)及其子任务,每个子任务对应主任务的一个独立片段。
这些子任务可以在同一行中显示,呈现为一个任务:
要将项目显示为拆分任务,请将其 render 属性设置为 split:
{id: 1, text: "Task #2", start_date: "03-04-2018 00:00", type: "project",
render:"split", parent: 0}, {id: 2, text: "Task #2.1", start_date: "03-04-2018 00:00", duration: 1,
parent: 1},
{id: 3, text: "Task #2.2", start_date: "05-04-2018 00:00", duration: 2,
parent: 1},
{id: 4, text: "Task #2.3", start_date: "08-04-2018 00:00", duration: 1,
parent: 1}
在上述示例中,“Task#2” 被拆分并显示为任务 “Task#2.1”、“Task#2.2” 和 “Task#2.3”,这些任务都保持完全可交互。
如需切换回拆分任务的常规树形视图(即作为带子任务的项目显示),只需更改 task.render 属性并重新渲染 gantt:
// 以“split”模式重新绘制任务
task.render = "split";
gantt.render();
// 以常规(树形)模式重新绘制任务
task.render = "";
gantt.render();
例如,你可以在 lightbox 中添加一个与 task.render 属性关联的控件,以便动态切换拆分视图和层级视图。下面提供了一个示例。
你可以通过配置 lightbox,让用户为任务开启或关闭拆分模式。为此,请在项目类型任务的设置中添加一个带复选框的新分区 —— gantt.config.lightbox.project_sections —— 并为新分区提供标签:
gantt.locale.labels.section_split = "Display";
gantt.config.lightbox.project_sections = [
{name: "description", height: 70, map_to: "text", type: "textarea", focus: true},
{name: "split", type:"checkbox", map_to: "render", options:[
{key:"split", label:"Split Task"}
]},
{name: "time", type: "duration", readonly: true, map_to: "auto"}
];
这将生成如下界面:
如果未勾选复选框,拆分任务将作为带有子任务的项目显示。
要判断某个任务是否为拆分任务,请使用 isSplitTask 方法。该方法接收一个任务对象,如果该任务为拆分任务,则返回 true。
var task = gantt.getTask(1);
if(gantt.isSplitTask(task)){
...
}
如果你希望直接在网格中展开或收起拆分任务,可以通过配置选项实现。该选项为 open_split_tasks,接受一个布尔值用于开启或禁用此行为。
gantt.config.open_split_tasks = true;
如需筛选哪些子任务显示在甘特图中,可以使用 onBeforeSplitTaskDisplay 事件。返回:
gantt.attachEvent("onBeforeSplitTaskDisplay", function (id, task, parent) {
if (task.duration < 3) {
return false;
}
return true;
});
拆分任务是父项的子任务,子任务后方的浅绿色条代表父项的条,并带有额外样式。
当拆分任务被收起、以单行显示时,父项的浅绿色条依然存在,但会调整透明度和 z-index。
Related sample: Expand and collapse split tasks
你可以像自定义 时间线 中其他条一样自定义父项条的颜色,或者通过 CSS 完全隐藏它:
.gantt_task_line.gantt_split_parent {
display: none;
}
当只有一个拆分任务时,汇总项(type=“project”)会变为不可见,因为它被拆分任务完全覆盖。如果没有拆分子任务,汇总项将使用默认日期和工期。
从 v8.0 开始,拆分任务在模板函数中包含 task.$rendered_at 属性,表示拆分任务被渲染的行 ID。这样你可以通过 task_class 模板,根据显示行为特定拆分任务设置样式:
gantt.templates.task_class = function(start, end, task) {
if(task.$rendered_at) {
if(gantt.calculateTaskLevel(gantt.getTask(task.$rendered_at)) === 1) {
return "phase-level-split-task";
}
}
return "";
};
Back to top