category.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. /**
  2. * admin/category
  3. */
  4. var mcare_admin_category = function(){
  5. //상속
  6. mcare_admin.call(this);
  7. var self = this;
  8. //변수
  9. var $wrapper = $(".main-wrapper #wrapper"),
  10. $addItem = $("#add-item"),
  11. $saveItem = $("#save-item"),
  12. $removeItem = $("#remove-item"),
  13. $deselectItem = $("#deselect-item"),
  14. $treeView = $("#tree-view"),
  15. $crudServiceBaseUrl = contextPath + "/admin/category";
  16. //tree
  17. this.treeView = null;
  18. /**
  19. * 초기화
  20. */
  21. this.init = function(){
  22. $wrapper.kendoSplitter({
  23. panes : [ {
  24. collapsible : true,
  25. resizable : true,
  26. size : '240px'
  27. }, {
  28. collapsible : false
  29. } ]
  30. });
  31. initTree();
  32. addEvent();
  33. };
  34. /**
  35. * 이벤트 등록
  36. */
  37. var addEvent = function(){
  38. //아이템 추가
  39. $addItem.on("click",function(e){
  40. addItem(e);
  41. });
  42. //아이템 저장
  43. $saveItem.on("click",function(e){
  44. saveItem(e);
  45. });
  46. //아이템 삭제
  47. $removeItem.on("click",function(e){
  48. removeItem(e);
  49. });
  50. //아이템 선택 해제
  51. $deselectItem.on("click",function(e){
  52. self.treeView.select( null );
  53. });
  54. };
  55. /**
  56. * 아이템 추가 이벤트
  57. */
  58. var addItem = function(e){
  59. var treeView = self.treeView;
  60. addedNodeCheck( e, treeView.dataSource.data().toJSON() );
  61. if( addedNodeArr.length > 0 ) {
  62. alert( "저장하지 않은 아이템 [ " + addedNodeArr[0].catName + " ] (이)가 있습니다" );
  63. addedNodeArr = [];
  64. return false;
  65. }
  66. var parentCatSeq = "",
  67. node = treeView.select();
  68. if( node.length === 0 ) {
  69. node = null;
  70. } else {
  71. var parentData = treeView.dataItem( node );
  72. parentCatSeq = parentData.catSeq;
  73. }
  74. treeView.append({
  75. catSeq : null,
  76. parentCatSeq : parentCatSeq,
  77. catName : 'NewItem',
  78. catDesc : null,
  79. childCount : 0,
  80. addedNode : true,
  81. pathName : ""
  82. }, node);
  83. };
  84. /**
  85. * 아이템 저장 이벤트
  86. */
  87. var saveItem = function(e){
  88. var treeView = self.treeView;
  89. var node = treeView.select(),
  90. item = treeView.dataItem( node );
  91. if( node.length === 0 ) {
  92. alert( "선택한 아이템이 없습니다" );
  93. kendo.ui.progress( $wrapper, false );
  94. return false;
  95. }
  96. // if( item.childCount > 0 ) {
  97. // alert( "하위 카테고리가 존재하여 수정할 수 없습니다" );
  98. // return false;
  99. // }
  100. //
  101. // if( item.apiCount > 0 ) {
  102. // alert( "하위 API가 존재하여 수정할 수 없습니다" );
  103. // return false;
  104. // }
  105. if( item.pathName === null || item.pathName === "" ) {
  106. alert( "카테고리 경로는 필수 항목입니다" );
  107. kendo.ui.progress($wrapper, false);
  108. return false;
  109. }
  110. var regExp = /^[a-z0-9_-]{2,16}$/;
  111. if( !regExp.test( item.pathName ) ) {
  112. alert( "카테고리 URI는 소문자나 숫자, 언더스코어, 하이픈을 포함할 수 있고 2byte이상 15byte이하만 가능합니다" );
  113. kendo.ui.progress($wrapper, false);
  114. return false;
  115. }
  116. kendo.ui.progress($wrapper, true);
  117. // $.ajax({
  118. // url : $crudServiceBaseUrl + "/save.json",
  119. // type : "POST",
  120. // data : self.util.stringifyJson( item ),
  121. // dataType : "json",
  122. // contentType : "application/json;charset=utf-8",
  123. // success : function(data){
  124. // if( data.msg !== undefined ) {
  125. // alert( "수행 중 에러가 발생하였습니다" );
  126. // console.log( data.msg );
  127. // return false;
  128. // }
  129. // alert("저장 되었습니다");
  130. // if (item.addedNode === true) { // 신규 노드만 리로딩
  131. // location.reload(true);
  132. // }
  133. // },
  134. // error : function(xhr,d,t){
  135. // console.log(xhr);
  136. // console.log(xhr.responseText);
  137. // },
  138. // complete : function(){
  139. // kendo.ui.progress( $wrapper, false );
  140. // }
  141. // });
  142. var opt = {
  143. url : $crudServiceBaseUrl + "/save.json",
  144. type : "POST",
  145. data : self.util.stringifyJson( item ),
  146. dataType : "json",
  147. contentType : "application/json;charset=utf-8",
  148. complete : function(){
  149. kendo.ui.progress( $wrapper, false );
  150. }
  151. };
  152. var success = function(data){
  153. alert("저장 되었습니다");
  154. if (item.addedNode === true) { // 신규 노드만 리로딩
  155. location.reload(true);
  156. }
  157. };
  158. var error = function(xhr,d,t){
  159. console.log(xhr);
  160. console.log(xhr.responseText);
  161. };
  162. self.ajaxAdmin( opt, success, error );
  163. };
  164. /**
  165. * 아이템 삭제 이벤트
  166. */
  167. var removeItem = function(e){
  168. var treeView = self.treeView;
  169. kendo.unbind($wrapper);
  170. var node = treeView.select(),
  171. item = treeView.dataItem(node);
  172. if( node.length === 0 ) {
  173. alert( "선택한 아이템이 없습니다" );
  174. return false;
  175. }
  176. if( item.addedNode === true ) {
  177. treeView.remove(node);
  178. return false;
  179. }
  180. if( item.childCount > 0 ) {
  181. alert( "하위 카테고리가 존재하여 삭제할 수 없습니다" );
  182. return false;
  183. }
  184. if( item.apiCount > 0 ) {
  185. alert( "하위 API가 존재하여 삭제할 수 없습니다" );
  186. return false;
  187. }
  188. if( !confirm("삭제 하시겠습니까?") ) {
  189. return false;
  190. }
  191. kendo.ui.progress($wrapper, true);
  192. // $.ajax({
  193. // url : $crudServiceBaseUrl + "/remove.json",
  194. // type : "POST",
  195. // data : { catSeq : item.catSeq },
  196. // //dataType : "json",
  197. // //contentType : "application/json;charset=utf-8",
  198. // success : function(data){
  199. // if( data.msg !== undefined ) {
  200. // alert( "수행 중 에러가 발생하였습니다" );
  201. // console.log( data.msg );
  202. // return false;
  203. // }
  204. // alert("삭제 되었습니다");
  205. // location.reload(true);
  206. // },
  207. // error : function(xhr,d,t){
  208. // console.log(xhr);
  209. // console.log(xhr.responseText);
  210. // },
  211. // complete : function(){
  212. // kendo.ui.progress( $wrapper, false );
  213. // }
  214. // });
  215. var opt = {
  216. url : $crudServiceBaseUrl + "/remove.json",
  217. type : "POST",
  218. data : { catSeq : item.catSeq },
  219. complete : function(){
  220. kendo.ui.progress( $wrapper, false );
  221. }
  222. };
  223. var success = function(data){
  224. alert("삭제 되었습니다");
  225. location.reload(true);
  226. };
  227. var error = function(xhr,d,t){
  228. console.log(xhr);
  229. console.log(xhr.responseText);
  230. };
  231. self.ajaxAdmin( opt, success, error );
  232. };
  233. /**
  234. * 트리 초기화
  235. */
  236. var initTree = function(){
  237. var treeDataSource = new kendo.data.HierarchicalDataSource({
  238. transport : {
  239. read : {
  240. url : $crudServiceBaseUrl + "/getList.json",
  241. method : "post",
  242. dataType : "json"
  243. }
  244. },
  245. schema : {
  246. model : {
  247. id : "catSeq",
  248. hasChildren : function() {
  249. return (this.get("childCount") > 0);
  250. }
  251. }
  252. }
  253. });
  254. var option = {
  255. loadOnDemand : false,
  256. dataSource : treeDataSource,
  257. dataTextField : "catName",
  258. template : treeTemplate,
  259. select : treeSelect
  260. };
  261. // 트리
  262. self.treeView = self.tree( $treeView, option );
  263. function treeTemplate(o){
  264. return '<span class="k-sprite folder"></span>' + o.item.catName;
  265. }
  266. function treeSelect(o){
  267. kendo.unbind($wrapper);
  268. var totalPath = getTotalPath(o.node);
  269. var node = $.extend( this.dataItem(o.node), {
  270. parentPath : totalPath
  271. });
  272. var observer = new kendo.observable(node);
  273. observer.getCreateDate = function() {
  274. if (this.createDt)
  275. return new Date(this.createDt).toLocaleString();
  276. return "";
  277. };
  278. observer.getUpdateDate = function() {
  279. if (this.updateDt)
  280. return new Date(this.updateDt).toLocaleString();
  281. return "";
  282. };
  283. kendo.bind( $wrapper, observer );
  284. var treeView = self.treeView;
  285. var item = treeView.dataItem(o.node);
  286. //하위 카테고리, api 있으면 readonly - 수정할 수 없도록
  287. if( item.childCount > 0 || item.apiCount > 0 ) {
  288. // $("#catName").prop("readonly",true);
  289. $("#pathName").prop("readonly",true);
  290. // $("#catDesc").prop("readonly",true);
  291. } else {
  292. // $("#catName").prop("readonly",false);
  293. $("#pathName").prop("readonly",false);
  294. // $("#catDesc").prop("readonly",false);
  295. }
  296. }
  297. };
  298. // 저장하지 않은 아이템 확인
  299. var addedNodeArr = [];
  300. function addedNodeCheck( e, treeViewData ) {
  301. if( treeViewData ) {
  302. for( var n = 0; n < treeViewData.length; n++) {
  303. var childData = treeViewData[n];
  304. if( childData.addedNode === true ) {
  305. addedNodeArr.push(childData);
  306. return;
  307. } else {
  308. var child = childData.items;
  309. if (child) {
  310. if (child.length > 0) {
  311. addedNodeCheck(e, child);
  312. }
  313. }
  314. }
  315. }
  316. }
  317. };
  318. /**
  319. * 선택된 노드의 부모경로 가져오기
  320. */
  321. var getTotalPath = function(node){
  322. var treeView = self.treeView,
  323. totalPathName = "",
  324. //현재 선택된 노드 모델 정보
  325. item = treeView.dataItem( node );
  326. var cat_seq = item.catSeq;
  327. var cat_name = item.catName;
  328. var cat_path_name = "";
  329. cat_path_name = "";
  330. //부모있으면
  331. while ( item.parentNode() ) {
  332. //있을 때까지 부모로 설정해서 경로를 만듬
  333. item = item.parentNode();
  334. cat_path_name = item.pathName + "/" + cat_path_name;
  335. }
  336. //부모경로가 없으면 '/' 있으면 '/ + 부모경로'
  337. return totalPathName = (cat_path_name !== ""?"/" + cat_path_name : "/");
  338. };
  339. };