/** * 공통 스크립트 함수 * gcone.js */ /************************************************************** * CK editor객체 선언 ****************************************************************/ let CKEditorArray = []; /************************************************************** * CKeditor 생성 * 파라미터 설명{ * selectorId : CKediotr가 생성될 HTML Object ID * data : ediotr영역에 출력할 데이터 * } ****************************************************************/ const fn_create_ckeditor = function (selectorId, shopCd, data) { CKSource .Editor .create(document.querySelector(selectorId), { //extraPlugins: [gconeUploadAdapterPlugin], removePlugins: [ 'Markdown', 'Title' ], toolbar: { items: [ 'undo', 'redo', '|', 'findAndReplace', 'selectAll', '|', 'link', 'insertImage', 'insertTable', 'blockQuote', 'mediaEmbed', 'codeBlock', 'horizontalLine', 'specialCharacters', '|', 'outdent', 'indent', '|', 'bulletedList', 'numberedList', 'todoList', '-', 'heading', 'style', '|', 'bold', 'italic', 'underline', 'strikethrough', { label: 'Basic styles', icon: 'text', items: [ 'fontSize', 'fontFamily', 'fontColor', 'fontBackgroundColor', 'highlight', 'superscript', 'subscript', 'code' ], }, 'removeFormat', '|', 'alignment', 'pageBreak', '|', 'sourceEditing' ], shouldNotGroupWhenFull: true }, mediaEmbed: { previewsInData: true, }, // 모든 콘텐츠 허용 htmlSupport: { allow: [ { name: /.*/, // 모든 태그 attributes: true, // 모든 속성 허용 styles: true, // 모든 스타일 허용 classes: true, // 모든 클래스 허용 }, ], disallow: [], }, htmlEmbed: { showPreviews: true, }, style: { definitions: [ { name: 'Title', element: 'h1', classes: ['document-title'], }, { name: 'Subtitle', element: 'h2', classes: ['document-subtitle'], }, { name: 'Callout', element: 'p', classes: ['callout'], }, { name: 'Side quote', element: 'blockquote', classes: ['side-quote'], }, { name: 'Needs clarification', element: 'span', classes: ['needs-clarification'], }, { name: 'Wide spacing', element: 'span', classes: ['wide-spacing'], }, { name: 'Small caps', element: 'span', classes: ['small-caps'], }, { name: 'Code (dark)', element: 'pre', classes: ['stylish-code', 'stylish-code-dark'], }, { name: 'Code (bright)', element: 'pre', classes: ['stylish-code', 'stylish-code-bright'], }, ], }, }).then(editor => { if (data != null) { editor.setData(data); } CKEditorArray[selectorId] = editor; editor.plugins.get('FileRepository').createUploadAdapter = (loader) => { // return new UploadAdapter(loader,'/file/ckeditor/image/fileUpload?shopCd='+shopCd); return new UploadAdapter(loader,'/mngr/file/ckeditorFileUpload?shopCd='+shopCd); }; }).catch(error => { console.log(error); }); } /************************************************************** * CKeditor에 작성된 값 가져오기 * 파라미터 설명{ * selectorId : CKediotr가 생성된 HTML Object ID * } ****************************************************************/ const fn_get_editor_data = function (selectorId) { return CKEditorArray[selectorId].getData(); } /************************************************************** * CKeditor에 특정값 설정하기 * 파라미터 설명{ * selectorId : CKediotr가 생성된 HTML Object ID * data : 에디터 영역에 설정할 내용 * } ****************************************************************/ const fn_set_editor_data = function (selectorId, data) { return CKEditorArray[selectorId].setData(data); } // gconeUploadAdapterPlugin 정의 const gconeUploadAdapterPlugin = function (editor) { editor.plugins.get('FileRepository').createUploadAdapter = (loader) => { return new UploadAdapter(loader,'/mngr/file/ckeditorFileUpload'); }; }; /************************************************************** * JSON 객체인지 확인하는 script ****************************************************************/ const fn_check_json = function (str) { try { let json = JSON.parse(str); return (typeof json === 'object'); } catch (e) { return false; } } /************************************************************** * Tab영역 활성화/비활성화 * 파라미터 설명{ * index : 선택된 Tab버튼 순서 * } ****************************************************************/ const fn_set_content_tab = function (index) { const contentTabBtn = $(".content-tab__btn"); const contentTabContent = $(".content-tab__content"); contentTabBtn.removeClass("active"); contentTabContent.removeClass("active"); contentTabBtn.eq(index).addClass("active"); contentTabContent.eq(index).addClass("active"); } /* ******************************************************** * 카카오 주소 찾기 연동 * 파라미터 설명{ * callback : 카카오 주소 찾기 팝업에서 주소 선택 후 호출될 콜백함수 * } ******************************************************** */ const fn_select_postcode = function (callback) { new daum.Postcode({ oncomplete: function (data) { const postcode = data.zonecode; const roadAddr = data.roadAddress; const jibunAddress = data.jibunAddress; let addressType = ''; let extraRoadAddr = ''; // userSelectedType R/J 검색 결과에서 사용자가 선택한 주소의 타입(R : 도로명, J : 지번) if (data.userSelectedType == 'R') { addressType = '01'; } else { addressType = '02'; } // 법정동명이 있을 경우 추가한다. (법정리는 제외) // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다. if (data.bname !== '' && /[동|로|가]$/g.test(data.bname)) { extraRoadAddr += data.bname; } // 건물명이 있고, 공동주택일 경우 추가한다. if (data.buildingName !== '' || data.apartment === 'Y') { extraRoadAddr += (extraRoadAddr !== '' ? ', ' + data.buildingName : data.buildingName); } // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다. if (extraRoadAddr !== '' && roadAddr !== '') { extraRoadAddr = ' (' + extraRoadAddr + ')'; } callback({ postcode: postcode, roadAddress: roadAddr, jibunAddress: jibunAddress, addressType: addressType, extraAddress: extraRoadAddr }); } }).open(); } /************************************************************** * 모달팝업 열기 * 파라미터 설명{ * modalDivSltr : 모달팝업화면이 추가될 div html selector * modalSlrt : 모달팝업화면 html selector * url : 모달팝업화면을 조회할 url * param : 모달팝업화면을 조회 시 사용할 파라미터Object * callback : 모달팝업화면 조회 후 호출될 callback함수명 * } ****************************************************************/ const fn_open_modal = function (modalDivSltr, modalSlrt, url, param, callback) { let submitType = 'GET'; //파라미터가 있을 경우 POST처리 if (!param) { submitType = 'POST'; } $.ajax({ type: submitType, url: url, data: param, success: function (data) { //callback함수가 없을 경우 default로 지정된 영역에 모달팝업 화면을 교체하고 화면 로딩 if (!callback) { $(modalSlrt).remove(); $(modalDivSltr).html(data); $(modalSlrt).modal(); } else { callback(data); } } }); } /* ******************************************************** * 모달팝업 닫기 * 파라미터 설명{ * modalId : 모달 팝업 HTML Object ID * } ******************************************************** */ const fn_close_modal = function (modalId) { $("#" + modalId + " > a").each(function () { if (this.href.indexOf('.close-modal')) { $(this).click(); } }); $('#' + modalId).remove(); window.location.hash.replace('#', ''); } /* ************************************************************ * 모바일 모달 show 함수 * modalId : 콜백 함수 이름 ************************************************************* */ const openModal = (modalId) => { MicroModal.show(modalId, { onShow: function (modal) { // 이미 존재하지 않는 경우에만 Hash 추가 if (window.location.hash !== '#' + modalId) { window.history.replaceState({modal: 'open'}, '', '#' + modalId); } } }); window.history.replaceState({}, '', window.location.href.split('#')[0]); } /* ************************************************************ * 모바일 모달 show 함수 * modalId : 콜백 함수 이름 * message : 얼러트 내용 ************************************************************* */ const openModal_message = (modalId, message) => { MicroModal.show(modalId, { onShow: function (modal) { // 이미 존재하지 않는 경우에만 Hash 추가 if (window.location.hash !== '#' + modalId) { window.history.replaceState({modal: 'open'}, '', '#' + modalId); } $('.message').text(message); }, }); } /* ******************************************************** * 윈도우팝업 열기 * 파라미터 설명{ * url : controller method mapping 주소 * title : 팝업 제목 * w : 가로길이 * h : 세로길이 * } ******************************************************** */ const fn_open_windowPopup = function (url, title, w, h) { const dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left; const dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top; width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width; height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height; const left = ((width / 2) - (w / 2)) + dualScreenLeft; const top = ((height / 2) - (h / 2)) + dualScreenTop; const newWindow = window.open(url, title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left); if (window.focus) { newWindow.focus(); } } /* ******************************************************** * form 초기화 * 파라미터 설명{ * divId : 초기화 대상 divId * } ******************************************************** */ const fn_reset_form = function(formId){ if($('#'+formId)[0]){ const radioArr = []; $('#'+formId).eq(0).find('input,select,textarea').each(function(){ let type = this.type; let tag = this.tagName.toLowerCase(); let numberArr = $('#'+formId).find('.number'); //20240223수정 if (type === 'text') { if(type === 'text' || tag === 'textarea'){ this.value = ''; } if(numberArr.length > 0){//20240223수정 numberArr.each(function(idx){ numberArr.eq(idx).val('0'); }); } } else if (type === 'checkbox') { this.checked = false; } else if (type === 'radio') { this.checked = false; if(!radioArr.includes($(this).prop('name'))) { radioArr.push($(this).prop('name')); radioArr.forEach((element) => $('input[name='+element+']').eq(0).prop('checked', 'checked')); } } else if (tag === 'select') { this.selectedIndex = 0;//20240223수정 $(".select-box > select").niceSelect('update'); } }); //20240418 기능추가=> 20240604코드 수정 /*버튼 초기화*/ let dateRangeBtn = $('#' + formId).find('.dateRange-btnContainer'); if (dateRangeBtn.length > 0) { dateRangeBtn.each(function (idx) { let notBtn = dateRangeBtn.eq(idx).find(".dateRange-btn"); notBtn.each(function (idx1) { if (idx1 === 8) { notBtn.eq(idx1).addClass("selected"); } else { notBtn.eq(idx1).removeClass("selected"); } }); }); } //$('#'+formId)[0].reset(); } } /************************************************************** * 검색 날짜 지정시 날짜 변경 * 파라미터 설명{ * fromObjId : 시작일 * toObjId : 종료일 * stdObjeId : 기준일(시작일'fromObjId' or 종료일'toObjId') * date : 계산할 날짜 => '-(전) or +(후)' + '계산할 숫자' + 'D(일) or M(월) or Y(년)' * Ex) 현재 날짜에서 하루 전(후) => -1D(+1D) * 현재 날짜는 0 * } ****************************************************************/ const fn_set_date = function (fromObjId, toObjId, stdObjeId, date) { /* fromObj, toObj 값 변경 시 일자선택 버튼 초기화 추가 */ $('#' + fromObjId).on('change', function () { $(this).parent().parent().find('.dateRange-btn').each(function () { $(this).removeClass('selected'); }); fn_check_fromTo('#' + fromObjId, '#' + toObjId, 'date'); }); $('#' + toObjId).on('change', function () { $(this).parent().parent().find('.dateRange-btn').each(function () { $(this).removeClass('selected'); }); fn_check_fromTo('#' + fromObjId, '#' + toObjId, 'date'); }); /* 기준일 기본값 설정(종료일이 기준일) * ※toObjId or fromObjId로 설정 가능*/ if (!stdObjeId) { stdObjeId = toObjId; } /* 계산할 숫자 기본값 설정(현재 날짜가 기본값) 및 date 유효성 검사*/ if (!date) { /* onready시 전체 버튼 셀렉티드 class 부여*/ //date = '0'; $('#' + fromObjId).parent().parent().find('.dateRange-btn').eq(8).addClass("selected"); } else { //date의 형태가 숫자+'D, M, Y'경우인지 확인 let regex = /^\d+[DMY]$/; if (!regex.test(date)) { date = '0'; } } if (date != null) { if (date === '1D') { // 기준일을 현재 날짜로 설정 const today = new Date(); $('#' + stdObjeId).datepicker().datepicker("setDate", today); // 날짜 계산 let fromDate, toDate; let days = parseInt(date); fromDate = new Date(today); fromDate.setDate(today.getDate() - days); // 어제 toDate = new Date(fromDate); // 어제와 동일 // 시작일과 종료일 설정 $('#' + fromObjId).datepicker().datepicker("setDate", fromDate); $('#' + toObjId).datepicker().datepicker("setDate", toDate); } else { /* 기준일을 현재 날짜로 설정*/ $('#' + stdObjeId).datepicker().datepicker("setDate", new Date()); /* 기준일에 따라 계산 방법 분기 stdObjeId = toObjId => '-'+date = fromObjId => date*/ if (stdObjeId == toObjId) { date = '-' + date; $('#' + fromObjId).datepicker().datepicker("setDate", date); } else { $('#' + toObjId).datepicker().datepicker("setDate", date); } } } } /************************************************************** * FROM ~ TO 비교 * 파라미터 설명{ * fromSelector : 검색 시작 input 셀렉터 이름 ex)''#fromSelect' * toSelector : 검색 끝 input 셀렉터 이름 ex)''#toSelect' * valType : 비교할 대상의 타입 ex)'date' or 'number' * } ****************************************************************/ const fn_check_fromTo = function (fromSelector, toSelector, valType) { switch (valType) { case 'date' : if (!fn_check_date($(fromSelector).val(), $(toSelector).val())) { alert("'종료일'이 '시작일'보다 작습니다"); $(fromSelector).val(''); $(toSelector).val(''); setTimeout(function () { $(fromSelector).datepicker().datepicker("show"); }, 200); } break; case 'number' : if (!fn_check_number($(fromSelector).val(), $(toSelector).val())) { alert("'종료'값이 '시작'값보다 작습니다"); $(fromSelector).val(''); $(toSelector).val(''); $(fromSelector).focus(); } break; } } /************************************************************** * FROM ~ TO 비교 (date) * fn_check_fromTo() >case 'date' boolean 반환 함수 * => 시작, 끝 날짜 값이 둘 다 존재시 날짜 비교 * 끝 날짜가 시작 날짜보다 작으면 false를 반환 * 파라미터 설명{ * fromDate : 검색 시작 날짜 값 * toDate : 검색 끝 날짜 값 * } ****************************************************************/ const fn_check_date = function (fromDate, toDate) { let result = true; try { if (fromDate != null && toDate != null) { const srchStartDate = new Date(fromDate); const srchEndDate = new Date(toDate); if (srchStartDate > srchEndDate) { result = false; } } } catch (e) { console.log(e); } return result; } /************************************************************** * FROM ~ TO 비교 (number) * fn_check_fromTo() >case 'number' boolean 반환 함수 * => 시작, 끝 날짜 값이 둘 다 존재시 날짜 비교 * 끝 날짜가 시작 날짜보다 작으면 false를 반환 * 파라미터 설명{ * fromDate : 검색 시작 날짜 값 * toDate : 검색 끝 날짜 값 * } ****************************************************************/ const fn_check_number = function (fromNb, toNb) { if (fromNb == null) { fromNb = 0; } if (toNb == null) { toNb = 0; } let result = true; try { if (fromNb != null && toNb != null) { if (fromNb > toNb) { result = false; } } } catch (e) { console.log(e); } return result; } /************************************************************** * 전화번호(일반전화번호, 휴대전화번호, 대표번호) 자동 포매팅(-) 설정 * 파라미터 설명{ * target : 대상 Object * } ****************************************************************/ const fn_fmt_telno = function (target) { //숫자만 허용 target.val(target.val().replace(/[^0-9]/g, '')); if (target.val().length <= 12) { if (target.val().length == 12) { target.val(target.val().replace(/(\d{4})(\d{4})(\d{4})/, '$1-$2-$3')); }else if (target.val().length == 11) { //휴대전호번호 혹은 02를 제외한 전화번호 target.val(target.val().replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3')); }else if (target.val().length == 9) { //02를 포함한 9자리 전화번호(02-000-0000) target.val(target.val().replace(/(\d{2})(\d{3})(\d{4})/, '$1-$2-$3')); } else if (target.val().length == 8) { //대표전화번호 일경우(0000-0000) target.val(target.val().replace(/(\d{4})(\d{4})/, '$1-$2')); } else { if (target.val().indexOf('02') == 0) { //02를 포함한 10자리 전화번호(02-0000-0000) target.val(target.val().replace(/(\d{2})(\d{4})(\d{4})/, '$1-$2-$3')); } else { //02를 제외한 10자리 전화번호(032-000-0000) target.val(target.val().replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3')); } } } } /************************************************************** * 포매팅 (조회 값 포매팅) * 파라미터 설명{ * mbtlnb : 대상 텍스트 * } ****************************************************************/ const fn_format_mbtlnb = (mbtlnb) => { if(!fn_is_empty(mbtlnb)){ if (mbtlnb.length >= 8 && mbtlnb.length <= 12) { if(mbtlnb.length == 12){ mbtlnb = mbtlnb.replace(/(\d{4})(\d{4})(\d{4})/, '$1-$2-$3'); }else if (mbtlnb.length == 11) { //11자리 전화번호 mbtlnb = mbtlnb.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3'); }else if (mbtlnb.length == 9) { //02를 포함한 9자리 전화번호(02-000-0000) mbtlnb = mbtlnb.replace(/(\d{2})(\d{3})(\d{4})/, '$1-$2-$3'); } else if (mbtlnb.length == 8) { //대표전화번호 일경우(0000-0000) mbtlnb = mbtlnb.replace(/(\d{4})(\d{4})/, '$1-$2'); } else { if (mbtlnb.indexOf('02') == 0) { //02를 포함한 10자리 전화번호(02-0000-0000) mbtlnb = mbtlnb.replace(/(\d{2})(\d{4})(\d{4})/, '$1-$2-$3'); } else { //02를 제외한 10자리 전화번호(032-000-0000) mbtlnb = mbtlnb.replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3'); } } } } return mbtlnb; } /************************************************************** * 포매팅 * 계좌번호 자동 포매팅(-) 설정 * 파라미터 설명{ * target : 대상 Object * } ****************************************************************/ const fn_fmt_accuntno = function (target) { target.val(target.val().replace(/^[-]|[^0-9-]/gi, '')); } /************************************************************** * 공통코드 목록을 이용한 input element 생성 * 파라미터 설명{ * tgtSelector : 생성된 input element가 삽입될 DOM selector정보 * inputType : 생성된 input element type(radio, checkbox, select) * inputName : 생성된 input element name속성 * selectedValue : 생성된 input element 중 선택될(checked 혹은 selected) 값 * codeList : 공통코드 목록 JSON 객체 * initValue : select box의 초기값으로 노출 * } ****************************************************************/ const fn_add_codeList = function (tgtSelector, inputType, inputName, selectedValue, codeList, initValue) { let tgtChildreObj; //input이 추가될 dom에 있는 모든 element 초기화 $(tgtSelector).eq(0).children().remove(); switch (inputType) { case 'radio' : for (let idx = 0; idx < codeList.length; idx++) { tgtChildreObj = document.createElement("div"); tgtChildreObj.setAttribute("class", "custom-radio"); if (selectedValue == codeList[idx].cd) { tgtChildreObj.innerHTML = ''; } else { tgtChildreObj.innerHTML = ''; } $(tgtSelector).eq(0).append(tgtChildreObj); } break; case 'checkbox' : for (let idx = 0; idx < codeList.length; idx++) { tgtChildreObj = document.createElement("label"); tgtChildreObj.setAttribute("class", "b-checkbox checkbox"); if (selectedValue == codeList[idx].cd) { tgtChildreObj.innerHTML = '' + codeList[idx].cdNm + ''; } else { tgtChildreObj.innerHTML = '' + codeList[idx].cdNm + ''; } $(tgtSelector).eq(0).append(tgtChildreObj); } break; case 'select' : tgtChildreObj = document.createElement("div"); let selectInnerHtml = ''; tgtChildreObj.setAttribute("class", "select-box"); selectInnerHtml = ''; tgtChildreObj.innerHTML = selectInnerHtml; $(tgtSelector).eq(0).append(tgtChildreObj); $(".select-box > select").niceSelect(); break; } } /************************************************************** * datepicker 설정 수동적용 * 파라미터 설명{ * selector : datepicker가 적용될 DOM selector정보 * } ****************************************************************/ const fn_set_datepicker = function (selector) { if (!selector) { selector = '.datepicker'; } $(selector).each(function () { $(this).datepicker({ dateFormat: "yy-mm-dd", prevText: "이전 달", nextText: "다음 달", changeMonth: "true", changeYear: "true", dayNames: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"], dayNamesMin: ["일", "월", "화", "수", "목", "금", "토"], monthNames: [ "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월", ], monthNamesShort: [ "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월", ], showMonthAfterYear: true, yearSuffix: "년", firstDay: 0 }); }); } /***************************************************************** * 날짜 정규표현식 적용 * $(document).ready(function(){})에 호출 ****************************************************************/ const fn_check_date_regExp = () => { $(".datepicker").on("input", function () { // 입력 값 가져오기 let inputValue = $(this).val(); // 입력 값에서 한글 및 문자 제거 let cleanedValue = inputValue.replace(/[^0-9]/g, ''); // 날짜 형식 변경 (YYYYMMDD -> YYYY-MM-DD) let formattedDate = cleanedValue.replace(/^(\d{4})(\d{2})(\d{2})$/, '$1-$2-$3'); // 형식이 변경된 값을 다시 입력 필드에 설정 $(this).val(formattedDate); //maxlength 제한 let newMaxlength = 10; $(this).attr("maxlength", newMaxlength); }); } /************************************************************** * input * 특정 input(select)에 특정 event 발생시 처리할 함수 지정 * 파라미터 설명{ * selector : 대상 input Object selector * eventType : 대상 event종류(예시>keyup) * callback : 대상 event발생 시 호출될 callback함수 * } ****************************************************************/ const fn_set_event = function (selector, eventType, callback) { $(selector).on(eventType, function () { let target = $(this); callback(target); }); } /********************************************************************************* * input * 조건에 따른 대상input 활성화/비활성화 * 파라미터 설명{ * disArr : 비활성화 대상 input selector배열 * (체크박스의 경우 컨트롤할 영역만 파라미터를 넘겨줘야함 enArr -> []) * enArr : 활성화 대상 input selector배열 * element : 셀렉터 작성 -> $(this) * reveresAt : 체크박스일 경우 disable 영역 반전, default -> 체크시 enable * } **********************************************************************************/ const fn_ctrl_disable = function (disArr, enArr, element, reveresAt) { const fn_disable = function(disArr, enArr) { const propUpdate = function (selector, bool) { const boolean = bool; $(selector).find('input, select').each(function () { let type = this.type; let tag = this.tagName.toLowerCase(); if (type === 'text' || tag === 'textarea' || type === 'checkbox' || type === 'radio' || type === 'password') { this.disabled = boolean; } else if (tag === 'select') { this.disabled = boolean; $(this).niceSelect('update'); } }); }; if (disArr != null && disArr.length > 0) { const isTrue = true; for (let idx = 0; idx < disArr.length; idx++) { propUpdate(disArr[idx], isTrue); } } if (enArr != null && enArr.length > 0) { const isFalse = false; for (let idx = 0; idx < enArr.length; idx++) { propUpdate(enArr[idx], isFalse); } } } if (element) { const thisType = element.attr('type'); if (thisType === 'checkbox') { var isChecked = element.is(':checked'); if (reveresAt === 'Y') { if (isChecked == true) { fn_disable(disArr); } else if (isChecked == false) { fn_disable([], disArr); } } else { if (isChecked == true) { fn_disable([], disArr); } else if (isChecked == false) { fn_disable(disArr); } } } else { fn_disable(disArr, enArr); } } else { fn_disable(disArr, enArr); } } /************************************************************** * 데이터 NULL 여부 * 파라미터 설명 { * data : 데이터 * } ****************************************************************/ const fn_is_empty = (data) => { if (typeof data === 'undefined' || data === 'undefined' || data === null || data === '' || data === 'null' || data.length === 0 || (typeof input === 'object' && !Object.keys(data).length)) { return true; } else { return false; } } /************************************************************** * 데이터 NULL 일 경우 대체 문자 또는 데이터 반환 * 파라미터 설명 { * expr1 : 데이터 * expr2 : 대체 데이터 * } ****************************************************************/ const fn_nvl = function (expr1, expr2) { if (fn_is_empty(expr1)) { expr1 = expr2; } return expr1; } /************************************************************* * 텍스트, value값 제어 * 파라미터 설명 { * targetSelector : 바꿀 요소 셀렉터 * targetCn : 바꿀 내용 * } *************************************************************/ const fn_change_content = (targetSelector, targetCn) => { $(targetSelector).text(targetCn); $(targetSelector).val(targetCn); } /* ******************************************************** * tr 요소 추가 * 파라미터 설명 { * tableId(string) : 복제대상 tr 요소를 찾을 table Id * trIndex(integer) : 복제대상 tr의 index ( 특별한 경우 없을 시 0 ) * thisValue : 복제후 초기값 * propCtrl(string) : 속성 추가 ( readonly, disabled 등 ) * propBol(string) : true or false * rmSelectAt : select값 지울지 말지 여부 * } ******************************************************** */ const fn_add_tr = function (tableId ,trIndex, thisValue, propCtrl, propBol, rmSelectAt) { let count = 0; count = $('#' + tableId + ' > tbody').children('tr').length; // 동적 id 생성 count const addTrArea = $('#' + tableId + ' > tbody').find('tr').eq(trIndex).clone(); // 추가할 영역 복제 let addTrHtml = $('#' + tableId + ' > tbody').append(addTrArea); // 복제된 영역의 아이디값 동적 변경 addTrHtml.find('tr:last [id]').each(function () { var oldId = $(this).attr('id'); var newId = oldId + count; $(this).attr('id', newId); }); //요소 값 초기화 $('#' + tableId + ' > tbody > tr:last').find('input').each(function () { $(this).val(thisValue); if (propCtrl) { if (propBol == 'true') { $(this).prop(propCtrl, true); } else if (propBol == 'false') { $(this).prop(propCtrl, false); } } }); if (rmSelectAt != 'N') { $('#' + tableId + ' > tbody > tr:last').find('ul > li').each(function () { $(this).empty(); // li 안의 내용을 모두 비움 }); } $('.delete').each(function () { this.disabled = false; }); $('#' + tableId).tableDnDUpdate(); } /* ******************************************************** * tr 요소 삭제 * 파라미터 설명 { * tableId(string) : 삭제대상 tr 요소를 찾을 table Id * delLimit(integer) : 제한 삭제 개수 * 파라미터가 없을 경우 '데이터가 없습니다' 문구 출력 * } ******************************************************** */ const fn_delete_tr = function (tableId, delLimit) { let target = event.target; let trCnt = $('#' + tableId + ' > tbody tr').length if (delLimit) { if (trCnt == delLimit) { target.disabled = true; } } } /* ******************************************************** * 화면 show, hide * 파라미터 설명 { * showSelector: 보일 HTML * hideSelector: 숨길 HTML * disableAt : disable 여부 , Y * } * 숨길 때 disable 같이 ******************************************************** */ const fn_ui_showHide = function(showSelector, hideSelector, disableAt) { if (showSelector != '' && showSelector != null) { $(showSelector).show(); } if (hideSelector != '' && hideSelector != null) { $(hideSelector).hide(); } //disable Y일시 disable 함수 실행 if (disableAt == "Y") { fn_ctrl_disable([hideSelector], [showSelector]); } } /************************************************************** * checkbox * 체크박스 체크여부에 따른 전체 체크박스 제어 or 전체 체크박스 체크여부에 따른 체크박스 제어 * 파라미터 설명 { * ctrDv : 전체 체크박스에서 제어 시 param 넣기 * tgtSelector : 전체체크박스 대상 selector * selector : 나머지 체크박스 대상 selector * } ****************************************************************/ const fn_ctr_pCheckbox = function (tgtSelector, selector, ctrDv) { let isCcked = true; if(!fn_is_empty(ctrDv)){ if(!$(tgtSelector).is(":checked")){ isCcked = false; } $(selector).each(function () { $(selector).prop('checked', isCcked); }); }else{ $(selector).each(function () { if ($(this).prop('type') == 'checkbox' && !$(this).prop('checked')) { isCcked = false; return false; } }); $(tgtSelector).prop('checked', isCcked); } } /************************************************************** * checkbox * 전체 체크박스 체크여부에 따른 체크박스 제어 * 파라미터 설명{ * tgtSelector : 전체체크박스 대상 input * selector : 나머지 체크박스 대상 input * } ****************************************************************/ const fn_ctr_allCheckbox = function (tgtSelector, selector) { let isCcked = true; } /***************************************************************** * checkbox * 버튼 클릭시 체크박스 체크가 안되어 있으면 alert 호출 * 파라미터 설명 { * btnSelector : 이벤트 발생 할 버튼 셀렉터 * chkboxNm : 체크할 체크박스 name 이름 * alertCn : 호출할 내용 * fn_Nm : 체크시 실행 함수, * fn_Param : 함수 파라미터 * } ****************************************************************/ const fn_check_chkBoxCnt = (btnSelector, chkboxNm, alertCn, fn_Nm, fn_Param) => { $(btnSelector).on("click", function (e) { if ($("input[name=" + chkboxNm + "]:checked").length < 1) { alert(alertCn); } else { //파라미터 존재시 if (fn_Param != null && fn_Param != '') { fn_Nm(fn_Param); } else { //파라미터 존재 안할 시 fn_Nm(); } } }); } /***************************************************************** * checkbox * 체크박스 리스트 선택 삭제 * 파라미터 설명 { * tbodySltr : 선택 삭제 대상 tbody 셀렉터 * } ******************************************************************/ const fn_delete_selectTr = function (tbodySltr) { var $tbody = $(tbodySltr); // 체크된 input 찾기 $tbody.find('input[type="checkbox"]:checked').each(function () { $(this).closest('tr').remove(); // 체크된 tr 삭제 }); if ($tbody.children().length === 0) { var noDataMessage = $(""); var cell = $("").attr("colspan", '100%').html(''); noDataMessage.append(cell); $tbody.append(noDataMessage); } }; /************************************************************** * SMS(메시지) 바이트수 세기 * 파라미터 설명 { * idSelector : textarea 셀렉터 * byteCntSelector : byte 표시할 span 셀렉터 * size : byte 제한할 size 수 * } ****************************************************************/ const fn_count_byte = (textSelector, byteCntSelector, size) => { $(textSelector).keyup(function (e) { let str = $(this).val(); let str_len = str.length; let rbyte = 0; let rlen = 0; let one_char = ""; //byte수 세기 for (let i = 0; i < str_len; i++) { one_char = str.charAt(i); if (escape(one_char).length > 4) { //한글3Byte rbyte += 3; } else { //영문 등 나머지 1Byte rbyte++; } if (rbyte <= size) { //return할 문자열 갯수 rlen = i + 1; } } //타겟 바이트 표시 요소 찾기 let targetByte = $(this).closest(".sms-manage").find(byteCntSelector); //바이트 표시 targetByte.text(rbyte); //size 초과시 alert 호출 후, 초과 글자 삭제 if (size != '' && size != null) { if (rbyte > size) { alert("최대 " + size + "byte까지 입력 가능합니다."); $(this).val(str.substr(0, rlen)); } } }); } /************************************************************** * SMS(메시지) 바이트수 set * 파라미터 설명 { * idSelector : textarea 셀렉터 * byteCntSelector : byte 표시할 span 셀렉터 * } ****************************************************************/ const fn_count_byte_set = (textSelector, byteCntSelector) => { let str = $(textSelector).val(); let str_len = 0; let rbyte = 0; let one_char = ""; if (!fn_is_empty(str)) { str_len = str.length; //byte수 세기 for (let i = 0; i < str_len; i++) { one_char = str.charAt(i); if (escape(one_char).length > 4) { //한글3Byte rbyte += 3; } else { //영문 등 나머지 1Byte rbyte++; } } } //타겟 바이트 표시 요소 찾기 let targetByte = $(textSelector).closest(".sms-manage").find(byteCntSelector); //바이트 표시 targetByte.text(rbyte); } /************************************************************** * alert ****************************************************************/ const fn_click_alert = function () { alert("check"); } /* ******************************************************** * 검색조건 > 데이트range 이벤트 바인딩 * 파라미터 설명 { * divIdSelector : dateRange div id Ex) "#divId" * strtDtId : 시작일 id 이름 Ex) "strtDtId" * EndDtId : 종료일 id 이름 Ex) "EndDtId" * stdObjeId : 기준일 id 이름 Ex) "EndDtId" * } * 함수 document.ready에 선언! ******************************************************** */ fn_set_dateRange_function = (divIdSelector, strtDtId, EndDtId, stdObjeId) => { //버튼 값 const rangeArr = ['1D', '0', '3D', '7D', '1M', '3M', '6M', '1Y'] //dateRange 내 button 요소 찾기 let childEle = $(divIdSelector).find('button'); //button 요소 idx 만큼 반복문 childEle.each(function (idx) { childEle.eq(idx).on("click", function () { //전체 제외 날짜 설정 함수 호출 if (idx < 8) { fn_set_date(strtDtId, EndDtId, EndDtId, rangeArr[idx]); } else if (idx == 8) { //전체 버튼 날짜 리셋 $('#' + strtDtId).datepicker().datepicker("setDate", ''); $('#' + EndDtId).datepicker().datepicker("setDate", ''); } }); }); } /* ******************************************************** * 검색조건 > 검색구분 핸드폰 선택시 숫자만 허용 * 파라미터 설명 { * srchDvSelector : 검색 구분 id 셀렉터 * srchStrSelector : 검색어 id 셀렉터 * mbtlnbValNm : 검색 구분 중 휴대폰 value 이름 * } ******************************************************** */ const fn_apply_regExp_mbtlnb = (srchDvSelector, srchStrSelector, mbtlnbValNm) => { $(srchStrSelector).on("input", function () { let dvVal = $(srchDvSelector).val(); //검색구분이 휴대폰이면 검색어는 숫자만 허용 if (dvVal == mbtlnbValNm) { $(srchStrSelector).val($(srchStrSelector).val().replace(/[^0-9]/g, "")); } }); } /* ******************************************************** * ajax로 목록 조회시 나이스셀렉트 , datepicker 일괄 적용 * 파라미터 설명 { * listIdSelector: 목록 조회 section ID 셀렉터 * } ******************************************************** */ const fn_set_niceSelect_datePicker = (listIdSelector) => { //검색 조건 내 select 요소 찾기 const selectNiceArr = $(listIdSelector).find("select"); //select 요소 개수 if (selectNiceArr.length > 0) { selectNiceArr.each(function (idx) { selectNiceArr.eq(idx).niceSelect(); }); } //datePicker 개수 const datePickerArr = $(listIdSelector).find(".datepicker"); if (datePickerArr.length > 0) { datePickerArr.each(function (idx) { fn_set_datepicker(datePickerArr.eq(idx)); }); } } /* ******************************************************** * 팝업 오픈 * url : 호출할 윈도우 팝업 url * title : 팝업 이름 * w : 윈도우 팝업 가로길이 * h : 윈도우 팝업 세로길이 ******************************************************** */ const PopupCenter = (url, title, w, h) => { const dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left; const dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top; width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width; height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height; const left = ((width / 2) - (w / 2)) + dualScreenLeft; const top = ((height / 2) - (h / 2)) + dualScreenTop; const newWindow = window.open(url, title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left); if (window.focus) { newWindow.focus(); } } /* ******************************************************** * crmMenu bar current 표시 * targetId : left li id 이름 ******************************************************** */ const fn_add_crm_menu_class = (targetId) => { $(".crmMenu").each(function(){ $(this).removeClass("current"); }); $("#"+targetId).addClass("current"); } /* ******************************************************** * crm 회원정보 세팅 * targetId : left li id 이름 ******************************************************** */ const fn_set_crm_mbr_info = (mbrInnb, mbrDvCd,customer_record_key) => { $("#leftMbrInnb").val(mbrInnb); $("#leftMbrDvCd").val(mbrDvCd); $("#leftCustomerRecordKey").val(customer_record_key); } /* ******************************************************** * 상품 상세 이동 * param : 상품고유번호(goodsInnb), 상품종류(goodsKndCd), 페이지 구분(pageDv), 창옵션(target) * moveDv (sopmal,mngr) * 창옵션(target) 디폴트 새창(_blank) * ******************************************************** */ const fn_move_goods_dtl_common = (goodsInnb, pageDv, goodsKndCd, target = '_blank') => { if (pageDv === 'sopmal') { /*도메인 주소 get*/ $.ajax({ type: 'post', url: "/mngr/getPcUrl", contentType: 'application/json', data: JSON.stringify({"sopmalCd" : ''}), dataType: 'json', success: function (data) { let sopmalInfo = data.resBody.result; sopmalInfo = JSON.parse(sopmalInfo); let pcDomnAdres = sopmalInfo.sopmalInfo.pcDomnAdres; if(pcDomnAdres.endsWith("/")){ window.open(pcDomnAdres + "sopmal/goods/selectGoodsDtl?goodsInnb="+goodsInnb, target,"noreferrer"); } window.open(pcDomnAdres + "/sopmal/goods/selectGoodsDtl?goodsInnb="+goodsInnb,target, "noreferrer"); } }); } else if (pageDv === 'mngr') { if (goodsKndCd === '02') { window.open("/mngr/goods/prsnt/selectPrsntDtlForm?pageIndex=1&goodsInnb=" + goodsInnb, target); } else { window.open("/mngr/goods/goodsmngr/selectGoodsDtlForm?goodsInnb=" + goodsInnb, target); } } } /********************************************************* 사용자 게시판 이동 suburl : 게시판 이동 외 그외 사용자 화면으로 이동시 url ***************************************************************/ const fn_move_sopmal_bbs_list = (bbsId,bbsTyCd,subUrl) => { if(bbsId !== '' && (subUrl === '' || subUrl === undefined)){ if (bbsTyCd === '02' || bbsTyCd === '04') {//고객센터 url subUrl = "/sopmal/csc/selectBbscttAuth?authDv=REDNG&reqUrl=csc&bbsId=" + bbsId; } else if (bbsTyCd === '01' || bbsTyCd === '03' || bbsTyCd === '09' || bbsTyCd === '11') {//이벤트,매거진,일반게시글 subUrl = "/sopmal/csc/selectBbscttAuth?authDv=REDNG&reqUrl=subPage&bbsId=" + bbsId; } else if (bbsTyCd === '10') { //이용안내 url subUrl = "/sopmal/csc/selectBbscttAuth?authDv=REDNG&reqUrl=useGuidance&bbsId=" + bbsId; } } let pcDomainUrl = ''; /*도메인 주소 get*/ $.ajax({ type: 'post', url: "/mngr/getPcUrl", contentType: 'application/json', data: JSON.stringify({"sopmalCd" : ''}), dataType: 'json', success: function (data) { let sopmalInfo = data.resBody.result; sopmalInfo = JSON.parse(sopmalInfo); let pcDomnAdres = sopmalInfo.sopmalInfo.pcDomnAdres; window.open(pcDomnAdres + subUrl, "_blank","noreferrer"); } }); } /********************************************************* CRM 관리자 주문 이동 ***************************************************************/ const fn_move_mngr_ordr_regist_form = (mbrInnb, mbrDvCd,mbtlnb) => { if($('#ordr_regist_form')!=null){ $('#ordr_regist_form').remove() } // FormData 객체 생성 const formData = document.createElement('form'); formData.id = 'ordr_regist_form' formData.name = 'ordr_regist_form' formData.method = 'post' formData.action = '/crm/ordr/selectMngrOrdrRegistForm' formData.target = '_blank' // 값을 추가 if(!fn_is_empty(mbrDvCd)){ $(formData).append($('', {type: 'hidden', name: 'mbrInnb', value: mbrInnb})); $(formData).append($('', {type: 'hidden', name: 'mbrDvCd', value: mbrDvCd})); }else{ $(formData).append($('', {type: 'hidden', name: 'mbtlnb', value: mbtlnb})); $(formData).append($('', {type: 'hidden', name: 'mbrTyCd', value: '02'})); } $(formData).appendTo('body'); $(formData).submit(); $(formData).remove(); } /*************************************************************** 토큰 만료를 모니터링 하고 갱신을 요청하는 기능 ***************************************************************/ const checkTokenExpiration = () => { const tokenExpirationTime = localStorage.getItem('tokenExpirationTime'); if (tokenExpirationTime && Date.now() > tokenExpirationTime) { refreshToken(); } } const refreshToken = () => { fetch('/token/refresh', { method: 'POST' }) .then(response => { if (response.ok) { return response.json(); } throw new Error('Token refresh failed'); }) .then(data => { localStorage.setItem('tokenExpirationTime', Date.now() + data.expiresIn * 1000); }) .catch(error => { console.error('Error refreshing token:', error); window.location.href = '/login'; // 로그인 페이지로 리다이렉트 }); } // 주기적으로 토큰 만료 확인 (예: 5분마다) setInterval(checkTokenExpiration, 5 * 60 * 1000); /***************************************************************** crm 회원 정보 조회 *****************************************************************/ /* ******************************************************** * 해당 회원 정보 get ******************************************************** */ const fn_get_crm_info = (mbrInnb, mbrDvCd) => { $.ajax({ type: "post", url: "/crm/main/selectCrmMbrInfo", data: {mbrInnb: mbrInnb, mbrDvCd: mbrDvCd}, success: function (data) { data = JSON.parse(data.resBody.result); fn_set_crm_info(data); } }); } /* ******************************************************** * 해당 회원 정보 get (비회원) ******************************************************** */ const fn_get_crm_info_nmbr = (mbtlnb,ordrInnb) => { $.ajax({ type: "post", url: "/crm/main/selectCrmNmbrInfo", data: {mbtlnb: mbtlnb, ordrInnb: ordrInnb}, success: function (data) { data = JSON.parse(data.resBody.result); fn_set_crm_info(data,mbtlnb); } }); } /* ******************************************************** * 해당 회원 정보 set ******************************************************** */ const fn_set_crm_info = (data,mbtlnb) => { mbrData = data.mbrData; mbrAct = data.mbrAct; if (mbrAct.useAt === 'N') {//회원탈퇴사람인경우 $("#secsnModalDiv").hide(); $("#sndngDiv").hide(); } /*활동정보*/ if ($("#mbrActInfo").length > 0) { let rlSetleAmtSum = fn_format_comma(mbrAct.rlSetleAmtSum); let ordrInnbCnt = fn_format_comma(mbrAct.ordrInnbCnt); let actInfo = "("+ordrInnbCnt+"건 "+rlSetleAmtSum+ "원)"; $("#mbrActInfo").text(actInfo); } /*주문*/ if ($("#exportWaitCnt").length > 0) { $("#exportWaitCnt").text(fn_format_comma(mbrData.unprocessedRelease)); $("#rcpmnyWaitCnt").text(fn_format_comma(mbrData.unprocessedDeposit)); } /*반품/환불*/ if ($("#refundCnt").length > 0) { $("#refundCnt").text(fn_format_comma(mbrData.unprocessedRefund)); } /*마일리지*/ if ($("#totMlg").length > 0) { $("#totMlg").text(fn_format_comma(mbrAct.blceSum)); } /*쿠폰*/ if ($("#couponCnt").length > 0) { $("#couponCnt").text(fn_format_comma(mbrAct.dwldCouponInnbCnt)); } /*상품후기*/ if ($("#rvwCnt").length > 0) { $("#rvwCnt").text(fn_format_comma(mbrAct.rvwWritngCnt)); } /*상품문의*/ if ($("#qnaCnt").length > 0) { $("#qnaCnt").text(fn_format_comma(mbrData.unprocessedQna)); } /*상담*/ if ($("#CnsltWaitCnt").length > 0) { $("#CnsltWaitCnt").text(fn_format_comma(mbrData.unprocessedCnslt)); } if (mbrAct.mbtlnb != null) { $("#leftMbtlnb").val(mbrAct.mbtlnb); } if (mbrAct.email != null) { $("#leftEmail").val(mbrAct.email); } //회원정보에 이름 set $(".depth2-title").each(function () { if ($(this).attr('url') === '/crm/mbr/selectCstmrInfoInqire') { //회원정보 이름(아이디)로 메뉴명 바꾸기 let id = ''; if (mbrAct.joinMthCd === 'kakao') { id = ` `; } else if (mbrAct.joinMthCd === 'naver') { id = ` `; } else if (mbrAct.joinMthCd === 'pos') { id = ` ${mbrAct.mbrId}`; } else { id = `${mbrAct.mbrId}`; } let appnDv = ''; if(mbrAct.appnDvCd === '02'){ appnDv = ` B블랙리스트 `; } else if (mbrAct.appnDvCd == '03') { appnDv = ` W화이트리스트 `; } let mbrTxt = `${appnDv} ${mbrAct.mbrNm} (${id})`; $(this).html(mbrTxt); } }); //회원 상담 폼일 시 전화번호 set /*CnsltDtlsRForm.jsp 28번줄에 해당 내용 있음*/ if ($("#cnsltDtlsInnb").length > 0) { if(mbrAct.mbtlnb != null){ $("#mbtlnb").val(mbrAct.mbtlnb); }else{ $("#mbtlnb").val(mbtlnb.replaceAll('-','')); } fn_select_crm_cnslt_list(1); } if (mbrAct.mbtlnb != null) { $("#telnb").val(mbrAct.mbtlnb); } else { $("#telnb").val(mbtlnb.replaceAll('-', '')); } } /* ******************************************************** * 금액 포맷 ******************************************************** */ const fn_format_comma = (target) => { if(!fn_is_empty(target)){ target = target.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); } return target; } // 버튼을 비활성화하는 함수 const disableButton = (selector) => { $(selector).attr('disabled', true); } // 버튼을 활성화하는 함수 const enableButton = (selector) => { $(selector).removeAttr('disabled'); } /* ******************************************************** * 해당 회원 정보 get TODO 관리자서버로 옮길시 URL 바꾸기 ******************************************************** */ const fn_get_itrnt_crm_info = (mbrInnb, mbrDvCd,sopmalCd) => { $.ajax({ type: "post", url: "/itrnt/crm/mbr/selectCrmMbrInfo", data: {mbrInnb: mbrInnb, mbrDvCd: mbrDvCd,sopmalCd:sopmalCd}, success: function (data) { data = JSON.parse(data.resBody.result); fn_set_itrnt_crm_info(data); } }); } /* ******************************************************** * 해당 회원 정보 set ******************************************************** */ const fn_set_itrnt_crm_info = (data) => { mbrData = data.mbrData; mbrAct = data.mbrAct; /*마일리지*/ if ($("#totMlg").length > 0) { $("#totMlg").text(fn_format_comma(mbrAct.blceSum)); } /*쿠폰*/ if ($("#couponCnt").length > 0) { $("#couponCnt").text(fn_format_comma(mbrAct.dwldCouponInnbCnt)); } if (mbrAct.mbtlnb != null) { $("#leftMbtlnb").val(mbrAct.mbtlnb); } //회원정보에 이름 set $(".depth2-title").each(function () { if ($(this).attr('url') === '/itrnt/crm/mbr/selectCstmrInfoInqire') { //회원정보 이름(아이디)로 메뉴명 바꾸기 let id = ''; if (mbrAct.joinMthCd === 'kakao') { id = ` `; } else if (mbrAct.joinMthCd === 'naver') { id = ` `; } else if (mbrAct.joinMthCd === 'pos') { id = ` ${mbrAct.mbrId}`; } else { id = `${mbrAct.mbrId}`; } let mbrTxt = `${mbrAct.mbrNm} (${id})`; $(this).html(mbrTxt); } }); } /*테이블엔드 드래그 html 동적 생성 후 초기화 함수*/ const initializeTableDnD =()=> { if ($(".table.draggable").length > 0) { $(".draggable").tableDnD({ onDragClass: "dragging", }); } } /************************************************************ * 숫자 혹은 영어만 입력 *************************************************************/ const validateInputEngNumber = (thisVlaue) => { thisVlaue.value = thisVlaue.value.replace(/[^a-zA-Z0-9]/g, ''); } /*************************************************************** 앨리스랩 약국 팀 내 영업사원 조회 팀 select id teamDv 팀 내 영업사원 select id teamMngrDv ***************************************************************/ /*팀 내 조회*/ const fn_select_team_member = (mngrInnb) => { const srchTeamDv = $("#teamDv").val(); if (fn_is_empty(srchTeamDv)) { let optionHtml = ``; $("#teamMngrDv").empty(); $("#teamMngrDv").append(optionHtml) .niceSelect('update'); }else{ $.ajax({ type: 'post', url: '/mngr/bsn/jobuser/selectUsersInTeam', data: {srchTeamDv: srchTeamDv}, success: function (data) { data = JSON.parse(data.resBody.result); data = data.userList; fn_select_team_member_2(data); if (mngrInnb !== undefined) { $("#teamMngrDv option[value='" + mngrInnb + "']").prop('selected', true); $("#teamMngrDv").niceSelect('update'); } } }); } } /*html 구성*/ const fn_select_team_member_2 = (data) => { let optionHtml = ``; data.forEach(function(item){ optionHtml += ``; }); $("#teamMngrDv").empty(); $("#teamMngrDv").append(optionHtml) .niceSelect('update'); } /* ************************************************************ * 모바일 모달 show 함수_# 추가 X * modalId : 콜백 함수 이름 ************************************************************* */ const openModal2 = (modalId) => { MicroModal.show(modalId); } /* ************************************************************ * 모바일 모달 닫고, URL Hash 제거 * modalId : 콜백 함수 이름 ************************************************************* */ const closeModal = (modalId) => { // 모달 닫힐 때 body 스크롤 복원 document.body.style.overflow = ''; // MicroModal을 사용해 모달 닫기 MicroModal.close(modalId); // 추가적인 히스토리 항목을 생성하지 않고 URL에서 #이후부터 Hash 제거 window.history.replaceState({}, '', window.location.href.split('#')[0]); } /* ******************************************************** * 카카오 주소 찾기 연동(모바일) * 파라미터 설명 { * callback : 카카오 주소 찾기 팝업에서 주소 선택 후 호출될 콜백함수 * } ******************************************************** */ const fn_select_post_mobile = (callback,modalNm,isModal) => { // 우편번호 찾기 화면을 넣을 element var element_wrap = $('#postCodeCn'); // jQuery 객체를 DOM 요소로 변환 var element = element_wrap.get(0); // 현재 scroll 위치를 저장해놓는다. if (element) { new daum.Postcode({ oncomplete: function (data) { const postcode = data.zonecode; const roadAddr = data.roadAddress; const jibunAddress = data.jibunAddress; let addressType = ''; let extraRoadAddr = ''; // userSelectedType R/J 검색 결과에서 사용자가 선택한 주소의 타입(R : 도로명, J : 지번) if (data.userSelectedType == 'R') { addressType = '01'; } else { addressType = '02'; } // 법정동명이 있을 경우 추가한다. (법정리는 제외) // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다. if (data.bname !== '' && /[동|로|가]$/g.test(data.bname)) { extraRoadAddr += data.bname; } // 건물명이 있고, 공동주택일 경우 추가한다. if (data.buildingName !== '' && data.apartment === 'Y') { extraRoadAddr += (extraRoadAddr !== '' ? ', ' + data.buildingName : data.buildingName); } // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다. if (extraRoadAddr !== '' && roadAddr !== '') { extraRoadAddr = ' (' + extraRoadAddr + ')'; } callback({ postcode: postcode, roadAddress: roadAddr, jibunAddress: jibunAddress, addressType: addressType, extraAddress: extraRoadAddr }); }, width: '100%', height: '100%' }).embed(element); } else { console.error('선택한 요소가 존재하지 않습니다: ', '#postCodeCn'); } // iframe을 넣은 element를 보이게 한다. if (element) { element.style.display = 'block'; openModal2("postModal"); } } const fn_set_year = (idSelector) => { const yearSelect = document.getElementById(idSelector); const currentYear = new Date().getFullYear(); for (let i = 0; i < 10; i++) { const year = currentYear - i; const option = document.createElement('option'); option.value = year; option.textContent = `${year}년`; yearSelect.appendChild(option); } $("#"+idSelector).niceSelect('update'); } /************************************************************ 인풋 값에 대한 밸리데이션 체크 num = false, // 숫자 허용 여부 kor = false, // 한글 허용 여부 eng = false, // 영어 허용 여부 upper = false, // 대문자 허용 여부 lower = false, // 소문자 허용 여부 special = false, // 특수문자 허용 여부 chars = "" // 허용할 특수문자 (기본값 없음) ************************************************************ */ function validateInput(input, opts = {}) { // 기본값을 false로 설정 let { num = false, // 숫자 허용 여부 kor = false, // 한글 허용 여부 eng = false, // 영어 허용 여부 upper = false, // 대문자 허용 여부 lower = false, // 소문자 허용 여부 special = false, // 특수문자 허용 여부 chars = "" // 허용할 특수문자 (기본값 없음) } = opts; $(input).on("input", function () { let value = $(this).val(); let pattern = ""; if (num) pattern += "0-9"; // 숫자 허용 if (kor) pattern += "가-힣"; // 한글 허용 if (eng) { if (upper && lower) pattern += "a-zA-Z"; // 대소문자 모두 허용 else if (upper) pattern += "A-Z"; // 대문자만 허용 else if (lower) pattern += "a-z"; // 소문자만 허용 } if (special || chars) { pattern += chars.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); // 특수문자 이스케이프 처리 } let regex = new RegExp(`[^${pattern}]`, "g"); // 허용되지 않은 문자 제거 $(this).val(value.replace(regex, "")); }); } /************************************************************ form데이터 sealize 후 json 스트링 형태로 전환 ************************************************************ */ function queryToJson(queryString) { let jsonObj = {}; let pairs = queryString.split("&"); $.each(pairs, function (index, pair) { let [key, value] = pair.split("="); if(!fn_is_empty(value)){ jsonObj[key] = value ? decodeURIComponent(value) : ""; } }); const jsonStr = JSON.stringify(jsonObj); return jsonStr; } /************************************************************ 치환코드 입력 * @param eventObj : 클릭객체 * @param closestSelector : 가까운 객체 * @param targetTextAreaSelector : textarea타겟대상 * @property obj : 클릭한 객체 * @property existingVal : 기존 텍스트 아리아 값 * @property addStr : 추가할 치환 코드 * @description 치환 문자 td 클래스에 subst 클래스 부여 ************************************************************ */ function fn_set_substituon_in_texatarea(eventObj, closestSelector, targetTextAreaSelector) { const obj = $(eventObj); let existingVal = $("#"+targetTextAreaSelector).val(); let addStr; const addStrT = obj.closest(closestSelector).find(".subst").text(); const addStrV = obj.closest(closestSelector).find(".subst").val(); if(!fn_is_empty(addStrT)){ addStr = addStrT; }else{ addStr = addStrV; } existingVal = existingVal + " " +addStr; $("#"+targetTextAreaSelector).val(existingVal); } /* ************************************************************ * 인피니티 스크롤 공통 처리 (footer가 보이면 callback함수 호출) * callBack : 콜백 함수 이름 * callBackParam : callBack 함수의 파라미터 * selector ************************************************************* const fn_infinite_scroll = (callBack, callBackParam,selector) => { const target = document.querySelector(selector); const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { callBack(callBackParam); } }); }); observer.observe(target); } */ const fn_infinite_scroll = (callBack, callBackParam, selector) => { setTimeout(() => { const target = document.querySelector(selector); if (target) { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { callBack(callBackParam); } }); }); observer.observe(target); } else { console.error('target을 찾을 수 없습니다.'); } }, 500); } /** * 부모의 리스트 함수를 재조회하는 함수 * */ function parent_list_reload(){ if (window.opener && typeof window.opener.fn_select_list === 'function') { window.opener.fn_select_list(1); } } /*현재 URL에 히스토리 스택 추가하는 함수*/ function history_add(serializeData){ const currentUrl = new URL(window.location.href); // URLSearchParams 사용하여 키, 값을 파싱 const params = new URLSearchParams(serializeData); // 각 키-값을 반복 처리 params.forEach((value, key) => { currentUrl.searchParams.set(key, value); // 파라미터 추가 또는 업데이트 }); // 히스토리 스택에서 현재 상태를 업데이트 window.history.replaceState({}, '', currentUrl.toString()); } /** * 주문번호를 받아 새창에 주문상세화면 호출 */ const fn_comm_go_ordr_dtl = function(ordrInnb) { // form 생성 var form = document.createElement('form'); form.method = 'POST'; form.action = '/mngr/ordr/ordrmngr/selectOrdrDtlInqire'; form.target = '_blank'; // 새 창 // 파라미터 input 생성 var input = document.createElement('input'); input.type = 'hidden'; input.name = 'ordrInnb'; input.value = ordrInnb; form.appendChild(input); // body에 form 추가 후 submit document.body.appendChild(form); form.submit(); // submit 후 form 제거 (메모리 관리) document.body.removeChild(form); }