In some cases user don't want their tasks to overlap with the other, the below code describes how to prevent this by shifting the overlapped tasks away from the currently resized or moved task.
Sample Code:
|
$(document).ready(function () { var flexyGantt = $gantt_container.data("FlexyGantt"); flexyGantt.TaskTimeChanged.subscribe(function (sender, args) { var flexyNodeData = args.FlexyNodeData; $currentChartRow = flexyNodeData.ChartRow(); var rowData = $currentChartRow[0]["data-grid-item"]; var movedTask = args.DataSource; // moved or resized bar. // Persisting the new values into the data soruce right away. If we don't do this, the gantt will do this after you return from this function. movedTask.StartTime = args.StartTime; movedTask.EndTime = args.EndTime; var inspectTimeRange = { StartTime: movedTask.StartTime, EndTime: movedTask.EndTime } var redrawBars = false; var currentRowTasks = rowData.Data().Tasks; //Sorting tasks by startTime. currentRowTasks.sort(function (a, b) { return a.StartTime - b.StartTime }); if (args.Type == "ResizeStart")//task resize. { //Moving tasks from right to left while resizing task's start. for (var i = currentRowTasks.length - 1; i >= 0; i--) { var task = currentRowTasks[i]; if (movedTask != task) { var isOverlapping = preventOverlapping(inspectTimeRange, task, redrawBars, args); if (isOverlapping) inspectTimeRange.StartTime = task.StartTime; } } } else { //Moving tasks from left to right while resizing end and while moving tasks. for (var i = 0; i < currentRowTasks.length; i++) { var task = currentRowTasks[i]; if (movedTask != task) { var isOverlapping = preventOverlapping(inspectTimeRange, task, redrawBars, args); if (isOverlapping) inspectTimeRange.EndTime = task.EndTime; } } } // Force a redraw (or if you use a change notifying model like knockout, the gantt will then auto update) if (redrawBars == true) { $currentChartRow.find("td").data("radiantqTasksListControl").RedrawTaskRow() } // Here you know that changes are made into the "moved task" as well as the "adjusted task". You can now call the server to validate. }); function preventOverlapping(inspectTimeRange, task, redrawBars, args) { if (isOverlaping(inspectTimeRange, task))//if its overlap we have to move the bars. { redrawBars = true; var diff; if (args.Type == "ResizeStart")//task resize. { diff = new RQTimeSpan(inspectTimeRange.StartTime - task.EndTime); } else// endTask resizing and task moved { diff = new RQTimeSpan(inspectTimeRange.EndTime - task.StartTime); } // Shift the other task that's overlapping to the right of the moved bar. task.StartTime = task.StartTime.addTimeSpan(diff); task.EndTime = task.EndTime.addTimeSpan(diff); return true; } return false; }
function isOverlaping(task1, task2) { if (task1.StartTime >= task2.StartTime && task1.StartTime < task2.EndTime) return true; if (task1.EndTime > task2.StartTime && task1.EndTime <= task2.EndTime) return true; if (task2.StartTime > task1.StartTime && task2.EndTime < task1.EndTime) return true; return false; } }); |
© RadiantQ 2022. All Rights Reserved.