Колонки грида настраиваются с помощью параметра columns.
// определение колонок по умолчанию
gantt.config.columns = [
{ name: "text", label: "Task name", width: "*", tree: true },
{ name: "start_date", label: "Start time", align: "center" },
{ name: "duration", label: "Duration", align: "center" },
{ name: "add", label: "", width: 44 }
];
Также доступна видеоинструкция по настройке колонок грида.
По умолчанию в гриде отображаются 4 колонки:
name="add"
отображает знак '+', который позволяет пользователям добавлять подзадачи.Обратите внимание, что вам не обязательно указывать параметр columns, чтобы отобразить стандартные колонки в гриде.
Параметр columns представляет собой массив, где каждый объект определяет одну колонку. Например, чтобы задать 5 колонок с названиями 'Task', 'Start Date', 'End Date', 'Holder' и 'Progress', укажите параметр columns следующим образом:
gantt.config.columns = [
{ name: "text", label: "Task name", tree: true, width: "*" },
{ name: "holder", label: "Holder", align: "center" },
{ name: "start_date", label: "Start time", align: "center" },
{ name: "end_date", label: "End date", align: "center" },
{ name: "progress", label: "Progress", align: "center" }
];
gantt.init("gantt_here");
Здесь 'text', 'holder', 'start_date', 'end_date' и 'progress' соответствуют названиям свойств данных.
Если объекты данных задачи содержат даты начала и окончания в формате "%Y-%m-%d" или "%d-%m-%Y" (без часов и минут), отображаемые даты окончания в стандартном формате могут отличаться от ожидаемых. Подробнее о форматировании дат окончания смотрите в статье Task end date display & Inclusive end dates.
Простой способ запретить пользователям добавлять подзадачи к определённым задачам — скрыть кнопку 'Add' с помощью CSS.
gantt.templates.grid_row_class = ( start, end, task ) => {
if ( task.$level > 1 ) {
return "nested_task"
}
return "";
};
.nested_task .gantt_add {
display: none !important;
}
Related sample: Predefined Project Structure
Чтобы управлять шириной колонки, используйте атрибут width в её объекте конфигурации:
gantt.config.columns = [
{ name: "text", label: "Task name", width: "*", tree: true },
{ name: "start_date", label: "Start time", width: 150 },
{ name: "duration", label: "Duration", width: 120 }
];
gantt.init("gantt_here");
Использование '*' для ширины позволяет колонке занять всё оставшееся пространство.
Имейте в виду, что ширина колонок грида зависит от двух настроек: параметра width самой колонки и общей grid_width. Если суммарная ширина колонок не совпадает с шириной грида, Gantt скорректирует одно из этих значений.
Вы можете использовать свойства min_width и max_width для ограничения ширины колонки при изменении размера:
gantt.config.columns = [
{ name: "text", label: "Task name", width: "*", tree: true, min_width: 150,
max_width: 300
},
{ name: "start_date", label: "Start time", width: 150 },
{ name: "duration", label: "Duration", width: 120 }
];
gantt.init("gantt_here");
Свойство min_width колонки перекрывает настройку gantt min_grid_column_width.
Минимальная ширина, до которой можно уменьшить грид, задаётся с помощью gantt.config.min_grid_column_width. Эта опция определяет минимальную ширину каждой колонки при изменении размера грида:
gantt.config.columns = [
{ name: "text", label: "Task name", width: 150, tree: true },
{ name: "start_date", label: "Start time", width: 100 },
{ name: "duration", label: "Duration", width: 50 }
];
gantt.config.min_grid_column_width = 30; // грид можно уменьшить до 90 px суммарно
gantt.init("gantt_here");
Related sample: Минимальная ширина грида
Также обратите внимание, что минимальная ширина грида при изменении размера зависит от минимальной ширины колонки 'add' (по умолчанию 44). Чтобы уменьшить грид меньше 44 px, задайте min_width для колонки 'add' следующим образом:
{ name: "add", label: "", min_width: 1 }
По умолчанию dhtmlxGantt заполняет грид, используя свойства данных, совпадающие с именами колонок. Например, если колонка имеет name:"holder", dhtmlxGantt ищет свойство 'holder' в JSON-данных и отображает его в этой колонке.
Если вы хотите отобразить в колонке комбинацию нескольких свойств данных, можно выбрать любое имя для колонки и задать шаблон данных с помощью атрибута template в параметре columns.
Например, вы можете назвать колонку name:"staff" и создать функцию-шаблон, возвращающую объединённые значения holder и progress:
gantt.config.columns = [
{ name: "text", label: "Task name", tree: true, width: "*" },
{ name: "start_date", label: "Start time", align: "center" },
{ name: "staff", label: "Holder(s)", template: (obj) => {
return `${obj.holder} (${obj.progress})`;
} }
];
gantt.init("gantt_here");
Чтобы выровнять текст по горизонтали в колонке, используйте атрибут align в её конфигурации:
gantt.config.columns = [
{ name: "text", label: "Task name", align: "center", tree: true },
{ name: "start_date", label: "Start time", align: "center" },
{ name: "duration", label: "Duration", align: "center" }
];
gantt.init("gantt_here");
Вы можете добавить колонку для отображения структурных номеров (WBS-кодов) задач. Для этого используйте метод getWBSCode в шаблоне колонки.
gantt.config.columns = [
{ name: "wbs", label: "WBS", width: 40, template: gantt.getWBSCode }, { name: "text", label: "Task name", width: 170, tree: true },
{ name: "start_date", label: "Start time", width: 90, align: "center" },
{ name: "duration", label: "Duration", width: 60, align: "center" },
{ name: "add", width: 40 }
];
Related sample: Show Task WBS Codes (Outline Numbers)
Метод getWBSCode возвращает WBS-код для конкретной задачи. Например, если вы загрузите в gantt следующие задачи:
gantt.parse({
tasks: [
{ id: 1, text: "Project", start_date: "28-03-2025", duration: 5, open: true },
{ id: 2, text: "Task #1", start_date: "01-04-2025", duration: 3, parent: 1 },
{ id: 3, text: "Task #2", start_date: "02-04-2025", duration: 4, parent: 1 }
],
links: []
});
и хотите получить WBS-код для задачи с id=3, передайте объект задачи в getWBSCode. Метод вернёт строку с WBS-кодом:
const wbsCode = gantt.getWBSCode(gantt.getTask(3)); // -> вернёт "1.2"
Можно получить объект задачи, передав её WBS-код в метод getTaskByWBSCode:
const task = gantt.getTaskByWBSCode("1.2");
// => { id: 3, text: "Task #2", start_date: …}
Эта функциональность доступна только в PRO-версии
Вы можете добавить специальные колонки грида, которые позволяют указывать тип ограничения по времени для задачи, а также дату ограничения, если выбранный тип этого требует. Эти колонки называются "constraint_type" и "constraint_date" соответственно.
gantt.config.columns = [
{ name: "constraint_type", align: "center", width: 100, resize: true,
editor: constraintTypeEditor, template: (task) => { //template logic }
},
{ name: "constraint_date", align: "center", width: 120, resize: true,
editor: constraintDateEditor, template: (task) => { //template logic }
},
...
];
Эти колонки связаны с объектами встроенного редактора, которые позволяют выбрать необходимый тип ограничения для задачи и изменить дату прямо в гриде.
const constraintTypeEditor = {
type: "select", map_to: "constraint_type", options: [
{ key: "asap", label: gantt.locale.labels.asap },
{ key: "alap", label: gantt.locale.labels.alap },
{ key: "snet", label: gantt.locale.labels.snet },
{ key: "snlt", label: gantt.locale.labels.snlt },
{ key: "fnet", label: gantt.locale.labels.fnet },
{ key: "fnlt", label: gantt.locale.labels.fnlt },
{ key: "mso", label: gantt.locale.labels.mso },
{ key: "mfo", label: gantt.locale.labels.mfo }
]
};
const constraintDateEditor = {
type: "date",
map_to: "constraint_date",
min: new Date(2025, 0, 1),
max: new Date(2030, 0, 1)
};
Related sample: Auto-Schedule From Project Start & Constraints
Эта функциональность доступна только в PRO-версии
Чтобы разрешить пользователям изменять ширину колонки путем перетаскивания её правой границы, включите атрибут resize в настройках соответствующей колонки:
gantt.config.columns = [
{ name: "text", resize: true, tree: true, width: "*" }, // 'resize' включён
{ name: "start_date", resize: true, min_width: 100 }, // ограничено 'min_width'
{ name: "duration", align: "center" }, // изменение размера отключено
{ name: "add", width: "44" }
];
Related sample: Grid columns resize events
Чтобы сделать весь грид изменяемым по ширине путем перетаскивания его границы, используйте опцию gantt.config.layout и определите объекты грида и разделителя с соответствующими настройками:
gantt.config.layout = {
css: "gantt_container",
rows: [
{
cols: [
{ view: "grid", id: "grid", scrollX: "scrollHor",
scrollY: "scrollVer"
},
{ resizer: true, width: 1 },
{ view: "timeline", id: "timeline", scrollX: "scrollHor",
scrollY: "scrollVer"
},
{ view: "scrollbar", id: "scrollVer", scroll: "y" }
]
},
{ view: "scrollbar", id: "scrollHor", scroll: "x", height: 20 }
]
};
gantt.init("gantt_here");
Чтобы зафиксировать ширину грида при изменении ширины колонок, установите опцию keep_grid_width в true:
gantt.config.columns = [
{ name: "text", width: "*", tree: true, resize: true },
{ name: "start_date", width: 100, align: "center" },
{ name: "duration", width: 70, align: "center" },
{ name: "add", width: 44 }
];
gantt.config.keep_grid_width = true; gantt.init("gantt_here");
Related sample: Grid columns resize events
dhtmlxGantt предоставляет 6 событий, связанных с изменением размера:
Для управления видимостью колонки используйте атрибут hide в конфигурации колонки.
Видимость можно изменять динамически, обновляя свойство 'hide' и обновляя отображение Gantt:
Эта функциональность доступна только в PRO-версии
Переключение между базовым и детализированным видом
gantt.config.columns = [
{ name: "text", label: "Task name", width: "*", tree: true, resize: true },
{ name: "start_date", label: "Start time" },
{ name: "duration", label: "Duration", width: 60, hide: true }, { name: "planned_start", label: "Planned start", width: 80, hide: true }, { name: "planned_end", label: "Planned end", width: 80, hide: true }, { name: "add", label: "", width: 36 }
];
const showDetails = false;
function toggleView() {
showDetails = !showDetails;
gantt.getGridColumn("duration").hide = !showDetails;
gantt.getGridColumn("planned_start").hide = !showDetails;
gantt.getGridColumn("planned_end").hide = !showDetails;
if (showDetails) {
gantt.config.grid_width = 600;
} else {
gantt.config.grid_width = 300;
}
gantt.render();
};
gantt.init("gantt_here");
Related sample: Hiding grid columns
Также доступно видео, демонстрирующее управление видимостью колонок в гриде.
Иногда требуется скорректировать внешний вид или поведение ячейки грида после её отрисовки.
Начиная с версии 7.1, в библиотеке появился атрибут onrender в конфигурации columns, который позволяет модифицировать ячейку после рендера, например:
gantt.config.columns = [
{ name: "text", tree: true, width: "*", resize: true },
{ name: "start_date", align: "center", resize: true },
{ name: "duration", align: "center", onrender: (task, node) => {
node.setAttribute("title", task.text);
} },
{ name: "add", width: 44 }
];
Другой вариант использования onrender — внедрение внешних компонентов в ячейки грида. Например, если вы используете DHTMLX Gantt с React и хотите вставить React-компонент в ячейку грида, следующий код демонстрирует, как это можно реализовать:
gantt.config.columns = [
{ name: "text", label: "Task name", tree: true, width: "*" },
{ name: "start_date", label: "Start time", align: "center" },
{ name: "duration", label: "Duration", align: "center" },
{
name: "external", label: "Element 1", align: "center",
onrender: (item, node) => {
return <DemoButton
text="Edit 1"
onClick={() => alert("Element as React Component")}
/>
}
}
];
Чтобы включить рендеринг React-компонента, необходимо указать конфигурацию gantt.config.external_render:
import ReactDOM from 'react-dom';
import React from 'react';
gantt.config.external_render = {
// проверяет, является ли элемент React-элементом
isElement: (element) => {
return React.isValidElement(element);
},
// рендерит React-элемент в DOM
renderElement: (element, container) => {
ReactDOM.render(element, container);
}
};
Процесс работы следующий:
Грид можно сделать прокручиваемым, включив свойство scrollable в конфигурации layout. Подробнее о привязке представлений layout к скроллбару.
Добавление горизонтального скроллбара в грид позволяет Gantt автоматически подстраивать ширину колонок при изменении размера грида. Подробнее о включении этой функции.
Кроме установки атрибута scrollable, необходимо добавить элемент горизонтального скроллбара в layout и связать его с гридом, как показано ниже:
gantt.config.layout = {
css: "gantt_container",
cols: [
{
width: 400,
minWidth: 200,
maxWidth: 600,
// добавление горизонтального скроллбара к гриду через атрибут scrollX
rows: [
{ view: "grid", scrollX: "gridScroll", scrollable: true, scrollY: "scrollVer" }, { view: "scrollbar", id: "gridScroll" } ]
},
{ resizer: true, width: 1 },
{
rows: [
{ view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer" },
{ view: "scrollbar", id: "scrollHor" }
]
},
{ view: "scrollbar", id: "scrollVer" }
]
};
При использовании отдельных скроллбаров для грида и временной шкалы, синхронизация их видимости гарантирует, что оба будут показаны или скрыты одновременно.
Это можно реализовать, присвоив обоим скроллбарам одну и ту же группу видимости:
gantt.config.layout = {
css: "gantt_container",
cols: [
{
width: 400,
minWidth: 200,
maxWidth: 600,
rows: [
{ view: "grid", scrollX: "gridScroll", scrollable: true,
scrollY: "scrollVer"
},
// горизонтальный скроллбар для грида
{ view: "scrollbar", id: "gridScroll", group: "horizontal" } ]
},
{ resizer: true, width: 1 },
{
rows: [
{ view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer" },
// горизонтальный скроллбар для временной шкалы
{ view: "scrollbar", id: "scrollHor", group: "horizontal" } ]
},
{ view: "scrollbar", id: "scrollVer" }
]
};
Если любой из скроллбаров в группе видим, то будут показаны все скроллбары этой группы.
Related sample: Horizontal scroll inside Grid
Подробнее о стилизации ячеек грида смотрите в разделе Работа со стилями Gantt.
К началу