//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();