Перетаскивание облегчает изменение дат начала и окончания задач, а также их длительности.
По умолчанию функция drag-and-drop включена, что позволяет пользователям перемещать задачи по своим строкам на временной шкале.
Для настройки поведения drag-and-drop можно использовать следующие события:
Вот несколько распространённых сценариев, когда настройка поведения перетаскивания может быть полезна:
Чтобы отключить перетаскивание для некоторых задач, используйте событие onBeforeTaskDrag:
gantt.attachEvent("onBeforeTaskDrag", function(id, mode, e){
if(gantt.getGlobalTaskIndex(id)%2==0){
return false; // блокирует перетаскивание, если глобальный индекс задачи нечётный
}
return true; // разрешает перетаскивание, если глобальный индекс задачи чётный
});
Чтобы ограничить возможность перетаскивания задач за пределы определённых дат, используйте событие onTaskDrag.
Событие onTaskDrag:
Вкратце, процесс выглядит так:
Например, чтобы запретить пользователям перетаскивать задачи за пределы диапазона "31 марта 2020 — 11 апреля 2020":
Используйте следующий код:
Запрет перетаскивания задач за пределы интервала — [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);
}
}
});
Related sample: Drag parent task with its children
Чтобы при перемещении родительской задачи перетаскивались и её дочерние задачи, используйте событие onTaskDrag (подробнее об этом событии см. выше):
gantt.attachEvent("onTaskDrag", function(id, mode, task, original){
var modes = gantt.config.drag_mode;
if(mode == modes.move){
var diff = task.start_date - original.start_date;
gantt.eachTask(function(child){
child.start_date = new Date(+child.start_date + diff);
child.end_date = new Date(+child.end_date + diff);
gantt.refreshTask(child.id, true);
},id );
}
});
// округляет позиции дочерних задач по текущему масштабу
gantt.attachEvent("onAfterTaskDrag", function(id, mode, e){
var modes = gantt.config.drag_mode;
if(mode == modes.move ){
var state = gantt.getState();
gantt.eachTask(function(child){
child.start_date = gantt.roundDate({
date:child.start_date,
unit:state.scale_unit,
step:state.scale_step
});
child.end_date = gantt.calculateEndDate(child.start_date,
child.duration, gantt.config.duration_unit);
gantt.updateTask(child.id);
},id );
}
});
Эта возможность доступна только в редакции Gantt PRO.
По умолчанию задачи, помеченные как тип project, не могут быть перетаскиваемыми. Вы можете включить перетаскивание проектов с помощью опции drag_project:
gantt.config.drag_project = true;
Related sample: Draggable projects
Существует несколько способов перемещения задач вместе с их зависимыми задачами. Подробную информацию вы найдёте в отдельной статье: Перетаскивание задач вместе с их зависимыми задачами.
Вы можете задать минимальную длительность задачи с помощью настройки min_duration.
Этот параметр определяет минимальный размер задачи при изменении её длительности и предотвращает появление задач с нулевой длительностью.
Значение указывается в миллисекундах:
// 1 день
gantt.config.min_duration = 24*60*60*1000;
//ИЛИ
// 1 час
gantt.config.min_duration = 60*60*1000;
При работе с крупными Gantt-диаграммами перетаскивание задачи на большое расстояние или создание связей между удалёнными задачами может быть затруднено.
Функция autoscroll помогает автоматически прокручивать диаграмму во время перетаскивания. Она включена по умолчанию, но может быть управляемой через опцию autoscroll.
gantt.config.autoscroll = false;
gantt.init("gantt_here");
Также вы можете настроить скорость автопрокрутки (в миллисекундах) с помощью свойства autoscroll_speed:
gantt.config.autoscroll = true;
gantt.config.autoscroll_speed = 50;
gantt.init("gantt_here");
Чтобы запретить изменение размера некоторых задач, есть два подхода:
gantt.templates.task_class = function(start, end, task){
if(task.no_resize) { // no_resize — это пользовательское свойство для примера
return "no_resize";
}
return "";
Затем скройте ручки изменения размера с помощью CSS:
.no_resize .gantt_task_drag{
display: none !important;
}
gantt.attachEvent("onBeforeTaskDrag", function(id, mode, e){
if(mode === "resize" && gantt.getTask(id).no_resize){
return false;
}
return true;
});
Режим "resize" в drag-and-drop означает, что пользователь изменяет либо дату начала, либо дату окончания задачи.
Чтобы определить, какая дата изменяется, проверьте флаг gantt.getState().drag_from_start:
gantt.attachEvent("onBeforeTaskDrag", function(id, mode, e){
if(mode === "resize"){
if(gantt.getState().drag_from_start === true) {
// изменяется дата начала
} else {
// изменяется дата окончания
}
}
return true;
});
Ручки изменения размера можно выбрать с помощью следующих селекторов:
Чтобы отключить изменение даты начала, используйте такой CSS:
.gantt_task_drag[data-bind-property="start_date"]{
display: none !important;
}
Аналогично, чтобы отключить изменение даты окончания:
.gantt_task_drag[data-bind-property="end_date"]{
display: none !important;
}
В качестве альтернативы, вы можете запретить изменение размера через событие onBeforeTaskDrag. Если обработчик возвращает false, изменение размера будет запрещено:
gantt.attachEvent("onBeforeTaskDrag", function(id, mode, e){
if(mode === "resize"){
if(gantt.getState().drag_from_start === true) {
return false;
} else {
// изменение даты окончания разрешено
}
}
return true;
});
К началу