$(document).ready(function(){ //타이틀 select 선택 이벤트 $('[data-group]').on('change', '.field-selector', function() { fn_loadAddActive(); var group = $(this).closest('[data-group]').data('group'); var selectedFields = []; var isDuplicate = false; // 타불 객체 가져오기 var $objTabul = fn_utils_getTabulator(); console.log('$objTabul : ', $objTabul); if($objTabul.getData().length < 1){ alert('데이터 입력 후 선택해 주세요.'); $(this).val(""); fn_loadRemoveActive(); return false; } // 중복체크 $('[data-group="' + group + '"] .field-selector').each(function() { var selectedField = $(this).val(); if (selectedField) { if (selectedFields.includes(selectedField)) { alert("중복된 필드를 선택할 수 없습니다."); $(this).val(""); // 중복 필드를 선택한 경우 빈 값으로 초기화 isDuplicate = true; return false; // 반복문 종료 } selectedFields.push(selectedField); } }); // 데이터 넣기 updateTableFields($objTabul, group); // 필드가 팩스번호이면 열 중복체크 if($(this).val() == 'addrPhoneNo'){ fn_phoneDupl($objTabul); } fn_loadRemoveActive(); }); /** * @ 팩스번호 중복 데이터 * */ function fn_phoneDupl($objTabul) { $tableError.clearData(); var tabulNm = fn_utils_getTabulatorNm(); var tabluC = '.'+tabulNm var data = $objTabul.getData(); var phoneNumberChk = false; var existingNumbers = new Set(); // 배열에서 Set으로 변경 let errorCount = 0; // 중복 번호 개수를 저장할 변수 let duplicateCount = 0; // 중복 번호 개수를 저장할 변수 const errors = []; // 오류 데이터를 저장할 배열 const newData = []; // 유효한 데이터만 저장할 새로운 배열 data.forEach((row, index) => { const number = row.addrPhoneNo; // number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리 if (!number || (typeof number === 'string' && !number.trim())){ console.log("number : ", number); return; } const formattedNumber = formatPhoneNumber(number); // 번호 표준화 const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김 if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크 if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사 row.addrPhoneNo = formattedNumber; existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가 newData.push(row); // 유효한 데이터만 새로운 배열에 추가 } else { // 오류: 유효성 통과 못함 errorCount++; errors.push({ name: row.addrNm, // 이름 phone: row.addrPhoneNo, // 폰번호 result: "오류" // 결과 메시지 추가 }); } } else { // 중복 duplicateCount++; errors.push({ name: row.addrNm, // 이름 phone: row.addrPhoneNo, // 폰번호 result: "중복" // 결과 메시지 추가 }); } }); // data 배열을 newData 배열로 대체 data = newData; // 수정된 데이터로 테이블 업데이트 $objTabul.setData(data); $(tabluC+" #rowTotCnt").text($objTabul.getDataCount()); // 중복 카운트 $(tabluC+" #rowDupCnt").text(duplicateCount); // 에러 카운트 $(tabluC+" #rowErrorCnt").text(errorCount); // popup 영역 $("#errorPopTotCnt").text($objTabul.getDataCount()); // 중복 카운트 $("#errorPopDupCnt").text(duplicateCount); // 에러 카운트 $("#errorPopErrorCnt").text(errorCount); // 오류 및 중복 데이터를 한 번에 추가 $tableError.setData(errors); if(errorCount > 0){ alert('팩스번호 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.\nex) 발송불가 특수문자, 자릿수 오류 등'); } } //받는사람 전체삭제 버튼 처리 $('.all_del').click(function(){ var tabulNm = fn_utils_getTabulatorNm(); var tabluC = '.'+tabulNm var $objTabul = fn_utils_getTabulator(); $objTabul.clearData(); fn_rowCntInit(); // select box 초기화 $('.field-selector').each(function() { $(this).val(''); }); }); // 받는사람 선택삭제 버튼 처리해주기 $('.select_del').click(function(){ var tabulNm = fn_utils_getTabulatorNm(); var tabluC = '.'+tabulNm var $objTabul = fn_utils_getTabulator(); $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 var selectedData = $objTabul.getSelectedRows(); if(selectedData == "" || selectedData == null){ alert("삭제할 데이터를 선택해 주세요."); return false; }else{ // 선택한 Row 데이터 삭제하기 for(var i=0; i < selectedData.length; i++){ selectedData[i].delete(); } } totRows = $objTabul.getRows().length; updateTotCnt(totRows); }); //받는사람 전체삭제 버튼 처리 $('.self_all_del').click(function(){ var tabulNm = fn_utils_getTabulatorNm(); var tabluC = '.'+tabulNm var $objTabul = fn_utils_getTabulator(); // 초기화 및 데이터 추가를 한번에 처리 var newTableData = []; // 1000개의 빈 행을 미리 준비 for (var i = 0; i < 1000; i++) { newTableData.push({ addrNm: "", addrPhoneNo: "", addrNemo: "" }); } // 기존 데이터 초기화 후, 새로운 데이터를 한 번에 추가 $objTabul.setData(newTableData); // 행 수 초기화 함수 호출 fn_rowCntInit(); }); // 직접입력 받는사람 선택삭제 버튼 처리해주기 $('.self_select_del').click(function(){ var tabulNm = fn_utils_getTabulatorNm(); var tabluC = '.'+tabulNm var $objTabul = fn_utils_getTabulator(); $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 var selectedData = $objTabul.getSelectedRows(); if(selectedData == "" || selectedData == null){ alert("삭제할 데이터를 선택해 주세요."); return false; }else{ // 선택한 Row 데이터 삭제하기 for(var i=0; i < selectedData.length; i++){ selectedData[i].delete(); } } // 남은 행 수 계산 var totRows = $objTabul.getRows().length; // 1000개 행이 되도록 나머지 행 생성 for (var i = totRows; i < 1000; i++) { $objTabul.addRow({addrNm: "", addrPhoneNo: "", addrMemo: ""}); } var existingNumbers = []; // 중복 번호를 저장할 배열 // 모든 행의 'addrPhoneNo' 값을 배열에 추가 var allRows = $tableSelf.getData(); // 테이블의 모든 데이터를 가져옴 allRows.forEach(function(row) { if (row.addrPhoneNo) { const cleanedExistingNumber = row.addrPhoneNo.replace(/[^0-9]/g, ''); // 숫자만 남김 existingNumbers.push(cleanedExistingNumber); // 기존 번호를 배열에 추가 } }); updateTotCnt(existingNumbers.length); }); //전체 데이터 갯수 구하는 함수 function updateTotCnt(data){ var tabulNm = fn_utils_getTabulatorNm(); var tabluC = '.'+tabulNm $(tabluC+" #rowTotCnt").text(data); } /* * 타이틀 select 선택할때마다 실행해서 * 데이터테이블 필드값 수정 */ function updateTableFields($objTabul, group) { // 데이터가져오기 var currentData = $objTabul.getData(); // 필드 초기 값 셋팅 var columns = [ {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", width:50, headerSort: false, cellClick: function(e, cell) { cell.getRow().toggleSelect(); }} ,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:100} ]; var fieldMapping = []; console.log(": setTing number : "); // 초기 후 필드 값 셋팅하기 $('[data-group="' + group + '"] .field-selector').each(function(index) { var selectedField = $(this).val(); // ASCII 문자 코드 사용 - 65=A, 66=B ... var field = String.fromCharCode(65 + index); if (selectedField) { columns.push({ title: field , field: selectedField , hozAlign: "center" , headerHozAlign: "center" , editor: false , width: 260 , validator: ["maxLength:100", "string"] }); fieldMapping.push(selectedField); } else { columns.push({ title: field , field: field , hozAlign: "center" , headerHozAlign: "center" , editor: false , width: 260 , validator: ["maxLength:100", "string"] }); fieldMapping.push(field); } }); // 데이터 셋팅 var updatedData = currentData.map(row => { var newRow = {}; fieldMapping.forEach((field, index) => { newRow[field] = row[Object.keys(row)[index]] || ""; }); return newRow; }); $objTabul.setColumns(columns); $objTabul.setData(updatedData); } }); // 주소록 에러결과 초기화 function fn_errorPopClean(){ var tabulNm = fn_utils_getTabulatorNm(); var tabluC = '.'+tabulNm // popup 영역 $tableError.clearData(); // 중복 카운트 $("#errorPopDupCnt").text(0); // 에러 카운트 $("#errorPopErrorCnt").text(0); // $("#errorPopTotCnt").text(0); // select box 초기화 $(tabluC+' .field-selector').each(function() { $(this).val(''); }); } function fn_rowCntInit(){ var tabulNm = fn_utils_getTabulatorNm(); var tabluC = '.'+tabulNm $(tabluC+" #rowTotCnt").text(0); //총건수 수정 $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 $(tabluC+" #rowErrorCnt").text(0); //중복건수 수정 } //1. 필드 초기화 함수 function resetTableFieldsToDefault() { // 타불 객체 가져오기 var $objTabul = fn_utils_getTabulator(); // 필드를 A, B, C로 초기화 var defaultFields = ['A', 'B', 'C']; // 테이블의 기존 데이터를 가져옵니다. var currentData = $objTabul.getData(); // 초기 필드(A, B, C, D 등)를 위한 열 설정 var columns = [ {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, width:50, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) { cell.getRow().toggleSelect(); }}, {formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:100} ]; // 기본 필드로 열 구성 defaultFields.forEach(field => { columns.push({ title: field, field: field, hozAlign: "center", headerHozAlign: "center", editor: false, // 편집 비활성화 width: 260, validator: ["maxLength:100", "string"] }); }); // 테이블을 기본 필드로 업데이트 $objTabul.setColumns(columns); }