2022-11-05 16:45:14 +08:00

195 lines
5.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
GanttSchedule甘特图功能逻辑模块
描述:监听处理单元格编辑,以及条形图拖拽事件。
*/
function clearTime (date) {
if (!date) return null;
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
}
function maxTime(date) {
if (!date) return null;
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59);
}
GanttSchedule = function (gantt) {
this.gantt = gantt;
//处理单元格编辑,和条形图拖拽事件
gantt.on("cellbeginedit", this.__OnCellBeginEdit, this);
gantt.on("aftercellcommitedit", this.__OnCellCommitEdit, this);
gantt.on("itemdragstart", this.__OnItemDragStart, this);
gantt.on("itemdragcomplete", this.__OnItemDragComplete, this);
gantt.on("taskdragdrop", this.__OnTaskDragDrop, this);
gantt.on("tasksync", function (e) {
this._syncTask(e.task);
}, this);
}
GanttSchedule.prototype = {
__OnTaskDragDrop: function (e) {
e.cancel = true;
var dragRecords = e.tasks, targetRecord = e.targetTask, action = e.action;
this.gantt.moveTasks(dragRecords, targetRecord, action);
},
__OnCellBeginEdit: function (e) {
var task = e.record, field = e.field;
if (task.Summary) {
if (field == 'Start' || field == 'Finish' || field == 'duration') {
e.cancel = true;
}
}
},
__OnCellCommitEdit: function (e) {
e.cancel = true;
var task = e.record, field = e.field, value = e.value, oldValue = task[field];
if (mini.isEquals(oldValue, value)) return;
try {
//!!!处理单元格编辑提交
var gantt = this.gantt;
//标记任务的属性被修改
gantt.setTaskModified(task, field);
if (e.column.displayField) {
task[e.column.displayField] = e.text;
}
switch (field) {
case "duration":
task.duration = value;
if (task.Start) {
task.Finish = maxTime(task.Start);
task.Finish.setDate(task.Finish.getDate() + task.duration - 1);
gantt.setTaskModified(task, "Finish");
}
break;
case "Start":
task.Start = clearTime(value);
if (task.Start) {
task.Finish = maxTime(task.Start);
task.Finish.setDate(task.Start.getDate() + task.duration - 1);
gantt.setTaskModified(task, "Finish");
}
break;
case "Finish":
task.Finish = maxTime(value);
if (task.Finish && task.Start) {
var days = parseInt((task.Finish - task.Start) / (3600 * 24 * 1000));
task.duration = days + 1;
gantt.setTaskModified(task, "duration");
}
break;
case "PredecessorLink":
gantt.setLinks(task, value);
return;
break;
default:
task[field] = value;
break;
}
this._syncTask(task);
gantt.refresh();
} catch (ex) {
alert(ex.message);
}
},
__OnItemDragStart: function (e) {
if (e.action == "start") {
e.cancel = true;
}
},
__OnItemDragComplete: function (e) {
var action = e.action, value = e.value, task = e.item;
//!!!处理条形图拖拽完成
var gantt = this.gantt;
if (action == "finish") {
gantt.setTaskModified(task, "Finish");
task.Finish = maxTime(value);
if (task.Finish && task.Start) {
var days = parseInt((task.Finish - task.Start) / (3600 * 24 * 1000));
task.Duration = days + 1;
gantt.setTaskModified(task, "Duration");
}
}
if (action == "percentcomplete") {
gantt.setTaskModified(task, "PercentComplete");
task.PercentComplete = value;
}
if (action == "move") {
gantt.setTaskModified(task, "Start");
task.Start = clearTime(value);
if (task.Start) {
task.Finish = maxTime(task.Start);
task.Finish.setDate(task.Start.getDate() + task.Duration - 1);
gantt.setTaskModified(task, "Finish");
}
}
this._syncTask(task);
gantt.refresh();
},
_syncTask: function (task) {
if (!task) return;
var gantt = this.gantt;
//同步任务的父任务工期
function getDuration(pnode) {
var nodes = gantt.getChildTasks(pnode);
var duration = 0;
if (nodes && nodes.length > 0) {
for (var i = 0, l = nodes.length; i < l; i++) {
var node = nodes[i];
var d = parseInt(node.Duration);
if (!isNaN(d)) {
duration += d;
}
}
}
return duration;
}
//1)获取所有父级任务
var ans = gantt.getAncestorTasks(task);
ans.reverse();
for (var i = 0, l = ans.length; i < l; i++) {
var t = ans[i];
//2)获取父任务下子任务的Duration之和
var duration = getDuration(t);
if (t.Duration != duration) {
t.Duration = duration;
gantt.setTaskModified(t, "Duration");
}
}
}
};