주소록 진행중
This commit is contained in:
parent
c60d29fb02
commit
cabf73ad98
@ -402,6 +402,14 @@ public class AddrController {
|
||||
return "/web/addr/AddrListAjax";
|
||||
}
|
||||
|
||||
|
||||
|
||||
@RequestMapping("/web/mjon/addr/addrListforExcelAjax.do")
|
||||
public String AddrListforExcel(HttpServletRequest request, ModelMap model,
|
||||
@ModelAttribute("searchVO") AddrVO addrVO) throws Exception {
|
||||
|
||||
return "/web/addr/addrListforExcel";
|
||||
}
|
||||
/**
|
||||
* 사용자 주소록 중복 리스트 Ajax
|
||||
* @param request
|
||||
|
||||
117
src/main/java/itn/let/mjo/addr/web/AddrRestController.java
Normal file
117
src/main/java/itn/let/mjo/addr/web/AddrRestController.java
Normal file
@ -0,0 +1,117 @@
|
||||
package itn.let.mjo.addr.web;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.ui.ModelMap;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||
|
||||
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
|
||||
import itn.com.cmm.EgovMessageSource;
|
||||
import itn.com.cmm.LoginVO;
|
||||
import itn.com.utl.fcc.service.EgovStringUtil;
|
||||
import itn.let.fax.admin.service.FaxStatVO;
|
||||
import itn.let.mail.service.StatusResponse;
|
||||
import itn.let.mjo.addr.service.AddrGroupService;
|
||||
import itn.let.mjo.addr.service.AddrGroupVO;
|
||||
import itn.let.mjo.addr.service.AddrService;
|
||||
import itn.let.mjo.addr.service.AddrVO;
|
||||
|
||||
/**
|
||||
* 주소록 관한 controller 클래스를 정의한다.
|
||||
* @author ITN
|
||||
* @since 2021.04.08
|
||||
* @version 1.0
|
||||
* @see
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ------- -------- ---------------------------
|
||||
* 2021.04.08 ITN 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@RestController
|
||||
public class AddrRestController {
|
||||
|
||||
|
||||
@Resource (name = "AddrService")
|
||||
private AddrService addrService;
|
||||
|
||||
@Resource (name = "AddrGroupService")
|
||||
private AddrGroupService addrGroupService;
|
||||
|
||||
/** EgovMessageSource */
|
||||
@Resource(name="egovMessageSource")
|
||||
EgovMessageSource egovMessageSource;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 주소록 대량등록 저장
|
||||
* @param searchVO
|
||||
* @param model
|
||||
* @return "/web/mjon/addr/addrMassInsertByTempAjax.do"
|
||||
* @throws Exception
|
||||
*/
|
||||
@RequestMapping(value= {"/web/mjon/addr/addrMassInsertByTempAjax_advc.do"})
|
||||
public ResponseEntity<StatusResponse> addrMassInsertByTempAjax(@RequestBody List<AddrVO> addrListVO,
|
||||
RedirectAttributes redirectAttributes,
|
||||
ModelMap model) throws Exception{
|
||||
|
||||
|
||||
System.out.println("??");
|
||||
System.out.println("?? " + addrListVO.get(0).toString());
|
||||
|
||||
return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", LocalDateTime.now()));
|
||||
}
|
||||
|
||||
/* 바이트 자르기
|
||||
UTF-8일 경우
|
||||
subStringBytes("블라블라블라라", 10, 3);
|
||||
EUC-KR일 경우
|
||||
subStringBytes("블라블라블라라", 10, 2);
|
||||
*/
|
||||
public String subStringBytes(String str, int byteLength, int sizePerLetter) {
|
||||
int retLength = 0;
|
||||
int tempSize = 0;
|
||||
int asc;
|
||||
if (str == null || "".equals(str) || "null".equals(str)) {
|
||||
str = "";
|
||||
}
|
||||
|
||||
int length = str.length();
|
||||
|
||||
for (int i = 1; i <= length; i++) {
|
||||
asc = (int) str.charAt(i - 1);
|
||||
if (asc > 127) {
|
||||
if (byteLength >= tempSize + sizePerLetter) {
|
||||
tempSize += sizePerLetter;
|
||||
retLength++;
|
||||
}
|
||||
} else {
|
||||
if (byteLength > tempSize) {
|
||||
tempSize++;
|
||||
retLength++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return str.substring(0, retLength);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,668 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||
|
||||
<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
|
||||
// 중복 휴대폰번호 버튼 노출여부
|
||||
// $("#btnAddrMassDupli").hide();
|
||||
// $("#btnAddrMassSaveDupli").hide();
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
function addrGroupLoadAjax(){
|
||||
$("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
||||
$("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
||||
}
|
||||
|
||||
|
||||
function insertAddrGroupAjax() {
|
||||
var form = document.addrGrpInsertForm;
|
||||
if(form.addrGrpNm.value == "") {
|
||||
alert("주소록 그룹명을 입력해주세요.");
|
||||
return;
|
||||
}
|
||||
if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
|
||||
return;
|
||||
}
|
||||
var data = new FormData(form);
|
||||
|
||||
$.ajax({
|
||||
cache : false,
|
||||
url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />",
|
||||
type : 'POST',
|
||||
data : data,
|
||||
dataType:'json',
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success : function(returnData, status){
|
||||
if(status == "success") {
|
||||
if("fail"==returnData.result){
|
||||
alert(returnData.message);
|
||||
return;
|
||||
} else if("dupl"==returnData.result) {
|
||||
alert("중복된 그룹명입니다.");
|
||||
return;
|
||||
}
|
||||
alert("등록되었습니다.");
|
||||
listAddrGrp();
|
||||
addrGroupLoadAjax();
|
||||
|
||||
}else{ alert("ERROR!");return;}
|
||||
},
|
||||
error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function insertAddrAjax() {
|
||||
var selectVal = $("#addrRegistSelect option:selected").val();
|
||||
//alert(selectVal);
|
||||
|
||||
var form = document.addrInsertForm;
|
||||
/*
|
||||
//필수값 아니어서 뺐음
|
||||
if(form.addrNm.value == "") {
|
||||
alert("주소록 이름을 입력하세요");
|
||||
return;
|
||||
}
|
||||
*/
|
||||
if(form.addrPhoneNo.value == "") {
|
||||
alert("주소록 번호를 입력하세요");
|
||||
return;
|
||||
}
|
||||
//if(!confirm("주소록을 추가하시겠습니까?")) {
|
||||
// return;
|
||||
//}
|
||||
|
||||
if(!checkHpNum(form.addrPhoneNo.value)){//휴대폰 유효성 검사
|
||||
if(!checkNorPhoneNum(form.addrPhoneNo.value)){//일반전화 유효성 검사
|
||||
|
||||
alert("잘못된 휴대폰번호 또는 일반전화 번호 입니다.");
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var data = new FormData(form);
|
||||
|
||||
$.ajax({
|
||||
cache : false,
|
||||
url : "<c:url value='/web/mjon/addr/insertAddrAjax.do' />",
|
||||
type : 'POST',
|
||||
data : data,
|
||||
dataType:'json',
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success : function(returnData, status){
|
||||
if(status == "success") {
|
||||
if("fail"==returnData.result){
|
||||
alert(returnData.message);
|
||||
return;
|
||||
} else if("dupl"==returnData.result){
|
||||
alert("해당 그룹에 중복된 번호가 있습니다.");
|
||||
return;
|
||||
}
|
||||
//alert("저장 되었습니다.");
|
||||
|
||||
listAddrGrp();
|
||||
addrGroupLoadAjax();
|
||||
addrLoadAjax();
|
||||
|
||||
// 주소록그룹 콤보박스 유지
|
||||
setTimeout(setSelectSetting, 500, selectVal);
|
||||
|
||||
}else{ alert("ERROR!");return;}
|
||||
},
|
||||
error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// 주소록그룹 콤보박스 유지
|
||||
function setSelectSetting(selectVal) {
|
||||
$("#addrRegistSelect").val(selectVal).prop("selected", true);
|
||||
}
|
||||
|
||||
function linkPage(pageNo){
|
||||
if ($('#searchKeywordAddr').val() != "" && $('#searchKeywordAddr').val() != null && $('#searchKeywordAddr').val() != undefined) {
|
||||
// 문자전송 검색용
|
||||
$("#msgStartKeyword").val("");
|
||||
}
|
||||
|
||||
var searchForm = document.searchAddrForm;
|
||||
searchForm.pageIndex.value = pageNo;
|
||||
searchForm.pageUnit.value = $('#pageUnit').val();
|
||||
searchForm.searchCondition.value = $('#searchConditionAddr').val();
|
||||
searchForm.searchKeyword.value = $('#searchKeywordAddr').val();
|
||||
searchForm.startKeyword.value = $("#msgStartKeyword").val();
|
||||
|
||||
var sendData = $(document.searchAddrForm).serializeArray();
|
||||
$("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", sendData, function(response, status, xhr){tableAllChk();});
|
||||
addrGroupLoadAjax();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//#############################################################################################
|
||||
//Tabulator
|
||||
//#############################################################################################
|
||||
|
||||
$(document).ready(function(){
|
||||
//Tabulator AJAX Data Loading
|
||||
|
||||
// 파일 선택 버튼 클릭 이벤트
|
||||
$("#file-load-trigger").on("click", function() {
|
||||
$("#excelFile").click();
|
||||
});
|
||||
|
||||
// 파일 입력 이벤트
|
||||
$("#excelFile").on("change", function(event) {
|
||||
excelFileChange(event.target.files[0]);
|
||||
});
|
||||
|
||||
|
||||
|
||||
//받는사람 전체삭제 버튼 처리
|
||||
$('.all_del').click(function(){
|
||||
var data = $tableClip.getRows();
|
||||
if(data == null || data == ""){
|
||||
alert("받는사람을 추가해 주세요.");
|
||||
return false;
|
||||
}else{
|
||||
$tableClip.clearData();
|
||||
$("#rowTotCnt").text(0); //총건수 수정
|
||||
$("#rowDupCnt").text(0); //중복건수 수정
|
||||
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
// 받는사람 선택삭제 버튼 처리해주기
|
||||
$('.select_del').click(function(){
|
||||
$("#rowDupCnt").text(0); //중복건수 수정
|
||||
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
|
||||
|
||||
if($tableClip == null || $tableClip == ""){
|
||||
alert("받는사람을 추가해 주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
var selectedData = $tableClip.getSelectedRows();
|
||||
|
||||
if(selectedData == "" || selectedData == null){
|
||||
alert("받는 사람을 선택해 주세요.");
|
||||
return false;
|
||||
}else{ // 선택한 Row 데이터 삭제하기
|
||||
for(var i=0; i < selectedData.length; i++){
|
||||
selectedData[i].delete();
|
||||
}
|
||||
}
|
||||
|
||||
totRows = $tableClip.getRows().length;
|
||||
|
||||
updateTotCnt(totRows);
|
||||
});
|
||||
|
||||
//받는사람 오류번호 삭제 처리해주기
|
||||
$('.chkVali_del').click(function(){
|
||||
//기존 연락처 모두 불러오기
|
||||
var data = $tableClip.getRows();
|
||||
var tableData = [];
|
||||
var totLen = $tableClip.getRows().length;
|
||||
var errCnt = 0;
|
||||
|
||||
if(totLen > 0){
|
||||
if(confirm("올바르지 않은 연락처 정보를 삭제 하시겠습니까?")){
|
||||
for(var i=0; i < totLen; i++){
|
||||
|
||||
|
||||
var phone = data[i].getData().phone;
|
||||
var valiCheck = checkHpNum(phone);
|
||||
if(valiCheck){
|
||||
tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim(), info1:data[i].getData().info1, info2:data[i].getData().info2, info3:data[i].getData().info3, info4:data[i].getData().info4, memo:data[i].getData().memo});
|
||||
}else{
|
||||
errCnt++;
|
||||
}
|
||||
}
|
||||
|
||||
var removeDuplData = dupliPhoneData(tableData);
|
||||
|
||||
$tableClip.setData(removeDuplData);
|
||||
|
||||
//총 받는사람 수 계산
|
||||
totRows = $tableClip.getRows().length;
|
||||
updateTotCnt(totRows);
|
||||
|
||||
if(errCnt > 0){
|
||||
alert(errCnt + " 건의 연락처를 삭제하였습니다.");
|
||||
return false;
|
||||
}else{
|
||||
alert("오류가 있는 연락처가 없습니다.");
|
||||
}
|
||||
}
|
||||
}else{
|
||||
alert("연락처 정보를 입력해 주세요.");
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 오류검사 항목 중복제거
|
||||
function SetTableErrorDupliCheck(sVal) {
|
||||
var isDuplicate = false;
|
||||
if (tableErrorCheckData.length == 0) {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
else {
|
||||
for (var i = 0; i < tableErrorCheckData.length; i++)
|
||||
{
|
||||
if (tableErrorCheckData[i] == sVal) {
|
||||
isDuplicate = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isDuplicate) {
|
||||
return;
|
||||
}
|
||||
else {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 오류검사 항목 중복제거
|
||||
function SetTableErrorDupliCheck(sVal) {
|
||||
var isDuplicate = false;
|
||||
if (tableErrorCheckData.length == 0) {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
else {
|
||||
for (var i = 0; i < tableErrorCheckData.length; i++)
|
||||
{
|
||||
if (tableErrorCheckData[i] == sVal) {
|
||||
isDuplicate = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isDuplicate) {
|
||||
return;
|
||||
}
|
||||
else {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('.check_validity').click(function(){
|
||||
tableErrorCheckData.length = 0; // 오류 번호 배열 초기화
|
||||
|
||||
var data = $tableClip.getRows();
|
||||
var invalid = $tableClip.getInvalidCells(); //오류 데이터 체크
|
||||
var dataLen = $tableClip.getRows().length; //연락처 데이터 갯수
|
||||
var totLen = invalid.length; //오류 데이터 갯수
|
||||
var errMsg = ""; //최종 alert에 표시할 메시지 저장 변수
|
||||
|
||||
if(dataLen > 0) { //연락처 정보가 있으면 수행
|
||||
if(totLen > 0) { //내용에 오류가 있으면 수행
|
||||
//오류 데이터 값 저장
|
||||
for(var i=0; i < totLen; i++) {
|
||||
var cellValue = invalid[i].getValue();
|
||||
SetTableErrorDupliCheck(cellValue);
|
||||
}
|
||||
|
||||
for(var i=0; i < dataLen; i++){
|
||||
// 휴대폰번호 체크
|
||||
var phone = data[i].getData().phone;
|
||||
var valiCheck = checkHpNum(phone);
|
||||
if(!valiCheck){
|
||||
SetTableErrorDupliCheck(phone);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for(var i=0; i < dataLen; i++){
|
||||
// 휴대폰번호 체크
|
||||
var phone = data[i].getData().phone;
|
||||
var valiCheck = checkHpNum(phone);
|
||||
if(!valiCheck){
|
||||
SetTableErrorDupliCheck(phone);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
alert("연락처를 입력해 주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (tableErrorCheckData.length > 0) {
|
||||
for (var i = 0; i < tableErrorCheckData.length; i++)
|
||||
{
|
||||
errMsg += tableErrorCheckData[i];
|
||||
if ((tableErrorCheckData.length - 1) > i) {
|
||||
errMsg += ", ";
|
||||
}
|
||||
}
|
||||
alert(errMsg + "의 내용에 오류가 있습니다.");
|
||||
}
|
||||
else {
|
||||
alert("오류 데이터가 없습니다.");
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
|
||||
//받는사람 중복 삭제
|
||||
$('.duple_del').click(function(){
|
||||
//기존 연락처 모두 불러오기
|
||||
var data = $tableClip.getRows();
|
||||
var tableData = [];
|
||||
var dpCnt = 0;
|
||||
var totLen = $tableClip.getRows().length;
|
||||
|
||||
for(var i=0; i < totLen; i++){
|
||||
tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim()});
|
||||
}
|
||||
|
||||
var removeDuplData = dupliPhoneData(tableData);
|
||||
$tableClip.setData(removeDuplData);
|
||||
|
||||
//총 받는사람 수 계산
|
||||
totRows = $tableClip.getRows().length;
|
||||
updateTotCnt(totRows);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
// Show Html
|
||||
function getAddrGroupListShow(jsonList) {
|
||||
var sHtml = "";
|
||||
sHtml += "<option value='NEW'>그룹추가</option>";
|
||||
sHtml += "<option value='0'>그룹미지정</option>";
|
||||
sHtml += "<option value='bookmark'>자주보내는 번호</option>";
|
||||
for (var j = 0; j < jsonList.length; j++) {
|
||||
sHtml += " <option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
|
||||
}
|
||||
|
||||
$("#addrGrpIdInfo").html(sHtml);
|
||||
}
|
||||
|
||||
$(document).on('change', '#addrGrpIdInfo', function() {
|
||||
if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
|
||||
$("#addrGrpNm").val(""); // 새그룹명 Clear;
|
||||
}
|
||||
});
|
||||
|
||||
//#############################################################################################
|
||||
//파일 불러오기
|
||||
//#############################################################################################
|
||||
|
||||
|
||||
//체크박스 전체선택/해제
|
||||
$(document).on("click", "#chkAll", function(e) {
|
||||
var isChecked = $(this).is(":checked");
|
||||
$("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
||||
});
|
||||
|
||||
$(document).on("click", "#duplicationChkAll", function(e) {
|
||||
var isChecked = $(this).is(":checked");
|
||||
$("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 중복 연락처
|
||||
function GetAddrMassDupli() {
|
||||
var sHtml = "";
|
||||
sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
|
||||
sHtml += "<table class='tType4'>";
|
||||
sHtml += " <colgroup>";
|
||||
sHtml += " <col style='width:auto' />";
|
||||
sHtml += " </colgroup>";
|
||||
sHtml += " <thead>";
|
||||
sHtml += " <tr>";
|
||||
sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(dupliPhoneDataRealList.length) + "개)</th>";
|
||||
sHtml += " </tr>";
|
||||
sHtml += " </thead>";
|
||||
sHtml += " <tbody>";
|
||||
for (var i = 0; i < dupliPhoneDataRealList.length; i++) {
|
||||
sHtml += " <tr>";
|
||||
sHtml += " <td>" + dupliPhoneDataRealList[i] + "</td>";
|
||||
sHtml += " </tr>";
|
||||
}
|
||||
sHtml += " </tbody>";
|
||||
sHtml += " </table>";
|
||||
sHtml += " </div>";
|
||||
|
||||
$("#addrMassDupli_layer").html(sHtml);
|
||||
}
|
||||
|
||||
//중복 연락처 => 저장시
|
||||
function GetAddrMassSaveDupli() {
|
||||
var sHtml = "";
|
||||
sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
|
||||
sHtml += "<table class='tType4'>";
|
||||
sHtml += " <colgroup>";
|
||||
sHtml += " <col style='width:auto' />";
|
||||
sHtml += " </colgroup>";
|
||||
sHtml += " <thead>";
|
||||
sHtml += " <tr>";
|
||||
// sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(addrMassDupliSaveList.length) + "개)</th>";
|
||||
sHtml += " <th>중복 휴대폰번호 (10개)</th>";
|
||||
sHtml += " </tr>";
|
||||
sHtml += " </thead>";
|
||||
sHtml += " <tbody>";
|
||||
for (var i = 0; i < addrMassDupliSaveList.length; i++) {
|
||||
sHtml += " <tr>";
|
||||
sHtml += " <td>" + addrMassDupliSaveList[i].addrPhoneNo + "</td>";
|
||||
sHtml += " </tr>";
|
||||
}
|
||||
sHtml += " </tbody>";
|
||||
sHtml += " </table>";
|
||||
sHtml += " </div>";
|
||||
|
||||
$("#addrMassSaveDupli_layer").html(sHtml);
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<!-- 붙여넣기 -->
|
||||
<div class="popCont pop_more_cont" id="popCont_2">
|
||||
<div class="titBox">
|
||||
<p>- 텍스트(txt) 파일로 작성된 주소록을 등록하실 수 있습니다.</p>
|
||||
<p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 붙여 넣으셔야 합니다.</p>
|
||||
<p>- 입력 내용은 (Tab) 또는 (,) 구분하여 입력하여야 합니다.</p>
|
||||
<p>- 한 줄(열)에 주소 한 건만 입력 가능합니다.</p>
|
||||
<p>- 전화번호 형태는 010-1234-5678 또는 01012345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p>
|
||||
<p> (예) 홍길동,010-1234-5678 또는 홍길동,01012345678</p>
|
||||
<p>- 한번에 많은 양의 데이터를 입력하시려면 ‘주소록 복사(Ctrl+c) + 붙여넣기(Ctrl+v)’ 또는 ‘엑셀입력’을 이용하세요.</p>
|
||||
<p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
|
||||
<button type="button" class="txt_btn" onclick="location.href='/download/addr/주소록_대량등록.zip'"><i></i>TXT샘플 다운로드</button>
|
||||
</div>
|
||||
<div class="pop_more_wrap">
|
||||
<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
|
||||
</div>
|
||||
</div><!--// 붙여넣기 -->
|
||||
|
||||
<!-- 공통 -->
|
||||
<div>
|
||||
<table class="layer_tType1">
|
||||
<caption>엑셀입력 표</caption>
|
||||
<colgroup>
|
||||
<col style="width: 95px">
|
||||
<col style="width: auto">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>그룹 선택</th>
|
||||
<td>
|
||||
<label for="" class="label">그룹 선택</label>
|
||||
<select id="addrGrpIdInfo" name="addrGrpIdInfo">
|
||||
</select>
|
||||
<label for="" class="label">그룹명 입력</label>
|
||||
<input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="excel_middle2">
|
||||
<p>
|
||||
총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건
|
||||
<!-- -->
|
||||
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button> -->
|
||||
<!-- -->
|
||||
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> -->
|
||||
</p>
|
||||
<!-- <button type="button" class="btnType btnType6 addCallToF">번호추가</button> -->
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="adr_excel" style="margin-top: 13px;">
|
||||
<!-- thead -->
|
||||
<div class="adr_hd select_adr_hd" data-group="tableClip">
|
||||
<div></div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="drag_drop_wrap callList_box" id="tabulator_clip">
|
||||
<img src="/publish/images/content/excel.jpg" style="width: 100%;">
|
||||
</div>
|
||||
<div class="excel_middle">
|
||||
<div class="select_btnWrap clearfix">
|
||||
<div>
|
||||
<button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button>
|
||||
<button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button>
|
||||
<button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button>
|
||||
<button type="button" class="check_validity">오류 검사 <i></i></button>
|
||||
<div class="error_hover_cont send_hover_cont addr_hover_cont">
|
||||
<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
|
||||
<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div><!--// 공통 -->
|
||||
|
||||
<!-- 붙여놓기 설명 -->
|
||||
<div class="req_area">
|
||||
<div class="text_box">
|
||||
- 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br>
|
||||
- 휴대폰 번호는 필수입력 항목입니다.<br>
|
||||
- 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br>
|
||||
- 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br>
|
||||
- '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다.
|
||||
</div>
|
||||
</div>
|
||||
@ -0,0 +1,955 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||
|
||||
<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
// 중복 휴대폰번호 버튼 노출여부
|
||||
// $("#btnAddrMassDupli").hide();
|
||||
// $("#btnAddrMassSaveDupli").hide();
|
||||
});
|
||||
|
||||
|
||||
function addrGroupLoadAjax(){
|
||||
$("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
||||
$("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
||||
}
|
||||
|
||||
|
||||
function insertAddrGroupAjax() {
|
||||
var form = document.addrGrpInsertForm;
|
||||
if(form.addrGrpNm.value == "") {
|
||||
alert("주소록 그룹명을 입력해주세요.");
|
||||
return;
|
||||
}
|
||||
if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
|
||||
return;
|
||||
}
|
||||
var data = new FormData(form);
|
||||
|
||||
$.ajax({
|
||||
cache : false,
|
||||
url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />",
|
||||
type : 'POST',
|
||||
data : data,
|
||||
dataType:'json',
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success : function(returnData, status){
|
||||
if(status == "success") {
|
||||
if("fail"==returnData.result){
|
||||
alert(returnData.message);
|
||||
return;
|
||||
} else if("dupl"==returnData.result) {
|
||||
alert("중복된 그룹명입니다.");
|
||||
return;
|
||||
}
|
||||
alert("등록되었습니다.");
|
||||
listAddrGrp();
|
||||
addrGroupLoadAjax();
|
||||
|
||||
}else{ alert("ERROR!");return;}
|
||||
},
|
||||
error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function insertAddrAjax() {
|
||||
var selectVal = $("#addrRegistSelect option:selected").val();
|
||||
//alert(selectVal);
|
||||
|
||||
var form = document.addrInsertForm;
|
||||
/*
|
||||
//필수값 아니어서 뺐음
|
||||
if(form.addrNm.value == "") {
|
||||
alert("주소록 이름을 입력하세요");
|
||||
return;
|
||||
}
|
||||
*/
|
||||
if(form.addrPhoneNo.value == "") {
|
||||
alert("주소록 번호를 입력하세요");
|
||||
return;
|
||||
}
|
||||
//if(!confirm("주소록을 추가하시겠습니까?")) {
|
||||
// return;
|
||||
//}
|
||||
|
||||
if(!checkHpNum(form.addrPhoneNo.value)){//휴대폰 유효성 검사
|
||||
if(!checkNorPhoneNum(form.addrPhoneNo.value)){//일반전화 유효성 검사
|
||||
|
||||
alert("잘못된 휴대폰번호 또는 일반전화 번호 입니다.");
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var data = new FormData(form);
|
||||
|
||||
$.ajax({
|
||||
cache : false,
|
||||
url : "<c:url value='/web/mjon/addr/insertAddrAjax.do' />",
|
||||
type : 'POST',
|
||||
data : data,
|
||||
dataType:'json',
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success : function(returnData, status){
|
||||
if(status == "success") {
|
||||
if("fail"==returnData.result){
|
||||
alert(returnData.message);
|
||||
return;
|
||||
} else if("dupl"==returnData.result){
|
||||
alert("해당 그룹에 중복된 번호가 있습니다.");
|
||||
return;
|
||||
}
|
||||
//alert("저장 되었습니다.");
|
||||
|
||||
listAddrGrp();
|
||||
addrGroupLoadAjax();
|
||||
addrLoadAjax();
|
||||
|
||||
// 주소록그룹 콤보박스 유지
|
||||
setTimeout(setSelectSetting, 500, selectVal);
|
||||
|
||||
}else{ alert("ERROR!");return;}
|
||||
},
|
||||
error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// 주소록그룹 콤보박스 유지
|
||||
function setSelectSetting(selectVal) {
|
||||
$("#addrRegistSelect").val(selectVal).prop("selected", true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//#############################################################################################
|
||||
//Tabulator
|
||||
//#############################################################################################
|
||||
|
||||
$(document).ready(function(){
|
||||
// 파일 선택 버튼 클릭 이벤트
|
||||
$("#file-load-trigger").on("click", function() {
|
||||
$("#excelFile").click();
|
||||
});
|
||||
|
||||
// 파일 입력 이벤트
|
||||
$("#excelFile").on("change", function(event) {
|
||||
excelFileChange(event.target.files[0]);
|
||||
});
|
||||
|
||||
|
||||
|
||||
//받는 사람 리스트 영역에 클립보드 데이터 가져와보기
|
||||
// 붙여넣기 기능
|
||||
/* $('.callList_box').on('paste', function (e) {
|
||||
var element = e.originalEvent.clipboardData.getData('text'); // 클립보드에 복사한 데이터 가져오기
|
||||
var elmSplit= [];
|
||||
elmSplit = element.split("\n");
|
||||
var elmLen = elmSplit.length;
|
||||
console.log('elmSplit : ', elmSplit);
|
||||
if(elmLen < 0){
|
||||
alert("붙여넣을 연락처를 복사해주세요.");
|
||||
return false;
|
||||
}
|
||||
if (elmLen > 20001) {
|
||||
alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
tableErrorData.length = 0; // 오류 번호 배열 초기화
|
||||
|
||||
var splitData = [];
|
||||
var realPhone = [];
|
||||
|
||||
for(var i=0; i < elmLen; i++){
|
||||
var splitStr = elmSplit[i];
|
||||
var tabData = splitStr.split("\t"); //탭 구분으로 데이터 분할
|
||||
var comData = splitStr.split(","); //콤마 구분으로 데이터 분할
|
||||
if(tabData.length >= 2){
|
||||
splitData = tabData;
|
||||
}else{
|
||||
splitData = comData;
|
||||
}
|
||||
|
||||
if(splitData.length == 0){// 데이터가 없는경우
|
||||
alert("탭으로 구분하여 데이터를 복사해 주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if(splitData.length == 1){
|
||||
realPhone.push({A: splitData[0].trim()});
|
||||
}else{
|
||||
|
||||
let keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
|
||||
let data = {};
|
||||
|
||||
splitData.forEach((item, index) => {
|
||||
data[keys[index]] = item.trim();
|
||||
});
|
||||
|
||||
realPhone.push(data);
|
||||
}//else end
|
||||
}
|
||||
console.log('realPhone : ', realPhone);
|
||||
var recTableData = $tableExcel.getRows(); // 받는사람 리스트의 전체 목록을 저장
|
||||
var tableData = [];
|
||||
|
||||
//기존 받는사람 리스트를 배열에 미리 담아둔다.
|
||||
if (recTableData.length > 0) {
|
||||
recTableData.forEach(item => {
|
||||
tableData.push(createDataObject(item.getData()));
|
||||
});
|
||||
}
|
||||
|
||||
if (realPhone.length > 0) {
|
||||
realPhone.forEach(item => {
|
||||
tableData.push(createDataObject(item));
|
||||
});
|
||||
}
|
||||
|
||||
//tableData.push(realPhone);
|
||||
|
||||
//중복 연락처 1개만 남기고 삭제하기
|
||||
// 20240719 개선작업은 폰위치가 따로없어 중복제거를 못함
|
||||
// var removeDuplPhone = dupliPhoneData(tableData);
|
||||
var removeDuplPhone = tableData;
|
||||
|
||||
//수신자 리스트에 전화번호 추가해주기
|
||||
//$tableExcel.addData(removeDuplPhone);
|
||||
$tableExcel.setData(removeDuplPhone);
|
||||
|
||||
totRows = $tableExcel.getRows().length;
|
||||
updateTotCnt(totRows); //전체 데이터 갯수 구하기
|
||||
|
||||
if (tableErrorData.length > 0) {
|
||||
alert("데이터를 확인해 주세요.");
|
||||
// alert("올바르지 않은 휴대폰 번호가 "+ tableErrorData.length +" 건 있습니다.");
|
||||
//for(var x=0; x < tableErrorData.length; x++){
|
||||
// alert(tableErrorData[x]);
|
||||
//}
|
||||
}
|
||||
});
|
||||
*/
|
||||
|
||||
//$tableExcel.setData(tabledata);
|
||||
|
||||
|
||||
|
||||
|
||||
//받는사람 전체삭제 버튼 처리
|
||||
$('.all_del').click(function(){
|
||||
var data = $tableExcel.getRows();
|
||||
if(data == null || data == ""){
|
||||
alert("받는사람을 추가해 주세요.");
|
||||
return false;
|
||||
}else{
|
||||
$tableExcel.clearData();
|
||||
$("#rowTotCnt").text(0); //총건수 수정
|
||||
$("#rowDupCnt").text(0); //중복건수 수정
|
||||
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
// 받는사람 선택삭제 버튼 처리해주기
|
||||
$('.select_del').click(function(){
|
||||
$("#rowDupCnt").text(0); //중복건수 수정
|
||||
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
|
||||
|
||||
if($tableExcel == null || $tableExcel == ""){
|
||||
alert("받는사람을 추가해 주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
var selectedData = $tableExcel.getSelectedRows();
|
||||
|
||||
if(selectedData == "" || selectedData == null){
|
||||
alert("받는 사람을 선택해 주세요.");
|
||||
return false;
|
||||
}else{ // 선택한 Row 데이터 삭제하기
|
||||
for(var i=0; i < selectedData.length; i++){
|
||||
selectedData[i].delete();
|
||||
}
|
||||
}
|
||||
|
||||
totRows = $tableExcel.getRows().length;
|
||||
|
||||
updateTotCnt(totRows);
|
||||
});
|
||||
|
||||
//받는사람 오류번호 삭제 처리해주기
|
||||
$('.chkVali_del').click(function(){
|
||||
//기존 연락처 모두 불러오기
|
||||
var data = $tableExcel.getRows();
|
||||
var tableData = [];
|
||||
var totLen = $tableExcel.getRows().length;
|
||||
var errCnt = 0;
|
||||
|
||||
if(totLen > 0){
|
||||
if(confirm("올바르지 않은 연락처 정보를 삭제 하시겠습니까?")){
|
||||
for(var i=0; i < totLen; i++){
|
||||
|
||||
|
||||
var phone = data[i].getData().phone;
|
||||
var valiCheck = checkHpNum(phone);
|
||||
if(valiCheck){
|
||||
tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim(), info1:data[i].getData().info1, info2:data[i].getData().info2, info3:data[i].getData().info3, info4:data[i].getData().info4, memo:data[i].getData().memo});
|
||||
}else{
|
||||
errCnt++;
|
||||
}
|
||||
}
|
||||
|
||||
var removeDuplData = dupliPhoneData(tableData);
|
||||
|
||||
$tableExcel.setData(removeDuplData);
|
||||
|
||||
//총 받는사람 수 계산
|
||||
totRows = $tableExcel.getRows().length;
|
||||
updateTotCnt(totRows);
|
||||
|
||||
if(errCnt > 0){
|
||||
alert(errCnt + " 건의 연락처를 삭제하였습니다.");
|
||||
return false;
|
||||
}else{
|
||||
alert("오류가 있는 연락처가 없습니다.");
|
||||
}
|
||||
}
|
||||
}else{
|
||||
alert("연락처 정보를 입력해 주세요.");
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 필드 선택 이벤트 핸들러
|
||||
$("#column-selector").on("change", function() {
|
||||
let selectedField = $(this).val();
|
||||
let newValue = prompt("새 값을 입력하세요:");
|
||||
if (newValue !== null) {
|
||||
updateTableField(selectedField, newValue);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 오류검사 항목 중복제거
|
||||
function SetTableErrorDupliCheck(sVal) {
|
||||
var isDuplicate = false;
|
||||
if (tableErrorCheckData.length == 0) {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
else {
|
||||
for (var i = 0; i < tableErrorCheckData.length; i++)
|
||||
{
|
||||
if (tableErrorCheckData[i] == sVal) {
|
||||
isDuplicate = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isDuplicate) {
|
||||
return;
|
||||
}
|
||||
else {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 오류검사 항목 중복제거
|
||||
function SetTableErrorDupliCheck(sVal) {
|
||||
var isDuplicate = false;
|
||||
if (tableErrorCheckData.length == 0) {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
else {
|
||||
for (var i = 0; i < tableErrorCheckData.length; i++)
|
||||
{
|
||||
if (tableErrorCheckData[i] == sVal) {
|
||||
isDuplicate = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isDuplicate) {
|
||||
return;
|
||||
}
|
||||
else {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('.check_validity').click(function(){
|
||||
tableErrorCheckData.length = 0; // 오류 번호 배열 초기화
|
||||
|
||||
var data = $tableExcel.getRows();
|
||||
var invalid = $tableExcel.getInvalidCells(); //오류 데이터 체크
|
||||
var dataLen = $tableExcel.getRows().length; //연락처 데이터 갯수
|
||||
var totLen = invalid.length; //오류 데이터 갯수
|
||||
var errMsg = ""; //최종 alert에 표시할 메시지 저장 변수
|
||||
|
||||
if(dataLen > 0) { //연락처 정보가 있으면 수행
|
||||
if(totLen > 0) { //내용에 오류가 있으면 수행
|
||||
//오류 데이터 값 저장
|
||||
for(var i=0; i < totLen; i++) {
|
||||
var cellValue = invalid[i].getValue();
|
||||
SetTableErrorDupliCheck(cellValue);
|
||||
}
|
||||
|
||||
for(var i=0; i < dataLen; i++){
|
||||
// 휴대폰번호 체크
|
||||
var phone = data[i].getData().phone;
|
||||
var valiCheck = checkHpNum(phone);
|
||||
if(!valiCheck){
|
||||
SetTableErrorDupliCheck(phone);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for(var i=0; i < dataLen; i++){
|
||||
// 휴대폰번호 체크
|
||||
var phone = data[i].getData().phone;
|
||||
var valiCheck = checkHpNum(phone);
|
||||
if(!valiCheck){
|
||||
SetTableErrorDupliCheck(phone);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
alert("연락처를 입력해 주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (tableErrorCheckData.length > 0) {
|
||||
for (var i = 0; i < tableErrorCheckData.length; i++)
|
||||
{
|
||||
errMsg += tableErrorCheckData[i];
|
||||
if ((tableErrorCheckData.length - 1) > i) {
|
||||
errMsg += ", ";
|
||||
}
|
||||
}
|
||||
alert(errMsg + "의 내용에 오류가 있습니다.");
|
||||
}
|
||||
else {
|
||||
alert("오류 데이터가 없습니다.");
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
|
||||
//받는사람 중복 삭제
|
||||
$('.duple_del').click(function(){
|
||||
//기존 연락처 모두 불러오기
|
||||
var data = $tableExcel.getRows();
|
||||
var tableData = [];
|
||||
var dpCnt = 0;
|
||||
var totLen = $tableExcel.getRows().length;
|
||||
|
||||
for(var i=0; i < totLen; i++){
|
||||
tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim()});
|
||||
}
|
||||
|
||||
var removeDuplData = dupliPhoneData(tableData);
|
||||
$tableExcel.setData(removeDuplData);
|
||||
|
||||
//총 받는사람 수 계산
|
||||
totRows = $tableExcel.getRows().length;
|
||||
updateTotCnt(totRows);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 데이터 객체를 생성하는 함수
|
||||
function createDataObject(data) {
|
||||
return {
|
||||
A: data.A,
|
||||
B: data.B,
|
||||
C: data.C,
|
||||
D: data.D,
|
||||
E: data.E,
|
||||
F: data.F,
|
||||
G: data.G
|
||||
};
|
||||
}
|
||||
|
||||
//#############################################################################################
|
||||
//파일업로드 드래그앤 드롭
|
||||
//#############################################################################################
|
||||
var objDragAndDrop = $(".upload_area");
|
||||
$(document).on("dragenter",".upload_area",function(e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
//$(this).css('border', '2px solid #0B85A1');
|
||||
});
|
||||
$(document).on("dragover",".upload_area",function(e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
$(document).on("drop",".upload_area",function(e){
|
||||
//$(this).css('border', '2px dotted #0B85A1');
|
||||
e.preventDefault();
|
||||
var files = e.originalEvent.dataTransfer.files;
|
||||
// handleFileUpload(files,objDragAndDrop); //파일업로드
|
||||
excelFileChange(files[0]);
|
||||
});
|
||||
|
||||
$(document).on('dragenter', function (e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
$(document).on('dragover', function (e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
//objDragAndDrop.css('border', '2px dotted #0B85A1');
|
||||
});
|
||||
$(document).on('drop', function (e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
//파일 드래그앤드롭 종료
|
||||
|
||||
|
||||
function excelFileChange(file){
|
||||
|
||||
// var file = event.target.files[0];
|
||||
if (file) {
|
||||
var reader = new FileReader();
|
||||
reader.onload = function(e) {
|
||||
var data = new Uint8Array(e.target.result);
|
||||
var workbook = XLSX.read(data, {type: 'array'});
|
||||
var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
|
||||
var jsonData = XLSX.utils.sheet_to_json(firstSheet, {header: 1});
|
||||
processExcelData(jsonData);
|
||||
};
|
||||
reader.readAsArrayBuffer(file);
|
||||
}
|
||||
}
|
||||
|
||||
// 엑셀 데이터 처리 함수
|
||||
function processExcelData(data) {
|
||||
var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
|
||||
var tableData = [];
|
||||
|
||||
// 3번째 행부터 입력
|
||||
// 1,2행은 예시와 타이틀이라 입력안함
|
||||
data.slice(2).forEach(row => {
|
||||
var rowData = {};
|
||||
keys.forEach((key, index) => {
|
||||
rowData[key] = row[index] ? row[index].trim() : ""; // 각 컬럼에 대해 기본값을 설정
|
||||
});
|
||||
tableData.push(rowData);
|
||||
});
|
||||
|
||||
|
||||
$tableExcel.setColumns([ // 열 정의를 다시 설정
|
||||
{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
|
||||
cell.getRow().toggleSelect();
|
||||
}},
|
||||
{title: "A", hozAlign: "center", headerHozAlign: "center", field: "A", editor: "input", width: 125, validator: ["maxLength:100", "string"]},
|
||||
{title: "B", hozAlign: "center", headerHozAlign: "center", field: "B", editor: "input", width: 125, validator: ["maxLength:100", "string"]},
|
||||
{title: "C", hozAlign: "center", headerHozAlign: "center", field: "C", editor: "input", width: 125, validator: ["maxLength:100", "string"]},
|
||||
{title: "D", hozAlign: "center", headerHozAlign: "center", field: "D", editor: "input", width: 125, validator: ["maxLength:100", "string"]},
|
||||
{title: "E", hozAlign: "center", headerHozAlign: "center", field: "E", editor: "input", width: 125, validator: ["maxLength:100", "string"]},
|
||||
{title: "F", hozAlign: "center", headerHozAlign: "center", field: "F", editor: "input", width: 125, validator: ["maxLength:100", "string"]},
|
||||
{title: "G", hozAlign: "center", headerHozAlign: "center", field: "G", editor: "input", width: 125, validator: ["maxLength:100", "string"]}
|
||||
]);
|
||||
|
||||
$tableExcel.setData(tableData).then(() => {
|
||||
// rowTotCnt 업데이트
|
||||
document.getElementById("rowTotCnt").innerText = tableData.length;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//#############################################################################################
|
||||
//등록
|
||||
//#############################################################################################
|
||||
|
||||
|
||||
|
||||
// 주소록 그룹 중복체크
|
||||
function getAddrGroupDuplCheckAjax() {
|
||||
var isReturn = true;
|
||||
|
||||
$.ajax({
|
||||
url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />",
|
||||
type : 'POST',
|
||||
data : {"addrGrpNm" : $("#addrGrpNm").val()},
|
||||
dataType:'json',
|
||||
async: false, // 동기
|
||||
success : function(data, status){
|
||||
if(data.isSuccess == true) {
|
||||
if(data.isDupl == true) {
|
||||
//alert("중복된 그룹명입니다.");
|
||||
isReturn = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
//alert("Message : " + msg);
|
||||
}
|
||||
},
|
||||
error: function (e) {
|
||||
//alert("주소록 중복체크에 실패했습니다.");
|
||||
}
|
||||
});
|
||||
|
||||
return isReturn;
|
||||
}
|
||||
|
||||
//주소록그룹 콤보박스 유지
|
||||
function setSelectMassSetting(selectMassVal) {
|
||||
$("#addrGrpIdInfo").val(selectMassVal).prop("selected", true);
|
||||
}
|
||||
|
||||
//데이터 비우기
|
||||
function SetClear() {
|
||||
$("#addrGrpNm").val(""); // 새그룹명 Clear;
|
||||
// 주소록 그룹정보 불러오기
|
||||
getAddrGroupList();
|
||||
|
||||
var data = $tableExcel.getRows();
|
||||
if (data == null || data == "") {
|
||||
}
|
||||
else {
|
||||
$tableExcel.clearData();
|
||||
$("#rowTotCnt").text(0); //총건수 수정
|
||||
$("#rowDupCnt").text(0); //중복건수 수정
|
||||
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
|
||||
}
|
||||
}
|
||||
|
||||
// 주소록 그룹정보 불러오기
|
||||
function getAddrGroupList() {
|
||||
$.ajax({
|
||||
type : "POST",
|
||||
async : false,
|
||||
url : "/web/mjon/addr/addrGroupListAjax.do",
|
||||
data : {},
|
||||
dataType:'json',
|
||||
success : function(data) {
|
||||
//alert(JSON.stringify(data.addrGroupList));
|
||||
|
||||
// Show Html
|
||||
getAddrGroupListShow(data.addrGroupList);
|
||||
},
|
||||
error : function(xhr, status, error) {
|
||||
alert(error);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Show Html
|
||||
function getAddrGroupListShow(jsonList) {
|
||||
var sHtml = "";
|
||||
sHtml += "<option value='NEW'>그룹추가</option>";
|
||||
sHtml += "<option value='0'>그룹미지정</option>";
|
||||
sHtml += "<option value='bookmark'>자주보내는 번호</option>";
|
||||
for (var j = 0; j < jsonList.length; j++) {
|
||||
sHtml += " <option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
|
||||
}
|
||||
|
||||
$("#addrGrpIdInfo").html(sHtml);
|
||||
}
|
||||
|
||||
$(document).on('change', '#addrGrpIdInfo', function() {
|
||||
if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
|
||||
$("#addrGrpNm").val(""); // 새그룹명 Clear;
|
||||
}
|
||||
});
|
||||
|
||||
//#############################################################################################
|
||||
//파일 불러오기
|
||||
//#############################################################################################
|
||||
|
||||
//엑섹불러오기 버튼 클릭시 파일 첨부 실행
|
||||
$(document).on('click', '.c3', function() {
|
||||
$("#excelFile").click();
|
||||
});
|
||||
|
||||
//체크박스 전체선택/해제
|
||||
$(document).on("click", "#chkAll", function(e) {
|
||||
var isChecked = $(this).is(":checked");
|
||||
$("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
||||
});
|
||||
|
||||
$(document).on("click", "#duplicationChkAll", function(e) {
|
||||
var isChecked = $(this).is(":checked");
|
||||
$("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 중복 연락처
|
||||
function GetAddrMassDupli() {
|
||||
var sHtml = "";
|
||||
sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
|
||||
sHtml += "<table class='tType4'>";
|
||||
sHtml += " <colgroup>";
|
||||
sHtml += " <col style='width:auto' />";
|
||||
sHtml += " </colgroup>";
|
||||
sHtml += " <thead>";
|
||||
sHtml += " <tr>";
|
||||
sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(dupliPhoneDataRealList.length) + "개)</th>";
|
||||
sHtml += " </tr>";
|
||||
sHtml += " </thead>";
|
||||
sHtml += " <tbody>";
|
||||
for (var i = 0; i < dupliPhoneDataRealList.length; i++) {
|
||||
sHtml += " <tr>";
|
||||
sHtml += " <td>" + dupliPhoneDataRealList[i] + "</td>";
|
||||
sHtml += " </tr>";
|
||||
}
|
||||
sHtml += " </tbody>";
|
||||
sHtml += " </table>";
|
||||
sHtml += " </div>";
|
||||
|
||||
$("#addrMassDupli_layer").html(sHtml);
|
||||
}
|
||||
|
||||
//중복 연락처 => 저장시
|
||||
function GetAddrMassSaveDupli() {
|
||||
var sHtml = "";
|
||||
sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
|
||||
sHtml += "<table class='tType4'>";
|
||||
sHtml += " <colgroup>";
|
||||
sHtml += " <col style='width:auto' />";
|
||||
sHtml += " </colgroup>";
|
||||
sHtml += " <thead>";
|
||||
sHtml += " <tr>";
|
||||
// sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(addrMassDupliSaveList.length) + "개)</th>";
|
||||
sHtml += " <th>중복 휴대폰번호 (10개)</th>";
|
||||
sHtml += " </tr>";
|
||||
sHtml += " </thead>";
|
||||
sHtml += " <tbody>";
|
||||
for (var i = 0; i < addrMassDupliSaveList.length; i++) {
|
||||
sHtml += " <tr>";
|
||||
sHtml += " <td>" + addrMassDupliSaveList[i].addrPhoneNo + "</td>";
|
||||
sHtml += " </tr>";
|
||||
}
|
||||
sHtml += " </tbody>";
|
||||
sHtml += " </table>";
|
||||
sHtml += " </div>";
|
||||
|
||||
$("#addrMassSaveDupli_layer").html(sHtml);
|
||||
}
|
||||
|
||||
</script>
|
||||
<!-- 엑셀입력 -->
|
||||
<div class="popCont current pop_more_cont" id="popCont_1">
|
||||
<div class="titBox">
|
||||
<p>- 엑셀(EXCEL) 파일로 주소록을 한 번에 최대 2만건까지 등록하여 간편하게 발송 및 관리하실 수 있습니다.</p>
|
||||
<p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 작성하셔야 합니다.</p>
|
||||
<p> ※ 주소록 관리 메뉴에서 다운로드 받으신 엑셀 파일 또한 업로드 양식에 맞추어 작성하셔야 하며, </p>
|
||||
<p> 주소록에 이미 등록된 휴대폰 번호는 업데이트 되지 않으므로 기존 주소록에서 해당 휴대폰 번호를 삭제한 후 재등록해 주시기 바랍니다.</p>
|
||||
<p>- 쉼표(,), 구분선(|), 역슬래시(\, ₩), 작은따옴표('), 큰따옴표(") 등 발송불가 특수문자는 저장되지 않습니다.</p>
|
||||
<p>- 휴대폰 번호는 필수입력 항목입니다.</p>
|
||||
<p>- 전화번호 형태는 010-1234-5678 또는 01012345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p>
|
||||
<p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p>
|
||||
<p>- 이름 20byte, [*1*]~[*4*] 40byte, 메모 250byte까지 입력 가능합니다.</p>
|
||||
<p>- 첨부가능 파일 : xlsx, xls(최대용량 3MB)</p>
|
||||
<p>- ‘오류 검사’를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다.</p>
|
||||
<p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
|
||||
<button type="button" class="excel_btn" onclick="location.href='/download/addr/주소록_대량등록.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
|
||||
</div>
|
||||
<div class="pop_more_wrap">
|
||||
<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
|
||||
</div>
|
||||
</div><!--// 엑셀입력 -->
|
||||
|
||||
<!-- 공통 -->
|
||||
<div>
|
||||
<table class="layer_tType1">
|
||||
<caption>엑셀입력 표</caption>
|
||||
<colgroup>
|
||||
<col style="width: 95px">
|
||||
<col style="width: auto">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>그룹 선택</th>
|
||||
<td>
|
||||
<label for="" class="label">그룹 선택</label>
|
||||
<select id="addrGrpIdInfo" name="addrGrpIdInfo">
|
||||
</select>
|
||||
<label for="" class="label">그룹명 입력</label>
|
||||
<input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
|
||||
|
||||
<!-- <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" onchange="excelExport(event); return false;" style="display:none"/> -->
|
||||
<input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/>
|
||||
<!-- <button type="button" id="file-load-trigger">Choose File</button> -->
|
||||
<button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="file_add upload_area">
|
||||
<p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요</p>
|
||||
</div>
|
||||
<div class="excel_middle2">
|
||||
<p>
|
||||
총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건
|
||||
|
||||
<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button>
|
||||
|
||||
<button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button>
|
||||
</p>
|
||||
<!-- <button type="button" class="btnType btnType6 addCallToF">번호추가</button> -->
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="adr_excel" style="margin-top: 13px;">
|
||||
<!-- thead -->
|
||||
<div class="adr_hd select_adr_hd" data-group="tableExcel">
|
||||
<div></div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="drag_drop_wrap callList_box" id="tabulator_excel">
|
||||
<img src="/publish/images/content/excel.jpg" style="width: 100%;">
|
||||
</div>
|
||||
<div class="excel_middle">
|
||||
<div class="select_btnWrap clearfix">
|
||||
<div>
|
||||
<button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button>
|
||||
<button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button>
|
||||
<button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button>
|
||||
<button type="button" class="check_validity">오류 검사 <i></i></button>
|
||||
<div class="error_hover_cont send_hover_cont addr_hover_cont">
|
||||
<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
|
||||
<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div><!--// 공통 -->
|
||||
|
||||
<!-- 붙여놓기 설명 -->
|
||||
<div class="req_area">
|
||||
<div class="text_box">
|
||||
- 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br>
|
||||
- 휴대폰 번호는 필수입력 항목입니다.<br>
|
||||
- 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br>
|
||||
- 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br>
|
||||
- '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다.
|
||||
</div>
|
||||
</div>
|
||||
697
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp
Normal file
697
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforSelf.jsp
Normal file
@ -0,0 +1,697 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||
|
||||
<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
|
||||
// 중복 휴대폰번호 버튼 노출여부
|
||||
// $("#btnAddrMassDupli").hide();
|
||||
// $("#btnAddrMassSaveDupli").hide();
|
||||
|
||||
//붙여넣기 이벤트 핸들러
|
||||
document.querySelector('#tabulator_clip').addEventListener('paste', function(e) {
|
||||
e.preventDefault();
|
||||
var text = e.clipboardData.getData('text/plain');
|
||||
var rows = text.split('\n').map(row => row.split(',').map(cell => cell.trim()));
|
||||
|
||||
var tableData = rows.map(row => {
|
||||
return {
|
||||
A: row[0] || "",
|
||||
B: row[1] || "",
|
||||
C: row[2] || "",
|
||||
D: row[3] || "",
|
||||
E: row[4] || "",
|
||||
F: row[5] || "",
|
||||
G: row[6] || ""
|
||||
};
|
||||
});
|
||||
|
||||
$tableClip.setData(tableData);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
function addrGroupLoadAjax(){
|
||||
$("#addrRegistSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
||||
$("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
|
||||
}
|
||||
|
||||
|
||||
function insertAddrGroupAjax() {
|
||||
var form = document.addrGrpInsertForm;
|
||||
if(form.addrGrpNm.value == "") {
|
||||
alert("주소록 그룹명을 입력해주세요.");
|
||||
return;
|
||||
}
|
||||
if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
|
||||
return;
|
||||
}
|
||||
var data = new FormData(form);
|
||||
|
||||
$.ajax({
|
||||
cache : false,
|
||||
url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />",
|
||||
type : 'POST',
|
||||
data : data,
|
||||
dataType:'json',
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success : function(returnData, status){
|
||||
if(status == "success") {
|
||||
if("fail"==returnData.result){
|
||||
alert(returnData.message);
|
||||
return;
|
||||
} else if("dupl"==returnData.result) {
|
||||
alert("중복된 그룹명입니다.");
|
||||
return;
|
||||
}
|
||||
alert("등록되었습니다.");
|
||||
listAddrGrp();
|
||||
addrGroupLoadAjax();
|
||||
|
||||
}else{ alert("ERROR!");return;}
|
||||
},
|
||||
error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function insertAddrAjax() {
|
||||
var selectVal = $("#addrRegistSelect option:selected").val();
|
||||
//alert(selectVal);
|
||||
|
||||
var form = document.addrInsertForm;
|
||||
/*
|
||||
//필수값 아니어서 뺐음
|
||||
if(form.addrNm.value == "") {
|
||||
alert("주소록 이름을 입력하세요");
|
||||
return;
|
||||
}
|
||||
*/
|
||||
if(form.addrPhoneNo.value == "") {
|
||||
alert("주소록 번호를 입력하세요");
|
||||
return;
|
||||
}
|
||||
//if(!confirm("주소록을 추가하시겠습니까?")) {
|
||||
// return;
|
||||
//}
|
||||
|
||||
if(!checkHpNum(form.addrPhoneNo.value)){//휴대폰 유효성 검사
|
||||
if(!checkNorPhoneNum(form.addrPhoneNo.value)){//일반전화 유효성 검사
|
||||
|
||||
alert("잘못된 휴대폰번호 또는 일반전화 번호 입니다.");
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var data = new FormData(form);
|
||||
|
||||
$.ajax({
|
||||
cache : false,
|
||||
url : "<c:url value='/web/mjon/addr/insertAddrAjax.do' />",
|
||||
type : 'POST',
|
||||
data : data,
|
||||
dataType:'json',
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success : function(returnData, status){
|
||||
if(status == "success") {
|
||||
if("fail"==returnData.result){
|
||||
alert(returnData.message);
|
||||
return;
|
||||
} else if("dupl"==returnData.result){
|
||||
alert("해당 그룹에 중복된 번호가 있습니다.");
|
||||
return;
|
||||
}
|
||||
//alert("저장 되었습니다.");
|
||||
|
||||
listAddrGrp();
|
||||
addrGroupLoadAjax();
|
||||
addrLoadAjax();
|
||||
|
||||
// 주소록그룹 콤보박스 유지
|
||||
setTimeout(setSelectSetting, 500, selectVal);
|
||||
|
||||
}else{ alert("ERROR!");return;}
|
||||
},
|
||||
error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// 주소록그룹 콤보박스 유지
|
||||
function setSelectSetting(selectVal) {
|
||||
$("#addrRegistSelect").val(selectVal).prop("selected", true);
|
||||
}
|
||||
|
||||
function linkPage(pageNo){
|
||||
if ($('#searchKeywordAddr').val() != "" && $('#searchKeywordAddr').val() != null && $('#searchKeywordAddr').val() != undefined) {
|
||||
// 문자전송 검색용
|
||||
$("#msgStartKeyword").val("");
|
||||
}
|
||||
|
||||
var searchForm = document.searchAddrForm;
|
||||
searchForm.pageIndex.value = pageNo;
|
||||
searchForm.pageUnit.value = $('#pageUnit').val();
|
||||
searchForm.searchCondition.value = $('#searchConditionAddr').val();
|
||||
searchForm.searchKeyword.value = $('#searchKeywordAddr').val();
|
||||
searchForm.startKeyword.value = $("#msgStartKeyword").val();
|
||||
|
||||
var sendData = $(document.searchAddrForm).serializeArray();
|
||||
$("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", sendData, function(response, status, xhr){tableAllChk();});
|
||||
addrGroupLoadAjax();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//#############################################################################################
|
||||
//Tabulator
|
||||
//#############################################################################################
|
||||
|
||||
$(document).ready(function(){
|
||||
//Tabulator AJAX Data Loading
|
||||
|
||||
// 파일 선택 버튼 클릭 이벤트
|
||||
$("#file-load-trigger").on("click", function() {
|
||||
$("#excelFile").click();
|
||||
});
|
||||
|
||||
// 파일 입력 이벤트
|
||||
$("#excelFile").on("change", function(event) {
|
||||
excelFileChange(event.target.files[0]);
|
||||
});
|
||||
|
||||
|
||||
|
||||
//받는사람 전체삭제 버튼 처리
|
||||
$('.all_del').click(function(){
|
||||
var data = $tableClip.getRows();
|
||||
if(data == null || data == ""){
|
||||
alert("받는사람을 추가해 주세요.");
|
||||
return false;
|
||||
}else{
|
||||
$tableClip.clearData();
|
||||
$("#rowTotCnt").text(0); //총건수 수정
|
||||
$("#rowDupCnt").text(0); //중복건수 수정
|
||||
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
// 받는사람 선택삭제 버튼 처리해주기
|
||||
$('.select_del').click(function(){
|
||||
$("#rowDupCnt").text(0); //중복건수 수정
|
||||
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
|
||||
|
||||
if($tableClip == null || $tableClip == ""){
|
||||
alert("받는사람을 추가해 주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
var selectedData = $tableClip.getSelectedRows();
|
||||
|
||||
if(selectedData == "" || selectedData == null){
|
||||
alert("받는 사람을 선택해 주세요.");
|
||||
return false;
|
||||
}else{ // 선택한 Row 데이터 삭제하기
|
||||
for(var i=0; i < selectedData.length; i++){
|
||||
selectedData[i].delete();
|
||||
}
|
||||
}
|
||||
|
||||
totRows = $tableClip.getRows().length;
|
||||
|
||||
updateTotCnt(totRows);
|
||||
});
|
||||
|
||||
//받는사람 오류번호 삭제 처리해주기
|
||||
$('.chkVali_del').click(function(){
|
||||
//기존 연락처 모두 불러오기
|
||||
var data = $tableClip.getRows();
|
||||
var tableData = [];
|
||||
var totLen = $tableClip.getRows().length;
|
||||
var errCnt = 0;
|
||||
|
||||
if(totLen > 0){
|
||||
if(confirm("올바르지 않은 연락처 정보를 삭제 하시겠습니까?")){
|
||||
for(var i=0; i < totLen; i++){
|
||||
|
||||
|
||||
var phone = data[i].getData().phone;
|
||||
var valiCheck = checkHpNum(phone);
|
||||
if(valiCheck){
|
||||
tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim(), info1:data[i].getData().info1, info2:data[i].getData().info2, info3:data[i].getData().info3, info4:data[i].getData().info4, memo:data[i].getData().memo});
|
||||
}else{
|
||||
errCnt++;
|
||||
}
|
||||
}
|
||||
|
||||
var removeDuplData = dupliPhoneData(tableData);
|
||||
|
||||
$tableClip.setData(removeDuplData);
|
||||
|
||||
//총 받는사람 수 계산
|
||||
totRows = $tableClip.getRows().length;
|
||||
updateTotCnt(totRows);
|
||||
|
||||
if(errCnt > 0){
|
||||
alert(errCnt + " 건의 연락처를 삭제하였습니다.");
|
||||
return false;
|
||||
}else{
|
||||
alert("오류가 있는 연락처가 없습니다.");
|
||||
}
|
||||
}
|
||||
}else{
|
||||
alert("연락처 정보를 입력해 주세요.");
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 오류검사 항목 중복제거
|
||||
function SetTableErrorDupliCheck(sVal) {
|
||||
var isDuplicate = false;
|
||||
if (tableErrorCheckData.length == 0) {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
else {
|
||||
for (var i = 0; i < tableErrorCheckData.length; i++)
|
||||
{
|
||||
if (tableErrorCheckData[i] == sVal) {
|
||||
isDuplicate = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isDuplicate) {
|
||||
return;
|
||||
}
|
||||
else {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 오류검사 항목 중복제거
|
||||
function SetTableErrorDupliCheck(sVal) {
|
||||
var isDuplicate = false;
|
||||
if (tableErrorCheckData.length == 0) {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
else {
|
||||
for (var i = 0; i < tableErrorCheckData.length; i++)
|
||||
{
|
||||
if (tableErrorCheckData[i] == sVal) {
|
||||
isDuplicate = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isDuplicate) {
|
||||
return;
|
||||
}
|
||||
else {
|
||||
tableErrorCheckData.push(sVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('.check_validity').click(function(){
|
||||
tableErrorCheckData.length = 0; // 오류 번호 배열 초기화
|
||||
|
||||
var data = $tableClip.getRows();
|
||||
var invalid = $tableClip.getInvalidCells(); //오류 데이터 체크
|
||||
var dataLen = $tableClip.getRows().length; //연락처 데이터 갯수
|
||||
var totLen = invalid.length; //오류 데이터 갯수
|
||||
var errMsg = ""; //최종 alert에 표시할 메시지 저장 변수
|
||||
|
||||
if(dataLen > 0) { //연락처 정보가 있으면 수행
|
||||
if(totLen > 0) { //내용에 오류가 있으면 수행
|
||||
//오류 데이터 값 저장
|
||||
for(var i=0; i < totLen; i++) {
|
||||
var cellValue = invalid[i].getValue();
|
||||
SetTableErrorDupliCheck(cellValue);
|
||||
}
|
||||
|
||||
for(var i=0; i < dataLen; i++){
|
||||
// 휴대폰번호 체크
|
||||
var phone = data[i].getData().phone;
|
||||
var valiCheck = checkHpNum(phone);
|
||||
if(!valiCheck){
|
||||
SetTableErrorDupliCheck(phone);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for(var i=0; i < dataLen; i++){
|
||||
// 휴대폰번호 체크
|
||||
var phone = data[i].getData().phone;
|
||||
var valiCheck = checkHpNum(phone);
|
||||
if(!valiCheck){
|
||||
SetTableErrorDupliCheck(phone);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
alert("연락처를 입력해 주세요.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (tableErrorCheckData.length > 0) {
|
||||
for (var i = 0; i < tableErrorCheckData.length; i++)
|
||||
{
|
||||
errMsg += tableErrorCheckData[i];
|
||||
if ((tableErrorCheckData.length - 1) > i) {
|
||||
errMsg += ", ";
|
||||
}
|
||||
}
|
||||
alert(errMsg + "의 내용에 오류가 있습니다.");
|
||||
}
|
||||
else {
|
||||
alert("오류 데이터가 없습니다.");
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
|
||||
//받는사람 중복 삭제
|
||||
$('.duple_del').click(function(){
|
||||
//기존 연락처 모두 불러오기
|
||||
var data = $tableClip.getRows();
|
||||
var tableData = [];
|
||||
var dpCnt = 0;
|
||||
var totLen = $tableClip.getRows().length;
|
||||
|
||||
for(var i=0; i < totLen; i++){
|
||||
tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim()});
|
||||
}
|
||||
|
||||
var removeDuplData = dupliPhoneData(tableData);
|
||||
$tableClip.setData(removeDuplData);
|
||||
|
||||
//총 받는사람 수 계산
|
||||
totRows = $tableClip.getRows().length;
|
||||
updateTotCnt(totRows);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
// Show Html
|
||||
function getAddrGroupListShow(jsonList) {
|
||||
var sHtml = "";
|
||||
sHtml += "<option value='NEW'>그룹추가</option>";
|
||||
sHtml += "<option value='0'>그룹미지정</option>";
|
||||
sHtml += "<option value='bookmark'>자주보내는 번호</option>";
|
||||
for (var j = 0; j < jsonList.length; j++) {
|
||||
sHtml += " <option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
|
||||
}
|
||||
|
||||
$("#addrGrpIdInfo").html(sHtml);
|
||||
}
|
||||
|
||||
$(document).on('change', '#addrGrpIdInfo', function() {
|
||||
if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
|
||||
$("#addrGrpNm").val(""); // 새그룹명 Clear;
|
||||
}
|
||||
});
|
||||
|
||||
//#############################################################################################
|
||||
//파일 불러오기
|
||||
//#############################################################################################
|
||||
|
||||
|
||||
//체크박스 전체선택/해제
|
||||
$(document).on("click", "#chkAll", function(e) {
|
||||
var isChecked = $(this).is(":checked");
|
||||
$("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
||||
});
|
||||
|
||||
$(document).on("click", "#duplicationChkAll", function(e) {
|
||||
var isChecked = $(this).is(":checked");
|
||||
$("input[name=addrCheck]:checkbox").prop("checked", isChecked);
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 중복 연락처
|
||||
function GetAddrMassDupli() {
|
||||
var sHtml = "";
|
||||
sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
|
||||
sHtml += "<table class='tType4'>";
|
||||
sHtml += " <colgroup>";
|
||||
sHtml += " <col style='width:auto' />";
|
||||
sHtml += " </colgroup>";
|
||||
sHtml += " <thead>";
|
||||
sHtml += " <tr>";
|
||||
sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(dupliPhoneDataRealList.length) + "개)</th>";
|
||||
sHtml += " </tr>";
|
||||
sHtml += " </thead>";
|
||||
sHtml += " <tbody>";
|
||||
for (var i = 0; i < dupliPhoneDataRealList.length; i++) {
|
||||
sHtml += " <tr>";
|
||||
sHtml += " <td>" + dupliPhoneDataRealList[i] + "</td>";
|
||||
sHtml += " </tr>";
|
||||
}
|
||||
sHtml += " </tbody>";
|
||||
sHtml += " </table>";
|
||||
sHtml += " </div>";
|
||||
|
||||
$("#addrMassDupli_layer").html(sHtml);
|
||||
}
|
||||
|
||||
//중복 연락처 => 저장시
|
||||
function GetAddrMassSaveDupli() {
|
||||
var sHtml = "";
|
||||
sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
|
||||
sHtml += "<table class='tType4'>";
|
||||
sHtml += " <colgroup>";
|
||||
sHtml += " <col style='width:auto' />";
|
||||
sHtml += " </colgroup>";
|
||||
sHtml += " <thead>";
|
||||
sHtml += " <tr>";
|
||||
// sHtml += " <th>중복 휴대폰번호 (" + numberWithCommas(addrMassDupliSaveList.length) + "개)</th>";
|
||||
sHtml += " <th>중복 휴대폰번호 (10개)</th>";
|
||||
sHtml += " </tr>";
|
||||
sHtml += " </thead>";
|
||||
sHtml += " <tbody>";
|
||||
for (var i = 0; i < addrMassDupliSaveList.length; i++) {
|
||||
sHtml += " <tr>";
|
||||
sHtml += " <td>" + addrMassDupliSaveList[i].addrPhoneNo + "</td>";
|
||||
sHtml += " </tr>";
|
||||
}
|
||||
sHtml += " </tbody>";
|
||||
sHtml += " </table>";
|
||||
sHtml += " </div>";
|
||||
|
||||
$("#addrMassSaveDupli_layer").html(sHtml);
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<!-- 붙여넣기 -->
|
||||
<div class="popCont pop_more_cont" id="popCont_2">
|
||||
<div class="titBox">
|
||||
<p>- 텍스트(txt) 파일로 작성된 주소록을 등록하실 수 있습니다.</p>
|
||||
<p>- 반드시 샘플파일을 다운로드하여 작성방법을 확인하신 후 정해진 양식에 맞추어 주소록을 붙여 넣으셔야 합니다.</p>
|
||||
<p>- 입력 내용은 (Tab) 또는 (,) 구분하여 입력하여야 합니다.</p>
|
||||
<p>- 한 줄(열)에 주소 한 건만 입력 가능합니다.</p>
|
||||
<p>- 전화번호 형태는 010-1234-5678 또는 01012345678 모두 가능합니다. 단, 공백은 허용되지 않습니다.</p>
|
||||
<p> (예) 홍길동,010-1234-5678 또는 홍길동,01012345678</p>
|
||||
<p>- 한번에 많은 양의 데이터를 입력하시려면 ‘주소록 복사(Ctrl+c) + 붙여넣기(Ctrl+v)’ 또는 ‘엑셀입력’을 이용하세요.</p>
|
||||
<p>- 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하시면 됩니다.</p>
|
||||
<button type="button" class="txt_btn" onclick="location.href='/download/addr/주소록_대량등록.zip'"><i></i>TXT샘플 다운로드</button>
|
||||
</div>
|
||||
<div class="pop_more_wrap">
|
||||
<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
|
||||
</div>
|
||||
</div><!--// 붙여넣기 -->
|
||||
|
||||
<!-- 공통 -->
|
||||
<div>
|
||||
<table class="layer_tType1">
|
||||
<caption>엑셀입력 표</caption>
|
||||
<colgroup>
|
||||
<col style="width: 95px">
|
||||
<col style="width: auto">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>그룹 선택</th>
|
||||
<td>
|
||||
<label for="" class="label">그룹 선택</label>
|
||||
<select id="addrGrpIdInfo" name="addrGrpIdInfo">
|
||||
</select>
|
||||
<label for="" class="label">그룹명 입력</label>
|
||||
<input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
|
||||
|
||||
<!-- <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" onchange="excelExport(event); return false;" style="display:none"/> -->
|
||||
<input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/>
|
||||
<!-- <button type="button" id="file-load-trigger">Choose File</button> -->
|
||||
<button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="file_add upload_area">
|
||||
<p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀, TXT파일을 여기에 끌어다 놓으세요</p>
|
||||
</div>
|
||||
<div class="excel_middle2">
|
||||
<p>
|
||||
총 <span class="c_e40000 fwBold" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a fwBold" id="rowDupCnt">0</span>건
|
||||
<!-- -->
|
||||
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button> -->
|
||||
<!-- -->
|
||||
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> -->
|
||||
</p>
|
||||
<button type="button" class="btnType btnType6 addCallToF">번호추가</button>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="adr_excel" style="margin-top: 13px;">
|
||||
<!-- thead -->
|
||||
<div class="adr_hd select_adr_hd" data-group="tabulClip">
|
||||
<div></div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width: 125px;">
|
||||
<label for="" class="label"></label>
|
||||
<select class="field-selector">
|
||||
<option value="">선택하기</option>
|
||||
<option value="addrNm">이름</option>
|
||||
<option value="addrPhoneNo">휴대폰</option>
|
||||
<option value="addrInfo1">[*1*]</option>
|
||||
<option value="addrInfo2">[*2*]</option>
|
||||
<option value="addrInfo3">[*3*]</option>
|
||||
<option value="addrInfo4">[*4*]</option>
|
||||
<option value="addrComment">메모</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="drag_drop_wrap callList_box" id="tabulator_clip">
|
||||
<img src="/publish/images/content/excel.jpg" style="width: 100%;">
|
||||
</div>
|
||||
<div class="excel_middle">
|
||||
<div class="select_btnWrap clearfix">
|
||||
<div>
|
||||
<button type="button" class="all_del"><i class="remove_img"></i>전체삭제</button>
|
||||
<button type="button" class="select_del"><i class="remove_img"></i>선택삭제</button>
|
||||
<button type="button" class="chkVali_del"><i class="remove_img"></i>오류번호삭제</button>
|
||||
<button type="button" class="check_validity">오류 검사 <i></i></button>
|
||||
<div class="error_hover_cont send_hover_cont addr_hover_cont">
|
||||
<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
|
||||
<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div><!--// 공통 -->
|
||||
|
||||
<!-- 붙여놓기 설명 -->
|
||||
<div class="req_area">
|
||||
<div class="text_box">
|
||||
- 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br>
|
||||
- 휴대폰 번호는 필수입력 항목입니다.<br>
|
||||
- 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br>
|
||||
- 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br>
|
||||
- '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다.
|
||||
</div>
|
||||
</div>
|
||||
117
src/main/webapp/js/web/addr/event.js
Normal file
117
src/main/webapp/js/web/addr/event.js
Normal file
@ -0,0 +1,117 @@
|
||||
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
|
||||
//타이틀 select 선택 이벤트
|
||||
$('[data-group]').on('change', '.field-selector', function() {
|
||||
|
||||
var group = $(this).closest('[data-group]').data('group');
|
||||
var selectedFields = [];
|
||||
var isDuplicate = false;
|
||||
|
||||
|
||||
// 타불 객체 가져오기
|
||||
var $objTabul = fn_utils_getTabulator();
|
||||
|
||||
console.log('$objTabul : ', $objTabul);
|
||||
|
||||
if($objTabul.getData().length < 1){
|
||||
alert('데이터 입력 후 선택해 주세요.');
|
||||
$(this).val("");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 중복체크
|
||||
$('[data-group="' + group + '"] .field-selector').each(function() {
|
||||
var selectedField = $(this).val();
|
||||
if (selectedField) {
|
||||
if (selectedFields.includes(selectedField)) {
|
||||
alert("중복된 필드를 선택할 수 없습니다.");
|
||||
$(this).val(""); // 중복 필드를 선택한 경우 빈 값으로 초기화
|
||||
isDuplicate = true;
|
||||
return false; // 반복문 종료
|
||||
}
|
||||
selectedFields.push(selectedField);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//
|
||||
updateTableFields($objTabul, group);
|
||||
|
||||
// 필드가 휴대폰이면 열 중복체크
|
||||
if($(this).val() == 'phone'){
|
||||
fn_phoneDupl($objTabul);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function fn_phoneDupl($objTabul){
|
||||
|
||||
var phoneFields = $objTabul.getData().map(row => row.phone);
|
||||
|
||||
if(phoneFields.length < 1){ return false; }
|
||||
|
||||
var uniquePhones = new Set();
|
||||
var duplicatePhones = [];
|
||||
|
||||
phoneFields.forEach(phone => {
|
||||
if (uniquePhones.has(phone)) {
|
||||
duplicatePhones.push(phone);
|
||||
} else {
|
||||
uniquePhones.add(phone);
|
||||
}
|
||||
});
|
||||
|
||||
$('#rowDupCnt').text(duplicatePhones.length);
|
||||
if (duplicatePhones.length > 0) {
|
||||
alert("중복된 휴대폰 번호가 있습니다: \n" + duplicatePhones.join(", "));
|
||||
} else {
|
||||
// alert("중복된 phone 필드 값이 없습니다.");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 타이틀 select 선택할때마다 실행해서
|
||||
* 데이터테이블 필드값 수정
|
||||
*/
|
||||
function updateTableFields($objTabul, group) {
|
||||
var currentData = $objTabul.getData();
|
||||
var columns = [
|
||||
{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
|
||||
cell.getRow().toggleSelect();
|
||||
}}
|
||||
];
|
||||
|
||||
var fieldMapping = [];
|
||||
$('[data-group="' + group + '"] .field-selector').each(function(index) {
|
||||
var selectedField = $(this).val();
|
||||
// ASCII 문자 코드 사용 - 65=A, 66=B ...
|
||||
var field = String.fromCharCode(65 + index);
|
||||
if (selectedField) {
|
||||
columns.push({title: field, field: selectedField, hozAlign: "center", headerHozAlign: "center", editor: "input", width: 125, validator: ["maxLength:100", "string"]});
|
||||
fieldMapping.push(selectedField);
|
||||
} else {
|
||||
columns.push({title: field, field: field, hozAlign: "center", headerHozAlign: "center", editor: "input", width: 125, validator: ["maxLength:100", "string"]});
|
||||
fieldMapping.push(field);
|
||||
}
|
||||
});
|
||||
|
||||
var updatedData = currentData.map(row => {
|
||||
var newRow = {};
|
||||
fieldMapping.forEach((field, index) => {
|
||||
newRow[field] = row[Object.keys(row)[index]] || "";
|
||||
});
|
||||
return newRow;
|
||||
});
|
||||
|
||||
$objTabul.setColumns(columns);
|
||||
$objTabul.setData(updatedData);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
});
|
||||
120
src/main/webapp/js/web/addr/init.js
Normal file
120
src/main/webapp/js/web/addr/init.js
Normal file
@ -0,0 +1,120 @@
|
||||
|
||||
|
||||
var tableErrorData = [];
|
||||
var tableErrorCheckData = [];
|
||||
var addrMassDupliSaveList = null;
|
||||
|
||||
var gArrRestartIndex = 0; //배열 재시작카운드
|
||||
var gNameList = []; //치환문자 이름
|
||||
var gPhoneList = []; //받는사람
|
||||
var gInfo1List = []; //치환문자1
|
||||
var gInfo2List = []; //치환문자2
|
||||
var gInfo3List = []; //치환문자3
|
||||
var gInfo4List = []; //치환문자4
|
||||
var gMemoList = []; //메모
|
||||
|
||||
|
||||
var $tableExcel = null; //엑셀입력 탭
|
||||
var $tableClip = null; //붙여넣기 탭
|
||||
var $tableSelf = null; //붙여넣기 탭
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
//Tabulator AJAX Data Loading
|
||||
$tableExcel = new Tabulator("#tabulator_excel", {
|
||||
height:"255px",
|
||||
width:"100%",
|
||||
layout:"fitColumns",
|
||||
autoColumns:false,
|
||||
headerHozAlign:"center",
|
||||
validationMode:"highlight",
|
||||
clipboard:false,
|
||||
clipboardCopySelector:"table",
|
||||
clipboardPasteAction:"insert", // insert, update, replace
|
||||
placeholder:"Excel 파일을 업로드 해주세요.", //fit columns to width of table (optional)
|
||||
columns:[ //Define Table Columns
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){
|
||||
cell.getRow().toggleSelect();
|
||||
}
|
||||
},
|
||||
{title:"A", hozAlign:"center", headerHozAlign: "center", field:"A", editor:"input", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"B", hozAlign:"center", headerHozAlign: "center", field:"B", editor:"input", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"C", hozAlign:"center", headerHozAlign: "center", field:"C", editor:"input", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"D", hozAlign:"center", headerHozAlign: "center", field:"D", editor:"input", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"E", hozAlign:"center", headerHozAlign: "center", field:"E", editor:"input", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"F", hozAlign:"center", headerHozAlign: "center", field:"F", editor:"input", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"G", hozAlign:"center", headerHozAlign: "center", field:"G", editor:"input", width:125, validator:["maxLength:100", "string"]}
|
||||
],
|
||||
validationFailed:function(cell, value, parameters){ // 유효성 체크 함수
|
||||
var valid = cell.isValid();
|
||||
if(!valid){
|
||||
alert("양식에 맞지 않는 정보가 입력되었습니다.");
|
||||
|
||||
//해당 셀 데이터 삭제
|
||||
cell.setValue("");
|
||||
}
|
||||
return value % parameters.phone;
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$tableClip = new Tabulator("#tabulator_clip", {
|
||||
height:"255px",
|
||||
width:"100%",
|
||||
layout:"fitColumns",
|
||||
editor:true,
|
||||
headerHozAlign:"center",
|
||||
validationMode:"highlight",
|
||||
placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional)
|
||||
clipboard:true, // 클립보드 기능 활성화
|
||||
clipboardPasteAction:"insert", // insert, update, replace
|
||||
clipboardPasteParser: function(clipboard) {
|
||||
|
||||
// clipboard 기능
|
||||
var rows = clipboard.split('\n').map(row => row.split(/[\t,]+/).map(cell => cell.trim()));
|
||||
console.log('rows : ', rows);
|
||||
var tableData = rows.map(row => {
|
||||
return {
|
||||
A: row[0] || "",
|
||||
B: row[1] || "",
|
||||
C: row[2] || "",
|
||||
D: row[3] || "",
|
||||
E: row[4] || "",
|
||||
F: row[5] || "",
|
||||
G: row[6] || ""
|
||||
};
|
||||
});
|
||||
return tableData;
|
||||
},
|
||||
columns: [
|
||||
{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
|
||||
cell.getRow().toggleSelect();
|
||||
}},
|
||||
{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"D", field:"D", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"E", field:"E", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"F", field:"F", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]},
|
||||
{title:"G", field:"G", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]}
|
||||
],
|
||||
validationFailed:function(cell, value, parameters){ // 유효성 체크 함수
|
||||
var valid = cell.isValid();
|
||||
if(!valid){
|
||||
alert("양식에 맞지 않는 정보가 입력되었습니다.");
|
||||
|
||||
//해당 셀 데이터 삭제
|
||||
cell.setValue("");
|
||||
}
|
||||
return value % parameters.phone;
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
});
|
||||
24
src/main/webapp/js/web/addr/utils.js
Normal file
24
src/main/webapp/js/web/addr/utils.js
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
/*
|
||||
* @discription 타블레이터 객체 가져오기
|
||||
* */
|
||||
function fn_utils_getTabulator(){
|
||||
|
||||
var activeTab = $('#tbTabl .tab.active');
|
||||
// data-tabul 값 가져오기
|
||||
var tabulValue = activeTab.data('tabul');
|
||||
console.log('tabulValue : ',tabulValue);
|
||||
|
||||
return window['$' + tabulValue];
|
||||
}
|
||||
|
||||
function fn_utils_isEmpty(obj){
|
||||
return obj == null || obj == "";
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user