gantt.attachEvent('onTaskDragStart', function () {
createDragGuideLines();
return true;
});
gantt.attachEvent('onTaskDrag', function (id, mode, task, original) {
updateDragGuideLines(task, mode, original);
return true;
});
const removeDragGuideLines = () => {
const guideLineIds = [
'gantt-current-start-guide-line',
'gantt-current-end-guide-line',
];
guideLineIds.forEach((id) => {
const guideLine = document.getElementById(id);
if (guideLine) {
guideLine.remove();
}
});
};
const createDragGuideLines = () => {
removeDragGuideLines();
const ganttElement = gantt.$root;
if (!ganttElement) return;
const currentStartGuideLine = document.createElement('div');
currentStartGuideLine.className =
'gantt-drag-guide-line gantt-current-start-guide';
currentStartGuideLine.id = 'gantt-current-start-guide-line';
ganttElement.appendChild(currentStartGuideLine);
const currentEndGuideLine = document.createElement('div');
currentEndGuideLine.className =
'gantt-drag-guide-line gantt-current-end-guide';
currentEndGuideLine.id = 'gantt-current-end-guide-line';
ganttElement.appendChild(currentEndGuideLine);
};
const updateDragGuideLines = (task, mode, original) => {
const currentStartGuideLine = document.getElementById(
'gantt-current-start-guide-line',
);
const currentEndGuideLine = document.getElementById(
'gantt-current-end-guide-line',
);
if (!currentStartGuideLine || !currentEndGuideLine) return;
if (!task.start_date || !task.end_date) return;
const currentStartPos = gantt.posFromDate(task.start_date);
const currentEndPos = gantt.posFromDate(task.end_date);
const timelineArea = gantt.$task_data;
if (!timelineArea) return;
const timelineRect = timelineArea.getBoundingClientRect();
const ganttRect = gantt.$root.getBoundingClientRect();
const timelineLeftOffset = timelineRect.left - ganttRect.left;
const timelineWidth = timelineRect.width;
const currentStartLeft = timelineLeftOffset + currentStartPos;
const currentEndLeft = timelineLeftOffset + currentEndPos;
let showStartLine = false;
let showEndLine = false;
if (mode === 'move') {
showStartLine = true;
showEndLine = true;
} else if (mode === 'resize' && original) {
const originalStartTime = new Date(original.start_date).getTime();
const originalEndTime = new Date(original.end_date).getTime();
const currentStartTime = new Date(task.start_date).getTime();
const currentEndTime = new Date(task.end_date).getTime();
const startChanged = originalStartTime !== currentStartTime;
const endChanged = originalEndTime !== currentEndTime;
if (startChanged && !endChanged) {
showStartLine = true;
showEndLine = false;
} else if (!startChanged && endChanged) {
showStartLine = false;
showEndLine = true;
} else {
showStartLine = true;
showEndLine = true;
}
} else {
showStartLine = true;
showEndLine = true;
}
if (
showStartLine &&
currentStartPos >= 0 &&
currentStartPos <= timelineWidth
) {
currentStartGuideLine.style.left = currentStartLeft + 'px';
currentStartGuideLine.style.display = 'block';
} else {
currentStartGuideLine.style.display = 'none';
}
if (showEndLine && currentEndPos >= 0 && currentEndPos <= timelineWidth) {
currentEndGuideLine.style.left = currentEndLeft + 'px';
currentEndGuideLine.style.display = 'block';
} else {
currentEndGuideLine.style.display = 'none';
}
const ganttDataArea = gantt.$task_data;
if (ganttDataArea) {
const dataRect = ganttDataArea.getBoundingClientRect();
const ganttRect = gantt.$root.getBoundingClientRect();
const topOffset = dataRect.top - ganttRect.top;
const height = dataRect.height;
[currentStartGuideLine, currentEndGuideLine].forEach((line) => {
if (line) {
line.style.top = topOffset + 'px';
line.style.height = height + 'px';
}
});
}
};
gantt.attachEvent('onAfterTaskDrag', function (id) {
removeDragGuideLines();
});