주소록 수정중
@92745aa218d039c39d8cacbe12e51d0f50e267c7
--- src/main/webapp/WEB-INF/jsp/main/EgovMainView.jsp
+++ src/main/webapp/WEB-INF/jsp/main/EgovMainView.jsp
... | ... | @@ -652,14 +652,14 @@ |
| 652 | 652 |
<fmt:formatNumber value="${result.amtRefundSum}" pattern="#,###" />
|
| 653 | 653 |
</td> |
| 654 | 654 |
<td class="right c_999999"> |
| 655 |
- <c:choose> |
|
| 655 |
+ <%-- <c:choose> |
|
| 656 | 656 |
<c:when test="${result.amtTotSum > 0}">
|
| 657 | 657 |
<fmt:formatNumber value="${result.amtTotSum}" pattern="#,###" />
|
| 658 | 658 |
</c:when> |
| 659 | 659 |
<c:otherwise> |
| 660 | 660 |
<fmt:formatNumber value="${result.amtTotSum}" pattern="#,###" />
|
| 661 | 661 |
</c:otherwise> |
| 662 |
- </c:choose> |
|
| 662 |
+ </c:choose> --%> |
|
| 663 | 663 |
</td> |
| 664 | 664 |
</tr> |
| 665 | 665 |
</c:forEach> |
--- src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
... | ... | @@ -4,34 +4,34 @@ |
| 4 | 4 |
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> |
| 5 | 5 |
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
| 6 | 6 |
|
| 7 |
+ |
|
| 7 | 8 |
<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script> |
| 8 | 9 |
<script type="text/javascript" src="https://oss.sheetjs.com/sheetjs/xlsx.full.min.js"></script> |
| 10 |
+<script type="text/javascript" src="<c:url value='/js/web/addr/fax/faxTabulator.js'/>?v=20241031"></script> |
|
| 11 |
+<script type="text/javascript" src="<c:url value='/js/web/addr/fax/faxEvent.js'/>?v=20241031"></script> |
|
| 12 |
+<script type="text/javascript" src="<c:url value='/js/web/addr/cmn.js?date=202409021440'/>"></script> |
|
| 13 |
+<script type="text/javascript" src="<c:url value='/js/web/addr/utils.js'/>?v=20240919"></script> |
|
| 9 | 14 |
|
| 10 | 15 |
<script type="text/javascript"> |
| 11 |
-var tableErrorData = []; |
|
| 12 |
-var tableErrorCheckData = []; |
|
| 13 |
-var addrMassDupliSaveList = null; |
|
| 14 | 16 |
|
| 15 | 17 |
$(document).ready(function(){
|
| 16 | 18 |
listAddrGrp(); |
| 17 | 19 |
addrLoadAjax(); |
| 18 | 20 |
|
| 19 |
- // 주소록 대량등록 |
|
| 20 |
- addrMassTab(1); |
|
| 21 |
- |
|
| 22 |
- // 중복 팩스번호 버튼 노출여부 |
|
| 23 |
- $("#btnAddrMassDupli").hide();
|
|
| 24 |
- $("#btnAddrMassSaveDupli").hide();
|
|
| 21 |
+ // excel 오류정보 테스트 |
|
| 22 |
+ $('#errorExcelBtn').click(function(){
|
|
| 23 |
+ if($tableError.getDataCount()<1){
|
|
| 24 |
+ alert('오류 정보가 없습니다.');
|
|
| 25 |
+ return false; |
|
| 26 |
+ } |
|
| 27 |
+ $tableError.download("xlsx", "error_data.xlsx");
|
|
| 28 |
+ }); |
|
| 25 | 29 |
}); |
| 26 | 30 |
|
| 31 |
+// 메인 화면 좌측메뉴 최신화 |
|
| 27 | 32 |
function listAddrGrp(){
|
| 28 | 33 |
var sendData = $(document.searchAddrGrpForm).serializeArray() ; |
| 29 | 34 |
$("#adr1_left").load("/web/mjon/fax/addr/selectFaxAddrGroupListAjax.do", sendData ,function(response, status, xhr){});
|
| 30 |
-} |
|
| 31 |
- |
|
| 32 |
-function addrGroupLoadAjax(){
|
|
| 33 |
- $("#addrRegistSelect").load("/web/mjon/fax/addr/selectFaxAddrGroupAjax.do", function(response, status, xhr){});
|
|
| 34 |
- $("#funcAddrGroupSelect").load("/web/mjon/fax/addr/selectFaxAddrGroupAjax.do", function(response, status, xhr){});
|
|
| 35 | 35 |
} |
| 36 | 36 |
|
| 37 | 37 |
function addrLoadAjax(){
|
... | ... | @@ -39,6 +39,13 @@ |
| 39 | 39 |
addrGroupLoadAjax(); |
| 40 | 40 |
} |
| 41 | 41 |
|
| 42 |
+function addrGroupLoadAjax(){
|
|
| 43 |
+ $("#addrRegistSelect").load("/web/mjon/fax/addr/selectFaxAddrGroupAjax.do", function(response, status, xhr){});
|
|
| 44 |
+ $("#funcAddrGroupSelect").load("/web/mjon/fax/addr/selectFaxAddrGroupAjax.do", function(response, status, xhr){});
|
|
| 45 |
+} |
|
| 46 |
+ |
|
| 47 |
+ |
|
| 48 |
+// 주소록그룹추가 |
|
| 42 | 49 |
function insertAddrGroupAjax() {
|
| 43 | 50 |
var form = document.addrGrpInsertForm; |
| 44 | 51 |
if(form.addrGrpNm.value == "") {
|
... | ... | @@ -75,7 +82,6 @@ |
| 75 | 82 |
}, |
| 76 | 83 |
error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
|
| 77 | 84 |
}); |
| 78 |
- |
|
| 79 | 85 |
} |
| 80 | 86 |
|
| 81 | 87 |
function insertAddrAjax() {
|
... | ... | @@ -157,7 +163,7 @@ |
| 157 | 163 |
|
| 158 | 164 |
function moveTab(type){
|
| 159 | 165 |
if(type == "addr") location.href="/web/mjon/addr/selectAddrList.do"; |
| 160 |
- if(type == "fax") location.href="/web/mjon/fax/addr/selectFaxAddrList.do"; |
|
| 166 |
+ if(type == "fax") location.href="/web/mjon/fax/addr/selectFaxAddrList.do"; |
|
| 161 | 167 |
if(type == "block") location.href="/web/mjon/addrBlock/selectBlockList.do"; |
| 162 | 168 |
if(type == "addrMob") location.href="/web/mjon/addr/addrMobGuide.do"; |
| 163 | 169 |
if(type == "addrApply") location.href="/web/mjon/addragency/selectAddrAgencyList.do"; |
... | ... | @@ -178,152 +184,6 @@ |
| 178 | 184 |
|
| 179 | 185 |
$(document).ready(function(){
|
| 180 | 186 |
//Tabulator AJAX Data Loading |
| 181 |
- tableR = new Tabulator(".callList_box", {
|
|
| 182 |
- height:"255px", |
|
| 183 |
- width:"100%", |
|
| 184 |
- layout:"fitColumns", |
|
| 185 |
- //data:tabledata, |
|
| 186 |
- //autoColumns:true, |
|
| 187 |
- headerHozAlign:"center", |
|
| 188 |
- validationMode:"highlight", |
|
| 189 |
- clipboard:false, |
|
| 190 |
- clipboardCopySelector:"table", |
|
| 191 |
- clipboardPasteAction:"insert", // insert, update, replace |
|
| 192 |
- placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional) |
|
| 193 |
- columns:[ //Define Table Columns |
|
| 194 |
- {formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){
|
|
| 195 |
- cell.getRow().toggleSelect(); |
|
| 196 |
- } |
|
| 197 |
- }, |
|
| 198 |
- {title:"이름", hozAlign:"center", field:"name", editor:"input", width:140, validator:["maxLength:12", "string"]},
|
|
| 199 |
- {title:"팩스번호", hozAlign:"center", field:"phone", editor:"input", width:145, validator:["required","minLength:10", "maxLength:13"]},
|
|
| 200 |
- {title:"메모", hozAlign:"center", field:"memo", editor:"input", width:119, validator:["maxLength:100", "string"]}
|
|
| 201 |
- ], |
|
| 202 |
- validationFailed:function(cell, value, parameters){ // 유효성 체크 함수
|
|
| 203 |
- var valid = cell.isValid(); |
|
| 204 |
- if(!valid){
|
|
| 205 |
- alert("양식에 맞지 않는 정보가 입력되었습니다.");
|
|
| 206 |
- |
|
| 207 |
- //해당 셀 데이터 삭제 |
|
| 208 |
- cell.setValue("");
|
|
| 209 |
- } |
|
| 210 |
- return value % parameters.phone; |
|
| 211 |
- }, |
|
| 212 |
- }); |
|
| 213 |
- |
|
| 214 |
- //받는 사람 리스트 영역에 클립보드 데이터 가져와보기 |
|
| 215 |
- $('.callList_box').on('paste', function (e) {
|
|
| 216 |
- var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
|
|
| 217 |
- var elmSplit= []; |
|
| 218 |
- elmSplit = element.split("\n");
|
|
| 219 |
- var elmLen = elmSplit.length; |
|
| 220 |
- if(elmLen < 0){
|
|
| 221 |
- alert("붙여넣을 연락처를 복사해주세요.");
|
|
| 222 |
- return false; |
|
| 223 |
- }else{
|
|
| 224 |
- if (elmLen > 20001) {
|
|
| 225 |
- alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
|
|
| 226 |
- return false; |
|
| 227 |
- } |
|
| 228 |
- |
|
| 229 |
- tableErrorData.length = 0; // 오류 번호 배열 초기화 |
|
| 230 |
- |
|
| 231 |
- var splitData = []; |
|
| 232 |
- var realPhone = []; |
|
| 233 |
- for(var i=0; i < elmLen; i++){
|
|
| 234 |
- var splitStr = elmSplit[i]; |
|
| 235 |
- var tabData = splitStr.split("\t"); //탭 구분으로 데이터 분할
|
|
| 236 |
- var comData = splitStr.split(","); //콤마 구분으로 데이터 분할
|
|
| 237 |
- if(tabData.length >= 2){
|
|
| 238 |
- splitData = tabData; |
|
| 239 |
- }else{
|
|
| 240 |
- splitData = comData; |
|
| 241 |
- } |
|
| 242 |
- |
|
| 243 |
- if(splitData.length == 0){// 데이터가 없는경우
|
|
| 244 |
- alert("탭으로 구분하여 데이터를 복사해 주세요.");
|
|
| 245 |
- return false; |
|
| 246 |
- }else if(splitData.length == 1){// 데이터가 탭으로 구분이 없는 경우
|
|
| 247 |
- for(var j=0; j < splitData.length; j++){
|
|
| 248 |
- if(checkFaxNum(splitData[j].trim())){//팩스 타입인 번호만 저장해준다.
|
|
| 249 |
- //배열 끝에 데이터 추가해 주기 |
|
| 250 |
- realPhone.push({name: "", phone: removeDash(splitData[j].trim())});
|
|
| 251 |
- } |
|
| 252 |
- else {
|
|
| 253 |
- if (splitData[j].trim() != '' && splitData[j].trim() != null && splitData[j].trim() != undefined) {
|
|
| 254 |
- tableErrorData.push(splitData[j].trim()); |
|
| 255 |
- } |
|
| 256 |
- } |
|
| 257 |
- } |
|
| 258 |
- }else{//데이터가 탭으로 구분되어 이름, 연락처로 구분된 경우
|
|
| 259 |
- var name; //이름 |
|
| 260 |
- var phone; //핸드폰번호 |
|
| 261 |
- var memo; //메모 |
|
| 262 |
- var isPhoneValid = false; |
|
| 263 |
- for(var j=0; j < splitData.length; j++){
|
|
| 264 |
- if(j == 0){
|
|
| 265 |
- name = splitData[j].trim(); |
|
| 266 |
- } |
|
| 267 |
- if(j == 1){
|
|
| 268 |
- if(checkFaxNum(splitData[j].trim())){//팩스 타입인 번호만 저장해준다.
|
|
| 269 |
- phone = removeDash(splitData[j].trim()); |
|
| 270 |
- isPhoneValid = true; |
|
| 271 |
- } |
|
| 272 |
- else {
|
|
| 273 |
- if (splitData[j].trim() != '' && splitData[j].trim() != null && splitData[j].trim() != undefined) {
|
|
| 274 |
- tableErrorData.push(splitData[j].trim()); |
|
| 275 |
- } |
|
| 276 |
- } |
|
| 277 |
- } |
|
| 278 |
- |
|
| 279 |
- if(j == 2){ //메모
|
|
| 280 |
- memo = splitData[j].trim(); |
|
| 281 |
- } |
|
| 282 |
- } |
|
| 283 |
- |
|
| 284 |
- if (isPhoneValid == true) {
|
|
| 285 |
- //배열 끝에 데이터 추가해 주기 |
|
| 286 |
- realPhone.push({name: name, phone: phone, memo : memo });
|
|
| 287 |
- } |
|
| 288 |
- }//else end |
|
| 289 |
- } |
|
| 290 |
- |
|
| 291 |
- var recTableData = tableR.getRows(); // 받는사람 리스트의 전체 목록을 저장 |
|
| 292 |
- var tableData = []; |
|
| 293 |
- |
|
| 294 |
- //기존 받는사람 리스트를 배열에 미리 담아둔다. |
|
| 295 |
- if(recTableData.length > 0){
|
|
| 296 |
- for(var j=0; j < recTableData.length; j++){
|
|
| 297 |
- tableData.push({name: recTableData[j].getData().name, phone: removeDash(recTableData[j].getData().phone.trim()), memo: recTableData[j].getData().memo});
|
|
| 298 |
- } |
|
| 299 |
- } |
|
| 300 |
- |
|
| 301 |
- if(realPhone.length > 0){
|
|
| 302 |
- for(var j=0; j < realPhone.length; j++){
|
|
| 303 |
- tableData.push({name: realPhone[j].name, phone: removeDash(realPhone[j].phone.trim()), memo: realPhone[j].memo});
|
|
| 304 |
- } |
|
| 305 |
- } |
|
| 306 |
- |
|
| 307 |
- //tableData.push(realPhone); |
|
| 308 |
- |
|
| 309 |
- //중복 연락처 1개만 남기고 삭제하기 |
|
| 310 |
- var removeDuplPhone = dupliPhoneData(tableData); |
|
| 311 |
- |
|
| 312 |
- //수신자 리스트에 전화번호 추가해주기 |
|
| 313 |
- //tableR.addData(removeDuplPhone); |
|
| 314 |
- tableR.setData(removeDuplPhone); |
|
| 315 |
- |
|
| 316 |
- totRows = tableR.getRows().length; |
|
| 317 |
- updateTotCnt(totRows); //전체 데이터 갯수 구하기 |
|
| 318 |
- |
|
| 319 |
- if (tableErrorData.length > 0) {
|
|
| 320 |
- alert("올바르지 않은 팩스 번호가 "+ tableErrorData.length +" 건 있습니다.");
|
|
| 321 |
- //for(var x=0; x < tableErrorData.length; x++){
|
|
| 322 |
- // alert(tableErrorData[x]); |
|
| 323 |
- //} |
|
| 324 |
- } |
|
| 325 |
- } |
|
| 326 |
- }); |
|
| 327 | 187 |
|
| 328 | 188 |
//tableR.setData(tabledata); |
| 329 | 189 |
|
... | ... | @@ -573,8 +433,6 @@ |
| 573 | 433 |
totRows = tableR.getRows().length; |
| 574 | 434 |
updateTotCnt(totRows); |
| 575 | 435 |
}); |
| 576 |
- |
|
| 577 |
- |
|
| 578 | 436 |
}); |
| 579 | 437 |
|
| 580 | 438 |
|
... | ... | @@ -822,9 +680,13 @@ |
| 822 | 680 |
|
| 823 | 681 |
// 대량등록 닫기 |
| 824 | 682 |
function setAddrMassClose() {
|
| 825 |
- tableR.clearData(); |
|
| 826 |
- $("#rowTotCnt").text(0); //총건수 수정
|
|
| 827 |
- $("#rowDupCnt").text(0); //중복건수 수정
|
|
| 683 |
+ var $objTabul = fn_utils_getTabulator(); |
|
| 684 |
+ $objTabul.clearData(); |
|
| 685 |
+ |
|
| 686 |
+ $("#rowTotCnt").text(0); //총건수 수정
|
|
| 687 |
+ $("#rowDupCnt").text(0); //중복건수 수정
|
|
| 688 |
+ $("#rowErrorCnt").text(0); //오류건수 수정
|
|
| 689 |
+ |
|
| 828 | 690 |
dupliPhoneDataRealList.length = 0; // 중복 팩스번호 초기화 |
| 829 | 691 |
addrMassDupliSaveList = null; |
| 830 | 692 |
|
... | ... | @@ -834,7 +696,8 @@ |
| 834 | 696 |
//location.reload(); |
| 835 | 697 |
listAddrGrp(); |
| 836 | 698 |
addrGroupLoadAjax(); |
| 837 |
- addrLoadAjax(); |
|
| 699 |
+ addrLoadAjax(); |
|
| 700 |
+ fn_errorPopClean(); // 에러 팝업 초기화 |
|
| 838 | 701 |
} |
| 839 | 702 |
|
| 840 | 703 |
// 주소록 그룹 중복체크 |
... | ... | @@ -878,9 +741,6 @@ |
| 878 | 741 |
alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
|
| 879 | 742 |
return false; |
| 880 | 743 |
} |
| 881 |
- |
|
| 882 |
- // 주소록 이름에 이모지 체크 |
|
| 883 |
-// if(!addrEmojiCheck(selectedData, tableR)) return false; |
|
| 884 | 744 |
|
| 885 | 745 |
var selectMassVal = $("#addrGrpIdInfo option:selected").val();
|
| 886 | 746 |
|
... | ... | @@ -1038,7 +898,8 @@ |
| 1038 | 898 |
} |
| 1039 | 899 |
} |
| 1040 | 900 |
|
| 1041 |
- |
|
| 901 |
+//주소 대량등록 버튼 클릭 |
|
| 902 |
+//AddrListAjax.jsp에서 호출 |
|
| 1042 | 903 |
$(document).on('click', '#btnAddrMassRegCall', function() {
|
| 1043 | 904 |
getAddrGroupList(); |
| 1044 | 905 |
}); |
... | ... | @@ -1064,12 +925,13 @@ |
| 1064 | 925 |
}); |
| 1065 | 926 |
} |
| 1066 | 927 |
|
| 1067 |
-// Show Html |
|
| 928 |
+// 그룹데이터 노출 |
|
| 1068 | 929 |
function getAddrGroupListShow(jsonList) {
|
| 1069 | 930 |
var sHtml = ""; |
| 1070 | 931 |
sHtml += "<option value='NEW'>그룹추가</option>"; |
| 1071 | 932 |
sHtml += "<option value='0'>그룹미지정</option>"; |
| 1072 | 933 |
sHtml += "<option value='bookmark'>자주보내는 번호</option>"; |
| 934 |
+ |
|
| 1073 | 935 |
for (var j = 0; j < jsonList.length; j++) {
|
| 1074 | 936 |
sHtml += " <option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>"; |
| 1075 | 937 |
} |
... | ... | @@ -1086,11 +948,6 @@ |
| 1086 | 948 |
//############################################################################################# |
| 1087 | 949 |
//파일 불러오기 |
| 1088 | 950 |
//############################################################################################# |
| 1089 |
- |
|
| 1090 |
-//엑섹불러오기 버튼 클릭시 파일 첨부 실행 |
|
| 1091 |
-$(document).on('click', '.c3', function() {
|
|
| 1092 |
- $("#excelFile").click();
|
|
| 1093 |
-}); |
|
| 1094 | 951 |
|
| 1095 | 952 |
//seetJs 엑셀 파일 불러오기 |
| 1096 | 953 |
function excelExport(event){
|
... | ... | @@ -1299,6 +1156,13 @@ |
| 1299 | 1156 |
$("#addrMassSaveDupli_layer").html(sHtml);
|
| 1300 | 1157 |
} |
| 1301 | 1158 |
|
| 1159 |
+//function fn_tabToggle('1')
|
|
| 1160 |
+function fn_tabToggle(tabNum){
|
|
| 1161 |
+ var tabId = '#tab'+tabNum; |
|
| 1162 |
+ $('.tab_c').hide();
|
|
| 1163 |
+ $(tabId).show(); |
|
| 1164 |
+ getAddrGroupList(); |
|
| 1165 |
+} |
|
| 1302 | 1166 |
</script> |
| 1303 | 1167 |
|
| 1304 | 1168 |
<div class="loading_layer"> |
... | ... | @@ -1307,145 +1171,78 @@ |
| 1307 | 1171 |
<div class="text">Loading</div> |
| 1308 | 1172 |
</div> |
| 1309 | 1173 |
</div> |
| 1310 |
-<!-- 수신거부 대량등록 data-tooltip:adr_popup01 --> |
|
| 1311 |
-<form id="addrMassForm" name="addrMassForm" method="post"> |
|
| 1312 |
- <input type="hidden" id="phoneList" name="phoneList" value=""/> |
|
| 1313 |
- <input type="hidden" id="nameList" name="nameList" value=""/> |
|
| 1314 |
- <input type="hidden" id="memoList" name="memoList" value=""/> |
|
| 1315 |
- <input type="hidden" id="addrGrpId" name="addrGrpId" value=""/> |
|
| 1316 |
- <div class="tooltip-wrap" id="addrMassLoad"> |
|
| 1317 |
- <div class="popup-com adr_layer adr_popup01" tabindex="0" data-tooltip-con="adr_popup01" data-focus="adr_popup01" data-focus-prev="adr_popup01-close" style="width: 1000px;"> |
|
| 1174 |
+ |
|
| 1175 |
+<div id="adrPopup_tab1"> |
|
| 1176 |
+ <!-- 주소록 대량등록 data-tooltip:adr_popup01 --> |
|
| 1177 |
+ <form id="addrMassForm" name="addrMassForm" method="post"> |
|
| 1178 |
+ <input type="hidden" id="phoneList" name="phoneList" value=""/> |
|
| 1179 |
+ <input type="hidden" id="nameList" name="nameList" value=""/> |
|
| 1180 |
+ <input type="hidden" id="memoList" name="memoList" value=""/> |
|
| 1181 |
+ <input type="hidden" id="addrGrpId" name="addrGrpId" value=""/> |
|
| 1182 |
+ <div class="tooltip-wrap" id="addrMassLoad"> |
|
| 1183 |
+ <div class="popup-com adr_layer adr_popup01" tabindex="0" data-tooltip-con="adr_popup01" data-focus="adr_popup01" data-focus-prev="adr_popup01-close" style="width: 1000px;"> |
|
| 1184 |
+ <div class="popup_heading"> |
|
| 1185 |
+ <p>주소록 대량등록</p> |
|
| 1186 |
+ <button type="button" class="tooltip-close" data-focus="adr_popup01-close" onclick="setAddrMassClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button> |
|
| 1187 |
+ </div> |
|
| 1188 |
+ <div class="layer_in" style="padding: 25px 30px;"> |
|
| 1189 |
+ <div class="list_tab_wrap2"> |
|
| 1190 |
+ <!-- tab button --> |
|
| 1191 |
+ <ul class="list_tab" id="tbTabl"> |
|
| 1192 |
+ <li class="tab active" data-tabul="tableExcel"><button type="button" onclick="popupTab(this,'1'); fn_tabToggle('1');">엑셀입력</button></li>
|
|
| 1193 |
+ <li class="tab" data-tabul="tableClip"><button type="button" onclick="popupTab(this,'2'); fn_tabToggle('2');">붙여넣기</button></li>
|
|
| 1194 |
+ <li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">직접입력</button></li>
|
|
| 1195 |
+ </ul> |
|
| 1196 |
+ <!--// tab button --> |
|
| 1197 |
+ </div> |
|
| 1198 |
+ <div id="tab1" class="tab_c tableExcel"> |
|
| 1199 |
+ <%@include file="/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp" %> |
|
| 1200 |
+ </div> |
|
| 1201 |
+ <div id="tab2" class="tab_c tableClip" style="display: none;"> |
|
| 1202 |
+ <%-- <%@include file="/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforClipboard.jsp" %> --%> |
|
| 1203 |
+ </div> |
|
| 1204 |
+ <div id="tab3" class="tab_c tableSelf" style="display: none;"> |
|
| 1205 |
+ <%-- <%@include file="/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforSelf.jsp" %> --%> |
|
| 1206 |
+ </div> |
|
| 1207 |
+ </div> |
|
| 1208 |
+ <div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;"> |
|
| 1209 |
+ <button type="button" id="btnAddrMassReg">등록</button> |
|
| 1210 |
+ <button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup01-close" data-focus-next="popup02">닫기</button> |
|
| 1211 |
+ </div> |
|
| 1212 |
+ </div> |
|
| 1213 |
+ </div> |
|
| 1214 |
+ </form> |
|
| 1215 |
+ |
|
| 1216 |
+ <!-- 주소록 상세 결과 팝업 data-tooltip:adr_popup14 --> |
|
| 1217 |
+ <div class="tooltip-wrap"> |
|
| 1218 |
+ <div class="popup-com adr_layer adr_popup14" tabindex="0" data-tooltip-con="adr_popup14" data-focus="adr_popup14" data-focus-prev="adr_popu14-close" style="width: 450px;"> |
|
| 1318 | 1219 |
<div class="popup_heading"> |
| 1319 |
- <p>주소록 대량등록</p> |
|
| 1320 |
- <button type="button" class="tooltip-close" data-focus="adr_popup01-close" onclick="setAddrMassClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button> |
|
| 1321 |
- </div> |
|
| 1322 |
- <div class="layer_in" style="padding: 25px 30px;"> |
|
| 1323 |
- <div class="list_tab_wrap2"> |
|
| 1324 |
- <!-- tab button --> |
|
| 1325 |
- <ul class="list_tab"> |
|
| 1326 |
- <li class="tab active"><button type="button" onclick="popupTab(this,'1'); addrMassTab('1');">엑셀입력</button></li>
|
|
| 1327 |
- <li class="tab"><button type="button" onclick="popupTab(this,'2'); addrMassTab('2');">붙여넣기</button></li>
|
|
| 1328 |
- </ul><!--// tab button --> |
|
| 1329 |
- </div> |
|
| 1330 |
- <!-- 엑셀입력 --> |
|
| 1331 |
- <div class="popCont current pop_more_cont" id="popCont_1"> |
|
| 1332 |
- <div class="titBox"> |
|
| 1333 |
- <p>- 엑셀(EXCEL) 파일로 주소록을 한 번에 최대 2만건까지 등록하여 간편하게 발송 및 관리하실 수 있습니다.</p> |
|
| 1334 |
- <p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 작성하셔야 합니다.</p> |
|
| 1335 |
- <p> ※ 팩스 번호는 지역번호(02, 031, 033 등), 타사부가번호(030*, 050*, 060, 070, 080, 1**)로 시작하는 번호만 발송 가능합니다. </p> |
|
| 1336 |
- <p> ※ 주소록 관리 메뉴에서 다운로드 받으신 엑셀 파일 또한 업로드 양식에 맞추어 작성하셔야 하며, </p> |
|
| 1337 |
- <p> 주소록에 이미 등록된 팩스 번호는 업데이트 되지 않으므로 기존 주소록에서 해당 팩스 번호를 삭제한 후 재등록해 주시기 바랍니다.</p> |
|
| 1338 |
- <p>- 쉼표(,), 구분선(|), 역슬래시(\, ₩), 작은따옴표('), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.</p>
|
|
| 1339 |
- <p>- 팩스 번호는 필수입력 항목입니다.</p> |
|
| 1340 |
- <p>- 팩스번호 형태는 02-1234-5678 또는 0212345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p> |
|
| 1341 |
- <p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p> |
|
| 1342 |
- <p>- 이름 20byte, 메모 250byte까지 입력 가능합니다.</p> |
|
| 1343 |
- <p>- 첨부가능 파일 : xlsx, xls(최대용량 3MB)</p> |
|
| 1344 |
- <p>- ‘오류 검사’를 통해 등록된 데이터에 팩스 번호 입력 오류를 확인하실 수 있습니다.</p> |
|
| 1345 |
- <p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p> |
|
| 1346 |
- <button type="button" class="excel_btn" onclick="location.href='/download/addr/팩스주소록_대량등록.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button> |
|
| 1347 |
- </div> |
|
| 1348 |
- <div class="pop_more_wrap"> |
|
| 1349 |
- <button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button> |
|
| 1350 |
- </div> |
|
| 1351 |
- </div><!--// 엑셀입력 --> |
|
| 1352 |
- |
|
| 1353 |
- <!-- 붙여넣기 --> |
|
| 1354 |
- <div class="popCont pop_more_cont" id="popCont_2"> |
|
| 1355 |
- <div class="titBox"> |
|
| 1356 |
- <p>- 텍스트(txt) 파일로 작성된 주소록을 등록하실 수 있습니다.</p> |
|
| 1357 |
- <p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 붙여 넣으셔야 합니다.</p> |
|
| 1358 |
- <p> ※ 팩스 번호는 지역번호(02, 031, 033 등), 타사부가번호(030*, 050*, 060, 070, 080, 1**)로 시작하는 번호만 발송 가능합니다. </p> |
|
| 1359 |
- <p>- 입력 내용은 (Tab) 또는 (,) 구분하여 입력하여야 합니다.</p> |
|
| 1360 |
- <p>- 한 줄(열)에 주소 한 건만 입력 가능합니다.</p> |
|
| 1361 |
- <p>- 팩스 번호 형태는 02-1234-5678 또는 0212345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p> |
|
| 1362 |
- <p> (예) 홍길동,02-1234-5678 또는 홍길동,0212345678</p> |
|
| 1363 |
- <p>- 한번에 많은 양의 데이터를 입력하시려면 ‘주소록 복사(Ctrl+c) + 붙여넣기(Ctrl+v)’ 또는 ‘엑셀입력’을 이용하세요.</p> |
|
| 1364 |
- <p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p> |
|
| 1365 |
- <button type="button" class="txt_btn" onclick="location.href='/download/addr/팩스주소록_대량등록.zip'"><i></i>TXT샘플 다운로드</button> |
|
| 1366 |
- </div> |
|
| 1367 |
- <div class="pop_more_wrap"> |
|
| 1368 |
- <button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button> |
|
| 1369 |
- </div> |
|
| 1370 |
- </div><!--// 붙여넣기 --> |
|
| 1371 |
- |
|
| 1372 |
- <!-- 공통 --> |
|
| 1373 |
- <div> |
|
| 1374 |
- <table class="layer_tType1"> |
|
| 1375 |
- <caption>엑셀입력 표</caption> |
|
| 1376 |
- <colgroup> |
|
| 1377 |
- <col style="width: 95px"> |
|
| 1378 |
- <col style="width: auto"> |
|
| 1379 |
- </colgroup> |
|
| 1380 |
- <tbody> |
|
| 1381 |
- <tr> |
|
| 1382 |
- <th>그룹 선택</th> |
|
| 1383 |
- <td> |
|
| 1384 |
- <label for="" class="label">그룹 선택</label> |
|
| 1385 |
- <select id="addrGrpIdInfo" name="addrGrpIdInfo"> |
|
| 1386 |
- </select> |
|
| 1387 |
- <label for="" class="label">그룹명 입력</label> |
|
| 1388 |
- <input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;"> |
|
| 1389 |
- |
|
| 1390 |
- <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" onchange="excelExport(event); return false;" style="display:none"/> |
|
| 1391 |
- <button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button> |
|
| 1392 |
- </td> |
|
| 1393 |
- </tr> |
|
| 1394 |
- </tbody> |
|
| 1395 |
- </table> |
|
| 1396 |
- </div> |
|
| 1397 |
- <div class="file_add upload_area"> |
|
| 1398 |
- <p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요</p> |
|
| 1399 |
- </div> |
|
| 1400 |
- <div class="excel_middle2"> |
|
| 1401 |
- <p> |
|
| 1402 |
- 총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건 |
|
| 1403 |
- |
|
| 1404 |
- <button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button> |
|
| 1405 |
- |
|
| 1406 |
- <button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> |
|
| 1407 |
- </p> |
|
| 1408 |
- <button type="button" class="btnType btnType6 addCallToF">번호추가</button> |
|
| 1409 |
- </div> |
|
| 1410 |
- <div class="drag_drop_wrap callList_box"> |
|
| 1411 |
- <img src="/publish/images/content/excel.jpg" style="width: 100%;"> |
|
| 1412 |
- </div> |
|
| 1413 |
- <div class="excel_middle"> |
|
| 1414 |
- <div class="select_btnWrap clearfix"> |
|
| 1415 |
- <div> |
|
| 1416 |
- <button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button> |
|
| 1417 |
- <button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button> |
|
| 1418 |
- <button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button> |
|
| 1419 |
- <button type="button" class="check_validity">오류 검사 <i></i></button> |
|
| 1420 |
- <div class="error_hover_cont send_hover_cont addr_hover_cont"> |
|
| 1421 |
- <p>팩스 번호 입력 시 해당 팩스 번호에 대한 형식이 어긋나거나 팩스 번호에 오류가 있는지 등을 검사하는 기능</p> |
|
| 1422 |
- <span>(예시) 02-1234-0001(O) / 00100-123-0001(X)</span> |
|
| 1423 |
- </div> |
|
| 1424 |
- </div> |
|
| 1425 |
- |
|
| 1426 |
- </div> |
|
| 1427 |
- </div><!--// 공통 --> |
|
| 1428 |
- |
|
| 1429 |
- <!-- 붙여놓기 설명 --> |
|
| 1430 |
- <div class="req_area"> |
|
| 1431 |
- <div class="text_box"> |
|
| 1432 |
- - 팩스 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br> |
|
| 1433 |
- - 팩스 번호는 필수입력 항목입니다.<br> |
|
| 1434 |
- - 이름,팩스 번호,메모 순서대로 입력해주세요.(예 : 홍길동,02-1234-5678,메모)<br> |
|
| 1435 |
- - 이름은 24byte, 메모는 250byte까지 입력 가능합니다.<br> |
|
| 1436 |
- - '오류 검사'를 통해 등록된 데이터에 팩스 번호 입력 오류를 확인하실 수 있습니다. |
|
| 1437 |
- </div> |
|
| 1438 |
- </div> |
|
| 1439 |
- |
|
| 1440 |
- |
|
| 1441 |
- </div> |
|
| 1442 |
- <div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;"> |
|
| 1443 |
- <button type="button" id="btnAddrMassReg">등록</button> |
|
| 1444 |
- <button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup01-close" data-focus-next="popup02">닫기</button> |
|
| 1445 |
- </div> |
|
| 1220 |
+ <p>주소록 상세 결과</p> |
|
| 1221 |
+ <button type="button" class="tooltip-close" data-focus="adr_popup14-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button> |
|
| 1222 |
+ </div> |
|
| 1223 |
+ <div class="layer_in" style="padding:30px 20px;"> |
|
| 1224 |
+ <div class="table_top"> |
|
| 1225 |
+ <p> |
|
| 1226 |
+ 총 <span class="c_e40000" id="errorPopTotCnt">0</span>건 |
|
| 1227 |
+ / 중복 <span class="c_002c9a" id="errorPopDupCnt">0</span>건 |
|
| 1228 |
+ / 오류 <span class="c_002c9a" id="errorPopErrorCnt">0</span>건</p> |
|
| 1229 |
+ <button type="button" class="excel_btn btnType" id="errorExcelBtn"><i class="downroad"></i>엑셀 다운로드</button> |
|
| 1230 |
+ </div> |
|
| 1231 |
+ <div class="tb_wrap adr_list" id="tabulator_error"> |
|
| 1232 |
+ <!-- $tableError 참고 --> |
|
| 1233 |
+ </div> |
|
| 1234 |
+ <ul class="cf_text_ul"> |
|
| 1235 |
+ <li>*중복번호는 하나의 번호만 등록됩니다.</li> |
|
| 1236 |
+ <li>*휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.</li> |
|
| 1237 |
+ <li>ex) 발송불가 특수문자, 자릿수 오류 등</li> |
|
| 1238 |
+ </ul> |
|
| 1239 |
+ <div class="popup_btn_wrap2"> |
|
| 1240 |
+ <button type="button" class="tooltip-close" data-focus="adr_popup14-close" data-focus-next="adr_popup14">닫기</button> |
|
| 1241 |
+ </div> |
|
| 1242 |
+ </div> |
|
| 1446 | 1243 |
</div> |
| 1447 | 1244 |
</div> |
| 1448 |
-</form> |
|
| 1245 |
+</div> |
|
| 1449 | 1246 |
<!--// 주소록 대량등록 팝업 --> |
| 1450 | 1247 |
|
| 1451 | 1248 |
<div class="inner"> |
... | ... | @@ -1458,35 +1255,25 @@ |
| 1458 | 1255 |
<li class="tab"><button type="button" onclick="TabType5(this,'3'); moveTab('block');">수신거부</button></li>
|
| 1459 | 1256 |
<li class="tab"><button type="button" onclick="TabType5(this,'4'); moveTab('addrMob');">폰주소록 등록</button></li>
|
| 1460 | 1257 |
<li class="tab"><button type="button" onclick="TabType5(this,'5'); moveTab('addrApply');">주소록 입력 대행(무료)</button></li>
|
| 1461 |
- </ul><!--// tab button --> |
|
| 1258 |
+ </ul> |
|
| 1259 |
+ <!--// tab button --> |
|
| 1462 | 1260 |
<!-- 주소록 관리 - 주소록 관리 --> |
| 1463 | 1261 |
<div class="adr_cont current" id="tab5_1"> |
| 1464 | 1262 |
<div class="heading"> |
| 1465 | 1263 |
<h2>팩스 주소록 관리</h2> |
| 1466 | 1264 |
<button type="button" class="button info" onclick="infoPop('selectAddrList');">사용안내</button>
|
| 1467 | 1265 |
</div> |
| 1468 |
- <%--<div class="titBox"> |
|
| 1469 |
- <p>- 연락처를 그룹별로 분류하여 간편하고 편리하게 관리할 수 있습니다(최대 100,000개까지 등록 가능)</p> |
|
| 1470 |
- <p>- 그룹은 그룹 간 이동, 병합 및 복사가 가능합니다.</p> |
|
| 1471 |
- <p>- 주소록은 중복검사가 가능하며 중복된 연락처를 삭제할 수 있습니다. 단, 데이터 양에 따라 시간이 소요될 수 있습니다.</p> |
|
| 1472 |
- <p>- 주소록 관리에서 그룹 또는 연락처를 선택하여 문자를 바로 발송할 수 있습니다.</p> |
|
| 1473 |
- <p>- 주소록 내보내기를 통해 다른 ID로 주소록을 복사할 수 있습니다(그룹 전송만 가능, 보낸 주소록 결과는 최대 90일까지 보관)</p> |
|
| 1474 |
- <p>- 주소록 내보내기 시에는 개인정보보호를 위해 추가 팩스 인증을 실시하며, 팩스 인증은 등록된 발신번호로만 인증 가능합니다.</p> |
|
| 1475 |
- <p>- 고객님께서 보유하신 엑셀파일이나 텍스트파일 등으로 작성된 주소록을 대량 등록할 수 있습니다.</p> |
|
| 1476 |
- <p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p> |
|
| 1477 |
- <p>- 주소록 무료대행은 신규 그룹으로 생성됩니다(기존 그룹 수정 불가)</p> |
|
| 1478 |
- </div>--%> |
|
| 1479 |
- |
|
| 1480 | 1266 |
<div class="adr1"> |
| 1481 | 1267 |
<!-- 왼쪽 영역 --> |
| 1482 | 1268 |
<div class="adr1_left" id="adr1_left"></div> |
| 1483 | 1269 |
<!-- 오른쪽 영역 --> |
| 1484 |
- <div class="adr1_right" id="adr1_right"> |
|
| 1485 |
- </div> |
|
| 1270 |
+ <div class="adr1_right" id="adr1_right"></div> |
|
| 1486 | 1271 |
</div> |
| 1487 | 1272 |
</div> |
| 1488 |
- </div><!--// 주소록 관리 - 주소록 관리 --> |
|
| 1489 |
-</div><!--// send top --> |
|
| 1273 |
+ <!--// 주소록 관리 - 주소록 관리 --> |
|
| 1274 |
+ </div> |
|
| 1275 |
+ <!--// send top --> |
|
| 1276 |
+</div> |
|
| 1490 | 1277 |
|
| 1491 | 1278 |
<form name="popForm" id="popForm" method="post"> |
| 1492 | 1279 |
<input type="hidden" name="pageType" id="pageType" value=""/> |
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforClipboard.jsp
... | ... | @@ -0,0 +1,580 @@ |
| 1 | +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> | |
| 5 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> | |
| 6 | + | |
| 7 | +<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script> | |
| 8 | + | |
| 9 | +<script type="text/javascript"> | |
| 10 | +$(document).ready(function(){ | |
| 11 | + | |
| 12 | + // 중복 휴대폰번호 버튼 노출여부 | |
| 13 | +// $("#btnAddrMassDupli").hide(); | |
| 14 | +// $("#btnAddrMassSaveDupli").hide(); | |
| 15 | +}); | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | +function addrGroupLoadAjax(){ | |
| 21 | + $("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){}); | |
| 22 | + $("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){}); | |
| 23 | +} | |
| 24 | + | |
| 25 | + | |
| 26 | +function insertAddrGroupAjax() { | |
| 27 | + var form = document.addrGrpInsertForm; | |
| 28 | + if(form.addrGrpNm.value == "") { | |
| 29 | + alert("주소록 그룹명을 입력해주세요."); | |
| 30 | + return; | |
| 31 | + } | |
| 32 | + if(!confirm("주소록 그룹을 추가하시겠습니까?")) { | |
| 33 | + return; | |
| 34 | + } | |
| 35 | + var data = new FormData(form); | |
| 36 | + | |
| 37 | + $.ajax({ | |
| 38 | + cache : false, | |
| 39 | + url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", | |
| 40 | + type : 'POST', | |
| 41 | + data : data, | |
| 42 | + dataType:'json', | |
| 43 | + processData: false, | |
| 44 | + contentType: false, | |
| 45 | + success : function(returnData, status){ | |
| 46 | + if(status == "success") { | |
| 47 | + if("fail"==returnData.result){ | |
| 48 | + alert(returnData.message); | |
| 49 | + return; | |
| 50 | + } else if("dupl"==returnData.result) { | |
| 51 | + alert("중복된 그룹명입니다."); | |
| 52 | + return; | |
| 53 | + } | |
| 54 | + alert("등록되었습니다."); | |
| 55 | + listAddrGrp(); | |
| 56 | + addrGroupLoadAjax(); | |
| 57 | + | |
| 58 | + }else{ alert("ERROR!");return;} | |
| 59 | + }, | |
| 60 | + error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); } | |
| 61 | + }); | |
| 62 | + | |
| 63 | +} | |
| 64 | + | |
| 65 | +function insertAddrAjax() { | |
| 66 | + var selectVal = $("#addrRegistSelect option:selected").val(); | |
| 67 | + //alert(selectVal); | |
| 68 | + | |
| 69 | + var form = document.addrInsertForm; | |
| 70 | + /* | |
| 71 | + //필수값 아니어서 뺐음 | |
| 72 | + if(form.addrNm.value == "") { | |
| 73 | + alert("주소록 이름을 입력하세요"); | |
| 74 | + return; | |
| 75 | + } | |
| 76 | + */ | |
| 77 | + if(form.addrPhoneNo.value == "") { | |
| 78 | + alert("주소록 번호를 입력하세요"); | |
| 79 | + return; | |
| 80 | + } | |
| 81 | + //if(!confirm("주소록을 추가하시겠습니까?")) { | |
| 82 | + // return; | |
| 83 | + //} | |
| 84 | + | |
| 85 | + if(!checkHpNum(form.addrPhoneNo.value)){//휴대폰 유효성 검사 | |
| 86 | + if(!checkNorPhoneNum(form.addrPhoneNo.value)){//일반전화 유효성 검사 | |
| 87 | + | |
| 88 | + alert("잘못된 휴대폰번호 또는 일반전화 번호 입니다."); | |
| 89 | + return false; | |
| 90 | + | |
| 91 | + } | |
| 92 | + | |
| 93 | + } | |
| 94 | + | |
| 95 | + var data = new FormData(form); | |
| 96 | + | |
| 97 | + $.ajax({ | |
| 98 | + cache : false, | |
| 99 | + url : "<c:url value='/web/mjon/addr/insertAddrAjax.do' />", | |
| 100 | + type : 'POST', | |
| 101 | + data : data, | |
| 102 | + dataType:'json', | |
| 103 | + processData: false, | |
| 104 | + contentType: false, | |
| 105 | + success : function(returnData, status){ | |
| 106 | + if(status == "success") { | |
| 107 | + if("fail"==returnData.result){ | |
| 108 | + alert(returnData.message); | |
| 109 | + return; | |
| 110 | + } else if("dupl"==returnData.result){ | |
| 111 | + alert("해당 그룹에 중복된 번호가 있습니다."); | |
| 112 | + return; | |
| 113 | + } | |
| 114 | + //alert("저장 되었습니다."); | |
| 115 | + | |
| 116 | + listAddrGrp(); | |
| 117 | + addrGroupLoadAjax(); | |
| 118 | + addrLoadAjax(); | |
| 119 | + | |
| 120 | + // 주소록그룹 콤보박스 유지 | |
| 121 | + setTimeout(setSelectSetting, 500, selectVal); | |
| 122 | + | |
| 123 | + }else{ alert("ERROR!");return;} | |
| 124 | + }, | |
| 125 | + error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); } | |
| 126 | + }); | |
| 127 | + | |
| 128 | +} | |
| 129 | + | |
| 130 | +// 주소록그룹 콤보박스 유지 | |
| 131 | +function setSelectSetting(selectVal) { | |
| 132 | + $("#addrRegistSelect").val(selectVal).prop("selected", true); | |
| 133 | +} | |
| 134 | + | |
| 135 | +function linkPage(pageNo){ | |
| 136 | + if ($('#searchKeywordAddr').val() != "" && $('#searchKeywordAddr').val() != null && $('#searchKeywordAddr').val() != undefined) { | |
| 137 | + // 문자전송 검색용 | |
| 138 | + $("#msgStartKeyword").val(""); | |
| 139 | + } | |
| 140 | + | |
| 141 | + var searchForm = document.searchAddrForm; | |
| 142 | + searchForm.pageIndex.value = pageNo; | |
| 143 | + searchForm.pageUnit.value = $('#pageUnit').val(); | |
| 144 | + searchForm.searchCondition.value = $('#searchConditionAddr').val(); | |
| 145 | + searchForm.searchKeyword.value = $('#searchKeywordAddr').val(); | |
| 146 | + searchForm.startKeyword.value = $("#msgStartKeyword").val(); | |
| 147 | + | |
| 148 | + var sendData = $(document.searchAddrForm).serializeArray(); | |
| 149 | + $("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", sendData, function(response, status, xhr){tableAllChk();}); | |
| 150 | + addrGroupLoadAjax(); | |
| 151 | +} | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | +//############################################################################################# | |
| 156 | +//Tabulator | |
| 157 | +//############################################################################################# | |
| 158 | + | |
| 159 | +$(document).ready(function(){ | |
| 160 | + //Tabulator AJAX Data Loading | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + //전체 데이터 갯수 구하는 함수 | |
| 165 | + function updateTotCnt(data){ | |
| 166 | + | |
| 167 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 168 | + var tabluC = '.'+tabulNm | |
| 169 | + | |
| 170 | + $(tabluC+" #rowTotCnt").text(data); | |
| 171 | + | |
| 172 | + } | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + // 오류검사 항목 중복제거 | |
| 177 | + function SetTableErrorDupliCheck(sVal) { | |
| 178 | + var isDuplicate = false; | |
| 179 | + if (tableErrorCheckData.length == 0) { | |
| 180 | + tableErrorCheckData.push(sVal); | |
| 181 | + } | |
| 182 | + else { | |
| 183 | + for (var i = 0; i < tableErrorCheckData.length; i++) | |
| 184 | + { | |
| 185 | + if (tableErrorCheckData[i] == sVal) { | |
| 186 | + isDuplicate = true; | |
| 187 | + } | |
| 188 | + } | |
| 189 | + | |
| 190 | + if (isDuplicate) { | |
| 191 | + return; | |
| 192 | + } | |
| 193 | + else { | |
| 194 | + tableErrorCheckData.push(sVal); | |
| 195 | + } | |
| 196 | + } | |
| 197 | + } | |
| 198 | + | |
| 199 | + | |
| 200 | + // 오류검사 항목 중복제거 | |
| 201 | + function SetTableErrorDupliCheck(sVal) { | |
| 202 | + var isDuplicate = false; | |
| 203 | + if (tableErrorCheckData.length == 0) { | |
| 204 | + tableErrorCheckData.push(sVal); | |
| 205 | + } | |
| 206 | + else { | |
| 207 | + for (var i = 0; i < tableErrorCheckData.length; i++) | |
| 208 | + { | |
| 209 | + if (tableErrorCheckData[i] == sVal) { | |
| 210 | + isDuplicate = true; | |
| 211 | + } | |
| 212 | + } | |
| 213 | + | |
| 214 | + if (isDuplicate) { | |
| 215 | + return; | |
| 216 | + } | |
| 217 | + else { | |
| 218 | + tableErrorCheckData.push(sVal); | |
| 219 | + } | |
| 220 | + } | |
| 221 | + } | |
| 222 | + | |
| 223 | + $('.check_validity').click(function(){ | |
| 224 | + tableErrorCheckData.length = 0; // 오류 번호 배열 초기화 | |
| 225 | + | |
| 226 | + var data = $tableClip.getRows(); | |
| 227 | + var invalid = $tableClip.getInvalidCells(); //오류 데이터 체크 | |
| 228 | + var dataLen = $tableClip.getRows().length; //연락처 데이터 갯수 | |
| 229 | + var totLen = invalid.length; //오류 데이터 갯수 | |
| 230 | + var errMsg = ""; //최종 alert에 표시할 메시지 저장 변수 | |
| 231 | + | |
| 232 | + if(dataLen > 0) { //연락처 정보가 있으면 수행 | |
| 233 | + if(totLen > 0) { //내용에 오류가 있으면 수행 | |
| 234 | + //오류 데이터 값 저장 | |
| 235 | + for(var i=0; i < totLen; i++) { | |
| 236 | + var cellValue = invalid[i].getValue(); | |
| 237 | + SetTableErrorDupliCheck(cellValue); | |
| 238 | + } | |
| 239 | + | |
| 240 | + for(var i=0; i < dataLen; i++){ | |
| 241 | + // 휴대폰번호 체크 | |
| 242 | + var phone = data[i].getData().phone; | |
| 243 | + var valiCheck = checkHpNum(phone); | |
| 244 | + if(!valiCheck){ | |
| 245 | + SetTableErrorDupliCheck(phone); | |
| 246 | + } | |
| 247 | + } | |
| 248 | + } | |
| 249 | + else { | |
| 250 | + for(var i=0; i < dataLen; i++){ | |
| 251 | + // 휴대폰번호 체크 | |
| 252 | + var phone = data[i].getData().phone; | |
| 253 | + var valiCheck = checkHpNum(phone); | |
| 254 | + if(!valiCheck){ | |
| 255 | + SetTableErrorDupliCheck(phone); | |
| 256 | + } | |
| 257 | + } | |
| 258 | + } | |
| 259 | + } | |
| 260 | + else { | |
| 261 | + alert("연락처를 입력해 주세요."); | |
| 262 | + return false; | |
| 263 | + } | |
| 264 | + | |
| 265 | + if (tableErrorCheckData.length > 0) { | |
| 266 | + for (var i = 0; i < tableErrorCheckData.length; i++) | |
| 267 | + { | |
| 268 | + errMsg += tableErrorCheckData[i]; | |
| 269 | + if ((tableErrorCheckData.length - 1) > i) { | |
| 270 | + errMsg += ", "; | |
| 271 | + } | |
| 272 | + } | |
| 273 | + alert(errMsg + "의 내용에 오류가 있습니다."); | |
| 274 | + } | |
| 275 | + else { | |
| 276 | + alert("오류 데이터가 없습니다."); | |
| 277 | + } | |
| 278 | + | |
| 279 | + return false; | |
| 280 | + }); | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + //받는 사람 리스트 영역에 클립보드 데이터 가져와보기 | |
| 290 | + // 붙여넣기 기능 | |
| 291 | + $('#tabulator_clip').off('paste').on('paste', function (e) { | |
| 292 | +// fn_ClipMakeTable(); | |
| 293 | + fn_errorPopClean(); | |
| 294 | + fn_rowCntInit(); | |
| 295 | + resetTableFieldsToDefault(); | |
| 296 | + | |
| 297 | + var element = e.originalEvent.clipboardData.getData('text'); | |
| 298 | + var elmSplit = element.split("\n"); | |
| 299 | + var realPhone = []; | |
| 300 | + | |
| 301 | + for (var i = 0; i < elmSplit.length; i++) { | |
| 302 | + var splitStr = elmSplit[i].trim(); | |
| 303 | + if (splitStr === "") continue; // 공백 행 무시 | |
| 304 | + | |
| 305 | + var tabData = splitStr.split("\t"); | |
| 306 | + var comData = splitStr.split(","); | |
| 307 | + | |
| 308 | + var splitData = (tabData.length > 1) ? tabData : comData; | |
| 309 | + | |
| 310 | + if (splitData.length === 0) { | |
| 311 | + alert("탭 또는 콤마로 구분하여 데이터를 복사해 주세요."); | |
| 312 | + return false; | |
| 313 | + } | |
| 314 | + | |
| 315 | + let keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; | |
| 316 | + let data = {}; | |
| 317 | + splitData.forEach((item, index) => { | |
| 318 | + data[keys[index]] = item.trim() || ""; // 빈 문자열로 기본값 설정 | |
| 319 | + }); | |
| 320 | + realPhone.push(data); | |
| 321 | + } | |
| 322 | + | |
| 323 | + console.log('Parsed data:', realPhone); | |
| 324 | + console.log('Tabulator data before getData:', $tableClip.getData()); | |
| 325 | +// $tableClip.clearData(); | |
| 326 | + $tableClip.setData([{ | |
| 327 | + A: "", B: "", C: "", D: "", E: "", F: "", G: "" | |
| 328 | + }]); // 초기 데이터로 복원 | |
| 329 | + $tableClip.setData(realPhone); | |
| 330 | + var totRows = $tableClip.getDataCount(); | |
| 331 | + updateTotCnt(totRows); | |
| 332 | + console.log('Tabulator data after getData:', $tableClip.getData()); | |
| 333 | + }); | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | +}); | |
| 347 | + | |
| 348 | + | |
| 349 | +//체크박스 전체선택/해제 | |
| 350 | +$(document).on("click", "#chkAll", function(e) { | |
| 351 | + var isChecked = $(this).is(":checked"); | |
| 352 | + $("input[name=addrCheck]:checkbox").prop("checked", isChecked); | |
| 353 | +}); | |
| 354 | + | |
| 355 | +$(document).on("click", "#duplicationChkAll", function(e) { | |
| 356 | + var isChecked = $(this).is(":checked"); | |
| 357 | + $("input[name=addrCheck]:checkbox").prop("checked", isChecked); | |
| 358 | +}); | |
| 359 | + | |
| 360 | +//데이터 객체를 생성하는 함수 | |
| 361 | +function createDataObject(data) { | |
| 362 | + console.log('createDataObject : ', data); | |
| 363 | + return { | |
| 364 | + A: data.A, | |
| 365 | + B: data.B, | |
| 366 | + C: data.C, | |
| 367 | + D: data.D, | |
| 368 | + E: data.E, | |
| 369 | + F: data.F, | |
| 370 | + G: data.G | |
| 371 | + }; | |
| 372 | +} | |
| 373 | + | |
| 374 | + | |
| 375 | +// 중복 연락처 | |
| 376 | +function GetAddrMassDupli() { | |
| 377 | + var sHtml = ""; | |
| 378 | + sHtml += "<div class='' style='overflow-x:auto; height:350px;'>"; | |
| 379 | + sHtml += "<table class='tType4'>"; | |
| 380 | + sHtml += " <colgroup>"; | |
| 381 | + sHtml += " <col style='width:auto' />"; | |
| 382 | + sHtml += " </colgroup>"; | |
| 383 | + sHtml += " <thead>"; | |
| 384 | + sHtml += " <tr>"; | |
| 385 | + sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(dupliPhoneDataRealList.length) + "개)</th>"; | |
| 386 | + sHtml += " </tr>"; | |
| 387 | + sHtml += " </thead>"; | |
| 388 | + sHtml += " <tbody>"; | |
| 389 | + for (var i = 0; i < dupliPhoneDataRealList.length; i++) { | |
| 390 | + sHtml += " <tr>"; | |
| 391 | + sHtml += " <td>" + dupliPhoneDataRealList[i] + "</td>"; | |
| 392 | + sHtml += " </tr>"; | |
| 393 | + } | |
| 394 | + sHtml += " </tbody>"; | |
| 395 | + sHtml += " </table>"; | |
| 396 | + sHtml += " </div>"; | |
| 397 | + | |
| 398 | + $("#addrMassDupli_layer").html(sHtml); | |
| 399 | +} | |
| 400 | + | |
| 401 | + | |
| 402 | +</script> | |
| 403 | + | |
| 404 | + <!-- 붙여넣기 --> | |
| 405 | + <div class="popCont pop_more_cont" id="popCont_2"> | |
| 406 | + <div class="titBox"> | |
| 407 | + <p>- 엑셀(EXCEL), 텍스트(TXT) 파일로 작성된 주소록 내용을 복사하여 등록 가능합니다.</p> | |
| 408 | + <p>- 많은 양의 데이터를 입력하시려면 ‘주소록 복사(Ctrl+C) + 붙여넣기(Ctrl+V)’를 이용해주세요.</p> | |
| 409 | + <p>- 입력 내용은 (Tab) 또는 (,) 기호로 구분하여 입력하여야 합니다.</p> | |
| 410 | + <p>- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.</p> | |
| 411 | + <p>- 주소록 등록이 어려우신 경우에는 <a href="<c:url value='/web/mjon/addragency/selectAddrAgencyList.do'/>" style="font-weight: bold; color: blue;">주소록 입력대행</a> 메뉴를 이용하실 수 있습니다. </p> | |
| 412 | +<!-- <button type="button" class="txt_btn" onclick="location.href='/download/addr/주소록_대량등록.zip'"><i></i>TXT샘플 다운로드</button> --> | |
| 413 | + </div> | |
| 414 | + <div class="pop_more_wrap"> | |
| 415 | + <button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button> | |
| 416 | + </div> | |
| 417 | + </div><!--// 붙여넣기 --> | |
| 418 | + | |
| 419 | + <!-- 공통 --> | |
| 420 | + <div> | |
| 421 | + <table class="layer_tType1"> | |
| 422 | + <caption>엑셀입력 표</caption> | |
| 423 | + <colgroup> | |
| 424 | + <col style="width: 95px"> | |
| 425 | + <col style="width: auto"> | |
| 426 | + </colgroup> | |
| 427 | + <tbody> | |
| 428 | + <tr> | |
| 429 | + <th>그룹 선택</th> | |
| 430 | + <td> | |
| 431 | + <label for="" class="label">그룹 선택</label> | |
| 432 | + <select id="addrGrpIdInfo" name="addrGrpIdInfo"> | |
| 433 | + </select> | |
| 434 | + <label for="" class="label">그룹명 입력</label> | |
| 435 | + <input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;"> | |
| 436 | + | |
| 437 | + </td> | |
| 438 | + </tr> | |
| 439 | + </tbody> | |
| 440 | + </table> | |
| 441 | + </div> | |
| 442 | + <div class="excel_middle2"> | |
| 443 | + <p> | |
| 444 | + 총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 | |
| 445 | + / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건 | |
| 446 | + / 오류 <span class="c_002c9a fwBold" id="rowErrorCnt">0</span>건 | |
| 447 | + <button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button> | |
| 448 | + </p> | |
| 449 | + </div> | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + <div class="adr_excel" style="margin-top: 13px; overflow-x: auto;"> | |
| 455 | + <!-- thead --> | |
| 456 | + <div class="adr_hd select_adr_hd" data-group="tableClip"> | |
| 457 | + <div style="width: 80px;"></div> | |
| 458 | + <div style="width: 125px;"> | |
| 459 | + <label for="" class="label"></label> | |
| 460 | + <select class="field-selector"> | |
| 461 | + <option value="">선택하기</option> | |
| 462 | + <option value="addrNm">이름</option> | |
| 463 | + <option value="addrPhoneNo">휴대폰</option> | |
| 464 | + <option value="addrInfo1">[*1*]</option> | |
| 465 | + <option value="addrInfo2">[*2*]</option> | |
| 466 | + <option value="addrInfo3">[*3*]</option> | |
| 467 | + <option value="addrInfo4">[*4*]</option> | |
| 468 | + <option value="addrComment">메모</option> | |
| 469 | + </select> | |
| 470 | + </div> | |
| 471 | + <div style="width: 125px;"> | |
| 472 | + <label for="" class="label"></label> | |
| 473 | + <select class="field-selector"> | |
| 474 | + <option value="">선택하기</option> | |
| 475 | + <option value="addrNm">이름</option> | |
| 476 | + <option value="addrPhoneNo">휴대폰</option> | |
| 477 | + <option value="addrInfo1">[*1*]</option> | |
| 478 | + <option value="addrInfo2">[*2*]</option> | |
| 479 | + <option value="addrInfo3">[*3*]</option> | |
| 480 | + <option value="addrInfo4">[*4*]</option> | |
| 481 | + <option value="addrComment">메모</option> | |
| 482 | + </select> | |
| 483 | + </div> | |
| 484 | + <div style="width: 125px;"> | |
| 485 | + <label for="" class="label"></label> | |
| 486 | + <select class="field-selector"> | |
| 487 | + <option value="">선택하기</option> | |
| 488 | + <option value="addrNm">이름</option> | |
| 489 | + <option value="addrPhoneNo">휴대폰</option> | |
| 490 | + <option value="addrInfo1">[*1*]</option> | |
| 491 | + <option value="addrInfo2">[*2*]</option> | |
| 492 | + <option value="addrInfo3">[*3*]</option> | |
| 493 | + <option value="addrInfo4">[*4*]</option> | |
| 494 | + <option value="addrComment">메모</option> | |
| 495 | + </select> | |
| 496 | + </div> | |
| 497 | + <div style="width: 125px;"> | |
| 498 | + <label for="" class="label"></label> | |
| 499 | + <select class="field-selector"> | |
| 500 | + <option value="">선택하기</option> | |
| 501 | + <option value="addrNm">이름</option> | |
| 502 | + <option value="addrPhoneNo">휴대폰</option> | |
| 503 | + <option value="addrInfo1">[*1*]</option> | |
| 504 | + <option value="addrInfo2">[*2*]</option> | |
| 505 | + <option value="addrInfo3">[*3*]</option> | |
| 506 | + <option value="addrInfo4">[*4*]</option> | |
| 507 | + <option value="addrComment">메모</option> | |
| 508 | + </select> | |
| 509 | + </div> | |
| 510 | + <div style="width: 125px;"> | |
| 511 | + <label for="" class="label"></label> | |
| 512 | + <select class="field-selector"> | |
| 513 | + <option value="">선택하기</option> | |
| 514 | + <option value="addrNm">이름</option> | |
| 515 | + <option value="addrPhoneNo">휴대폰</option> | |
| 516 | + <option value="addrInfo1">[*1*]</option> | |
| 517 | + <option value="addrInfo2">[*2*]</option> | |
| 518 | + <option value="addrInfo3">[*3*]</option> | |
| 519 | + <option value="addrInfo4">[*4*]</option> | |
| 520 | + <option value="addrComment">메모</option> | |
| 521 | + </select> | |
| 522 | + </div> | |
| 523 | + <div style="width: 125px;"> | |
| 524 | + <label for="" class="label"></label> | |
| 525 | + <select class="field-selector"> | |
| 526 | + <option value="">선택하기</option> | |
| 527 | + <option value="addrNm">이름</option> | |
| 528 | + <option value="addrPhoneNo">휴대폰</option> | |
| 529 | + <option value="addrInfo1">[*1*]</option> | |
| 530 | + <option value="addrInfo2">[*2*]</option> | |
| 531 | + <option value="addrInfo3">[*3*]</option> | |
| 532 | + <option value="addrInfo4">[*4*]</option> | |
| 533 | + <option value="addrComment">메모</option> | |
| 534 | + </select> | |
| 535 | + </div> | |
| 536 | + <div style="width: 125px;"> | |
| 537 | + <label for="" class="label"></label> | |
| 538 | + <select class="field-selector"> | |
| 539 | + <option value="">선택하기</option> | |
| 540 | + <option value="addrNm">이름</option> | |
| 541 | + <option value="addrPhoneNo">휴대폰</option> | |
| 542 | + <option value="addrInfo1">[*1*]</option> | |
| 543 | + <option value="addrInfo2">[*2*]</option> | |
| 544 | + <option value="addrInfo3">[*3*]</option> | |
| 545 | + <option value="addrInfo4">[*4*]</option> | |
| 546 | + <option value="addrComment">메모</option> | |
| 547 | + </select> | |
| 548 | + </div> | |
| 549 | + </div> | |
| 550 | + </div> | |
| 551 | + | |
| 552 | + <div class="drag_drop_wrap callList_box" id="tabulator_clip"> | |
| 553 | + <img src="/publish/images/content/excel.jpg" style="width: 100%;"> | |
| 554 | + </div> | |
| 555 | + <div class="excel_middle"> | |
| 556 | + <div class="select_btnWrap clearfix"> | |
| 557 | + <div> | |
| 558 | + <button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button> | |
| 559 | + <button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button> | |
| 560 | +<!-- <button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button> --> | |
| 561 | +<!-- <button type="button" class="check_validity">오류 검사 <i></i></button> --> | |
| 562 | + <div class="error_hover_cont send_hover_cont addr_hover_cont"> | |
| 563 | + <p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p> | |
| 564 | + <span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span> | |
| 565 | + </div> | |
| 566 | + </div> | |
| 567 | + | |
| 568 | + </div> | |
| 569 | + </div><!--// 공통 --> | |
| 570 | + | |
| 571 | + <!-- 붙여놓기 설명 --> | |
| 572 | +<!-- <div class="req_area"> --> | |
| 573 | +<!-- <div class="text_box"> --> | |
| 574 | +<!-- - 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br> --> | |
| 575 | +<!-- - 휴대폰 번호는 필수입력 항목입니다.<br> --> | |
| 576 | +<!-- - 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br> --> | |
| 577 | +<!-- - 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br> --> | |
| 578 | +<!-- - '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다. --> | |
| 579 | +<!-- </div> --> | |
| 580 | +<!-- </div> --> |
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp
... | ... | @@ -0,0 +1,434 @@ |
| 1 | +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> | |
| 5 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> | |
| 6 | + | |
| 7 | +<%-- <script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script> --%> | |
| 8 | + | |
| 9 | +<script type="text/javascript"> | |
| 10 | + | |
| 11 | +$(document).ready(function(){ | |
| 12 | + | |
| 13 | + // 중복 휴대폰번호 버튼 노출여부 | |
| 14 | +// $("#btnAddrMassDupli").hide(); | |
| 15 | +// $("#btnAddrMassSaveDupli").hide(); | |
| 16 | +}); | |
| 17 | + | |
| 18 | + | |
| 19 | +function addrGroupLoadAjax(){ | |
| 20 | + $("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){}); | |
| 21 | + $("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){}); | |
| 22 | +} | |
| 23 | + | |
| 24 | + | |
| 25 | +function insertAddrGroupAjax() { | |
| 26 | + var form = document.addrGrpInsertForm; | |
| 27 | + if(form.addrGrpNm.value == "") { | |
| 28 | + alert("주소록 그룹명을 입력해주세요."); | |
| 29 | + return; | |
| 30 | + } | |
| 31 | + if(!confirm("주소록 그룹을 추가하시겠습니까?")) { | |
| 32 | + return; | |
| 33 | + } | |
| 34 | + var data = new FormData(form); | |
| 35 | + | |
| 36 | + $.ajax({ | |
| 37 | + cache : false, | |
| 38 | + url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", | |
| 39 | + type : 'POST', | |
| 40 | + data : data, | |
| 41 | + dataType:'json', | |
| 42 | + processData: false, | |
| 43 | + contentType: false, | |
| 44 | + success : function(returnData, status){ | |
| 45 | + if(status == "success") { | |
| 46 | + if("fail"==returnData.result){ | |
| 47 | + alert(returnData.message); | |
| 48 | + return; | |
| 49 | + } else if("dupl"==returnData.result) { | |
| 50 | + alert("중복된 그룹명입니다."); | |
| 51 | + return; | |
| 52 | + } | |
| 53 | + alert("등록되었습니다."); | |
| 54 | + listAddrGrp(); | |
| 55 | + addrGroupLoadAjax(); | |
| 56 | + | |
| 57 | + }else{ alert("ERROR!");return;} | |
| 58 | + }, | |
| 59 | + error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); } | |
| 60 | + }); | |
| 61 | +} | |
| 62 | + | |
| 63 | + | |
| 64 | +// 주소록그룹 콤보박스 유지 | |
| 65 | +function setSelectSetting(selectVal) { | |
| 66 | + $("#addrRegistSelect").val(selectVal).prop("selected", true); | |
| 67 | +} | |
| 68 | + | |
| 69 | +//############################################################################################# | |
| 70 | +//Tabulator | |
| 71 | +//############################################################################################# | |
| 72 | + | |
| 73 | +$(document).ready(function(){ | |
| 74 | + // 파일 선택 버튼 클릭 이벤트 | |
| 75 | + // 파일 입력 이벤트 | |
| 76 | + $("#excelFile").on("change", function(event) { | |
| 77 | + var fileInfo = event.target.files; | |
| 78 | + if(fileInfo.length > 0){ | |
| 79 | + excelFileChange(fileInfo[0]); | |
| 80 | + } else { | |
| 81 | + fn_loadRemoveActive(); // 파일이 선택되지 않은 경우 로딩 상태 제거 | |
| 82 | + $(this).val(''); // 파일 선택 초기화 | |
| 83 | + } | |
| 84 | + }); | |
| 85 | + | |
| 86 | + | |
| 87 | + //받는사람 오류번호 삭제 처리해주기 | |
| 88 | + $('.chkVali_del').click(function(){ | |
| 89 | + //기존 연락처 모두 불러오기 | |
| 90 | + var data = $tableExcel.getRows(); | |
| 91 | + var tableData = []; | |
| 92 | + var totLen = $tableExcel.getRows().length; | |
| 93 | + var errCnt = 0; | |
| 94 | + | |
| 95 | + if(totLen > 0){ | |
| 96 | + if(confirm("올바르지 않은 연락처 정보를 삭제 하시겠습니까?")){ | |
| 97 | + for(var i=0; i < totLen; i++){ | |
| 98 | + | |
| 99 | + | |
| 100 | + var phone = data[i].getData().phone; | |
| 101 | + var valiCheck = checkHpNum(phone); | |
| 102 | + if(valiCheck){ | |
| 103 | + 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}); | |
| 104 | + }else{ | |
| 105 | + errCnt++; | |
| 106 | + } | |
| 107 | + } | |
| 108 | + | |
| 109 | + var removeDuplData = dupliPhoneData(tableData); | |
| 110 | + | |
| 111 | + $tableExcel.setData(removeDuplData); | |
| 112 | + | |
| 113 | + //총 받는사람 수 계산 | |
| 114 | + totRows = $tableExcel.getRows().length; | |
| 115 | + updateTotCnt(totRows); | |
| 116 | + | |
| 117 | + if(errCnt > 0){ | |
| 118 | + alert(errCnt + " 건의 연락처를 삭제하였습니다."); | |
| 119 | + return false; | |
| 120 | + }else{ | |
| 121 | + alert("오류가 있는 연락처가 없습니다."); | |
| 122 | + } | |
| 123 | + } | |
| 124 | + }else{ | |
| 125 | + alert("연락처 정보를 입력해 주세요."); | |
| 126 | + return false; | |
| 127 | + } | |
| 128 | + }); | |
| 129 | + | |
| 130 | + | |
| 131 | + // 필드 선택 이벤트 핸들러 | |
| 132 | + $("#column-selector").on("change", function() { | |
| 133 | + let selectedField = $(this).val(); | |
| 134 | + let newValue = prompt("새 값을 입력하세요:"); | |
| 135 | + if (newValue !== null) { | |
| 136 | + updateTableField(selectedField, newValue); | |
| 137 | + } | |
| 138 | + }); | |
| 139 | +}); | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | +//############################################################################################# | |
| 145 | +//파일업로드 드래그앤 드롭 | |
| 146 | +//############################################################################################# | |
| 147 | +var objDragAndDrop = $(".upload_area"); | |
| 148 | +$(document).on("dragenter",".upload_area",function(e){ | |
| 149 | + e.stopPropagation(); | |
| 150 | + e.preventDefault(); | |
| 151 | +}); | |
| 152 | +$(document).on("dragover",".upload_area",function(e){ | |
| 153 | + e.stopPropagation(); | |
| 154 | + e.preventDefault(); | |
| 155 | +}); | |
| 156 | +$(document).on("drop",".upload_area",function(e){ | |
| 157 | + e.preventDefault(); | |
| 158 | + var files = e.originalEvent.dataTransfer.files; | |
| 159 | + excelFileChange(files[0]); | |
| 160 | +}); | |
| 161 | + | |
| 162 | +$(document).on('dragenter', function (e){ | |
| 163 | + e.stopPropagation(); | |
| 164 | + e.preventDefault(); | |
| 165 | +}); | |
| 166 | +$(document).on('dragover', function (e){ | |
| 167 | + e.stopPropagation(); | |
| 168 | + e.preventDefault(); | |
| 169 | +}); | |
| 170 | +$(document).on('drop', function (e){ | |
| 171 | + e.stopPropagation(); | |
| 172 | + e.preventDefault(); | |
| 173 | +}); | |
| 174 | +//파일 드래그앤드롭 종료 | |
| 175 | + | |
| 176 | +function excelFileChange(file) { | |
| 177 | + console.log(' :: excelFileChange :: '); | |
| 178 | + fn_errorPopClean(); // 에러 popup 초기화 | |
| 179 | + fn_rowCntInit(); | |
| 180 | + if (file) { | |
| 181 | + // 파일 크기 체크 (20MB) | |
| 182 | + const maxSize = 20 * 1024 * 1024; // 20MB in bytes | |
| 183 | + if (file.size > maxSize) { | |
| 184 | + alert('파일 크기는 20MB를 초과할 수 없습니다.'); | |
| 185 | + return; | |
| 186 | + } | |
| 187 | + | |
| 188 | + fn_loadAddActive(); | |
| 189 | + var reader = new FileReader(); | |
| 190 | + var extension = file.name.split('.').pop().toLowerCase(); | |
| 191 | + reader.onload = function(e) { | |
| 192 | + setTimeout(() => { // 파일 읽기 완료 후 실행되도록 함 | |
| 193 | + if (extension === 'xlsx') { | |
| 194 | + var data = new Uint8Array(e.target.result); | |
| 195 | + var workbook = XLSX.read(data, {type: 'array'}); | |
| 196 | + var firstSheet = workbook.Sheets[workbook.SheetNames[0]]; | |
| 197 | + var jsonData = XLSX.utils.sheet_to_json(firstSheet, {header: 1}); | |
| 198 | + processExcelData(jsonData); | |
| 199 | + } else if (extension === 'txt') { | |
| 200 | + var textData = e.target.result; | |
| 201 | + processTextData(textData); | |
| 202 | + } else { | |
| 203 | + alert('지원되지 않는 파일 형식입니다.'); | |
| 204 | + } | |
| 205 | + fn_loadRemoveActive(); | |
| 206 | + }, 0); // 지연 없이 즉시 실행되도록 0ms 지연을 설정 | |
| 207 | + }; | |
| 208 | + if (extension === 'xlsx') { | |
| 209 | + reader.readAsArrayBuffer(file); | |
| 210 | + } else if (extension === 'txt') { | |
| 211 | + reader.readAsText(file); | |
| 212 | + } | |
| 213 | + } | |
| 214 | +} | |
| 215 | + | |
| 216 | +// 엑셀 데이터 처리 함수 | |
| 217 | +function processExcelData(data) { | |
| 218 | + var keys = ['A', 'B', 'C']; | |
| 219 | + var tableData = []; | |
| 220 | + var totalRows = data.length - 2; // 전체 데이터 수 (1, 2행 제외) | |
| 221 | + | |
| 222 | + | |
| 223 | + // 1번째 행부터 입력 | |
| 224 | + data.forEach((row, index) => { | |
| 225 | + var rowData = {}; | |
| 226 | + keys.forEach((key, idx) => { // index 변수명 변경 (내부와 외부에서 사용되므로 충돌 방지) | |
| 227 | +// console.log('row[idx] : ', row[idx]); | |
| 228 | + rowData[key] = typeof row[idx] === 'string' ? row[idx].trim() : row[idx]; // 문자열인지 확인하고 trim() 적용 | |
| 229 | + }); | |
| 230 | + tableData.push(rowData); | |
| 231 | + }); | |
| 232 | + updateTable(tableData); | |
| 233 | +} | |
| 234 | + | |
| 235 | + | |
| 236 | +// 텍스트 데이터 처리 함수 | |
| 237 | +function processTextData(text) { | |
| 238 | + console.log(' :: processTextData :: '); | |
| 239 | + var lines = text.split('\n'); // 각 줄을 배열로 분리 | |
| 240 | + var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; | |
| 241 | + var tableData = []; | |
| 242 | + | |
| 243 | + lines.forEach(line => { | |
| 244 | + var rowData = {}; | |
| 245 | + var row = line.split(','); // 쉼표로 분리 | |
| 246 | + keys.forEach((key, index) => { | |
| 247 | + rowData[key] = row[index] ? row[index].trim() : ""; // 각 컬럼에 대해 기본값을 설정 | |
| 248 | + }); | |
| 249 | + tableData.push(rowData); | |
| 250 | + }); | |
| 251 | + | |
| 252 | + updateTable(tableData); | |
| 253 | +} | |
| 254 | + | |
| 255 | +//공통 테이블 업데이트 함수 | |
| 256 | +function updateTable(tableData) { | |
| 257 | + console.log(' :: updateTable :: '); | |
| 258 | + $tableExcel.setColumns([ // 열 정의를 다시 설정 | |
| 259 | + {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) { | |
| 260 | + cell.getRow().toggleSelect(); | |
| 261 | + }} | |
| 262 | + ,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40} | |
| 263 | + ,{title: "A", field: "A", hozAlign: "center", headerHozAlign: "center", width: 260, validator: ["maxLength:100", "string"]} | |
| 264 | + ,{title: "B", field: "B", hozAlign: "center", headerHozAlign: "center", width: 260, validator: ["maxLength:100", "string"]} | |
| 265 | + ,{title: "C", field: "C", hozAlign: "center", headerHozAlign: "center", width: 260, validator: ["maxLength:100", "string"]} | |
| 266 | + ]); | |
| 267 | + | |
| 268 | + $tableExcel.setData(tableData).then(() => { | |
| 269 | + // rowTotCnt 업데이트 | |
| 270 | + document.getElementById("rowTotCnt").innerText = tableData.length; | |
| 271 | + }); | |
| 272 | + | |
| 273 | + console.log(' :: fn_loadRemoveActive :: '); | |
| 274 | + fn_loadRemoveActive(); | |
| 275 | +} | |
| 276 | + | |
| 277 | + | |
| 278 | +//############################################################################################# | |
| 279 | +//등록 | |
| 280 | +//############################################################################################# | |
| 281 | + | |
| 282 | +// 주소록 그룹 중복체크 | |
| 283 | +function getAddrGroupDuplCheckAjax() { | |
| 284 | + var isReturn = true; | |
| 285 | + | |
| 286 | + $.ajax({ | |
| 287 | + url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />", | |
| 288 | + type : 'POST', | |
| 289 | + data : {"addrGrpNm" : $("#addrGrpNm").val()}, | |
| 290 | + dataType:'json', | |
| 291 | + async: false, // 동기 | |
| 292 | + success : function(data, status){ | |
| 293 | + if(data.isSuccess == true) { | |
| 294 | + if(data.isDupl == true) { | |
| 295 | + //alert("중복된 그룹명입니다."); | |
| 296 | + isReturn = false; | |
| 297 | + } | |
| 298 | + } | |
| 299 | + else { | |
| 300 | + //alert("Message : " + msg); | |
| 301 | + } | |
| 302 | + }, | |
| 303 | + error: function (e) { | |
| 304 | + //alert("주소록 중복체크에 실패했습니다."); | |
| 305 | + } | |
| 306 | + }); | |
| 307 | + | |
| 308 | + return isReturn; | |
| 309 | +} | |
| 310 | + | |
| 311 | + | |
| 312 | +//############################################################################################# | |
| 313 | +//파일 불러오기 | |
| 314 | +//############################################################################################# | |
| 315 | + | |
| 316 | +//엑섹불러오기 버튼 클릭시 파일 첨부 실행 | |
| 317 | +$(document).on('click', '.c3', function() { | |
| 318 | + $("#excelFile").click(); | |
| 319 | +}); | |
| 320 | + | |
| 321 | +//체크박스 전체선택/해제 | |
| 322 | +$(document).on("click", "#chkAll", function(e) { | |
| 323 | + var isChecked = $(this).is(":checked"); | |
| 324 | + $("input[name=addrCheck]:checkbox").prop("checked", isChecked); | |
| 325 | +}); | |
| 326 | + | |
| 327 | +$(document).on("click", "#duplicationChkAll", function(e) { | |
| 328 | + var isChecked = $(this).is(":checked"); | |
| 329 | + $("input[name=addrCheck]:checkbox").prop("checked", isChecked); | |
| 330 | +}); | |
| 331 | + | |
| 332 | +</script> | |
| 333 | + | |
| 334 | +<!-- 엑셀입력 --> | |
| 335 | +<div class="popCont current pop_more_cont" id="popCont_1"> | |
| 336 | + <div class="titBox"> | |
| 337 | + <p>- 엑셀(EXCEL) 파일로 주소록을 한 번에 최대 2만건까지 등록하여 간편하게 발송 및 관리하실 수 있습니다.</p> | |
| 338 | + <p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 작성하셔야 합니다.</p> | |
| 339 | + <p> ※ 팩스 번호는 지역번호(02, 031, 033 등), 타사부가번호(030*, 050*, 060, 070, 080, 1**)로 시작하는 번호만 발송 가능합니다. </p> | |
| 340 | + <p> ※ 주소록 관리 메뉴에서 다운로드 받으신 엑셀 파일 또한 업로드 양식에 맞추어 작성하셔야 하며, </p> | |
| 341 | + <p> 주소록에 이미 등록된 팩스 번호는 업데이트 되지 않으므로 기존 주소록에서 해당 팩스 번호를 삭제한 후 재등록해 주시기 바랍니다.</p> | |
| 342 | + <p>- 쉼표(,), 구분선(|), 역슬래시(\, ₩), 작은따옴표('), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.</p> | |
| 343 | + <p>- 팩스 번호는 필수입력 항목입니다.</p> | |
| 344 | + <p>- 팩스번호 형태는 02-1234-5678 또는 0212345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p> | |
| 345 | + <p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p> | |
| 346 | + <p>- 이름 20byte, 메모 250byte까지 입력 가능합니다.</p> | |
| 347 | + <p>- 첨부가능 파일 : xlsx, xls(최대용량 3MB)</p> | |
| 348 | + <p>- ‘오류 검사’를 통해 등록된 데이터에 팩스 번호 입력 오류를 확인하실 수 있습니다.</p> | |
| 349 | + <p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p> | |
| 350 | + </div> | |
| 351 | + <div class="pop_more_wrap"> | |
| 352 | + <button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button> | |
| 353 | + </div> | |
| 354 | +</div> | |
| 355 | +<!--// 엑셀입력 --> | |
| 356 | + | |
| 357 | +<!-- 공통 --> | |
| 358 | +<div> | |
| 359 | + <table class="layer_tType1"> | |
| 360 | + <caption>엑셀입력 표</caption> | |
| 361 | + <colgroup> | |
| 362 | + <col style="width: 95px"> | |
| 363 | + <col style="width: auto"> | |
| 364 | + </colgroup> | |
| 365 | + <tbody> | |
| 366 | + <tr> | |
| 367 | + <th>그룹 선택</th> | |
| 368 | + <td> | |
| 369 | + <label for="" class="label">그룹 선택</label> | |
| 370 | + <select id="addrGrpIdInfo" name="addrGrpIdInfo"> | |
| 371 | + </select> | |
| 372 | + <label for="" class="label">그룹명 입력</label> | |
| 373 | + <input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;"> | |
| 374 | + <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/> | |
| 375 | + <button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button> | |
| 376 | + </td> | |
| 377 | + </tr> | |
| 378 | + </tbody> | |
| 379 | + </table> | |
| 380 | +</div> | |
| 381 | +<div class="file_add upload_area"> | |
| 382 | + <p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요</p> | |
| 383 | +</div> | |
| 384 | +<div class="excel_middle2"> | |
| 385 | + <p> | |
| 386 | + 총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 | |
| 387 | + / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건 | |
| 388 | + / 오류 <span class="c_002c9a fwBold" id="rowErrorCnt">0</span>건 | |
| 389 | + <button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button> | |
| 390 | + </p> | |
| 391 | +</div> | |
| 392 | +<div class="adr_excel" style="margin-top: 13px; overflow-x:auto;"> | |
| 393 | + <!-- thead --> | |
| 394 | + <div class="adr_hd select_adr_hd" data-group="tableExcel"> | |
| 395 | + <div style="width:80px;"></div> | |
| 396 | + <div style="width:240px;"> | |
| 397 | + <label for="" class="label"></label> | |
| 398 | + <select class="field-selector"> | |
| 399 | + <option value="">선택하기</option> | |
| 400 | + <option value="addrNm">이름</option> | |
| 401 | + <option value="addrPhoneNo">팩스번호</option> | |
| 402 | + <option value="addrComment">메모</option> | |
| 403 | + </select> | |
| 404 | + </div> | |
| 405 | + <div style="width:240px;"> | |
| 406 | + <label for="" class="label"></label> | |
| 407 | + <select class="field-selector"> | |
| 408 | + <option value="">선택하기</option> | |
| 409 | + <option value="addrNm">이름</option> | |
| 410 | + <option value="addrPhoneNo">팩스번호</option> | |
| 411 | + <option value="addrComment">메모</option> | |
| 412 | + </select> | |
| 413 | + </div> | |
| 414 | + <div style="width:240px;"> | |
| 415 | + <label for="" class="label"></label> | |
| 416 | + <select class="field-selector"> | |
| 417 | + <option value="">선택하기</option> | |
| 418 | + <option value="addrNm">이름</option> | |
| 419 | + <option value="addrPhoneNo">팩스번호</option> | |
| 420 | + <option value="addrComment">메모</option> | |
| 421 | + </select> | |
| 422 | + </div> | |
| 423 | + </div> | |
| 424 | +</div> | |
| 425 | +<div class="drag_drop_wrap callList_box" id="tabulator_excel"></div> | |
| 426 | +<div class="excel_middle"> | |
| 427 | + <div class="select_btnWrap clearfix"> | |
| 428 | + <div> | |
| 429 | + <button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button> | |
| 430 | + <button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button> | |
| 431 | + </div> | |
| 432 | + </div> | |
| 433 | +</div> | |
| 434 | +<!--// 공통 --> (No newline at end of file) |
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforSelf.jsp
... | ... | @@ -0,0 +1,188 @@ |
| 1 | +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> | |
| 2 | +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
| 3 | +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> | |
| 4 | +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> | |
| 5 | +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> | |
| 6 | + | |
| 7 | +<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script> | |
| 8 | + | |
| 9 | +<script type="text/javascript"> | |
| 10 | + | |
| 11 | +$(document).ready(function(){ | |
| 12 | + //Tabulator AJAX Data Loading | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | +}); | |
| 17 | + | |
| 18 | + | |
| 19 | +$(document).on('change', '#addrGrpIdInfo', function() { | |
| 20 | + if ($("#addrGrpIdInfo option:selected").val() != "NEW") { | |
| 21 | + $("#addrGrpNm").val(""); // 새그룹명 Clear; | |
| 22 | + } | |
| 23 | +}); | |
| 24 | + | |
| 25 | +//############################################################################################# | |
| 26 | +//파일 불러오기 | |
| 27 | +//############################################################################################# | |
| 28 | + | |
| 29 | + | |
| 30 | +//체크박스 전체선택/해제 | |
| 31 | +$(document).on("click", "#chkAll", function(e) { | |
| 32 | + var isChecked = $(this).is(":checked"); | |
| 33 | + $("input[name=addrCheck]:checkbox").prop("checked", isChecked); | |
| 34 | +}); | |
| 35 | + | |
| 36 | +$(document).on("click", "#duplicationChkAll", function(e) { | |
| 37 | + var isChecked = $(this).is(":checked"); | |
| 38 | + $("input[name=addrCheck]:checkbox").prop("checked", isChecked); | |
| 39 | +}); | |
| 40 | + | |
| 41 | + | |
| 42 | +function fn_selfUpdataCount(value){ | |
| 43 | + | |
| 44 | + ////////////////////////////////////////////////////////////////////////// | |
| 45 | + | |
| 46 | + console.log('fn_selfUpdataCount(value) : ', value); | |
| 47 | + let errorCount = 0; // 중복 오류 | |
| 48 | + | |
| 49 | + const number = value; | |
| 50 | + const formattedNumber = formatPhoneNumber(number); // 번호 표준화 | |
| 51 | + const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김 | |
| 52 | + | |
| 53 | + var existingNumbers = []; // 중복 번호를 저장할 배열 | |
| 54 | + | |
| 55 | + // 모든 행의 'addrPhoneNo' 값을 배열에 추가 | |
| 56 | + var allRows = $tableSelf.getData(); // 테이블의 모든 데이터를 가져옴 | |
| 57 | + allRows.forEach(function(row) { | |
| 58 | + if (row.addrPhoneNo) { | |
| 59 | + const cleanedExistingNumber = row.addrPhoneNo.replace(/[^0-9]/g, ''); // 숫자만 남김 | |
| 60 | + existingNumbers.push(cleanedExistingNumber); // 기존 번호를 배열에 추가 | |
| 61 | + } | |
| 62 | + }); | |
| 63 | + | |
| 64 | + | |
| 65 | + // 중복제거한 데이터 구하기 | |
| 66 | + var dataList = new Set(existingNumbers); | |
| 67 | + | |
| 68 | + var totalCnt = dataList.size; | |
| 69 | + | |
| 70 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 71 | + var tabluC = '.'+tabulNm | |
| 72 | + | |
| 73 | + // 중복체크 | |
| 74 | + if (existingNumbers.length !== dataList.size) { | |
| 75 | + alert('중복된 값입니다 다시 입력해주세요.'); | |
| 76 | + return ''; | |
| 77 | + } | |
| 78 | + | |
| 79 | + if (!isValidPhoneNumber(formattedNumber)) { // 유효성 검사 | |
| 80 | + alert('휴대폰 형식에 맞지 않는 데이터입니다.\nex) 발송불가 특수문자, 자릿수 오류 등'); | |
| 81 | + $(tabluC+" #rowTotCnt").text(totalCnt-1); | |
| 82 | + return ''; | |
| 83 | + } | |
| 84 | + | |
| 85 | + | |
| 86 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 87 | + var tabluC = '.'+tabulNm | |
| 88 | + $(tabluC+" #rowTotCnt").text(totalCnt); | |
| 89 | + | |
| 90 | + return formattedNumber; | |
| 91 | +} | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | +</script> | |
| 96 | + | |
| 97 | + <!-- 붙여넣기 --> | |
| 98 | + <div class="popCont pop_more_cont" id="popCont_3"> | |
| 99 | + <div class="titBox"> | |
| 100 | +<!-- <p>- 엑셀(EXCEL), 텍스트(TXT) 파일로 작성된 주소록 내용을 복사하여 등록 가능합니다.</p> --> | |
| 101 | +<!-- <p>- 많은 양의 데이터를 입력하시려면 ‘주소록 복사(Ctrl+C) + 붙여넣기(Ctrl+V)’를 이용해주세요.</p> --> | |
| 102 | + <p>- 셀간 이동은 Tab으로 가능합니다.</p> | |
| 103 | + <p>- 핸드폰 번호를 입력하지 않은 행은 저장되지 않습니다.</p> | |
| 104 | + <p>- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.</p> | |
| 105 | + <p>- 주소록 등록이 어려우신 경우에는 <a href="<c:url value='/web/mjon/addragency/selectAddrAgencyList.do'/>" style="font-weight: bold; color: blue;">주소록 입력대행</a> 메뉴를 이용하실 수 있습니다. </p> | |
| 106 | +<!-- <button type="button" class="txt_btn" onclick="location.href='/download/addr/주소록_대량등록.zip'"><i></i>TXT샘플 다운로드</button> --> | |
| 107 | + </div> | |
| 108 | + <div class="pop_more_wrap"> | |
| 109 | + <button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button> | |
| 110 | + </div> | |
| 111 | + </div><!--// 붙여넣기 --> | |
| 112 | + | |
| 113 | + <!-- 공통 --> | |
| 114 | + <div> | |
| 115 | + <table class="layer_tType1"> | |
| 116 | + <caption>엑셀입력 표</caption> | |
| 117 | + <colgroup> | |
| 118 | + <col style="width: 95px"> | |
| 119 | + <col style="width: auto"> | |
| 120 | + </colgroup> | |
| 121 | + <tbody> | |
| 122 | + <tr> | |
| 123 | + <th>그룹 선택</th> | |
| 124 | + <td> | |
| 125 | + <label for="" class="label">그룹 선택</label> | |
| 126 | + <select id="addrGrpIdInfo" name="addrGrpIdInfo"> | |
| 127 | + </select> | |
| 128 | + <label for="" class="label">그룹명 입력</label> | |
| 129 | + <input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;"> | |
| 130 | + | |
| 131 | +<!-- <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" onchange="excelExport(event); return false;" style="display:none"/> --> | |
| 132 | + <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/> | |
| 133 | +<!-- <button type="button" id="file-load-trigger">Choose File</button> --> | |
| 134 | +<!-- <button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button> --> | |
| 135 | + </td> | |
| 136 | + </tr> | |
| 137 | + </tbody> | |
| 138 | + </table> | |
| 139 | + </div> | |
| 140 | + | |
| 141 | + <div class="excel_middle2"> | |
| 142 | + <p> | |
| 143 | + 총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 | |
| 144 | +<!-- / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건 --> | |
| 145 | +<!-- / 오류 <span class="c_002c9a fwBold" id="rowErrorCnt">0</span>건 --> | |
| 146 | +<!-- <button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button> --> | |
| 147 | +<!-- --> | |
| 148 | +<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" id="tableSelfDupliBtn">중복번호</button> --> | |
| 149 | +<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button> --> | |
| 150 | +<!-- --> | |
| 151 | +<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> --> | |
| 152 | + </p> | |
| 153 | +<!-- <button type="button" class="btnType btnType6 addCallToF">번호추가</button> --> | |
| 154 | + </div> | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + <div class="drag_drop_wrap callList_box" id="tabulator_self"> | |
| 161 | + <img src="/publish/images/content/excel.jpg" style="width: 100%;"> | |
| 162 | + </div> | |
| 163 | + <div class="excel_middle"> | |
| 164 | + <div class="select_btnWrap clearfix"> | |
| 165 | + <div> | |
| 166 | + <button type="button" class="self_all_del"><i class="remove_img"></i>전체삭제</button> | |
| 167 | + <button type="button" class="self_select_del"><i class="remove_img"></i>선택삭제</button> | |
| 168 | +<!-- <button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button> --> | |
| 169 | +<!-- <button type="button" class="check_validity">오류 검사 <i></i></button> --> | |
| 170 | + <div class="error_hover_cont send_hover_cont addr_hover_cont"> | |
| 171 | + <p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p> | |
| 172 | + <span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span> | |
| 173 | + </div> | |
| 174 | + </div> | |
| 175 | + | |
| 176 | + </div> | |
| 177 | + </div><!--// 공통 --> | |
| 178 | + | |
| 179 | + <!-- 붙여놓기 설명 --> | |
| 180 | +<!-- <div class="req_area"> --> | |
| 181 | +<!-- <div class="text_box"> --> | |
| 182 | +<!-- - 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br> --> | |
| 183 | +<!-- - 휴대폰 번호는 필수입력 항목입니다.<br> --> | |
| 184 | +<!-- - 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br> --> | |
| 185 | +<!-- - 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br> --> | |
| 186 | +<!-- - '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다. --> | |
| 187 | +<!-- </div> --> | |
| 188 | +<!-- </div> --> |
--- src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
... | ... | @@ -3381,10 +3381,10 @@ |
| 3381 | 3381 |
</div> |
| 3382 | 3382 |
<div class="put_right"> |
| 3383 | 3383 |
<div class="btn_popup_wrap spc_wrap"> |
| 3384 |
- <button type="button" data-tooltip="popup06" class="btnType btnType7 popupAddr">주소록 불러오기</button> |
|
| 3384 |
+ <button type="button" data-tooltip="popup06" class="btnType btnType7 popupAddr">주소록 불러오기</button> |
|
| 3385 | 3385 |
</div> |
| 3386 | 3386 |
<div class="btn_popup_wrap"> |
| 3387 |
- <button type="button" data-tooltip="popup02" class="btnType btnType7">엑셀 불러오기</button> |
|
| 3387 |
+ <button type="button" data-tooltip="popup02" class="btnType btnType7">엑셀 불러오기</button> |
|
| 3388 | 3388 |
</div> |
| 3389 | 3389 |
<div class="btn_popup_wrap"> |
| 3390 | 3390 |
<button type="button" data-tooltip="popup03" class="btnType btnType7 tab1">최근 전송내역</button> |
+++ src/main/webapp/js/web/addr/fax/faxEvent.js
... | ... | @@ -0,0 +1,446 @@ |
| 1 | +$(document).ready(function(){ | |
| 2 | + //타이틀 select 선택 이벤트 | |
| 3 | + $('[data-group]').on('change', '.field-selector', function() { | |
| 4 | + | |
| 5 | + fn_loadAddActive(); | |
| 6 | + | |
| 7 | + var group = $(this).closest('[data-group]').data('group'); | |
| 8 | + var selectedFields = []; | |
| 9 | + var isDuplicate = false; | |
| 10 | + | |
| 11 | + // 타불 객체 가져오기 | |
| 12 | + var $objTabul = fn_utils_getTabulator(); | |
| 13 | + | |
| 14 | + console.log('$objTabul : ', $objTabul); | |
| 15 | + | |
| 16 | + if($objTabul.getData().length < 1){ | |
| 17 | + alert('데이터 입력 후 선택해 주세요.'); | |
| 18 | + $(this).val(""); | |
| 19 | + fn_loadRemoveActive(); | |
| 20 | + return false; | |
| 21 | + } | |
| 22 | + | |
| 23 | + // 중복체크 | |
| 24 | + $('[data-group="' + group + '"] .field-selector').each(function() { | |
| 25 | + var selectedField = $(this).val(); | |
| 26 | + if (selectedField) { | |
| 27 | + if (selectedFields.includes(selectedField)) { | |
| 28 | + alert("중복된 필드를 선택할 수 없습니다."); | |
| 29 | + $(this).val(""); // 중복 필드를 선택한 경우 빈 값으로 초기화 | |
| 30 | + isDuplicate = true; | |
| 31 | + return false; // 반복문 종료 | |
| 32 | + } | |
| 33 | + selectedFields.push(selectedField); | |
| 34 | + } | |
| 35 | + }); | |
| 36 | + | |
| 37 | + // 데이터 넣기 | |
| 38 | + updateTableFields($objTabul, group); | |
| 39 | + | |
| 40 | + // 필드가 휴대폰이면 열 중복체크 | |
| 41 | + if($(this).val() == 'addrPhoneNo'){ | |
| 42 | + fn_phoneDupl($objTabul); | |
| 43 | + } | |
| 44 | + | |
| 45 | + fn_loadRemoveActive(); | |
| 46 | + }); | |
| 47 | + | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * @ 핸드폰 중복 데이터 | |
| 51 | + * */ | |
| 52 | + function fn_phoneDupl($objTabul) { | |
| 53 | + | |
| 54 | + $tableError.clearData(); | |
| 55 | + | |
| 56 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 57 | + var tabluC = '.'+tabulNm | |
| 58 | + | |
| 59 | + var data = $objTabul.getData(); | |
| 60 | + var phoneNumberChk = false; | |
| 61 | + var existingNumbers = new Set(); // 배열에서 Set으로 변경 | |
| 62 | + | |
| 63 | + let errorCount = 0; // 중복 번호 개수를 저장할 변수 | |
| 64 | + let duplicateCount = 0; // 중복 번호 개수를 저장할 변수 | |
| 65 | + | |
| 66 | + const errors = []; // 오류 데이터를 저장할 배열 | |
| 67 | + const newData = []; // 유효한 데이터만 저장할 새로운 배열 | |
| 68 | + | |
| 69 | + data.forEach((row, index) => { | |
| 70 | + | |
| 71 | + const number = row.addrPhoneNo; | |
| 72 | + | |
| 73 | + // number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리 | |
| 74 | + if (!number || (typeof number === 'string' && !number.trim())){ | |
| 75 | + console.log("number : ", number); | |
| 76 | + return; | |
| 77 | + } | |
| 78 | + | |
| 79 | + const formattedNumber = formatPhoneNumber(number); // 번호 표준화 | |
| 80 | + const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김 | |
| 81 | + | |
| 82 | + if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크 | |
| 83 | + if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사 | |
| 84 | + row.addrPhoneNo = formattedNumber; | |
| 85 | + existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가 | |
| 86 | + newData.push(row); // 유효한 데이터만 새로운 배열에 추가 | |
| 87 | + } else { | |
| 88 | + // 오류: 유효성 통과 못함 | |
| 89 | + errorCount++; | |
| 90 | + | |
| 91 | + errors.push({ | |
| 92 | + name: row.addrNm, // 이름 | |
| 93 | + phone: row.addrPhoneNo, // 폰번호 | |
| 94 | + result: "오류" // 결과 메시지 추가 | |
| 95 | + }); | |
| 96 | + } | |
| 97 | + } else { | |
| 98 | + // 중복 | |
| 99 | + duplicateCount++; | |
| 100 | + | |
| 101 | + errors.push({ | |
| 102 | + name: row.addrNm, // 이름 | |
| 103 | + phone: row.addrPhoneNo, // 폰번호 | |
| 104 | + result: "중복" // 결과 메시지 추가 | |
| 105 | + }); | |
| 106 | + } | |
| 107 | + }); | |
| 108 | + | |
| 109 | + // data 배열을 newData 배열로 대체 | |
| 110 | + data = newData; | |
| 111 | + | |
| 112 | + // 수정된 데이터로 테이블 업데이트 | |
| 113 | + $objTabul.setData(data); | |
| 114 | + | |
| 115 | + $(tabluC+" #rowTotCnt").text($objTabul.getDataCount()); | |
| 116 | + // 중복 카운트 | |
| 117 | + $(tabluC+" #rowDupCnt").text(duplicateCount); | |
| 118 | + // 에러 카운트 | |
| 119 | + $(tabluC+" #rowErrorCnt").text(errorCount); | |
| 120 | + | |
| 121 | + // popup 영역 | |
| 122 | + $("#errorPopTotCnt").text($objTabul.getDataCount()); | |
| 123 | + // 중복 카운트 | |
| 124 | + $("#errorPopDupCnt").text(duplicateCount); | |
| 125 | + // 에러 카운트 | |
| 126 | + $("#errorPopErrorCnt").text(errorCount); | |
| 127 | + // | |
| 128 | +// $("#errorPopTotCnt").text(duplicateCount+errorCount); | |
| 129 | + | |
| 130 | + | |
| 131 | + // 오류 및 중복 데이터를 한 번에 추가 | |
| 132 | + $tableError.setData(errors); | |
| 133 | + | |
| 134 | + if(errorCount > 0){ | |
| 135 | + alert('휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.\nex) 발송불가 특수문자, 자릿수 오류 등'); | |
| 136 | + } | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + } | |
| 141 | + /* | |
| 142 | + function fn_phoneDupl_old($objTabul) { | |
| 143 | + var data = $objTabul.getData(); | |
| 144 | + var uniquePhones = new Set(); | |
| 145 | + var rowsToKeep = []; | |
| 146 | + var rowsToDelete = []; | |
| 147 | + var phoneNumberChk = false; | |
| 148 | + | |
| 149 | + | |
| 150 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 151 | + var tabluC = '.'+tabulNm | |
| 152 | + | |
| 153 | + data.forEach((row, index) => { | |
| 154 | + | |
| 155 | + if (!isValidKoreanPhoneNumber(row.addrPhoneNo)) { | |
| 156 | + phoneNumberChk = true | |
| 157 | + return false; | |
| 158 | + } | |
| 159 | + | |
| 160 | + if (uniquePhones.has(row.addrPhoneNo)) { | |
| 161 | + rowsToDelete.push(index); // 중복된 행의 인덱스를 기록 | |
| 162 | + } else { | |
| 163 | + uniquePhones.add(row.addrPhoneNo); | |
| 164 | + rowsToKeep.push(row); // 고유한 데이터만 추가 | |
| 165 | + } | |
| 166 | + }); | |
| 167 | + | |
| 168 | + if(phoneNumberChk){ | |
| 169 | + alert('휴대폰 형식에 맞지 않는 데이터가 있습니다.\n 확인해 주세요'); | |
| 170 | + } | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + // 중복된 행 삭제 | |
| 175 | + rowsToDelete.reverse().forEach(index => { | |
| 176 | + $objTabul.deleteRow(index); | |
| 177 | + }); | |
| 178 | + | |
| 179 | + // 고유한 데이터만 남기고 테이블 업데이트 | |
| 180 | + $objTabul.setData(rowsToKeep); | |
| 181 | + $(tabluC+" #rowTotCnt").text(rowsToKeep.length); | |
| 182 | + }*/ | |
| 183 | + | |
| 184 | + //받는사람 전체삭제 버튼 처리 | |
| 185 | + $('.all_del').click(function(){ | |
| 186 | + | |
| 187 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 188 | + var tabluC = '.'+tabulNm | |
| 189 | + | |
| 190 | + var $objTabul = fn_utils_getTabulator(); | |
| 191 | + | |
| 192 | + $objTabul.clearData(); | |
| 193 | + fn_rowCntInit(); | |
| 194 | + | |
| 195 | + // select box 초기화 | |
| 196 | + $('.field-selector').each(function() { $(this).val(''); }); | |
| 197 | + }); | |
| 198 | + | |
| 199 | + // 받는사람 선택삭제 버튼 처리해주기 | |
| 200 | + $('.select_del').click(function(){ | |
| 201 | + | |
| 202 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 203 | + var tabluC = '.'+tabulNm | |
| 204 | + | |
| 205 | + var $objTabul = fn_utils_getTabulator(); | |
| 206 | + | |
| 207 | + $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 | |
| 208 | + var selectedData = $objTabul.getSelectedRows(); | |
| 209 | + | |
| 210 | + if(selectedData == "" || selectedData == null){ | |
| 211 | + alert("삭제할 데이터를 선택해 주세요."); | |
| 212 | + return false; | |
| 213 | + }else{ // 선택한 Row 데이터 삭제하기 | |
| 214 | + for(var i=0; i < selectedData.length; i++){ | |
| 215 | + selectedData[i].delete(); | |
| 216 | + } | |
| 217 | + } | |
| 218 | + | |
| 219 | + totRows = $objTabul.getRows().length; | |
| 220 | + | |
| 221 | + updateTotCnt(totRows); | |
| 222 | + }); | |
| 223 | + | |
| 224 | + | |
| 225 | + //받는사람 전체삭제 버튼 처리 | |
| 226 | + $('.self_all_del').click(function(){ | |
| 227 | + | |
| 228 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 229 | + var tabluC = '.'+tabulNm | |
| 230 | + | |
| 231 | + var $objTabul = fn_utils_getTabulator(); | |
| 232 | + | |
| 233 | + // 초기화 및 데이터 추가를 한번에 처리 | |
| 234 | + var newTableData = []; | |
| 235 | + | |
| 236 | + // 1000개의 빈 행을 미리 준비 | |
| 237 | + for (var i = 0; i < 1000; i++) { | |
| 238 | + newTableData.push({ | |
| 239 | + addrNm: "", | |
| 240 | + addrPhoneNo: "", | |
| 241 | + addrInfo1: "", | |
| 242 | + addrInfo2: "", | |
| 243 | + addrInfo3: "", | |
| 244 | + addrInfo4: "", | |
| 245 | + addrComment: "" | |
| 246 | + }); | |
| 247 | + } | |
| 248 | + | |
| 249 | + // 기존 데이터 초기화 후, 새로운 데이터를 한 번에 추가 | |
| 250 | + $objTabul.setData(newTableData); | |
| 251 | + | |
| 252 | + // 행 수 초기화 함수 호출 | |
| 253 | + fn_rowCntInit(); | |
| 254 | + }); | |
| 255 | + | |
| 256 | + // 직접입력 받는사람 선택삭제 버튼 처리해주기 | |
| 257 | + $('.self_select_del').click(function(){ | |
| 258 | + | |
| 259 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 260 | + var tabluC = '.'+tabulNm | |
| 261 | + | |
| 262 | + var $objTabul = fn_utils_getTabulator(); | |
| 263 | + | |
| 264 | + $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 | |
| 265 | + var selectedData = $objTabul.getSelectedRows(); | |
| 266 | + | |
| 267 | + if(selectedData == "" || selectedData == null){ | |
| 268 | + alert("삭제할 데이터를 선택해 주세요."); | |
| 269 | + return false; | |
| 270 | + }else{ // 선택한 Row 데이터 삭제하기 | |
| 271 | + for(var i=0; i < selectedData.length; i++){ | |
| 272 | + selectedData[i].delete(); | |
| 273 | + } | |
| 274 | + } | |
| 275 | + | |
| 276 | + // 남은 행 수 계산 | |
| 277 | + var totRows = $objTabul.getRows().length; | |
| 278 | + | |
| 279 | + // 1000개 행이 되도록 나머지 행 생성 | |
| 280 | + for (var i = totRows; i < 1000; i++) { | |
| 281 | + $objTabul.addRow({addrNm: "", addrPhoneNo: "", addrInfo1: "", addrInfo2: "", addrInfo3: "", addrInfo4: "", addrComment: ""}); | |
| 282 | + } | |
| 283 | + | |
| 284 | + | |
| 285 | + var existingNumbers = []; // 중복 번호를 저장할 배열 | |
| 286 | + // 모든 행의 'addrPhoneNo' 값을 배열에 추가 | |
| 287 | + var allRows = $tableSelf.getData(); // 테이블의 모든 데이터를 가져옴 | |
| 288 | + allRows.forEach(function(row) { | |
| 289 | + if (row.addrPhoneNo) { | |
| 290 | + const cleanedExistingNumber = row.addrPhoneNo.replace(/[^0-9]/g, ''); // 숫자만 남김 | |
| 291 | + existingNumbers.push(cleanedExistingNumber); // 기존 번호를 배열에 추가 | |
| 292 | + } | |
| 293 | + }); | |
| 294 | + updateTotCnt(existingNumbers.length); | |
| 295 | + }); | |
| 296 | + | |
| 297 | + //전체 데이터 갯수 구하는 함수 | |
| 298 | + function updateTotCnt(data){ | |
| 299 | + | |
| 300 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 301 | + var tabluC = '.'+tabulNm | |
| 302 | + | |
| 303 | + $(tabluC+" #rowTotCnt").text(data); | |
| 304 | + | |
| 305 | + } | |
| 306 | + | |
| 307 | + /* | |
| 308 | + * 타이틀 select 선택할때마다 실행해서 | |
| 309 | + * 데이터테이블 필드값 수정 | |
| 310 | + */ | |
| 311 | + function updateTableFields($objTabul, group) { | |
| 312 | + // 데이터가져오기 | |
| 313 | + var currentData = $objTabul.getData(); | |
| 314 | + | |
| 315 | + // 필드 초기 값 셋팅 | |
| 316 | + var columns = [ | |
| 317 | + {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) { | |
| 318 | + cell.getRow().toggleSelect(); | |
| 319 | + }} | |
| 320 | + ,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40} | |
| 321 | + ]; | |
| 322 | + | |
| 323 | + var fieldMapping = []; | |
| 324 | + // 초기 후 필드 값 셋팅하기 | |
| 325 | + $('[data-group="' + group + '"] .field-selector').each(function(index) { | |
| 326 | + var selectedField = $(this).val(); | |
| 327 | + // ASCII 문자 코드 사용 - 65=A, 66=B ... | |
| 328 | + var field = String.fromCharCode(65 + index); | |
| 329 | + if (selectedField) { | |
| 330 | + columns.push({ | |
| 331 | + title: field | |
| 332 | + , field: selectedField | |
| 333 | + , hozAlign: "center" | |
| 334 | + , headerHozAlign: "center" | |
| 335 | +// , editor: "input" | |
| 336 | + , editor: false | |
| 337 | + , width: 125 | |
| 338 | + , validator: ["maxLength:100", "string"] | |
| 339 | + }); | |
| 340 | + fieldMapping.push(selectedField); | |
| 341 | + } else { | |
| 342 | + columns.push({ | |
| 343 | + title: field | |
| 344 | + , field: field | |
| 345 | + , hozAlign: "center" | |
| 346 | + , headerHozAlign: "center" | |
| 347 | +// , editor: "input" | |
| 348 | + , editor: false | |
| 349 | + , width: 125 | |
| 350 | + , validator: ["maxLength:100", "string"] | |
| 351 | + }); | |
| 352 | + fieldMapping.push(field); | |
| 353 | + } | |
| 354 | + }); | |
| 355 | + | |
| 356 | + // 데이터 셋팅 | |
| 357 | + var updatedData = currentData.map(row => { | |
| 358 | + var newRow = {}; | |
| 359 | + fieldMapping.forEach((field, index) => { | |
| 360 | + newRow[field] = row[Object.keys(row)[index]] || ""; | |
| 361 | + }); | |
| 362 | + return newRow; | |
| 363 | + }); | |
| 364 | + | |
| 365 | + $objTabul.setColumns(columns); | |
| 366 | + $objTabul.setData(updatedData); | |
| 367 | + } | |
| 368 | +}); | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | +// 주소록 에러결과 초기화 | |
| 374 | +function fn_errorPopClean(){ | |
| 375 | + | |
| 376 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 377 | + var tabluC = '.'+tabulNm | |
| 378 | + | |
| 379 | + // popup 영역 | |
| 380 | + $tableError.clearData(); | |
| 381 | + | |
| 382 | + | |
| 383 | + // 중복 카운트 | |
| 384 | + $("#errorPopDupCnt").text(0); | |
| 385 | + // 에러 카운트 | |
| 386 | + $("#errorPopErrorCnt").text(0); | |
| 387 | + // | |
| 388 | + $("#errorPopTotCnt").text(0); | |
| 389 | + | |
| 390 | + // select box 초기화 | |
| 391 | + $(tabluC+' .field-selector').each(function() { $(this).val(''); }); | |
| 392 | + | |
| 393 | +} | |
| 394 | + | |
| 395 | +function fn_rowCntInit(){ | |
| 396 | + | |
| 397 | + var tabulNm = fn_utils_getTabulatorNm(); | |
| 398 | + var tabluC = '.'+tabulNm | |
| 399 | + | |
| 400 | + $(tabluC+" #rowTotCnt").text(0); //총건수 수정 | |
| 401 | + $(tabluC+" #rowDupCnt").text(0); //중복건수 수정 | |
| 402 | + $(tabluC+" #rowErrorCnt").text(0); //중복건수 수정 | |
| 403 | +} | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | +//1. 필드 초기화 함수 | |
| 408 | +function resetTableFieldsToDefault() { | |
| 409 | + | |
| 410 | + // 타불 객체 가져오기 | |
| 411 | + var $objTabul = fn_utils_getTabulator(); | |
| 412 | + | |
| 413 | + // 필드를 A, B, C, D로 초기화 | |
| 414 | + var defaultFields = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; | |
| 415 | + | |
| 416 | + // 테이블의 기존 데이터를 가져옵니다. | |
| 417 | + var currentData = $objTabul.getData(); | |
| 418 | + | |
| 419 | + // 초기 필드(A, B, C, D 등)를 위한 열 설정 | |
| 420 | + var columns = [ | |
| 421 | + {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) { | |
| 422 | + cell.getRow().toggleSelect(); | |
| 423 | + }}, | |
| 424 | + {formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40} | |
| 425 | + ]; | |
| 426 | + | |
| 427 | + // 기본 필드로 열 구성 | |
| 428 | + defaultFields.forEach(field => { | |
| 429 | + columns.push({ | |
| 430 | + title: field, | |
| 431 | + field: field, | |
| 432 | + hozAlign: "center", | |
| 433 | + headerHozAlign: "center", | |
| 434 | + editor: false, // 편집 비활성화 | |
| 435 | + width: 125, | |
| 436 | + validator: ["maxLength:100", "string"] | |
| 437 | + }); | |
| 438 | + }); | |
| 439 | + | |
| 440 | + // 테이블을 기본 필드로 업데이트 | |
| 441 | + $objTabul.setColumns(columns); | |
| 442 | +// $objTabul.setData(updatedData); | |
| 443 | +} | |
| 444 | + | |
| 445 | + | |
| 446 | + |
+++ src/main/webapp/js/web/addr/fax/faxTabulator.js
... | ... | @@ -0,0 +1,93 @@ |
| 1 | + | |
| 2 | + | |
| 3 | +var tableErrorData = []; | |
| 4 | +var tableErrorCheckData = []; | |
| 5 | +var addrMassDupliSaveList = null; | |
| 6 | + | |
| 7 | +var gArrRestartIndex = 0; //배열 재시작카운드 | |
| 8 | +var gNameList = []; //치환문자 이름 | |
| 9 | +var gPhoneList = []; //받는사람 | |
| 10 | +var gMemoList = []; //메모 | |
| 11 | + | |
| 12 | +var $tableExcel = null; //엑셀입력 탭 | |
| 13 | +var $tableClip = null; //붙여넣기 탭 | |
| 14 | +var $tableSelf = null; //직접입력 탭 | |
| 15 | +var $tableError = null; //에러 팝업 영역 | |
| 16 | + | |
| 17 | + | |
| 18 | +$(document).ready(function(){ | |
| 19 | + | |
| 20 | + //excel 파일 불러오기 tabulator | |
| 21 | + $tableExcel = new Tabulator("#tabulator_excel", { | |
| 22 | + height:"255px", | |
| 23 | + width:"100%", | |
| 24 | + layout:"fitColumns", | |
| 25 | + autoColumns:false, | |
| 26 | + headerHozAlign:"center", | |
| 27 | + validationMode:"highlight", | |
| 28 | + clipboard:false, | |
| 29 | + clipboardCopySelector:"table", | |
| 30 | + clipboardPasteAction:"insert", // insert, update, replace | |
| 31 | + placeholder:"Excel 파일을 업로드 해주세요.", //fit columns to width of table (optional) | |
| 32 | + columns:[ //Define Table Columns | |
| 33 | + {formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", width:50, headerSort:false, cellClick:function(e, cell){ | |
| 34 | + cell.getRow().toggleSelect(); | |
| 35 | + }} | |
| 36 | + ,{formatter:"rownum", hozAlign:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:100} | |
| 37 | + ,{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]} | |
| 38 | + ,{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]} | |
| 39 | + ,{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]} | |
| 40 | + ], | |
| 41 | + validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 | |
| 42 | + var valid = cell.isValid(); | |
| 43 | + if(!valid){ | |
| 44 | + alert("양식에 맞지 않는 정보가 입력되었습니다."); | |
| 45 | + | |
| 46 | + //해당 셀 데이터 삭제 | |
| 47 | + cell.setValue(""); | |
| 48 | + } | |
| 49 | + return value % parameters.phone; | |
| 50 | + }, | |
| 51 | + }); | |
| 52 | + | |
| 53 | + //Tabulator AJAX Data Loading | |
| 54 | + $tableError = new Tabulator("#tabulator_error", { | |
| 55 | + height:"255px", | |
| 56 | + width:"100%", | |
| 57 | + layout:"fitColumns", | |
| 58 | + autoColumns:false, | |
| 59 | + headerHozAlign:"center", | |
| 60 | + validationMode:"highlight", | |
| 61 | + clipboard:false, | |
| 62 | + clipboardCopySelector:"table", | |
| 63 | + clipboardPasteAction:"insert", // insert, update, replace | |
| 64 | + placeholder:"등록 팝업에서 팩스번호를 선택 후 확인해주세요.", //fit columns to width of table (optional) | |
| 65 | + columns:[ //Define Table Columns | |
| 66 | + {title:"이름", field:"name", hozAlign:"center", headerHozAlign: "center", width:125}, | |
| 67 | + {title:"팩스번호", field:"phone", hozAlign:"center", headerHozAlign: "center", width:158}, | |
| 68 | + {title:"미등록 결과", field:"result", hozAlign:"center", headerHozAlign: "center", width:125} | |
| 69 | + ] | |
| 70 | + }); | |
| 71 | + | |
| 72 | + // 타뷸레이터 width값 변경 시 위에 select width 값 변경 | |
| 73 | + var titleArray = ["A","B","C","D","E","F","G"]; | |
| 74 | + | |
| 75 | + $tableExcel.on("columnWidth",function(column){ | |
| 76 | + var titleIndex = titleArray.indexOf(column._column.definition.title); | |
| 77 | + titleIndex += 1; | |
| 78 | + if(titleIndex != 0){ | |
| 79 | + $('.tableExcel .select_adr_hd>div').eq(titleIndex).css('width', column._column.width); | |
| 80 | + }else{ | |
| 81 | + $('.tableExcel .select_adr_hd>div').eq(0).css('width', column._column.width + 40); | |
| 82 | + } | |
| 83 | + }); | |
| 84 | + | |
| 85 | + $tableExcel.on("scrollHorizontal",function(left){ | |
| 86 | + $(".tableExcel .adr_excel").scrollLeft(left); | |
| 87 | + }) | |
| 88 | + | |
| 89 | + $(".tableExcel .adr_excel").on("scroll",function(){ | |
| 90 | + $(".tableExcel .tabulator-tableholder").scrollLeft($(this).scrollLeft()); | |
| 91 | + }); | |
| 92 | +}); | |
| 93 | + |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?