//import {SvelteGantt, SvelteGanttTable, MomentSvelteGanttDateAdapter, SvelteGanttExternal} from 'https://cdn.jsdelivr.net/npm/svelte-gantt@4.0.9-beta/+esm';
import {SvelteGantt, SvelteGanttTable, MomentSvelteGanttDateAdapter, SvelteGanttExternal} from '/include/vendor/svelte-gantt/index.js';
gantt_obj.pplan_make = ( vmode, sdate, plusday ) => {
document.querySelector("#ProdPlan").innerHTML = "";
let lux_sdate = sdate ? luxon.DateTime.fromFormat(sdate,'y-MM-dd') : luxon.DateTime.now();
let lux_fdate = plusday ? lux_sdate.plus(plusday) : lux_sdate;
let chart_blocks = 0;
switch( vmode ){
case "W":
let snw = lux_sdate.toFormat('c')-1;
let fnw = 7-lux_fdate.toFormat('c');
lux_sdate = lux_sdate.minus({days:snw});
lux_fdate = lux_fdate.plus({days:fnw});
chart_blocks = Math.floor(lux_fdate.diff(lux_sdate,'weeks').weeks)+1;
break;
case "M":
lux_sdate = lux_sdate.minus({days:lux_sdate.c.day-1});
lux_fdate = lux_fdate.minus({days:lux_fdate.c.day-1}).plus({months:1}).minus({days:1});
chart_blocks = Math.floor(lux_fdate.diff(lux_sdate,'months').months) + 1;
break;
default:
chart_blocks = Math.floor(lux_fdate.diff(lux_sdate,'days').days) + 1;
}
ajax_json({
url: ajax_url,
data: {mode: 'getScheduleList', sdate:lux_sdate.toFormat('y-MM-dd'), fdate:lux_fdate.toFormat('y-MM-dd'), sfact:document.querySelector("#S_FACLT_CD").value },
success: function (data) {
if (data.code) {
gantt_obj.currentStart = data.data.sdate_millis;
gantt_obj.currentEnd = data.data.fdate_millis;
gantt_obj.wkStartTime = data.data.wkStartTime;
gantt_obj.varsFactInfo = data.data.varsFactInfo; /*.filter(fac => {
return !document.querySelector("#S_FACLT_CD").value || document.querySelector("#S_FACLT_CD").value === fac.FACLT_CD;
});*/
gantt_obj.varsWtimeInfo = data.data.varsWtimeInfo.filter(wt => wt.USE_FLG === "Y" && wt.RUNSTOP_FLG !== 'Y').sort((a,b) => (a.ST_TM > b.ST_TM)?1:-1);
gantt_obj.varsSchInfo = data.data.varsSchInfo; //근무일정보
gantt_obj.varsSchIscm = data.data.varsSchInfo.reduce( (rev, hl) => {rev[hl.DT] = hl; return rev}, {});
//gantt_obj.varsHolyInfo = data.data.varsSchInfo.filter(hl => hl.DAY_TYPE === 'H');
//HolyInfo가 아니라 DayInfo가 있어야 한다.
//ganttdata = generateData(gantt_obj.currentStart, gantt_obj.currentEnd);
ganttdata = data.data.wo_data;
ganttdata.tasks = ganttdata.tasks.map( t => { return {...t, to:getTo_addHolytime(t, gantt_obj) } } );
let st_obj = luxon.DateTime.fromMillis(gantt_obj.currentStart);
let ed_obj = luxon.DateTime.fromMillis(gantt_obj.currentEnd);
const timeRanges = gantt_obj.varsSchInfo.reduce( (row, cur, idx) => {
if( cur.DAY_TYPE === 'H' ){
row.push({
id: 'Holy'+cur.DT,
//from: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').toMillis(),
//to: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({days:1}).toMillis(),
from: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({hours:gantt_obj.wkStartTime}).toMillis(),
to: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({days:1,hours:gantt_obj.wkStartTime}).toMillis(),
classes: null,
label: '휴일'
});
}else{
gantt_obj.varsWtimeInfo.filter( wt => wt.SHIFT_ID === cur.DAY_SHAPE ).forEach((w, i) => { //휴게시간 표시
let st = w.ST_TM.split(':');
let ed = w.ED_TM.split(':');
let adstday = 0;
let adedday = 0;
if( Number(st[0]) < gantt_obj.wkStartTime ){
adstday = 1;
}
if( Number(ed[0]) <= gantt_obj.wkStartTime ){
adedday = 1;
}
let cls = null
if( w.TM_TYPE === 'OFF' ){
cls = 'off_hours';
}
row.push({
id: w.TM_TYPE+'_'+cur.DT+'_'+ i,
//from: st_obj.plus({days:idx, hours:st[0], minutes:st[1]}),
//to: st_obj.plus({days:idx+adday, hours:ed[0], minutes:ed[1]}),
from: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({days:adstday, hours:st[0],minutes:st[1]}).toMillis(),
to: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({days:adedday, hours:ed[0],minutes:ed[1]}).toMillis(),
classes: cls,
resizeHandleWidth: 0,
label: w.WORK_TM_NM
});
});
}
return row;
}, [] );
// const timeRanges = [...Array(Math.round(ed_obj.diff(st_obj,'days').days)).keys()].reduce((row, idx) => {
// let nowDT = st_obj.plus({days:idx}).toFormat('y-MM-dd');
// if( gantt_obj.varsHolyInfo.filter(h => h.DT === nowDT).length === 0 ){ //휴일이 아닌경우
// gantt_obj.varsWtimeInfo./*filter(wt => wt.SHIFT_ID === ).*/forEach((w, i) => { //휴게시간 표시
// let st = w.ST_TM.split(':');
// let ed = w.ED_TM.split(':');
// let cls = null
// if( w.TM_TYPE === 'OFF' ){
// cls = 'off_hours';
// }
//
// row.push({
// id: w.TM_TYPE+'_'+nowDT+'_'+ i,
// from: st_obj.plus({days:idx, hours:st[0], minutes:st[1]}),
// to: st_obj.plus({days:idx, hours:ed[0], minutes:ed[1]}),
// classes: cls,
// resizeHandleWidth: 0,
// label: w.WORK_TM_NM
// });
// });
// }
//
// gantt_obj.varsHolyInfo.forEach((h, i) => { //휴일표시
// row.push({
// id: 'Holy'+nowDT+'_'+i,
// from: luxon.DateTime.fromFormat(h.DT, 'y-MM-dd').toMillis(),
// to: luxon.DateTime.fromFormat(h.DT, 'y-MM-dd').plus({days:1}).toMillis(),
// classes: null,
// label: '휴일'
// });
// });
//
// return row;
// }, []);
gantt_obj.gantt_option = {
rows: ganttdata.rows,
tasks: ganttdata.tasks,
timeRanges,
headers: (function (){
switch( vmode ){
case "W":
return [{ unit: 'week', format: "Wterm", sticky: true, }, { unit: 'day', format: "dd일", sticky: true, /*offset:7*/ } ];
case "M":
return [{ unit: 'month', format: "y/MM", sticky: true, }, { unit: 'day', format: "dd", sticky: true, } ]
default:
return [{ unit: 'day', format: 'y-MM-dd', sticky: true, }, {unit: 'hour', format: "HH시", sticky: true, }];
}
})(),
//headers: [{unit: 'day', format: 'y년 MM월 dd일'}, {unit: 'hour', format: "HH시",}],
//headers: [{ unit: 'week', format: "Wterm", }, { unit: 'day', format: "dd일", } ],
//headers: [{ unit: 'month', format: "MM월", }, { unit: 'week', format: "WofM", }, { unit: 'day', format: "dd", } ],
//headers: [{ unit: 'month', format: "MM월", }, { unit: 'week', format: "WofM", } ],
fitWidth: false,
from: gantt_obj.currentStart,// + gantt_obj.wkStartTime*3600*1000, //(챠트의 시작시간을 wkStatTime 으로 할경우 아래를 제거한다.)
to: gantt_obj.currentEnd,// + gantt_obj.wkStartTime*3600*1000, //(챠트의 시작시간을 wkStatTime 으로 할경우 아래를 제거한다.)
rowHeight: 42,
resizeHandleWidth: 0,
columnUnit: (function (){
switch( vmode ){
case "W":
return 'hour';
case "M":
return 'hour';
default:
return 'minute';
}
})(),
columnOffset: (function (){
switch( vmode ){
case "W":
return 1;
case "M":
return 3;
default:
return 60;
}
})(),
magnetUnit: (function (){
switch( vmode ){
case "W":
return 'hour';
case "M":
return 'hour';
default:
return 'minute';
}
})(),
magnetOffset: (function (){
switch( vmode ){
case "W":
return 1;
case "M":
return 3;
default:
return 60;
}
})(),
tableHeaders: [{title: '설 비', property: 'label', width: 140, type: 'tree'}],
tableWidth: 140,
minWidth: 1450 * chart_blocks,
zoomLevels: [],
ganttTableModules: [SvelteGanttTable],
taskElementHook: (node, task) => {
node.addEventListener('dblclick', () => {
task.enableDragging && popPlanRouteInfo(node, task); //개별수정
/* 챠트에서 조정한 데이터 반영 문제 때문에 사용안함. 챠트에서 조정하지 않는다면 이것을 이용해 전체 수정한다.
if( task.enableDragging ){
ajax_json({
url: ready_ajax_url,
data: {
mode:"getCondDetail",
MNG_NO:task.usrdata.MNG_NO,
},
success: function(data){
if( data.code ){
Tb_funcs_planroute.init(data.data);
}else{
kuls_alert(data.mesg);
}
}
});
}*/
});
},
dateAdapter: new MomentSvelteGanttDateAdapter(function (milliseconds) {
let lux_obj = luxon.DateTime.fromMillis(milliseconds);
return {
'format': function (format) {
let rev = null
switch (format) {
case "Wterm":
rev = lux_obj.toFormat('y-MM-dd') + ' ~ ' + lux_obj.plus({days:6}).toFormat('y-MM-dd');
break;
case "WofM":
rev = weekOfMonth(milliseconds) + '주차';
break;
default :
rev = lux_obj.toFormat(format);
}
return rev;
},
}
}),
}
gantt_obj.gantt = new SvelteGantt({
target: document.getElementById('ProdPlan'),
props: gantt_obj.gantt_option,
});
gantt_obj.gantt.api.tasks.on.changed((tasks) => { //task 변경
tasks.forEach(tgt => {
let _thisrow = tgt.targetRow;
let _thistask = tgt.task;
//_thisrow.model.to = getTo_addHolytime( _thistask.model, gantt_obj );
_thistask.model.to = getTo_addHolytime( _thistask.model, gantt_obj );
if (_thisrow) { //row 변경처리
_thistask.model.usrdata.FACLT_CD = _thisrow.model.usrdata.FACLT_CD;
_thistask.model.usrdata.FACLT_NM = _thisrow.model.usrdata.FACLT_NM;
}
//_thistask.model.html = set_task_title(works[(_thistask.model.cnt % 5)], _thistask.model.from, _thistask.model.to); //시간표시 변경
_thistask.model.usrdata.PLN_ST_TM = luxon.DateTime.fromMillis(_thistask.model.from).toFormat('y-MM-dd HH:mm');
_thistask.model.usrdata.PLN_ED_TM = luxon.DateTime.fromMillis(_thistask.model.to).toFormat('y-MM-dd HH:mm');
_thistask.model.usrdata._STATUS_ = 'U'; //수정 Flag
_thistask.model.html = task_title(_thistask.model.usrdata);
document.toto = _thistask.model;
gantt_obj.gantt.updateTask(_thistask.model);
});
});
} else {
kuls_alert(data.mesg);
}
},
error: function (request, status, error) {
kuls_alert(error.message);
},
complete: function () {
//ccnt = 0;
//drag_block();
}
});
};
// gantt_obj.gantt.api.tasks.on.select((task) => {
// jQuery("[data-task-id="+task[0].model.id+"]").off().on("keydown",function(e){
// jQuery(e.target).remove();
// });
// });
jQuery.datetimepicker.setLocale('ko');
// gantt_ext = new SvelteGanttExternal(document.getElementById('newTask'), {
// gantt,
// onsuccess: (row, date, gantt) => {
// const id = 5000 + Math.floor(Math.random() * 1000);
// gantt_obj.gantt.updateTask({
// id,
// label: `Task #${id}`,
// from: date,
// to: date+3600000*3,
// classes: colors[(Math.random() * colors.length) | 0],
// resourceId: row.model.id
// });
// },
// elementContent: () => {
// const element = document.createElement('div');
// element.innerHTML = 'New Task';
// element.className = 'sg-external-indicator';
// return element;
// }
// });
const task_title = (usrdata) => {
let timefrm = dateRformat(usrdata['PLN_TERM_TM'], { dan: 'm' });
return `
${usrdata['OP_NM']} [${usrdata['MNG_NO']}]
${usrdata['PLN_ST_TM'].substring(5)} ~ (${timefrm})
`;
}
/*
* 1. 휴일과 휴식시간이 있다.
* 2. 휴일에는 휴식시간을 포함하지 않는다.
* 3. 계산의 결과값에 휴일/휴식이 포함되면 추가하고 다시 확인을 반복한다.
*
*
* */
const prev_base_days = 10; //이전 몇일전 데이터까지 불러올지 여부 (planing.ajax.php 도 같이 확인)
const getTo_addHolytime = ( data, gobj ) => { //휴일/휴게 시간 추가
let datemillisec = 24*3600*1000;
let hourmillisec = 3600*1000;
let minmillisec = 60*1000;
let dur_addtime = data.usrdata.PLN_TERM_TM*minmillisec;
let holy_addtime = 0;
let wtime_addtime = 0;
const stime = data.from; //시작 시간
let ntime = stime; //작업/휴게시간이 적용된 시간
let worktime = data.usrdata.PLN_TERM_TM * minmillisec; //총 작업시간(분)
let worksum = 0; //작업시간 합계(분)
let dayzero = 0; //체크 날짜의 00:00:00 시간
do {
let nday = luxon.DateTime.fromMillis(ntime - gobj.wkStartTime*hourmillisec).toFormat('y-MM-dd'); //날짜만
let dz = luxon.DateTime.fromFormat(nday,'y-MM-dd');
if( dayzero === dz.ts ) break;
dayzero = dz.ts;
let Wtime = [];
if( gobj.varsSchIscm[nday] ){
if( gobj.varsSchIscm[nday].DAY_TYPE === "H" ){
// Wtime = [{
// ST_TM: gobj.wkStartTime.toString().padStart(2,"0")+":00",
// ED_TM: gobj.wkStartTime.toString().padStart(2,"0")+":00",
// }];
Wtime = [{
stsec: dayzero + gobj.wkStartTime*hourmillisec,
edsec: dayzero + datemillisec + gobj.wkStartTime*hourmillisec,
}];
}else{
Wtime = gobj.varsWtimeInfo.filter(wt => wt.SHIFT_ID == gobj.varsSchIscm[nday].DAY_SHAPE ).map( wt => {
let st = wt.ST_TM.split(':');
let ed = wt.ED_TM.split(':');
let adstday = 0;
let adedday = 0;
if( Number(st[0]) < gobj.wkStartTime ){
adstday = 1;
}
if( Number(ed[0]) <= gobj.wkStartTime ){
adedday = 1;
}
return {
stsec: dayzero + adstday*datemillisec + st[0]*hourmillisec + st[1]*minmillisec,
edsec: dayzero + adedday*datemillisec + ed[0]*hourmillisec + ed[1]*minmillisec,
}
} ).sort( (a,b) => a.stsec > b.stsec ? 1:-1 );
}
}
Wtime.forEach( wd => { //휴게 시간 추가
let stsec = wd.stsec;
let edsec = wd.edsec;
let n2time = ntime+worktime; //임시 작업종료시간
if( ntime < edsec && n2time > stsec){
if( ntime >= stsec && ntime < edsec ){ //작업시작시간이 휴게시간 중간에 있을경우 (작업시간이 휴게시간에 포함된경우)
ntime = edsec; //작업시작시간을 휴게시간 마지막으로 이동만.
}else if( n2time > stsec && n2time < edsec ){ //작업종료시간이 휴게시간 중간에 있을경우
worktime = n2time - stsec; //임시작업종료시간과 휴게시작시간이 겹치는 부분을 남은시간으로 하고
ntime = edsec; //작업시작시간을 휴게시간 마지막으로
}else if( ntime <= stsec && n2time >= edsec ){ //휴게시간이 작업시간에 포함되어 있을 경우
worktime = n2time - stsec; //임시작업종료시간과 휴게마지막시간이 겹치는 부분을 남은시간으로 하고
ntime = edsec; //작업시작시간을 휴게시간 마지막으로
}
}
} );
if( ntime + worktime > dayzero+datemillisec + gobj.wkStartTime*hourmillisec ){
worktime -= (dayzero+datemillisec + gobj.wkStartTime*hourmillisec) - ntime;
ntime = (dayzero+datemillisec + gobj.wkStartTime*hourmillisec);
}else{
ntime += worktime;
worktime = 0;
}
} while ( worktime > 0 );
// do {
// let nday = luxon.DateTime.fromMillis(ntime).toFormat('y-MM-dd'); //날짜만
// let dz = luxon.DateTime.fromFormat(nday,'y-MM-dd');
// if( dayzero === dz.ts ) break;
// dayzero = dz.ts;
//
// if( gobj.varsHolyInfo.filter(h => h.DT === nday).length !== 0 ){ //휴일이면
// ntime = dayzero + datemillisec;
// }else{
// gobj.varsWtimeInfo.forEach( wd => { //휴게 시간 추가
// //시작시간이 몇 번 들어가느냐가 기준
// let st = wd.ST_TM.split(':');
// let ed = wd.ED_TM.split(':');
//
// let adstday = 0;
// let adedday = 0;
// if( Number(st[0]) < gobj.wkStartTime ){
// adstday = 1;
// }
// if( Number(ed[0]) <= gobj.wkStartTime ){
// adedday = 1;
// }
//
// let stsec = dayzero + adstday*datemillisec + st[0]*hourmillisec + st[1]*minmillisec;
// let edsec = dayzero + adedday*datemillisec + ed[0]*hourmillisec + ed[1]*minmillisec;
//
// // if( stsec > edsec ){ //휴게 종료시간을 다음날로 지정
// // edsec += datemillisec;
// // }
//
// let n2time = ntime+worktime; //임시 작업종료시간
// if( ntime < edsec && n2time > stsec){
// if( ntime >= stsec && ntime < edsec ){ //작업시작시간이 휴게시간 중간에 있을경우 (작업시간이 휴게시간에 포함된경우)
// ntime = edsec; //작업시작시간을 휴게시간 마지막으로 이동만.
// }else if( n2time > stsec && n2time < edsec ){ //작업종료시간이 휴게시간 중간에 있을경우
// worktime = n2time - stsec; //임시작업종료시간과 휴게시작시간이 겹치는 부분을 남은시간으로 하고
// ntime = edsec; //작업시작시간을 휴게시간 마지막으로
// }else if( ntime <= stsec && n2time >= edsec ){ //휴게시간이 작업시간에 포함되어 있을 경우
// worktime = n2time - stsec; //임시작업종료시간과 휴게마지막시간이 겹치는 부분을 남은시간으로 하고
// ntime = edsec; //작업시작시간을 휴게시간 마지막으로
// }else{
// /*
// if( (ntime + (worktime-worksum)*1000) > (dayzero + datemillisec) ){ //남은 시간의 합산이 내일로 넘어가면
// ntime = dayzero + datemillisec;
// worksum =
// }else{ //아니면 그냥 추가
// ntime += (worktime-worksum)*1000;
// worksum = worktime;
// }*/
// }
// }
// } );
//
// //시작시간이 전날의 휴게시간 안에 포함되어있을때...를 고려 해봐야 한다.
// if( ntime + worktime > dayzero + datemillisec ){
// worktime -= (dayzero+datemillisec) - ntime;
// ntime = (dayzero+datemillisec);
// }else{
// ntime += worktime;
// worktime = 0;
// }
// }
// } while ( worktime > 0 );
return ntime + worktime;
/*
gobj.varsHolyInfo.forEach( hd => { //휴일 24시간 추가
let btime = luxon.DateTime.fromFormat(hd.DT,'y-MM-dd').ts;
if( data.from <= btime && (data.from+dur_addtime) > btime ){
holy_addtime += datemillisec;
}
} );
let fromzero = luxon.DateTime.fromFormat(luxon.DateTime.fromMillis(data.from).toFormat('yyMMdd'),'yyMMdd').ts;
gobj.varsWtimeInfo.sort((a,b) => (a.ST_TM > b.ST_TM)?1:-1).forEach( wd => { //휴게 시간 추가
//시작시간이 몇 번 들어가느냐가 기준
let st = wd.ST_TM.split(':');
let ed = wd.ED_TM.split(':');
let stsec = st[0]*hourmillisec + st[1]*minmillisec;
let edsec = ed[0]*hourmillisec + ed[1]*minmillisec;
let chasec = 0; //추가할 휴게 시간
if( stsec > edsec ){
chasec = datemillisec - stsec + edsec;
}else{
chasec = edsec - stsec;
}
let s = 0;
let btime = fromzero + stsec; //휴게 시작시간
let ftime = fromzero + edsec; //휴게 종료시간
if( btime < data.from && ftime > data.from ){
wtime_addtime += (ftime - data.from);
}
while( data.from <= btime && (data.from + dur_addtime + holy_addtime + wtime_addtime) > btime ){ //24시간씩 증가시키며 휴게시간 추가
wtime_addtime += chasec;
btime += datemillisec; //24시간 추가
}
} );
return data.from + dur_addtime + holy_addtime + wtime_addtime;
*/
}
const popPlanRouteInfo = function( node, task ){
//팝업 템플릿 로드 후 모달 출력
//let per_period = 6; //10분단위
let per_period = 1; //1시간 단위
vnLoad('','/ksvc/inc/popup.inc.php', '#pop_plan_route_info', function(loadHtml){
let popPlanModal = kuls_modal(loadHtml);
let dtfrm = 'y-MM-dd HH:mm';
varsFactInfo.forEach( fct => {
let opt = document.createElement("option");
opt.value = fct.FACLT_CD;
opt.text = fct.FACLT_NM;
document.querySelector("#V_FACLT_CD").append(opt);
} );
document.querySelector("#pop_form_route .V_OP_NM").innerHTML = task.usrdata.OP_NM;
//document.querySelector("#pop_form_route .V_FACLT_NM").innerHTML = task.usrdata.FACLT_NM;
document.querySelector("#pop_form_route .V_MNG_NO").innerHTML = task.usrdata.MNG_NO;
document.querySelector("#pop_form_route .V_ST").innerHTML = task.usrdata.ST;
document.querySelector("#pop_form_route .V_CT").innerHTML = task.usrdata.CT;
document.querySelector("#pop_form_route #V_MNG_BG").value = task.usrdata.MNG_BG||'#000001';
document.querySelector("#pop_form_route #V_PLM_ST_TM").value = luxon.DateTime.fromMillis(task.from).toFormat(dtfrm);
//document.querySelector("#pop_form_route #V_PLM_ED_TM").value = luxon.DateTime.fromMillis(task.to).toFormat(dtfrm);
document.querySelector("#pop_form_route #V_FACLT_CD").value = task.usrdata.FACLT_CD;
document.querySelector("#pop_form_route #V_PLN_TERM_TM").innerText = task.usrdata.PLN_TERM_TM;
jQuery('.dtime_picker').datetimepicker({
allowTimes: [...Array(24*per_period).keys()].map(idx=>Math.floor(idx/per_period).toString().padStart(2,'0')+':'+(idx%per_period).toString().padEnd(2,'0')),
format: "Y-m-d H:i",
defaultTime: luxon.DateTime.now().toFormat("HH:")+Math.floor(luxon.DateTime.now().toFormat("mm")/10).toString().padEnd(2,'0'),
});
['click','keypress'].forEach(evt => document.querySelector("#btnPutRoute").addEventListener(evt, function(){
task.from = luxon.DateTime.fromFormat(document.querySelector("#pop_form_route #V_PLM_ST_TM").value,dtfrm).toMillis();
//task.to = luxon.DateTime.fromFormat(document.querySelector("#pop_form_route #V_PLM_ED_TM").value,dtfrm).toMillis();
task.to = getTo_addHolytime( task, gantt_obj );
task.resourceId = document.querySelector("#V_FACLT_CD").value;
task.html = task_title(task.usrdata);
let bgcolor = document.querySelector("#pop_form_route #V_MNG_BG").value;
let odia = task.usrdata.OUT_DIA.slice(0,1);
if( bgcolor != '#000001' ){
task.bgcolor = bgcolor;
task.usrdata.MNG_BG = bgcolor;
gantt_obj.gantt_option.tasks.forEach( t => {
// if( t.usrdata.MNG_NO == task.usrdata.MNG_NO ){
// t.bgcolor = bgcolor;
// }
if( t.usrdata.OUT_DIA.slice(0,1) === odia ){
t.bgcolor = bgcolor;
}
} );
document.querySelectorAll(".col_odia"+odia).forEach(codiv => codiv.style.backgroundColor = bgcolor);
}
task.usrdata._STATUS_ = "U";
gantt_obj.gantt.updateTask(task);
popPlanModal.delete();
}));
});
};
let ccnt = 0;
let stoblk = null;
const drag_block = () => { //svelte gantt 에 콜백이 존재하면 대체한다. - 사용중지
stoblk && window.clearTimeout(stoblk);
stoblk = window.setTimeout(()=>{
if( jQuery(".sg-task").length ){
gantt_obj.gantt_option.tasks.forEach(task => {
if( !task.enableDragging ){
jQuery(`[data-task-id=${task.id}]`).removeClass("dragging-enabled").addClass("opacity-40 font-italic");
}
});
}
drag_block();
},++ccnt*ccnt*ccnt*ccnt*20);
};
gantt_obj.pplan_make('',luxon.DateTime.now().toFormat('y-MM-dd'),{days:addday});
document.querySelector("#S_SO_PLAN_DT").addEventListener("change", function(){
let newdate = {};
let adval = document.querySelector("#S_DT_ADTERM").value-1;
switch( document.querySelector("#S_DT_TYPE").value ){
case "W": newdate = {days:adval*7}; break;
case "M": newdate = {months:adval}; break;
default: newdate = {days:adval};
}
gantt_obj.pplan_make(document.querySelector("#S_DT_TYPE").value,this.value,newdate);
});
['click','keypress'].forEach( evt => document.querySelector("#btn_plan_prev").addEventListener(evt, function(){
let newdate = {};
let adval = document.querySelector("#S_DT_ADTERM").value-1;
switch( document.querySelector("#S_DT_TYPE").value ){
case "W": newdate = {days:adval*7+7}; break;
case "M": newdate = {months:adval+1}; break;
default: newdate = {days:adval+1};
}
document.querySelector("#S_SO_PLAN_DT").value = luxon.DateTime.fromMillis(gantt_obj.currentStart).minus(newdate).toFormat('y-MM-dd');
document.querySelector("#S_SO_PLAN_DT").dispatchEvent(new Event('change'));
}));
['click','keypress'].forEach( evt => document.querySelector("#btn_plan_next").addEventListener(evt, function(){
let newdate = {};
let adval = document.querySelector("#S_DT_ADTERM").value-1;
switch( document.querySelector("#S_DT_TYPE").value ){
case "W": newdate = {days:adval*7+7}; break;
case "M": newdate = {months:adval+1}; break;
default: newdate = {days:adval+1};
}
document.querySelector("#S_SO_PLAN_DT").value = luxon.DateTime.fromMillis(gantt_obj.currentStart).plus(newdate).toFormat('y-MM-dd');
document.querySelector("#S_SO_PLAN_DT").dispatchEvent(new Event('change'));
}));
document.querySelectorAll("#S_DT_TYPE, #S_DT_ADTERM").forEach(tgt => tgt.addEventListener("change", function(){
document.querySelector("#S_SO_PLAN_DT").dispatchEvent(new Event('change'));
}));
document.querySelector("#S_FACLT_CD").addEventListener("change", function(){
document.querySelector("#S_SO_PLAN_DT").dispatchEvent(new Event('change'));
});
['click','keypress'].forEach( evt => document.querySelector("#btnPutPPlan").addEventListener( evt, function(){
ajax_json({
url: ajax_url,
data: {mode:"setPlanTimeRoute", reqdata:JSON.stringify(gantt_obj.gantt_option.tasks.filter(task => task.usrdata._STATUS_==="U").map( task => task.usrdata))},
success: function(data){
if( data.code ){
kuls_success("적용 되었습니다.");
}else{
kuls_alert(data.mesg);
}
}
});
}));
const Tb_funcs_planroute = new planrouteManager();