/*
 * @Overview 검사공정 실적 등록
 */
class Tb_order_class {
  constructor(container) {
    this.ajaxUrl = "./reg_insp_qc.ajax.php";
    this.tbList = "";
    this.savebreaker  = false
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table#main_table");
    this.addBtn = this.container.querySelector(".add-btn") || "";
    this.removeBtn = this.container.querySelector(".remove-btn") || "";
  }

  /*
   * @Overview 데이터 세팅 함수
   * @Parameter 데이터 불러올 mode , 검색 조건에 해당되는 param
   */
  getMainList(mode, ...param) {
    const talert = window.setTimeout(() => {
      this.tbList.alert("Loading ...");
    }, 1000);
    let arr = param;
    // let testList  = new Array();
    let data = new Object();
    for (let i = 0; i < arr.length; i++) {
      let temp = [arr[i]];

      if (document.getElementById(arr[i]).type == "checkbox") {
        data[temp] = document.getElementById(temp).checked ? "Y" : "N";
      } else {
        data[temp] = document.getElementById(temp).value;
      }
    }

    data.mode = mode;
    ajax_json({
      url: this.ajaxUrl,
      data: data,

      success: (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();
        // this.setFilter();
      },
    });

    return true;
  }


  /*
   * @Overview 테이블 행 추가 함수
   * @Parameter 없음
   * @function 기본키, _STATUS_:I 값을 넣은 행 추가
   */
  addRow() {
    this.tbList.addRow({ _STATUS_: "I", USE_FLG: "Y" });
  }

  /*
   * @Overview 테이블 행 선택 함수
   * @Parameter 없음
   * @function 선택된 모든 행 색 변경
   */
  rowClick(e, tgt) {

    if (tgt.isSelected()) {
      tgt.deselect();
      // this.clearRemove(tgt);
    } else {
      this.tbList.deselectRow();
      tgt.select();
      Tb_insp_list.getMainList({
        WO_NO: tgt.getData().WO_NO,
      });
      Tb_insp_reg.getMainList(tgt.getData().WO_NO,)
    }
  }


