// ESG 내에서만 사용하는 공통함수 정의 var esg = (function () { //esg.속성 으로 접근할 object return var esg = { '_menuCode': '', 'menu_div_code': '', relatedLinkList: [] }; _.templateSettings = { interpolate: /\{\{\=(.+?)\}\}/gim, evaluate: /\{\{([\s\S]+?)\}\}/gim, escape: /\{\{\-(.+?)\}\}/gim }; // 선택 된 항목 표시 esg.checkList = function(listId, list) { $.each(list, function(i, itemEl) { var $itemEl = $(itemEl); var itemId = $itemEl.attr("id"); var id = itemId + "_check"; var label = $("label[for='"+itemId+"']").text(); if($(itemEl).is(":checked")) { // 체크 한 경우 $("#"+listId).append(_.template($("#tagCheckTemplate").html())({id : id, label : label})); }else { // 체크 해제 한 경우 $("#"+id).remove(); } }); var $listEl = $("#" + listId); if($listEl.find("li").length > 0) { $listEl.closest(".check-list").show(); }else { $listEl.closest(".check-list").hide(); } } esg.relatedLinkSetting = function(map) { $(".pane-content").mCustomScrollbar({ theme: "dark-3", axis:"y" }); $(".pane-title").on("click", function(e){ $(this).toggleClass("open").next(".pane-content").slideToggle(); if ($(this).hasClass('open')) { $(this).children(".control").text("+"); } else { $(this).children(".control").text("-"); } }); $(".pane-content.type").show(); $(".pane-title:first").trigger("click"); $(".inside-inner").mCustomScrollbar({ theme: "dark-3", axis:"y" }); // 체크 해제 선택 시 삭제 $(document).on("click", ".check-list-item .uncheck", function() { var removeItemId = $(this).closest("li").attr("id").replace("_check", ""); $("#"+removeItemId).trigger("click"); }); // 전체 해제 $(document).on("click", ".all-uncheck", function() { $(this).closest(".check-list").find(".uncheck").trigger("click"); }); // ESG Tag $("#tagMetadataList :checkbox[name='meta_code']").click(function(e) { e.stopPropagation(); esg.checkList("tagMetadataCheckList", $(this)); }); // 산업분류 $("#tagIndustryList :checkbox[name='industry_code']").click(function(e) { esg.checkList("tagIndustryCheckList", $(this)); }); // 지역 $("#tagHqList :checkbox[name='hq_code']").click(function(e) { esg.checkList("tagHqCheckList", $(this)); }); // 기업 $("#tagCompanyList :checkbox[name='company_code']").click(function(e) { esg.checkList("tagCompanyCheckList", $(this)); }); // 메뉴 $("#tagMenuList :checkbox[name='tag_menu_code']").click(function(e) { esg.checkList("tagMenuCheckList", $(this)); }); if(common.isEmpty(map.search_cnt_combo) == false && $("#search_cnt_combo").length > 0) { $("#search_cnt_combo").val(map.search_cnt_combo); } var tabidx = ""; if (!common.isEmpty($('.tablist.ly-tab-btn > .tab'))) { tabidx = "1"; } if (!common.isEmpty(map.link_category_code)) { $.each($('.tablist.ly-tab-btn > .tab'), function(i, item) { if ($(this).data("category") == map.link_category_code) { tabidx = $(this).data("tabidx"); } }); } $("#tab"+tabidx).addClass("active").attr("tabindex", "0"); $("#tab"+tabidx).attr("aria-selected", "true"); $("#tab-panel"+tabidx).addClass("active"); if (!common.isEmpty(map.meta_code)) { common.checkByValue($("input[name='meta_code']"), map.meta_code); esg.checkList("tagMetadataCheckList", $(":checkbox[name='meta_code']:checked")); if(map.hashtag_flag == "Y") { $(".tab[aria-controls='tagMetadataList']").trigger("mousedown"); } } if (!common.isEmpty(map.industry_code)) { common.checkByValue($("input[name='industry_code']"), map.industry_code); esg.checkList("tagIndustryCheckList", $(":checkbox[name='industry_code']:checked")); if(map.hashtag_flag == "Y") { $(".tab[aria-controls='tagIndustryList']").trigger("mousedown"); } } if (!common.isEmpty(map.hq_code)) { common.checkByValue($("input[name='hq_code']"), map.hq_code); esg.checkList("tagHqCheckList", $(":checkbox[name='hq_code']:checked")); if(map.hashtag_flag == "Y") { $(".tab[aria-controls='tagHqList']").trigger("mousedown"); } } if (!common.isEmpty(map.company_code)) { common.checkByValue($("input[name='company_code']"), map.company_code); esg.checkList("tagCompanyCheckList", $(":checkbox[name='company_code']:checked")); if(map.hashtag_flag == "Y") { $(".tab[aria-controls='tagCompanyList']").trigger("mousedown"); } } if (!common.isEmpty(map.tag_menu_code)) { common.checkByValue($("input[name='tag_menu_code']"), map.tag_menu_code); esg.checkList("tagMenuCheckList", $(":checkbox[name='tag_menu_code']:checked")); if(map.hashtag_flag == "Y") { $(".tab[aria-controls='tagMenuList']").trigger("mousedown"); } } if (map.link_flag == "Y") { $("#search_combo"+tabidx).val("TITLE"); $("#search_text"+tabidx).val(map.link_search_text); $("#search_tag_text").val(map.link_search_text); if ($("#category").length > 0) { $("#category > option").removeAttr("selected"); $("#category > option[value="+map.link_category_code+"]").attr("selected", true); } } else { $("#search_tag_text").val(map.search_tag_text); } }; esg.getCategoryCode = function(categoryCode) { if (common.isEmpty(categoryCode)) { if($("#category").length > 0) { categoryCode = $('#category').val().toString(); }else { var globalCategory = $(".tablist.ly-tab-btn > .tab.active").data("category") || ""; if (common.isEmpty(globalCategory)) { categoryCode = ''; } else { categoryCode = globalCategory; } } }else { if(typeof categoryCode === "string") { categoryCode = categoryCode; } } return categoryCode; } esg.setMetadataPortalRow = function(list) { var template = _.template($("#metadataPortalTemplate").html()); $("#metadataList").html(template({list : list})); } esg.setIndustryPortalRow = function(list) { var template = _.template($("#industryPortalTemplate").html()); $("#industryList").html(template({list : list})); } esg.setHqPortalRow = function(list) { var template = _.template($("#hqPortalTemplate").html()); $("#hqList").html(template({list : list})); } esg.setCompanyPortalRow = function(list) { var template = _.template($("#companyPortalTemplate").html()); $("#companyList").html(template({list : list})); } esg.setSourceRow = function(list, flag, tabNo) { tabNo = tabNo || ""; var template = _.template($("#sourcePortalTemplate").html()); $("#sourceList"+tabNo).html(template({list: list, flag: flag})); } esg.setContentsKeywordRow = function(list, flag, tabNo) { tabNo = tabNo || ""; var template = _.template($("#contentsKeywordPortalTemplate").html()); $("#contentsKeywordList"+tabNo).html(template({list: list, flag: flag})); } esg.setPortalAttachFileRow = function(list) { var template = _.template($("#attachFilePortalTemplate").html()); $("#fileListModalInfo").html(template({list : list})); } esg.setTagMetadataPortalRow = function(list) { var template = _.template($("#tagMetadataPortalTemplate").html()); $("#tagMetadataList").html(template({list : list})); } esg.setTagIndustryPortalRow = function(list) { var template = _.template($("#tagIndustryPortalTemplate").html()); $("#tagIndustryList").html(template({list : list})); } esg.setTagHqPortalRow = function(list) { var template = _.template($("#tagHqPortalTemplate").html()); $("#tagHqList").html(template({list : list})); } esg.setTagCompanyPortalRow = function(list) { var template = _.template($("#tagCompanyPortalTemplate").html()); $("#tagCompanyList").html(template({list : list})); } esg.setTagMenuPortalRow = function(list) { var template = _.template($("#tagMenuPortalTemplate").html()); $("#tagMenuList").html(template({list : list})); } esg.setPortalRelatedLinkRow = function(list) { esg.relatedLinkList = list; var template = _.template($("#relatedLinkTemplate").html()); var width = $(window).width(); var scroll = ""; if(width < 768 || list.length > 3) { scroll = "scroll"; } $("#relatedLinkList").html(template({list : list, scroll : scroll})); if(scroll == "scroll") { $(".related-link-list.scroll").mCustomScrollbar({ theme: "dark-3", axis:"x" }); } } esg.tagSetting = function(option) { var dto = option.dto; dto.addParamMap(option.param); dto.setAjax({ url: "/basic/common/list-tag-setting.json", loadingModal: true, callback: function(result, textStatus, jqXHR){ esg.setTagMetadataPortalRow(result['tagMetadataList']); esg.setTagIndustryPortalRow(result['tagIndustryList']); esg.setTagHqPortalRow(result['tagHqList']); esg.setTagCompanyPortalRow(result['tagCompanyList']); esg.setTagMenuPortalRow(result['tagMenuList']); esg.relatedLinkSetting(dto.paramMap); if(_.isFunction(option.callback)) { option.callback(); } } }); common.get(dto); } esg.clickRelatedLink = function(i, map) { var map = map || esg.relatedLinkList[i]; var parameter = {}; if (map.detail_flag == "N") { parameter = {link_search_text: map.title_name, link_flag: 'Y'}; } else if(map.detail_flag == "A") { // ESG 활동 parameter = {link_search_text: map.company_name, link_flag: 'Y'}; } if (map.yyyy) { parameter.search_yyyy = map.yyyy; } var props = { keyCode: {contents_code: map.contents_code, category_code: map.category_code}, parameter: parameter, targetUrl: "/"+map.menu_url }; common.setKeyCodeSession(props); }; esg.setSortTable = function(n, idx, row){ var table, rows, switching, o, x, y, xNum, yNum, shouldSwitch, dir, switchCount = 0, startRow = parseInt(common.isEmpty(row) ? 1: row); table = document.getElementById("inventory"+idx); switching = true; dir= "asc"; while(switching){ switching = false; rows = table.getElementsByTagName("TR"); for(o = startRow; o <(rows.length - 1); o++){ shouldSwitch = false; if(startRow > 1) { x = rows[o].getElementsByTagName("TD")[n]; y = rows[o + 1].getElementsByTagName("TD")[n]; } else { x = rows[o].getElementsByTagName("TH")[n]; y = rows[o + 1].getElementsByTagName("TH")[n]; } xNum = x.innerHTML.toLowerCase(); yNum = y.innerHTML.toLowerCase(); if(dir == "asc"){ if(xNum > yNum){ shouldSwitch = true; break; } } else if(dir == "desc"){ if(xNum < yNum){ shouldSwitch = true; break; } } } if(shouldSwitch){ rows[o].parentNode.insertBefore(rows[o + 1], rows[o]); switching = true; switchCount ++; }else{ if(switchCount == 0 && dir == "asc"){ dir = "desc"; switching = true; } } } }; esg.searchWordCount = function(dto, tabNo){ if (common.isEmpty(tabNo)) { tabNo = $(".tablist.ly-tab-btn > .tab.active").data("tabidx") || ""; } if (!common.isEmpty($("#search_text"+tabNo).val()) && common.isEmpty($("#search_combo"+tabNo).val())) { return false; } dto.addParamMap($.extend($("#searchFormTag").serializeObject(), { search_text : $("#search_text").val() , meta_name : common.getCheckText($("input[name='meta_code']:checked")) , industry_name : common.getCheckText($("input[name='industry_code']:checked")) , hq_name : common.getCheckText($("input[name='hq_code']:checked")) , company_name : common.getCheckText($("input[name='company_code']:checked")) , menu_name : common.getCheckText($("input[name='tag_menu_code']:checked")) , menuCode : dto.condition.menuCode })); dto.setAjax({ url: "/save-searchWordCount", loadingModal: false, callback: function(result, textStatus, jqXHR){ } }); common.get(dto); } esg.clickHashtag = function(key, val) { var props = { parameter: {hashtag_flag : "Y"}, targetUrl: "/portal/total/searchResult/total_search_result" }; props.parameter[key] = val; common.setKeyCodeSession(props); } return esg; }()); //공통함수 정의 var common = (function() { //common.속성 으로 접근할 object return var common = {}; common._type = ""; /** * @depracated */ common.ajax = function(dtoObj, paramObj){ console.log('depracated method 입니다. common.get 또는 common.post 를 사용해주세요.'); common.post(dtoObj, paramObj); }; /** * 조회조건 설정 * 2018. 02. 27(김재열) * modify: flag값이 "N"이 아닐 경우만 form의 input들 자동 셋팅 [2021.11.01(오예진)] */ common.setHistory = function(dto, flag){ var history = JSON.parse(sessionStorage.getItem('__search__'+ dto.condition.menuCode)); if(history){ delete history['_CSRFtk']; delete history['_menu_code_']; delete history['menuCode']; //form에 미정의된 속성 $.each(dto.condition.hiddens, function(i, name){ var obj = {}; obj[name] = history[name]; dto.addParamMap(obj); }); // flag값이 "N"이 아닐 경우만 form의 input들 자동 셋팅 if (flag != "N") { $.each(history, function(key, value){ var $obj = $("[name='"+key+"']"); if($obj.is("select")){ if($obj.attr("multiple")){ $obj.multiselect('select', value).trigger('change'); }else{ $obj.val(value).trigger('change'); } }else if($obj.is(":text")){ //text if($obj.data('datetime')){ //DatetimePicker 사용시 주석해제 // $obj.closest("div").data("DateTimePicker").date(value); //Bootstrap4-datetimepicker 사용으로 인한 수정[2019.05.13(장우석)] $obj.closest("div").data("datetimepicker").date(value); }else{ $obj.val(value); } }else if($obj.is(":checkbox")){ //checkbox common.checkByValue($obj, value); }else if($obj.is(":radio")){ //radio $("input[name='"+key+"'][value='"+ value +"']").attr('checked',true); } }); } if(sessionStorage.getItem('_autoInquiry') === "Y"){ $.extend(history, {AUTO_INQUIRY: true}); sessionStorage.setItem('_autoInquiry', "N"); }else{ $.extend(history, {AUTO_INQUIRY: false}); } } return history; }; /** * 상세화면에서 목록으로 이동 시 자동조회처리 * param : Y(자동조회), N(자동조회 안함) * 2018. 10. 24(김도형) */ common.setAutoInquiry = function(param){ sessionStorage.setItem('_autoInquiry', param); } /** * 조회 ajax 처리 * 2018. 02. 22(김재열) */ common.get = function(dtoObj){ common.buttonDisable(); if(dtoObj.condition.menuCode){ sessionStorage.setItem('__search__'+ dtoObj.condition.menuCode, JSON.stringify(dtoObj.paramMap)); } var ajaxProps = dtoObj.ajax; var progressGrids = ajaxProps.progressGrids; //pathVariable 로 _type 이 들어오는 경우 url에도 추가해주어야 권한 체크를 할 수 있다.[2018.03.21, kimjaeyeol] var _url = ajaxProps.url; if(common._type){ _url = _url.substring(0, _url.lastIndexOf('/')) + '/' + common._type + _url.substring(_url.lastIndexOf('/')); } if(typeof dtoObj.buttonEnable === 'undefined'){ dtoObj.buttonEnable = true; } if(progressGrids){ $.each(progressGrids, function(i, grid){ grid.showProgress(); }); } $.ajax({ type: "POST", //REST API 규칙대로 HTTP Method로 구분하고 싶으나 보안 등의 이유로 POST 를 유지한다. headers: {'_CSRFtk': 'BOaxVCpkkBCBEjszOKoXqhf1mEgJhkuu7QZG+seIc3w='}, dataType: "json", contentType: "application/json; charset=utf-8", url: _url, data: dtoObj.makeJSONString(), beforeSend: function() { if (ajaxProps.loadingModal === undefined || ajaxProps.loadingModal) { //$("#loadingModal").modal(); $(".loading-modal").show(); } }, success: function(result, textStatus, jqXHR){ if (ajaxProps.loadingModal === undefined || ajaxProps.loadingModal) { //$('#loadingModal').modal("hide"); $(".loading-modal").hide(); } // 서버 메세지를 확인하여 에러존재유무 확인 후 처리하는 프로시저 호출 if (validate.confirmServerMessage(result)){ return; } if(progressGrids){ $.each(progressGrids, function(i, grid){ grid.closeProgress(); }); } if(ajaxProps.type || ajaxProps.text){ //토스트 콜백 정의 ajaxProps.beforeHide = function () { ajaxProps.callback(result, textStatus, jqXHR); if(dtoObj.buttonEnable){ common.buttonEnable(); } }; //토스트 메시지 처리 common.toast(ajaxProps); }else{ ajaxProps.callback(result, textStatus, jqXHR); if(dtoObj.buttonEnable){ common.buttonEnable(); } } if($("#searchResultMessage")){ var searchMessage = ""; $.each($("#searchForm label"), function(idx, labelObj){ var id = $(labelObj).attr("for"); var $obj = $("[name="+id+"]"); var text = ""; if($obj.is("select")){ if($obj.attr('multiple')){ //multi select2 text = $obj.find('option:selected').map(function(){ return $(this).text(); }).get().join(','); //전체가 포함 된 경우 전체만 ... if(text.indexOf('전체') >= 0){ text = '전체'; } }else{ //여러개의 selectbox 일때 aria-labelledby 속성을 주어 함께 표현되도록 한다. if($obj.attr('aria-labelledby')){ var labelledby = $obj.attr('aria-labelledby'); $.each($('#searchForm').find('[aria-labelledby="'+labelledby+'"]'), function(i, o){ var pre = (i>0)?',':''; if($obj.hasClass("select2-hidden-accessible")){ //select2 인 경우 : 하나의 selectbox text += pre + $(this).select2('data')[0].text; }else{ //Bootstrap select 인 경우 : 하나의 selectbox text += pre + $(this).selectpicker('data')[0].text; } }); }else{ if($obj.hasClass("select2-hidden-accessible")){ //select2 인 경우 : 하나의 selectbox text = $obj.select2('data')[0].text; }else{ if($obj[0].type == "select-one"){ text = $("#"+id+" option:selected").text(); //.data 속성이 select 에는 없는건가? }else{ //Bootstrap select 인 경우 : 하나의 selectbox text = $obj.selectpicker('data')[0].text; } } } } }else if($obj.is(":text")){ //selectbox 와 text 가 하나의 그룹인 경우 var $prevSelect = $('#searchForm').find('[aria-labelledby="'+id+'"]'); if($prevSelect && $prevSelect.is('select')){ if($obj.hasClass("select2-hidden-accessible")){ //selectbox 텍스트와 input 텍스트 연결 text = $prevSelect.select2('data')[0].text; }else{ //Bootstrap select 텍스트와 input 텍스트 연결 text = $prevSelect.selectpicker('data')[0].text; } if($obj.val()){ text += ': '+$obj.val(); } }else{ //text text = $obj.val(); //날짜 기간인 경우 if($obj.data("end")){ text += '~' + $('#'+$obj.data("end")).val(); } } }else if($obj.is(":checkbox")){ //checkbox text = common.getCheckText($(":input[name="+id+"]:checked")); }else if($obj.is(":radio")){ //radio $.each($(":input[name="+id+"]:checked"), function(i, o){ text = $(this).closest("label").text(); }); } if(text){ if(searchMessage){ searchMessage += ", "; } searchMessage += $(this).text() + "[" + text + "]"; } }); $("#searchResultMessage").text(searchMessage); } }, // 서버자체에서 에러 리턴한 경우(통신 장애등..) 일반적인 ajax error handling 로직을 차용한다. error: common.callbackAjaxLoadError, xhr: function () { var xhr = new window.XMLHttpRequest(); if(progressGrids){ $.each(progressGrids, function(i, grid){ //Download progress xhr.addEventListener("progress", function (e) { //console.log(e.lengthComputable, e.total, e.loaded, e); grid.setProgress(0, e.total, e.loaded); }, false); }); } return xhr; } }); }; /** * 저장/삭제등의 ajax 처리 * 2017. 07. 11(김재열) */ common.post = function(dtoObj){ common.buttonDisable(); var ajaxProps = dtoObj.ajax; if(!ajaxProps.toast){ //toast 미설정시 기본 설정 ajaxProps.toast = {none: 'Y'}; }else{ //toast: 'save' 와 같은 경우 if(typeof ajaxProps.toast === 'string'){ var _type = ajaxProps.toast; ajaxProps.toast = {type: _type}; } } //pathVariable 로 _type 이 들어오는 경우 url에도 추가해주어야 권한 체크를 할 수 있다.[2018.03.21, kimjaeyeol] var _url = ajaxProps.url; //url에 _type이 추가되지 않아야 하는 경우 처리 추가[2018.09.18 김도형] if(!ajaxProps.typeNonCheck){ ajaxProps.typeNonCheck = false; } //console.log(ajaxProps.typeNonCheck) if(common._type && !ajaxProps.typeNonCheck){ _url = _url.substring(0, _url.lastIndexOf('/')) + '/' + common._type + _url.substring(_url.lastIndexOf('/')); } if(typeof dtoObj.buttonEnable === 'undefined'){ dtoObj.buttonEnable = true; } $.ajax({ type: "POST", headers: {'_CSRFtk': 'BOaxVCpkkBCBEjszOKoXqhf1mEgJhkuu7QZG+seIc3w='}, dataType: "json", contentType: "application/json; charset=utf-8", url: _url, data: dtoObj.makeJSONString(), beforeSend: function() { if (ajaxProps.loadingModal === undefined || ajaxProps.loadingModal) { $("#loadingModal2").modal(); } }, success: function(result, textStatus, jqXHR){ $('#loadingModal2').modal("hide"); $('.modal-backdrop').remove(); // 서버 메세지를 확인하여 에러존재유무 확인 후 처리하는 프로시저 호출 if (validate.confirmServerMessage(result)){ if(ajaxProps.validateCallback){ ajaxProps.validateCallback(result); } return; } //if(ajaxProps.toast.noneToast == "Y"){ if(ajaxProps.toast.none === "Y"){ ajaxProps.callback(result, textStatus, jqXHR); if(dtoObj.buttonEnable){ common.buttonEnable(); } }else{ //토스트 메시지가 처리되는 동안 마우스 클릭 이벤트를 받지 않도록 한다.[2019.05.14, kimjaeyeol] $('body').css('pointer-events', 'none'); //저장 후 reload 하는 경우 modal을 띄워 화면 제어를 막는다. if(ajaxProps.reloadModal === true){ $("#blockModal").modal(); } //토스트 콜백 정의 ajaxProps.toast.beforeHide = function () { ajaxProps.callback(result, textStatus, jqXHR); if(dtoObj.buttonEnable){ common.buttonEnable(); //마우스 클릭 이벤트 해제 $('body').css('pointer-events', ''); } }; //토스트 메시지 처리 common.toast(ajaxProps.toast); } }, // 서버자체에서 에러 리턴한 경우(통신 장애등..) 일반적인 ajax error handling 로직을 차용한다. error: common.callbackAjaxLoadError }); }; /** * toast 메시지 알림 * @param param.text : 필수 * @param param.icon : 필수 - info, warning, error, success */ common.toast = function(param){ //type이 넘어온 경우 아래와 같이 공통적인 속성을 정하여 처리한다. if(param.type){ var _type = param.type; //type(save, save_popup, delete, delete_popup, no_download_data, ...) if(_type == 'save' || _type == 'save_popup'){ //default : 성공적으로 저장되었습니다. param.text = (param.text)? param.text: '성공적으로 저장되었습니다.'; param.icon = "success"; }else if(_type == 'delete' || _type == 'delete_popup'){ //default : 성공적으로 삭제되었습니다. param.text = (param.text)? param.text: '성공적으로 삭제되었습니다.'; param.icon = "success"; //param.loaderBg = "#E63C6C"; }else if(_type == 'no_download_data'){ //엑셀 등 다운로드 데이터가 없을 때 처리(common.toast({type: 'no_download_data'});) param.text = '다운로드할 데이터가 없습니다.'; //다운로드할 데이터가 없습니다. param.icon = "info"; }else if(_type == 'msg_no_save_data'){ //엑셀 등 다운로드 데이터가 없을 때 처리(common.toast({type: 'no_download_data'});) param.text = '저장하실 자료가 없습니다.'; //저장하실 자료가 없습니다. param.icon = "info"; }else if(_type == 'msg_err_edit_grid'){ //엑셀 등 다운로드 데이터가 없을 때 처리(common.toast({type: 'no_download_data'});) param.text = '현재 편집중인 행에 입력 오류가 있습니다. 오류를 먼저 확인해 주시기 바랍니다.'; //현재 편집중인 행에 입력 오류가 있습니다.\n오류를 먼저 확인해 주시기 바랍니다. param.icon = "error"; } //팝업의 경우 하단으로 위치 변경 if(new RegExp('popup$').test(_type)){ param.position = "bottom-center"; } } var _hideAfter = (typeof param.hideAfter === 'undefined')? 1500 : param.hideAfter; //필수 옵션 설정 var options = { showHideTransition: 'slide', hideAfter: _hideAfter, text: ""+param.text+"", stack: false, icon: param.icon //info, warning, error, success }; //선택 옵션 설정(position, loaderBg, heading) if(param.position){ //bottom-left, bottom-right, bottom-center, top-right, top-left, top-center, mid-center options.position = param.position; }else{ options.position = "mid-center"; } //head title & loaderBg if(param.heading){ options.heading = param.heading; }else{ if(param.icon == "info"){ options.heading = "Info";//Info if(!options.loaderBg){ options.loaderBg = "#007bff"; } }else if(param.icon == "warning"){ options.heading = "Warning";//Warning if(!options.loaderBg){ options.loaderBg = "#ff6f06"; } }else if(param.icon == "error"){ options.heading = "Error";//Error if(!options.loaderBg){ options.loaderBg = "#ffc000"; } }else if(param.icon == "success"){ options.heading = "Success";//Success if(!options.loaderBg){ options.loaderBg = "#9ed40e"; } } } if(param.bgColor){ options.bgColor = param.bgColor; } //toast를 사용자가 닫을 수 있도록 할것인가 여부.. allow the user to close the toast or not if(typeof param.allowToastClose !== 'undefined'){ options.allowToastClose = param.allowToastClose; } //창 닫히기 전 콜백 함수 if(param.beforeHide){ options.beforeHide = param.beforeHide; } //토스트 최대 갯수 if(param.stack){ options.stack = param.stack; } $.toast(options); }; /** * jQuery.ajax 통신 중 Error 발생 시 호출 될 콜백함수 * @param jqXHR XMLHttpRequest object * @param textStatus a string describing the type of error * @param errorThrown */ common.callbackAjaxLoadError = function (jqXHR, textStatus, errorThrown) { common.buttonEnable(); $('#loadingModal').modal("hide"); $('#loadingModal2').modal("hide"); var message; var statusErrorMap = { '400' : "Server understood the request but request content was invalid.", '401' : "Unauthorised access.", '403' : "Forbidden resouce can't be accessed", '500' : "Internal Server Error.", '503' : "Service Unavailable" }; //메세지 구성 if (jqXHR.status) { message =statusErrorMap[jqXHR.status]; if(!message){ message="Unknow Error \n." + errorThrown; } }else if(textStatus=='parsererror'){ message="Error.\nParsing JSON Request failed."; }else if(textStatus=='timeout'){ message="Request Time out."; }else if(textStatus=='abort'){ message="Request was aborted by the server"; }else { message="Unknow Error \n." + errorThrown; } alert(message); }; /** * KeyGenerateUtil 에서 keycode 를 받음. * @param keyCode 를 받아서 호출할 함수 참조 * @return null * * @since 2015. 03. 13(전수일). * @modify 2016. 03. 17(김재열). 스프링 적용 * @old: common_getKeyCode */ common.getKeyCode = function (func){ $.ajax({ type: "POST", async: false, cache: false, //동일 호출로 간주하여 계속 동일한 결과를 리턴되지 않도록 캐싱을 하지 않는다. data: '{}', url: "/common/keycode/getKeyCode.json", success: function(res){ func(res.keyCode); } }); }; common.getRandomKey = function(){ return Math.random().toString().substring(2); } /** * page reload 시 참조할 현재 브라우저 unique 값 세팅 * beforeunload 이벤트에서 호출 한다 * @since: 2018.03.13, kimjaeyeol */ common.setBrowserKey = function (isPopup){ var browserKey = sessionStorage.getItem('_browserKey'); if(!isPopup && !browserKey){ sessionStorage.setItem('_browserKey', common.getRandomKey()); browserKey = sessionStorage.getItem('_browserKey'); } if(isPopup){ browserKey = sessionStorage.getItem('popup.'+window.name); } $.ajax({ type: "POST", async: false, cache: false, data: '', url: "/common/keycode/"+browserKey+"/setBrowserKey.json", success: function(res){ return; }, error: function(){ return; } }); }; /** * KeyGenerateUtil 에서 keycode 를 받음. * @param keyCode 를 받아서 호출할 함수 참조 * @return null * @since 2015. 03. 13(전수일). * @modify 2016. 03. 17(김재열). 스프링 적용 * @deprecated - common.pathVariables 함수를 사용하도록 한다. */ common.setKeyCodeSession = function(props){ var dataObj = {keyCode: {}, parameter: {}}; if(props.parameter){ dataObj.parameter = props.parameter; } if(props.keyCode){ dataObj.keyCode = props.keyCode; } //console.log(sessionStorage.getItem('_browserKey')); //일반 페이지와 팝업의 _browserKey를 분리한다.(팝업 호출 후 부모 페이지의 _browserKey 에 해당하는 값들이 변경되어 버리기 때문) if(dataObj.parameter.btnId){ if(props.callback){ var callbackString = props.callback.toString(); //var _popupId = callbackString.substring(callbackString.indexOf('popup.'), callbackString.indexOf(';', callbackString.indexOf('popup.'))-2); var _popupId = 'popup.' + dataObj.parameter.btnId; sessionStorage.setItem(_popupId, common.getRandomKey()); dataObj.parameter[_popupId] = sessionStorage.getItem(_popupId); } }else{ if(!sessionStorage.getItem('_browserKey')){ sessionStorage.setItem('_browserKey', common.getRandomKey()); } dataObj.parameter['_browserKey'] = sessionStorage.getItem('_browserKey'); } //임시로 추가(pathvariable 완전 사용 전 임시) sessionStorage.setItem('_callCheck', "old"); //stringify는 undefined 무시되므로 null로 변환한다. var jsonString = JSON.stringify( dataObj, function(k, v) { if (v === undefined) { return null; } return v; } ); //var jsonString = JSON.stringify(dataObj); $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", async: false, cache: false, //동일 호출로 간주하여 계속 동일한 결과를 리턴되지 않도록 캐싱을 하지 않는다. url: "/common/keycode/setKeyCodeSession.json", data: jsonString, success: function(res){ location.href = props.targetUrl + res.path; } }); }; /** * 상세 페이지 이동시 pathvariable을 이용하여 이동 시 처리 * url에 id를 추가하는 처리를 하지 않는다. * 팝업 예시) * common.pathVariables({ popupFunction: popup.checkScheduleYearP, keyCode : { CHECK_CODE: data['CHECK_CODE'] }, parameter: { btnId: "btnCheckSchedule" } }); * popup.checkScheduleYearP = function(targetUrl){ this.url = ctxPath + "/check/schedule/year/popup"; if(targetUrl){ popup.checkScheduleYearPop = window.open(targetUrl, ... * 2018.09.10, kimjaeyeol */ common.pathVariables = function(props){ var dataObj = {keyCode: {}, parameter: {}}; if(props.parameter){ dataObj.parameter = props.parameter; } if(props.keyCode){ // 값에 '/'가 있는 경우 pathVariable 받을 때 404 오류가 발생한다. // '/'로 치환하여 보내고 SessionKeyCodeInterceptor에서 다시 '/' 로 변경해준다.[2020.05.15, kimjaeyeol] $.each(props.keyCode, function (key, val) { if(!common.isEmpty(val) && val.toString().indexOf('/') >= 0){ props.keyCode[key] = val.replace(/\//g, "/"); } }); dataObj.keyCode = props.keyCode; } if(typeof props.popupFunction === 'undefined' && typeof props.targetUrl === 'undefined'){ console.log('popupFunction 또는 targetUrl은 필수입니다.'); return; } if(typeof props.popupFunction !== 'undefined'){ //팝업함수에 선언된 url을 얻어온다 var popupObj = new props.popupFunction(); dataObj.targetUrl = popupObj.url; }else{ dataObj.targetUrl = props.targetUrl; } //stringify는 undefined 무시되므로 null로 변환한다. var jsonString = JSON.stringify( dataObj, function(k, v) { if (v === undefined) { return null; } return v; } ); $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", async: false, cache: false, //동일 호출로 간주하여 계속 동일한 결과를 리턴되지 않도록 캐싱을 하지 않는다. url: "/common/keycode/setUsePathVariables.json", data: jsonString, success: function(res){ if(props.popupFunction || typeof props.callback !== 'undefined'){ if(typeof props.callback !== 'undefined'){ props.callback(res); }else{ try{ if(props.options){ props.popupFunction(dataObj.targetUrl + res.path, props.options); }else{ props.popupFunction(dataObj.targetUrl + res.path); } }catch(e){ if(e.message && e.message.indexOf('focus') !== -1){ common.toast({ text:"해당 브라우저의 팝업 차단 기능이 설정되어 있습니다. 차단 해제 후 사이트를 이용하여 주십시오.", icon: 'error', hideAfter: 6000}); } } } }else{ location.href = dataObj.targetUrl + res.path; } } }); }; /** * bootstrap popover 취소 시 호출 * @since 2017.07.17, kimjaeyeol */ common.bsPopoverRemove = function(){ $('.popover').remove(); }; /** * input 태그에_inputmask 적용 * 사용시 _inputmask attribute를 태그에 추가해 주어야 함. * https://github.com/RobinHerbots/Inputmask 참고 * @since 2017.07.18, SHINMJ */ common.inputmask = function(props){ $("input").each(function(){ if($(this).attr("data-inputmask")){ //기본속성 적용 {서버전송시mask 제거, numeric인경우 기본 천단위마다 ','로 나눔} //기본속성을 사용하지 않을 경우 각 페이지에서 option false 처리해주세요. var options = {autoUnmask:true,autoGroup:true,groupSeparator:","}; if (props != undefined) { $.extend(options, props); } $(this).inputmask(options); } }); }; $('.daterange').click(function(){ //$(this).prev().focus(); $(this).next().focus(); }); common.dateranges = function(props){ return $.extend({ 'Today': [moment(), moment()], 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], 'Last 7 Days': [moment().subtract(6, 'days'), moment()], 'Last 30 Days': [moment().subtract(29, 'days'), moment()], 'This Month': [moment().startOf('month'), moment().endOf('month')], 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] }, props); }; common.daterangepicker = function($input, props, callback, applyCallback){ //ranges 미사용시 ranges: false 로 넘어온다 if(typeof props.ranges === 'boolean' && !props.ranges){ delete props.ranges; }else{ props.ranges = common.dateranges(props.ranges); } var _defaultFormat = ($input.data('format'))? $input.data('format'): 'YYYY-MM-DD'; var _props = $.extend({ locale: {format: _defaultFormat}, timePicker24Hour: true, //timePicker: true 시 적용 timePickerIncrement: 10,//timePicker: true 시 적용 autoUpdateInput: false, //empty 값 허용 시 false opens: 'left', alwaysShowCalendars: true //custom range 외에도 달력 표시 }, props); //선택된 값에서 '-', ' ', ':' 를 제거하고 숫자만 넘긴다. var _callback = function(start, end, label) { //console.log('callback'); var _format = _props.locale.format.replace(/-/gi, "").replace(/\s/gi, "").replace(/:/gi, ""); //_props.autoUpdateInput = true; //콜백 함수에서 value 값이 선택 이전 값으로 떨어져서 이곳에서 값을 설정한다.(가공하지 않아도 submit 하는 시점에는 변경된 값이 들어 간다.) if(_props.singleDatePicker){ //단일 일자 $input.val(start.format(_format).replace(/[^0-9]/gi, "")); }else{ $input.val((start.format(_format) + end.format(_format)).replace(/[^0-9]/gi, "")); } //이상한 값들을 입력해도 날짜 포맷 형태로 유지하여 보여주기 위해 common.setDaterangeValue($input, start.format(_format), end.format(_format)); if(typeof callback === 'function'){ callback(start.format(_format), end.format(_format), label); } }; $input.on('apply.daterangepicker', function(ev, picker) { var startDate = picker.startDate.format(picker.locale.format); var endDate = picker.endDate.format(picker.locale.format); $(this).val(startDate + ' - ' + endDate); if(typeof applyCallback === 'function'){ applyCallback(startDate.replace(/-/gi, ""), endDate.replace(/-/gi, "")); } }); $input.on('cancel.daterangepicker', function(ev, picker) { $(this).val(''); }); var pattern = /[^0-9\:-\s]/gi; $input.focusout(function(){ if(pattern.test($.trim($(this).val()))){ console.log($(this).val()); $(this).val(''); }else{ var picker = $(this).data('daterangepicker'); var _format = picker.locale.format; //console.log('focusout',$(this).val(), picker.startDate.format(_format), picker.endDate.format(_format)); if(picker.startDate && picker.endDate){ $(this).val(picker.startDate.format(_format) + ' - ' + picker.endDate.format(_format)); } } }); $input.daterangepicker(_props, _callback); }; /* * datarange 값을 입력한다. */ //common.setDaterangeValue($("#dateRange"), '20180309', '20180409'); //common.setDaterangeValue($("#dateRange"), {'months': -1}, {'days': -1}); common.setDaterangeValue = function($input, start, end){ if(!start || !end){ return false; } var picker = $input.data('daterangepicker'); var _format = picker.locale.format; if(typeof start === 'string'){ picker.setStartDate(start); }else{ picker.setStartDate(common.getDate({format: _format, add: start})); } if(typeof end === 'string'){ picker.setEndDate(end); }else{ picker.setEndDate(common.getDate({format: _format, add: end})); } $input.val(picker.startDate.format(_format) + ' - ' + picker.endDate.format(_format)); }; /** * datetimepicker setting * 참고 : http://eonasdan.github.io/bootstrap-datetimepicker/ * @since 2017.07.18, SHINMJ * 기본값은 사용 빈도가 높은 일자를 표현하고, 월이나 년도 사용 시 options 에 속성을 부여하도록 한다.[2017.08.09, kimjaeyeol] * @Deprecated - daterangepicker 로 대체 */ common.datetimepicker = function(obj, options){ if(common.isEmpty(obj)) return false; var _opt = { format: "YYYY-MM-DD", extraFormats: ["YYYY-MM-DD"] }; if(options){ $.each(options, function (key, val) { _opt[key] = val; }); } /* if(_opt.useCurrent == undefined){ console.log("common.datetimepicker1", _opt.useCurrent); $.extend(_opt, {widgetPositioning: { horizontal: "auto", vertical: "auto" }}); } */ _opt = $.extend({ toolbarPlacement:"bottom", showTodayButton:true, showClose:true, showClear:true, allowInputToggle:true, dayViewHeaderFormat:"YYYY년 MMMM", locale:moment.locale('ko'), icons:{today: 'fa fa-refresh'}, widgetPositioning:{horizontal: "auto",vertical: "auto"} }, _opt); obj.datetimepicker(_opt); }; /** * jquery fileupload 공통 처리 * 첨부 팝업을 띄우지 않고 바로 파일 선택창을 호출하닌 방식(멀티 업로드 지원) * @API: https://github.com/blueimp/jQuery-File-Upload * @param: inputId - fileinput id progressId - 업로드 상태 div id fileGridId - 첨부 그리드 id * @since: 2017.07.18, kimjaeyeol */ common.fileUpload = function(param){ var _inputId = (param && param.inputId)? param.inputId: 'fileupload'; var _progressId = (param && param.progressId)? param.progressId: 'progress'; var _dataRow = $('#'+_inputId).attr('data-dataRow'); //업로드 진행상태, 100이 되면 progress 영역을 감춘다. var progress = 0; var init = function(){ common.buttonEnable(); $(".animated-progress span").animate({width: "0%"}); $("#progress-row").hide(); $('#'+_progressId).hide(); $('#'+_inputId).removeAttr('data-dataRow'); if(param && typeof param.single === "undefined"){ $('#'+_inputId).attr("multiple", "multiple"); } }; $('#'+_inputId).fileupload({ dataType: "json", url: "/CommonFileUploadController/uploadFile.json", sequentialUploads: true, //파일을 순차적으로 전송. 여러 파일 전송 시 ajax 호출을 파일 수 만큼 호출하는데 이 때 중복이 발생할 수 있다. add: function(e, data){ //이미지 첨부시 이미지 확장자만 업로드 되도록 체크. var acceptChecked = true; var accept = $('#'+_inputId).attr('accept'); if(accept && accept.indexOf('image/') !== -1){ var uploadFile = data.files[0]; if (!(/\.(gif|jpg|jpeg|png)$/i).test(uploadFile.name)) { common.toast({ text: '이미지만 업로드 할수 있습니다.', //이미지만 업로드 할수 있습니다. icon: 'error' }); acceptChecked = false; } } if(typeof param !== 'undefined' && param.formData){ data.formData = param.formData; } if(acceptChecked){ data.submit(); } }, start: function (e) { //Callback for uploads start, equivalent to the global ajaxStart event common.buttonDisable(); if(param && typeof param.noprogress === "undefined"){ /* $('#'+_progressId+' .progress-bar').css('width', '0%'); $('#'+_progressId).show(); */ $("#progress-row").show(); } }, done: function (e, data) { // 서버 메세지를 확인하여 에러존재유무 확인 후 처리하는 프로시저 호출 if (validate.confirmServerMessage(data.result)){ return; } //Callback for successful uploads $.each(data.result.UPLOAD_FILES, function (index, file) { var obj = { ORIGINAL_FILE_NAME: file.ORIGINAL_NAME, FILE_SIZE: file.FILE_SIZE, UPLOAD_FILE_NAME: file.SYSTEM_NAME, FILE_EXT: file.FILE_EXT, THUMB_WEB_PATH: file.THUMB_WEB_PATH, IMG_WIDTH: file["IMG_WIDTH"], IMG_MODIFY: 'imgModify', IMG_DELETE: 'imgDelete', dataRow: _dataRow }; param.callback(obj); }); $(".animated-progress span").animate({width: "0%"}); $("#progress-row").hide(); }, progressall: function (e, data) { //Callback for global upload progress events if(param && typeof param.noprogress == "undefined"){ progress = parseInt(data.loaded / data.total * 100, 10); /* $('#'+_progressId+' .progress-bar').css( 'width', progress + '%' ); */ $(".animated-progress span").animate( { width: progress + "%", }, 10 ); } }, always: function (e, data) { //Callback for completed (success, abort or error) requests if(param && typeof param.noprogress == "undefined"){ if(progress == 100){ init(); } }else{ init(); } }, fail: function (e, data) { // Callback for failed (abort or error) uploads: init(); } }); }; /** * jquery filddownload 공통 처리 * 모바일 지원 가능한 jquery plugin 도입 * @API: https://github.com/johnculviner/jquery.fileDownload * @since: 2017.07.18, kimjaeyeol */ common.fileDownload = function (param){ $.fileDownload( "/CommonFileDownload/downloadFile.file", { httpMethod: "GET", data: { append_file_nm: encodeURI(param.orgFileName), append_sys_code: param.sysFileName, is_excelForm: param.is_excelForm, is_manual: param.is_manual } } ); }; /** * 파라미터로 넘어온 FORM OBJECT 에 HIDDEN ELEMENT 를 설정한다. * @param documentObject Document Object * @param formObject Form Object * @param objectName Object Name * @param objectValue Object Value * @return null * @since 2004. 12. 23(전수일). * @old: common_setHiddenElement */ common.setHiddenElement = function (documentObject, formObject, objectName, objectValue){ if(documentObject.getElementById(objectName)){ documentObject.getElementById(objectName).value = objectValue; }else{ var hiddenElement = documentObject.createElement("input"); hiddenElement.type = 'hidden'; hiddenElement.id = objectName; hiddenElement.name = objectName; hiddenElement.value = objectValue; formObject.appendChild(hiddenElement); } }; /** * 패스워드는 영문자/숫자/특수문자 혼용, 9~20 자리 * * @param val : password 문자 * @return password 형식을 체크한 결과(true 또는 false) 반환 * * @since 2011. 07. 13(안가희) * @since 2013. 04. 02(김재열), minLength 추가하여 자릿 수를 지정할 수 있도록 변경, 미지정시 8자리 기본 * @since 2016. 01. 11(신명진), 영문자/숫자/특수문자 혼용하도록 수정, 기본 9~20자리 변경 * @since 2020. 08. 11(김재열), props 로 속성을 받도록 하고 각 문자별 자릿 수를 지정할 수 있도록 변경 */ common.validPassword = function(val, props) { var chk_num = val.search(/[0-9]/g); var chk_eng = val.search(/[a-z]/ig); var chk_asc = val.search(/\W|\s/g); // 기본 9~20 자리 var min = (props.min)? props.min: 9; var max = (props.max)? props.max: 20; // 각 문자별 최소 자릿수 설정 var _required = { 'number': 1, 'english': 1, 'special': 1 }; if(props.required){ $.extend(_required, props.required); } if(val.length < min || val.length > max){ return false; } else { if((_required.number > 0 && chk_num < 0) || (_required.english > 0 && chk_eng < 0) || (_required.special > 0 && chk_asc < 0)) { return false; } } return true; }; /** * Value 값에 의한 라디오버튼 선택 * * @param radioObj * @param val * @return * @old: common_checkRadioByValue * @since 2005. 08. 01(김철현). */ common.checkRadioByValue = function(radioObj, val){ for(var i=0; i= 0){ return '전체'; } return result; }; /** * 특수문자 '|'로 연결된 Value 값에 의한 체크박스 선택 * * @param checkObj * @param val * @return * * @since 2006. 05. 10(ecosian). * @since 2009. 03. 26(안가희). 신규 추가. * @modify 2021. 11. 01(오예진) - null or '' 일 경우, 체크 다 뺴기 */ common.checkByValue = function(checkObj, val){ //if (val == null||val=="") return; if (val == null || val=="") { for (var i=0; i= ' ' && str.charAt(i) <= '~' ){ strByte++; }else{ strByte += 3; //유니코드 한글자당 byte 수 3 } } return strByte; }; /** * 인자로 받은 값을 기준으로 한글, 영문 최대자리수를 가지는 배열 리턴 * * @param pNum : 최대자리수값 * @return Array : [0]: _common_divBytes 반영된 자리수(한글), [1]: pNum 자리수(영문) * @since 2014. 05. 20(김철현). * @old: common_validateGetMaxLengthArr (CommonJsValidateJs.jsp) */ common.validateGetMaxLengthArr = function (pNum) { //유니코드 한글자당 byte 수 3 return new Array(parseInt(pNum / 3, 10), pNum); }; /** * 날짜 비교 - moment.js를 사용했기 때문에 moment 라이브러리를 사용하지 않는다면 수정해야함. * str 대상 날짜 * compare 비교할 날짜 * format dateformat(YYYY-MM-DD, YYYY-MM, YYYY) * @since 20170.09.27, 신명진 */ common.isDateBefore = function(str, compare, format){ return moment(moment(str, format.replace("/-/g", "")).format(format)).isBefore(moment(compare, format.replace("/-/g", "")).format(format)); }; common.isDateAfter = function(str, compare, format){ return moment(moment(str, format.replace("/-/g", "")).format(format)).isAfter(moment(compare, format.replace("/-/g", "")).format(format)); }; /* * type(day, year, month) */ common.isDateSameOrBefore = function(start, end, type){ //moment('2010-10-20').isSameOrBefore('2010-10-21'); // true //값이 없으면 false if(common.isEmpty(start) || common.isEmpty(end)){ return false; } if(typeof type === 'undefined'){ type = 'day'; } var format = 'YYYYMMDD'; if(type === 'year'){ format = 'YYYY'; }else if(type === 'month'){ format = 'YYYYMM'; } //날짜 타입이 아니면 false if(!start.isDate(format) || !end.isDate(format)){ return false; } return moment(start).isSameOrBefore(end, type); }; /* * @type(day, year, month) * @include */ common.isDateBetween = function(value, start, end, type, include){ //값이 하나라도 없으면 false if(common.isEmpty(value) || common.isEmpty(start) || common.isEmpty(end)){ return false; } //기본값은 일자 기준 type = type || 'day'; var format = 'YYYYMMDD'; if(type === 'year'){ format = 'YYYY'; }else if(type === 'month'){ format = 'YYYYMM'; } //날짜 타입이 아니면 false if(!value.isDate(format) || !start.isDate(format) || !end.isDate(format)){ return false; } include = include || '[]'; return moment(value).isBetween(start, end, type, include); }; /** * 날짜 처리 후 리턴 * 날짜 관련하여 이 함수에서 다 처리한다. * * 현재 일자 : common.getDate() * 하루전 일자 : common.getDate({format: 'YYYYMMDD', add: {'days': -1}}) * 현재 년도 : common.getDate('YYYY') * @dependency : moment.js * @2018.02.22, kimjaeyeol */ common.getDate = function(props){ if(!props){ return moment().format('YYYYMMDD'); }else{ if (typeof props === "string") { return moment().format(props); }else{ if(props.format){ var _format = props.format; }else{ var _format = 'YYYYMMDD'; } for(var key in props.add){ //{add: {'years': 1}}, {add: {'months': 1}}, {add: {'days': 1}} return moment().add(props.add[key], key).format(_format); } } } }; /** * 날짜 format 맞춰서 return * props.date 필수 * @dependency : moment.js * @2018.04.26, SHINMJ */ common.getDateFormat = function(props){ if(props.format){ var _format = props.format; }else{ var _format = 'YYYY-MM-DD'; } return moment(props.date).format(_format); }; /** * checkbox 의 전체선택/해제를 Control 한다. * 이 메소드를 사용하기 위해서는 동일한 이름을 가지는 checkbox 전체에 onclick 이벤트로 이 함수를 호출해 주어야 한다. * 전체 checkbox, 즉 value 값이 없는 checkbox 를 클릭하면 동일한 이름을 가지고 * 있는 checkbox 전체가 선택 또는 해제된다. * 그리고, 전체가 아닌 다른 항목의 checkbox 를 클릭하면 전체를 나타내는 checkbox 를 선택해제 상태로 바뀐다. * @param event : click 이벤트가 발생한 event Object * @param checkBoxObject : checkbox Object * @return * @since 2007. 03. 09(전수일). * @old common_allCheckControl */ common.allCheckControl = function(event, checkboxObject){ var $obj = $(event.srcElement || event.target); if ($obj.val() == "" || $obj.val() == "ALL"){ if (checkboxObject.length > 1) { for (var i=1; i'); $select2.find('.select2-selection__arrow').hide(); } }; /** * Bootstrap select : selectpicker 의 편집 여부 활성화/비활성화 처리 * @2019.03.26, sEan- */ common.selectpickerEditable = function($obj, editable) { var $selectBtn = $obj.next(); if((typeof editable === 'string' && editable === 'true') || (typeof editable === 'boolean' && editable)){ $selectBtn[0].disabled = false; }else{ $selectBtn[0].disabled = true; } }; /** * array sort * arrayObj.sort(common.sort) 와 같이 사용한다 * @2018.04.19, kimjaeyeol */ common.sort = function(a, b){ return a - b; } /** * 두 날짜 사이를 count해서 반환 * dateFormat : 비교대상 날짜 format * diffFormat : days > 일수, months > 달수, years > 년수 * moment js 사용 * @2018.04.24, SHINMJ */ common.getDateDiff = function(from, to, dateFormat, diffFormat){ //기본 ymd format if(typeof dateFormat === 'undefined'){ dateFormat = 'YYYYMMDD'; } //기본 days로 count if(typeof diffFormat === 'undefined'){ diffFormat = 'days'; } var fromDate = moment(from.replace(/-/g,""), dateFormat); var toDate = moment(to.replace(/-/g,""), dateFormat); return toDate.diff(fromDate, diffFormat)+1; }; /** * 값이 비어있는지 체크한다. * 2018.04.24, kimjaeyeol */ common.isEmpty = function(value) { if(typeof value === 'undefined' || value === null || value.length === 0 || value === "null"){ return true; } value = ''+value; if (!value.match(/\S/)) { return true; } else { return false; } } /** * select2 multiple 속성 이용 시 해당 함수 사용. * value 앞에 checkbox 추가함. * multi 사용 시 placeholder 사용해야 하므로 '전체'가 있는 경우 '전체'에 대한 값은 ''이 아닌 값이어야 함. * common.multiSelect2({obj:$("#select1"), allCode:'ALL'}); * 2018.04.27, SHINMJ */ common.multiSelect2 = function(props){ var multiselect = props.obj; if(props['allCode']){ //전체가 있는 경우 전체의 code props.obj.data('allCode', props['allCode']); } multiselect.select2({ placeholder: "다중선택", templateResult : function(object, container, query){ if (object.loading) return; var id = object.id; var label = $('', { for: id }); var checkbox = $(''); if (object.element.selected) checkbox.attr('checked', 'checked'); label.append(checkbox); label.append(object.text) return label; }, templateSelection: function(object, container){ return object.text; }, escapeMarkup: function(m) { return m; } }); var selected = function(e, isSelected){ var id = e.params.data.id; var arr = []; var allCode = $(e.target).data('allCode'); if (id === allCode) { $(e.target).find('option').each(function(){ $(this).data('selected', isSelected); }); } else { $(e.target).find('option[value='+allCode+']').data('selected', false); $("input:checkbox[id='"+allCode+"']").prop('checked', false); $("label[for='"+allCode+"']").parent().attr('aria-selected', false); } $(e.target).find('option[value='+id+']').data('selected', isSelected); $(e.target).find('option').each(function(){ if($(this).data('selected')){ arr.push($(this).val()); } $("label[for='"+$(this).val()+"']").parent().attr('aria-selected', $(this).data('selected')); $("input:checkbox[id='"+$(this).val()+"']").prop("checked", $(this).data('selected')); }); $(e.target).val(arr).trigger('change'); } multiselect.on('select2:select', function (e) { selected(e, true); }); multiselect.on('select2:unselect', function (e) { selected(e, false); }); }; /** * null 이나 빈값을 기본값으로 변경 * @param str 입력값 * @param defaultVal 기본값(옵션) * @returns {String} 체크 결과값 * @since 2018.04.30(김도형) */ common.nvl = function(str, defaultVal){ if (common.isEmpty(str)) { var defaultValue = ""; if (typeof defaultVal !== 'undefined') { defaultValue = defaultVal; } return defaultValue; } return str; }; /** * 사업부 관리 여부에 따라 site code값 처리. 사업부를 관리하지 않을 경우 '-' 값으로 return * @param code 사업부코드 * @returns {String} 사업부 코드 * @since 2019.04.24(김도형) */ common.siteNvl = function(code){ var siteFlag = ''; if(common.nvl(siteFlag, "Y") === "N"){ code = "-"; } return code; }; /** * 사업부 관리 여부에 따라 site code값 처리. 사업부를 관리하지 않을 경우 '-' 값으로 return * @param code 사업부코드 * @returns {String} 사업부 코드 * @since 2019.04.24(김도형) */ common.affiliateNvl = function(code){ var affiliateFlag = ''; if(common.nvl(affiliateFlag, "Y") === "N"){ code = "-"; } return code; }; /** * timeseries chart 의 Axis 표현 시 날짜 형식으로 변환 * 201801 과 같은 형태의 값을 2018-01-01 형태로 변환해주어야 axis 에 날짜 표현이 가능하다. * 2018.05.16, kimjaeyeol */ common.chartAxisDate = function(array, format) { var yyyymmdd = new Array(); $.each(array, function(i, data){ if(data !== 'x'){ data = moment(data, format).format('YYYY-MM-DD'); } yyyymmdd.push(data); }); return yyyymmdd; }; /** * select2 동적으로 생성하는 함수 * @param selectbox(string) : '#selectbox' * @param props(object) : {value: 'CODE', text: 'NAME', prefix: 'CODE'} * @param dataList(json list) : result.dsList * @since 2018.09.18, kimjaeyeol * @modify 2019.03.26 sEan- : division 이 null 이 아니면 Bootstrap selectpicker가 호출된다. 없거나 null 인 경우는 그대로 select2 호출. */ common.setSelect2Options = function(selectbox, props, dataList, division){ $(selectbox).empty(); $.each(dataList, function (i, data) { var $option = $('