addTaskLayer

отображает дополнительный слой с пользовательскими элементами для задачи в области временной шкалы

string|DOMElement addTaskLayer(TaskLayerRender|TaskLayerConfig func);
funcTaskLayerRender|TaskLayerConfigфункция рендеринга или объект конфигурации
string|DOMElementэлемент, который будет отображаться в слое

Available only in PRO Edition

Example

gantt.init("gantt_here");
gantt.addTaskLayer(function draw_deadline(task) {
    if (task.deadline) {
        var el = document.createElement('div');
        el.className = 'deadline';
        var sizes = gantt.getTaskPosition(task, task.deadline);
 
        el.style.left = sizes.left + 'px';
        el.style.top = sizes.top + 'px';
 
        el.setAttribute('title', gantt.templates.task_date(task.deadline));
        return el;
    }
    return false;
});

Related samples

Details

Эта функциональность доступна только в PRO версии.

Аргумент может иметь следующие типы:

  • taskLayerRender (task, timeline, config, viewport): HTMLElement|boolean|void - функция принимает объект задачи в качестве параметра и должна возвращать DOM элемент, который будет отображаться в слое.

    • task - (Task) - объект задачи
    • timeline? - (any) - представление временной шкалы
    • config? - (GanttConfigOptions) - объект конфигурации Gantt
    • viewport? - (LayerViewport) - объект области видимости
  • taskLayerConfig - (object) - объект конфигурации для дополнительного слоя задачи. Имеет следующие свойства:

    • id? - (string | number) - необязательно, идентификатор слоя
    • renderer - (object) - обязательно, функция, отвечающая за рендеринг элементов слоя
      • render - (TaskLayerRender) - функция, возвращающая HTML элемент, который должен быть отрисован
      • update? - (Function): void - необязательно, функция, в которой можно обновить отрисованные HTML элементы
        • task - (Task) - объект задачи
        • node - (HTMLElement) - контейнер отрисованного узла
        • timeline? - (any) - представление временной шкалы
        • config? - (GanttConfigOptions) - объект конфигурации Gantt
        • viewport? - (LayerViewport) - объект области видимости
      • onrender? - (Function): void - необязательно, эта функция вызывается после завершения рендеринга. Можно использовать для рендеринга нативных компонентов (например, с помощью метода ReactDOM.render)
        • task - (Task) - объект задачи
        • node - (HTMLElement) - контейнер отрисованного узла
        • view? - (any) - ячейка макета, в которую добавляется слой (по умолчанию временная шкала)
      • getRectangle? - (Function): { left: number, top: number, height: number, width: number } | void - необязательно, функция, возвращающая координаты прямоугольника области видимости
        • task - (Task) - объект задачи
        • view? - (any) - ячейка макета, в которую добавляется слой (по умолчанию временная шкала)
        • config? - (GanttConfigOptions) - объект конфигурации Gantt
        • gantt? - (GanttStatic) - объект Gantt
      • getVisibleRange - (Function): {start: number, end: number} | undefined | void - функция, возвращающая объект с видимым диапазоном
        • gantt? - (GanttStatic) - объект Gantt
        • view? - (any) - ячейка макета, в которую добавляется слой (по умолчанию временная шкала)
        • config? - (GanttConfigOptions) - объект конфигурации Gantt
        • datastore? - (any) - объект хранилища задач
        • viewport? - (LayerViewport) - объект области видимости
    • container? - (HTMLElement) - необязательно, контейнер слоя
    • topmost? - (boolean) - необязательно, если true, элемент будет отображаться поверх задачи
    • filter? - (Function): boolean - необязательно, функция, принимающая объект задачи в качестве параметра. Если возвращает 'false', функция 'renderer' не будет вызвана для задачи
      • task - (Task) - объект задачи

Слой области видимости имеет следующие свойства:

  • viewport - (object) - объект области видимости слоя

    • x - (number) - левая позиция прямоугольника
    • x_end - (number) - правая позиция прямоугольника
    • y - (number) - верхняя позиция прямоугольника
    • y_end - (number) - нижняя позиция прямоугольника
    • width - (number) - ширина прямоугольника
    • height - (number) - высота прямоугольника
  • Обратите внимание, пользовательские слои будут сброшены после следующего вызова gantt.init

  • Вызов метода gantt.resetLayout() также сбросит пользовательские слои. Чтобы пользовательские слои отображались на странице, вам необходимо заново определить метод gantt.addTaskLayer после вызова resetLayout.

Умный рендеринг для пользовательских слоев

Умный рендеринг пытается отображать только те HTML элементы, которые в данный момент видны пользователю и не скрыты под горизонтальными и вертикальными полосами прокрутки.

Однако в случае пользовательских слоев Gantt не знает, где расположены пользовательские элементы, так как это полностью зависит от реализации функции рендеринга.

