Gantt-диаграмма dhtmlxGantt поддерживает отмену и повтор изменений, внесённых в диаграмму. Для активации этой функции включите плагин undo с помощью метода gantt.plugins.
gantt.plugins({
undo: true
});
По умолчанию Undo и Redo включены. Управлять поведением Undo/Redo можно с помощью параметров конфигурации undo и redo.
Undo и Redo также могут использоваться отдельно, если отключить одну из функций:
// здесь включён только Redo
gantt.config.undo = false;
gantt.config.redo = true;
Related sample: Undo/Redo changes in Gantt
Для отмены изменений, сделанных в Gantt, используйте метод undo:
gantt.undo();
Для повтора отменённых изменений используйте метод redo:
gantt.redo();
Начиная с версии 6.3, методы undo()/redo() также доступны через объект gantt.ext.undo. Подробнее см. в статье Undo Extension.
Действия пользователя в Gantt сохраняются в виде массивов, содержащих объекты команд. Gantt хранит стек последних выполненных команд. Расширение undo обрабатывает эти команды для выполнения обратных операций.
При отмене или повторе изменений расширение берёт последний объект команды и выполняет соответствующий метод.
Для получения стека действий отмены используйте метод getUndoStack:
var stack = gantt.getUndoStack();
Для получения стека действий повтора используйте метод getRedoStack:
var stack = gantt.getRedoStack();
Возвращаемый стек — это массив пользовательских действий. Каждое действие содержит набор команд:
Каждая команда — это объект со следующими свойствами:
Пример иллюстрации:
Метод getUndoStack() возвращает стек из 2 действий отмены. Первое содержит 3 команды, второе — 1 команду.
Начиная с версии 6.3, методы getUndoStack()/getRedoStack() также доступны через объект gantt.ext.undo. Подробнее см. в статье Undo Extension.
Очистить стеки команд Undo/Redo можно с помощью соответствующих методов API Gantt.
Для очистки стека undo используйте метод clearUndoStack:
gantt.clearUndoStack();
Для очистки стека redo используйте метод clearRedoStack:
gantt.clearRedoStack();
Начиная с версии 6.3, методы clearUndoStack()/clearRedoStack() также доступны через объект gantt.ext.undo. Подробнее — в статье Undo Extension.
Отменять или повторять изменения, внесённые программно, можно, комбинируя методы undo()/redo() с методом saveState() из объекта gantt.ext.undo.
Поскольку Gantt не отслеживает изменения, внесённые напрямую в коде, ему необходимо явно указать сохранить предыдущее состояние перед модификацией. Для этого вызывается saveState() перед изменением задачи или связи.
Также Gantt требуется сигнал о завершении обновлений — это делается через вызов updateTask() или updateLink(). Таким образом, предыдущее и новое состояния сохраняются в стеке undo.
Например, следующий код возвращает текст задачи после его программного изменения:
const undoExtension = gantt.ext.undo;
const task = gantt.getTask(1);
console.log(task.text);
// -> "task 1";
undoExtension.saveState(task.id, "task");
task.text = "modified"; gantt.updateTask(1);
console.log(task.text);
// -> "modified";
undoExtension.undo();
console.log(task.text);
// -> "task 1";
Здесь метод saveState() сохраняет исходный текст "task 1" до изменения его на "modified". Затем вызов gantt.ext.undo.undo() возвращает текст к исходному значению.
Подробнее о saveState() см. в статье Undo Extension.
Существует несколько настроек для кастомизации работы Undo.
Используйте параметр undo_actions, чтобы указать, какие действия будет обрабатывать Undo:
gantt.config.undo_actions = {
update:"update",
remove:"remove", // удаление элемента из хранилища данных
add:"add"
};
Для задания количества доступных шагов отмены используйте параметр undo_steps:
gantt.config.undo_steps = 10;
По умолчанию можно отменить до 10 действий.
Также можно определить, к каким сущностям применяется Undo, с помощью параметра undo_types:
gantt.config.undo_types = {
link:"link",
task:"task"
};
Существует несколько событий, связанных с функциональностью Undo/Redo: