Перейти к основному содержимому

Типы задач

информация

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

Существует 3 заранее определённых типа задач, которые можно представить в диаграмме Гantt (вы также можете добавить свой собственный тип):

  1. Обычная задача (по умолчанию).
  2. Задача проекта.
  3. Веха.

task_types

Чтобы задать тип задачи, используйте свойство type элемента данных (значения хранятся в объекте types:)

Specifying the type of a task in the data set
const data = {
tasks: [
{ id: 1, text: "Project #1", type: "project", open: true },
{ id: 2, text: "Task #1", start_date: "12-04-2025", duration: 3, parent: 1 },
{ id: 3, text: "Alpha release", start_date: "16-04-2025", type: "milestone", parent: 1 },
{ id: 4, text: "Task #2", start_date: "17-04-2025", duration: 3, parent: 1 },
],
links: [
{ id: 1, source: "1", target: "2", type: "1" },
{ id: 2, source: "2", target: "3", type: "0" },
{ id: 3, source: "3", target: "4", type: "0" },
],
};

Связанный пример: Проекты и вехи

Регулярные задачи

По умолчанию dhtmlxGantt обеспечивает создание обычных задач (задач с type="task").

type_task

Specifying regular tasks
const data = { 
tasks: [
{ id: 2, text: "Task #1", start_date: "12-04-2025", duration: 3, parent: 1 },
],
links: [],
};
//or
const data = {
tasks: [
{ id: 2, text: "Task #1", start_date: "12-04-2025", duration: 3, parent: 1, type: "task" },
],
links: [],
};

Связанный пример: Проекты и вехи

Задачи с type="task" можно охарактеризовать следующим образом:

  • Может иметь 1 родителя и любое количество дочерних задач.
  • Можно перетаскивать и изменять размер.
  • Не зависят от дочерних задач, т.е. если пользователь перетаскивает дочернюю задачу обычной задачи, сама задача не изменяет свою длительность или прогресс соответственно.
  • Может появляться на родительских проектах. См. детали.
  • Может быть скрыта на таймлайне. См. детали.

Задачи проекта

Задача проекта — это задача, которая начинается, когда начинается её самая ранняя дочерняя задача, и заканчивается, когда заканчивается её самая поздняя дочерняя задача.

заметка

Различие между задачей проекта и обычной задачей состоит в том, что длительность задачи проекта зависит от её дочерних задач и изменяется соответственно.

type_project

Specifying project tasks
const data = {
tasks: [
{ id: 1, text: "Project #1", type: "project", open: true },
{ id: 2, text: "Task #1", start_date: "12-04-2025", duration: 3, parent: 1 },
{ id: 3, text: "Alpha release", start_date: "16-04-2025", type: "milestone", parent: 1 },
{ id: 4, text: "Task #2", start_date: "17-04-2025", duration: 3, parent: 1 },
],
links: [],
};

Связанный пример: Проекты и вехи

Задачи с type="project" можно охарактеризовать следующим образом:

  • Может иметь 1 родителя и любое количество дочерних задач.
  • Не может быть перетаскиваема и изменяема по размеру, если явно не включено перетаскивание через конфигурацию drag_project.
  • Зависит от дочерних задач, т.е. если пользователь перетаскивает дочернюю задачу задач проекта, длительность этой задачи изменяется.
  • Игнорируются свойства start_date, end_date, duration.
  • Не может быть перетащена, если у неё нет дочерних задач.
  • Прогресс проекта задаётся явно и по умолчанию не зависит от подзадач. Если хотите, чтобы он считывался автоматически — нужно написать код. См. примеры.
заметка

Чтобы обеспечить возможность добавления задач проекта, прочитайте статью Milestone. Возможность добавлять вехи гарантирует, что ваши конечные пользователи смогут добавлять задачи проекта.

Вехи

Milestone — задача нулевой продолжительности, которая используется для отметки важных дат проекта (подробнее).

type_milestone

Specifying milestones
const data = {
tasks: [
{ id: 3, text: "Alpha release", start_date: "16-04-2025", type: "milestone", parent: 1 },
],
links: [],
};

Связанный пример: Проекты и вехи

Задачи с type="milestone" можно охарактеризовать следующим образом:

  • Может иметь 1 родителя и любое количество дочерних задач.
  • Не может быть перетаскнута и изменяема.
  • Имеют нулевую продолжительность и сохраняют её всё время.
  • Игнорируются свойства end_date, duration, progress.
  • Может появляться на родительских проектах. См. детали.
  • Может быть скрыта на таймлайне. См. детали.
заметка

Чтобы обеспечить возможность добавления вех, прочитайте статью Milestone.