  /*
   * @Overview cell 클릭 함수
   * @Parameter 클릭한 cell
   * @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
   */
  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;
      case "OP_STATUS":
        if(tgt.getData().OP_STATUS !== 'F'){
          tgt.setValue(tgt.getValue() == "S" ? "R" : "S");
          tgt.getElement().classList.add("tabulator-editable");
        }
        break;
      default:
        if (!editor) {
          this.rowClick && this.rowClick(e, tgt.getRow());
        }
        break;
    }
  }

  /*
   * @Overview 테이블 셀 수정 함수
   * @Parameter 셀
   * @function 셀 편집이 이후 저장될수 있도록 _STATUS_:U로 데이터 업데이트
   */
  cellEdited(cell) {
    cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";
  }

  /*
   * @Overview 추가, 수정 저장
   * @Parameter 없음
   * @Function _STATUS_ : U, I Row 인 것 php 처리.
   */
  putData() {

    let _this = this;
    let pdata = this.tbList.getData();

    if (pdata.filter((row) => row._STATUS_).length == 0) {
      // this.getMainList(this.code);
      return false;
    }

    if(this.savebreaker) {

      return false;
    }

    let postdata = {
      mode: "regPrd",
      reqdata: JSON.stringify(
          this.tbList.getData().filter((row) => row._STATUS_)
      ),
    };
    this.savebreaker = true;
      ajax_json({
        url: this.ajaxUrl,
        data: postdata,
        success: (data) => {
          if (data.code) {
            kuls_success("저장되었습니다.");
            // this.getMainList(this.pc);
            this.getMainList("getOrderList", "isAll", "WO_NO", "date_st");

            this.savebreaker = false;
          } else {
            kuls_alert(data.mesg);
          }
        },
        error: (request, status, error) => {
          kuls_alert(error.message);
        },
        complete: function () {
        },
      });


    return true;
  }

  /*
   * @Overview 모달 생성
   * @Parameter 없음
   */


  integerMutator = function(value, data, type, params, component) {
    return parseInt(value, 10) ? parseInt(value, 10) : 0;
  };
  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {

    // field 정의
    const fields = [
      { formatter: "rownum", title: "NO", width: 40 },
      { field: "ORD_STATUS", title: "오더 상태", width: 60, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsWO_STATUS}},
      { field: "WO_NO", title: "생산오더", width: 70 },
      { field: "OP_SEQ", title: "공순", width: 40 },
      { field: "ITEM_CD", title: "품목", width: 60 },
      { field: "ITEM_NM", title: "품명", width: 230, hozAlign:"left" },
      { field: "ORD_QTY", title: "지시수량", width: 70, mutator: this.integerMutator, },
      { field: "PRD_QTY", title: "생산수량", width: 70, mutator: this.integerMutator, editor: "number", editorParams: {min:0},
        editable: (cell)=>{
          return cell.getData().OP_STATUS !== 'F'
        },
        cellEdited:(cell)=>{
          if(cell.getData().ORD_QTY < cell.getData().PRD_QTY){
                kuls_alert("생산수량은 지시수량을 초과할 수 없습니다")
          cell.setValue(cell.getData().ORD_QTY);
          }
        }
      },
      {
        field: "SMP_QTY",
        title: "샘플수량",
        width: 70,
        mutator: this.integerMutator,

      },
      { field: "OP_STATUS", title: "중지", width: 50, 
        formatter: tb_custom_formatter.formatterToggleboxRedIcon, formatterParams: {'checkval' : 'S', field: 'OP_STATUS', value: 'F'}}

    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화
    };

    /*
     * @Overview tabulator 객체 생성
     * @Parameter 생성 위치(html class값)
     */
    this.tbList = new Tabulator(this.table, {
      layout: "fitColumns",
      data: [], //기본 데이터
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>", //정렬 아이콘
      validationMode: "highlight",
    });

    /*
     * @Overview 테이블 만들어지면 데이터 불러오기
     * @Parameter 없음
     */
    this.tbList.on("tableBuilt", () => {
      this.getMainList && this.getMainList("getOrderList", "isAll", "WO_NO", "date_st");
    });

    /*
     * @Overview 유효성 검사메세지 띄우기
     * @Parameter cell, 입력값, validators
     */
    this.tbList.on("validationFailed", (cell, value, validators) => {
      cell.setValue("");
      let errMsg = "";
      switch (validators[0].type) {
        case "alphanumeric":
          errMsg = " 필드는 한글과 특수문자를 입력할 수 없습니다.";
          break;
        case "numeric":
          errMsg = " 필드는 숫자만 입력할 수 있습니다.";
          break;
        default:
          errMsg = " 필드는 " + validators[0].parameters;
          break;
      }

      kuls_warning(cell.getColumn().getDefinition().title + errMsg);
    });

    /*
     * @Overview cell 클릭시 체크 또는 팝업
     * @Parameter 이벤트, 셀
     */
    this.tbList.on("cellClick", (e, tgt) => {
      this.cellClick && this.cellClick(e, tgt);
    });

    /*
     * @Overview cell 수정 함수
     * @Parameter cell
     * @Function status u로 바꿀것
     */
    this.tbList.on("cellEdited", (cell) => {
      this.cellEdited && this.cellEdited(cell);
    });
    // 조회
    ["click", "keypress"].forEach((evt) => {
      const filterBtn = document.querySelector("#filter_btn");
      filterBtn.addEventListener(evt, () => {
        // setFilter 또는 setData
        this.getMainList &&
        this.getMainList("getOrderList", "isAll", "WO_NO", "date_st");

      });
    });
    // 저장
    ["click", "keypress"].forEach((evt) => {
      const putBtn = document.querySelector("#put_btn");
      putBtn.addEventListener(evt, () => {

        Tb_order.putData();
        Tb_insp_reg.putInsp();
      });
    });

    //새창에서 열기
    let anchors = document.querySelectorAll('a');
    anchors.forEach((item) => {
      item.target = "_blank";
    });
  }

}

/*
 * @Overview 오더별 검사항목
 */
