mjon_git/src/main/webapp/js/web/addr/event.js

415 lines
12 KiB
JavaScript

$(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으로 변경
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);
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);
errorCount++;
$tableError.addRow({
name: row.addrNm, // 이름
phone: row.addrPhoneNo, // 폰번호
result: "오류" // 결과 메시지 추가
});
data.splice(i, 1); // 유효하지 않은 행 삭제
}
} else {
// 중복
// console.log('중복 : ', row.addrPhoneNo);
duplicateCount++; // 중복 번호가 발견될 때마다 카운트를 증가
$tableError.addRow({
name: row.addrNm, // 이름
phone: row.addrPhoneNo, // 폰번호
result: "중복" // 결과 메시지 추가
});
data.splice(i, 1); // 유효하지 않은 행 삭제
}
};
// 중복 카운트
$(tabluC+" #rowDupCnt").text(duplicateCount);
// 에러 카운트
$(tabluC+" #rowErrorCnt").text(errorCount);
// popup 영역
// 중복 카운트
$("#errorPopDupCnt").text(duplicateCount);
// 에러 카운트
$("#errorPopErrorCnt").text(errorCount);
//
$("#errorPopTotCnt").text(duplicateCount+errorCount);
// 수정된 데이터로 테이블 업데이트
$objTabul.setData(data);
// 중복 번호 개수를 #rowDupCnt 요소에 표시
$("#rowDupCnt").text(duplicateCount);
$(tabluC+" #rowTotCnt").text($objTabul.getDataCount());
}
function fn_phoneDupl_old($objTabul) {
var data = $objTabul.getData();
var uniquePhones = new Set();
var dupliPhoneDataRealList = [];
var rowsToKeep = [];
var rowsToDelete = [];
var phoneNumberChk = false;
var tabulNm = fn_utils_getTabulatorNm();
var tabluC = '.'+tabulNm
data.forEach((row, index) => {
if (!isValidKoreanPhoneNumber(row.addrPhoneNo)) {
phoneNumberChk = true
return false;
}
if (uniquePhones.has(row.addrPhoneNo)) {
dupliPhoneDataRealList.push(row.addrPhoneNo);
rowsToDelete.push(index); // 중복된 행의 인덱스를 기록
} else {
uniquePhones.add(row.addrPhoneNo);
rowsToKeep.push(row); // 고유한 데이터만 추가
}
});
if(phoneNumberChk){
alert('휴대폰 형식에 맞지 않는 데이터가 있습니다.\n 확인해 주세요');
}
$(tabluC+" #rowDupCnt").text(dupliPhoneDataRealList.length);
if (dupliPhoneDataRealList.length > 0) {
// alert("중복된 휴대폰 번호가 있습니다: \n" + duplicatePhones.join(", "));
makeAddrMassDupliPop(dupliPhoneDataRealList);
}
// 중복된 행 삭제
rowsToDelete.reverse().forEach(index => {
$objTabul.deleteRow(index);
});
// 고유한 데이터만 남기고 테이블 업데이트
$objTabul.setData(rowsToKeep);
$(tabluC+" #rowTotCnt").text(rowsToKeep.length);
}
//받는사람 전체삭제 버튼 처리
$('.all_del').click(function(){
var tabulNm = fn_utils_getTabulatorNm();
var tabluC = '.'+tabulNm
var $objTabul = fn_utils_getTabulator();
var data = $objTabul.getRows();
$objTabul.clearData();
$(tabluC+" #rowTotCnt").text(0); //총건수 수정
$(tabluC+" #rowDupCnt").text(0); //중복건수 수정
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
});
// 받는사람 선택삭제 버튼 처리해주기
$('.select_del').click(function(){
var tabulNm = fn_utils_getTabulatorNm();
var tabluC = '.'+tabulNm
var $objTabul = fn_utils_getTabulator();
$(tabluC+" #rowDupCnt").text(0); //중복건수 수정
dupliPhoneDataRealList.length = 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);
});
//전체 데이터 갯수 구하는 함수
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", headerSort: false, cellClick: function(e, cell) {
cell.getRow().toggleSelect();
}}
,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40}
];
var fieldMapping = [];
// 초기 후 필드 값 셋팅하기
$('[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: "input"
, editor: false
, width: 125
, validator: ["maxLength:100", "string"]
});
fieldMapping.push(selectedField);
} else {
columns.push({
title: field
, field: field
, hozAlign: "center"
, headerHozAlign: "center"
// , editor: "input"
, editor: false
, width: 125
, 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_loadAddActive(){
// $('.loading_layer').addClass('active');
//}
//
//function fn_loadRemoveActive(){
// $('.loading_layer').removeClass('active');
//}
//중복 연락처
function makeAddrMassDupliPop(dupliPhoneDataRealList) {
var sHtml = "";
sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
sHtml += "<table class='tType4'>";
sHtml += " <colgroup>";
sHtml += " <col style='width:auto' />";
sHtml += " </colgroup>";
sHtml += " <thead>";
sHtml += " <tr>";
sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(dupliPhoneDataRealList.length) + "개)</th>";
sHtml += " </tr>";
sHtml += " </thead>";
sHtml += " <tbody>";
for (var i = 0; i < dupliPhoneDataRealList.length; i++) {
sHtml += " <tr>";
sHtml += " <td>" + dupliPhoneDataRealList[i] + "</td>";
sHtml += " </tr>";
}
sHtml += " </tbody>";
sHtml += " </table>";
sHtml += " </div>";
$("#addrMassDupli_layer").html(sHtml);
fn_dupliPopupShow();
}
function fn_dupliPopupShow(){
var showId = '#'+fn_utils_getTabulatorNm()
console.log('showId : ', showId);
$(showId+'DupliBtn').show()
}
// 유효한 번호인지 확인하는 함수
function isValidPhoneNumber(phone) {
// 숫자만 추출
const numberOnly = phone.replace(/\D/g, '');
// 유효한 형식 체크
return (
(numberOnly.startsWith("010") && numberOnly.length === 11) || // 010으로 시작하고 11자리
(/^01[1-9]/.test(numberOnly) && numberOnly.length === 10) || // 011~019로 시작하고 10자리
(numberOnly.startsWith("050") && numberOnly.length === 12) // 050X로 시작하고 12자리
);
}
// 유효성 후 포맷 맞추는 함수
function formatPhoneNumber(phone) {
if (typeof phone !== 'string') {
phone = String(phone); // phone을 문자열로 변환
}
// 숫자만 남기기
let cleanedPhone = phone.replace(/\D/g, ''); // 모든 숫자가 아닌 문자 제거
// console.log('cleanedPhone : ', cleanedPhone);
// 앞에 0이 추가된 경우 처리
if (cleanedPhone.length === 10 && cleanedPhone.startsWith("10")) {
// 10으로 시작하는 10자리 번호는 앞에 0을 추가하여 11자리로 만듦
cleanedPhone = "0" + cleanedPhone;
}else if (cleanedPhone.length === 9 && (cleanedPhone.startsWith("11") || cleanedPhone.startsWith("16") || cleanedPhone.startsWith("19"))) {
// 11, 16, 19로 시작하는 9자리 번호는 앞에 0을 추가하여 10자리로 만듦
cleanedPhone = "0" + cleanedPhone;
}
// 번호 형식 변환
if (cleanedPhone.startsWith("010") && cleanedPhone.length === 11) {
// 010-1234-5678 형식
return cleanedPhone.substring(0, 3) + '-' + cleanedPhone.substring(3, 7) + '-' + cleanedPhone.substring(7);
} else if ((/^01[1-9]/.test(cleanedPhone)) && cleanedPhone.length === 10) {
// 01X-123-5678 형식
return cleanedPhone.substring(0, 3) + '-' + cleanedPhone.substring(3, 6) + '-' + cleanedPhone.substring(6);
} else if (cleanedPhone.startsWith("050") && cleanedPhone.length === 12) {
// 050X-1234-5678 형식
return cleanedPhone.substring(0, 4) + '-' + cleanedPhone.substring(4, 8) + '-' + cleanedPhone.substring(8);
}
// 원본 반환 (표준 형식으로 변환되지 않으면)
return phone;
}
// 주소록 에러결과 초기화
function errorPopClean(){
// popup 영역
$tableError.clearData();
// 중복 카운트
$("#errorPopDupCnt").text(0);
// 에러 카운트
$("#errorPopErrorCnt").text(0);
//
$("#errorPopTotCnt").text(0);
}