타임라인 내에서 작업 드래그하기
드래그 기능을 사용하면 작업의 시작일이나 종료일, 그리고 작업 기간을 쉽게 조정할 수 있습니다.
기본적으로 드래그 앤 드 롭이 활성화되어 있어, 사용자는 타임라인의 각 행에서 작업을 이동할 수 있습니다.
드래그 앤 드롭 동작을 세부적으로 제어하려면 다음 이벤트들을 사용할 수 있습니다:
- onBeforeTaskDrag - 특정 작업의 드래그를 차단
- onTaskDrag - 드래그 가능 영역 제한 또는 드래그 중 커스텀 로직 적용
- onAfterTaskDrag - 작업 이동 후 처리 로직 실행
아래는 기본 드래그 동작을 커스터마이징하는 것이 유용한 일반적인 상황입니다:
- 특정 작업의 드래그 차단
- 작업을 특정 날짜 범위 밖으로 드래그하지 못하게 하기
- 부모 작업과 함께 자식 작업도 같이 드래그하기
- 프로젝트와 하위 작업을 함께 드래그하기
- 최소 작업 기간 설정하기
- 작업 드래그 시 자동 스크롤 활성화
특정 작업의 드래그 차단
특정 작업의 드래그를 비활성화하려면 onBeforeTaskDrag 이벤트를 사용하세요:
gantt.attachEvent("onBeforeTaskDrag", function(id, mode, e){
if(gantt.getGlobalTaskIndex(id)%2==0){
return false; // 글로벌 작업 인덱스가 홀수일 경우 드래그 차단
}
return true; // 글로벌 작업 인덱스가 짝수일 경우 드래그 허용
});
작업을 특정 날짜 범위 밖으로 드래그하지 못하게 하기
작업이 특정 날짜 범위를 벗어나지 않도록 제한하려면 onTaskDrag 이벤트를 사용하세요.
onTaskDrag 이벤트:
- 사용자가 타임라인에서 작업을 드래그, 리사이즈, 혹은 진행률을 업데이트할 때마다 트리거됩니다.
- 드래그 동작의 유형은 두 번째 인자인 mode로 전달됩니다.
- 가능한 모든 드래그 모드는 drag_mode 속성에 나열되어 있습니다.
요약하면, 동작 순서는 다음과 같습니다:
- 사용자가 작업을 드래그합니다.
- dhtmlxGantt가 새 위치를 기준으로 작업의 날짜를 재계산합니다.
- dhtmlxGantt가 onTaskDrag 이벤트를 발생시킵니다.
- dhtmlxGantt가 차트에서 작업을 다시 그립니다. onTaskDrag 이벤트는 재계산 후에 발생하므로, 이벤트 핸들러 내에서 드래그된 작업에 커스텀 값을 안전하게 설정할 수 있습니다. 이렇게 하면 작업이 원하는 위치에 정확히 표시됩니다.
예를 들어, 사용자가 작업을 "2020년 3월 31일 - 2020년 4월 11일" 범위 밖으로 드래그하지 못하도록 하려면:
다음 코드를 사용할 수 있습니다:
[Denying dragging tasks out of interval - [31.03.2020, 11.04.2020]](Denying dragging tasks out of interval - [31.03.2020, 11.04.2020])
var leftLimit = new Date(2020, 2 ,31), rightLimit = new Date(2020, 3 ,12);
gantt.attachEvent("onTaskDrag", function(id, mode, task, original){
var modes = gantt.config.drag_mode;
if(mode == modes.move || mode == modes.resize){
var diff = original.duration*(1000*60*60*24);
if(+task.end_date > +rightLimit){
task.end_date = new Date(rightLimit);
if(mode == modes.move)
task.start_date = new Date(task.end_date - diff);
}
if(+task.start_date < +leftLimit){
task.start_date = new Date(leftLimit);
if(mode == modes.move)
task.end_date = new Date(+task.start_date + diff);
}
}
});
Drag parent task with its children