180 lines
5.9 KiB
JavaScript
180 lines
5.9 KiB
JavaScript
/*
|
||
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);
|
||
}
|
||
function clearHours(date) {
|
||
if (!date) return null;
|
||
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours());
|
||
}
|
||
function maxHours(date) {
|
||
if (!date) return null;
|
||
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), 59, 59);
|
||
}
|
||
|
||
RGanttSchedule = function (gantt) {
|
||
this.gantt = gantt;
|
||
//处理单元格编辑,和条形图拖拽事件
|
||
gantt.on("taskdragstart", this.__OnTaskDragStart, this);
|
||
gantt.on("taskdragcomplete", this.__OnTaskDragComplete, this);
|
||
}
|
||
RGanttSchedule.prototype = {
|
||
__OnTaskDragStart: function (e) {
|
||
// if (e.action == "start") {
|
||
// e.cancel = true;
|
||
// }
|
||
},
|
||
__OnTaskDragComplete: function (e) {
|
||
var action = e.action, value = e.value, task = e.item;
|
||
|
||
var gantt = this.gantt;
|
||
|
||
if (gantt.OrderType == "day") {
|
||
this.OrderDay(e);
|
||
} else if (gantt.OrderType == "hour") {
|
||
this.OrderHour(e);
|
||
} else {
|
||
this.OrderManual(e);
|
||
}
|
||
|
||
|
||
},
|
||
|
||
//手动精确时间
|
||
OrderManual: function (e) {
|
||
var action = e.action, value = e.value, task = e.item;
|
||
var gantt = this.gantt;
|
||
|
||
|
||
if (action == "start") {
|
||
|
||
task.Start = value;
|
||
if (task.Start > task.Finish) task.Start = new Date(task.Finish.getTime());
|
||
var days = parseInt((task.Finish - task.Start) / (3600 * 24 * 1000));
|
||
task.Duration = (days + 1) * (3600 * 24);
|
||
}
|
||
if (action == "finish") {
|
||
task.Finish = value;
|
||
if (task.Finish && task.Start) {
|
||
var days = parseInt((task.Finish - task.Start) / (3600 * 24 * 1000));
|
||
task.Duration = (days + 1) * (3600 * 24);
|
||
}
|
||
}
|
||
if (action == "percentcomplete") {
|
||
task.PercentComplete = value;
|
||
}
|
||
if (action == "move") {
|
||
task.Start = value;
|
||
if (task.Start) {
|
||
var d = new Date(task.Start.getTime() + task.Duration * 1000);
|
||
if (d < task.Start) d = new Date(task.Start);
|
||
|
||
task.Finish = d;
|
||
|
||
//task.Finish.setDate(task.Start.getDate() + task.Duration - 1);
|
||
}
|
||
|
||
var node = gantt.getOwnerNode(task), dropNode = e.dropNode;
|
||
if (dropNode && dropNode != node) {
|
||
if (node.Tasks) node.Tasks.remove(task);
|
||
if (!dropNode.Tasks) dropNode.Tasks = [];
|
||
dropNode.Tasks.push(task);
|
||
}
|
||
}
|
||
gantt.refresh();
|
||
},
|
||
|
||
//以"天"为任务最小排程单位
|
||
OrderDay: function (e) {
|
||
var action = e.action, value = e.value, task = e.item;
|
||
var gantt = this.gantt;
|
||
|
||
|
||
if (action == "start") {
|
||
|
||
task.Start = clearTime(value);
|
||
if (task.Start > task.Finish) task.Start = clearTime(task.Finish);
|
||
var days = parseInt((task.Finish - task.Start) / (3600 * 24 * 1000));
|
||
task.Duration = (days + 1) * (3600 * 24);
|
||
}
|
||
if (action == "finish") {
|
||
task.Finish = maxTime(value);
|
||
if (task.Finish && task.Start) {
|
||
var days = parseInt((task.Finish - task.Start) / (3600 * 24 * 1000));
|
||
task.Duration = (days + 1) * (3600 * 24);
|
||
}
|
||
}
|
||
if (action == "percentcomplete") {
|
||
task.PercentComplete = value;
|
||
}
|
||
if (action == "move") {
|
||
task.Start = clearTime(value);
|
||
if (task.Start) {
|
||
var d = new Date(task.Start.getTime() + task.Duration * 1000);
|
||
|
||
d.setDate(d.getDate() - 1);
|
||
if (d < task.Start) d = new Date(task.Start);
|
||
|
||
task.Finish = maxTime(d);
|
||
|
||
//task.Finish.setDate(task.Start.getDate() + task.Duration - 1);
|
||
}
|
||
|
||
var node = gantt.getOwnerNode(task), dropNode = e.dropNode;
|
||
if (dropNode && dropNode != node) {
|
||
if (node.Tasks) node.Tasks.remove(task);
|
||
if (!dropNode.Tasks) dropNode.Tasks = [];
|
||
dropNode.Tasks.push(task);
|
||
}
|
||
}
|
||
gantt.refresh();
|
||
},
|
||
|
||
//以"小时"为任务最小排程单位
|
||
OrderHour: function (e) {
|
||
var action = e.action, value = e.value, task = e.item;
|
||
var gantt = this.gantt;
|
||
|
||
if (action == "start") {
|
||
task.Start = clearHours(value);
|
||
if (task.Start > task.Finish) task.Start = clearHours(task.Finish);
|
||
var hours = parseInt((task.Finish - task.Start) / (3600 * 1000));
|
||
task.Duration = (hours + 1) * (3600);
|
||
}
|
||
if (action == "finish") {
|
||
task.Finish = maxHours(value);
|
||
if (task.Finish && task.Start) {
|
||
var days = parseInt((task.Finish - task.Start) / (3600 * 1000));
|
||
task.Duration = (days + 1) * (3600);
|
||
}
|
||
}
|
||
if (action == "percentcomplete") {
|
||
task.PercentComplete = value;
|
||
}
|
||
if (action == "move") {
|
||
task.Start = clearHours(value);
|
||
if (task.Start) {
|
||
var d = new Date(task.Start.getTime() + task.Duration * 1000);
|
||
d.setHours(d.getHours() - 1);
|
||
task.Finish = maxHours(d);
|
||
}
|
||
|
||
var node = gantt.getOwnerNode(task), dropNode = e.dropNode;
|
||
if (dropNode && dropNode != node) {
|
||
node.Tasks.remove(task);
|
||
if (!dropNode.Tasks) dropNode.Tasks = [];
|
||
dropNode.Tasks.push(task);
|
||
}
|
||
}
|
||
gantt.refresh();
|
||
}
|
||
};
|