diff --git a/edit-mode/function/ganttConfig.js b/edit-mode/function/ganttConfig.js
index 3aec5b2..34beb4a 100644
--- a/edit-mode/function/ganttConfig.js
+++ b/edit-mode/function/ganttConfig.js
@@ -24,11 +24,10 @@ const axiosInstance = axios.create({
});
axiosInstance.interceptors.request.use(async (config) => {
- try{
+ try {
$("body").addClass("loading");
}
- catch(e)
- {
+ catch (e) {
$("body").removeClass("loading");
alert('Error request' + e);
}
@@ -40,8 +39,7 @@ axiosInstance.interceptors.response.use(async (config) => {
try {
$("body").removeClass("loading");
}
- catch(e)
- {
+ catch (e) {
$("body").removeClass("loading");
alert('Error response' + e);
}
@@ -65,17 +63,17 @@ $.ajaxSetup({
});
$(document).on({
- ajaxStart: function(){
+ ajaxStart: function () {
$("body").addClass("loading");
},
- ajaxStop: function(){
+ ajaxStop: function () {
$("body").removeClass("loading");
}
});
gantt.plugins({
drag_timeline: true,
- critical_path: true ,
+ critical_path: true,
auto_scheduling: true
});
@@ -84,8 +82,8 @@ gantt.config.auto_scheduling = true;
gantt.config.fit_tasks = true;
if (!base_url) {
base_url = `https://api-iu.ospro.id/api/`;
-}else{
- base_url = base_url+"/";
+} else {
+ base_url = base_url + "/";
}
// gantt plugins
gantt.plugins({
@@ -109,7 +107,7 @@ var colHeader = '
';
optionsContent += '
';
- optionsContent += '
';
+ optionsContent += '
';
optionsContent += !hasChild ? '
' : '';
optionsContent += !hasChild ? ' ' : '';
optionsContent += !hasChild ? '
' : '';
@@ -125,16 +123,16 @@ var formatter = gantt.ext.formatters.durationFormatter({
format: "auto"
});
-var progressEditor = {type: "progressCustom", map_to: "progress", min:0, max: 100};
-var costPlanningEditor = {type: "costPlanningEditor", map_to: "rencana_biaya", min:0};
+var progressEditor = { type: "progressCustom", map_to: "progress", min: 0, max: 100 };
+var costPlanningEditor = { type: "costPlanningEditor", map_to: "rencana_biaya", min: 0 };
var linksFormatter = gantt.ext.formatters.linkFormatter({ durationFormatter: formatter });
-function satuanLabel(task){
+function satuanLabel(task) {
var value = task.satuan_id;
var list = gantt.serverList("satuan");
- if(value){
- for(var i = 0; i < list.length; i++){
- if(list[i].key == parseInt(value)){
+ if (value) {
+ for (var i = 0; i < list.length; i++) {
+ if (list[i].key == parseInt(value)) {
return list[i].label;
}
}
@@ -145,28 +143,28 @@ function satuanLabel(task){
// use the default editor custom for end_date, but override set_value/get_value methods
var dateEditor = gantt.config.editor_types.date;
gantt.config.editor_types.end_date = gantt.mixin({
- set_value: function(value, id, column, node){
- var correctedValue = gantt.date.add(value, -1, "day");
- return dateEditor.set_value.apply(this, [correctedValue, id, column, node]);
- },
- get_value: function(id, column, node) {
- var selectedValue = dateEditor.get_value.apply(this, [id, column, node]);
- editEndDateTriggered = true;
- return gantt.date.add(selectedValue, 1, "day");
- },
+ set_value: function (value, id, column, node) {
+ var correctedValue = gantt.date.add(value, -1, "day");
+ return dateEditor.set_value.apply(this, [correctedValue, id, column, node]);
+ },
+ get_value: function (id, column, node) {
+ var selectedValue = dateEditor.get_value.apply(this, [id, column, node]);
+ editEndDateTriggered = true;
+ return gantt.date.add(selectedValue, 1, "day");
+ },
}, dateEditor);
var durationEditor = gantt.config.editor_types.duration;
gantt.config.editor_types.duration = gantt.mixin({
- get_value: function(id, column, node) {
- var old_value = gantt.getTask(id);
- var modifiedValue = durationEditor.get_value.apply(this, [id, column, node]);
+ get_value: function (id, column, node) {
+ var old_value = gantt.getTask(id);
+ var modifiedValue = durationEditor.get_value.apply(this, [id, column, node]);
editEndDateTriggered = true;
- if(old_value.duration == modifiedValue - 1){
- editDurationTriggered = true;
- return modifiedValue;
- }
- return modifiedValue - 1;
- },
+ if (old_value.duration == modifiedValue - 1) {
+ editDurationTriggered = true;
+ return modifiedValue;
+ }
+ return modifiedValue - 1;
+ },
}, durationEditor);
const editor = {
@@ -182,11 +180,11 @@ const editor = {
status: { type: "text", map_to: "status" },
job_count: { type: "number", map_to: "jumlah_pekerjaan", min: 0 },
job_unit: { type: "text", map_to: "satuan", min: 0 },
- bobot_planning:{ type: "number", map_to: "bobot_planning", min: 0 },
+ bobot_planning: { type: "number", map_to: "bobot_planning", min: 0 },
human_resource: (`
`),
- satuan:{type: "select", map_to: "satuan_id", options:gantt.serverList("satuan")}
+ satuan: { type: "select", map_to: "satuan_id", options: gantt.serverList("satuan") }
}
function addWithoutParent() {
@@ -257,11 +255,11 @@ function clickGridButton(id, action) {
}
}
-function createColumnsConfig(selectedColumns){
+function createColumnsConfig(selectedColumns) {
var newColumns = [];
- allColumns.forEach(function(column){
- if(selectedColumns[column.name]){
+ allColumns.forEach(function (column) {
+ if (selectedColumns[column.name]) {
newColumns.push(column);
}
});
@@ -270,159 +268,182 @@ function createColumnsConfig(selectedColumns){
}
var allColumns = [
- { name: "action", label: colHeader, align: "left", min_width: 115, template: colContent, resize: true },
- { name: "kode_sortname", label: "Kode / Sortname",align: "center", min_width: 120, editor: editor.kode_sortname, resize: true },
+ { name: "action", label: colHeader, align: "left", min_width: 115, template: colContent, resize: true },
+ { name: "kode_sortname", label: "Kode / Sortname", align: "center", min_width: 120, editor: editor.kode_sortname, resize: true },
{ name: "text", label: "Activity", tree: true, min_width: 150, editor: editor.text, resize: true },
{ name: "start_date", label: "Start Date", align: "center", min_width: 80, editor: editor.start_date, resize: true },
{ name: "end_date", label: "Finish Date", align: "center", min_width: 80, editor: editor.end_date, resize: true },
- { name: "planned_start", label: "Planned Start", align: "center", min_width: 80, editor: editor.planned_start, resize: true, template: function (text) {
- if (!text.planned_start) {
- return text.start_date;
+ {
+ name: "planned_start", label: "Planned Start", align: "center", min_width: 80, editor: editor.planned_start, resize: true, template: function (text) {
+ if (!text.planned_start) {
+ return text.start_date;
+ }
+ return text.planned_start;
}
- return text.planned_start;
- } },
- { name: "planned_end", label: "Planned End", align: "center", min_width: 80, editor: editor.planned_end, resize: true, template: function (text) {
- if (!text.planned_end) {
- return text.end_date;
+ },
+ {
+ name: "planned_end", label: "Planned End", align: "center", min_width: 80, editor: editor.planned_end, resize: true, template: function (text) {
+ if (!text.planned_end) {
+ return text.end_date;
+ }
+ return text.planned_end;
}
- return text.planned_end;
- } },
+ },
{ name: "duration", label: "Duration (Day)", align: "center", min_width: 50, resize: true, editor: editor.duration },
- { name: "rencana_biaya", label: "Cost Planning", align: "right", min_width: 100, resize: true, template: function (text) {
- if(!text.rencana_biaya){
- return
- }
- let rencana_biaya = roundToTwo(text.rencana_biaya)
- return "Rp. "+ formatRupiah(rencana_biaya)
- } },
- { name: "cost_actual", label: "Cost Actual", align: "right", min_width: 100, resize: true, template: function (text) {
- if(!text.biaya_actual){
- return
- }
- let biaya_actual = roundToTwo(text.biaya_actual)
- return "Rp. "+ formatRupiah(biaya_actual)
- } },
- { name: "assign_hr", label: "Assign To", align: "center", min_width: 150, resize: true, template: function (text) {
- if(text.type=="project" || text.type=="milestone" || text.type=="header"){
- return;
+ {
+ name: "rencana_biaya", label: "Cost Planning", align: "right", min_width: 100, resize: true, template: function (text) {
+ if (!text.rencana_biaya) {
+ return
+ }
+ let rencana_biaya = roundToTwo(text.rencana_biaya)
+ return "Rp. " + formatRupiah(rencana_biaya)
}
- let html = ``;
- var assign_hr = text.assign_hr
- if(!assign_hr || !assign_hr.length){
- html = `
Unassigned`;
- }else{
- if(assign_hr.length==1){
- html = `
${assign_hr[0]}`;
- }else{
- assign_hr.forEach(function(val, index) {
- html += `
${val.substr(0, 1)}`;
- });
+ },
+ {
+ name: "cost_actual", label: "Cost Actual", align: "right", min_width: 100, resize: true, template: function (text) {
+ if (!text.biaya_actual) {
+ return
}
+ let biaya_actual = roundToTwo(text.biaya_actual)
+ return "Rp. " + formatRupiah(biaya_actual)
}
- return `
+ },
+ {
+ name: "assign_hr", label: "Assign To", align: "center", min_width: 150, resize: true, template: function (text) {
+ if (text.type == "project" || text.type == "milestone" || text.type == "header") {
+ return;
+ }
+ let html = ``;
+ var assign_hr = text.assign_hr
+ if (!assign_hr || !assign_hr.length) {
+ html = `
Unassigned`;
+ } else {
+ if (assign_hr.length == 1) {
+ html = `
${assign_hr[0]}`;
+ } else {
+ assign_hr.forEach(function (val, index) {
+ html += `
${val.substr(0, 1)}`;
+ });
+ }
+ }
+ return `
${html}
`
- }
- },
- { name: "material", label: "Material", align: "center", min_width: 150, resize: true, template: function (text) {
- if(text.type=="project" || text.type=="milestone" || text.type=="header"){
- return;
}
- let html = ``;
- var assign_material = text.assign_material
-
- if(!assign_material || !assign_material.length){
- html = `
No Material`;
- }else{
- if(assign_material.length > 0 ){
- html = `
See Material`;
+ },
+ {
+ name: "material", label: "Material", align: "center", min_width: 150, resize: true, template: function (text) {
+ if (text.type == "project" || text.type == "milestone" || text.type == "header") {
+ return;
}
- }
- return `
+ let html = ``;
+ var assign_material = text.assign_material
+
+ if (!assign_material || !assign_material.length) {
+ html = `
No Material`;
+ } else {
+ if (assign_material.length > 0) {
+ html = `
See Material`;
+ }
+ }
+ return `
${html}
`
- } },
- { name: "expenses", label: "Overhead", align: "center", min_width: 150, resize: true, template: function (text) {
- if(text.type=="project" || text.type=="milestone" || text.type=="header"){
- return;
}
- let html = ``;
- var assign_expense = text.assign_expense
-
- if(!assign_expense || !assign_expense.length){
- html = `
No Overhead`;
- }else{
- if(assign_expense.length > 0 ){
- html = `
See Overhead`;
+ },
+ {
+ name: "expenses", label: "Overhead", align: "center", min_width: 150, resize: true, template: function (text) {
+ if (text.type == "project" || text.type == "milestone" || text.type == "header") {
+ return;
}
- }
- return `
+ let html = ``;
+ var assign_expense = text.assign_expense
+
+ if (!assign_expense || !assign_expense.length) {
+ html = `
No Overhead`;
+ } else {
+ if (assign_expense.length > 0) {
+ html = `
See Overhead`;
+ }
+ }
+ return `
${html}
`
- } },
- { name: "tools", label: "Tools", align: "center", min_width: 150, resize: true, template: function (text) {
- if(text.type=="project" || text.type=="milestone" || text.type=="header"){
- return;
}
- let html = ``;
- var assign_tools = text.assign_tools
-
- if(!assign_tools || !assign_tools.length){
- // html = `
Unassigned`;
- }else{
- if(assign_tools.length > 0 ){
- html = `
Assigned`;
+ },
+ {
+ name: "tools", label: "Tools", align: "center", min_width: 150, resize: true, template: function (text) {
+ if (text.type == "project" || text.type == "milestone" || text.type == "header") {
+ return;
}
- }
- return `
+ let html = ``;
+ var assign_tools = text.assign_tools
+
+ if (!assign_tools || !assign_tools.length) {
+ // html = `
Unassigned`;
+ } else {
+ if (assign_tools.length > 0) {
+ html = `
Assigned`;
+ }
+ }
+ return `
${html}
`
- } },
- // { name: "status", label: "Status", align: "center", editor: editor.status, resize: true },
- { name: "bobot_planning", label: "Bobot Activity (%)", align: "center", editor: editor.bobot_planning, resize: true, min_width: 115, template: function (text) {
- let bobot = parseFloat(text.bobot_planning);
- if(bobot.toFixed(2) > 100){
- gantt.alert("Bobot tidak boleh lebih dari 100%!");
- return;
}
- if(!text.bobot_planning){
- return
- }
- let bobot_planning = parseFloat(text.bobot_planning);
- return roundToTwo(bobot_planning);
- } },
- { name: "progress", label: "Actual Progress (%)", align: "center", editor: progressEditor ,min_width: 125, template: function (text) {
- let progress = text.progress
- progress = progress*100
- return roundToTwo(progress);
- }, resize: true },
- { name:"progress_actual", label: "Total Actual Progress (%)", align: "center", min_width: 150, template: function (text) {
- let progress = text.progress
- progress = progress*100
- if(progress.toFixed(2) > 100){
- gantt.alert("Bobot tidak boleh lebih dari 100%!");
- return;
- }
- let bobot = text.bobot_planning
- let actual = (progress*bobot) / 100
- return roundToTwo(actual);
- }, resize: true },
- { name: "jumlah_pekerjaan", label: "Volume Plan", align: "center", min_width: 100, resize: true, editor:editor.job_count },
- { name: "jobs_done", label: "Report", align: "center", min_width: 100, resize: true, template: function (text) {
- if(text.type=="project" || text.type=="milestone" || text.type=="header"){
- return;
+ },
+ // { name: "status", label: "Status", align: "center", editor: editor.status, resize: true },
+ {
+ name: "bobot_planning", label: "Bobot Activity (%)", align: "center", editor: editor.bobot_planning, resize: true, min_width: 115, template: function (text) {
+ let bobot = parseFloat(text.bobot_planning);
+ if (bobot.toFixed(2) > 100) {
+ gantt.alert("Bobot tidak boleh lebih dari 100%!");
+ return;
+ }
+ if (!text.bobot_planning) {
+ return
+ }
+ let bobot_planning = parseFloat(text.bobot_planning);
+ return roundToTwo(bobot_planning);
}
+ },
+ {
+ name: "progress", label: "Actual Progress (%)", align: "center", editor: progressEditor, min_width: 125, template: function (text) {
+ let progress = text.progress
+ progress = progress * 100
+ return roundToTwo(progress);
+ }, resize: true
+ },
+ {
+ name: "progress_actual", label: "Total Actual Progress (%)", align: "center", min_width: 150, template: function (text) {
+ let progress = text.progress
+ progress = progress * 100
+ if (progress.toFixed(2) > 100) {
+ gantt.alert("Bobot tidak boleh lebih dari 100%!");
+ return;
+ }
+ let bobot = text.bobot_planning
+ let actual = (progress * bobot) / 100
+ return roundToTwo(actual);
+ }, resize: true
+ },
+ { name: "jumlah_pekerjaan", label: "Volume Plan", align: "center", min_width: 100, resize: true, editor: editor.job_count },
+ {
+ name: "jobs_done", label: "Report", align: "center", min_width: 100, resize: true, template: function (text) {
+ if (text.type == "project" || text.type == "milestone" || text.type == "header") {
+ return;
+ }
- if(text.jobs_done == 0){
- html = `
No Report`;
- }else{
- html = `
See Report`;
- }
- return `
+ if (text.jobs_done == 0) {
+ html = `
No Report`;
+ } else {
+ html = `
See Report`;
+ }
+ return `
${html}
`
- } },
- { name: "satuan", label: "UOM", align: "center", min_width: 100, resize: true, editor:editor.satuan, template: satuanLabel },
+ }
+ },
+ { name: "satuan", label: "UOM", align: "center", min_width: 100, resize: true, editor: editor.satuan, template: satuanLabel },
{
name: "predecessor", label: "Predecessor", align: "center", min_width: 100, template: function (text) {
let links = text.$target
@@ -462,12 +483,12 @@ gantt.config.columns = createColumnsConfig({
assign_hr: true,
material: true,
tools: true,
- expenses: true,
+ expenses: true,
bobot_planning: true,
progress: true,
progress_actual: true,
jumlah_pekerjaan: true,
- jobs_done:true,
+ jobs_done: true,
satuan: true,
predecessor: true,
updated_by: true
@@ -495,14 +516,14 @@ gantt.addTaskLayer({
var el = document.createElement('div');
el.className = 'baseline';
el.style.left = sizes.left - 6 + 'px';
- el.style.width = sizes.width + 10+ 'px';
- el.style.height= sizes.height + 'px';
+ el.style.width = sizes.width + 10 + 'px';
+ el.style.height = sizes.height + 'px';
el.style.top = sizes.top + 2 + 'px';
return el;
}
return false;
},
- getRectangle: function(task, view){
+ getRectangle: function (task, view) {
if (task.planned_start && task.planned_end) {
return gantt.getTaskPosition(task, task.planned_start, task.planned_end);
}
@@ -521,41 +542,41 @@ gantt.templates.task_class = function (start, end, task) {
}
};
-gantt.templates.task_end_date = function(date){
- return gantt.templates.task_date(new Date(date.valueOf() - 1));
+gantt.templates.task_end_date = function (date) {
+ return gantt.templates.task_date(new Date(date.valueOf() - 1));
};
var gridDateToStr = gantt.date.date_to_str("%Y-%m-%d");
-gantt.templates.grid_date_format = function(date, column){
- if(column === "end_date"){
- return gridDateToStr(new Date(date.valueOf() - 1));
- }else{
- return gridDateToStr(date);
- }
-
+gantt.templates.grid_date_format = function (date, column) {
+ if (column === "end_date") {
+ return gridDateToStr(new Date(date.valueOf() - 1));
+ } else {
+ return gridDateToStr(date);
+ }
+
}
gantt.templates.rightside_text = function (start, end, task) {
if (task.planned_end) {
if (end.getTime() > task.planned_end.getTime()) {
- var plannedEndDate = gantt.calculateEndDate({
- start_date: task.start_date,
- duration: gantt.calculateDuration({
- start_date: task.start_date,
- end_date: task.planned_end
- })
- });
- var overdue = gantt.calculateDuration({
- start_date: plannedEndDate,
- end_date: end,
- task: task
- }, 'day');
+ var plannedEndDate = gantt.calculateEndDate({
+ start_date: task.start_date,
+ duration: gantt.calculateDuration({
+ start_date: task.start_date,
+ end_date: task.planned_end
+ })
+ });
+ var overdue = gantt.calculateDuration({
+ start_date: plannedEndDate,
+ end_date: end,
+ task: task
+ }, 'day');
var text = "
Overdue: " + overdue + " days";
return text;
}
}
};
-gantt.attachEvent("onTaskLoading", function(task){
+gantt.attachEvent("onTaskLoading", function (task) {
task.planned_start = gantt.date.parseDate(task.planned_start, "xml_date");
task.planned_end = gantt.date.parseDate(task.planned_end, "xml_date");
return true;
@@ -578,7 +599,7 @@ gantt.config.layout = {
{ resizer: true, width: 3 },
{
rows: [
- { view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer", scrollable: true},
+ { view: "timeline", scrollX: "scrollHor", scrollY: "scrollVer", scrollable: true },
{ view: "scrollbar", id: "scrollHor", group: "horizontal" }
]
},
@@ -609,25 +630,27 @@ gantt.templates.timeline_cell_class = function (task, date) {
var zoomConfig = {
levels: [
{
- name:"day",
+ name: "day",
scale_height: 50,
- min_column_width:50,
- scales:[
- {unit: "week", step: 1, format: function (date) {
- var dateToStr = gantt.date.date_to_str("%d %M");
- var endDate = gantt.date.add(date, -6, "day");
- var weekNum = gantt.date.date_to_str("%W")(date);
- var year = gantt.date.date_to_str("%Y")(date);
- return "W#" + weekNum + ", " + dateToStr(date) + " - " + dateToStr(endDate) + " " + year;
- }},
- {unit: "day", step: 1, format: "%d %M"}
+ min_column_width: 50,
+ scales: [
+ {
+ unit: "week", step: 1, format: function (date) {
+ var dateToStr = gantt.date.date_to_str("%d %M");
+ var endDate = gantt.date.add(date, -6, "day");
+ var weekNum = gantt.date.date_to_str("%W")(date);
+ var year = gantt.date.date_to_str("%Y")(date);
+ return "W#" + weekNum + ", " + dateToStr(date) + " - " + dateToStr(endDate) + " " + year;
+ }
+ },
+ { unit: "day", step: 1, format: "%d %M" }
]
},
{
- name:"week",
+ name: "week",
scale_height: 50,
- min_column_width:50,
- scales:[
+ min_column_width: 50,
+ scales: [
// {unit: "week", step: 1, format: function (date) {
// var dateToStr = gantt.date.date_to_str("%d %M");
// var endDate = gantt.date.add(date, -6, "day");
@@ -635,20 +658,22 @@ var zoomConfig = {
// var year = gantt.date.date_to_str("%Y")(date);
// return "#" + weekNum + ", " + dateToStr(date) + " - " + dateToStr(endDate) + " " + year;
// }},
- {unit: "week", step: 1, format: function (date) {
- var weekNum = gantt.date.date_to_str("%W")(date);
- return "W#" + weekNum;
- }},
- {unit: "month", format: "%F, %Y"},
+ {
+ unit: "week", step: 1, format: function (date) {
+ var weekNum = gantt.date.date_to_str("%W")(date);
+ return "W#" + weekNum;
+ }
+ },
+ { unit: "month", format: "%F, %Y" },
// {unit: "day", step: 1, format: "%j %D"}
]
},
{
- name:"month",
+ name: "month",
scale_height: 50,
- min_column_width:120,
- scales:[
- {unit: "month", format: "%F, %Y"},
+ min_column_width: 120,
+ scales: [
+ { unit: "month", format: "%F, %Y" },
// {unit: "week", format: "Week #%W"},
// {unit: "day", step: 1, format: "%j %D"}
]
@@ -682,21 +707,21 @@ gantt.ext.zoom.init(zoomConfig);
gantt.ext.zoom.setLevel("month");
// trigger when zoomIn and zoomOut clicked
-gantt.ext.zoom.attachEvent("onAfterZoom", function(level, config){
- document.querySelector(".gantt_radio[value='" +config.name+ "']").checked = true;
+gantt.ext.zoom.attachEvent("onAfterZoom", function (level, config) {
+ document.querySelector(".gantt_radio[value='" + config.name + "']").checked = true;
})
-function zoomIn(){
+function zoomIn() {
gantt.ext.zoom.zoomIn();
}
-function zoomOut(){
+function zoomOut() {
gantt.ext.zoom.zoomOut()
}
var radios = document.getElementsByName("scale");
for (var i = 0; i < radios.length; i++) {
radios[i].onclick = function (event) {
- updateProperty({zoom:event.target.value});
+ updateProperty({ zoom: event.target.value });
gantt.ext.zoom.setLevel(event.target.value);
};
}
@@ -704,15 +729,19 @@ for (var i = 0; i < radios.length; i++) {
// GANTT PERFORMANCE CONFIG RECOMMENDATION
gantt.config.scales = [
- {unit: "month", step: 1, format: "%F, %Y"},
- {unit: "week", step: 1, format: function (date) {
- return "Week #" + gantt.date.getWeek(date);
- }},
- {unit: "day", step: 1, format: "%D", css: function(date) {
- if(!gantt.isWorkTime({ date: date, unit: "day"})){
- return "weekend"
- }
- }}
+ { unit: "month", step: 1, format: "%F, %Y" },
+ {
+ unit: "week", step: 1, format: function (date) {
+ return "Week #" + gantt.date.getWeek(date);
+ }
+ },
+ {
+ unit: "day", step: 1, format: "%D", css: function (date) {
+ if (!gantt.isWorkTime({ date: date, unit: "day" })) {
+ return "weekend"
+ }
+ }
+ }
];
gantt.config.show_task_cells = false;
gantt.config.static_background = true;