Как решение, умный рендеринг предполагает, что пользовательский элемент находится в той же строке, где и связанная с ним задача. Пользовательские элементы добавляются в разметку страницы, когда строки их связанных задач отображаются на экране. В этом режиме Gantt не учитывает позицию горизонтальной полосы прокрутки, пользовательский элемент будет отображаться в разметке, но не будет виден на странице из-за горизонтальной прокрутки.

Большую часть времени этого достаточно, но если у вас много слоев, вы можете захотеть оптимизировать рендеринг немного дальше, предоставив Gantt информацию о позиции пользовательских элементов.

Для этого необходимо использовать параметр object метода addTaskLayer() и предоставить объект renderer со следующими методами:

  • render - функция рендеринга
  • getRectangle - функция, возвращающая объект с координатами пользовательских элементов
gantt.addTaskLayer({
    renderer: {
        render: function(task, timeline, viewport){
            ...
            return  HTMLElement
        },
        getRectangle: function(task, view){
            ....
            return {left, top, height, width};
        }
    }
});

Логика рендеринга пользовательских элементов следующая:

1. Когда позиция горизонтальной прокрутки изменяется, умный рендер получает новые координаты области, видимой на экране в данный момент.
2. dhtmlxGantt вызывает функцию getRectangle для каждой задачи/ссылки, чтобы получить точные координаты пользовательского элемента.
3. Если функция getRectangle возвращает null, функция render не будет вызвана, и пользовательский элемент не будет отображен.
4. Если функция getRectangle возвращает объект с координатами задачи/ссылки и полученные координаты попадают в текущую область видимости, то будет вызвана функция render для отображения задачи/ссылки.

gantt.addTaskLayer({
    renderer: {
      render: function draw_planned(task) {
        if (task.planned_start && task.planned_end) {
          var sizes = gantt.getTaskPosition(task,task.planned_start,task.planned_end);
          var el = document.createElement('div');
          el.className = 'baseline';
          el.style.left = sizes.left + 'px';
          el.style.width = sizes.width + 'px';
          el.style.top = sizes.top + gantt.config.task_height + 13 + 'px';
          return el;
        }
        return false;
      },
      // определите getRectangle, чтобы связать слой с умным рендерингом
      getRectangle: function(task, view){
        return gantt.getTaskPosition(task, task.planned_start, task.planned_end);
      }
    }
});

Рендеринг видимых частей пользовательских элементов

Объект renderer метода addTaskLayer() предоставляет возможность обновления разметки узла пользовательского элемента и отображения видимого содержимого в текущей области видимости через метод update:

gantt.addTaskLayer({
    renderer: {
        render: function(task, timeline, viewport){
            ...
            return  HTMLElement
        },
        update: function(task, node, timeline, viewport){
            ...
            // поместите в node внутренний html текущую видимую часть элемента
        },
        getRectangle: function(task, view){
            ....
            return {left, top, height, width};
        }
    }
});
  • update - позволяет обновлять внутренний html пользовательского элемента, т. е. скрывать ячейки, которые не видны, и отображать видимые

Метод update вызывается после того, как срабатывает событие onGanttScroll. Он предоставляет узел задачи (созданный изначально методом render) и текущую область видимости.

Рендеринг видимых строк задач

Начиная с версии 7.1.8, объект renderer метода addTaskLayer() позволяет получить видимый диапазон строк задач с помощью функции getVisibleRange:

gantt.addTaskLayer({
    renderer: {
        render: function(task, timeline, viewport){
            ...
            return  HTMLElement
        },
        getVisibleRange: function(){
            ...
            return { 
                start: indexStart,
                end: indexEnd
            }
        }
    }
});
  • getVisibleRange - функция, возвращающая объект с начальным и конечным индексами видимых строк задач. Если задача выходит за пределы указанного диапазона, для нее не будет отрисован дополнительный слой.

Если функция getVisibleRange возвращает false вместо объекта, Gantt предполагает, что используется весь диапазон задач, и дополнительный слой будет отрисован, даже если задача не видна на экране.

Колбэк рендеринга элемента

Объект renderer метода addTaskLayer() предоставляет колбэк onrender:

gantt.addTaskLayer({
    renderer: {
        render: function(task, timeline, viewport){
            ...
            return  HTMLElement
        },
        onrender: function(item, node, view){
            console.log("render", item, node)
        }
    }
});

Функция onrender вызывается всякий раз, когда элемент данных слоя отрисовывается в DOM. Аргументы предоставляют доступ к элементу данных, который был отрисован, к результату DOM элемента и к объекту представления, который вызвал рендер (grid или временная шкала).

Колбэк может использоваться для модификации DOM элементов после их отрисовки в DOM или для инициализации сторонних виджетов внутри отрисованных элементов.

See also
  • API
  • Articles
  • К началу