File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
2023-06-22
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
2024-01-04
File name
Commit message
Commit date
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
<script type="text/javascript">
var $tableExcel = null; //엑셀입력 탭
$(document).ready(function(){
// 엑셀 중복번호 버튼
$("#tableExcelDupliBtn").hide();
//Tabulator AJAX Data Loading
$tableExcel = new Tabulator("#tabulator_excel", {
height:"255px",
width:"100%",
layout:"fitColumns",
autoColumns:false,
headerHozAlign:"center",
validationMode:"highlight",
clipboard:false,
clipboardCopySelector:"table",
clipboardPasteAction:"insert", // insert, update, replace
placeholder:"Excel 파일을 업로드 해주세요.", //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:"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"]},
{title:"D", field:"D", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
{title:"E", field:"E", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
{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;
},
});
$("#excelFile").on("change", function(event) {
var fileInfo = event.target.files;
if(fileInfo.length > 0){
excelFileChange(fileInfo[0]);
}
});
//#############################################################################################
//파일업로드 드래그앤 드롭
//#############################################################################################
var objDragAndDrop = $(".upload_area");
$(document).on("dragenter",".upload_area",function(e){
e.stopPropagation();
e.preventDefault();
//$(this).css('border', '2px solid #0B85A1');
});
$(document).on("dragover",".upload_area",function(e){
e.stopPropagation();
e.preventDefault();
});
$(document).on("drop",".upload_area",function(e){
// fn_loadAddActive();
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
excelFileChange(files[0]);
});
$(document).on('dragenter', function (e){
e.stopPropagation();
e.preventDefault();
});
$(document).on('dragover', function (e){
e.stopPropagation();
e.preventDefault();
//objDragAndDrop.css('border', '2px dotted #0B85A1');
});
$(document).on('drop', function (e){
e.stopPropagation();
e.preventDefault();
});
//파일 드래그앤드롭 종료
//타이틀 select 선택 이벤트
$('.field-selector').on('change', function() {
fn_loadAddActive();
var selectedFields = [];
var isDuplicate = false;
if($tableExcel.getData().length < 1){
alert('데이터 입력 후 선택해 주세요.');
$(this).val("");
fn_loadRemoveActive();
return false;
}
// 중복체크
$('.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($tableExcel);
// 필드가 휴대폰이면 열 중복체크
if($(this).val() == 'addrPhoneNo'){
fn_phoneDupl($tableExcel);
}
fn_loadRemoveActive();
});
// 받는사람 선택삭제 버튼 처리해주기
$('#in_select_del').click(function(){
if(tableL == null || tableL == ""){
alert("받는사람을 추가해 주세요.");
return false;
}
var selectedData = tableL.getSelectedRows();
if(selectedData == "" || selectedData == null){
alert("삭제할 연락처를 선택해주세요.");
return false;
}else{ // 선택한 Row 데이터 삭제하기
if(confirm("선택하신 받는 사람을 삭제하시겠습니까?")){
// 선택 데이터 삭제
selectedData.forEach(row => row.delete());
totRows = tableL.getRows().length;
updateTotCnt(totRows);
var smsTxtArea = $('#smsTxtArea').val();
//일괄변환 문구 결제금액 처리
if(smsTxtArea.indexOf("[*이름*]") > -1
|| smsTxtArea.indexOf("[*1*]") > -1
|| smsTxtArea.indexOf("[*2*]") > -1
|| smsTxtArea.indexOf("[*3*]") > -1
|| smsTxtArea.indexOf("[*4*]") > -1){
fnReplCell();
}else{
//결제 금액 구하기
totalPriceSum(totRows);
}
}
}
});
});
function excelFileChange(file) {
if (file) {
fn_loadAddActive();
var reader = new FileReader();
var extension = file.name.split('.').pop().toLowerCase();
reader.onload = function(e) {
setTimeout(() => { // 파일 읽기 완료 후 실행되도록 함
if (extension === 'xlsx') {
var data = new Uint8Array(e.target.result);
var workbook = XLSX.read(data, {type: 'array'});
var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
var jsonData = XLSX.utils.sheet_to_json(firstSheet, {header: 1});
processExcelData(jsonData);
} else if (extension === 'txt') {
var textData = e.target.result;
processTextData(textData);
} else {
alert('지원되지 않는 파일 형식입니다.');
}
fn_loadRemoveActive();
}, 0); // 지연 없이 즉시 실행되도록 0ms 지연을 설정
};
if (extension === 'xlsx') {
reader.readAsArrayBuffer(file);
} else if (extension === 'txt') {
reader.readAsText(file);
}
}
}
// 엑셀 데이터 처리 함수
function processExcelData(data) {
var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var tableData = [];
var totalRows = data.length - 2; // 전체 데이터 수 (1, 2행 제외)
// 3번째 행부터 입력
data.slice(2).forEach((row, index) => {
var rowData = {};
keys.forEach((key, idx) => { // index 변수명 변경 (내부와 외부에서 사용되므로 충돌 방지)
rowData[key] = row[idx] ? row[idx].trim() : ""; // 각 컬럼에 대해 기본값을 설정
});
tableData.push(rowData);
});
updateTable(tableData);
}
// 텍스트 데이터 처리 함수
function processTextData(text) {
var lines = text.split('\n'); // 각 줄을 배열로 분리
var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var tableData = [];
lines.forEach(line => {
var rowData = {};
var row = line.split(','); // 쉼표로 분리
keys.forEach((key, index) => {
rowData[key] = row[index] ? row[index].trim() : ""; // 각 컬럼에 대해 기본값을 설정
});
tableData.push(rowData);
});
updateTable(tableData);
}
//공통 테이블 업데이트 함수
function updateTable(tableData) {
$tableExcel.setColumns([ // 열 정의를 다시 설정
{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},
{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"]},
{title: "D", field: "D", hozAlign: "center", headerHozAlign: "center", width: 125, validator: ["maxLength:100", "string"]},
{title: "E", field: "E", hozAlign: "center", headerHozAlign: "center", width: 125, validator: ["maxLength:100", "string"]},
{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"]}
]);
$tableExcel.setData(tableData).then(() => {
// rowTotCnt 업데이트
document.getElementById("rowTotCnt").innerText = tableData.length;
});
fn_loadRemoveActive();
}
/*
* 타이틀 select 선택할때마다 실행해서
* 데이터테이블 필드값 수정
*/
function updateTableFields($objTabul) {
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 = [];
$('.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", width: 125, validator: ["maxLength:100", "string"]});
fieldMapping.push(selectedField);
} else {
columns.push({title: field, field: field, hozAlign: "center", headerHozAlign: "center", editor: "input", 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_phoneDupl($objTabul) {
var data = $objTabul.getData();
var uniquePhones = new Set();
var dupliPhoneDataRealList = [];
var rowsToKeep = [];
var rowsToDelete = [];
var phoneNumberChk = false;
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 확인해 주세요');
}
$("#rowDupCnt").text(dupliPhoneDataRealList.length);
if (dupliPhoneDataRealList.length > 0) {
// alert("중복된 휴대폰 번호가 있습니다: \n" + duplicatePhones.join(", "));
makeAddrMassDupliPop(dupliPhoneDataRealList);
}
// 중복된 행 삭제
rowsToDelete.reverse().forEach(index => {
$objTabul.deleteRow(index);
});
// 고유한 데이터만 남기고 테이블 업데이트
$objTabul.setData(rowsToKeep);
$("#rowTotCnt").text(rowsToKeep.length);
}
function fn_dupliPopupShow(){
$('#tableExcelDupliBtn').show()
}
//한국의 핸드폰 번호 형식 검사 함수
function isValidKoreanPhoneNumber(phone) {
// 하이픈(-)을 제거하고 숫자만 남긴 후 검사
var cleaned = phone.replace(/-/g, '');
// 010, 011, 016, 017, 018, 019로 시작하고 10~11자리인 경우 유효
var valid = /^(010|011|016|017|018|019)\d{7,8}$/.test(cleaned);
return valid;
}
// 상단 설명 더보기
function popMore(e){
$(e).closest(".pop_more_cont").toggleClass("pop_more_click");
if($(e).closest(".pop_more_cont").is(".pop_more_click")){
$(e).html('숨기기');
$(e).append('<i></i>');
}else {
$(e).html('더보기');
$(e).append('<i></i>');
}
}
</script>
<div class="popup_heading">
<p>주소록 대량등록</p>
<button type="button" class="tooltip-close" data-focus="popup02-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in" style="padding: 25px 30px;">
<!-- <div class="list_tab_wrap2"> -->
<!-- tab button -->
<!-- <ul class="list_tab" id="tbTabl"> -->
<!-- <li class="tab active" data-tabul="tableExcel"><button type="button" onclick="popupTab(this,'1'); fn_tabToggle('1');">엑셀입력</button></li> -->
<!-- <li class="tab" data-tabul="tableClip"><button type="button" onclick="popupTab(this,'2'); fn_tabToggle('2');">붙여넣기</button></li> -->
<!-- <li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">직접입력</button></li> -->
<!-- </ul>// tab button -->
<!-- </div> -->
<!-- 엑셀입력 -->
<div class="popCont current pop_more_cont" id="popCont_1">
<div class="titBox">
<p>- 엑셀(EXCEL) 파일로 주소록을 한 번에 최대 2만건까지 등록하여 간편하게 발송 및 관리하실 수 있습니다.</p>
<p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 작성하셔야 합니다.</p>
<p> ※ 주소록 관리 메뉴에서 다운로드 받으신 엑셀 파일 또한 업로드 양식에 맞추어 작성하셔야 하며, </p>
<p> 주소록에 이미 등록된 휴대폰 번호는 업데이트 되지 않으므로 기존 주소록에서 해당 휴대폰 번호를 삭제한 후 재등록해 주시기 바랍니다.</p>
<p>- 쉼표(,), 구분선(|), 역슬래시(\, ₩), 작은따옴표('), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.</p>
<p>- 휴대폰 번호는 필수입력 항목입니다.</p>
<p>- 전화번호 형태는 010-1234-5678 또는 01012345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p>
<p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p>
<p>- 이름 20byte, [*1*]~[*4*] 40byte, 메모 250byte까지 입력 가능합니다.</p>
<p>- 첨부가능 파일 : xlsx, xls(최대용량 3MB)</p>
<p>- ‘오류 검사’를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다.</p>
<p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
<button type="button" class="excel_btn" onclick="location.href='/download/addr/주소록_대량등록.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
</div>
<div class="pop_more_wrap">
<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
</div>
</div><!--// 엑셀입력 -->
<!-- 공통 -->
<div>
<table class="layer_tType1">
<caption>엑셀입력 표</caption>
<colgroup>
<col style="width: 95px">
<col style="width: auto">
</colgroup>
<tbody>
<tr>
<th>그룹 선택</th>
<td>
<label for="" class="label">그룹 선택</label>
<select id="addrGrpIdInfo" name="addrGrpIdInfo">
</select>
<label for="" class="label">그룹명 입력</label>
<input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
<input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/>
<button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button>
</td>
</tr>
</tbody>
</table>
</div>
<div class="file_add upload_area">
<p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요</p>
</div>
<div class="excel_middle2">
<p>
총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건
<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" id="tableExcelDupliBtn">중복번호</button>
<!-- -->
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> -->
</p>
<!-- <button type="button" class="btnType btnType6 addCallToF">번호추가</button> -->
</div>
<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>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 125px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 125px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 125px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 125px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 125px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 125px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
</div>
</div>
<div class="drag_drop_wrap callList_includ_box" id="tabulator_excel">
<!-- <img src="/publish/images/content/excel.jpg" style="width: 100%;"> -->
</div>
<div class="excel_middle">
<div class="select_btnWrap clearfix">
<div>
<button type="button" id="all_del"><i class="remove_img"></i>전체삭제</button>
<button type="button" id="in_select_del"><i class="remove_img"></i>선택삭제</button>
<button type="button" id="chkVali_del"><i class="remove_img"></i>오류번호삭제</button>
<button type="button" id="check_validity">오류 검사 <i></i></button>
<div class="error_hover_cont send_hover_cont addr_hover_cont">
<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
</div>
</div>
</div>
</div><!--// 공통 -->
<!-- 붙여놓기 설명 -->
<div class="req_area">
<div class="text_box">
- 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br>
- 휴대폰 번호는 필수입력 항목입니다.<br>
- 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br>
- 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br>
- '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다.
</div>
</div>
<div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;">
<button type="button" id="btnAddrMassReg">등록</button>
<button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup01-close" data-focus-next="popup02">닫기</button>
</div>
</div>