class Tb_insp_list_class {
  constructor(container) {
    this.ajaxUrl = "./reg_insp_qc.ajax.php";

    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table#sub_table");
  }

  /*
   * @Overview 데이터 세팅 함수
   * @Parameter 없음
   */
  getMainList(code) {
    this.code = code;

    let talert = window.setTimeout(() => {
      this.tbList.alert("Loading ...");
    }, 1000);

    ajax_json({
      url: this.ajaxUrl,
      data: { mode: "getDefList", WO_NO: this.code.WO_NO },
      success: (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;
  }
  /*
   * @Overview 데이터 추가/수정/삭제
   * @Parameter 없음. 테이블 내 작업장 코드 식별
   * @function _STATUS_ : I, D, U ROW만 php에서 처리.
   */
  putData() {
    let pdata = this.tbList.getData();
    if (pdata.filter((row) => row._STATUS_).length == 0) {
      this.getMainList(this.code);
      return false;
    }

    let dupdata = pdata.map((data) => data.WC_CD).filter((data) => data);
    if (
      dupdata.filter((data, idx) => dupdata.indexOf(data) !== idx).length > 0
    ) {
      kuls_alert("작업장 코드가 중복됩니다.");
      return false;
    }

    let postdata = {
      mode: "putData",
      reqdata: JSON.stringify(
        this.tbList.getData().filter((row) => row._STATUS_)
      ),
    };

    ajax_json({
      url: this.ajaxUrl,
      data: postdata,
      success: function (data) {
        if (data.code) {
          kuls_success("저장되었습니다.");
          this.getMainList(this.pc);
          Tb_order.getMainList();
        } else {
          this.tbList.getRows().forEach((row) => {
            //일부 적용된 열 update 처리
            if (data.data.includes(row.getData()["WO_NO"])) {
              row.update({ _STATUS_: "U" });
            }
          });
          kuls_alert(data.mesg);
        }
      },
      error: function (request, status, error) {
        kuls_alert(error.message);
      },
      complete: function () {},
    });
    return true;
  }
  /*
   * @Overview 데이터 필터 함수
   * @Parameter 없음
   * @function 필터링 없음.
   */
  setFilter() {}

  /*
   * @Overview 테이블 행 추가 함수
   * @Parameter 없음
   * @function 기본키, _STATUS_:I 값을 넣은 행 추가
   */
  addRow() {
    this.tbList.addRow({ _STATUS_: "I", PLANT_CD: this.code, USE_FLG: "Y" });
  }

  /*
   * @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 cell 클릭 함수
   * @Parameter 클릭한 cell
   * @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
   */
  cellClick(e, tgt) {
    var editor = tgt.getColumn().getDefinition().editor;

    switch (tgt.getField()) {
      case "INSP_NAME":
        popInsp(
          {
            INSP_ITEM: "INSP_ITEM",
            INSP_NAME: "INSP_NAME",
            INSP_METH: "INSP_METH",
          },
          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 셀
   * @function 셀 편집이 이후 저장될수 있도록 _STATUS_:U로 데이터 업데이트
   */
  cellEdited(cell) {
    cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";
  }

  /*
   * @Overview 최초 실행 함수
   * @Parameter 없음
   */
  init() {
    // field 정의
    const fields = [

      { field: 'OP_SEQ', formatter: "rownum", title: "NO", width: 40 },
      { field: 'DEF_OP_CD', title: "공정", width: 40 },
      {
        field: "DEF_DT",
        title: "불량 날짜",
        width: 80,
        formatter:"datetime", formatterParams:{
          inputFormat:"yyyy-MM-dd",
          outputFormat:"yy.MM.dd",
        }
      },
      {
        field: "DEF_QTY",
        title: "불량<br>수량",
        width: 40,
      },
      // { field: "DEF_UNIT", title: "단위", width: 50, },
      { field: "DEF_CD", title: "불량코드", width: 80, formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsDEF_CD}},
      { field: "DEF_CAUSE", title: "상세 원인", minWidth: 300 },
      { field: "DEF_ACTION", title: "조치 내용", minWidth: 300 },

    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화
    };

    /*
     * @Overview tabulator 객체 생성
     * @Parameter 생성 위치(html class값)
     */
    this.tbList = new Tabulator(this.table, {
      layout: "fitColumns",
      data: [], //기본 데이터
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>", //정렬 아이콘
      validationMode: "highlight",
    });

    /*
     * @Overview 테이블 만들어지면 데이터 불러오기
     * @Parameter 없음
     */
    this.tbList.on("tableBuilt", () => {
      // this.getMainList();
    });

    /*
     * @Overview 유효성 검사메세지 띄우기
     * @Parameter cell, 입력값, validators
     */
    this.tbList.on("validationFailed", (cell, value, validators) => {
      cell.setValue("");
      let errMsg = "";
      switch (validators[0].type) {
        case "alphanumeric":
          errMsg = " 필드는 특수문자를 입력할 수 없습니다.";
          break;
        case "numeric":
          errMsg = " 필드는 숫자만 입력할 수 있습니다.";
          break;
        default:
          errMsg = " 필드는 " + validators[0].parameters;
          break;
      }
      kuls_warning(cell.getColumn().getDefinition().title + errMsg);
    });

    /*
     * @Overview cell 클릭시 체크 또는 팝업
     * @Parameter 이벤트, 셀
     */
    this.tbList.on("cellClick", (e, tgt) => {
      this.cellClick && this.cellClick(e, tgt);
    });

    /*
     * @Overview cell 수정 함수
     * @Parameter cell
     * @Function status u로 바꿀것
     */
    this.tbList.on("cellEdited", (cell) => {
      this.cellEdited && this.cellEdited(cell);
    });
  }
}

/*
 * @Overview 검사 실적 등록
 */
class Tb_insp_reg_class {
  constructor(container) {
    this.ajaxUrl = "./reg_insp_qc.ajax.php";
    this.savebreaker  = false
    this.container = document.querySelector(container);
    this.table = this.container.querySelector(".hy-table#sub_table_2");
    // 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") || "";
  }

  /*
   * @Overview 데이터 세팅 함수
   * @Parameter 없음
   */
  getMainList(code) {
    // 오더별 검사항목에서 검사실적번호 받아오기 + spec_seq +1

    this.code = code;

    let talert = window.setTimeout(() => {
      this.tbList.alert("Loading ...");
    }, 1000);

    ajax_json({
      url: this.ajaxUrl,
      data: { mode: "getInspList", WO_NO: this.code },
      success: (data) => {
        if (data.code) {
          let originData = data.data;

          originData = originData.map((el,i) => {
            // ??에 시료수만큼
            el[`INSP_VALUE_${el[i]}`] = el["INSP_VALUE"];
            return el;
          });

          originData = originData.reduce((acc, curr) => {
            const key = curr.EMP_NO + curr.WRK_TEAM;

            if (!acc[key]) {
              acc[key] = { ...curr };
            } else {
              Object.assign(acc[key], curr);
            }

            return acc;
          }, {});
          const finData = Object.values(originData);
          this.tbList.setData(data.data);

          // this.tbList.setData(data.data);
          // this.시료번호 = data.data.시료번호;
        } else {
          kuls_alert(data.mesg);
        }
      },
      error: (req, status, err) => {
        kuls_alert(err.message);
      },
      complete: () => {
        window.clearTimeout(talert);
        this.tbList.clearAlert();
      },
    });
    return true;
  }

  /*
   * @Overview 데이터 추가/수정/삭제
   * @Parameter 없음. 테이블 내 작업장 코드 식별
   * @function _STATUS_ : I, D, U ROW만 php에서 처리.
   */
  putInsp() {
    let _this = this;
    let pdata = this.tbList.getData();

    if (pdata.filter((row) => row._STATUS_).length == 0) {
      // this.getMainList(this.code);
      return false;
    }


    if(this.savebreaker) {

      return false;
    }

    let postdata = {
      mode: "putInsp",
      // reqdata: JSON.stringify(this.tbList.getData().filter((row) => row._STATUS_)),
      wholeData:JSON.stringify(this.tbList.getData().filter((row) => row._STATUS_)),
    };
    this.savebreaker = true
    ajax_json({
      url: this.ajaxUrl,
      data: postdata,
      success: (data) => {
        if (data.code) {
          kuls_success("저장되었습니다.");
          this.getMainList(Tb_order.tbList.getSelectedData()[0]?.WO_NO);
          this.savebreaker = false;
          // Tb_order.getMainList();
        } else {
          kuls_alert(data.mesg);
          this.savebreaker = false;
          this.tbList.getRows().forEach((row) => {
            //일부 적용된 열 update 처리
            if (data.data.includes(row.getData()["WO_NO"])) {
              row.update({ _STATUS_: "U" });
            }
          });
        }
      },
      error: (request, status, error) => {},
      complete: function () {},
    });
    return true;
  }

  /*
   * @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");
      // const selectedRows = this.tbList.getSelectedRows(); // 선택된 모든 행 가져오기
    }
  }

  /*
   * @Overview cell 클릭 함수
   * @Parameter 클릭한 cell
   * @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
   */
  cellClick(e, tgt) {
    var editor = tgt.getColumn().getDefinition().editor;

    switch (tgt.getField()) {
      case "INSP_ITEM":
        popInsp(
          {
            INSP_ITEM: "INSP_ITEM",
          },
          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 셀
   * @function 셀 편집이 이후 저장될수 있도록 _STATUS_:U로 데이터 업데이트
   */
  cellEdited(cell) {
    if(!cell.getData().INSP_RSLT_NO){
      cell.getData()._STATUS_ = cell.getData()._STATUS_ || "I";

    }else{
      cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";

    }
  }

  integerMutator = function(value, data, type, params, component) {

    return value ? parseInt(value, 10) : null;
  };


  //팝업 아이콘
  popIcon = function(cell, formatterParams, onRendered) {

    return "<button class='reverse-btn fa-solid fa-paperclip padding-1-12'></button>";

  };
  openModal(cell) {

    let clickData = cell.getData();

    vnLoad("", "./reg_insp_qc_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", title: "NO", width: 40 },
      { field: "OP_SEQ", title: "공순", width: 40 },
      { field: "OP_CD", title: "공정", width: 40 },
      { field: "INSP_ITEM", title: "검사항목", width: 80, visible:false },
      { field: "INSP_NAME", title: "검사항목명", width: 100 },
      { field: "INSP_METH", title: "검사방법", width: 80 ,formatter: tb_common_funtions.formatterSelect, formatterParams: {values: varsINSP_METH,}},
      { field: "INSP_SEQ", title: "검사회차", width: 80, visible: false },
      { field: "OKNG_FLG",                       width: 100, visible:false},

      { field: "SPEC_VAL", title: "기준값</br>(mm)", width: 60,
        // mutator: this.integerMutator,
        formatter: "money",
        formatterParams: {
          decimal: ".",
          precision: "2",
        },
      },
      { field: "TOL_UPPER", title: "상한치</br>(㎛)", width: 60,
        mutator: this.integerMutator,
      },
      { field: "TOL_LOWER", title: "하한치</br>(㎛)", width: 60,
        mutator: this.integerMutator,
      },
      { field: "INSP_TOOL", title: "측정기", width: 110,
        editor: "list",
        editorParams: {values: varsINSP_TOOL,},
        formatter: tb_common_funtions.formatterSelect, 
        formatterParams: {values: varsINSP_TOOL,},
        cssClass: "user-list",
        hozAlign:"left"
      },
      {
        field: "FILE_MANAGE",
        title: "파일관리",
        width: 70,
        formatter: this.popIcon,
        cellClick:function(e,cell){
          _this.openModal(cell);
        }
      },
      {
        title: "시료번호",
        columns: [
          { field: "T1",  title: "1",  width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T2",  title: "2",  width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T3",  title: "3",  width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T4",  title: "4",  width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T5",  title: "5",  width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T6",  title: "6",  width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T7",  title: "7",  width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T8",  title: "8",  width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T9",  title: "9",  width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T10", title: "10", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T11", title: "11", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T12", title: "12", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T13", title: "13", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T14", title: "14", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T15", title: "15", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T16", title: "16", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T17", title: "17", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T18", title: "18", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T19", title: "19", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },
          { field: "T20", title: "20", width: 50, editor: tb_custom_editor.inputOrSelect, editorParams: { checkPoint : 'OKNG_FLG' }, formatter:tb_custom_formatter.checkInspValue, formatterParams:{ checkPoint : 'OKNG_FLG' } },


        ],
      },
      { field: "REMARK", title: "비고",          width: 150, editor: "input" },
    ];
    const commonFieldData = {
      headerSort: true,
      vertAlign: "middle",
      hozAlign: "center",
      resizable: "header", //Resize 는 헤더에서만 가능
      headerHozAlign: "center", //헤더 정렬
      headerSortTristate: true, //데이터 정렬 => 정/역/초기화
    };

    /*
     * @Overview tabulator 객체 생성
     * @Parameter 생성 위치(html class값)
     */
    this.tbList = new Tabulator(this.table, {
      layout: "fitColumns",
      data: [], //기본 데이터
      columns: fields, //컬럼 설정
      columnDefaults: commonFieldData,
      headerSortElement: "<i class='bi'></i>", //정렬 아이콘
      validationMode: "highlight",
    });

    /*
     * @Overview 테이블 만들어지면 데이터 불러오기
     * @Parameter 없음
     */
    this.tbList.on("tableBuilt", () => {
      // this.getMainList();
    });

    /*
     * @Overview 유효성 검사메세지 띄우기
     * @Parameter cell, 입력값, validators
     */
    this.tbList.on("validationFailed", (cell, value, validators) => {
      cell.setValue("");
      let errMsg = "";
      switch (validators[0].type) {
        case "alphanumeric":
          errMsg = " 필드는 특수문자를 입력할 수 없습니다.";
          break;
        case "numeric":
          errMsg = " 필드는 숫자만 입력할 수 있습니다.";
          break;
        default:
          errMsg = " 필드는 " + validators[0].parameters;
          break;
      }

      kuls_warning(cell.getColumn().getDefinition().title + errMsg);
    });

    /*
     * @Overview cell 클릭시 체크 또는 팝업
     * @Parameter 이벤트, 셀
     */
    this.tbList.on("cellClick", (e, tgt) => {
      this.cellClick && this.cellClick(e, tgt);
    });

    /*
     * @Overview cell 수정 함수
     * @Parameter cell
     * @Function status u로 바꿀것
     */
    this.tbList.on("cellEdited", (cell) => {
      this.cellEdited && this.cellEdited(cell);
    });

    document.getElementById('excel_data').addEventListener('click', (e) => {
      const allRows = this.tbList.getRows();
      const selectedRows = this.tbList.getSelectedRows();
      let data;
      if (selectedRows.length > 0) {
          data = selectedRows.map(row => row.getData());
      } else {
          data = allRows.map(row => row.getData());
      }
      getExcel('검사실적등록', "검사실적등록", data, Tb_order.tbList.getSelectedData()[0]);
    });

    // 검사항목 추가
    ["click", "keypress"].forEach((evt) => {
      const addInsp = document.querySelector(".add-insp");
      addInsp.addEventListener(evt, () => {

        // 품목 선택행 가져오기
        const selectedRows = Tb_order.tbList.getSelectedRows();

        if (selectedRows.length > 0) { //선택행이 있을때
          const data = selectedRows[0].getData();

          const tbAddInsp = new PopTbAddInspClass(data);
          tbAddInsp.init();



        } else {
          kuls_alert("생산오더를 선택해주세요.");
        }
      });
    });
  }
}



const Tb_order = new Tb_order_class("#main_tab");
Tb_order.init();
const Tb_insp_list = new Tb_insp_list_class("#sub_tab");
Tb_insp_list.init();
const Tb_insp_reg = new Tb_insp_reg_class("#sub_tab_2");
Tb_insp_reg.init();






