// 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': 'ZNcP69Ccf2MP4PNXpLkmAIB+t4oQgCYuhgYicyeu8+c='},
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': 'ZNcP69Ccf2MP4PNXpLkmAIB+t4oQgCYuhgYicyeu8+c='},
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 = $('