admin.common.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. /*
  2. * Common Java Script by gagamel
  3. *
  4. * Copyright (c) 2010 gagamel
  5. * Dual licensed under the MIT (MIT-LICENSE.txt)
  6. * and GPL (GPL-LICENSE.txt) licenses.
  7. *
  8. * $Date: 2019-08-06 $
  9. */
  10. /**
  11. * 로그인메뉴목록을 sessionStorage에 담는다.
  12. */
  13. let cfnSetLoginMenuList = function(loginMenuList) {
  14. sessionStorage.setItem('loginMenuList', JSON.stringify(loginMenuList));
  15. }
  16. /**
  17. * sessionStorage에 담긴 메뉴정보를 가져온다.
  18. */
  19. let cfnGetMenuInfo = function(menuId) {
  20. let loginMenuList = JSON.parse(sessionStorage.loginMenuList);
  21. let menu = '';
  22. loginMenuList.forEach(function(item) {
  23. if (menuId == item.menuId) {
  24. menu = item;
  25. gagajf.setCookie("CK_MENU_ID", menuId, 1); // 쿠키 설정
  26. return false;
  27. }
  28. });
  29. return menu;
  30. }
  31. /**
  32. * LNB메뉴 그리기
  33. */
  34. let cfnDrawLnbMenu = function(gnbMenuId) {
  35. let loginMenuList = JSON.parse(sessionStorage.loginMenuList);
  36. let lnbTag = '<li>\n';
  37. $.each(loginMenuList, function(idx1, item1) {
  38. if (gnbMenuId == item1.pmenuId) {
  39. if (item1.leafLvl == 0) {
  40. //lnbTag += ' <a class="dep2" attr="data-url=' + item1.menuUrl + '">\n';
  41. lnbTag += ' <a class="dep2 on" href="javascript:void(0);" onclick="fnClickLnb(\'' + item1.menuId + '\');">\n';
  42. } else {
  43. lnbTag += ' <a class="dep2 on">\n';
  44. }
  45. /* lnbTag += ' <i class="fa fa-shopping-cart"></i>\n';
  46. lnbTag += ' <span class="nav-label"> ' + item1.menuNm + '</span>\n';
  47. lnbTag += ' <i class="mnArrow fa fa-angle-down"></i>\n'; */
  48. lnbTag += item1.menuNm + '\n';
  49. lnbTag += ' </a>\n';
  50. if (item1.leafLvl > 0) {
  51. lnbTag += ' <ul class="dep3">\n';
  52. $.each(loginMenuList, function(idx2, item2) {
  53. if (item1.menuId == item2.pmenuId) {
  54. lnbTag += ' <li>\n';
  55. //lnbTag += ' <a href="javascript:void(0);" attr="data-url=' + item2.menuUrl + '"><span>' + item2.menuNm + '</span></a>\n';
  56. lnbTag += ' <a href="javascript:void(0);" onclick="fnClickLnb(\'' + item2.menuId + '\');"><span>' + item2.menuNm + '</span></a>\n';
  57. lnbTag += ' </li>\n';
  58. }
  59. });
  60. lnbTag += ' </ul>\n';
  61. }
  62. }
  63. });
  64. lnbTag += '</li>\n';
  65. $('#lnb').html(lnbTag);
  66. }
  67. /**
  68. * @type : function
  69. * @access : public
  70. * @desc : Combobox 구성
  71. * <pre>
  72. * cfnCreateCombo("/renderer/company/brand/list", oTarget, "[선택]");
  73. * </pre>
  74. * @param : actionUrl - URL. 필수
  75. * oTarget - target 오브젝트. 필수
  76. * defaultTxt - default 텍스트([선택]/[전체]). option
  77. * chooseCd - 선택된 코드 값. option
  78. * isCodeDisp - 코드표시(true/false). option
  79. * @return : None
  80. * @since : 2019/06/07
  81. * @author : gagamel
  82. */
  83. var cfnCreateCombo = function(actionUrl, oTarget, defaultTxt, chooseCd, isCodeDisp) {
  84. if (gagajf.isNull(isCodeDisp)) isCodeDisp = true;
  85. $.getJSON(actionUrl
  86. , function(result, status) {
  87. if (status == 'success') {
  88. $('option', oTarget).remove();
  89. if (!gagajf.isNull(defaultTxt)) {
  90. $(oTarget).append('<option value="">' + defaultTxt + '</option>');
  91. }
  92. $.each(result, function(idx, data) {
  93. var tag = '<option value="' + data.cd + '"';
  94. if (!gagajf.isNull(chooseCd) && chooseCd == data.cd) {
  95. tag += ' selected';
  96. }
  97. if (isCodeDisp) {
  98. tag += '>[' + data.cd + '] ' + data.cdNm + '</option>';
  99. } else {
  100. tag += '>' + data.cdNm + '</option>';
  101. }
  102. $(oTarget).append(tag);
  103. });
  104. }
  105. });
  106. }
  107. /**
  108. * @type : function
  109. * @access : public
  110. * @desc : MultiCombobox 구성
  111. * <pre>
  112. * cfnCreateCombo("/renderer/company/brand/list", oTarget, "[선택]");
  113. * </pre>
  114. * @param : actionUrl - URL. 필수
  115. * oTarget - target 오브젝트. 필수
  116. * defaultTxt - default 텍스트([선택]/[전체]). option
  117. * chooseValArr - 선택된 코드 값. option arr
  118. * isCodeDisp - 코드표시(true/false). option
  119. * isAllYn - 전체선택 존재여부. option
  120. * searchParams - . option
  121. * formId - target 오브젝트의 formId. option
  122. *
  123. * @return : None
  124. * @since : 2019/06/07
  125. * @author : gagamel
  126. */
  127. var cfnCreateMultiCombo = function(actionUrl, oTarget, defaultTxt, chooseValArr, isCodeDisp, isAllYn, searchParams, formId){
  128. var opt = {};
  129. opt.actionUrl = actionUrl; //컨트롤러 URL
  130. opt.oTarget = oTarget; //타겟DIV
  131. opt.defaultTxt = defaultTxt; //디폴트 텍스트 기본 = 선택
  132. opt.chooseValArr = chooseValArr; //기존 체크될 데이터
  133. opt.isCodeDisp = isCodeDisp; //[코드] 값 표현여부
  134. opt.isAllYn = isAllYn; //전체선택버튼 존재여부 Y:N
  135. opt.params = searchParams; //조회시 파라미터 (json타입)
  136. opt.formId = formId; //화면 formId
  137. var html = "";
  138. var isChecked = "";
  139. if(opt.actionUrl){
  140. $.getJSON(opt.actionUrl
  141. , opt.params
  142. , function(result, status) {
  143. if (status == 'success') {
  144. opt.dataArr = result;
  145. html += '<div class="multiCheckBox" style="width:230px">';
  146. html += ' <button type="button" class="sltBtn" style="overflow-x: hidden; padding-right:5px;">'+opt.defaultTxt+'</button>';
  147. html += ' <ul style="display: none; box-shadow: 3px 3px 3px; overflow-y:scroll;">';
  148. if(opt.isAllYn){
  149. html += ' <li><label class="chkBox"><input type="checkbox" name="전체선택" id="'+opt.oTarget+'" onclick="uifnAllCheck(\''+opt.oTarget+'\')">전체선택</label></li>';
  150. }
  151. for(var i in opt.dataArr){
  152. for(var idx in chooseValArr){
  153. if(opt.dataArr[i] == chooseValArr[idx]){
  154. isChecked = "checked";
  155. }else{
  156. isChecked = "";
  157. }
  158. }
  159. if(opt.isCodeDisp){
  160. html += ' <li><label class="chkBox"><input type="checkbox" name="'+opt.oTarget+'" value="'+opt.dataArr[i].cd+'" '+isChecked+'>['+opt.dataArr[i].cd+']'+opt.dataArr[i].cdNm+'</label></li>';
  161. }else{
  162. html += ' <li><label class="chkBox"><input type="checkbox" name="'+opt.oTarget+'" value="'+opt.dataArr[i].cd+'" '+isChecked+'>'+opt.dataArr[i].cdNm+'</label></li>';
  163. }
  164. }
  165. html += ' </ul>';
  166. html += '</div>';
  167. if (opt.formId) {
  168. $("#"+opt.formId).find("#"+opt.oTarget).html(html);
  169. }else{
  170. $("#"+opt.oTarget).html(html);
  171. }
  172. //높이조절 10개 이상시 스크롤생성
  173. var height = ((opt.dataArr.length + (opt.isAllYn?1:0)) * 28) > 308 ? 308 : ((opt.dataArr.length + (opt.isAllYn?1:0)) * 28);
  174. $("#"+opt.oTarget).find("ul").height(height);
  175. }
  176. });
  177. }
  178. }
  179. /**
  180. * @type : function
  181. * @access : public
  182. * @desc : Checkbox 구성
  183. * <pre>
  184. * cfnCreateCheckbox("/renderer/company/brand/list", $('#div0'), "brandMngIdx", callBackFun);
  185. * </pre>
  186. * @param : actionUrl - URL. 필수
  187. * oTarget - target 오브젝트. 필수
  188. * checkboxNm - 체크박스명. 필수
  189. * @return : None
  190. * @since : 2019/06/14
  191. * @author : gagamel
  192. */
  193. var cfnCreateCheckbox = function(actionUrl, oTarget, checkboxNm, callBackFun) {
  194. $.getJSON(actionUrl
  195. , function(result, status) {
  196. if (status == 'success') {
  197. $(oTarget).html('');
  198. $.each(result, function(idx, data) {
  199. $(oTarget).append('<label class="chkBox"><input type="checkbox" name="' + checkboxNm + '" value="' + data.cd + '"/>' + data.cdNm + '</label>');
  200. });
  201. if (typeof(callBackFun) != 'undefined')
  202. callBackFun.call();
  203. }
  204. });
  205. }
  206. /**
  207. * @type : function
  208. * @access : public
  209. * @desc : 다중 select의 선택된 값을 표시
  210. * <pre>
  211. * cfnShowMultiSelectedValue($('#detailForm select[name=roleDiv]'), "M,S,D");
  212. * </pre>
  213. * @param : objToShow - 표시할 다중 select 객체
  214. * @param : values - 다중 선택된 값(콤마(,)로 연결). 예) M,S,D
  215. * @since : 2019/06/04
  216. * @author : gagamel
  217. */
  218. var cfnShowMultiSelectedValue = function(objToShow, values) {
  219. // 기존 선택된 옵션 값 초기화
  220. $.each($('option', objToShow), function() {
  221. $(this).prop('selected', false);
  222. });
  223. var mSelect = $(objToShow).parent()
  224. $.each($(mSelect).find('.mSelected > li'), function() {
  225. if (!$(this).hasClass('off') && !$(this).hasClass('srchFld')) {
  226. $(this).addClass('off');
  227. }
  228. });
  229. $.each($(mSelect).find('.mSelecting > ul > li'), function() {
  230. if ($(this).hasClass('off')) {
  231. $(this).removeClass('off');
  232. }
  233. });
  234. // 기존 선택된 옵션 값 초기화
  235. $.each($('option', objToShow), function(idx1) {
  236. var obj = $(this);
  237. if (gagajf.isNull(values)) return;
  238. $.each(values.split(','), function(idx2, item2) {
  239. if ($(obj).val() == item2) {
  240. $(obj).prop('selected', true);
  241. $(mSelect).find('.mSelected > li').eq(idx1).removeClass('off');
  242. $(mSelect).find('.mSelecting > ul > li').eq(idx1).addClass('off');
  243. }
  244. });
  245. });
  246. }
  247. /**
  248. * @type : function
  249. * @access : public
  250. * @desc : Tab의 idx 번째를 show
  251. * <pre>
  252. * cfnShowTab($('.nav-tabs > li').eq(2));
  253. * </pre>
  254. * @param : objToShow - 보여줄 객체
  255. * @param : idx - index
  256. * @since : 2019/03/31
  257. * @author : gagamel
  258. */
  259. var cfnShowTab = function(objToShow) {
  260. //$(objToShow).removeClass('on');
  261. $(objToShow).siblings().removeClass('on');
  262. $(objToShow).addClass('on');
  263. $(objToShow).find('a').trigger('click');
  264. }
  265. /**
  266. * Global Ajax Error Handler
  267. */
  268. /*$(document).ajaxError(function(event, jqxhr, settings, thrownError) {
  269. if (jqxhr.status !== 200) { // 404("Not Found"), 500("Internal Server Error") and ...
  270. // 에러 처리 함수가 등록 안되어 있는 경우
  271. if (settings && typeof settings.error !== 'function') {
  272. // $(Element).load() 호출 시 에러가 발생할 경우 '/error'로 이동
  273. if (settings.dataType == 'html') {
  274. window.location.replace("/error");
  275. } else {
  276. alert('요청이 진행되지 못했습니다\n죄송합니다, 에러가 발생했습니다.');
  277. }
  278. }
  279. }
  280. });*/
  281. /**
  282. * @type : function
  283. * @access : public
  284. * @desc : 기간(from ~ to)로 날짜 구성
  285. * <pre>
  286. * cfnCreateCalendar('#sellTerms', 'startDt', 'endDt', true, '판매');
  287. * </pre>
  288. * @param : tgtId - 만들어진 tag를 표시할 Target ID
  289. * @param : dtFromId - 시작일자 ID
  290. * @param : dtToId - 종료일자 ID
  291. * @param : isRequired - 검색조건 필수여부. 옵션
  292. * @param : validName - 유효성검증 시 사용되는 명칭. isRequired 값이 true일 때만 사용. 옵션
  293. * @since : 2019/09/09
  294. * @author : gagamel
  295. */
  296. function cfnCreateCalendar(tgtId, dtFromId, dtToId, isRequired, validName, empty, hideList) {
  297. var tag = '';
  298. tag += '<span class="nowrap">\n';
  299. tag += ' <input name="' + dtFromId + '" id="' + dtFromId + '" type="text" class="w80 schDate" maxlength="10"' + ((typeof(isRequired) != "undefined" && isRequired) ? " required=\"required\"" : "") + ' data-valid-name="' + validName + '시작일시" data-valid-type="calendar"/>\n';
  300. tag += ' ~\n';
  301. tag += ' <input name="' + dtToId + '" id="' + dtToId + '" type="text" class="w80 schDate" maxlength="10"' + ((typeof(isRequired) != "undefined" && isRequired) ? " required=\"required\"" : "") + ' data-valid-name="' + validName + '종료일시" data-valid-type="calendar"/>\n';
  302. tag += '</span>\n';
  303. if(typeof empty!='undefined'){
  304. tag += '<button type="button" class="btn btn-default btn-sm btnCel3m" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'\');">기간X</button>\n';
  305. }
  306. tag += '<button type="button" class="btn btn-default btn-sm btnToday" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'t\');">오늘</button>\n';
  307. tag += '<button type="button" class="btn btn-default btn-sm btnYesterday" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'y\');">어제</button>\n';
  308. tag += '<button type="button" class="btn btn-default btn-sm btnRecentWeek" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'7d\');">최근한주</button>\n';
  309. tag += '<button type="button" class="btn btn-default btn-sm btnThisWeek" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'tw\');">이번주</button>\n';
  310. tag += '<button type="button" class="btn btn-default btn-sm btnYesterWeek" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'pw\');">지난주</button>\n';
  311. tag += '<button type="button" class="btn btn-default btn-sm btnRecentMonth" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'1m\');">최근한달</button>\n';
  312. tag += '<button type="button" class="btn btn-default btn-sm btnThisMonth" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'tm\');">이번달</button>\n';
  313. tag += '<button type="button" class="btn btn-default btn-sm btnYesterMonth" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'pm\');">지난달</button>\n';
  314. tag += '<button type="button" class="btn btn-default btn-sm btnRecent3Month" onclick="gagajf.setDate(\'' + tgtId+'\', \'' + dtFromId + '\', \'' + dtToId + '\', \'3m\');">최근3개월</button>\n';
  315. $(tgtId).html(tag);
  316. if(hideList && hideList.length > 0){
  317. for(var i in hideList){
  318. $(tgtId+" ."+hideList[i]).hide();
  319. }
  320. }
  321. $(tgtId + ' .schDate').datepicker({
  322. changeMonth: true,
  323. changeYear: true,
  324. firstDay: 0,
  325. defaultDate: $(tgtId + '.schDate').val(),
  326. onSelect: function(){
  327. var fromVal = Number($(tgtId+" #"+dtFromId).val().replace(/-/gi, ''));
  328. var toVal = Number($(tgtId+" #"+dtToId).val().replace(/-/gi, ''));
  329. if($(this).val()==""){
  330. return;
  331. }
  332. if($(this).attr("id")==dtFromId){
  333. if($(tgtId+" #"+dtToId).val()!=""){
  334. if(fromVal>toVal){
  335. mcxDialog.alert('시작일자가 종료일자보다 큽니다.');
  336. $(tgtId+" #"+dtFromId).val('');
  337. $(tgtId+" #"+dtFromId).focus();
  338. }
  339. }
  340. }else{
  341. if($(tgtId+" #"+dtFromId).val()!=""){
  342. if(fromVal>toVal){
  343. mcxDialog.alert('종료일자가 시작일자보다 작습니다.');
  344. $(tgtId+" #"+dtToId).val('');
  345. $(tgtId+" #"+dtToId).focus();
  346. }
  347. }
  348. }
  349. }
  350. });
  351. $(tgtId+" #"+dtFromId).off("blur");
  352. $(tgtId+" #"+dtFromId).on("blur", function(){
  353. var fromVal = Number($(tgtId+" #"+dtFromId).val().replace(/-/gi, ''));
  354. var toVal = Number($(tgtId+" #"+dtToId).val().replace(/-/gi, ''));
  355. if($(this).val()==""){
  356. return;
  357. }else if($(tgtId+" #"+dtToId).val()!=""){
  358. if(fromVal>toVal){
  359. mcxDialog.alert('시작일자가 종료일자보다 큽니다.');
  360. $(tgtId+" #"+dtFromId).val('');
  361. $(tgtId+" #"+dtFromId).focus();
  362. }
  363. $(this).change();
  364. }
  365. });
  366. $(tgtId+" #"+dtToId).off("blur");
  367. $(tgtId+" #"+dtToId).on("blur", function(){
  368. var fromVal = Number($(tgtId+" #"+dtFromId).val().replace(/-/gi, ''));
  369. var toVal = Number($(tgtId+" #"+dtToId).val().replace(/-/gi, ''));
  370. if($(this).val()==""){
  371. return;
  372. }else if($(tgtId+" #"+dtFromId).val()!=""){
  373. if(fromVal>toVal){
  374. mcxDialog.alert('종료일자가 시작일자보다 작습니다.');
  375. $(tgtId+" #"+dtToId).val('');
  376. $(tgtId+" #"+dtToId).focus();
  377. }
  378. $(this).change();
  379. }
  380. });
  381. }
  382. /**
  383. * @type : function
  384. * @access : public
  385. * @desc : 기간으로 조회시 날짜지정
  386. * <pre>
  387. * cfnChangeCalendar('diff','obj1','obj2','dateFormat');
  388. * </pre>
  389. * @param : diff - 날짜간격(3m : 최근 3개월 , 1m : 최근 한달, 1d : 오늘, -1d : 어제, 7d : 최근 한 주, tw : 이번주, lw : 지난주, tm : 이번달, lm : 지난달)
  390. * @param : obj1 - 시작날짜 오브젝트
  391. * @param : obj2 - 종료날짜 오브젝트
  392. * @param : dateFormat - 날짜형식
  393. * @since : 2019/07/02
  394. * @author : yhkim
  395. */
  396. function cfnChangeCalendar(diff, obj1, obj2, dateFormat) {
  397. var sdt = new Date();
  398. var edt = new Date();
  399. var smonth = sdt.getMonth();
  400. var sday = sdt.getDate();
  401. var emonth = edt.getMonth();
  402. var weekday = sdt.getDay();
  403. if (diff == '3m') {
  404. sdt.setMonth(smonth - 3);
  405. } else if (diff == '1m') {
  406. sdt.setMonth(smonth - 1);
  407. } else if (diff == '7d') {
  408. sdt.setDate(sday - 7);
  409. } else if (diff == '1d') {
  410. sdt.setDate(sday);
  411. } else if (diff == '-1d') {
  412. sdt.setDate(sday - 1);
  413. edt.setDate(sday - 1);
  414. } else if (diff == 'tw') {
  415. sdt.setDate(sday - weekday);
  416. edt.setDate(edt.getDate() - weekday + 6);
  417. } else if (diff == 'lw') {
  418. sdt.setDate(sday - weekday - 7);
  419. edt.setDate(edt.getDate() - weekday - 1);
  420. } else if (diff == 'tm') {
  421. sdt.setDate(1);
  422. edt.setMonth(emonth + 1);
  423. edt.setDate(0);
  424. } else if (diff == 'lm') {
  425. sdt.setMonth(smonth - 1);
  426. sdt.setDate(1);
  427. edt.setMonth(emonth);
  428. edt.setDate(0);
  429. } else {
  430. $('#sdate').val('');
  431. $('#edate').val('');
  432. return;
  433. }
  434. var syear = sdt.getFullYear();
  435. smonth = sdt.getMonth()+1;
  436. smonth = ((smonth < 10) ? "0" + smonth : smonth);
  437. sday = sdt.getDate();
  438. sday = ((sday < 10) ? "0" + sday : sday);
  439. var delimiter = "-";
  440. if (dateFormat == "yymmdd") delimiter = "";
  441. obj1.val(syear + delimiter + smonth + delimiter + sday);
  442. var eyear = edt.getFullYear();
  443. emonth = edt.getMonth()+1;
  444. emonth = ((emonth < 10) ? "0" + emonth : emonth);
  445. var eday = edt.getDate();
  446. eday = ((eday < 10) ? "0" + eday : eday);
  447. obj2.val(eyear + delimiter + emonth + delimiter + eday);
  448. }
  449. /**
  450. * @type : function
  451. * @access : public
  452. * @desc : 입력 필드의 문자열 길이를 체크한다.
  453. * <pre>
  454. * cfnGetTextLength($('#msgContents'), 90, $('#dpLoc'));
  455. * </pre>
  456. * @param : obj - 입력필드 오브젝트
  457. * @param : maxLen - 최대길이(bytes 수)
  458. * @param : dpLoc - optional. 현재의 길이를 표시할 곳
  459. * @return : None
  460. * @since : 2019/07/22
  461. * @author : gagamel
  462. */
  463. var cfnGetTextLength = function(obj, maxLen, dpLoc) {
  464. var valLen = $(obj).val().length;
  465. var cByte = 0;
  466. var sliceLen = 0;
  467. for (i = 0; i < valLen; i++) {
  468. var aChar = $(obj).val().charAt(i);
  469. if (escape(aChar).length == 6) {
  470. cByte += 3; //한글이면 3를 더한다
  471. } else if (aChar == '\n') {
  472. cByte += 2; //엔터면 2을 더한다
  473. } else {
  474. cByte++; //한글아니면 1을 더한다
  475. }
  476. if (cByte <= maxLen) {
  477. sliceLen = i + 1;
  478. }
  479. }
  480. // 사용자가 입력한 값이 제한 값을 초과하는지를 검사한다.
  481. if (parseInt(cByte) > parseInt(maxLen)) {
  482. mcxDialog.alert('허용된 글자수가 초과되었습니다.\n초과된 부분은 자동으로 삭제됩니다.');
  483. //var orgStr = $(obj).val();
  484. var slicedStr = $(obj).val().substr(0, sliceLen);
  485. $(obj).val(slicedStr);
  486. var cByte = 0;
  487. for (i = 0; i < $(obj).val().length; i++) {
  488. var aChar = $(obj).val().charAt(i);
  489. if (escape(aChar).length == 6) {
  490. cByte += 3; //한글이면 3를 더한다
  491. } else if (aChar == '\n') {
  492. cByte += 2; //엔터면 2을 더한다
  493. } else {
  494. cByte++; //한글아니면 1을 더한다
  495. }
  496. }
  497. }
  498. $(dpLoc).text(cByte.addComma());
  499. }
  500. /**
  501. * @type : function
  502. * @access : public
  503. * @desc : 셀렉트박스 년도 설정
  504. * <pre>
  505. * cfnDateYearSetting('usacYear', 5);
  506. * </pre>
  507. * @param : elTarget - 셀렉트박스id
  508. * @param : targetYear - +- 설정 년도
  509. * @since : 2019/10/17
  510. * @author : rladbwnd5
  511. */
  512. var cfnDateYearSetting = function(elemetId,targetYear) {
  513. var currentYear = (new Date()).getFullYear();
  514. var optionHtml = "";
  515. optionHtml += '<option value="">[전체]</option>';
  516. for (var year = currentYear-targetYear; year <= currentYear+targetYear; year++) {
  517. optionHtml += '<option value="'+year+'">'+year+'년'+'</option>\n';
  518. }
  519. $('#'+elemetId).append(optionHtml);
  520. };
  521. /**
  522. * @type : function
  523. * @access : public
  524. * @desc : JQuery를 이용한 비동기 submit 처리
  525. * 파라미터의 명칭은 쿼리문과 동일하게 작성해야 한다.
  526. * <pre>
  527. * var params = new Object();
  528. * params.cmd = "getCodeDetailComboList";
  529. * params.GROUP_CD = "G900";
  530. * params.CODE = "0202";
  531. *
  532. * cfnAjaxSubmit("/renderer.do", "json", jfCallback, params);
  533. *
  534. * or
  535. *
  536. * cfnAjaxSubmit("/renderer.do", "json", jfCallback);
  537. * </pre>
  538. * @param : actionUrl - action url. 필수
  539. * type - 처리결과 형식(text, html, xml, json). 필수
  540. * callback - type이 text, xml, json 일 때는 콜백함수명
  541. * type이 html일 때는 target명. 필수
  542. * params - 파라미터 오브젝트. 옵션
  543. * @return : None
  544. * @since : 2014/10/14
  545. * @author : gagamel
  546. */
  547. var cfnAjaxSubmit = function(actionUrl, type, callback, params) {
  548. if (!params) params = new Object();
  549. $.post(actionUrl
  550. , $.param(params)
  551. , function(result) {
  552. if (type == "html") {
  553. if (!gagajf.isNull(callback))
  554. $(document.getElementById(callback)).html(result);
  555. $('.schDate').datepicker({
  556. changeMonth: true,
  557. changeYear: true,
  558. defaultDate: $('.schDate').val()
  559. });
  560. } else {
  561. // Callback 함수 호출
  562. if (typeof(callback) == "function")
  563. callback.call(this, result);
  564. }
  565. }
  566. , type);
  567. }
  568. /**
  569. * @type : function
  570. * @access : public
  571. * @desc : Form 객체를 가지고 JQuery를 이용한 비동기 Submit 처리
  572. * <pre>
  573. * cfnAjaxSubmitForm($('#formId'), "/base/rest/adminuser/create", "json", jfCreateAdminUserResult);
  574. * </pre>
  575. * 위와같이 사용했을 경우 true를 리턴한다.
  576. * @param : formId - document form ID
  577. * actionUrl - The URL to submit
  578. * type - The data's type(text, html, xml, json, jsonp)
  579. * callback - This attribute is optional.
  580. * If type is 'html' then it is target's name when the result success.
  581. * Otherwise it is function which calls when the result success.
  582. * isDisabledEvent - This attribute is optional.
  583. * If isDisabledEvent is true then you can not click all event.
  584. * Otherwise you can click event.
  585. * @author : gagamel
  586. * @since : 2017/09/14
  587. */
  588. var cfnAjaxSubmitForm = function(formId, actionUrl, type, callback, isDisabledEvent) {
  589. var progressbarId;
  590. if (type == "jsonp") {
  591. $.ajax({
  592. type : "POST",
  593. url : actionUrl,
  594. data : $(formId).serialize(),
  595. dataType : type,
  596. jsonp : "callback",
  597. beforeSend : function(jqXHR, settings) {
  598. if (isDisabledEvent) {
  599. // Button disabled & progressBar show
  600. progressbarId = "progressbar";
  601. createProgressbar('body', progressbarId);
  602. } else {
  603. if (type == "html") {
  604. // ProgressBar show
  605. progressbarId = getUUID();
  606. $('#' + progressbarId).remove();
  607. createProgressbar('#' + callback, progressbarId);
  608. }
  609. }
  610. },
  611. complete : function() {
  612. // ProgressBar remove
  613. $('#' + progressbarId).remove();
  614. },
  615. success : function(result) {
  616. if (typeof(callback) == "function")
  617. callback.call(this, result);
  618. },
  619. error : function() {
  620. alert("오류로 인해 처리되지 않았습니다.");
  621. }
  622. });
  623. } else {
  624. $.ajax({
  625. type : "POST",
  626. url : actionUrl,
  627. data : $(formId).serialize(),
  628. dataType : type,
  629. beforeSend : function(jqXHR, settings) {
  630. if (isDisabledEvent) {
  631. // Button disabled & progressBar show
  632. progressbarId = "progressbar";
  633. createProgressbar('body', progressbarId);
  634. } else {
  635. if (type == "html") {
  636. // ProgressBar show
  637. progressbarId = getUUID();
  638. $('#' + progressbarId).remove();
  639. createProgressbar('#' + callback, progressbarId);
  640. }
  641. }
  642. },
  643. complete : function() {
  644. // ProgressBar remove
  645. $('#' + progressbarId).remove();
  646. },
  647. success : function(result) {
  648. if (type == "html") {
  649. if (!gagajf.isNull(callback))
  650. $(document.getElementById(callback)).html(result);
  651. } else {
  652. // Callback 함수 호출
  653. if (typeof(callback) == "function")
  654. callback.call(this, result);
  655. }
  656. },
  657. error : function() {
  658. alert("오류로 인해 처리되지 않았습니다.");
  659. }
  660. });
  661. }
  662. }
  663. /**
  664. * @type : function
  665. * @access : public
  666. * @desc : 그리드 No 처리
  667. * <pre>
  668. * cfnGridNumner('searchForm', params.node.rowIndex, 'A');
  669. * </pre>
  670. * @param : formId - 화면 from id
  671. * @param : idx - row idx
  672. * @param : sortFlag - A : asc, D: desc
  673. * @since : 2019/12/10
  674. * @author : eskim
  675. */
  676. var cfnGridNumner = function (formId, idx, sortFlag){
  677. var result = idx;
  678. var startRow = 0;
  679. var pageNo = $('#'+formId).find('#pageNo').val().removeComma();
  680. var pageSize = $('#'+formId).find('#pageSize').val().removeComma();
  681. var totRowCnt = $('#'+formId).find('#gridRowTotalCount').text().removeComma();
  682. if (typeof(sortFlag) == 'undefined' || sortFlag == "A"){
  683. startRow = (Number(pageNo) - 1) * Number(pageSize);
  684. result = (startRow + idx + 1)
  685. }else{
  686. startRow = (Number(pageNo) - 1) * Number(pageSize);
  687. result = Number(totRowCnt) - (idx + startRow) ;
  688. }
  689. return result; //.addComma();
  690. }
  691. /**
  692. * @type : function
  693. * @access : public
  694. * @desc : 샘플파일 다운로드
  695. * <pre>
  696. * cfnDownloadSampleFile('SF001');
  697. * </pre>
  698. * @param : sampleFileId - 샘플파일ID
  699. * @since : 2019/12/26
  700. * @author : rladbwnd5
  701. */
  702. function cfnDownloadSampleFile(sampleFileId) {
  703. $.get('/common/sample/file/' + sampleFileId
  704. , function(result) {
  705. if (gagajf.isNull(result)) {
  706. mcxDialog.alert('다운로드 받을 파일이 존재하지 않습니다.');
  707. return;
  708. }
  709. var str = '<a id="aFileDownload" href="#" style="display: none;"></a>';
  710. if ($('#aFileDownload').length == 0) {
  711. $('body').append(str);
  712. }
  713. $('#aFileDownload').attr({
  714. href : _sampleUrl + '/' + result
  715. // href : '/src/main/webapp/files/data/csv/' + result
  716. }).get(0).click();
  717. });
  718. }
  719. /**
  720. * @type : function
  721. * @access : public
  722. * @desc : 휴대폰 번호 자동 하이픈
  723. * <pre>
  724. * cfnCellPhonnHypen(this);
  725. * </pre>
  726. * @param : obj - 입력필드 오브젝트
  727. * @return : None
  728. * @since : 2019/03/13
  729. * @author : jsshin
  730. */
  731. function cfnCellPhonnHypen(obj) {
  732. //$(obj).val( $(obj).val().replace(/[^0-9]/g, '').replace(/(^0[0-9]{2})([0-9]+)?([0-9]{4})/, '$1-$2-$3').replace('--', '-') );
  733. $(obj).val( $(obj).val().replace(/[^0-9]/g, "").replace(/(^02|^050[0-9]{1}|^1[0-9]{3}|^0[0-9]{2})([0-9]+)?([0-9]{4})$/,"$1-$2-$3").replace("--", "-") );
  734. }
  735. var fnCalendarDateValidation = function(tgtId, dtFromId, dtToId) {
  736. var fromVal = Number($(tgtId+" #"+dtFromId).val().replace(/-/gi, ''));
  737. var toVal = Number($(tgtId+" #"+dtToId).val().replace(/-/gi, ''));
  738. var result = true;
  739. if(fromVal > toVal) {
  740. mcxDialog.alertC('시작일자가 종료일자보다 큽니다.',{
  741. sureBtnText: "확인",
  742. sureBtnClick: function() {
  743. $(tgtId+" #"+dtFromId).focus();
  744. }
  745. });
  746. result = false;
  747. }
  748. return result;
  749. };