이호영 이호영 2024-09-04
주소록 유효성/중복 검사 성능 개선
@a6cc44ed8acae8b6961f9d92b07d9b26050098a8
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp
@@ -159,65 +159,7 @@
 $(document).ready(function(){
 	//Tabulator AJAX Data Loading
 
-	//받는사람 전체삭제 버튼 처리
-	$('.all_del').click(function(){
-		var data = $tableClip.getRows();	
-		if(data == null || data == ""){
-			alert("받는사람을 추가해 주세요.");
-			return false;
-		}else{
-			$tableClip.clearData();
-			$("#rowTotCnt").text(0); //총건수 수정
-			$("#rowDupCnt").text(0); //중복건수 수정
-			dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
-		}
-		
-	});
 
-
-// 	받는사람 오류번호 삭제 처리해주기
-	$('.chkVali_del').click(function(){
-		//기존 연락처 모두 불러오기
-	    var data = $tableClip.getRows();
-	    var tableData = [];
-	    var totLen = $tableClip.getRows().length;
-	    var errCnt = 0;
-	    
-	    if(totLen > 0){
-	    	if(confirm("올바르지 않은 연락처 정보를 삭제 하시겠습니까?")){
-	    		for(var i=0; i < totLen; i++){
-
-	    			
-	            	var phone = data[i].getData().phone;
-	            	var valiCheck = checkHpNum(phone);
-	            	if(valiCheck){
-	            		tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim(), info1:data[i].getData().info1, info2:data[i].getData().info2, info3:data[i].getData().info3, info4:data[i].getData().info4, memo:data[i].getData().memo});
-	            	}else{
-	            		errCnt++;
-	            	}
-	            }
-	            
-	            var removeDuplData = dupliPhoneData(tableData);
-	        	
-	            $tableClip.setData(removeDuplData);
-	            
-	            //총 받는사람 수 계산
-	            totRows = $tableClip.getRows().length;
-	            console.log('totRows : ', totRows);
-	            updateTotCnt(totRows);
-	            
-	          	if(errCnt > 0){
-	          		alert(errCnt + " 건의 연락처를 삭제하였습니다.");
-	          		return false;
-	          	}else{
-	          		alert("오류가 있는 연락처가 없습니다.");
-	          	}
-	    	}
-	    }else{
-	    	alert("연락처 정보를 입력해 주세요.");
-	    	return false;
-	    }
-	});
 	
 	//전체 데이터 갯수 구하는 함수
 	function updateTotCnt(data){
@@ -338,27 +280,6 @@
 	});
 	
 
-
-	//받는사람 중복 삭제
-	$('.duple_del').click(function(){
-		//기존 연락처 모두 불러오기
-	    var data = $tableClip.getRows();
-	    var tableData = [];
-	    var dpCnt = 0;
-	    var totLen = $tableClip.getRows().length;
-	    
-	    for(var i=0; i < totLen; i++){
-	    	tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim()});
-	    }
-	    
-	    var removeDuplData = dupliPhoneData(tableData);
-	    $tableClip.setData(removeDuplData);
-	    
-	    //총 받는사람 수 계산
-	    totRows = $tableClip.getRows().length;
-	    updateTotCnt(totRows);
-	});	
-	
 	
 	
 	
@@ -367,67 +288,43 @@
 	
 	//받는 사람 리스트 영역에 클립보드 데이터 가져와보기 
 	// 붙여넣기 기능
