admin.common.js 26 KB

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