Я использую DHTMLX Диаграмма Ганта .Как часть моего проекта, я создаю множество пользовательских слоев для работы с диаграммой, но, к сожалению, это делает мой код очень раздутым, так как нужно объявлять каждую задачу как слой.Моей первоначальной мыслью было добавить задачи, используя цикл и массив объектов.Когда я попробовал этот подход, он не работал, и ничего не отображалось.
Вот мой код:
//Gantt Initilisation
document.addEventListener("DOMContentLoaded", function (event) {
// Specifying the date format
gantt.config.xml_date = "%Y-%m-%d %H:%i";
gantt.config.readonly = true;
// Initializing gantt
gantt.init("positionsReport");
// Initiating data loading
gantt.load("/api/data/get");
// Initializing dataProcessor
var dp = new gantt.dataProcessor("/api/");
//Convert date to a usable format
gantt.attachEvent("onTaskLoading", function (task) {
task.options_start = gantt.date.parseDate(task.options_start, "xml_date");
task.options_end = gantt.date.parseDate(task.options_end, "xml_date");
task.f2_onhire = gantt.date.parseDate(task.f2_onhire, "xml_date");
task.f2_offhire = gantt.date.parseDate(task.f2_offhire, "xml_date");
task.f2_options_start = gantt.date.parseDate(task.f2_options_start, "xml_date");
task.f2_options_end = gantt.date.parseDate(task.f2_options_end, "xml_date");
task.f3_onhire = gantt.date.parseDate(task.f3_onhire, "xml_date");
task.f3_offhire = gantt.date.parseDate(task.f3_offhire, "xml_date");
return true;
});
Это базовая настройка перед любой работой со слоями, яинициализируйте Гант, преобразуйте несколько дат в формат, который он понимает, а затем определите мой API и необходимые данные.
//Fixture Layers
gantt.addTaskLayer(function draw_planned(task) {
var fixtureArray = [
{
onhire: task.start_date,
offhire: task.end_date,
charterer: task.current_charterer
},
{
onhire: task.f2_onhire,
offhire: task.f2_offhire,
charterer: task.f2_charterer
},
{
onhire: task.f3_onhire,
offhire: task.f3_offhire,
charterer: task.f3_charterer
}
];
Для целей этого вопроса я создал короткий массив на основе данных задачиМне нужно, что ограничено тремя элементами.
for (i = 0; i < fixtureArray.length; i++) {
var sizes = gantt.getTaskPosition(fixtureArray, fixtureArray.onhire, fixtureArray.offhire);
var el = document.createElement('div');
el.className = 'gantt_task_content';
return el;
}
return false;
});
Затем я пытаюсь создать необходимые слои для каждого элемента в моем массиве.
gantt.config.columns = [
{ name: "text", tree: false, width: 150, resize: true, align: "left", label: "Vessel" },
{ name: "start_date", align: "center", width: 150, resize: true, align: "left", label: "Onhire" },
{ name: "duration", align: "center", width: 70, resize: true, hide: true }
];
//Month format
gantt.config.scale_unit = "month";
gantt.config.date_scale = "%M";
//View
gantt.config.start_date = new Date(2019, 01, 01);
gantt.config.end_date = new Date(2020, 01, 01);
// and attaching it to gantt
dp.init(gantt);
// setting the REST mode for dataProcessor
dp.setTransactionMode("REST");
});
Затем я заканчиваю сдиапазон дат, настройки масштаба и режима покоя, а также окончательный оператор инициализации.
Диаграмма Ганта работает нормально, сообщений об ошибках нет, но она отображает только один элемент из моего цикла массива, остальные не отображаются.Правильный ли мой подход для этой настройки?