Пользовательский Lightbox

Создание пользовательского Lightbox

Вы можете заменить стандартный lightbox в Gantt на полностью кастомизированную версию. Для этого есть два основных подхода:

1) Переопределение метода gantt.showLightbox:

gantt.showLightbox = function(id){
    // Здесь код пользовательской формы
}
  • id - (строка/число) - представляет собой ID задачи.

Для помощи в реализации пользовательского lightbox вы также можете использовать метод gantt.hideLightbox.

Начните с создания HTML-контейнера, например, "my-form," который будет содержать пользовательский lightbox:

<div id="my-form">
 <label for="description">Текст задачи
  <input type="text" name="description" value="" >
 </label>
 <br>
 <input type="button" name="save" value="Сохранить">
 <input type="button" name="close" value="Закрыть">
 <input type="button" name="delete" value="Удалить">
</div>

Теперь вы можете настроить пользовательский lightbox, используя следующую настройку:

var taskId = null;
 
gantt.showLightbox = function(id) {
    taskId = id;
    var task = gantt.getTask(id);
 
    var form = getForm();
    var input = form.querySelector("[name='description']");
    input.focus();
    input.value = task.text;
 
    form.style.display = "block";
 
    form.querySelector("[name='save']").onclick = save;
    form.querySelector("[name='close']").onclick = cancel;
    form.querySelector("[name='delete']").onclick = remove;
};
 
gantt.hideLightbox = function(){
    getForm().style.display = "";
    taskId = null;
}
 
function getForm() {
    return document.getElementById("my-form");
};
 
function save() {
    var task = gantt.getTask(taskId);
 
    task.text = getForm().querySelector("[name='description']").value;
 
    if(task.$new){
        delete task.$new;
        gantt.addTask(task,task.parent);
    }else{
        gantt.updateTask(task.id);
    }
 
    gantt.hideLightbox();
}
 
function cancel() {
    var task = gantt.getTask(taskId);
 
    if(task.$new)
        gantt.deleteTask(task.id);
    gantt.hideLightbox();
}
 
function remove() {
    gantt.deleteTask(taskId);
    gantt.hideLightbox();
}

2) Использование события onBeforeLightbox. Этот метод включает в себя:

  • Определение момента, когда lightbox собирается появиться.
  • Предотвращение отображения стандартного lightbox.
  • Отображение пользовательской формы и заполнение её данными задачи.

Вот пример:

gantt.attachEvent("onBeforeLightbox", function(id) {
    var task = gantt.getTask(id);
    if(task.$new){
        dhtmlx.confirm({
            text:"Создать задачу?",
            callback: function(res){
                if(res){
                    // Применить значения
                    delete task.$new;
                    gantt.addTask(task);
                }else{
                    gantt.deleteTask(task.id);
                }
            }
        });
        return false;
    }
    return true;
});

Обработка действий в пользовательской форме

Когда пользователь взаимодействует с пользовательской формой, вам нужно будет вручную извлечь значения формы и обновить соответствующую задачу с помощью таких API, как gantt.addTask, gantt.updateTask и gantt.deleteTask.

Для новых задач (созданных нажатием кнопки 'плюс') объект задачи будет включать свойство $new. Если пользователь отменяет создание, задача должна быть удалена.

Вы можете управлять действиями по закрытию lightbox, как показано ниже. Тип действия — 'save', 'cancel', или 'delete' — передается в качестве параметра action:

switch(action){
   case "save":
      task.text = ''; // Применить значения формы
 
      // Добавить новую задачу или обновить существующую
      if(task.$new){
        delete task.$new;
        gantt.addTask(task,task.parent)
      }else{
        gantt.updateTask(id);
      }
 
      break;
   case "cancel":
      // Если отмена новой задачи, удалить её; иначе ничего не делать
      if(task.$new)
         gantt.deleteTask(id);
      break;
   case "delete":
      gantt.deleteTask(id);
      break;
}
К началу