// set work days // gantt.setWorkTime({ day:1, hours:false }); const VERSION_GANTT_EDIT_URL = `${base_url}version-gantt/edit/${ganttId}`; const VERSION_GANTT_UPDATE_URL = `${base_url}version-gantt/update/${ganttId}`; const ACTIVITY_SET_BASELINE_URL = `${base_url}project/set-baseline/${ganttId}`; const ACTIVITY_SYNCHRONIZE_REPORT_URL = `${base_url}project/synchronize-report/${ganttId}`; let projectId = getUrlParameter("proyek_id"); var toggleTasks = "Collapse"; var isBaselineSet = false; var daysObj = [ { text: "Sunday", value: "0" }, { text: "Monday", value: "1" }, { text: "Tuesday", value: "2" }, { text: "Wednesday", value: "3" }, { text: "Thursday", value: "4" }, { text: "Friday", value: "5" }, { text: "Saturday", value: "6" } ]; var days = [0,1,2,3,4,5,6]; // Sunday -> Saturday var selectDayOffChoices = null; $(document).ready(function() { // init select multiple workdays selectDayOffChoices = new Choices('#select_dayoff', { removeItemButton: true, shouldSort: false // maxItemCount: 5, // searchResultLimit: 5, // renderChoiceLimit: 5 }); $('#gantt_setting_btn').on('click', async function() { const result = await axiosInstance .get(VERSION_GANTT_EDIT_URL, HEADER) .then(res => res) .catch((error) => error.response); if(result && result.status==200){ if (result.data && result.data.data) { var config_dayoff = null; if (result.data.data.config_dayoff !== null) { config_dayoff = result.data.data.config_dayoff; if (config_dayoff && config_dayoff.length > 0) { var config_dayoff_arr = config_dayoff.split(','); for (var i=0; i < config_dayoff_arr.length; i++) { var day = daysObj.find(o => parseInt(o.value) === parseInt(config_dayoff_arr[i])); selectDayOffChoices.setChoiceByValue(day.value); } } } else { // default selectDayOffChoices.setChoiceByValue('0'); selectDayOffChoices.setChoiceByValue('6'); } } }else{ gantt.alert({type: "error", text: "Failed to get settings. Please check your internet connection."}); } $('#modal_gantt_setting').modal('show'); }); $('#btn_save_setting').on('click', async function() { var holidays = []; var dayoff = $('#select_dayoff').val(); var costToComplete = $("#costToCompleteBox").val(); var committedCost = $("#committedCostBox").val(); dayoff = dayoff.map(item => parseInt(item)); var workdays = _.difference(days, dayoff); // reset the dayoff first for (var i=0; i < days.length; i++) { gantt.unsetWorkTime({day: days[i], hours: false}); } if (dayoff.length > 0) { for (var i=0; i < dayoff.length; i++) { gantt.setWorkTime({ day:dayoff[i], hours:false }); } } let payload = { "config_dayoff": dayoff.join(','), "cost_to_complete": costToComplete ? costToComplete : 0, "committed_cost": committedCost ? committedCost : 0 } const result = await axiosInstance .put(VERSION_GANTT_UPDATE_URL, payload, HEADER) .then(res => res) .catch((error) => error.response); if (result && result.status === 200) { $('#modal_gantt_setting').modal('hide'); gantt.message("Settings updated"); refresData(); } else { gantt.alert({type: "error", text: "Failed to update setting"}); } gantt.render(); }); $("#gantt_toggle_task_btn").on('click', function(event) { toggleCollapseTasks(); }); $("#dashboard-project").on('click', function(event) { window.location.href = `https://adw.ospro.id/#/dashboard-project/${projectId}/${ganttId}`; }); $("#gantt-baseline").on('click', function(event) { setBaseline(); }); $("#gantt-synchronize").on('click', function(event) { setSynchronize(); }); initHolidays(); initGanttSettings(); }); async function initHolidays(){ let payload = { "columns": [ { "name": "version_gantt_id", "logic_operator": "=", "value": ganttId }, { "name": "proyek_id", "logic_operator": "=", "value": proyekId } ], "joins": [], "orders": { "columns": ["date"], "ascending": true }, "paging": { "start": 0, "length": -1 } } $.ajax({ data: JSON.stringify(payload), url: `${base_url}holiday/search`, type: "POST", success: function (result) { let dataHolidays = result.data || [] dataHolidays.map((val, index) => { var a = moment(val.date); var b = moment(a).add(val.duration, 'days'); for (var m = moment(a); m.isBefore(b); m.add(1, 'days')) { let holiday = new Date(m.format('YYYY-MM-DD')); console.log("holiday", holiday); gantt.setWorkTime({ date: holiday, hours: false }); } }); gantt.render(); }, }); } async function initGanttSettings() { $("#scale1").attr('checked', true); // init to gantt chart view (holidays) const result = await axiosInstance .get(VERSION_GANTT_EDIT_URL, HEADER) .then(res => res) .catch((error) => error.response); if (result && result.status==200){ var config_dayoff = result.data.data.config_dayoff; var type_gantt = result.data.data.calculation_type; reRenderColumns(type_gantt); var dayoff = []; if(config_dayoff && config_dayoff.length > 0){ dayoff = config_dayoff.split(','); } // reset the dayoff first for (var i=0; i < days.length; i++) { gantt.unsetWorkTime({day: days[i], hours: false}); } if (dayoff.length > 0) { for (var i=0; i < dayoff.length; i++) { gantt.setWorkTime({ day:dayoff[i], hours:false }); } } for (let index = 1; index <= 7; index++) { const dateToCheck = new Date(2023, 4, index); // Note: Month is 0-based, so 5 represents June if (gantt.isWorkTime({ date: dateToCheck, hours: false })) { console.log(dateToCheck.toString() + ' is work time.'); } else { console.log(dateToCheck.toString() + ' is not work time.'); } } } } function expandTask(){ console.log("check expandTask") gantt.eachTask(function(task){ task.$open = true; }); // updateProperty({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'); gantt.render(); } function toggleCollapseTasks() { // collapse task / activity console.log('toggleCollapseTasks'); gantt.eachTask(function(task){ task.$open = toggleTasks == "Expand"; }); if (toggleTasks == "Expand") { updateProperty({task_open:true}) // console.log('to collapse'); 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'); // change icon to collapse } else { // console.log('to expand'); updateProperty({task_open:false}) toggleTasks = "Expand"; $("#gantt_toggle_task_btn").prop('title', 'Expand Activities'); $("#gantt_toggle_task_btn").children().removeClass('fa-compress-alt'); $("#gantt_toggle_task_btn").children().addClass('fa-expand-alt'); // change icon to expand } gantt.render(); } // Function Show / Hide Columns function getColumnsSelection(node){ var selectedColumns = node.querySelectorAll(":checked"); var unselectedColumn = node.querySelectorAll('input[type="checkbox"]:not(:checked)'); // var allSelected = node.querySelector("#check-all").prop('checked'); // console.log("unselectedColumn", unselectedColumn) var checkedColumns = {}; selectedColumns.forEach(function(node){ checkedColumns[node.name] = true; }); unselectedColumn.forEach(function(node){ checkedColumns[node.name] = false; }); return checkedColumns; } function populateColumnsDropdown(node){ var visibleColumns = {}; // var preventHide = ['action']; gantt.config.columns.forEach(function(col){ visibleColumns[col.name] = true; }); var lines = []; allColumns.forEach(function(col){ var checked = visibleColumns[col.name] ? "checked" : ""; // skip action to be pushed lines.push(``); }); node.innerHTML = 'Show / Hide Columns
' + lines.join("
"); } function getDropdownNode(){ return document.querySelector("#gantt_dropdown"); } gantt.$showDropdown = function(node){ var position = node.getBoundingClientRect(); var dropDown = getDropdownNode(); dropDown.style.top = position.bottom + "px"; dropDown.style.left = position.left - 150 + "px"; dropDown.style.display = "block"; populateColumnsDropdown(dropDown); dropDown.onchange = function(){ var selection = getColumnsSelection(dropDown); if(readOnly && parseInt(readOnly)==0){ updateShowHideColumn(selection) } gantt.config.columns = createColumnsConfig(selection); gantt.render(); } dropDown.keep = true; setTimeout(function(){ dropDown.keep = false; }) } gantt.$hideDropdown = function(){ var dropDown = getDropdownNode(); dropDown.style.display = "none"; } window.addEventListener("click", function(event){ if(!event.target.closest("#gantt_dropdown") && !getDropdownNode().keep){ gantt.$hideDropdown(); } }); // End Function Show / Hide Columns // Set Baseline function setBaseline() { var box = gantt.confirm({ text: "Set Baseline?", ok:"Yes", cancel:"No", callback: async function(result){ if(result){ // gantt.message("Yes!"); // send to API await setBaselineAPI(); }else{ // gantt.message("No..."); } } }); } async function setBaselineAPI() { const res = await axiosInstance .get(ACTIVITY_SET_BASELINE_URL, HEADER) .then(res => res) .catch((error) => error.response); console.log('set baseline res', res); if (res && res.status === 200) { // $('#modal_gantt_setting').modal('hide'); // gantt.alert("Settings updated"); // gantt.message(result.data.message); gantt.message("Set baseline success!"); window.location.reload(); } else { gantt.alert({type: "error", text: "Failed to set baseline"}); } gantt.render(); } function setSynchronize() { if (!isBaselineSet) { // gantt.alert({ // title:"Synchronize to Report", // type:"alert-error", // text:"Please set baseline before continue." // }); gantt.confirm({ text: "Plase set baseline before continue.", ok:"Set Baseline", cancel:"Cancel", callback: async function(result) { if (result) { await setBaselineAPI(); } } }); return false; } var box = gantt.confirm({ text: "Synchronize to Report Activity?", ok:"Yes", cancel:"No", callback: async function(result){ if(result){ // gantt.message("Yes!"); // send to API await setSynchronizeAPI() }else{ // gantt.message("No..."); } } }); } async function setSynchronizeAPI() { const res = await axiosInstance .get(ACTIVITY_SYNCHRONIZE_REPORT_URL, HEADER) .then(res => res) .catch((error) => error.response); console.log('synchronize res', res); if (res && res.status === 200) { // $('#modal_gantt_setting').modal('hide'); // gantt.alert("Settings updated"); // gantt.message(result.data.message); gantt.message("Synchronize to Report success!"); window.location.reload(); } else { gantt.alert({type: "error", text: "Failed to Synchronize to Report"}); } gantt.render(); }