-	$('#tabulator_clip').on('paste', function (e) {
-	    var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
+	$('#tabulator_clip').off('paste').on('paste', function (e) {
+	    var element = e.originalEvent.clipboardData.getData('text');
 	    var elmSplit = element.split("\n");
-	    var elmLen = elmSplit.length;
-	    console.log('elmSplit : ', elmSplit);
-	    
-	    if(elmLen < 0){
-	        alert("붙여넣을 연락처를 복사해주세요.");
-	        return false;
-	    }
-	    if (elmLen > 20001) {
-	        alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
-	        return false;
-	    }			
-	    
-	    tableErrorData.length = 0; // 오류 번호 배열 초기화
-
 	    var realPhone = [];
 	    
-	    for(var i = 0; i < elmLen; i++){
-	        var splitStr = elmSplit[i];
-	        var tabData = splitStr.split("\t"); // 탭 구분으로 데이터 분할
-	        var comData = splitStr.split(",");  // 콤마 구분으로 데이터 분할
-	        var splitData = (tabData.length >= 2) ? tabData : comData;
+	    for (var i = 0; i < elmSplit.length; i++) {
+	        var splitStr = elmSplit[i].trim();
+	        if (splitStr === "") continue; // 공백 행 무시
 	        
-	        if(splitData.length == 0){ // 데이터가 없는 경우
-	            alert("탭으로 구분하여 데이터를 복사해 주세요.");
+	        var tabData = splitStr.split("\t");
+	        var comData = splitStr.split(",");
+	        
+	        var splitData = (tabData.length > 1) ? tabData : comData;
+	        
+	        if (splitData.length === 0) {
+	            alert("탭 또는 콤마로 구분하여 데이터를 복사해 주세요.");
 	            return false;
 	        }
 	        
-	        if(splitData.length == 1){
-	            realPhone.push({ A: splitData[0].trim() });
-	        } else {
-	            let keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
-	            let data = {};
-	            splitData.forEach((item, index) => {
-	                data[keys[index]] = item.trim();
-	            });
-	            realPhone.push(data);
-	        }
+	        let keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
+	        let data = {};
+	        splitData.forEach((item, index) => {
+	            data[keys[index]] = item.trim() || ""; // 빈 문자열로 기본값 설정
+	        });
+	        realPhone.push(data);
 	    }
-	    console.log('realPhone : ', realPhone);
 	    
-	    var recTableData = $tableClip.getRows().map(row => createDataObject(row.getData()));
-	    console.log('recTableData : ', recTableData);
-	    var tableData = recTableData.concat(realPhone);
-
-	    // 중복 연락처 제거 작업 (필요에 따라 적용)
-	    // var removeDuplPhone = dupliPhoneData(tableData);
-	    var removeDuplPhone = tableData; // 현재 중복 제거하지 않음
-
-	    // 기존 데이터를 유지하고 새 데이터를 추가한 결과를 테이블에 반영
-	    $tableClip.setData(removeDuplPhone);
-	    
-	    var totRows = $tableClip.getRows().length; 
-	    updateTotCnt(totRows); // 전체 데이터 갯수 구하기
-	    
-	    if (tableErrorData.length > 0) {
-	        alert("데이터를 확인해 주세요.");
-	    }
+	    console.log('Parsed data:', realPhone);
+	    console.log('Tabulator data before getData:', $tableClip.getData());
+// 	    $tableClip.clearData();
+	    $tableClip.setData(realPhone);
+	    var totRows = $tableClip.getDataCount(); 
+	    updateTotCnt(totRows);
+	    console.log('Tabulator data after getData:', $tableClip.getData());
 	});
+
+
 	
 	
 	
@@ -539,14 +436,11 @@
 	                </div>
 					<div class="excel_middle2">
 						<p>
-							총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건
-<!-- 							&nbsp;  -->
-							<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" id="tableClipDupliBtn">중복번호</button>
-<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button> -->
-<!-- 							&nbsp; -->
-<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> -->
+							총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 
+							/ 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건 
+							/ 오류 <span class="c_002c9a fwBold" id="rowErrorCnt">0</span>건 
+							<button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button>
 						</p>
-<!-- 						<button type="button" class="btnType btnType6 addCallToF">번호추가</button> -->
 					</div>
 					
 					
@@ -555,9 +449,9 @@
                     <div class="adr_excel" style="margin-top: 13px;">
                         <!-- thead -->
                         <div class="adr_hd select_adr_hd" data-group="tableClip">
-                            <div></div>
-                            <div style="width: 125px;">
-                            	<label for="" class="label"></label>
+							<div style="width: 80px;"></div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -568,9 +462,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -581,9 +475,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -594,9 +488,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -607,9 +501,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -620,9 +514,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -633,9 +527,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -646,7 +540,7 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
+							</div>
                         </div>
                      </div>					
 					
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
@@ -355,7 +355,7 @@
     data.forEach((row, index) => {
         var rowData = {};
         keys.forEach((key, idx) => { // index 변수명 변경 (내부와 외부에서 사용되므로 충돌 방지)
-        	console.log('row[idx] : ', row[idx]);
+//         	console.log('row[idx] : ', row[idx]);
         	 rowData[key] = typeof row[idx] === 'string' ? row[idx].trim() : row[idx]; // 문자열인지 확인하고 trim() 적용
         });
         tableData.push(rowData);
@@ -568,13 +568,12 @@
 					
 					
 					
-
-                    <div class="adr_excel" style="margin-top: 13px;">
-                        <!-- thead -->
-                        <div class="adr_hd select_adr_hd" data-group="tableExcel">
-                            <div style="width: 80px;"></div>
-                            <div style="width: 125px;">
-                            	<label for="" class="label"></label>
+					<div class="adr_excel" style="margin-top: 13px;">
+						<!-- thead -->
+						<div class="adr_hd select_adr_hd" data-group="tableExcel">
+							<div style="width: 80px;"></div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -585,9 +584,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -598,9 +597,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -611,9 +610,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -624,9 +623,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -637,9 +636,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -650,9 +649,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                            <div style="width: 125px;">
-                                <label for="" class="label"></label>
+							</div>
+							<div style="width: 125px;">
+								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
@@ -663,9 +662,9 @@
 									<option value="addrInfo4">[*4*]</option>
 									<option value="addrComment">메모</option>
 								</select>
-                            </div>
-                        </div>
-                     </div>					
+							</div>
+						</div>
+					</div>					
 					
 					<div class="drag_drop_wrap callList_box" id="tabulator_excel">
 						<img src="/publish/images/content/excel.jpg" style="width: 100%;">
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp
@@ -13,26 +13,6 @@
 // 	$("#btnAddrMassDupli").hide();
 // 	$("#btnAddrMassSaveDupli").hide();
 
-	//붙여넣기 이벤트 핸들러
-	document.querySelector('#tabulator_clip').addEventListener('paste', function(e) {
-		e.preventDefault();
-		var text = e.clipboardData.getData('text/plain');
-		var rows = text.split('\n').map(row => row.split(',').map(cell => cell.trim()));
-		
-		var tableData = rows.map(row => {
-			return {
-				A: row[0] || "",
-				B: row[1] || "",
-				C: row[2] || "",
-				D: row[3] || "",
-				E: row[4] || "",
-				F: row[5] || "",
-				G: row[6] || ""
-			};
-		});
-		
-		$tableClip.setData(tableData);
-	});
 
 }); 
 
@@ -211,7 +191,7 @@
 	            
 	            var removeDuplData = dupliPhoneData(tableData);
 	        	
-	            $tableClip.setData(removeDuplData);
+// 	            $tableClip.setData(removeDuplData);
 	            
 	            //총 받는사람 수 계산
 	            totRows = $tableClip.getRows().length;
@@ -355,7 +335,7 @@
 	    }
 	    
 	    var removeDuplData = dupliPhoneData(tableData);
-	    $tableClip.setData(removeDuplData);
+// 	    $tableClip.setData(removeDuplData);
 	    
 	    //총 받는사람 수 계산
 	    totRows = $tableClip.getRows().length;
src/main/webapp/WEB-INF/jsp/web/addrBlock/AddrBlockList.jsp
--- src/main/webapp/WEB-INF/jsp/web/addrBlock/AddrBlockList.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addrBlock/AddrBlockList.jsp
@@ -172,6 +172,7 @@
 
 	//받는 사람 리스트 영역에 클립보드 데이터 가져와보기 
 	$('.callList_box').on('paste', function (e) {
+		console.log(' :: callList_box :: ');
 		var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
 		var elmSplit= [];
 		elmSplit = element.split("\n");
src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
@@ -905,6 +905,7 @@
 	
 	//받는사람 목록에 복사/붙여넣기 기능 처리
 	$('.callList_box').on('paste', function (e) {
+		console.log(' :: callList_box :: ');
 		
 		var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
 		
src/main/webapp/WEB-INF/jsp/web/msgcampain/excel/MsgExcelDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgcampain/excel/MsgExcelDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgcampain/excel/MsgExcelDataSMLView.jsp
@@ -616,6 +616,7 @@
 	
 	//받는 사람 리스트 영역에 클립보드 데이터 가져와보기 
 	$('.callList_box').on('paste', function (e) {
+		console.log(' :: callList_box :: ');
 		
 		var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
 		
src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
@@ -826,6 +826,7 @@
 	
 	//받는사람 목록에 복사/붙여넣기 기능 처리
 	$('.callList_box').on('paste', function (e) {
+		console.log(' :: callList_box :: ');
 		
 		var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
 		
src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/excel/MsgExcelDataSMLView.jsp
@@ -845,6 +845,7 @@
 	//받는 사람 리스트 영역에 클립보드 데이터 가져와보기 
 	//받는사람 목록에 복사/붙여넣기 기능 처리
 	$('.callList_box').on('paste', function (e) {
+		console.log(' :: callList_box :: ');
 		
 		var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
 		
src/main/webapp/js/web/addr/event.js
--- src/main/webapp/js/web/addr/event.js
+++ src/main/webapp/js/web/addr/event.js
@@ -67,54 +67,59 @@
 		var phoneNumberChk = false;
 	    var existingNumbers = new Set(); // 배열에서 Set으로 변경
 
-		console.log('입력된 번호들 : ', data);
-
-
 		let errorCount = 0; // 중복 번호 개수를 저장할 변수
 		let duplicateCount = 0; // 중복 번호 개수를 저장할 변수
 
-		// 각 번호를 테이블에 추가 (중복 검사 및 포맷팅 포함)
-		for (let i = data.length - 1; i >= 0; i--) {
-//	    	console.log('index : ', index);
-//			console.log('existingNumbers : ', existingNumbers);
+		const errors = [];  // 오류 데이터를 저장할 배열
+		const duplicates = [];  // 오류 데이터를 저장할 배열
+		const newData = []; // 유효한 데이터만 저장할 새로운 배열
 
-		    let row = data[i];
-	    	var number = row.addrPhoneNo;
-			const formattedNumber = formatPhoneNumber(number); // 번호 표준화
-//		 			console.log('number : ', number)
-//		 			console.log('formattedNumber : ', formattedNumber)
-			const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김
-			if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
-				if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
-//					$tableError.addRow({ phone: formattedNumber }); // 표준화된 번호로 추가
-//					console.log('formattedNumber : ', formattedNumber);
-					
-//					console.log('통과 : ', row.addrPhoneNo, " : ", cleanedNumber);
-					row.addrPhoneNo = formattedNumber ;
-					existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가
-				} else {
-					// 오류 : 유효성 통과 못함
-//					console.log('오류 : ', formattedNumber, ' : ',cleanedNumber);
+		data.forEach((row, index) => {
+		    if (index % 10000 === 0) {
+		        console.log('i : ', index);
+		    }
+
+		    const number = row.addrPhoneNo;
+		    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++;
-		            $tableError.addRow({ 
+//		            $tableError.addRow({ 
+//		                name: row.addrNm, // 이름
+//		                phone: row.addrPhoneNo, // 폰번호
+//		                result: "오류" // 결과 메시지 추가
+//		            });
+		            errors.push({ 
 		                name: row.addrNm, // 이름
 		                phone: row.addrPhoneNo, // 폰번호
 		                result: "오류" // 결과 메시지 추가
 		            });
-		            data.splice(i, 1); // 유효하지 않은 행 삭제
-				}
-			} else {
-				// 중복
-//				console.log('중복 : ', row.addrPhoneNo);
-				duplicateCount++; // 중복 번호가 발견될 때마다 카운트를 증가
-	            $tableError.addRow({ 
+		        }
+		    } else {
+		        // 중복
+		        duplicateCount++; // 중복 번호가 발견될 때마다 카운트를 증가
+//		        $tableError.addRow({ 
+//		            name: row.addrNm, // 이름
+//		            phone: row.addrPhoneNo, // 폰번호
+//		            result: "중복" // 결과 메시지 추가
+//		        });
+		        duplicates.push({ 
 	                name: row.addrNm, // 이름
 	                phone: row.addrPhoneNo, // 폰번호
 	                result: "중복" // 결과 메시지 추가
 	            });
-	            data.splice(i, 1); // 유효하지 않은 행 삭제
-			}
-		};
+		    }
+		});
+
+		// data 배열을 newData 배열로 대체
+		data = newData;
 
 	    // 중복 카운트
 	    $(tabluC+" #rowDupCnt").text(duplicateCount);
@@ -136,7 +141,12 @@
 		$("#rowDupCnt").text(duplicateCount);
 
 	    $(tabluC+" #rowTotCnt").text($objTabul.getDataCount());
-				
+	    
+	    var errorData = errors.concat(duplicates);
+		 // 오류 및 중복 데이터를 한 번에 추가
+	    $tableError.setData(errorData);
+	    
+
 	}
 	 
 	function fn_phoneDupl_old($objTabul) {
src/main/webapp/js/web/addr/init.js
--- src/main/webapp/js/web/addr/init.js
+++ src/main/webapp/js/web/addr/init.js
@@ -39,7 +39,7 @@
 	 	        cell.getRow().toggleSelect();
 		 		}
 		 	}, 
-			{formatter:"rownum", align:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:40},
+			{formatter:"rownum", hozAlign:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:40},
 		 	{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
 		 	{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
 		 	{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
@@ -72,45 +72,13 @@
 		headerHozAlign:"center",
 		validationMode:"highlight",
 	    placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional)
-		clipboard:true, // 클립보드 기능 활성화
+//		clipboard:true, // 클립보드 기능 활성화
 	    clipboardPasteAction:"update", // insert, update, replace
-	    clipboardPasteParser: function(clipboard) {
-	        /*console.log('clipboard: ', clipboard);  // 클립보드의 원본 내용 확인
-
-	        var rows = clipboard.split('\n').map(row => {
-	            var cells = row.split(/[\t,]+/).map(cell => cell.trim());
-	            return cells;
-	        }).filter(row => Array.isArray(row) && row.some(cell => cell !== ""));
-
-	        console.log('파싱된 rows: ', rows);  // 파싱된 행 데이터 확인
-
-	        var tableData = rows.map(row => {
-	            return {
-	                A: row[0] || "",
-	                B: row[1] || "",
-	                C: row[2] || "",
-	                D: row[3] || "",
-	                E: row[4] || "",
-	                F: row[5] || "",
-	                G: row[6] || ""
-	            };
-	        });
-
-	        console.log('새로 추가될 데이터: ', tableData);  // 추가될 데이터 확인
-
-	        // 기존 테이블 데이터를 가져와서 병합
-	        var existingData = $tableClip.getData(); // 기존 데이터를 가져옴
-	        console.log('기존 : ', existingData);
-	        var combinedData = existingData.concat(tableData); // 기존 데이터에 새로운 데이터 추가
-	        console.log('병합 : ', combinedData);
-
-	        return combinedData; // 병합된 데이터를 반환하여 기존 데이터 아래에 추가되도록 함
-*/	    },
 	    columns: [
             {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
                 cell.getRow().toggleSelect();
             }},
-            {formatter:"rownum", align:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:40},
+            {formatter:"rownum", hozAlign:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:40},
 		 	{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
 			{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
 			{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
@@ -119,16 +87,14 @@
 			{title:"F", field:"F", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
 			{title:"G", field:"G", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]}
 		],
-	 	validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 
-	        var valid = cell.isValid();
-	 		if(!valid){
-	 			alert("양식에 맞지 않는 정보가 입력되었습니다.");
-	 			
-	 			//해당 셀 데이터 삭제
-	 			cell.setValue("");
-	 		}
-	 		return value % parameters.phone;
-	    },
+		validationFailed: function(cell, value, parameters) {
+		    var valid = cell.isValid();
+		    if (!valid) {
+		        alert("양식에 맞지 않는 정보가 입력되었습니다.");
+		        cell.setValue(""); // 해당 셀 데이터 삭제
+		    }
+		    return false; // 유효하지 않은 경우 false 반환
+		},
 	});
 	
 
@@ -143,19 +109,11 @@
 	    clipboard:false,
 	    clipboardCopySelector:"table",
 	    clipboardPasteAction:"insert", // insert, update, replace
-	    placeholder:"Excel 파일을 업로드 해주세요.", //fit columns to width of table (optional)
+	    placeholder:"등록 팝업에서 휴대폰을 선택 후 확인해주세요.", //fit columns to width of table (optional)
 	 	columns:[ //Define Table Columns
-//	 		{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){
-//	 	        cell.getRow().toggleSelect();
-//		 		}
-//		 	}, 
-//			{formatter:"rownum", align:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:40},
 		 	{title:"이름", field:"name", hozAlign:"center", headerHozAlign: "center", width:125},
 		 	{title:"휴대폰", field:"phone", hozAlign:"center", headerHozAlign: "center", width:158},
 		 	{title:"미등록 결과", field:"result", hozAlign:"center", headerHozAlign: "center", width:125}
-//		 	{title:"이름", field:"name", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
-//		 	{title:"휴대폰", field:"phone", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
-//		 	{title:"미등록 결과", field:"result", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
 	 	]
 	});
 
Add a comment
List