api.js 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172
  1. /**
  2. * admin/api
  3. */
  4. var mplus_admin_api = function() {
  5. // 상속
  6. mplus_admin.call(this);
  7. var self = this;
  8. // 변수
  9. var $wrapper = $('.main-wrapper #wrapper'),
  10. $txtId = $('#txtId'),
  11. $txtName = $('#txtName'),
  12. $spanCatPathName = $('#spanCatPathName'),
  13. $txtApiUrl = $('#txtApiUrl'),
  14. $sltApiType = $('#sltApiType'),
  15. $btnApiTypeHelp = $('#btnApiTypeHelp'),
  16. $sltHttpMethodType = $('#sltHttpMethodType'),
  17. $sltResultType = $('#sltResultType'),
  18. $sltDataSourceName = $('#sltDataSourceName'),
  19. $txtTargetUrlAddr = $('#txtTargetUrlAddr'),
  20. $txtQueryMsg = $('#txtQueryMsg'),
  21. $txtProcedure = $('#txtProcedure'),
  22. $btnCreateNode = $('#btnCreateNode'),
  23. $btnRemoveNode = $('#btnRemoveNode'),
  24. $btnSaveNode = $('#btnSaveNode'),
  25. $btnCacheInit = $('#btnCacheInit'),
  26. $btnDeselectNode = $('#btnDeselectNode'),
  27. $btnHeaderInfo = $('#btnHeaderInfo'),
  28. $btnNewItemHeader = $('#btnNewItem_header'),
  29. $btnConfirmHeader = $('#btnConfirmItem_header'),
  30. $btnParameter = $('#btnParameter'),
  31. $btnNewItemParam = $('#btnNewItem_param'),
  32. $btnConfirmParam = $('#btnConfirmItem_param'),
  33. $txtResSampleCl = $('#txtResSampleCl'),
  34. $txtApiDesc = $('#txtApiDesc'),
  35. $spanCreateDt = $('#spanCreateDt'),
  36. $spanCreateId = $('#spanCreateId'),
  37. $spanUpdateDt = $('#spanUpdateDt'),
  38. $spanUpdateId = $('#spanUpdateId'),
  39. $crudServiceBaseUrl = contextPath + '/admin/api';
  40. this.treeView = null;
  41. /**
  42. * 초기화
  43. */
  44. this.init = function() {
  45. initTree();
  46. // 설명 글자수 이벤트 - core에 선언
  47. self.checkDescBytes($txtApiDesc, 'txtApiDesc');
  48. addEvent();
  49. };
  50. /**
  51. * 이벤트 등록
  52. */
  53. var addEvent = function() {
  54. // api type 변경 이벤트
  55. $sltApiType.on('change', function(e) {
  56. /*
  57. * var treeView = self.treeView; var node = treeView.select(), item =
  58. * treeView.dataItem(node), observer = new kendo.observable( item );
  59. */
  60. enableApiTypeRow(this.value);
  61. httpMethodType($sltHttpMethodType.val(), e);
  62. });
  63. // http method 필드 변경 이벤트
  64. $sltHttpMethodType.on('change', function(e) {
  65. httpMethodType(this.value, e);
  66. });
  67. // 아이템 추가
  68. $btnCreateNode.on('click', function(e) {
  69. addItem(e);
  70. });
  71. // 아이템 삭제
  72. $btnRemoveNode.on('click', function(e) {
  73. removeItem(e);
  74. });
  75. // 아이템 저장
  76. $btnSaveNode.on('click', function(e) {
  77. saveItem(e);
  78. });
  79. // 아이템 갱신 (to 모바일 서버)
  80. $btnCacheInit.on('click', function(e) {
  81. reloadItem(e);
  82. });
  83. $('#btnTest, #btnTest_inModal').on('click', function(e) {
  84. testApi(e);
  85. });
  86. // 아이템 선택 해제
  87. $btnDeselectNode.on('click', function(e) {
  88. deselectItem(e);
  89. });
  90. $btnHeaderInfo.on('click', function(e) {
  91. editTableHeaderInfo(e);
  92. });
  93. $btnNewItemHeader.on('click', function(e) {
  94. newTableHeader(e);
  95. });
  96. $btnConfirmHeader.on('click', function(e) {
  97. confirmTableHeader(e);
  98. });
  99. $btnParameter.on('click', function(e) {
  100. editTableParam(e);
  101. });
  102. $btnNewItemParam.on('click', function(e) {
  103. newTableParam(e);
  104. });
  105. $btnConfirmParam.on('click', function(e) {
  106. confirmTableParam(e);
  107. });
  108. };
  109. /**
  110. * http method 필드 변경 이벤트
  111. */
  112. var httpMethodType = function(value, e) {
  113. var node = $('#apiTreeView').fancytree('getActiveNode'),
  114. item = $('#apiTreeView').fancytree('getActiveNode').data;
  115. var apiType = $('#sltApiType').val();
  116. if (apiType === 'SQL') {
  117. if (value !== 'GET' && value !== '') {
  118. // POST,PUT,DELETE 라면 INT만
  119. $('#sltResultType option').hide();
  120. $('#sltResultType option[value=INT]').show();
  121. $('#sltResultType').val('INT');
  122. } else {
  123. // GET 이면 MAP, LIST만
  124. $('#sltResultType option').hide();
  125. $('#sltResultType option[value=MAP]').show();
  126. $('#sltResultType option[value=LIST]').show();
  127. $('#sltResultType').val('MAP');
  128. }
  129. } else {
  130. // 웹서비스, procedure면 전부다
  131. $('#sltResultType option').show();
  132. $('#sltResultType').val('MAP');
  133. }
  134. };
  135. /**
  136. * 아이템 추가
  137. */
  138. var addItem = function(e) {
  139. var node = $('#apiTreeView').fancytree('getActiveNode'), // 부모노드 추출에 사용될 예정
  140. selectNode = $('#apiTreeView').fancytree('getActiveNode');
  141. if(node==undefined){
  142. alert('카테고리를 선택해주세요.');
  143. return false;
  144. };
  145. if(node.expanded==undefined){
  146. $('#apiTreeView').fancytree('getActiveNode').setExpanded();
  147. };
  148. var item = $('#apiTreeView').fancytree('getActiveNode').data;
  149. if (addedNodeArr.length > 0) {
  150. alert('저장하지 않은 아이템이 있습니다');
  151. return false;
  152. };
  153. if (node.length === 0) {
  154. alert('아이템을 선택하세요');
  155. return false;
  156. }
  157. if (item.nodeType === 'API') {
  158. alert('카테고리를 선택하여 추가하세요.');
  159. return false;
  160. }
  161. var cat_seq = item.catSeq;
  162. var cat_name = item.catName;
  163. var arr = new Array();
  164. arr.push(item.pathName);
  165. while (node.parent) {
  166. node = node.parent.data;
  167. if(node.pathName!=null) arr.push(node.pathName);
  168. }
  169. var cat_path_name = '/';
  170. for (var n = arr.length; n > 0; n--) {
  171. cat_path_name += (arr[n - 1] + '/');
  172. }
  173. var nodeData = null,
  174. defData = {
  175. apiSeq : '',
  176. apiName : 'New api',
  177. nodeType : 'API',
  178. addedNode : true,
  179. apiType : $('#sltApiType').val(),
  180. catSeq : cat_seq,
  181. catName : cat_name,
  182. catPathName : cat_path_name,
  183. dataSourceName : '',
  184. apiDesc : '',
  185. httpMethodType : '',
  186. targetName : '',
  187. queryMsg : '',
  188. resultType : '',
  189. reqUrlAddr : '',
  190. reqUrlName : '',
  191. targetUrlAddr : '',
  192. useYn : 1,
  193. reqParams : [],
  194. wsUrl : '',
  195. wsHeaders : [],
  196. resSampleCl : ''
  197. };
  198. selectNode.addChildren({
  199. title : defData.apiName,
  200. key : defData.id,
  201. folder : false,
  202. lazy : false,
  203. data : defData
  204. });
  205. addedNodeArr.push(defData);
  206. $('#apiTreeView').fancytree('getActiveNode').children[$('#apiTreeView')
  207. .fancytree('getActiveNode').children.length - 1].li.click();
  208. $('#txtName').focus();
  209. };
  210. /**
  211. * 아이템 삭제
  212. */
  213. var removeItem = function(e) {
  214. var node = $('#apiTreeView').fancytree('getActiveNode'),
  215. item = $('#apiTreeView').fancytree('getActiveNode').data;
  216. if (node.length === 0) {
  217. alert('선택한 아이템이 없습니다');
  218. return false;
  219. }
  220. if (item.nodeType === 'CATEGORY') {
  221. alert('카테고리는 카테고리 관리에서 삭제가능합니다.');
  222. return false;
  223. }
  224. if (item.addedNode) {
  225. node.remove();
  226. addedNodeArr = [];
  227. $('#apiMsg').css('display', 'block');
  228. $('#apiContent').css('display', 'none');
  229. return false;
  230. }
  231. if (item.childCount > 0) {
  232. alert('하위 카테고리가 존재하여 삭제할 수 없습니다');
  233. return false;
  234. }
  235. if (item.apiCount > 0) {
  236. alert('하위 API가 존재하여 삭제할 수 없습니다');
  237. return false;
  238. }
  239. if (!confirm('삭제 하시겠습니까?')) {
  240. return false;
  241. }
  242. var opt = {
  243. url : $crudServiceBaseUrl + '/remove.json',
  244. data : self.util.stringifyJson({
  245. apiSeq : item.id
  246. }),
  247. type : 'POST'
  248. };
  249. var success = function(data) {
  250. alert('삭제 되었습니다.');
  251. $('#apiTreeView').fancytree('getActiveNode').remove();
  252. /*location.reload(true);*/
  253. };
  254. var error = function(xhr, d, t) {
  255. console.log(xhr);
  256. alert(xhr.responseText);
  257. };
  258. self.ajaxAdmin(opt, success, error);
  259. };
  260. /**
  261. * 아이템 저장
  262. */
  263. var saveItem = function(e) {
  264. var treeView = self.treeView;
  265. var item = $('#apiTreeView').fancytree('getActiveNode');
  266. if (item.length === 0 || item.data.nodeType === 'CATEGORY') {
  267. alert('선택한 아이템이 없습니다');
  268. return false;
  269. };
  270. var reqParamsArr = paramList;
  271. for (var i = 0; i < reqParamsArr.length; i++) {
  272. var it = reqParamsArr[i],
  273. paramName = it.paramName;
  274. reqParamsArr[i].paramName = paramName.replace(/\s/gi, '');
  275. reqParamsArr[i].apiSeq = item.data.apiSeq;
  276. };
  277. var reqHeaderArr = headerList;
  278. for (var i = 0; i < reqHeaderArr.length; i++) {
  279. var it = reqHeaderArr[i];
  280. reqHeaderArr[i].apiSeq = item.data.apiSeq;
  281. };
  282. var param = $.extend(true, {}, item.data, {
  283. apiName: $txtName.val(),
  284. apiType: $sltApiType.val(),
  285. apiDesc: $txtApiDesc.val(),
  286. httpMethodType: $sltHttpMethodType.val(),
  287. queryMsg: $txtQueryMsg.val(),
  288. resSampleCl: $txtResSampleCl.val(),
  289. reqUrlAddr: $txtApiUrl.val(),
  290. resultType: $sltResultType.val(),
  291. targetUrlAddr: $txtTargetUrlAddr.val(),
  292. targetName : $txtProcedure.val(),
  293. dataSourceName: $sltDataSourceName.val(),
  294. nodeType : 'API',
  295. reqParams : reqParamsArr,
  296. wsHeaders : reqHeaderArr
  297. }, null);
  298. if (!fieldValidation(param)) {
  299. return false;
  300. }
  301. var opt = {
  302. url : $crudServiceBaseUrl + '/save.json',
  303. data : self.util.stringifyJson(param),
  304. type : 'POST',
  305. dataType : 'json',
  306. contentType : 'application/json;charset=UTF-8;'
  307. };
  308. var success = function(data) {
  309. alert('저장 되었습니다.');
  310. addedNodeArr = [];
  311. var saveItemData = $('#apiTreeView').fancytree('getActiveNode');
  312. $('#title'+saveItemData.key).text(data.apiName);
  313. saveItemData.data = data;
  314. saveItemData.data.id = data.apiSeq;
  315. saveItemData.data.name = data.apiName;
  316. /*location.reload(true);*/
  317. };
  318. var error = function(xhr, d, t) {
  319. console.log(xhr);
  320. alert(xhr.responseText);
  321. };
  322. self.ajaxAdmin(opt, success, error);
  323. };
  324. /**
  325. * 트리 아이템 reload 이벤트
  326. *
  327. * @private
  328. */
  329. var reloadItem = function(e) {
  330. var opt = {
  331. url : $crudServiceBaseUrl + '/cacheReload.json',
  332. type : 'POST',
  333. contentType : 'application/json; charset=UTF-8'
  334. };
  335. var success = function(data) {
  336. if (data === 1) {
  337. alert('갱신 되었습니다');
  338. } else {
  339. alert('수행 중 에러가 발생하였습니다');
  340. }
  341. };
  342. var error = function(xhr, d, t) {
  343. console.log(xhr);
  344. console.log(t);
  345. };
  346. self.ajaxAdmin(opt, success, error);
  347. };
  348. /**
  349. * 트리 아이템 선택 해제 이벤트
  350. * @private
  351. */
  352. var deselectItem = function(e){
  353. var node = $('#apiTreeView').fancytree('getActiveNode');
  354. if(node!=undefined){
  355. node.setActive(false);
  356. node.setFocus(false);
  357. $('#apiMsg').css('display', 'block');
  358. $('#apiContent').css('display', 'none');
  359. };
  360. };
  361. /**
  362. * 실행 테스트 이벤트
  363. */
  364. var testApi = function(e) {
  365. var node = $('#apiTreeView').fancytree('getActiveNode'),
  366. item = $('#apiTreeView').fancytree('getActiveNode').data;
  367. var reqParamsArr = [];
  368. if(e.currentTarget.id=='btnTest'){
  369. $.extend(reqParamsArr, paramList); // 객체 복사, 위의 방식으로하면 객체 공유가 되어버림!
  370. }else if(e.currentTarget.id=='btnTest_inModal'){
  371. $.extend(reqParamsArr, paramEditList); // 객체 복사, 위의 방식으로하면 객체 공유가 되어버림!
  372. };
  373. if (item.dataSourceName !== null
  374. && typeof item.dataSourceName === 'object'
  375. && item.dataSourceName.value !== undefined) {
  376. item.dataSourceName = item.dataSourceName.value;
  377. };
  378. for (var i = 0; i < reqParamsArr.length; i++) {
  379. var it = reqParamsArr[i],
  380. paramName = it.paramName,
  381. paramSeq = it.paramSeq;
  382. reqParamsArr[i].paramName = paramName.replace(/\s/gi, '');
  383. reqParamsArr[i].paramSeq = paramSeq!=null&&typeof(paramSeq)!="number" && paramSeq.indexOf('new_')>-1 ? null: paramSeq;
  384. };
  385. var param = $.extend(true, {}, item.data, {
  386. apiName: $txtName.val(),
  387. apiType: $sltApiType.val(),
  388. apiDesc: $txtApiDesc.val(),
  389. httpMethodType: $sltHttpMethodType.val(),
  390. queryMsg: $txtQueryMsg.val(),
  391. resSampleCl: $txtResSampleCl.val(),
  392. reqUrlAddr: $txtApiUrl.val(),
  393. resultType: $sltResultType.val(),
  394. targetUrlAddr: $txtTargetUrlAddr.val(),
  395. targetName : $txtProcedure.val(),
  396. dataSourceName: $sltDataSourceName.val(),
  397. nodeType : 'API',
  398. reqParams : reqParamsArr,
  399. wsHeaders : headerList
  400. }, null);
  401. var opt = {
  402. beforeSend: function(){
  403. self.loading('show');
  404. },
  405. url : $crudServiceBaseUrl + '/test.json',
  406. data : JSON.stringify(param),
  407. type : 'POST',
  408. dataType: 'json',
  409. contentType : 'application/json; charset=UTF-8;',
  410. complete: function(){
  411. self.loading('hide');
  412. }
  413. };
  414. var success = function(data) {
  415. if ($.isEmptyObject(data)) {
  416. alert('테스트에 대한 결과 데이터가 없습니다.');
  417. return false;
  418. }
  419. var responseData = self.util.stringifyJson(data, null, 2);
  420. $('#modal_testResult .modal-body').empty();
  421. $('#modal_testResult .modal-body').append(
  422. $('<pre style="height: 500px;"></pre>').html(responseData));
  423. $('#modal_testResult').modal('show');
  424. };
  425. var error = function(xhr, d, t) {
  426. console.log(xhr);
  427. alert('[' + xhr.statusText + '] ' + xhr.responseText);
  428. };
  429. self.ajaxAdmin(opt, success, error);
  430. };
  431. /**
  432. * 트리 초기화
  433. */
  434. var createDeptNodeData = function(data) {
  435. return $.extend({
  436. title : data.name,
  437. key : data.id,
  438. folder : data.nodeType == 'CATEGORY' ? true : false,
  439. lazy : data.nodeType == 'CATEGORY' ? true : false,
  440. data : data
  441. }, data.data);
  442. };
  443. var initTree = function() {
  444. var $tree = $('#apiTreeView').fancytree(
  445. {
  446. extensions : [ 'edit' ],
  447. lazyLoad : function(event, ctx) {
  448. var param_lazyload = {
  449. async : false,
  450. url : $crudServiceBaseUrl + '/getList.json',
  451. dataType : 'json',
  452. type : 'POST',
  453. data : self.util.stringifyJson({
  454. catSeq : ctx.node.data.catSeq
  455. })
  456. };
  457. result = [];
  458. var success_lazyload = function(data) {
  459. apiList = data;
  460. for ( var i in apiList) {
  461. var item = apiList[i];
  462. result.push(createDeptNodeData(item));
  463. }
  464. ;
  465. ctx.result = result;
  466. };
  467. var error_lazyload = function(xhr, d, t) {
  468. console.log(xhr);
  469. console.log(t);
  470. };
  471. self.ajaxAdmin(param_lazyload, success_lazyload,
  472. error_lazyload);
  473. },
  474. selectMode : 3,
  475. activate : function(event, ctx) {
  476. var apiData = ctx.node.data;
  477. if(apiData.nodeType=='CATEGORY'){
  478. $('#apiMsg').css('display', 'block');
  479. $('#apiContent').css('display', 'none');
  480. }else{
  481. $('#apiMsg').css('display', 'none');
  482. $('#apiContent').css('display', 'block');
  483. if (apiData.apiSeq == undefined || apiData.apiSeq == '') {
  484. $txtId.val('');
  485. $txtName.val('');
  486. $spanCatPathName.text(apiData.catPathName);
  487. $txtApiUrl.val('');
  488. $sltApiType.val('');
  489. enableApiTypeRow(apiData.apiType);
  490. $sltHttpMethodType.val('');
  491. $sltResultType.val('');
  492. $sltDataSourceName.val('');
  493. $txtTargetUrlAddr.val('');
  494. $txtResSampleCl.val('');
  495. $txtApiDesc.val('');
  496. $spanCreateDt.text('');
  497. $spanCreateId.text('');
  498. $spanUpdateDt.text('');
  499. $spanUpdateId.text('');
  500. $txtQueryMsg.val('');
  501. $txtProcedure.val('');
  502. paramList = [];
  503. headerList = [];
  504. paramEditList = [];
  505. headerEditList = [];
  506. $('#table_header_view').empty();
  507. $('#table_param_view').empty();
  508. } else {
  509. var opt = {
  510. url : $crudServiceBaseUrl + "/getApi.json",
  511. type : "POST",
  512. data : self.util.stringifyJson( {'apiSeq': apiData.apiSeq} ),
  513. dataType : "json",
  514. contentType : "application/json;charset=utf-8"
  515. };
  516. var success = function(data){
  517. $txtId.val(data.apiSeq);
  518. $txtName.val(data.apiName);
  519. $spanCatPathName.text(data.catPathName);
  520. $txtApiUrl.val(data.reqUrlAddr);
  521. $sltApiType.val(data.apiType);
  522. enableApiTypeRow(data.apiType);
  523. $sltHttpMethodType.val(data.httpMethodType);
  524. $sltResultType.val(data.resultType);
  525. $sltDataSourceName.val(data.dataSourceName);
  526. $txtTargetUrlAddr.val(data.targetUrlAddr);
  527. $txtResSampleCl.val(data.resSampleCl);
  528. $txtApiDesc.val(data.apiDesc);
  529. $spanCreateDt.text(moment(data.createDt).format(
  530. 'YYYY-MM-DD'));
  531. $spanCreateId.text(data.createId==null? '': data.createId);
  532. $spanUpdateDt.text(moment(data.updateDt).format(
  533. 'YYYY-MM-DD'));
  534. $spanUpdateId.text(data.updateId==null? '': data.updateId);
  535. $txtQueryMsg.val(data.queryMsg);
  536. $txtProcedure.val(data.targetName);
  537. initGrid(data.apiSeq);
  538. };
  539. var error = function(xhr,d,t){
  540. console.log(xhr);
  541. console.log(xhr.responseText);
  542. };
  543. self.ajaxAdmin( opt, success, error );
  544. };
  545. // 설명 글자수제한 초기화
  546. $txtApiDesc.trigger('keyup');
  547. }
  548. },
  549. click : function(event, data) {
  550. },
  551. }).fancytree('getTree');
  552. var apiList;
  553. $.ajax({
  554. async : false,
  555. url : $crudServiceBaseUrl + '/getList.json',
  556. dataType : 'json',
  557. type : 'POST',
  558. contentType : 'application/json',
  559. data: JSON.stringify({}),
  560. success : function(result) {
  561. apiList = result;
  562. }
  563. });
  564. var $root = $tree.getRootNode();
  565. for ( var i in apiList) {
  566. var item = apiList[i];
  567. $root.addNode(createDeptNodeData(item));
  568. }
  569. };
  570. var paramList = [];
  571. var headerList = [];
  572. var paramEditList = [];
  573. var headerEditList = [];
  574. /**
  575. * 그리드 초기화
  576. */
  577. var initGrid = function(apiSeq) {
  578. // 헤더 테이블
  579. var opt_header = {
  580. url : $crudServiceBaseUrl + '/getHeaderList.json',
  581. type : 'POST',
  582. dataType : 'json',
  583. data : self.util.stringifyJson({
  584. 'apiSeq' : apiSeq
  585. }),
  586. contentType : 'application/json; charset=UTF-8'
  587. };
  588. var success_header = function(data) {
  589. $('#table_header_view').empty();
  590. headerList = data;
  591. for (var i = 0; i < headerList.length; i++) {
  592. var tr = $('<tr></tr>').clone();
  593. var tdName = $('<td></td>').clone().text(headerList[i].headerName);
  594. var tdValue = $('<td></td>').clone().text(headerList[i].headerValue==null? '': self.util.getBytes(headerList[i].headerValue)>20? self.util.cut(headerList[i].headerValue, 20)+'...': headerList[i].headerValue);
  595. $('#table_header_view').append(tr.append(tdName).append(tdValue));
  596. };
  597. };
  598. var error_header = function(xhr, d, t) {
  599. console.log(xhr);
  600. console.log(t);
  601. };
  602. self.ajaxAdmin(opt_header, success_header, error_header);
  603. // 파라미터 테이블
  604. var opt_param = {
  605. url : $crudServiceBaseUrl + '/getParamList.json',
  606. type : 'POST',
  607. dataType : 'json',
  608. data : self.util.stringifyJson({
  609. 'apiSeq' : apiSeq
  610. }),
  611. contentType : 'application/json; charset=UTF-8'
  612. };
  613. var success_param = function(data) {
  614. paramList = data;
  615. $('#table_param_view').empty();
  616. for (var i = 0; i < paramList.length; i++) {
  617. var tr = $('<tr></tr>').clone();
  618. var tdNo = $('<td></td>').clone().text(i+1);
  619. var tdName = $('<td></td>').clone().text(paramList[i].paramName);
  620. var tdType = $('<td></td>').clone().text(paramList[i].dataType);
  621. var tdValue = $('<td></td>').clone().text(paramList[i].sampleValue==null? '': self.util.getBytes(paramList[i].sampleValue)>10? self.util.cut(paramList[i].sampleValue, 10)+'...': paramList[i].sampleValue);
  622. var tdDesc = $('<td></td>').clone().text(paramList[i].paramDesc==null? '': self.util.getBytes(paramList[i].paramDesc)>20? self.util.cut(paramList[i].paramDesc, 20)+'...': paramList[i].paramDesc);
  623. $('#table_param_view').append(tr.append(tdNo).append(tdName).append(tdType).append(tdValue).append(tdDesc));
  624. };
  625. };
  626. var error_param = function(xhr, d, t) {
  627. console.log(xhr);
  628. console.log(t);
  629. };
  630. self.ajaxAdmin(opt_param, success_param, error_param);
  631. };
  632. // 저장하지 않은 아이템 배열
  633. var addedNodeArr = [];
  634. /**
  635. * api type 변경 처리
  636. */
  637. function enableApiTypeRow(typeName) {
  638. if (typeName === 'WEB_SERVICE') {
  639. $('#rowWebService').show();
  640. $('#rowProcedure').hide();
  641. $('#rowQueryMsg').hide();
  642. } else if (typeName === 'SQL') {
  643. $('#rowWebService').hide();
  644. $('#rowProcedure').hide();
  645. $('#rowQueryMsg').show();
  646. } else if (typeName === 'PROCEDURE') {
  647. $('#rowWebService').hide();
  648. $('#rowProcedure').show();
  649. $('#rowQueryMsg').hide();
  650. } else{
  651. $('#rowWebService').hide();
  652. $('#rowProcedure').hide();
  653. $('#rowQueryMsg').hide();
  654. }
  655. }
  656. /**
  657. * 필수값 체크
  658. */
  659. function fieldValidation(item) {
  660. if (item.apiName === '') {
  661. alert('이름을 입력하세요');
  662. return false;
  663. }
  664. if (item.reqUrlAddr === '') {
  665. alert('API URI를 입력하세요');
  666. return false;
  667. }
  668. if (item.apiType === '') {
  669. alert('API 타입을 선택하세요');
  670. return false;
  671. }
  672. if (item.httpMethodType === '') {
  673. alert('HttpMethod 타입을 선택하세요');
  674. return false;
  675. } else {
  676. if (item.httpMethodType === 'GET' && item.resultType === 'INT') {
  677. alert('HttpMethod 타입이 GET일 경우 응답결과가 [INT] 일 수 없습니다');
  678. return false;
  679. }
  680. }
  681. if (item.resultType == '') {
  682. alert('응답결과 타입을 선택하세요');
  683. return false;
  684. } else {
  685. if (item.apiType === 'WEB_SERVICE') {
  686. if (item.targetUrlAddr === '') {
  687. alert('URL을 등록하세요');
  688. return false;
  689. }
  690. if (item.resultType === 'POST' || item.resultType === 'DELETE') {
  691. alert('웹서비스는 POST, DELETE 타입을 지원하지 않습니다');
  692. return false;
  693. }
  694. } else {
  695. if (item.dataSourceName === '') {
  696. alert('데이터소스를 선택하세요');
  697. return false;
  698. }
  699. if (item.apiType === 'PROCEDURE') {
  700. if (item.targetName === '') {
  701. alert('Procedure를 등록하세요');
  702. return false;
  703. }
  704. } else { // SQL, MYBATIS, SQL_GROOVY_TEMPLATE, VELOCITY
  705. if (item.queryMsg === '') {
  706. alert('SQL을 등록하세요');
  707. return false;
  708. }
  709. }
  710. }
  711. }
  712. if (item.resultType === '') {
  713. alert('응답결과 타입을 선택하세요');
  714. return false;
  715. }
  716. return true;
  717. };
  718. var getItemData = function(itemList, tableCheckValue, checkValue){
  719. var itemData = {};
  720. for(i=0; i<itemList.length; i++){
  721. if(itemList[i][tableCheckValue] == checkValue){
  722. itemData = itemList[i];
  723. break;
  724. }
  725. };
  726. return itemData;
  727. };
  728. var editTableHeaderInfo = function() {
  729. $('#sltHeader').val($('#sltHeader option:first').val());
  730. $('#txtHeaderValue').val('');
  731. $('#table_header').empty();
  732. for (var i = 0; i < headerList.length; i++) {
  733. var tr = $('<tr itemData="'+ headerList[i].headerName +'"></tr>').clone();
  734. var tdName = $('<td></td>').clone().text(headerList[i].headerName);
  735. var tdValue = $('<td></td>').clone().addClass('max-width-sm').text(headerList[i].headerValue==null? '': self.util.getBytes(headerList[i].headerValue)>10? self.util.cut(headerList[i].headerValue, 10)+'...': headerList[i].headerValue);
  736. var tdEdit = $('<td></td>').clone().append(
  737. '<button type="button" class="btn btn-default btn-xs" itemData="' + headerList[i].headerName
  738. + '"><span class="glyphicon glyphicon-minus">&nbsp;삭제</span></button>');
  739. $('#table_header').append(tr.append(tdName).append(tdValue).append(tdEdit));
  740. };
  741. $('#table_header tr').unbind();
  742. $('#table_header tr').on('click', function(e) {
  743. editItemHeader(e);
  744. $('#table_header tr').removeClass('active');
  745. $(this).addClass('active');
  746. });
  747. $('#table_header tr td button').unbind();
  748. $('#table_header tr td button').on('click', function(e) {
  749. removeItemHeader(e);
  750. });
  751. /* i18nEditList = i18nList; */
  752. headerEditList = [];
  753. $.extend(headerEditList, headerList); // 객체 복사, 위의 방식으로하면 객체 공유가 되어버림!
  754. $('#addItemModal_header').modal('show');
  755. $('#saveItem_header').unbind();
  756. $('#saveItem_header').on('click', function() {
  757. var param = {
  758. 'headerSeq' : null,
  759. 'headerName' : $('#sltHeader').val(),
  760. 'headerValue' : $('#txtHeaderValue').val()
  761. };
  762. saveItemHeader(param, 'new');
  763. });
  764. if($('#table_header tr').length>0){
  765. $('#table_header tr')[0].click();
  766. $('#modalHeaderDetail').css('display', 'block');
  767. $('#modalHeaderDetailEmpty').css('display', 'none');
  768. }else{
  769. $('#modalHeaderDetail').css('display', 'none');
  770. $('#modalHeaderDetailEmpty').css('display', 'block');
  771. }
  772. };
  773. var newTableHeader = function() {
  774. $('#sltHeader').val($('#sltHeader option:first').val());
  775. $('#txtHeaderValue').val('');
  776. $('#table_header tr').removeClass('active');
  777. $('#modalHeaderDetail').css('display', 'block');
  778. $('#modalHeaderDetailEmpty').css('display', 'none');
  779. $('#sltHeader').focus();
  780. $('#saveItem_header').unbind();
  781. $('#saveItem_header').on('click', function() {
  782. var param = {
  783. 'headerSeq' : null,
  784. 'headerName' : $('#sltHeader').val(),
  785. 'headerValue' : $('#txtHeaderValue').val()
  786. };
  787. saveItemHeader(param, 'new');
  788. });
  789. };
  790. var saveItemHeader = function(param, newYn) {
  791. if($('#table_header tr[class!="active"][itemData="'+param.headerName+'"]').length>0){
  792. alert('헤더명은 중복될 수 없습니다.');
  793. return;
  794. };
  795. if(param.headerValue==null || param.headerValue==''){
  796. alert('값을 입력해주세요.');
  797. return;
  798. };
  799. if(newYn=='edit'){
  800. olderValue = $('#table_header tr.active')[0].attributes.itemData.value;
  801. $('#table_header tr[itemData="'+olderValue+'"]')[0].children[0].innerText=param.headerName;
  802. $('#table_header tr[itemData="'+olderValue+'"]')[0].children[1].innerText=param.headerValue;
  803. $('#table_header tr[itemData="'+olderValue+'"]')[0].children[2].children[0].attributes.itemData.value=param.headerName;
  804. $('#table_header tr[itemData="'+olderValue+'"]')[0].attributes.itemdata.value=param.headerName;
  805. for(var i=0; i<headerEditList.length; i++){
  806. if(headerEditList[i].headerName==olderValue){
  807. headerEditList[i].headerName = param.headerName;
  808. headerEditList[i].headerValue = param.headerValue;
  809. }
  810. };
  811. }else{
  812. var tr = $('<tr itemData="'+ param.headerName +'"></tr>').clone();
  813. var tdName = $('<td></td>').clone().text(param.headerName);
  814. var tdValue = $('<td></td>').clone().addClass('max-width-sm').text(param.headerValue==null? '': self.util.getBytes(param.headerValue)>10? self.util.cut(param.headerValue, 10)+'...': param.headerValue);
  815. var tdEdit = $('<td></td>').clone().append(
  816. '<button type="button" class="btn btn-default btn-xs" itemData="' + param.headerName + '"><span class="glyphicon glyphicon-minus">&nbsp;삭제</span></button>');
  817. $('#table_header').append(tr.append(tdName).append(tdValue).append(tdEdit));
  818. headerEditList.push(param);
  819. };
  820. $('#table_header tr').unbind();
  821. $('#table_header tr').on('click', function(e) {
  822. editItemHeader(e);
  823. $('#table_header tr').removeClass('active');
  824. $(this).addClass('active');
  825. });
  826. $('#table_header tr td button').unbind();
  827. $('#table_header tr td button').on('click', function(e) {
  828. removeItemHeader(e);
  829. });
  830. $('#table_header tr[itemData="'+ param.headerName +'"]').click();
  831. };
  832. var editItemHeader = function(e) {
  833. var itemData = getItemData(headerEditList, 'headerName', e.currentTarget.attributes.itemData.value);
  834. if(itemData==undefined || itemData ==null){
  835. alert('정상적인 데이터가 아닙니다.'); //이표시가 맞을까?
  836. return;
  837. };
  838. $('#sltHeader').val(itemData.headerName);
  839. $('#txtHeaderValue').val(itemData.headerValue);
  840. $('#saveItem_header').unbind();
  841. $('#saveItem_header').on('click', function() {
  842. var param = {
  843. 'headerSeq' : itemData.headerSeq,
  844. 'headerName' : $('#sltHeader').val(),
  845. 'headerValue' : $('#txtHeaderValue').val()
  846. };
  847. saveItemHeader(param, 'edit');
  848. });
  849. $('#modalHeaderDetail').css('display', 'block');
  850. $('#modalHeaderDetailEmpty').css('display', 'none');
  851. };
  852. var removeItemHeader = function(e) {
  853. $('#table_header tr[itemData="'+e.currentTarget.attributes.itemData.value+'"]').remove();
  854. for(var i=0; i<headerEditList.length; i++){
  855. if(headerEditList[i].headerName == e.currentTarget.attributes.itemData.value){
  856. headerEditList.splice(i, 1);
  857. break;
  858. }
  859. };
  860. $('#table_header tr').removeClass('active');
  861. $('#modalHeaderDetail').css('display', 'none');
  862. $('#modalHeaderDetailEmpty').css('display', 'block');
  863. };
  864. var confirmTableHeader = function(e) {
  865. $('#addItemModal_header').modal('hide');
  866. $('#table_header_view').empty();
  867. for (var i = 0; i < headerEditList.length; i++) {
  868. var tr = $('<tr>').clone();
  869. var tdName = $('<td></td>').clone().text(headerEditList[i].headerName);
  870. var tdValue = $('<td></td>').clone().text(headerEditList[i].headerValue==null? '': self.util.getBytes(headerEditList[i].headerValue)>20? self.util.cut(headerEditList[i].headerValue, 20)+'...': headerEditList[i].headerValue);
  871. $('#table_header_view').append(tr.append(tdName).append(tdValue));
  872. }
  873. ;
  874. headerList = [];
  875. $.extend(headerList, headerEditList); // 객체 복사
  876. };
  877. var editTableParam = function() {
  878. $('#txtParam').val('');
  879. $('#sltParam').val($('#sltParam option:first').val());
  880. $('#txtSampleParam').val('');
  881. $('#txtParamDesc').val('');
  882. $('#table_param').empty();
  883. for (var i = 0; i < paramList.length; i++) {
  884. var tr = $('<tr itemData="' + paramList[i].paramName + '"></tr>').clone();
  885. var tdName = $('<td></td>').clone().text(paramList[i].paramName);
  886. var tdSampleValue = $('<td></td>').clone().text(paramList[i].sampleValue==null? '': self.util.getBytes(paramList[i].sampleValue)>10? self.util.cut(paramList[i].sampleValue, 10)+'...': paramList[i].sampleValue);
  887. var tdEdit = $('<td></td>').clone().append(
  888. '<button type="button" class="btn btn-default btn-xs" itemData="' + paramList[i].paramName + '"><span class="glyphicon glyphicon-minus">&nbsp;삭제</span></button>');
  889. $('#table_param').append(tr.append(tdName).append(tdSampleValue).append(tdEdit));
  890. };
  891. $('#table_param tr').unbind();
  892. $('#table_param tr').on('click', function(e) {
  893. editItemParam(e);
  894. $('#table_param tr').removeClass('active');
  895. $(this).addClass('active');
  896. });
  897. $('#table_param tr td button').unbind();
  898. $('#table_param tr td button').on('click', function(e) {
  899. removeItemParam(e);
  900. });
  901. /* i18nEditList = i18nList; */
  902. paramEditList = [];
  903. $.extend(paramEditList, paramList); // 객체 복사, 위의 방식으로하면 객체 공유가 되어버림!
  904. $('#addItemModal_param').modal('show');
  905. $('#saveItem_param').unbind();
  906. $('#saveItem_param').on('click', function() {
  907. var param = {
  908. 'paramSeq' : null,
  909. 'paramName' : $('#txtParam').val(),
  910. 'dataType' : $('#sltParam').val(),
  911. 'sampleValue' : $('#txtSampleParam').val(),
  912. 'paramDesc' : $('#txtParamDesc').val()
  913. };
  914. saveItemParam(param, 'new');
  915. });
  916. if($('#table_param tr').length>0){
  917. $('#table_param tr')[0].click();
  918. $('#modalParamDetail').css('display', 'block');
  919. $('#modalParamDetailEmpty').css('display', 'none');
  920. }else{
  921. $('#modalParamDetail').css('display', 'none');
  922. $('#modalParamDetailEmpty').css('display', 'block');
  923. };
  924. };
  925. var newTableParam = function() {
  926. $('#txtParam').val('');
  927. $('#sltParam').val($('#sltParam option:first').val());
  928. $('#txtSampleParam').val('');
  929. $('#txtParamDesc').val('');
  930. $('#table_param tr').removeClass('active');
  931. $('#modalParamDetail').css('display', 'block');
  932. $('#modalParamDetailEmpty').css('display', 'none');
  933. $('#txtParam').focus();
  934. $('#saveItem_param').unbind();
  935. $('#saveItem_param').on('click', function() {
  936. var param = {
  937. 'paramSeq' : null,
  938. 'paramName' : $('#txtParam').val(),
  939. 'dataType' : $('#sltParam').val(),
  940. 'sampleValue' : $('#txtSampleParam').val(),
  941. 'paramDesc' : $('#txtParamDesc').val()
  942. };
  943. saveItemParam(param, 'new');
  944. });
  945. };
  946. var saveItemParam = function(param, newYn) {
  947. if(param.paramName==null || param.paramName==''){
  948. alert('이름을 입력해주세요.');
  949. return;
  950. };
  951. if($('#table_param tr[class!="active"][itemData="'+param.paramName+'"]').length>0){
  952. alert('파라미터명은 중복될 수 없습니다.');
  953. return;
  954. };
  955. if(param.dataType==null || param.dataType==''){
  956. alert('타입을 선택해주세요.');
  957. return;
  958. };
  959. if(newYn=='edit'){
  960. olderValue = $('#table_param tr.active')[0].attributes.itemData.value;
  961. $('#table_param tr[itemData="'+olderValue+'"]')[0].children[0].innerText=param.paramName;
  962. $('#table_param tr[itemData="'+olderValue+'"]')[0].children[1].innerText=param.sampleValue;
  963. $('#table_param tr[itemData="'+olderValue+'"]')[0].children[2].children[0].attributes.itemData.value=param.paramName;
  964. $('#table_param tr[itemData="'+olderValue+'"]')[0].attributes.itemdata.value=param.paramName;
  965. for(var i=0; i<paramEditList.length; i++){
  966. if(paramEditList[i].paramName==olderValue){
  967. paramEditList[i].paramName = param.paramName;
  968. paramEditList[i].dataType = param.dataType;
  969. paramEditList[i].sampleValue = param.sampleValue;
  970. paramEditList[i].paramDesc = param.paramDesc;
  971. }
  972. };
  973. }else{
  974. var tr = $('<tr itemData="'+ param.paramName +'"></tr>').clone();
  975. var tdName = $('<td></td>').clone().text(param.paramName);
  976. var tdValue = $('<td></td>').clone().addClass('max-width-sm').text(param.sampleValue==null? '': self.util.getBytes(param.sampleValue)>10? self.util.cut(param.sampleValue, 10)+'...': param.sampleValue);
  977. var tdEdit = $('<td></td>').clone().append(
  978. '<button type="button" class="btn btn-default btn-xs" itemData="' + param.paramName + '"><span class="glyphicon glyphicon-minus">&nbsp;삭제</span></button>');
  979. $('#table_param').append(tr.append(tdName).append(tdValue).append(tdEdit));
  980. paramEditList.push(param);
  981. };
  982. $('#table_param tr').unbind();
  983. $('#table_param tr').on('click', function(e) {
  984. $('#table_param tr').removeClass('active');
  985. $(this).addClass('active');
  986. editItemParam(e);
  987. });
  988. $('#table_param tr td button').unbind();
  989. $('#table_param tr td button').on('click', function(e) {
  990. removeItemParam(e);
  991. });
  992. $('#table_param tr[itemData="'+ param.paramName +'"]').click();
  993. };
  994. var editItemParam = function(e) {
  995. var itemData = getItemData(paramEditList, 'paramName', e.currentTarget.attributes.itemData.value);
  996. if(itemData==undefined || itemData ==null){
  997. alert('정상적인 데이터가 아닙니다.'); //이표시가 맞을까?
  998. return;
  999. };
  1000. $('#txtParam').val(itemData.paramName);
  1001. $('#sltParam').val(itemData.dataType);
  1002. $('#txtSampleParam').val(itemData.sampleValue==null? '': itemData.sampleValue);
  1003. $('#txtParamDesc').val(itemData.paramDesc==null? '': itemData.paramDesc);
  1004. $('#saveItem_param').unbind();
  1005. $('#saveItem_param').on('click', function() {
  1006. var param = {
  1007. 'paramSeq' : itemData.paramSeq,
  1008. 'paramName' : $('#txtParam').val(),
  1009. 'dataType' : $('#sltParam').val(),
  1010. 'sampleValue' : $('#txtSampleParam').val(),
  1011. 'paramDesc' : $('#txtParamDesc').val()
  1012. };
  1013. saveItemParam(param, 'edit');
  1014. });
  1015. $('#modalParamDetail').css('display', 'block');
  1016. $('#modalParamDetailEmpty').css('display', 'none');
  1017. };
  1018. var removeItemParam = function(e) {
  1019. $('#table_param tr[itemData="'+e.currentTarget.attributes.itemData.value+'"]').remove();
  1020. for(var i=0; i<paramEditList.length; i++){
  1021. if(paramEditList[i].paramName == e.currentTarget.attributes.itemData.value){
  1022. paramEditList.splice(i, 1);
  1023. break;
  1024. }
  1025. };
  1026. $('#table_param tr').removeClass('active');
  1027. $('#modalParamDetail').css('display', 'none');
  1028. $('#modalParamDetailEmpty').css('display', 'block');
  1029. };
  1030. var confirmTableParam = function(e) {
  1031. $('#addItemModal_param').modal('hide');
  1032. $('#table_param_view').empty();
  1033. for (var i = 0; i < paramEditList.length; i++) {
  1034. var tr = $('<tr>').clone();
  1035. var tdNo = $('<td></td>').clone().text(i+1);
  1036. var tdName = $('<td></td>').clone().text(paramEditList[i].paramName);
  1037. var tdType = $('<td></td>').clone().text(paramEditList[i].dataType);
  1038. var tdValue = $('<td></td>').clone().text(paramEditList[i].sampleValue==null? '': self.util.getBytes(paramEditList[i].sampleValue)>10? self.util.cut(paramEditList[i].sampleValue, 10)+'...': paramEditList[i].sampleValue);
  1039. var tdDesc = $('<td></td>').clone().text(paramEditList[i].paramDesc==null? '': self.util.getBytes(paramEditList[i].paramDesc)>20? self.util.cut(paramEditList[i].paramDesc, 20)+'...': paramEditList[i].paramDesc);
  1040. $('#table_param_view').append(tr.append(tdNo).append(tdName).append(tdType).append(tdValue).append(tdDesc));
  1041. };
  1042. paramList = [];
  1043. $.extend(paramList, paramEditList); // 객체 복사
  1044. };
  1045. };
  1046. var rowNum = 0;
  1047. function resetRowNum() {
  1048. rowNum = 0;
  1049. }
  1050. function getNum() {
  1051. return ++rowNum;
  1052. }