Files
sake/build/resources/main/static/js/mngr/gcone.js

1984 lines
73 KiB
JavaScript

/**
* 공통 스크립트 함수
* 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 = '<input type="radio" id="' + inputName + idx + '" name="' + inputName + '" value="' + codeList[idx].cd + '" checked="checked"><label for="' + inputName + idx + '">' + codeList[idx].cdNm + '</label>';
} else {
tgtChildreObj.innerHTML = '<input type="radio" id="' + inputName + idx + '" name="' + inputName + '" value="' + codeList[idx].cd + '"><label for="' + inputName + idx + '">' + codeList[idx].cdNm + '</label>';
}
$(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 = '<input type="checkbox" id="' + inputName + idx + '" name="' + inputName + '" value="' + codeList[idx].cd + '" checked="checked"><span class="check"></span><span class="control-label">' + codeList[idx].cdNm + '</span>';
} else {
tgtChildreObj.innerHTML = '<input type="checkbox" id="' + inputName + idx + '" name="' + inputName + '" value="' + codeList[idx].cd + '"><span class="check"></span><span class="control-label">' + codeList[idx].cdNm + '</span>';
}
$(tgtSelector).eq(0).append(tgtChildreObj);
}
break;
case 'select' :
tgtChildreObj = document.createElement("div");
let selectInnerHtml = '';
tgtChildreObj.setAttribute("class", "select-box");
selectInnerHtml = '<select id="' + inputName + '" name="' + inputName + '">';
if (initValue) {
//초기값(전체)이 있을 경우
selectInnerHtml += '<option value="">' + initValue + '</option>';
}
for (let idx = 0; idx < codeList.length; idx++) {
if (selectedValue == codeList[idx].cd) {
selectInnerHtml += '<option value="' + codeList[idx].cd + '" selected="selected">' + codeList[idx].cdNm + '</option>';
} else {
selectInnerHtml += '<option value="' + codeList[idx].cd + '">' + codeList[idx].cdNm + '</option>';
}
}
selectInnerHtml += '</select>';
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 = $("<tr>");
var cell = $("<td>").attr("colspan", '100%').html('<spring:message code="common.nodata"/>');
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($('<input/>', {type: 'hidden', name: 'mbrInnb', value: mbrInnb}));
$(formData).append($('<input/>', {type: 'hidden', name: 'mbrDvCd', value: mbrDvCd}));
}else{
$(formData).append($('<input/>', {type: 'hidden', name: 'mbtlnb', value: mbtlnb}));
$(formData).append($('<input/>', {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 = ` <i class="icon icon_word-badge_kakao"></i>`;
} else if (mbrAct.joinMthCd === 'naver') {
id = ` <i class="icon icon_word-badge_naver"></i>`;
} else if (mbrAct.joinMthCd === 'pos') {
id = ` <i class="icon icon_word-badge_pos"></i>${mbrAct.mbrId}`;
} else {
id = `${mbrAct.mbrId}`;
}
let appnDv = '';
if(mbrAct.appnDvCd === '02'){
appnDv = `<span class="black-list">
B<span class="visually-hidden">블랙리스트</span>
</span>`;
} else if (mbrAct.appnDvCd == '03') {
appnDv = `<span class="white-list">
W<span class="visually-hidden">화이트리스트</span>
</span>`;
}
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 = ` <i class="icon icon_word-badge_kakao"></i>`;
} else if (mbrAct.joinMthCd === 'naver') {
id = ` <i class="icon icon_word-badge_naver"></i>`;
} else if (mbrAct.joinMthCd === 'pos') {
id = ` <i class="icon icon_word-badge_pos"></i>${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 = `<option value="">영업사원 전체</option>`;
$("#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 = `<option value="">영업사원 전체</option>`;
data.forEach(function(item){
optionHtml += `<option value="${item.mngrInnb}">${item.mngrNm}</option>`;
});
$("#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);
}