/* * @Overview 품목등록 페이지 * @History 2024-03-20 / 이원기 / 최초작성 2024-03-26 / 박민희 2024-04-03 / 이원기 */ class Tb_item_class { constructor(container) { let _this = this; _this.tbList =""; _this.itemData = ""; _this.ITEM_CD = ""; this.ajaxUrl = "./item.ajax.php"; this.container = document.querySelector(container); this.table = this.container.querySelector(".hy-table"); this.addBtn = this.container.querySelector(".add-btn"); this.removeBtn = this.container.querySelector(".remove-btn"); } // // tableBuild 되었을때 getManList getMainList() { let _this = this; let talert = window.setTimeout(() => { _this.tbList.alert("Loading ...") }, 1000); let ITEM_GRP = document.getElementById("ITEM_GRP").value; //품목그룹 let ITEM_CODE = document.getElementById("ITEM_CD").value; //품목코드 ajax_json({ url: this.ajaxUrl, data: { mode: "getItemList", ITEM_GRP:ITEM_GRP, ITEM_CD: ITEM_CODE}, success: (data) => { (data); if(data.code) { _this.tbList.setData(data.data); }else{ kuls_alert(data.mesg); } }, error: (req, status, err) => { kuls_alert(err.message); }, complete: () => { window.clearTimeout(talert); _this.tbList.clearAlert(); }, }); return true; } setFilter() {} /* * @Overview 테이블 행 추가 함수 * @Parameter 없음 * @function 기본키, _STATUS_:I 값을 넣은 행 추가 */ addRow() { this.tbList.deselectRow(); Tb_routing.itemData = null; Tb_routing.getMainList(); Tb_pic.getMainList(); Tb_process_check.getMainList(); this.tbList.addRow({ _STATUS_: "I" }, true); } /* * @Overview 테이블 행 삭제 함수 * @Parameter 없음 * @function 선택된 모든 행 STATUS D */ removeRow() { const selectedRows = this.tbList.getRows().filter(row=>{ return row.getData().check ==="Y" }); if(selectedRows.length > 0 ){ // 선택된 각 행 삭제 selectedRows.forEach((row) => { // STAUS D로 바꾸기 row.getData()._STATUS_ = row.getData()._STATUS_=="I"?null:"D"; const rowElement = row.getElement(); rowElement.classList.add("remove-row"); }); }else{ kuls_alert("삭제할 행을 선택해주세요.") } } /* * @Overview 삭제 취소 함수 * @Parameter 삭제 행 * @function 클릭시 삭제 취소 & STATUS를 공란으로 변경 */ clearRemove(tgt){ if(tgt._row.data._STATUS_ == "D"){ tgt._row.data._STATUS_ = ""; tgt._row.getElement().classList.remove("remove-row") } } /* * @Overview ROW 클릭 이벤트 * @Parameter 클릭한 ROW의 데이터 * @function 해당 ROW 클릭 시 발생 시킬 메서드 */ rowClick(e, tgt) { let _this = this; let clickRow = tgt._row; // 클릭한 데이터의 _row 값(tabulator) let clickData = clickRow.data; // _row의 Data 변수 Tb_routing.itemData = clickData; Tb_pic.itemData = clickData; if (tgt.isSelected()) { tgt.deselect(); this.clearRemove(tgt); } else { Tb_routing.getMainList(Tb_routing.itemData); Tb_pic.getMainList(clickData); Tb_process_check.getMainList(Tb_routing.itemData); this.tbList.deselectRow(); tgt.select(); } } cellClick(e, tgt) { var editor = tgt.getColumn().getDefinition().editor; // // 체크박스 클릭 switch (tgt.getField()) { case "USE_FLG": tgt.setValue(tgt.getValue() == "Y" ? "N" : "Y"); break; case "check": tgt.setValue(tgt.getValue() == "Y" ? "" : "Y"); this.clearRemove(tgt.getRow()) break; default: if (!editor) { this.rowClick && this.rowClick(e, tgt.getRow()); } break; } } // 셀 수정 cellEdited(cell) { cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U"; }; /* * @Overview 추가, 수정 및 삭제 데이터 저장 * @Parameter 없음 * @Function _STATUS_ : U, I, D Row 인 것 php 처리. */ putData() { let _this = this; // 저장 시 상태 변화 없는 row 요청 X if(this.tbList.getData().filter(row=> row._STATUS_).length == 0){ return false; } const blankObj = this.tbList.getRows().filter(row => { return Object.keys(row._row.data).filter(key => key !== '_STATUS_' && key !== 'USE_FLG').every(key => { const value = row._row.data[key]; return (value === undefined || value === ''); }); }); let postdata = { 'mode': 'putItem', 'reqdata': JSON.stringify(this.tbList.getData().filter(row=> row._STATUS_)), }; if(blankObj.length !== 0){ kuls_confirm("비어있는 행을 무시하고 진행하시겠습니까?","",()=>{ ajax_json({ url: _this.ajaxUrl, data: postdata, success: function (data) { if (data.code) { kuls_success("저장되었습니다."); _this.getMainList(); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { (request) kuls_alert(error.message); }, complete: function () { } }); },()=>{ blankObj.forEach(row=>{ row.getElement().classList.add("blank-row") }) (blankObj) }) }else{ ajax_json({ url: _this.ajaxUrl, data: postdata, success: function (data) { if (data.code) { kuls_success("저장되었습니다."); _this.getMainList(); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { (request) kuls_alert(error.message); }, complete: function () { _this.tbList.getRows().forEach(row=>{ row.getCell("ITEM_CD").getElement().addEventListener("click",(e)=>{ _this.rowClick(e,row); }) }); } } ); } } //값이 존재하는 경우 Circle 출력 formatterSelCircleIcon(tgt, params) { let cell = tgt._cell; let em = document.createElement("i"); if (cell.getValue()) { em.className = "bi bi-circle-fill fa-2xs"; } else { em.className = ""; } return em; } /* * @Overview 팝업 오픈 */ modalItem() { let _this = this; vnLoad( '', './item_pop.php', '', (loadHtml)=>{ this.putItem = kuls_modal(loadHtml); initPopup(), //엑셀연결 document.getElementById('excel_down').addEventListener('click', function (e) { getExcel2(); }); }); }; /* * @Overview 최초 실행 함수 * @Parameter 없음 */ init() { let _this = this; // field 정의 const fields = [ { title: "NO", formatter: "rownum", width: '5%'}, { field: "ITEM_CD", title: "품목", width: '15%', editor: tb_custom_editor.pkCode, formatter: tb_custom_formatter.pkCode, formatterParams: { tableClass: this }, }, //품목 코드 { field: "ITEM_NM", title: "품명", width: "40%", editor: "input", hozAlign: "left", cssClass: "editable-cell", }, //품목 코드 { field: "ITEM_GRP", title: "품목 그룹", width: '15%', editor: "list", editorParams: { values: varsITEM_GRP }, formatter: tb_common_funtions.formatterSelect, formatterParams: { values: varsITEM_GRP }, cssClass: "user-list", }, //품목 그룹 -select { field: "MAKE_TM", title: "등록일", width: '10%', formatter:"datetime", formatterParams:{ inputFormat:"yyyy-MM-dd", outputFormat:"yy.MM.dd", } }, { field: "DRAW_NO", title: "도면여부", width: '8%', editor: tb_custom_editor.clickShow, formatter: this.formatterSelCircleIcon, }, //도면 번호 - popup { field: "DRAW_VER", title: "버전", width: '5%' }, { field: "check", title: "삭제", width: '5%', headerSort: false, formatter: tb_common_funtions.formatterCheckboxIcon, formatterParams: { checkval: "Y" }, }, ]; const commonFieldData = { vertAlign: "middle", hozAlign: "center", resizable: "header", //Resize 는 헤더에서만 가능 headerHozAlign: "center", //헤더 정렬 headerSortTristate: true, //데이터 정렬 => 정/역/초기화 }; _this.tbList = new Tabulator(this.table, { layout: "fitColumns", // selectableRows: 1, data: [], //기본 데이터 columns: fields, //컬럼 설정 columnDefaults: commonFieldData, headerSortElement: "", //정렬 아이콘 }); // 데이터 불러오기 _this.tbList.on("tableBuilt", (e, tgt) => { _this.getMainList(e, tgt); }); // cell 클릭 시에 _this.tbList.on("cellClick", (e, tgt) => { _this.cellClick && Tb_item.cellClick(e, tgt); }); // cell 수정 시에 _this.tbList.on("cellEdited", (cell) => { _this.cellEdited && Tb_item.cellEdited(cell); }); // 복사 ["click", "keypress"].forEach((evt) => { const copyorder = document.querySelector("#copy_item_btn"); copyorder.addEventListener(evt, () => { // 품목 선택행 가져오기 const selectedRows = this.tbList.getSelectedRows(); if (selectedRows.length > 0) { //선택행이 있을때 const ITEM_CD = selectedRows[0].getData().ITEM_CD; // 모달 열기 vnLoad("", "./item_copy_pop.php", "", (loadHtml) => { const modal = kuls_modal(loadHtml); const data = {ITEM_CD: ITEM_CD} const copyItemVue = new CopyItemVueClass(data, modal); copyItemVue.init(); }); // 모달 종료 } else { kuls_alert("복사할 행을 선택해주세요."); } }); }); // 추가 ["click", "keypress"].forEach((evt) => { _this.addBtn.addEventListener(evt, () => { _this.addRow(); }); }); // 삭제 ["click", "keypress"].forEach((evt) => { _this.removeBtn.addEventListener(evt, () => { // 삭제 함수 _this.removeRow && this.removeRow(); }); }); // 조회 ["click", "keypress"].forEach((evt) => { const filterBtn = document.querySelector("#filter_btn"); filterBtn.addEventListener(evt, () => { Tb_routing.tbList.setData([]); Tb_pic.tbList.setData([]); Tb_process_check.tbList.setData([]); _this.getMainList && _this.getMainList(); }); }); //팝업띄우기 ["click", "keypress"].forEach((evt) => document .querySelector("#excel_pop") .addEventListener(evt, () => this.modalItem()) ); // 저장 ["click", "keypress"].forEach((evt) => { const putBtn = document.querySelector("#put_item"); putBtn.addEventListener(evt, () => { _this.putData(); Tb_routing.putRouting(); Tb_process_check.putInspSpec(); Tb_pic.putFile(); }); }); } } // 복사 팝업 뷰 클래스 class CopyItemVueClass { constructor(data, modal){ this.innerData = data; this.modal = modal; } init(){ const ITEM_CD = this.innerData.ITEM_CD; const modal = this.modal; // 뷰 페이지 구성 const vueForm = createApp({ data() { return { formData: { ITEM_CD: `${ITEM_CD}_copy`, BASE_CD: ITEM_CD, //가져오기 ITEM_NM: "", }, modal: modal }; }, mounted() { }, watch() { }, methods: { submit() { let postdata = { ...this.formData, mode: "copyItem", }; ajax_json({ url: "./item.ajax.php", data: postdata, success: function (data) { if (data.code) { kuls_success("저장되었습니다."); this.modal.delete(); Tb_item.getMainList(); } else { kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () {}, }); }, }, }).mount("#popup_item_copy"); // 뷰 종료 } } // 라우팅 테이블 클래스 class Tb_routing_class { constructor(container) { let _this = this; this.ajaxUrl = "./item.ajax.php"; _this.tbList = ""; _this.itemData = ""; _this.fileData = ""; this.container = document.querySelector(container); this.table = this.container.querySelector(".hy-table"); this.upBtn = this.container.querySelector(".up-btn") || ""; this.downBtn = this.container.querySelector(".down-btn") || ""; this.addBtn = this.container.querySelector(".add-btn"); this.removeBtn = this.container.querySelector(".remove-btn"); this.lastNum = 0; } /* * @Overview 데이터 가져오기 * @Parameter 없음 * @function 데이터 불러오기 * @function this.lastNum에 마지막 공순 넣기 */ getMainList(clickData,bool) { let _this = this; let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000); ajax_json({ url: this.ajaxUrl, data: { mode: "getRoutingList", ITEM_CD :_this.itemData?.ITEM_CD }, success: (data) => { _this.tbList.setData(data.data); if(bool){ this.editingRout(data.data); } if(data.data.length == 0){ this.lastNum = 0 }else{ this.lastNum = Math.max(...data.data.map(v=>v.OP_SEQ)); } }, error: (req, status, err) => { kuls_alert(err.message); }, complete: () => { window.clearTimeout(talert); this.tbList.clearAlert(); }, }); } getSortList(clickData) { let _this = this; let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000); ajax_json({ url: this.ajaxUrl, data: { mode : "getRoutingList",ITEM_CD :_this.itemData?.ITEM_CD}, success: (data) => { this.tbList.setData(data.data); if(data.data.length == 0){ this.lastNum = 0 }else{ this.lastNum = Math.max(...data.data.map(v=>v.OP_SEQ)); } }, error: (req, status, err) => { kuls_alert(err.message); }, complete: () => { window.clearTimeout(talert); this.tbList.clearAlert(); }, }); } editSort(data){ let _this = this; let temArr = data; if(temArr.length === 1){ temArr[0].OP_SEQ = 10; temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y temArr[0].LAST_OP_FLG = 'Y' temArr[0].PRV_OP_CD = '' temArr[0].NXT_OP_CD = '' if (temArr.some(x => x._STATUS_ === "I" || temArr.some(x => x._STATUS_ === "D"))) { } else if (temArr.some(x => x._STATUS_ === "U") || temArr.some(x => x)) { temArr[0]._STATUS_ = "U"; } }else { for(let i = 0; i < temArr.length; i++) { temArr[i].OP_SEQ = (parseInt([i]) + 1) * 10 // 공정 순서의 숫자 채번 if (parseInt([i]) === 0) { // 0인 경우 => 첫번째 공정 순서의 경우 temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y temArr[0].LAST_OP_FLG = 'N' // 마지막 공정에 대하여 N temArr[i].PRV_OP_CD = '' // 이전의 공정에 대하여 빈값 부여 } else { // 0이 아닌경우 => 두번째 공정 순서부터 값 부여 temArr[i].FRST_OP_FLG = 'N' temArr[i].LAST_OP_FLG = 'N' temArr[i].PRV_OP_CD = temArr[i - 1].OP_CD; // 이전의 공정에 대하여 VALUE 바인딩 temArr[i - 1].NXT_OP_CD = temArr[i].OP_CD; // 다음의 공정에 대하여 VALUE 바인딩 } if (parseInt([i]) === temArr.length - 1) { temArr[temArr.length - 1].FRST_OP_FLG = 'N' temArr[temArr.length - 1].LAST_OP_FLG = 'Y' temArr[temArr.length-1].NXT_OP_CD = '' } // some : I나 D 상태가 하나라도 있으면 TRUE 반환 if (temArr.some(x => x._STATUS_ === "I" || temArr.some(x => x._STATUS_ === "D"))) { } else if (temArr.some(x => x._STATUS_ === "U") || temArr.some(x => x)) { temArr[i]._STATUS_ = "U"; } } } console.log(temArr); return temArr } editingRout(edit) { let _this = this; console.log(edit); if(!_this.editSort(edit).filter( row=> row._STATUS_ )){ return false; } let postdata = { mode: 'putRouting', reqdata: JSON.stringify(_this.editSort(edit).filter( row=> row._STATUS_ )), }; console.log(postdata) ajax_json({ url: this.ajaxUrl, data: postdata, success: function (data) { if (data.code) { _this.getSortList(Tb_item.tbList.getSelectedData()[0]); }else{ kuls_alert(data.msg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { } }) } /* * @Overview 라우팅 SORTING * @Parameter 없음 * @function 테이블 데이터 순차적으로 SORTING 하여 데이터 가공 * */ sortingRouting(){ let temArr = this.tbList.getData(); // 테이블 전체 데이터 if(this.tbList.getData().length === 1){ temArr[0].OP_SEQ = 10; temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y temArr[0].LAST_OP_FLG = 'Y' temArr[0].PRV_OP_CD = '' temArr[0].NXT_OP_CD = '' if(temArr.some(x=>x._STATUS_ === "I" ||temArr.some(x=>x._STATUS_ === "D" ))){ }else if(temArr.some(x=>x._STATUS_ === "U")){ temArr[0]._STATUS_ = "U"; } }else{ for(let i = 0; i < temArr.length; i++){ temArr[i].OP_SEQ = (parseInt([i]) + 1) * 10 // 공정 순서의 숫자 채번 if(parseInt([i]) === 0){ // 0인 경우 => 첫번째 공정 순서의 경우 temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y temArr[0].LAST_OP_FLG = 'N' // 마지막 공정에 대하여 N temArr[i].PRV_OP_CD = '' // 이전의 공정에 대하여 빈값 부여 }else{ // 0이 아닌경우 => 두번째 공정 순서부터 값 부여 temArr[i].FRST_OP_FLG = 'N' temArr[i].LAST_OP_FLG = 'N' temArr[i].PRV_OP_CD = temArr[i-1].OP_CD; // 이전의 공정에 대하여 VALUE 바인딩 temArr[i - 1].NXT_OP_CD = temArr[i].OP_CD; // 다음의 공정에 대하여 VALUE 바인딩 } if(parseInt([i]) === temArr.length-1){ temArr[temArr.length-1].FRST_OP_FLG = 'N' temArr[temArr.length-1].LAST_OP_FLG = 'Y' temArr[temArr.length-1].NXT_OP_CD = '' } // some : I나 D 상태가 하나라도 있으면 TRUE 반환 if(temArr.some(x=>x._STATUS_ === "I" ||temArr.some(x=>x._STATUS_ === "D" ))){ }else if(temArr.some(x=>x._STATUS_ === "U")){ temArr[i]._STATUS_ = "U"; } } } return temArr } /* Overview 공정코드 INSERT, UPDATE, DELETE * Parameter */ putRouting(){ let _this = this; let temp ="" if(this.tbList.getData().filter(row=> row._STATUS_).length === 0 ){ return false; } let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000); ajax_json({ url: this.ajaxUrl, // soringRouting 함수는 모든 공정에 대하여 순서를 부여하고 속성을 부여합니다 data: { mode: "putRouting", reqdata: JSON.stringify(this.sortingRouting().filter( row=> row._STATUS_ )),}, success: (data) => { if(data.code){ kuls_success("적용되었습니다"); } if(data.delete){ temp = true; } _this.getMainList("",true); Tb_process_check.getMainList(Tb_item.tbList.getSelectedData()[0]); }, error: (req, status, err) => { kuls_alert(err.message); }, complete: () => { window.clearTimeout(talert); this.tbList.clearAlert(); }, }); } afterDeleting = () =>{ let _this = this; ajax_json({ url: this.ajaxUrl, // soringRouting 함수는 모든 공정에 대하여 순서를 부여하고 속성을 부여합니다 data: { mode: "putRouting", reqdata: JSON.stringify(_this.afterDeletingSort().filter( row=> row._STATUS_ )),}, success: (data) => { }, error: (req, status, err) => { kuls_alert(err.message); }, }); } afterDeletingSort=()=>{ let _this = this; let temArr = this.tbList.getData(); // 테이블 전체 데이터 if(this.tbList.getData().length === 1){ temArr[0].OP_SEQ = 10; temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y temArr[0].LAST_OP_FLG = 'Y' temArr[0].PRV_OP_CD = '' temArr[0].NXT_OP_CD = '' }else { for (let i = 0; i < temArr.length; i++) { temArr[i].OP_SEQ = (parseInt([i]) + 1) * 10 // 공정 순서의 숫자 채번 if (parseInt([i]) === 0) { // 0인 경우 => 첫번째 공정 순서의 경우 temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y temArr[0].LAST_OP_FLG = 'N' // 마지막 공정에 대하여 N temArr[i].PRV_OP_CD = '' // 이전의 공정에 대하여 빈값 부여 } else { // 0이 아닌경우 => 두번째 공정 순서부터 값 부여 temArr[i].FRST_OP_FLG = 'N' temArr[i].LAST_OP_FLG = 'N' temArr[i].PRV_OP_CD = temArr[i - 1].OP_CD; // 이전의 공정에 대하여 VALUE 바인딩 temArr[i - 1].NXT_OP_CD = temArr[i].OP_CD; // 다음의 공정에 대하여 VALUE 바인딩 } if (parseInt([i]) === temArr.length - 1) { temArr[temArr.length - 1].FRST_OP_FLG = 'N' temArr[temArr.length - 1].LAST_OP_FLG = 'Y' } // some : I나 D 상태가 하나라도 있으면 TRUE 반환 if (temArr.some(x => x._STATUS_ === "I")) { } else if (temArr.some(x => x._STATUS_ === "D") || temArr.some(x => x)) { temArr[i]._STATUS_ = "U"; } } } return temArr } setFilter() {} /* * @Overview 테이블 행 추가 함수 * @Parameter 없음 * @function 기본키, _STATUS_:I 값을 넣은 행 추가 */ addRow(item_cd) { let _this = this; if(item_cd === undefined){ kuls_alert("품목코드를 선택해주세요") return false; } this.lastNum += 10; this.tbList.addRow({ _STATUS_: "I", OP_SEQ: this.lastNum, ITEM_CD: item_cd }); } /* * @Overview 테이블 행 삭제 함수 * @Parameter 없음 * @function 선택된 모든 행 STATUS D */ removeRow() { const selectedRows = this.tbList.getRows().filter(row=>{ return row.getData().check ==="Y" }); if(selectedRows.length > 0 ){ // kuls_confirm("삭제","하시겠습니까?", ()=>{ // 선택된 각 행 삭제 selectedRows.forEach((row) => { // STAUS D로 바꾸기 row.getData()._STATUS_ = row.getData()._STATUS_=="I"?null:"D"; const rowElement = row.getElement(); rowElement.classList.add("remove-row"); }); // }) }else{ kuls_alert("삭제할 행을 선택해주세요.") } } /* * @Overview 삭제 취소 함수 * @Parameter 삭제 행 * @function 클릭시 삭제 취소 & STATUS를 공란으로 변경 */ clearRemove(tgt){ if(tgt._row.data._STATUS_ == "D"){ tgt._row.data._STATUS_ = ""; tgt._row.getElement().classList.remove("remove-row") // const selectedRows = this.tbList.getSelectedRows(); // 선택된 모든 행 가져오기 } } /* * @Overview 테이블 행 공순 변경 함수(위로) * @Parameter 없음 * @function 선택된 모든 행 위로 */ upRow() { } /* * @Overview 테이블 행 공순 변경 함수(아래로) * @Parameter 없음 * @function 선택된 모든 행 아래로 */ downRow() { } // 클릭 이벤트 rowClick(e, tgt) { // 삭제가 가능하도록 ROW SELECT // staus D로 바꾸기? if (tgt.isSelected()) { this.tbList.deselectRow(tgt._row); } else { this.tbList.deselectRow(); this.tbList.selectRow(tgt); } } cellClick(e, tgt) { const editor = tgt.getColumn().getDefinition().editor; switch (tgt.getField()) { case "OP_CD": popOper({ OP_CD : "OP_CD", OP_NM: "OP_NM" },tgt.getRow()); break; case "check": tgt.setValue(tgt.getValue() == "Y" ? "" : "Y"); this.clearRemove(tgt.getRow()) break; default: if (!editor) { this.rowClick && this.rowClick(e, tgt.getRow()); } break; } } /* * @Overview 파일 다운로드 함수 * @Parameter 없음 */ getFileUrl =function(DRAW_NO, SID, FILE_ID, FILE_NM,kind,down){ let urlStr = ""; if(kind == "draw"){ urlStr = '/include/getFile.php'+"?gubun=draw&nid=" + DRAW_NO + "&sid="+ SID + "&file_id="+ FILE_ID+ "&name="+FILE_NM if(down === true){ location.href = urlStr; } }else{ urlStr = '/include/getFile.php'+"?gubun=rout&ITEM_CD=" + DRAW_NO + "&ROUT_SQNO="+ SID + "&name="+FILE_ID if(down === true){ location.href = urlStr; } } return urlStr; } /* * @Overview 아이콘 함수 * @Parameter 없음 */ downloadIcon = function(cell, formatterParams, onRendered){ //plain text value if(!cell.getRow().getData().FILE_NM){ // kuls_alert(""); return ""; } return ""; }; // /* // * @Overview file 업로드 함수 // * @Parameter 없음 // * @function 파일 선택 시 업로드 창 열림 -> 선택 후 임시폴더 업로드 -> putTempFile 함수 통해 해당 ROWDATA에 파일 데이터 업데이트 // */ // 셀 수정 cellEdited(cell) { cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U"; } // /* // * @Overview file 업로드 함수 // * @Parameter 없음 // * @function 파일 선택 시 업로드 창 열림 -> 선택 후 임시폴더 업로드 -> putTempFile 함수 통해 해당 ROWDATA에 파일 데이터 업데이트 // */ uploadButton = function(cell){ //plain text value var button = $(""); button.on("click", function(){ let editor = document.createElement("input"); editor.setAttribute("type", "file"); editor.setAttribute("name", "imgFile"); editor.setAttribute("id", "imgFile"); editor.style.padding = "3px"; editor.style.width = "100%"; editor.style.boxSizing = "border-box"; editor.click(); editor.addEventListener('change', function() { cell.getRow().getData().id = Math.floor(Math.random() * 101); }); // var file = this.files[0]; }); return button[0]; }; deleteButton = function(cell, data, row, options){ //plain text value if(!cell.getRow().getData().FILE_NM){ return ""; } let _this = this; var button = $(""); // value button.on("click", function(){ ajax_json({ url: "./item.ajax.php", data: { mode: "delRoutFile", ITEM_CD:cell.getRow().getData().ITEM_CD , ROUT_SQNO:cell.getRow().getData().ROUT_SQNO}, success: (data) => { if(data.code){ kuls_success("적용 되었습니다."); } }, error: (req, status, err) => { kuls_alert(err.message); }, complete: () => { _this.getMainList(); }, }); }); return button[0]; }; //팝업 아이콘 popIcon = function(cell, formatterParams, onRendered) { //plain text value return ""; }; openModal(cell) { let clickData = cell.getData(); vnLoad("", "./reg_rout_pop.inc.php", "", (loadHtml) => { this.putPartnerModal = kuls_modal(loadHtml); const popFileUpload = new Tb_file_upload_class("#popup_file_upload",clickData); popFileUpload.init_insp(); }); } /* * @Overview 최초 실행 함수 * @Parameter 없음 */ init() { let _this = this; // field 정의 const fields = [ { formatter:"rownum", field:"id", title: "NO", width: 50, visible: false }, { field: "ITEM_CD", title: "품목코드", visible: false}, { field: "OP_SEQ", title: "공순", width: 40,movableRows: true}, { title: "공정", cssClass:"width-200", columns:[ {field:"OP_CD", width:100, cssClass:"editable-cell"}, {field:"OP_NM", width:100} ] }, { field: "ROUT_SQNO", title: "일련번호", width: 80,visible:false}, { field: "FRST_OP_FLG", title: "처음 공정" , width: 80, visible: false}, { field: "LAST_OP_FLG", title: "마지막 공정", width: 80, visible: false }, { field: "PRV_OP_CD", title: "이전 공정", width: 80, visible: false }, { field: "NXT_OP_CD", title: "다음 공정", width: 80, visible: false }, { field: "STD_SETUP_TM", title: "준비시간
(분)", width: 80, editor: "input", formatterParams:{ decimal:".", precision:0 }, }, { field: "CYCLE_TM", title: "공정시간
(분)", width: 80, editor: "input", formatterParams:{ decimal:".", precision:0 } }, { field: "STD_OP_AMT", title: "공정 단가
(원)", width: 80 ,editor: "input", formatter:"money", formatterParams:{ decimal:".", precision:0 } }, { field: "FILE_MANAGE", title: "파일관리", width: 70, formatter: this.popIcon, cellClick:function(e,cell){ // let _this = this; _this.openModal(cell); } }, { field:"check", title: "삭제", width: 50, headerSort: false, formatter: tb_common_funtions.formatterCheckboxIcon, formatterParams: { checkval: "Y" }, }, ]; const commonFieldData = { headerSort: false, vertAlign: "middle", hozAlign: "center", resizable: "header", //Resize 는 헤더에서만 가능 headerHozAlign: "center", //헤더 정렬 headerSortTristate: true, //데이터 정렬 => 정/역/초기화 }; this.tbList = new Tabulator(this.table, { layout: "fitColumns", movableRows:true, // selectableRows: 1, data: [], //기본 데이터 columns: fields, //컬럼 설정 columnDefaults: commonFieldData, headerSortElement: "", //정렬 아이콘 selectable: 1 }); // row 이동 시에 this.tbList.on("rowMoved", function(row){ //row - row component if(Tb_routing.sortingRouting().some(x=>x._STATUS_ == "I")){ kuls_alert("현재 입력 중인 라우팅을 저장 후 공정 순서를 조정해주세요") Tb_routing.getMainList(Tb_item.itemData); }else{ const rowElement = row.getElement(); rowElement.classList.add("edit-row"); // ""(row._row.getData()); row._row.getData()._STATUS_ = "U"; } }); // cell 클릭 시에 this.tbList.on("cellClick", (e, tgt) => { this.cellClick && Tb_routing.cellClick(e, tgt); // Tb_process_check.getMainList(); }); // cell 수정 시에 this.tbList.on("cellEdited", (cell) => { this.cellEdited && Tb_routing.cellEdited(cell); // Tb_process_check.getMainList(); }); // 추가 ["click", "keypress"].forEach((evt) => { this.addBtn.addEventListener(evt, () => { // ""(); this.addRow && this.addRow(Tb_item.tbList.getSelectedData()[0]?.ITEM_CD); }); }); // 삭제 ["click", "keypress"].forEach((evt) => { this.removeBtn.addEventListener(evt, () => { this.removeRow && this.removeRow(); }); }); // 위로 ["click", "keypress"].forEach((evt) => { this.upBtn.addEventListener(evt, () => { // this.upRow && this.upRow(); }); }); // 아래로 ["click", "keypress"].forEach((evt) => { this.downBtn.addEventListener(evt, () => { this.downRow && this.downRow(); }); }); } } class Tb_process_check_class { constructor(container) { this.ajaxUrl = "./item.ajax.php"; this.container = document.querySelector(container); this.table = this.container.querySelector(".hy-table"); this.addBtn = this.container.querySelector(".add-btn"); this.removeBtn = this.container.querySelector(".remove-btn"); } // tableBuild 되었을때 getManList getMainList(clickData) { let _this = this; let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000); ajax_json({ url: this.ajaxUrl, data: { mode: "getInspSpecList", ITEM_CD:clickData?.ITEM_CD, }, success: (data) => { _this.tbList.setData(data.data); }, error: (req, status, err) => { kuls_alert(err.message); }, complete: () => { window.clearTimeout(talert); this.tbList.clearAlert(); } }) } setFilter() {} /* * @Overview 테이블 행 추가 함수 * @Parameter 없음 * @function 기본키, _STATUS_:I 값을 넣은 행 추가 */ addRow(ITEM_CD, ROUT_SQNO, OP_CD, OP_SEQ) { if(ITEM_CD === undefined){ kuls_alert("품목 코드를 저장 후 선택해주세요"); return false; } if(ITEM_CD === undefined || ROUT_SQNO === undefined){ kuls_alert("공정 코드를 저장 후 선택해주세요"); return false; } const INSP_ITEM = this.tbList.getData().length+1; this.tbList.addRow({ _STATUS_: "I", INSP_ITEM: INSP_ITEM, SPEC_ITEM_CD: ITEM_CD, ROUT_SQNO: ROUT_SQNO, OP_CD : OP_CD , OP_SEQ : OP_SEQ},true); } /* * @Overview 추가, 수정 및 삭제 데이터 저장 * @Parameter 없음 * @Function _STATUS_ : U, I, D Row 인 것 php 처리. */ putInspSpec() { let _this = this; // 저장 시 상태 변화 없는 row 요청 X if(this.tbList.getData().filter(row=> row._STATUS_).length == 0){ return false; } const blankObj = this.tbList.getRows().filter(row => { return Object.keys(row._row.data).filter(key => key !== '_STATUS_' && key !== 'USE_FLG' && key !== 'OP_CD' && key !== 'ROUT_SQNO' && key !== 'SPEC_ITEM_CD').every(key => { const value = row._row.data[key]; return (value === undefined || value === ''); }); }); let postdata = { 'mode': 'putInspSpec', 'reqdata': JSON.stringify(this.tbList.getData().filter(row=> row._STATUS_)), }; if(blankObj.length !== 0){ kuls_confirm("비어있는 행을 무시하고 진행하시겠습니까?","",()=>{ ajax_json({ url: _this.ajaxUrl, data: postdata, success: function (data) { if (data.code) { // _this.getMainList(Tb_item.getSelectedData()[0]); kuls_success("저장되었습니다."); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { (request) kuls_alert(error.message); }, complete: function () { } }); },()=>{ blankObj.forEach(row=>{ row.getElement().classList.add("blank-row") }) }) }else{ ajax_json({ url: _this.ajaxUrl, data: postdata, success: function (data) { if (data.code) { _this.getMainList(Tb_item.tbList.getSelectedData()[0]); kuls_success("저장되었습니다."); }else{ kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { } }); } } /* * @Overview 테이블 행 삭제 함수 * @Parameter 없음 * @function 선택된 모든 행 STATUS D */ removeRow() { const selectedRows = this.tbList.getRows().filter(row=>{ return row.getData().check ==="Y" }); if(selectedRows.length > 0 ){ // kuls_confirm("삭제","하시겠습니까?", ()=>{ // 선택된 각 행 삭제 selectedRows.forEach((row) => { // STAUS D로 바꾸기 row.getData()._STATUS_ = row.getData()._STATUS_=="I"?null:"D"; const rowElement = row.getElement(); rowElement.classList.add("remove-row"); }); }else{ kuls_alert("삭제할 행을 선택해주세요.") } } /* * @Overview 삭제 취소 함수 * @Parameter 삭제 행 * @function 클릭시 삭제 취소 & STATUS를 공란으로 변경 */ clearRemove(tgt){ if(tgt._row.data._STATUS_ == "D"){ tgt._row.data._STATUS_ = ""; tgt._row.getElement().classList.remove("remove-row") } } /* * @Overview 테이블 행 선택 함수 * @Parameter 없음 * @function 선택된 모든 행 색 변경 */ rowClick(e, tgt) { if (tgt.isSelected()) { tgt.deselect(); this.clearRemove(tgt); } else { tgt.select(); } } /* * @Overview 삭제 취소 함수 * @Parameter 삭제 행 * @function 클릭시 삭제 취소 & STATUS를 공란으로 변경 */ clearRemove(tgt){ if(tgt._row.data._STATUS_ == "D"){ tgt._row.data._STATUS_ = ""; tgt._row.getElement().classList.remove("remove-row") } } cellClick(e, tgt) { var editor = tgt.getColumn().getDefinition().editor; // 체크박스 클릭 switch (tgt.getField()) { case "INSP_NAME": popInsp({ INSP_NAME: "INSP_NAME", INSP_METH: "INSP_METH", },tgt.getRow()) break; case "check": tgt.setValue(tgt.getValue() == "Y" ? "" : "Y"); this.clearRemove(tgt.getRow()) break; case "OKNG_FLG": tgt.setValue(tgt.getValue() == "Y" ? "N" : "Y"); if(tgt.getValue() === "Y"){ tgt.getRow().update({SPEC_VAL:"",TOL_UPPER:"",TOL_LOWER:""}); }else{ tgt.getRow().getCell("SPEC_VAL").getElement().classList.add("tabulator-editable"); tgt.getRow().getCell("TOL_UPPER").getElement().classList.add("tabulator-editable"); tgt.getRow().getCell("TOL_LOWER").getElement().classList.add("tabulator-editable"); } tgt.getElement().classList.add("tabulator-editable"); break; default: if (!editor) { this.rowClick && this.rowClick(e, tgt.getRow()); } break; } } // 셀 수정 cellEdited(cell) { cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U"; } integerMutator = function(value, data, type, params, component) { return value ? parseInt(value, 10) : null; }; /* * @Overview 최초 실행 함수 * @Parameter 없음 */ init() { // field 정의 const fields = [ { formatter:"rownum", field:"file_id", title: "NO", width: 40 }, { field: "OP_SEQ", title: "공순", width: 40}, { field:"OP_CD", title: "공정", width:40}, { field: "INSP_ITEM", title: "검사항목코드", width: 75, visible: true}, { field: "INSP_NAME", title: "검사항목", width: 70, cssClass:"editable-cell" }, { field: "INSP_METH", title: "검사방법", width: 70, editor:"list", editorParams:{values: varsINSP_METH},formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsINSP_METH},cssClass: "user-list" }, { field: "OKNG_FLG", title: "OK/NG", width: 50, cssClass: "tabulator-editable", formatter: tb_common_funtions.formatterToggleboxGreenIcon, formatterParams: { checkval: "Y" }}, { field: "ROUT_SQNO", title: "라우팅일련번호", visible:false }, { field: "INSP_TOOL", title: "측정기", width: 110, editor: "list", cssClass:"user-list", editorParams:{values: varsINSP_TOOL}, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsINSP_TOOL} }, { field: "SPEC_VAL", title: "기준값
(㎜)", width: 50, editor: "number", formatter: tb_custom_formatter.limitValue, formatterParams: { checkPoint : "OKNG_FLG", decimal : 3 }, editable:(cell) => { if(cell.getData().OKNG_FLG == 'Y'){ } return cell.getData().OKNG_FLG !== 'Y'; }, }, { field: "TOL_UPPER", title: "상한값
(㎛)", width: 50, formatter: tb_custom_formatter.limitValue, formatterParams: { checkPoint : "OKNG_FLG", decimal : 0 }, editor:"number", editable:(cell) => { if(cell.getData().OKNG_FLG == 'Y'){ } return cell.getData().OKNG_FLG !== 'Y'; }, }, { field: "TOL_LOWER", title: "하한값
(㎛)", width: 50, formatter: tb_custom_formatter.limitValue, formatterParams: { checkPoint : "OKNG_FLG", decimal : 0 }, editor:"number", editable:(cell) => { if(cell.getData().OKNG_FLG == 'Y'){ } return cell.getData().OKNG_FLG !== 'Y'; }, }, { field: "REMARK", title: "비고", width: 150, editor: "input" }, { field:"check", title: "삭제", width: 40, headerSort: false, formatter: tb_common_funtions.formatterCheckboxIcon, formatterParams: { checkval: "Y" }, }, ]; const commonFieldData = { headerSort: false, vertAlign: "middle", hozAlign: "center", resizable: "header", //Resize 는 헤더에서만 가능 headerHozAlign: "center", //헤더 정렬 headerSortTristate: true, //데이터 정렬 => 정/역/초기화 }; this.tbList = new Tabulator(this.table, { layout: "fitColumns", data: [], //기본 데이터 columns: fields, //컬럼 설정 columnDefaults: commonFieldData, }); // cell 클릭 시에 this.tbList.on("cellClick", (e, tgt) => { this.cellClick && this.cellClick(e, tgt); }); // cell 수정 시에 this.tbList.on("cellEdited", (cell) => { this.cellEdited && this.cellEdited(cell); }); // 추가 ["click", "keypress"].forEach((evt) => { this.addBtn.addEventListener(evt, () => { this.addRow( Tb_item.tbList.getSelectedData()[0]?.ITEM_CD, Tb_routing.tbList.getSelectedData()[0]?.ROUT_SQNO, Tb_routing.tbList.getSelectedData()[0]?.OP_CD, Tb_routing.tbList.getSelectedData()[0]?.OP_SEQ ); }); }); // 삭제 함수 ["click", "keypress"].forEach((evt) => { this.removeBtn.addEventListener(evt, () => { this.removeRow && this.removeRow(); }); }); } } class Tb_pic_class { constructor(container) { let _this = this; _this.file = ""; _this.itemData =""; _this.download_url = "/include/getFile.php"; this.ajaxUrl = "./item.ajax.php"; this.container = document.querySelector(container); this.table = this.container.querySelector(".hy-table"); this.addBtn = this.container.querySelector(".add-btn"); this.removeBtn = this.container.querySelector(".remove-btn"); } // tableBuild 되었을때 getManList getMainList(clickData) { let _this = this; let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000); ajax_json({ url: this.ajaxUrl, data: { mode : "getDrawList", ITEM_CD : _this.itemData.ITEM_CD}, success: (data) => { this.tbList.setData(data.data); }, error: (req, status, err) => { kuls_alert(err.message); }, complete: () => { window.clearTimeout(talert); this.tbList.clearAlert(); }, }); } setFilter() {} /* * @Overview 테이블 행 추가 함수 * @Parameter 없음 * @function 기본키, _STATUS_:I 값을 넣은 행 추가 */ addRow() { this.tbList.addRow({ _STATUS_: "I" },true); } /* * @Overview 테이블 행 삭제 함수 * @Parameter 없음 * @function 선택된 모든 행 STATUS D */ removeRow() { const selectedRows = this.tbList.getRows().filter(row=>{ return row.getData().check ==="Y" }); if(selectedRows.length > 0 ){ // kuls_confirm("삭제","하시겠습니까?", ()=>{ // 선택된 각 행 삭제 selectedRows.forEach((row) => { // STAUS D로 바꾸기 row.getData()._STATUS_ = row.getData()._STATUS_=="I"?null:"D"; const rowElement = row.getElement(); rowElement.classList.add("remove-row"); }); // }) }else{ kuls_alert("삭제할 행을 선택해주세요.") } } /* * @Overview 삭제 취소 함수 * @Parameter 삭제 행 * @function 클릭시 삭제 취소 & STATUS를 공란으로 변경 */ clearRemove(tgt){ if(tgt._row.data._STATUS_ == "D"){ // (); tgt._row.data._STATUS_ = ""; tgt._row.getElement().classList.remove("remove-row") // const selectedRows = this.tbList.getSelectedRows(); // 선택된 모든 행 가져오기 } } putTempFile(file){ let _this = this; let formData = new FormData(); formData.append('upfile', file); formData.append('mode', "putTempFile"); let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000); jQuery.ajax({ url: _this.ajaxUrl, type: 'POST', data: formData, contentType: false, processData: false, success: (data)=>{ if(data.code !== "0") { let fdata = JSON.parse(data).data; let FILE_NM = fdata['file_name']; let TMP_NAME = fdata['tmp_name']; let FILE_SIZE = fdata['file_size']; let FILE_TYPE = fdata['file_type']; _this.tbList.addRow({ _STATUS_:'I', ITEM_CD : Tb_item.tbList.getSelectedData()[0]?.ITEM_CD, DRAW_VER : parseInt(_this.tbList.getData()[0]?.DRAW_VER) + 1 ||1, FILE_NM, TMP_NAME, FILE_SIZE, FILE_TYPE, gubun:'temp', }); (_this.tbList.getData()); }else{ kuls_alert(data.msg); } }, error: (req, stat, err) => { kuls_alert(err.message); }, complete: () => { window.clearTimeout(talert); this.tbList.clearAlert(); }, }); return true; } putFile() { if (this.tbList.getData().filter(row => row._STATUS_).length == 0 ) { return false; } const blankObj = []; const reqData = []; this.tbList.getRows().forEach(row => { if (row.getData()['_STATUS_']) { if (Object.keys(row._row.data).filter(key => key !== '_STATUS_' && key !== 'USE_FLG').every(key => { const value = row._row.data[key]; return (value === undefined || value === ''); })) { blankObj.push(row); } else { reqData.push(row.getData()); } } }) const postdata = reqData.length == 0 ? false : { 'mode': 'putDraw', 'reqdata': JSON.stringify(reqData), }; if (blankObj.length !== 0) { kuls_confirm("비어있는 행을 무시하고 진행하시겠습니까?", "", () => { ajax_json({ url: this.ajaxUrl, data: postdata, success: (data) => { if (data.code) { kuls_success("저장되었습니다."); this.getMainList(); } else { kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { } }); }, () => { blankObj.forEach(row => { row.getElement().classList.add("blank-row") }) }) } else { ajax_json({ url: this.ajaxUrl, data: postdata, success: (data) => { if (data.code) { kuls_success("저장되었습니다."); this.getMainList(); } else { kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert(error.message); }, complete: function () { } }); return true; } } // 클릭 이벤트 rowClick(e, tgt) { // 삭제가 가능하도록 ROW SELECT // staus D로 바꾸기? let _this = this; if (tgt.isSelected()) { _this.tbList.deselectRow(tgt._row); } else { _this.tbList.deselectRow(); } } /* * @Overview 테이블 행 삭제 함수 * @Parameter 없음 * @function 선택된 모든 행 STATUS D */ removeRow() { const selectedRows = this.tbList.getRows().filter(row=>{ return row.getData().check ==="Y" }); if(selectedRows.length > 0 ){ // 선택된 각 행 삭제 selectedRows.forEach((row) => { // STAUS D로 바꾸기 row.getData()._STATUS_ = row.getData()._STATUS_=="I"?null:"D"; const rowElement = row.getElement(); rowElement.classList.add("remove-row"); }); }else{ kuls_alert("삭제할 행을 선택해주세요.") } } /* * @Overview 삭제 취소 함수 * @Parameter 삭제 행 * @function 클릭시 삭제 취소 & STATUS를 공란으로 변경 */ clearRemove(tgt){ if(tgt._row.data._STATUS_ == "D"){ // (); tgt._row.data._STATUS_ = ""; tgt._row.getElement().classList.remove("remove-row") // const selectedRows = this.tbList.getSelectedRows(); // 선택된 모든 행 가져오기 } } cellClick(e, tgt) { // 체크박스 클릭 switch (tgt.getField()) { case "check": tgt.setValue(tgt.getValue() == "Y" ? "" : "Y"); this.clearRemove(tgt.getRow()) break; case "USE_FLAG": tgt.setValue(tgt.getValue() == "Y" ? "N" : "Y"); break; } } uploadDraw(e) { } // 셀 수정 cellEdited(cell) { cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U"; } previewIcon = function(cell, formatterParams, onRendered){ //plain text value if(!cell.getRow().getData().FILE_NM){ return ""; } return ""; }; downloadIcon = function(cell, formatterParams, onRendered){ //plain text value return ""; }; getFileUrl =function(DRAW_NO, SID, FILE_ID, FILE_NM,down){ let urlStr = '/include/getFile.php'+"?gubun=draw&nid=" + DRAW_NO + "&sid="+ SID + "&file_id="+ FILE_ID+ "&name="+FILE_NM if(down == true){ location.href = urlStr; } return urlStr; } /* * @Overview 최초 실행 함수 * @Parameter 없음 */ init() { let _this = this // field 정의 const fields = [ { formatter: "rownum", title: "NO", width: 50 }, { field: "DOWNLOAD", title: "다운로드", width: 100, formatter: this.downloadIcon, cellClick:function(e, cell){ if(!cell.getRow().getData().SID){ kuls_alert("저장 후 사용 가능합니다") return false; } _this.getFileUrl( '', cell.getRow().getData().SID, cell.getRow().getData().FILE_ID, cell.getRow().getData().FILE_NM, true ); } }, { field: "DRAW_VER", title: "버전", width: 100 }, { field: "DRAW_NO", title: "도면번호", width: 150, editor: "input" ,editable:(cell)=>{ let val = cell.getData(); return val._STATUS_ === 'I' },visible: false}, //file의 nid이기도 함 { field: "FILE_NM", title: "파일명", width: 150 }, { field: "SID", visible:false}, { field: "FILE_ID", visible:false}, { field: "MAKE_TM", title: "등록일", width: 100, formatter:"datetime", formatterParams:{ inputFormat:"yyyy-MM-dd", outputFormat:"yy.MM.dd", } }, { field: "MAKE_USER_ID",title: "등록자", width: 100 }, { field: "preview", title: "미리보기", width: 80, formatter: _this.previewIcon, cellClick:function(e,cell){ if(!cell.getRow().getData().DRAW_NO){ kuls_alert("저장 후 사용 가능합니다") return false; } pop_filedown( _this.getFileUrl( '', cell.getRow().getData().SID, cell.getRow().getData().FILE_ID, cell.getRow().getData().FILE_NM ), cell.getRow().getData().FILE_NM.split(".").pop() ); } }, { field: "USE_FLAG", title: "사용", width: 50, visible: true, cssClass: "editable-cell", formatter: tb_common_funtions.formatterToggleboxGreenIcon, formatterParams: { checkval: "Y" }, }, { field:"check", title: "삭제", width: 50, headerSort: false, formatter: tb_common_funtions.formatterCheckboxIcon, formatterParams: { checkval: "Y" }, }, ]; const commonFieldData = { headerSort: false, vertAlign: "middle", hozAlign: "center", resizable: "header", //Resize 는 헤더에서만 가능 headerHozAlign: "center", //헤더 정렬 headerSortTristate: true, //데이터 정렬 => 정/역/초기화 }; this.tbList = new Tabulator(this.table, { layout: "fitColumns", selectableRows: true, data: [], //기본 데이터 columns: fields, //컬럼 설정 columnDefaults: commonFieldData, }); // 데이터 불러오기 this.tbList.on("tableBuilt", () => { // this.getMainList(); }); // row 클릭 시에 this.tbList.on("rowClick", (e, tgt) => { // this.rowClick && Tb_item.rowClick(e, tgt); }); // cell 클릭 시에 this.tbList.on("cellClick", (e, tgt) => { this.cellClick && this.cellClick(e, tgt); }); // cell 수정 시에 this.tbList.on("cellEdited", (cell) => { this.cellEdited && this.cellEdited(cell); }); // 삭제 ["click", "keypress"].forEach((evt) => { this.removeBtn.addEventListener(evt, () => { this.removeRow && this.removeRow(); }); }); // 추가 ['click','keypress'].forEach((evt) =>{ this.addBtn.addEventListener(evt,()=> { uploadFile(); }); }); const uploadFile=()=> { if(!Tb_item.tbList.getSelectedData()[0]?.ITEM_CD){ return false; } document.getElementById('file_input').click(); } } } class Tb_pop_class { constructor(container) { this.ajaxUrl = "./item.ajax.php"; this.tbList = ""; this.itemData = ""; this.fileData = ""; this.container = document.querySelector(container); this.table = this.container; this.lastNum = 0; } addRow() { this.tbList.addRow(); } uploadExcel(){ let _this = this; let postdata = { mode : 'uploadData', reqdata : JSON.stringify(this.tbList.getData().filter(row=>{ return row.check ==="Y" && row._STATUS_ })) } ajax_json({ url: this.ajaxUrl, data: postdata, success: function (data) { if (data.code) { _this.tbList.setData(""); kuls_success("저장되었습니다."); }else if(data.code == 0){ _this.tbList.setData(data.mesg); } }, error: function (request, status, error) { (request) kuls_alert(error.message); }, complete: function () { } }); } cellClick(e, tgt) { let editor = tgt.getColumn().getDefinition().editor; // // 체크박스 클릭 switch (tgt.getField()) { case "check": tgt.setValue(tgt.getValue() == "Y" ? "" : "Y"); break; case "OKNG_FLG": tgt.setValue(tgt.getValue() == "Y" ? "" : "Y"); this.clearRemove(tgt.getRow()) break; default: if (!editor) { this.rowClick && this.rowClick(e, tgt.getRow()); } break; } } init() { let _this = this; const fields = [ { field:"check", title: "삭제", width: 50, headerSort: false, formatter: tb_common_funtions.formatterCheckboxIcon, formatterParams: { checkval: "Y" }, }, { formatter:"rownum", field:"id", title: "NO", width: 50}, { field: "ITEM_CD", title: "품목코드",width: 100, }, { field: "ITEM_NM", title: "품목(명)",width: 140, }, { field: "ITEM_GRP", title: "품목그룹",width: 80, editor: "input",}, { field: "OP_SEQ", title: "공순", width: 65, editor: "input",}, { field: "OP_CD", title: "공정코드", width: 65, editor: "input",}, { field: "STD_SETUP_TM", title: "준비시간
(분)", width: 80, editor: "input", formatterParams:{ decimal:".", precision:0 }, }, { field: "CYCLE_TM", title: "공정시간
(분)", width: 80, editor: "input", formatterParams:{ decimal:".", precision:0 } }, { field: "STD_OP_AMT", title: "공정 단가
(원)", width: 80 , editor: "input", formatterParams:{ decimal:".", precision:0 } }, { field: "INSP_NAME", title: "검사항목", width: 80, cssClass:"editable-cell", editor: "input", }, { field: "INSP_METH", title: "검사방법", width: 80, editor: "list", cssClass:"user-list", editorParams:{values: varsINSP_METH}, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsINSP_METH} }, { field: "OKNG_FLG", title: "OK/NG", width: 50, cssClass: "tabulator-editable", formatter: tb_common_funtions.formatterToggleboxGreenIcon, formatterParams: { checkval: "Y" }}, { field: "INSP_TOOL", title: "측정기", width: 150, editor: "list", cssClass:"user-list", editorParams:{values: varsINSP_TOOL}, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsINSP_TOOL} }, { field: "SPEC_VAL", title: "기준값
(㎜)", width: 70, editor: "input", formatter: tb_custom_formatter.limitValue, formatterParams: { checkPoint : "OKNG_FLG", decimal: 3 }, editable:(cell) => { if(cell.getData().OKNG_FLG == 'Y'){ cell.setValue(0) } return cell.getData().OKNG_FLG !== 'Y'; }, }, { field: "TOL_UPPER", title: "상한값
(㎛)", width: 70, formatter: tb_custom_formatter.limitValue, formatterParams: { checkPoint : "OKNG_FLG", decimal: 0 }, editor:"input", editable:(cell) => { if(cell.getData().OKNG_FLG == 'Y'){ cell.setValue(0) } return cell.getData().OKNG_FLG !== 'Y'; }, }, { field: "TOL_LOWER", title: "하한값
(㎛)", width: 70, formatter: tb_custom_formatter.limitValue, formatterParams: { checkPoint : "OKNG_FLG", decimal: 0 }, editor:"input", editable:(cell) => { if(cell.getData().OKNG_FLG == 'Y'){ cell.setValue(0) } return cell.getData().OKNG_FLG !== 'Y'; }, }, {field:"RS_MSG", title:"업로드 여부", width:200 } ]; const commonFieldData = { headerSort: false, vertAlign: "middle", hozAlign: "center", resizable: "header", headerHozAlign: "center", headerSortTristate: true, }; this.tbList = new Tabulator(this.table, { layout: "fitColumns", movableRows:true, data: [], columns: fields, columnDefaults: commonFieldData, headerSortElement: "", selectable: 1 }); // cell 클릭 시에 this.tbList.on("cellClick", (e, tgt) => { this.cellClick && this.cellClick(e, tgt); }); ["click", "keypress"].forEach((evt) => { const saveBtn = document.querySelector(".save-btn"); saveBtn.addEventListener(evt, () => { this.uploadExcel(); Tb_item.getMainList(); Tb_routing.getMainList(); Tb_pic.getMainList(); Tb_process_check.getMainList(); Tb_item.putItem.delete(); }); }); } } const Tb_item = new Tb_item_class("#item_ifo_table"); Tb_item.init(); const Tb_routing = new Tb_routing_class("#routing_table"); Tb_routing.init(); const Tb_process_check = new Tb_process_check_class("#process_check_table"); Tb_process_check.init(); const Tb_pic = new Tb_pic_class("#second-tab-container"); Tb_pic.init(); document.getElementById('file_input').addEventListener('change', function() { // 파일 정보 가져오기 var file = this.files[0]; Tb_pic.putTempFile(file); document.getElementById('file_input').value = ""; }); // 팝업 초기화는 팝업이 열릴 때 수행 function initPopup() { const Tb_pop = new Tb_pop_class('#pop_excel_item'); Tb_pop.init(); //엑셀업로드 document.getElementById('excel_up').addEventListener('click', function (e) { document.getElementById('fileInput').click(); }); document.getElementById('fileInput').addEventListener('change', function (e) { let file = e.target.files[0]; if (!file) { return; } let reader = new FileReader(); reader.onload = (e) => { let data = new Uint8Array(e.target.result); let workbook = XLSX.read(data, { type: 'array' }); workbook.SheetNames.forEach((sheetName) => { let rows = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], { header:1 }); rows.slice(1).forEach((row,index) => { if(row.length !== 0){ let rowToAdd = { check:"Y", ITEM_CD : row[0], ITEM_NM : row[1], ITEM_GRP : row[2], OP_SEQ : row[3], OP_CD : row[4], STD_SETUP_TM: row[5], CYCLE_TM : row[6], STD_OP_AMT : row[7], INSP_NAME : row[8], INSP_TOOL : row[9], INSP_METH : row[10], OKNG_FLG : row[11], SPEC_VAL : row[12], TOL_UPPER : row[13], TOL_LOWER : row[14], _STATUS_ : "I" }; Tb_pop.tbList.addRow(rowToAdd); } }); }); }; reader.readAsArrayBuffer(file) }); }