You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
555 lines
12 KiB
555 lines
12 KiB
function getUrlParameter(sParam) { |
|
var sPageURL = window.location.search.substring(1), |
|
sURLVariables = sPageURL.split('&'), |
|
sParameterName, |
|
i; |
|
|
|
for (i = 0; i < sURLVariables.length; i++) { |
|
sParameterName = sURLVariables[i].split('='); |
|
|
|
if (sParameterName[0] === sParam) { |
|
return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]); |
|
} |
|
} |
|
return false; |
|
}; |
|
|
|
function getCodeLinkByType(type) |
|
{ |
|
type = parseInt(type); |
|
switch (type) { |
|
case 1: |
|
return "SS"; |
|
break; |
|
case 2: |
|
return "FF"; |
|
break; |
|
case 3: |
|
return "SF"; |
|
break; |
|
default: |
|
return "FS"; |
|
break; |
|
} |
|
} |
|
|
|
var getInput = function(node){ |
|
return node.querySelector("input"); |
|
}; |
|
|
|
gantt.config.editor_types.costPlanningEditor = { |
|
show: function (id, column, config, placeholder) { |
|
var min = config.min || 0 |
|
|
|
var html = "<div><input onkeyup='costPlanningChange(this)' type='text' min='" + min + |
|
"' name='" + column.name + "'></div>"; |
|
placeholder.innerHTML = html; |
|
}, |
|
hide: function () { |
|
}, |
|
set_value: function (value, id, column, node) { |
|
getInput(node).value = value; |
|
}, |
|
get_value: function (id, column, node) { |
|
return getInput(node).value || 0; |
|
}, |
|
is_changed: function (value, id, column, node) { |
|
var currentValue = this.get_value(id, column, node); |
|
return value !== currentValue; |
|
}, |
|
is_valid: function (value, id, column, node) { |
|
return true; |
|
}, |
|
focus: function (node) { |
|
var input = getInput(node); |
|
if (!input) { |
|
return; |
|
} |
|
if (input.focus) { |
|
input.focus(); |
|
} |
|
|
|
if (input.select) { |
|
input.select(); |
|
} |
|
} |
|
}; |
|
|
|
gantt.config.editor_types.progressCustom = { |
|
show: function (id, column, config, placeholder) { |
|
var min = config.min || 0, |
|
max = config.max || 100; |
|
|
|
var html = "<div><input type='number' min='" + min + |
|
"' max='" + max + "' name='" + column.name + "'></div>"; |
|
placeholder.innerHTML = html; |
|
}, |
|
hide: function () { |
|
}, |
|
set_value: function (value, id, column, node) { |
|
value = value*100 |
|
getInput(node).value = value; |
|
}, |
|
get_value: function (id, column, node) { |
|
return getInput(node).value || 0; |
|
}, |
|
is_changed: function (value, id, column, node) { |
|
var currentValue = this.get_value(id, column, node); |
|
return Number(value) !== Number(currentValue); |
|
}, |
|
is_valid: function (value, id, column, node) { |
|
return !isNaN(parseInt(value, 10)); |
|
}, |
|
focus: function (node) { |
|
var input = getInput(node); |
|
if (!input) { |
|
return; |
|
} |
|
if (input.focus) { |
|
input.focus(); |
|
} |
|
|
|
if (input.select) { |
|
input.select(); |
|
} |
|
} |
|
}; |
|
|
|
function initializationProject(){ |
|
let projectId = getUrlParameter("proyek_id"); |
|
if(projectId && projectId > 0){ |
|
$.ajax({ |
|
url: `${base_url}project/edit/${projectId}`, |
|
type:"GET", |
|
success: function (result) { |
|
let data = result.data; |
|
let projectName = data.nama; |
|
// $("#project-name-header").html(projectName); |
|
}, |
|
error: function (data) { |
|
actionHappen = false; |
|
} |
|
}); |
|
} |
|
} |
|
|
|
function getSatuan(){ |
|
$.ajax({ |
|
url: `${base_url}satuan/list`, |
|
type:"GET", |
|
success: function (result) { |
|
let satuanList = []; |
|
let resSatuan = result.data || [] |
|
resSatuan.map((val, index) => { |
|
let satuan = { |
|
key:val.id, |
|
label:val.name, |
|
text:val.name |
|
} |
|
satuanList.push(satuan) |
|
}); |
|
if(satuanList.length > 0){ |
|
gantt.updateCollection("satuan", satuanList); |
|
gantt.refreshData(); |
|
gantt.render(); |
|
} |
|
}, |
|
error: function (data) { |
|
|
|
} |
|
}); |
|
} |
|
|
|
function updateActivity(id) |
|
{ |
|
$.ajax({ |
|
url: `${base_url}task/get-update/${id}`, |
|
type:"GET", |
|
success: function (result) { |
|
let data = result.data; |
|
gantt.getTask(id).assign_hr = data.assign_hr; |
|
gantt.getTask(id).assign_material = data.assign_material; |
|
gantt.getTask(id).assign_tools = data.assign_tools; |
|
gantt.getTask(id).bobot_planning = data.bobot_planning; |
|
gantt.getTask(id).rencana_biaya = data.rencana_biaya; |
|
gantt.getTask(id).biaya_actual = data.biaya_actual; |
|
gantt.getTask(id).progress = data.progress; |
|
gantt.getTask(id).jobs_done = data.jobs_done ? data.jobs_done : 0; |
|
gantt.updateTask(id); |
|
actionHappen = false; |
|
}, |
|
error: function (data) { |
|
actionHappen = false; |
|
} |
|
}); |
|
} |
|
|
|
/* Fungsi format ribuan label*/ |
|
function formatRupiah(n) { |
|
var parts=n.toString().split("."); |
|
return parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ".") + (parts[1] ? "," + parts[1] : ""); |
|
} |
|
|
|
/* Fungsi format ribuan inputan*/ |
|
function formatRibuanInput(angka, prefix) |
|
{ |
|
var number_string = angka.replace(/[^,\d]/g, '').toString(), |
|
split = number_string.split(','), |
|
sisa = split[0].length % 3, |
|
rupiah = split[0].substr(0, sisa), |
|
ribuan = split[0].substr(sisa).match(/\d{3}/gi); |
|
|
|
if (ribuan) { |
|
separator = sisa ? '.' : ''; |
|
rupiah += separator + ribuan.join('.'); |
|
} |
|
|
|
rupiah = split[1] != undefined ? rupiah + ',' + split[1] : rupiah; |
|
return prefix == undefined ? rupiah : (rupiah ? 'Rp. ' + rupiah : ''); |
|
} |
|
|
|
/* Fungsi replace titik, untuk save ke DB*/ |
|
function formatReplaceTitikRibuan(param){ |
|
let myStr = param; |
|
let newStr = myStr.replace(/\./g, ''); |
|
return newStr; |
|
} |
|
|
|
function formatDate(params){ |
|
let today = new Date(params); |
|
let yyyy = today.getFullYear(); |
|
let mm = today.getMonth() + 1; // Months start at 0! |
|
let dd = today.getDate(); |
|
|
|
if (dd < 10) dd = '0' + dd; |
|
if (mm < 10) mm = '0' + mm; |
|
|
|
today = dd + '/' + mm + '/' + yyyy; |
|
return today; |
|
} |
|
|
|
function roundToTwo(num) { |
|
return +(Math.round(num + "e+2") + "e-2"); |
|
} |
|
|
|
function initialProperty() |
|
{ |
|
$.ajax({ |
|
url: `${base_url}user-to-version-gantt/get-by-gantt/${ganttId}`, |
|
type:"GET", |
|
success: function (result) { |
|
let data = result.data; |
|
if(data.status && data.status=="not have"){ |
|
toggleCollapseTasks(); |
|
gantt.ext.zoom.setLevel("month"); |
|
}else{ |
|
if(data.id){ |
|
userToVersionGanttId = data.id |
|
} |
|
|
|
if(data.critical_path){ |
|
gantt.config.highlight_critical_path = true; |
|
$("#critalPathBox").prop("checked", true); |
|
} |
|
|
|
if(data.auto_schedule){ |
|
gantt.config.auto_schedule = true; |
|
$("#autoSchedule").prop("checked", true); |
|
} |
|
|
|
if(data.zoom){ |
|
gantt.ext.zoom.setLevel(data.zoom); |
|
$('input[value="'+data.zoom+'"]').prop("checked", true); |
|
} |
|
|
|
if(data.task_open){ |
|
gantt.eachTask(function(task){ |
|
task.$open = true; |
|
}); |
|
toggleTasks = "Collapse"; |
|
$("#gantt_toggle_task_btn").prop('title', 'Collapse Activities'); |
|
$("#gantt_toggle_task_btn").children().removeClass('fa-expand-alt'); |
|
$("#gantt_toggle_task_btn").children().addClass('fa-compress-alt'); |
|
}else{ |
|
toggleCollapseTasks(); |
|
} |
|
|
|
gantt.render(); |
|
} |
|
}, |
|
error: function (data) { |
|
|
|
} |
|
}); |
|
} |
|
|
|
function initializationColumn() |
|
{ |
|
$.ajax({ |
|
url: `${base_url}gantt-show-hide/get-by-gantt/${ganttId}`, |
|
type:"GET", |
|
success: function (result) { |
|
let data = result.data; |
|
if(data.status=="not yet have"){ |
|
addShowHideColumn(); |
|
}else if(data.status=="not have access"){ |
|
|
|
}else{ |
|
setUpForShowHideColumn(data); |
|
} |
|
}, |
|
error: function (data) { |
|
|
|
} |
|
}); |
|
} |
|
|
|
|
|
$(document).ready(function () { |
|
$("#critalPathBox").on("change", function (){ |
|
let checked = $(this).is(":checked"); |
|
if(checked){ |
|
gantt.config.highlight_critical_path = true; |
|
updateProperty({critical_path:true}) |
|
}else{ |
|
gantt.config.highlight_critical_path = false; |
|
updateProperty({critical_path:false}) |
|
} |
|
gantt.render(); |
|
}); |
|
|
|
$("#autoSchedule").on("change", function (){ |
|
let checked = $(this).is(":checked"); |
|
if(checked){ |
|
gantt.config.auto_schedule = true; |
|
updateProperty({auto_schedule:true}) |
|
}else{ |
|
gantt.config.auto_schedule = false; |
|
updateProperty({auto_schedule:false}) |
|
} |
|
gantt.render(); |
|
}); |
|
}); |
|
|
|
function linkLagEditor(){ |
|
|
|
function endPopup(){ |
|
modal = null; |
|
editLinkId = null; |
|
} |
|
function cancelEditLink(){ |
|
endPopup() |
|
} |
|
|
|
function deleteLink(){ |
|
gantt.deleteLink(editLinkId); |
|
endPopup() |
|
} |
|
|
|
function saveLink(){ |
|
var link = gantt.getLink(editLinkId); |
|
|
|
var lagValue = modal.querySelector(".lag-input").value; |
|
if(!isNaN(parseInt(lagValue, 10))){ |
|
link.lag = parseInt(lagValue, 10); |
|
} |
|
|
|
gantt.updateLink(link.id); |
|
if(gantt.autoSchedule){ |
|
gantt.autoSchedule(link.source); |
|
} |
|
endPopup(); |
|
} |
|
|
|
|
|
|
|
var modal; |
|
var editLinkId; |
|
gantt.attachEvent("onLinkDblClick", function(id,e){ |
|
editLinkId = id; |
|
var link = gantt.getLink(id); |
|
var linkTitle; |
|
switch(link.type){ |
|
case gantt.config.links.finish_to_start: |
|
linkTitle = "FS"; |
|
break; |
|
case gantt.config.links.finish_to_finish: |
|
linkTitle = "FF"; |
|
break; |
|
case gantt.config.links.start_to_start: |
|
linkTitle = "SS"; |
|
break; |
|
case gantt.config.links.start_to_finish: |
|
linkTitle = "SF"; |
|
break; |
|
} |
|
|
|
linkTitle += " " + gantt.getTask(link.source).text + " -> " + gantt.getTask(link.target).text; |
|
|
|
modal = gantt.modalbox({ |
|
title: linkTitle, |
|
text: "<div>" + |
|
"<label>Lag <input type='number' class='lag-input' /></label>" + |
|
"</div>", |
|
buttons: [ |
|
{label:"Save", css:"link-save-btn", value:"save"}, |
|
{label:"Cancel", css:"link-cancel-btn", value:"cancel"}, |
|
{label:"Delete", css:"link-delete-btn", value:"delete"} |
|
], |
|
width: "500px", |
|
type: "popup-css-class-here", |
|
callback: function(result){ |
|
switch(result){ |
|
case "save": |
|
saveLink(); |
|
break; |
|
case "cancel": |
|
cancelEditLink(); |
|
break; |
|
|
|
case "delete": |
|
deleteLink(); |
|
break; |
|
} |
|
} |
|
}); |
|
|
|
modal.querySelector(".lag-input").value = link.lag || 0; |
|
|
|
//any custom logic here |
|
return false; |
|
}); |
|
|
|
} |
|
|
|
function addShowHideColumn() |
|
{ |
|
let allColumn = []; |
|
allColumns.forEach(function(column){ |
|
allColumn.push(column.name); |
|
}); |
|
submitShowHideColumn(allColumn); |
|
} |
|
|
|
function submitShowHideColumn(allColumn) |
|
{ |
|
let payload = { |
|
version_gantt_id:ganttId, |
|
columns:allColumn |
|
} |
|
|
|
$.ajax({ |
|
data: JSON.stringify(payload), |
|
url: `${base_url}gantt-show-hide/add`, |
|
type: "POST", |
|
processData: false, |
|
contentType: false, |
|
success: function (data) { |
|
|
|
}, |
|
error: function (data) { |
|
|
|
} |
|
}); |
|
} |
|
|
|
function setUpForShowHideColumn(data) |
|
{ |
|
let columns = data || [] |
|
|
|
let configColumn = {} |
|
|
|
columns.map((val, index) => { |
|
configColumn[val.column_name] = val.show |
|
}); |
|
|
|
gantt.config.columns = createColumnsConfig(configColumn); |
|
|
|
gantt.render(); |
|
} |
|
|
|
function updateShowHideColumn(data) |
|
{ |
|
let payload = { |
|
columns:data |
|
} |
|
|
|
$.ajax({ |
|
data: JSON.stringify(payload), |
|
url: `${base_url}gantt-show-hide/update/${ganttId}`, |
|
type: "POST", |
|
processData: false, |
|
contentType: false, |
|
success: function (data) { |
|
console.log(data); |
|
}, |
|
error: function (data) { |
|
console.log(data); |
|
} |
|
}); |
|
} |
|
|
|
function updateProperty(payload){ |
|
if(userToVersionGanttId > 0 && readOnly && parseInt(readOnly)==0){ |
|
$.ajax({ |
|
data: JSON.stringify(payload), |
|
url: `${base_url}user-to-version-gantt/update/${userToVersionGanttId}`, |
|
type: "PUT", |
|
processData: false, |
|
contentType: false, |
|
success: function (data) { |
|
}, |
|
error: function (data) { |
|
} |
|
}); |
|
} |
|
} |
|
|
|
function costPlanningChange(e){ |
|
let value = e.value; |
|
value = replaceAll(value, ".", "") |
|
value = replaceAll(value, ",", ".") |
|
let newValue = formatRupiah(value); |
|
$(e).val(newValue) |
|
} |
|
|
|
function escapeRegExp(string) { |
|
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); |
|
} |
|
|
|
function replaceAll(str, find, replace) { |
|
if(str){ |
|
return str.replace(new RegExp(escapeRegExp(find), 'g'), replace); |
|
} |
|
return str |
|
} |
|
|
|
// Function to get the earliest planned start date among all tasks |
|
function getEarliestTaskDate() { |
|
var earliestDate = null; |
|
gantt.eachTask(function (task) { |
|
var taskStartDate = task.planned_start || task.start_date; |
|
if (!earliestDate || task.planned_start < earliestDate) { |
|
earliestDate = taskStartDate; |
|
if (task.start_date < earliestDate) { |
|
earliestDate = task.start_date; |
|
} |
|
} |
|
}); |
|
return earliestDate; |
|
} |
|
|
|
// Function to get the latest planned end date among all tasks |
|
function getLatestTaskDate() { |
|
var latestDate = null; |
|
gantt.eachTask(function (task) { |
|
var taskEndDate = task.planned_end || task.end_date; |
|
if (!latestDate || task.planned_end > latestDate) { |
|
latestDate = taskEndDate; |
|
if (task.end_date > latestDate) { |
|
latestDate = task.end_date; |
|
} |
|
} |
|
}); |
|
return latestDate; |
|
} |