category.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. /**
  2. * admin/category
  3. */
  4. var mplus_admin_category = function(){
  5. //상속
  6. mplus_admin.call(this);
  7. var self = this;
  8. //변수
  9. var $wrapper = $(".main-wrapper #wrapper"),
  10. $btnCreateNode = $("#btnCreateNode"),
  11. $btnSaveNode = $("#btnSaveNode"),
  12. $btnRemoveNode = $("#btnRemoveNode"),
  13. $btnDeselectNode = $("#btnDeselectNode"),
  14. $categoryTreeView = $("categoryTreeView"),
  15. $txtId = $("#txtId"),
  16. $txtName = $("#txtName"),
  17. $txtUri = $("#txtUri"),
  18. $spanUri = $("#spanUri"),
  19. $txtCategoryDesc = $("#txtCategoryDesc"),
  20. $spanCreateDt = $("#spanCreateDt"),
  21. $spanCreateId = $("#spanCreateId"),
  22. $spanUpdateDt = $("#spanUpdateDt"),
  23. $spanUpdateId = $("#spanUpdateId"),
  24. $crudServiceBaseUrl = contextPath + "/admin/category";
  25. //tree
  26. var $tree;
  27. /**
  28. * 초기화
  29. */
  30. this.init = function(){
  31. initTree();
  32. addEvent();
  33. /*if($("#categoryTreeView .fancytree-expander")[0]!=undefined){
  34. $('#categoryTreeView').fancytree('getTree').getNodeByKey($("#categoryTreeView .fancytree-expander")[0].id).setActive();
  35. };*/
  36. };
  37. /**
  38. * 이벤트 등록
  39. */
  40. var addEvent = function(){
  41. //아이템 추가
  42. $btnCreateNode.on("click",function(e){
  43. addItem(e);
  44. });
  45. //아이템 저장
  46. $btnSaveNode.on("click",function(e){
  47. saveItem(e);
  48. });
  49. //아이템 삭제
  50. $btnRemoveNode.on("click",function(e){
  51. removeItem(e);
  52. });
  53. //아이템 선택 해제
  54. $btnDeselectNode.on("click",function(e){
  55. deselectItem();
  56. });
  57. };
  58. /**
  59. * 아이템 추가 이벤트
  60. */
  61. var addItem = function(e){
  62. /*
  63. addedNodeCheck( e, treeView.dataSource.data().toJSON() );
  64. if( addedNodeArr.length > 0 ) {
  65. alert( "저장하지 않은 아이템 [ " + addedNodeArr[0].catName + " ] (이)가 있습니다" );
  66. addedNodeArr = [];
  67. return false;
  68. }*/
  69. if($("#categoryTreeView").fancytree("getActiveNode")!=null){
  70. var node = $("#categoryTreeView").fancytree("getActiveNode"),
  71. item = $("#categoryTreeView").fancytree("getActiveNode").data,
  72. parentCatSeq = item.catSeq;
  73. if(node.expanded==undefined){
  74. $("#categoryTreeView").fancytree("getActiveNode").setExpanded();
  75. };
  76. }else{
  77. var node = $("#categoryTreeView").fancytree("getRootNode"),
  78. parentCatSeq = '';
  79. };
  80. var nodeData = null,
  81. defData = {
  82. catSeq : null,
  83. parentCatSeq : parentCatSeq,
  84. catName : 'NewItem',
  85. catDesc : null,
  86. childCount : 0,
  87. addedNode : true,
  88. pathName : ""
  89. };
  90. node.addChildren({
  91. title: defData.catName,
  92. key: defData.catSeq,
  93. folder: false,
  94. lazy: false,
  95. data: defData}
  96. );
  97. addedNodeArr.push( defData );
  98. if(node.children.length==1){
  99. $("#categoryTreeView").fancytree("getActiveNode").setExpanded();
  100. };
  101. node.children[node.children.length-1].li.click();
  102. $txtName.focus();
  103. };
  104. /**
  105. * 아이템 저장 이벤트
  106. */
  107. var saveItem = function(e){
  108. var node = $("#categoryTreeView").fancytree("getActiveNode"),
  109. item = $("#categoryTreeView").fancytree("getActiveNode").data,
  110. pnode = node.parent.data;
  111. var paramItem = {};
  112. if(item.addedNode==true){
  113. paramItem = {
  114. catSeq: null,
  115. catName: $txtName.val(),
  116. pathName: $txtUri.val(),
  117. parentPath : $spanUri.text(),
  118. catDesc: $txtCategoryDesc.val(),
  119. childCount : 0,
  120. parentCatSeq: pnode.catSeq
  121. }
  122. }else{
  123. paramItem = item;
  124. paramItem.catName = $txtName.val();
  125. paramItem.pathName = $txtUri.val();
  126. paramItem.catDesc = $txtCategoryDesc.val();
  127. paramItem.parentPath = $spanUri.text();
  128. };
  129. if( paramItem.catName === null || paramItem.catName === "" ) {
  130. alert( "이름을 입력해주세요." );
  131. return false;
  132. }
  133. if( paramItem.pathName === null || paramItem.pathName === "" ) {
  134. alert( "카테고리 URI를 입력해주세요." );
  135. return false;
  136. };
  137. var regExp = /^[a-z0-9_-]{2,16}$/;
  138. if( !regExp.test( paramItem.pathName ) ) {
  139. alert( "카테고리 URI는 소문자나 숫자, 언더스코어, 하이픈을 포함할 수 있고 2byte이상 15byte이하만 가능합니다" );
  140. return false;
  141. }
  142. var opt = {
  143. url : $crudServiceBaseUrl + "/save.json",
  144. type : "POST",
  145. data : self.util.stringifyJson( paramItem ),
  146. dataType : "json",
  147. contentType : "application/json;charset=utf-8"
  148. };
  149. var success = function(data){
  150. alert("저장 되었습니다");
  151. addedNodeArr = [];
  152. var saveItemData = $('#categoryTreeView').fancytree('getActiveNode');
  153. $('#title'+saveItemData.key).text(data.catName);
  154. saveItemData.data = data;
  155. /*location.reload(true);*/
  156. };
  157. var error = function(xhr,d,t){
  158. console.log(xhr);
  159. console.log(xhr.responseText);
  160. };
  161. self.ajaxAdmin( opt, success, error );
  162. addedNodeArr = [];
  163. };
  164. /**
  165. * 아이템 삭제 이벤트
  166. */
  167. var removeItem = function(e){
  168. var node = $("#categoryTreeView").fancytree("getActiveNode"),
  169. item = $("#categoryTreeView").fancytree("getActiveNode").data;
  170. if( node.length === 0 ) {
  171. alert( "선택한 아이템이 없습니다" );
  172. return false;
  173. };
  174. if( item.addedNode === true ) {
  175. node.remove();
  176. addedNodeArr = [];
  177. $('#categoryDetail').css('display', 'none');
  178. $('#categoryDetailEmpty').css('display', 'block');
  179. return false;
  180. };
  181. if( item.childCount > 0 ) {
  182. alert( "하위 카테고리가 존재하여 삭제할 수 없습니다" );
  183. return false;
  184. };
  185. if( item.apiCount > 0 ) {
  186. alert( "하위 API가 존재하여 삭제할 수 없습니다" );
  187. return false;
  188. };
  189. if( !confirm("삭제 하시겠습니까?") ) {
  190. return false;
  191. }
  192. var opt = {
  193. url : $crudServiceBaseUrl + "/remove.json",
  194. type : "POST",
  195. data : { catSeq : item.catSeq }
  196. };
  197. var success = function(data){
  198. alert("삭제 되었습니다");
  199. $('#categoryTreeView').fancytree('getActiveNode').remove();
  200. /*location.reload(true);*/
  201. };
  202. var error = function(xhr,d,t){
  203. console.log(xhr);
  204. console.log(xhr.responseText);
  205. };
  206. self.ajaxAdmin( opt, success, error );
  207. };
  208. /**
  209. * 트리 초기화
  210. */
  211. var createDeptNodeData = function(data) {
  212. return $.extend({
  213. title : data.catName,
  214. key : data.catSeq,
  215. folder : data.childCount>0? true: false,
  216. lazy : data.childCount>0? true: false,
  217. data : data
  218. }, data);
  219. };
  220. var initTree = function(){
  221. $tree = $("#categoryTreeView").fancytree({
  222. extensions: ["edit"],
  223. lazyLoad : function(event, ctx) {
  224. var param_lazyload = {
  225. async: false,
  226. url : $crudServiceBaseUrl + "/getList.json",
  227. dataType : 'json',
  228. type : 'POST',
  229. data: {catSeq: ctx.node.data.catSeq}
  230. };
  231. result = [];
  232. var success_lazyload = function(data){
  233. categorytList = data;
  234. for ( var i in categorytList) {
  235. var item = categorytList[i];
  236. result.push(createDeptNodeData(item));
  237. };
  238. ctx.result = result;
  239. };
  240. var error_lazyload = function(xhr,d,t){
  241. console.log(xhr);
  242. console.log(t);
  243. };
  244. self.ajaxAdmin( param_lazyload, success_lazyload, error_lazyload );
  245. },
  246. selectMode : 3,
  247. activate : function(event, ctx) {
  248. var categoryData = ctx.node.data;
  249. var parentUrl = '';
  250. var parentData = ctx.node.parent;
  251. if(parentData.title!='root'){
  252. do{
  253. parentUrl = parentData.data.pathName + '/' + parentUrl;
  254. parentData = parentData.parent;
  255. }while(parentData.parent!=null);
  256. };
  257. $spanUri.text('/'+parentUrl);
  258. if(categoryData.catSeq==undefined){
  259. $txtId.val('');
  260. $txtName.val('');
  261. $txtUri.val('');
  262. $txtCategoryDesc.val('');
  263. $spanCreateDt.text('');
  264. $spanCreateId.text('');
  265. $spanUpdateDt.text('');
  266. $spanUpdateId.text('');
  267. }else{
  268. var opt = {
  269. url : $crudServiceBaseUrl + "/getCategory.json",
  270. type : "POST",
  271. data : self.util.stringifyJson( {'catSeq': categoryData.catSeq,
  272. 'pathName': categoryData.pathName} ),
  273. dataType : "json",
  274. contentType : "application/json;charset=utf-8"
  275. };
  276. var success = function(data){
  277. $txtId.val(data.catSeq);
  278. $txtName.val(data.catName);
  279. $txtUri.val(data.pathName);
  280. $txtCategoryDesc.val(data.catDesc);
  281. $spanCreateDt.text(moment(data.createDt).format('YYYY-MM-DD'));
  282. $spanCreateId.text(data.createId==null? '': data.createId);
  283. $spanUpdateDt.text(moment(data.updateDt).format('YYYY-MM-DD'));
  284. $spanUpdateId.text(data.updateId==null? '':data.updateId);
  285. };
  286. var error = function(xhr,d,t){
  287. console.log(xhr);
  288. console.log(xhr.responseText);
  289. };
  290. self.ajaxAdmin( opt, success, error );
  291. };
  292. $('#categoryDetail').css('display', 'block');
  293. $('#categoryDetailEmpty').css('display', 'none');
  294. }
  295. }).fancytree('getTree');
  296. var deptList;
  297. $.ajax({
  298. async : false,
  299. url : $crudServiceBaseUrl + "/getList.json",
  300. dataType : 'json',
  301. type : 'POST',
  302. contentType : 'application/json',
  303. success : function(result){
  304. categoryList = result;
  305. }
  306. });
  307. var $root = $tree.getRootNode();
  308. for ( var i in categoryList) {
  309. var item = categoryList[i];
  310. $root.addNode(createDeptNodeData(item));
  311. }
  312. };
  313. var deselectItem = function(e){
  314. var node = $("#categoryTreeView").fancytree("getActiveNode");
  315. if(node!=undefined){
  316. node.setActive(false);
  317. node.setFocus(false);
  318. $txtId.val('');
  319. $txtName.val('');
  320. $txtUri.val('');
  321. $txtCategoryDesc.val('');
  322. $spanCreateDt.text('');
  323. $spanCreateId.text('');
  324. $spanUpdateDt.text('');
  325. $spanUpdateId.text('');
  326. $('#categoryDetail').css('display', 'none');
  327. $('#categoryDetailEmpty').css('display', 'block');
  328. };
  329. };
  330. // 저장하지 않은 아이템 확인
  331. var addedNodeArr = [];
  332. function addedNodeCheck( e, treeViewData ) {
  333. if( treeViewData ) {
  334. for( var n = 0; n < treeViewData.length; n++) {
  335. var childData = treeViewData[n];
  336. if( childData.addedNode === true ) {
  337. addedNodeArr.push(childData);
  338. return;
  339. } else {
  340. var child = childData.items;
  341. if (child) {
  342. if (child.length > 0) {
  343. addedNodeCheck(e, child);
  344. }
  345. }
  346. }
  347. }
  348. }
  349. };
  350. /**
  351. * 선택된 노드의 부모경로 가져오기
  352. */
  353. var getTotalPath = function(node){
  354. var treeView = self.treeView,
  355. totalPathName = "",
  356. //현재 선택된 노드 모델 정보
  357. item = treeView.dataItem( node );
  358. var cat_seq = item.catSeq;
  359. var cat_name = item.catName;
  360. var cat_path_name = "";
  361. cat_path_name = "";
  362. //부모있으면
  363. while ( item.parentNode() ) {
  364. //있을 때까지 부모로 설정해서 경로를 만듬
  365. item = item.parentNode();
  366. cat_path_name = item.pathName + "/" + cat_path_name;
  367. }
  368. //부모경로가 없으면 '/' 있으면 '/ + 부모경로'
  369. return totalPathName = (cat_path_name !== ""?"/" + cat_path_name : "/");
  370. };
  371. };