Специфический lightbox для каждого типа задачи

Каждый тип задачи имеет свой набор характеристик. Поэтому для каждого типа можно определить индивидуальную конфигурацию формы деталей (lightbox). Все конфигурации хранятся в объекте lightbox.

Они:

  • gantt.config.lightbox.sections - для обычных задач.
  • gantt.config.lightbox.project_sections - для задач проекта.
  • gantt.config.lightbox.milestone_sections - для вех.

Настройки конфигурации по умолчанию следующие:

gantt.config.lightbox.sections = [
{ name: "description", type: "textarea", map_to: "text", height: 70, focus: true },
{ name: "time", type: "duration", map_to: "auto" }
];

gantt.config.lightbox.project_sections = [
{ name: "description", type: "textarea", map_to: "text", height: 70, focus: true },
{ name: "type", type: "typeselect", map_to: "type" },
{ name: "time", type: "duration", map_to: "auto", readonly: true }
];

gantt.config.lightbox.milestone_sections = [
{ name: "description", type: "textarea", map_to: "text", height: 70, focus: true },
{ name: "type", type: "typeselect", map_to: "type" },
{ name: "time", type: "duration", map_to: "auto", single_date: true }
];

Когда пользователь изменяет тип задачи в соответствующем выпадающем списке, соответствующая конфигурация применяется к открывающемуся lightbox и он обновляется динамически.

Вы можете добавить собственный тип и указать соответствующую структуру lightbox для него.

Чтобы углубиться в детали конфигурации lightbox, можно прочитать раздел Configuring Edit Form.

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

Все типы задач определяются в объекте types.

Как правило, чтобы добавить пользовательский тип задач, нужно:

  1. Добавить новое значение в объект types.
  2. Определить индивидуальные настройки для нового типа.

Предположим, вы хотите добавить новый тип задач — meeting. Meeting будет обычной задачей, но окрашен в другой цвет и будет иметь другие поля в lightbox.

custom_task_type

Чтобы определить новый тип с именем meeting и задать для него индивидуальный lightbox, используйте следующую технику:

Добавьте новый тип в объект types:

gantt.config.types.meeting = "type_id";

где "meeting" — программируемое имя типа. Оно ничего не влияет на функциональность. Единственная цель программируемого имени типа — сделать работу с типами более читаемой. "type_id" — идентификатор типа, который будет храниться в базе данных. Идентификатор типа должен быть уникальным внутри объекта types.

Задайте метку нового типа в элементе управления "typeselect":

gantt.locale.labels.type_meeting = "Meeting";

Укажите новую структуру lightbox для вновь созданного типа:

gantt.config.lightbox.meeting_sections = [
{ name: "title", type: "textarea", map_to: "text", height: 20, focus: true },
{ name: "details", type: "textarea", map_to: "details", height: 70 },
{ name: "type", type: "typeselect", map_to: "type" },
{ name: "time", type: "time", map_to: "auto", height: 72 }
];

gantt.locale.labels.section_title = "Subject";
gantt.locale.labels.section_details = "Details";

Укажите стиль для нового типа и примените его с помощью шаблона task_class:

.meeting_task{
border:2px solid #BFC518;
color:#6ba8e3;
background: #F2F67E;
}

.meeting_task .gantt_task_progress{
background:#D9DF29;
}
gantt.templates.task_class = (start, end, task) => {
return task.type === gantt.config.types.meeting
? "meeting_task"
: "";
};

Установите шаблон для текста задач типа "meeting" с использованием шаблона task_text:

gantt.templates.task_text = (start, end, task) =>
task.type === gantt.config.types.meeting
? `Meeting: <b>${task.text}</b>`
: task.text;

Связанный пример: Custom task type

Пользовательское отображение типов задач

Чтобы настроить внешний вид существующих типов задач, используйте опцию type_renderers. Эта опция позволяет переопределять функции, отвечающие за отображение разных типов задач на странице.

custom_look

gantt.config.type_renderers["project"] = (task, defaultRender) => {
const taskBar = document.createElement("div");
taskBar.setAttribute(gantt.config.task_attribute, task.id);
taskBar.className = "custom-project";

const taskSize = gantt.getTaskPosition(task);
taskBar.innerHTML = [
"<div className='project-left'></div>",
"<div className='project-right'></div>"
].join('');

taskBar.style.left = `${taskSize.left}px`;
taskBar.style.top = `${taskSize.top + 7}px`;
taskBar.style.width = `${taskSize.width}px`;

return taskBar;
};

Связанный пример: Classic Look

Need help?
Got a question about the documentation? Reach out to our technical support team for help and guidance. For custom component solutions, visit the Services page.