/*
* @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)
});
}