File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
/**
*
* @author : 이호영
* @fileName : tabulator.js
* @date : 2023.02.21
* @description : tabulator 관련 js
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2023.02.21 이호영 최초 생성
*
*
*
*/
var tableL = null;
$(document).ready(function (){
//받는사람 연락처 내용 처리
//Tabulator AJAX Data Loading
tableL = new Tabulator(".callList_box_P", {
height:"255px",
layout:"fitColumns",
headerHozAlign:"center",
validationMode:"highlight",
headerHozAlign:"center",
clipboard: true, // 클립보드 기능 활성화
clipboardPasteAction: "replace", // 붙여넣기 시 기존 데이터 교체 (또는 "update" 선택 가능)
validationMode:"highlight",
placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional)
resizableColumns:false,
clipboardPasteParser: function(clipboard){
const rows = clipboard.split("\n").filter(row => row.trim() !== "");
// 1. 붙여넣기 데이터 → 가공
const newData = rows
.map(row => {
const cols = row.split("\t");
const phoneRaw = cols[0].trim();
const phone = removeDash(phoneRaw);
return { phone };
})
.filter(row => checkHpNum(row.phone));
// 2. 기존 데이터 가져오기
const existingData = tableL.getData();
// 3. 기존 데이터 + 붙여넣은 데이터 합치기
const combinedData = existingData.concat(newData);
// 4. 중복 제거 + 갯수 카운트
const result = removeDuplicatesAndCount(combinedData, 'phone');
// 5. 외부 처리 함수 호출
setAllCntData(result);
fn_priceClclt();
// 6. 테이블에 반영할 데이터 리턴
return result;
},
columnDefaults:{ // 공통설정
hozAlign: "center",
headerHozAlign: "center",
editor: false
},
columns:[ //Define Table Columns
{formatter:"rowSelection", titleFormatter:"rowSelection", width:60, clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){
cell.getRow().toggleSelect();
}},
// {title:"이름", hozAlign:"center", field:"name", editor:"input", validator:["maxLength:12"], cellEdited:function(cell){
// //cell - cell component
// fnReplCell();
// }},
{title:"휴대폰", hozAlign:"center", field:"phone", editor:"input", validator:["required","minLength:10", "maxLength:12"], cellEdited:function(cell){
//cell - cell component
fnDuplPhone();
}},
]
});
//주소록 불러오기 팝업 내용
//Tabulator AJAX Data Loading
tableAddr = new Tabulator(".callAddr_box", {
height:"255px",
layout:"fitColumns",
headerHozAlign:"center",
validationMode:"highlight",
placeholder:"주소록 그룹을 선택해 주세요.", //fit columns to width of table (optional)
resizableColumns:false,
columns:[ //Define Table Columns
{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, width: 50, cellClick:function(e, cell){
cell.getRow().toggleSelect();
}
},
{title:"그룹명", hozAlign:"center", field:"addrGroupNm", widthGrow: 3, editor:"input", validator:["required","minLength:2", "maxLength:40"]},
{title:"이름", hozAlign:"center", field:"name", widthGrow: 2, editor:"input", validator:["maxLength:12"]},
{title:"휴대폰번호", hozAlign:"center", field:"phone", widthGrow: 3, editor:"input", validator:["required","minLength:10", "maxLength:11"]},
],
validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 - 아직 잘 모르겠음
var valid = cell.isValid();
var fieldNm = cell.getField();
if(!valid){
if(fieldNm == "addrName"){
alert("받는사람 이름은 최대 12글자까지만 입력 가능합니다.");
}else if(fieldNm == "addrPhone"){
alert("휴대폰번호는 하이픈(-)을 제외한 숫자만 정확히 입력해 주세요.");
}else if(fieldNm == "addrGroupNm"){
alert("그룹명을 정확히 입력해 주세요. 2 ~ 40글자 이내로 입력 가능합니다.");
}
//해당 셀 데이터 삭제
cell.setValue("");
}
return value % parameters.addrPhone;
},
});
//받는사람 번호 버튼 클릭시 Tabulator에 데이터 넣어주기
$('.addCallToF').click(function(){
// checkHpNum(callToNum)
var textarea = $('#callTo');
const numbers = textarea.val().split('\n')
.map(num => removeDash(num.trim()))
.filter(num => num !== "")
.filter(num => checkHpNum(num)); // 유효한 번호만 필터링;
// ⬇️ 기존 tableL 데이터 개수 확인
var existingData = tableL.getData();
var totalCount = existingData.length + numbers.length;
// ⬇️ 30만건 초과 시 경고 및 중단
if (totalCount > 300000) {
alert("안정적인 서비스 운영을 위해서 최대 300000건 이내로 분할 발송해 주시기 바랍니다.");
return;
}
const formattedData = numbers.map(num => ({phone: num}));
// 기존 tableL의 데이터를 가져옵니다.
var existingData = tableL.getData();
// 기존 데이터와 새로운 데이터를 합칩니다.
var combinedData = existingData.concat(formattedData);
// @ phone을 기준으로 중복 제거 및 갯수 계산
const result = removeDuplicatesAndCount(combinedData, 'phone');
setAllCntData(result);
textarea.val('');
fn_priceClclt();
});
//받는사람 전체삭제 버튼 처리
$('.all_del').click(function(){
var data = tableL.getRows();
if(data == null || data == ""){
alert("받는사람을 추가해 주세요.");
return false;
}else{
if(confirm("받는사람 목록을 모두 삭제하시겠습니까?")){
tableL.clearData();
$("#rowTotCnt").text(0); //총건수 수정
$("#rowDupCnt").text(0); //중복건수 수정
totalPriceSum(0); //결제 금액 수정
}
}
});
//주소록 불러오기 버튼 클릭시
$('.popupAddr').click(function(){
var login = '${LoginVO.id}';
if(login == null || login == ''){
alert("로그인 후 이용이 가능합니다.");
return false;
}
$("#addrGroupLoad").load("/web/mjon/msgdata/selectAddrGroupListAjax.do", "" ,function(response, status, xhr){
//리스트 스크롤 처리해주기
$(".adr_pop_list").mCustomScrollbar({
axis: 'y',
scrollbarPosition: "outside",
theme: "dark",
autoHideScrollbar: false
});
});
});
//엑섹불러오기 버튼 클릭시 파일 첨부 실행
$('.upImg').click(function(){ // 엑셀파일 불러오기 선택 시
$("#imgFile").click();
});
//최근전송내역 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기)
$(document).on('click', '#latestAddPhone', function (){
var addPhoneList = [];
$("input:checkbox[name='latAddrChk']:checked").each(function(){
var chkPhone = $(this).val().trim();
console.log('b chkPhone: ', chkPhone);
if(!checkHpNum(chkPhone)){
// alert("올바른 전화번호가 아닙니다.");
return false;
}
// console.log('a chkPhone: ', chkPhone);
addPhoneList.push(chkPhone);
});
if(addPhoneList.length < 1) {
alert("연락처를 선택해주세요.");
return false;
}
// 1. 기존 로직: 연락처 추가 처리
// addPhoneInfo(addPhoneList);
// 2. Tabulator에 넣기 위한 포맷 변환
const formattedData = addPhoneList.map(num => ({phone: num}));
// 3. 기존 테이블 데이터와 합치기
const existingData = tableL.getData();
const combinedData = existingData.concat(formattedData);
// 4. 중복 제거
const result = removeDuplicatesAndCount(combinedData, 'phone');
// console.log('result: ', result);
// 5. 테이블에 반영
// tableL.setData(result);
// 6. 수량/가격 계산
setAllCntData(result);
fn_priceClclt();
// 7. 팝업 닫기
$("#btnLatestAddPhoneClose").trigger("click");
});
//최근전송내역 팝업 선택 취소 버튼 처리
$(document).on('click', '#latestCancelPhone', function (){
$("input[name=latAddrChk]").prop("checked", false);
});
//최근전송내역 팝업 삭제 버튼 처리
$(document).on('click', '#latestAddrDel', function (){
$(this).parent("#latestLi").remove();
});
//자주보내는 번호 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기)
$(document).on('click', '#bookMarkAddPhone', function (){
var addPhoneList = []; //신규로 추가할 전화번호 저장변수
$("input:checkbox[name='bookAddrChk']:checked").each(function(index){
var chkPhone = $(this).val();
if(!checkHpNum(chkPhone)){
alert("올바른 전화번호가 아닙니다.");
return false;
}else{
addPhoneList.push({phone: removeDash(chkPhone.trim())});
}
});
if(addPhoneList.length > 0){
//연락처 추가해 주기
addPhoneInfo(addPhoneList);
$("#btnLatestAddPhoneClose").trigger("click");
}
else {
alert("연락처를 선택해주세요.");
return false;
}
//중복연락처 제거
//var removeDuplData = dupliPhoneData(addPhoneList);
//받는사람 목록에 추가
//tableL.addData(removeDuplData);
//총 받는사람 수 계산
//totRows = tableL.getRows().length;
//updateTotCnt(totRows);
//결제 금액 구하기
//totalPriceSum(totRows);
});
//자주보내는 번호 팝업 선택 취소 버튼 처리
$(document).on('click', '#bookMarkCancelPhone', function (){
$("input[name=bookAddrChk]").prop("checked", false);
});
//자주보내는 번호 팝업 삭제 버튼 처리
$(document).on('click', '#bookMarkAddrDel', function (){
$(this).parent("#bookMarkLi").remove();
});
// 자주보내는 번호 팝업 닫기 버튼 처리
$(document).on('click', '#btnLatestAddPhoneClose', function (){
// 자주보내는 번호 체크박스 해제처리
setCheckBoxUnChecked();
});
// 자주보내는 번호 체크박스 해제처리
function setCheckBoxUnChecked() {
$("input[name=latAddrChk]").prop("checked", false);
$("input[name=bookAddrChk]").prop("checked", false);
}
});
var tableErrorData = [];
var totRows = 0; // 좌측 받는사람 총 갯수
/*
* 토탈 카운트 화면에 노출
* 변수 없는 리스트만 체크
*/
function updateTotCnt(cnt){
$("#rowTotCnt").text(cnt);
}
//주소록 불러오기에서 수신자 리스트 화면에 추가해주기
function addPhoneInfo(taData){
if(taData == null){
alert("연락처 정보가 없습니다.");
return;
}
// if(taData.length > 500){
// alert("최대 발송 건수는 500건 입니다.");
// return;
// }
/*
* 주소록 데이터 화면에 추가
*/
this.fn_displayJsonToHtmlTable(taData);
/*
* 토탈 카운트 화면에 노출
*/
this.updateTotCnt();
}
/*
* 주소록 데이터 화면에 추가
*/
function fn_displayJsonToHtmlTable(taData){
// fn_viewDataInit01();
// 치환문자가 있으면 데이터 초기화
var $htmlBody = $('#wrap01_body');
var addHtml = '<div class="list_table list_body excelBody01">'
+'\t<div class="cb_wrap">'
+'\t\t<label for="" class="label"></label>'
+'\t\t<input type="checkbox" class="wrap01C">'
+'\t</div>'
+'\t<div class="list_table_num phoneArea">'
+'\t\t<p>$PHONE$</p>'
+'\t</div>'
/*23.04.06 이름제거 요청으로인한 화면 이름 제거*/
/*+'\t<div class="list_table_name">'
+'\t\t<p>$NAME$</p>'
+'\t</div>'*/
+'</div>';
var totalDuplCnt = $('#rowDupCnt').text();
var itemPhone;
var itemName;
$.each(taData, function(index, item){
itemPhone = item.phone;
itemName = item.name;
// == null ? '': item.name;
if(!phoneDupl(itemPhone))
/*23.04.06 이름제거 요청으로인한 화면 이름 제거*/
// $htmlBody.append(addHtml.replace('$PHONE$', itemPhone).replace('$NAME$', itemName ??= ''));
$htmlBody.append(addHtml.replace('$PHONE$', itemPhone));
else
totalDuplCnt++;
});
$('#rowDupCnt').text(totalDuplCnt);
}